forked from NebulaSS13/Nebula
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmobs.dm
More file actions
451 lines (381 loc) · 17.9 KB
/
mobs.dm
File metadata and controls
451 lines (381 loc) · 17.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
// /mob/var/stat things.
#define CONSCIOUS 0
#define UNCONSCIOUS 1
#define DEAD 2
// Bitflags defining which status effects could be or are inflicted on a mob.
#define CANSTUN BITFLAG(0)
#define CANWEAKEN BITFLAG(1)
#define CANPARALYSE BITFLAG(2)
#define CANPUSH BITFLAG(3)
#define PASSEMOTES BITFLAG(4) // Mob has a holder inside of it that need to see emotes.
#define GODMODE BITFLAG(5)
#define FAKEDEATH BITFLAG(6)
#define NO_ANTAG BITFLAG(7) // Players are restricted from gaining antag roles when occupying this mob
#define ENABLE_AI BITFLAG(8) // Regardless of player control, the mob is using AI.
#define BORGMESON BITFLAG(0)
#define BORGTHERM BITFLAG(1)
#define BORGXRAY BITFLAG(2)
#define BORGMATERIAL BITFLAG(3)
#define LEFT BITFLAG(0)
#define RIGHT BITFLAG(1)
#define UNDER BITFLAG(2)
// Pulse levels, very simplified.
#define PULSE_NONE 0 // So !M.pulse checks would be possible.
#define PULSE_SLOW 1 // <60 bpm
#define PULSE_NORM 2 // 60-90 bpm
#define PULSE_FAST 3 // 90-120 bpm
#define PULSE_2FAST 4 // >120 bpm
#define PULSE_THREADY 5 // Occurs during hypovolemic shock
#define GETPULSE_HAND 0 // Less accurate. (hand)
#define GETPULSE_TOOL 1 // More accurate. (med scanner, sleeper, etc.)
#define PULSE_MAX_BPM 250 // Highest, readable BPM by machines and humans.
//These are used Bump() code for living mobs, in the mob_bump_flag, mob_swap_flags, and mob_push_flags vars to determine whom can bump/swap with whom.
#define HUMAN 1
#define MONKEY 2
#define ALIEN 4
#define ROBOT 8
#define SLIME 16
#define SIMPLE_ANIMAL 32
#define HEAVY 64
#define ALLMOBS (HUMAN|MONKEY|ALIEN|ROBOT|SLIME|SIMPLE_ANIMAL|HEAVY)
// Robot AI notifications
#define ROBOT_NOTIFICATION_NEW_UNIT 1
#define ROBOT_NOTIFICATION_NEW_NAME 2
#define ROBOT_NOTIFICATION_NEW_MODULE 3
#define ROBOT_NOTIFICATION_MODULE_RESET 4
// Appearance change flags
#define APPEARANCE_RACE BITFLAG(0)
#define APPEARANCE_GENDER BITFLAG(1)
#define APPEARANCE_BODY BITFLAG(2)
#define APPEARANCE_SKIN BITFLAG(3)
#define APPEARANCE_HAIR BITFLAG(4)
#define APPEARANCE_HAIR_COLOR BITFLAG(5)
#define APPEARANCE_FACIAL_HAIR BITFLAG(6)
#define APPEARANCE_FACIAL_HAIR_COLOR BITFLAG(7)
#define APPEARANCE_EYE_COLOR BITFLAG(8)
#define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR)
#define APPEARANCE_ALL (APPEARANCE_RACE|APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_SKIN|APPEARANCE_EYE_COLOR|APPEARANCE_ALL_HAIR)
// Click cooldown
#define DEFAULT_ATTACK_COOLDOWN 8 //Default timeout for aggressive actions
#define DEFAULT_QUICK_COOLDOWN 4
#define FAST_WEAPON_COOLDOWN 3
#define DEFAULT_WEAPON_COOLDOWN 5
#define SLOW_WEAPON_COOLDOWN 7
#define MIN_SUPPLIED_LAW_NUMBER 15
#define MAX_SUPPLIED_LAW_NUMBER 50
// Corporate alignment for the character
#define COMPANY_LOYAL "Loyal"
#define COMPANY_SUPPORTATIVE "Supportive"
#define COMPANY_NEUTRAL "Neutral"
#define COMPANY_SKEPTICAL "Skeptical"
#define COMPANY_OPPOSED "Opposed"
#define COMPANY_ALIGNMENTS list(COMPANY_LOYAL,COMPANY_SUPPORTATIVE,COMPANY_NEUTRAL,COMPANY_SKEPTICAL,COMPANY_OPPOSED)
// Defines mob sizes, used by lockers and to determine what is considered a small sized mob, etc.
#define MOB_SIZE_LARGE ITEM_SIZE_STRUCTURE * 2
#define MOB_SIZE_MEDIUM ITEM_SIZE_STRUCTURE
#define MOB_SIZE_SMALL ITEM_SIZE_NORMAL
#define MOB_SIZE_TINY ITEM_SIZE_SMALL
#define MOB_SIZE_MINISCULE ITEM_SIZE_TINY
#define MOB_SIZE_MIN MOB_SIZE_MINISCULE
#define MOB_SIZE_MAX MOB_SIZE_LARGE
// Defines how strong the species is compared to humans. Think like strength in D&D
#define STR_VHIGH 2
#define STR_HIGH 1
#define STR_MEDIUM 0
#define STR_LOW -1
#define STR_VLOW -2
// Gluttony levels.
#define GLUT_TINY 1 // Eat anything tiny and smaller
#define GLUT_SMALLER 2 // Eat anything smaller than we are
#define GLUT_ANYTHING 4 // Eat anything, ever
#define GLUT_ITEM_TINY 8 // Eat items with a w_class of small or smaller
#define GLUT_ITEM_NORMAL 16 // Eat items with a w_class of normal or smaller
#define GLUT_ITEM_ANYTHING 32 // Eat any item
#define GLUT_PROJECTILE_VOMIT 64 // When vomitting, does it fly out?
// Devour speeds, returned by can_devour()
#define DEVOUR_SLOW 1
#define DEVOUR_FAST 2
#define TINT_NONE 0
#define TINT_MODERATE 1
#define TINT_HEAVY 2
#define TINT_BLIND 3
#define FLASH_PROTECTION_VULNERABLE -2
#define FLASH_PROTECTION_REDUCED -1
#define FLASH_PROTECTION_NONE 0
#define FLASH_PROTECTION_MINOR 1
#define FLASH_PROTECTION_MODERATE 2
#define FLASH_PROTECTION_MAJOR 3
#define ANIMAL_SPAWN_DELAY round(get_config_value(/decl/config/num/respawn_delay) / 6)
#define DRONE_SPAWN_DELAY round(get_config_value(/decl/config/num/respawn_delay) / 3)
// Incapacitation flags, used by the mob/proc/incapacitated() proc
#define INCAPACITATION_NONE 0
#define INCAPACITATION_RESTRAINED BITFLAG(0)
#define INCAPACITATION_BUCKLED_PARTIALLY BITFLAG(1)
#define INCAPACITATION_BUCKLED_FULLY BITFLAG(2)
#define INCAPACITATION_STUNNED BITFLAG(3)
#define INCAPACITATION_FORCELYING BITFLAG(4) //needs a better name - represents being knocked down BUT still conscious.
#define INCAPACITATION_KNOCKOUT BITFLAG(5)
#define INCAPACITATION_WEAKENED BITFLAG(6)
#define INCAPACITATION_UNRESISTING (INCAPACITATION_KNOCKOUT|INCAPACITATION_STUNNED)
#define INCAPACITATION_DISRUPTED (INCAPACITATION_UNRESISTING|INCAPACITATION_WEAKENED)
#define INCAPACITATION_KNOCKDOWN (INCAPACITATION_KNOCKOUT|INCAPACITATION_FORCELYING)
#define INCAPACITATION_DISABLED (INCAPACITATION_KNOCKDOWN|INCAPACITATION_STUNNED)
#define INCAPACITATION_DEFAULT (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_DISABLED)
#define INCAPACITATION_ALL (~INCAPACITATION_NONE)
// Organs.
#define BP_EYES "eyes"
#define BP_HEART "heart"
#define BP_LUNGS "lungs"
#define BP_TRACH "tracheae"
#define BP_BRAIN "brain"
#define BP_LIVER "liver"
#define BP_KIDNEYS "kidneys"
#define BP_STOMACH "stomach"
#define BP_PLASMA "plasma vessel"
#define BP_APPENDIX "appendix"
#define BP_CELL "cell"
#define BP_HIVE "hive node"
#define BP_NUTRIENT "nutrient vessel"
#define BP_ACID "acid gland"
#define BP_EGG "egg sac"
#define BP_RESIN "resin spinner"
#define BP_STRATA "neural strata"
#define BP_RESPONSE "response node"
#define BP_GBLADDER "gas bladder"
#define BP_POLYP "polyp segment"
#define BP_ANCHOR "anchoring ligament"
#define BP_ACETONE "acetone reactor"
// Robo Organs.
#define BP_VOICE "vocal synthesiser"
#define BP_STACK "stack"
#define BP_OPTICS "optics"
//Augmetations
#define BP_AUGMENT_R_ARM "right arm augment"
#define BP_AUGMENT_L_ARM "left arm augment"
#define BP_AUGMENT_R_HAND "right hand augment"
#define BP_AUGMENT_L_HAND "left hand augment"
#define BP_AUGMENT_R_LEG "right leg augment"
#define BP_AUGMENT_L_LEG "left leg augment"
#define BP_AUGMENT_CHEST_ARMOUR "chest armor augment"
#define BP_AUGMENT_CHEST_ACTIVE "active chest augment"
#define BP_AUGMENT_HEAD "head augment"
//Augment flags
#define AUGMENTATION_MECHANIC 1
#define AUGMENTATION_ORGANIC 2
// Prosthetic helpers.
#define BP_IS_PROSTHETIC(org) (!QDELETED(org) && (org.organ_properties & ORGAN_PROP_PROSTHETIC))
#define BP_IS_ROBOTIC(org) (!QDELETED(org) && (org.bodytype?.is_robotic))
#define BP_IS_BRITTLE(org) (!QDELETED(org) && (org.status & ORGAN_BRITTLE))
#define BP_IS_CRYSTAL(org) (!QDELETED(org) && (org.organ_properties & ORGAN_PROP_CRYSTAL))
//Organ Properties Setters
#define BP_SET_PROSTHETIC(org) org.organ_properties |= ORGAN_PROP_PROSTHETIC;
#define BP_SET_CRYSTAL(org) org.organ_properties |= ORGAN_PROP_CRYSTAL;
// Limb flag helpers
#define BP_IS_DEFORMED(org) (org.limb_flags & ORGAN_FLAG_DEFORMED)
#define SYNTH_BLOOD_COLOR "#030303"
#define SYNTH_FLESH_COLOUR "#575757"
#define MOB_PULL_NONE 0
#define MOB_PULL_SMALLER 1
#define MOB_PULL_SAME 2
#define MOB_PULL_LARGER 3
// Taste sensitivity defines, used in mob/living/proc/ingest.
#define TASTE_HYPERSENSITIVE 3 //anything below 5%
#define TASTE_SENSITIVE 2 //anything below 7%
#define TASTE_NORMAL 1 //anything below 15%
#define TASTE_DULL 0.5 //anything below 30%
#define TASTE_NUMB 0.1 //anything below 150%
// One 'unit' of taste sensitivity probability, used in mob/living/proc/ingest
#define TASTE_DEGREE_PROB 15
// General food data flags
#define DATA_TASTE /decl/reagent_data_field/taste
#define DATA_INGREDIENT_LIST /decl/reagent_data_field/ingredient_list
#define DATA_INGREDIENT_FLAGS /decl/reagent_data_field/ingredient_flags
#define DATA_MASK_COLOR /decl/reagent_data_field/mask_color
#define DATA_MASK_NAME /decl/reagent_data_field/mask_name
#define DATA_EXTRA_COLOR /decl/reagent_data_field/extra_color
// Milk and chees data flags
#define DATA_MILK_DONOR /decl/reagent_data_field/milk_donor
#define DATA_MILK_NAME /decl/reagent_data_field/milk_name
#define DATA_MILK_COLOR /decl/reagent_data_field/milk_color
#define DATA_CHEESE_NAME /decl/reagent_data_field/cheese_name
#define DATA_CHEESE_COLOR /decl/reagent_data_field/cheese_color
// Blood data flags
#define DATA_BLOOD_DNA /decl/reagent_data_field/blood_dna
#define DATA_BLOOD_DONOR /decl/reagent_data_field/blood_donor
#define DATA_BLOOD_SPECIES /decl/reagent_data_field/blood_species
#define DATA_BLOOD_COLOR /decl/reagent_data_field/blood_color
#define DATA_BLOOD_TYPE /decl/reagent_data_field/blood_type
#define DATA_BLOOD_TRACE_CHEM /decl/reagent_data_field/blood_trace_chem
#define DATA_BLOOD_DOSE_CHEM /decl/reagent_data_field/blood_dose_chem
#define DATA_BLOOD_HAS_OXY /decl/reagent_data_field/blood_has_oxy
//Used by show_message() and emotes
#define VISIBLE_MESSAGE 1
#define AUDIBLE_MESSAGE 2
//used for getting species temp values
#define COLD_LEVEL_1 -1
#define COLD_LEVEL_2 -2
#define COLD_LEVEL_3 -3
#define HEAT_LEVEL_1 1
#define HEAT_LEVEL_2 2
#define HEAT_LEVEL_3 3
//Synthetic human temperature vals
#define SYNTH_COLD_LEVEL_1 50
#define SYNTH_COLD_LEVEL_2 -1
#define SYNTH_COLD_LEVEL_3 -1
#define SYNTH_HEAT_LEVEL_1 500
#define SYNTH_HEAT_LEVEL_2 1000
#define SYNTH_HEAT_LEVEL_3 2000
#define CORPSE_CANNOT_REENTER 0
#define CORPSE_CAN_REENTER BITFLAG(0)
#define CORPSE_CAN_RESPAWN BITFLAG(1)
#define SPECIES_HUMAN "Human"
#define SPECIES_MONKEY "Monkey"
#define SURGERY_CLOSED 0
#define SURGERY_OPEN 1
#define SURGERY_RETRACTED 2
#define SURGERY_ENCASED 3
#define STASIS_MISC "misc"
#define STASIS_CRYOBAG "cryobag"
#define STASIS_COLD "cold"
#define AURA_CANCEL 1
#define AURA_FALSE 2
#define AURA_TYPE_BULLET "Bullet"
#define AURA_TYPE_WEAPON "Weapon"
#define AURA_TYPE_THROWN "Thrown"
#define AURA_TYPE_LIFE "Life"
#define SPECIES_BLOOD_DEFAULT 560
#define SLIME_EVOLUTION_THRESHOLD 15
//Used in mob/proc/get_input
#define MOB_INPUT_TEXT "text"
#define MOB_INPUT_MESSAGE "message"
#define MOB_INPUT_NUM "num"
#define MOB_CLIMB_TIME_SMALL 30
#define MOB_CLIMB_TIME_MEDIUM 50
#define MOB_FACTION_NEUTRAL "neutral"
#define ROBOT_MODULE_TYPE_GROUNDED "grounded"
#define ROBOT_MODULE_TYPE_FLYING "flying"
#define RADIO_INTERRUPT_DEFAULT 30
#define MOB_FLAG_HOLY_BAD BITFLAG(0) // If this mob is allergic to holiness
#define DEXTERITY_NONE 0
#define DEXTERITY_SIMPLE_MACHINES BITFLAG(0)
// TODO: let HOLD equip items to hand just not other slots
#define DEXTERITY_HOLD_ITEM BITFLAG(1)
#define DEXTERITY_WIELD_ITEM BITFLAG(2)
#define DEXTERITY_EQUIP_ITEM BITFLAG(3)
#define DEXTERITY_KEYBOARDS BITFLAG(4)
#define DEXTERITY_TOUCHSCREENS BITFLAG(5)
// TODO: actually get grab code to check this one.
#define DEXTERITY_GRAPPLE BITFLAG(6) // Can the mob grab other mobs?
#define DEXTERITY_WEAPONS BITFLAG(7) // Can the mob use guns?
#define DEXTERITY_COMPLEX_TOOLS BITFLAG(8) // Can the mob use complex items like flashlights, handcuffs, etc?
#define DEXTERITY_BASE (DEXTERITY_SIMPLE_MACHINES|DEXTERITY_HOLD_ITEM|DEXTERITY_WIELD_ITEM|DEXTERITY_EQUIP_ITEM)
#define DEXTERITY_FULL (DEXTERITY_BASE|DEXTERITY_KEYBOARDS|DEXTERITY_TOUCHSCREENS|DEXTERITY_GRAPPLE|DEXTERITY_WEAPONS|DEXTERITY_COMPLEX_TOOLS)
// List of dexterity flags ordered by 'complexity' for use in brainloss dex malus checking.
var/global/list/dexterity_levels = list(
"[DEXTERITY_COMPLEX_TOOLS]",
"[DEXTERITY_WEAPONS]",
"[DEXTERITY_GRAPPLE]",
"[DEXTERITY_TOUCHSCREENS]",
"[DEXTERITY_KEYBOARDS]",
"[DEXTERITY_BASE]"
)
// used in /mob/living/human/can_inject, and by various callers of that proc
#define CAN_INJECT 1
#define INJECTION_PORT 2
#define INJECTION_PORT_DELAY 3 SECONDS // used by injectors to apply delay due to searching for a port on the injectee's suit
#define ADJUSTED_GLIDE_SIZE(DELAY) (NONUNIT_CEILING((WORLD_ICON_SIZE / max((DELAY), world.tick_lag) * world.tick_lag) - world.tick_lag, 1) + (get_config_value(/decl/config/num/movement_glide_size)))
#define PREF_MEM_RECORD "memory"
#define PREF_SEC_RECORD "sec_record"
#define PREF_PUB_RECORD "public_record"
#define PREF_MED_RECORD "med_record"
#define PREF_GEN_RECORD "gen_record"
// Simple animal icon state flags.
#define MOB_ICON_HAS_LIVING_STATE BITFLAG(0)
#define MOB_ICON_HAS_DEAD_STATE BITFLAG(1)
#define MOB_ICON_HAS_REST_STATE BITFLAG(2)
#define MOB_ICON_HAS_SITTING_STATE BITFLAG(3)
#define MOB_ICON_HAS_SLEEP_STATE BITFLAG(4)
#define MOB_ICON_HAS_GIB_STATE BITFLAG(5)
#define MOB_ICON_HAS_DUST_STATE BITFLAG(6)
#define MOB_ICON_HAS_PARALYZED_STATE BITFLAG(7)
#define NEUTER_ANIMATE "animate singular neutral"
// Equipment Overlays Indices //
#define HO_CONDITION_LAYER 1
#define HO_SKIN_LAYER 2
#define HO_DAMAGE_LAYER 3
#define HO_SURGERY_LAYER 4 //bs12 specific.
#define HO_BANDAGE_LAYER 5
#define HO_UNDERWEAR_LAYER 6
#define HO_UNIFORM_LAYER 7
#define HO_ID_LAYER 8
#define HO_SHOES_LAYER 9
#define HO_GLOVES_LAYER 10
#define HO_BELT_LAYER 11
#define HO_SUIT_LAYER 12
#define HO_GLASSES_LAYER 13
#define HO_BELT_LAYER_ALT 14
#define HO_SUIT_STORE_LAYER 15
#define HO_BACK_LAYER 16
#define HO_TAIL_LAYER 17 //bs12 specific. this hack is probably gonna come back to haunt me
#define HO_HAIR_LAYER 18 //TODO: make part of head layer?
#define HO_GOGGLES_LAYER 19
#define HO_L_EAR_LAYER 20
#define HO_R_EAR_LAYER 21
#define HO_FACEMASK_LAYER 22
#define HO_HEAD_LAYER 23
#define HO_COLLAR_LAYER 24
#define HO_HANDCUFF_LAYER 25
#define HO_INHAND_LAYER 26
#define HO_FIRE_LAYER 27 //If you're on fire
#define TOTAL_OVER_LAYERS 27
//////////////////////////////////
// Underlay defines; vestigal implementation currently.
#define HU_TAIL_LAYER 1
#define TOTAL_UNDER_LAYERS 1
// Enum for result of an attempt to eat/eat from an item.
#define EATEN_INVALID 0
#define EATEN_UNABLE 1
#define EATEN_SUCCESS 2
// Enum for type of consumption, largely just cosmetic currently.
#define EATING_METHOD_EAT 0
#define EATING_METHOD_DRINK 1
// Sprite accessory categories for shorter reference.
#define SAC_HAIR /decl/sprite_accessory_category/hair
#define SAC_FACIAL_HAIR /decl/sprite_accessory_category/facial_hair
#define SAC_COSMETICS /decl/sprite_accessory_category/cosmetics
#define SAC_MARKINGS /decl/sprite_accessory_category/markings
#define SAC_EARS /decl/sprite_accessory_category/ears
#define SAC_HORNS /decl/sprite_accessory_category/horns
#define SAC_FRILLS /decl/sprite_accessory_category/frills
#define SAC_TAIL /decl/sprite_accessory_category/tail
// Sprite accessory metadata types for shorter reference.
#define SAM_COLOR /decl/sprite_accessory_metadata/color
#define SAM_COLOR_INNER /decl/sprite_accessory_metadata/color/alt
#define SAM_GRADIENT /decl/sprite_accessory_metadata/gradient
// Helpers for setting mob appearance. They are extremely ugly, hence the helpers.
#define SET_HAIR_STYLE(TARGET, STYLE, SKIP_UPDATE) (TARGET.set_organ_sprite_accessory_by_category((STYLE), SAC_HAIR, null, TRUE, FALSE, BP_HEAD, SKIP_UPDATE))
#define GET_HAIR_STYLE(TARGET) (TARGET.get_organ_sprite_accessory_by_category(SAC_HAIR, BP_HEAD))
#define SET_HAIR_COLOR(TARGET, COLOR, SKIP_UPDATE) (TARGET.set_organ_sprite_accessory_by_category(null, SAC_HAIR, list(SAM_COLOR = (COLOR)), FALSE, TRUE, BP_HEAD, SKIP_UPDATE))
#define GET_HAIR_COLOR(TARGET) (TARGET.get_organ_sprite_accessory_metadata(GET_HAIR_STYLE(TARGET), BP_HEAD, SAM_COLOR))
#define SET_FACIAL_HAIR_STYLE(TARGET, STYLE, SKIP_UPDATE) (TARGET.set_organ_sprite_accessory_by_category((STYLE), SAC_FACIAL_HAIR, null, TRUE, FALSE, BP_HEAD, SKIP_UPDATE))
#define GET_FACIAL_HAIR_STYLE(TARGET) (TARGET.get_organ_sprite_accessory_by_category(SAC_FACIAL_HAIR, BP_HEAD))
#define SET_FACIAL_HAIR_COLOR(TARGET, COLOR, SKIP_UPDATE) (TARGET.set_organ_sprite_accessory_by_category(null, SAC_FACIAL_HAIR, list(SAM_COLOR = (COLOR)), FALSE, TRUE, BP_HEAD, SKIP_UPDATE))
#define GET_FACIAL_HAIR_COLOR(TARGET) (TARGET.get_organ_sprite_accessory_metadata(GET_FACIAL_HAIR_STYLE(TARGET), BP_HEAD, SAM_COLOR))
// Used in death() to skip message broadcast.
#define SKIP_DEATH_MESSAGE "no message"
// Used in organ stance calc.
#define LIMB_UNUSABLE 2
#define LIMB_DAMAGED 1
#define LIMB_IMPAIRED 0.5
// Used by allergy effects.
#define ALLERGEN_REACTION_NONE 0
#define ALLERGEN_REACTION_PHYS_DMG BITFLAG(0)
#define ALLERGEN_REACTION_BURN_DMG BITFLAG(1)
#define ALLERGEN_REACTION_TOX_DMG BITFLAG(2)
#define ALLERGEN_REACTION_OXY_DMG BITFLAG(3)
#define ALLERGEN_REACTION_EMOTE BITFLAG(4)
#define ALLERGEN_REACTION_PAIN BITFLAG(5)
#define ALLERGEN_REACTION_WEAKEN BITFLAG(6)
#define ALLERGEN_REACTION_BLURRY BITFLAG(7)
#define ALLERGEN_REACTION_SLEEPY BITFLAG(8)
#define ALLERGEN_REACTION_CONFUSE BITFLAG(9)