void DrawPlayer(struct PlayerInfo *player)
{
+ int jx = player->jx;
+ int jy = player->jy;
+ int move_dir = player->MovDir;
#if 0
- int jx = player->jx, jy = player->jy;
- int last_jx = player->last_jx, last_jy = player->last_jy;
- int next_jx = jx + (jx - last_jx), next_jy = jy + (jy - last_jy);
- int sx = SCREENX(jx), sy = SCREENY(jy);
- int sxx = 0, syy = 0;
- int element = Feld[jx][jy], last_element = Feld[last_jx][last_jy];
- int graphic;
- int frame = 0;
+ int last_jx = player->last_jx;
+ int last_jy = player->last_jy;
+ int next_jx = jx + (jx - last_jx);
+ int next_jy = jy + (jy - last_jy);
boolean player_is_moving = (last_jx != jx || last_jy != jy ? TRUE : FALSE);
- int move_dir = player->MovDir;
- int action = ACTION_DEFAULT;
#else
- int jx = player->jx, jy = player->jy;
- int move_dir = player->MovDir;
int dx = (move_dir == MV_LEFT ? -1 : move_dir == MV_RIGHT ? +1 : 0);
int dy = (move_dir == MV_UP ? -1 : move_dir == MV_DOWN ? +1 : 0);
int last_jx = (player->is_moving ? jx - dx : jx);
int last_jy = (player->is_moving ? jy - dy : jy);
int next_jx = jx + dx;
int next_jy = jy + dy;
+ boolean player_is_moving = (player->MovPos ? TRUE : FALSE);
+#endif
int sx = SCREENX(jx), sy = SCREENY(jy);
int sxx = 0, syy = 0;
int element = Feld[jx][jy], last_element = Feld[last_jx][last_jy];
int graphic;
- int frame = 0;
- boolean player_is_moving = (player->MovPos ? TRUE : FALSE);
int action = ACTION_DEFAULT;
-#endif
+ int frame = 0;
if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy)))
return;
#if DEBUG
- if (!IN_LEV_FIELD(jx,jy))
+ if (!IN_LEV_FIELD(jx, jy))
{
printf("DrawPlayerField(): x = %d, y = %d\n",jx,jy);
printf("DrawPlayerField(): sx = %d, sy = %d\n",sx,sy);
if (element == EL_EXPLOSION)
return;
- action = (player->Pushing ? ACTION_PUSHING :
- player->is_digging ? ACTION_DIGGING :
+ action = (player->is_pushing ? ACTION_PUSHING :
+ player->is_digging ? ACTION_DIGGING :
player->is_collecting ? ACTION_COLLECTING :
- player->is_moving ? ACTION_MOVING :
- player->snapped ? ACTION_SNAPPING : ACTION_DEFAULT);
+ player->is_moving ? ACTION_MOVING :
+ player->is_snapping ? ACTION_SNAPPING : ACTION_DEFAULT);
#if 0
printf("::: '%s'\n", element_action_info[action].suffix);
else
DrawLevelField(last_jx, last_jy);
- if (player->Pushing && IN_SCR_FIELD(SCREENX(next_jx), SCREENY(next_jy)))
- {
-#if 1
-#if 1
+ if (player->is_pushing && IN_SCR_FIELD(SCREENX(next_jx), SCREENY(next_jy)))
DrawLevelElement(next_jx, next_jy, EL_EMPTY);
-#else
- if (player->GfxPos)
- {
- if (Feld[next_jx][next_jy] == EL_SOKOBAN_FIELD_FULL)
- DrawLevelElement(next_jx, next_jy, EL_SOKOBAN_FIELD_EMPTY);
- else
- DrawLevelElement(next_jx, next_jy, EL_EMPTY);
- }
- else
- DrawLevelField(next_jx, next_jy);
-#endif
-#endif
- }
}
if (!IN_SCR_FIELD(sx, sy))
{
if (player_is_moving && GfxElement[jx][jy] != EL_UNDEFINED)
{
-#if 1
if (GFX_CRUMBLED(GfxElement[jx][jy]))
DrawLevelFieldCrumbledSandDigging(jx, jy, move_dir, player->StepFrame);
-#else
- if (GfxElement[jx][jy] == EL_SAND)
- DrawLevelFieldCrumbledSandDigging(jx, jy, move_dir, player->StepFrame);
-#endif
else
{
int old_element = GfxElement[jx][jy];
if (player->use_murphy_graphic)
{
static int last_horizontal_dir = MV_LEFT;
- int direction;
if (move_dir == MV_LEFT || move_dir == MV_RIGHT)
last_horizontal_dir = move_dir;
- direction = (player->snapped ? move_dir : last_horizontal_dir);
+ graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, move_dir);
+
+ if (graphic == IMG_SP_MURPHY) /* undefined => use special graphic */
+ {
+ int direction = (player->is_snapping ? move_dir : last_horizontal_dir);
- graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, direction);
+ graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, direction);
+ }
}
else
graphic = el_act_dir2img(player->element_nr, player->GfxAction, move_dir);
#if 0
printf("::: %d, %d [%d, %d] [%d]\n",
- player->Pushing, player_is_moving, player->GfxAction,
+ player->is_pushing, player_is_moving, player->GfxAction,
player->is_moving, player_is_moving);
#endif
#if 1
- if (player->Pushing && player->is_moving)
+ if (player->is_pushing && player->is_moving)
#else
- if (player->Pushing && player_is_moving)
+ if (player->is_pushing && player_is_moving)
#endif
{
int px = SCREENX(next_jx), py = SCREENY(next_jy);
if (Back[next_jx][next_jy])
DrawLevelElement(next_jx, next_jy, Back[next_jx][next_jy]);
-#if 1
if ((sxx || syy) && element == EL_SOKOBAN_OBJECT)
DrawGraphicShiftedThruMask(px, py, sxx, syy, IMG_SOKOBAN_OBJECT, 0,
NO_CUTTING);
-#else
- if ((sxx || syy) &&
- (element == EL_SOKOBAN_FIELD_EMPTY ||
- Feld[next_jx][next_jy] == EL_SOKOBAN_FIELD_FULL))
- DrawGraphicShiftedThruMask(px, py, sxx, syy, IMG_SOKOBAN_OBJECT, 0,
- NO_CUTTING);
-#endif
else
{
-#if 1
int element = MovingOrBlocked2Element(next_jx, next_jy);
-#else
-#if 1
- int element = Feld[jx][jy];
-#else
- int element = Feld[next_jx][next_jy];
-#endif
-#endif
-
-#if 1
- int graphic = el2img(element);
- int frame = 0;
-
-#if 0
- if ((sxx || syy) && IS_PUSHABLE(element))
-#endif
- {
- graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir);
- frame = getGraphicAnimationFrame(graphic, player->Frame);
- }
-
-#if 0
- printf("::: pushing %d: %d ...\n", sxx, frame);
-#endif
+ int graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir);
+ int frame = getGraphicAnimationFrame(graphic, player->Frame);
DrawGraphicShifted(px, py, sxx, syy, graphic, frame,
NO_CUTTING, NO_MASKING);
-#endif
}
}
if (player_is_moving && last_element == EL_EXPLOSION)
{
-#if 1
int graphic = el_act2img(GfxElement[last_jx][last_jy], ACTION_EXPLODING);
-#else
- int stored = Store[last_jx][last_jy];
- int graphic = (game.emulation != EMU_SUPAPLEX ? IMG_EXPLOSION :
- stored == EL_SP_INFOTRON ? IMG_SP_EXPLOSION_INFOTRON :
- IMG_SP_EXPLOSION);
-#endif
int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2);
int phase = ExplodePhase[last_jx][last_jy] - 1;
int frame = getGraphicAnimationFrame(graphic, phase - delay);
{
int font_width = getFontWidth(font_nr);
int font_height = getFontHeight(font_nr);
- int graphic = IMG_GAME_ENVELOPE_1_BACKGROUND + envelope_nr;
+ int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr;
Bitmap *src_bitmap;
int src_x, src_y;
int dst_x = SX + startx + x * font_width;
dst_x, dst_y);
}
-void ShowEnvelope(int envelope_nr)
+void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
{
- int element = EL_ENVELOPE_1 + envelope_nr;
- int graphic = IMG_GAME_ENVELOPE_1_BACKGROUND + envelope_nr;
- int sound_opening = element_info[element].sound[ACTION_OPENING];
- int sound_closing = element_info[element].sound[ACTION_CLOSING];
+ int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr;
boolean draw_masked = graphic_info[graphic].draw_masked;
- int anim_mode = graphic_info[graphic].anim_mode;
int mask_mode = (draw_masked ? BLIT_MASKED : BLIT_ON_BACKGROUND);
- int font_nr = FONT_TEXT_1;
- int font_width = getFontWidth(font_nr);
- int font_height = getFontHeight(font_nr);
boolean ffwd_delay = (tape.playing && tape.fast_forward);
unsigned long anim_delay = 0;
int anim_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
- int wait_delay_value = (ffwd_delay ? 500 : 1000);
- int start_pos_vertically = 0;
- int i, x, y;
-
- game.envelope_active = TRUE;
-
- if (anim_mode != ANIM_NONE)
- PlaySoundStereo(sound_opening, SOUND_MIDDLE);
-
- if (anim_mode == ANIM_DEFAULT)
- {
- /* open envelope window horizontally */
- for (i = 0; i <= level.envelope_xsize[envelope_nr]; i++)
- {
- int xsize = i + 2;
- int ysize = 2;
- int startx = (SXSIZE - xsize * font_width) / 2;
- int starty = (SYSIZE - ysize * font_height) / 2;
-
- SetDrawtoField(DRAW_BUFFERED);
-
- BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
-
- SetDrawtoField(DRAW_BACKBUFFER);
-
- for (y=0; y < ysize; y++) for (x=0; x < xsize; x++)
- DrawEnvelopeBackground(envelope_nr, startx, starty, x, y, xsize, ysize,
- font_nr);
-
- redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
- BackToFront();
-
- WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
- }
- }
-
- if (anim_mode == ANIM_NONE)
- start_pos_vertically = level.envelope_ysize[envelope_nr];
+ int font_nr = FONT_ENVELOPE_1 + envelope_nr;
+ int font_width = getFontWidth(font_nr);
+ int font_height = getFontHeight(font_nr);
+ int max_xsize = level.envelope_xsize[envelope_nr];
+ int max_ysize = level.envelope_ysize[envelope_nr];
+ int xstart = (anim_mode & ANIM_VERTICAL ? max_xsize : 0);
+ int ystart = (anim_mode & ANIM_HORIZONTAL ? max_ysize : 0);
+ int xend = max_xsize;
+ int yend = (anim_mode != ANIM_DEFAULT ? max_ysize : 0);
+ int xstep = (xstart < xend ? 1 : 0);
+ int ystep = (ystart < yend || xstep == 0 ? 1 : 0);
+ int x, y;
- /* open envelope window vertically */
- for (i = start_pos_vertically; i <= level.envelope_ysize[envelope_nr]; i++)
+ for (x=xstart, y=ystart; x <= xend && y <= yend; x += xstep, y += ystep)
{
- int xsize = level.envelope_xsize[envelope_nr] + 2;
- int ysize = i + 2;
- int startx = (SXSIZE - xsize * font_width) / 2;
- int starty = (SYSIZE - ysize * font_height) / 2;
+ int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
+ int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2;
+ int sx = (SXSIZE - xsize * font_width) / 2;
+ int sy = (SYSIZE - ysize * font_height) / 2;
+ int xx, yy;
SetDrawtoField(DRAW_BUFFERED);
SetDrawtoField(DRAW_BACKBUFFER);
- for (y=0; y < ysize; y++) for (x=0; x < xsize; x++)
- DrawEnvelopeBackground(envelope_nr, startx, starty, x, y, xsize, ysize,
- font_nr);
+ 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 + startx + font_width, SY + starty + font_height,
- level.envelope_text[envelope_nr], FONT_TEXT_1,
- level.envelope_xsize[envelope_nr], i, mask_mode);
+ DrawTextToTextArea(SX + sx + font_width, SY + sy + font_height,
+ level.envelope_text[envelope_nr], font_nr, max_xsize,
+ xsize - 2, ysize - 2, mask_mode);
redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
BackToFront();
- WaitUntilDelayReached(&anim_delay, anim_delay_value);
+ WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
}
+}
- if (tape.playing)
- Delay(wait_delay_value);
- else
- WaitForEventToContinue();
-
- if (anim_mode != ANIM_NONE)
- PlaySoundStereo(sound_closing, SOUND_MIDDLE);
-
- if (anim_mode != ANIM_NONE)
- {
- /* close envelope window vertically */
- for (i = level.envelope_ysize[envelope_nr]; i >= 0; i--)
- {
- int xsize = level.envelope_xsize[envelope_nr] + 2;
- int ysize = i + 2;
- int startx = (SXSIZE - xsize * font_width) / 2;
- int starty = (SYSIZE - ysize * font_height) / 2;
-
- SetDrawtoField(DRAW_BUFFERED);
-
- BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
-
- SetDrawtoField(DRAW_BACKBUFFER);
-
- for (y=0; y < ysize; y++) for (x=0; x < xsize; x++)
- DrawEnvelopeBackground(envelope_nr, startx, starty, x, y, xsize, ysize,
- font_nr);
+void ShowEnvelope(int envelope_nr)
+{
+ int element = EL_ENVELOPE_1 + envelope_nr;
+ int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr;
+ 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);
+ 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);
- DrawTextToTextArea(SX + startx + font_width, SY + starty + font_height,
- level.envelope_text[envelope_nr], FONT_TEXT_1,
- level.envelope_xsize[envelope_nr], i, mask_mode);
+ game.envelope_active = TRUE; /* needed for RedrawPlayfield() events */
- redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
- BackToFront();
-
- WaitUntilDelayReached(&anim_delay, anim_delay_value);
- }
- }
+ PlaySoundStereo(sound_opening, SOUND_MIDDLE);
if (anim_mode == ANIM_DEFAULT)
- {
- /* close envelope window horizontally */
- for (i = level.envelope_xsize[envelope_nr]; i >= 0; i--)
- {
- int xsize = i + 2;
- int ysize = 2;
- int startx = (SXSIZE - xsize * font_width) / 2;
- int starty = (SYSIZE - ysize * font_height) / 2;
+ AnimateEnvelope(envelope_nr, ANIM_DEFAULT, ACTION_OPENING);
- SetDrawtoField(DRAW_BUFFERED);
+ AnimateEnvelope(envelope_nr, main_anim_mode, ACTION_OPENING);
- BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
-
- SetDrawtoField(DRAW_BACKBUFFER);
+ if (tape.playing)
+ Delay(wait_delay_value);
+ else
+ WaitForEventToContinue();
- for (y=0; y < ysize; y++) for (x=0; x < xsize; x++)
- DrawEnvelopeBackground(envelope_nr, startx, starty, x, y, xsize, ysize,
- font_nr);
+ PlaySoundStereo(sound_closing, SOUND_MIDDLE);
- redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
- BackToFront();
+ if (anim_mode != ANIM_NONE)
+ AnimateEnvelope(envelope_nr, main_anim_mode, ACTION_CLOSING);
- WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
- }
- }
+ if (anim_mode == ANIM_DEFAULT)
+ AnimateEnvelope(envelope_nr, ANIM_DEFAULT, ACTION_CLOSING);
game.envelope_active = FALSE;
static int door1 = DOOR_OPEN_1;
static int door2 = DOOR_CLOSE_2;
unsigned long door_delay = 0;
- unsigned long door_delay_value = door_1.step_delay;
+ unsigned long door_delay_value;
int stepsize = 1;
if (door_state == DOOR_GET_STATE)
else if (door2 == DOOR_CLOSE_2 && door_state & DOOR_CLOSE_2)
door_state &= ~DOOR_CLOSE_2;
+ door_delay_value = (door_state & DOOR_ACTION_1 ? door_1.step_delay :
+ door_2.step_delay);
+
if (setup.quick_doors)
{
stepsize = 20; /* must be choosen to always draw last frame */