Ports TG attack animations. (#22319)

https://github.com/user-attachments/assets/0af58b65-552e-48c2-ab97-56ebf0794127

To-do:

- [x] Simple mobs
- [ ] Icon angles for most icons
- [x] Attack effects for kicking/biting/etc

---------

Co-authored-by: Matt Atlas <liermattia@gmail.com>
This commit is contained in:
Matt Atlas
2026-06-05 10:12:43 +00:00
committed by GitHub
co-authored by Matt Atlas
parent 5c74b702a8
commit f759aebad3
66 changed files with 403 additions and 150 deletions
+2 -2
View File
@@ -180,7 +180,7 @@
/obj/structure/foamedmetal/attack_hand(var/mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.do_attack_animation(src, FIST_ATTACK_ANIMATION)
user.do_attack_animation(src)
if ((user.mutations & HULK) || (prob(75 - metal * 25)))
user.visible_message(SPAN_WARNING("[user] smashes through the foamed metal."), SPAN_NOTICE("You smash through the metal foam wall."))
qdel(src)
@@ -238,7 +238,7 @@
qdel(src)
return TRUE
user.do_attack_animation(src, attacking_item)
user.do_attack_animation(src, used_item = attacking_item)
if(prob(attacking_item.force * 20 - metal * 25))
user.visible_message(SPAN_WARNING("[user] smashes through the foamed metal."), SPAN_NOTICE("You smash through the foamed metal with \the [attacking_item]."))
qdel(src)
+7
View File
@@ -207,6 +207,13 @@
/// Used to override hardcoded clothing dmis in human clothing pr
var/icon_override
/// Angle of the icon, used for piercing and slashing attack animations, clockwise from *east-facing* sprites
var/icon_angle = 0
///icon file for an alternate attack icon
var/attack_icon
///icon state for an alternate attack icon
var/attack_icon_state
var/charge_failure_message = " cannot be recharged."
var/held_maptext
@@ -200,11 +200,12 @@
/obj/item/material/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
icon_state = "fireaxe0"
base_icon = "fireaxe"
icon_angle = -180
name = "fire axe"
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
unwielded_force_divisor = 0.25
force_divisor = 0.7 // 10/42 with hardness 60 (steel) and 0.25 unwielded divisor
sharp = 1
sharp = FALSE
edge = TRUE
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
@@ -243,6 +244,7 @@
/obj/item/material/twohanded/spear
icon_state = "spearglass0"
base_icon = "spearglass"
icon_angle = -45
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
force = 15
+2 -2
View File
@@ -89,7 +89,7 @@
/obj/effect/energy_net/attack_hand(var/mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.do_attack_animation(src, FIST_ATTACK_ANIMATION)
user.do_attack_animation(src)
if(user == affecting)
to_chat(user, SPAN_WARNING("You can't claw at \the [src] while trapped inside it! You need to use a weapon."))
return
@@ -110,7 +110,7 @@
/obj/effect/energy_net/attackby(obj/item/attacking_item, mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.do_attack_animation(src, attacking_item)
user.do_attack_animation(src, used_item = attacking_item)
var/attack_force = attacking_item.force
if(user == affecting)
attack_force /= 2
+1 -1
View File
@@ -30,7 +30,7 @@
/obj/structure/gore/resin/attack_hand(var/mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.do_attack_animation(src, FIST_ATTACK_ANIMATION)
user.do_attack_animation(src)
if((user.mutations & HULK))
visible_message(SPAN_DANGER("\The [user] destroys \the [src]!"))
add_damage(maxhealth)
@@ -441,7 +441,7 @@ update_flag
if(attacking_item.item_flags & ITEM_FLAG_NO_BLUDGEON)
return TRUE
visible_message(SPAN_WARNING("\The [user] hits \the [src] with \the [attacking_item]!"), SPAN_NOTICE("You hit \the [src] with \the [attacking_item]."))
user.do_attack_animation(src, attacking_item)
user.do_attack_animation(src, used_item = attacking_item)
playsound(src, 'sound/weapons/smash.ogg', 60, 1)
add_damage(attacking_item.force)
if(!istype(attacking_item, /obj/item/forensics))
@@ -1434,7 +1434,7 @@ About the new airlock wires panel:
return
if(H.default_attack?.attack_door && !(stat & (BROKEN|NOPOWER)))
user.visible_message(SPAN_DANGER("\The [user] forcefully strikes \the [src] with their [H.default_attack.attack_name]!"))
user.do_attack_animation(src, null)
user.do_attack_animation(src, H.default_attack.attack_effect)
playsound(loc, hitsound, 60, TRUE)
add_damage(H.default_attack.attack_door)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
@@ -29,7 +29,7 @@
if(!istype(user, /mob/living/silicon))
if(user.a_intent == I_HURT)
user.visible_message(SPAN_DANGER("\The [user] strikes [src]!"))
user.do_attack_animation(user, attacking_item)
user.do_attack_animation(user, used_item = attacking_item)
playsound(loc, hitsound, 60, TRUE)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
integrity = between(0, integrity - round(attacking_item.force / 3), initial(integrity))