#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
{
&game.panel.score,
TYPE_INTEGER,
},
+ {
+ GAME_PANEL_HIGHSCORE,
+ &game.panel.highscore,
+ TYPE_INTEGER,
+ },
{
GAME_PANEL_TIME,
&game.panel.time,
&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],
&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],
(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 : \
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");
}
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;
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 = gems;
}
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;
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) ?
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];
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);
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;
{
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;
local_player->jy - MIDPOSY);
}
+#if 0
/* do not use PLAYING mask for fading out from main screen */
game_status = GAME_MODE_MAIN;
+#endif
StopAnimation();
FadeOut(REDRAW_FIELD);
#endif
+#if 0
game_status = GAME_MODE_PLAYING;
+#endif
/* !!! FIX THIS (START) !!! */
if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
SetPanelBackground();
SetDrawBackgroundMask(REDRAW_DOOR_1);
+#if 1
+ UpdateAndDisplayGameControlValues();
+#else
UpdateGameDoorValues();
DrawGameDoorValues();
+#endif
if (!game.restart_level)
{
}
#if USE_NEW_CUSTOM_VALUE
- CustomValue[newx][newy] = CustomValue[x][y];
+ CustomValue[newx][newy] = CustomValue[x][y];
#endif
ChangeDelay[x][y] = 0;
{
MovDelay[x][y]--;
- if (setup.direct_draw && MovDelay[x][y])
- SetDrawtoField(DRAW_BUFFERED);
-
DrawLevelElementAnimation(x, y, Feld[x][y]);
if (MovDelay[x][y] != 0)
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);
- }
}
}
}
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 &&
/* 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;
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);
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);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, TapeTime);
}
+#if 1
+ UpdateAndDisplayGameControlValues();
+#else
UpdateGameDoorValues();
DrawGameDoorValues();
+#endif
}
void AdvanceFrameAndPlayerCounters(int player_nr)
#else
-#if 1
+#if 0
/* !!! DOES NOT WORK FOR DIAGONAL PLAYER RELOCATION !!! */
int xsize = (BX2 - BX1 + 1);
int ysize = (BY2 - BY1 + 1);