X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=1a201dc120978a4f2f6d4fc32558b6b672731a10;hb=d41504f21368105b5818ccee3b33d5acd739aa6c;hp=2a88b9a805f5de15d3e2ac015f8c89ad661048ee;hpb=92a3daab2223b297cdb51fa9763c6acad423b2de;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 2a88b9a8..1a201dc1 100644 --- a/src/game.c +++ b/src/game.c @@ -1014,8 +1014,10 @@ static struct GamePanelControlInfo game_panel_controls[] = #define SOUND_CTRL_ID_MUSIC 3 #define SOUND_CTRL_ID_LOOPS 4 #define SOUND_CTRL_ID_SIMPLE 5 +#define GAME_CTRL_ID_SAVE 6 +#define GAME_CTRL_ID_LOAD 7 -#define NUM_GAME_BUTTONS 6 +#define NUM_GAME_BUTTONS 8 /* forward declaration for internal use */ @@ -1082,7 +1084,6 @@ static void PlayLevelSoundActionIfLoop(int, int, int); static void StopLevelSoundActionIfLoop(int, int, int); static void PlayLevelMusic(); -static void MapGameButtons(); static void HandleGameButtons(struct GadgetInfo *); int AmoebeNachbarNr(int, int); @@ -1142,8 +1143,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 +3031,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 +3916,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 +3934,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 +4143,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 +4164,9 @@ void InitGame() Feld[jx][jy] = EL_EMPTY; } } + #else + for (i = 0; i < MAX_PLAYERS; i++) { if (stored_player[i].active && @@ -4178,7 +4182,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 */ @@ -4513,8 +4517,12 @@ void InitGame() MapTapeButtons(); /* copy actual game door content to door double buffer for OpenDoor() */ +#if 1 + BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0); +#else BlitBitmap(drawto, bitmap_db_door, DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); +#endif OpenDoor(DOOR_OPEN_ALL); @@ -12375,7 +12383,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 +12396,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 +12418,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 +12438,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 +12473,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); @@ -16802,6 +16808,14 @@ static struct { IMG_GAME_BUTTON_GFX_SOUND_SIMPLE, &game.button.sound_simple, SOUND_CTRL_ID_SIMPLE, "normal sounds on/off" + }, + { + IMG_GAME_BUTTON_GFX_SAVE, &game.button.save, + GAME_CTRL_ID_SAVE, "save game" + }, + { + IMG_GAME_BUTTON_GFX_LOAD, &game.button.load, + GAME_CTRL_ID_LOAD, "load game" } }; @@ -16817,6 +16831,8 @@ void CreateGameButtons() int button_type; boolean checked; unsigned int event_mask; + int base_x = (tape.show_game_buttons ? VX : DX); + int base_y = (tape.show_game_buttons ? VY : DY); int gd_x = gfx->src_x; int gd_y = gfx->src_y; int gd_xp = gfx->src_x + gfx->pressed_xoffset; @@ -16827,9 +16843,18 @@ void CreateGameButtons() int gd_yap = gfx->src_y + gfx->active_yoffset + gfx->pressed_yoffset; int id = i; + if (gfx->bitmap == NULL) + { + game_gadget[id] = NULL; + + continue; + } + if (id == GAME_CTRL_ID_STOP || id == GAME_CTRL_ID_PAUSE || - id == GAME_CTRL_ID_PLAY) + id == GAME_CTRL_ID_PLAY || + id == GAME_CTRL_ID_SAVE || + id == GAME_CTRL_ID_LOAD) { button_type = GD_TYPE_NORMAL_BUTTON; checked = FALSE; @@ -16847,8 +16872,8 @@ void CreateGameButtons() gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_INFO_TEXT, gamebutton_info[i].infotext, - GDI_X, DX + pos->x, - GDI_Y, DY + pos->y, + GDI_X, base_x + GDI_ACTIVE_POS(pos->x), + GDI_Y, base_y + GDI_ACTIVE_POS(pos->y), GDI_WIDTH, gfx->width, GDI_HEIGHT, gfx->height, GDI_TYPE, button_type, @@ -16878,7 +16903,7 @@ void FreeGameButtons() FreeGadget(game_gadget[i]); } -static void MapGameButtons() +void MapGameButtons() { int i; @@ -16904,12 +16929,19 @@ void RedrawGameButtons() static void HandleGameButtonsExt(int id) { - if (game_status != GAME_MODE_PLAYING) + boolean handle_game_buttons = + (game_status == GAME_MODE_PLAYING || + (game_status == GAME_MODE_MAIN && tape.show_game_buttons)); + + if (!handle_game_buttons) return; switch (id) { case GAME_CTRL_ID_STOP: + if (game_status == GAME_MODE_MAIN) + break; + if (tape.playing) TapeStop(); else @@ -16917,7 +16949,7 @@ static void HandleGameButtonsExt(int id) break; case GAME_CTRL_ID_PAUSE: - if (options.network) + if (options.network && game_status == GAME_MODE_PLAYING) { #if defined(NETWORK_AVALIABLE) if (tape.pausing) @@ -16931,7 +16963,11 @@ static void HandleGameButtonsExt(int id) break; case GAME_CTRL_ID_PLAY: - if (tape.pausing) + if (game_status == GAME_MODE_MAIN) + { + StartGameActions(options.network, setup.autorecord, level.random_seed); + } + else if (tape.pausing) { #if defined(NETWORK_AVALIABLE) if (options.network) @@ -16984,6 +17020,14 @@ static void HandleGameButtonsExt(int id) } break; + case GAME_CTRL_ID_SAVE: + TapeQuickSave(); + break; + + case GAME_CTRL_ID_LOAD: + TapeQuickLoad(); + break; + default: break; }