X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=c8f9e5d2dd7f9ac1861ade040d05cd2a66a394de;hb=cd9add1d9479d1938d05ca9df4f31c3f99bd5f3e;hp=d3ccdb0df065c0fb1fc1b86fa6d81bb7c80f00ef;hpb=6c2ebd029ab05c3f48e84247b81da3fff8519694;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index d3ccdb0d..c8f9e5d2 100644 --- a/src/tools.c +++ b/src/tools.c @@ -458,7 +458,7 @@ void DrawPlayer(struct PlayerInfo *player) } #endif - if (element == EL_EXPLODING) + if (element == EL_EXPLOSION) return; /* draw things in the field the player is leaving, if needed */ @@ -482,8 +482,8 @@ void DrawPlayer(struct PlayerInfo *player) { if (player->GfxPos) { - if (Feld[next_jx][next_jy] == EL_SOKOBAN_FELD_VOLL) - DrawLevelElement(next_jx, next_jy, EL_SOKOBAN_FELD_LEER); + if (Feld[next_jx][next_jy] == EL_SOKOBAN_FIELD_FULL) + DrawLevelElement(next_jx, next_jy, EL_SOKOBAN_FIELD_EMPTY); else DrawLevelElement(next_jx, next_jy, EL_EMPTY); } @@ -605,8 +605,8 @@ void DrawPlayer(struct PlayerInfo *player) { int px = SCREENX(next_jx), py = SCREENY(next_jy); - if (element == EL_SOKOBAN_FELD_LEER || - Feld[next_jx][next_jy] == EL_SOKOBAN_FELD_VOLL) + if (element == EL_SOKOBAN_FIELD_EMPTY || + Feld[next_jx][next_jy] == EL_SOKOBAN_FIELD_FULL) DrawGraphicShiftedThruMask(px, py, sxx, syy, GFX_SOKOBAN_OBJEKT, NO_CUTTING); else @@ -653,7 +653,7 @@ void DrawPlayer(struct PlayerInfo *player) DrawGraphicThruMask(sx, sy, graphic + phase); } - if (player_is_moving && last_element == EL_EXPLODING) + if (player_is_moving && last_element == EL_EXPLOSION) { int phase = Frame[last_jx][last_jy]; int delay = 2; @@ -690,7 +690,7 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode) { int phase; - if (mode == ANIM_PINGPONG) + if (mode & ANIM_PINGPONG) { int max_anim_frames = 2 * frames - 2; @@ -700,24 +700,35 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode) else phase = (FrameCounter % (delay * frames)) / delay; - if (mode == ANIM_REVERSE) + if (mode & ANIM_REVERSE) phase = -phase; 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; @@ -756,9 +765,13 @@ void DrawGraphicAnimationExt(int x, int y, int graphic, void DrawNewGraphicAnimationExt(int x, int y, int graphic, int mask_mode) { +#if 0 int delay = new_graphic_info[graphic].anim_delay; if (!(FrameCounter % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#else + if (IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#endif { int frame = getNewGraphicAnimationFrame(graphic, -1); @@ -902,11 +915,11 @@ void DrawNewGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, Bitmap *src_bitmap = new_graphic_info[graphic].bitmap; int src_x = new_graphic_info[graphic].src_x; int src_y = new_graphic_info[graphic].src_y; + int offset_x = new_graphic_info[graphic].offset_x; + int offset_y = new_graphic_info[graphic].offset_y; - if (new_graphic_info[graphic].anim_vertical) - src_y += frame * TILEY; - else - src_x += frame * TILEX; + src_x += frame * offset_x; + src_y += frame * offset_y; BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX, TILEY, x, y); } @@ -983,11 +996,11 @@ void DrawNewGraphicThruMaskExt(DrawBuffer *d, int dest_x, int dest_y, GC drawing_gc = src_bitmap->stored_clip_gc; int src_x = new_graphic_info[graphic].src_x; int src_y = new_graphic_info[graphic].src_y; + int offset_x = new_graphic_info[graphic].offset_x; + int offset_y = new_graphic_info[graphic].offset_y; - if (new_graphic_info[graphic].anim_vertical) - src_y += frame * TILEY; - else - src_x += frame * TILEX; + src_x += frame * offset_x; + src_y += frame * offset_y; SetClipOrigin(src_bitmap, drawing_gc, dest_x - src_x, dest_y - src_y); BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dest_x, dest_y); @@ -1187,6 +1200,8 @@ void DrawNewGraphicShifted(int x,int y, int dx,int dy, int graphic, int frame, GC drawing_gc; int src_x; int src_y; + int offset_x; + int offset_y; int width = TILEX, height = TILEY; int cx = 0, cy = 0; @@ -1266,11 +1281,11 @@ void DrawNewGraphicShifted(int x,int y, int dx,int dy, int graphic, int frame, drawing_gc = src_bitmap->stored_clip_gc; src_x = new_graphic_info[graphic].src_x; src_y = new_graphic_info[graphic].src_y; + offset_x = new_graphic_info[graphic].offset_x; + offset_y = new_graphic_info[graphic].offset_y; - if (new_graphic_info[graphic].anim_vertical) - src_y += frame * TILEY; - else - src_x += frame * TILEX; + src_x += frame * offset_x; + src_y += frame * offset_y; src_x += cx; src_y += cy; @@ -1344,7 +1359,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,13 +1385,13 @@ 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_BUTTERFLY || element == EL_FIREFLY) + else if (element == EL_BD_BUTTERFLY || element == EL_BD_FIREFLY) { graphic += !phase2; } @@ -1408,12 +1423,12 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, graphic += phase2; } } - else if (element == EL_MAGIC_WALL_EMPTY || + else if (element == EL_MAGIC_WALL_ACTIVE || element == EL_MAGIC_WALL_EMPTYING || - element == EL_MAGIC_WALL_BD_EMPTY || - element == EL_MAGIC_WALL_BD_EMPTYING || + element == EL_BD_MAGIC_WALL_ACTIVE || + element == EL_BD_MAGIC_WALL_EMPTYING || element == EL_MAGIC_WALL_FULL || - element == EL_MAGIC_WALL_BD_FULL) + element == EL_BD_MAGIC_WALL_FULL) { graphic += 3 + getGraphicAnimationPhase(4, 4, ANIM_REVERSE); } @@ -1438,14 +1453,16 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, else if (rechts_massiv) graphic = GFX_MAUER_L; } +#if 0 else if ((element == EL_INVISIBLE_STEELWALL || element == EL_INVISIBLE_WALL || - element == EL_SAND_INVISIBLE) && game.light_time_left) + 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) DrawGraphicShifted(x, y, dx, dy, graphic, cut_mode, mask_mode); @@ -1455,101 +1472,66 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, DrawGraphic(x, y, graphic); } +inline static int getFramePosition(int x, int y) +{ + int element = Feld[x][y]; + int frame_pos = -1; + + if (element == EL_QUICKSAND_FULL || + element == EL_MAGIC_WALL_FULL || + element == EL_BD_MAGIC_WALL_FULL) + frame_pos = -1; + else if (IS_MOVING(x, y) || CAN_MOVE(element) || CAN_FALL(element)) + frame_pos = ABS(MovPos[x][y]) / (TILEX / 8); + + return frame_pos; +} + +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 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 move_pos = getFramePosition(ux, uy); + 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) - { - graphic += 1 * !phase2; - - 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 (element == EL_WALL_GROWING) { - 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; + boolean left_stopped = FALSE, right_stopped = FALSE; - 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_BUTTERFLY || element == EL_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; + frame = new_graphic_info[graphic].anim_frames - 1; + } + else if (right_stopped) + { + graphic = IMG_WALL_GROWING_ACTIVE_LEFT; + frame = new_graphic_info[graphic].anim_frames - 1; + } } +#if 0 else if ((element == EL_ROCK || element == EL_SP_ZONK || element == EL_BD_ROCK || @@ -1563,9 +1545,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; @@ -1574,47 +1556,16 @@ void DrawNewScreenElementExt(int x, int y, int dx, int dy, int element, graphic += phase2; } } - else if (element == EL_MAGIC_WALL_EMPTY || - element == EL_MAGIC_WALL_EMPTYING || - element == EL_MAGIC_WALL_BD_EMPTY || - element == EL_MAGIC_WALL_BD_EMPTYING || - element == EL_MAGIC_WALL_FULL || - element == EL_MAGIC_WALL_BD_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; + graphic = (element == EL_BD_AMOEBA ? IMG_BD_AMOEBA_PART1 : + element == EL_AMOEBA_WET ? IMG_AMOEBA_WET_PART1 : + element == EL_AMOEBA_DRY ? IMG_AMOEBA_DRY_PART1 : + element == EL_AMOEBA_FULL ? IMG_AMOEBA_FULL_PART1 : + IMG_AMOEBA_DEAD_PART1); - if (links_massiv && rechts_massiv) - graphic = GFX_MAUERWERK; - else if (links_massiv) - graphic = GFX_MAUER_R; - else if (rechts_massiv) - graphic = GFX_MAUER_L; - } - else if ((element == EL_INVISIBLE_STEELWALL || - element == EL_INVISIBLE_WALL || - element == EL_SAND_INVISIBLE) && game.light_time_left) - { - graphic = (element == EL_INVISIBLE_STEELWALL ? GFX_INVISIBLE_STEEL_ON : - element == EL_INVISIBLE_WALL ? GFX_UNSICHTBAR_ON : - GFX_SAND_INVISIBLE_ON); + graphic += (x + 2 * y + 4) % 4; } if (dx || dy) @@ -1718,7 +1669,7 @@ void ErdreichAnbroeckeln(int x, int y) if (element == EL_SAND || element == EL_LANDMINE || - element == EL_TRAP_INACTIVE || + element == EL_TRAP || element == EL_TRAP_ACTIVE) { if (!IN_SCR_FIELD(x, y)) @@ -1741,7 +1692,7 @@ void ErdreichAnbroeckeln(int x, int y) if (element == EL_SAND || element == EL_LANDMINE || - element == EL_TRAP_INACTIVE || + element == EL_TRAP || element == EL_TRAP_ACTIVE) continue; @@ -1784,7 +1735,7 @@ void ErdreichAnbroeckeln(int x, int y) if (!IN_LEV_FIELD(uxx, uyy) || (Feld[uxx][uyy] != EL_SAND && Feld[uxx][uyy] != EL_LANDMINE && - Feld[uxx][uyy] != EL_TRAP_INACTIVE && + Feld[uxx][uyy] != EL_TRAP && Feld[uxx][uyy] != EL_TRAP_ACTIVE) || !IN_SCR_FIELD(xx, yy)) continue; @@ -1862,12 +1813,12 @@ void DrawScreenField(int x, int y) if (element == EL_QUICKSAND_EMPTYING || element == EL_MAGIC_WALL_EMPTYING || - element == EL_MAGIC_WALL_BD_EMPTYING || + element == EL_BD_MAGIC_WALL_EMPTYING || element == EL_AMOEBA_DRIPPING) cut_mode = CUT_ABOVE; else if (element == EL_QUICKSAND_FILLING || element == EL_MAGIC_WALL_FILLING || - element == EL_MAGIC_WALL_BD_FILLING) + element == EL_BD_MAGIC_WALL_FILLING) cut_mode = CUT_BELOW; if (cut_mode == CUT_ABOVE) @@ -1904,7 +1855,7 @@ void DrawScreenField(int x, int y) if (element_old == EL_QUICKSAND_EMPTYING || element_old == EL_MAGIC_WALL_EMPTYING || - element_old == EL_MAGIC_WALL_BD_EMPTYING || + element_old == EL_BD_MAGIC_WALL_EMPTYING || element_old == EL_AMOEBA_DRIPPING) cut_mode = CUT_ABOVE; @@ -1952,12 +1903,12 @@ void DrawNewScreenField(int x, int y) if (element == EL_QUICKSAND_EMPTYING || element == EL_MAGIC_WALL_EMPTYING || - element == EL_MAGIC_WALL_BD_EMPTYING || + element == EL_BD_MAGIC_WALL_EMPTYING || element == EL_AMOEBA_DRIPPING) cut_mode = CUT_ABOVE; else if (element == EL_QUICKSAND_FILLING || element == EL_MAGIC_WALL_FILLING || - element == EL_MAGIC_WALL_BD_FILLING) + element == EL_BD_MAGIC_WALL_FILLING) cut_mode = CUT_BELOW; if (cut_mode == CUT_ABOVE) @@ -1994,7 +1945,7 @@ void DrawNewScreenField(int x, int y) if (element_old == EL_QUICKSAND_EMPTYING || element_old == EL_MAGIC_WALL_EMPTYING || - element_old == EL_MAGIC_WALL_BD_EMPTYING || + element_old == EL_BD_MAGIC_WALL_EMPTYING || element_old == EL_AMOEBA_DRIPPING) cut_mode = CUT_ABOVE; @@ -2164,7 +2115,7 @@ void DrawLevel() for(x=BX1; x<=BX2; x++) for(y=BY1; y<=BY2; y++) - DrawScreenField(x, y); + DrawNewScreenField(x, y); redraw_mask |= REDRAW_FIELD; } @@ -3003,9 +2954,9 @@ int get_next_element(int element) case EL_QUICKSAND_FILLING: return EL_QUICKSAND_FULL; case EL_QUICKSAND_EMPTYING: return EL_QUICKSAND_EMPTY; case EL_MAGIC_WALL_FILLING: return EL_MAGIC_WALL_FULL; - case EL_MAGIC_WALL_EMPTYING: return EL_MAGIC_WALL_EMPTY; - case EL_MAGIC_WALL_BD_FILLING: return EL_MAGIC_WALL_BD_FULL; - case EL_MAGIC_WALL_BD_EMPTYING: return EL_MAGIC_WALL_BD_EMPTY; + 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; default: return element; @@ -3021,13 +2972,11 @@ int el2gfx_OLD(int element) case EL_WALL: return GFX_MAUERWERK; case EL_WALL_CRUMBLED: return GFX_FELSBODEN; case EL_ROCK: return GFX_FELSBROCKEN; - case EL_KEY: return GFX_SCHLUESSEL; case EL_EMERALD: return GFX_EDELSTEIN; case EL_EXIT_CLOSED: return GFX_AUSGANG_ZU; - case EL_AUSGANG_ACT: return GFX_AUSGANG_ACT; + case EL_EXIT_OPENING: return GFX_AUSGANG_ACT; case EL_EXIT_OPEN: return GFX_AUSGANG_AUF; case EL_SP_EXIT_OPEN: return GFX_SP_EXIT; - case EL_PLAYER: return GFX_SPIELFIGUR; case EL_PLAYER1: return GFX_SPIELER1; case EL_PLAYER2: return GFX_SPIELER2; case EL_PLAYER3: return GFX_SPIELER3; @@ -3042,16 +2991,16 @@ int el2gfx_OLD(int element) case EL_SPACESHIP_UP: return GFX_FLIEGER_UP; case EL_SPACESHIP_LEFT: return GFX_FLIEGER_LEFT; case EL_SPACESHIP_DOWN: return GFX_FLIEGER_DOWN; - case EL_BUTTERFLY: return GFX_BUTTERFLY; - case EL_BUTTERFLY_RIGHT: return GFX_BUTTERFLY_RIGHT; - case EL_BUTTERFLY_UP: return GFX_BUTTERFLY_UP; - case EL_BUTTERFLY_LEFT: return GFX_BUTTERFLY_LEFT; - case EL_BUTTERFLY_DOWN: return GFX_BUTTERFLY_DOWN; - case EL_FIREFLY: return GFX_FIREFLY; - case EL_FIREFLY_RIGHT: return GFX_FIREFLY_RIGHT; - case EL_FIREFLY_UP: return GFX_FIREFLY_UP; - case EL_FIREFLY_LEFT: return GFX_FIREFLY_LEFT; - case EL_FIREFLY_DOWN: return GFX_FIREFLY_DOWN; + case EL_BD_BUTTERFLY: return GFX_BUTTERFLY; + case EL_BD_BUTTERFLY_RIGHT: return GFX_BUTTERFLY_RIGHT; + case EL_BD_BUTTERFLY_UP: return GFX_BUTTERFLY_UP; + case EL_BD_BUTTERFLY_LEFT: return GFX_BUTTERFLY_LEFT; + case EL_BD_BUTTERFLY_DOWN: return GFX_BUTTERFLY_DOWN; + case EL_BD_FIREFLY: return GFX_FIREFLY; + case EL_BD_FIREFLY_RIGHT: return GFX_FIREFLY_RIGHT; + case EL_BD_FIREFLY_UP: return GFX_FIREFLY_UP; + case EL_BD_FIREFLY_LEFT: return GFX_FIREFLY_LEFT; + case EL_BD_FIREFLY_DOWN: return GFX_FIREFLY_DOWN; case EL_YAMYAM: return GFX_MAMPFER; case EL_ROBOT: return GFX_ROBOT; case EL_STEELWALL: return GFX_BETON; @@ -3062,7 +3011,7 @@ int el2gfx_OLD(int element) case EL_AMOEBA_DROP: return GFX_TROPFEN; case EL_BOMB: return GFX_BOMBE; case EL_MAGIC_WALL: return GFX_MAGIC_WALL_OFF; - case EL_MAGIC_WALL_EMPTY: return GFX_MAGIC_WALL_EMPTY; + case EL_MAGIC_WALL_ACTIVE: return GFX_MAGIC_WALL_EMPTY; case EL_MAGIC_WALL_EMPTYING: return GFX_MAGIC_WALL_EMPTY; case EL_MAGIC_WALL_FULL: return GFX_MAGIC_WALL_FULL; case EL_MAGIC_WALL_DEAD: return GFX_MAGIC_WALL_DEAD; @@ -3105,6 +3054,7 @@ int el2gfx_OLD(int element) case EL_PACMAN_LEFT: return GFX_PACMAN_LEFT; case EL_PACMAN_DOWN: return GFX_PACMAN_DOWN; case EL_INVISIBLE_WALL: return GFX_UNSICHTBAR; + case EL_INVISIBLE_WALL_ACTIVE: return GFX_UNSICHTBAR_ON; case EL_WALL_EMERALD: return GFX_ERZ_EDEL; case EL_WALL_DIAMOND: return GFX_ERZ_DIAM; case EL_LAMP: return GFX_BIRNE_AUS; @@ -3124,36 +3074,37 @@ int el2gfx_OLD(int element) case EL_WALL_EMERALD_RED: return GFX_ERZ_EDEL_ROT; case EL_WALL_EMERALD_PURPLE: return GFX_ERZ_EDEL_LILA; case EL_DARK_YAMYAM: return GFX_MAMPFER2; - case EL_MAGIC_WALL_BD_OFF: return GFX_MAGIC_WALL_BD_OFF; - case EL_MAGIC_WALL_BD_EMPTY: return GFX_MAGIC_WALL_BD_EMPTY; - case EL_MAGIC_WALL_BD_EMPTYING: return GFX_MAGIC_WALL_BD_EMPTY; - case EL_MAGIC_WALL_BD_FULL: return GFX_MAGIC_WALL_BD_FULL; - case EL_MAGIC_WALL_BD_DEAD: return GFX_MAGIC_WALL_BD_DEAD; - case EL_DYNABOMB_ACTIVE_1: return GFX_DYNABOMB; - case EL_DYNABOMB_ACTIVE_2: return GFX_DYNABOMB; - case EL_DYNABOMB_ACTIVE_3: return GFX_DYNABOMB; - case EL_DYNABOMB_ACTIVE_4: return GFX_DYNABOMB; + case EL_BD_MAGIC_WALL: return GFX_MAGIC_WALL_BD_OFF; + case EL_BD_MAGIC_WALL_ACTIVE: return GFX_MAGIC_WALL_BD_EMPTY; + case EL_BD_MAGIC_WALL_EMPTYING: return GFX_MAGIC_WALL_BD_EMPTY; + case EL_BD_MAGIC_WALL_FULL: return GFX_MAGIC_WALL_BD_FULL; + case EL_BD_MAGIC_WALL_DEAD: return GFX_MAGIC_WALL_BD_DEAD; + case EL_DYNABOMB_PLAYER1_ACTIVE: return GFX_DYNABOMB; + case EL_DYNABOMB_PLAYER2_ACTIVE: return GFX_DYNABOMB; + case EL_DYNABOMB_PLAYER3_ACTIVE: return GFX_DYNABOMB; + case EL_DYNABOMB_PLAYER4_ACTIVE: return GFX_DYNABOMB; case EL_DYNABOMB_NR: return GFX_DYNABOMB_NR; case EL_DYNABOMB_SZ: return GFX_DYNABOMB_SZ; case EL_DYNABOMB_XL: return GFX_DYNABOMB_XL; - case EL_SOKOBAN_OBJEKT: return GFX_SOKOBAN_OBJEKT; - case EL_SOKOBAN_FELD_LEER: return GFX_SOKOBAN_FELD_LEER; - case EL_SOKOBAN_FELD_VOLL: return GFX_SOKOBAN_FELD_VOLL; + case EL_SOKOBAN_OBJECT: return GFX_SOKOBAN_OBJEKT; + case EL_SOKOBAN_FIELD_EMPTY: return GFX_SOKOBAN_FELD_LEER; + case EL_SOKOBAN_FIELD_FULL: return GFX_SOKOBAN_FELD_VOLL; case EL_MOLE: return GFX_MOLE; case EL_PENGUIN: return GFX_PINGUIN; case EL_PIG: return GFX_SCHWEIN; case EL_DRAGON: return GFX_DRACHE; case EL_SATELLITE: return GFX_SONDE; - case EL_ARROW_LEFT: return GFX_PFEIL_LEFT; - case EL_ARROW_RIGHT: return GFX_PFEIL_RIGHT; - case EL_ARROW_UP: return GFX_PFEIL_UP; - case EL_ARROW_DOWN: return GFX_PFEIL_DOWN; + case EL_ARROW_BLUE_LEFT: return GFX_PFEIL_LEFT; + case EL_ARROW_BLUE_RIGHT: return GFX_PFEIL_RIGHT; + case EL_ARROW_BLUE_UP: return GFX_PFEIL_UP; + case EL_ARROW_BLUE_DOWN: return GFX_PFEIL_DOWN; case EL_SPEED_PILL: return GFX_SPEED_PILL; case EL_SP_TERMINAL_ACTIVE: return GFX_SP_TERMINAL; - case EL_SP_BUG_ACTIVE: return GFX_SP_BUG_ACTIVE; + case EL_SP_BUGGY_BASE_ACTIVE: return GFX_SP_BUG_ACTIVE; case EL_SP_ZONK: return GFX_SP_ZONK; /* ^^^^^^^^^^ non-standard position in supaplex graphic set! */ case EL_INVISIBLE_STEELWALL: return GFX_INVISIBLE_STEEL; + case EL_INVISIBLE_STEELWALL_ACTIVE: return GFX_INVISIBLE_STEEL_ON; case EL_BLACK_ORB: return GFX_BLACK_ORB; case EL_EM_GATE1: return GFX_EM_GATE_1; case EL_EM_GATE2: return GFX_EM_GATE_2; @@ -3179,7 +3130,7 @@ int el2gfx_OLD(int element) case EL_DOOR_WHITE_GRAY: return GFX_DOOR_WHITE_GRAY; case EL_KEY_WHITE: return GFX_KEY_WHITE; case EL_SHIELD_NORMAL: return GFX_SHIELD_PASSIVE; - case EL_SHIELD_ACTIVE: return GFX_SHIELD_ACTIVE; + case EL_SHIELD_DEADLY: return GFX_SHIELD_ACTIVE; case EL_EXTRA_TIME: return GFX_EXTRA_TIME; case EL_SWITCHGATE_OPEN: return GFX_SWITCHGATE_OPEN; case EL_SWITCHGATE_CLOSED: return GFX_SWITCHGATE_CLOSED; @@ -3188,24 +3139,36 @@ int el2gfx_OLD(int element) case EL_CONVEYOR_BELT1_LEFT: return GFX_BELT1_LEFT; case EL_CONVEYOR_BELT1_MIDDLE: return GFX_BELT1_MIDDLE; case EL_CONVEYOR_BELT1_RIGHT: return GFX_BELT1_RIGHT; + case EL_CONVEYOR_BELT1_LEFT_ACTIVE: return GFX_BELT1_LEFT; + case EL_CONVEYOR_BELT1_MIDDLE_ACTIVE:return GFX_BELT1_MIDDLE; + case EL_CONVEYOR_BELT1_RIGHT_ACTIVE:return GFX_BELT1_RIGHT; case EL_CONVEYOR_BELT1_SWITCH_LEFT: return GFX_BELT1_SWITCH_LEFT; case EL_CONVEYOR_BELT1_SWITCH_MIDDLE:return GFX_BELT1_SWITCH_MIDDLE; case EL_CONVEYOR_BELT1_SWITCH_RIGHT:return GFX_BELT1_SWITCH_RIGHT; case EL_CONVEYOR_BELT2_LEFT: return GFX_BELT2_LEFT; case EL_CONVEYOR_BELT2_MIDDLE: return GFX_BELT2_MIDDLE; case EL_CONVEYOR_BELT2_RIGHT: return GFX_BELT2_RIGHT; + case EL_CONVEYOR_BELT2_LEFT_ACTIVE: return GFX_BELT2_LEFT; + case EL_CONVEYOR_BELT2_MIDDLE_ACTIVE:return GFX_BELT2_MIDDLE; + case EL_CONVEYOR_BELT2_RIGHT_ACTIVE:return GFX_BELT2_RIGHT; case EL_CONVEYOR_BELT2_SWITCH_LEFT: return GFX_BELT2_SWITCH_LEFT; case EL_CONVEYOR_BELT2_SWITCH_MIDDLE:return GFX_BELT2_SWITCH_MIDDLE; case EL_CONVEYOR_BELT2_SWITCH_RIGHT:return GFX_BELT2_SWITCH_RIGHT; case EL_CONVEYOR_BELT3_LEFT: return GFX_BELT3_LEFT; case EL_CONVEYOR_BELT3_MIDDLE: return GFX_BELT3_MIDDLE; case EL_CONVEYOR_BELT3_RIGHT: return GFX_BELT3_RIGHT; + case EL_CONVEYOR_BELT3_LEFT_ACTIVE: return GFX_BELT3_LEFT; + case EL_CONVEYOR_BELT3_MIDDLE_ACTIVE:return GFX_BELT3_MIDDLE; + case EL_CONVEYOR_BELT3_RIGHT_ACTIVE:return GFX_BELT3_RIGHT; case EL_CONVEYOR_BELT3_SWITCH_LEFT: return GFX_BELT3_SWITCH_LEFT; case EL_CONVEYOR_BELT3_SWITCH_MIDDLE:return GFX_BELT3_SWITCH_MIDDLE; case EL_CONVEYOR_BELT3_SWITCH_RIGHT:return GFX_BELT3_SWITCH_RIGHT; case EL_CONVEYOR_BELT4_LEFT: return GFX_BELT4_LEFT; case EL_CONVEYOR_BELT4_MIDDLE: return GFX_BELT4_MIDDLE; case EL_CONVEYOR_BELT4_RIGHT: return GFX_BELT4_RIGHT; + case EL_CONVEYOR_BELT4_LEFT_ACTIVE: return GFX_BELT4_LEFT; + case EL_CONVEYOR_BELT4_MIDDLE_ACTIVE:return GFX_BELT4_MIDDLE; + case EL_CONVEYOR_BELT4_RIGHT_ACTIVE:return GFX_BELT4_RIGHT; case EL_CONVEYOR_BELT4_SWITCH_LEFT: return GFX_BELT4_SWITCH_LEFT; case EL_CONVEYOR_BELT4_SWITCH_MIDDLE:return GFX_BELT4_SWITCH_MIDDLE; case EL_CONVEYOR_BELT4_SWITCH_RIGHT:return GFX_BELT4_SWITCH_RIGHT; @@ -3230,19 +3193,20 @@ int el2gfx_OLD(int element) case EL_MOLE_UP: return GFX_MOLE_UP; case EL_MOLE_DOWN: return GFX_MOLE_DOWN; case EL_STEELWALL_SLANTED: return GFX_STEEL_SLANTED; - case EL_SAND_INVISIBLE: return GFX_SAND_INVISIBLE; + case EL_INVISIBLE_SAND: return GFX_SAND_INVISIBLE; + case EL_INVISIBLE_SAND_ACTIVE: return GFX_SAND_INVISIBLE_ON; case EL_DX_UNKNOWN_15: return GFX_DX_UNKNOWN_15; case EL_DX_UNKNOWN_42: return GFX_DX_UNKNOWN_42; case EL_TIMEGATE_OPEN: return GFX_TIMEGATE_OPEN; case EL_TIMEGATE_CLOSED: return GFX_TIMEGATE_CLOSED; - case EL_TIMEGATE_SWITCH_ON: return GFX_TIMEGATE_SWITCH; - case EL_TIMEGATE_SWITCH_OFF: return GFX_TIMEGATE_SWITCH; + case EL_TIMEGATE_SWITCH_ACTIVE: return GFX_TIMEGATE_SWITCH; + case EL_TIMEGATE_SWITCH: return GFX_TIMEGATE_SWITCH; case EL_BALLOON: return GFX_BALLOON; case EL_BALLOON_SEND_LEFT: return GFX_BALLOON_SEND_LEFT; case EL_BALLOON_SEND_RIGHT: return GFX_BALLOON_SEND_RIGHT; case EL_BALLOON_SEND_UP: return GFX_BALLOON_SEND_UP; case EL_BALLOON_SEND_DOWN: return GFX_BALLOON_SEND_DOWN; - case EL_BALLOON_SEND_ANY: return GFX_BALLOON_SEND_ANY; + case EL_BALLOON_SEND_ANY_DIRECTION: return GFX_BALLOON_SEND_ANY; case EL_EMC_STEELWALL1: return GFX_EMC_STEEL_WALL_1; case EL_EMC_STEELWALL2: return GFX_EMC_STEEL_WALL_2; case EL_EMC_STEELWALL3: return GFX_EMC_STEEL_WALL_3; @@ -3255,20 +3219,20 @@ int el2gfx_OLD(int element) case EL_EMC_WALL6: return GFX_EMC_WALL_6; case EL_EMC_WALL7: return GFX_EMC_WALL_7; case EL_EMC_WALL8: return GFX_EMC_WALL_8; - case EL_TUBE_CROSS: return GFX_TUBE_CROSS; + case EL_TUBE_ALL: return GFX_TUBE_CROSS; case EL_TUBE_VERTICAL: return GFX_TUBE_VERTICAL; case EL_TUBE_HORIZONTAL: return GFX_TUBE_HORIZONTAL; - case EL_TUBE_VERT_LEFT: return GFX_TUBE_VERT_LEFT; - case EL_TUBE_VERT_RIGHT: return GFX_TUBE_VERT_RIGHT; - case EL_TUBE_HORIZ_UP: return GFX_TUBE_HORIZ_UP; - case EL_TUBE_HORIZ_DOWN: return GFX_TUBE_HORIZ_DOWN; + case EL_TUBE_VERTICAL_LEFT: return GFX_TUBE_VERT_LEFT; + case EL_TUBE_VERTICAL_RIGHT: return GFX_TUBE_VERT_RIGHT; + case EL_TUBE_HORIZONTAL_UP: return GFX_TUBE_HORIZ_UP; + case EL_TUBE_HORIZONTAL_DOWN: return GFX_TUBE_HORIZ_DOWN; case EL_TUBE_LEFT_UP: return GFX_TUBE_LEFT_UP; case EL_TUBE_LEFT_DOWN: return GFX_TUBE_LEFT_DOWN; case EL_TUBE_RIGHT_UP: return GFX_TUBE_RIGHT_UP; case EL_TUBE_RIGHT_DOWN: return GFX_TUBE_RIGHT_DOWN; case EL_SPRING: return GFX_SPRING; case EL_SPRING_MOVING: return GFX_SPRING; - case EL_TRAP_INACTIVE: return GFX_TRAP_INACTIVE; + case EL_TRAP: return GFX_TRAP_INACTIVE; case EL_TRAP_ACTIVE: return GFX_TRAP_ACTIVE; case EL_BD_WALL: return GFX_BD_WALL; case EL_BD_ROCK: return GFX_BD_ROCK; @@ -3297,6 +3261,12 @@ int el2gfx_OLD(int element) int el2gfx(int element) { +#if 1 + int graphic_OLD = el2gfx_OLD(element); + + return graphic_OLD; +#else + int graphic_NEW = element_info[element].graphic[GFX_ACTION_DEFAULT]; #if DEBUG @@ -3315,31 +3285,40 @@ int el2gfx(int element) #endif return graphic_NEW; +#endif } int el2img(int element) { +#if 1 + int graphic_NEW = element_info[element].graphic[GFX_ACTION_DEFAULT]; + + return graphic_NEW; +#else + switch(element) { - case EL_BUTTERFLY: return IMG_BD_BUTTERFLY; - case EL_FIREFLY: return IMG_BD_FIREFLY; + case EL_BD_BUTTERFLY: return IMG_BD_BUTTERFLY; + case EL_BD_FIREFLY: return IMG_BD_FIREFLY; case EL_SP_ELECTRON: return IMG_SP_ELECTRON; default: break; } - return IMG_EMPTY_SPACE; + return IMG_EMPTY; +#endif } int el_dir2img(int element, int direction) { - if (element_info[element].has_direction_graphic[GFX_ACTION_DEFAULT]) - { - int i = LOG_MV_DIR(direction); + return el_dir_act2img(element, direction, GFX_ACTION_DEFAULT); +} - return element_info[element].direction_graphic[GFX_ACTION_DEFAULT][i]; - } - else - return el2img(element); +int el_dir_act2img(int element, int direction, int action) +{ + action = graphics_action_mapping[action]; + direction = MV_DIR_BIT(direction); + + return element_info[element].direction_graphic[action][direction]; }