From f9c71fbfb0135d9e531ae8fa7dd78eba03656317 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sat, 15 Oct 2016 16:10:28 +0200 Subject: [PATCH] Made some slightly less uglier sprites for attack effects.dmi Melee attacks, gun firing, and things being hit by bullets will now still give witnesses a message, but only if they are less than 3 tiles away. The attacker still doesn't get the message for its own attacks. I added two arguments to visible_message(), one to specify the visibility range, and one to ignore a specific mob that shouldn't get the message. --- code/_onclick/item_attack.dm | 6 ++- code/datums/martial.dm | 12 +++-- .../gamemodes/devil/true_devil/_true_devil.dm | 3 +- code/game/machinery/machinery.dm | 1 + code/game/mecha/mecha_defense.dm | 2 + code/game/objects/obj_defense.dm | 3 ++ code/game/objects/structures/displaycase.dm | 1 + code/game/objects/structures/grille.dm | 2 + code/game/objects/structures/tables_racks.dm | 1 + code/game/turfs/simulated/walls.dm | 1 + code/modules/client/verbs/suicide.dm | 3 +- .../mob/living/carbon/alien/alien_defense.dm | 3 +- .../carbon/alien/humanoid/humanoid_defense.dm | 14 +++-- .../carbon/alien/larva/larva_defense.dm | 6 ++- .../mob/living/carbon/human/human_defense.dm | 3 +- .../mob/living/carbon/human/species.dm | 15 ++++-- .../living/carbon/monkey/monkey_defense.dm | 29 ++++++---- code/modules/mob/living/living_defense.dm | 23 +++++--- .../mob/living/silicon/robot/robot_defense.dm | 6 ++- .../mob/living/silicon/silicon_defense.dm | 3 +- .../living/simple_animal/animal_defense.dm | 12 +++-- code/modules/mob/mob.dm | 50 ++++++------------ code/modules/power/supermatter/supermatter.dm | 4 +- code/modules/projectiles/gun.dm | 9 ++-- code/modules/projectiles/projectile.dm | 3 +- icons/effects/effects.dmi | Bin 543153 -> 547608 bytes 26 files changed, 129 insertions(+), 86 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 04315b731a9..cfbe81c2d7d 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -55,6 +55,9 @@ return /obj/attacked_by(obj/item/I, mob/living/user) + if(I.force) + visible_message("[user] has hit [src] with [I]!", null, null, 2, user) + //only witnesses close by and the victim see a hit message. take_damage(I.force, I.damtype, "melee", 1) /mob/living/attacked_by(obj/item/I, mob/living/user) @@ -101,6 +104,7 @@ var/attack_message = "[src] has been [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]!" - src << "[attack_message]" + visible_message("[attack_message]", \ + "[attack_message]", null, 2,user) return 1 diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 630dfddb440..1f14904d96f 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -46,7 +46,8 @@ if(!damage) playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) - D << "[A] has attempted to [atk_verb] [D]!" + D.visible_message("[A] has attempted to [atk_verb] [D]!", \ + "[A] has attempted to [atk_verb] [D]!", null, 2, A) add_logs(A, D, "attempted to [atk_verb]") return 0 @@ -54,7 +55,8 @@ var/armor_block = D.run_armor_check(affecting, "melee") playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) - D << "[A] has [atk_verb]ed [D]!" + D.visible_message("[A] has [atk_verb]ed [D]!", \ + "[A] has [atk_verb]ed [D]!", null, 2, A) D.apply_damage(damage, BRUTE, affecting, armor_block) @@ -105,7 +107,8 @@ var/damage = rand(5, 8) + A.dna.species.punchdamagelow if(!damage) playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) - D << "[A] has attempted to hit [D] with a [atk_verb]!" + D.visible_message("[A] has attempted to [atk_verb] [D]!", \ + "[A] has attempted to [atk_verb] [D]!", null, 2, A) add_logs(A, D, "attempted to hit", atk_verb) return 0 @@ -115,7 +118,8 @@ playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) - D << "[A] has hit [D] with a [atk_verb]!" + D.visible_message("[A] has [atk_verb]ed [D]!", \ + "[A] has [atk_verb]ed [D]!", null, 2, A) D.apply_damage(damage, STAMINA, affecting, armor_block) add_logs(A, D, "punched (boxing) ") diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index d9166fe452d..0ba2a3ccb90 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -129,7 +129,8 @@ if(user in viewers(src, null)) attack_message = "[user] has [message_verb] [src] with [I]!" if(message_verb) - src << "[attack_message]" + visible_message("[attack_message]", + "[attack_message]", null, 2, user) return TRUE /mob/living/carbon/true_devil/Process_Spacemove(movement_dir = 0) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index cc1f6020262..d5f97bf27d9 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -247,6 +247,7 @@ Class Procs: else user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) + user.visible_message("[user.name] smashes against \the [src.name] with its paws.", null, null, 2, user) take_damage(4, BRUTE, "melee", 1) diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 49ac7e4a1c7..c1220c8c750 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -56,6 +56,7 @@ user.changeNext_move(CLICK_CD_MELEE) // Ugh. Ideally we shouldn't be setting cooldowns outside of click code. user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) playsound(loc, 'sound/weapons/tap.ogg', 40, 1, -1) + user.visible_message("[user] hits [name]. Nothing happens", null, null, 2, user) log_message("Attack by hand/paw. Attacker - [user].",1) log_append_to_last("Armor saved.") @@ -93,6 +94,7 @@ log_message("Attack by hulk. Attacker - [user].",1) user.changeNext_move(CLICK_CD_MELEE) add_logs(user, src, "punched", "hulk powers") + user.visible_message("[user] hits [name]. The metal creaks and bends.", null, null, 2, user) user.do_attack_animation(src, ATTACK_EFFECT_SMASH) take_damage(15, BRUTE, "melee", 0, get_dir(src, user)) return 1 diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index ac7b93063cd..4f5d3b4dfe5 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -63,12 +63,14 @@ /obj/bullet_act(obj/item/projectile/P) . = ..() playsound(src, P.hitsound, 50, 1) + visible_message("[src] is hit by \a [P]!", null, null, 2) take_damage(P.damage, P.damage_type, P.flag, 0, turn(P.dir, 180)) /obj/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) if(user.a_intent == "harm") ..(user, 1) + visible_message("[user] smashes [src]!", null, null, 2, user) if(density) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) @@ -132,6 +134,7 @@ return 0 else return 0 + visible_message("[M.name] has hit [src].", null, null, 2, M.occupant) return take_damage(M.force*3, mech_damtype, "melee", play_soundeffect, get_dir(src, M)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. /obj/singularity_act() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 07fb31a87ea..71a7e618cb3 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -161,6 +161,7 @@ //prevents remote "kicks" with TK if (!Adjacent(user)) return + user.visible_message("[user] kicks the display case.", null, null, 2, user) user.do_attack_animation(src, ATTACK_EFFECT_KICK) take_damage(2) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 59964410001..7204319e7ff 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -43,12 +43,14 @@ /obj/structure/grille/attack_hand(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src, ATTACK_EFFECT_KICK) + user.visible_message("[user] hits [src].", null, null, 2, user) if(!shock(user, 70)) take_damage(rand(5,10), BRUTE, "melee", 1) /obj/structure/grille/attack_alien(mob/living/user) user.do_attack_animation(src) user.changeNext_move(CLICK_CD_MELEE) + user.visible_message("[user] mangles [src].", null, null, 2, user) if(!shock(user, 70)) take_damage(20, BRUTE, "melee", 1) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index a5c8dea83c6..51aefb3d5b0 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -439,6 +439,7 @@ /obj/structure/rack/attack_hand(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src, ATTACK_EFFECT_KICK) + user.visible_message("[user] kicks [src].", null, null, 2, user) take_damage(rand(4,8), BRUTE, "melee", 1) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 0c6b9c1efeb..09cf1e2776f 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -89,6 +89,7 @@ switch(M.damtype) if(BRUTE) playsound(src, 'sound/weapons/punch4.ogg', 50, 1) + visible_message("[M.name] has hit [src]!", null, null, 2, M.occupant) if(prob(hardness + M.force) && M.force > 20) dismantle_wall(1) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 659fe3f3c8d..92221f35b11 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -120,7 +120,8 @@ if(answer == "Yes") card.removePersonality() var/turf/T = get_turf(src.loc) - T.visible_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", "[src] bleeps electronically.") + T.visible_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", null, \ + "[src] bleeps electronically.") death(0) else src << "Aborting suicide attempt." diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 7008abfa589..3505974d7a4 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -35,7 +35,8 @@ In all, this is a lot like the monkey code. /N if (health > 0) M.do_attack_animation(src, ATTACK_EFFECT_BITE) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - src << "[M.name] bites [src]!" + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!", null, 2, M) adjustBruteLoss(1) add_logs(M, src, "attacked") updatehealth() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm index fe7a468229c..9511129b725 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm @@ -17,7 +17,7 @@ hitverb = "slammed" playsound(loc, "punch", 25, 1, -1) visible_message("[user] has [hitverb] [src]!", \ - "[user] has [hitverb] [src]!") + "[user] has [hitverb] [src]!", null, 2, user) return 1 /mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M) @@ -27,7 +27,8 @@ var/damage = rand(1, 9) if (prob(90)) playsound(loc, "punch", 25, 1, -1) - src << "[M] has punched [src]!" + visible_message("[M] has punched [src]!", \ + "[M] has punched [src]!", null, 2, M) if ((stat != DEAD) && (damage > 9 || prob(5)))//Regular humans have a very small chance of weakening an alien. Paralyse(2) visible_message("[M] has weakened [src]!", \ @@ -37,7 +38,8 @@ add_logs(M, src, "attacked") else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - src << "[M] has attempted to punch [src]!" + visible_message("[M] has attempted to punch [src]!", \ + "[M] has attempted to punch [src]!", null, 2, M) if ("disarm") if (!lying) @@ -51,10 +53,12 @@ if (prob(50)) drop_item() playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - src << "[M] has disarmed [src]!" + visible_message("[M] has disarmed [src]!", \ + "[M] has disarmed [src]!", null, 2, M) else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - src << "[M] has attempted to disarm [src]!" + visible_message("[M] has attempted to disarm [src]!",\ + "[M] has attempted to disarm [src]!", null, 2, M) diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm index e9bd2125dab..36b685e9a58 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm @@ -6,7 +6,8 @@ if (prob(90)) playsound(loc, "punch", 25, 1, -1) add_logs(M, src, "attacked") - src << "[M] has kicked [src]!" + visible_message("[M] has kicked [src]!", \ + "[M] has kicked [src]!", null, 2, M) if ((stat != DEAD) && (damage > 4.9)) Paralyse(rand(5,10)) @@ -14,7 +15,8 @@ apply_damage(damage, BRUTE, affecting) else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - src << "[M] has attempted to kick [src]!" + visible_message("[M] has attempted to kick [src]!", \ + "[M] has attempted to kick [src]!", null, 2, M) /mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) if(user.a_intent == "harm") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 94845d3193e..ec5fe0b66d3 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -331,7 +331,8 @@ update_damage_overlays() updatehealth() - src << "[M.name] has hit [src]!" + visible_message("[M.name] has hit [src]!", \ + "[M.name] has hit [src]!", null, 2, M.occupant) add_logs(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") else diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index c9f2703fbbf..d5df66b01dc 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -985,7 +985,8 @@ if(!damage || !affecting) playsound(target.loc, user.dna.species.miss_sound, 25, 1, -1) - target << "[user] has attempted to [atk_verb] [target]!" + target.visible_message("[user] has attempted to [atk_verb] [target]!",\ + "[user] has attempted to [atk_verb] [target]!", null, 2, user) return 0 @@ -993,7 +994,8 @@ playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1) - target << "[user] has [atk_verb]ed [target]!" + target.visible_message("[user] has [atk_verb]ed [target]!", \ + "[user] has [atk_verb]ed [target]!", null, 2, user) if(user.limb_destroyer) target.dismembering_strike(user, affecting.body_zone) @@ -1020,7 +1022,8 @@ var/randn = rand(1, 100) if(randn <= 25) playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - target << "[user] has pushed [target]!" + target.visible_message("[user] has pushed [target]!", + "[user] has pushed [target]!", null, 2, user) target.apply_effect(2, WEAKEN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!")) target.forcesay(hit_appends) return @@ -1037,13 +1040,15 @@ if(!talked) //BubbleWrap if(target.drop_item()) - target << "[user] has disarmed [target]!" + target.visible_message("[user] has disarmed [target]!", \ + "[user] has disarmed [target]!", null, 2, user) playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - target << "[user] attemped to disarm [target]!" + target.visible_message("[user] attempted to disarm [target]!", \ + "[user] attemped to disarm [target]!", null, 2, user) /datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 11118c6b0cb..4a7df016824 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -51,7 +51,8 @@ if("harm") M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) if (prob(75)) - src << "[M] has punched [name]!" + visible_message("[M] has punched [name]!", \ + "[M] has punched [name]!", null, 2, M) playsound(loc, "punch", 25, 1, -1) var/damage = rand(5, 10) @@ -60,7 +61,7 @@ if ( (paralysis < 5) && (health > 0) ) Paralyse(rand(10, 15)) visible_message("[M] has knocked out [name]!", \ - "[M] has knocked out [name]!") + "[M] has knocked out [name]!", null, 5) var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) if(!affecting) affecting = get_bodypart("chest") @@ -70,7 +71,8 @@ else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - src << "[M] has attempted to punch [name]!" + visible_message("[M] has attempted to punch [name]!", \ + "[M] has attempted to punch [name]!", null, 2, M) if("disarm") if (!paralysis) M.do_attack_animation(src, ATTACK_EFFECT_DISARM) @@ -78,11 +80,13 @@ Paralyse(2) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) add_logs(M, src, "pushed") - src << "[M] has pushed down [src]!" + visible_message("[M] has pushed down [src]!", \ + "[M] has pushed down [src]!", null, 2, M) else if(drop_item()) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - src << "[M] has disarmed [src]!" + visible_message("[M] has disarmed [src]!", \ + "[M] has disarmed [src]!", null, 2, M) /mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M) if(..()) //if harm or disarm intent. @@ -94,9 +98,11 @@ damage = rand(20, 40) if (paralysis < 15) Paralyse(rand(10, 15)) - src << "[M] has wounded [name]!" + visible_message("[M] has wounded [name]!", \ + "[M] has wounded [name]!", null, 2, M) else - src << "[M] has slashed [name]!" + visible_message("[M] has slashed [name]!", \ + "[M] has slashed [name]!", null, 2, M) var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) add_logs(M, src, "attacked") @@ -109,16 +115,19 @@ else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - src << "[M] has attempted to lunge at [name]!" + visible_message("[M] has attempted to lunge at [name]!", \ + "[M] has attempted to lunge at [name]!", null, 2, M) if (M.a_intent == "disarm") playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) if(prob(95)) Weaken(10) - src << "[M] has tackled down [name]!" + visible_message("[M] has tackled down [name]!", \ + "[M] has tackled down [name]!", null, 2, M) else if(drop_item()) - src << "[M] has disarmed [name]!" + visible_message("[M] has disarmed [name]!", \ + "[M] has disarmed [name]!", null, 2, M) add_logs(M, src, "disarmed") updatehealth() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index bf761aade55..430a93a1784 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -109,12 +109,13 @@ else return updatehealth() - src << "[M.name] has hit [src]!" + visible_message("[M.name] has hit [src]!", \ + "[M.name] has hit [src]!", null, 2, M.occupant) add_logs(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") else step_away(src,M) add_logs(M.occupant, src, "pushed", M) - visible_message("[M] pushes [src] out of the way.") + visible_message("[M] pushes [src] out of the way.", null, null, 5) /mob/living/fire_act() adjust_fire_stacks(3) @@ -183,7 +184,8 @@ if (stat != DEAD) add_logs(M, src, "attacked") M.do_attack_animation(src) - src << "The [M.name] glomps [src]!" + visible_message("The [M.name] glomps [src]!", \ + "The [M.name] glomps [src]!", null, 2, M) return 1 /mob/living/attack_animal(mob/living/simple_animal/M) @@ -195,7 +197,8 @@ if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) M.do_attack_animation(src) - src << "\The [M] [M.attacktext] [src]!" + visible_message("\The [M] [M.attacktext] [src]!", \ + "\The [M] [M.attacktext] [src]!", null, 2, M) add_logs(M, src, "attacked") return 1 @@ -213,10 +216,12 @@ if (prob(75)) add_logs(M, src, "attacked") playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - src << "[M.name] bites [src]!" + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!", null, 2, M) return 1 else - src << "[M.name] has attempted to bite [src]!" + visible_message("[M.name] has attempted to bite [src]!", \ + "[M.name] has attempted to bite [src]!", null, 2, M) return 0 /mob/living/attack_larva(mob/living/carbon/alien/larva/L) @@ -229,11 +234,13 @@ L.do_attack_animation(src) if(prob(90)) add_logs(L, src, "attacked") - src << "[L.name] bites [src]!" + visible_message("[L.name] bites [src]!", \ + "[L.name] bites [src]!", null, 2, L) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) return 1 else - src << "[L.name] has attempted to bite [src]!" + visible_message("[L.name] has attempted to bite [src]!", \ + "[L.name] has attempted to bite [src]!", null, 2, L) return 0 /mob/living/attack_alien(mob/living/carbon/alien/humanoid/M) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index da1d483765c..b4468d6b6eb 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -11,13 +11,15 @@ M.do_attack_animation(src, ATTACK_EFFECT_DISARM) if(get_active_held_item()) uneq_active() - src << "[M] has disabled [src]'s active module!" + visible_message("[M] disarmed [src]!", \ + "[M] has disabled [src]'s active module!", null, 2, M) add_logs(M, src, "disarmed") else Stun(2) step(src,get_dir(M,src)) add_logs(M, src, "pushed") - src << "[M] has forced back [src]!" + visible_message("[M] has forced back [src]!", \ + "[M] has forced back [src]!", null, 2, M) playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1) else ..() diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 77e3fb980be..d6803b16150 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -68,7 +68,8 @@ else M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) playsound(src.loc, 'sound/effects/bang.ogg', 10, 1) - src << "[M] punches [src], but doesn't leave a dent." + visible_message("[M] punches [src], but doesn't leave a dent.", \ + "[M] punches [src], but doesn't leave a dent.", null, 2, M) return 0 /mob/living/silicon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 066f2dd3e5b..088599ee399 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -14,7 +14,8 @@ if("harm", "disarm") M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - src << "[M] [response_harm] [src]!" + visible_message("[M] [response_harm] [src]!",\ + "[M] [response_harm] [src]!", null, 2, M) playsound(loc, attacked_sound, 25, 1, -1) attack_threshold_check(harm_intent_damage) add_logs(M, src, "attacked") @@ -25,7 +26,8 @@ if(user.a_intent == "harm") ..(user, 1) playsound(loc, "punch", 25, 1, -1) - src << "[user] has punched [src]!" + visible_message("[user] has punched [src]!", \ + "[user] has punched [src]!", null, 2, user) adjustBruteLoss(15) return 1 @@ -45,11 +47,13 @@ if(..()) //if harm or disarm intent. if(M.a_intent == "disarm") playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - src << "[M] [response_disarm] [name]!" + visible_message("[M] [response_disarm] [name]!", \ + "[M] [response_disarm] [name]!", null, 2, M) add_logs(M, src, "disarmed") else var/damage = rand(15, 30) - src << "[M] has slashed at [src]!" + visible_message("[M] has slashed at [src]!", \ + "[M] has slashed at [src]!", null, 2, M) playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) attack_threshold_check(damage) add_logs(M, src, "attacked") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e6a735b39a9..50a98fb9e3a 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -83,63 +83,45 @@ var/next_mob_id = 0 else src << msg -// Show a message the src mob and to all player mobs who sees the src mob -// This would be for visible actions by the src mob -// message is the message output to anyone who can see e.g. "[src] does something!" +// Show a message to all player mobs who sees this atom +// Show a message to the src mob (if the src is a mob) +// Use for atoms performing visible actions +// message is output to anyone who can see, e.g. "The [src] does something!" // self_message (optional) is what the src mob sees e.g. "You do something!" // blind_message (optional) is what blind people will hear e.g. "You hear something!" +// vision_distance (optional) define how many tiles away the message can be seen. +// ignored_mob (optional) doesn't show any message to a given mob if TRUE. -/mob/visible_message(message, self_message, blind_message) +/atom/proc/visible_message(message, self_message, blind_message, vision_distance, ignored_mob) var/turf/T = get_turf(src) if(!T) return - for(var/mob/M in get_hearers_in_view(7, src)) + var/range = 7 + if(vision_distance) + range = vision_distance + for(var/mob/M in get_hearers_in_view(range, src)) if(!M.client) continue + if(M == ignored_mob) + continue var/msg = message if(M == src) //the src always see the main message or self message if(self_message) msg = self_message else - if(M.see_invisible\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\ "You hear an unearthly noise as a wave of heat washes over you.") else if(isobj(AM) && !istype(AM, /obj/effect)) - AM.visible_message("\The [AM] smacks into \the [src] and rapidly flashes to ash.",\ + AM.visible_message("\The [AM] smacks into \the [src] and rapidly flashes to ash.", null,\ "You hear a loud crack as you are washed with a wave of heat.") else return diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 7508b530737..6fab2ac2fa1 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -77,7 +77,7 @@ G.loc = loc qdel(G.pin) G.pin = null - visible_message("[G] can now fit a new pin, but old one was destroyed in the process.") + visible_message("[G] can now fit a new pin, but old one was destroyed in the process.", null, null, 3) qdel(src) /obj/item/weapon/gun/examine(mob/user) @@ -113,8 +113,11 @@ playsound(user, fire_sound, 10, 1) else playsound(user, fire_sound, 50, 1) - if(!message) - return + if(message) + if(pointblank) + user.visible_message("[user] fires [src] point blank at [pbtarget]!", null, null, 2, user) + else + user.visible_message("[user] fires [src]!", null, null, 2, user) if(weapon_weight >= WEAPON_MEDIUM) if(user.get_inactive_held_item()) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index e0261614cdc..78866b40e0f 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -106,7 +106,8 @@ if(hitsound) var/volume = vol_by_damage() playsound(loc, hitsound, volume, 1, -1) - L << "[L] is hit by \a [src][organ_hit_text]!" + L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \ + "[L] is hit by \a [src][organ_hit_text]!", null, 2) L.on_hit(type) var/reagent_note diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index e47c12aefa71ed87d0d4c7b11ef41b4eb521cf98..eb49d01877e9dd958b725000de0ecec19bfa26bc 100644 GIT binary patch delta 23280 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 P00000NkvXXu0mjfg}Z~$ delta 18790 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