X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=5d89ddffc1cf606225bbd3ca672c2b65f9576a3f;hb=830ab4d58b00129ff57c9600dc99a2494af8841c;hp=917fcbb2fffeb704a694f35381d11a14fa6a6ebc;hpb=074c00b42409c74e9c5856db1be03dced3a15ae9;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 917fcbb2..5d89ddff 100644 --- a/src/game.c +++ b/src/game.c @@ -100,6 +100,8 @@ #define GET_NEW_PUSH_DELAY(e) ( (element_info[e].push_delay_fixed) + \ RND(element_info[e].push_delay_random)) +#define GET_NEW_DROP_DELAY(e) ( (element_info[e].drop_delay_fixed) + \ + RND(element_info[e].drop_delay_random)) #define GET_NEW_MOVE_DELAY(e) ( (element_info[e].move_delay_fixed) + \ RND(element_info[e].move_delay_random)) #define GET_MAX_MOVE_DELAY(e) ( (element_info[e].move_delay_fixed) + \ @@ -1351,6 +1353,7 @@ static void InitGameEngine() element_info[e].move_stepsize = move_stepsize_list[i].move_stepsize; } +#if 0 /* ---------- initialize move dig/leave ---------------------------------- */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) @@ -1358,6 +1361,7 @@ static void InitGameEngine() element_info[i].can_leave_element = FALSE; element_info[i].can_leave_element_last = FALSE; } +#endif /* ---------- initialize gem count --------------------------------------- */ @@ -2090,6 +2094,11 @@ void InitMovDir(int x, int y) break; } + +#if 0 + if (MovDir[x][y] == MV_NO_MOVING) /* no start direction found */ + MovDir[x][y] = 1 << RND(4); /* => use random direction */ +#endif } } } @@ -5556,8 +5565,21 @@ void StartMoving(int x, int y) PlayLevelSoundAction(x, y, action); } +#if 1 +#if 1 + Store[newx][newy] = EL_EMPTY; + if (IS_EQUAL_OR_IN_GROUP(new_element, MOVE_ENTER_EL(element))) + Store[newx][newy] = element_info[element].move_leave_element; +#else + Store[newx][newy] = EL_EMPTY; + if (IS_EQUAL_OR_IN_GROUP(new_element, MOVE_ENTER_EL(element)) || + element_info[element].move_leave_type == LEAVE_TYPE_UNLIMITED) + Store[newx][newy] = element_info[element].move_leave_element; +#endif +#else if (IS_EQUAL_OR_IN_GROUP(new_element, MOVE_ENTER_EL(element))) element_info[element].can_leave_element = TRUE; +#endif if (move_pattern & MV_MAZE_RUNNER_STYLE) { @@ -5864,8 +5886,23 @@ void ContinueMoving(int x, int y) { element = Feld[newx][newy] = EL_ACID; } +#if 1 + else if (IS_CUSTOM_ELEMENT(element) && !IS_PLAYER(x, y) && + ei->move_leave_element != EL_EMPTY && + (ei->move_leave_type == LEAVE_TYPE_UNLIMITED || + Store[x][y] != EL_EMPTY)) + { + /* some elements can leave other elements behind after moving */ + + Feld[x][y] = ei->move_leave_element; + InitField(x, y, FALSE); + + if (GFX_CRUMBLED(Feld[x][y])) + DrawLevelFieldCrumbledSandNeighbours(x, y); + } +#endif - Store[x][y] = 0; + Store[x][y] = EL_EMPTY; MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0; MovDelay[newx][newy] = 0; @@ -5893,7 +5930,7 @@ void ContinueMoving(int x, int y) ResetGfxAnimation(x, y); /* reset animation values for old field */ -#if 1 +#if 0 /* some elements can leave other elements behind after moving */ if (IS_CUSTOM_ELEMENT(element) && !IS_PLAYER(x, y) && ei->move_leave_element != EL_EMPTY && @@ -5928,9 +5965,18 @@ void ContinueMoving(int x, int y) MovDir[newx][newy] = 0; */ +#if 0 if (!CAN_MOVE(element) || (CAN_FALL(element) && direction == MV_DOWN)) GfxDir[x][y] = MovDir[newx][newy] = 0; +#else + if (!CAN_MOVE(element) || + (CAN_FALL(element) && direction == MV_DOWN && + (element == EL_SPRING || + element_info[element].move_pattern == MV_WHEN_PUSHED || + element_info[element].move_pattern == MV_WHEN_DROPPED))) + GfxDir[x][y] = MovDir[newx][newy] = 0; +#endif #endif #endif @@ -8735,7 +8781,9 @@ boolean MovePlayerOneStep(struct PlayerInfo *player, player->step_counter++; +#if 0 player->drop_delay = 0; +#endif PlayerVisit[jx][jy] = FrameCounter; @@ -10754,13 +10802,14 @@ boolean DropElement(struct PlayerInfo *player) int drop_direction = player->MovDir; int drop_side = trigger_sides[MV_DIR_BIT(drop_direction)]; int old_element = Feld[jx][jy]; - int new_element = (player->inventory_size > 0 ? - player->inventory_element[player->inventory_size - 1] : - player->inventory_infinite_element != EL_UNDEFINED ? - player->inventory_infinite_element : - player->dynabombs_left > 0 ? - EL_DYNABOMB_PLAYER_1_ACTIVE + player->index_nr : - EL_UNDEFINED); + int drop_element = (player->inventory_size > 0 ? + player->inventory_element[player->inventory_size - 1] : + player->inventory_infinite_element != EL_UNDEFINED ? + player->inventory_infinite_element : + player->dynabombs_left > 0 ? + EL_DYNABOMB_PLAYER_1_ACTIVE + player->index_nr : + EL_UNDEFINED); + int new_element = drop_element; /* default: element does not change */ /* check if player is active, not moving and ready to drop */ if (!player->active || player->MovPos || player->drop_delay > 0) @@ -10868,12 +10917,14 @@ boolean DropElement(struct PlayerInfo *player) #endif } - new_element = Feld[jx][jy]; + new_element = Feld[jx][jy]; /* element might have changed */ if (IS_CUSTOM_ELEMENT(new_element) && CAN_MOVE(new_element) && element_info[new_element].move_pattern == MV_WHEN_DROPPED) { +#if 0 int move_stepsize = element_info[new_element].move_stepsize; +#endif int direction, dx, dy, nextx, nexty; if (element_info[new_element].move_direction_initial == MV_START_AUTOMATIC) @@ -10906,13 +10957,19 @@ boolean DropElement(struct PlayerInfo *player) #endif } +#if 0 player->drop_delay = 2 * TILEX / move_stepsize + 1; +#endif } #if 0 player->drop_delay = 8 + 8 + 8; #endif +#if 1 + player->drop_delay = GET_NEW_DROP_DELAY(drop_element); +#endif + #endif player->is_dropping = TRUE;