From 92a3daab2223b297cdb51fa9763c6acad423b2de Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Tue, 18 Feb 2014 17:45:11 +0100 Subject: [PATCH] rnd-20140218-1-src --- src/conftime.h | 2 +- src/events.c | 18 +++ src/game.c | 253 ++++++++++++++++++++++++++++++++++++++---- src/game_em/convert.c | 8 ++ src/tools.c | 17 +++ 5 files changed, 276 insertions(+), 22 deletions(-) diff --git a/src/conftime.h b/src/conftime.h index b2460ff0..44e20bde 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2014-02-17 21:41" +#define COMPILE_DATE_STRING "2014-02-18 17:33" diff --git a/src/events.c b/src/events.c index f9e74a76..9fb4ef03 100644 --- a/src/events.c +++ b/src/events.c @@ -1237,6 +1237,20 @@ static void HandleKeysSpecial(Key key) { DumpTape(&tape); } + else if (is_string_suffix(cheat_input, ":fix-tape") || + is_string_suffix(cheat_input, ":ft")) + { + /* fix single-player tapes that contain player input for more than one + player (due to a bug in 3.3.1.2 and earlier versions), which results + in playing levels with more than one player in multi-player mode, + even though the tape was originally recorded in single-player mode */ + + /* remove player input actions for all players but the first one */ + for (i = 1; i < MAX_PLAYERS; i++) + tape.player_participates[i] = FALSE; + + tape.changed = TRUE; + } else if (is_string_suffix(cheat_input, ":save-native-level") || is_string_suffix(cheat_input, ":snl")) { @@ -1695,6 +1709,7 @@ void HandleKey(Key key, int key_status) } break; +#if 0 case KSYM_s: if (!global.fps_slowdown) { @@ -1714,7 +1729,9 @@ void HandleKey(Key key, int key_status) printf("fps slowdown disabled\n"); } break; +#endif +#if 0 case KSYM_f: ScrollStepSize = TILEX / 8; printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize); @@ -1734,6 +1751,7 @@ void HandleKey(Key key, int key_status) ScrollStepSize = TILEX; printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize); break; +#endif case KSYM_v: printf("::: currently using game engine version %d\n", diff --git a/src/game.c b/src/game.c index 09faa8b1..2a88b9a8 100644 --- a/src/game.c +++ b/src/game.c @@ -21,6 +21,11 @@ #include "tape.h" #include "network.h" + +/* DEBUG SETTINGS */ +#define DEBUG_INIT_PLAYER 1 +#define DEBUG_PLAYER_ACTIONS 0 + /* EXPERIMENTAL STUFF */ #define USE_NEW_AMOEBA_CODE FALSE @@ -1137,6 +1142,8 @@ 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 */ @@ -1740,14 +1747,16 @@ static void InitPlayerField(int x, int y, int element, boolean init_game) StorePlayer[x][y] = Feld[x][y]; +#if DEBUG_INIT_PLAYER if (options.debug) { - printf("Player %d activated.\n", player->element_nr); - printf("[Local player is %d and currently %s.]\n", + printf("- player element %d activated", player->element_nr); + printf(" (local player is %d and currently %s)\n", local_player->element_nr, local_player->active ? "active" : "not active"); } } +#endif Feld[x][y] = EL_EMPTY; @@ -3753,6 +3762,13 @@ void InitGame() for (i = 0; i < MAX_NUM_AMOEBA; i++) AmoebaCnt[i] = AmoebaCnt2[i] = 0; +#if DEBUG_INIT_PLAYER + if (options.debug) + { + printf("Player status at level initialization:\n"); + } +#endif + SCAN_PLAYFIELD(x, y) { Feld[x][y] = level.field[x][y]; @@ -3886,14 +3902,34 @@ void InitGame() local_player->connected = TRUE; /* !!! SAME AS init.c:InitPlayerInfo() -- FIX THIS !!! */ + TEST_game_team_mode = setup.team_mode; + 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]; +#else /* try to guess locally connected team mode players (needed for correct assignment of player figures from level to locally playing players) */ for (i = 0; i < MAX_PLAYERS; i++) if (tape.player_participates[i]) stored_player[i].connected = TRUE; +#endif } else if (setup.team_mode && !options.network) { @@ -3906,14 +3942,32 @@ void InitGame() stored_player[i].connected = TRUE; } -#if 0 - for (i = 0; i < MAX_PLAYERS; i++) - printf("::: player %d: %s\n", i, - (stored_player[i].connected ? "connected" : "not connected")); +#if DEBUG_INIT_PLAYER + if (options.debug) + { + printf("Player status after level initialization:\n"); - for (i = 0; i < MAX_PLAYERS; i++) - printf("::: player %d: %s\n", i, - (stored_player[i].present ? "present" : "not present")); + for (i = 0; i < MAX_PLAYERS; i++) + { + struct PlayerInfo *player = &stored_player[i]; + + printf("- player %d: present == %d, connected == %d, active == %d", + i + 1, + player->present, + player->connected, + player->active); + + if (local_player == player) + printf(" (local player)"); + + printf("\n"); + } + } +#endif + +#if DEBUG_INIT_PLAYER + if (options.debug) + printf("Reassigning players ...\n"); #endif /* check if any connected player was not found in playfield */ @@ -3925,12 +3979,29 @@ void InitGame() { struct PlayerInfo *field_player = NULL; -#if 0 - printf("::: looking for field player for player %d ...\n", i); +#if DEBUG_INIT_PLAYER + if (options.debug) + printf("- looking for field player for player %d ...\n", i + 1); #endif /* assign first free player found that is present in the playfield */ +#if 1 + /* first try: look for unmapped playfield player that is not connected */ + for (j = 0; j < MAX_PLAYERS; j++) + if (field_player == NULL && + stored_player[j].present && + !stored_player[j].mapped && + !stored_player[j].connected) + field_player = &stored_player[j]; + + /* second try: look for *any* unmapped playfield player */ + for (j = 0; j < MAX_PLAYERS; j++) + if (field_player == NULL && + stored_player[j].present && + !stored_player[j].mapped) + field_player = &stored_player[j]; +#else /* first try: look for unmapped playfield player that is not connected */ if (field_player == NULL) for (j = 0; j < MAX_PLAYERS; j++) @@ -3945,13 +4016,15 @@ void InitGame() if (stored_player[j].present && !stored_player[j].mapped) field_player = &stored_player[j]; +#endif if (field_player != NULL) { int jx = field_player->jx, jy = field_player->jy; -#if 0 - printf("::: found player figure %d\n", field_player->index_nr); +#if DEBUG_INIT_PLAYER + if (options.debug) + printf("- found player %d\n", field_player->index_nr + 1); #endif player->present = FALSE; @@ -3980,9 +4053,10 @@ void InitGame() field_player->mapped = TRUE; -#if 0 - printf("::: map_player_action[%d] == %d\n", - field_player->index_nr, i); +#if DEBUG_INIT_PLAYER + if (options.debug) + printf("- map_player_action[%d] == %d\n", + field_player->index_nr + 1, i + 1); #endif } } @@ -3991,6 +4065,29 @@ void InitGame() player->mapped = TRUE; } +#if DEBUG_INIT_PLAYER + if (options.debug) + { + printf("Player status after player assignment (first stage):\n"); + + for (i = 0; i < MAX_PLAYERS; i++) + { + struct PlayerInfo *player = &stored_player[i]; + + printf("- player %d: present == %d, connected == %d, active == %d", + i + 1, + player->present, + player->connected, + player->active); + + if (local_player == player) + printf(" (local player)"); + + printf("\n"); + } + } +#endif + #else /* check if any connected player was not found in playfield */ @@ -4041,6 +4138,12 @@ void InitGame() /* when playing a tape, eliminate all players who do not participate */ #if USE_NEW_PLAYER_ASSIGNMENTS + +#if 1 + // if (!setup.team_mode) + if (!TEST_game_team_mode) +#endif + for (i = 0; i < MAX_PLAYERS; i++) { if (stored_player[i].active && @@ -4049,6 +4152,11 @@ void InitGame() struct PlayerInfo *player = &stored_player[i]; int jx = player->jx, jy = player->jy; +#if DEBUG_INIT_PLAYER + if (options.debug) + printf("Removing player %d at (%d, %d)\n", i + 1, jx, jy); +#endif + player->active = FALSE; StorePlayer[jx][jy] = 0; Feld[jx][jy] = EL_EMPTY; @@ -4110,21 +4218,28 @@ void InitGame() #endif } +#if DEBUG_INIT_PLAYER if (options.debug) { + printf("Player status after player assignment (final stage):\n"); + for (i = 0; i < MAX_PLAYERS; i++) { struct PlayerInfo *player = &stored_player[i]; - printf("Player %d: present == %d, connected == %d, active == %d.\n", - i+1, + printf("- player %d: present == %d, connected == %d, active == %d", + i + 1, player->present, player->connected, player->active); + if (local_player == player) - printf("Player %d is local player.\n", i+1); + printf(" (local player)"); + + printf("\n"); } } +#endif if (BorderElement == EL_EMPTY) { @@ -4410,12 +4525,28 @@ void InitGame() KeyboardAutoRepeatOffUnlessAutoplay(); +#if DEBUG_INIT_PLAYER if (options.debug) { + printf("Player status (final):\n"); + for (i = 0; i < MAX_PLAYERS; i++) - printf("Player %d %sactive.\n", - i + 1, (stored_player[i].active ? "" : "not ")); + { + struct PlayerInfo *player = &stored_player[i]; + + printf("- player %d: present == %d, connected == %d, active == %d", + i + 1, + player->present, + player->connected, + player->active); + + if (local_player == player) + printf(" (local player)"); + + printf("\n"); + } } +#endif } #if 1 @@ -12243,8 +12374,13 @@ void GameActions() { summarized_player_action |= stored_player[i].action; +#if 1 + if (!network_playing && (setup.team_mode || tape.playing)) + stored_player[i].effective_action = stored_player[i].action; +#else if (!network_playing) stored_player[i].effective_action = stored_player[i].action; +#endif } #if defined(NETWORK_AVALIABLE) @@ -12270,9 +12406,18 @@ 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 && + tape_action[i] && + !tape.player_participates[i]) + tape.player_participates[i] = TRUE; /* player just appeared from CE */ +#else /* (this can only happen in the R'n'D game engine) */ if (tape.recording && tape_action[i] && !tape.player_participates[i]) tape.player_participates[i] = TRUE; /* player just appeared from CE */ +#endif } /* only record actions from input devices, but not programmed actions */ @@ -12280,17 +12425,83 @@ void GameActions() TapeRecordAction(tape_action); #if USE_NEW_PLAYER_ASSIGNMENTS +#if 1 + // if (setup.team_mode) + if (TEST_game_team_mode) +#endif { byte mapped_action[MAX_PLAYERS]; +#if DEBUG_PLAYER_ACTIONS + printf(":::"); + for (i = 0; i < MAX_PLAYERS; i++) + printf(" %d, ", stored_player[i].effective_action); +#endif + for (i = 0; i < MAX_PLAYERS; i++) mapped_action[i] = stored_player[map_player_action[i]].effective_action; for (i = 0; i < MAX_PLAYERS; i++) stored_player[i].effective_action = mapped_action[i]; + +#if DEBUG_PLAYER_ACTIONS + printf(" =>"); + for (i = 0; i < MAX_PLAYERS; i++) + printf(" %d, ", stored_player[i].effective_action); + printf("\n"); +#endif } +#if DEBUG_PLAYER_ACTIONS + else + { + printf(":::"); + for (i = 0; i < MAX_PLAYERS; i++) + printf(" %d, ", stored_player[i].effective_action); + printf("\n"); + } +#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); +#endif + + + + +#if 0 +#if DEBUG_INIT_PLAYER + if (options.debug) + { + printf("Player status (final):\n"); + + for (i = 0; i < MAX_PLAYERS; i++) + { + struct PlayerInfo *player = &stored_player[i]; + + printf("- player %d: present == %d, connected == %d, active == %d", + i + 1, + player->present, + player->connected, + player->active); + + if (local_player == player) + printf(" (local player)"); + + printf("\n"); + } + } +#endif +#endif + + + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) { GameActions_EM_Main(); diff --git a/src/game_em/convert.c b/src/game_em/convert.c index a3553a79..cf45e0cb 100644 --- a/src/game_em/convert.c +++ b/src/game_em/convert.c @@ -1178,10 +1178,18 @@ void prepare_em_level(void) num_tape_players = getNumActivePlayers_EM(); +#if 1 + printf("::: getNumActivePlayers_EM: %d\n", num_tape_players); +#endif + +#if 1 + lev.home_initial = MIN(lev.home_initial, num_tape_players); +#else if (num_tape_players != -1) lev.home_initial = MIN(lev.home_initial, num_tape_players); else if (!setup.team_mode) lev.home_initial = MIN(lev.home_initial, 1); +#endif lev.home = lev.home_initial; players_left = lev.home_initial; diff --git a/src/tools.c b/src/tools.c index e6b6b719..603ebdaa 100644 --- a/src/tools.c +++ b/src/tools.c @@ -8505,9 +8505,25 @@ int getBeltSwitchElementFromBeltNrAndBeltDir(int belt_nr, int belt_dir) int getNumActivePlayers_EM() { +#if 1 + int num_players = 0; + int i; + + if (!tape.playing) + return (setup.team_mode ? MAX_PLAYERS : 1); + + for (i = 0; i < MAX_PLAYERS; i++) + if (tape.player_participates[i]) + num_players++; + + return (num_players > 1 ? MAX_PLAYERS : 1); + +#else + int num_players = 0; int i; + /* when recording game, activate all connected players */ if (!tape.playing) return -1; @@ -8516,6 +8532,7 @@ int getNumActivePlayers_EM() num_players++; return num_players; +#endif } int getGameFrameDelay_EM(int native_em_game_frame_delay) -- 2.34.1