Add CreateEmpty, so that new can be called on the Lua side with no args.

Change pos and rot from arrays to GameScript[Position/Rotation].

Add getters and setters for the members used so far.

Add Init, which for now is needed to get an item working properly.
This commit is contained in:
hispidence 2021-06-30 14:08:12 +01:00
parent a507e9e1be
commit d225041048
2 changed files with 247 additions and 37 deletions

View file

@ -3,48 +3,80 @@
#include "items.h" #include "items.h"
#include "objectslist.h" #include "objectslist.h"
#include "level.h" #include "level.h"
#include "GameScriptPosition.h"
#include "GameScriptRotation.h"
void GameScriptItemInfo::Register(sol::state * state) void GameScriptItemInfo::Register(sol::state * state)
{ {
state->new_usertype<GameScriptItemInfo>("ItemInfo", state->new_usertype<GameScriptItemInfo>("ItemInfo",
"new", sol::factories(&GameScriptItemInfo::Create)); "new", sol::overload(&GameScriptItemInfo::Create, &GameScriptItemInfo::CreateEmpty),
} "Init", &GameScriptItemInfo::Init,
"GetPos", &GameScriptItemInfo::GetPos,
"GetRot", &GameScriptItemInfo::GetRot,
"GetCurrentAnim", &GameScriptItemInfo::GetCurrentAnim,
"GetRequiredAnim", &GameScriptItemInfo::GetRequiredAnim,
"GetHP", &GameScriptItemInfo::GetHP,
"GetOCB", &GameScriptItemInfo::GetOCB,
"GetItemFlags", &GameScriptItemInfo::GetItemFlags,
"GetAIBits", &GameScriptItemInfo::GetAIBits,
"GetStatus", &GameScriptItemInfo::GetStatus,
"GetHitStatus", &GameScriptItemInfo::GetHitStatus,
"GetActive", &GameScriptItemInfo::GetActive,
"SetPos", &GameScriptItemInfo::SetPos,
"SetRot", &GameScriptItemInfo::SetRot,
"SetCurrentAnim", &GameScriptItemInfo::SetCurrentAnim,
"SetRequiredAnim", &GameScriptItemInfo::SetRequiredAnim,
"SetHP", &GameScriptItemInfo::SetHP,
"SetOCB", &GameScriptItemInfo::SetOCB,
"SetItemFlags", &GameScriptItemInfo::SetItemFlags,
"SetAIBits", &GameScriptItemInfo::SetAIBits,
"SetStatus", &GameScriptItemInfo::SetStatus,
"SetHitStatus", &GameScriptItemInfo::SetHitStatus,
"SetActive", &GameScriptItemInfo::SetActive);
}
std::unique_ptr<GameScriptItemInfo> GameScriptItemInfo::Create( std::unique_ptr<GameScriptItemInfo> GameScriptItemInfo::CreateEmpty()
short hp,
short currentAnim,
short requiredAnimState,
sol::as_table_t<std::array<int, 3>> pos,
sol::as_table_t<std::array<short, 3>> rot,
sol::as_table_t<std::array<short, 8>> itemFlags,
short ocb,
byte aiBits,
short status,
bool active,
bool hitStatus)
{ {
short num = CreateItem(); short num = CreateItem();
ITEM_INFO * item = &g_Level.Items[num]; ITEM_INFO * item = &g_Level.Items[num];
item->objectNumber = ID_SMALLMEDI_ITEM;
auto p = pos.value(); return std::make_unique<GameScriptItemInfo>(num);
auto r = rot.value(); }
std::unique_ptr<GameScriptItemInfo> GameScriptItemInfo::Create(
GameScriptPosition pos,
GameScriptRotation rot,
short currentAnim,
short requiredAnim,
short hp,
short ocb,
sol::as_table_t<std::array<short, 8>> itemFlags,
byte aiBits,
short status,
bool active,
bool hitStatus
)
{
short num = CreateItem();
ITEM_INFO * item = &g_Level.Items[num];
item->pos = PHD_3DPOS( item->pos = PHD_3DPOS(
p[0], pos.GetX(),
p[1], pos.GetY(),
p[2], pos.GetZ(),
r[0], rot.GetX(),
r[1], rot.GetY(),
r[2] rot.GetZ()
); );
//make it a big medipack by default for now //make it a big medipack by default for now
item->objectNumber = ID_BIGMEDI_ITEM; item->objectNumber = ID_BIGMEDI_ITEM;
InitialiseItem(num); InitialiseItem(num);
item->hitPoints = hp;
item->currentAnimState = currentAnim; item->currentAnimState = currentAnim;
item->requiredAnimState = requiredAnimState; item->requiredAnimState = requiredAnim;
memcpy(item->itemFlags, itemFlags.value().data(), sizeof(item->itemFlags)); memcpy(item->itemFlags, itemFlags.value().data(), sizeof(item->itemFlags));
item->hitPoints = hp;
item->triggerFlags = ocb; item->triggerFlags = ocb;
item->aiBits = aiBits; item->aiBits = aiBits;
item->status = status; item->status = status;
@ -54,8 +86,157 @@ std::unique_ptr<GameScriptItemInfo> GameScriptItemInfo::Create(
return std::make_unique<GameScriptItemInfo>(num); return std::make_unique<GameScriptItemInfo>(num);
} }
void GameScriptItemInfo::Init()
{
InitialiseItem(m_num);
}
GameScriptPosition GameScriptItemInfo::GetPos() const
{
ITEM_INFO * item = &g_Level.Items[m_num];
return GameScriptPosition( item->pos.xPos,
item->pos.yPos,
item->pos.zPos);
}
GameScriptRotation GameScriptItemInfo::GetRot() const
{
ITEM_INFO * item = &g_Level.Items[m_num];
return GameScriptRotation( item->pos.xRot,
item->pos.yRot,
item->pos.zRot);
}
short GameScriptItemInfo::GetHP() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
return(item->hitPoints);
}
short GameScriptItemInfo::GetOCB() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
return item->triggerFlags;
}
byte GameScriptItemInfo::GetAIBits() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
return item->aiBits;
}
sol::as_table_t<std::array<short, 8>> GameScriptItemInfo::GetItemFlags() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
std::array<short, 8> ret;
memcpy(ret.data(), item->itemFlags, sizeof(item->itemFlags));
return ret;
}
short GameScriptItemInfo::GetCurrentAnim() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
return item->currentAnimState;
}
short GameScriptItemInfo::GetRequiredAnim() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
return item->requiredAnimState;
}
short GameScriptItemInfo::GetStatus() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
return item->status;
}
bool GameScriptItemInfo::GetHitStatus() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
return item->hitStatus;
}
bool GameScriptItemInfo::GetActive() const
{
ITEM_INFO* item = &g_Level.Items[m_num];
return item->active;
}
void GameScriptItemInfo::SetPos(GameScriptPosition const& pos)
{
ITEM_INFO * item = &g_Level.Items[m_num];
item->pos.xPos = pos.x;
item->pos.yPos = pos.y;
item->pos.zPos = pos.z;
}
void GameScriptItemInfo::SetRot(GameScriptRotation const& rot)
{
ITEM_INFO * item = &g_Level.Items[m_num];
item->pos.xRot = rot.GetX();
item->pos.yRot = rot.GetY();
item->pos.zRot = rot.GetZ();
}
void GameScriptItemInfo::SetHP(short hp)
{
ITEM_INFO* item = &g_Level.Items[m_num];
item->hitPoints = hp;
}
void GameScriptItemInfo::SetOCB(short ocb)
{
ITEM_INFO* item = &g_Level.Items[m_num];
item->triggerFlags = ocb;
}
void GameScriptItemInfo::SetAIBits(byte bits)
{
ITEM_INFO* item = &g_Level.Items[m_num];
item->aiBits = bits;
}
void GameScriptItemInfo::SetItemFlags(sol::as_table_t<std::array<short, 8>> const& arr)
{
ITEM_INFO* item = &g_Level.Items[m_num];
memcpy(item->itemFlags, arr.value().data(), sizeof(item->itemFlags));
}
void GameScriptItemInfo::SetCurrentAnim(short anim)
{
ITEM_INFO* item = &g_Level.Items[m_num];
item->currentAnimState = anim;
}
void GameScriptItemInfo::SetRequiredAnim(short anim)
{
ITEM_INFO* item = &g_Level.Items[m_num];
item->requiredAnimState = anim;
}
void GameScriptItemInfo::SetStatus(short status)
{
ITEM_INFO* item = &g_Level.Items[m_num];
item->status = status;
}
void GameScriptItemInfo::SetHitStatus(bool hitStatus)
{
ITEM_INFO* item = &g_Level.Items[m_num];
item->hitStatus = hitStatus;
}
void GameScriptItemInfo::SetActive(bool active)
{
ITEM_INFO* item = &g_Level.Items[m_num];
item->active = active;
}
GameScriptItemInfo::GameScriptItemInfo(short num) : m_num{ num } {}; GameScriptItemInfo::GameScriptItemInfo(short num) : m_num{ num } {};
// todo.. how to check if item is killed outside of script?
GameScriptItemInfo::~GameScriptItemInfo() { GameScriptItemInfo::~GameScriptItemInfo() {
KillItem(m_num); KillItem(m_num);
} }

View file

@ -2,8 +2,10 @@
namespace sol { namespace sol {
class state; class state;
template <typename T> class as_table_t; template <typename T> struct as_table_t;
} }
class GameScriptPosition;
class GameScriptRotation;
class GameScriptItemInfo class GameScriptItemInfo
{ {
@ -15,16 +17,43 @@ public:
GameScriptItemInfo& operator=(GameScriptItemInfo const& other) = delete; GameScriptItemInfo& operator=(GameScriptItemInfo const& other) = delete;
GameScriptItemInfo(GameScriptItemInfo const& other) = delete; GameScriptItemInfo(GameScriptItemInfo const& other) = delete;
static void Register(sol::state *); static void Register(sol::state *);
static std::unique_ptr<GameScriptItemInfo> CreateEmpty();
static std::unique_ptr<GameScriptItemInfo> Create( static std::unique_ptr<GameScriptItemInfo> Create(
short hp, GameScriptPosition pos,
short currentAnim, GameScriptRotation aRot,
short requiredAnimState, short aCurrentAnim,
sol::as_table_t<std::array<int, 3>> pos, short aRequiredAnim,
sol::as_table_t<std::array<short, 3>> rot, short aHp,
sol::as_table_t<std::array<short, 8>> itemFlags, short aOcb,
short ocb, sol::as_table_t<std::array<short, 8>> aFlags,
byte aiBits, byte aAiBits,
short status, short aStatus,
bool active, bool aActive,
bool hitStatus); bool aHitStatus
);
GameScriptPosition GetPos() const;
GameScriptRotation GetRot() const;
short GetCurrentAnim() const;
short GetRequiredAnim() const;
short GetHP() const;
short GetOCB() const;
sol::as_table_t<std::array<short, 8>> GetItemFlags() const;
byte GetAIBits() const;
short GetStatus() const;
bool GetHitStatus() const;
bool GetActive() const;
void Init();
void SetPos(GameScriptPosition const& pos);
void SetRot(GameScriptRotation const& rot);
void SetCurrentAnim(short anim);
void SetRequiredAnim(short anim);
void SetHP(short hp);
void SetOCB(short ocb);
void SetItemFlags(sol::as_table_t<std::array<short, 8>> const & arr);
void SetAIBits(byte bits);
void SetStatus(short status);
void SetHitStatus(bool hitStatus);
void SetActive(bool active);
}; };