Files
fs2open.github.com/code/scripting/api/objs/enums.cpp
T
asarium 8fcb05bfd0 Add scripting API for custom execution context
This allows a script to create its own execution context so that it can
control when a coroutine is valid to play based on custom data.

Also adds a function which causes a coroutine to end in an error.
2020-08-11 09:38:39 +02:00

196 lines
6.2 KiB
C++

#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 \"<INVALID>\" if invalid") {
enum_h* e = NULL;
if (!ade_get_args(L, "o", l_Enum.GetPtr(&e))) {
return ade_set_args(L, "s", "<INVALID>");
}
if (e->index < 1 || e->index >= ENUM_NEXT_INDEX) {
return ade_set_args(L, "s", "<INVALID>");
}
const auto name = e->getName();
if (name.empty()) {
return ade_set_args(L, "s", "<INVALID>");
}
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);
}
}
}