X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=ce6f34b3c886511b42005df2e4a469b021001bb4;hb=a4eaa7fcd8ca604faeee50f049c441415aa4968c;hp=3015b1adad66ea0db1439f7b29fe7815d89de503;hpb=2e9b81c595b0150da80f8bf5ee56a74240fda6c1;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 3015b1ad..ce6f34b3 100644 --- a/src/tools.c +++ b/src/tools.c @@ -706,18 +706,29 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode) return phase; } -static int getNewGraphicAnimationFrame(int graphic, int sync_frame) +int getNewGraphicAnimationFrame(int graphic, int sync_frame) { int num_frames = new_graphic_info[graphic].anim_frames; int delay = new_graphic_info[graphic].anim_delay; int mode = new_graphic_info[graphic].anim_mode; - int frame; + int frame = 0; /* animation synchronized with global frame counter, not move position */ if (new_graphic_info[graphic].anim_global_sync || sync_frame < 0) sync_frame = FrameCounter; - if (mode & ANIM_PINGPONG) /* use border frames once */ + if (mode & ANIM_LOOP) /* normal, looping animation */ + { + frame = (sync_frame % (delay * num_frames)) / delay; + } + else if (mode & ANIM_LINEAR) /* normal, non-looping animation */ + { + frame = sync_frame / delay; + + if (frame > num_frames - 1) + frame = num_frames - 1; + } + else if (mode & ANIM_PINGPONG) /* use border frames once */ { int max_anim_frames = 2 * num_frames - 2; @@ -731,8 +742,6 @@ static int getNewGraphicAnimationFrame(int graphic, int sync_frame) frame = (sync_frame % (delay * max_anim_frames)) / delay; frame = (frame < num_frames ? frame : max_anim_frames - frame - 1); } - else /* mode == ANIM_NORMAL || mode == ANIM_REVERSE */ - frame = (sync_frame % (delay * num_frames)) / delay; if (mode & ANIM_REVERSE) /* use reverse animation direction */ frame = num_frames - frame - 1; @@ -1344,7 +1353,7 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, } else if (element == EL_SP_ELECTRON) { - graphic = GFX2_SP_ELECTRON + getGraphicAnimationPhase(8, 2, ANIM_NORMAL); + graphic = GFX2_SP_ELECTRON + getGraphicAnimationPhase(8, 2, ANIM_LOOP); } else if (element == EL_MOLE || element == EL_PENGUIN || element == EL_PIG || element == EL_DRAGON) @@ -1370,11 +1379,11 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, } else if (element == EL_SATELLITE) { - graphic = GFX_SONDE_START + getGraphicAnimationPhase(8, 2, ANIM_NORMAL); + graphic = GFX_SONDE_START + getGraphicAnimationPhase(8, 2, ANIM_LOOP); } else if (element == EL_ACID) { - graphic = GFX_GEBLUBBER + getGraphicAnimationPhase(4, 10, ANIM_NORMAL); + graphic = GFX_GEBLUBBER + getGraphicAnimationPhase(4, 10, ANIM_LOOP); } else if (element == EL_BD_BUTTERFLY || element == EL_BD_FIREFLY) { @@ -1457,101 +1466,45 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, DrawGraphic(x, y, graphic); } +inline static int getGfxAction(int x, int y) +{ + int gfx_action = GFX_ACTION_DEFAULT; + + if (GfxAction[x][y] != GFX_ACTION_DEFAULT) + gfx_action = GfxAction[x][y]; + else if (IS_MOVING(x, y)) + gfx_action = GFX_ACTION_MOVING; + + return gfx_action; +} + void DrawNewScreenElementExt(int x, int y, int dx, int dy, int element, int cut_mode, int mask_mode) { int ux = LEVELX(x), uy = LEVELY(y); int move_dir = MovDir[ux][uy]; int move_pos = ABS(MovPos[ux][uy]) / (TILEX / 8); - int graphic = el_dir2img(element, move_dir); + int gfx_action = getGfxAction(ux, uy); + int graphic = el_dir_act2img(element, move_dir, gfx_action); int frame = getNewGraphicAnimationFrame(graphic, move_pos); - int phase8 = move_pos; - int phase4 = phase8 / 2; - int phase2 = phase8 / 4; - int dir = move_dir; /* !!! THROW AWAY LATER !!! */ - - if (0) - { - ; - } -#if 0 - else if (element == EL_PACMAN || element == EL_BUG || - element == EL_SPACESHIP) + if (element == EL_WALL_GROWING) { - graphic += 1 * !phase2; + boolean left_stopped = FALSE, right_stopped = FALSE; - if (dir == MV_UP) - graphic += 1 * 2; - else if (dir == MV_LEFT) - graphic += 2 * 2; - else if (dir == MV_DOWN) - graphic += 3 * 2; - } - else if (element == EL_SP_SNIKSNAK) - { - if (dir == MV_LEFT) - graphic = GFX_SP_SNIKSNAK_LEFT; - else if (dir == MV_RIGHT) - graphic = GFX_SP_SNIKSNAK_RIGHT; - else if (dir == MV_UP) - graphic = GFX_SP_SNIKSNAK_UP; - else - graphic = GFX_SP_SNIKSNAK_DOWN; - - graphic += (phase8 < 4 ? phase8 : 7 - phase8); - } - else if (element == EL_SP_ELECTRON) - { - graphic = GFX2_SP_ELECTRON + getGraphicAnimationPhase(8, 2, ANIM_NORMAL); - } -#endif - else if (element == EL_MOLE || element == EL_PENGUIN || - element == EL_PIG || element == EL_DRAGON) - { - if (dir == MV_LEFT) - graphic = (element == EL_MOLE ? GFX_MOLE_LEFT : - element == EL_PENGUIN ? GFX_PINGUIN_LEFT : - element == EL_PIG ? GFX_SCHWEIN_LEFT : GFX_DRACHE_LEFT); - else if (dir == MV_RIGHT) - graphic = (element == EL_MOLE ? GFX_MOLE_RIGHT : - element == EL_PENGUIN ? GFX_PINGUIN_RIGHT : - element == EL_PIG ? GFX_SCHWEIN_RIGHT : GFX_DRACHE_RIGHT); - else if (dir == MV_UP) - graphic = (element == EL_MOLE ? GFX_MOLE_UP : - element == EL_PENGUIN ? GFX_PINGUIN_UP : - element == EL_PIG ? GFX_SCHWEIN_UP : GFX_DRACHE_UP); - else - graphic = (element == EL_MOLE ? GFX_MOLE_DOWN : - element == EL_PENGUIN ? GFX_PINGUIN_DOWN : - element == EL_PIG ? GFX_SCHWEIN_DOWN : GFX_DRACHE_DOWN); + if (!IN_LEV_FIELD(ux-1, uy) || IS_MAUER(Feld[ux-1][uy])) + left_stopped = TRUE; + if (!IN_LEV_FIELD(ux+1, uy) || IS_MAUER(Feld[ux+1][uy])) + right_stopped = TRUE; - graphic += phase4; - } - else if (element == EL_SATELLITE) - { -#if 1 - graphic = GFX_SONDE_START + getGraphicAnimationPhase(8, 2, ANIM_NORMAL); -#else - graphic = GFX_SONDE_START + getNewGraphicAnimationFrame(graphic, move_pos); -#endif - } - else if (element == EL_ACID) - { -#if 1 - graphic = GFX_GEBLUBBER + getGraphicAnimationPhase(4, 10, ANIM_NORMAL); -#else - graphic = GFX_GEBLUBBER + getNewGraphicAnimationFrame(graphic, move_pos); -#endif - } - else if (element == EL_BD_BUTTERFLY || element == EL_BD_FIREFLY) - { - graphic += !phase2; - } - else if (element == EL_BALLOON) - { - graphic += phase4; + if (left_stopped && right_stopped) + graphic = IMG_WALL; + else if (left_stopped) + graphic = IMG_WALL_GROWING_ACTIVE_RIGHT; + else if (right_stopped) + graphic = IMG_WALL_GROWING_ACTIVE_LEFT; } +#if 0 else if ((element == EL_ROCK || element == EL_SP_ZONK || element == EL_BD_ROCK || @@ -1565,9 +1518,9 @@ void DrawNewScreenElementExt(int x, int y, int dx, int dy, int element, element == EL_SP_ZONK || element == EL_BD_ROCK) { - if (dir == MV_LEFT) + if (move_dir == MV_LEFT) graphic += (4 - phase4) % 4; - else if (dir == MV_RIGHT) + else if (move_dir == MV_RIGHT) graphic += phase4; else graphic += phase2 * 2; @@ -1576,49 +1529,11 @@ void DrawNewScreenElementExt(int x, int y, int dx, int dy, int element, graphic += phase2; } } - else if (element == EL_MAGIC_WALL_ACTIVE || - element == EL_MAGIC_WALL_EMPTYING || - element == EL_BD_MAGIC_WALL_ACTIVE || - element == EL_BD_MAGIC_WALL_EMPTYING || - element == EL_MAGIC_WALL_FULL || - element == EL_BD_MAGIC_WALL_FULL) - { -#if 1 - graphic += 3 + getGraphicAnimationPhase(4, 4, ANIM_REVERSE); -#else - graphic += 3 + getNewGraphicAnimationFrame(graphic, move_pos); -#endif - } else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING) { graphic = (element == EL_AMOEBA_DEAD ? GFX_AMOEBE_TOT : GFX_AMOEBE_LEBT); graphic += (x + 2 * y + 4) % 4; } - else if (element == EL_WALL_GROWING) - { - boolean links_massiv = FALSE, rechts_massiv = FALSE; - - if (!IN_LEV_FIELD(ux-1, uy) || IS_MAUER(Feld[ux-1][uy])) - links_massiv = TRUE; - if (!IN_LEV_FIELD(ux+1, uy) || IS_MAUER(Feld[ux+1][uy])) - rechts_massiv = TRUE; - - if (links_massiv && rechts_massiv) - graphic = GFX_MAUERWERK; - else if (links_massiv) - graphic = GFX_MAUER_R; - else if (rechts_massiv) - graphic = GFX_MAUER_L; - } -#if 0 - else if ((element == EL_INVISIBLE_STEELWALL || - element == EL_INVISIBLE_WALL || - element == EL_INVISIBLE_SAND) && game.light_time_left) - { - graphic = (element == EL_INVISIBLE_STEELWALL ? GFX_INVISIBLE_STEEL_ON : - element == EL_INVISIBLE_WALL ? GFX_UNSICHTBAR_ON : - GFX_SAND_INVISIBLE_ON); - } #endif if (dx || dy) @@ -3365,26 +3280,13 @@ int el2img(int element) int el_dir2img(int element, int direction) { - int action = GFX_ACTION_DEFAULT; - - if (element_info[element].has_direction_graphic[action]) - { - direction = MV_DIR_BIT(direction); - - return element_info[element].direction_graphic[action][direction]; - } - else - return el2img(element); + return el_dir_act2img(element, direction, GFX_ACTION_DEFAULT); } int el_dir_act2img(int element, int direction, int action) { - if (element_info[element].has_direction_graphic[action]) - { - direction = MV_DIR_BIT(direction); + action = graphics_action_mapping[action]; + direction = MV_DIR_BIT(direction); - return element_info[element].direction_graphic[action][direction]; - } - else - return el_dir2img(element, direction); + return element_info[element].direction_graphic[action][direction]; }