#include "enums.h" #include "scripting/ade.h" namespace scripting { namespace api { //**********OBJECT: constant class //WMC NOTE - //While you can have enumeration indexes in any order, make sure //that any new enumerations have indexes of NEXT INDEX (see below) //or after. Don't forget to increment NEXT INDEX after you're done. //===================================== //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // clang-format off flag_def_list Enumerations[] = { {"ALPHABLEND_FILTER", LE_ALPHABLEND_FILTER, 0}, {"ALPHABLEND_NONE", LE_ALPHABLEND_NONE, 0}, {"CFILE_TYPE_NORMAL", LE_CFILE_TYPE_NORMAL, 0}, {"CFILE_TYPE_MEMORY_MAPPED", LE_CFILE_TYPE_MEMORY_MAPPED, 0}, {"MOUSE_LEFT_BUTTON", LE_MOUSE_LEFT_BUTTON, 0}, {"MOUSE_RIGHT_BUTTON", LE_MOUSE_RIGHT_BUTTON, 0}, {"MOUSE_MIDDLE_BUTTON", LE_MOUSE_MIDDLE_BUTTON, 0}, {"ORDER_ATTACK", LE_ORDER_ATTACK, 0}, {"ORDER_ATTACK_ANY", LE_ORDER_ATTACK_ANY, 0}, {"ORDER_DEPART", LE_ORDER_DEPART, 0}, {"ORDER_DISABLE", LE_ORDER_DISABLE, 0}, {"ORDER_DISARM", LE_ORDER_DISARM, 0}, {"ORDER_DOCK", LE_ORDER_DOCK, 0}, {"ORDER_EVADE", LE_ORDER_EVADE, 0}, {"ORDER_FLY_TO", LE_ORDER_FLY_TO, 0}, {"ORDER_FORM_ON_WING", LE_ORDER_FORM_ON_WING, 0}, {"ORDER_GUARD", LE_ORDER_GUARD, 0}, {"ORDER_IGNORE_SHIP", LE_ORDER_IGNORE, 0}, {"ORDER_KEEP_SAFE_DISTANCE", LE_ORDER_KEEP_SAFE_DISTANCE, 0}, {"ORDER_PLAY_DEAD", LE_ORDER_PLAY_DEAD, 0}, {"ORDER_PLAY_DEAD_PERSISTENT", LE_ORDER_PLAY_DEAD_PERSISTENT, 0}, {"ORDER_REARM", LE_ORDER_REARM, 0}, {"ORDER_STAY_NEAR", LE_ORDER_STAY_NEAR, 0}, {"ORDER_STAY_STILL", LE_ORDER_STAY_STILL, 0}, {"ORDER_UNDOCK", LE_ORDER_UNDOCK, 0}, {"ORDER_WAYPOINTS", LE_ORDER_WAYPOINTS, 0}, {"ORDER_WAYPOINTS_ONCE", LE_ORDER_WAYPOINTS_ONCE, 0}, {"ORDER_ATTACK_WING", LE_ORDER_ATTACK_WING, 0}, {"ORDER_GUARD_WING", LE_ORDER_GUARD_WING, 0}, {"ORDER_ATTACK_SHIP_CLASS", LE_ORDER_ATTACK_SHIP_CLASS, 0}, {"PARTICLE_DEBUG", LE_PARTICLE_DEBUG, 0}, {"PARTICLE_BITMAP", LE_PARTICLE_BITMAP, 0}, {"PARTICLE_FIRE", LE_PARTICLE_FIRE, 0}, {"PARTICLE_SMOKE", LE_PARTICLE_SMOKE, 0}, {"PARTICLE_SMOKE2", LE_PARTICLE_SMOKE2, 0}, {"PARTICLE_PERSISTENT_BITMAP", LE_PARTICLE_PERSISTENT_BITMAP, 0}, {"SEXPVAR_CAMPAIGN_PERSISTENT", LE_SEXPVAR_CAMPAIGN_PERSISTENT, 0}, {"SEXPVAR_NOT_PERSISTENT", LE_SEXPVAR_NOT_PERSISTENT, 0}, {"SEXPVAR_PLAYER_PERSISTENT", LE_SEXPVAR_PLAYER_PERSISTENT, 0}, {"SEXPVAR_TYPE_NUMBER", LE_SEXPVAR_TYPE_NUMBER, 0}, {"SEXPVAR_TYPE_STRING", LE_SEXPVAR_TYPE_STRING, 0}, {"TEXTURE_STATIC", LE_TEXTURE_STATIC, 0}, {"TEXTURE_DYNAMIC", LE_TEXTURE_DYNAMIC, 0}, {"LOCK", LE_LOCK, 0}, {"UNLOCK", LE_UNLOCK, 0}, {"NONE", LE_NONE, 0}, {"SHIELD_FRONT", LE_SHIELD_FRONT, 0}, {"SHIELD_LEFT", LE_SHIELD_LEFT, 0}, {"SHIELD_RIGHT", LE_SHIELD_RIGHT, 0}, {"SHIELD_BACK", LE_SHIELD_BACK, 0}, {"MISSION_REPEAT", LE_MISSION_REPEAT, 0}, {"NORMAL_CONTROLS", LE_NORMAL_CONTROLS, 0}, {"LUA_STEERING_CONTROLS", LE_LUA_STEERING_CONTROLS, 0}, {"LUA_FULL_CONTROLS", LE_LUA_FULL_CONTROLS, 0}, {"NORMAL_BUTTON_CONTROLS", LE_NORMAL_BUTTON_CONTROLS, 0}, {"LUA_ADDITIVE_BUTTON_CONTROL", LE_LUA_ADDITIVE_BUTTON_CONTROL, 0}, {"LUA_OVERRIDE_BUTTON_CONTROL", LE_LUA_OVERRIDE_BUTTON_CONTROL, 0}, {"VM_INTERNAL", LE_VM_INTERNAL, 0}, {"VM_EXTERNAL", LE_VM_EXTERNAL, 0}, {"VM_TRACK", LE_VM_TRACK, 0}, {"VM_DEAD_VIEW", LE_VM_DEAD_VIEW, 0}, {"VM_CHASE", LE_VM_CHASE, 0}, {"VM_OTHER_SHIP", LE_VM_OTHER_SHIP, 0}, {"VM_EXTERNAL_CAMERA_LOCKED", LE_VM_EXTERNAL_CAMERA_LOCKED, 0}, {"VM_CAMERA_LOCKED", LE_VM_CAMERA_LOCKED, 0}, {"VM_WARP_CHASE", LE_VM_WARP_CHASE, 0}, {"VM_PADLOCK_UP", LE_VM_PADLOCK_UP, 0}, {"VM_PADLOCK_REAR", LE_VM_PADLOCK_REAR, 0}, {"VM_PADLOCK_LEFT", LE_VM_PADLOCK_LEFT, 0}, {"VM_PADLOCK_RIGHT", LE_VM_PADLOCK_RIGHT, 0}, {"VM_WARPIN_ANCHOR", LE_VM_WARPIN_ANCHOR, 0}, {"VM_TOPDOWN", LE_VM_TOPDOWN, 0}, {"VM_FREECAMERA", LE_VM_FREECAMERA, 0}, {"VM_CENTERING", LE_VM_CENTERING, 0}, {"MESSAGE_PRIORITY_LOW", LE_MESSAGE_PRIORITY_LOW, 0}, {"MESSAGE_PRIORITY_NORMAL", LE_MESSAGE_PRIORITY_NORMAL, 0}, {"MESSAGE_PRIORITY_HIGH", LE_MESSAGE_PRIORITY_HIGH, 0}, {"OPTION_TYPE_SELECTION", LE_OPTION_TYPE_SELECTION, 0}, {"OPTION_TYPE_RANGE", LE_OPTION_TYPE_RANGE, 0}, {"AUDIOSTREAM_EVENTMUSIC", LE_ASF_EVENTMUSIC, 0}, {"AUDIOSTREAM_MENUMUSIC", LE_ASF_MENUMUSIC, 0}, {"AUDIOSTREAM_VOICE", LE_ASF_VOICE, 0}, {"CONTEXT_VALID", LE_CONTEXT_VALID, 0}, {"CONTEXT_SUSPENDED", LE_CONTEXT_SUSPENDED, 0}, {"CONTEXT_INVALID", LE_CONTEXT_INVALID, 0}, }; // clang-format on //DO NOT FORGET to increment NEXT INDEX: !!!!!!!!!!!!! size_t Num_enumerations = sizeof(Enumerations) / sizeof(flag_def_list); enum_h::enum_h() { index = -1; is_constant = false; } enum_h::enum_h(int n_index) { index = n_index; is_constant = false; } SCP_string enum_h::getName() const { for (size_t i = 0; i < Num_enumerations; i++) { if (Enumerations[i].def == index) { return Enumerations[i].name; } } return SCP_string(); } bool enum_h::IsValid() const { return (index > -1 && index < ENUM_NEXT_INDEX); } ADE_OBJ(l_Enum, enum_h, "enumeration", "Enumeration object"); ADE_FUNC(__newindex, l_Enum, "enumeration", "Sets enumeration to specified value (if it is not a global", "enumeration", "enumeration") { enum_h* e1 = NULL, * e2 = NULL; if (!ade_get_args(L, "oo", l_Enum.GetPtr(&e1), l_Enum.GetPtr(&e2))) { return ade_set_error(L, "o", l_Enum.Set(enum_h())); } if (!e1->is_constant) { e1->index = e2->index; } return ade_set_args(L, "o", l_Enum.Set(*e1)); } ADE_FUNC(__tostring, l_Enum, NULL, "Returns enumeration name", "string", "Enumeration name, or \"\" if invalid") { enum_h* e = NULL; if (!ade_get_args(L, "o", l_Enum.GetPtr(&e))) { return ade_set_args(L, "s", ""); } if (e->index < 1 || e->index >= ENUM_NEXT_INDEX) { return ade_set_args(L, "s", ""); } const auto name = e->getName(); if (name.empty()) { return ade_set_args(L, "s", ""); } return ade_set_args(L, "s", name); } ADE_FUNC(__eq, l_Enum, "enumeration", "Compares the two enumerations for equality", "boolean", "true if equal, false otherwise") { enum_h* e1 = NULL; enum_h* e2 = NULL; if (!ade_get_args(L, "oo", l_Enum.GetPtr(&e1), l_Enum.GetPtr(&e2))) { return ade_set_error(L, "o", l_Enum.Set(enum_h())); } if (e1 == NULL || e2 == NULL) { return ADE_RETURN_FALSE; } return ade_set_args(L, "b", e1->index == e2->index); } } }