static struct GadgetInfo *tool_gadget[NUM_TOOL_BUTTONS];
static int request_gadget_id = -1;
+static char *print_if_not_empty(int element)
+{
+ static char *s = NULL;
+ char *token_name = element_info[element].token_name;
+
+ if (s != NULL)
+ free(s);
+
+ s = checked_malloc(strlen(token_name) + 10 + 1);
+
+ if (element != EL_EMPTY)
+ sprintf(s, "%d\t['%s']", element, token_name);
+ else
+ sprintf(s, "%d", element);
+
+ return s;
+}
+
void DumpTile(int x, int y)
{
int sx = SCREENX(x);
- int sy = SCREENX(y);
+ int sy = SCREENY(y);
printf_line("-", 79);
printf("Field Info: SCREEN(%d, %d), LEVEL(%d, %d)\n", sx, sy, x, y);
return;
}
- printf(" Feld: %d ['%s']\n", Feld[x][y],
+ printf(" Feld: %d\t['%s']\n", Feld[x][y],
element_info[Feld[x][y]].token_name);
- printf(" Back: %d\n", Back[x][y]);
- printf(" Store: %d\n", Store[x][y]);
- printf(" Store2: %d\n", Store2[x][y]);
- printf(" StorePlayer: %d\n", StorePlayer[x][y]);
+ printf(" Back: %s\n", print_if_not_empty(Back[x][y]));
+ printf(" Store: %s\n", print_if_not_empty(Store[x][y]));
+ printf(" Store2: %s\n", print_if_not_empty(Store2[x][y]));
+ printf(" StorePlayer: %s\n", print_if_not_empty(StorePlayer[x][y]));
printf(" MovPos: %d\n", MovPos[x][y]);
printf(" MovDir: %d\n", MovDir[x][y]);
printf(" MovDelay: %d\n", MovDelay[x][y]);
if (redraw_mask & REDRAW_TILES)
{
for (x = 0; x < SCR_FIELDX; x++)
- for (y =0 ; y < SCR_FIELDY; y++)
+ for (y = 0 ; y < SCR_FIELDY; y++)
if (redraw[redraw_x1 + x][redraw_y1 + y])
BlitBitmap(buffer, window,
- FX + x * TILEX, FX + y * TILEY, TILEX, TILEY,
+ FX + x * TILEX, FY + y * TILEY, TILEX, TILEY,
SX + x * TILEX, SY + y * TILEY);
}
/* draw elements the player is just walking/passing through/under */
/* ----------------------------------------------------------------------- */
- /* handle the field the player is leaving ... */
- if (player_is_moving && IS_ACCESSIBLE_INSIDE(last_element))
- DrawLevelField(last_jx, last_jy);
- else if (player_is_moving && IS_ACCESSIBLE_UNDER(last_element))
- DrawLevelFieldThruMask(last_jx, last_jy);
+ if (player_is_moving)
+ {
+ /* handle the field the player is leaving ... */
+ if (IS_ACCESSIBLE_INSIDE(last_element))
+ DrawLevelField(last_jx, last_jy);
+ else if (IS_ACCESSIBLE_UNDER(last_element))
+ DrawLevelFieldThruMask(last_jx, last_jy);
+ }
#if 1
+ /* do not redraw accessible elements if the player is just pushing them */
+ if (!player_is_moving || !player->is_pushing)
+ {
+ /* ... and the field the player is entering */
+ if (IS_ACCESSIBLE_INSIDE(element))
+ DrawLevelField(jx, jy);
+ else if (IS_ACCESSIBLE_UNDER(element))
+ DrawLevelFieldThruMask(jx, jy);
+ }
+
+#else
+
+#if 0
+ /* !!! I have forgotton what this should be good for !!! */
+ /* !!! causes player being visible when pushing from within tubes !!! */
if (!player->is_pushing)
#endif
{
else if (IS_ACCESSIBLE_UNDER(element))
DrawLevelFieldThruMask(jx, jy);
}
+#endif
if (setup.direct_draw)
{
void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
{
int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr;
+#if 1
+ Bitmap *src_bitmap = graphic_info[graphic].bitmap;
+ int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND);
+#else
boolean draw_masked = graphic_info[graphic].draw_masked;
int mask_mode = (draw_masked ? BLIT_MASKED : BLIT_ON_BACKGROUND);
+#endif
boolean ffwd_delay = (tape.playing && tape.fast_forward);
boolean no_delay = (tape.warp_forward);
unsigned long anim_delay = 0;
SetMouseCursor(CURSOR_DEFAULT);
#endif
-#if defined(PLATFORM_UNIX)
+#if defined(NETWORK_AVALIABLE)
/* pause network game while waiting for request to answer */
if (options.network &&
game_status == GAME_MODE_PLAYING &&
- req_state & REQUEST_WAIT_FOR)
+ req_state & REQUEST_WAIT_FOR_INPUT)
SendToServer_PausePlaying();
#endif
UnmapAllGadgets();
- CloseDoor(DOOR_CLOSE_1);
+ if (old_door_state & DOOR_OPEN_1)
+ {
+ CloseDoor(DOOR_CLOSE_1);
- /* save old door content */
- BlitBitmap(bitmap_db_door, bitmap_db_door,
- DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE,
- DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1);
+ /* save old door content */
+ BlitBitmap(bitmap_db_door, bitmap_db_door,
+ DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE,
+ DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1);
+ }
SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
ClearEventQueue();
#endif
- if (!(req_state & REQUEST_WAIT_FOR))
+ if (!(req_state & REQUEST_WAIT_FOR_INPUT))
{
SetDrawBackgroundMask(REDRAW_FIELD);
{
CloseDoor(DOOR_CLOSE_1);
- if (!(req_state & REQ_STAY_CLOSED) && (old_door_state & DOOR_OPEN_1))
- {
- BlitBitmap(bitmap_db_door, bitmap_db_door,
- DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE,
- DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
- OpenDoor(DOOR_OPEN_1);
- }
+ if (((old_door_state & DOOR_OPEN_1) && !(req_state & REQ_STAY_CLOSED)) ||
+ (req_state & REQ_REOPEN))
+ OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
}
RemapAllGadgets();
SetDrawBackgroundMask(REDRAW_FIELD);
-#if defined(PLATFORM_UNIX)
+#if defined(NETWORK_AVALIABLE)
/* continue network game after request */
if (options.network &&
game_status == GAME_MODE_PLAYING &&
- req_state & REQUEST_WAIT_FOR)
+ req_state & REQUEST_WAIT_FOR_INPUT)
SendToServer_ContinuePlaying();
#endif
unsigned int OpenDoor(unsigned int door_state)
{
- unsigned int new_door_state;
-
if (door_state & DOOR_COPY_BACK)
{
- BlitBitmap(bitmap_db_door, bitmap_db_door,
- DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE + VYSIZE,
- DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+ if (door_state & DOOR_OPEN_1)
+ BlitBitmap(bitmap_db_door, bitmap_db_door,
+ DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE,
+ DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+
+ if (door_state & DOOR_OPEN_2)
+ BlitBitmap(bitmap_db_door, bitmap_db_door,
+ DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY2, VXSIZE, VYSIZE,
+ DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2);
+
door_state &= ~DOOR_COPY_BACK;
}
- new_door_state = MoveDoor(door_state);
-
- return(new_door_state);
+ return MoveDoor(door_state);
}
unsigned int CloseDoor(unsigned int door_state)
{
- unsigned int new_door_state;
+ unsigned int old_door_state = GetDoorState();
- BlitBitmap(backbuffer, bitmap_db_door,
- DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
- BlitBitmap(backbuffer, bitmap_db_door,
- VX, VY, VXSIZE, VYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2);
+ if (!(door_state & DOOR_NO_COPY_BACK))
+ {
+ if (old_door_state & DOOR_OPEN_1)
+ BlitBitmap(backbuffer, bitmap_db_door,
+ DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+
+ if (old_door_state & DOOR_OPEN_2)
+ BlitBitmap(backbuffer, bitmap_db_door,
+ VX, VY, VXSIZE, VYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2);
- new_door_state = MoveDoor(door_state);
+ door_state &= ~DOOR_NO_COPY_BACK;
+ }
- return(new_door_state);
+ return MoveDoor(door_state);
}
unsigned int GetDoorState()
{
BlitBitmap(bitmap_db_door, drawto,
DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1 + i / 2,
- DXSIZE,DYSIZE - i / 2, DX, DY);
+ DXSIZE, DYSIZE - i / 2, DX, DY);
ClearRectangle(drawto, DX, DY + DYSIZE - i / 2, DXSIZE, i / 2);
}
int el_act_dir2img(int element, int action, int direction)
{
element = GFX_ELEMENT(element);
- direction = MV_DIR_BIT(direction);
+ direction = MV_DIR_BIT(direction); /* default: MV_NO_MOVING => MV_DOWN */
return element_info[element].direction_graphic[action][direction];
}
static int el_act_dir2crm(int element, int action, int direction)
{
element = GFX_ELEMENT(element);
- direction = MV_DIR_BIT(direction);
+ direction = MV_DIR_BIT(direction); /* default: MV_NO_MOVING => MV_DOWN */
return element_info[element].direction_crumbled[action][direction];
}