mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-08-06 22:30:20 +00:00
Add some Lua functions for Android compat:
+ getEntityList() + entity_getEntityListInRange(e, range) + vector_getEntityListInRange(x, y, range)
This commit is contained in:
parent
fec1cc7ac2
commit
1acad1069e
1 changed files with 89 additions and 6 deletions
|
@ -334,6 +334,12 @@ static inline void luaPushPointer(lua_State *L, void *ptr)
|
||||||
lua_pushnumber(L, 0);
|
lua_pushnumber(L, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void luaPushPointerNonNull(lua_State *L, void *ptr)
|
||||||
|
{
|
||||||
|
assert(ptr);
|
||||||
|
lua_pushlightuserdata(L, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
static std::string luaFormatStackInfo(lua_State *L, int level = 1)
|
static std::string luaFormatStackInfo(lua_State *L, int level = 1)
|
||||||
{
|
{
|
||||||
lua_Debug ar;
|
lua_Debug ar;
|
||||||
|
@ -7864,7 +7870,8 @@ static bool _entityDistanceEq(const EntityDistancePair& a, const EntityDistanceP
|
||||||
return a.first == b.first;
|
return a.first == b.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t _entityFilter(lua_State *L)
|
template<typename F>
|
||||||
|
static size_t _entityFilterT(lua_State *L, F& func)
|
||||||
{
|
{
|
||||||
const Vector p(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
const Vector p(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
||||||
const float radius = lua_tonumber(L, 3);
|
const float radius = lua_tonumber(L, 3);
|
||||||
|
@ -7893,7 +7900,7 @@ static size_t _entityFilter(lua_State *L)
|
||||||
{
|
{
|
||||||
if (dt == DT_NONE || e->isDamageTarget(dt))
|
if (dt == DT_NONE || e->isDamageTarget(dt))
|
||||||
{
|
{
|
||||||
filteredEntities.push_back(std::make_pair(e, distsq));
|
func.add(L, e, distsq);
|
||||||
++added;
|
++added;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7901,6 +7908,21 @@ static size_t _entityFilter(lua_State *L)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return added;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct StaticEntityFilter
|
||||||
|
{
|
||||||
|
inline void add(lua_State *L, Entity *e, float distsq)
|
||||||
|
{
|
||||||
|
filteredEntities.push_back(std::make_pair(e, distsq));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static size_t _entityFilter(lua_State *L)
|
||||||
|
{
|
||||||
|
StaticEntityFilter filt;
|
||||||
|
const size_t added = _entityFilterT(L, filt);
|
||||||
if(added)
|
if(added)
|
||||||
{
|
{
|
||||||
std::sort(filteredEntities.begin(), filteredEntities.end(), _entityDistanceCmp);
|
std::sort(filteredEntities.begin(), filteredEntities.end(), _entityDistanceCmp);
|
||||||
|
@ -7917,6 +7939,17 @@ static size_t _entityFilter(lua_State *L)
|
||||||
return added;
|
return added;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct EntityFilterTableWriter
|
||||||
|
{
|
||||||
|
EntityFilterTableWriter() : _idx(0) {}
|
||||||
|
inline void add(lua_State *L, Entity *e, float distsq)
|
||||||
|
{
|
||||||
|
luaPushPointer(L, e);
|
||||||
|
lua_rawseti(L, -2, ++_idx);
|
||||||
|
}
|
||||||
|
unsigned _idx;
|
||||||
|
};
|
||||||
|
|
||||||
luaFunc(filterNearestEntities)
|
luaFunc(filterNearestEntities)
|
||||||
{
|
{
|
||||||
filteredEntities.clear();
|
filteredEntities.clear();
|
||||||
|
@ -7941,10 +7974,57 @@ luaFunc(getNextFilteredEntity)
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MISSING FOR ANDROID COMPAT
|
// FIXME: make sure this is compatible with the android version. -- fg
|
||||||
//luaFunc(getEntityList)
|
luaFunc(getEntityList)
|
||||||
//luaFunc(entity_getEntityListInRange) // (me, range)
|
{
|
||||||
//luaFunc(vector_getEntityListInRange) // (x, y, range)
|
if(!lua_istable(L, 1))
|
||||||
|
lua_createtable(L, (int)dsq->entities.size(), 0); // rough guess
|
||||||
|
int i = 1; // always next index
|
||||||
|
FOR_ENTITIES(ep)
|
||||||
|
{
|
||||||
|
Entity *e = *ep;
|
||||||
|
luaPushPointerNonNull(L, e);
|
||||||
|
lua_rawseti(L, -2, i++);
|
||||||
|
}
|
||||||
|
lua_pushinteger(L, i-1);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: make sure this is compatible with the android version. -- fg
|
||||||
|
static int getEntityListInRange(lua_State *L, const Vector& pos, float range)
|
||||||
|
{
|
||||||
|
if(!lua_istable(L, 3))
|
||||||
|
lua_newtable(L);
|
||||||
|
int i = 1; // always next index
|
||||||
|
FOR_ENTITIES(ep)
|
||||||
|
{
|
||||||
|
Entity *e = *ep;
|
||||||
|
if((e->position - pos).isLength2DIn(range))
|
||||||
|
{
|
||||||
|
luaPushPointerNonNull(L, e);
|
||||||
|
lua_rawseti(L, -2, i++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lua_pushinteger(L, i-1);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(entity_getEntityListInRange)
|
||||||
|
{
|
||||||
|
Entity *me = entity(L);
|
||||||
|
if(!me)
|
||||||
|
luaReturnNil();
|
||||||
|
return getEntityListInRange(L, me->position, lua_tonumber(L, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(vector_getEntityListInRange)
|
||||||
|
{
|
||||||
|
Entity *me = entity(L);
|
||||||
|
if(!me)
|
||||||
|
luaReturnNil();
|
||||||
|
Vector pos(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
||||||
|
return getEntityListInRange(L, pos, lua_tonumber(L, 3));
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(getEntity)
|
luaFunc(getEntity)
|
||||||
{
|
{
|
||||||
|
@ -10263,6 +10343,9 @@ static const struct {
|
||||||
luaRegister(filterNearestEntities),
|
luaRegister(filterNearestEntities),
|
||||||
luaRegister(filterNearestEntitiesAdd),
|
luaRegister(filterNearestEntitiesAdd),
|
||||||
luaRegister(getNextFilteredEntity),
|
luaRegister(getNextFilteredEntity),
|
||||||
|
luaRegister(getEntityList),
|
||||||
|
luaRegister(entity_getEntityListInRange),
|
||||||
|
luaRegister(vector_getEntityListInRange),
|
||||||
|
|
||||||
luaRegister(setStory),
|
luaRegister(setStory),
|
||||||
luaRegister(getStory),
|
luaRegister(getStory),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue