From 358fe8d37855c22ee5ee4e24d486757500043178 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Tue, 18 Feb 2014 21:43:09 +0100 Subject: [PATCH] rnd-20140218-2-src --- src/conftime.h | 2 +- src/engines.h | 4 +++ src/game.c | 69 ++++++++++++++++++++++--------------------- src/game.h | 4 +++ src/game_em/convert.c | 13 +++++++- src/tools.c | 7 +++++ 6 files changed, 63 insertions(+), 36 deletions(-) diff --git a/src/conftime.h b/src/conftime.h index 44e20bde..2941fbdd 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2014-02-18 17:33" +#define COMPILE_DATE_STRING "2014-02-18 21:42" diff --git a/src/engines.h b/src/engines.h index 307ef0b9..b299f3fc 100644 --- a/src/engines.h +++ b/src/engines.h @@ -30,7 +30,11 @@ extern void SetBitmaps_EM(Bitmap **); extern void UpdateEngineValues(int, int); extern void DrawAllGameValues(int, int, int, int, int); +#if 1 +extern boolean getTeamMode_EM(); +#else extern int getNumActivePlayers_EM(); +#endif extern int getGameFrameDelay_EM(int); extern void PlayLevelSound_EM(int, int, int, int); diff --git a/src/game.c b/src/game.c index 2a88b9a8..7d57f3f7 100644 --- a/src/game.c +++ b/src/game.c @@ -1142,8 +1142,6 @@ static boolean recursion_loop_element; static int map_player_action[MAX_PLAYERS]; -static boolean TEST_game_team_mode; - /* ------------------------------------------------------------------------- */ /* definition of elements that automatically change to other elements after */ @@ -3032,6 +3030,21 @@ static void InitGameEngine() game.engine_version = (tape.playing ? tape.engine_version : level.game_version); + /* set single or multi-player game mode (needed for re-playing tapes) */ + game.team_mode = setup.team_mode; + + if (tape.playing) + { + int num_players = 0; + + for (i = 0; i < MAX_PLAYERS; i++) + if (tape.player_participates[i]) + num_players++; + + /* multi-player tapes contain input data for more than one player */ + game.team_mode = (num_players > 1); + } + /* ---------------------------------------------------------------------- */ /* set flags for bugs and changes according to active game engine version */ /* ---------------------------------------------------------------------- */ @@ -3902,23 +3915,12 @@ void InitGame() local_player->connected = TRUE; /* !!! SAME AS init.c:InitPlayerInfo() -- FIX THIS !!! */ - TEST_game_team_mode = setup.team_mode; +#if 0 + printf("::: TEAM MODE: %d\n", game.team_mode); +#endif if (tape.playing) { -#if 1 - int num_players = 0; - - for (i = 0; i < MAX_PLAYERS; i++) - if (tape.player_participates[i]) - num_players++; - - TEST_game_team_mode = (num_players > 1); - - printf("::: TAPE TEAM MODE: %s (%d)\n", - (TEST_game_team_mode ? "true" : "false"), num_players); -#endif - #if 1 for (i = 0; i < MAX_PLAYERS; i++) stored_player[i].connected = tape.player_participates[i]; @@ -3931,7 +3933,7 @@ void InitGame() stored_player[i].connected = TRUE; #endif } - else if (setup.team_mode && !options.network) + else if (game.team_mode && !options.network) { /* try to guess locally connected team mode players (needed for correct assignment of player figures from level to locally playing players) */ @@ -4140,8 +4142,7 @@ void InitGame() #if USE_NEW_PLAYER_ASSIGNMENTS #if 1 - // if (!setup.team_mode) - if (!TEST_game_team_mode) + if (!game.team_mode) #endif for (i = 0; i < MAX_PLAYERS; i++) @@ -4162,7 +4163,9 @@ void InitGame() Feld[jx][jy] = EL_EMPTY; } } + #else + for (i = 0; i < MAX_PLAYERS; i++) { if (stored_player[i].active && @@ -4178,7 +4181,7 @@ void InitGame() } #endif } - else if (!options.network && !setup.team_mode) /* && !tape.playing */ + else if (!options.network && !game.team_mode) /* && !tape.playing */ { /* when in single player mode, eliminate all but the first active player */ @@ -12375,7 +12378,7 @@ void GameActions() summarized_player_action |= stored_player[i].action; #if 1 - if (!network_playing && (setup.team_mode || tape.playing)) + if (!network_playing && (game.team_mode || tape.playing)) stored_player[i].effective_action = stored_player[i].action; #else if (!network_playing) @@ -12388,10 +12391,13 @@ void GameActions() SendToServer_MovePlayer(summarized_player_action); #endif - if (!options.network && !setup.team_mode) + if (!options.network && !game.team_mode) local_player->effective_action = summarized_player_action; - if (setup.team_mode && setup.input_on_focus && game.centered_player_nr != -1) + if (tape.recording && + setup.team_mode && + setup.input_on_focus && + game.centered_player_nr != -1) { for (i = 0; i < MAX_PLAYERS; i++) stored_player[i].effective_action = @@ -12407,12 +12413,13 @@ void GameActions() tape_action[i] = stored_player[i].effective_action; #if 1 - /* (this can only happen in the R'n'D game engine) */ - if (setup.team_mode && - tape.recording && + /* (this may happen in the RND game engine if a player was not present on + the playfield on level start, but appeared later from a custom element */ + if (tape.recording && + setup.team_mode && tape_action[i] && !tape.player_participates[i]) - tape.player_participates[i] = TRUE; /* player just appeared from CE */ + tape.player_participates[i] = TRUE; #else /* (this can only happen in the R'n'D game engine) */ if (tape.recording && tape_action[i] && !tape.player_participates[i]) @@ -12426,8 +12433,7 @@ void GameActions() #if USE_NEW_PLAYER_ASSIGNMENTS #if 1 - // if (setup.team_mode) - if (TEST_game_team_mode) + if (game.team_mode) #endif { byte mapped_action[MAX_PLAYERS]; @@ -12462,11 +12468,6 @@ void GameActions() #endif #endif -#if 0 - if (!options.network && !setup.team_mode) - local_player->effective_action = summarized_player_action; -#endif - #if 0 printf("::: summarized_player_action == %d\n", local_player->effective_action); diff --git a/src/game.h b/src/game.h index 50490be3..d1431c22 100644 --- a/src/game.h +++ b/src/game.h @@ -135,6 +135,10 @@ struct GameInfo int initial_move_delay_value[MAX_PLAYERS]; int initial_push_delay_value; + /* flag for single or multi-player mode (needed for playing tapes) */ + /* (when playing/recording games, this is identical to "setup.team_mode" */ + boolean team_mode; + /* flags to handle bugs in and changes between different engine versions */ /* (for the latest engine version, these flags should always be "FALSE") */ boolean use_change_when_pushing_bug; diff --git a/src/game_em/convert.c b/src/game_em/convert.c index cf45e0cb..6dc72ee0 100644 --- a/src/game_em/convert.c +++ b/src/game_em/convert.c @@ -1109,7 +1109,11 @@ void prepare_em_level(void) { int i, x, y; int players_left; +#if 1 + boolean team_mode; +#else int num_tape_players; +#endif /* reset all runtime variables to their initial values */ @@ -1176,9 +1180,15 @@ void prepare_em_level(void) } } +#if 1 + team_mode = getTeamMode_EM(); + + if (!team_mode) + lev.home_initial = 1; +#else num_tape_players = getNumActivePlayers_EM(); -#if 1 +#if 0 printf("::: getNumActivePlayers_EM: %d\n", num_tape_players); #endif @@ -1189,6 +1199,7 @@ void prepare_em_level(void) lev.home_initial = MIN(lev.home_initial, num_tape_players); else if (!setup.team_mode) lev.home_initial = MIN(lev.home_initial, 1); +#endif #endif lev.home = lev.home_initial; diff --git a/src/tools.c b/src/tools.c index 603ebdaa..038ba0fe 100644 --- a/src/tools.c +++ b/src/tools.c @@ -8503,6 +8503,12 @@ int getBeltSwitchElementFromBeltNrAndBeltDir(int belt_nr, int belt_dir) return getBeltSwitchElementFromBeltNrAndBeltDirNr(belt_nr, belt_dir_nr); } +#if 1 +boolean getTeamMode_EM() +{ + return game.team_mode; +} +#else int getNumActivePlayers_EM() { #if 1 @@ -8534,6 +8540,7 @@ int getNumActivePlayers_EM() return num_players; #endif } +#endif int getGameFrameDelay_EM(int native_em_game_frame_delay) { -- 2.34.1