Files
Bubberstation/code/_globalvars/bitfields.dm
necromanceranne 5a3d6881ec Completely strips silicon control options out of open cage mechs (except mech domination). Adds flags to handle granular control restrictions and beacon limitations. (#91118)
## About The Pull Request

Open cabin mechs cannot be piloted by silicon pilots. MMI's, uploaded
AI's, positronics or AI control beacons. The mechs can still be tracker
beaconed. It can also be dominated via the malfunctioning AI power.

Adds some flags to help flag which mechs can or cannot be beaconed, or
which are silicon compatible.

## Why It's Good For The Game

I'm not going to lie. I do feel a bit pressured on this change in
particular. This is somewhat meant to be an intended feature.

But I think the cats out of the bag on open cabin mechs and the ways to
circumvent their downsides. And the more I think about it, the more I
come to realize that I frankly haven't had many, if any, good
interactions with a posibrain/MMI mech army. So making that more
efficient is...a problem.

Using a silicon-based pilot can help you evade the potential
consequences of being a flesh and bone pilot inside of a steel mesh
cabin and being shot repeatedly. So you may as well, in those instances,
treat it as a sealed cabin mech. And these mechs are surprisingly pretty
strong statistically. Especially the Paddy with its ability to equip
actual lethal weaponry.

They're cheap, can be mass produced, come out early, and durable. The
only limitation is pilots, and if you're printing positronics and get
ghosts for those positronics, you can usually just keep producing more.

From a purely objective standpoint, there isn't much reason to not push
out posi-paddys over any other mech. Rather than settle for a perfect
answer, let's at least require some human pilots in these mechs so that
their supposed downside is more of an Achilles heel.

## Changelog
🆑
balance: Caged mechs cannot accept silicon pilots. AI uploaded pilots,
AI control beacons, MMIs or positronics. Malfunctioning AIs can still
dominate these mechs.
code: Allows for a higher degree of granularity for what mechs can and
cannot accept by including additoinal mecha flags to block beacon type
installations, pilot uploads and so on.
/🆑
2025-06-01 13:07:21 -07:00

628 lines
19 KiB
Plaintext

GLOBAL_LIST_INIT(bitfields, generate_bitfields())
/// Specifies a bitfield for smarter debugging
/datum/bitfield
/// The variable name that contains the bitfield
var/variable
/// An associative list of the readable flag and its true value
var/list/flags
/// Turns /datum/bitfield subtypes into a list for use in debugging
/proc/generate_bitfields()
var/list/bitfields = list()
for (var/_bitfield in subtypesof(/datum/bitfield))
var/datum/bitfield/bitfield = new _bitfield
bitfields[bitfield.variable] = bitfield.flags
return bitfields
/// Returns an associative list of bitflag name -> number for all valid bitflags in the passed in field
/proc/get_valid_bitflags(var_name)
return GLOB.bitfields[var_name] || list()
/proc/get_random_bitflag(var_name)
var/list/flags = get_valid_bitflags(var_name)
if(!length(flags))
return
var/name = pick(flags)
return flags[name]
DEFINE_BITFIELD(admin_flags, list(
"ADMIN" = R_ADMIN,
"AUTOLOGIN" = R_AUTOADMIN,
"BAN" = R_BAN,
"BUILDMODE" = R_BUILD,
"DBRANKS" = R_DBRANKS,
"DEBUG" = R_DEBUG,
"FUN" = R_FUN,
"PERMISSIONS" = R_PERMISSIONS,
"POLL" = R_POLL,
"POSSESS" = R_POSSESS,
"SERVER" = R_SERVER,
"SOUNDS" = R_SOUND,
"SPAWN" = R_SPAWN,
"STEALTH" = R_STEALTH,
"VAREDIT" = R_VAREDIT,
))
DEFINE_BITFIELD(appearance_flags, list(
"KEEP_APART" = KEEP_APART,
"KEEP_TOGETHER" = KEEP_TOGETHER,
"LONG_GLIDE" = LONG_GLIDE,
"NO_CLIENT_COLOR" = NO_CLIENT_COLOR,
"PIXEL_SCALE" = PIXEL_SCALE,
"PLANE_MASTER" = PLANE_MASTER,
"RESET_ALPHA" = RESET_ALPHA,
"RESET_COLOR" = RESET_COLOR,
"RESET_TRANSFORM" = RESET_TRANSFORM,
"TILE_BOUND" = TILE_BOUND,
"PASS_MOUSE" = PASS_MOUSE,
"TILE_MOVER" = TILE_MOVER,
))
DEFINE_BITFIELD(area_flags, list(
"BLOBS_ALLOWED" = BLOBS_ALLOWED,
"BLOCK_SUICIDE" = BLOCK_SUICIDE,
"CAVES_ALLOWED" = CAVES_ALLOWED,
"CULT_PERMITTED" = CULT_PERMITTED,
"FLORA_ALLOWED" = FLORA_ALLOWED,
"HIDDEN_AREA" = HIDDEN_AREA,
"MEGAFAUNA_SPAWN_ALLOWED" = MEGAFAUNA_SPAWN_ALLOWED,
"MOB_SPAWN_ALLOWED" = MOB_SPAWN_ALLOWED,
"NOTELEPORT" = NOTELEPORT,
"NO_DEATH_MESSAGE" = NO_DEATH_MESSAGE,
"PERSISTENT_ENGRAVINGS" = PERSISTENT_ENGRAVINGS,
"UNIQUE_AREA" = UNIQUE_AREA,
"VALID_TERRITORY" = VALID_TERRITORY,
"XENOBIOLOGY_COMPATIBLE" = XENOBIOLOGY_COMPATIBLE,
"NO_BOH" = NO_BOH,
"UNLIMITED_FISHING" = UNLIMITED_FISHING,
))
DEFINE_BITFIELD(turf_flags, list(
"NO_LAVA_GEN" = NO_LAVA_GEN,
"NO_RUINS" = NO_RUINS,
"NO_RUST" = NO_RUST,
"NOJAUNT" = NOJAUNT,
"IS_SOLID" = IS_SOLID,
"UNUSED_RESERVATION_TURF" = UNUSED_RESERVATION_TURF,
"RESERVATION_TURF" = RESERVATION_TURF,
"TURF_BLOCKS_PLACEATOM" = TURF_BLOCKS_POPULATE_TERRAIN_FLORAFEATURES,
))
DEFINE_BITFIELD(car_traits, list(
"CAN_KIDNAP" = CAN_KIDNAP,
))
DEFINE_BITFIELD(clothing_flags, list(
"ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER,
"BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT,
"CASTING_CLOTHES" = CASTING_CLOTHES,
"GAS_FILTERING" = GAS_FILTERING,
"HEADINTERNALS" = HEADINTERNALS,
"INEDIBLE_CLOTHING" = INEDIBLE_CLOTHING,
"LARGE_WORN_ICON" = LARGE_WORN_ICON,
"LAVAPROTECT" = LAVAPROTECT,
"MASKINTERNALS" = MASKINTERNALS,
"STACKABLE_HELMET_EXEMPT" = STACKABLE_HELMET_EXEMPT,
"PLASMAMAN_PREVENT_IGNITION" = PLASMAMAN_PREVENT_IGNITION,
"SNUG_FIT" = SNUG_FIT,
"STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE,
"THICKMATERIAL" = THICKMATERIAL,
"VOICEBOX_DISABLED" = VOICEBOX_DISABLED,
"VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE,
"INTERNALS_ADJUST_EXEMPT" = INTERNALS_ADJUST_EXEMPT,
))
DEFINE_BITFIELD(datum_flags, list(
"DF_ISPROCESSING" = DF_ISPROCESSING,
"DF_VAR_EDITED" = DF_VAR_EDITED,
"DF_USE_TAG" = DF_USE_TAG,
))
DEFINE_BITFIELD(disease_flags, list(
"CAN_CARRY" = CAN_CARRY,
"CAN_RESIST" = CAN_RESIST,
"CURABLE" = CURABLE,
))
DEFINE_BITFIELD(flags_1, list(
"ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1,
"ALLOW_DARK_PAINTS_1" = ALLOW_DARK_PAINTS_1,
"ATMOS_IS_PROCESSING_1" = ATMOS_IS_PROCESSING_1,
"CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1,
"DECAL_INIT_UPDATE_EXPERIENCED_1" = DECAL_INIT_UPDATE_EXPERIENCED_1,
"HAS_CONTEXTUAL_SCREENTIPS_1" = HAS_CONTEXTUAL_SCREENTIPS_1,
"HAS_DISASSOCIATED_STORAGE_1" = HAS_DISASSOCIATED_STORAGE_1,
"HOLOGRAM_1" = HOLOGRAM_1,
"HTML_USE_INITAL_ICON_1" = HTML_USE_INITAL_ICON_1,
"IGNORE_TURF_PIXEL_OFFSET_1" = IGNORE_TURF_PIXEL_OFFSET_1,
"INITIALIZED_1" = INITIALIZED_1,
"IS_ONTOP_1" = IS_ONTOP_1,
"IS_PLAYER_COLORABLE_1" = IS_PLAYER_COLORABLE_1,
"NO_NEW_GAGS_PREVIEW_1" = NO_NEW_GAGS_PREVIEW_1,
"NO_SCREENTIPS_1" = NO_SCREENTIPS_1,
"ON_BORDER_1" = ON_BORDER_1,
"PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1,
"PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1,
"SUPERMATTER_IGNORES_1" = SUPERMATTER_IGNORES_1,
"UNPAINTABLE_1" = UNPAINTABLE_1,
))
DEFINE_BITFIELD(flags_ricochet, list(
"RICOCHET_HARD" = RICOCHET_HARD,
"RICOCHET_SHINY" = RICOCHET_SHINY,
))
DEFINE_BITFIELD(interaction_flags_atom, list(
"INTERACT_ATOM_ATTACK_HAND" = INTERACT_ATOM_ATTACK_HAND,
"INTERACT_ATOM_CHECK_GRAB" = INTERACT_ATOM_CHECK_GRAB,
"INTERACT_ATOM_IGNORE_INCAPACITATED" = INTERACT_ATOM_IGNORE_INCAPACITATED,
"INTERACT_ATOM_IGNORE_RESTRAINED" = INTERACT_ATOM_IGNORE_RESTRAINED,
"INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND" = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND,
"INTERACT_ATOM_NO_FINGERPRINT_INTERACT" = INTERACT_ATOM_NO_FINGERPRINT_INTERACT,
"INTERACT_ATOM_REQUIRES_ANCHORED" = INTERACT_ATOM_REQUIRES_ANCHORED,
"INTERACT_ATOM_REQUIRES_DEXTERITY" = INTERACT_ATOM_REQUIRES_DEXTERITY,
"INTERACT_ATOM_UI_INTERACT" = INTERACT_ATOM_UI_INTERACT,
"INTERACT_ATOM_ALLOW_USER_LOCATION" = INTERACT_ATOM_ALLOW_USER_LOCATION,
"INTERACT_ATOM_IGNORE_MOBILITY" = INTERACT_ATOM_IGNORE_MOBILITY,
))
DEFINE_BITFIELD(interaction_flags_machine, list(
"INTERACT_MACHINE_OPEN" = INTERACT_MACHINE_OPEN,
"INTERACT_MACHINE_OFFLINE" = INTERACT_MACHINE_OFFLINE,
"INTERACT_MACHINE_WIRES_IF_OPEN" = INTERACT_MACHINE_WIRES_IF_OPEN,
"INTERACT_MACHINE_ALLOW_SILICON" = INTERACT_MACHINE_ALLOW_SILICON,
"INTERACT_MACHINE_OPEN_SILICON" = INTERACT_MACHINE_OPEN_SILICON,
"INTERACT_MACHINE_REQUIRES_SILICON" = INTERACT_MACHINE_REQUIRES_SILICON,
"INTERACT_MACHINE_REQUIRES_SIGHT" = INTERACT_MACHINE_REQUIRES_SIGHT,
"INTERACT_MACHINE_REQUIRES_LITERACY" = INTERACT_MACHINE_REQUIRES_LITERACY,
"INTERACT_MACHINE_REQUIRES_STANDING" = INTERACT_MACHINE_REQUIRES_STANDING,
))
DEFINE_BITFIELD(interaction_flags_item, list(
"INTERACT_ITEM_ATTACK_HAND_PICKUP" = INTERACT_ITEM_ATTACK_HAND_PICKUP,
))
DEFINE_BITFIELD(item_flags, list(
"ABSTRACT" = ABSTRACT,
"BEING_REMOVED" = BEING_REMOVED,
"DROPDEL" = DROPDEL,
"FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE,
"HAND_ITEM" = HAND_ITEM,
"IGNORE_DIGITIGRADE" = IGNORE_DIGITIGRADE,
"IMMUTABLE_SLOW" = IMMUTABLE_SLOW,
"IN_INVENTORY" = IN_INVENTORY,
"IN_STORAGE" = IN_STORAGE,
"ITEM_HAS_CONTEXTUAL_SCREENTIPS" = ITEM_HAS_CONTEXTUAL_SCREENTIPS,
"NEEDS_PERMIT" = NEEDS_PERMIT,
"NOBLUDGEON" = NOBLUDGEON,
"NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION,
"NO_PIXEL_RANDOM_DROP" = NO_PIXEL_RANDOM_DROP,
"SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND,
"SURGICAL_TOOL" = SURGICAL_TOOL,
"CRUEL_IMPLEMENT" = CRUEL_IMPLEMENT,
"XENOMORPH_HOLDABLE" = XENOMORPH_HOLDABLE,
"NO_BLOOD_ON_ITEM" = NO_BLOOD_ON_ITEM,
))
DEFINE_BITFIELD(flags_inv, list(
"HIDEEARS" = HIDEEARS,
"HIDEEYES" = HIDEEYES,
"HIDEFACE" = HIDEFACE,
"HIDEFACIALHAIR" = HIDEFACIALHAIR,
"HIDEGLOVES" = HIDEGLOVES,
"HIDEHAIR" = HIDEHAIR,
"HIDEHEADGEAR" = HIDEHEADGEAR,
"HIDEJUMPSUIT" = HIDEJUMPSUIT,
"HIDEMASK" = HIDEMASK,
"HIDEBELT" = HIDEBELT,
"HIDENECK" = HIDENECK,
"HIDESHOES" = HIDESHOES,
"HIDESNOUT" = HIDESNOUT,
"HIDESUITSTORAGE" = HIDESUITSTORAGE,
"HIDEMUTWINGS" = HIDEMUTWINGS,
"HIDEANTENNAE" = HIDEANTENNAE,
))
DEFINE_BITFIELD(strict_coverage_zones, list(
"HAIR_APPENDAGE_FRONT" = HAIR_APPENDAGE_FRONT,
"HAIR_APPENDAGE_LEFT" = HAIR_APPENDAGE_LEFT,
"HAIR_APPENDAGE_RIGHT" = HAIR_APPENDAGE_RIGHT,
"HAIR_APPENDAGE_REAR" = HAIR_APPENDAGE_REAR,
"HAIR_APPENDAGE_TOP" = HAIR_APPENDAGE_TOP,
"HAIR_APPENDAGE_HANGING_FRONT" = HAIR_APPENDAGE_HANGING_FRONT,
"HAIR_APPENDAGE_HANGING_REAR" = HAIR_APPENDAGE_HANGING_REAR,
))
DEFINE_BITFIELD(machine_stat, list(
"BROKEN" = BROKEN,
"EMPED" = EMPED,
"MAINT" = MAINT,
"NOPOWER" = NOPOWER,
))
DEFINE_BITFIELD(mat_container_flags, list(
"MATCONTAINER_EXAMINE" = MATCONTAINER_EXAMINE,
"MATCONTAINER_NO_INSERT" = MATCONTAINER_NO_INSERT,
"MATCONTAINER_ANY_INTENT" = MATCONTAINER_ANY_INTENT,
"MATCONTAINER_SILENT" = MATCONTAINER_SILENT
))
DEFINE_BITFIELD(internal_damage, list(
"MECHA_INT_FIRE" = MECHA_INT_FIRE,
"MECHA_INT_TEMP_CONTROL" = MECHA_INT_TEMP_CONTROL,
"MECHA_CABIN_AIR_BREACH" = MECHA_CABIN_AIR_BREACH,
"MECHA_INT_CONTROL_LOST" = MECHA_INT_CONTROL_LOST,
"MECHA_INT_SHORT_CIRCUIT" = MECHA_INT_SHORT_CIRCUIT,
))
DEFINE_BITFIELD(mecha_flags, list(
"ID_LOCK_ON" = ID_LOCK_ON,
"CAN_STRAFE" = CAN_STRAFE,
"LIGHTS_ON" = LIGHTS_ON,
"SILICON_PILOT" = SILICON_PILOT,
"IS_ENCLOSED" = IS_ENCLOSED,
"HAS_LIGHTS" = HAS_LIGHTS,
"QUIET_STEPS" = QUIET_STEPS,
"QUIET_TURNS" = QUIET_TURNS,
"CANNOT_INTERACT" = CANNOT_INTERACT,
"MMI_COMPATIBLE" = MMI_COMPATIBLE,
"AI_COMPATIBLE" = AI_COMPATIBLE,
"OMNIDIRECTIONAL_ATTACKS" = OMNIDIRECTIONAL_ATTACKS,
"CANNOT_OVERPENETRATE" = CANNOT_OVERPENETRATE,
"BEACON_TRACKABLE" = BEACON_TRACKABLE,
"BEACON_CONTROLLABLE" = BEACON_CONTROLLABLE,
))
DEFINE_BITFIELD(mob_biotypes, list(
"MOB_BEAST" = MOB_BEAST,
"MOB_BUG" = MOB_BUG,
"MOB_HUMANOID" = MOB_HUMANOID,
"MOB_MINERAL" = MOB_MINERAL,
"MOB_ORGANIC" = MOB_ORGANIC,
"MOB_PLANT" = MOB_PLANT,
"MOB_REPTILE" = MOB_REPTILE,
"MOB_ROBOTIC" = MOB_ROBOTIC,
"MOB_SLIME" = MOB_SLIME,
"MOB_SPECIAL" = MOB_SPECIAL,
"MOB_SPIRIT" = MOB_SPIRIT,
"MOB_UNDEAD" = MOB_UNDEAD,
))
DEFINE_BITFIELD(mob_flags, list(
"MOB_HAS_SCREENTIPS_NAME_OVERRIDE" = MOB_HAS_SCREENTIPS_NAME_OVERRIDE,
))
DEFINE_BITFIELD(mob_respiration_type, list(
"RESPIRATION_OXYGEN" = RESPIRATION_OXYGEN,
"RESPIRATION_N2" = RESPIRATION_N2,
"RESPIRATION_PLASMA" = RESPIRATION_PLASMA,
))
DEFINE_BITFIELD(mobility_flags, list(
"MOVE" = MOBILITY_MOVE,
"PICKUP" = MOBILITY_PICKUP,
"PULL" = MOBILITY_PULL,
"STAND" = MOBILITY_STAND,
"STORAGE" = MOBILITY_STORAGE,
"UI" = MOBILITY_UI,
"USE" = MOBILITY_USE,
))
DEFINE_BITFIELD(movement_type, list(
"FLOATING" = FLOATING,
"FLYING" = FLYING,
"GROUND" = GROUND,
"PHASING" = PHASING,
"VENTCRAWLING" = VENTCRAWLING,
"UPSIDE_DOWN" = UPSIDE_DOWN,
))
DEFINE_BITFIELD(obj_flags, list(
"EMAGGED" = EMAGGED,
"CAN_BE_HIT" = CAN_BE_HIT,
"DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION,
"UNIQUE_RENAME" = UNIQUE_RENAME,
"BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN,
"BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP,
"BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN,
"BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP,
"BLOCKS_CONSTRUCTION" = BLOCKS_CONSTRUCTION,
"BLOCKS_CONSTRUCTION_DIR" = BLOCKS_CONSTRUCTION_DIR,
"IGNORE_DENSITY" = IGNORE_DENSITY,
"INFINITE_RESKIN" = INFINITE_RESKIN,
"CONDUCTS_ELECTRICITY" = CONDUCTS_ELECTRICITY,
"NO_DEBRIS_AFTER_DECONSTRUCTION" = NO_DEBRIS_AFTER_DECONSTRUCTION,
))
DEFINE_BITFIELD(pass_flags, list(
"LETPASSTHROW" = LETPASSTHROW,
"PASSBLOB" = PASSBLOB,
"PASSCLOSEDTURF" = PASSCLOSEDTURF,
"PASSGLASS" = PASSGLASS,
"PASSGRILLE" = PASSGRILLE,
"PASSMOB" = PASSMOB,
"PASSTABLE" = PASSTABLE,
"PASSWINDOW" = PASSWINDOW,
))
DEFINE_BITFIELD(resistance_flags, list(
"LAVA_PROOF" = LAVA_PROOF,
"FIRE_PROOF" = FIRE_PROOF,
"FLAMMABLE" = FLAMMABLE,
"ON_FIRE" = ON_FIRE,
"UNACIDABLE" = UNACIDABLE,
"ACID_PROOF" = ACID_PROOF,
"INDESTRUCTIBLE" = INDESTRUCTIBLE,
"FREEZE_PROOF" = FREEZE_PROOF,
"SHUTTLE_CRUSH_PROOF" = SHUTTLE_CRUSH_PROOF,
"BOMB_PROOF" = BOMB_PROOF,
))
DEFINE_BITFIELD(sight, list(
"BLIND" = BLIND,
"SEE_BLACKNESS" = SEE_BLACKNESS,
"SEE_INFRA" = SEE_INFRA,
"SEE_MOBS" = SEE_MOBS,
"SEE_OBJS" = SEE_OBJS,
"SEE_PIXELS" = SEE_PIXELS,
"SEE_SELF" = SEE_SELF,
"SEE_THRU" = SEE_THRU,
"SEE_TURFS" = SEE_TURFS,
))
DEFINE_BITFIELD(vis_flags, list(
"VIS_HIDE" = VIS_HIDE,
"VIS_INHERIT_DIR" = VIS_INHERIT_DIR,
"VIS_INHERIT_ICON" = VIS_INHERIT_ICON,
"VIS_INHERIT_ICON_STATE" = VIS_INHERIT_ICON_STATE,
"VIS_INHERIT_ID" = VIS_INHERIT_ID,
"VIS_INHERIT_LAYER" = VIS_INHERIT_LAYER,
"VIS_INHERIT_PLANE" = VIS_INHERIT_PLANE,
"VIS_UNDERLAY" = VIS_UNDERLAY,
))
DEFINE_BITFIELD(zap_flags, list(
"ZAP_ALLOW_DUPLICATES" = ZAP_ALLOW_DUPLICATES,
"ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE,
"ZAP_MOB_DAMAGE" = ZAP_MOB_DAMAGE,
"ZAP_MOB_STUN" = ZAP_MOB_STUN,
"ZAP_OBJ_DAMAGE" = ZAP_OBJ_DAMAGE,
"ZAP_GENERATES_POWER" = ZAP_GENERATES_POWER,
))
DEFINE_BITFIELD(chemical_flags, list(
"REAGENT_DEAD_PROCESS" = REAGENT_DEAD_PROCESS,
"REAGENT_DONOTSPLIT" = REAGENT_DONOTSPLIT,
"REAGENT_INVISIBLE" = REAGENT_INVISIBLE,
"REAGENT_SNEAKYNAME" = REAGENT_SNEAKYNAME,
"REAGENT_SPLITRETAINVOL" = REAGENT_SPLITRETAINVOL,
"REAGENT_CAN_BE_SYNTHESIZED" = REAGENT_CAN_BE_SYNTHESIZED,
"REAGENT_IGNORE_STASIS" = REAGENT_IGNORE_STASIS,
"REAGENT_NO_RANDOM_RECIPE" = REAGENT_NO_RANDOM_RECIPE,
"REAGENT_CLEANS" = REAGENT_CLEANS,
))
DEFINE_BITFIELD(reaction_flags, list(
"REACTION_CLEAR_IMPURE" = REACTION_CLEAR_IMPURE,
"REACTION_CLEAR_INVERSE" = REACTION_CLEAR_INVERSE,
"REACTION_CLEAR_RETAIN" = REACTION_CLEAR_RETAIN,
"REACTION_INSTANT" = REACTION_INSTANT,
"REACTION_HEAT_ARBITARY" = REACTION_HEAT_ARBITARY,
"REACTION_COMPETITIVE" = REACTION_COMPETITIVE,
"REACTION_PH_VOL_CONSTANT" = REACTION_PH_VOL_CONSTANT,
"REACTION_REAL_TIME_SPLIT" = REACTION_REAL_TIME_SPLIT,
))
DEFINE_BITFIELD(bodytype, list(
"BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC,
"BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC,
"BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER,
"BODYTYPE_ALIEN" = BODYTYPE_ALIEN,
"BODYTYPE_GOLEM" = BODYTYPE_GOLEM,
"BODYTYPE_PEG" = BODYTYPE_PEG,
))
DEFINE_BITFIELD(acceptable_bodytype, list(
"BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC,
"BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC,
"BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER,
"BODYTYPE_ALIEN" = BODYTYPE_ALIEN,
"BODYTYPE_GOLEM" = BODYTYPE_GOLEM,
"BODYTYPE_PEG" = BODYTYPE_PEG,
))
DEFINE_BITFIELD(bodyshape, list(
"BODYSHAPE_HUMANOID" = BODYSHAPE_HUMANOID,
"BODYSHAPE_MONKEY" = BODYSHAPE_MONKEY,
"BODYSHAPE_DIGITIGRADE" = BODYSHAPE_DIGITIGRADE,
"BODYSHAPE_SNOUTED" = BODYSHAPE_SNOUTED,
))
DEFINE_BITFIELD(acceptable_bodyshape, list(
"BODYSHAPE_HUMANOID" = BODYSHAPE_HUMANOID,
"BODYSHAPE_MONKEY" = BODYSHAPE_MONKEY,
"BODYSHAPE_DIGITIGRADE" = BODYSHAPE_DIGITIGRADE,
"BODYSHAPE_SNOUTED" = BODYSHAPE_SNOUTED,
))
DEFINE_BITFIELD(bodypart_flags, list(
"BODYPART_UNREMOVABLE" = BODYPART_UNREMOVABLE,
"BODYPART_PSEUDOPART" = BODYPART_PSEUDOPART,
"BODYPART_IMPLANTED" = BODYPART_IMPLANTED,
))
DEFINE_BITFIELD(change_exempt_flags, list(
"BP_BLOCK_CHANGE_SPECIES" = BP_BLOCK_CHANGE_SPECIES,
))
DEFINE_BITFIELD(head_flags, list(
"HEAD_HAIR" = HEAD_HAIR,
"HEAD_FACIAL_HAIR" = HEAD_FACIAL_HAIR,
"HEAD_LIPS" = HEAD_LIPS,
"HEAD_EYESPRITES" = HEAD_EYESPRITES,
"HEAD_EYECOLOR" = HEAD_EYECOLOR,
"HEAD_EYEHOLES" = HEAD_EYEHOLES,
"HEAD_DEBRAIN" = HEAD_DEBRAIN,
))
DEFINE_BITFIELD(supports_variations_flags, list(
"CLOTHING_NO_VARIATION" = CLOTHING_NO_VARIATION,
"CLOTHING_DIGITIGRADE_VARIATION" = CLOTHING_DIGITIGRADE_VARIATION,
"CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON" = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON,
"CLOTHING_DIGITIGRADE_MASK" = CLOTHING_DIGITIGRADE_MASK,
))
DEFINE_BITFIELD(flora_flags, list(
"FLORA_HERBAL" = FLORA_HERBAL,
"FLORA_WOODEN" = FLORA_WOODEN,
"FLORA_STONE" = FLORA_STONE,
))
DEFINE_BITFIELD(emote_flags, list(
"EMOTE_AUDIBLE" = EMOTE_AUDIBLE,
"EMOTE_VISIBLE" = EMOTE_VISIBLE,
"EMOTE_IMPORTANT" = EMOTE_IMPORTANT,
))
DEFINE_BITFIELD(organ_flags, list(
"ORGAN_ORGANIC" = ORGAN_ORGANIC,
"ORGAN_ROBOTIC" = ORGAN_ROBOTIC,
"ORGAN_MINERAL" = ORGAN_MINERAL,
"ORGAN_FROZEN" = ORGAN_FROZEN,
"ORGAN_FAILING" = ORGAN_FAILING,
"ORGAN_EMP" = ORGAN_EMP,
"ORGAN_VITAL" = ORGAN_VITAL,
"ORGAN_EDIBLE" = ORGAN_EDIBLE,
"ORGAN_UNREMOVABLE" = ORGAN_UNREMOVABLE,
"ORGAN_HIDDEN" = ORGAN_HIDDEN,
"ORGAN_VIRGIN" = ORGAN_VIRGIN,
))
DEFINE_BITFIELD(respiration_type, list(
"RESPIRATION_OXYGEN" = RESPIRATION_OXYGEN,
"RESPIRATION_N2" = RESPIRATION_N2,
"RESPIRATION_PLASMA" = RESPIRATION_PLASMA,
))
DEFINE_BITFIELD(liked_foodtypes, list(
"MEAT" = MEAT,
"VEGETABLES" = VEGETABLES,
"RAW" = RAW,
"JUNKFOOD" = JUNKFOOD,
"GRAIN" = GRAIN,
"FRUIT" = FRUIT,
"DAIRY" = DAIRY,
"FRIED" = FRIED,
"ALCOHOL" = ALCOHOL,
"SUGAR" = SUGAR,
"GROSS" = GROSS,
"TOXIC" = TOXIC,
"PINEAPPLE" = PINEAPPLE,
"BREAKFAST" = BREAKFAST,
"CLOTH" = CLOTH,
"NUTS" = NUTS,
"SEAFOOD" = SEAFOOD,
"ORANGES" = ORANGES,
"BUGS" = BUGS,
"GORE" = GORE,
"STONE" = STONE,
))
DEFINE_BITFIELD(disliked_foodtypes, list(
"MEAT" = MEAT,
"VEGETABLES" = VEGETABLES,
"RAW" = RAW,
"JUNKFOOD" = JUNKFOOD,
"GRAIN" = GRAIN,
"FRUIT" = FRUIT,
"DAIRY" = DAIRY,
"FRIED" = FRIED,
"ALCOHOL" = ALCOHOL,
"SUGAR" = SUGAR,
"GROSS" = GROSS,
"TOXIC" = TOXIC,
"PINEAPPLE" = PINEAPPLE,
"BREAKFAST" = BREAKFAST,
"CLOTH" = CLOTH,
"NUTS" = NUTS,
"SEAFOOD" = SEAFOOD,
"ORANGES" = ORANGES,
"BUGS" = BUGS,
"GORE" = GORE,
"STONE" = STONE,
))
DEFINE_BITFIELD(toxic_foodtypes, list(
"MEAT" = MEAT,
"VEGETABLES" = VEGETABLES,
"RAW" = RAW,
"JUNKFOOD" = JUNKFOOD,
"GRAIN" = GRAIN,
"FRUIT" = FRUIT,
"DAIRY" = DAIRY,
"FRIED" = FRIED,
"ALCOHOL" = ALCOHOL,
"SUGAR" = SUGAR,
"GROSS" = GROSS,
"TOXIC" = TOXIC,
"PINEAPPLE" = PINEAPPLE,
"BREAKFAST" = BREAKFAST,
"CLOTH" = CLOTH,
"NUTS" = NUTS,
"SEAFOOD" = SEAFOOD,
"ORANGES" = ORANGES,
"BUGS" = BUGS,
"GORE" = GORE,
"STONE" = STONE,
))
DEFINE_BITFIELD(sharpness, list(
"SHARP_EDGED" = SHARP_EDGED,
"SHARP_POINTY" = SHARP_POINTY,
))
DEFINE_BITFIELD(gun_flags, list(
"NOT_A_REAL_GUN" = NOT_A_REAL_GUN,
"TOY_FIREARM_OVERLAY" = TOY_FIREARM_OVERLAY,
"TURRET_INCOMPATIBLE" = TURRET_INCOMPATIBLE,
))
DEFINE_BITFIELD(fish_flags, list(
"FISH_FLAG_SHOW_IN_CATALOG" = FISH_FLAG_SHOW_IN_CATALOG,
"FISH_DO_FLOP_ANIM" = FISH_DO_FLOP_ANIM,
"FISH_FLAG_PETTED" = FISH_FLAG_PETTED,
"FISH_FLAG_EXPERIMENT_SCANNABLE" = FISH_FLAG_EXPERIMENT_SCANNABLE,
"FISH_FLAG_UPDATING_SIZE_AND_WEIGHT" = FISH_FLAG_OVERPOPULATED,
"FISH_FLAG_SAFE_TEMPERATURE" = FISH_FLAG_SAFE_TEMPERATURE,
"FISH_FLAG_SAFE_FLUID" = FISH_FLAG_SAFE_FLUID,
))
DEFINE_BITFIELD(bot_mode_flags, list(
"POWER_ON" = BOT_MODE_ON,
"AUTO_PATROL" = BOT_MODE_AUTOPATROL,
"REMOTE_CONTROL" = BOT_MODE_REMOTE_ENABLED,
"SAPIENCE_ALLOWED" = BOT_MODE_CAN_BE_SAPIENT,
"STARTS_POSSESSABLE" = BOT_MODE_ROUNDSTART_POSSESSION,
))
DEFINE_BITFIELD(construction_upgrades, list(
"RCD_UPGRADE_FRAMES" = RCD_UPGRADE_FRAMES,
"RCD_UPGRADE_SIMPLE_CIRCUITS" = RCD_UPGRADE_SIMPLE_CIRCUITS,
"RCD_UPGRADE_SILO_LINK" = RCD_UPGRADE_SILO_LINK,
"RCD_UPGRADE_FURNISHING" = RCD_UPGRADE_FURNISHING,
"RCD_UPGRADE_ANTI_INTERRUPT" = RCD_UPGRADE_ANTI_INTERRUPT,
"RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN" = RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN,
))
DEFINE_BITFIELD(weather_flags, list(
"WEATHER_TURFS" = WEATHER_TURFS,
"WEATHER_MOBS" = WEATHER_MOBS,
"WEATHER_THUNDER" = WEATHER_THUNDER,
"WEATHER_INDOORS" = WEATHER_INDOORS,
"WEATHER_ENDLESS" = WEATHER_ENDLESS,
"WEATHER_BAROMETER" = WEATHER_BAROMETER,
"WEATHER_TEMPERATURE_BYPASS_CLOTHING" = WEATHER_TEMPERATURE_BYPASS_CLOTHING,
))