summaryrefslogtreecommitdiff
path: root/src/powder.c
diff options
context:
space:
mode:
authorCracker64 <cracker642@gmail.com>2011-02-23 01:55:09 (GMT)
committer Cracker64 <cracker642@gmail.com>2011-02-23 01:55:09 (GMT)
commita8439f221e7bc4a8314aa84d4be60dfa68d16831 (patch)
treed18263ade6a48e709699e590cd8e2ecd78e3fd71 /src/powder.c
parent89b19bcbeea3c90f3a30a409a113c165eb5edf39 (diff)
downloadpowder-a8439f221e7bc4a8314aa84d4be60dfa68d16831.zip
powder-a8439f221e7bc4a8314aa84d4be60dfa68d16831.tar.gz
updating
Diffstat (limited to 'src/powder.c')
-rw-r--r--src/powder.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/src/powder.c b/src/powder.c
index 5784da6..b6aab32 100644
--- a/src/powder.c
+++ b/src/powder.c
@@ -12,7 +12,7 @@ float player2[27];
particle *parts;
particle *cb_parts;
-int gravityMode = 1; // starts enabled in "vertical" mode...
+int gravityMode = 0; // starts enabled in "vertical" mode...
int airMode = 0;
@@ -253,6 +253,7 @@ int try_move(int i, int x, int y, int nx, int ny)
if (parts[e].type == PT_PHOT)
return 1;
+ if ((pmap[ny][nx]>>8)==e) pmap[ny][nx] = 0;
parts[e].x += x-nx;
parts[e].y += y-ny;
pmap[(int)(parts[e].y+0.5f)][(int)(parts[e].x+0.5f)] = (e<<8)|parts[e].type;
@@ -453,8 +454,8 @@ _inline void part_change_type(int i, int x, int y, int t)
inline void part_change_type(int i, int x, int y, int t)
#endif
{
- if (x<0 || y<0 || x>=XRES || y>=YRES || i>=NPART)
- return -1;
+ if (x<0 || y<0 || x>=XRES || y>=YRES || i>=NPART || t<0 || t>=PT_NUM)
+ return;
parts[i].type = t;
if (t==PT_PHOT)// || t==PT_NEUT)
{
@@ -484,7 +485,7 @@ inline int create_n_parts(int n, int x, int y, float vx, float vy, int t)
if (n>680) {
n = 680;
}
- if (x<0 || y<0 || x>=XRES || y>=YRES)
+ if (x<0 || y<0 || x>=XRES || y>=YRES || t<0 || t>=PT_NUM)
return -1;
for (c; c<n; c++) {
@@ -522,7 +523,7 @@ inline int create_part(int p, int x, int y, int t)
{
int i;
- if (x<0 || y<0 || x>=XRES || y>=YRES)
+ if (x<0 || y<0 || x>=XRES || y>=YRES || ((t<0 || t>=PT_NUM)&&t!=SPC_HEAT&&t!=SPC_COOL&&t!=SPC_AIR&&t!=SPC_VACUUM))
return -1;
if (t==SPC_HEAT||t==SPC_COOL)
@@ -1134,7 +1135,7 @@ int nearest_part(int ci, int t)
void update_particles_i(pixel *vid, int start, int inc)
{
- int i, j, x, y, t, nx, ny, r, surround_space, s, lt, rt, nt, nnx, nny, q, golnum, goldelete, z, neighbors;
+ int i, j, x, y, t, nx, ny, r, surround_space, s, lt, rt, nt, nnx, nny, q, golnum, goldelete, z, neighbors, createdsomething;
float mv, dx, dy, ix, iy, lx, ly, nrx, nry, dp, ctemph, ctempl;
int fin_x, fin_y, clear_x, clear_y;
float fin_xf, fin_yf, clear_xf, clear_yf;
@@ -1337,14 +1338,14 @@ void update_particles_i(pixel *vid, int start, int inc)
if(neighbors==0 || !(ptypes[r&0xFF].properties&PROP_LIFE || !r&0xFF) || (r>>8)>=NPART)
continue;
for ( golnum = 1; golnum<=NGOL; golnum++)
- for ( goldelete = 0; goldelete<9; goldelete++)
{
- if (neighbors==goldelete&&gol[nx][ny]==0&&grule[golnum][goldelete]>=2&&gol2[nx][ny][golnum]>=(goldelete%2)+goldelete/2)
+ goldelete = neighbors;
+ if (gol[nx][ny]==0&&grule[golnum][goldelete]>=2&&gol2[nx][ny][golnum]>=(goldelete%2)+goldelete/2)
{
if (create_part(-1,nx,ny,goltype[golnum-1]))
createdsomething = 1;
}
- else if (neighbors-1==goldelete&&gol[nx][ny]==golnum&&(grule[golnum][goldelete]==0||grule[golnum][goldelete]==2))//subtract 1 because it counted itself
+ else if (gol[nx][ny]==golnum&&(grule[golnum][goldelete-1]==0||grule[golnum][goldelete-1]==2))//subtract 1 because it counted itself
{
if(parts[r>>8].tmp==grule[golnum][9]-1)
parts[r>>8].tmp --;
@@ -1442,21 +1443,18 @@ void update_particles_i(pixel *vid, int start, int inc)
//Gravity mode by Moach
switch (gravityMode)
{
- default:
- case 0:
- pGravX = pGravY = 0.0f;
- break;
- case 1:
- pGravX = 0.0f;
- pGravY = ptypes[t].gravity;
- break;
- case 2:
-
- pGravD = 0.01f - hypotf((x - XCNTR), (y - YCNTR));
-
- pGravX = ptypes[t].gravity * ((float)(x - XCNTR) / pGravD);
- pGravY = ptypes[t].gravity * ((float)(y - YCNTR) / pGravD);
-
+ default:
+ case 0:
+ pGravX = 0.0f;
+ pGravY = ptypes[t].gravity;
+ break;
+ case 1:
+ pGravX = pGravY = 0.0f;
+ break;
+ case 2:
+ pGravD = 0.01f - hypotf((x - XCNTR), (y - YCNTR));
+ pGravX = ptypes[t].gravity * ((float)(x - XCNTR) / pGravD);
+ pGravY = ptypes[t].gravity * ((float)(y - YCNTR) / pGravD);
}
parts[i].vx *= ptypes[t].loss;
@@ -1782,6 +1780,9 @@ killed:
}
}
+ rt = parts[i].flags & FLAG_STAGNANT;
+ parts[i].flags &= ~FLAG_STAGNANT;
+
if ((t==PT_PHOT||t==PT_NEUT)) {
if (t == PT_PHOT) {
rt = pmap[fin_y][fin_x] & 0xFF;
@@ -2010,24 +2011,25 @@ killed:
break;
}
}
- else if (clear_x!=x&&clear_y!=y && try_move(i, x, y, clear_x, clear_y)) {
+ else if ((clear_x!=x||clear_y!=y) && try_move(i, x, y, clear_x, clear_y)) {
// if interpolation was done and haven't yet moved, try moving to last clear position
parts[i].x = clear_xf;
parts[i].y = clear_yf;
}
+ else
+ parts[i].flags |= FLAG_STAGNANT;
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
- if (!s)
- parts[i].flags |= FLAG_STAGNANT;
}
else
{
- if (clear_x!=x&&clear_y!=y && try_move(i, x, y, clear_x, clear_y)) {
+ if ((clear_x!=x||clear_y!=y) && try_move(i, x, y, clear_x, clear_y)) {
// if interpolation was done, try moving to last clear position
parts[i].x = clear_xf;
parts[i].y = clear_yf;
}
- parts[i].flags |= FLAG_STAGNANT;
+ else
+ parts[i].flags |= FLAG_STAGNANT;
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
}
@@ -2710,7 +2712,7 @@ void create_box(int x1, int y1, int x2, int y2, int c)
}
for (j=y1; j<=y2; j++)
for (i=x1; i<=x2; i++)
- create_parts(i, j, 1, 1, c);
+ create_parts(i, j, 0, 0, c);
}
int flood_parts(int x, int y, int c, int cm, int bm)