X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=91694d2d7ea0e2ab2fd617081c89a046c14e5105;hb=1ed02c282e3b4bd73c5d26244e4df30d731cc6c8;hp=3e768d93541a0346ee825e29d890254c0cd524c7;hpb=871f79585ed487482fe670383d0020c04a5e8f74;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 3e768d93..91694d2d 100644 --- a/src/game.c +++ b/src/game.c @@ -753,11 +753,11 @@ static void InitGameEngine() InitElementPropertiesEngine(game.engine_version); #if 0 - printf("level %d: level version == %06d\n", level_nr, level.game_version); - printf(" tape version == %06d [%s] [file: %06d]\n", - tape.engine_version, (tape.playing ? "PLAYING" : "RECORDING"), - tape.file_version); - printf(" => game.engine_version == %06d\n", game.engine_version); + printf("level %d: level version == %06d\n", level_nr, level.game_version); + printf(" tape version == %06d [%s] [file: %06d]\n", + tape.engine_version, (tape.playing ? "PLAYING" : "RECORDING"), + tape.file_version); + printf(" => game.engine_version == %06d\n", game.engine_version); #endif /* ---------- initialize player's initial move delay --------------------- */ @@ -1090,7 +1090,7 @@ void InitGame() JustStopped[x][y] = 0; Stop[x][y] = FALSE; Pushed[x][y] = FALSE; - Changing[x][y] = FALSE; + Changed[x][y] = FALSE; ExplodePhase[x][y] = 0; ExplodeField[x][y] = EX_NO_EXPLOSION; @@ -1581,8 +1581,13 @@ void GameWon() if (local_player->MovPos) return; +#if 1 + if (tape.auto_play) /* tape might already be stopped here */ + tape.auto_play_level_solved = TRUE; +#else if (tape.playing && tape.auto_play) tape.auto_play_level_solved = TRUE; +#endif local_player->LevelSolved = FALSE; @@ -1989,135 +1994,6 @@ void CheckDynamite(int x, int y) Bang(x, y); } -void ShowEnvelope() -{ - int i, x, y; - - /* open envelope window horizontally */ - for (i = 2; i <= level.envelope_xsize + 2; i += 2) - { - int startx = (SXSIZE / MINI_TILEX - i) / 2; - int starty = (SYSIZE / MINI_TILEY) / 2 - 1; - - SetDrawtoField(DRAW_BUFFERED); - - BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY); - - SetDrawtoField(DRAW_BACKBUFFER); - - for (y=0; y < 2; y++) for (x=0; x < i; x++) - { - int ex = (x == 0 ? -1 : x == i - 1 ? +1 : 0); - int ey = (y == 0 ? -1 : y == 1 ? +1 : 0); - - DrawEnvelopeBorder(startx + x, starty + y, ex, ey); - } - - redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER; - BackToFront(); - - Delay(GAME_FRAME_DELAY); - } - - /* open envelope window vertically */ - for (i = 2; i <= level.envelope_ysize + 2; i += 2) - { - int xsize = level.envelope_xsize + 2; - int startx = (SXSIZE / MINI_TILEX - (xsize - 1)) / 2; - int starty = (SYSIZE / MINI_TILEY - i) / 2; - - SetDrawtoField(DRAW_BUFFERED); - - BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY); - - SetDrawtoField(DRAW_BACKBUFFER); - - for (y=0; y < i; y++) for (x=0; x < xsize; x++) - { - int ex = (x == 0 ? -1 : x == xsize - 1 ? +1 : 0); - int ey = (y == 0 ? -1 : y == i - 1 ? +1 : 0); - - DrawEnvelopeBorder(startx + x, starty + y, ex, ey); - } - - DrawTextToTextArea(SX + (startx + 1) * MINI_TILEX, - SY + (starty + 1) * MINI_TILEY, level.envelope, - FONT_TEXT_1, level.envelope_xsize, i - 2); - - redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER; - BackToFront(); - - Delay(GAME_FRAME_DELAY); - } - - if (tape.playing) - Delay(1000); - else - WaitForEventToContinue(); - - /* close envelope window vertically */ - for (i = level.envelope_ysize + 2; i >= 2; i -= 2) - { - int xsize = level.envelope_xsize + 2; - int startx = (SXSIZE / MINI_TILEX - (xsize - 1)) / 2; - int starty = (SYSIZE / MINI_TILEY - i) / 2; - - SetDrawtoField(DRAW_BUFFERED); - - BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY); - - SetDrawtoField(DRAW_BACKBUFFER); - - for (y=0; y < i; y++) for (x=0; x < xsize; x++) - { - int ex = (x == 0 ? -1 : x == xsize - 1 ? +1 : 0); - int ey = (y == 0 ? -1 : y == i - 1 ? +1 : 0); - - DrawEnvelopeBorder(startx + x, starty + y, ex, ey); - } - - DrawTextToTextArea(SX + (startx + 1) * MINI_TILEX, - SY + (starty + 1) * MINI_TILEY, level.envelope, - FONT_TEXT_1, level.envelope_xsize, i - 2); - - redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER; - BackToFront(); - - Delay(GAME_FRAME_DELAY); - } - - /* close envelope window horizontally */ - for (i = level.envelope_xsize + 2; i >= 2; i -= 2) - { - int startx = (SXSIZE / MINI_TILEX - i) / 2; - int starty = (SYSIZE / MINI_TILEY) / 2 - 1; - - SetDrawtoField(DRAW_BUFFERED); - - BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY); - - SetDrawtoField(DRAW_BACKBUFFER); - - for (y=0; y < 2; y++) for (x=0; x < i; x++) - { - int ex = (x == 0 ? -1 : x == i - 1 ? +1 : 0); - int ey = (y == 0 ? -1 : y == 1 ? +1 : 0); - - DrawEnvelopeBorder(startx + x, starty + y, ex, ey); - } - - redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER; - BackToFront(); - - Delay(GAME_FRAME_DELAY); - } - - SetDrawtoField(DRAW_BUFFERED); - - redraw_mask |= REDRAW_FIELD; - BackToFront(); -} - void RelocatePlayer(int x, int y, int element) { struct PlayerInfo *player = &stored_player[element - EL_PLAYER_1]; @@ -5466,6 +5342,8 @@ static void ChangeElementNowExt(int x, int y, int target_element) RemoveField(x, y); Feld[x][y] = target_element; + Changed[x][y] = TRUE; /* no more changes in this frame */ + ResetGfxAnimation(x, y); ResetRandomAnimationValue(x, y); @@ -5490,6 +5368,8 @@ static void ChangeElementNow(int x, int y, int element, int page) { struct ElementChangeInfo *change = &element_info[element].change_page[page]; + Changed[x][y] = TRUE; /* no more changes in this frame */ + CheckTriggeredElementChange(x, y, Feld[x][y], CE_OTHER_IS_CHANGING); if (change->explode) @@ -5570,9 +5450,9 @@ static void ChangeElementNow(int x, int y, int element, int page) something_has_changed = TRUE; - /* for symmetry reasons, stop newly created border elements */ + /* for symmetry reasons, freeze newly created border elements */ if (ex != x || ey != y) - Stop[ex][ey] = TRUE; + Stop[ex][ey] = TRUE; /* no more moving in this frame */ } } @@ -5641,9 +5521,11 @@ static boolean CheckTriggeredElementChange(int lx, int ly, int trigger_element, if (!(trigger_events[trigger_element] & CH_EVENT_BIT(trigger_event))) return FALSE; +#if 0 /* prevent this function from running into a loop */ if (trigger_event == CE_OTHER_IS_CHANGING) - Changing[lx][ly] = TRUE; + Changed[lx][ly] = TRUE; +#endif for (i=0; i < NUM_CUSTOM_ELEMENTS; i++) { @@ -5684,7 +5566,7 @@ static boolean CheckTriggeredElementChange(int lx, int ly, int trigger_element, if (x == lx && y == ly) /* do not change trigger element itself */ continue; - if (Changing[x][y]) /* do not change just changing elements */ + if (Changed[x][y]) /* do not change already changed elements */ continue; if (Feld[x][y] == element) @@ -5692,14 +5574,18 @@ static boolean CheckTriggeredElementChange(int lx, int ly, int trigger_element, ChangeDelay[x][y] = 1; ChangeElement(x, y, page); - Changing[x][y] = TRUE; /* do not change just changed elements */ +#if 0 + Changed[x][y] = TRUE; /* prevent element from being changed again */ +#endif } } } +#if 0 /* reset change prevention array */ for (y=0; y 0) JustStopped[x][y]--; @@ -5921,7 +5809,7 @@ void GameActions() #if 1 /* reset finished pushing action (not done in ContinueMoving() to allow - continous pushing animation for elements without push delay) */ + continous pushing animation for elements with zero push delay) */ if (GfxAction[x][y] == ACTION_PUSHING && !IS_MOVING(x, y)) { ResetGfxAnimation(x, y); @@ -6777,7 +6665,9 @@ void ScrollScreen(struct PlayerInfo *player, int mode) void TestIfPlayerTouchesCustomElement(int x, int y) { +#if 0 static boolean check_changing = FALSE; +#endif static int xy[4][2] = { { 0, -1 }, @@ -6787,10 +6677,12 @@ void TestIfPlayerTouchesCustomElement(int x, int y) }; int i; +#if 0 if (check_changing) /* prevent this function from running into a loop */ return; check_changing = TRUE; +#endif for (i=0; i<4; i++) { @@ -6814,12 +6706,16 @@ void TestIfPlayerTouchesCustomElement(int x, int y) } } +#if 0 check_changing = FALSE; +#endif } void TestIfElementTouchesCustomElement(int x, int y) { +#if 0 static boolean check_changing = FALSE; +#endif static int xy[4][2] = { { 0, -1 }, @@ -6832,10 +6728,12 @@ void TestIfElementTouchesCustomElement(int x, int y) int center_element = Feld[x][y]; int i, j; +#if 0 if (check_changing) /* prevent this function from running into a loop */ return; check_changing = TRUE; +#endif for (i=0; i<4; i++) { @@ -6892,7 +6790,9 @@ void TestIfElementTouchesCustomElement(int x, int y) CheckElementChangeExt(x, y, center_element, CE_OTHER_IS_TOUCHING, center_element_change_page); +#if 0 check_changing = FALSE; +#endif } void TestIfGoodThingHitsBadThing(int good_x, int good_y, int good_move_dir) @@ -7580,6 +7480,10 @@ int DigField(struct PlayerInfo *player, PlaySoundLevelElementAction(x, y, element, ACTION_DIGGING); + CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_DIGGED); + + TestIfElementTouchesCustomElement(x, y); + break; } else if (IS_COLLECTIBLE(element)) @@ -7671,6 +7575,8 @@ int DigField(struct PlayerInfo *player, CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_COLLECTED); + TestIfElementTouchesCustomElement(x, y); + break; } else if (IS_PUSHABLE(element)) @@ -7909,6 +7815,8 @@ boolean DropElement(struct PlayerInfo *player) CheckTriggeredElementChange(jx, jy, new_element, CE_OTHER_GETS_DROPPED); CheckElementChange(jx, jy, new_element, CE_DROPPED_BY_PLAYER); + + TestIfElementTouchesCustomElement(jx, jy); } else /* player is dropping a dyna bomb */ {