1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-12-24 13:45:47 +00:00

Merge branch 'experimental' of file:///Users/User/code/coding/Aquaria_fg_clean into experimental

This commit is contained in:
fgenesis 2014-06-22 23:41:43 +01:00
commit 2ad27b63de
3 changed files with 120 additions and 9 deletions

View file

@ -1252,8 +1252,14 @@ std::string Continuity::getInternalFormName()
void Continuity::loadIntoSongBank(const std::string &file)
{
if(!exists(file))
return;
XMLDocument doc;
if(readXML(file, doc) != XML_SUCCESS)
XMLError err = readXML(file, doc);
if(err == XML_ERROR_EMPTY_DOCUMENT)
return;
if(err != XML_SUCCESS)
{
errorLog("Failed to load song bank: Malformed XML");
return;

View file

@ -675,8 +675,11 @@ static void safePath(lua_State *L, const std::string& path)
{
if(path[0] == '/')
{
lua_pushliteral(L, "Absolute paths are not allowed");
lua_error(L);
if(!(dsq->mod.isActive() && path.substr(0, dsq->mod.getBaseModPath().length()) == dsq->mod.getBaseModPath()))
{
lua_pushliteral(L, "Absolute paths are not allowed");
lua_error(L);
}
}
if(path.find("../") != std::string::npos)
{
@ -2385,6 +2388,104 @@ luaFunc(shot_getTargetPoint)
luaReturnInt(shot ? shot->targetPt : 0);
}
luaFunc(shot_canHitEntity)
{
Shot *shot = getShot(L);
Entity *e = entity(L, 2);
bool hit = false;
if(shot && e && shot->isActive() && dsq->game->isEntityCollideWithShot(e, shot))
{
DamageData d;
d.attacker = shot->firer;
d.damage = shot->getDamage();
d.damageType = shot->getDamageType();
d.shot = shot;
hit = e->canShotHit(d);
}
luaReturnBool(hit);
}
typedef std::pair<Shot*, float> ShotDistancePair;
static std::vector<ShotDistancePair> filteredShots(20);
static int filteredShotIdx = 0;
static bool _shotDistanceCmp(const ShotDistancePair& a, const ShotDistancePair& b)
{
return a.second < b.second;
}
static bool _shotDistanceEq(const ShotDistancePair& a, const ShotDistancePair& b)
{
return a.first == b.first;
}
static size_t _shotFilter(lua_State *L)
{
const Vector p(lua_tonumber(L, 1), lua_tonumber(L, 2));
const float radius = lua_tonumber(L, 3);
const DamageType dt = lua_isnumber(L, 5) ? (DamageType)lua_tointeger(L, 5) : DT_NONE;
const float sqrRadius = radius * radius;
float distsq;
const bool skipRadiusCheck = radius <= 0;
size_t added = 0;
for(Shot::Shots::iterator it = Shot::shots.begin(); it != Shot::shots.end(); ++it)
{
Shot *s = *it;
if (s->isActive() && s->life >= 1.0f)
{
if (dt == DT_NONE || s->getDamageType() == dt)
{
if (skipRadiusCheck || (distsq = (s->position - p).getSquaredLength2D()) <= sqrRadius)
{
filteredShots.push_back(std::make_pair(s, distsq));
++added;
}
}
}
}
if(added)
{
std::sort(filteredShots.begin(), filteredShots.end(), _shotDistanceCmp);
std::vector<ShotDistancePair>::iterator newend = std::unique(filteredShots.begin(), filteredShots.end(), _shotDistanceEq);
filteredShots.resize(std::distance(filteredShots.begin(), newend));
}
// Add terminator if there is none
if(filteredShots.size() && filteredShots.back().first)
filteredShots.push_back(std::make_pair((Shot*)NULL, 0.0f)); // terminator
filteredShotIdx = 0; // Reset getNextFilteredShot() iteration index
return added;
}
luaFunc(filterNearestShots)
{
filteredShots.clear();
luaReturnInt(_shotFilter(L));
}
luaFunc(filterNearestShotsAdd)
{
// Remove terminator if there is one
if(filteredShots.size() && !filteredShots.back().first)
filteredShots.pop_back();
luaReturnInt(_shotFilter(L));
}
luaFunc(getNextFilteredShot)
{
ShotDistancePair sp = filteredShots[filteredShotIdx];
if (sp.first)
++filteredShotIdx;
luaPushPointer(L, sp.first);
lua_pushnumber(L, sp.second);
return 2;
}
luaFunc(entity_setVel)
{
Entity *e = entity(L);
@ -7596,7 +7697,7 @@ luaFunc(getNextEntity)
typedef std::pair<Entity*, float> EntityDistancePair;
static std::vector<EntityDistancePair> filteredEntities(20);
static int filteredIdx = 0;
static int filteredEntityIdx = 0;
static bool _entityDistanceCmp(const EntityDistancePair& a, const EntityDistancePair& b)
{
@ -7655,7 +7756,7 @@ static size_t _entityFilter(lua_State *L)
if(filteredEntities.size() && filteredEntities.back().first)
filteredEntities.push_back(std::make_pair((Entity*)NULL, 0.0f)); // terminator
filteredIdx = 0; // Reset getNextFilteredEntity() iteration index
filteredEntityIdx = 0; // Reset getNextFilteredEntity() iteration index
return added;
}
@ -7676,9 +7777,9 @@ luaFunc(filterNearestEntitiesAdd)
luaFunc(getNextFilteredEntity)
{
EntityDistancePair ep = filteredEntities[filteredIdx];
EntityDistancePair ep = filteredEntities[filteredEntityIdx];
if (ep.first)
++filteredIdx;
++filteredEntityIdx;
luaPushPointer(L, ep.first);
lua_pushnumber(L, ep.second);
return 2;
@ -9672,6 +9773,10 @@ static const struct {
luaRegister(shot_setTrailPrt),
luaRegister(shot_setTargetPoint),
luaRegister(shot_getTargetPoint),
luaRegister(shot_canHitEntity),
luaRegister(filterNearestShots),
luaRegister(filterNearestShotsAdd),
luaRegister(getNextFilteredShot),
luaRegister(entity_pathBurst),
luaRegister(entity_handleShotCollisions),
luaRegister(entity_handleShotCollisionsSkeletal),

View file

@ -315,8 +315,8 @@ static int db_debug (lua_State *L) {
}
#define LEVELS1 12 /* size of the first part of the stack */
#define LEVELS2 10 /* size of the second part of the stack */
#define LEVELS1 22 /* size of the first part of the stack */
#define LEVELS2 20 /* size of the second part of the stack */
static int db_errorfb (lua_State *L) {
int level;