* graphics manipulation crap
*/
-#include "global.h"
-#include "display.h"
-#include "level.h"
+#include "main_em.h"
#define MIN_SCREEN_XPOS 1
#define MIN_SCREEN_YPOS 1
(8 - frame) * ply[p].y) * TILEY / 8 \
- ((SCR_FIELDY - 1) * TILEY) / 2)
+#define USE_EXTENDED_GRAPHICS_ENGINE 0
int frame; /* current screen frame */
int screen_x; /* current scroll position */
}
}
-void blitscreen(void)
+void BackToFront_EM(void)
{
static boolean scrolling_last = FALSE;
int left = screen_x / TILEX;
boolean scrolling = (screen_x % TILEX != 0 || screen_y % TILEY != 0);
int x, y;
+ SyncDisplay();
+
if (redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last)
{
/* blit all (up to four) parts of the scroll buffer to the backbuffer */
}
}
+ FlushDisplay();
+
for (x = 0; x < MAX_BUF_XSIZE; x++)
for (y = 0; y < MAX_BUF_YSIZE; y++)
redraw[x][y] = FALSE;
scrolling_last = scrolling;
}
+void blitscreen(void)
+{
+ BackToFront_EM();
+}
+
static void DrawLevelField_EM(int x, int y, int sx, int sy,
boolean draw_masked)
{
int tile = Draw[y][x];
struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
+
+#if USE_EXTENDED_GRAPHICS_ENGINE
+ getGraphicSourceObjectExt_EM(tile, frame, &g->bitmap, &g->src_x, &g->src_y,
+ x - 2, y - 2);
+#endif
+
int src_x = g->src_x + g->src_offset_x;
int src_y = g->src_y + g->src_offset_y;
int dst_x = sx * TILEX + g->dst_offset_x;
{
struct GraphicInfo_EM *g = &graphic_info_em_player[player_nr][anim][frame];
+#if USE_EXTENDED_GRAPHICS_ENGINE
+ getGraphicSourcePlayerExt_EM(player_nr, anim, frame,
+ &g->bitmap, &g->src_x, &g->src_y);
+#endif
+
int src_x = g->src_x, src_y = g->src_y;
int dst_x, dst_y;
}
/* only redraw screen tiles if they (or their crumbled state) changed */
+#if USE_EXTENDED_GRAPHICS_ENGINE
+ // if (screentiles[sy][sx] != obj || crumbled_state[sy][sx] != crm)
+#else
if (screentiles[sy][sx] != obj || crumbled_state[sy][sx] != crm)
+#endif
{
DrawLevelField_EM(x, y, sx, sy, FALSE);
DrawLevelFieldCrumbled_EM(x, y, sx, sy, crm, FALSE);
DrawLevelField_EM(new_x, new_y, new_sx, new_sy, TRUE);
}
- /* mark screen tiles as dirty */
+ /* redraw screen tiles in the next frame (player may have left the tiles) */
screentiles[old_sy][old_sx] = -1;
screentiles[new_sy][new_sx] = -1;
+
+ /* mark screen tiles as dirty (force screen refresh with changed content) */
+ redraw[old_sx][old_sy] = TRUE;
+ redraw[new_sx][new_sy] = TRUE;
+ redraw_tiles += 2;
}
}
if (quick_relocation)
{
- int offset = (setup.scroll_delay ? 3 : 0);
+ int offset = game.scroll_delay_value;
if (!IN_VIS_FIELD(SCREENX(jx), SCREENY(jy)))
{
}
#endif
+static int getMaxCenterDistancePlayerNr(int center_x, int center_y)
+{
+ int max_dx = 0, max_dy = 0;
+ int player_nr = game_em.last_moving_player;
+ int i;
+
+ for (i = 0; i < MAX_PLAYERS; i++)
+ {
+ if (ply[i].alive)
+ {
+ int sx = PLAYER_SCREEN_X(i);
+ int sy = PLAYER_SCREEN_Y(i);
+
+ if (game_em.last_player_direction[i] != MV_NONE &&
+ (ABS(sx - center_x) > max_dx ||
+ ABS(sy - center_y) > max_dy))
+ {
+ max_dx = MAX(max_dx, ABS(sx - center_x));
+ max_dy = MAX(max_dy, ABS(sy - center_y));
+
+ player_nr = i;
+ }
+ }
+ }
+
+ return player_nr;
+}
+
static void setMinimalPlayerBoundaries(int *sx1, int *sy1, int *sx2, int *sy2)
{
boolean num_checked_players = 0;
boolean game.set_centered_player = getSetCenteredPlayer_EM();
int game.centered_player_nr_next = getCenteredPlayerNr_EM();
#endif
- int offset = (setup.scroll_delay ? 3 : 0) * TILEX;
+#if 1
+ int max_center_distance_player_nr =
+ getMaxCenterDistancePlayerNr(screen_x, screen_y);
+#else
+ int player_nr = game_em.last_moving_player;
+#endif
+ int stepsize = TILEX / 8;
+ int offset = game.scroll_delay_value * TILEX;
int offset_x = offset;
int offset_y = offset;
int screen_x_old = screen_x;
if (game.centered_player_nr == -1)
{
+#if 1
+ if (draw_new_player_location || offset == 0)
+#else
if (draw_new_player_location)
+#endif
{
setScreenCenteredToAllPlayers(&sx, &sy);
}
else
{
+#if 1
+ sx = PLAYER_SCREEN_X(max_center_distance_player_nr);
+ sy = PLAYER_SCREEN_Y(max_center_distance_player_nr);
+#else
sx = PLAYER_SCREEN_X(game_em.last_moving_player);
sy = PLAYER_SCREEN_Y(game_em.last_moving_player);
+#endif
}
}
else
blitplayer(&ply[i]);
blitscreen();
- FlushDisplay();
+
Delay(wait_delay_value);
/* scroll second step to align at full tile size */
screen_x -= dxx;
screen_y -= dyy;
+#if 0
SyncDisplay();
+#endif
animscreen();
blitplayer(&ply[i]);
blitscreen();
- FlushDisplay();
+
Delay(wait_delay_value);
}
sy - offset_y > screen_y ? sy - offset_y :
screen_y);
- /* prevent scrolling further than player step size screen when scrolling */
- if (ABS(screen_x - screen_x_old) > TILEX / 8 ||
- ABS(screen_y - screen_y_old) > TILEY / 8)
+#if 0
+ printf("::: (%d, %d) => (%d, %d) [(%d, %d), (%d, %d)] [%d, %d] [%d / %d]\n",
+ screen_x_old, screen_y_old,
+ screen_x, screen_y,
+ ply[max_center_distance_player_nr].oldx,
+ ply[max_center_distance_player_nr].x,
+ ply[max_center_distance_player_nr].oldy,
+ ply[max_center_distance_player_nr].y,
+ sx, sy,
+ ABS(screen_x - screen_x_old),
+ ABS(screen_y - screen_y_old));
+#endif
+
+#if 1
+
+#if 1
+ /* prevent scrolling further than double player step size when scrolling */
+ if (ABS(screen_x - screen_x_old) > 2 * stepsize)
+ {
+ int dx = SIGN(screen_x - screen_x_old);
+
+ screen_x = screen_x_old + dx * 2 * stepsize;
+ }
+ if (ABS(screen_y - screen_y_old) > 2 * stepsize)
+ {
+ int dy = SIGN(screen_y - screen_y_old);
+
+ screen_y = screen_y_old + dy * 2 * stepsize;
+ }
+#else
+ /* prevent scrolling further than double player step size when scrolling */
+ if (ABS(screen_x - screen_x_old) > 2 * stepsize ||
+ ABS(screen_y - screen_y_old) > 2 * stepsize)
{
int dx = SIGN(screen_x - screen_x_old);
int dy = SIGN(screen_y - screen_y_old);
- screen_x = screen_x_old + dx * TILEX / 8;
- screen_y = screen_y_old + dy * TILEY / 8;
+ screen_x = screen_x_old + dx * 2 * stepsize;
+ screen_y = screen_y_old + dy * 2 * stepsize;
}
+#endif
+
+#else
+ /* prevent scrolling further than player step size when scrolling */
+ if (ABS(screen_x - screen_x_old) > stepsize ||
+ ABS(screen_y - screen_y_old) > stepsize)
+ {
+ int dx = SIGN(screen_x - screen_x_old);
+ int dy = SIGN(screen_y - screen_y_old);
+
+ screen_x = screen_x_old + dx * stepsize;
+ screen_y = screen_y_old + dy * stepsize;
+ }
+#endif
/* prevent scrolling away from the other players when focus on all players */
if (game.centered_player_nr == -1)
{
#if 1
/* check if all players are still visible with new scrolling position */
- if (!checkIfAllPlayersAreVisible(screen_x, screen_y))
+ if (checkIfAllPlayersAreVisible(screen_x_old, screen_y_old) &&
+ !checkIfAllPlayersAreVisible(screen_x, screen_y))
{
/* reset horizontal scroll position to last value, if needed */
if (!checkIfAllPlayersAreVisible(screen_x, screen_y_old))
else
{
/* prevent scrolling against the players move direction */
+#if 0
int player_nr = game_em.last_moving_player;
+#endif
+ int player_nr = (game.centered_player_nr == -1 ?
+ max_center_distance_player_nr : game.centered_player_nr);
int player_move_dir = game_em.last_player_direction[player_nr];
int dx = SIGN(screen_x - screen_x_old);
int dy = SIGN(screen_y - screen_y_old);
for (i = 0; i < MAX_PLAYERS; i++)
blitplayer(&ply[i]);
+#if 0
+#if 0
SyncDisplay();
+#endif
blitscreen();
-
- FlushDisplay();
+#endif
}
void game_animscreen(void)
void DrawGameDoorValues_EM()
{
+#if 1
+ int dynamite_state;
+ int key_state;
+#else
int dynamite_state = ply[0].dynamite; /* !!! ONLY PLAYER 1 !!! */
- int all_keys_state = ply[0].keys | ply[1].keys | ply[2].keys | ply[3].keys;
+ int key_state = ply[0].keys | ply[1].keys | ply[2].keys | ply[3].keys;
+#endif
+
+#if 1
+ if (game.centered_player_nr == -1)
+ {
+#if 1
+ int i;
+
+ dynamite_state = 0;
+ key_state = 0;
+
+ for (i = 0; i < MAX_PLAYERS; i++)
+ {
+ dynamite_state += ply[i].dynamite;
+ key_state |= ply[i].keys;
+ }
+
+#else
+
+ dynamite_state = ply[0].dynamite; /* !!! ONLY PLAYER 1 !!! */
+ key_state = ply[0].keys | ply[1].keys | ply[2].keys | ply[3].keys;
+#endif
+ }
+ else
+ {
+ int player_nr = game.centered_player_nr;
+
+ dynamite_state = ply[player_nr].dynamite;
+ key_state = ply[player_nr].keys;
+ }
+#endif
#if 1
DrawAllGameValues(lev.required, dynamite_state, lev.score,
- lev.time, all_keys_state);
+ lev.time, key_state);
#else
DrawAllGameValues(lev.required, ply1.dynamite, lev.score,
DISPLAY_TIME(lev.time), ply1.keys | ply2.keys);