summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacksonmj <jacksonmj@jacksonmj.none>2011-01-15 16:57:14 (GMT)
committer jacksonmj <jacksonmj@jacksonmj.none>2011-01-15 17:01:20 (GMT)
commitde58e9a2e70d545339cccf86512269bd6e9a0335 (patch)
treee098fb5c2598122c54394437054850f4bb3f9ffd /src
parent1833be451f1bb57b6b0f2709a4c98da9356542d4 (diff)
downloadpowder-de58e9a2e70d545339cccf86512269bd6e9a0335.zip
powder-de58e9a2e70d545339cccf86512269bd6e9a0335.tar.gz
Fix E-hole
Was broken for powders by fixing fast moving particles going through obstacles. For gasses, was broken in upstream.
Diffstat (limited to 'src')
-rw-r--r--src/powder.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/src/powder.c b/src/powder.c
index 3578154..6f535b6 100644
--- a/src/powder.c
+++ b/src/powder.c
@@ -1869,14 +1869,14 @@ killed:
if (fin_y<y-ISTP) fin_y=y-ISTP;
if (try_move(i, x, y, 2*x-fin_x, fin_y))
{
- parts[i].x = (float)(2*x-fin_x);
- parts[i].y = fin_yf;
+ parts[i].x = 0.25f+(float)(2*x-fin_x);
+ parts[i].y = 0.25f+fin_y;
parts[i].vx *= ptypes[t].collision;
}
else if (try_move(i, x, y, fin_x, 2*y-fin_y))
{
- parts[i].x = fin_xf;
- parts[i].y = (float)(2*y-fin_y);
+ parts[i].x = 0.25f+fin_x;
+ parts[i].y = 0.25f+(float)(2*y-fin_y);
parts[i].vy *= ptypes[t].collision;
}
else
@@ -1891,19 +1891,19 @@ killed:
// liquids and powders
// TODO: rewrite to operate better with radial gravity
if (try_move(i, x, y, fin_x, fin_y)) {
- parts[i].x = fin_x;
- parts[i].y = fin_y;
+ parts[i].x = fin_xf;
+ parts[i].y = fin_yf;
} else {
- parts[i].x = clear_x;
- parts[i].y = clear_y;
if (fin_x!=x && try_move(i, x, y, fin_x, clear_y))
{
parts[i].x = fin_xf;
+ parts[i].y = clear_yf;
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
}
else if (fin_y!=y && try_move(i, x, y, clear_x, fin_y))
{
+ parts[i].x = clear_xf;
parts[i].y = fin_yf;
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
@@ -1913,14 +1913,14 @@ killed:
r = (rand()%2)*2-1;
if (fin_y!=clear_y && try_move(i, x, y, clear_x+r, fin_y))
{
- parts[i].x += r;
+ parts[i].x = clear_xf+r;
parts[i].y = fin_yf;
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
}
else if (fin_y!=clear_y && try_move(i, x, y, clear_x-r, fin_y))
{
- parts[i].x -= r;
+ parts[i].x = clear_xf-r;
parts[i].y = fin_yf;
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
@@ -1928,14 +1928,14 @@ killed:
else if (fin_x!=clear_x && try_move(i, x, y, fin_x, clear_y+r))
{
parts[i].x = fin_xf;
- parts[i].y += r;
+ parts[i].y = clear_yf+r;
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
}
else if (fin_x!=clear_x && try_move(i, x, y, fin_x, clear_y-r))
{
parts[i].x = fin_xf;
- parts[i].y -= r;
+ parts[i].y = clear_yf-r;
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
}
@@ -1950,8 +1950,8 @@ killed:
{
if (try_move(i, x, y, j, fin_y))
{
- parts[i].x += j-clear_x;
- parts[i].y += fin_y-clear_y;
+ parts[i].x = clear_xf+(j-clear_x);
+ parts[i].y = fin_yf;
x = j;
y = fin_y;
s = 1;
@@ -1959,7 +1959,7 @@ killed:
}
if (try_move(i, x, y, j, clear_y))
{
- parts[i].x += j-clear_x;
+ parts[i].x = clear_xf+(j-clear_x);
x = j;
s = 1;
break;
@@ -1976,7 +1976,7 @@ killed:
{
if (try_move(i, x, y, clear_x, j))
{
- parts[i].y += j-clear_y;
+ parts[i].y = clear_yf+(j-clear_y);
break;
}
if ((pmap[j][x]&255)!=t || (bmap[j/CELL][x/CELL] && bmap[j/CELL][x/CELL]!=WL_STREAM))
@@ -1985,9 +1985,10 @@ killed:
break;
}
}
- else if (clear_x!=x&&clear_y!=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
- try_move(i, x, y, clear_x, clear_y);
+ parts[i].x = clear_xf;
+ parts[i].y = clear_yf;
}
parts[i].vx *= ptypes[t].collision;
parts[i].vy *= ptypes[t].collision;
@@ -1996,9 +1997,10 @@ killed:
}
else
{
- if (clear_x!=x&&clear_y!=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
- try_move(i, x, y, clear_x, clear_y);
+ parts[i].x = clear_xf;
+ parts[i].y = clear_yf;
}
parts[i].flags |= FLAG_STAGNANT;
parts[i].vx *= ptypes[t].collision;