From 60e4c076cbb84c457573417cda5e1659b106bf83 Mon Sep 17 00:00:00 2001 From: Philip Date: Mon, 22 Nov 2010 15:36:24 -0500 Subject: [PATCH] floodfill fix, @_@ elements, grav changes color --- includes/defines.h | 8 ++++ includes/powder.h | 16 +++++-- src/graphics.c | 38 +++++++++++++--- src/main.c | 6 +-- src/powder.c | 110 +++++++++++++++++++++++++++++++++++---------- 5 files changed, 141 insertions(+), 37 deletions(-) diff --git a/includes/defines.h b/includes/defines.h index 3dba08fff..10f210d2e 100644 --- a/includes/defines.h +++ b/includes/defines.h @@ -87,6 +87,13 @@ extern int amd; extern int FPSB; 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; @@ -115,6 +122,7 @@ int MSIGN; int CGOL; int ISGOL; int ISLOVE; +int ISGRAV; int GSPEED; int love[XRES/9][YRES/9]; int gol[XRES][YRES]; diff --git a/includes/powder.h b/includes/powder.h index b989de722..562229399 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -149,7 +149,10 @@ #define PT_FRZZ 100 #define PT_FRZW 101 #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 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}, {"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}, + {"@_@", 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 }; @@ -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}, - /* Crac */ {ST_SOLID, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_FIRE, 22730.0f}, - /* RIME */ {ST_SOLID, PT_NONE, 0.0f, PT_WATR, 273.15f, 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, 2730.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}, /* 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}, @@ -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}, /* 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}, + /* 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] = { diff --git a/src/graphics.c b/src/graphics.c index 8c873d1f7..03ff5e94f 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1495,15 +1495,30 @@ void draw_parts(pixel *vid) cg = 20; cb = 20; 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) - 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) - 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) { - cr -= (parts[i].vy)*30; - cg -= (parts[i].vy)*30; + cr -= (parts[i].vy)*GRAV_R2; + cg -= (parts[i].vy)*GRAV_G2; + cb -= (parts[i].vy)*GRAV_B2; } if(cr>255) cr=255; @@ -2840,13 +2855,22 @@ corrupt: 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(t1 || ((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); if(j) xor_pixel(x+i, y-j, vid); diff --git a/src/main.c b/src/main.c index 5a8189bce..3020cbf1f 100644 --- a/src/main.c +++ b/src/main.c @@ -2160,11 +2160,11 @@ int main(int argc, char *argv[]) { #ifdef BETA 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)) - 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 - 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); #else sprintf(uitext, "Version %d.%d FPS:%d", SAVE_VERSION, MINOR_VERSION, FPS); diff --git a/src/powder.c b/src/powder.c index 773d4fdf5..dac227f5b 100644 --- a/src/powder.c +++ b/src/powder.c @@ -852,9 +852,55 @@ void update_particles_i(pixel *vid, int start, int inc) int starti = (start*-1); if(sys_pause&&!framerender) 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) { + ISLOVE = 0; for(ny=4;ny=-3) @@ -4231,11 +4280,13 @@ int flood_parts(int x, int y, int c, int cm, int bm) } if(cm==-1) { - if(c==0) + if(c==0) { cm = pmap[y][x]&0xFF; if(!cm) return 0; + if(REPLACE_MODE && cm!=SLALT) + return 0; } else 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 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; @@ -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) break; - b = wall; + if(wall == WL_ERASE) + b = 0; + else + b = wall; dw = 1; } } @@ -4358,46 +4413,53 @@ int create_parts(int x, int y, float rx, float ry, int c) } 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) { - 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); 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) { - 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)) create_part(-1, x+i, y+j, c); return 1; } - if(c == 0) + if(c == 0 && !REPLACE_MODE) { stemp = SLALT; SLALT = 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); SLALT = stemp; return 1; } - - for(j=-ry; j<=ry; j++) - for(i=-rx; i<=rx; i++) + if(REPLACE_MODE) //&& c!=0) + { + 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(create_part(-1, x+i, y+j, c)==-1) f = 1;