+void ScrollFigure(int init)
+{
+ static long actual_frame_counter = 0;
+ static int oldJX = -1, oldJY = -1;
+
+ if (init)
+ {
+
+
+
+ PlayerGfxPos = ScrollStepSize * (PlayerMovPos / ScrollStepSize);
+
+
+
+ /*
+ ScreenMovPos = PlayerGfxPos;
+ redraw_mask |= REDRAW_FIELD;
+ */
+
+
+
+ if (0)
+ {
+ static long last_Counter = 0;
+ long new_Counter = Counter();
+
+ printf("--> %ld / %ld [%d, %d]\n",
+ new_Counter - last_Counter,
+ new_Counter,
+ FrameCounter,
+ tst2);
+ last_Counter = new_Counter;
+ }
+
+
+
+
+ if (oldJX != -1 && oldJY != -1)
+ DrawLevelElement(oldJX,oldJY, Feld[oldJX][oldJY]);
+
+ if (Feld[lastJX][lastJY] == EL_LEERRAUM &&
+ IN_LEV_FIELD(lastJX,lastJY-1) &&
+ CAN_FALL(Feld[lastJX][lastJY-1]))
+ Feld[lastJX][lastJY] = EL_PLAYER_IS_LEAVING;
+ DrawLevelElement(lastJX,lastJY, Feld[lastJX][lastJY]);
+ DrawPlayerField();
+
+ oldJX = lastJX;
+ oldJY = lastJY;
+ actual_frame_counter = FrameCounter;
+
+ if (PlayerPushing)
+ {
+ int nextJX = JX + (JX - lastJX);
+ int nextJY = JY + (JY - lastJY);
+
+ if (Feld[nextJX][nextJY] == EL_SOKOBAN_FELD_VOLL)
+ DrawLevelElement(nextJX,nextJY, EL_SOKOBAN_FELD_LEER);
+ else
+ DrawLevelElement(nextJX,nextJY, EL_LEERRAUM);
+ }
+
+ DrawPlayerField();
+
+ if (Store[lastJX][lastJY])
+ {
+ DrawGraphic(SCROLLX(lastJX),SCROLLY(lastJY),
+ el2gfx(Store[lastJX][lastJY]));
+ DrawGraphicThruMask(SCROLLX(lastJX),SCROLLY(lastJY),
+ el2gfx(Feld[lastJX][lastJY]));
+ }
+ else if (Feld[lastJX][lastJY]==EL_DYNAMIT)
+ DrawDynamite(lastJX,lastJY);
+ else
+ DrawLevelField(lastJX,lastJY);
+
+ return;
+ }
+ else if (!FrameReached(&actual_frame_counter,1))
+ return;
+
+ PlayerMovPos += (PlayerMovPos > 0 ? -1 : 1) * TILEX/8;
+ PlayerGfxPos = ScrollStepSize * (PlayerMovPos / ScrollStepSize);
+
+
+ /*
+ printf("PlayerGfxPos = %d\n", PlayerGfxPos);
+ */
+
+
+ if (ScreenMovPos && ScreenMovPos != PlayerGfxPos)
+ {
+ ScreenMovPos = PlayerGfxPos;
+ redraw_mask |= REDRAW_FIELD;
+ }
+
+ if (Feld[oldJX][oldJY] == EL_PLAYER_IS_LEAVING)
+ Feld[oldJX][oldJY] = EL_LEERRAUM;
+
+ DrawLevelElement(oldJX,oldJY, Feld[oldJX][oldJY]);
+ DrawPlayerField();
+
+
+
+ if (Store[oldJX][oldJY])
+ {
+ DrawGraphic(SCROLLX(oldJX),SCROLLY(oldJY),el2gfx(Store[oldJX][oldJY]));
+ DrawGraphicThruMask(SCROLLX(oldJX),SCROLLY(oldJY),
+ el2gfx(Feld[oldJX][oldJY]));
+ }
+ else if (Feld[oldJX][oldJY]==EL_DYNAMIT)
+ DrawDynamite(oldJX,oldJY);
+ else
+ DrawLevelField(oldJX,oldJY);
+
+ if (PlayerPushing)
+ {
+ int nextJX = JX + (JX - lastJX);
+ int nextJY = JY + (JY - lastJY);
+
+ if (PlayerGfxPos)
+ {
+ if (Feld[nextJX][nextJY] == EL_SOKOBAN_FELD_VOLL)
+ DrawLevelElement(nextJX,nextJY, EL_SOKOBAN_FELD_LEER);
+ else
+ DrawLevelElement(nextJX,nextJY, EL_LEERRAUM);
+ }
+ else
+ DrawLevelElement(nextJX,nextJY, Feld[nextJX][nextJY]);
+ }
+
+ if (!PlayerMovPos)
+ {
+ lastJX = JX;
+ lastJY = JY;
+
+ oldJX = oldJY = -1;
+ }
+}
+