X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=bf69d768d419d47852261a9407d25cf5b11b8aa6;hb=ee77ce3259f523c93305be15ed5c114a79aea181;hp=98751de41aaeca52086e4695ff2c67da64730a98;hpb=c74a890afba46c41f6ba6ef691bc89da0dd0135c;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 98751de4..bf69d768 100644 --- a/src/game.c +++ b/src/game.c @@ -1209,14 +1209,18 @@ inline void DrawGameValue_Dynamite(int value) inline void DrawGameValue_Keys(int key[MAX_NUM_KEYS]) { + int base_key_graphic = EL_KEY_1; int i; + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + base_key_graphic = EL_EM_KEY_1; + /* currently only 4 of 8 possible keys are displayed */ for (i = 0; i < STD_NUM_KEYS; i++) { if (key[i]) DrawMiniGraphicExt(drawto, DX_KEYS + i * MINI_TILEX, DY_KEYS, - el2edimg(EL_KEY_1 + i)); + el2edimg(base_key_graphic + i)); else BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, DOOR_GFX_PAGEX5 + XX_KEYS + i * MINI_TILEX, YY_KEYS, @@ -1282,7 +1286,9 @@ void DrawAllGameValues(int emeralds, int dynamite, int score, int time, void DrawGameDoorValues() { - int i; + int dynamite_state = 0; + int key_bits = 0; + int i, j; if (level.game_engine_type == GAME_ENGINE_TYPE_EM) { @@ -1291,6 +1297,7 @@ void DrawGameDoorValues() return; } +#if 0 DrawGameValue_Level(level_nr); DrawGameValue_Emeralds(local_player->gems_still_needed); @@ -1298,8 +1305,37 @@ void DrawGameDoorValues() DrawGameValue_Score(local_player->score); DrawGameValue_Time(TimeLeft); - for (i = 0; i < MAX_PLAYERS; i++) +#else + + if (game.centered_player_nr == -1) + { + for (i = 0; i < MAX_PLAYERS; i++) + { + for (j = 0; j < MAX_NUM_KEYS; j++) + if (stored_player[i].key[j]) + key_bits |= (1 << j); + + dynamite_state += stored_player[i].inventory_size; + } + +#if 0 DrawGameValue_Keys(stored_player[i].key); +#endif + } + else + { + int player_nr = game.centered_player_nr; + + for (i = 0; i < MAX_NUM_KEYS; i++) + if (stored_player[player_nr].key[i]) + key_bits |= (1 << i); + + dynamite_state = stored_player[player_nr].inventory_size; + } + + DrawAllGameValues(local_player->gems_still_needed, dynamite_state, + local_player->score, TimeLeft, key_bits); +#endif } #if 0 @@ -1995,9 +2031,23 @@ void InitGame() game.envelope_active = FALSE; - game.centered_player_nr = game.centered_player_nr_next = -1; /* focus all */ + /* set focus to local player for network games, else to all players */ + game.centered_player_nr = (network_playing ? local_player->index_nr : -1); + game.centered_player_nr_next = game.centered_player_nr; game.set_centered_player = FALSE; + if (network_playing && tape.recording) + { + /* store client dependent player focus when recording network games */ + tape.centered_player_nr_next = game.centered_player_nr_next; + tape.set_centered_player = TRUE; + } + +#if 0 + printf("::: focus set to player %d [%d]\n", + game.centered_player_nr, local_player->index_nr); +#endif + for (i = 0; i < NUM_BELTS; i++) { game.belt_dir[i] = MV_NONE; @@ -8021,7 +8071,11 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) { stored_player[i].key[KEY_NR(element)] = key_state; +#if 1 + DrawGameDoorValues(); +#else DrawGameValue_Keys(stored_player[i].key); +#endif redraw_mask |= REDRAW_DOOR_1; } @@ -9128,6 +9182,11 @@ void AdvanceFrameAndPlayerCounters(int player_nr) { int i; +#if 0 + Error(ERR_NETWORK_CLIENT, "advancing frame counter from %d to %d", + FrameCounter, FrameCounter + 1); +#endif + /* advance frame counters (global frame counter and time frame counter) */ FrameCounter++; TimeFrames++; @@ -9178,15 +9237,10 @@ void AdvanceFrameAndPlayerCounters(int player_nr) void StartGameActions(boolean init_network_game, boolean record_tape, long random_seed) { -#if 1 unsigned long new_random_seed = InitRND(random_seed); if (record_tape) TapeStartRecording(new_random_seed); -#else - if (record_tape) - TapeStartRecording(random_seed); -#endif #if defined(NETWORK_AVALIABLE) if (init_network_game) @@ -9201,10 +9255,6 @@ void StartGameActions(boolean init_network_game, boolean record_tape, game_status = GAME_MODE_PLAYING; -#if 0 - InitRND(random_seed); -#endif - InitGame(); } @@ -9271,11 +9321,19 @@ void GameActions() if (!network_player_action_received) return; /* failed to get network player actions in time */ + + /* do not yet reset "network_player_action_received" (for tape.pausing) */ } if (tape.pausing) return; + /* at this point we know that we really continue executing the game */ + +#if 1 + network_player_action_received = FALSE; +#endif + recorded_player_action = (tape.playing ? TapePlayAction() : NULL); if (tape.set_centered_player) @@ -9404,10 +9462,11 @@ void GameActions_RND() sy = stored_player[game.centered_player_nr_next].jy; } - DrawRelocateScreen(sx, sy, MV_NONE, TRUE, setup.quick_switch); - game.centered_player_nr = game.centered_player_nr_next; game.set_centered_player = FALSE; + + DrawRelocateScreen(sx, sy, MV_NONE, TRUE, setup.quick_switch); + DrawGameDoorValues(); } #endif @@ -9442,7 +9501,9 @@ void GameActions_RND() ScrollPlayer(&stored_player[i], SCROLL_GO_ON); } +#if 0 network_player_action_received = FALSE; +#endif ScrollScreen(NULL, SCROLL_GO_ON); @@ -11634,7 +11695,11 @@ int DigField(struct PlayerInfo *player, if (player->inventory_size < MAX_INVENTORY_SIZE) player->inventory_element[player->inventory_size++] = element; +#if 1 + DrawGameDoorValues(); +#else DrawGameValue_Dynamite(local_player->inventory_size); +#endif } else if (element == EL_DYNABOMB_INCREASE_NUMBER) { @@ -11653,7 +11718,11 @@ int DigField(struct PlayerInfo *player, { player->key[KEY_NR(element)] = TRUE; +#if 1 + DrawGameDoorValues(); +#else DrawGameValue_Keys(player->key); +#endif redraw_mask |= REDRAW_DOOR_1; } @@ -11685,7 +11754,11 @@ int DigField(struct PlayerInfo *player, if (player->inventory_size < MAX_INVENTORY_SIZE) player->inventory_element[player->inventory_size++] = element; +#if 1 + DrawGameDoorValues(); +#else DrawGameValue_Dynamite(local_player->inventory_size); +#endif } else if (collect_count > 0) { @@ -12170,7 +12243,11 @@ boolean DropElement(struct PlayerInfo *player) { player->inventory_size--; +#if 1 + DrawGameDoorValues(); +#else DrawGameValue_Dynamite(local_player->inventory_size); +#endif if (new_element == EL_DYNAMITE) new_element = EL_DYNAMITE_ACTIVE; @@ -12616,7 +12693,7 @@ void RequestQuitGame(boolean ask_if_really_quit) { #if defined(NETWORK_AVALIABLE) if (options.network) - SendToServer_StopPlaying(); + SendToServer_StopPlaying(NETWORK_STOP_BY_PLAYER); else #endif { @@ -12793,7 +12870,10 @@ static void HandleGameButtons(struct GadgetInfo *gi) switch (id) { case GAME_CTRL_ID_STOP: - RequestQuitGame(TRUE); + if (tape.playing) + TapeStop(); + else + RequestQuitGame(TRUE); break; case GAME_CTRL_ID_PAUSE: @@ -12820,7 +12900,7 @@ static void HandleGameButtons(struct GadgetInfo *gi) #endif { tape.pausing = FALSE; - DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0); + DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF, 0); } } break;