Files
Mike NelsonandJohn Fernandez 880bfb11a7 Upgrade lua enumeration handling (#7423)
* upgrade lua enumeration handling

* some cleanup

* add lua enum descriptions

* minor fixes

* Update code/scripting/api/objs/enums.cpp

Co-authored-by: John Fernandez <[email protected]>

* include name

---------

Co-authored-by: John Fernandez <[email protected]>
2026-06-05 11:33:42 +02:00

157 lines
4.7 KiB
C++

//
//
#include "fireball/fireballs.h"
#include "fireball.h"
#include "object.h"
#include "fireballclass.h"
#include "enums.h"
namespace scripting {
namespace api {
//**********HANDLE: Fireball
ADE_OBJ_DERIV(l_Fireball, object_h, "fireball", "Fireball handle", l_Object);
ADE_VIRTVAR(Class, l_Fireball, "fireballclass", "Fireball's class", "fireballclass", "Fireball class, or invalid fireballclass handle if fireball handle is invalid")
{
object_h *oh=NULL;
int nc=-1;
if(!ade_get_args(L, "o|o", l_Fireball.GetPtr(&oh), l_Fireballclass.Get(&nc)))
return ade_set_error(L, "o", l_Fireballclass.Set(-1));
if(!oh->isValid())
return ade_set_error(L, "o", l_Fireballclass.Set(-1));
if (oh->objp()->instance < 0 || oh->objp()->instance >= static_cast<int>(Fireballs.size()))
return ade_set_error(L, "o", l_Fireballclass.Set(-1));
fireball *fb = &Fireballs[oh->objp()->instance];
if(ADE_SETTING_VAR && nc > -1) {
fb->fireball_info_index = nc;
}
return ade_set_args(L, "o", l_Fireballclass.Set(fb->fireball_info_index));
}
ADE_VIRTVAR(RenderType, l_Fireball, "enumeration", "Fireball's render type; uses FIREBALL_* enumerations.", "enumeration", "Fireball render type as a FIREBALL_* enumeration, or handle to invalid enum if fireball handle is invalid or a bad enum was given")
{
object_h* oh = NULL;
enum_h type;
if (!ade_get_args(L, "o|o", l_Fireball.GetPtr(&oh), l_Enum.Get(&type)))
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
if (!oh->isValid())
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
if (oh->objp()->instance < 0 || oh->objp()->instance >= static_cast<int>(Fireballs.size()))
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
fireball* fb = &Fireballs[oh->objp()->instance];
if (ADE_SETTING_VAR && type.isValid()) {
int nt = -1;
switch (type.index) {
case LE_FIREBALL_MEDIUM_EXPLOSION:
nt = FIREBALL_MEDIUM_EXPLOSION;
break;
case LE_FIREBALL_LARGE_EXPLOSION:
nt = FIREBALL_LARGE_EXPLOSION;
break;
case LE_FIREBALL_WARP_EFFECT:
nt = FIREBALL_WARP_EFFECT;
break;
default:
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
break;
}
fb->fireball_render_type = nt;
}
switch (fb->fireball_render_type) {
case FIREBALL_MEDIUM_EXPLOSION:
return ade_set_args(L, "o", l_Enum.Set(enum_h(LE_FIREBALL_MEDIUM_EXPLOSION)));
case FIREBALL_LARGE_EXPLOSION:
return ade_set_args(L, "o", l_Enum.Set(enum_h(LE_FIREBALL_LARGE_EXPLOSION)));
case FIREBALL_WARP_EFFECT:
return ade_set_args(L, "o", l_Enum.Set(enum_h(LE_FIREBALL_WARP_EFFECT)));
}
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
}
ADE_VIRTVAR(TimeElapsed, l_Fireball, NULL, "Time this fireball exists in seconds", "number", "Time this fireball exists or 0 if fireball handle is invalid")
{
object_h *oh=NULL;
float nll = -1.0f;
if(!ade_get_args(L, "o", l_Fireball.GetPtr(&oh), &nll))
return ade_set_error(L, "f", 0.0f);
if(!oh->isValid())
return ade_set_error(L, "f", 0.0f);
if (oh->objp()->instance < 0 || oh->objp()->instance <= static_cast<int>(Fireballs.size()))
return ade_set_error(L, "f", 0.0f);
fireball *fb = &Fireballs[oh->objp()->instance];
return ade_set_args(L, "f", fb->time_elapsed);
}
ADE_VIRTVAR(TotalTime, l_Fireball, NULL, "Total lifetime of the fireball's animation in seconds", "number", "Total lifetime of the fireball's animation or 0 if fireball handle is invalid")
{
object_h* oh = NULL;
float nll = -1.0f;
if (!ade_get_args(L, "o", l_Fireball.GetPtr(&oh), &nll))
return ade_set_error(L, "f", 0.0f);
if (!oh->isValid())
return ade_set_error(L, "f", 0.0f);
if (oh->objp()->instance < 0 || oh->objp()->instance >= static_cast<int>(Fireballs.size()))
return ade_set_error(L, "f", 0.0f);
fireball* fb = &Fireballs[oh->objp()->instance];
return ade_set_args(L, "f", fb->total_time);
}
ADE_FUNC(isWarp, l_Fireball, NULL, "Checks if the fireball is a warp effect.", "boolean", "boolean value of the fireball warp status or false if the handle is invalid")
{
object_h *oh = NULL;
if(!ade_get_args(L, "o", l_Fireball.GetPtr(&oh)))
return ADE_RETURN_FALSE;
if(!oh->isValid())
return ADE_RETURN_FALSE;
if(fireball_is_warp(oh->objp()))
return ADE_RETURN_TRUE;
return ADE_RETURN_FALSE;
}
ADE_FUNC(vanish, l_Fireball, nullptr, "Vanishes this fireball from the mission.", "boolean", "True if the deletion was successful, false otherwise.")
{
object_h* oh = nullptr;
if (!ade_get_args(L, "o", l_Fireball.GetPtr(&oh)))
return ade_set_error(L, "b", false);
if (!oh->isValid())
return ade_set_error(L, "b", false);
//Should be sufficient for Fireballs, as the fireball internal functions also call this, for example to free up a fireball if the limit is reached
obj_delete(oh->objnum);
return ade_set_args(L, "b", true);
}
}
}