X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=17473731b737bf0b128d41559df8682fb5d84eb5;hb=14089dac2cbe56e563863e1e5adb8847944fd262;hp=8b812e538fcb95a460d85f3acfd610026ccd5cdc;hpb=9d7b311c097571c6eb4a810029400dbbc9267a90;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 8b812e53..17473731 100644 --- a/src/game.c +++ b/src/game.c @@ -100,6 +100,7 @@ #define NUM_GAME_BUTTONS 6 /* forward declaration for internal use */ +static void InitBeltMovement(void); static void CloseAllOpenTimegates(void); static void CheckGravityMovement(struct PlayerInfo *); static void KillHeroUnlessProtected(int, int); @@ -487,7 +488,7 @@ void DrawGameDoorValues() for (j=0; j<4; j++) if (stored_player[i].key[j]) DrawMiniGraphicExt(drawto, DX_KEYS + j * MINI_TILEX, DY_KEYS, - GFX_SCHLUESSEL1 + j); + IMG_KEY1 + j); DrawText(DX + XX_EMERALDS, DY + YY_EMERALDS, int2str(local_player->gems_still_needed, 3), FS_SMALL, FC_YELLOW); @@ -820,6 +821,8 @@ void InitGame() } } + InitBeltMovement(); + game.emulation = (emulate_bd ? EMU_BOULDERDASH : emulate_sb ? EMU_SOKOBAN : emulate_sp ? EMU_SUPAPLEX : EMU_NONE); @@ -959,7 +962,6 @@ void InitGame() DrawLevel(); DrawAllPlayers(); - FadeToFront(); /* after drawing the level, correct some elements */ if (game.timegate_time_left == 0) @@ -969,9 +971,10 @@ void InitGame() BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY); redraw_mask |= REDRAW_FROM_BACKBUFFER; + FadeToFront(); /* copy default game door content to main double buffer */ - BlitBitmap(pix[PIX_DOOR], drawto, + BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto, DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY); if (level_nr < 100) @@ -980,7 +983,7 @@ void InitGame() else { DrawTextExt(drawto, DX + XX_EMERALDS, DY + YY_EMERALDS, - int2str(level_nr, 3), FS_SMALL, FC_SPECIAL3); + int2str(level_nr, 3), FS_SMALL, FC_SPECIAL3, FONT_OPAQUE); BlitBitmap(drawto, drawto, DX + XX_EMERALDS, DY + YY_EMERALDS + 1, FONT5_XSIZE * 3, FONT5_YSIZE - 1, @@ -998,7 +1001,7 @@ void InitGame() MapTapeButtons(); /* copy actual game door content to door double buffer for OpenDoor() */ - BlitBitmap(drawto, pix[PIX_DB_DOOR], + BlitBitmap(drawto, bitmap_db_door, DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); OpenDoor(DOOR_OPEN_ALL); @@ -1154,6 +1157,9 @@ void GameWon() if (local_player->MovPos) return; + if (tape.playing && tape.auto_play) + tape.auto_play_level_solved = TRUE; + local_player->LevelSolved = FALSE; PlaySoundStereo(SND_GAME_WINNING, SOUND_MAX_RIGHT); @@ -1879,6 +1885,67 @@ void Blurb(int x, int y) } } +static void InitBeltMovement() +{ + static int belt_base_element[4] = + { + EL_CONVEYOR_BELT1_LEFT, + EL_CONVEYOR_BELT2_LEFT, + EL_CONVEYOR_BELT3_LEFT, + EL_CONVEYOR_BELT4_LEFT + }; + static int belt_base_active_element[4] = + { + EL_CONVEYOR_BELT1_LEFT_ACTIVE, + EL_CONVEYOR_BELT2_LEFT_ACTIVE, + EL_CONVEYOR_BELT3_LEFT_ACTIVE, + EL_CONVEYOR_BELT4_LEFT_ACTIVE + }; + + int x, y, i, j; + + /* set frame order for belt animation graphic according to belt direction */ + for (i=0; i<4; i++) + { + int belt_nr = i; + + for (j=0; j<3; j++) + { + int element = belt_base_active_element[belt_nr] + j; + int graphic = el2img(element); + + if (game.belt_dir[i] == MV_LEFT) + new_graphic_info[graphic].anim_mode &= ~ANIM_REVERSE; + else + new_graphic_info[graphic].anim_mode |= ANIM_REVERSE; + } + } + + for(y=0; y0 && IS_PLAYER(x-1, y)) || (x 1) + DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic); +#endif + continue; + } if (!IS_MOVING(x, y) && (CAN_FALL(element) || CAN_MOVE(element))) { @@ -4896,14 +5014,28 @@ void GameActions() #if 1 if (Feld[x][y] == EL_EMERALD && - new_graphic_info[IMG_EMERALD].anim_frames > 1 && + new_graphic_info[graphic].anim_frames > 1 && !IS_MOVING(x, y)) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_EMERALD); + DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic); #endif if (IS_GEM(element) || element == EL_SP_INFOTRON) EdelsteinFunkeln(x, y); } + +#if 1 + else if ((element == EL_ACID || + element == EL_EXIT_OPEN || + element == EL_SP_EXIT_OPEN || + element == EL_SP_TERMINAL || + element == EL_SP_TERMINAL_ACTIVE || + element == EL_EXTRA_TIME || + element == EL_SHIELD_NORMAL || + element == EL_SHIELD_DEADLY) && + new_graphic_info[graphic].anim_frames > 1) + DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic); +#endif + else if (IS_MOVING(x, y)) ContinueMoving(x, y); else if (IS_ACTIVE_BOMB(element)) @@ -4928,8 +5060,6 @@ void GameActions() RobotWheel(x, y); else if (element == EL_TIMEGATE_SWITCH_ACTIVE) TimegateWheel(x, y); - else if (element == EL_ACID) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_ACID); else if (element == EL_ACID_SPLASH_LEFT || element == EL_ACID_SPLASH_RIGHT) Blurb(x, y); @@ -4943,10 +5073,6 @@ void GameActions() AusgangstuerPruefen_SP(x, y); else if (element == EL_EXIT_OPENING) AusgangstuerOeffnen(x, y); - else if (element == EL_EXIT_OPEN) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_EXIT_OPEN); - else if (element == EL_SP_EXIT_OPEN) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_SP_EXIT_OPEN); else if (element == EL_WALL_GROWING_ACTIVE) MauerWaechst(x, y); else if (element == EL_WALL_GROWING || @@ -4960,10 +5086,6 @@ void GameActions() CheckBuggyBase(x, y); else if (element == EL_TRAP || element == EL_TRAP_ACTIVE) CheckTrap(x, y); - else if (element == EL_SP_TERMINAL) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_SP_TERMINAL); - else if (element == EL_SP_TERMINAL_ACTIVE) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_SP_TERMINAL_ACTIVE); else if (IS_BELT_ACTIVE(element)) DrawBeltAnimation(x, y, element); else if (element == EL_SWITCHGATE_OPENING) @@ -4974,12 +5096,11 @@ void GameActions() OpenTimegate(x, y); else if (element == EL_TIMEGATE_CLOSING) CloseTimegate(x, y); - else if (element == EL_EXTRA_TIME) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_EXTRA_TIME); - else if (element == EL_SHIELD_NORMAL) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_SHIELD_NORMAL); - else if (element == EL_SHIELD_DEADLY) - DrawGraphicAnimation(SCREENX(x), SCREENY(y), IMG_SHIELD_DEADLY); + +#if 1 + else if (new_graphic_info[graphic].anim_frames > 1) + DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic); +#endif if (game.magic_wall_active) { @@ -5391,7 +5512,8 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy) int original_move_delay_value = player->move_delay_value; #if DEBUG - printf("THIS SHOULD ONLY HAPPEN WITH PRE-1.2 LEVEL TAPES.\n"); + printf("THIS SHOULD ONLY HAPPEN WITH PRE-1.2 LEVEL TAPES. [%ld]\n", + tape.counter); #endif /* scroll remaining steps with finest movement resolution */ @@ -6081,9 +6203,9 @@ int DigField(struct PlayerInfo *player, player->key[key_nr] = TRUE; RaiseScoreElement(element); DrawMiniGraphicExt(drawto, DX_KEYS + key_nr * MINI_TILEX, DY_KEYS, - GFX_SCHLUESSEL1 + key_nr); + IMG_KEY1 + key_nr); DrawMiniGraphicExt(window, DX_KEYS + key_nr * MINI_TILEX, DY_KEYS, - GFX_SCHLUESSEL1 + key_nr); + IMG_KEY1 + key_nr); PlaySoundLevel(x, y, SND_KEY_COLLECTING); break; } @@ -6099,9 +6221,9 @@ int DigField(struct PlayerInfo *player, player->key[key_nr] = TRUE; RaiseScoreElement(element); DrawMiniGraphicExt(drawto, DX_KEYS + key_nr * MINI_TILEX, DY_KEYS, - GFX_SCHLUESSEL1 + key_nr); + IMG_KEY1 + key_nr); DrawMiniGraphicExt(window, DX_KEYS + key_nr * MINI_TILEX, DY_KEYS, - GFX_SCHLUESSEL1 + key_nr); + IMG_KEY1 + key_nr); PlaySoundLevel(x, y, SND_KEY_COLLECTING); break; } @@ -6847,7 +6969,7 @@ void CreateGameButtons() for (i=0; i