mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
@@ -1,4 +1,4 @@
|
||||
/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type.
|
||||
/// Return this from `/datum/component/Initialize` or `/datum/component/OnTransfer` or `/datum/component/on_source_add` to have the component be deleted if it's applied to an incorrect type.
|
||||
/// `parent` must not be modified if this is to be returned.
|
||||
/// This will be noted in the runtime logs
|
||||
#define COMPONENT_INCOMPATIBLE 1
|
||||
@@ -9,35 +9,56 @@
|
||||
#define ELEMENT_INCOMPATIBLE 1
|
||||
|
||||
// /datum/element flags
|
||||
/// Causes the detach proc to be called when the host object is being deleted
|
||||
#define ELEMENT_DETACH (1 << 0)
|
||||
/// Causes the detach proc to be called when the host object is being deleted.
|
||||
/// Should only be used if you need to perform cleanup not related to the host object.
|
||||
/// You do not need this if you are only unregistering signals, for instance.
|
||||
/// You would need it if you are doing something like removing the target from a processing list.
|
||||
#define ELEMENT_DETACH_ON_HOST_DESTROY (1 << 0)
|
||||
/**
|
||||
* Only elements created with the same arguments given after `id_arg_index` share an element instance
|
||||
* The arguments are the same when the text and number values are the same and all other values have the same ref
|
||||
*/
|
||||
#define ELEMENT_BESPOKE (1 << 1)
|
||||
* Only elements created with the same arguments given after `argument_hash_start_idx` share an element instance
|
||||
* The arguments are the same when the text and number values are the same and all other values have the same ref
|
||||
*/
|
||||
#define ELEMENT_BESPOKE (1 << 1)
|
||||
/// Causes all detach arguments to be passed to detach instead of only being used to identify the element
|
||||
/// When this is used your Detach proc should have the same signature as your Attach proc
|
||||
#define ELEMENT_COMPLEX_DETACH (1 << 2)
|
||||
/**
|
||||
* Elements with this flag will have their datum lists arguments compared as is,
|
||||
* without the contents being sorted alpha-numerically first.
|
||||
* This is good for those elements where the position of the keys matter, like in the case of color matrices.
|
||||
*/
|
||||
#define ELEMENT_DONT_SORT_LIST_ARGS (1<<3)
|
||||
/**
|
||||
* Elements with this flag will be ignored by the dcs_check_list_arguments test.
|
||||
* A good example is connect_loc, for which it's pratically undoable unless we force every signal proc to have a different name.
|
||||
*/
|
||||
#define ELEMENT_NO_LIST_UNIT_TEST (1<<4)
|
||||
|
||||
// How multiple components of the exact same type are handled in the same datum
|
||||
/// old component is deleted (default)
|
||||
#define COMPONENT_DUPE_HIGHLANDER 0
|
||||
#define COMPONENT_DUPE_HIGHLANDER 0
|
||||
/// duplicates allowed
|
||||
#define COMPONENT_DUPE_ALLOWED 1
|
||||
#define COMPONENT_DUPE_ALLOWED 1
|
||||
/// new component is deleted
|
||||
#define COMPONENT_DUPE_UNIQUE 2
|
||||
#define COMPONENT_DUPE_UNIQUE 2
|
||||
/**
|
||||
* Component uses source tracking to manage adding and removal logic.
|
||||
* Add a source/spawn to/the component by using AddComponentFrom(source, component_type, args...)
|
||||
* Removing the last source will automatically remove the component from the parent.
|
||||
* Arguments will be passed to on_source_add(source, args...); ensure that Initialize and on_source_add have the same signature.
|
||||
*/
|
||||
#define COMPONENT_DUPE_SOURCES 3
|
||||
/// old component is given the initialization args of the new
|
||||
#define COMPONENT_DUPE_UNIQUE_PASSARGS 4
|
||||
#define COMPONENT_DUPE_UNIQUE_PASSARGS 4
|
||||
/// each component of the same type is consulted as to whether the duplicate should be allowed
|
||||
#define COMPONENT_DUPE_SELECTIVE 5
|
||||
#define COMPONENT_DUPE_SELECTIVE 5
|
||||
|
||||
//Redirection component init flags
|
||||
#define REDIRECT_TRANSFER_WITH_TURF 1
|
||||
|
||||
//Arch
|
||||
#define ARCH_PROB "probability" //Probability for each item
|
||||
#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount
|
||||
#define ARCH_PROB "probability" //Probability for each item
|
||||
#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount
|
||||
|
||||
//Ouch my toes!
|
||||
#define CALTROP_BYPASS_SHOES 1
|
||||
@@ -45,4 +66,4 @@
|
||||
|
||||
// Conflict element IDs
|
||||
#define CONFLICT_ELEMENT_CRUSHER "crusher"
|
||||
#define CONFLICT_ELEMENT_KA "kinetic_accelerator"
|
||||
#define CONFLICT_ELEMENT_KA "kinetic_accelerator"
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
/// The datum hosting the signal is automaticaly added as the first argument
|
||||
/// Returns a bitfield gathered from all registered procs
|
||||
/// Arguments given here are packaged in a list and given to _SendSignal
|
||||
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) )
|
||||
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target._listen_lookup?[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) )
|
||||
|
||||
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
|
||||
|
||||
/// Signifies that this proc is used to handle signals.
|
||||
/// Every proc you pass to RegisterSignal must have this.
|
||||
//#define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE)
|
||||
#define SIGNAL_HANDLER // Sigh
|
||||
// #define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE) FIXME: FIXME: Causing some big issues still
|
||||
#define SIGNAL_HANDLER
|
||||
|
||||
/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments
|
||||
#define AddElement(arguments...) _AddElement(list(##arguments))
|
||||
@@ -18,3 +18,10 @@
|
||||
|
||||
/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments
|
||||
#define AddComponent(arguments...) _AddComponent(list(##arguments))
|
||||
|
||||
/// A wrapper for _AddComonent that passes in a source.
|
||||
/// Necessary if dupe_mode is set to COMPONENT_DUPE_SOURCES.
|
||||
#define AddComponentFrom(source, arguments...) _AddComponent(list(##arguments), source)
|
||||
|
||||
/// A wrapper for _LoadComponent that allows us to pretend we're using normal named arguments
|
||||
#define LoadComponent(arguments...) _LoadComponent(list(##arguments))
|
||||
|
||||
@@ -1,61 +1,3 @@
|
||||
// trait accessor defines
|
||||
#define ADD_TRAIT(target, trait, source) \
|
||||
do { \
|
||||
var/list/_L; \
|
||||
if (!target.status_traits) { \
|
||||
target.status_traits = list(); \
|
||||
_L = target.status_traits; \
|
||||
_L[trait] = list(source); \
|
||||
} else { \
|
||||
_L = target.status_traits; \
|
||||
if (_L[trait]) { \
|
||||
_L[trait] |= list(source); \
|
||||
} else { \
|
||||
_L[trait] = list(source); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
#define REMOVE_TRAIT(target, trait, sources) \
|
||||
do { \
|
||||
var/list/_L = target.status_traits; \
|
||||
var/list/_S; \
|
||||
if (sources && !islist(sources)) { \
|
||||
_S = list(sources); \
|
||||
} else { \
|
||||
_S = sources\
|
||||
}; \
|
||||
if (_L && _L[trait]) { \
|
||||
for (var/_T in _L[trait]) { \
|
||||
if ((!_S && (_T != ROUNDSTART_TRAIT)) || (_T in _S)) { \
|
||||
_L[trait] -= _T \
|
||||
} \
|
||||
};\
|
||||
if (!length(_L[trait])) { \
|
||||
_L -= trait \
|
||||
}; \
|
||||
if (!length(_L)) { \
|
||||
target.status_traits = null \
|
||||
}; \
|
||||
} \
|
||||
} while (0)
|
||||
#define REMOVE_TRAITS_NOT_IN(target, sources) \
|
||||
do { \
|
||||
var/list/_L = target.status_traits; \
|
||||
var/list/_S = sources; \
|
||||
if (_L) { \
|
||||
for (var/_T in _L) { \
|
||||
_L[_T] &= _S;\
|
||||
if (!length(_L[_T])) { \
|
||||
_L -= _T } \
|
||||
};\
|
||||
if (!length(_L)) { \
|
||||
target.status_traits = null\
|
||||
};\
|
||||
}\
|
||||
} while (0)
|
||||
#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE)
|
||||
#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE)
|
||||
|
||||
/*
|
||||
Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits.
|
||||
*/
|
||||
@@ -265,4 +207,4 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
#define SANGUIOSE_TRAIT "sanguiose"
|
||||
#define FROGENITE_TRAIT "frogenite"
|
||||
#define FERVEATIUM_TRAIT "ferveatium"
|
||||
*/
|
||||
*/
|
||||
|
||||
63
code/__defines/traits/_traits.dm
Normal file
63
code/__defines/traits/_traits.dm
Normal file
@@ -0,0 +1,63 @@
|
||||
#define SIGNAL_ADDTRAIT(trait_ref) "addtrait [trait_ref]"
|
||||
#define SIGNAL_REMOVETRAIT(trait_ref) "removetrait [trait_ref]"
|
||||
|
||||
// trait accessor defines
|
||||
#define ADD_TRAIT(target, trait, source) \
|
||||
do { \
|
||||
var/list/_L; \
|
||||
if (!target.status_traits) { \
|
||||
target.status_traits = list(); \
|
||||
_L = target.status_traits; \
|
||||
_L[trait] = list(source); \
|
||||
} else { \
|
||||
_L = target.status_traits; \
|
||||
if (_L[trait]) { \
|
||||
_L[trait] |= list(source); \
|
||||
} else { \
|
||||
_L[trait] = list(source); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
#define REMOVE_TRAIT(target, trait, sources) \
|
||||
do { \
|
||||
var/list/_L = target.status_traits; \
|
||||
var/list/_S; \
|
||||
if (sources && !islist(sources)) { \
|
||||
_S = list(sources); \
|
||||
} else { \
|
||||
_S = sources\
|
||||
}; \
|
||||
if (_L && _L[trait]) { \
|
||||
for (var/_T in _L[trait]) { \
|
||||
if ((!_S && (_T != ROUNDSTART_TRAIT)) || (_T in _S)) { \
|
||||
_L[trait] -= _T \
|
||||
} \
|
||||
};\
|
||||
if (!length(_L[trait])) { \
|
||||
_L -= trait \
|
||||
}; \
|
||||
if (!length(_L)) { \
|
||||
target.status_traits = null \
|
||||
}; \
|
||||
} \
|
||||
} while (0)
|
||||
#define REMOVE_TRAITS_NOT_IN(target, sources) \
|
||||
do { \
|
||||
var/list/_L = target.status_traits; \
|
||||
var/list/_S = sources; \
|
||||
if (_L) { \
|
||||
for (var/_T in _L) { \
|
||||
_L[_T] &= _S;\
|
||||
if (!length(_L[_T])) { \
|
||||
_L -= _T } \
|
||||
};\
|
||||
if (!length(_L)) { \
|
||||
target.status_traits = null\
|
||||
};\
|
||||
}\
|
||||
} while (0)
|
||||
|
||||
#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE)
|
||||
#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE)
|
||||
#define HAS_TRAIT_FROM_ONLY(target, trait, source) (HAS_TRAIT(target, trait) && (source in target.status_traits[trait]) && (length(target.status_traits[trait]) == 1))
|
||||
#define HAS_TRAIT_NOT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (length(target.status_traits[trait] - source) > 0))
|
||||
Reference in New Issue
Block a user