VX+VIDEO_CONTROL_XPOS,VY+VIDEO_CONTROL_YPOS);
}
}
+
if (redraw_mask & REDRAW_DOOR_3)
BlitBitmap(backbuffer, window, EX, EY, EXSIZE, EYSIZE, EX, EY);
+
redraw_mask &= ~REDRAW_DOORS;
}
if (redraw_mask & REDRAW_MICROLEVEL)
{
- BlitBitmap(backbuffer, window,
- MICROLEV_XPOS, MICROLEV_YPOS, MICROLEV_XSIZE, MICROLEV_YSIZE,
- MICROLEV_XPOS, MICROLEV_YPOS);
- BlitBitmap(backbuffer, window,
- SX, MICROLABEL_YPOS, SXSIZE, getFontHeight(FONT_SPECIAL_GAME),
- SX, MICROLABEL_YPOS);
+ BlitBitmap(backbuffer, window, SX, SY + 10 * TILEY, SXSIZE, 7 * TILEY,
+ SX, SY + 10 * TILEY);
+
redraw_mask &= ~REDRAW_MICROLEVEL;
}
info1[0] = '\0';
sprintf(text, "%.1f fps%s", global.frames_per_second, info1);
- DrawTextExt(window, SX, SY, text, FONT_DEFAULT_SMALL, FONT_OPAQUE);
+ DrawTextExt(window, SX, SY, text, FONT_TEXT_2, FONT_OPAQUE);
}
FlushDisplay();
void SetRandomAnimationValue(int x, int y)
{
- anim.random_frame = GfxRandom[x][y];
+ gfx.anim_random_frame = GfxRandom[x][y];
}
inline int getGraphicAnimationFrame(int graphic, int sync_frame)
int graphic;
int frame = 0;
boolean player_is_moving = (last_jx != jx || last_jy != jy ? TRUE : FALSE);
+ int current_action = ACTION_DEFAULT;
if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy)))
return;
if (element == EL_EXPLOSION)
return;
- /* draw things in the field the player is leaving, if needed */
+ current_action = (player->Pushing ? ACTION_PUSHING :
+ player->is_digging ? ACTION_DIGGING :
+ player->is_collecting ? ACTION_COLLECTING :
+ player->is_moving ? ACTION_MOVING :
+ player->snapped ? ACTION_SNAPPING : ACTION_DEFAULT);
+
+ InitPlayerGfxAnimation(player, current_action, player->MovDir);
+
+ /* ----------------------------------------------------------------------- */
+ /* draw things in the field the player is leaving, if needed */
+ /* ----------------------------------------------------------------------- */
if (player_is_moving)
{
{
DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]);
- if (last_element == EL_DYNAMITE_ACTIVE)
+ if (last_element == EL_DYNAMITE_ACTIVE ||
+ last_element == EL_SP_DISK_RED_ACTIVE)
DrawDynamite(last_jx, last_jy);
else
DrawLevelFieldThruMask(last_jx, last_jy);
}
- else if (last_element == EL_DYNAMITE_ACTIVE)
+ else if (last_element == EL_DYNAMITE_ACTIVE ||
+ last_element == EL_SP_DISK_RED_ACTIVE)
DrawDynamite(last_jx, last_jy);
else
DrawLevelField(last_jx, last_jy);
if (setup.direct_draw)
SetDrawtoField(DRAW_BUFFERED);
- /* draw things behind the player, if needed */
+ /* ----------------------------------------------------------------------- */
+ /* draw things behind the player, if needed */
+ /* ----------------------------------------------------------------------- */
if (Store[jx][jy])
DrawLevelElement(jx, jy, Store[jx][jy]);
- else if (!IS_ACTIVE_BOMB(element))
- DrawLevelField(jx, jy);
- else
+ else if (IS_ACTIVE_BOMB(element))
DrawLevelElement(jx, jy, EL_EMPTY);
-
- /* draw player himself */
-
- if (player->use_murphy_graphic)
+ else
{
- static int last_dir = MV_LEFT;
- int action = (player->programmed_action ? player->programmed_action :
- player->action);
- boolean action_moving =
- (player_is_moving ||
- ((action & (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)) &&
- !(action & ~(MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN))));
+ if (player_is_moving && GfxElement[jx][jy] != EL_UNDEFINED)
+ {
+ int old_element = GfxElement[jx][jy];
+ int old_graphic =
+ el_act_dir2img(old_element, ACTION_DIGGING, player->MovDir);
+ int frame = getGraphicAnimationFrame(old_graphic, player->StepFrame);
- graphic = IMG_SP_MURPHY;
+#if 0
+ Bitmap *src_bitmap;
+ int src_x, src_y;
+ int width = TILEX, height = TILEY;
+ int cx = 0, cy = 0;
- if (player->Pushing)
- {
- if (player->MovDir == MV_LEFT)
- graphic = IMG_SP_MURPHY_PUSHING_LEFT;
- else if (player->MovDir == MV_RIGHT)
- graphic = IMG_SP_MURPHY_PUSHING_RIGHT;
- else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_LEFT)
- graphic = IMG_SP_MURPHY_PUSHING_LEFT;
- else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT)
- graphic = IMG_SP_MURPHY_PUSHING_RIGHT;
- }
- else if (player->snapped)
- {
- if (player->MovDir == MV_LEFT)
- graphic = IMG_SP_MURPHY_SNAPPING_LEFT;
- else if (player->MovDir == MV_RIGHT)
- graphic = IMG_SP_MURPHY_SNAPPING_RIGHT;
- else if (player->MovDir == MV_UP)
- graphic = IMG_SP_MURPHY_SNAPPING_UP;
+ if (player->MovDir == MV_UP)
+ {
+ cy = player->GfxPos;
+ height -= cy;
+ }
else if (player->MovDir == MV_DOWN)
- graphic = IMG_SP_MURPHY_SNAPPING_DOWN;
+ {
+ cy = 0;
+ height = TILEY - player->GfxPos;
+ }
+ else if (player->MovDir == MV_LEFT)
+ {
+ cx = player->GfxPos;
+ width -= cx;
+ }
+ else if (player->MovDir == MV_RIGHT)
+ {
+ cx = 0;
+ width = TILEX - player->GfxPos;
+ }
+
+ getGraphicSource(old_graphic, frame, &src_bitmap, &src_x, &src_y);
+
+ BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy,
+ width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy);
+#else
+#if 0
+ printf("::: %d, %d, %d, %d => %d, %d [%d, %d, %d]\n",
+ old_element, ACTION_DIGGING, player->MovDir, player->Frame,
+ old_graphic, frame,
+ player->MovPos, player->GfxPos, player->StepFrame);
+#endif
+
+ DrawGraphic(sx, sy, old_graphic, frame);
+#endif
}
- else if (action_moving)
+ else
{
- if (player->MovDir == MV_LEFT)
- graphic = IMG_SP_MURPHY_MOVING_LEFT;
- else if (player->MovDir == MV_RIGHT)
- graphic = IMG_SP_MURPHY_MOVING_RIGHT;
- else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_LEFT)
- graphic = IMG_SP_MURPHY_MOVING_LEFT;
- else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT)
- graphic = IMG_SP_MURPHY_MOVING_RIGHT;
- else
- graphic = IMG_SP_MURPHY_MOVING_LEFT;
+ GfxElement[jx][jy] = EL_UNDEFINED;
- frame = getGraphicAnimationFrame(graphic, -1);
+ DrawLevelField(jx, jy);
}
+ }
+
+ /* ----------------------------------------------------------------------- */
+ /* draw player himself */
+ /* ----------------------------------------------------------------------- */
+
+ if (player->use_murphy_graphic)
+ {
+ static int last_horizontal_dir = MV_LEFT;
+ int direction;
if (player->MovDir == MV_LEFT || player->MovDir == MV_RIGHT)
- last_dir = player->MovDir;
+ last_horizontal_dir = player->MovDir;
+
+ direction = (player->snapped ? player->MovDir : last_horizontal_dir);
+
+ graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, direction);
}
else
- {
- if (player->MovDir == MV_LEFT)
- graphic = (player->Pushing ? IMG_PLAYER1_PUSHING_LEFT :
- player->is_digging ? IMG_PLAYER1_DIGGING_LEFT :
- player->is_moving ? IMG_PLAYER1_MOVING_LEFT :
- player->snapped ? IMG_PLAYER1_SNAPPING_LEFT :
- IMG_PLAYER1_LEFT);
- else if (player->MovDir == MV_RIGHT)
- graphic = (player->Pushing ? IMG_PLAYER1_PUSHING_RIGHT :
- player->is_digging ? IMG_PLAYER1_DIGGING_RIGHT :
- player->is_moving ? IMG_PLAYER1_MOVING_RIGHT :
- player->snapped ? IMG_PLAYER1_SNAPPING_RIGHT :
- IMG_PLAYER1_RIGHT);
- else if (player->MovDir == MV_UP)
- graphic = (player->Pushing ? IMG_PLAYER1_PUSHING_UP :
- player->is_digging ? IMG_PLAYER1_DIGGING_UP :
- player->is_moving ? IMG_PLAYER1_MOVING_UP :
- player->snapped ? IMG_PLAYER1_SNAPPING_UP :
- IMG_PLAYER1_UP);
- else /* MV_DOWN || MV_NO_MOVING */
- graphic = (player->Pushing ? IMG_PLAYER1_PUSHING_DOWN :
- player->is_digging ? IMG_PLAYER1_DIGGING_DOWN :
- player->is_moving ? IMG_PLAYER1_MOVING_DOWN :
- player->snapped ? IMG_PLAYER1_SNAPPING_DOWN :
- IMG_PLAYER1_DOWN);
-
- graphic = PLAYER_NR_GFX(graphic, player->index_nr);
+ graphic = el_act_dir2img(player->element_nr, player->GfxAction,
+ player->MovDir);
-#if 0
- frame = player->Frame;
-#else
- frame = getGraphicAnimationFrame(graphic, player->Frame);
-#endif
- }
+ frame = getGraphicAnimationFrame(graphic, player->Frame);
if (player->GfxPos)
{
if (!setup.soft_scrolling && ScreenMovPos)
sxx = syy = 0;
-#if 0
- if (player->Frame)
- printf("-> %d\n", player->Frame);
-#endif
-
DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING);
if (SHIELD_ON(player))
DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING);
}
-#if 0
- if (player->Pushing && player->GfxPos)
-#else
+ /* ----------------------------------------------------------------------- */
+ /* draw things the player is pushing, if needed */
+ /* ----------------------------------------------------------------------- */
+
if (player->Pushing && player_is_moving)
-#endif
{
int px = SCREENX(next_jx), py = SCREENY(next_jy);
{
int element = Feld[next_jx][next_jy];
int graphic = el2img(element);
-#if 1
int frame = 0;
-#endif
if ((sxx || syy) && IS_PUSHABLE(element))
{
graphic = el_act_dir2img(element, ACTION_MOVING, player->MovDir);
-#if 1
- frame = getGraphicAnimationFrame(graphic, player->GfxPos);
-
frame = getGraphicAnimationFrame(graphic, player->Frame);
-#endif
-
-#if 0
- printf("-> %d [%d]\n", player->Frame, player->GfxPos);
-#endif
-
-#if 0
- /* !!! FIX !!! */
- if (player->MovDir == MV_LEFT)
- frame = 3 - frame;
-#endif
-
-#if 0
- frame = (player->GfxPos / (TILEX / 4));
-
- if (player->MovDir == MV_RIGHT)
- frame = (frame + 4) % 4;
-#endif
}
DrawGraphicShifted(px, py, sxx, syy, graphic, frame,
}
}
- /* draw things in front of player (active dynamite or dynabombs) */
+ /* ----------------------------------------------------------------------- */
+ /* draw things in front of player (active dynamite or dynabombs) */
+ /* ----------------------------------------------------------------------- */
if (IS_ACTIVE_BOMB(element))
{
graphic = el2img(element);
-
-#if 0
- if (element == EL_DYNAMITE_ACTIVE)
- {
- if ((frame = (96 - MovDelay[jx][jy]) / 12) > 6)
- frame = 6;
- }
- else
- {
- if ((frame = ((96 - MovDelay[jx][jy]) / 6) % 8) > 3)
- frame = 7 - frame;
- }
-#else
-
-#if 0
- frame = getGraphicAnimationFrame(graphic, 96 - MovDelay[jx][jy]);
-#else
frame = getGraphicAnimationFrame(graphic, GfxFrame[jx][jy]);
-#endif
-
-#endif
if (game.emulation == EMU_SUPAPLEX)
DrawGraphic(sx, sy, IMG_SP_DISK_RED, frame);
DrawGraphicThruMask(SCREENX(last_jx), SCREENY(last_jy), graphic, frame);
}
- /* draw elements that stay over the player */
+ /* ----------------------------------------------------------------------- */
+ /* draw elements that stay over the player */
+ /* ----------------------------------------------------------------------- */
+
/* handle the field the player is leaving ... */
if (player_is_moving && IS_OVER_PLAYER(last_element))
DrawLevelField(last_jx, last_jy);
frame = getGraphicAnimationFrame(graphic, -1);
}
- if (element == EL_WALL_GROWING)
+ if (element == EL_EXPANDABLE_WALL)
{
boolean left_stopped = FALSE, right_stopped = FALSE;
graphic = IMG_WALL;
else if (left_stopped)
{
- graphic = IMG_WALL_GROWING_ACTIVE_RIGHT;
+ graphic = IMG_EXPANDABLE_WALL_GROWING_RIGHT;
frame = graphic_info[graphic].anim_frames - 1;
}
else if (right_stopped)
{
- graphic = IMG_WALL_GROWING_ACTIVE_LEFT;
+ graphic = IMG_EXPANDABLE_WALL_GROWING_LEFT;
frame = graphic_info[graphic].anim_frames - 1;
}
}
#if 0
- else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING)
+ else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DROPPING)
{
graphic = (element == EL_BD_AMOEBA ? IMG_BD_AMOEBA_PART1 :
element == EL_AMOEBA_WET ? IMG_AMOEBA_WET_PART1 :
#endif
#if 0
- if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING)
+ if (IS_AMOEBOID(element) || element == EL_AMOEBA_DROPPING)
{
- if (Feld[lx][ly] == EL_AMOEBA_DRIPPING)
+ if (Feld[lx][ly] == EL_AMOEBA_DROPPING)
printf("---> %d -> %d / %d [%d]\n",
element, graphic, frame, GfxRandom[lx][ly]);
}
element = Feld[lx][ly];
if (element == EL_SAND ||
+#if 1
+ (element == EL_EMPTY_SPACE && GfxElement[lx][ly] == EL_SAND) ||
+#endif
element == EL_LANDMINE ||
element == EL_TRAP ||
element == EL_TRAP_ACTIVE)
element = Feld[lxx][lyy];
if (element == EL_SAND ||
+#if 1
+ (element == EL_EMPTY_SPACE && GfxElement[lxx][lyy] == EL_SAND) ||
+#endif
element == EL_LANDMINE ||
element == EL_TRAP ||
element == EL_TRAP_ACTIVE)
if (!IN_LEV_FIELD(lxx, lyy) ||
(Feld[lxx][lyy] != EL_SAND &&
+#if 1
+ !(Feld[lxx][lyy] == EL_EMPTY_SPACE && GfxElement[lxx][lyy] == EL_SAND) &&
+#endif
Feld[lxx][lyy] != EL_LANDMINE &&
Feld[lxx][lyy] != EL_TRAP &&
Feld[lxx][lyy] != EL_TRAP_ACTIVE) ||
if (element == EL_QUICKSAND_EMPTYING ||
element == EL_MAGIC_WALL_EMPTYING ||
element == EL_BD_MAGIC_WALL_EMPTYING ||
- element == EL_AMOEBA_DRIPPING)
+ element == EL_AMOEBA_DROPPING)
cut_mode = CUT_ABOVE;
else if (element == EL_QUICKSAND_FILLING ||
element == EL_MAGIC_WALL_FILLING ||
if (element_old == EL_QUICKSAND_EMPTYING ||
element_old == EL_MAGIC_WALL_EMPTYING ||
element_old == EL_BD_MAGIC_WALL_EMPTYING ||
- element_old == EL_AMOEBA_DRIPPING)
+ element_old == EL_AMOEBA_DROPPING)
cut_mode = CUT_ABOVE;
DrawScreenElement(x, y, EL_EMPTY);
static void DrawMicroLevelLabelExt(int mode)
{
char label_text[MAX_OUTPUT_LINESIZE + 1];
- int max_len_label_text = SXSIZE / getFontWidth(FONT_SPECIAL_GAME);
+ int max_len_label_text;
+ int font_nr = FONT_TEXT_2;
+
+ if (mode == MICROLABEL_CREATED_BY || mode == MICROLABEL_IMPORTED_FROM)
+ font_nr = FONT_TEXT_3;
+
+ max_len_label_text = SXSIZE / getFontWidth(font_nr);
- DrawBackground(SX, MICROLABEL_YPOS, SXSIZE,getFontHeight(FONT_SPECIAL_GAME));
+ DrawBackground(SX, MICROLABEL_YPOS, SXSIZE, getFontHeight(font_nr));
strncpy(label_text, (mode == MICROLABEL_LEVEL_NAME ? level.name :
mode == MICROLABEL_CREATED_BY ? "created by" :
if (strlen(label_text) > 0)
{
- int text_width = strlen(label_text) * getFontWidth(FONT_SPECIAL_GAME);
+ int text_width = strlen(label_text) * getFontWidth(font_nr);
int lxpos = SX + (SXSIZE - text_width) / 2;
int lypos = MICROLABEL_YPOS;
- DrawText(lxpos, lypos, label_text, FONT_SPECIAL_GAME);
+ DrawText(lxpos, lypos, label_text, font_nr);
}
redraw_mask |= REDRAW_MICROLEVEL;
static unsigned long label_delay = 0;
static int from_x, from_y, scroll_direction;
static int label_state, label_counter;
+ int last_game_status = game_status; /* save current game status */
+
+ game_status = PSEUDO_PREVIEW; /* force PREVIEW font on preview level */
if (restart)
{
DelayReached(&scroll_delay, 0);
DelayReached(&label_delay, 0);
+ if (leveldir_current->name)
+ {
+ int len = strlen(leveldir_current->name);
+ int lxpos = SX + (SXSIZE - len * getFontWidth(FONT_TEXT_1)) / 2;
+ int lypos = SY + 352;
+
+ DrawText(lxpos, lypos, leveldir_current->name, FONT_TEXT_1);
+ }
+
+ game_status = last_game_status; /* restore current game status */
+
return;
}
MICROLABEL_LEVEL_IMPORT_INFO : MICROLABEL_EMPTY);
DrawMicroLevelLabelExt(label_state);
}
+
+ game_status = last_game_status; /* restore current game status */
}
int REQ_in_range(int x, int y)
{
int mx, my, ty, result = -1;
unsigned int old_door_state;
+ int last_game_status = game_status; /* save current game status */
#if defined(PLATFORM_UNIX)
/* pause network game while waiting for request to answer */
/* clear door drawing field */
DrawBackground(DX, DY, DXSIZE, DYSIZE);
+ game_status = PSEUDO_DOOR; /* force DOOR font on preview level */
+
/* write text for request */
for(ty=0; ty < MAX_REQUEST_LINES; ty++)
{
strncpy(text_line, text, tl);
text_line[tl] = 0;
- DrawText(DX + 50 - (tl * 14)/2, DY + 8 + ty * 16,
- text_line, FONT_DEFAULT_SMALL);
+ DrawText(DX + (DXSIZE - tl * getFontWidth(FONT_TEXT_2)) / 2,
+ DY + 8 + ty * (getFontHeight(FONT_TEXT_2) + 2),
+ text_line, FONT_TEXT_2);
text += tl + (tc == ' ' ? 1 : 0);
}
+ game_status = last_game_status; /* restore current game status */
+
if (req_state & REQ_ASK)
{
MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
static int door1 = DOOR_OPEN_1;
static int door2 = DOOR_CLOSE_2;
static unsigned long door_delay = 0;
- int x, start, stepsize = 2;
- unsigned long door_delay_value = stepsize * 5;
+ int x, start, stepsize = global.door_step_offset;
+ unsigned long door_delay_value = global.door_step_delay;
if (door_state == DOOR_GET_STATE)
return(door1 | door2);
stepsize = 20;
door_delay_value = 0;
- StopSound(SND_MENU_DOOR_OPENING);
- StopSound(SND_MENU_DOOR_CLOSING);
+ StopSound(SND_DOOR_OPENING);
+ StopSound(SND_DOOR_CLOSING);
}
if (global.autoplay_leveldir)
{
/* opening door sound has priority over simultaneously closing door */
if (door_state & (DOOR_OPEN_1 | DOOR_OPEN_2))
- PlaySoundStereo(SND_MENU_DOOR_OPENING, SOUND_MAX_RIGHT);
+ PlaySoundStereo(SND_DOOR_OPENING, SOUND_MIDDLE);
else if (door_state & (DOOR_CLOSE_1 | DOOR_CLOSE_2))
- PlaySoundStereo(SND_MENU_DOOR_CLOSING, SOUND_MAX_RIGHT);
+ PlaySoundStereo(SND_DOOR_CLOSING, SOUND_MIDDLE);
}
start = ((door_state & DOOR_NO_DELAY) ? DXSIZE : 0);
if (setup.quick_doors)
{
- StopSound(SND_MENU_DOOR_OPENING);
- StopSound(SND_MENU_DOOR_CLOSING);
+ StopSound(SND_DOOR_OPENING);
+ StopSound(SND_DOOR_CLOSING);
}
if (door_state & DOOR_ACTION_1)
{
int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
- getMiniGraphicSource(PLAYER_NR_GFX(IMG_PLAYER1, player_nr),
+ getMiniGraphicSource(PLAYER_NR_GFX(IMG_PLAYER_1, player_nr),
&deco_bitmap, &deco_x, &deco_y);
deco_xpos = (toolbutton_info[i].width - MINI_TILEX) / 2;
deco_ypos = (toolbutton_info[i].height - MINI_TILEY) / 2;
case EL_MAGIC_WALL_EMPTYING: return EL_MAGIC_WALL_ACTIVE;
case EL_BD_MAGIC_WALL_FILLING: return EL_BD_MAGIC_WALL_FULL;
case EL_BD_MAGIC_WALL_EMPTYING: return EL_BD_MAGIC_WALL_ACTIVE;
- case EL_AMOEBA_DRIPPING: return EL_AMOEBA_WET;
+ case EL_AMOEBA_DROPPING: return EL_AMOEBA_WET;
default: return element;
}
int el2edimg(int element)
{
- return element_info[element].editor_graphic;
+ return element_info[element].special_graphic[GFX_SPECIAL_ARG_EDITOR];
}
int el2preimg(int element)
{
- return element_info[element].preview_graphic;
+ return element_info[element].special_graphic[GFX_SPECIAL_ARG_PREVIEW];
}