static struct GadgetInfo *tool_gadget[NUM_TOOL_BUTTONS];
static int request_gadget_id = -1;
+void DumpTile(int x, int y)
+{
+ int sx = SCREENX(x);
+ int sy = SCREENX(y);
+
+ printf_line("-", 79);
+ printf("Field Info: SCREEN(%d, %d), LEVEL(%d, %d)\n", sx, sy, x, y);
+ printf_line("-", 79);
+
+ if (!IN_LEV_FIELD(x, y))
+ {
+ printf("(not in level field)\n");
+ printf("\n");
+
+ return;
+ }
+
+ printf(" Feld: %d ['%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(" MovPos: %d\n", MovPos[x][y]);
+ printf(" MovDir: %d\n", MovDir[x][y]);
+ printf(" MovDelay: %d\n", MovDelay[x][y]);
+ printf(" ChangeDelay: %d\n", ChangeDelay[x][y]);
+ printf(" GfxElement: %d\n", GfxElement[x][y]);
+ printf(" GfxAction: %d\n", GfxAction[x][y]);
+ printf(" GfxFrame: %d\n", GfxFrame[x][y]);
+ printf("\n");
+}
+
void SetDrawtoField(int mode)
{
if (mode == DRAW_BUFFERED && setup.soft_scrolling)
if (setup.direct_draw)
SetDrawtoField(DRAW_BACKBUFFER);
- for(xx=BX1; xx<=BX2; xx++)
- for(yy=BY1; yy<=BY2; yy++)
+ for (xx = BX1; xx <= BX2; xx++)
+ for (yy = BY1; yy <= BY2; yy++)
if (xx >= x1 && xx <= x2 && yy >= y1 && yy <= y2)
DrawScreenField(xx, yy);
DrawAllPlayers();
if (redraw_mask & REDRAW_TILES)
{
- for(x=0; x<SCR_FIELDX; x++)
- for(y=0; y<SCR_FIELDY; y++)
+ for (x = 0; x < SCR_FIELDX; x++)
+ 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,
FlushDisplay();
- for(x=0; x<MAX_BUF_XSIZE; x++)
- for(y=0; y<MAX_BUF_YSIZE; y++)
+ for (x = 0; x < MAX_BUF_XSIZE; x++)
+ for (y = 0; y < MAX_BUF_YSIZE; y++)
redraw[x][y] = 0;
redraw_tiles = 0;
redraw_mask = REDRAW_NONE;
ClearRectangle(window, REAL_SX,REAL_SY,FULL_SXSIZE,FULL_SYSIZE);
FlushDisplay();
- for(i=0;i<2*FULL_SYSIZE;i++)
+ for (i = 0; i < 2 * FULL_SYSIZE; i++)
{
- for(y=0;y<FULL_SYSIZE;y++)
+ for (y = 0; y < FULL_SYSIZE; y++)
{
BlitBitmap(backbuffer, window,
REAL_SX,REAL_SY+i, FULL_SXSIZE,1, REAL_SX,REAL_SY+i);
#endif
#if 0
- for(i=1;i<FULL_SYSIZE;i+=2)
+ for (i = 1; i < FULL_SYSIZE; i+=2)
BlitBitmap(backbuffer, window,
REAL_SX,REAL_SY+i, FULL_SXSIZE,1, REAL_SX,REAL_SY+i);
FlushDisplay();
BorderElement = EL_EMPTY;
- for(y=0; y<lev_fieldy && BorderElement == EL_EMPTY; y++)
+ for (y = 0; y < lev_fieldy && BorderElement == EL_EMPTY; y++)
{
- for(x=0; x<lev_fieldx; x++)
+ for (x = 0; x < lev_fieldx; x++)
{
if (!IS_INDESTRUCTIBLE(Feld[x][y]))
BorderElement = EL_STEELWALL;
return el_act_dir2img(player->element_nr, player->GfxAction, move_dir);
}
+static boolean equalGraphics(int graphic1, int graphic2)
+{
+ struct GraphicInfo *g1 = &graphic_info[graphic1];
+ struct GraphicInfo *g2 = &graphic_info[graphic2];
+
+ return (g1->bitmap == g2->bitmap &&
+ g1->src_x == g2->src_x &&
+ g1->src_y == g2->src_y &&
+ g1->anim_frames == g2->anim_frames &&
+ g1->anim_delay == g2->anim_delay &&
+ g1->anim_mode == g2->anim_mode);
+}
+
void DrawAllPlayers()
{
int i;
- for(i=0; i<MAX_PLAYERS; i++)
+ for (i = 0; i < MAX_PLAYERS; i++)
if (stored_player[i].active)
DrawPlayer(&stored_player[i]);
}
if (element == EL_EXPLOSION)
return;
- action = (player->is_pushing ? ACTION_PUSHING :
- player->is_digging ? ACTION_DIGGING :
- player->is_collecting ? ACTION_COLLECTING :
- player->is_moving ? ACTION_MOVING :
- player->is_snapping ? ACTION_SNAPPING : ACTION_DEFAULT);
-
-#if 0
- printf("::: '%s'\n", element_action_info[action].suffix);
-#endif
+ action = (player->is_pushing ? ACTION_PUSHING :
+ player->is_digging ? ACTION_DIGGING :
+ player->is_collecting ? ACTION_COLLECTING :
+ player->is_moving ? ACTION_MOVING :
+ player->is_snapping ? ACTION_SNAPPING :
+ player->is_dropping ? ACTION_DROPPING :
+ player->is_waiting ? player->action_waiting : ACTION_DEFAULT);
InitPlayerGfxAnimation(player, action, move_dir);
/* in the case of changed player action or direction, prevent the current
animation frame from being restarted for identical animations */
- if (player->Frame == 0 &&
- graphic_info[graphic].bitmap == graphic_info[last_player_graphic].bitmap)
+ if (player->Frame == 0 && equalGraphics(graphic, last_player_graphic))
player->Frame = last_player_frame;
#else
SetDrawtoField(DRAW_DIRECT);
}
- MarkTileDirty(sx,sy);
+ MarkTileDirty(sx, sy);
}
void getGraphicSource(int graphic, int frame, Bitmap **bitmap, int *x, int *y)
BlitBitmap(src_bitmap, d, src_x, src_y, MINI_TILEX, MINI_TILEY, x, y);
}
-void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int frame,
+void DrawGraphicShifted(int x, int y, int dx, int dy, int graphic, int frame,
int cut_mode, int mask_mode)
{
Bitmap *src_bitmap;
BlitBitmap(src_bitmap, drawto_field, src_x, src_y, width, height,
dest_x, dest_y);
- MarkTileDirty(x,y);
+ MarkTileDirty(x, y);
}
void DrawGraphicShiftedThruMask(int x, int y, int dx, int dy, int graphic,
int frame, int cut_mode)
{
- DrawGraphicShifted(x,y, dx,dy, graphic, frame, cut_mode, USE_MASKING);
+ DrawGraphicShifted(x, y, dx, dy, graphic, frame, cut_mode, USE_MASKING);
}
void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
DrawLevelElementExt(x, y, 0, 0, Feld[x][y], NO_CUTTING, USE_MASKING);
}
+#define TILE_GFX_ELEMENT(x, y) \
+ (GfxElement[x][y] != EL_UNDEFINED && Feld[x][y] != EL_EXPLOSION ? \
+ GfxElement[x][y] : Feld[x][y])
+
static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
{
Bitmap *src_bitmap;
if (!IN_LEV_FIELD(x, y))
return;
- element = (GfxElement[x][y] != EL_UNDEFINED && Feld[x][y] != EL_EXPLOSION ?
- GfxElement[x][y] : Feld[x][y]);
+ element = TILE_GFX_ELEMENT(x, y);
/* crumble field itself */
if (GFX_CRUMBLED(element) && !IS_MOVING(x, y))
getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y);
- for(i=0; i<4; i++)
+ for (i = 0; i < 4; i++)
{
int xx = x + xy[i][0];
int yy = y + xy[i][1];
+#if 1
+ element = (IN_LEV_FIELD(xx, yy) ? TILE_GFX_ELEMENT(xx, yy) :
+ BorderElement);
+#else
element = (IN_LEV_FIELD(xx, yy) ? Feld[xx][yy] : BorderElement);
+#endif
/* check if neighbour field is of same type */
if (GFX_CRUMBLED(element) && !IS_MOVING(xx, yy))
getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y);
#endif
- for(i=0; i<4; i++)
+ for (i = 0; i < 4; i++)
{
int xx = x + xy[i][0];
int yy = y + xy[i][1];
int sxx = sx + xy[i][0];
int syy = sy + xy[i][1];
+#if 1
+ if (!IN_LEV_FIELD(xx, yy) ||
+ !IN_SCR_FIELD(sxx, syy) ||
+ IS_MOVING(xx, yy))
+ continue;
+
+ element = TILE_GFX_ELEMENT(xx, yy);
+
+ if (!GFX_CRUMBLED(element))
+ continue;
+#else
if (!IN_LEV_FIELD(xx, yy) ||
!IN_SCR_FIELD(sxx, syy) ||
!GFX_CRUMBLED(Feld[xx][yy]) ||
IS_MOVING(xx, yy))
continue;
+#endif
#if 1
graphic = el_act2crm(Feld[xx][yy], ACTION_DEFAULT);
};
int i;
- for(i=0; i<4; i++)
+ for (i = 0; i < 4; i++)
{
int xx = x + xy[i][0];
int yy = y + xy[i][1];
DrawScreenElementShifted(x, y, 0, MovPos[lx][ly], content, cut_mode);
if (content == EL_ACID)
- DrawLevelElementThruMask(lx, ly + 1, EL_ACID);
+ {
+ int dir = MovDir[lx][ly];
+ int newlx = lx + (dir == MV_LEFT ? -1 : dir == MV_RIGHT ? +1 : 0);
+ int newly = ly + (dir == MV_UP ? -1 : dir == MV_DOWN ? +1 : 0);
+
+ DrawLevelElementThruMask(newlx, newly, EL_ACID);
+ }
}
else if (IS_BLOCKED(lx, ly))
{
boolean draw_masked = graphic_info[graphic].draw_masked;
int mask_mode = (draw_masked ? BLIT_MASKED : BLIT_ON_BACKGROUND);
boolean ffwd_delay = (tape.playing && tape.fast_forward);
+ boolean no_delay = (tape.index_search);
unsigned long anim_delay = 0;
- int anim_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
+ int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
+ int anim_delay_value = (no_delay ? 0 : frame_delay_value);
int font_nr = FONT_ENVELOPE_1 + envelope_nr;
int font_width = getFontWidth(font_nr);
int font_height = getFontHeight(font_nr);
int ystep = (ystart < yend || xstep == 0 ? 1 : 0);
int x, y;
- for (x=xstart, y=ystart; x <= xend && y <= yend; x += xstep, y += ystep)
+ for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep)
{
int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2;
SetDrawtoField(DRAW_BACKBUFFER);
- for (yy=0; yy < ysize; yy++) for (xx=0; xx < xsize; xx++)
+ for (yy = 0; yy < ysize; yy++) for (xx = 0; xx < xsize; xx++)
DrawEnvelopeBackground(envelope_nr, sx,sy, xx,yy, xsize, ysize, font_nr);
DrawTextToTextArea(SX + sx + font_width, SY + sy + font_height,
int sound_opening = element_info[element].sound[ACTION_OPENING];
int sound_closing = element_info[element].sound[ACTION_CLOSING];
boolean ffwd_delay = (tape.playing && tape.fast_forward);
- int wait_delay_value = (ffwd_delay ? 500 : 1000);
+ boolean no_delay = (tape.index_search);
+ int normal_delay_value = ONE_SECOND_DELAY / (ffwd_delay ? 2 : 1);
+ int wait_delay_value = (no_delay ? 0 : normal_delay_value);
int anim_mode = graphic_info[graphic].anim_mode;
int main_anim_mode = (anim_mode == ANIM_NONE ? ANIM_VERTICAL|ANIM_HORIZONTAL:
anim_mode == ANIM_DEFAULT ? ANIM_VERTICAL : anim_mode);
SetDrawBackgroundMask(REDRAW_NONE);
ClearWindow();
- for(x=BX1; x<=BX2; x++)
- for(y=BY1; y<=BY2; y++)
+ for (x = BX1; x <= BX2; x++)
+ for (y = BY1; y <= BY2; y++)
DrawScreenField(x, y);
redraw_mask |= REDRAW_FIELD;
{
int x,y;
- for(x=0; x<size_x; x++)
- for(y=0; y<size_y; y++)
+ for (x = 0; x < size_x; x++)
+ for (y = 0; y < size_y; y++)
DrawMiniElementOrWall(x, y, scroll_x, scroll_y);
redraw_mask |= REDRAW_FIELD;
xpos += MICRO_TILEX;
ypos += MICRO_TILEY;
- for(x=-1; x<=STD_LEV_FIELDX; x++)
+ for (x = -1; x <= STD_LEV_FIELDX; x++)
{
- for(y=-1; y<=STD_LEV_FIELDY; y++)
+ for (y = -1; y <= STD_LEV_FIELDY; y++)
{
int lx = from_x + x, ly = from_y + y;
}
#define MAX_REQUEST_LINES 13
-#define MAX_REQUEST_LINE_LEN 7
+#define MAX_REQUEST_LINE_FONT1_LEN 7
+#define MAX_REQUEST_LINE_FONT2_LEN 10
boolean Request(char *text, unsigned int req_state)
{
int mx, my, ty, result = -1;
unsigned int old_door_state;
int last_game_status = game_status; /* save current game status */
+ int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN;
+ int font_nr = FONT_TEXT_2;
+ int max_word_len = 0;
+ char *text_ptr;
+
+ for (text_ptr = text; *text_ptr; text_ptr++)
+ {
+ max_word_len = (*text_ptr != ' ' ? max_word_len + 1 : 0);
+
+ if (max_word_len > MAX_REQUEST_LINE_FONT1_LEN)
+ {
+ max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN;
+ font_nr = FONT_LEVEL_NUMBER;
+
+ break;
+ }
+ }
+
+#if 1
+ /* disable deactivated drawing when quick-loading level tape recording */
+ if (tape.playing && tape.index_search)
+ {
+ SetDrawDeactivationMask(REDRAW_NONE);
+ audio.sound_deactivated = FALSE;
+ }
+#endif
#if 1
SetMouseCursor(CURSOR_DEFAULT);
game_status = GAME_MODE_PSEUDO_DOOR;
/* write text for request */
- for(ty=0; ty < MAX_REQUEST_LINES; ty++)
+ for (ty = 0; ty < MAX_REQUEST_LINES; ty++)
{
- char text_line[MAX_REQUEST_LINE_LEN + 1];
- int tx, tl, tc;
+ char text_line[max_request_line_len + 1];
+ int tx, tl, tc = 0;
if (!*text)
break;
- for(tl=0,tx=0; tx < MAX_REQUEST_LINE_LEN; tl++,tx++)
+ for (tl = 0, tx = 0; tx < max_request_line_len; tl++, tx++)
{
tc = *(text + tx);
if (!tc || tc == ' ')
strncpy(text_line, text, tl);
text_line[tl] = 0;
- DrawText(DX + (DXSIZE - tl * getFontWidth(FONT_TEXT_2)) / 2,
- DY + 8 + ty * (getFontHeight(FONT_TEXT_2) + 2),
- text_line, FONT_TEXT_2);
+ DrawText(DX + (DXSIZE - tl * getFontWidth(font_nr)) / 2,
+ DY + 8 + ty * (getFontHeight(font_nr) + 2),
+ text_line, font_nr);
text += tl + (tc == ' ' ? 1 : 0);
}
SetMouseCursor(CURSOR_DEFAULT);
#endif
- while(result < 0)
+ while (result < 0)
{
if (PendingEvent())
{
SendToServer_ContinuePlaying();
#endif
+#if 1
+ /* restore deactivated drawing when quick-loading level tape recording */
+ if (tape.playing && tape.index_search)
+ {
+ SetDrawDeactivationMask(REDRAW_FIELD);
+ audio.sound_deactivated = TRUE;
+ }
+#endif
+
return result;
}
stepsize = 20; /* must be choosen to always draw last frame */
door_delay_value = 0;
+#if 0
StopSound(SND_DOOR_OPENING);
StopSound(SND_DOOR_CLOSING);
+#endif
}
if (global.autoplay_leveldir)
door_1.anim_mode == ANIM_VERTICAL ? DYSIZE : DXSIZE);
int x;
- if (!(door_state & DOOR_NO_DELAY))
+ if (!(door_state & DOOR_NO_DELAY) && !setup.quick_doors)
{
/* opening door sound has priority over simultaneously closing door */
if (door_state & (DOOR_OPEN_1 | DOOR_OPEN_2))
PlaySoundStereo(SND_DOOR_CLOSING, SOUND_MIDDLE);
}
- for(x = start; x <= end && !(door_1_done && door_2_done); x += stepsize)
+ for (x = start; x <= end && !(door_1_done && door_2_done); x += stepsize)
{
Bitmap *bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
GC gc = bitmap->stored_clip_gc;
}
}
+#if 0
if (setup.quick_doors)
{
StopSound(SND_DOOR_OPENING);
StopSound(SND_DOOR_CLOSING);
}
+#endif
if (door_state & DOOR_ACTION_1)
door1 = door_state & DOOR_ACTION_1;
{
int i;
- for (i=0; i<NUM_TOOL_BUTTONS; i++)
+ for (i = 0; i < NUM_TOOL_BUTTONS; i++)
{
Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
Bitmap *deco_bitmap = None;
{
int i;
- for (i=0; i<NUM_TOOL_BUTTONS; i++)
+ for (i = 0; i < NUM_TOOL_BUTTONS; i++)
FreeGadget(tool_gadget[i]);
}
{
int i;
- for (i=0; i<NUM_TOOL_BUTTONS; i++)
+ for (i = 0; i < NUM_TOOL_BUTTONS; i++)
UnmapGadget(tool_gadget[i]);
}