projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed loop mode for some sound effects
[rocksndiamonds.git]
/
src
/
game.c
diff --git
a/src/game.c
b/src/game.c
index 97617bb336003beddee02f2b2f1d37b73ea81d49..643d36e5840230e1389bb7c911d79151726d70e2 100644
(file)
--- a/
src/game.c
+++ b/
src/game.c
@@
-1784,7
+1784,7
@@
static void InitPlayerField(int x, int y, int element, boolean init_game)
player->active = TRUE;
// remove potentially duplicate players
player->active = TRUE;
// remove potentially duplicate players
- if (StorePlayer[jx][jy] == Tile[x][y])
+ if (
IN_LEV_FIELD(jx, jy) &&
StorePlayer[jx][jy] == Tile[x][y])
StorePlayer[jx][jy] = 0;
StorePlayer[x][y] = Tile[x][y];
StorePlayer[jx][jy] = 0;
StorePlayer[x][y] = Tile[x][y];
@@
-2566,7
+2566,9
@@
static void UpdateGameControlValues(void)
int element = gpc->value;
int graphic = el2panelimg(element);
int init_gfx_random = (graphic_info[graphic].anim_global_sync ?
int element = gpc->value;
int graphic = el2panelimg(element);
int init_gfx_random = (graphic_info[graphic].anim_global_sync ?
- sync_random_frame : INIT_GFX_RANDOM());
+ sync_random_frame :
+ graphic_info[graphic].anim_global_anim_sync ?
+ getGlobalAnimSyncFrame() : INIT_GFX_RANDOM());
if (gpc->value != gpc->last_value)
{
if (gpc->value != gpc->last_value)
{
@@
-2601,7
+2603,9
@@
static void UpdateGameControlValues(void)
int last_anim_random_frame = gfx.anim_random_frame;
int graphic = gpc->graphic;
int init_gfx_random = (graphic_info[graphic].anim_global_sync ?
int last_anim_random_frame = gfx.anim_random_frame;
int graphic = gpc->graphic;
int init_gfx_random = (graphic_info[graphic].anim_global_sync ?
- sync_random_frame : INIT_GFX_RANDOM());
+ sync_random_frame :
+ graphic_info[graphic].anim_global_anim_sync ?
+ getGlobalAnimSyncFrame() : INIT_GFX_RANDOM());
if (gpc->value != gpc->last_value)
{
if (gpc->value != gpc->last_value)
{
@@
-3569,7
+3573,7
@@
void InitGame(void)
int full_lev_fieldx = lev_fieldx + (BorderElement != EL_EMPTY ? 2 : 0);
int full_lev_fieldy = lev_fieldy + (BorderElement != EL_EMPTY ? 2 : 0);
int fade_mask = REDRAW_FIELD;
int full_lev_fieldx = lev_fieldx + (BorderElement != EL_EMPTY ? 2 : 0);
int full_lev_fieldy = lev_fieldy + (BorderElement != EL_EMPTY ? 2 : 0);
int fade_mask = REDRAW_FIELD;
-
+ boolean restarting = (game_status == GAME_MODE_PLAYING);
boolean emulate_bd = TRUE; // unless non-BOULDERDASH elements found
boolean emulate_sp = TRUE; // unless non-SUPAPLEX elements found
int initial_move_dir = MV_DOWN;
boolean emulate_bd = TRUE; // unless non-BOULDERDASH elements found
boolean emulate_sp = TRUE; // unless non-SUPAPLEX elements found
int initial_move_dir = MV_DOWN;
@@
-3581,7
+3585,15
@@
void InitGame(void)
if (!game.restart_level)
CloseDoor(DOOR_CLOSE_1);
if (!game.restart_level)
CloseDoor(DOOR_CLOSE_1);
- SetGameStatus(GAME_MODE_PLAYING);
+ if (restarting)
+ {
+ // force fading out global animations displayed during game play
+ SetGameStatus(GAME_MODE_PSEUDO_RESTARTING);
+ }
+ else
+ {
+ SetGameStatus(GAME_MODE_PLAYING);
+ }
if (level_editor_test_game)
FadeSkipNextFadeOut();
if (level_editor_test_game)
FadeSkipNextFadeOut();
@@
-3597,6
+3609,14
@@
void InitGame(void)
FadeOut(fade_mask);
FadeOut(fade_mask);
+ if (restarting)
+ {
+ // force restarting global animations displayed during game play
+ RestartGlobalAnimsByStatus(GAME_MODE_PSEUDO_RESTARTING);
+
+ SetGameStatus(GAME_MODE_PLAYING);
+ }
+
if (level_editor_test_game)
FadeSkipNextFadeIn();
if (level_editor_test_game)
FadeSkipNextFadeIn();
@@
-5305,6
+5325,8
@@
static void ResetGfxFrame(int x, int y)
if (graphic_info[graphic].anim_global_sync)
GfxFrame[x][y] = FrameCounter;
if (graphic_info[graphic].anim_global_sync)
GfxFrame[x][y] = FrameCounter;
+ else if (graphic_info[graphic].anim_global_anim_sync)
+ GfxFrame[x][y] = getGlobalAnimSyncFrame();
else if (ANIM_MODE(graphic) == ANIM_CE_VALUE)
GfxFrame[x][y] = CustomValue[x][y];
else if (ANIM_MODE(graphic) == ANIM_CE_SCORE)
else if (ANIM_MODE(graphic) == ANIM_CE_VALUE)
GfxFrame[x][y] = CustomValue[x][y];
else if (ANIM_MODE(graphic) == ANIM_CE_SCORE)
@@
-5611,7
+5633,7
@@
static void setScreenCenteredToAllPlayers(int *sx, int *sy)
*sy = (sy1 + sy2) / 2;
}
*sy = (sy1 + sy2) / 2;
}
-static void DrawRelocateScreen(int old_x, int old_y, int x, int y,
int move_dir,
+static void DrawRelocateScreen(int old_x, int old_y, int x, int y,
boolean center_screen, boolean quick_relocation)
{
unsigned int frame_delay_value_old = GetVideoFrameDelay();
boolean center_screen, boolean quick_relocation)
{
unsigned int frame_delay_value_old = GetVideoFrameDelay();
@@
-5782,7
+5804,7
@@
static void RelocatePlayer(int jx, int jy, int el_player_raw)
}
// only visually relocate centered player
}
// only visually relocate centered player
- DrawRelocateScreen(old_jx, old_jy, player->jx, player->jy,
player->MovDir,
+ DrawRelocateScreen(old_jx, old_jy, player->jx, player->jy,
FALSE, level.instant_relocation);
TestIfPlayerTouchesBadThing(jx, jy);
FALSE, level.instant_relocation);
TestIfPlayerTouchesBadThing(jx, jy);
@@
-6421,7
+6443,7
@@
static void ToggleBeltSwitch(int x, int y)
}
}
}
}
-static void ToggleSwitchgateSwitch(
int x, int y
)
+static void ToggleSwitchgateSwitch(
void
)
{
int xx, yy;
{
int xx, yy;
@@
-6901,7
+6923,7
@@
static void Impact(int x, int y)
smashed == EL_DC_SWITCHGATE_SWITCH_UP ||
smashed == EL_DC_SWITCHGATE_SWITCH_DOWN)
{
smashed == EL_DC_SWITCHGATE_SWITCH_UP ||
smashed == EL_DC_SWITCHGATE_SWITCH_DOWN)
{
- ToggleSwitchgateSwitch(
x, y + 1
);
+ ToggleSwitchgateSwitch();
}
else if (smashed == EL_LIGHT_SWITCH ||
smashed == EL_LIGHT_SWITCH_ACTIVE)
}
else if (smashed == EL_LIGHT_SWITCH ||
smashed == EL_LIGHT_SWITCH_ACTIVE)
@@
-9853,7
+9875,7
@@
static void CheckWallGrowing(int ax, int ay)
if (((stop_top && stop_bottom) || stop_horizontal) &&
((stop_left && stop_right) || stop_vertical))
if (((stop_top && stop_bottom) || stop_horizontal) &&
((stop_left && stop_right) || stop_vertical))
- Tile[ax][ay] =
EL_WALL
;
+ Tile[ax][ay] =
(is_steelwall ? EL_STEELWALL : EL_WALL)
;
if (new_wall)
PlayLevelSoundAction(ax, ay, ACTION_GROWING);
if (new_wall)
PlayLevelSoundAction(ax, ay, ACTION_GROWING);
@@
-11672,6
+11694,21
@@
void AdvanceFrameAndPlayerCounters(int player_nr)
}
}
}
}
+void AdvanceFrameCounter(void)
+{
+ FrameCounter++;
+}
+
+void AdvanceGfxFrame(void)
+{
+ int x, y;
+
+ SCAN_PLAYFIELD(x, y)
+ {
+ GfxFrame[x][y]++;
+ }
+}
+
void StartGameActions(boolean init_network_game, boolean record_tape,
int random_seed)
{
void StartGameActions(boolean init_network_game, boolean record_tape,
int random_seed)
{
@@
-11867,7
+11904,7
@@
static void GameActionsExt(void)
TapeRecordAction(tape_action);
// remember if game was played (especially after tape stopped playing)
TapeRecordAction(tape_action);
// remember if game was played (especially after tape stopped playing)
- if (!tape.playing && summarized_player_action)
+ if (!tape.playing && summarized_player_action
&& !checkGameFailed()
)
game.GamePlayed = TRUE;
#if USE_NEW_PLAYER_ASSIGNMENTS
game.GamePlayed = TRUE;
#if USE_NEW_PLAYER_ASSIGNMENTS
@@
-11990,25
+12027,23
@@
void GameActions(void)
void GameActions_EM_Main(void)
{
byte effective_action[MAX_PLAYERS];
void GameActions_EM_Main(void)
{
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;
int i;
for (i = 0; i < MAX_PLAYERS; i++)
effective_action[i] = stored_player[i].effective_action;
- GameActions_EM(effective_action
, warp_mode
);
+ GameActions_EM(effective_action);
}
void GameActions_SP_Main(void)
{
byte effective_action[MAX_PLAYERS];
}
void GameActions_SP_Main(void)
{
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;
int i;
for (i = 0; i < MAX_PLAYERS; i++)
effective_action[i] = stored_player[i].effective_action;
- GameActions_SP(effective_action
, warp_mode
);
+ GameActions_SP(effective_action);
for (i = 0; i < MAX_PLAYERS; i++)
{
for (i = 0; i < MAX_PLAYERS; i++)
{
@@
-12021,9
+12056,9
@@
void GameActions_SP_Main(void)
void GameActions_MM_Main(void)
{
void GameActions_MM_Main(void)
{
-
boolean warp_mode = (tape.playing && tape.warp_forward && !tape.pausing
);
+
AdvanceGfxFrame(
);
- GameActions_MM(local_player->effective_mouse_action
, warp_mode
);
+ GameActions_MM(local_player->effective_mouse_action);
}
void GameActions_RND_Main(void)
}
void GameActions_RND_Main(void)
@@
-12087,7
+12122,7
@@
void GameActions_RND(void)
game.centered_player_nr = game.centered_player_nr_next;
game.set_centered_player = FALSE;
game.centered_player_nr = game.centered_player_nr_next;
game.set_centered_player = FALSE;
- DrawRelocateScreen(0, 0, sx, sy,
MV_NONE,
TRUE, setup.quick_switch);
+ DrawRelocateScreen(0, 0, sx, sy, TRUE, setup.quick_switch);
DrawGameDoorValues();
}
DrawGameDoorValues();
}
@@
-13963,7
+13998,6
@@
void BuryPlayer(struct PlayerInfo *player)
return;
PlayLevelSoundElementAction(jx, jy, player->artwork_element, ACTION_DYING);
return;
PlayLevelSoundElementAction(jx, jy, player->artwork_element, ACTION_DYING);
- PlayLevelSound(jx, jy, SND_GAME_LOSING);
RemovePlayer(player);
RemovePlayer(player);
@@
-14621,7
+14655,7
@@
static int DigField(struct PlayerInfo *player,
LevelSolved();
LevelSolved();
- Play
LevelSound(x, y,
SND_GAME_SOKOBAN_SOLVING);
+ Play
Sound(
SND_GAME_SOKOBAN_SOLVING);
}
}
else
}
}
else
@@
-14706,7
+14740,7
@@
static int DigField(struct PlayerInfo *player,
element == EL_DC_SWITCHGATE_SWITCH_UP ||
element == EL_DC_SWITCHGATE_SWITCH_DOWN)
{
element == EL_DC_SWITCHGATE_SWITCH_UP ||
element == EL_DC_SWITCHGATE_SWITCH_DOWN)
{
- ToggleSwitchgateSwitch(
x, y
);
+ ToggleSwitchgateSwitch();
}
else if (element == EL_LIGHT_SWITCH ||
element == EL_LIGHT_SWITCH_ACTIVE)
}
else if (element == EL_LIGHT_SWITCH ||
element == EL_LIGHT_SWITCH_ACTIVE)
@@
-15605,15
+15639,21
@@
void RequestRestartGame(char *message)
boolean has_started_game = hasStartedNetworkGame();
int request_mode = (has_started_game ? REQ_ASK : REQ_CONFIRM);
boolean has_started_game = hasStartedNetworkGame();
int request_mode = (has_started_game ? REQ_ASK : REQ_CONFIRM);
+ int door_state = DOOR_CLOSE_1;
- if (Request(message, request_mode | REQ_STAY_
CLOSED
) && has_started_game)
+ if (Request(message, request_mode | REQ_STAY_
OPEN
) && has_started_game)
{
{
+ CloseDoor(door_state);
+
StartGameActions(network.enabled, setup.autorecord, level.random_seed);
}
else
{
StartGameActions(network.enabled, setup.autorecord, level.random_seed);
}
else
{
- // needed in case of envelope request to close game panel
- CloseDoor(DOOR_CLOSE_1);
+ // if game was invoked from level editor, also close tape recorder door
+ if (level_editor_test_game)
+ door_state = DOOR_CLOSE_ALL;
+
+ CloseDoor(door_state);
SetGameStatus(GAME_MODE_MAIN);
SetGameStatus(GAME_MODE_MAIN);
@@
-15646,6
+15686,9
@@
void CheckGameOver(void)
if (game_over_delay > 0)
{
if (game_over_delay > 0)
{
+ if (game_over_delay == game_over_delay_value / 2)
+ PlaySound(SND_GAME_LOSING);
+
game_over_delay--;
return;
game_over_delay--;
return;
@@
-15840,7
+15883,7
@@
static ListNode *SaveEngineSnapshotBuffers(void)
if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
SaveEngineSnapshotValues_SP(&buffers);
if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
SaveEngineSnapshotValues_SP(&buffers);
if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
- SaveEngineSnapshotValues_MM(
&buffers
);
+ SaveEngineSnapshotValues_MM();
// save values stored in special snapshot structure
// save values stored in special snapshot structure