floodfill fix, @_@ elements, grav changes color

This commit is contained in:
Philip 2010-11-22 15:36:24 -05:00
parent 3d2292890b
commit 60e4c076cb
5 changed files with 141 additions and 37 deletions

View File

@ -87,6 +87,13 @@ extern int amd;
extern int FPSB; extern int FPSB;
int NUM_PARTS; int NUM_PARTS;
int GRAV;
int GRAV_R;
int GRAV_G;
int GRAV_B;
int GRAV_R2;
int GRAV_G2;
int GRAV_B2;
extern int legacy_enable; extern int legacy_enable;
@ -115,6 +122,7 @@ int MSIGN;
int CGOL; int CGOL;
int ISGOL; int ISGOL;
int ISLOVE; int ISLOVE;
int ISGRAV;
int GSPEED; int GSPEED;
int love[XRES/9][YRES/9]; int love[XRES/9][YRES/9];
int gol[XRES][YRES]; int gol[XRES][YRES];

View File

@ -149,7 +149,10 @@
#define PT_FRZZ 100 #define PT_FRZZ 100
#define PT_FRZW 101 #define PT_FRZW 101
#define PT_GRAV 102 #define PT_GRAV 102
#define PT_NUM 103 #define PT_A_A 103
#define PT_A_AG 104
#define PT_A_AS 105
#define PT_NUM 106
#define R_TEMP 22 #define R_TEMP 22
#define MAX_TEMP 9999 #define MAX_TEMP 9999
@ -343,6 +346,9 @@ static const part_type ptypes[PT_NUM] =
{"FRZZ", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, 90.0f, 46, "FREEZE", TYPE_PART}, {"FRZZ", PIXPACK(0xC0E0FF), 0.7f, 0.01f * CFDS, 0.96f, 0.90f, -0.1f, 0.05f, 0.01f, -0.00005f* CFDS,1, 0, 0, 0, 20, 1, 50, SC_POWDERS, 90.0f, 46, "FREEZE", TYPE_PART},
{"FRZW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, 90.0f, 29, "FREEZE WATER", TYPE_LIQUID}, {"FRZW", PIXPACK(0x1020C0), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, 90.0f, 29, "FREEZE WATER", TYPE_LIQUID},
{"GRAV", PIXPACK(0xFFE0A0), 0.7f, 0.00f * CFDS, 1.00f, 1.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable.", TYPE_PART}, {"GRAV", PIXPACK(0xFFE0A0), 0.7f, 0.00f * CFDS, 1.00f, 1.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 1, 10, 0, 0, 30, 1, 85, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Very light dust. Flammable.", TYPE_PART},
{"@_@", PIXPACK(0x00FF77), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 2, 0, 0, 0, 20, 1, 30, SC_LIQUID, R_TEMP+0.0f +273.15f, 29, "@_@", TYPE_LIQUID},
{"@_@G", PIXPACK(0x00FFBB), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 2.75f, 0.000f * CFDS, 0, 0, 0, 0, 1, 1, 1, SC_GAS, R_TEMP-200.0f +273.15f, 42, "@_@ gas", TYPE_GAS},
{"@_@S", PIXPACK(0x00E455), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 100, SC_SOLIDS, R_TEMP+300.0f +273.15f, 251, "@_@ solid", TYPE_SOLID},
//Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description //Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Weights Section H Ins(real world, by triclops200) Description
}; };
@ -439,8 +445,8 @@ static part_state pstates[PT_NUM] =
/* GOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* GOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* GOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* Crac */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 22730.0f}, /* Crac */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 2730.0f},
/* RIME */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.15f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* RIME */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.15f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* FOG */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FOG */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* BCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* BCLN */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* LOVE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* LOVE */ {ST_GAS, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
@ -451,6 +457,10 @@ static part_state pstates[PT_NUM] =
/* FWRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FWRK */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* FRZZ */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FRZZ */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* FRZW */ {ST_LIQUID, PT_ICEI, 53.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* FRZW */ {ST_LIQUID, PT_ICEI, 53.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* GRAV */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f},
/* @_@ */ {ST_LIQUID, PT_A_AG, 100.0f, PT_NONE, 0.0f, PT_A_AS, 400.0f, PT_NONE, 0.0f},
/* @_@g */ {ST_GAS , PT_A_AG, 100.0f, PT_A_A , 273.0f, PT_A_AS, 400.0f, PT_NONE, 0.0f},
/* @_@s */ {ST_SOLID, PT_A_AG, 100.0f, PT_A_A , 273.0f, PT_A_AS, 400.0f, PT_NONE, 0.0f},
}; };
static int grule[NGOL][9] = static int grule[NGOL][9] =
{ {

View File

@ -1495,15 +1495,30 @@ void draw_parts(pixel *vid)
cg = 20; cg = 20;
cb = 20; cb = 20;
if(parts[i].vx>0) if(parts[i].vx>0)
cr += (parts[i].vx)*60; {
cr += (parts[i].vx)*GRAV_R;
cg += (parts[i].vx)*GRAV_G;
cb += (parts[i].vx)*GRAV_B;
}
if(parts[i].vy>0) if(parts[i].vy>0)
cb += (parts[i].vy)*60; {
cr += (parts[i].vy)*GRAV_G;
cg += (parts[i].vy)*GRAV_B;
cb += (parts[i].vy)*GRAV_R;
}
if(parts[i].vx<0) if(parts[i].vx<0)
cg -= (parts[i].vx)*60; {
cr -= (parts[i].vx)*GRAV_B;
cg -= (parts[i].vx)*GRAV_R;
cb -= (parts[i].vx)*GRAV_G;
}
if(parts[i].vy<0) if(parts[i].vy<0)
{ {
cr -= (parts[i].vy)*30; cr -= (parts[i].vy)*GRAV_R2;
cg -= (parts[i].vy)*30; cg -= (parts[i].vy)*GRAV_G2;
cb -= (parts[i].vy)*GRAV_B2;
} }
if(cr>255) if(cr>255)
cr=255; cr=255;
@ -2840,13 +2855,22 @@ corrupt:
void render_cursor(pixel *vid, int x, int y, int t, float rx, float ry) void render_cursor(pixel *vid, int x, int y, int t, float rx, float ry)
{ {
int i,j,c; int i,j,c;
float temprx, tempry;
if(t<PT_NUM||t==SPC_AIR||t==SPC_HEAT||t==SPC_COOL||t==SPC_VACUUM) if(t<PT_NUM||t==SPC_AIR||t==SPC_HEAT||t==SPC_COOL||t==SPC_VACUUM)
{ {
tempry = ry;
temprx = rx;
if(rx<=0) if(rx<=0)
{
xor_pixel(x, y, vid); xor_pixel(x, y, vid);
temprx = 1;
}
else if(ry<=0) else if(ry<=0)
{
xor_pixel(x, y, vid); xor_pixel(x, y, vid);
tempry = 1;
}
if(rx+ry<=0) if(rx+ry<=0)
xor_pixel(x, y, vid); xor_pixel(x, y, vid);
else if(CURRENT_BRUSH==SQUARE_BRUSH) else if(CURRENT_BRUSH==SQUARE_BRUSH)
@ -2864,7 +2888,7 @@ void render_cursor(pixel *vid, int x, int y, int t, float rx, float ry)
else if(CURRENT_BRUSH==CIRCLE_BRUSH) else if(CURRENT_BRUSH==CIRCLE_BRUSH)
for(j=0; j<=ry; j++) for(j=0; j<=ry; j++)
for(i=0; i<=rx; i++) for(i=0; i<=rx; i++)
if((i*i)/(rx*rx)+(j*j)/(ry*ry)<=1 && (((i+1)*(i+1))/(rx*rx)+(j*j)/(ry*ry)>1 || ((i*i)/(rx*rx)+((j+1)*(j+1))/(ry*ry)>1))) if((i*i)/(temprx*temprx)+(j*j)/(tempry*tempry)<=1 && (((i+1)*(i+1))/(temprx*temprx)+(j*j)/(tempry*tempry)>1 || ((i*i)/(temprx*temprx)+((j+1)*(j+1))/(tempry*tempry)>1)))
{ {
xor_pixel(x+i, y+j, vid); xor_pixel(x+i, y+j, vid);
if(j) xor_pixel(x+i, y-j, vid); if(j) xor_pixel(x+i, y-j, vid);

View File

@ -2160,11 +2160,11 @@ int main(int argc, char *argv[])
{ {
#ifdef BETA #ifdef BETA
if(REPLACE_MODE) if(REPLACE_MODE)
sprintf(uitext, "Cracker's Version %d Parts:%d REPLACE MODE", SAVE_VERSION,NUM_PARTS); sprintf(uitext, "Cracker's V%d FPS:%d Parts:%d REPLACE MODE", SAVE_VERSION, FPS,NUM_PARTS);
else if(sdl_mod&(KMOD_CAPS)) else if(sdl_mod&(KMOD_CAPS))
sprintf(uitext, "Cracker's Version %d Parts:%d CAPS LOCK ON", SAVE_VERSION, NUM_PARTS); sprintf(uitext, "Cracker's V%d FPS:%d Parts:%d CAPS LOCK ON", SAVE_VERSION, FPS, NUM_PARTS);
else else
sprintf(uitext, "Cracker's Version %d Parts:%d", SAVE_VERSION, NUM_PARTS); sprintf(uitext, "Cracker's V%d FPS:%d Parts:%d", SAVE_VERSION, FPS, NUM_PARTS);
//printf("%s\n", uitext); //printf("%s\n", uitext);
#else #else
sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS);

View File

@ -852,9 +852,55 @@ void update_particles_i(pixel *vid, int start, int inc)
int starti = (start*-1); int starti = (start*-1);
if(sys_pause&&!framerender) if(sys_pause&&!framerender)
return; return;
if(ISGRAV==1)
{
ISGRAV = 0;
GRAV ++;
GRAV_R = 60;
GRAV_G = 0;
GRAV_B = 0;
GRAV_R2 = 30;
GRAV_G2 = 30;
GRAV_B2 = 0;
for(int q = 0;q <= GRAV;q++)
{
if(GRAV_R >0 && GRAV_G==0)
{
GRAV_R--;
GRAV_B++;
}
if(GRAV_B >0 && GRAV_R==0)
{
GRAV_B--;
GRAV_G++;
}
if(GRAV_G >0 && GRAV_B==0)
{
GRAV_G--;
GRAV_R++;
}
if(GRAV_R2 >0 && GRAV_G2==0)
{
GRAV_R2--;
GRAV_B2++;
}
if(GRAV_B2 >0 && GRAV_R2==0)
{
GRAV_B2--;
GRAV_G2++;
}
if(GRAV_G2 >0 && GRAV_B2==0)
{
GRAV_G2--;
GRAV_R2++;
}
}
if(GRAV>180) GRAV = 0;
}
if(ISLOVE==1) if(ISLOVE==1)
{ {
ISLOVE = 0;
for(ny=4;ny<YRES-4;ny++) for(ny=4;ny<YRES-4;ny++)
{ {
for(nx=4;nx<XRES-4;nx++) for(nx=4;nx<XRES-4;nx++)
@ -1351,7 +1397,8 @@ void update_particles_i(pixel *vid, int start, int inc)
else else
{ {
t = parts[i].type = pstates[t].gas; t = parts[i].type = pstates[t].gas;
pv[y/CELL][x/CELL] += 0.50f; if(t!=PT_A_AS)
pv[y/CELL][x/CELL] += 0.50f;
if(t==PT_FIRE) if(t==PT_FIRE)
parts[i].life = rand()%50+120; parts[i].life = rand()%50+120;
if(t==PT_HFLM) if(t==PT_HFLM)
@ -2005,6 +2052,8 @@ void update_particles_i(pixel *vid, int start, int inc)
} }
else if(t==PT_LOVE) else if(t==PT_LOVE)
ISLOVE=1; ISLOVE=1;
else if(t==PT_GRAV)
ISGRAV=1;
else if(t==PT_CRAC) else if(t==PT_CRAC)
{ {
if(pv[y/CELL][x/CELL]<=3&&pv[y/CELL][x/CELL]>=-3) if(pv[y/CELL][x/CELL]<=3&&pv[y/CELL][x/CELL]>=-3)
@ -4231,11 +4280,13 @@ int flood_parts(int x, int y, int c, int cm, int bm)
} }
if(cm==-1) if(cm==-1)
{ {
if(c==0) if(c==0)
{ {
cm = pmap[y][x]&0xFF; cm = pmap[y][x]&0xFF;
if(!cm) if(!cm)
return 0; return 0;
if(REPLACE_MODE && cm!=SLALT)
return 0;
} }
else else
cm = 0; cm = 0;
@ -4293,7 +4344,8 @@ int flood_parts(int x, int y, int c, int cm, int bm)
int create_parts(int x, int y, float rx, float ry, int c) int create_parts(int x, int y, float rx, float ry, int c)
{ {
int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0, stemp = 0; //n; int i, j, f = 0, u, v, oy, ox, b = 0, dw = 0, stemp = 0;
float tempry, temprx; //n;
int wall = c - 100; int wall = c - 100;
@ -4303,7 +4355,10 @@ int create_parts(int x, int y, float rx, float ry, int c)
{ {
if(c == SPC_AIR || c == SPC_HEAT || c == SPC_COOL || c == SPC_VACUUM) if(c == SPC_AIR || c == SPC_HEAT || c == SPC_COOL || c == SPC_VACUUM)
break; break;
b = wall; if(wall == WL_ERASE)
b = 0;
else
b = wall;
dw = 1; dw = 1;
} }
} }
@ -4358,46 +4413,53 @@ int create_parts(int x, int y, float rx, float ry, int c)
} }
return 1; return 1;
} }
temprx = rx;//fixes windows divided by 0 crashing
tempry = ry;
if(rx == 0) rx = 1;
if(ry == 0) ry = 1;
if(((sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_SHIFT))|| sdl_mod & (KMOD_CAPS) )&& !REPLACE_MODE) if(((sdl_mod & (KMOD_LALT) && sdl_mod & (KMOD_SHIFT))|| sdl_mod & (KMOD_CAPS) )&& !REPLACE_MODE)
{ {
for(j=-ry; j<=ry; j++) for(j=-tempry; j<=tempry; j++)
for(i=-rx; i<=rx; i++) for(i=-temprx; i<=temprx; i++)
if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx)) if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx))
delete_part(x+i, y+j); delete_part(x+i, y+j);
return 1; return 1;
} }
if(REPLACE_MODE)
{
for(j=-ry; j<=ry; j++)
for(i=-rx; i<=rx; i++)
if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx))
delete_part(x+i, y+j);
if(c==0)
return 1;
}
if(c == SPC_AIR || c == SPC_HEAT || c == SPC_COOL || c == SPC_VACUUM) if(c == SPC_AIR || c == SPC_HEAT || c == SPC_COOL || c == SPC_VACUUM)
{ {
for(j=-ry; j<=ry; j++) for(j=-tempry; j<=tempry; j++)
for(i=-rx; i<=rx; i++) for(i=-temprx; i<=temprx; i++)
if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx)) if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx))
create_part(-1, x+i, y+j, c); create_part(-1, x+i, y+j, c);
return 1; return 1;
} }
if(c == 0) if(c == 0 && !REPLACE_MODE)
{ {
stemp = SLALT; stemp = SLALT;
SLALT = 0; SLALT = 0;
for(j=-ry; j<=ry; j++) for(j=-tempry; j<=tempry; j++)
for(i=-rx; i<=rx; i++) for(i=-temprx; i<=temprx; i++)
if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx)) if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx))
delete_part(x+i, y+j); delete_part(x+i, y+j);
SLALT = stemp; SLALT = stemp;
return 1; return 1;
} }
if(REPLACE_MODE) //&& c!=0)
for(j=-ry; j<=ry; j++) {
for(i=-rx; i<=rx; i++) for(j=-tempry; j<=tempry; j++)
for(i=-temprx; i<=temprx; i++)
if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx))
delete_part(x+i, y+j);
if(c==0)
return 1;
}
for(j=-tempry; j<=tempry; j++)
for(i=-temprx; i<=temprx; i++)
if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx)) if((CURRENT_BRUSH==CIRCLE_BRUSH && (i*i)/(rx*rx)+(j*j)/(ry*ry)<=1)||(CURRENT_BRUSH==SQUARE_BRUSH&&i*j<=ry*rx))
if(create_part(-1, x+i, y+j, c)==-1) if(create_part(-1, x+i, y+j, c)==-1)
f = 1; f = 1;