X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=88bca397acab2ff7622569e1dbe4056d7d36052c;hb=ffe5b4f7f8db01217558b2de54edc2f54eb75f03;hp=3f6ec77b97628b366a671484bc2c9f203ebc4886;hpb=531605e2e684de4c30a4e9927f9c5107f468b163;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 3f6ec77b..88bca397 100644 --- a/src/game.c +++ b/src/game.c @@ -161,74 +161,91 @@ #define GAME_PANEL_KEY_WHITE 27 #define GAME_PANEL_KEY_WHITE_COUNT 28 #define GAME_PANEL_SCORE 29 -#define GAME_PANEL_TIME 30 -#define GAME_PANEL_TIME_HH 31 -#define GAME_PANEL_TIME_MM 32 -#define GAME_PANEL_TIME_SS 33 -#define GAME_PANEL_SHIELD_NORMAL 34 -#define GAME_PANEL_SHIELD_NORMAL_TIME 35 -#define GAME_PANEL_SHIELD_DEADLY 36 -#define GAME_PANEL_SHIELD_DEADLY_TIME 37 -#define GAME_PANEL_EXIT 38 -#define GAME_PANEL_EMC_MAGIC_BALL 39 -#define GAME_PANEL_EMC_MAGIC_BALL_SWITCH 40 -#define GAME_PANEL_LIGHT_SWITCH 41 -#define GAME_PANEL_LIGHT_SWITCH_TIME 42 -#define GAME_PANEL_TIMEGATE_SWITCH 43 -#define GAME_PANEL_TIMEGATE_SWITCH_TIME 44 -#define GAME_PANEL_SWITCHGATE_SWITCH 45 -#define GAME_PANEL_EMC_LENSES 46 -#define GAME_PANEL_EMC_LENSES_TIME 47 -#define GAME_PANEL_EMC_MAGNIFIER 48 -#define GAME_PANEL_EMC_MAGNIFIER_TIME 49 -#define GAME_PANEL_BALLOON_SWITCH 50 -#define GAME_PANEL_DYNABOMB_NUMBER 51 -#define GAME_PANEL_DYNABOMB_SIZE 52 -#define GAME_PANEL_DYNABOMB_POWER 53 -#define GAME_PANEL_PENGUINS 54 -#define GAME_PANEL_SOKOBAN_OBJECTS 55 -#define GAME_PANEL_SOKOBAN_FIELDS 56 -#define GAME_PANEL_ROBOT_WHEEL 57 -#define GAME_PANEL_CONVEYOR_BELT_1 58 -#define GAME_PANEL_CONVEYOR_BELT_2 59 -#define GAME_PANEL_CONVEYOR_BELT_3 60 -#define GAME_PANEL_CONVEYOR_BELT_4 61 -#define GAME_PANEL_CONVEYOR_BELT_1_SWITCH 62 -#define GAME_PANEL_CONVEYOR_BELT_2_SWITCH 63 -#define GAME_PANEL_CONVEYOR_BELT_3_SWITCH 64 -#define GAME_PANEL_CONVEYOR_BELT_4_SWITCH 65 -#define GAME_PANEL_MAGIC_WALL 66 -#define GAME_PANEL_MAGIC_WALL_TIME 67 -#define GAME_PANEL_GRAVITY_STATE 68 -#define GAME_PANEL_ELEMENT_1 69 -#define GAME_PANEL_ELEMENT_2 70 -#define GAME_PANEL_ELEMENT_3 71 -#define GAME_PANEL_ELEMENT_4 72 -#define GAME_PANEL_ELEMENT_5 73 -#define GAME_PANEL_ELEMENT_6 74 -#define GAME_PANEL_ELEMENT_7 75 -#define GAME_PANEL_ELEMENT_8 76 -#define GAME_PANEL_CE_SCORE_1 77 -#define GAME_PANEL_CE_SCORE_2 78 -#define GAME_PANEL_CE_SCORE_3 79 -#define GAME_PANEL_CE_SCORE_4 80 -#define GAME_PANEL_CE_SCORE_5 81 -#define GAME_PANEL_CE_SCORE_6 82 -#define GAME_PANEL_CE_SCORE_7 83 -#define GAME_PANEL_CE_SCORE_8 84 -#define GAME_PANEL_CE_SCORE_1_ELEMENT 85 -#define GAME_PANEL_CE_SCORE_2_ELEMENT 86 -#define GAME_PANEL_CE_SCORE_3_ELEMENT 87 -#define GAME_PANEL_CE_SCORE_4_ELEMENT 88 -#define GAME_PANEL_CE_SCORE_5_ELEMENT 89 -#define GAME_PANEL_CE_SCORE_6_ELEMENT 90 -#define GAME_PANEL_CE_SCORE_7_ELEMENT 91 -#define GAME_PANEL_CE_SCORE_8_ELEMENT 92 -#define GAME_PANEL_PLAYER_NAME 93 -#define GAME_PANEL_LEVEL_NAME 94 -#define GAME_PANEL_LEVEL_AUTHOR 95 - -#define NUM_GAME_PANEL_CONTROLS 96 +#define GAME_PANEL_HIGHSCORE 30 +#define GAME_PANEL_TIME 31 +#define GAME_PANEL_TIME_HH 32 +#define GAME_PANEL_TIME_MM 33 +#define GAME_PANEL_TIME_SS 34 +#define GAME_PANEL_SHIELD_NORMAL 35 +#define GAME_PANEL_SHIELD_NORMAL_TIME 36 +#define GAME_PANEL_SHIELD_DEADLY 37 +#define GAME_PANEL_SHIELD_DEADLY_TIME 38 +#define GAME_PANEL_EXIT 39 +#define GAME_PANEL_EMC_MAGIC_BALL 40 +#define GAME_PANEL_EMC_MAGIC_BALL_SWITCH 41 +#define GAME_PANEL_LIGHT_SWITCH 42 +#define GAME_PANEL_LIGHT_SWITCH_TIME 43 +#define GAME_PANEL_TIMEGATE_SWITCH 44 +#define GAME_PANEL_TIMEGATE_SWITCH_TIME 45 +#define GAME_PANEL_SWITCHGATE_SWITCH 46 +#define GAME_PANEL_EMC_LENSES 47 +#define GAME_PANEL_EMC_LENSES_TIME 48 +#define GAME_PANEL_EMC_MAGNIFIER 49 +#define GAME_PANEL_EMC_MAGNIFIER_TIME 50 +#define GAME_PANEL_BALLOON_SWITCH 51 +#define GAME_PANEL_DYNABOMB_NUMBER 52 +#define GAME_PANEL_DYNABOMB_SIZE 53 +#define GAME_PANEL_DYNABOMB_POWER 54 +#define GAME_PANEL_PENGUINS 55 +#define GAME_PANEL_SOKOBAN_OBJECTS 56 +#define GAME_PANEL_SOKOBAN_FIELDS 57 +#define GAME_PANEL_ROBOT_WHEEL 58 +#define GAME_PANEL_CONVEYOR_BELT_1 59 +#define GAME_PANEL_CONVEYOR_BELT_2 60 +#define GAME_PANEL_CONVEYOR_BELT_3 61 +#define GAME_PANEL_CONVEYOR_BELT_4 62 +#define GAME_PANEL_CONVEYOR_BELT_1_SWITCH 63 +#define GAME_PANEL_CONVEYOR_BELT_2_SWITCH 64 +#define GAME_PANEL_CONVEYOR_BELT_3_SWITCH 65 +#define GAME_PANEL_CONVEYOR_BELT_4_SWITCH 66 +#define GAME_PANEL_MAGIC_WALL 67 +#define GAME_PANEL_MAGIC_WALL_TIME 68 +#define GAME_PANEL_GRAVITY_STATE 69 +#define GAME_PANEL_GRAPHIC_1 70 +#define GAME_PANEL_GRAPHIC_2 71 +#define GAME_PANEL_GRAPHIC_3 72 +#define GAME_PANEL_GRAPHIC_4 73 +#define GAME_PANEL_GRAPHIC_5 74 +#define GAME_PANEL_GRAPHIC_6 75 +#define GAME_PANEL_GRAPHIC_7 76 +#define GAME_PANEL_GRAPHIC_8 77 +#define GAME_PANEL_ELEMENT_1 78 +#define GAME_PANEL_ELEMENT_2 79 +#define GAME_PANEL_ELEMENT_3 80 +#define GAME_PANEL_ELEMENT_4 81 +#define GAME_PANEL_ELEMENT_5 82 +#define GAME_PANEL_ELEMENT_6 83 +#define GAME_PANEL_ELEMENT_7 84 +#define GAME_PANEL_ELEMENT_8 85 +#define GAME_PANEL_ELEMENT_COUNT_1 86 +#define GAME_PANEL_ELEMENT_COUNT_2 87 +#define GAME_PANEL_ELEMENT_COUNT_3 88 +#define GAME_PANEL_ELEMENT_COUNT_4 89 +#define GAME_PANEL_ELEMENT_COUNT_5 90 +#define GAME_PANEL_ELEMENT_COUNT_6 91 +#define GAME_PANEL_ELEMENT_COUNT_7 92 +#define GAME_PANEL_ELEMENT_COUNT_8 93 +#define GAME_PANEL_CE_SCORE_1 94 +#define GAME_PANEL_CE_SCORE_2 95 +#define GAME_PANEL_CE_SCORE_3 96 +#define GAME_PANEL_CE_SCORE_4 97 +#define GAME_PANEL_CE_SCORE_5 98 +#define GAME_PANEL_CE_SCORE_6 99 +#define GAME_PANEL_CE_SCORE_7 100 +#define GAME_PANEL_CE_SCORE_8 101 +#define GAME_PANEL_CE_SCORE_1_ELEMENT 102 +#define GAME_PANEL_CE_SCORE_2_ELEMENT 103 +#define GAME_PANEL_CE_SCORE_3_ELEMENT 104 +#define GAME_PANEL_CE_SCORE_4_ELEMENT 105 +#define GAME_PANEL_CE_SCORE_5_ELEMENT 106 +#define GAME_PANEL_CE_SCORE_6_ELEMENT 107 +#define GAME_PANEL_CE_SCORE_7_ELEMENT 108 +#define GAME_PANEL_CE_SCORE_8_ELEMENT 109 +#define GAME_PANEL_PLAYER_NAME 110 +#define GAME_PANEL_LEVEL_NAME 111 +#define GAME_PANEL_LEVEL_AUTHOR 112 + +#define NUM_GAME_PANEL_CONTROLS 113 struct GamePanelOrderInfo { @@ -403,6 +420,11 @@ static struct GamePanelControlInfo game_panel_controls[] = &game.panel.score, TYPE_INTEGER, }, + { + GAME_PANEL_HIGHSCORE, + &game.panel.highscore, + TYPE_INTEGER, + }, { GAME_PANEL_TIME, &game.panel.time, @@ -598,6 +620,46 @@ static struct GamePanelControlInfo game_panel_controls[] = &game.panel.gravity_state, TYPE_STRING, }, + { + GAME_PANEL_GRAPHIC_1, + &game.panel.graphic[0], + TYPE_ELEMENT, + }, + { + GAME_PANEL_GRAPHIC_2, + &game.panel.graphic[1], + TYPE_ELEMENT, + }, + { + GAME_PANEL_GRAPHIC_3, + &game.panel.graphic[2], + TYPE_ELEMENT, + }, + { + GAME_PANEL_GRAPHIC_4, + &game.panel.graphic[3], + TYPE_ELEMENT, + }, + { + GAME_PANEL_GRAPHIC_5, + &game.panel.graphic[4], + TYPE_ELEMENT, + }, + { + GAME_PANEL_GRAPHIC_6, + &game.panel.graphic[5], + TYPE_ELEMENT, + }, + { + GAME_PANEL_GRAPHIC_7, + &game.panel.graphic[6], + TYPE_ELEMENT, + }, + { + GAME_PANEL_GRAPHIC_8, + &game.panel.graphic[7], + TYPE_ELEMENT, + }, { GAME_PANEL_ELEMENT_1, &game.panel.element[0], @@ -638,6 +700,46 @@ static struct GamePanelControlInfo game_panel_controls[] = &game.panel.element[7], TYPE_ELEMENT, }, + { + GAME_PANEL_ELEMENT_COUNT_1, + &game.panel.element_count[0], + TYPE_INTEGER, + }, + { + GAME_PANEL_ELEMENT_COUNT_2, + &game.panel.element_count[1], + TYPE_INTEGER, + }, + { + GAME_PANEL_ELEMENT_COUNT_3, + &game.panel.element_count[2], + TYPE_INTEGER, + }, + { + GAME_PANEL_ELEMENT_COUNT_4, + &game.panel.element_count[3], + TYPE_INTEGER, + }, + { + GAME_PANEL_ELEMENT_COUNT_5, + &game.panel.element_count[4], + TYPE_INTEGER, + }, + { + GAME_PANEL_ELEMENT_COUNT_6, + &game.panel.element_count[5], + TYPE_INTEGER, + }, + { + GAME_PANEL_ELEMENT_COUNT_7, + &game.panel.element_count[6], + TYPE_INTEGER, + }, + { + GAME_PANEL_ELEMENT_COUNT_8, + &game.panel.element_count[7], + TYPE_INTEGER, + }, { GAME_PANEL_CE_SCORE_1, &game.panel.ce_score[0], @@ -800,6 +902,9 @@ static struct GamePanelControlInfo game_panel_controls[] = (be) + (e) - EL_SELF > EL_CUSTOM_END ? EL_CUSTOM_END : \ (be) + (e) - EL_SELF) +#define GET_PLAYER_FROM_BITS(p) \ + (EL_PLAYER_1 + ((p) != PLAYER_BITS_ANY ? log_2(p) : 0)) + #define GET_TARGET_ELEMENT(be, e, ch, cv, cs) \ ((e) == EL_TRIGGER_PLAYER ? (ch)->actual_trigger_player : \ (e) == EL_TRIGGER_ELEMENT ? (ch)->actual_trigger_element : \ @@ -1979,7 +2084,7 @@ void InitGameControlValues() if (nr != i) { - Error(ERR_INFO, "'game_panel_controls' structure corrupted"); + Error(ERR_INFO, "'game_panel_controls' structure corrupted at %d", i); Error(ERR_EXIT, "this should not happen -- please debug"); } @@ -2010,19 +2115,62 @@ void InitGameControlValues() sizeof(struct GamePanelOrderInfo), compareGamePanelOrderInfo); } +void UpdatePlayfieldElementCount() +{ + boolean use_element_count = FALSE; + int i, j, x, y; + + /* first check if it is needed at all to calculate playfield element count */ + for (i = GAME_PANEL_ELEMENT_COUNT_1; i <= GAME_PANEL_ELEMENT_COUNT_8; i++) + if (!PANEL_DEACTIVATED(game_panel_controls[i].pos)) + use_element_count = TRUE; + + if (!use_element_count) + return; + + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + element_info[i].element_count = 0; + + SCAN_PLAYFIELD(x, y) + { + element_info[Feld[x][y]].element_count++; + } + + for (i = 0; i < NUM_GROUP_ELEMENTS; i++) + for (j = 0; j < MAX_NUM_ELEMENTS; j++) + if (IS_IN_GROUP(j, i)) + element_info[EL_GROUP_START + i].element_count += + element_info[j].element_count; +} + void UpdateGameControlValues() { int i, k; - int time = (level.time == 0 ? TimePlayed : TimeLeft); - int score = (local_player->LevelSolved ? local_player->score_final : + int time = (local_player->LevelSolved ? + local_player->LevelSolved_CountingTime : + level.game_engine_type == GAME_ENGINE_TYPE_EM ? + level.native_em_level->lev->time : + level.time == 0 ? TimePlayed : TimeLeft); + int score = (local_player->LevelSolved ? + local_player->LevelSolved_CountingScore : + level.game_engine_type == GAME_ENGINE_TYPE_EM ? + level.native_em_level->lev->score : local_player->score); - int exit_closed = (local_player->gems_still_needed > 0 || + int gems = (level.game_engine_type == GAME_ENGINE_TYPE_EM ? + level.native_em_level->lev->required : + local_player->gems_still_needed); + int exit_closed = (level.game_engine_type == GAME_ENGINE_TYPE_EM ? + level.native_em_level->lev->required > 0 : + local_player->gems_still_needed > 0 || local_player->sokobanfields_still_needed > 0 || local_player->lights_still_needed > 0); + UpdatePlayfieldElementCount(); + + /* update game panel control values */ + game_panel_controls[GAME_PANEL_LEVEL_NUMBER].value = level_nr; - game_panel_controls[GAME_PANEL_GEMS].value = - local_player->gems_still_needed; + game_panel_controls[GAME_PANEL_GEMS].value = gems; game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value = 0; for (i = 0; i < MAX_NUM_KEYS; i++) @@ -2035,12 +2183,24 @@ void UpdateGameControlValues() for (i = 0; i < MAX_PLAYERS; i++) { for (k = 0; k < MAX_NUM_KEYS; k++) - if (stored_player[i].key[k]) + { + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + { + if (level.native_em_level->ply[i]->keys & (1 << k)) + game_panel_controls[GAME_PANEL_KEY_1 + k].value = + get_key_element_from_nr(k); + } + else if (stored_player[i].key[k]) game_panel_controls[GAME_PANEL_KEY_1 + k].value = get_key_element_from_nr(k); + } - game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value += - stored_player[i].inventory_size; + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value += + level.native_em_level->ply[i]->dynamite; + else + game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value += + stored_player[i].inventory_size; if (stored_player[i].num_white_keys > 0) game_panel_controls[GAME_PANEL_KEY_WHITE].value = @@ -2055,12 +2215,24 @@ void UpdateGameControlValues() int player_nr = game.centered_player_nr; for (k = 0; k < MAX_NUM_KEYS; k++) - if (stored_player[player_nr].key[k]) + { + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + { + if (level.native_em_level->ply[player_nr]->keys & (1 << k)) + game_panel_controls[GAME_PANEL_KEY_1 + k].value = + get_key_element_from_nr(k); + } + else if (stored_player[player_nr].key[k]) game_panel_controls[GAME_PANEL_KEY_1 + k].value = get_key_element_from_nr(k); + } - game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value += - stored_player[player_nr].inventory_size; + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value += + level.native_em_level->ply[player_nr]->dynamite; + else + game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value += + stored_player[player_nr].inventory_size; if (stored_player[player_nr].num_white_keys > 0) game_panel_controls[GAME_PANEL_KEY_WHITE].value = EL_DC_KEY_WHITE; @@ -2078,6 +2250,7 @@ void UpdateGameControlValues() } game_panel_controls[GAME_PANEL_SCORE].value = score; + game_panel_controls[GAME_PANEL_HIGHSCORE].value = highscore[0].Score; game_panel_controls[GAME_PANEL_TIME].value = time; @@ -2174,11 +2347,19 @@ void UpdateGameControlValues() game_panel_controls[GAME_PANEL_GRAVITY_STATE].value = game.gravity; #endif + for (i = 0; i < NUM_PANEL_GRAPHICS; i++) + game_panel_controls[GAME_PANEL_GRAPHIC_1 + i].value = EL_GRAPHIC_1 + i; + for (i = 0; i < NUM_PANEL_ELEMENTS; i++) game_panel_controls[GAME_PANEL_ELEMENT_1 + i].value = (IS_DRAWABLE_ELEMENT(game.panel.element[i].id) ? game.panel.element[i].id : EL_UNDEFINED); + for (i = 0; i < NUM_PANEL_ELEMENTS; i++) + game_panel_controls[GAME_PANEL_ELEMENT_COUNT_1 + i].value = + (IS_VALID_ELEMENT(game.panel.element_count[i].id) ? + element_info[game.panel.element_count[i].id].element_count : 0); + for (i = 0; i < NUM_PANEL_CE_SCORE; i++) game_panel_controls[GAME_PANEL_CE_SCORE_1 + i].value = (IS_CUSTOM_ELEMENT(game.panel.ce_score[i].id) ? @@ -2194,6 +2375,8 @@ void UpdateGameControlValues() game_panel_controls[GAME_PANEL_LEVEL_NAME].value = 0; game_panel_controls[GAME_PANEL_LEVEL_AUTHOR].value = 0; + /* update game panel control frames */ + for (i = 0; game_panel_controls[i].nr != -1; i++) { struct GamePanelControlInfo *gpc = &game_panel_controls[i]; @@ -2373,6 +2556,13 @@ void DisplayGameControlValues() element = value; graphic = el2panelimg(value); + // printf("::: %d, '%s' [%d]\n", element, EL_NAME(element), size); + +#if 1 + if (element >= EL_GRAPHIC_1 && element <= EL_GRAPHIC_8 && size == 0) + size = TILESIZE; +#endif + getSizedGraphicSource(graphic, frame, size, &src_bitmap, &src_x, &src_y); @@ -2479,6 +2669,15 @@ void DisplayGameControlValues() game_status = GAME_MODE_PLAYING; } +void UpdateAndDisplayGameControlValues() +{ + if (tape.warp_forward) + return; + + UpdateGameControlValues(); + DisplayGameControlValues(); +} + void DrawGameValue_Emeralds(int value) { struct TextPosInfo *pos = &game.panel.gems; @@ -3162,6 +3361,7 @@ static void InitGameEngine() { ei->change_page[j].actual_trigger_element = EL_EMPTY; ei->change_page[j].actual_trigger_player = EL_PLAYER_1; + ei->change_page[j].actual_trigger_player_bits = CH_PLAYER_1; ei->change_page[j].actual_trigger_side = CH_SIDE_NONE; ei->change_page[j].actual_trigger_ce_value = 0; ei->change_page[j].actual_trigger_ce_score = 0; @@ -3526,6 +3726,8 @@ void InitGame() player->LevelSolved_PanelOff = FALSE; player->LevelSolved_SaveTape = FALSE; player->LevelSolved_SaveScore = FALSE; + player->LevelSolved_CountingTime = 0; + player->LevelSolved_CountingScore = 0; } network_player_action_received = FALSE; @@ -3950,8 +4152,10 @@ void InitGame() local_player->jy - MIDPOSY); } +#if 0 /* do not use PLAYING mask for fading out from main screen */ game_status = GAME_MODE_MAIN; +#endif StopAnimation(); @@ -3977,7 +4181,9 @@ void InitGame() FadeOut(REDRAW_FIELD); #endif +#if 0 game_status = GAME_MODE_PLAYING; +#endif /* !!! FIX THIS (START) !!! */ if (level.game_engine_type == GAME_ENGINE_TYPE_EM) @@ -4023,8 +4229,12 @@ void InitGame() SetPanelBackground(); SetDrawBackgroundMask(REDRAW_DOOR_1); +#if 1 + UpdateAndDisplayGameControlValues(); +#else UpdateGameDoorValues(); DrawGameDoorValues(); +#endif if (!game.restart_level) { @@ -4281,6 +4491,9 @@ static void PlayerWins(struct PlayerInfo *player) player->score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ? level.native_em_level->lev->score : player->score); + + player->LevelSolved_CountingTime = (level.time == 0 ? TimePlayed : TimeLeft); + player->LevelSolved_CountingScore = player->score_final; } void GameWon() @@ -4336,6 +4549,9 @@ void GameWon() score = score_final; #if 1 + local_player->LevelSolved_CountingTime = time; + local_player->LevelSolved_CountingScore = score; + game_panel_controls[GAME_PANEL_TIME].value = time; game_panel_controls[GAME_PANEL_SCORE].value = score; @@ -4418,6 +4634,9 @@ void GameWon() score += time_count_steps * level.score[SC_TIME_BONUS]; #if 1 + local_player->LevelSolved_CountingTime = time; + local_player->LevelSolved_CountingScore = score; + game_panel_controls[GAME_PANEL_TIME].value = time; game_panel_controls[GAME_PANEL_SCORE].value = score; @@ -8443,7 +8662,7 @@ void ContinueMoving(int x, int y) } #if USE_NEW_CUSTOM_VALUE - CustomValue[newx][newy] = CustomValue[x][y]; + CustomValue[newx][newy] = CustomValue[x][y]; #endif ChangeDelay[x][y] = 0; @@ -9314,9 +9533,6 @@ void DrawTwinkleOnField(int x, int y) { MovDelay[x][y]--; - if (setup.direct_draw && MovDelay[x][y]) - SetDrawtoField(DRAW_BUFFERED); - DrawLevelElementAnimation(x, y, Feld[x][y]); if (MovDelay[x][y] != 0) @@ -9325,18 +9541,6 @@ void DrawTwinkleOnField(int x, int y) 10 - MovDelay[x][y]); DrawGraphicThruMask(SCREENX(x), SCREENY(y), IMG_TWINKLE_WHITE, frame); - - if (setup.direct_draw) - { - int dest_x, dest_y; - - dest_x = FX + SCREENX(x) * TILEX; - dest_y = FY + SCREENY(y) * TILEY; - - BlitBitmap(drawto_field, window, - dest_x, dest_y, TILEX, TILEY, dest_x, dest_y); - SetDrawtoField(DRAW_DIRECT); - } } } } @@ -9830,11 +10034,15 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) action_mode, action_arg_number, action_arg_number_min, action_arg_number_max); +#if 1 + int trigger_player_bits = change->actual_trigger_player_bits; +#else int trigger_player_bits = (change->actual_trigger_player >= EL_PLAYER_1 && change->actual_trigger_player <= EL_PLAYER_4 ? (1 << (change->actual_trigger_player - EL_PLAYER_1)) : PLAYER_BITS_ANY); +#endif int action_arg_player_bits = (action_arg >= CA_ARG_PLAYER_1 && @@ -10340,6 +10548,7 @@ static boolean ChangeElement(int x, int y, int element, int page) /* reset actual trigger element, trigger player and action element */ change->actual_trigger_element = EL_EMPTY; change->actual_trigger_player = EL_PLAYER_1; + change->actual_trigger_player_bits = CH_PLAYER_1; change->actual_trigger_side = CH_SIDE_NONE; change->actual_trigger_ce_value = 0; change->actual_trigger_ce_score = 0; @@ -10720,7 +10929,8 @@ static boolean CheckTriggeredElementChangeExt(int trigger_x, int trigger_y, IS_EQUAL_OR_IN_GROUP(trigger_element, change->trigger_element)) { change->actual_trigger_element = trigger_element; - change->actual_trigger_player = EL_PLAYER_1 + log_2(trigger_player); + change->actual_trigger_player = GET_PLAYER_FROM_BITS(trigger_player); + change->actual_trigger_player_bits = trigger_player; change->actual_trigger_side = trigger_side; change->actual_trigger_ce_value = CustomValue[trigger_x][trigger_y]; change->actual_trigger_ce_score = GET_CE_SCORE(trigger_element); @@ -10839,7 +11049,8 @@ static boolean CheckElementChangeExt(int x, int y, IS_EQUAL_OR_IN_GROUP(trigger_element, change->trigger_element))) { change->actual_trigger_element = trigger_element; - change->actual_trigger_player = EL_PLAYER_1 + log_2(trigger_player); + change->actual_trigger_player = GET_PLAYER_FROM_BITS(trigger_player); + change->actual_trigger_player_bits = trigger_player; change->actual_trigger_side = trigger_side; change->actual_trigger_ce_value = CustomValue[x][y]; change->actual_trigger_ce_score = GET_CE_SCORE(trigger_element); @@ -11230,8 +11441,12 @@ static void CheckLevelTime() DrawVideoDisplay(VIDEO_STATE_TIME_ON, TapeTime); } +#if 1 + UpdateAndDisplayGameControlValues(); +#else UpdateGameDoorValues(); DrawGameDoorValues(); +#endif } void AdvanceFrameAndPlayerCounters(int player_nr) @@ -12297,7 +12512,7 @@ void ScrollLevel(int dx, int dy) #else -#if 1 +#if 0 /* !!! DOES NOT WORK FOR DIAGONAL PLAYER RELOCATION !!! */ int xsize = (BX2 - BX1 + 1); int ysize = (BY2 - BY1 + 1);