Files
Paradise/code/game/atom/atom_tool_acts.dm
PollardTheDragon cd7cb01a1f Meet the Smith - New Supply Role (#28273)
* Smith role, access, access helpers, spawn point, comms, and IDs

* Area defines

* Hammertime

* Cyberiad Smith's office

* Forgot some atmos stuff

* Autolathable Hammers

* Formatting

* Toolbelts can hold hammers

* Initial work on smith machines

* Farragus Smith Office

* Placeholder sprites, mapping

* Smart hopper points and console messages

* More work on smithing machines

* Fixed mapping, added qualities, added smithed items, fixed sizing, fixed access

* Smith components, new materials

* New ores, material datums, furnace, power hammer, kinetic assembler, hammer act, item creation

* Missed one

* Grrr map conflicts begone

* Dirt begone

* Casts and smelting

* Linters

* Attack chain linters!

* Better grip to throw people into your industrial machines

* Placeholder spots in the DMIs

* UpdatePaths - Space ruins now spawn new space ores in their rocks

* Small changes - removed excess tgui code from hopper

* Fixed a button on emerald

* Attaching inserts and lenses. Tool bits are pain.

* Tool bit initial implementation

* Merge conflict resolution

* Attack chain grrr

* Fixed a pair of minor mapping issues

* Tool bit implementation, efficiency, failure rate

* Hot things burn hands

* Points fix on hopper

* New mining rocks for space exploration

* Areas on asteroids

* Machinery icons 1

Adds basic icons for the new machinery

* Vendor iconstate update

* Crucible touchups

* Hammer touchups

* Crucible Input Animation

Adds an animation when you deposit ores

* Added scanning the crucible with multitool to get mineral count

* clothing sprites part 1

* locker sprite

* job icons

* garment bag

* Smith locker mapping

* Insert and Bit removal fix

* Job menu alignment fix, Allowed_items and small spriting path fixes

* Adds new asteroid ruins to config

* Ore Sprites

* Hammer Sprite

* Item Sprites 1

* Sheets, Wall Ores and Trim

* Sheet iconstate names

* species uniforms

* Tabs

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Lens spelling fix

* Signalizes attaching and detaching modifications, fixes inserting items into smith machines, fixes cast bugs

* Fixed type lists

* Smithing machine bug fixes.

* Fixed adding modifications to items

* Crucible Lava Idle

Adds an idle animation for the crucible, but it needs overlay code to work.

* Fixed eguns

* Magma Crucible overlays and animations

* Machine broken/Off states

Adds broken, wires exposed (and on/off where appropriate) states to machines.

* Castivend recolor and Hot Items

* Overlays for all machines, new sprites for hot items, new checks, fixes

* Woe, farragus merge conflict

* update_appearance linters

* I have fat fingers.

* Forgot one

* transfer_item_to and qdel null check

* Usr to User

* Modsuits should not have inserts.

* Adds casting lip overlay

* Balance pass on movement debuffs and buffs

* Material movespeed changes

* Config Adjustments - USED FOR TESTMERGING. REVERT BEFORE FULL MERGE

* Math fixes for lenses and bits.

* Mobility suit no longer speeds you up, but negates suit-based slowdown like an oil slick potion. Fixed movement mods in material datums

* Bad var. Bad.

* Various fixes to bugs revealed in initial TM

* TYPO

* Lavaland base turf fix

* Paths in examine fix

* Adds an intercom to the workshop.

* Stamina-hybrid damage oversight fix for det revolver, uion, etc.

* Currently Operating Message fix

* Allows glass to show different turfs beneath. Adds plasmaglass section to workshop.

* Armor and upgrade fixes

* RCD tool bit equip fix

* Adds smith access to a few lists in access.dm that were missed in an oversight

* Indent fixes

* Fixes vending machine, allows tool bit use on mining equipment

* CI, you make me mad sometimes

* Removed duplicate code

* Name fix for CI again

* ORM now can handle space ores

* Adds space ores to Vetus drop and to trader inventories

* Fixes runtime with open hand attacking a lava furnace with nothing in it

* Adds crewvend kit to Castivend

* Fixes not being able to see new ores

* Adds drill and RCS to smith locker

* Map changes. Added cargo pad. Expanded catwalk. Moved vendors. Added recharger.

* Plant fixes

* Fixes doubled-up catwalk

* Emerald cargo windoor fix, small lavaland adjustment

* Small oversight for overlay fix

* Missing lightswitches

* Fixed stock parts mismatch in casting basin recipe

* Better support for power tools, grrr attackchain

* Better attack chain handling. Better handling for bit insertion

* Fixes handling of inserts with storage suits (like labcoats)

* sprites for bomber + plasmeme outfit

* Adds missing adjacency checks

* Buffs speed boost from upgrade - max upgrade reduces cycle to 2 seconds.

* Fixed floating lights, brightened the explorer's new room, expanded smith workshop slightly.

* Small hallway adjustment

* Illuminates metastation smith office

* Removes excessive decimals in magma crucible scan output

* Berserker should not have inserts.

* Buffs bit durability significantly, nerfs amplifier lens and densifier lense slightly

* Adds smith bomber jacket to loadout panel

* Adds random spawners for smithed items, adds random low-quality items to maints loot

* Adds traitor version of bulldog shotgun

* Revert "Adds traitor version of bulldog shotgun"

This reverts commit 1d39c59f07.

* Added check to assembler, moved desc changes to examine()

* plasmaman suit fix

* Fixed hot check when removing items from hammer and furnace

* Remaps lavaland workshop, fixed deltastation light switch

* Improper's the smith office name

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Compacts extra ore drops from Vetus

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* better looping

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Better loop

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Multitools don't need tool bits.

* Better variable names, fixed missing parenthesis

* Recursive hammering, removed attack animations when inserting items or using multitool on smithing machines

* window

* Update deltastation.dmm

* Update deltastation.dmm

* Update deltastation.dmm

* Fixes small oversights

* Minor lavaland remap

* Reverts TM-required changes in preparation for full merge

* Begone, stray font!

* Damn you cable CI

---------

Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Co-authored-by: ExusA <67055922+ExusA@users.noreply.github.com>
Co-authored-by: Christasmurf <25437893+Christasmurf@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Co-authored-by: Fordoxia <143041327+Fordoxia@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
2025-03-15 21:35:21 +00:00

169 lines
5.6 KiB
Plaintext

/**
* ## Item interaction
*
* Handles non-combat iteractions of a tool on this atom,
* such as using a tool on a wall to deconstruct it,
* or scanning someone with a health analyzer
*/
/atom/proc/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
SHOULD_CALL_PARENT(TRUE)
PROTECTED_PROC(TRUE)
// We do not have a combat mode or secondary actions like /tg/, so instead
// I'm unilaterally deciding it here: If you are not on harm intent, tool
// interactions are not attacks. Shit like the autolathe accepting
// screwdrivers on harm intent is unintuitive and needs to go away, and there
// are dozens of ${TOOL}_act procs that do constant harm intent checks.
var/tool_return = tool_act(user, tool, modifiers)
if(tool_return)
return tool_return
var/early_sig_return = NONE
/*
* This is intentionally using `||` instead of `|` to short-circuit the signal calls
* This is because we want to return early if ANY of these signals return a value
*
* This puts priority on the atom's signals, then the tool's signals, then the user's signals
*/
early_sig_return = SEND_SIGNAL(src, COMSIG_INTERACT_TARGET, user, tool, modifiers) \
|| SEND_SIGNAL(tool, COMSIG_INTERACTING, user, src, modifiers) \
|| SEND_SIGNAL(user, COMSIG_INTERACT_USER, src, tool, modifiers)
if(early_sig_return)
return early_sig_return
if(new_attack_chain)
var/self_interaction = item_interaction(user, tool, modifiers)
if(self_interaction)
return self_interaction
if(tool.new_attack_chain)
var/interact_return = tool.interact_with_atom(src, user, modifiers)
if(interact_return)
return interact_return
return NONE
/**
*
* ## Tool Act
*
* Handles using specific tools on this atom directly.
*
* Handles the tool_acts in particular, such as wrenches and screwdrivers.
*
* This can be overriden to handle unique "tool interactions"
* IE using an item like a tool (when it's not actually one)
* but otherwise does nothing that [item_interaction] doesn't already do.
*
* In other words, use sparingly. It's harder to use (correctly) than [item_interaction].
*/
/atom/proc/tool_act(mob/living/user, obj/item/tool, list/modifiers)
SHOULD_CALL_PARENT(TRUE)
PROTECTED_PROC(TRUE)
if(SEND_SIGNAL(src, COMSIG_TOOL_ATTACK, tool, user) & COMPONENT_CANCEL_TOOLACT)
return FALSE
var/tool_type = tool.tool_behaviour
if(!tool_type)
return NONE
var/act_result = NONE // or FALSE, or null, as some things may return
switch(tool_type)
if(TOOL_CROWBAR)
act_result = crowbar_act(user, tool)
if(TOOL_MULTITOOL)
act_result = multitool_act(user, tool)
if(TOOL_SCREWDRIVER)
act_result = screwdriver_act(user, tool)
if(TOOL_WRENCH)
act_result = wrench_act(user, tool)
if(TOOL_WIRECUTTER)
act_result = wirecutter_act(user, tool)
if(TOOL_WELDER)
act_result = welder_act(user, tool)
if(TOOL_HAMMER)
act_result = hammer_act(user, tool)
if(!act_result)
return NONE
return act_result
/**
* Called when this atom has an item used on it.
* IE, a mob is clicking on this atom with an item.
*
* Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
* Return NONE to allow default interaction / tool handling.
*/
/atom/proc/item_interaction(mob/living/user, obj/item/used, list/modifiers)
return NONE
/**
* Called when this item is being used to interact with an atom,
* IE, a mob is clicking on an atom with this item.
*
* Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
* Return NONE to allow default interaction / tool handling.
*/
/obj/item/proc/interact_with_atom(atom/target, mob/living/user, list/modifiers)
return NONE
/**
* ## Ranged item interaction
*
* Handles non-combat ranged interactions of a tool on this atom,
* such as shooting a gun in the direction of someone*,
* having a scanner you can point at someone to scan them at any distance,
* or pointing a laser pointer at something.
*
* *While this intuitively sounds combat related, it is not,
* because a "combat use" of a gun is gun-butting.
*/
/atom/proc/base_ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
SHOULD_CALL_PARENT(TRUE)
PROTECTED_PROC(TRUE)
// See [base_item_interaction] for defails on why this is using `||` (TL;DR it's short circuiting)
var/early_sig_return = SEND_SIGNAL(src, COMSIG_INTERACT_RANGED, user, tool, modifiers) \
|| SEND_SIGNAL(tool, COMSIG_INTERACTING_RANGED, user, src, modifiers)
if(early_sig_return)
return early_sig_return
var/self_interaction = ranged_item_interaction(user, tool, modifiers)
if(self_interaction)
return self_interaction
var/interact_return = tool.ranged_interact_with_atom(src, user, modifiers)
if(interact_return)
return interact_return
return NONE
/**
* Called when this atom has an item used on it from a distance.
* IE, a mob is clicking on this atom with an item and is not adjacent.
*
* Does NOT include Telekinesis users, they are considered adjacent generally.
*
* Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
*/
/atom/proc/ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
return NONE
/**
* Called when this item is being used to interact with an atom from a distance,
* IE, a mob is clicking on an atom with this item and is not adjacent.
*
* Does NOT include Telekinesis users, they are considered adjacent generally
* (so long as this item is adjacent to the atom).
*
* Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
*/
/obj/item/proc/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers)
return NONE