Files
Bubberstation/code/datums/components/basic_inhands.dm
Jacquerel 504e6acfa3 Basic Mob Gorillas (#78918)
## About The Pull Request

Now we can make basic mobs with hands easily so I did, they don't
actually use their hands for anything with AI.
In the future we can come back and share the monkey AI where they pick
up items to hit people with, but frankly few weapons are more deadly
than a gorilla's fists.

IIRC I didn't really change their behaviour much, this is mostly just a
straight conversion. Main difference is that they will prioritise eating
nearby bananas and fruit salads over punching people.

When I make these conversions nowadays I need to decide between "does
this attack at the speed that it did as an NPC mob or the speed it did
as a player?"
I am arbitrarily deciding that gorillas are usually not players and
electing for the former, but tell me if you disagree.

I also made "show basic inhand sprites" into a component shared by
Gorillas, Drones, and Dextrous Guardians (all also now available to
become basic, once I get around to it),

And I added an AI behaviour to run a basic emote. This is similar but
different to "random speech", which kind of sucks and needs rewriting
anyway.
Gorillas don't speak, only ooga.

## Why It's Good For The Game

https://www.youtube.com/watch?v=npuuTBlEb1U

## Changelog

🆑
refactor: Gorillas now use the basic mob framework. Please report any
unusual side effects.
/🆑
2023-10-11 16:58:29 -06:00

51 lines
1.9 KiB
Plaintext

/**
* Basic handling for showing held items in a mob's hands
*/
/datum/component/basic_inhands
/// Layer index we show our inhands upon
var/display_layer
/// Y offset to apply to inhands
var/y_offset
/// X offset to apply to inhands, is inverted for the left hand
var/x_offset
/// What overlays are we currently showing?
var/list/cached_overlays
/datum/component/basic_inhands/Initialize(display_layer = 1, y_offset = 0, x_offset = 0)
. = ..()
if (!isliving(parent))
return COMPONENT_INCOMPATIBLE
src.display_layer = display_layer
src.y_offset = y_offset
src.x_offset = x_offset
cached_overlays = list()
/datum/component/basic_inhands/RegisterWithParent()
. = ..()
RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_updated_overlays))
RegisterSignal(parent, COMSIG_MOB_UPDATE_HELD_ITEMS, PROC_REF(on_updated_held_items))
/datum/component/basic_inhands/UnregisterFromParent()
. = ..()
UnregisterSignal(parent, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_MOB_UPDATE_HELD_ITEMS))
/// When your overlays update, add your held overlays
/datum/component/basic_inhands/proc/on_updated_overlays(atom/parent_atom, list/overlays)
SIGNAL_HANDLER
overlays += cached_overlays
/// When your number of held items changes, regenerate held icons
/datum/component/basic_inhands/proc/on_updated_held_items(mob/living/holding_mob)
SIGNAL_HANDLER
var/list/held_overlays = list()
for(var/obj/item/held in holding_mob.held_items)
var/is_right = holding_mob.get_held_index_of_item(held) % 2 == 0
var/icon_file = is_right ? held.righthand_file : held.lefthand_file
var/mutable_appearance/held_overlay = held.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE)
held_overlay.pixel_y += y_offset
held_overlay.pixel_x += x_offset * (is_right ? 1 : -1)
held_overlays += held_overlay
cached_overlays = held_overlays
holding_mob.update_appearance(UPDATE_OVERLAYS)