more accurate elementCount (part_change_type, pasting stamps, lua), prevent having multiple STKM / SPWN even more

This commit is contained in:
jacob1 2014-11-20 21:51:45 -05:00
parent 6066ae8341
commit c9cc2a1a6b
6 changed files with 156 additions and 151 deletions

View File

@ -34,54 +34,73 @@ void CommandInterface::Log(LogType type, std::string message)
m->Log(message);
}
int CommandInterface::GetPropertyOffset(std::string key_, FormatType & format)
int CommandInterface::GetPropertyOffset(std::string key, FormatType & format)
{
char * key = (char *)key_.c_str();
int offset;
if (strcmp(key, "type")==0){
int offset = -1;
if (!key.compare("type"))
{
offset = offsetof(Particle, type);
format = FormatInt;
} else if (strcmp(key, "life")==0){
format = FormatElement;
}
else if (!key.compare("life"))
{
offset = offsetof(Particle, life);
format = FormatInt;
} else if (strcmp(key, "ctype")==0){
}
else if (!key.compare("ctype"))
{
offset = offsetof(Particle, ctype);
format = FormatInt;
} else if (strcmp(key, "temp")==0){
}
else if (!key.compare("temp"))
{
offset = offsetof(Particle, temp);
format = FormatFloat;
} else if (strcmp(key, "tmp2")==0){
}
else if (!key.compare("tmp2"))
{
offset = offsetof(Particle, tmp2);
format = FormatInt;
} else if (strcmp(key, "tmp")==0){
}
else if (!key.compare("tmp"))
{
offset = offsetof(Particle, tmp);
format = FormatInt;
} else if (strcmp(key, "vy")==0){
}
else if (!key.compare("vy"))
{
offset = offsetof(Particle, vy);
format = FormatFloat;
} else if (strcmp(key, "vx")==0){
}
else if (!key.compare("vx"))
{
offset = offsetof(Particle, vx);
format = FormatFloat;
} else if (strcmp(key, "x")==0){
}
else if (!key.compare("x"))
{
offset = offsetof(Particle, x);
format = FormatFloat;
} else if (strcmp(key, "y")==0){
}
else if (!key.compare("y"))
{
offset = offsetof(Particle, y);
format = FormatFloat;
} else if (strcmp(key, "dcolour")==0){
}
else if (!key.compare("dcolor") || !key.compare("dcolour"))
{
offset = offsetof(Particle, dcolour);
format = FormatInt;
} else if (strcmp(key, "dcolor")==0){
offset = offsetof(Particle, dcolour);
format = FormatInt;
} else if (!strcmp(key, "pavg0")){
}
else if (!key.compare("pavg0"))
{
offset = offsetof(Particle, pavg[0]);
format = FormatFloat;
} else if (!strcmp(key, "pavg1")){
}
else if (!key.compare("pavg1"))
{
offset = offsetof(Particle, pavg[1]);
format = FormatFloat;
} else {
offset = -1;
}
return offset;
}

View File

@ -15,9 +15,9 @@ protected:
GameController * c;
public:
enum LogType { LogError, LogWarning, LogNotice };
enum FormatType { FormatInt, FormatString, FormatChar, FormatFloat };
enum FormatType { FormatInt, FormatString, FormatChar, FormatFloat, FormatElement };
CommandInterface(GameController * c, GameModel * m);
int GetPropertyOffset(std::string key_, FormatType & format);
int GetPropertyOffset(std::string key, FormatType & format);
int GetParticleType(std::string type);
void Log(LogType type, std::string message);
//void AttachGameModel(GameModel * m);

View File

@ -23,34 +23,32 @@
#ifndef FFI
int luacon_partread(lua_State* l)
{
int format, offset, tempinteger;
int tempinteger, i = cIndex;
float tempfloat;
int i;
const char * key = luaL_optstring(l, 2, "");
offset = luacon_particle_getproperty(key, &format);
std::string key = luaL_optstring(l, 2, "");
CommandInterface::FormatType format;
int offset = luacon_ci->GetPropertyOffset(key, format);
i = cIndex;
if (i < 0 || i >= NPART || offset==-1)
if (i < 0 || i >= NPART)
return luaL_error(l, "Out of range");
if (offset == -1)
{
if (i < 0 || i >= NPART)
return luaL_error(l, "Out of range");
else if (!strcmp(key, "id"))
if (!key.compare("id"))
{
lua_pushnumber(l, i);
return 1;
}
else
return luaL_error(l, "Invalid property");
return luaL_error(l, "Invalid property");
}
switch(format)
{
case 0:
case CommandInterface::FormatInt:
case CommandInterface::FormatElement:
tempinteger = *((int*)(((unsigned char*)&luacon_sim->parts[i])+offset));
lua_pushnumber(l, tempinteger);
break;
case 1:
case CommandInterface::FormatFloat:
tempfloat = *((float*)(((unsigned char*)&luacon_sim->parts[i])+offset));
lua_pushnumber(l, tempfloat);
break;
@ -60,29 +58,27 @@ int luacon_partread(lua_State* l)
int luacon_partwrite(lua_State* l)
{
int format, offset;
int i;
const char * key = luaL_optstring(l, 2, "");
offset = luacon_particle_getproperty(key, &format);
int tempinteger, i = cIndex;
float tempfloat;
std::string key = luaL_optstring(l, 2, "");
CommandInterface::FormatType format;
int offset = luacon_ci->GetPropertyOffset(key, format);
i = cIndex;
if (i < 0 || i >= NPART || offset==-1)
{
if (i < 0 || i >= NPART)
return luaL_error(l, "array index out of bounds");
else
return luaL_error(l, "Invalid property");
}
if (i < 0 || i >= NPART)
return luaL_error(l, "Out of range");
if (offset == -1)
return luaL_error(l, "Invalid property");
switch(format)
{
case 0:
case CommandInterface::FormatInt:
*((int*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = luaL_optinteger(l, 3, 0);
break;
case 1:
case CommandInterface::FormatFloat:
*((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = luaL_optnumber(l, 3, 0);
break;
case CommandInterface::FormatElement:
luacon_sim->part_change_type(i, luacon_sim->parts[i].x, luacon_sim->parts[i].y, luaL_optinteger(l, 3, 0));
}
return 0;
}
@ -107,57 +103,6 @@ int luacon_partswrite(lua_State* l)
}
#endif
int luacon_particle_getproperty(const char * key, int * format)
{
int offset;
if (!strcmp(key, "type")) {
offset = offsetof(Particle, type);
*format = 0;
} else if (!strcmp(key, "life")) {
offset = offsetof(Particle, life);
*format = 0;
} else if (!strcmp(key, "ctype")) {
offset = offsetof(Particle, ctype);
*format = 0;
} else if (!strcmp(key, "temp")) {
offset = offsetof(Particle, temp);
*format = 1;
} else if (!strcmp(key, "tmp")) {
offset = offsetof(Particle, tmp);
*format = 0;
} else if (!strcmp(key, "tmp2")) {
offset = offsetof(Particle, tmp2);
*format = 0;
} else if (!strcmp(key, "vy")) {
offset = offsetof(Particle, vy);
*format = 1;
} else if (!strcmp(key, "vx")) {
offset = offsetof(Particle, vx);
*format = 1;
} else if (!strcmp(key, "x")){
offset = offsetof(Particle, x);
*format = 1;
} else if (!strcmp(key, "y")) {
offset = offsetof(Particle, y);
*format = 1;
} else if (!strcmp(key, "dcolour")) {
offset = offsetof(Particle, dcolour);
*format = 0;
} else if (!strcmp(key, "dcolor")) {
offset = offsetof(Particle, dcolour);
*format = 0;
} else if (!strcmp(key, "pavg0")) {
offset = offsetof(Particle, pavg[0]);
*format = 1;
} else if (!strcmp(key, "pavg1")) {
offset = offsetof(Particle, pavg[1]);
*format = 1;
} else {
offset = -1;
}
return offset;
}
int luacon_transition_getproperty(const char * key, int * format)
{
int offset;
@ -1125,7 +1070,7 @@ int luatpt_set_property(lua_State* l)
if(!lua_isnumber(l, acount) && lua_isstring(l, acount))
{
name = luaL_optstring(l, acount, "none");
if ((partsel = luacon_ci->GetParticleType(std::string(name)))==-1)
if ((partsel = luacon_ci->GetParticleType(std::string(name))) == -1)
return luaL_error(l, "Unrecognised element '%s'", name);
}
}
@ -1178,7 +1123,9 @@ int luatpt_set_property(lua_State* l)
ny = (int)(parts[i].y + .5f);
if (nx >= x && nx < x+w && ny >= y && ny < y+h && (!partsel || partsel == parts[i].type))
{
if(format == CommandInterface::FormatFloat)
if (format == CommandInterface::FormatElement)
luacon_sim->part_change_type(i, nx, ny, t);
else if(format == CommandInterface::FormatFloat)
*((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = f;
else
*((int*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = t;
@ -1209,7 +1156,9 @@ int luatpt_set_property(lua_State* l)
if (partsel && partsel != luacon_sim->parts[i].type)
return 0;
if(format == CommandInterface::FormatFloat)
if (format == CommandInterface::FormatElement)
luacon_sim->part_change_type(i, luacon_sim->parts[i].x, luacon_sim->parts[i].y, t);
else if (format == CommandInterface::FormatFloat)
*((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = f;
else
*((int*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = t;
@ -1329,40 +1278,42 @@ int luatpt_get_elecmap(lua_State* l)
int luatpt_get_property(lua_State* l)
{
int i, r, y;
const char *prop;
prop = luaL_optstring(l, 1, ""); //x coord or particle index, depending on arguments
i = luaL_optint(l, 2, 0);
y = luaL_optint(l, 3, -1);
if (y!=-1 && y < YRES && y >= 0 && i < XRES && i >= 0)
std::string prop = luaL_optstring(l, 1, "");
int i = luaL_optint(l, 2, 0); //x coord or particle index, depending on arguments
int y = luaL_optint(l, 3, -1);
if (y!=-1 && y<YRES && y>=0 && i < XRES && i>=0)
{
r = luacon_sim->pmap[y][i];
if (!r)
r = luacon_sim->photons[y][i];
int r = luacon_sim->pmap[y][i];
if (!r)
{
if (!strcmp(prop,"type"))
r = luacon_sim->photons[y][i];
if (!r)
{
lua_pushinteger(l, 0);
return 1;
if (!prop.compare("type"))
{
lua_pushinteger(l, 0);
return 1;
}
return luaL_error(l, "Particle does not exist");
}
return luaL_error(l, "Particle does not exist");
}
i = r>>8;
}
else if (y!=-1)
else if (y != -1)
return luaL_error(l, "Coordinates out of range (%d,%d)", i, y);
if (i < 0 || i >= NPART)
return luaL_error(l, "Invalid particle ID '%d'", i);
if (luacon_sim->parts[i].type)
{
int format, tempinteger;
int tempinteger;
float tempfloat;
int offset = luacon_particle_getproperty(prop, &format);
CommandInterface::FormatType format;
int offset = luacon_ci->GetPropertyOffset(prop, format);
if (offset == -1)
{
if (!strcmp(prop,"id"))
if (!prop.compare("id"))
{
lua_pushnumber(l, i);
return 1;
@ -1372,17 +1323,18 @@ int luatpt_get_property(lua_State* l)
}
switch(format)
{
case 0:
case CommandInterface::FormatInt:
case CommandInterface::FormatElement:
tempinteger = *((int*)(((unsigned char*)&luacon_sim->parts[i])+offset));
lua_pushnumber(l, tempinteger);
break;
case 1:
case CommandInterface::FormatFloat:
tempfloat = *((float*)(((unsigned char*)&luacon_sim->parts[i])+offset));
lua_pushnumber(l, tempfloat);
}
return 1;
}
else if (!strcmp(prop,"type"))
else if (!prop.compare("type"))
{
lua_pushinteger(l, 0);
return 1;

View File

@ -35,7 +35,6 @@ int luacon_elementread(lua_State* l);
int luacon_elementwrite(lua_State* l);
int luacon_transitionread(lua_State* l);
int luacon_transitionwrite(lua_State* l);
int luacon_particle_getproperty(const char * key, int * format);
int luacon_transition_getproperty(const char * key, int * format);
int luacon_element_getproperty(const char * key, int * format, unsigned int * modified_stuff);
//int process_command_lua(pixel *vid_buf, char *console, char *console_error);

View File

@ -262,8 +262,7 @@ AnyType TPTScriptInterface::tptS_set(std::deque<std::string> * words)
FormatType propertyFormat;
int propertyOffset = GetPropertyOffset(property.Value(), propertyFormat);
if(propertyOffset==-1)
if (propertyOffset == -1)
throw GeneralException("Invalid property");
//Selector
@ -306,7 +305,7 @@ AnyType TPTScriptInterface::tptS_set(std::deque<std::string> * words)
if (property.Value() == "type" && (newValue < 0 || newValue >= PT_NUM || !sim->elements[newValue].Enabled))
throw GeneralException("Invalid element");
if(selector.GetType() == TypePoint || selector.GetType() == TypeNumber)
if (selector.GetType() == TypePoint || selector.GetType() == TypeNumber)
{
int partIndex = -1;
if(selector.GetType() == TypePoint)
@ -329,10 +328,13 @@ AnyType TPTScriptInterface::tptS_set(std::deque<std::string> * words)
case FormatFloat:
*((float*)(partsBlock+(partIndex*sizeof(Particle))+propertyOffset)) = newValuef;
break;
case FormatElement:
sim->part_change_type(partIndex, sim->parts[partIndex].x, sim->parts[partIndex].y, newValue);
break;
}
returnValue = 1;
}
else if(selector.GetType() == TypeString && ((StringType)selector).Value() == "all")
else if (selector.GetType() == TypeString && ((StringType)selector).Value() == "all")
{
switch(propertyFormat)
{
@ -356,27 +358,37 @@ AnyType TPTScriptInterface::tptS_set(std::deque<std::string> * words)
}
}
break;
case FormatElement:
{
for (int j = 0; j < NPART; j++)
if (sim->parts[j].type)
{
returnValue++;
sim->part_change_type(j, sim->parts[j].x, sim->parts[j].y, newValue);
}
}
break;
}
}
else if(selector.GetType() == TypeString || selector.GetType() == TypeNumber)
{
int type;
if(selector.GetType() == TypeNumber)
if (selector.GetType() == TypeNumber)
type = ((NumberType)selector).Value();
else if(selector.GetType() == TypeString)
else if (selector.GetType() == TypeString)
type = GetParticleType(((StringType)selector).Value());
if(type<0 || type>=PT_NUM)
if (type<0 || type>=PT_NUM)
throw GeneralException("Invalid particle type");
if(type==0)
if (type==0)
throw GeneralException("Cannot set properties of particles that do not exist");
std::cout << propertyOffset << std::endl;
switch(propertyFormat)
{
case FormatInt:
{
for(int j = 0; j < NPART; j++)
if(sim->parts[j].type == type)
for (int j = 0; j < NPART; j++)
if (sim->parts[j].type == type)
{
returnValue++;
*((int*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValue;
@ -385,14 +397,23 @@ AnyType TPTScriptInterface::tptS_set(std::deque<std::string> * words)
break;
case FormatFloat:
{
for(int j = 0; j < NPART; j++)
if(sim->parts[j].type == type)
for (int j = 0; j < NPART; j++)
if (sim->parts[j].type == type)
{
returnValue++;
*((float*)(partsBlock+(j*sizeof(Particle))+propertyOffset)) = newValuef;
}
}
break;
case FormatElement:
{
for (int j = 0; j < NPART; j++)
if (sim->parts[j].type == type)
{
returnValue++;
sim->part_change_type(j, sim->parts[j].x, sim->parts[j].y, newValue);
}
}
}
}
else

View File

@ -102,18 +102,18 @@ int Simulation::Load(int fullX, int fullY, GameSave * save)
tempPart.tmp = partMap[tempPart.tmp];
}
if(r = pmap[y][x])
//Replace existing
if (r = pmap[y][x])
{
//Replace existing
elementCount[parts[r>>8].type]--;
parts[r>>8] = tempPart;
i = r>>8;
pmap[y][x] = 0;
elementCount[parts[r>>8].type]--;
elementCount[tempPart.type]++;
}
//Allocate new particle
else
{
//Allocate new particle
if (pfree == -1)
break;
i = pfree;
@ -326,9 +326,7 @@ Snapshot * Simulation::CreateSnapshot()
void Simulation::Restore(const Snapshot & snap)
{
parts_lastActiveIndex = NPART-1;
for(int i = 0; i<PT_NUM; i++)
elementCount[i] = 0;
elementRecount = true;
std::copy(snap.AirPressure.begin(), snap.AirPressure.end(), &pv[0][0]);
std::copy(snap.AirVelocityX.begin(), snap.AirVelocityX.end(), &vx[0][0]);
@ -2722,6 +2720,24 @@ void Simulation::part_change_type(int i, int x, int y, int t)//changes the type
return;
}
if (parts[i].type > 0 && parts[i].type < PT_NUM && elementCount[parts[i].type])
elementCount[parts[i].type]--;
elementCount[t]++;
if (t == PT_SPAWN && player.spawnID < 0)
player.spawnID = i;
else if (t == PT_SPAWN2 && player2.spawnID < 0)
player2.spawnID = i;
else if (t == PT_STKM)
Element_STKM::STKM_init_legs(this, &player, i);
else if (t == PT_STKM2)
Element_STKM::STKM_init_legs(this, &player2, i);
else if (t == PT_FIGH)
{
if (parts[i].tmp2 >= 0 && parts[i].tmp2 < 100)
Element_STKM::STKM_init_legs(this, &fighters[parts[i].tmp2], i);
}
parts[i].type = t;
if (elements[t].Properties & TYPE_ENERGY)
{
@ -3622,10 +3638,8 @@ void Simulation::update_particles_i(int start, int inc)
}
elementRecount |= !(currentTick%180);
if(elementRecount)
{
if (elementRecount)
std::fill(elementCount, elementCount+PT_NUM, 0);
}
for (i=0; i<=parts_lastActiveIndex; i++)
if (parts[i].type)
@ -3637,7 +3651,7 @@ void Simulation::update_particles_i(int start, int inc)
continue;
}
if(elementRecount)
if (elementRecount)
elementCount[t]++;
elem_properties = elements[t].Properties;