separate t and v argument in create_part, fix LIGH not defaulting to .life of 30 with clones / console

This commit is contained in:
jacob1 2016-01-11 22:38:42 -05:00
parent d3c44dbffa
commit f6d82b6f8a
13 changed files with 47 additions and 35 deletions

View File

@ -163,5 +163,5 @@ void Element_TESC_Tool::DrawFill(Simulation * sim, Brush * brush, ui::Point posi
void PlopTool::Click(Simulation * sim, Brush * brush, ui::Point position) void PlopTool::Click(Simulation * sim, Brush * brush, ui::Point position)
{ {
sim->create_part(-2, position.X, position.Y, toolID); sim->create_part(-2, position.X, position.Y, toolID&0xFF, toolID>>8);
} }

View File

@ -895,7 +895,14 @@ int LuaScriptInterface::simulation_partCreate(lua_State * l)
lua_pushinteger(l, -1); lua_pushinteger(l, -1);
return 1; return 1;
} }
lua_pushinteger(l, luacon_sim->create_part(newID, lua_tointeger(l, 2), lua_tointeger(l, 3), lua_tointeger(l, 4))); int type = lua_tointeger(l, 4);
int v = -1;
if (type>>8)
{
v = type>>8;
type = type&0xFF;
}
lua_pushinteger(l, luacon_sim->create_part(newID, lua_tointeger(l, 2), lua_tointeger(l, 3), type, v));
return 1; return 1;
} }

View File

@ -452,7 +452,13 @@ AnyType TPTScriptInterface::tptS_create(std::deque<std::string> * words)
if(tempPoint.X<0 || tempPoint.Y<0 || tempPoint.Y >= YRES || tempPoint.X >= XRES) if(tempPoint.X<0 || tempPoint.Y<0 || tempPoint.Y >= YRES || tempPoint.X >= XRES)
throw GeneralException("Invalid position"); throw GeneralException("Invalid position");
int returnValue = sim->create_part(-1, tempPoint.X, tempPoint.Y, type); int v = -1;
if (type>>8)
{
v = type>>8;
type = type&0xFF;
}
int returnValue = sim->create_part(-1, tempPoint.X, tempPoint.Y, type, v);
return NumberType(returnValue); return NumberType(returnValue);
} }

View File

@ -576,7 +576,7 @@ int Simulation::FloodINST(int x, int y, int fullc, int cm)
// fill span // fill span
for (x=x1; x<=x2; x++) for (x=x1; x<=x2; x++)
{ {
if (create_part(-1, x, y, fullc)>=0) if (create_part(-1, x, y, c, fullc>>8)>=0)
created_something = 1; created_something = 1;
} }
@ -1440,12 +1440,12 @@ int Simulation::CreatePartFlags(int x, int y, int c, int flags)
{ {
delete_part(x, y); delete_part(x, y);
if (c!=0) if (c!=0)
create_part(-2, x, y, c); create_part(-2, x, y, c&0xFF, c>>8);
} }
} }
//normal draw //normal draw
else else
if (create_part(-2, x, y, c) == -1) if (create_part(-2, x, y, c&0xFF, c>>8) == -1)
return 1; return 1;
return 0; return 0;
} }
@ -1509,6 +1509,8 @@ void Simulation::CreateLine(int x1, int y1, int x2, int y2, int c)
bool reverseXY = abs(y2-y1) > abs(x2-x1); bool reverseXY = abs(y2-y1) > abs(x2-x1);
int x, y, dx, dy, sy; int x, y, dx, dy, sy;
float e, de; float e, de;
int v = c>>8;
c = c&0xFF;
if (reverseXY) if (reverseXY)
{ {
y = x1; y = x1;
@ -1539,9 +1541,9 @@ void Simulation::CreateLine(int x1, int y1, int x2, int y2, int c)
for (x=x1; x<=x2; x++) for (x=x1; x<=x2; x++)
{ {
if (reverseXY) if (reverseXY)
create_part(-1, y, x, c); create_part(-1, y, x, c, v);
else else
create_part(-1, x, y, c); create_part(-1, x, y, c, v);
e += de; e += de;
if (e >= 0.5f) if (e >= 0.5f)
{ {
@ -1549,9 +1551,9 @@ void Simulation::CreateLine(int x1, int y1, int x2, int y2, int c)
if ((y1<y2) ? (y<=y2) : (y>=y2)) if ((y1<y2) ? (y<=y2) : (y>=y2))
{ {
if (reverseXY) if (reverseXY)
create_part(-1, y, x, c); create_part(-1, y, x, c, v);
else else
create_part(-1, x, y, c); create_part(-1, x, y, c, v);
} }
e -= 1.0f; e -= 1.0f;
} }
@ -2763,19 +2765,16 @@ void Simulation::part_change_type(int i, int x, int y, int t)//changes the type
//the function for creating a particle, use p=-1 for creating a new particle, -2 is from a brush, or a particle number to replace a particle. //the function for creating a particle, use p=-1 for creating a new particle, -2 is from a brush, or a particle number to replace a particle.
//tv = Type (8 bits) + Var (24 bits), var is usually 0 //tv = Type (8 bits) + Var (24 bits), var is usually 0
int Simulation::create_part(int p, int x, int y, int tv) int Simulation::create_part(int p, int x, int y, int t, int v)
{ {
int i; int i;
int t = tv & 0xFF;
int v = (tv >> 8) & 0xFFFFFF;
if (x<0 || y<0 || x>=XRES || y>=YRES) if (x<0 || y<0 || x>=XRES || y>=YRES)
return -1; return -1;
if (t>=0 && t<PT_NUM && !elements[t].Enabled) if (t>=0 && t<PT_NUM && !elements[t].Enabled)
return -1; return -1;
if (tv == SPC_AIR) if (t == SPC_AIR)
{ {
pv[y/CELL][x/CELL] += 0.03f; pv[y/CELL][x/CELL] += 0.03f;
if (y+CELL<YRES) if (y+CELL<YRES)
@ -2788,8 +2787,7 @@ int Simulation::create_part(int p, int x, int y, int tv)
} }
return -1; return -1;
} }
else if (t==PT_SPRK)
if (t==PT_SPRK)
{ {
int type = pmap[y][x]&0xFF; int type = pmap[y][x]&0xFF;
int index = pmap[y][x]>>8; int index = pmap[y][x]>>8;
@ -2818,10 +2816,11 @@ int Simulation::create_part(int p, int x, int y, int tv)
parts[index].temp = parts[index].temp+10.0f; parts[index].temp = parts[index].temp+10.0f;
return index; return index;
} }
if (t==PT_SPAWN&&elementCount[PT_SPAWN]) else if (t==PT_SPAWN && elementCount[PT_SPAWN])
return -1; return -1;
if (t==PT_SPAWN2&&elementCount[PT_SPAWN2]) else if (t==PT_SPAWN2 && elementCount[PT_SPAWN2])
return -1; return -1;
if (p==-1)//creating from anything but brush if (p==-1)//creating from anything but brush
{ {
// If there is a particle, only allow creation if the new particle can occupy the same space as the existing particle // If there is a particle, only allow creation if the new particle can occupy the same space as the existing particle
@ -4701,7 +4700,7 @@ void Simulation::SimulateGoL()
} }
} }
if (creategol<0xFF) if (creategol<0xFF)
create_part(-1, nx, ny, PT_LIFE|((creategol-1)<<8)); create_part(-1, nx, ny, PT_LIFE, creategol-1);
} }
else if (grule[golnum][neighbors-1]==0 || grule[golnum][neighbors-1]==2)//subtract 1 because it counted itself else if (grule[golnum][neighbors-1]==0 || grule[golnum][neighbors-1]==2)//subtract 1 because it counted itself
{ {

View File

@ -150,7 +150,7 @@ public:
void part_change_type(int i, int x, int y, int t); void part_change_type(int i, int x, int y, int t);
//int InCurrentBrush(int i, int j, int rx, int ry); //int InCurrentBrush(int i, int j, int rx, int ry);
//int get_brush_flags(); //int get_brush_flags();
int create_part(int p, int x, int y, int t); int create_part(int p, int x, int y, int t, int v = -1);
void delete_part(int x, int y); void delete_part(int x, int y);
void get_sign_pos(int i, int *x0, int *y0, int *w, int *h); void get_sign_pos(int i, int *x0, int *y0, int *w, int *h);
int is_wire(int x, int y); int is_wire(int x, int y);

View File

@ -139,7 +139,7 @@ int Element_ARAY::update(UPDATE_FUNC_ARGS)
{ {
for (int rx1 = 0; rx1 >= -1 && rx1 <= 1; rx1 = -rx1 - rx1 + 1) for (int rx1 = 0; rx1 >= -1 && rx1 <= 1; rx1 = -rx1 - rx1 + 1)
{ {
int np = sim->create_part(-1, x + nxi + nxx + rx1, y + nyi + nyy + ry1, parts[r].tmp); int np = sim->create_part(-1, x + nxi + nxx + rx1, y + nyi + nyy + ry1, parts[r].tmp&0xFF);
if (np != -1) if (np != -1)
{ {
parts[np].temp = parts[r].temp; parts[np].temp = parts[r].temp;

View File

@ -81,10 +81,10 @@ int Element_BCLN::update(UPDATE_FUNC_ARGS)
} }
} }
else { else {
if (parts[i].ctype==PT_LIFE) sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype|(parts[i].tmp<<8)); if (parts[i].ctype==PT_LIFE) sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_LIFE, parts[i].tmp);
else if (parts[i].ctype!=PT_LIGH || (rand()%30)==0) else if (parts[i].ctype!=PT_LIGH || (rand()%30)==0)
{ {
int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype&0xFF);
if (np>=0) if (np>=0)
{ {
if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA) if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA)

View File

@ -72,10 +72,10 @@ int Element_CLNE::update(UPDATE_FUNC_ARGS)
} }
} }
else { else {
if (parts[i].ctype==PT_LIFE) sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype|(parts[i].tmp<<8)); if (parts[i].ctype==PT_LIFE) sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_LIFE, parts[i].tmp);
else if (parts[i].ctype!=PT_LIGH || (rand()%30)==0) else if (parts[i].ctype!=PT_LIGH || (rand()%30)==0)
{ {
int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype&0xFF);
if (np>=0) if (np>=0)
{ {
if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA) if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA)

View File

@ -85,7 +85,7 @@ int Element_CONV::update(UPDATE_FUNC_ARGS)
continue; continue;
if((r&0xFF)!=PT_CONV && (r&0xFF)!=PT_DMND && (r&0xFF)!=ctype) if((r&0xFF)!=PT_CONV && (r&0xFF)!=PT_DMND && (r&0xFF)!=ctype)
{ {
sim->create_part(r>>8, x+rx, y+ry, parts[i].ctype); sim->create_part(r>>8, x+rx, y+ry, parts[i].ctype&0xFF, parts[i].ctype>>8);
} }
} }
} }

View File

@ -93,7 +93,7 @@ int Element_CRAY::update(UPDATE_FUNC_ARGS)
} }
r = pmap[y+nyi+nyy][x+nxi+nxx]; r = pmap[y+nyi+nyy][x+nxi+nxx];
if (!sim->IsWallBlocking(x+nxi+nxx, y+nyi+nyy, parts[i].ctype) && (!sim->pmap[y+nyi+nyy][x+nxi+nxx] || createSpark)) { // create, also set color if it has passed through FILT if (!sim->IsWallBlocking(x+nxi+nxx, y+nyi+nyy, parts[i].ctype) && (!sim->pmap[y+nyi+nyy][x+nxi+nxx] || createSpark)) { // create, also set color if it has passed through FILT
int nr = sim->create_part(-1, x+nxi+nxx, y+nyi+nyy, parts[i].ctype); int nr = sim->create_part(-1, x+nxi+nxx, y+nyi+nyy, parts[i].ctype&0xFF, parts[i].ctype>>8);
if (nr!=-1) { if (nr!=-1) {
if (colored) if (colored)
parts[nr].dcolour = colored; parts[nr].dcolour = colored;

View File

@ -114,7 +114,7 @@ int Element_PBCN::update(UPDATE_FUNC_ARGS)
for (ry = -1; ry < 2; ry++) for (ry = -1; ry < 2; ry++)
if (rx || ry) if (rx || ry)
{ {
int r = sim->create_part(-1, x + rx, y + ry,parts[i].ctype); int r = sim->create_part(-1, x + rx, y + ry, PT_PHOT);
if (r != -1) if (r != -1)
{ {
parts[r].vx = rx * 3; parts[r].vx = rx * 3;
@ -130,11 +130,11 @@ int Element_PBCN::update(UPDATE_FUNC_ARGS)
else if (parts[i].ctype==PT_LIFE)//create life a different way else if (parts[i].ctype==PT_LIFE)//create life a different way
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
for (ry=-1; ry<2; ry++) for (ry=-1; ry<2; ry++)
sim->create_part(-1, x+rx, y+ry, parts[i].ctype|(parts[i].tmp<<8)); sim->create_part(-1, x+rx, y+ry, PT_LIFE, parts[i].tmp);
else if (parts[i].ctype!=PT_LIGH || !(rand()%30)) else if (parts[i].ctype!=PT_LIGH || !(rand()%30))
{ {
int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype&0xFF, parts[i].ctype>>8);
if (np>-1) if (np>-1)
{ {
if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA) if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA)

View File

@ -105,7 +105,7 @@ int Element_PCLN::update(UPDATE_FUNC_ARGS)
for (ry = -1; ry < 2; ry++) for (ry = -1; ry < 2; ry++)
if (rx || ry) if (rx || ry)
{ {
int r = sim->create_part(-1, x + rx, y + ry, parts[i].ctype); int r = sim->create_part(-1, x + rx, y + ry, PT_PHOT);
if (r != -1) if (r != -1)
{ {
parts[r].vx = rx * 3; parts[r].vx = rx * 3;
@ -121,11 +121,11 @@ int Element_PCLN::update(UPDATE_FUNC_ARGS)
else if (parts[i].ctype==PT_LIFE)//create life a different way else if (parts[i].ctype==PT_LIFE)//create life a different way
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
for (ry=-1; ry<2; ry++) for (ry=-1; ry<2; ry++)
sim->create_part(-1, x+rx, y+ry, parts[i].ctype|(parts[i].tmp<<8)); sim->create_part(-1, x+rx, y+ry, PT_LIFE, parts[i].tmp);
else if (parts[i].ctype!=PT_LIGH || (rand()%30)==0) else if (parts[i].ctype!=PT_LIGH || (rand()%30)==0)
{ {
int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype); int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, parts[i].ctype&0xFF);
if (np>=0) if (np>=0)
{ {
if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA) if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA)

View File

@ -75,7 +75,7 @@ int Element_STOR::update(UPDATE_FUNC_ARGS)
{ {
for(ry1 = 1; ry1 >= -1; ry1--){ for(ry1 = 1; ry1 >= -1; ry1--){
for(rx1 = 0; rx1 >= -1 && rx1 <= 1; rx1 = -rx1-rx1+1){ // Oscillate the X starting at 0, 1, -1, 3, -5, etc (Though stop at -1) for(rx1 = 0; rx1 >= -1 && rx1 <= 1; rx1 = -rx1-rx1+1){ // Oscillate the X starting at 0, 1, -1, 3, -5, etc (Though stop at -1)
np = sim->create_part(-1,x+rx1,y+ry1,parts[i].tmp); np = sim->create_part(-1,x+rx1,y+ry1,parts[i].tmp&0xFF);
if (np!=-1) if (np!=-1)
{ {
parts[np].temp = parts[i].temp; parts[np].temp = parts[i].temp;