X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Ftools.c;h=144bce2afeb7dc36852b81bc32cb66192fe3b405;hb=7530e229728f4d1ea54ab8e4393029f34a4a2618;hp=a3e5306835f7082e83a21f22c3dc053f13f5257d;hpb=1e23125074b86c5eb1254037a81a3e9062152b7f;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index a3e53068..144bce2a 100644 --- a/src/tools.c +++ b/src/tools.c @@ -1490,8 +1490,9 @@ int getGraphicAnimationFrameXY(int graphic, int lx, int ly) int ysize = MAX(1, g->anim_frames / xsize); int xoffset = g->anim_start_frame % xsize; int yoffset = g->anim_start_frame % ysize; - int x = (lx + xoffset + xsize) % xsize; - int y = (ly + yoffset + ysize) % ysize; + // may be needed if screen field is significantly larger than playfield + int x = (lx + xoffset + SCR_FIELDX * xsize) % xsize; + int y = (ly + yoffset + SCR_FIELDY * ysize) % ysize; int sync_frame = y * xsize + x; return sync_frame % g->anim_frames; @@ -1499,14 +1500,19 @@ int getGraphicAnimationFrameXY(int graphic, int lx, int ly) else if (graphic_info[graphic].anim_mode & ANIM_RANDOM_STATIC) { struct GraphicInfo *g = &graphic_info[graphic]; - int x = (lx + lev_fieldx) % lev_fieldx; - int y = (ly + lev_fieldy) % lev_fieldy; + // may be needed if screen field is significantly larger than playfield + int x = (lx + SCR_FIELDX * lev_fieldx) % lev_fieldx; + int y = (ly + SCR_FIELDY * lev_fieldy) % lev_fieldy; int sync_frame = GfxRandomStatic[x][y]; return sync_frame % g->anim_frames; } + else + { + int sync_frame = (IN_LEV_FIELD(lx, ly) ? GfxFrame[lx][ly] : -1); - return getGraphicAnimationFrame(graphic, GfxFrame[lx][ly]); + return getGraphicAnimationFrame(graphic, sync_frame); + } } void getGraphicSourceBitmap(int graphic, int tilesize, Bitmap **bitmap) @@ -1996,11 +2002,11 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, int graphic; int frame; - if (element == EL_EMPTY) - element = GfxElementEmpty[lx][ly]; - if (IN_LEV_FIELD(lx, ly)) { + if (element == EL_EMPTY) + element = GfxElementEmpty[lx][ly]; + SetRandomAnimationValue(lx, ly); graphic = el_act_dir2img(element, GfxAction[lx][ly], GfxDir[lx][ly]); @@ -3960,6 +3966,9 @@ void DrawLevelGraphicAnimationIfNeeded(int x, int y, int graphic) if (!IN_LEV_FIELD(x, y) || !IN_SCR_FIELD(sx, sy)) return; + if (Tile[x][y] == EL_EMPTY) + graphic = el2img(GfxElementEmpty[x][y]); + if (!IS_NEW_FRAME(GfxFrame[x][y], graphic)) return; @@ -5378,7 +5387,6 @@ unsigned int MoveDoor(unsigned int door_state) int num_move_steps = 0; // number of animation steps for all doors int max_move_delay_doors_only = 0; // delay for doors only (no panel) int num_move_steps_doors_only = 0; // steps for doors only (no panel) - int current_move_delay = 0; int start = 0; int k; @@ -5638,8 +5646,6 @@ unsigned int MoveDoor(unsigned int door_state) SkipUntilDelayReached(&door_delay, door_delay_value, &k, last_frame); - current_move_delay += max_step_delay; - // prevent OS (Windows) from complaining about program not responding CheckQuitEvent(); } @@ -9954,7 +9960,7 @@ static const unsigned __int64 epoch = ((unsigned __int64) 116444736000000000ULL) * Note: this function is not for Win32 high precision timing purpose. See * elapsed_time(). */ -int gettimeofday_windows(struct timeval * tp, struct timezone * tzp) +static int gettimeofday_windows(struct timeval * tp, struct timezone * tzp) { FILETIME file_time; SYSTEMTIME system_time;