simulation.partNeighbours() iterator

// no one uses it yet, so it shouldn't break anythign really
This commit is contained in:
mniip 2013-06-12 21:42:15 +04:00
parent 17de12dc8b
commit 7c25baa9a9

View File

@ -555,41 +555,55 @@ void LuaScriptInterface::set_map(int x, int y, int width, int height, float valu
}
}
int NeighboursClosure(lua_State * l)
{
int rx=lua_tointeger(l, lua_upvalueindex(1));
int ry=lua_tointeger(l, lua_upvalueindex(2));
int sx=lua_tointeger(l, lua_upvalueindex(3));
int sy=lua_tointeger(l, lua_upvalueindex(4));
int x=lua_tointeger(l, lua_upvalueindex(5));
int y=lua_tointeger(l, lua_upvalueindex(6));
int i;
do
{
x++;
if(x>rx)
{
x=-rx;
y++;
if(y>ry)
return 0;
}
if(sx+x<0 || sy+y<0 || sx+x>=XRES*CELL || sy+y>=YRES*CELL)
{
continue;
}
i=luacon_sim->pmap[y+sx][x+sx];
} while(!i&0xFF);
lua_pushnumber(l, x);
lua_replace(l, lua_upvalueindex(5));
lua_pushnumber(l, y);
lua_replace(l, lua_upvalueindex(6));
lua_pushnumber(l, i>>8);
lua_pushnumber(l, x+sx);
lua_pushnumber(l, y+sy);
return 3;
}
int LuaScriptInterface::simulation_partNeighbours(lua_State * l)
{
int ids = 0;
if(lua_gettop(l) == 4)
{
int x = lua_tointeger(l, 1), y = lua_tointeger(l, 2), r = lua_tointeger(l, 3), t = lua_tointeger(l, 4), rx, ry, n;
for (rx = -r; rx <= r; rx++)
for (ry = -r; ry <= r; ry++)
if (x+rx >= 0 && y+ry >= 0 && x+rx < XRES && y+ry < YRES && (rx || ry))
{
n = luacon_sim->pmap[y+ry][x+rx];
if(n && (n&0xFF) == t)
{
ids++;
lua_pushinteger(l, n>>8);
}
}
}
else
{
int x = lua_tointeger(l, 1), y = lua_tointeger(l, 2), r = lua_tointeger(l, 3), rx, ry, n;
for (rx = -r; rx <= r; rx++)
for (ry = -r; ry <= r; ry++)
if (x+rx >= 0 && y+ry >= 0 && x+rx < XRES && y+ry < YRES && (rx || ry))
{
n = luacon_sim->pmap[y+ry][x+rx];
if(n)
{
ids++;
lua_pushinteger(l, n>>8);
}
}
}
return ids;
int x=luaL_checkint(l, 1);
int y=luaL_checkint(l, 2);
int rx=luaL_optint(l, 3, 2);
int ry=luaL_optint(l, 4, 2);
lua_pushnumber(l, rx);
lua_pushnumber(l, ry);
lua_pushnumber(l, x);
lua_pushnumber(l, y);
lua_pushnumber(l, -rx-1);
lua_pushnumber(l, -ry);
lua_pushcclosure(l, NeighboursClosure, 6);
return 1;
}
int LuaScriptInterface::simulation_partChangeType(lua_State * l)
@ -1508,12 +1522,13 @@ int LuaScriptInterface::simulation_elementCount(lua_State * l)
int PartsClosure(lua_State * l)
{
int i = lua_tointeger(l, lua_upvalueindex(1));
i++;
while(!luacon_sim->parts[i].type)
do
{
if(i>=NPART)
return 0;
else
i++;
} while(!luacon_sim->parts[i].type);
lua_pushnumber(l, i);
lua_replace(l, lua_upvalueindex(1));
lua_pushnumber(l, i);