#define USE_GFX_RESET_WHEN_NOT_MOVING (USE_NEW_STUFF * 1)
+#define USE_DELAYED_GFX_REDRAW (USE_NEW_STUFF * 1)
+
+#if USE_DELAYED_GFX_REDRAW
+#define TEST_DrawLevelField(x, y) \
+ GfxRedraw[x][y] |= GFX_REDRAW_TILE
+#define TEST_DrawLevelFieldCrumbledSand(x, y) \
+ GfxRedraw[x][y] |= GFX_REDRAW_TILE_CRUMBLED
+#define TEST_DrawLevelFieldCrumbledSandNeighbours(x, y) \
+ GfxRedraw[x][y] |= GFX_REDRAW_TILE_CRUMBLED_NEIGHBOURS
+#define TEST_DrawTwinkleOnField(x, y) \
+ GfxRedraw[x][y] |= GFX_REDRAW_TILE_TWINKLED
+#else
+#define TEST_DrawLevelField(x, y) \
+ DrawLevelField(x, y)
+#define TEST_DrawLevelFieldCrumbledSand(x, y) \
+ DrawLevelFieldCrumbledSand(x, y)
+#define TEST_DrawLevelFieldCrumbledSandNeighbours(x, y) \
+ DrawLevelFieldCrumbledSandNeighbours(x, y)
+#define TEST_DrawTwinkleOnField(x, y) \
+ DrawTwinkleOnField(x, y)
+#endif
+
/* for DigField() */
#define DF_NO_PUSH 0
#if 1
/* game panel display and control definitions */
-#define GAME_CONTROL_LEVEL_NUMBER 0
-#define GAME_CONTROL_GEMS 1
-#define GAME_CONTROL_INVENTORY 2
-#define GAME_CONTROL_KEY_1 3
-#define GAME_CONTROL_KEY_2 4
-#define GAME_CONTROL_KEY_3 5
-#define GAME_CONTROL_KEY_4 6
-#define GAME_CONTROL_KEY_5 7
-#define GAME_CONTROL_KEY_6 8
-#define GAME_CONTROL_KEY_7 9
-#define GAME_CONTROL_KEY_8 10
-#define GAME_CONTROL_KEY_WHITE 11
-#define GAME_CONTROL_KEY_WHITE_COUNT 12
-#define GAME_CONTROL_SCORE 13
-#define GAME_CONTROL_TIME 14
-#define GAME_CONTROL_TIME_HH 15
-#define GAME_CONTROL_TIME_MM 16
-#define GAME_CONTROL_TIME_SS 17
-#define GAME_CONTROL_DROP_NEXT_1 18
-#define GAME_CONTROL_DROP_NEXT_2 19
-#define GAME_CONTROL_DROP_NEXT_3 20
-#define GAME_CONTROL_DROP_NEXT_4 21
-#define GAME_CONTROL_DROP_NEXT_5 22
-#define GAME_CONTROL_DROP_NEXT_6 23
-#define GAME_CONTROL_DROP_NEXT_7 24
-#define GAME_CONTROL_DROP_NEXT_8 25
-#define GAME_CONTROL_SHIELD_NORMAL 26
-#define GAME_CONTROL_SHIELD_NORMAL_TIME 27
-#define GAME_CONTROL_SHIELD_DEADLY 28
-#define GAME_CONTROL_SHIELD_DEADLY_TIME 29
-#define GAME_CONTROL_EXIT 30
-#define GAME_CONTROL_EM_EXIT 31
-#define GAME_CONTROL_SP_EXIT 32
-#define GAME_CONTROL_STEEL_EXIT 33
-#define GAME_CONTROL_EM_STEEL_EXIT 34
-#define GAME_CONTROL_EMC_MAGIC_BALL 35
-#define GAME_CONTROL_EMC_MAGIC_BALL_SWITCH 36
-#define GAME_CONTROL_LIGHT_SWITCH 37
-#define GAME_CONTROL_LIGHT_SWITCH_TIME 38
-#define GAME_CONTROL_TIMEGATE_SWITCH 39
-#define GAME_CONTROL_TIMEGATE_SWITCH_TIME 40
-#define GAME_CONTROL_SWITCHGATE_SWITCH 41
-#define GAME_CONTROL_EMC_LENSES 42
-#define GAME_CONTROL_EMC_LENSES_TIME 43
-#define GAME_CONTROL_EMC_MAGNIFIER 44
-#define GAME_CONTROL_EMC_MAGNIFIER_TIME 45
-#define GAME_CONTROL_BALLOON_SWITCH 46
-#define GAME_CONTROL_DYNABOMB_NUMBER 47
-#define GAME_CONTROL_DYNABOMB_SIZE 48
-#define GAME_CONTROL_DYNABOMB_POWER 49
-#define GAME_CONTROL_PENGUINS 50
-#define GAME_CONTROL_SOKOBAN_OBJECTS 51
-#define GAME_CONTROL_SOKOBAN_FIELDS 52
-#define GAME_CONTROL_ROBOT_WHEEL 53
-#define GAME_CONTROL_CONVEYOR_BELT_1 54
-#define GAME_CONTROL_CONVEYOR_BELT_1_SWITCH 55
-#define GAME_CONTROL_CONVEYOR_BELT_2 56
-#define GAME_CONTROL_CONVEYOR_BELT_2_SWITCH 57
-#define GAME_CONTROL_CONVEYOR_BELT_3 58
-#define GAME_CONTROL_CONVEYOR_BELT_3_SWITCH 59
-#define GAME_CONTROL_CONVEYOR_BELT_4 60
-#define GAME_CONTROL_CONVEYOR_BELT_4_SWITCH 61
-#define GAME_CONTROL_MAGIC_WALL 62
-#define GAME_CONTROL_MAGIC_WALL_TIME 63
-#define GAME_CONTROL_BD_MAGIC_WALL 64
-#define GAME_CONTROL_DC_MAGIC_WALL 65
-#define GAME_CONTROL_PLAYER_NAME 66
-#define GAME_CONTROL_LEVEL_NAME 67
-#define GAME_CONTROL_LEVEL_AUTHOR 68
-
-#define NUM_GAME_CONTROLS 69
-
-int game_control_value[NUM_GAME_CONTROLS];
-int last_game_control_value[NUM_GAME_CONTROLS];
-
-struct GameControlInfo
+#define GAME_PANEL_LEVEL_NUMBER 0
+#define GAME_PANEL_GEMS 1
+#define GAME_PANEL_INVENTORY_COUNT 2
+#define GAME_PANEL_INVENTORY_FIRST_1 3
+#define GAME_PANEL_INVENTORY_FIRST_2 4
+#define GAME_PANEL_INVENTORY_FIRST_3 5
+#define GAME_PANEL_INVENTORY_FIRST_4 6
+#define GAME_PANEL_INVENTORY_FIRST_5 7
+#define GAME_PANEL_INVENTORY_FIRST_6 8
+#define GAME_PANEL_INVENTORY_FIRST_7 9
+#define GAME_PANEL_INVENTORY_FIRST_8 10
+#define GAME_PANEL_INVENTORY_LAST_1 11
+#define GAME_PANEL_INVENTORY_LAST_2 12
+#define GAME_PANEL_INVENTORY_LAST_3 13
+#define GAME_PANEL_INVENTORY_LAST_4 14
+#define GAME_PANEL_INVENTORY_LAST_5 15
+#define GAME_PANEL_INVENTORY_LAST_6 16
+#define GAME_PANEL_INVENTORY_LAST_7 17
+#define GAME_PANEL_INVENTORY_LAST_8 18
+#define GAME_PANEL_KEY_1 19
+#define GAME_PANEL_KEY_2 20
+#define GAME_PANEL_KEY_3 21
+#define GAME_PANEL_KEY_4 22
+#define GAME_PANEL_KEY_5 23
+#define GAME_PANEL_KEY_6 24
+#define GAME_PANEL_KEY_7 25
+#define GAME_PANEL_KEY_8 26
+#define GAME_PANEL_KEY_WHITE 27
+#define GAME_PANEL_KEY_WHITE_COUNT 28
+#define GAME_PANEL_SCORE 29
+#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
+{
+ int nr;
+ int sort_priority;
+};
+
+static struct GamePanelOrderInfo game_panel_order[NUM_GAME_PANEL_CONTROLS];
+
+struct GamePanelControlInfo
{
int nr;
struct TextPosInfo *pos;
int type;
+
+ int value, last_value;
+ int frame, last_frame;
+ int gfx_frame;
+ int gfx_random;
};
-static struct GameControlInfo game_controls[] =
+static struct GamePanelControlInfo game_panel_controls[] =
{
{
- GAME_CONTROL_LEVEL_NUMBER,
+ GAME_PANEL_LEVEL_NUMBER,
&game.panel.level_number,
TYPE_INTEGER,
},
{
- GAME_CONTROL_GEMS,
+ GAME_PANEL_GEMS,
&game.panel.gems,
TYPE_INTEGER,
},
{
- GAME_CONTROL_INVENTORY,
- &game.panel.inventory,
+ GAME_PANEL_INVENTORY_COUNT,
+ &game.panel.inventory_count,
TYPE_INTEGER,
},
{
- GAME_CONTROL_KEY_1,
- &game.panel.key[0],
+ GAME_PANEL_INVENTORY_FIRST_1,
+ &game.panel.inventory_first[0],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_2,
- &game.panel.key[1],
+ GAME_PANEL_INVENTORY_FIRST_2,
+ &game.panel.inventory_first[1],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_3,
- &game.panel.key[2],
+ GAME_PANEL_INVENTORY_FIRST_3,
+ &game.panel.inventory_first[2],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_4,
- &game.panel.key[3],
+ GAME_PANEL_INVENTORY_FIRST_4,
+ &game.panel.inventory_first[3],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_5,
- &game.panel.key[4],
+ GAME_PANEL_INVENTORY_FIRST_5,
+ &game.panel.inventory_first[4],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_6,
- &game.panel.key[5],
+ GAME_PANEL_INVENTORY_FIRST_6,
+ &game.panel.inventory_first[5],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_7,
- &game.panel.key[6],
+ GAME_PANEL_INVENTORY_FIRST_7,
+ &game.panel.inventory_first[6],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_8,
- &game.panel.key[7],
+ GAME_PANEL_INVENTORY_FIRST_8,
+ &game.panel.inventory_first[7],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_WHITE,
- &game.panel.key_white,
+ GAME_PANEL_INVENTORY_LAST_1,
+ &game.panel.inventory_last[0],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_KEY_WHITE_COUNT,
- &game.panel.key_white_count,
- TYPE_INTEGER,
+ GAME_PANEL_INVENTORY_LAST_2,
+ &game.panel.inventory_last[1],
+ TYPE_ELEMENT,
},
{
- GAME_CONTROL_SCORE,
- &game.panel.score,
- TYPE_INTEGER,
+ GAME_PANEL_INVENTORY_LAST_3,
+ &game.panel.inventory_last[2],
+ TYPE_ELEMENT,
},
{
- GAME_CONTROL_TIME,
- &game.panel.time,
- TYPE_INTEGER,
+ GAME_PANEL_INVENTORY_LAST_4,
+ &game.panel.inventory_last[3],
+ TYPE_ELEMENT,
},
{
- GAME_CONTROL_TIME_HH,
- &game.panel.time_hh,
- TYPE_INTEGER,
+ GAME_PANEL_INVENTORY_LAST_5,
+ &game.panel.inventory_last[4],
+ TYPE_ELEMENT,
},
{
- GAME_CONTROL_TIME_MM,
- &game.panel.time_mm,
- TYPE_INTEGER,
+ GAME_PANEL_INVENTORY_LAST_6,
+ &game.panel.inventory_last[5],
+ TYPE_ELEMENT,
},
{
- GAME_CONTROL_TIME_SS,
- &game.panel.time_ss,
- TYPE_INTEGER,
+ GAME_PANEL_INVENTORY_LAST_7,
+ &game.panel.inventory_last[6],
+ TYPE_ELEMENT,
},
{
- GAME_CONTROL_DROP_NEXT_1,
- &game.panel.drop_next_1,
+ GAME_PANEL_INVENTORY_LAST_8,
+ &game.panel.inventory_last[7],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DROP_NEXT_2,
- &game.panel.drop_next_2,
+ GAME_PANEL_KEY_1,
+ &game.panel.key[0],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DROP_NEXT_3,
- &game.panel.drop_next_3,
+ GAME_PANEL_KEY_2,
+ &game.panel.key[1],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DROP_NEXT_4,
- &game.panel.drop_next_4,
+ GAME_PANEL_KEY_3,
+ &game.panel.key[2],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DROP_NEXT_5,
- &game.panel.drop_next_5,
+ GAME_PANEL_KEY_4,
+ &game.panel.key[3],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DROP_NEXT_6,
- &game.panel.drop_next_6,
+ GAME_PANEL_KEY_5,
+ &game.panel.key[4],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DROP_NEXT_7,
- &game.panel.drop_next_7,
+ GAME_PANEL_KEY_6,
+ &game.panel.key[5],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DROP_NEXT_8,
- &game.panel.drop_next_8,
+ GAME_PANEL_KEY_7,
+ &game.panel.key[6],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_SHIELD_NORMAL,
- &game.panel.shield_normal,
+ GAME_PANEL_KEY_8,
+ &game.panel.key[7],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_SHIELD_NORMAL_TIME,
- &game.panel.shield_normal_time,
+ GAME_PANEL_KEY_WHITE,
+ &game.panel.key_white,
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_KEY_WHITE_COUNT,
+ &game.panel.key_white_count,
TYPE_INTEGER,
},
{
- GAME_CONTROL_SHIELD_DEADLY,
- &game.panel.shield_deadly,
- TYPE_ELEMENT,
+ GAME_PANEL_SCORE,
+ &game.panel.score,
+ TYPE_INTEGER,
},
{
- GAME_CONTROL_SHIELD_DEADLY_TIME,
- &game.panel.shield_deadly_time,
+ GAME_PANEL_HIGHSCORE,
+ &game.panel.highscore,
TYPE_INTEGER,
},
{
- GAME_CONTROL_EXIT,
- &game.panel.exit,
- TYPE_ELEMENT,
+ GAME_PANEL_TIME,
+ &game.panel.time,
+ TYPE_INTEGER,
},
{
- GAME_CONTROL_EM_EXIT,
- &game.panel.em_exit,
- TYPE_ELEMENT,
+ GAME_PANEL_TIME_HH,
+ &game.panel.time_hh,
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_TIME_MM,
+ &game.panel.time_mm,
+ TYPE_INTEGER,
},
{
- GAME_CONTROL_SP_EXIT,
- &game.panel.sp_exit,
+ GAME_PANEL_TIME_SS,
+ &game.panel.time_ss,
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_SHIELD_NORMAL,
+ &game.panel.shield_normal,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_STEEL_EXIT,
- &game.panel.steel_exit,
+ GAME_PANEL_SHIELD_NORMAL_TIME,
+ &game.panel.shield_normal_time,
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_SHIELD_DEADLY,
+ &game.panel.shield_deadly,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_EM_STEEL_EXIT,
- &game.panel.em_steel_exit,
+ GAME_PANEL_SHIELD_DEADLY_TIME,
+ &game.panel.shield_deadly_time,
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_EXIT,
+ &game.panel.exit,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_EMC_MAGIC_BALL,
+ GAME_PANEL_EMC_MAGIC_BALL,
&game.panel.emc_magic_ball,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_EMC_MAGIC_BALL_SWITCH,
+ GAME_PANEL_EMC_MAGIC_BALL_SWITCH,
&game.panel.emc_magic_ball_switch,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_LIGHT_SWITCH,
+ GAME_PANEL_LIGHT_SWITCH,
&game.panel.light_switch,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_LIGHT_SWITCH_TIME,
+ GAME_PANEL_LIGHT_SWITCH_TIME,
&game.panel.light_switch_time,
TYPE_INTEGER,
},
{
- GAME_CONTROL_TIMEGATE_SWITCH,
+ GAME_PANEL_TIMEGATE_SWITCH,
&game.panel.timegate_switch,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_TIMEGATE_SWITCH_TIME,
+ GAME_PANEL_TIMEGATE_SWITCH_TIME,
&game.panel.timegate_switch_time,
TYPE_INTEGER,
},
{
- GAME_CONTROL_SWITCHGATE_SWITCH,
+ GAME_PANEL_SWITCHGATE_SWITCH,
&game.panel.switchgate_switch,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_EMC_LENSES,
+ GAME_PANEL_EMC_LENSES,
&game.panel.emc_lenses,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_EMC_LENSES_TIME,
+ GAME_PANEL_EMC_LENSES_TIME,
&game.panel.emc_lenses_time,
TYPE_INTEGER,
},
{
- GAME_CONTROL_EMC_MAGNIFIER,
+ GAME_PANEL_EMC_MAGNIFIER,
&game.panel.emc_magnifier,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_EMC_MAGNIFIER_TIME,
+ GAME_PANEL_EMC_MAGNIFIER_TIME,
&game.panel.emc_magnifier_time,
TYPE_INTEGER,
},
{
- GAME_CONTROL_BALLOON_SWITCH,
+ GAME_PANEL_BALLOON_SWITCH,
&game.panel.balloon_switch,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DYNABOMB_NUMBER,
+ GAME_PANEL_DYNABOMB_NUMBER,
&game.panel.dynabomb_number,
TYPE_INTEGER,
},
{
- GAME_CONTROL_DYNABOMB_SIZE,
+ GAME_PANEL_DYNABOMB_SIZE,
&game.panel.dynabomb_size,
TYPE_INTEGER,
},
{
- GAME_CONTROL_DYNABOMB_POWER,
+ GAME_PANEL_DYNABOMB_POWER,
&game.panel.dynabomb_power,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_PENGUINS,
+ GAME_PANEL_PENGUINS,
&game.panel.penguins,
TYPE_INTEGER,
},
{
- GAME_CONTROL_SOKOBAN_OBJECTS,
+ GAME_PANEL_SOKOBAN_OBJECTS,
&game.panel.sokoban_objects,
TYPE_INTEGER,
},
{
- GAME_CONTROL_SOKOBAN_FIELDS,
+ GAME_PANEL_SOKOBAN_FIELDS,
&game.panel.sokoban_fields,
TYPE_INTEGER,
},
{
- GAME_CONTROL_ROBOT_WHEEL,
+ GAME_PANEL_ROBOT_WHEEL,
&game.panel.robot_wheel,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_CONVEYOR_BELT_1,
- &game.panel.conveyor_belt_1,
+ GAME_PANEL_CONVEYOR_BELT_1,
+ &game.panel.conveyor_belt[0],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_CONVEYOR_BELT_1_SWITCH,
- &game.panel.conveyor_belt_1_switch,
+ GAME_PANEL_CONVEYOR_BELT_2,
+ &game.panel.conveyor_belt[1],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_CONVEYOR_BELT_2,
- &game.panel.conveyor_belt_2,
+ GAME_PANEL_CONVEYOR_BELT_3,
+ &game.panel.conveyor_belt[2],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_CONVEYOR_BELT_2_SWITCH,
- &game.panel.conveyor_belt_2_switch,
+ GAME_PANEL_CONVEYOR_BELT_4,
+ &game.panel.conveyor_belt[3],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_CONVEYOR_BELT_3,
- &game.panel.conveyor_belt_3,
+ GAME_PANEL_CONVEYOR_BELT_1_SWITCH,
+ &game.panel.conveyor_belt_switch[0],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_CONVEYOR_BELT_3_SWITCH,
- &game.panel.conveyor_belt_3_switch,
+ GAME_PANEL_CONVEYOR_BELT_2_SWITCH,
+ &game.panel.conveyor_belt_switch[1],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_CONVEYOR_BELT_4,
- &game.panel.conveyor_belt_4,
+ GAME_PANEL_CONVEYOR_BELT_3_SWITCH,
+ &game.panel.conveyor_belt_switch[2],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_CONVEYOR_BELT_4_SWITCH,
- &game.panel.conveyor_belt_4_switch,
+ GAME_PANEL_CONVEYOR_BELT_4_SWITCH,
+ &game.panel.conveyor_belt_switch[3],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_MAGIC_WALL,
+ GAME_PANEL_MAGIC_WALL,
&game.panel.magic_wall,
TYPE_ELEMENT,
},
{
- GAME_CONTROL_MAGIC_WALL_TIME,
+ GAME_PANEL_MAGIC_WALL_TIME,
&game.panel.magic_wall_time,
TYPE_INTEGER,
},
{
- GAME_CONTROL_BD_MAGIC_WALL,
- &game.panel.bd_magic_wall,
+ GAME_PANEL_GRAVITY_STATE,
+ &game.panel.gravity_state,
+ TYPE_STRING,
+ },
+ {
+ GAME_PANEL_GRAPHIC_1,
+ &game.panel.graphic[0],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_DC_MAGIC_WALL,
- &game.panel.dc_magic_wall,
+ GAME_PANEL_GRAPHIC_2,
+ &game.panel.graphic[1],
TYPE_ELEMENT,
},
{
- GAME_CONTROL_PLAYER_NAME,
+ 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],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_ELEMENT_2,
+ &game.panel.element[1],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_ELEMENT_3,
+ &game.panel.element[2],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_ELEMENT_4,
+ &game.panel.element[3],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_ELEMENT_5,
+ &game.panel.element[4],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_ELEMENT_6,
+ &game.panel.element[5],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_ELEMENT_7,
+ &game.panel.element[6],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_ELEMENT_8,
+ &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],
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_CE_SCORE_2,
+ &game.panel.ce_score[1],
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_CE_SCORE_3,
+ &game.panel.ce_score[2],
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_CE_SCORE_4,
+ &game.panel.ce_score[3],
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_CE_SCORE_5,
+ &game.panel.ce_score[4],
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_CE_SCORE_6,
+ &game.panel.ce_score[5],
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_CE_SCORE_7,
+ &game.panel.ce_score[6],
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_CE_SCORE_8,
+ &game.panel.ce_score[7],
+ TYPE_INTEGER,
+ },
+ {
+ GAME_PANEL_CE_SCORE_1_ELEMENT,
+ &game.panel.ce_score_element[0],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_CE_SCORE_2_ELEMENT,
+ &game.panel.ce_score_element[1],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_CE_SCORE_3_ELEMENT,
+ &game.panel.ce_score_element[2],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_CE_SCORE_4_ELEMENT,
+ &game.panel.ce_score_element[3],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_CE_SCORE_5_ELEMENT,
+ &game.panel.ce_score_element[4],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_CE_SCORE_6_ELEMENT,
+ &game.panel.ce_score_element[5],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_CE_SCORE_7_ELEMENT,
+ &game.panel.ce_score_element[6],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_CE_SCORE_8_ELEMENT,
+ &game.panel.ce_score_element[7],
+ TYPE_ELEMENT,
+ },
+ {
+ GAME_PANEL_PLAYER_NAME,
&game.panel.player_name,
TYPE_STRING,
},
{
- GAME_CONTROL_LEVEL_NAME,
+ GAME_PANEL_LEVEL_NAME,
&game.panel.level_name,
TYPE_STRING,
},
{
- GAME_CONTROL_LEVEL_AUTHOR,
+ GAME_PANEL_LEVEL_AUTHOR,
&game.panel.level_author,
TYPE_STRING,
},
(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 : \
static void CreateField(int, int, int);
+static void ResetGfxAnimation(int, int);
+
static void SetPlayerWaiting(struct PlayerInfo *, boolean);
static void AdvanceFrameAndPlayerCounters(int);
static void ScrollPlayer(struct PlayerInfo *, int);
static void ScrollScreen(struct PlayerInfo *, int);
-int DigField(struct PlayerInfo *, int, int, int, int, int, int, int);
+static int DigField(struct PlayerInfo *, int, int, int, int, int, int, int);
+static boolean DigFieldByCE(int, int, int);
+static boolean SnapField(struct PlayerInfo *, int, int);
+static boolean DropElement(struct PlayerInfo *);
static void InitBeltMovement(void);
static void CloseAllOpenTimegates(void);
void BuryPlayer(struct PlayerInfo *);
void RemovePlayer(struct PlayerInfo *);
-boolean SnapField(struct PlayerInfo *, int, int);
-boolean DropElement(struct PlayerInfo *);
-
static int getInvisibleActiveFromInvisibleElement(int);
static int getInvisibleFromInvisibleActiveElement(int);
Feld[x][y] = EL_EMC_MAGIC_BALL_SWITCH_ACTIVE;
break;
+ case EL_TRIGGER_PLAYER:
+ case EL_TRIGGER_ELEMENT:
+ case EL_TRIGGER_CE_VALUE:
+ case EL_TRIGGER_CE_SCORE:
+ case EL_SELF:
+ case EL_ANY_ELEMENT:
+ case EL_CURRENT_CE_VALUE:
+ case EL_CURRENT_CE_SCORE:
+ case EL_PREV_CE_1:
+ case EL_PREV_CE_2:
+ case EL_PREV_CE_3:
+ case EL_PREV_CE_4:
+ case EL_PREV_CE_5:
+ case EL_PREV_CE_6:
+ case EL_PREV_CE_7:
+ case EL_PREV_CE_8:
+ case EL_NEXT_CE_1:
+ case EL_NEXT_CE_2:
+ case EL_NEXT_CE_3:
+ case EL_NEXT_CE_4:
+ case EL_NEXT_CE_5:
+ case EL_NEXT_CE_6:
+ case EL_NEXT_CE_7:
+ case EL_NEXT_CE_8:
+ /* reference elements should not be used on the playfield */
+ Feld[x][y] = EL_EMPTY;
+ break;
+
default:
if (IS_CUSTOM_ELEMENT(element))
{
#if 1
+static int get_key_element_from_nr(int key_nr)
+{
+ int key_base_element = (key_nr >= STD_NUM_KEYS ? EL_EMC_KEY_5 - STD_NUM_KEYS :
+ level.game_engine_type == GAME_ENGINE_TYPE_EM ?
+ EL_EM_KEY_1 : EL_KEY_1);
+
+ return key_base_element + key_nr;
+}
+
+static int get_next_dropped_element(struct PlayerInfo *player)
+{
+ return (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);
+}
+
+static int get_inventory_element_from_pos(struct PlayerInfo *player, int pos)
+{
+ /* pos >= 0: get element from bottom of the stack;
+ pos < 0: get element from top of the stack */
+
+ if (pos < 0)
+ {
+ int min_inventory_size = -pos;
+ int inventory_pos = player->inventory_size - min_inventory_size;
+ int min_dynabombs_left = min_inventory_size - player->inventory_size;
+
+ return (player->inventory_size >= min_inventory_size ?
+ player->inventory_element[inventory_pos] :
+ player->inventory_infinite_element != EL_UNDEFINED ?
+ player->inventory_infinite_element :
+ player->dynabombs_left >= min_dynabombs_left ?
+ EL_DYNABOMB_PLAYER_1 + player->index_nr :
+ EL_UNDEFINED);
+ }
+ else
+ {
+ int min_dynabombs_left = pos + 1;
+ int min_inventory_size = pos + 1 - player->dynabombs_left;
+ int inventory_pos = pos - player->dynabombs_left;
+
+ return (player->inventory_infinite_element != EL_UNDEFINED ?
+ player->inventory_infinite_element :
+ player->dynabombs_left >= min_dynabombs_left ?
+ EL_DYNABOMB_PLAYER_1 + player->index_nr :
+ player->inventory_size >= min_inventory_size ?
+ player->inventory_element[inventory_pos] :
+ EL_UNDEFINED);
+ }
+}
+
+static int compareGamePanelOrderInfo(const void *object1, const void *object2)
+{
+ const struct GamePanelOrderInfo *gpo1 = (struct GamePanelOrderInfo *)object1;
+ const struct GamePanelOrderInfo *gpo2 = (struct GamePanelOrderInfo *)object2;
+ int compare_result;
+
+ if (gpo1->sort_priority != gpo2->sort_priority)
+ compare_result = gpo1->sort_priority - gpo2->sort_priority;
+ else
+ compare_result = gpo1->nr - gpo2->nr;
+
+ return compare_result;
+}
+
void InitGameControlValues()
{
int i;
- for (i = 0; i < NUM_GAME_CONTROLS; i++)
- game_control_value[i] = last_game_control_value[i] = -1;
-
- for (i = 0; game_controls[i].nr != -1; i++)
+ for (i = 0; game_panel_controls[i].nr != -1; i++)
{
- int nr = game_controls[i].nr;
- int type = game_controls[i].type;
- struct TextPosInfo *pos = game_controls[i].pos;
+ struct GamePanelControlInfo *gpc = &game_panel_controls[i];
+ struct GamePanelOrderInfo *gpo = &game_panel_order[i];
+ struct TextPosInfo *pos = gpc->pos;
+ int nr = gpc->nr;
+ int type = gpc->type;
- game_control_value[nr] = last_game_control_value[nr] = -1;
+ if (nr != i)
+ {
+ Error(ERR_INFO, "'game_panel_controls' structure corrupted at %d", i);
+ Error(ERR_EXIT, "this should not happen -- please debug");
+ }
+
+ /* force update of game controls after initialization */
+ gpc->value = gpc->last_value = -1;
+ gpc->frame = gpc->last_frame = -1;
+ gpc->gfx_frame = -1;
/* determine panel value width for later calculation of alignment */
if (type == TYPE_INTEGER || type == TYPE_STRING)
- pos->width = pos->chars * getFontWidth(pos->font);
+ {
+ pos->width = pos->size * getFontWidth(pos->font);
+ pos->height = getFontHeight(pos->font);
+ }
else if (type == TYPE_ELEMENT)
- pos->width = MINI_TILESIZE;
+ {
+ pos->width = pos->size;
+ pos->height = pos->size;
+ }
+
+ /* fill structure for game panel draw order */
+ gpo->nr = gpc->nr;
+ gpo->sort_priority = pos->sort_priority;
}
+
+ /* sort game panel controls according to sort_priority and control number */
+ qsort(game_panel_order, NUM_GAME_PANEL_CONTROLS,
+ sizeof(struct GamePanelOrderInfo), compareGamePanelOrderInfo);
}
-void UpdateGameControlValues()
+void UpdatePlayfieldElementCount()
{
- int i, j;
+ boolean use_element_count = FALSE;
+ int i, j, x, y;
- game_control_value[GAME_CONTROL_LEVEL_NUMBER] = level_nr;
- game_control_value[GAME_CONTROL_GEMS] = local_player->gems_still_needed;
+ /* 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;
- game_control_value[GAME_CONTROL_INVENTORY] = 0;
+ 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 = (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 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 = gems;
+
+ game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value = 0;
for (i = 0; i < MAX_NUM_KEYS; i++)
- game_control_value[GAME_CONTROL_KEY_1 + i] = 0;
- game_control_value[GAME_CONTROL_KEY_WHITE] = 0;
- game_control_value[GAME_CONTROL_KEY_WHITE_COUNT] = 0;
+ game_panel_controls[GAME_PANEL_KEY_1 + i].value = EL_EMPTY;
+ game_panel_controls[GAME_PANEL_KEY_WHITE].value = EL_EMPTY;
+ game_panel_controls[GAME_PANEL_KEY_WHITE_COUNT].value = 0;
if (game.centered_player_nr == -1)
{
for (i = 0; i < MAX_PLAYERS; i++)
{
- for (j = 0; j < MAX_NUM_KEYS; j++)
- if (stored_player[i].key[j])
- game_control_value[GAME_CONTROL_KEY_1 + j] = 1;
+ for (k = 0; k < MAX_NUM_KEYS; 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_control_value[GAME_CONTROL_INVENTORY] +=
- 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_control_value[GAME_CONTROL_KEY_WHITE] = 1;
+ game_panel_controls[GAME_PANEL_KEY_WHITE].value =
+ EL_DC_KEY_WHITE;
- game_control_value[GAME_CONTROL_KEY_WHITE_COUNT] +=
+ game_panel_controls[GAME_PANEL_KEY_WHITE_COUNT].value +=
stored_player[i].num_white_keys;
}
}
{
int player_nr = game.centered_player_nr;
- for (i = 0; i < MAX_NUM_KEYS; i++)
- if (stored_player[player_nr].key[i])
- game_control_value[GAME_CONTROL_KEY_1 + i] = 1;
+ for (k = 0; k < MAX_NUM_KEYS; 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_control_value[GAME_CONTROL_INVENTORY] +=
- 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_control_value[GAME_CONTROL_KEY_WHITE] = 1;
+ game_panel_controls[GAME_PANEL_KEY_WHITE].value = EL_DC_KEY_WHITE;
- game_control_value[GAME_CONTROL_KEY_WHITE_COUNT] +=
+ game_panel_controls[GAME_PANEL_KEY_WHITE_COUNT].value +=
stored_player[player_nr].num_white_keys;
}
- game_control_value[GAME_CONTROL_SCORE] = (local_player->LevelSolved ?
- local_player->score_final :
- local_player->score);
+ for (i = 0; i < NUM_PANEL_INVENTORY; i++)
+ {
+ game_panel_controls[GAME_PANEL_INVENTORY_FIRST_1 + i].value =
+ get_inventory_element_from_pos(local_player, i);
+ game_panel_controls[GAME_PANEL_INVENTORY_LAST_1 + i].value =
+ get_inventory_element_from_pos(local_player, -i - 1);
+ }
- game_control_value[GAME_CONTROL_TIME] = (level.time == 0 ?
- TimePlayed :
- TimeLeft);
+ game_panel_controls[GAME_PANEL_SCORE].value = score;
+ game_panel_controls[GAME_PANEL_HIGHSCORE].value = highscore[0].Score;
- game_control_value[GAME_CONTROL_TIME_HH] = TapeTime / 3600;
- game_control_value[GAME_CONTROL_TIME_MM] = (TapeTime / 60) % 60;
- game_control_value[GAME_CONTROL_TIME_SS] = TapeTime % 60;
+ game_panel_controls[GAME_PANEL_TIME].value = time;
- for (i = 0; i < 8; i++)
- game_control_value[GAME_CONTROL_DROP_NEXT_1 + i] = EL_UNDEFINED;
+ game_panel_controls[GAME_PANEL_TIME_HH].value = time / 3600;
+ game_panel_controls[GAME_PANEL_TIME_MM].value = (time / 60) % 60;
+ game_panel_controls[GAME_PANEL_TIME_SS].value = time % 60;
- game_control_value[GAME_CONTROL_SHIELD_NORMAL] =
+ game_panel_controls[GAME_PANEL_SHIELD_NORMAL].value =
(local_player->shield_normal_time_left > 0 ? EL_SHIELD_NORMAL_ACTIVE :
EL_EMPTY);
- game_control_value[GAME_CONTROL_SHIELD_NORMAL_TIME] =
+ game_panel_controls[GAME_PANEL_SHIELD_NORMAL_TIME].value =
local_player->shield_normal_time_left;
- game_control_value[GAME_CONTROL_SHIELD_DEADLY] =
+ game_panel_controls[GAME_PANEL_SHIELD_DEADLY].value =
(local_player->shield_deadly_time_left > 0 ? EL_SHIELD_DEADLY_ACTIVE :
EL_EMPTY);
- game_control_value[GAME_CONTROL_SHIELD_DEADLY_TIME] =
+ game_panel_controls[GAME_PANEL_SHIELD_DEADLY_TIME].value =
local_player->shield_deadly_time_left;
- if (local_player->gems_still_needed > 0 ||
- local_player->sokobanfields_still_needed > 0 ||
- local_player->lights_still_needed > 0)
- {
- game_control_value[GAME_CONTROL_EXIT] = EL_EXIT_CLOSED;
- game_control_value[GAME_CONTROL_EM_EXIT] = EL_EM_EXIT_CLOSED;
- game_control_value[GAME_CONTROL_SP_EXIT] = EL_SP_EXIT_CLOSED;
- game_control_value[GAME_CONTROL_STEEL_EXIT] = EL_STEEL_EXIT_CLOSED;
- game_control_value[GAME_CONTROL_EM_STEEL_EXIT] = EL_EM_STEEL_EXIT_CLOSED;
- }
- else
- {
- game_control_value[GAME_CONTROL_EXIT] = EL_EXIT_OPEN;
- game_control_value[GAME_CONTROL_EM_EXIT] = EL_EM_EXIT_OPEN;
- game_control_value[GAME_CONTROL_SP_EXIT] = EL_SP_EXIT_OPEN;
- game_control_value[GAME_CONTROL_STEEL_EXIT] = EL_STEEL_EXIT_OPEN;
- game_control_value[GAME_CONTROL_EM_STEEL_EXIT] = EL_EM_STEEL_EXIT_OPEN;
- }
+ game_panel_controls[GAME_PANEL_EXIT].value =
+ (exit_closed ? EL_EXIT_CLOSED : EL_EXIT_OPEN);
- game_control_value[GAME_CONTROL_EMC_MAGIC_BALL] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_EMC_MAGIC_BALL_SWITCH] = EL_UNDEFINED;
+ game_panel_controls[GAME_PANEL_EMC_MAGIC_BALL].value =
+ (game.ball_state ? EL_EMC_MAGIC_BALL_ACTIVE : EL_EMC_MAGIC_BALL);
+ game_panel_controls[GAME_PANEL_EMC_MAGIC_BALL_SWITCH].value =
+ (game.ball_state ? EL_EMC_MAGIC_BALL_SWITCH_ACTIVE :
+ EL_EMC_MAGIC_BALL_SWITCH);
- game_control_value[GAME_CONTROL_LIGHT_SWITCH] =
+ game_panel_controls[GAME_PANEL_LIGHT_SWITCH].value =
(game.light_time_left > 0 ? EL_LIGHT_SWITCH_ACTIVE : EL_LIGHT_SWITCH);
- game_control_value[GAME_CONTROL_LIGHT_SWITCH_TIME] = game.light_time_left;
+ game_panel_controls[GAME_PANEL_LIGHT_SWITCH_TIME].value =
+ game.light_time_left;
- game_control_value[GAME_CONTROL_TIMEGATE_SWITCH] =
+ game_panel_controls[GAME_PANEL_TIMEGATE_SWITCH].value =
(game.timegate_time_left > 0 ? EL_TIMEGATE_OPEN : EL_TIMEGATE_CLOSED);
- game_control_value[GAME_CONTROL_TIMEGATE_SWITCH_TIME] =
+ game_panel_controls[GAME_PANEL_TIMEGATE_SWITCH_TIME].value =
game.timegate_time_left;
- game_control_value[GAME_CONTROL_SWITCHGATE_SWITCH] = EL_UNDEFINED;
+ game_panel_controls[GAME_PANEL_SWITCHGATE_SWITCH].value =
+ EL_SWITCHGATE_SWITCH_UP + game.switchgate_pos;
- game_control_value[GAME_CONTROL_EMC_LENSES] =
+ game_panel_controls[GAME_PANEL_EMC_LENSES].value =
(game.lenses_time_left > 0 ? EL_EMC_LENSES : EL_EMPTY);
- game_control_value[GAME_CONTROL_EMC_LENSES_TIME] = game.lenses_time_left;
+ game_panel_controls[GAME_PANEL_EMC_LENSES_TIME].value =
+ game.lenses_time_left;
- game_control_value[GAME_CONTROL_EMC_MAGNIFIER] =
+ game_panel_controls[GAME_PANEL_EMC_MAGNIFIER].value =
(game.magnify_time_left > 0 ? EL_EMC_MAGNIFIER : EL_EMPTY);
- game_control_value[GAME_CONTROL_EMC_MAGNIFIER_TIME] = game.magnify_time_left;
+ game_panel_controls[GAME_PANEL_EMC_MAGNIFIER_TIME].value =
+ game.magnify_time_left;
- game_control_value[GAME_CONTROL_BALLOON_SWITCH] =
+ game_panel_controls[GAME_PANEL_BALLOON_SWITCH].value =
(game.wind_direction == MV_LEFT ? EL_BALLOON_SWITCH_LEFT :
game.wind_direction == MV_RIGHT ? EL_BALLOON_SWITCH_RIGHT :
game.wind_direction == MV_UP ? EL_BALLOON_SWITCH_UP :
game.wind_direction == MV_DOWN ? EL_BALLOON_SWITCH_DOWN :
EL_BALLOON_SWITCH_NONE);
- game_control_value[GAME_CONTROL_DYNABOMB_NUMBER] =
+ game_panel_controls[GAME_PANEL_DYNABOMB_NUMBER].value =
local_player->dynabomb_count;
- game_control_value[GAME_CONTROL_DYNABOMB_SIZE] =
+ game_panel_controls[GAME_PANEL_DYNABOMB_SIZE].value =
local_player->dynabomb_size;
- game_control_value[GAME_CONTROL_DYNABOMB_POWER] =
+ game_panel_controls[GAME_PANEL_DYNABOMB_POWER].value =
(local_player->dynabomb_xl ? EL_DYNABOMB_INCREASE_POWER : EL_EMPTY);
- game_control_value[GAME_CONTROL_PENGUINS] =
+ game_panel_controls[GAME_PANEL_PENGUINS].value =
local_player->friends_still_needed;
- game_control_value[GAME_CONTROL_SOKOBAN_OBJECTS] =
+ game_panel_controls[GAME_PANEL_SOKOBAN_OBJECTS].value =
local_player->sokobanfields_still_needed;
- game_control_value[GAME_CONTROL_SOKOBAN_FIELDS] =
+ game_panel_controls[GAME_PANEL_SOKOBAN_FIELDS].value =
local_player->sokobanfields_still_needed;
- game_control_value[GAME_CONTROL_ROBOT_WHEEL] = EL_UNDEFINED;
+ game_panel_controls[GAME_PANEL_ROBOT_WHEEL].value =
+ (game.robot_wheel_active ? EL_ROBOT_WHEEL_ACTIVE : EL_ROBOT_WHEEL);
- game_control_value[GAME_CONTROL_CONVEYOR_BELT_1] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_CONVEYOR_BELT_1_SWITCH] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_CONVEYOR_BELT_2] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_CONVEYOR_BELT_2_SWITCH] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_CONVEYOR_BELT_3] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_CONVEYOR_BELT_3_SWITCH] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_CONVEYOR_BELT_4] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_CONVEYOR_BELT_4_SWITCH] = EL_UNDEFINED;
+ for (i = 0; i < NUM_BELTS; i++)
+ {
+ game_panel_controls[GAME_PANEL_CONVEYOR_BELT_1 + i].value =
+ (game.belt_dir[i] != MV_NONE ? EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE :
+ EL_CONVEYOR_BELT_1_MIDDLE) + i;
+ game_panel_controls[GAME_PANEL_CONVEYOR_BELT_1_SWITCH + i].value =
+ getBeltSwitchElementFromBeltNrAndBeltDir(i, game.belt_dir[i]);
+ }
- game_control_value[GAME_CONTROL_MAGIC_WALL] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_MAGIC_WALL_TIME] =
+ game_panel_controls[GAME_PANEL_MAGIC_WALL].value =
+ (game.magic_wall_active ? EL_MAGIC_WALL_ACTIVE : EL_MAGIC_WALL);
+ game_panel_controls[GAME_PANEL_MAGIC_WALL_TIME].value =
game.magic_wall_time_left;
- game_control_value[GAME_CONTROL_BD_MAGIC_WALL] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_DC_MAGIC_WALL] = EL_UNDEFINED;
- game_control_value[GAME_CONTROL_PLAYER_NAME] = 0;
- game_control_value[GAME_CONTROL_LEVEL_NAME] = 0;
- game_control_value[GAME_CONTROL_LEVEL_AUTHOR] = 0;
+#if USE_PLAYER_GRAVITY
+ game_panel_controls[GAME_PANEL_GRAVITY_STATE].value =
+ local_player->gravity;
+#else
+ 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) ?
+ element_info[game.panel.ce_score[i].id].collect_score : 0);
+
+ for (i = 0; i < NUM_PANEL_CE_SCORE; i++)
+ game_panel_controls[GAME_PANEL_CE_SCORE_1_ELEMENT + i].value =
+ (IS_CUSTOM_ELEMENT(game.panel.ce_score_element[i].id) ?
+ element_info[game.panel.ce_score_element[i].id].collect_score :
+ EL_UNDEFINED);
+
+ game_panel_controls[GAME_PANEL_PLAYER_NAME].value = 0;
+ 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];
+
+ if (gpc->type == TYPE_ELEMENT)
+ {
+ int last_anim_random_frame = gfx.anim_random_frame;
+ int element = gpc->value;
+ int graphic = el2panelimg(element);
+
+ if (gpc->value != gpc->last_value)
+ {
+ gpc->gfx_frame = 0;
+ gpc->gfx_random = INIT_GFX_RANDOM();
+ }
+ else
+ {
+ gpc->gfx_frame++;
+
+ if (ANIM_MODE(graphic) == ANIM_RANDOM &&
+ IS_NEXT_FRAME(gpc->gfx_frame, graphic))
+ gpc->gfx_random = INIT_GFX_RANDOM();
+ }
+
+ if (ANIM_MODE(graphic) == ANIM_RANDOM)
+ gfx.anim_random_frame = gpc->gfx_random;
+
+ if (ANIM_MODE(graphic) == ANIM_CE_SCORE)
+ gpc->gfx_frame = element_info[element].collect_score;
+
+ gpc->frame = getGraphicAnimationFrame(el2panelimg(gpc->value),
+ gpc->gfx_frame);
+
+ if (ANIM_MODE(graphic) == ANIM_RANDOM)
+ gfx.anim_random_frame = last_anim_random_frame;
+ }
+ }
}
void DisplayGameControlValues()
{
+ boolean redraw_panel = FALSE;
int i;
- for (i = 0; game_controls[i].nr != -1; i++)
+ for (i = 0; game_panel_controls[i].nr != -1; i++)
{
- int nr = game_controls[i].nr;
- int type = game_controls[i].type;
- struct TextPosInfo *pos = game_controls[i].pos;
- int value = game_control_value[nr];
- int last_value = last_game_control_value[nr];
- int chars = pos->chars;
- int font = pos->font;
+ struct GamePanelControlInfo *gpc = &game_panel_controls[i];
- if (value == last_value)
+ if (PANEL_DEACTIVATED(gpc->pos))
continue;
- last_game_control_value[nr] = value;
+ if (gpc->value == gpc->last_value &&
+ gpc->frame == gpc->last_frame)
+ continue;
+
+ redraw_panel = TRUE;
+ }
+
+ if (!redraw_panel)
+ return;
+
+ /* copy default game door content to main double buffer */
+ BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
+ DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY);
+
+ /* redraw game control buttons */
+#if 1
+ RedrawGameButtons();
+#else
+ UnmapGameButtons();
+ MapGameButtons();
+#endif
+
+ game_status = GAME_MODE_PSEUDO_PANEL;
+#if 1
+ for (i = 0; i < NUM_GAME_PANEL_CONTROLS; i++)
+#else
+ for (i = 0; game_panel_controls[i].nr != -1; i++)
+#endif
+ {
+#if 1
+ int nr = game_panel_order[i].nr;
+ struct GamePanelControlInfo *gpc = &game_panel_controls[nr];
+#else
+ struct GamePanelControlInfo *gpc = &game_panel_controls[i];
+ int nr = gpc->nr;
+#endif
+ struct TextPosInfo *pos = gpc->pos;
+ int type = gpc->type;
+ int value = gpc->value;
+ int frame = gpc->frame;
#if 0
- printf("::: value %d changed from %d to %d\n", nr, last_value, value);
+ int last_value = gpc->last_value;
+ int last_frame = gpc->last_frame;
#endif
+ int size = pos->size;
+ int font = pos->font;
+ boolean draw_masked = pos->draw_masked;
+ int mask_mode = (draw_masked ? BLIT_MASKED : BLIT_OPAQUE);
if (PANEL_DEACTIVATED(pos))
continue;
+#if 0
+ if (value == last_value && frame == last_frame)
+ continue;
+#endif
+
+ gpc->last_value = value;
+ gpc->last_frame = frame;
+
+#if 0
+ printf("::: value %d changed from %d to %d\n", nr, last_value, value);
+#endif
+
if (type == TYPE_INTEGER)
{
- if (nr == GAME_CONTROL_LEVEL_NUMBER || nr == GAME_CONTROL_TIME)
+ if (nr == GAME_PANEL_LEVEL_NUMBER ||
+ nr == GAME_PANEL_TIME)
{
- boolean use_dynamic_chars = (pos->chars == -1 ? TRUE : FALSE);
+ boolean use_dynamic_size = (size == -1 ? TRUE : FALSE);
- if (use_dynamic_chars) /* use dynamic number of chars */
+ if (use_dynamic_size) /* use dynamic number of digits */
{
- int value_change = (nr == GAME_CONTROL_LEVEL_NUMBER ? 100 : 1000);
- int chars1 = (nr == GAME_CONTROL_LEVEL_NUMBER ? 2 : 3);
- int chars2 = chars1 + 1;
+ int value_change = (nr == GAME_PANEL_LEVEL_NUMBER ? 100 : 1000);
+ int size1 = (nr == GAME_PANEL_LEVEL_NUMBER ? 2 : 3);
+ int size2 = size1 + 1;
int font1 = pos->font;
int font2 = pos->font_alt;
- chars = (value < value_change ? chars1 : chars2);
- font = (value < value_change ? font1 : font2);
+ size = (value < value_change ? size1 : size2);
+ font = (value < value_change ? font1 : font2);
- /* clear background if value just changed its size (dynamic chars) */
+#if 0
+ /* clear background if value just changed its size (dynamic digits) */
if ((last_value < value_change) != (value < value_change))
{
- int width1 = chars1 * getFontWidth(font1);
- int width2 = chars2 * getFontWidth(font2);
+ int width1 = size1 * getFontWidth(font1);
+ int width2 = size2 * getFontWidth(font2);
int max_width = MAX(width1, width2);
int max_height = MAX(getFontHeight(font1), getFontHeight(font2));
ClearRectangleOnBackground(drawto, PANEL_XPOS(pos), PANEL_YPOS(pos),
max_width, max_height);
}
+#endif
}
-
- pos->width = chars * getFontWidth(font);
}
- DrawText(PANEL_XPOS(pos), PANEL_YPOS(pos), int2str(value, chars), font);
+#if 1
+ /* correct text size if "digits" is zero or less */
+ if (size <= 0)
+ size = strlen(int2str(value, size));
+
+ /* dynamically correct text alignment */
+ pos->width = size * getFontWidth(font);
+#endif
+
+ DrawTextExt(drawto, PANEL_XPOS(pos), PANEL_YPOS(pos),
+ int2str(value, size), font, mask_mode);
}
else if (type == TYPE_ELEMENT)
{
- if (nr >= GAME_CONTROL_KEY_1 && nr <= GAME_CONTROL_KEY_8)
+ int element, graphic;
+ Bitmap *src_bitmap;
+ int src_x, src_y;
+ int width, height;
+ int dst_x = PANEL_XPOS(pos);
+ int dst_y = PANEL_YPOS(pos);
+
+#if 1
+ if (value != EL_UNDEFINED && value != EL_EMPTY)
{
- int key_nr = nr - GAME_CONTROL_KEY_1;
- int src_x = DOOR_GFX_PAGEX5 + 18 + (key_nr % STD_NUM_KEYS) * MINI_TILEX;
- int src_y = DOOR_GFX_PAGEY1 + 123;
- int dst_x = PANEL_XPOS(pos);
- int dst_y = PANEL_YPOS(pos);
- int element = (key_nr >= STD_NUM_KEYS ? EL_EMC_KEY_5 - STD_NUM_KEYS :
- level.game_engine_type == GAME_ENGINE_TYPE_EM ?
- EL_EM_KEY_1 : EL_KEY_1) + key_nr;
- int graphic = el2edimg(element);
+ 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
- if (value)
- DrawMiniGraphicExt(drawto, dst_x, dst_y, graphic);
+ getSizedGraphicSource(graphic, frame, size, &src_bitmap,
+ &src_x, &src_y);
+
+ width = graphic_info[graphic].width * size / TILESIZE;
+ height = graphic_info[graphic].height * size / TILESIZE;
+
+ if (draw_masked)
+ {
+ SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc,
+ dst_x - src_x, dst_y - src_y);
+ BlitBitmapMasked(src_bitmap, drawto, src_x, src_y, width, height,
+ dst_x, dst_y);
+ }
else
- BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, src_x, src_y,
- MINI_TILEX, MINI_TILEY, dst_x, dst_y);
+ {
+ BlitBitmap(src_bitmap, drawto, src_x, src_y, width, height,
+ dst_x, dst_y);
+ }
+ }
+#else
+ if (value == EL_UNDEFINED || value == EL_EMPTY)
+ {
+ element = (last_value == EL_UNDEFINED ? EL_EMPTY : last_value);
+ graphic = el2panelimg(element);
+
+ src_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
+ src_x = DOOR_GFX_PAGEX5 + ALIGNED_TEXT_XPOS(pos);
+ src_y = DOOR_GFX_PAGEY1 + ALIGNED_TEXT_YPOS(pos);
}
- else if (value != EL_UNDEFINED)
+ else
{
- int graphic = el2edimg(value);
- int dst_x = PANEL_XPOS(pos);
- int dst_y = PANEL_YPOS(pos);
+ element = value;
+ graphic = el2panelimg(value);
- DrawMiniGraphicExt(drawto, dst_x, dst_y, graphic);
+ getSizedGraphicSource(graphic, frame, size, &src_bitmap, &src_x,&src_y);
}
+
+ width = graphic_info[graphic].width * size / TILESIZE;
+ height = graphic_info[graphic].height * size / TILESIZE;
+
+ BlitBitmap(src_bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y);
+#endif
}
else if (type == TYPE_STRING)
{
- char *s = (nr == GAME_CONTROL_PLAYER_NAME ? setup.player_name :
- nr == GAME_CONTROL_LEVEL_NAME ? level.name :
- nr == GAME_CONTROL_LEVEL_AUTHOR ? level.author : NULL);
+ boolean active = (value != 0);
+ char *state_normal = "off";
+ char *state_active = "on";
+ char *state = (active ? state_active : state_normal);
+ char *s = (nr == GAME_PANEL_GRAVITY_STATE ? state :
+ nr == GAME_PANEL_PLAYER_NAME ? setup.player_name :
+ nr == GAME_PANEL_LEVEL_NAME ? level.name :
+ nr == GAME_PANEL_LEVEL_AUTHOR ? level.author : NULL);
+
+ if (nr == GAME_PANEL_GRAVITY_STATE)
+ {
+ int font1 = pos->font; /* (used for normal state) */
+ int font2 = pos->font_alt; /* (used for active state) */
+#if 0
+ int size1 = strlen(state_normal);
+ int size2 = strlen(state_active);
+ int width1 = size1 * getFontWidth(font1);
+ int width2 = size2 * getFontWidth(font2);
+ int max_width = MAX(width1, width2);
+ int max_height = MAX(getFontHeight(font1), getFontHeight(font2));
+
+ pos->width = max_width;
+
+ /* clear background for values that may have changed its size */
+ ClearRectangleOnBackground(drawto, PANEL_XPOS(pos), PANEL_YPOS(pos),
+ max_width, max_height);
+#endif
+
+ font = (active ? font2 : font1);
+ }
if (s != NULL)
{
- char *s_cut = getStringCopyN(s, pos->chars);
+ char *s_cut;
+
+#if 1
+ if (size <= 0)
+ {
+ /* don't truncate output if "chars" is zero or less */
+ size = strlen(s);
+
+ /* dynamically correct text alignment */
+ pos->width = size * getFontWidth(font);
+ }
+#endif
- DrawText(PANEL_XPOS(pos), PANEL_YPOS(pos), s_cut, pos->font);
+ s_cut = getStringCopyN(s, size);
+
+ DrawTextExt(drawto, PANEL_XPOS(pos), PANEL_YPOS(pos),
+ s_cut, font, mask_mode);
free(s_cut);
}
redraw_mask |= REDRAW_DOOR_1;
}
+
+ game_status = GAME_MODE_PLAYING;
+}
+
+void UpdateAndDisplayGameControlValues()
+{
+ if (tape.warp_forward)
+ return;
+
+ UpdateGameControlValues();
+ DisplayGameControlValues();
}
void DrawGameValue_Emeralds(int value)
int font_nr = FONT_TEXT_2;
#endif
int font_width = getFontWidth(font_nr);
- int chars = pos->chars;
+ int chars = pos->size;
#if 1
return; /* !!! USE NEW STUFF !!! */
void DrawGameValue_Dynamite(int value)
{
- struct TextPosInfo *pos = &game.panel.inventory;
+ struct TextPosInfo *pos = &game.panel.inventory_count;
#if 1
int font_nr = pos->font;
#else
int font_nr = FONT_TEXT_2;
#endif
int font_width = getFontWidth(font_nr);
- int chars = pos->chars;
+ int chars = pos->size;
#if 1
return; /* !!! USE NEW STUFF !!! */
int font_nr = FONT_TEXT_2;
#endif
int font_width = getFontWidth(font_nr);
- int chars = pos->chars;
+ int chars = pos->size;
#if 1
return; /* !!! USE NEW STUFF !!! */
static int last_value = -1;
int chars1 = 3;
int chars2 = 4;
- int chars = pos->chars;
+ int chars = pos->size;
#if 1
int font1_nr = pos->font;
int font2_nr = pos->font_alt;
struct TextPosInfo *pos = &game.panel.level_number;
int chars1 = 2;
int chars2 = 3;
- int chars = pos->chars;
+ int chars = pos->size;
#if 1
int font1_nr = pos->font;
int font2_nr = pos->font_alt;
int font_nr = FONT_TEXT_2;
int xpos = (3 * 14 - 3 * getFontWidth(font_nr)) / 2;
- if (PANEL_DEACTIVATED(game.panel.inventory))
+ if (PANEL_DEACTIVATED(game.panel.inventory_count))
return;
DrawText(DX_DYNAMITE + xpos, DY_DYNAMITE, int2str(value, 3), font_nr);
DrawGameValue_Keys(key);
}
-void DrawGameDoorValues()
+void UpdateGameDoorValues()
{
UpdateGameControlValues();
+}
+
+void DrawGameDoorValues()
+{
DisplayGameControlValues();
}
SET_PROPERTY(ch_delay->element, EP_CAN_CHANGE_OR_HAS_ACTION, TRUE);
}
- /* ---------- initialize internal run-time variables ------------- */
+ /* ---------- initialize internal run-time variables --------------------- */
for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++)
{
}
}
+#if 1
+ /* ---------- initialize reference elements in change conditions --------- */
+
+ for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++)
+ {
+ int element = EL_CUSTOM_START + i;
+ struct ElementInfo *ei = &element_info[element];
+
+ for (j = 0; j < ei->num_change_pages; j++)
+ {
+ int trigger_element = ei->change_page[j].initial_trigger_element;
+
+ if (trigger_element >= EL_PREV_CE_8 &&
+ trigger_element <= EL_NEXT_CE_8)
+ trigger_element = RESOLVED_REFERENCE_ELEMENT(element, trigger_element);
+
+ ei->change_page[j].trigger_element = trigger_element;
+ }
+ }
+#endif
+
/* ---------- initialize run-time trigger player and element ------------- */
for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++)
{
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;
recursion_loop_depth = 0;
recursion_loop_detected = FALSE;
recursion_loop_element = EL_UNDEFINED;
+
+ /* ---------- initialize graphics engine ---------------------------------- */
+ game.scroll_delay_value =
+ (game.forced_scroll_delay_value != -1 ? game.forced_scroll_delay_value :
+ setup.scroll_delay ? setup.scroll_delay_value : 0);
+ game.scroll_delay_value =
+ MIN(MAX(MIN_SCROLL_DELAY, game.scroll_delay_value), MAX_SCROLL_DELAY);
}
int get_num_special_action(int element, int action_first, int action_last)
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;
AllPlayersGone = FALSE;
game.yamyam_content_nr = 0;
+ game.robot_wheel_active = FALSE;
game.magic_wall_active = FALSE;
game.magic_wall_time_left = 0;
game.light_time_left = 0;
GfxElement[x][y] = EL_UNDEFINED;
GfxAction[x][y] = ACTION_DEFAULT;
GfxDir[x][y] = MV_NONE;
+ GfxRedraw[x][y] = GFX_REDRAW_NONE;
}
SCAN_PLAYFIELD(x, y)
emulate_sp = FALSE;
InitField(x, y, TRUE);
+
+ ResetGfxAnimation(x, y);
}
InitBeltMovement();
content = element_info[element].change_page[i].target_element;
is_player = ELEM_IS_PLAYER(content);
- if (is_player && (found_rating < 3 || element < found_element))
+ if (is_player && (found_rating < 3 ||
+ (found_rating == 3 && element < found_element)))
{
start_x = x;
start_y = y;
content = element_info[element].content.e[xx][yy];
is_player = ELEM_IS_PLAYER(content);
- if (is_player && (found_rating < 2 || element < found_element))
+ if (is_player && (found_rating < 2 ||
+ (found_rating == 2 && element < found_element)))
{
start_x = x + xx - 1;
start_y = y + yy - 1;
is_player = ELEM_IS_PLAYER(content);
- if (is_player && (found_rating < 1 || element < found_element))
+ if (is_player && (found_rating < 1 ||
+ (found_rating == 1 && element < found_element)))
{
start_x = x + xx - 1;
start_y = y + yy - 1;
local_player->jy - MIDPOSY);
}
+#if 0
+ /* do not use PLAYING mask for fading out from main screen */
+ game_status = GAME_MODE_MAIN;
+#endif
+
StopAnimation();
if (!game.restart_level)
if (level_editor_test_game)
FadeSkipNextFadeIn();
else
- FadeSetStartItem();
+ FadeSetEnterScreen();
#else
if (level_editor_test_game)
fading = fading_none;
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)
{
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()
score = score_final;
#if 1
- game_control_value[GAME_CONTROL_TIME] = time;
- game_control_value[GAME_CONTROL_SCORE] = score;
+ 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;
DisplayGameControlValues();
#else
score += time_count_steps * level.score[SC_TIME_BONUS];
#if 1
- game_control_value[GAME_CONTROL_TIME] = time;
- game_control_value[GAME_CONTROL_SCORE] = score;
+ 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;
DisplayGameControlValues();
#else
GfxElement[x][y] = EL_UNDEFINED;
GfxAction[x][y] = ACTION_DEFAULT;
GfxDir[x][y] = MV_NONE;
+ GfxRedraw[x][y] = GFX_REDRAW_NONE;
}
void RemoveMovingField(int x, int y)
Store[oldx][oldy] = Store2[oldx][oldy] = 0;
- DrawLevelField(oldx, oldy);
+ TEST_DrawLevelField(oldx, oldy);
return;
}
if (next_element != EL_UNDEFINED)
Feld[oldx][oldy] = next_element;
- DrawLevelField(oldx, oldy);
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(oldx, oldy);
+ TEST_DrawLevelField(newx, newy);
}
void DrawDynamite(int x, int y)
if (quick_relocation)
{
- int offset = (setup.scroll_delay ? 3 : 0);
+ int offset = game.scroll_delay_value;
if (!IN_VIS_FIELD(SCREENX(x), SCREENY(y)) || center_screen)
{
InitField_WithBug2(x, y, FALSE);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
TestIfElementTouchesCustomElement(x, y);
if (GFX_CRUMBLED(element))
- DrawLevelFieldCrumbledSandNeighbours(x, y);
+ TEST_DrawLevelFieldCrumbledSandNeighbours(x, y);
if (IS_PLAYER(x, y) && !PLAYERINFO(x, y)->present)
StorePlayer[x][y] = 0;
int frame = getGraphicAnimationFrame(graphic, GfxFrame[x][y]);
if (phase == delay)
- DrawLevelFieldCrumbledSand(x, y);
+ TEST_DrawLevelFieldCrumbledSand(x, y);
if (IS_WALKABLE_OVER(Back[x][y]) && Back[x][y] != EL_EMPTY)
{
for (j = 0; j < NUM_BELT_PARTS; j++)
{
int element = belt_base_active_element[belt_nr] + j;
- int graphic = el2img(element);
+ int graphic_1 = el2img(element);
+ int graphic_2 = el2panelimg(element);
if (game.belt_dir[i] == MV_LEFT)
- graphic_info[graphic].anim_mode &= ~ANIM_REVERSE;
+ {
+ graphic_info[graphic_1].anim_mode &= ~ANIM_REVERSE;
+ graphic_info[graphic_2].anim_mode &= ~ANIM_REVERSE;
+ }
else
- graphic_info[graphic].anim_mode |= ANIM_REVERSE;
+ {
+ graphic_info[graphic_1].anim_mode |= ANIM_REVERSE;
+ graphic_info[graphic_2].anim_mode |= ANIM_REVERSE;
+ }
}
}
for (i = 0; i < NUM_BELT_PARTS; i++)
{
int element = belt_base_active_element[belt_nr] + i;
- int graphic = el2img(element);
+ int graphic_1 = el2img(element);
+ int graphic_2 = el2panelimg(element);
if (belt_dir == MV_LEFT)
- graphic_info[graphic].anim_mode &= ~ANIM_REVERSE;
+ {
+ graphic_info[graphic_1].anim_mode &= ~ANIM_REVERSE;
+ graphic_info[graphic_2].anim_mode &= ~ANIM_REVERSE;
+ }
else
- graphic_info[graphic].anim_mode |= ANIM_REVERSE;
+ {
+ graphic_info[graphic_1].anim_mode |= ANIM_REVERSE;
+ graphic_info[graphic_2].anim_mode |= ANIM_REVERSE;
+ }
}
SCAN_PLAYFIELD(xx, yy)
if (e_belt_nr == belt_nr)
{
Feld[xx][yy] = belt_base_switch_element[belt_nr] + belt_dir_nr;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
}
else if (IS_BELT(element) && belt_dir != MV_NONE)
int belt_part = Feld[xx][yy] - belt_base_element[belt_nr];
Feld[xx][yy] = belt_base_active_element[belt_nr] + belt_part;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
}
else if (IS_BELT_ACTIVE(element) && belt_dir == MV_NONE)
int belt_part = Feld[xx][yy] - belt_base_active_element[belt_nr];
Feld[xx][yy] = belt_base_element[belt_nr] + belt_part;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
}
}
element == EL_SWITCHGATE_SWITCH_DOWN)
{
Feld[xx][yy] = EL_SWITCHGATE_SWITCH_UP + game.switchgate_pos;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
else if (element == EL_DC_SWITCHGATE_SWITCH_UP ||
element == EL_DC_SWITCHGATE_SWITCH_DOWN)
{
Feld[xx][yy] = EL_DC_SWITCHGATE_SWITCH_UP + game.switchgate_pos;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
#else
if (element == EL_SWITCHGATE_SWITCH_UP)
{
Feld[xx][yy] = EL_SWITCHGATE_SWITCH_DOWN;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
else if (element == EL_SWITCHGATE_SWITCH_DOWN)
{
Feld[xx][yy] = EL_SWITCHGATE_SWITCH_UP;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
else if (element == EL_DC_SWITCHGATE_SWITCH_UP)
{
Feld[xx][yy] = EL_DC_SWITCHGATE_SWITCH_DOWN;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
else if (element == EL_DC_SWITCHGATE_SWITCH_DOWN)
{
Feld[xx][yy] = EL_DC_SWITCHGATE_SWITCH_UP;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
#endif
else if (element == EL_SWITCHGATE_OPEN ||
game.light_time_left > 0)
{
Feld[x][y] = EL_LIGHT_SWITCH_ACTIVE;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_LIGHT_SWITCH_ACTIVE &&
game.light_time_left == 0)
{
Feld[x][y] = EL_LIGHT_SWITCH;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_EMC_DRIPPER &&
game.light_time_left > 0)
{
Feld[x][y] = EL_EMC_DRIPPER_ACTIVE;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_EMC_DRIPPER_ACTIVE &&
game.light_time_left == 0)
{
Feld[x][y] = EL_EMC_DRIPPER;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_INVISIBLE_STEELWALL ||
element == EL_INVISIBLE_WALL ||
if (game.light_time_left > 0)
Feld[x][y] = getInvisibleActiveFromInvisibleElement(element);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
/* uncrumble neighbour fields, if needed */
if (element == EL_INVISIBLE_SAND)
- DrawLevelFieldCrumbledSandNeighbours(x, y);
+ TEST_DrawLevelFieldCrumbledSandNeighbours(x, y);
}
else if (element == EL_INVISIBLE_STEELWALL_ACTIVE ||
element == EL_INVISIBLE_WALL_ACTIVE ||
if (game.light_time_left == 0)
Feld[x][y] = getInvisibleFromInvisibleActiveElement(element);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
/* re-crumble neighbour fields, if needed */
if (element == EL_INVISIBLE_SAND)
- DrawLevelFieldCrumbledSandNeighbours(x, y);
+ TEST_DrawLevelFieldCrumbledSandNeighbours(x, y);
}
}
}
game.lenses_time_left > 0)
{
Feld[x][y] = EL_EMC_DRIPPER_ACTIVE;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_EMC_DRIPPER_ACTIVE &&
game.lenses_time_left == 0)
{
Feld[x][y] = EL_EMC_DRIPPER;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_INVISIBLE_STEELWALL ||
element == EL_INVISIBLE_WALL ||
if (game.lenses_time_left > 0)
Feld[x][y] = getInvisibleActiveFromInvisibleElement(element);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
/* uncrumble neighbour fields, if needed */
if (element == EL_INVISIBLE_SAND)
- DrawLevelFieldCrumbledSandNeighbours(x, y);
+ TEST_DrawLevelFieldCrumbledSandNeighbours(x, y);
}
else if (element == EL_INVISIBLE_STEELWALL_ACTIVE ||
element == EL_INVISIBLE_WALL_ACTIVE ||
if (game.lenses_time_left == 0)
Feld[x][y] = getInvisibleFromInvisibleActiveElement(element);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
/* re-crumble neighbour fields, if needed */
if (element == EL_INVISIBLE_SAND)
- DrawLevelFieldCrumbledSandNeighbours(x, y);
+ TEST_DrawLevelFieldCrumbledSandNeighbours(x, y);
}
}
}
game.magnify_time_left > 0)
{
Feld[x][y] = EL_EMC_FAKE_GRASS_ACTIVE;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_EMC_FAKE_GRASS_ACTIVE &&
game.magnify_time_left == 0)
{
Feld[x][y] = EL_EMC_FAKE_GRASS;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (IS_GATE_GRAY(element) &&
game.magnify_time_left > 0)
IS_EMC_GATE_GRAY(element) ?
element - EL_EMC_GATE_5_GRAY + EL_EMC_GATE_5_GRAY_ACTIVE :
element);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (IS_GATE_GRAY_ACTIVE(element) &&
game.magnify_time_left == 0)
IS_EMC_GATE_GRAY_ACTIVE(element) ?
element - EL_EMC_GATE_5_GRAY_ACTIVE + EL_EMC_GATE_5_GRAY :
element);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
}
}
else if (element == EL_TIMEGATE_SWITCH_ACTIVE)
{
Feld[xx][yy] = EL_TIMEGATE_SWITCH;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
*/
RemoveMovingField(x, y + 1);
Feld[x][y + 1] = EL_QUICKSAND_EMPTY;
Feld[x][y + 2] = EL_ROCK;
- DrawLevelField(x, y + 2);
+ TEST_DrawLevelField(x, y + 2);
object_hit = TRUE;
}
RemoveMovingField(x, y + 1);
Feld[x][y + 1] = EL_QUICKSAND_FAST_EMPTY;
Feld[x][y + 2] = EL_ROCK;
- DrawLevelField(x, y + 2);
+ TEST_DrawLevelField(x, y + 2);
object_hit = TRUE;
}
el_act_dir2img(element, GfxAction[x][y], MV_DOWN) != el2img(element))
{
ResetGfxAnimation(x, y);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
if (impact && CAN_EXPLODE_IMPACT(element))
{
Feld[move_x][move_y] = EL_EMC_SPRING_BUMPER_ACTIVE;
ResetGfxAnimation(move_x, move_y);
- DrawLevelField(move_x, move_y);
+ TEST_DrawLevelField(move_x, move_y);
MovDir[x][y] = back_dir;
}
else if (Feld[x][y + 1] == EL_QUICKSAND_EMPTY)
{
if (!MovDelay[x][y])
+ {
MovDelay[x][y] = TILEY + 1;
+ ResetGfxAnimation(x, y);
+ ResetGfxAnimation(x, y + 1);
+ }
+
if (MovDelay[x][y])
{
+ DrawLevelElement(x, y, EL_QUICKSAND_EMPTYING);
+ DrawLevelElement(x, y + 1, EL_QUICKSAND_FILLING);
+
MovDelay[x][y]--;
if (MovDelay[x][y])
return;
Store[x][y + 1] = Store[x][y];
Store[x][y] = 0;
+ PlayLevelSoundAction(x, y, ACTION_FILLING);
+ }
+ else if (Feld[x][y + 1] == EL_QUICKSAND_FAST_EMPTY)
+ {
+ if (!MovDelay[x][y])
+ {
+ MovDelay[x][y] = TILEY + 1;
+
+ ResetGfxAnimation(x, y);
+ ResetGfxAnimation(x, y + 1);
+ }
+
+ if (MovDelay[x][y])
+ {
+ DrawLevelElement(x, y, EL_QUICKSAND_EMPTYING);
+ DrawLevelElement(x, y + 1, EL_QUICKSAND_FAST_FILLING);
+
+ MovDelay[x][y]--;
+ if (MovDelay[x][y])
+ return;
+ }
+
+ Feld[x][y] = EL_QUICKSAND_EMPTY;
+ Feld[x][y + 1] = EL_QUICKSAND_FAST_FULL;
+ Store[x][y + 1] = Store[x][y];
+ Store[x][y] = 0;
+
PlayLevelSoundAction(x, y, ACTION_FILLING);
}
}
else if (Feld[x][y + 1] == EL_QUICKSAND_FAST_EMPTY)
{
if (!MovDelay[x][y])
+ {
MovDelay[x][y] = TILEY + 1;
+ ResetGfxAnimation(x, y);
+ ResetGfxAnimation(x, y + 1);
+ }
+
if (MovDelay[x][y])
{
+ DrawLevelElement(x, y, EL_QUICKSAND_FAST_EMPTYING);
+ DrawLevelElement(x, y + 1, EL_QUICKSAND_FAST_FILLING);
+
MovDelay[x][y]--;
if (MovDelay[x][y])
return;
Store[x][y + 1] = Store[x][y];
Store[x][y] = 0;
+ PlayLevelSoundAction(x, y, ACTION_FILLING);
+ }
+ else if (Feld[x][y + 1] == EL_QUICKSAND_EMPTY)
+ {
+ if (!MovDelay[x][y])
+ {
+ MovDelay[x][y] = TILEY + 1;
+
+ ResetGfxAnimation(x, y);
+ ResetGfxAnimation(x, y + 1);
+ }
+
+ if (MovDelay[x][y])
+ {
+ DrawLevelElement(x, y, EL_QUICKSAND_FAST_EMPTYING);
+ DrawLevelElement(x, y + 1, EL_QUICKSAND_FILLING);
+
+ MovDelay[x][y]--;
+ if (MovDelay[x][y])
+ return;
+ }
+
+ Feld[x][y] = EL_QUICKSAND_FAST_EMPTY;
+ Feld[x][y + 1] = EL_QUICKSAND_FULL;
+ Store[x][y + 1] = Store[x][y];
+ Store[x][y] = 0;
+
PlayLevelSoundAction(x, y, ACTION_FILLING);
}
}
element == EL_SP_SNIKSNAK ||
element == EL_SP_ELECTRON ||
element == EL_MOLE))
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
}
if (IS_PLAYER(x, y))
DrawPlayerField(x, y);
else
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
PlayLevelSoundActionIfLoop(x, y, ACTION_ATTACKING);
if (IN_SCR_FIELD(sx, sy))
{
- DrawLevelFieldCrumbledSand(xx, yy);
+ TEST_DrawLevelFieldCrumbledSand(xx, yy);
DrawGraphic(sx, sy, flame_graphic, frame);
}
}
{
if (Feld[xx][yy] == EL_FLAMES)
Feld[xx][yy] = EL_EMPTY;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
}
}
Feld[newx][newy] == EL_EM_STEEL_EXIT_OPEN)
{
RemoveField(x, y);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
PlayLevelSound(newx, newy, SND_PENGUIN_PASSING);
if (IN_SCR_FIELD(SCREENX(newx), SCREENY(newy)))
else if (IS_FOOD_PENGUIN(Feld[newx][newy]))
{
if (DigField(local_player, x, y, newx, newy, 0,0, DF_DIG) == MP_MOVING)
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(newx, newy);
else
GfxDir[x][y] = MovDir[x][y] = MV_NONE;
}
if (IS_PLAYER(x, y))
DrawPlayerField(x, y);
else
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
return;
}
else
{
Feld[newx][newy] = EL_EMPTY;
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(newx, newy);
}
PlayLevelSound(x, y, SND_PIG_DIGGING);
if (IS_PLAYER(x, y))
DrawPlayerField(x, y);
else
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
return;
}
else
{
Feld[newx][newy] = EL_EMPTY;
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(newx, newy);
PlayLevelSoundAction(x, y, ACTION_DIGGING);
}
if (IS_PLAYER(x, y))
DrawPlayerField(x, y);
else
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
#endif
return;
else if (IS_CUSTOM_ELEMENT(element) &&
CUSTOM_ELEMENT_CAN_ENTER_FIELD(element, newx, newy))
{
+#if 1
+ if (!DigFieldByCE(newx, newy, element))
+ return;
+#else
int new_element = Feld[newx][newy];
if (!IS_FREE(newx, newy))
else
{
RemoveField(newx, newy);
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(newx, newy);
}
/* if digged element was about to explode, prevent the explosion */
}
Store[newx][newy] = EL_EMPTY;
+
#if 1
/* this makes it possible to leave the removed element again */
if (IS_EQUAL_OR_IN_GROUP(new_element, MOVE_ENTER_EL(element)))
Store[newx][newy] = (move_leave_element == EL_TRIGGER_ELEMENT ?
new_element : move_leave_element);
}
+#endif
+
#endif
if (move_pattern & MV_MAZE_RUNNER_STYLE)
if (IS_PLAYER(x, y))
DrawPlayerField(x, y);
else
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
return;
}
if (IS_PLAYER(x, y))
DrawPlayerField(x, y);
else
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
PlayLevelSound(x, y, SND_DRAGON_ATTACKING);
else
{
Feld[newx][newy] = EL_EMPTY;
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(newx, newy);
}
PlayLevelSound(x, y, SND_YAMYAM_DIGGING);
else
{
Feld[newx][newy] = EL_EMPTY;
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(newx, newy);
}
PlayLevelSound(x, y, SND_DARK_YAMYAM_DIGGING);
ResetGfxAnimation(x, y);
GfxAction[x][y] = ACTION_DIGGING;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
MovDelay[newx][newy] = 0; /* start amoeba shrinking delay */
else /* element == EL_PACMAN */
{
Feld[newx][newy] = EL_EMPTY;
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(newx, newy);
PlayLevelSound(x, y, SND_PACMAN_DIGGING);
}
}
GfxAction[x][y], GfxDir[x][y], GfxFrame[x][y]);
#endif
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
return; /* element is still moving */
}
{
Feld[x][y] = EL_SAND;
- DrawLevelFieldCrumbledSandNeighbours(x, y);
+ TEST_DrawLevelFieldCrumbledSandNeighbours(x, y);
}
else if (element == EL_QUICKSAND_FILLING)
{
}
#if USE_NEW_CUSTOM_VALUE
- CustomValue[newx][newy] = CustomValue[x][y];
+ CustomValue[newx][newy] = CustomValue[x][y];
#endif
ChangeDelay[x][y] = 0;
InitField(x, y, FALSE);
if (GFX_CRUMBLED(Feld[x][y]))
- DrawLevelFieldCrumbledSandNeighbours(x, y);
+ TEST_DrawLevelFieldCrumbledSandNeighbours(x, y);
if (ELEM_IS_PLAYER(move_leave_element))
RelocatePlayer(x, y, move_leave_element);
element_info[element].move_pattern == MV_WHEN_DROPPED)))
GfxDir[x][y] = MovDir[newx][newy] = 0;
- DrawLevelField(x, y);
- DrawLevelField(newx, newy);
+ TEST_DrawLevelField(x, y);
+ TEST_DrawLevelField(newx, newy);
Stop[newx][newy] = TRUE; /* ignore this element until the next frame */
AmoebaNr[x][y] = 0;
Feld[x][y] = new_element;
InitField(x, y, FALSE);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
done = TRUE;
}
}
{
Feld[x][y] = Store[x][y];
Store[x][y] = 0;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
}
}
if (!MovDelay[x][y])
{
Feld[x][y] = EL_EMPTY;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
/* don't let mole enter this field in this cycle;
(give priority to objects falling to this field from above) */
if (!level.amoeba_speed && element != EL_EMC_DRIPPER)
{
Feld[ax][ay] = EL_AMOEBA_DEAD;
- DrawLevelField(ax, ay);
+ TEST_DrawLevelField(ax, ay);
return;
}
if (i == 4 && (!waiting_for_player || element == EL_BD_AMOEBA))
{
Feld[ax][ay] = EL_AMOEBA_DEAD;
- DrawLevelField(ax, ay);
+ TEST_DrawLevelField(ax, ay);
AmoebaCnt[AmoebaNr[ax][ay]]--;
if (AmoebaCnt[AmoebaNr[ax][ay]] <= 0) /* amoeba is completely dead */
return;
}
- DrawLevelField(newax, neway);
+ TEST_DrawLevelField(newax, neway);
}
void Life(int ax, int ay)
{
Feld[xx][yy] = EL_EMPTY;
if (!Stop[xx][yy])
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
Stop[xx][yy] = TRUE;
changed = TRUE;
}
Feld[xx][yy] = element;
MovDelay[xx][yy] = (element == EL_GAME_OF_LIFE ? 0 : life_time-1);
if (!Stop[xx][yy])
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
Stop[xx][yy] = TRUE;
changed = TRUE;
}
static void StopRobotWheel(int x, int y)
{
if (ZX == x && ZY == y)
+ {
ZX = ZY = -1;
+
+ game.robot_wheel_active = FALSE;
+ }
}
static void InitTimegateWheel(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)
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);
- }
}
}
}
if (MovDir[x][y] == MV_LEFT)
{
if (IN_LEV_FIELD(x - 1, y) && IS_WALL(Feld[x - 1][y]))
- DrawLevelField(x - 1, y);
+ TEST_DrawLevelField(x - 1, y);
}
else if (MovDir[x][y] == MV_RIGHT)
{
if (IN_LEV_FIELD(x + 1, y) && IS_WALL(Feld[x + 1][y]))
- DrawLevelField(x + 1, y);
+ TEST_DrawLevelField(x + 1, y);
}
else if (MovDir[x][y] == MV_UP)
{
if (IN_LEV_FIELD(x, y - 1) && IS_WALL(Feld[x][y - 1]))
- DrawLevelField(x, y - 1);
+ TEST_DrawLevelField(x, y - 1);
}
else
{
if (IN_LEV_FIELD(x, y + 1) && IS_WALL(Feld[x][y + 1]))
- DrawLevelField(x, y + 1);
+ TEST_DrawLevelField(x, y + 1);
}
Feld[x][y] = Store[x][y];
Store[x][y] = 0;
GfxDir[x][y] = MovDir[x][y] = MV_NONE;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
}
}
}
if (element == EL_EXPANDABLE_WALL && (links_frei || rechts_frei))
- DrawLevelField(ax, ay);
+ TEST_DrawLevelField(ax, ay);
if (!IN_LEV_FIELD(ax, ay-1) || IS_WALL(Feld[ax][ay-1]))
oben_massiv = TRUE;
element == EL_EXPANDABLE_STEELWALL_HORIZONTAL) &&
((links_massiv && rechts_massiv) ||
element == EL_EXPANDABLE_STEELWALL_VERTICAL))
- Feld[ax][ay] = EL_WALL;
+ Feld[ax][ay] = EL_STEELWALL;
if (new_wall)
PlayLevelSoundAction(ax, ay, ACTION_GROWING);
if (IN_LEV_FIELD(xx, yy) && Feld[xx][yy] == EL_FLAMES)
{
Feld[xx][yy] = EL_EMPTY;
- DrawLevelField(xx, yy);
+ TEST_DrawLevelField(xx, yy);
}
else
break;
/* if new animation frame was drawn, correct crumbled sand border */
if (IS_NEW_FRAME(GfxFrame[x][y], graphic))
- DrawLevelFieldCrumbledSand(x, y);
+ TEST_DrawLevelFieldCrumbledSand(x, y);
}
static int getSpecialActionElement(int element, int number, int base_element)
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 &&
TimeLeft = action_arg_number_new;
#if 1
- game_control_value[GAME_CONTROL_TIME] = TimeLeft;
+ game_panel_controls[GAME_PANEL_TIME].value = TimeLeft;
DisplayGameControlValues();
#else
local_player->score = action_arg_number_new;
#if 1
- game_control_value[GAME_CONTROL_SCORE] = local_player->score;
+ game_panel_controls[GAME_PANEL_SCORE].value = local_player->score;
DisplayGameControlValues();
#else
local_player->gems_still_needed = action_arg_number_new;
#if 1
- game_control_value[GAME_CONTROL_GEMS] = local_player->gems_still_needed;
+ game_panel_controls[GAME_PANEL_GEMS].value = local_player->gems_still_needed;
DisplayGameControlValues();
#else
ResetRandomAnimationValue(x, y);
#endif
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
if (GFX_CRUMBLED(new_element))
- DrawLevelFieldCrumbledSandNeighbours(x, y);
+ TEST_DrawLevelFieldCrumbledSandNeighbours(x, y);
}
#if 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);
PlaySound(SND_GAME_RUNNING_OUT_OF_TIME);
#if 1
- game_control_value[GAME_CONTROL_TIME] = TimeLeft;
+ game_panel_controls[GAME_PANEL_TIME].value = TimeLeft;
DisplayGameControlValues();
#else
#if 1
else if (level.time == 0 && !AllPlayersGone) /* level w/o time limit */
{
- game_control_value[GAME_CONTROL_TIME] = TimePlayed;
+ game_panel_controls[GAME_PANEL_TIME].value = TimePlayed;
DisplayGameControlValues();
}
DrawVideoDisplay(VIDEO_STATE_TIME_ON, TapeTime);
}
+#if 1
+ UpdateAndDisplayGameControlValues();
+#else
+ UpdateGameDoorValues();
DrawGameDoorValues();
+#endif
}
void AdvanceFrameAndPlayerCounters(int player_nr)
if (MovDelay[x][y] <= 0)
{
RemoveField(x, y);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
TestIfElementTouchesCustomElement(x, y); /* for empty space */
}
if (GfxAction[x][y] == ACTION_PUSHING && !IS_MOVING(x, y))
{
ResetGfxAnimation(x, y);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
#if DEBUG
DrawLevelGraphicAnimationIfNeeded(x, y, graphic);
if (IS_GEM(element) || element == EL_SP_INFOTRON)
- DrawTwinkleOnField(x, y);
+ TEST_DrawTwinkleOnField(x, y);
}
else if (IS_MOVING(x, y))
ContinueMoving(x, y);
DrawLevelGraphicAnimationIfNeeded(x, y, graphic);
if (IS_GEM(element) || element == EL_SP_INFOTRON)
- DrawTwinkleOnField(x, y);
+ TEST_DrawTwinkleOnField(x, y);
}
else if ((element == EL_ACID ||
element == EL_EXIT_OPEN ||
if (game.magic_wall_time_left > 0)
{
game.magic_wall_time_left--;
+
if (!game.magic_wall_time_left)
{
SCAN_PLAYFIELD(x, y)
element == EL_MAGIC_WALL_FULL)
{
Feld[x][y] = EL_MAGIC_WALL_DEAD;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_BD_MAGIC_WALL_ACTIVE ||
element == EL_BD_MAGIC_WALL_FULL)
{
Feld[x][y] = EL_BD_MAGIC_WALL_DEAD;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_DC_MAGIC_WALL_ACTIVE ||
element == EL_DC_MAGIC_WALL_FULL)
{
Feld[x][y] = EL_DC_MAGIC_WALL_DEAD;
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
}
}
}
+#if USE_DELAYED_GFX_REDRAW
+ SCAN_PLAYFIELD(x, y)
+ {
+#if 1
+ if (GfxRedraw[x][y] != GFX_REDRAW_NONE)
+#else
+ if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)) &&
+ GfxRedraw[x][y] != GFX_REDRAW_NONE)
+#endif
+ {
+ if (GfxRedraw[x][y] & GFX_REDRAW_TILE)
+ DrawLevelField(x, y);
+
+ if (GfxRedraw[x][y] & GFX_REDRAW_TILE_CRUMBLED)
+ DrawLevelFieldCrumbledSand(x, y);
+
+ if (GfxRedraw[x][y] & GFX_REDRAW_TILE_CRUMBLED_NEIGHBOURS)
+ DrawLevelFieldCrumbledSandNeighbours(x, y);
+
+ if (GfxRedraw[x][y] & GFX_REDRAW_TILE_TWINKLED)
+ DrawTwinkleOnField(x, y);
+ }
+
+ GfxRedraw[x][y] = GFX_REDRAW_NONE;
+ }
+#endif
+
CheckLevelTime();
DrawAllPlayers();
#else
-#if 1
+#if 0
/* !!! DOES NOT WORK FOR DIAGONAL PLAYER RELOCATION !!! */
int xsize = (BX2 - BX1 + 1);
int ysize = (BY2 - BY1 + 1);
#endif
{
int old_scroll_x = scroll_x, old_scroll_y = scroll_y;
- int offset = (setup.scroll_delay ? 3 : 0);
+ int offset = game.scroll_delay_value;
if (!IN_VIS_FIELD(SCREENX(jx), SCREENY(jy)))
{
else if (old_jx == jx && old_jy != jy)
player->MovDir = (old_jy < jy ? MV_DOWN : MV_UP);
- DrawLevelField(jx, jy); /* for "crumbled sand" */
+ TEST_DrawLevelField(jx, jy); /* for "crumbled sand" */
player->last_move_dir = player->MovDir;
player->is_moving = TRUE;
PlaySound(SND_GAME_RUNNING_OUT_OF_TIME);
#if 1
- game_control_value[GAME_CONTROL_TIME] = TimeLeft;
+ game_panel_controls[GAME_PANEL_TIME].value = TimeLeft;
DisplayGameControlValues();
#else
#if 1
else if (level.time == 0 && !AllPlayersGone) /* level w/o time limit */
{
- game_control_value[GAME_CONTROL_TIME] = TimePlayed;
+ game_panel_controls[GAME_PANEL_TIME].value = TimePlayed;
DisplayGameControlValues();
}
StorePlayer[jx][jy] = 0;
if (player->is_moving)
- DrawLevelField(player->last_jx, player->last_jy);
+ TEST_DrawLevelField(player->last_jx, player->last_jy);
for (i = 0; i < MAX_PLAYERS; i++)
if (stored_player[i].active)
=============================================================================
*/
-int DigField(struct PlayerInfo *player,
- int oldx, int oldy, int x, int y,
- int real_dx, int real_dy, int mode)
+static int DigField(struct PlayerInfo *player,
+ int oldx, int oldy, int x, int y,
+ int real_dx, int real_dy, int mode)
{
boolean is_player = (IS_PLAYER(oldx, oldy) || mode != DF_DIG);
boolean player_was_pushing = player->is_pushing;
TimeLeft += level.extra_time;
#if 1
- game_control_value[GAME_CONTROL_TIME] = TimeLeft;
+ game_panel_controls[GAME_PANEL_TIME].value = TimeLeft;
DisplayGameControlValues();
#else
local_player->gems_still_needed = 0;
#if 1
- game_control_value[GAME_CONTROL_GEMS] = local_player->gems_still_needed;
+ game_panel_controls[GAME_PANEL_GEMS].value = local_player->gems_still_needed;
DisplayGameControlValues();
#else
if (!(IN_LEV_FIELD(nextx, nexty) &&
(IS_FREE(nextx, nexty) ||
- (Feld[nextx][nexty] == EL_SOKOBAN_FIELD_EMPTY &&
- IS_SB_ELEMENT(element)))))
+ (IS_SB_ELEMENT(element) &&
+ Feld[nextx][nexty] == EL_SOKOBAN_FIELD_EMPTY) ||
+ (IS_CUSTOM_ELEMENT(element) &&
+ CUSTOM_ELEMENT_CAN_ENTER_FIELD(element, nextx, nexty)))))
return MP_NO_ACTION;
if (!checkDiagonalPushing(player, x, y, real_dx, real_dy))
return MP_NO_ACTION;
}
+ if (IS_CUSTOM_ELEMENT(element) &&
+ CUSTOM_ELEMENT_CAN_ENTER_FIELD(element, nextx, nexty))
+ {
+ if (!DigFieldByCE(nextx, nexty, element))
+ return MP_NO_ACTION;
+ }
+
if (IS_SB_ELEMENT(element))
{
if (element == EL_SOKOBAN_FIELD_FULL)
ZX = x;
ZY = y;
- DrawLevelField(x, y);
+ game.robot_wheel_active = TRUE;
+
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_SP_TERMINAL)
{
local_player->lights_still_needed--;
ResetGfxAnimation(x, y);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_TIME_ORB_FULL)
{
TimeLeft += level.time_orb_time;
#if 1
- game_control_value[GAME_CONTROL_TIME] = TimeLeft;
+ game_panel_controls[GAME_PANEL_TIME].value = TimeLeft;
DisplayGameControlValues();
#else
}
ResetGfxAnimation(x, y);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
}
else if (element == EL_EMC_MAGIC_BALL_SWITCH ||
element == EL_EMC_MAGIC_BALL_SWITCH_ACTIVE)
return MP_MOVING;
}
-boolean SnapField(struct PlayerInfo *player, int dx, int dy)
+static boolean DigFieldByCE(int x, int y, int digging_element)
+{
+ int element = Feld[x][y];
+
+ if (!IS_FREE(x, y))
+ {
+ int action = (IS_DIGGABLE(element) ? ACTION_DIGGING :
+ IS_COLLECTIBLE(element) ? ACTION_COLLECTING :
+ ACTION_BREAKING);
+
+ /* no element can dig solid indestructible elements */
+ if (IS_INDESTRUCTIBLE(element) &&
+ !IS_DIGGABLE(element) &&
+ !IS_COLLECTIBLE(element))
+ return FALSE;
+
+ if (AmoebaNr[x][y] &&
+ (element == EL_AMOEBA_FULL ||
+ element == EL_BD_AMOEBA ||
+ element == EL_AMOEBA_GROWING))
+ {
+ AmoebaCnt[AmoebaNr[x][y]]--;
+ AmoebaCnt2[AmoebaNr[x][y]]--;
+ }
+
+ if (IS_MOVING(x, y))
+ RemoveMovingField(x, y);
+ else
+ {
+ RemoveField(x, y);
+ TEST_DrawLevelField(x, y);
+ }
+
+ /* if digged element was about to explode, prevent the explosion */
+ ExplodeField[x][y] = EX_TYPE_NONE;
+
+ PlayLevelSoundAction(x, y, action);
+ }
+
+ Store[x][y] = EL_EMPTY;
+
+#if 1
+ /* this makes it possible to leave the removed element again */
+ if (IS_EQUAL_OR_IN_GROUP(element, MOVE_ENTER_EL(digging_element)))
+ Store[x][y] = element;
+#else
+ if (IS_EQUAL_OR_IN_GROUP(element, MOVE_ENTER_EL(digging_element)))
+ {
+ int move_leave_element = element_info[digging_element].move_leave_element;
+
+ /* this makes it possible to leave the removed element again */
+ Store[x][y] = (move_leave_element == EL_TRIGGER_ELEMENT ?
+ element : move_leave_element);
+ }
+#endif
+
+ return TRUE;
+}
+
+static boolean SnapField(struct PlayerInfo *player, int dx, int dy)
{
int jx = player->jx, jy = player->jy;
int x = jx + dx, y = jy + dy;
}
if (player->MovPos != 0) /* prevent graphic bugs in versions < 2.2.0 */
- DrawLevelField(player->last_jx, player->last_jy);
+ TEST_DrawLevelField(player->last_jx, player->last_jy);
- DrawLevelField(x, y);
+ TEST_DrawLevelField(x, y);
return TRUE;
}
-boolean DropElement(struct PlayerInfo *player)
+static boolean DropElement(struct PlayerInfo *player)
{
int old_element, new_element;
int dropx = player->jx, dropy = player->jy;
int drop_direction = player->MovDir;
int drop_side = drop_direction;
+#if 1
+ int drop_element = get_next_dropped_element(player);
+#else
int drop_element = (player->inventory_size > 0 ?
player->inventory_element[player->inventory_size - 1] :
player->inventory_infinite_element != EL_UNDEFINED ?
player->dynabombs_left > 0 ?
EL_DYNABOMB_PLAYER_1_ACTIVE + player->index_nr :
EL_UNDEFINED);
+#endif
player->is_dropping_pressed = TRUE;
local_player->score += value;
#if 1
- game_control_value[GAME_CONTROL_SCORE] = local_player->score;
+ game_panel_controls[GAME_PANEL_SCORE].value = local_player->score;
DisplayGameControlValues();
#else
GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y1,
GDI_ALT_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y2,
GDI_ALT_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
+ GDI_DIRECT_DRAW, FALSE,
GDI_EVENT_MASK, event_mask,
GDI_CALLBACK_ACTION, HandleGameButtons,
GDI_END);
UnmapGadget(game_gadget[i]);
}
+void RedrawGameButtons()
+{
+ int i;
+
+ for (i = 0; i < NUM_GAME_BUTTONS; i++)
+ RedrawGadget(game_gadget[i]);
+}
+
static void HandleGameButtons(struct GadgetInfo *gi)
{
int id = gi->custom_id;