mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-29 18:40:42 +00:00
## About The Pull Request This is the first PR in a series attempting to modernize our damage and armor, both from a code and a gameplay perspective. This part implements unique attack animations, adds alternate attack modes for items and fixes some minor oversights. Items now have unique attack animation based on their sharpness - sharp items are now swung in an arc, while pointy items are thrust forward. This change is ***purely visual***, this is not swing combat. (However, this does assign icon rotation data to many items, which should help swing combat later down the line). Certain items like knives and swords now have secondary attacks - right clicks will perform stabbing attacks instead of slashing for a chance to leave piercing wounds, albeit with slightly lower damage - trying to stick a katana through someone won't get you very far! https://github.com/user-attachments/assets/1f92bbcd-9aa1-482f-bc26-5e84fe2a07e1 Turns out that spears acted as oversized knives this entire time, being SHARP_EDGED instead of SHARP_POINTY - in order for their animations to make sense, they're now once again pointy (according to comment, originally they were made sharp because piercing wounds weren't very threatening, which is no longer the case) Another major change is that structure damage is now influenced by armor penetration - I am not sure if this is intentional or not, but attacking item's AP never applied to non-mob damage. Additionally, also fixes an issue where attack verbs for you and everyone else may differ.
116 lines
3.6 KiB
Plaintext
116 lines
3.6 KiB
Plaintext
/// Max number of atoms a broom can sweep at once
|
|
#define BROOM_PUSH_LIMIT 20
|
|
|
|
/obj/item/pushbroom
|
|
name = "push broom"
|
|
desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage."
|
|
icon = 'icons/obj/service/janitor.dmi'
|
|
icon_state = "broom0"
|
|
base_icon_state = "broom"
|
|
icon_angle = 135
|
|
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
|
|
force = 8
|
|
throwforce = 10
|
|
throw_speed = 3
|
|
throw_range = 7
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
attack_verb_continuous = list("sweeps", "brushes off", "bludgeons", "whacks")
|
|
attack_verb_simple = list("sweep", "brush off", "bludgeon", "whack")
|
|
resistance_flags = FLAMMABLE
|
|
|
|
/obj/item/pushbroom/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/jousting, damage_boost_per_tile = 1)
|
|
AddComponent(/datum/component/two_handed, \
|
|
force_unwielded = 8, \
|
|
force_wielded = 12, \
|
|
icon_wielded = "[base_icon_state]1", \
|
|
wield_callback = CALLBACK(src, PROC_REF(on_wield)), \
|
|
unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
|
|
)
|
|
|
|
/obj/item/pushbroom/update_icon_state()
|
|
icon_state = "[base_icon_state]0"
|
|
return ..()
|
|
|
|
/**
|
|
* Handles registering the sweep proc when the broom is wielded
|
|
*
|
|
* Arguments:
|
|
* * source - The source of the on_wield proc call
|
|
* * user - The user which is wielding the broom
|
|
*/
|
|
/obj/item/pushbroom/proc/on_wield(obj/item/source, mob/user)
|
|
to_chat(user, span_notice("You brace the [src] against the ground in a firm sweeping stance."))
|
|
RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(sweep))
|
|
|
|
/**
|
|
* Handles unregistering the sweep proc when the broom is unwielded
|
|
*
|
|
* Arguments:
|
|
* * source - The source of the on_unwield proc call
|
|
* * user - The user which is unwielding the broom
|
|
*/
|
|
/obj/item/pushbroom/proc/on_unwield(obj/item/source, mob/user)
|
|
UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE)
|
|
|
|
/obj/item/pushbroom/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
|
sweep(user, interacting_with)
|
|
return NONE // I guess
|
|
|
|
/**
|
|
* Attempts to push up to BROOM_PUSH_LIMIT atoms from a given location the user's faced direction
|
|
*
|
|
* Arguments:
|
|
* * user - The user of the pushbroom
|
|
* * A - The atom which is located at the location to push atoms from
|
|
*/
|
|
/obj/item/pushbroom/proc/sweep(mob/user, atom/atom)
|
|
SIGNAL_HANDLER
|
|
|
|
do_sweep(src, user, atom, user.dir)
|
|
|
|
/**
|
|
* Sweep objects in the direction we're facing towards our direction
|
|
* Arguments
|
|
* * broomer - The object being used for brooming
|
|
* * user - The person who is brooming
|
|
* * target - The object or tile that's target of a broom click or being moved into
|
|
* * sweep_dir - The directions in which we sweep objects
|
|
*/
|
|
/proc/do_sweep(obj/broomer, mob/user, atom/target, sweep_dir)
|
|
var/turf/current_item_loc = isturf(target) ? target : target.loc
|
|
if (!isturf(current_item_loc))
|
|
return
|
|
var/turf/new_item_loc = get_step(current_item_loc, sweep_dir)
|
|
|
|
var/list/items_to_sweep = list()
|
|
var/i = 1
|
|
for (var/obj/item/garbage in current_item_loc.contents)
|
|
if(garbage.anchored)
|
|
continue
|
|
items_to_sweep += garbage
|
|
i++
|
|
if(i > BROOM_PUSH_LIMIT)
|
|
break
|
|
|
|
SEND_SIGNAL(new_item_loc, COMSIG_TURF_RECEIVE_SWEEPED_ITEMS, broomer, user, items_to_sweep)
|
|
|
|
if(!length(items_to_sweep))
|
|
return
|
|
|
|
for (var/obj/item/garbage in items_to_sweep)
|
|
garbage.Move(new_item_loc, sweep_dir)
|
|
|
|
playsound(current_item_loc, 'sound/items/weapons/thudswoosh.ogg', 30, TRUE, -1)
|
|
|
|
/obj/item/pushbroom/cyborg
|
|
name = "cyborg push broom"
|
|
|
|
/obj/item/pushbroom/cyborg/Initialize(mapload)
|
|
. = ..()
|
|
ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
|
|
|
|
#undef BROOM_PUSH_LIMIT
|