-#define COMPILE_DATE_STRING "[2003-03-06 01:59]"
+#define COMPILE_DATE_STRING "[2003-03-06 23:15]"
player->Pushing = FALSE;
player->Switching = FALSE;
player->GfxPos = 0;
- player->Frame = 0;
-
+ player->GfxDir = MV_NO_MOVING;
player->GfxAction = ACTION_DEFAULT;
+ player->Frame = 0;
+ player->StepFrame = 0;
player->use_murphy_graphic = FALSE;
player->use_disk_red_graphic = FALSE;
return position;
}
-static void InitPlayerGfxAnimation(struct PlayerInfo *player, int action)
+void InitPlayerGfxAnimation(struct PlayerInfo *player, int action, int dir)
{
- if (player->GfxAction != action)
+ if (player->GfxAction != action || player->GfxDir != dir)
{
+#if 0
+ printf("Player frame reset! (%d => %d, %d => %d)\n",
+ player->GfxAction, action, player->GfxDir, dir);
+#endif
+
player->GfxAction = action;
+ player->GfxDir = dir;
player->Frame = 0;
+ player->StepFrame = 0;
}
}
CheckGravityMovement(player);
if (player->MovPos == 0)
- InitPlayerGfxAnimation(player, ACTION_DEFAULT);
+ {
+#if 0
+ printf("Trying... Player frame reset\n");
+#endif
+
+ InitPlayerGfxAnimation(player, ACTION_DEFAULT, player->MovDir);
+ }
if (player->MovPos == 0) /* needed for tape.playing */
player->is_moving = FALSE;
redraw_mask |= REDRAW_FPS;
}
+#if 0
+ if (stored_player[0].jx != stored_player[0].last_jx ||
+ stored_player[0].jy != stored_player[0].last_jy)
+ printf("::: %d, %d, %d, %d, %d\n",
+ stored_player[0].MovDir,
+ stored_player[0].MovPos,
+ stored_player[0].GfxPos,
+ stored_player[0].Frame,
+ stored_player[0].StepFrame);
+#endif
+
#if 1
FrameCounter++;
TimeFrames++;
for (i=0; i<MAX_PLAYERS; i++)
- stored_player[i].Frame++;
+ {
+ int move_frames =
+ MOVE_DELAY_NORMAL_SPEED / stored_player[i].move_delay_value;
+
+ stored_player[i].Frame += move_frames;
+
+ if (stored_player[i].MovPos != 0)
+ stored_player[i].StepFrame += move_frames;
+ }
#endif
}
}
}
-#if 1
+#if 0
#if 1
InitPlayerGfxAnimation(player, ACTION_DEFAULT);
#else
#endif
#endif
+ player->StepFrame = 0;
+
if (moved & MF_MOVING)
{
if (old_jx != jx && old_jy == jy)
dy == +1 ? MV_DOWN : MV_NO_MOVING);
int element;
- player->is_digging = FALSE;
+ if (player->MovPos == 0)
+ player->is_digging = FALSE;
if (player->MovPos == 0)
player->Pushing = FALSE;
player->Pushing = FALSE;
player->snapped = FALSE;
- player->is_digging = FALSE;
+
+ if (player->MovPos == 0)
+ player->is_digging = FALSE;
+
return FALSE;
}
void InitAmoebaNr(int, int);
void GameWon(void);
int NewHiScore(void);
+
+void InitPlayerGfxAnimation(struct PlayerInfo *, int, int);
void InitMovingField(int, int, int);
void Moving2Blocked(int, int, int *, int *);
void Blocked2Moving(int, int, int *, int *);
through doors); overrides other actions */
int jx,jy, last_jx,last_jy;
- int MovDir, MovPos, GfxPos;
- int Frame;
+ int MovDir, MovPos, GfxDir, GfxPos;
+ int Frame, StepFrame;
int GfxAction;
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;
+ current_action = (player->Pushing ? ACTION_PUSHING :
+ player->is_digging ? ACTION_DIGGING :
+ 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 */
/* ----------------------------------------------------------------------- */
int old_element = GfxElement[jx][jy];
int old_graphic =
el_act_dir2img(old_element, ACTION_DIGGING, player->MovDir);
- int frame = getGraphicAnimationFrame(old_graphic, player->Frame);
+ int frame = getGraphicAnimationFrame(old_graphic, player->StepFrame);
+
#if 0
Bitmap *src_bitmap;
int src_x, src_y;
width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy);
#else
#if 0
- printf("::: %d, %d, %d, %d => %d, %d [%d]\n",
+ printf("::: %d, %d, %d, %d => %d, %d [%d, %d, %d]\n",
old_element, ACTION_DIGGING, player->MovDir, player->Frame,
old_graphic, frame,
- player->GfxPos);
+ player->MovPos, player->GfxPos, player->StepFrame);
#endif
DrawGraphic(sx, sy, old_graphic, frame);
/* draw player himself */
/* ----------------------------------------------------------------------- */
- player->GfxAction = (player->Pushing ? ACTION_PUSHING :
- player->is_digging ? ACTION_DIGGING :
- player->is_moving ? ACTION_MOVING :
- player->snapped ? ACTION_SNAPPING : ACTION_DEFAULT);
-
if (player->use_murphy_graphic)
{
static int last_horizontal_dir = MV_LEFT;