X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=e0e44eb4a1bb3e13c7396b283b20a604ea2c561c;hp=87af3c9784116f75271d95b6253658f8af098001;hb=37dc6b231b7e6cd2aeab259ebe52be365b7f3c17;hpb=fd054e61ac10b62524efcac1e8438e432cded86a diff --git a/src/game.c b/src/game.c index 87af3c97..e0e44eb4 100644 --- a/src/game.c +++ b/src/game.c @@ -19,6 +19,7 @@ #include "files.h" #include "tape.h" #include "network.h" +#include "anim.h" /* DEBUG SETTINGS */ @@ -3102,9 +3103,6 @@ void InitGame() SetGameStatus(GAME_MODE_PLAYING); - /* needed if different viewport properties defined for playing */ - ChangeViewportPropertiesIfNeeded(); - if (level_editor_test_game) FadeSkipNextFadeIn(); else @@ -3113,8 +3111,15 @@ void InitGame() if (CheckIfGlobalBorderHasChanged()) fade_mask = REDRAW_ALL; + FadeSoundsAndMusic(); + + ExpireSoundLoops(TRUE); + FadeOut(fade_mask); + /* needed if different viewport properties defined for playing */ + ChangeViewportPropertiesIfNeeded(); + ClearField(); OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); @@ -3207,6 +3212,11 @@ void InitGame() player->is_bored = FALSE; player->is_sleeping = FALSE; + player->was_waiting = TRUE; + player->was_moving = FALSE; + player->was_snapping = FALSE; + player->was_dropping = FALSE; + player->frame_counter_bored = -1; player->frame_counter_sleeping = -1; @@ -4890,6 +4900,7 @@ static void setScreenCenteredToAllPlayers(int *sx, int *sy) void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, boolean center_screen, boolean quick_relocation) { + unsigned int frame_delay_value_old = GetVideoFrameDelay(); boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay); @@ -4957,6 +4968,8 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, ScrollScreen(NULL, SCROLL_GO_ON); /* scroll last frame to full tile */ + SetVideoFrameDelay(wait_delay_value); + while (scroll_x != new_scroll_x || scroll_y != new_scroll_y) { int dx = 0, dy = 0; @@ -4979,16 +4992,15 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, /* scroll in two steps of half tile size to make things smoother */ BlitBitmap(drawto_field, window, fx, fy, SXSIZE, SYSIZE, SX, SY); - Delay(wait_delay_value); /* scroll second step to align at full tile size */ - BackToFront(); - Delay(wait_delay_value); + BlitScreenToBitmap(window); } DrawAllPlayers(); BackToFront(); - Delay(wait_delay_value); + + SetVideoFrameDelay(frame_delay_value_old); } void RelocatePlayer(int jx, int jy, int el_player_raw) @@ -5038,8 +5050,7 @@ void RelocatePlayer(int jx, int jy, int el_player_raw) DrawPlayer(player); - BackToFront(); - Delay(wait_delay_value); + BackToFront_WithFrameDelay(wait_delay_value); } DrawPlayer(player); /* needed here only to cleanup last field */ @@ -10682,32 +10693,28 @@ static void SetPlayerWaiting(struct PlayerInfo *player, boolean is_waiting) static void CheckSaveEngineSnapshot(struct PlayerInfo *player) { - static boolean player_was_moving = FALSE; - static boolean player_was_snapping = FALSE; - static boolean player_was_dropping = FALSE; - - if ((!player->is_moving && player_was_moving) || - (player->MovPos == 0 && player_was_moving) || - (player->is_snapping && !player_was_snapping) || - (player->is_dropping && !player_was_dropping)) + if ((!player->is_moving && player->was_moving) || + (player->MovPos == 0 && player->was_moving) || + (player->is_snapping && !player->was_snapping) || + (player->is_dropping && !player->was_dropping)) { if (!SaveEngineSnapshotToList()) return; - player_was_moving = FALSE; - player_was_snapping = TRUE; - player_was_dropping = TRUE; + player->was_moving = FALSE; + player->was_snapping = TRUE; + player->was_dropping = TRUE; } else { if (player->is_moving) - player_was_moving = TRUE; + player->was_moving = TRUE; if (!player->is_snapping) - player_was_snapping = FALSE; + player->was_snapping = FALSE; if (!player->is_dropping) - player_was_dropping = FALSE; + player->was_dropping = FALSE; } } @@ -10954,7 +10961,9 @@ void StartGameActions(boolean init_network_game, boolean record_tape, void GameActions() { +#if 0 static unsigned int game_frame_delay = 0; +#endif unsigned int game_frame_delay_value; byte *recorded_player_action; byte summarized_player_action = 0; @@ -11032,6 +11041,9 @@ void GameActions() if (tape.playing && tape.warp_forward && !tape.pausing) game_frame_delay_value = 0; + SetVideoFrameDelay(game_frame_delay_value); + +#if 0 #if 0 /* ---------- main game synchronization point ---------- */ @@ -11043,6 +11055,7 @@ void GameActions() /* ---------- main game synchronization point ---------- */ WaitUntilDelayReached(&game_frame_delay, game_frame_delay_value); +#endif #endif if (network_playing && !network_player_action_received) @@ -12055,7 +12068,7 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy) AdvanceFrameAndPlayerCounters(player->index_nr); DrawAllPlayers(); - BackToFront(); + BackToFront_WithFrameDelay(0); } player->move_delay_value = original_move_delay_value; @@ -14851,47 +14864,47 @@ static struct } gamebutton_info[NUM_GAME_BUTTONS] = { { - IMG_GAME_BUTTON_GFX_STOP, &game.button.stop, + IMG_GFX_GAME_BUTTON_STOP, &game.button.stop, GAME_CTRL_ID_STOP, "stop game" }, { - IMG_GAME_BUTTON_GFX_PAUSE, &game.button.pause, + IMG_GFX_GAME_BUTTON_PAUSE, &game.button.pause, GAME_CTRL_ID_PAUSE, "pause game" }, { - IMG_GAME_BUTTON_GFX_PLAY, &game.button.play, + IMG_GFX_GAME_BUTTON_PLAY, &game.button.play, GAME_CTRL_ID_PLAY, "play game" }, { - IMG_GAME_BUTTON_GFX_UNDO, &game.button.undo, + IMG_GFX_GAME_BUTTON_UNDO, &game.button.undo, GAME_CTRL_ID_UNDO, "undo step" }, { - IMG_GAME_BUTTON_GFX_REDO, &game.button.redo, + IMG_GFX_GAME_BUTTON_REDO, &game.button.redo, GAME_CTRL_ID_REDO, "redo step" }, { - IMG_GAME_BUTTON_GFX_SAVE, &game.button.save, + IMG_GFX_GAME_BUTTON_SAVE, &game.button.save, GAME_CTRL_ID_SAVE, "save game" }, { - IMG_GAME_BUTTON_GFX_PAUSE2, &game.button.pause2, + IMG_GFX_GAME_BUTTON_PAUSE2, &game.button.pause2, GAME_CTRL_ID_PAUSE2, "pause game" }, { - IMG_GAME_BUTTON_GFX_LOAD, &game.button.load, + IMG_GFX_GAME_BUTTON_LOAD, &game.button.load, GAME_CTRL_ID_LOAD, "load game" }, { - IMG_GAME_BUTTON_GFX_SOUND_MUSIC, &game.button.sound_music, + IMG_GFX_GAME_BUTTON_SOUND_MUSIC, &game.button.sound_music, SOUND_CTRL_ID_MUSIC, "background music on/off" }, { - IMG_GAME_BUTTON_GFX_SOUND_LOOPS, &game.button.sound_loops, + IMG_GFX_GAME_BUTTON_SOUND_LOOPS, &game.button.sound_loops, SOUND_CTRL_ID_LOOPS, "sound loops on/off" }, { - IMG_GAME_BUTTON_GFX_SOUND_SIMPLE, &game.button.sound_simple, + IMG_GFX_GAME_BUTTON_SOUND_SIMPLE, &game.button.sound_simple, SOUND_CTRL_ID_SIMPLE, "normal sounds on/off" } }; @@ -14986,7 +14999,7 @@ void FreeGameButtons() FreeGadget(game_gadget[i]); } -static void MapGameButtonsAtSamePosition(int id) +static void UnmapGameButtonsAtSamePosition(int id) { int i; @@ -14994,10 +15007,26 @@ static void MapGameButtonsAtSamePosition(int id) if (i != id && gamebutton_info[i].pos->x == gamebutton_info[id].pos->x && gamebutton_info[i].pos->y == gamebutton_info[id].pos->y) - MapGadget(game_gadget[i]); + UnmapGadget(game_gadget[i]); } -static void UnmapGameButtonsAtSamePosition(int id) +static void UnmapGameButtonsAtSamePosition_All() +{ + if (setup.show_snapshot_buttons) + { + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_SAVE); + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PAUSE2); + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_LOAD); + } + else + { + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_STOP); + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PAUSE); + UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PLAY); + } +} + +static void MapGameButtonsAtSamePosition(int id) { int i; @@ -15005,7 +15034,9 @@ static void UnmapGameButtonsAtSamePosition(int id) if (i != id && gamebutton_info[i].pos->x == gamebutton_info[id].pos->x && gamebutton_info[i].pos->y == gamebutton_info[id].pos->y) - UnmapGadget(game_gadget[i]); + MapGadget(game_gadget[i]); + + UnmapGameButtonsAtSamePosition_All(); } void MapUndoRedoButtons() @@ -15015,6 +15046,8 @@ void MapUndoRedoButtons() MapGadget(game_gadget[GAME_CTRL_ID_UNDO]); MapGadget(game_gadget[GAME_CTRL_ID_REDO]); + + ModifyGadget(game_gadget[GAME_CTRL_ID_PAUSE2], GDI_CHECKED, TRUE, GDI_END); } void UnmapUndoRedoButtons() @@ -15024,6 +15057,8 @@ void UnmapUndoRedoButtons() MapGameButtonsAtSamePosition(GAME_CTRL_ID_UNDO); MapGameButtonsAtSamePosition(GAME_CTRL_ID_REDO); + + ModifyGadget(game_gadget[GAME_CTRL_ID_PAUSE2], GDI_CHECKED, FALSE, GDI_END); } void MapGameButtons() @@ -15035,18 +15070,7 @@ void MapGameButtons() i != GAME_CTRL_ID_REDO) MapGadget(game_gadget[i]); - if (setup.show_snapshot_buttons) - { - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_SAVE); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PAUSE2); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_LOAD); - } - else - { - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_STOP); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PAUSE); - UnmapGameButtonsAtSamePosition(GAME_CTRL_ID_PLAY); - } + UnmapGameButtonsAtSamePosition_All(); RedrawGameButtons(); } @@ -15082,8 +15106,7 @@ void GameUndoRedoExt() DrawCompleteVideoDisplay(); DrawVideoDisplay(VIDEO_STATE_TIME_ON, TapeTime); DrawVideoDisplay(VIDEO_STATE_FRAME_ON, FrameCounter); - DrawVideoDisplay((tape.single_step ? VIDEO_STATE_1STEP_ON : - VIDEO_STATE_1STEP_OFF), 0); + DrawVideoDisplay(VIDEO_STATE_1STEP(tape.single_step), 0); BackToFront(); } @@ -15162,7 +15185,7 @@ static void HandleGameButtonsExt(int id, int button) SendToServer_ContinuePlaying(); else #endif - TapeTogglePause(TAPE_TOGGLE_MANUAL); + TapeTogglePause(TAPE_TOGGLE_MANUAL | TAPE_TOGGLE_PLAY_PAUSE); } break;