#if 1
/* game panel display and control definitions */
-#define GAME_PANEL_LEVEL_NUMBER 0
-#define GAME_PANEL_GEMS 1
+#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_KEY_WHITE 27
#define GAME_PANEL_KEY_WHITE_COUNT 28
#define GAME_PANEL_SCORE 29
-#define GAME_PANEL_TIME 30
+#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_TIME 35
#define GAME_PANEL_SHIELD_DEADLY 36
#define GAME_PANEL_SHIELD_DEADLY_TIME 37
-#define GAME_PANEL_EXIT 38
+#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 41
#define GAME_PANEL_LIGHT_SWITCH_TIME 42
#define GAME_PANEL_TIMEGATE_SWITCH 43
-#define GAME_PANEL_TIMEGATE_SWITCH_TIME 44
+#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_PENGUINS 54
#define GAME_PANEL_SOKOBAN_OBJECTS 55
#define GAME_PANEL_SOKOBAN_FIELDS 56
-#define GAME_PANEL_ROBOT_WHEEL 57
+#define GAME_PANEL_ROBOT_WHEEL 57
#define GAME_PANEL_CONVEYOR_BELT_1 58
-#define GAME_PANEL_CONVEYOR_BELT_1_SWITCH 59
-#define GAME_PANEL_CONVEYOR_BELT_2 60
-#define GAME_PANEL_CONVEYOR_BELT_2_SWITCH 61
-#define GAME_PANEL_CONVEYOR_BELT_3 62
-#define GAME_PANEL_CONVEYOR_BELT_3_SWITCH 63
-#define GAME_PANEL_CONVEYOR_BELT_4 64
+#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_PLAYER_NAME 69
-#define GAME_PANEL_LEVEL_NAME 70
-#define GAME_PANEL_LEVEL_AUTHOR 71
+#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
+
+struct GamePanelOrderInfo
+{
+ int nr;
+ int sort_priority;
+};
-#define NUM_GAME_PANEL_CONTROLS 72
+static struct GamePanelOrderInfo game_panel_order[NUM_GAME_PANEL_CONTROLS];
struct GamePanelControlInfo
{
int value, last_value;
int frame, last_frame;
int gfx_frame;
+ int gfx_random;
};
static struct GamePanelControlInfo game_panel_controls[] =
},
{
GAME_PANEL_INVENTORY_FIRST_1,
- &game.panel.inventory_first_1,
+ &game.panel.inventory_first[0],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_FIRST_2,
- &game.panel.inventory_first_2,
+ &game.panel.inventory_first[1],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_FIRST_3,
- &game.panel.inventory_first_3,
+ &game.panel.inventory_first[2],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_FIRST_4,
- &game.panel.inventory_first_4,
+ &game.panel.inventory_first[3],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_FIRST_5,
- &game.panel.inventory_first_5,
+ &game.panel.inventory_first[4],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_FIRST_6,
- &game.panel.inventory_first_6,
+ &game.panel.inventory_first[5],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_FIRST_7,
- &game.panel.inventory_first_7,
+ &game.panel.inventory_first[6],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_FIRST_8,
- &game.panel.inventory_first_8,
+ &game.panel.inventory_first[7],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_LAST_1,
- &game.panel.inventory_last_1,
+ &game.panel.inventory_last[0],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_LAST_2,
- &game.panel.inventory_last_2,
+ &game.panel.inventory_last[1],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_LAST_3,
- &game.panel.inventory_last_3,
+ &game.panel.inventory_last[2],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_LAST_4,
- &game.panel.inventory_last_4,
+ &game.panel.inventory_last[3],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_LAST_5,
- &game.panel.inventory_last_5,
+ &game.panel.inventory_last[4],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_LAST_6,
- &game.panel.inventory_last_6,
+ &game.panel.inventory_last[5],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_LAST_7,
- &game.panel.inventory_last_7,
+ &game.panel.inventory_last[6],
TYPE_ELEMENT,
},
{
GAME_PANEL_INVENTORY_LAST_8,
- &game.panel.inventory_last_8,
+ &game.panel.inventory_last[7],
TYPE_ELEMENT,
},
{
},
{
GAME_PANEL_CONVEYOR_BELT_1,
- &game.panel.conveyor_belt_1,
+ &game.panel.conveyor_belt[0],
TYPE_ELEMENT,
},
{
- GAME_PANEL_CONVEYOR_BELT_1_SWITCH,
- &game.panel.conveyor_belt_1_switch,
+ GAME_PANEL_CONVEYOR_BELT_2,
+ &game.panel.conveyor_belt[1],
TYPE_ELEMENT,
},
{
- GAME_PANEL_CONVEYOR_BELT_2,
- &game.panel.conveyor_belt_2,
+ GAME_PANEL_CONVEYOR_BELT_3,
+ &game.panel.conveyor_belt[2],
TYPE_ELEMENT,
},
{
- GAME_PANEL_CONVEYOR_BELT_2_SWITCH,
- &game.panel.conveyor_belt_2_switch,
+ GAME_PANEL_CONVEYOR_BELT_4,
+ &game.panel.conveyor_belt[3],
TYPE_ELEMENT,
},
{
- GAME_PANEL_CONVEYOR_BELT_3,
- &game.panel.conveyor_belt_3,
+ GAME_PANEL_CONVEYOR_BELT_1_SWITCH,
+ &game.panel.conveyor_belt_switch[0],
TYPE_ELEMENT,
},
{
- GAME_PANEL_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_PANEL_CONVEYOR_BELT_4,
- &game.panel.conveyor_belt_4,
+ GAME_PANEL_CONVEYOR_BELT_3_SWITCH,
+ &game.panel.conveyor_belt_switch[2],
TYPE_ELEMENT,
},
{
GAME_PANEL_CONVEYOR_BELT_4_SWITCH,
- &game.panel.conveyor_belt_4_switch,
+ &game.panel.conveyor_belt_switch[3],
TYPE_ELEMENT,
},
{
&game.panel.gravity_state,
TYPE_STRING,
},
+ {
+ 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_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,
static void CreateField(int, int, int);
+static void ResetGfxAnimation(int, int);
+
static void SetPlayerWaiting(struct PlayerInfo *, boolean);
static void AdvanceFrameAndPlayerCounters(int);
}
}
+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; game_panel_controls[i].nr != -1; i++)
{
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;
- struct TextPosInfo *pos = gpc->pos;
if (nr != i)
{
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()
stored_player[player_nr].num_white_keys;
}
- for (i = 0; i < 8; i++)
+ 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_ROBOT_WHEEL].value =
(game.robot_wheel_active ? EL_ROBOT_WHEEL_ACTIVE : EL_ROBOT_WHEEL);
- game_panel_controls[GAME_PANEL_CONVEYOR_BELT_1].value =
- (game.belt_dir[0] != MV_NONE ? EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE :
- EL_CONVEYOR_BELT_1_MIDDLE);
- game_panel_controls[GAME_PANEL_CONVEYOR_BELT_1_SWITCH].value =
- getBeltSwitchElementFromBeltNrAndBeltDir(0, game.belt_dir[0]);
- game_panel_controls[GAME_PANEL_CONVEYOR_BELT_2].value =
- (game.belt_dir[1] != MV_NONE ? EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE :
- EL_CONVEYOR_BELT_2_MIDDLE);
- game_panel_controls[GAME_PANEL_CONVEYOR_BELT_2_SWITCH].value =
- getBeltSwitchElementFromBeltNrAndBeltDir(1, game.belt_dir[1]);
- game_panel_controls[GAME_PANEL_CONVEYOR_BELT_3].value =
- (game.belt_dir[2] != MV_NONE ? EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE :
- EL_CONVEYOR_BELT_3_MIDDLE);
- game_panel_controls[GAME_PANEL_CONVEYOR_BELT_3_SWITCH].value =
- getBeltSwitchElementFromBeltNrAndBeltDir(2, game.belt_dir[2]);
- game_panel_controls[GAME_PANEL_CONVEYOR_BELT_4].value =
- (game.belt_dir[3] != MV_NONE ? EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE :
- EL_CONVEYOR_BELT_4_MIDDLE);
- game_panel_controls[GAME_PANEL_CONVEYOR_BELT_4_SWITCH].value =
- getBeltSwitchElementFromBeltNrAndBeltDir(3, game.belt_dir[3]);
+ 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_panel_controls[GAME_PANEL_MAGIC_WALL].value =
(game.magic_wall_active ? EL_MAGIC_WALL_ACTIVE : EL_MAGIC_WALL);
game_panel_controls[GAME_PANEL_GRAVITY_STATE].value = game.gravity;
#endif
+ 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_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;
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_panel_controls[i].nr != -1; i++)
+ {
+ struct GamePanelControlInfo *gpc = &game_panel_controls[i];
+
+ if (PANEL_DEACTIVATED(gpc->pos))
+ continue;
+
+ 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;
- int type = gpc->type;
+#endif
struct TextPosInfo *pos = gpc->pos;
+ int type = gpc->type;
int value = gpc->value;
int frame = gpc->frame;
+#if 0
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;
printf("::: value %d changed from %d to %d\n", nr, last_value, value);
#endif
- if (PANEL_DEACTIVATED(pos))
- continue;
-
if (type == TYPE_INTEGER)
{
if (nr == GAME_PANEL_LEVEL_NUMBER ||
size = (value < value_change ? size1 : size2);
font = (value < value_change ? font1 : font2);
+#if 0
/* clear background if value just changed its size (dynamic digits) */
if ((last_value < value_change) != (value < value_change))
{
ClearRectangleOnBackground(drawto, PANEL_XPOS(pos), PANEL_YPOS(pos),
max_width, max_height);
}
+#endif
}
-
- pos->width = size * getFontWidth(font);
}
- DrawText(PANEL_XPOS(pos), PANEL_YPOS(pos), int2str(value, size), 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)
{
+ 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)
+ {
+ element = value;
+ graphic = el2panelimg(value);
+
+ 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(src_bitmap, drawto, src_x, src_y, width, height,
+ dst_x, dst_y);
+ }
+ }
+#else
if (value == EL_UNDEFINED || value == EL_EMPTY)
{
- int src_x = DOOR_GFX_PAGEX5 + ALIGNED_TEXT_XPOS(pos);
- int src_y = DOOR_GFX_PAGEY1 + ALIGNED_TEXT_YPOS(pos);
+ element = (last_value == EL_UNDEFINED ? EL_EMPTY : last_value);
+ graphic = el2panelimg(element);
- BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, src_x, src_y,
- size, size, dst_x, dst_y);
+ 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
{
- int graphic = el2panelimg(value);
+ element = value;
+ graphic = el2panelimg(value);
- DrawSizedGraphicExt(drawto, dst_x, dst_y, graphic, frame, size);
+ 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)
{
{
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);
/* 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 1
- /* as with numbers, don't truncate output if "chars" is zero or less */
- size = (size > 0 ? size : strlen(s));
-#endif
-
if (s != NULL)
{
- char *s_cut = getStringCopyN(s, size);
+ char *s_cut;
-#if 0
- /* (not needed anymore with above correction of "size" value) */
- size = strlen(s_cut); /* string size may be smaller than "chars" */
+#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
- pos->width = size * getFontWidth(font);
+ s_cut = getStringCopyN(s, size);
- DrawText(PANEL_XPOS(pos), PANEL_YPOS(pos), s_cut, font);
+ DrawTextExt(drawto, PANEL_XPOS(pos), PANEL_YPOS(pos),
+ s_cut, font, mask_mode);
free(s_cut);
}
emulate_sp = FALSE;
InitField(x, y, TRUE);
+
+ ResetGfxAnimation(x, y);
}
InitBeltMovement();
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)
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;