short **Next;
short **Draw;
-static short *Index[4][HEIGHT];
-static short Array[4][HEIGHT][WIDTH];
+static short *Index[4][WIDTH];
+static short Array[4][WIDTH][HEIGHT];
extern int screen_x;
extern int screen_y;
for (y = 0; y < HEIGHT; y++)
for (x = 0; x < WIDTH; x++)
- Array[0][y][x] = ZBORDER;
+ Array[0][x][y] = Zborder;
for (y = 0; y < HEIGHT; y++)
for (x = 0; x < WIDTH; x++)
- Array[1][y][x] = ZBORDER;
+ Array[1][x][y] = Zborder;
for (y = 0; y < HEIGHT; y++)
for (x = 0; x < WIDTH; x++)
- Array[2][y][x] = ZBORDER;
+ Array[2][x][y] = Zborder;
for (y = 0; y < HEIGHT; y++)
for (x = 0; x < WIDTH; x++)
- Array[3][y][x] = Xblank;
+ Array[3][x][y] = Xblank;
- for (y = 0; y < HEIGHT; y++)
- Index[0][y] = Array[0][y];
- for (y = 0; y < HEIGHT; y++)
- Index[1][y] = Array[1][y];
- for (y = 0; y < HEIGHT; y++)
- Index[2][y] = Array[2][y];
- for (y = 0; y < HEIGHT; y++)
- Index[3][y] = Array[3][y];
+ for (x = 0; x < WIDTH; x++)
+ Index[0][x] = Array[0][x];
+ for (x = 0; x < WIDTH; x++)
+ Index[1][x] = Array[1][x];
+ for (x = 0; x < WIDTH; x++)
+ Index[2][x] = Array[2][x];
+ for (x = 0; x < WIDTH; x++)
+ Index[3][x] = Array[3][x];
Cave = Index[0];
Next = Index[1];
Boom = Index[3];
}
-void InitGameEngine_EM()
+void InitGameEngine_EM(void)
{
prepare_em_level();
game_initscreen();
- game_animscreen();
+
+ RedrawPlayfield_EM(FALSE);
}
-void UpdateGameDoorValues_EM()
+static void UpdateGameDoorValues_EM(void)
{
}
for (i = 0; i < MAX_PLAYERS; i++)
readjoy(action[i], &ply[i]);
- UpdateEngineValues(screen_x / TILEX, screen_y / TILEY);
+ UpdateEngineValues(screen_x / TILEX, screen_y / TILEY, ply[0].x, ply[0].y);
if (frame == 7)
{
- synchro_1();
- synchro_2();
+ logic_1();
+ logic_2();
}
if (frame == 6)
{
- synchro_3();
- sound_play();
+ logic_3();
UpdateGameDoorValues_EM();
}
CheckSingleStepMode_EM(action, frame, game_em.any_player_moving,
game_em.any_player_snapping, any_player_dropping);
- game_animscreen();
-
- blitscreen();
+ RedrawPlayfield_EM(FALSE);
}
/* read input device for players */
int north = 0, east = 0, south = 0, west = 0;
int snap = 0, drop = 0;
+ if (game_em.use_single_button && action & (JOY_BUTTON_1 | JOY_BUTTON_2))
+ action |= JOY_BUTTON_1 | JOY_BUTTON_2;
+
if (action & JOY_LEFT)
west = 1;
if (action & JOY_BUTTON_2)
drop = 1;
- ply->joy_snap = snap;
+ /* always update drop action */
ply->joy_drop = drop;
- if (ply->joy_stick || (north | east | south | west))
+ if (ply->joy_stick || (north | east | south | west)) /* (no "| snap"!) */
{
ply->joy_n = north;
ply->joy_e = east;
ply->joy_s = south;
ply->joy_w = west;
+
+ /* when storing last action, only update snap action with direction */
+ /* (prevents clearing direction if snapping stopped before frame 7) */
+ ply->joy_snap = snap;
}
+
+ /* if no direction was stored before, allow setting snap to current state */
+ if (!ply->joy_n &&
+ !ply->joy_e &&
+ !ply->joy_s &&
+ !ply->joy_w)
+ ply->joy_snap = snap;
+
+ /* use bug with snap key (mainly TAS keys) sometimes moving the player */
+ if (game_em.use_snap_key_bug)
+ ply->joy_snap = snap;
}
-void SaveEngineSnapshotValues_EM()
+void SaveEngineSnapshotValues_EM(void)
{
int i, j, k;
for (i = 0; i < 4; i++)
for (j = 0; j < HEIGHT; j++)
for (k = 0; k < WIDTH; k++)
- engine_snapshot_em.Array[i][j][k] = Array[i][j][k];
+ engine_snapshot_em.Array[i][k][j] = Array[i][k][j];
}
-void LoadEngineSnapshotValues_EM()
+void LoadEngineSnapshotValues_EM(void)
{
int i, j, k;
for (i = 0; i < 4; i++)
for (j = 0; j < HEIGHT; j++)
for (k = 0; k < WIDTH; k++)
- Array[i][j][k] = engine_snapshot_em.Array[i][j][k];
+ Array[i][k][j] = engine_snapshot_em.Array[i][k][j];
}