From 5979ce8aa2391e9878b309ac97033935b7e02511 Mon Sep 17 00:00:00 2001 From: PotatoTomahto <76505086+PotatoTomahto@users.noreply.github.com> Date: Fri, 23 Feb 2024 17:09:14 -0800 Subject: [PATCH] Clouded Monk: Bubblegum Edition (#1854) * monk * Update code/modules/mob/living/carbon/human/species.dm Co-authored-by: Gboster-0 <82319946+Gboster-0@users.noreply.github.com> * monk faster * dead check --------- Co-authored-by: Gboster-0 <82319946+Gboster-0@users.noreply.github.com> --- code/datums/looping_sounds/abnormalities.dm | 2 +- .../antagonists/slaughter/slaughter.dm | 1 + .../mob/living/carbon/human/species.dm | 32 +-- .../carbon/human/species_types/synths.dm | 2 + .../abnormality/waw/clouded_monk.dm | 239 ++++++++++-------- .../living/simple_animal/animal_defense.dm | 4 +- .../mob/living/simple_animal/hostile/bear.dm | 3 + .../hostile/mining_mobs/basilisk.dm | 2 + .../simple_animal/hostile/ordeal/green.dm | 1 + .../living/simple_animal/hostile/regalrat.dm | 3 +- .../living/simple_animal/hostile/skeleton.dm | 5 +- .../mob/living/simple_animal/simple_animal.dm | 5 +- code/modules/paperwork/records/info/waw.dm | 2 +- icons/mob/actions/actions_abnormality.dmi | Bin 18698 -> 20560 bytes 14 files changed, 172 insertions(+), 129 deletions(-) diff --git a/code/datums/looping_sounds/abnormalities.dm b/code/datums/looping_sounds/abnormalities.dm index 9d31b51f91c7..4fe68dc9d387 100644 --- a/code/datums/looping_sounds/abnormalities.dm +++ b/code/datums/looping_sounds/abnormalities.dm @@ -97,7 +97,7 @@ /datum/looping_sound/cloudedmonk_ambience mid_sounds = 'sound/abnormalities/clouded_monk/run.ogg' mid_length = 6 SECONDS - volume = 25 + volume = 12.5 //SO ANNOYING extra_range = -4 /datum/looping_sound/orangetree_ambience diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 4daf0116d011..9138f56f41d3 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -210,6 +210,7 @@ attack_verb_simple = "wildly tickle" attack_sound = 'sound/items/bikehorn.ogg' + attack_vis_effect = null feast_sound = 'sound/spookoween/scary_horn2.ogg' death_sound = 'sound/misc/sadtrombone.ogg' diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index dce0b0ead9e9..d22d43fbe94d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -146,7 +146,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) ///Punch-specific attack verb. var/attack_verb = "punch" - /// + /// The visual effect of the attack. + var/attack_effect = ATTACK_EFFECT_PUNCH var/sound/attack_sound = 'sound/weapons/punch1.ogg' var/sound/miss_sound = 'sound/weapons/punchmiss.ogg' @@ -1381,23 +1382,16 @@ GLOBAL_LIST_EMPTY(roundstart_races) else var/atk_verb = user.dna.species.attack_verb + var/atk_effect = user.dna.species.attack_effect if(target.body_position == LYING_DOWN) - atk_verb = ATTACK_EFFECT_KICK - - switch(atk_verb)//this code is really stupid but some genius apparently made "claw" and "slash" two attack types but also the same one so it's needed i guess - if(ATTACK_EFFECT_KICK) - user.do_attack_animation(target, ATTACK_EFFECT_KICK) - if(ATTACK_EFFECT_SLASH, ATTACK_EFFECT_CLAW)//smh - user.do_attack_animation(target, ATTACK_EFFECT_CLAW) - if(ATTACK_EFFECT_SMASH) - user.do_attack_animation(target, ATTACK_EFFECT_SMASH) - if(ATTACK_EFFECT_BITE) - if(user.is_mouth_covered(FALSE, TRUE)) - to_chat(user, span_warning("You can't bite with your mouth covered!")) - return FALSE - user.do_attack_animation(target, ATTACK_EFFECT_BITE) - else - user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) + atk_verb = "kick" + atk_effect = ATTACK_EFFECT_KICK + + if(atk_effect == ATTACK_EFFECT_BITE) + if(user.is_mouth_covered(mask_only = TRUE)) + to_chat(user, span_warning("You can't [atk_verb] with your mouth covered!")) + return FALSE + user.do_attack_animation(target, atk_effect) var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh) @@ -1405,7 +1399,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases if(user.dna.species.punchdamagelow) - if(atk_verb == ATTACK_EFFECT_KICK || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) //kicks never miss (provided your species deals more than 0 damage) + if(atk_effect == ATTACK_EFFECT_KICK || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) //kicks never miss (provided your species deals more than 0 damage) miss_chance = 0 else miss_chance = min((user.dna.species.punchdamagehigh/user.dna.species.punchdamagelow) + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 100) //old base chance for a miss + various damage. capped at 100 to prevent weirdness in prob() @@ -1433,7 +1427,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(user.limb_destroyer) target.dismembering_strike(user, affecting.body_zone) - if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage + if(atk_effect == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage target.apply_damage(damage*1.5, user.dna.species.attack_type, affecting, armor_block) log_combat(user, target, "kicked") else//other attacks deal full raw damage diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index 4a2843667329..fa07cf2fa9c5 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -60,6 +60,7 @@ species_traits |= S.species_traits inherent_traits |= S.inherent_traits attack_verb = S.attack_verb + attack_effect = S.attack_effect attack_sound = S.attack_sound miss_sound = S.miss_sound meat = S.meat @@ -78,6 +79,7 @@ species_traits = initial_species_traits.Copy() inherent_traits = initial_inherent_traits.Copy() attack_verb = initial(attack_verb) + attack_effect = initial(attack_verb) attack_sound = initial(attack_sound) miss_sound = initial(miss_sound) mutant_bodyparts = list() diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm b/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm index e13d07c6a7b9..ccec8f9c2247 100644 --- a/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm +++ b/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm @@ -15,14 +15,15 @@ damage_coeff = list(BRUTE = 1.0, RED_DAMAGE = 1.2, WHITE_DAMAGE = 0.8, BLACK_DAMAGE = 0.8, PALE_DAMAGE = 1.5) melee_damage_lower = 30 melee_damage_upper = 45 + obj_damage = 22 //otherwise his charge just destroys everything melee_damage_type = RED_DAMAGE see_in_dark = 10 stat_attack = HARD_CRIT - move_to_delay = 4 threat_level = WAW_LEVEL attack_sound = 'sound/abnormalities/clouded_monk/monk_attack.ogg' - attack_verb_continuous = "bashes" - attack_verb_simple = "bash" + attack_vis_effect = ATTACK_EFFECT_CLAW + attack_verb_continuous = "swipes" + attack_verb_simple = "swipe" can_breach = TRUE start_qliphoth = 3 work_chances = list( @@ -39,21 +40,35 @@ /datum/ego_datum/armor/amrita, ) gift_type = /datum/ego_gifts/amrita - gift_message = "Anyone can become a Buddha by washing away the anguish and delusion in their heart." + gift_message = "But if you were to consume them, perhaps, you would display more sarira than Buddha himself..." abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY var/datum/looping_sound/cloudedmonk_ambience/soundloop var/charging = FALSE + var/revving_charge = FALSE var/charge_ready = FALSE - var/dash_num = 25 - var/dash_cooldown = 0 - var/dash_cooldown_time = 6 SECONDS - var/list/been_hit = list() // Don't get hit twice. + var/monk_charge_cooldown = 0 + var/monk_charge_cooldown_time = 6 SECONDS var/deathcount var/heal_amount = 250 + var/charge_damage = 350 var/eaten = FALSE var/damage_taken + attack_action_types = list( + /datum/action/innate/abnormality_attack/toggle/monk_charge + ) + +/datum/action/innate/abnormality_attack/toggle/monk_charge + name = "Toggle Triple Charge" + button_icon_state = "kog_charge" //placeholder, also recode toggle actions to not need this var + chosen_attack_num = 0 + chosen_message = span_colossus("You won't charge anymore.") + button_icon_toggle_activated = "kog_charge1" + toggle_attack_num = 1 //Activate() and Deactivate() need to be flipped for this naming to make sense + toggle_message = span_colossus("You will now triple charge at the target you click on if damaged enough.") + button_icon_toggle_deactivated = "kog_charge" + //init /mob/living/simple_animal/hostile/abnormality/clouded_monk/Initialize() . = ..() @@ -90,136 +105,156 @@ /mob/living/simple_animal/hostile/abnormality/clouded_monk/NeutralEffect(mob/living/carbon/human/user, work_type, pe) . = ..() - if(prob(25)) + if(prob(30)) datum_reference.qliphoth_change(-1) return /mob/living/simple_animal/hostile/abnormality/clouded_monk/PostWorkEffect(mob/living/carbon/human/user, work_type, pe, work_time, canceled) if(work_type == ABNORMALITY_WORK_INSIGHT) user.adjustSanityLoss(-30) // It's healing - to_chat(user, span_nicegreen("[src] restores your SP with calming words.")) + to_chat(user, span_nicegreen("[src] guides you through a session of meditation.")) return +/mob/living/simple_animal/hostile/abnormality/clouded_monk/BreachEffect(mob/living/carbon/human/user, breach_type) + . = ..() + soundloop.start() + playsound(src, 'sound/abnormalities/clouded_monk/howl.ogg', 50, 1) + playsound(src, 'sound/abnormalities/clouded_monk/transform.ogg', 50, 1) + icon_state = icon_aggro + desc = "A monk that has forgotten he has become a demon. It resembles a preta from legends." + GiveTarget(user) + //breach code /mob/living/simple_animal/hostile/abnormality/clouded_monk/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() + if(revving_charge || charging) //ignore damage taken while charging, we reset it after a triple charge + return if(. > 0) damage_taken += . if(damage_taken >= 200 && !charge_ready) charge_ready = TRUE - damage_taken = 0 -/mob/living/simple_animal/hostile/abnormality/clouded_monk/BreachEffect(mob/living/carbon/human/user, breach_type) - . = ..() - soundloop.start() - playsound(src, 'sound/abnormalities/clouded_monk/howl.ogg', 50, 1) - playsound(src, 'sound/abnormalities/clouded_monk/transform.ogg', 50, 1) - icon_state = icon_aggro - desc = "A monk that turned into a demon. It resembles a preta from legends..." - GiveTarget(user) +/mob/living/simple_animal/hostile/abnormality/clouded_monk/Goto(target, delay, minimum_distance) + if(revving_charge || charging) + return FALSE + return ..() + +/mob/living/simple_animal/hostile/abnormality/clouded_monk/MoveToTarget(list/possible_targets) + if(revving_charge || charging) + return FALSE + return ..() /mob/living/simple_animal/hostile/abnormality/clouded_monk/Move() - if(charging) + if(revving_charge) return FALSE + if(charging) + new /obj/effect/temp_visual/decoy/fading(loc,src) + DestroySurroundings() //to break tables ssin the way return ..() /mob/living/simple_animal/hostile/abnormality/clouded_monk/AttackingTarget() - if(charging) + if(revving_charge || charging) return - if(dash_cooldown <= world.time && prob(10) && !client && charge_ready) - PrepCharge(target) + if(monk_charge_cooldown <= world.time && prob(33) && !client && charge_ready) + TripleCharge(target) return . = ..() - if(!ishuman(target)) - return - var/mob/living/carbon/human/H = target - if(H.health < 0) - H.gib() - playsound(src, "sound/abnormalities/clouded_monk/eat.ogg", 75, 1) - adjustBruteLoss(-heal_amount) - return /mob/living/simple_animal/hostile/abnormality/clouded_monk/OpenFire() - if(client && charge_ready) + if(revving_charge || charging) + return + if(client && monk_charge_cooldown <= world.time && charge_ready) switch(chosen_attack) if(1) - PrepCharge(target) + TripleCharge(target) + return + + if(monk_charge_cooldown <= world.time && prob(33) && charge_ready) + TripleCharge(target) + +/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/TripleCharge(atom/target_atom) + if(revving_charge || charging || monk_charge_cooldown > world.time) return + for(var/i in 1 to 3) + Charge(chargeat = target_atom, delay = (2 SECONDS/(2*i))) //1 second, 0.5 second, 0.25 second delays + ResetCharge() - if(dash_cooldown <= world.time && charge_ready) - var/chance_to_dash = 25 - var/dir_to_target = get_dir(get_turf(src), get_turf(target)) - if(dir_to_target in list(NORTH, SOUTH, WEST, EAST)) - chance_to_dash = 100 - if(prob(chance_to_dash)) - PrepCharge(target) - -//dash code -/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/PrepCharge(target) - if(charging || dash_cooldown > world.time) +//charge code +/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/Charge(atom/chargeat = target, delay = 1 SECONDS, chargepast = 3) + if(stat == DEAD) + return + if(monk_charge_cooldown > world.time || charging || revving_charge) + return + if(!chargeat) return + face_atom(chargeat) + var/turf/T = get_ranged_target_turf(chargeat, dir, chargepast) + if(!T) + return + var/turf/chargeturf = get_turf(chargeat) + if(chargeturf) //for some reason this can end up being null + new /obj/effect/temp_visual/cult/sparks(chargeturf) //in case the big effect is behind a wall + new /obj/effect/temp_visual/dragon_swoop/bubblegum(T) icon_state = "pretarage" - dash_cooldown = world.time + dash_cooldown_time - charging = TRUE - var/dir_to_target = get_dir(get_turf(src), get_turf(target)) - been_hit = list() - dash_num = (get_dist(src, target) + 3) - addtimer(CALLBACK(src, PROC_REF(Charge), dir_to_target, 0), 2 SECONDS) + revving_charge = TRUE charge_ready = FALSE + walk(src, 0) if(!eaten) //different sfx before and after eating someone playsound(src, 'sound/abnormalities/clouded_monk/monk_cast.ogg', 100, 1) + else + playsound(src, 'sound/abnormalities/clouded_monk/monk_groggy.ogg', 150, 1) + SLEEP_CHECK_DEATH(delay) + if(!revving_charge) //to end charges prematurely return - playsound(src, 'sound/abnormalities/clouded_monk/eat_groggy.ogg', 100, 1) + charging = TRUE + revving_charge = FALSE + var/movespeed = 0.8 + walk_towards(src, T, movespeed) + SLEEP_CHECK_DEATH(get_dist(src, T) * movespeed) + EndCharge() -/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/Charge(move_dir, times_ran) - var/stop_charge = FALSE - if(times_ran >= dash_num) - stop_charge = TRUE - var/turf/T = get_step(get_turf(src), move_dir) - if(!T) - charging = FALSE - return - if(T.density) - stop_charge = TRUE - for(var/obj/structure/window/W in T.contents) - stop_charge = TRUE - break - for(var/obj/machinery/door/D in T.contents) - if(!D.CanAStarPass(null)) - stop_charge = TRUE - break - if(D.density) - INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door, open), 2) - if(stop_charge) - charging = FALSE - icon_state = icon_aggro +/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/EndCharge() + if(!charging) return - forceMove(T) - playsound(src, 'sound/abnormalities/clouded_monk/monk_groggy.ogg', 150, 1) - for(var/turf/TF in range(1, T))//Smash AOE visual - new /obj/effect/temp_visual/smash_effect(TF) - for(var/mob/living/L in range(1, T))//damage applied to targets in range - if(faction_check_mob(L)) - continue - if(L in been_hit) - continue - if(L.z != z) - continue - visible_message(span_boldwarning("[src] bites [L]!")) - to_chat(L, span_userdanger("[src] takes a bite out of you!")) - var/turf/LT = get_turf(L) - new /obj/effect/temp_visual/kinetic_blast(LT) - L.apply_damage(350,RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE) - been_hit += L - playsound(L, "sound/abnormalities/clouded_monk/monk_bite.ogg", 75, 1) - if(!ishuman(L)) - continue - var/mob/living/carbon/human/H = L - if(H.health < 0) - H.gib() - playsound(src, "sound/abnormalities/clouded_monk/eat.ogg", 75, 1) - adjustBruteLoss(-heal_amount) - times_ran = dash_num //stop the charge, we got the meats! - if(!eaten) - eaten = TRUE - addtimer(CALLBACK(src, PROC_REF(Charge), move_dir, (times_ran + 1)), 1) + charging = FALSE + revving_charge = FALSE + walk(src, 0) // cancel the movement + icon_state = icon_aggro + +/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/ResetCharge() + monk_charge_cooldown = world.time + monk_charge_cooldown_time + charge_ready = FALSE //redundancy is good + damage_taken = 0 + +/mob/living/simple_animal/hostile/abnormality/clouded_monk/Bump(atom/A) + if(charging) + if(isliving(A)) + var/mob/living/L = A + if(!faction_check_mob(L)) + visible_message(span_boldwarning("[src] bites [L]!"), span_boldwarning("You take a bite out of [L]!"), ignored_mobs = L) + to_chat(L, span_userdanger("[src] takes a bite out of you!")) + do_attack_animation(L, ATTACK_EFFECT_BITE) + playsound(src, 'sound/abnormalities/clouded_monk/monk_bite.ogg', 75, 1) + shake_camera(L, 4, 3) + shake_camera(src, 2, 3) + if(ishuman(L)) + var/mob/living/carbon/human/H = A + H.apply_damage(charge_damage,RED_DAMAGE, null, H.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE) + if(H.health < 0) + H.gib() + adjustBruteLoss(-heal_amount) + if(!eaten) + playsound(src, 'sound/abnormalities/clouded_monk/eat.ogg', 75, 1) + eaten = TRUE + else + playsound(src, 'sound/abnormalities/clouded_monk/eat_groggy.ogg', 75, 1) + else + L.adjustRedLoss(charge_damage/10) + EndCharge() + ResetCharge() + else if(isvehicle(A)) + var/obj/vehicle/V = A + V.take_damage(charge_damage/10, RED_DAMAGE) + for(var/mob/living/occupant in V.occupants) + to_chat(occupant, span_userdanger("Your [V.name] is bit by [src]!")) + return ..() diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index c1eb15b0f8d1..ba5783c8a859 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -179,7 +179,9 @@ /mob/living/simple_animal/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect) if(!no_effect && !visual_effect_icon && melee_damage_upper) - if(melee_damage_upper < 10) + if(attack_vis_effect && !iswallturf(A)) // override the standard visual effect. + visual_effect_icon = attack_vis_effect + else if(melee_damage_upper < 10) visual_effect_icon = ATTACK_EFFECT_PUNCH else visual_effect_icon = ATTACK_EFFECT_SMASH diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index b67916258d5e..f9e6493abea0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -33,6 +33,7 @@ attack_verb_continuous = "claws" attack_verb_simple = "claw" attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW friendly_verb_continuous = "bear hugs" friendly_verb_simple = "bear hug" @@ -142,6 +143,8 @@ death_message = "loses its false life and collapses!" butcher_results = list(/obj/item/food/butter = 6, /obj/item/food/meat/slab = 3, /obj/item/organ/brain = 1, /obj/item/organ/heart = 1) attack_sound = 'sound/weapons/slap.ogg' + attack_vis_effect = ATTACK_EFFECT_DISARM + attack_verb_simple = "slap" attack_verb_continuous = "slaps" /mob/living/simple_animal/hostile/bear/butter/add_cell_sample() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index d1fe271d6b38..201331ab9013 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -28,6 +28,7 @@ attack_verb_simple = "bite into" speak_emote = list("chitters") attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE aggro_vision_range = 9 turns_per_move = 5 gold_core_spawnable = HOSTILE_SPAWN @@ -108,6 +109,7 @@ a_intent = INTENT_HARM speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = null // doesn't bite unlike the parent type. stat_attack = HARD_CRIT is_flying_animal = TRUE robust_searching = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/green.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/green.dm index d562fab030c2..f1b5def52349 100644 --- a/code/modules/mob/living/simple_animal/hostile/ordeal/green.dm +++ b/code/modules/mob/living/simple_animal/hostile/ordeal/green.dm @@ -113,6 +113,7 @@ attack_verb_continuous = "saws" attack_verb_simple = "saw" attack_sound = 'sound/effects/ordeals/green/saw.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW ranged = 1 rapid = 5 rapid_fire_delay = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index b9903e8cb9cd..c97db23e1fa0 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -25,7 +25,8 @@ melee_damage_upper = 15 attack_verb_continuous = "slashes" attack_verb_simple = "slash" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW ventcrawler = VENTCRAWLER_ALWAYS unique_name = TRUE faction = list("rat") diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index cfd923161e35..b94df0038498 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -23,6 +23,7 @@ attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/hallucinations/growl1.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 10 robust_searching = 1 @@ -98,9 +99,6 @@ melee_damage_lower = 15 melee_damage_upper = 20 light_color = LIGHT_COLOR_PURPLE - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/hallucinations/growl1.ogg' death_message = "collapses into a pile of bones, their suit dissolving among the plasma!" loot = list(/obj/effect/decal/remains/plasma) @@ -117,6 +115,7 @@ attack_verb_continuous = "blasts" attack_verb_simple = "blast" attack_sound = 'sound/weapons/sonic_jackhammer.ogg' + attack_vis_effect = null // jackhammer moment loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer) /mob/living/simple_animal/hostile/skeleton/plasmaminer/Initialize() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 08d27a722627..5144c38fdf7c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -92,7 +92,10 @@ var/attack_verb_continuous = "attacks" ///Attacking verb in present simple tense. var/attack_verb_simple = "attack" - var/attack_sound = null + /// Sound played when the critter attacks. + var/attack_sound + /// Override for the visual attack effect shown on 'do_attack_animation()'. + var/attack_vis_effect ///Attacking, but without damage, verb in present continuous tense. var/friendly_verb_continuous = "nuzzles" ///Attacking, but without damage, verb in present simple tense. diff --git a/code/modules/paperwork/records/info/waw.dm b/code/modules/paperwork/records/info/waw.dm index 15fd16084c48..77be1a9ed359 100644 --- a/code/modules/paperwork/records/info/waw.dm +++ b/code/modules/paperwork/records/info/waw.dm @@ -381,7 +381,7 @@ abno_code = "D-01-110" abno_info = list( "An employee’s SP was healed when they performed Insight work.", - "The Qliphoth Counter lowered every time two employees died.", + "The Qliphoth Counter lowered every time 2 employees died.", "When the work result was Normal, the Qliphoth Counter lowered with a low probability.", "When the work result was Bad, the Qliphoth Counter decreased.") diff --git a/icons/mob/actions/actions_abnormality.dmi b/icons/mob/actions/actions_abnormality.dmi index 273f93d66addf7b9eae8f8c663c74b5821bbc2b4..11e01722e0fd8148969f580d2cbfb285aaf120ce 100644 GIT binary patch literal 20560 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 DzVbx! literal 18698 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