X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=daf96fe52f7da0c1e22d0cfc4b6fa5539d17bd27;hb=5ba7f2d9a3f07f342afdf215a3307d5487cb6d43;hp=717ea8d2f263fd0d3ab1d3d99677ac860a469acc;hpb=3da9c6a38081401af8c47d78330a199104f9ad2f;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 717ea8d2..daf96fe5 100644 --- a/src/game.c +++ b/src/game.c @@ -4228,7 +4228,8 @@ void InitGame() #else for (i = 0; i < MAX_PLAYERS; i++) { - if (stored_player[i].active && !tape.player_participates[i]) + if (stored_player[i].active && + !tape.player_participates[i]) { struct PlayerInfo *player = &stored_player[i]; int jx = player->jx, jy = player->jy; @@ -4467,6 +4468,13 @@ void InitGame() /* blit playfield from scroll buffer to normal back buffer for fading in */ BlitScreenToBitmap_EM(backbuffer); } + else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) + { + InitGameEngine_SP(); + + /* blit playfield from scroll buffer to normal back buffer for fading in */ + BlitScreenToBitmap_SP(backbuffer); + } else { DrawLevel(); @@ -5502,8 +5510,6 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, if (quick_relocation) { - int offset = game.scroll_delay_value; - if (!IN_VIS_FIELD(SCREENX(x), SCREENY(y)) || center_screen) { if (!level.shifted_relocation || center_screen) @@ -5544,8 +5550,47 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, } else { +#if 1 + if (!level.shifted_relocation || center_screen) + { + /* quick relocation (without scrolling), with centering of screen */ + + scroll_x = (x < SBX_Left + MIDPOSX ? SBX_Left : + x > SBX_Right + MIDPOSX ? SBX_Right : + x - MIDPOSX); + + scroll_y = (y < SBY_Upper + MIDPOSY ? SBY_Upper : + y > SBY_Lower + MIDPOSY ? SBY_Lower : + y - MIDPOSY); + } + else + { + /* quick relocation (without scrolling), but do not center screen */ + + int center_scroll_x = (old_x < SBX_Left + MIDPOSX ? SBX_Left : + old_x > SBX_Right + MIDPOSX ? SBX_Right : + old_x - MIDPOSX); + + int center_scroll_y = (old_y < SBY_Upper + MIDPOSY ? SBY_Upper : + old_y > SBY_Lower + MIDPOSY ? SBY_Lower : + old_y - MIDPOSY); + + int offset_x = x + (scroll_x - center_scroll_x); + int offset_y = y + (scroll_y - center_scroll_y); + + scroll_x = (offset_x < SBX_Left + MIDPOSX ? SBX_Left : + offset_x > SBX_Right + MIDPOSX ? SBX_Right : + offset_x - MIDPOSX); + + scroll_y = (offset_y < SBY_Upper + MIDPOSY ? SBY_Upper : + offset_y > SBY_Lower + MIDPOSY ? SBY_Lower : + offset_y - MIDPOSY); + } +#else /* quick relocation (without scrolling), inside visible screen area */ + int offset = game.scroll_delay_value; + if ((move_dir == MV_LEFT && scroll_x > x - MIDPOSX + offset) || (move_dir == MV_RIGHT && scroll_x < x - MIDPOSX - offset)) scroll_x = x - MIDPOSX + (scroll_x < x - MIDPOSX ? -offset : +offset); @@ -5561,6 +5606,7 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, /* don't scroll over playfield boundaries */ if (scroll_y < SBY_Upper || scroll_y > SBY_Lower) scroll_y = (scroll_y < SBY_Upper ? SBY_Upper : SBY_Lower); +#endif } RedrawPlayfield(TRUE, 0,0,0,0); @@ -12246,15 +12292,6 @@ void GameActions() game.set_centered_player = TRUE; } -#if 0 /* USE_NEW_PLAYER_ASSIGNMENTS */ - for (i = 0; i < MAX_PLAYERS; i++) - { - summarized_player_action |= stored_player[i].mapped_action; - - if (!network_playing) - stored_player[i].effective_action = stored_player[i].mapped_action; - } -#else for (i = 0; i < MAX_PLAYERS; i++) { summarized_player_action |= stored_player[i].action; @@ -12262,7 +12299,6 @@ void GameActions() if (!network_playing) stored_player[i].effective_action = stored_player[i].action; } -#endif #if defined(NETWORK_AVALIABLE) if (network_playing) @@ -12279,25 +12315,13 @@ void GameActions() (i == game.centered_player_nr ? summarized_player_action : 0); } -#if 0 /* USE_NEW_PLAYER_ASSIGNMENTS */ - if (recorded_player_action != NULL) - for (i = 0; i < MAX_PLAYERS; i++) - stored_player[i].effective_action = - recorded_player_action[map_player_action[i]]; -#else if (recorded_player_action != NULL) for (i = 0; i < MAX_PLAYERS; i++) - stored_player[i].effective_action = - recorded_player_action[i]; -#endif + stored_player[i].effective_action = recorded_player_action[i]; for (i = 0; i < MAX_PLAYERS; i++) { -#if 0 /* USE_NEW_PLAYER_ASSIGNMENTS */ - tape_action[i] = stored_player[i].action; -#else tape_action[i] = stored_player[i].effective_action; -#endif /* (this can only happen in the R'n'D game engine) */ if (tape.recording && tape_action[i] && !tape.player_participates[i]) @@ -12310,39 +12334,24 @@ void GameActions() #if USE_NEW_PLAYER_ASSIGNMENTS { -#if 0 - - for (i = 0; i < MAX_PLAYERS; i++) - stored_player[i].mapped_action = stored_player[map_player_action[i]].action; - -#else - -#if 1 - byte unmapped_action[MAX_PLAYERS]; - - for (i = 0; i < MAX_PLAYERS; i++) - unmapped_action[i] = stored_player[i].effective_action; + byte mapped_action[MAX_PLAYERS]; for (i = 0; i < MAX_PLAYERS; i++) - stored_player[i].effective_action = unmapped_action[map_player_action[i]]; -#endif + mapped_action[i] = stored_player[map_player_action[i]].effective_action; -#if 0 for (i = 0; i < MAX_PLAYERS; i++) - printf("::: %d: %d [%d]\n", i, stored_player[i].effective_action, - map_player_action[i]); -#endif -#endif + stored_player[i].effective_action = mapped_action[i]; } -#else - for (i = 0; i < MAX_PLAYERS; i++) - stored_player[i].mapped_action = stored_player[i].action; #endif if (level.game_engine_type == GAME_ENGINE_TYPE_EM) { GameActions_EM_Main(); } + else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) + { + GameActions_SP_Main(); + } else { GameActions_RND(); @@ -12365,6 +12374,22 @@ void GameActions_EM_Main() AdvanceFrameAndPlayerCounters(-1); /* advance counters for all players */ } +void GameActions_SP_Main() +{ + byte effective_action[MAX_PLAYERS]; + boolean warp_mode = (tape.playing && tape.warp_forward && !tape.pausing); + int i; + + for (i = 0; i < MAX_PLAYERS; i++) + effective_action[i] = stored_player[i].effective_action; + + GameActions_SP(effective_action, warp_mode); + + CheckLevelTime(); + + AdvanceFrameAndPlayerCounters(-1); /* advance counters for all players */ +} + void GameActions_RND() { int magic_wall_x = 0, magic_wall_y = 0;