mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-20 06:26:46 +01:00
- all cells in the game are now small, medium, large - super, hyper capacity cells, device, and weapon cells are all removed - cells now have standardized variants, some of which are printable by R&D - energy weapons rebalanced - **advanced energy guns and stun revolvers removed** - use the new modular weapon system and microfission cells. --------- Co-authored-by: silicons <silicons@silicons.dev>
153 lines
5.3 KiB
Plaintext
153 lines
5.3 KiB
Plaintext
//* This file is explicitly licensed under the MIT license. *//
|
|
//* Copyright (c) 2024 Citadel Station Developers *//
|
|
|
|
GLOBAL_LIST_EMPTY(cached_shieldcall_datums)
|
|
|
|
/**
|
|
* return a globally cached shieldcall
|
|
* mostly for hardcoded ones that always work a certain way regardless of what it's actually representing
|
|
*/
|
|
/proc/fetch_cached_shieldcall(path)
|
|
if(GLOB.cached_shieldcall_datums[path])
|
|
return GLOB.cached_shieldcall_datums[path]
|
|
GLOB.cached_shieldcall_datums[path] = new path
|
|
return GLOB.cached_shieldcall_datums[path]
|
|
|
|
/**
|
|
* Shieldcall handling datums
|
|
*
|
|
* These are semi-expensive datums that act as hooks
|
|
* to intercept arbitrary attacks at the /atom level.
|
|
*
|
|
* Please be careful with their usage.
|
|
* They hook most attacks, and as such are pretty expensive to have on an atom, compute-wise.
|
|
* This is pretty much only efficient for single-target; if it's possible, any suppression hook for attacks
|
|
* is better than using this on a large number of targets.
|
|
*/
|
|
/datum/shieldcall
|
|
/// priority ; should never change once we're registered on something. lower has higher priority.
|
|
var/priority = 0
|
|
/// goes to mob when in inventory - whether equipped to slot or in hand
|
|
/// do not modify while applied. it will not un/register properly.
|
|
///
|
|
/// * Turn this off if you're doing your own handling.
|
|
var/shields_in_inventory = TRUE
|
|
/// Allow interception of `atom_shieldcall`.
|
|
///
|
|
/// * "Yes, I read and understand the terms and conditions"
|
|
/// * "Yes, I will handle SHIELDCALL_FLAG_SECOND_CALL to prevent a double-block scenario"
|
|
/// * "Yes, I understand that atom_shieldcall is low level and is called in addition to other shieldcall handling procs"
|
|
var/low_level_intercept = FALSE
|
|
|
|
/**
|
|
* sent over from the atom
|
|
*
|
|
* @params
|
|
* * defending - the atom in question
|
|
* * shieldcall_args - indexed list of shieldcall args.
|
|
* * fake_attack - just checking!
|
|
*
|
|
* @return nothing, because you should be modifying the return flags via shieldcall_args list!
|
|
*/
|
|
/datum/shieldcall/proc/handle_shieldcall(atom/defending, list/shieldcall_args, fake_attack)
|
|
return
|
|
|
|
//* Melee Handling *//
|
|
|
|
/**
|
|
* sent over from the atom
|
|
*
|
|
* * this is generic pre-intercept for melee; please keep this cheap
|
|
* * for stuff like reactive teleport armor, use this because it will stop the hit entirely.
|
|
* * for damage modification, inject directly into e_args
|
|
*
|
|
* @params
|
|
* * defending - the atom being attacked
|
|
* * shieldcall_returns - existing returns from other shieldcalls
|
|
* * fake_attack - just checking!
|
|
* * clickchain (optional) the clickchain event, if any; **This is mutable.**
|
|
* * clickchain_flags (optional) the clickchain flags being used
|
|
* * weapon - (optional) the item being used to swing with
|
|
* * style - the melee_attack/weapon datum being used
|
|
*
|
|
* @return SHIELDCALL_FLAG_* flags
|
|
*/
|
|
/datum/shieldcall/proc/handle_melee(atom/defending, shieldcall_returns, fake_attack, datum/event_args/actor/clickchain/clickchain, clickchain_flags, obj/item/weapon, datum/melee_attack/weapon/style)
|
|
return NONE
|
|
|
|
//* Interaction Handling *//
|
|
|
|
/**
|
|
* sent over from the atom
|
|
*
|
|
* * for generic 'tried to touch' things
|
|
* * this is really funny because it lets us do things like teleport the RD on a hug
|
|
*
|
|
* @params
|
|
* * defending - the atom in question
|
|
* * shieldcall_returns - existing returns from other shieldcalls
|
|
* * fake_attack - just checking!
|
|
* * clickchain (optional) the clickchain event, if any; **This is mutable.**
|
|
* * clickchain_flags (optional) the clickchain flags being used
|
|
* * contact_flags - SHIELDCALL_CONTACT_FLAG_*
|
|
* * contact_specific - SHIELDCALL_CONTACT_SPECIFIC_*
|
|
*
|
|
* @return SHIELDCALL_FLAG_* flags
|
|
*/
|
|
/datum/shieldcall/proc/handle_touch(atom/defending, shieldcall_returns, fake_attack, datum/event_args/actor/clickchain/clickchain, clickchain_flags, contact_flags, contact_specific)
|
|
return NONE
|
|
|
|
//* Projectile Handling *//
|
|
|
|
/**
|
|
* sent over from the atom
|
|
*
|
|
* * this is pre-intercept for projectiles; please keep this cheap.
|
|
* * for stuff like reactive teleport armor, use this because it will stop the hit entirely.
|
|
* * passed in bullet act args is mutable.
|
|
* * we DO NOT process SHIELDCALL_FLAG flags other than _TERMINATE, because we have direct access to impact_flags of the bullet!
|
|
*
|
|
* @params
|
|
* * defending - the atom in question
|
|
* * shieldcall_returns - existing returns from other shieldcalls
|
|
* * fake_attack - just checking!
|
|
* * bullet_act_args - indexed list of bullet_act args.
|
|
*
|
|
* @return SHIELDCALL_FLAG_TERMINATE or NONE
|
|
*/
|
|
/datum/shieldcall/proc/handle_bullet(atom/defending, shieldcall_returns, fake_attack, list/bullet_act_args)
|
|
return NONE
|
|
|
|
//* Throw Handling *//
|
|
|
|
/**
|
|
* sent over from the atom
|
|
*
|
|
* * this is pre-intercept for throwns
|
|
* * for stuff like reactive teleport armor, use this because it will stop the hit entirely
|
|
*
|
|
* @params
|
|
* * defending - the thing being hit
|
|
* * shieldcall_returns - existing returns from other shieldcalls
|
|
* * fake_attack - just checking!
|
|
* * thrown - the thrown object's data
|
|
*
|
|
* @return SHIELDCALL_FLAG_* flags
|
|
*/
|
|
/datum/shieldcall/proc/handle_throw_impact(atom/defending, shieldcall_returns, fake_attack, datum/thrownthing/thrown)
|
|
return
|
|
|
|
//* Bound Variant *//
|
|
|
|
/datum/shieldcall/bound
|
|
var/expected_type
|
|
var/datum/bound
|
|
|
|
/datum/shieldcall/bound/New(datum/binding)
|
|
ASSERT(expected_type && istype(binding, expected_type))
|
|
src.bound = binding
|
|
|
|
/datum/shieldcall/bound/Destroy()
|
|
src.bound = null
|
|
return ..()
|