From 908b3aa2b54ab4be27deff0f28c09d58cf7e9095 Mon Sep 17 00:00:00 2001 From: Gerrit Grobler Date: Fri, 11 Dec 2020 21:43:34 +0200 Subject: [PATCH 1/2] Changeling Combat Tentacle --- code/game/atoms_movable.dm | 8 +- .../gamemodes/changeling/helpers/_store.dm | 6 + .../gamemodes/changeling/implements/items.dm | 168 +++++++++++++++++- .../changeling/implements/powers/body.dm | 37 ++++ .../mob/living/carbon/human/human_defense.dm | 9 +- code/modules/mob/mob_grab.dm | 64 ++++--- code/modules/projectiles/gun.dm | 4 +- code/modules/projectiles/projectile.dm | 16 +- html/changelogs/geeves-combat_tentacle.yml | 6 + icons/effects/beam.dmi | Bin 8292 -> 8498 bytes .../contained_items/weapons/ling_tentacle.dmi | Bin 0 -> 3445 bytes 11 files changed, 276 insertions(+), 42 deletions(-) create mode 100644 html/changelogs/geeves-combat_tentacle.yml create mode 100644 icons/obj/contained_items/weapons/ling_tentacle.dmi diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index be1b9db2254..1a1dc2b9e0b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -108,7 +108,7 @@ return TRUE -/atom/movable/proc/throw_at(atom/target, range, speed, thrower, var/do_throw_animation = TRUE) +/atom/movable/proc/throw_at(atom/target, range, speed, thrower, var/do_throw_animation = TRUE, datum/callback/callback) if(!target || !src) return 0 //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target @@ -184,7 +184,8 @@ src.SpinAnimation(speed = 4, loops = 1) //done throwing, either because it hit something or it finished moving - if(isobj(src)) src.throw_impact(get_turf(src),speed) + if(isobj(src)) + src.throw_impact(get_turf(src),speed) src.throwing = 0 src.thrower = null src.throw_source = null @@ -193,6 +194,9 @@ var/turf/Tloc = loc Tloc.Entered(src) + if(callback) + callback.Invoke() + /atom/movable/proc/throw_at_random(var/include_own_turf, var/maxrange, var/speed) var/list/turfs = RANGE_TURFS(maxrange, src) if(!maxrange) diff --git a/code/game/gamemodes/changeling/helpers/_store.dm b/code/game/gamemodes/changeling/helpers/_store.dm index 7e692f81164..f94704d3756 100644 --- a/code/game/gamemodes/changeling/helpers/_store.dm +++ b/code/game/gamemodes/changeling/helpers/_store.dm @@ -194,6 +194,12 @@ var/list/datum/power/changeling/powerinstances = list() //weapon and armor like powers +/datum/power/changeling/combat_tentacle + name = "Mutate Tentacles" + desc = "Permits us to reshape our arms into a multi-purpose tentacles." + genomecost = 4 + verbpath = /mob/proc/combat_tentacle + /datum/power/changeling/armblades name = "Mutate Armblades" desc = "Permits us to reshape our arms into a deadly blade." diff --git a/code/game/gamemodes/changeling/implements/items.dm b/code/game/gamemodes/changeling/implements/items.dm index a6ddf5d21d9..5417e0984ce 100644 --- a/code/game/gamemodes/changeling/implements/items.dm +++ b/code/game/gamemodes/changeling/implements/items.dm @@ -28,8 +28,8 @@ return ..() /obj/item/melee/arm_blade/dropped(var/mob/living/user) - visible_message("With a sickening crunch, [user] reforms their arm blade into an arm!", - "You hear organic matter ripping and tearing!") + visible_message(SPAN_DANGER("With a sickening crunch, [user] reforms their arm blade into an arm!"), + SPAN_WARNING("You hear organic matter ripping and tearing!")) playsound(loc, 'sound/effects/blobattack.ogg', 30, 1) QDEL_IN(src, 1) @@ -85,8 +85,8 @@ return ..() /obj/item/shield/riot/changeling/dropped(var/mob/living/user) - visible_message("With a sickening crunch, [user] reforms their shield into an arm!", - "You hear organic matter ripping and tearing!") + visible_message(SPAN_DANGER("With a sickening crunch, [user] reforms their shield into an arm!"), + SPAN_WARNING("You hear organic matter ripping and tearing!")) playsound(loc, 'sound/effects/blobattack.ogg', 30, 1) QDEL_IN(src, 1) @@ -122,3 +122,163 @@ edge = FALSE throwforce = 5 w_class = ITEMSIZE_SMALL + + +/***************************************\ +|***********COMBAT TENTACLES*************| +\***************************************/ + +/obj/item/gun/energy/tentacle + name = "tentacle" + desc = "A horrible amalgamation of blood and flesh, warped into the shape of a pulsing tentacle." + desc_info = null + desc_antag = "A fleshy tentacle that can stretch out and grab things or people." + icon = 'icons/obj/contained_items/weapons/ling_tentacle.dmi' + icon_state = "tentacle" + item_state = "tentacle" + flags = NOBLUDGEON + w_class = ITEMSIZE_HUGE + has_safety = FALSE + needspin = FALSE + pin = null + projectile_type = /obj/item/projectile/tentacle + fire_sound = 'sound/effects/splat.ogg' + force = 0 + max_shots = 1 + throwforce = 0 //Just to be on the safe side + throw_range = 0 + throw_speed = 0 + charge_failure_message = "cannot be charged." + +/obj/item/gun/energy/tentacle/update_icon() + return + +/obj/item/gun/energy/tentacle/dropped(mob/living/user) + if(power_supply?.charge > 0 && !user.stat) + user.visible_message(SPAN_DANGER("With a sickening crunch, [user] reforms their tentacle into an arm!"), SPAN_NOTICE("You reform your tentacle into an arm."), SPAN_WARNING("You hear organic matter ripping and tearing!")) + playsound(loc, 'sound/effects/blobattack.ogg', 30, 1) + QDEL_IN(src, 1) + +/obj/item/gun/energy/tentacle/handle_click_empty(user) + to_chat(user, SPAN_WARNING("\The [src] is not ready yet.")) + +/obj/item/gun/energy/tentacle/handle_suicide(mob/living/user) + user.visible_message(SPAN_WARNING("[user] coils \the [src] tightly around [user.get_pronoun("his")] neck!")) + if(!do_after(user, 40)) + return + user.adjustOxyLoss(300) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/internal/brain = H.internal_organs_by_name[BP_BRAIN] + if(brain) + brain.take_internal_damage(brain.max_damage) + user.death() // double tap - geeves + +/obj/item/projectile/tentacle + name = "tentacle" + icon = 'icons/obj/contained_items/weapons/ling_tentacle.dmi' + icon_state = "tentacle_end" + pass_flags = PASSTABLE + cant_miss = TRUE + damage = 0 + damage_type = BRUTE + range = 8 + hitsound = 'sound/weapons/thudswoosh.ogg' + var/chain + var/obj/item/gun/energy/tentacle/source //the item that shot it + +/obj/item/projectile/tentacle/New(obj/item/gun/energy/tentacle/tentacle_gun) + source = tentacle_gun + ..() + +/obj/item/projectile/tentacle/fire(setAngle) + if(firer) + chain = firer.Beam(src, icon_state = "tentacle", time = -1, maxdistance = INFINITY, beam_sleep_time = 1) + ..() + +/obj/item/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) + if(H.in_throw_mode) + H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item + +/mob/proc/tentacle_grab(mob/living/carbon/human/H) + if(ishuman(H) && Adjacent(H)) + var/obj/item/grab/G = H.grabbedby(src, TRUE) + if(istype(G)) + G.set_state(GRAB_AGGRESSIVE) //Instant aggressive grab + +/mob/proc/tentacle_stab(mob/living/carbon/C) + if(Adjacent(C)) + var/obj/item/I = r_hand + if(!is_sharp(I)) + I = l_hand + if(!is_sharp(I)) + return + + C.visible_message(SPAN_DANGER("[src] impales [C] with [I]!"), SPAN_DANGER("[src] impales you with [I]!")) + C.apply_damage(I.force, BRUTE, "chest") + do_attack_animation(C) + add_blood(C) + playsound(get_turf(src), I.hitsound, 75, 1) + +/obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0) + qdel(source) //one tentacle only unless you miss + if(blocked >= 100) + return FALSE + var/mob/living/carbon/human/H = firer + if(istype(target, /obj/item)) + var/obj/item/I = target + if(!I.anchored) + to_chat(firer, SPAN_NOTICE("You pull [I] towards yourself.")) + H.throw_mode_on() + I.throw_at(H, 10, 2) + . = TRUE + + else if(isliving(target)) + var/mob/living/L = target + if(!L.anchored && !L.throwing)//avoid double hits + if(iscarbon(L)) + var/mob/living/carbon/C = L + switch(firer.a_intent) + if(I_HELP) + C.visible_message(SPAN_DANGER("[L] is pulled by [H]'s tentacle!"), SPAN_DANGER("A tentacle grabs you and pulls you towards [H]!")) + C.throw_at(get_step_towards(H,C), 8, 2) + return TRUE + + if(I_DISARM) + var/obj/item/I = C.get_active_hand() + if(!I || istype(I, /obj/item/grab)) + I = C.get_inactive_hand() + if(I && !istype(I, /obj/item/grab)) + if(C.unEquip(I)) + C.visible_message(SPAN_DANGER("[I] is yanked out of [C]'s hand by [src]!"),SPAN_DANGER("A tentacle pulls [I] away from you!")) + I.throw_at(get_step_towards(H, C), 8, 2, callback = CALLBACK(H, /mob/proc/put_in_any_hand_if_possible, I)) + return TRUE + else + to_chat(firer, SPAN_DANGER("You can't seem to pry [I] out of [C]'s hands!")) + return FALSE + else + to_chat(firer, SPAN_DANGER("[C] has nothing in hand to disarm!")) + return FALSE + + if(I_GRAB) + C.visible_message(SPAN_DANGER("[L] is grabbed by [H]'s tentacle!"), SPAN_DANGER("A tentacle grabs you and pulls you towards [H]!")) + C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_grab, C)) + return TRUE + + if(I_HURT) + C.visible_message(SPAN_DANGER("[L] is thrown towards [H] by a tentacle!"), SPAN_DANGER("A tentacle grabs you and throws you towards [H]!")) + C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_stab, C)) + return TRUE + else + L.visible_message(SPAN_DANGER("[L] is pulled by [H]'s tentacle!"), SPAN_DANGER("A tentacle grabs you and pulls you towards [H]!")) + L.throw_at(get_step_towards(H,L), 8, 2) + . = TRUE + +/obj/item/projectile/tentacle/on_impact(var/atom/A) + if(isturf(A)) + qdel(source) + +/obj/item/projectile/tentacle/Destroy() + qdel(chain) + source = null + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/changeling/implements/powers/body.dm b/code/game/gamemodes/changeling/implements/powers/body.dm index db673a2ff9e..079845ddb14 100644 --- a/code/game/gamemodes/changeling/implements/powers/body.dm +++ b/code/game/gamemodes/changeling/implements/powers/body.dm @@ -372,6 +372,43 @@ if(src && src.mind && src.mind.changeling) src.mind.changeling.mimicing = "" +/mob/proc/combat_tentacle() + set category = "Changeling" + set name = "Form Tentacle (20)" + set desc = "Rupture the flesh and mend the bone of your hand into a multi-purpose tentacle." + + var/datum/changeling/changeling = changeling_power(20, 0, 0) + if(!changeling) + return FALSE + mind.changeling.chem_charges -= 20 + + var/mob/living/carbon/M = src + + if(M.l_hand && M.r_hand) + to_chat(M, SPAN_WARNING("Your hands are full.")) + return + + if(M.handcuffed) + var/cuffs = M.handcuffed + M.u_equip(M.handcuffed) + qdel(cuffs) + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) + src.visible_message("[H] tears through the [H.wear_suit] with their spindly arm tentacle!", + "We tear through the [H.wear_suit] with our arm tentacle!", + "You hear cloth ripping and tearing!") + QDEL_IN(H.wear_suit, 0) + H.unEquip(H.wear_suit, force = TRUE) + + var/obj/item/gun/energy/tentacle/T = new(M) + M.put_in_hands(T) + playsound(loc, 'sound/effects/splat.ogg', 30, 1) + src.visible_message("A spindly tentacle forms around [M]\'s arm!", + "Our arm twists and mutates, transforming it into a tentacle.", + "You hear organic matter ripping and tearing!") + /mob/proc/armblades() set category = "Changeling" set name = "Form Blades (20)" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 1aba1476965..bc1166c99a8 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -559,14 +559,11 @@ emp_act user.do_attack_animation(src) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(user.gloves && istype(user.gloves,/obj/item/clothing/gloves/force/syndicate)) //only antag gloves can do this for now - G.state = GRAB_AGGRESSIVE - G.icon_state = "grabbed1" - G.hud.icon_state = "reinforce1" - G.last_action = world.time + G.set_state(GRAB_AGGRESSIVE) visible_message("[user] gets a strong grip on [src]!") - return 1 + return G visible_message("[user] has grabbed [src] passively!") - return 1 + return G /mob/living/carbon/human/set_on_fire() ..() diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 91a35c3e72b..d621de1c5df 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -88,6 +88,45 @@ return affecting return null +/obj/item/grab/proc/set_state(var/set_state) + last_action = world.time + switch(set_state) + if(GRAB_PASSIVE) + state = initial(state) + icon_state = initial(icon_state) + if(hud) + hud.icon_state = initial(hud.icon_state) + if(GRAB_AGGRESSIVE) + state = GRAB_AGGRESSIVE + icon_state = "grabbed1" + hud.icon_state = "reinforce1" + if(GRAB_NECK) + state = GRAB_NECK + icon_state = "grabbed+1" + if(hud) + hud.icon_state = "kill" + hud.name = "kill" + if(affecting) + affecting.Stun(10) + if(assailant) + assailant.visible_message(SPAN_WARNING("[assailant] reinforces [assailant.get_pronoun("his")] grip on [affecting]'s neck!"), SPAN_WARNING("You reinforce your grip on [affecting]'s neck!")) + if(GRAB_KILL) + state = GRAB_KILL + icon_state = "grabbed+1" + if(hud) + hud.icon_state = "kill1" + hud.name = "loosen" + if(affecting) + affecting.setClickCooldown(10) + if(ishuman(affecting)) + var/mob/living/carbon/human/A = affecting + if (!(A.species.flags & NO_BREATHE)) + A.losebreath += 4 + affecting.set_dir(WEST) + if(assailant) + assailant.visible_message(SPAN_DANGER("[assailant] starts strangling [affecting]!"), SPAN_DANGER("You start strangling [affecting]!")) + else + crash_with("Grab set to illegal state with set_state: [set_state]") //This makes sure that the grab screen object is displayed in the correct hand. /obj/item/grab/proc/synch() @@ -275,49 +314,32 @@ assailant.visible_message(SPAN_WARNING("[assailant] pins [affecting] down to the ground by the hands!"), SPAN_WARNING("You pin [affecting] down to the ground by the hands!")) apply_pinning(affecting, assailant) - state = GRAB_AGGRESSIVE - icon_state = "grabbed1" - hud.icon_state = "reinforce1" + set_state(GRAB_AGGRESSIVE) else if(state < GRAB_NECK) if(isslime(affecting)) assailant.visible_message(SPAN_WARNING("[assailant] tries to squeeze [affecting], but [assailant.get_pronoun("his")] hands sink right through!"), SPAN_WARNING("You try to squeeze [affecting], but your hands sink right through!")) return playsound(loc, /decl/sound_category/grab_sound, 50, FALSE, -1) - assailant.visible_message(SPAN_WARNING("[assailant] reinforces [assailant.get_pronoun("his")] grip on [affecting]'s neck!"), SPAN_WARNING("You reinforce your grip on [affecting]'s neck!")) - state = GRAB_NECK - icon_state = "grabbed+1" + set_state(GRAB_NECK) affecting.attack_log += "\[[time_stamp()]\] Has had their neck grabbed by [assailant.name] ([assailant.ckey])" assailant.attack_log += "\[[time_stamp()]\] Grabbed the neck of [affecting.name] ([affecting.ckey])" msg_admin_attack("[key_name_admin(assailant)] grabbed the neck of [key_name_admin(affecting)]",ckey=key_name(assailant),ckey_target=key_name(affecting)) - hud.icon_state = "kill" - hud.name = "kill" - affecting.Stun(10) //10 ticks of ensured grab else if(state < GRAB_UPGRADING) if(ishuman(affecting)) var/mob/living/carbon/human/H = affecting if(H.head && (H.head.item_flags & AIRTIGHT)) assailant.visible_message(SPAN_WARNING("[affecting]'s headgear prevents [assailant] from choking them out!"), SPAN_WARNING("[affecting]'s headgear prevents you from choking them out!")) return - hud.icon_state = "kill1" - hud.name = "loosen" - state = GRAB_KILL + set_state(GRAB_KILL) playsound(loc, /decl/sound_category/grab_sound, 50, FALSE, -1) - assailant.visible_message(SPAN_DANGER("[assailant] starts strangling [affecting]!"), SPAN_DANGER("You start strangling [affecting]!")) affecting.attack_log += "\[[time_stamp()]\] is being strangled by [assailant.name] ([assailant.ckey])" assailant.attack_log += "\[[time_stamp()]\] is strangling [affecting.name] ([affecting.ckey])" msg_admin_attack("[key_name_admin(assailant)] is strangling [key_name_admin(affecting)]",ckey=key_name(assailant),ckey_target=key_name(affecting)) - - affecting.setClickCooldown(10) - if(ishuman(affecting)) - var/mob/living/carbon/human/A = affecting - if (!(A.species.flags & NO_BREATHE)) - A.losebreath += 4 - affecting.set_dir(WEST) else if(state == GRAB_KILL) hud.icon_state = "kill" hud.name = "kill" - state = GRAB_NECK + state = GRAB_NECK // this one doesn't get a set state because it's unique assailant.visible_message(SPAN_WARNING("[assailant] stops strangling [affecting]!"), SPAN_WARNING("You stop strangling [affecting]!")) adjust_position() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ddb416ed2b8..71c6024ab42 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -488,7 +488,7 @@ damage_mult = 1.5 P.damage *= damage_mult //you can't miss at point blank.. - P.can_miss = 1 + P.cant_miss = TRUE /obj/item/gun/proc/process_accuracy(obj/projectile, mob/user, atom/target, acc_mod, dispersion) var/obj/item/projectile/P = projectile @@ -543,7 +543,7 @@ mouthshoot = TRUE M.visible_message(SPAN_WARNING("\The [user] sticks their gun in their mouth, ready to pull the trigger...")) if(!do_after(user, 40)) - M.visible_message(SPAN_NOTICE("\The [user] decided life was worth living")) + M.visible_message(SPAN_NOTICE("\The [user] decided life was worth living.")) mouthshoot = FALSE return var/obj/item/projectile/in_chamber = consume_next_projectile() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d1d97c7ad0a..43950046f3f 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -15,6 +15,7 @@ var/def_zone = "" //Aiming at var/hit_zone // The place that actually got hit var/mob/firer = null//Who shot it + var/no_attack_message var/silenced = FALSE //Attack message var/shot_from = "" // name of the object which shot us @@ -23,7 +24,7 @@ var/dispersion = 0.0 //used for shooting at blank range, you shouldn't be able to miss - var/can_miss = 0 + var/cant_miss = FALSE var/taser_effect = 0 //If set then the projectile will apply it's agony damage using stun_effect_act() to mobs it hits, and other damage will be ignored @@ -190,8 +191,8 @@ return TRUE result = target_mob.bullet_act(src, def_zone) - if(result == PROJECTILE_FORCE_MISS && (can_miss == 0)) //if you're shooting at point blank you can't miss. - if(!silenced) + if(result == PROJECTILE_FORCE_MISS && !cant_miss) //if you're shooting at point blank you can't miss. + if(!silenced && !no_attack_message) target_mob.visible_message("\The [src] misses [target_mob] narrowly!") playsound(target_mob, /decl/sound_category/bulletflyby_sound, 50, 1) return FALSE @@ -204,10 +205,11 @@ var/mob/living/simple_animal/SA = target_mob impacted_organ = pick(SA.organ_names) //hit messages - if(silenced) - to_chat(target_mob, "You've been hit in the [impacted_organ] by \a [src]!") - else - target_mob.visible_message("\The [target_mob] is hit by \a [src] in the [impacted_organ]!", "You are hit by \a [src] in the [impacted_organ]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter + if(!no_attack_message) + if(silenced) + to_chat(target_mob, "You've been hit in the [impacted_organ] by \a [src]!") + else + target_mob.visible_message("\The [target_mob] is hit by \a [src] in the [impacted_organ]!", "You are hit by \a [src] in the [impacted_organ]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter var/no_clients = FALSE //admin logs diff --git a/html/changelogs/geeves-combat_tentacle.yml b/html/changelogs/geeves-combat_tentacle.yml new file mode 100644 index 00000000000..6107229e0a3 --- /dev/null +++ b/html/changelogs/geeves-combat_tentacle.yml @@ -0,0 +1,6 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Ported Combat Tentacles for Changelings from Paradise station. You can use them to pull items or people towards you." \ No newline at end of file diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 3ab304ae67e685f9b2fdec3439ff6a8096cd9fe7..62256be2943b4a5fca0278ebdb677e808e7b9da4 100644 GIT binary patch literal 8498 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
Sf(Jcn7z=JA_EWQkNRH#uNn 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 literal 0 HcmV?d00001 From 53f6d2f589a03c11b93c8af92b5f65ca00577069 Mon Sep 17 00:00:00 2001 From: Gerrit Grobler Date: Fri, 11 Dec 2020 21:43:53 +0200 Subject: [PATCH 2/2] converts other state = state to set_state --- code/game/gamemodes/vampire/vampire_powers.dm | 3 +-- code/modules/martial_arts/sleeping_carp.dm | 2 +- code/modules/martial_arts/unathi.dm | 2 +- code/modules/martial_arts/vaurca.dm | 2 +- code/modules/martial_arts/wrestling.dm | 2 +- code/modules/martial_arts/zombie.dm | 2 +- code/modules/mob/living/carbon/human/human_attackhand.dm | 5 +---- code/modules/mob/living/carbon/human/human_powers.dm | 3 +-- 8 files changed, 8 insertions(+), 13 deletions(-) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 58bc2c26f63..eaadb7b65f4 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -1011,8 +1011,7 @@ else r_hand = G - G.state = GRAB_AGGRESSIVE - G.icon_state = "grabbed1" + G.set_state(GRAB_AGGRESSIVE) G.synch() verbs -= /mob/living/carbon/human/proc/grapple diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm index 98c6f9da2fd..bf6c4e5bd7d 100644 --- a/code/modules/martial_arts/sleeping_carp.dm +++ b/code/modules/martial_arts/sleeping_carp.dm @@ -102,7 +102,7 @@ D.grabbedby(A,1) var/obj/item/grab/G = A.get_active_hand() if(G) - G.state = GRAB_AGGRESSIVE //Instant aggressive grab + G.set_state(GRAB_AGGRESSIVE) //Instant aggressive grab /datum/martial_art/the_sleeping_carp/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) add_to_streak("D",D) diff --git a/code/modules/martial_arts/unathi.dm b/code/modules/martial_arts/unathi.dm index 24bbfbc1b47..a4b5d0c7a91 100644 --- a/code/modules/martial_arts/unathi.dm +++ b/code/modules/martial_arts/unathi.dm @@ -30,7 +30,7 @@ D.grabbedby(A,1) var/obj/item/grab/G = A.get_active_hand() if(G && prob(50)) - G.state = GRAB_AGGRESSIVE + G.set_state(GRAB_AGGRESSIVE) D.visible_message("[A] gets a strong grip on [D]!") return 1 diff --git a/code/modules/martial_arts/vaurca.dm b/code/modules/martial_arts/vaurca.dm index 238a7787d38..d92301fdb50 100644 --- a/code/modules/martial_arts/vaurca.dm +++ b/code/modules/martial_arts/vaurca.dm @@ -59,7 +59,7 @@ if(istype(A.get_active_hand(),/obj/item/grab)) var/obj/item/grab/G = A.get_active_hand() if(G && G.affecting == D) - G.state = GRAB_AGGRESSIVE + G.set_state(GRAB_AGGRESSIVE) D.visible_message(SPAN_DANGER("[A] gets a strong grip on [D]!")) if(isvaurca(A)) A.bugbite(TRUE) diff --git a/code/modules/martial_arts/wrestling.dm b/code/modules/martial_arts/wrestling.dm index 2aa041e6dee..d614e0bf746 100644 --- a/code/modules/martial_arts/wrestling.dm +++ b/code/modules/martial_arts/wrestling.dm @@ -11,7 +11,7 @@ D.grabbedby(A,1) var/obj/item/grab/G = A.get_active_hand() if(G && prob(50)) - G.state = GRAB_AGGRESSIVE + G.set_state(GRAB_AGGRESSIVE) D.visible_message("[A] has [D] in a clinch!") else D.visible_message("[A] fails to get [D] in a clinch!") diff --git a/code/modules/martial_arts/zombie.dm b/code/modules/martial_arts/zombie.dm index f0770469f3c..484e594be8a 100644 --- a/code/modules/martial_arts/zombie.dm +++ b/code/modules/martial_arts/zombie.dm @@ -26,7 +26,7 @@ /datum/martial_art/zombie/proc/check_grab(var/mob/living/carbon/human/A) var/obj/item/grab/G = A.get_active_hand() if(G) - G.state = GRAB_AGGRESSIVE + G.set_state(GRAB_AGGRESSIVE) G.icon_state = "grabbed1" G.hud.icon_state = "reinforce1" diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 4fac2a1d9f5..bd156f9e5e9 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -194,10 +194,7 @@ H.do_attack_animation(src) playsound(loc, /decl/sound_category/grab_sound, 50, FALSE, -1) if(H.gloves && istype(H.gloves,/obj/item/clothing/gloves/force/syndicate)) //only antag gloves can do this for now - G.state = GRAB_AGGRESSIVE - G.icon_state = "grabbed1" - G.hud.icon_state = "reinforce1" - G.last_action = world.time + G.set_state(GRAB_AGGRESSIVE) visible_message("[M] gets a strong grip on [src]!") return 1 visible_message("[M] has grabbed [src] passively!") diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 77a420d8db8..df90801616e 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -170,8 +170,7 @@ mob/living/carbon/human/proc/change_monitor() else r_hand = G - G.state = GRAB_PASSIVE - G.icon_state = "grabbed1" + G.set_state(GRAB_AGGRESSIVE) G.synch() return TRUE