From 0dd257541d5c299a35228d9eb6cfd85c14ca4a26 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 18 Feb 2017 12:44:16 +0100 Subject: [PATCH] fixed various graphics functions for Mirror Magic game engine --- src/game_mm/mm_game.c | 56 ++++++++------ src/game_mm/mm_game.h | 26 +------ src/game_mm/mm_main.h | 2 - src/game_mm/mm_tools.c | 168 ++++++++--------------------------------- 4 files changed, 67 insertions(+), 185 deletions(-) diff --git a/src/game_mm/mm_game.c b/src/game_mm/mm_game.c index bc96959f..6b8d02ae 100644 --- a/src/game_mm/mm_game.c +++ b/src/game_mm/mm_game.c @@ -344,7 +344,9 @@ void InitGameEngine_MM() } } +#if 0 CloseDoor(DOOR_CLOSE_1); +#endif DrawLevel_MM(); InitCycleElements(); @@ -365,8 +367,10 @@ void InitGameEngine_MM() int2str(game_mm.score, 4), FONT_TEXT_2); #endif +#if 0 UnmapGameButtons(); MapGameButtons(); +#endif #if 0 /* copy actual game door content to door double buffer for OpenDoor() */ @@ -374,7 +378,9 @@ void InitGameEngine_MM() DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); #endif +#if 0 OpenDoor(DOOR_OPEN_ALL); +#endif if (setup.sound_loops) PlaySoundExt(SND_FUEL, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, SND_CTRL_PLAY_LOOP); @@ -461,13 +467,13 @@ boolean StepBehind() static int getMaskFromElement(int element) { if (IS_GRID(element)) - return GFX_MASK_GRID_00 + get_element_phase(element); + return IMG_MM_MASK_GRID_1 + get_element_phase(element); else if (IS_MCDUFFIN(element)) - return GFX_MASK_MCDUFFIN_00 + get_element_phase(element); + return IMG_MM_MASK_MCDUFFIN_RIGHT + get_element_phase(element); else if (IS_RECTANGLE(element) || IS_DF_GRID(element)) - return GFX_MASK_RECTANGLE; + return IMG_MM_MASK_RECTANGLE; else - return GFX_MASK_CIRCLE; + return IMG_MM_MASK_CIRCLE; } int ScanPixel() @@ -525,16 +531,15 @@ int ScanPixel() int mask_x, mask_y; int dx = px - lx * TILEX; int dy = py - ly * TILEY; + Bitmap *bitmap; + int src_x, src_y; - mask_x = (graphic_mask % GFX_PER_LINE) * TILEX + dx; - mask_y = (graphic_mask / GFX_PER_LINE) * TILEY + dy; + getGraphicSource(graphic_mask, 0, &bitmap, &src_x, &src_y); -#if 1 - // !!! temporary fix to compile -- change to game graphics !!! - pixel = (ReadPixel(drawto, mask_x, mask_y) ? 1 : 0); -#else - pixel = (ReadPixel(pix[PIX_BACK], mask_x, mask_y) ? 1 : 0); -#endif + mask_x = src_x + dx; + mask_y = src_y + dy; + + pixel = (ReadPixel(bitmap, mask_x, mask_y) ? 1 : 0); } } else @@ -2133,28 +2138,29 @@ static void Explode_MM(int x, int y, int phase, int mode) } else if (!(phase % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) { - int graphic = GFX_EXPLOSION_START; + int graphic = IMG_MM_DEFAULT_EXPLODING; int graphic_phase = (phase / delay - 1); + Bitmap *bitmap; + int src_x, src_y; if (Store2[x][y] == EX_KETTLE) { if (graphic_phase < 3) - graphic = GFX_EXPLOSION_KETTLE; + graphic = IMG_MM_KETTLE_EXPLODING; else if (graphic_phase < 5) { - graphic = GFX_EXPLOSION_LAST; - graphic_phase -= graphic_phase; + graphic_phase += 3; } else { - graphic = GFX_EMPTY; + graphic = IMG_EMPTY; graphic_phase = 0; } } else if (Store2[x][y] == EX_SHORT) { if (graphic_phase < 4) - graphic = GFX_EXPLOSION_SHORT; + graphic_phase += 4; else { graphic = GFX_EMPTY; @@ -2162,7 +2168,11 @@ static void Explode_MM(int x, int y, int phase, int mode) } } - DrawGraphic_MM(x, y, graphic + graphic_phase); + getGraphicSource(graphic, graphic_phase, &bitmap, &src_x, &src_y); + + BlitBitmap(bitmap, drawto_field, src_x, src_y, TILEX, TILEY, + FX + x * TILEX, FY + y * TILEY); + MarkTileDirty(x, y); } } @@ -2425,7 +2435,7 @@ void ClickElement(int mx, int my, int button) laser.fuse_off = FALSE; laser.fuse_x = laser.fuse_y = -1; - DrawGraphic_MM(x, y, GFX_FUSE_ON); + DrawGraphic_MM(x, y, IMG_MM_FUSE_ACTIVE); ScanLaser(); } else if (element == EL_FUSE_ON && !laser.fuse_off && new_button) @@ -2436,7 +2446,7 @@ void ClickElement(int mx, int my, int button) laser.overloaded = FALSE; DrawLaser(0, DL_LASER_DISABLED); - DrawGraphic_MM(x, y, GFX_FUSE_OFF); + DrawGraphic_MM(x, y, IMG_MM_FUSE); } else if (element == EL_LIGHTBALL) { @@ -2960,7 +2970,7 @@ void GameActions_MM(byte action[MAX_PLAYERS], boolean warp_mode) laser.fuse_x = ELX; laser.fuse_y = ELY; DrawLaser(0, DL_LASER_DISABLED); - DrawGraphic_MM(ELX, ELY, GFX_FUSE_OFF); + DrawGraphic_MM(ELX, ELY, IMG_MM_FUSE); } if (element == EL_BALL_GRAY && CT > 1500) @@ -3398,7 +3408,7 @@ void MovePacMen() game_mm.pacman[p].x = nx; game_mm.pacman[p].y = ny; g = Feld[nx][ny] - EL_PACMAN_RIGHT; - DrawGraphic_MM(ox, oy, GFX_EMPTY); + DrawGraphic_MM(ox, oy, IMG_EMPTY); if (element != EL_EMPTY) { diff --git a/src/game_mm/mm_game.h b/src/game_mm/mm_game.h index 75edb429..c0d5af90 100644 --- a/src/game_mm/mm_game.h +++ b/src/game_mm/mm_game.h @@ -14,6 +14,7 @@ #include "main_mm.h" + /* score for elements (also used by editor.c) */ #define SC_EDELSTEIN 0 #define SC_DIAMANT 1 @@ -27,27 +28,14 @@ #define SC_KEY 9 #define SC_ZEITBONUS 10 -void GetPlayerConfig(void); -void InitGame(void); -void InitMovDir(int, int); + void InitAmoebaNr(int, int); -void GameWon(void); +void GameWon_MM(void); int NewHiScore_MM(void); -void InitMovingField(int, int, int); -void Moving2Blocked(int, int, int *, int *); -void Blocked2Moving(int, int, int *, int *); -int MovingOrBlocked2Element(int, int); -void RemoveMovingField(int, int); - - - - void Blurb(int, int); void Impact(int, int); void TurnRound(int, int); -void StartMoving(int, int); -void ContinueMoving(int, int); int AmoebeNachbarNr(int, int); void AmoebeUmwandeln(int, int); void AmoebeUmwandelnBD(int, int, int); @@ -65,8 +53,6 @@ void EdelsteinFunkeln(int, int); void MauerWaechst(int, int); void MauerAbleger(int, int); - - boolean MoveFigureOneStep(struct PlayerInfo *, int, int, int, int); boolean MoveFigure(struct PlayerInfo *, int, int); void ScrollFigure(struct PlayerInfo *, int); @@ -86,14 +72,10 @@ int DigField(struct PlayerInfo *, int, int, int, int, int); boolean SnapField(struct PlayerInfo *, int, int); boolean PlaceBomb(struct PlayerInfo *); void PlaySoundLevel(int, int, int); -void RaiseScore(int); -void RaiseScoreElement(int); void CreateGameButtons(); void UnmapGameButtons(); - -void InitGame(void); void AddLaserEdge(int, int); void AddDamagedField(int, int); void ScanLaser(void); @@ -106,14 +88,12 @@ boolean HitLaserSource(int, int); boolean HitLaserDestination(int, int); boolean HitReflectingWalls(int, int); boolean HitAbsorbingWalls(int, int); -void Bang(int, int); void ClickElement(int, int, int); void RotateMirror(int, int, int); boolean ObjHit(int, int, int); void DeletePacMan(int, int); void ColorCycling(void); -void GameActions(void); void MovePacMen(void); #endif diff --git a/src/game_mm/mm_main.h b/src/game_mm/mm_main.h index f58deca1..b553a1f8 100644 --- a/src/game_mm/mm_main.h +++ b/src/game_mm/mm_main.h @@ -658,8 +658,6 @@ extern int num_element_info; #define EL_BLOCKED 600 #define EL_EXPLODING_OPAQUE 601 #define EL_EXPLODING_TRANSP 602 -#define EL_DEFAULT_EXPLODING 603 -#define EL_KETTLE_EXPLODING 604 /* dummy elements (never used as game elements, only used as graphics) */ #define EL_MM_MASK_MCDUFFIN_RIGHT 700 diff --git a/src/game_mm/mm_tools.c b/src/game_mm/mm_tools.c index 4f61964c..5c67bbe4 100644 --- a/src/game_mm/mm_tools.c +++ b/src/game_mm/mm_tools.c @@ -81,7 +81,6 @@ void DrawGraphic_MM(int x, int y, int graphic) { printf("DrawGraphic_MM(): x = %d, y = %d, graphic = %d\n",x,y,graphic); printf("DrawGraphic_MM(): This should never happen!\n"); - return; } #endif @@ -120,7 +119,7 @@ void DrawGraphicThruMaskExt_MM(DrawBuffer *d, int dest_x, int dest_y, int src_x, src_y; Bitmap *src_bitmap; - if (graphic == GFX_EMPTY) + if (graphic == IMG_EMPTY) return; getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); @@ -391,7 +390,7 @@ void DrawMiniElement_MM(int x, int y, int element) if (!element) { - DrawMiniGraphic_MM(x, y, GFX_EMPTY); + DrawMiniGraphic_MM(x, y, IMG_EMPTY); return; } @@ -439,7 +438,7 @@ void DrawWallsExt_MM(int x, int y, int element, int draw_mask) getMiniGraphicSource(graphic, &bitmap, &gx, &gy); if (game_status != LEVELED || !editor.draw_walls_masked) - DrawGraphic_MM(x, y, GFX_EMPTY); + DrawGraphic_MM(x, y, IMG_EMPTY); /* if (IS_WALL_WOOD(element) || IS_WALL_AMOEBA(element) || @@ -474,51 +473,45 @@ void DrawWalls_MM(int x, int y, int element) void DrawWallsAnimation_MM(int x, int y, int element, int phase, int bit_mask) { - int graphic = GFX_WALL_SEVERAL; - int graphic_anim = graphic + (phase + 1) / 2; - int dx = (IS_WALL_AMOEBA(element) ? MINI_TILEX : 0); - int dy = MINI_TILEY; - int dx_anim = dx; - int dy_anim = ((phase + 1) % 2) * MINI_TILEY; int i; - Bitmap *bitmap, *bitmap_anim; - int src_x, src_y; - int src_x_anim, src_y_anim; - - getGraphicSource(graphic, 0, &bitmap, &src_x, &src_y); - getGraphicSource(graphic_anim, 0, &bitmap_anim, &src_x_anim, &src_y_anim); - if (phase == 0) { DrawWalls_MM(x, y, element); + return; } - for(i=0; i<4; i++) + for (i = 0; i < 4; i++) { if (element & (1 << i)) { - int dest_x = SX + x * TILEX + MINI_TILEX * (i % 2); - int dest_y = SY + y * TILEY + MINI_TILEY * (i / 2); - int gx, gy; + int graphic; + int frame; + Bitmap *bitmap; + int src_x, src_y; + int dst_x = SX + x * TILEX + (i % 2) * MINI_TILEX; + int dst_y = SY + y * TILEY + (i / 2) * MINI_TILEY; if (bit_mask & (1 << i)) { - gx = src_x_anim + dx_anim; - gy = src_y_anim + dy_anim; - - BlitBitmap(bitmap_anim, drawto, gx, gy, MINI_TILEX, MINI_TILEY, - dest_x, dest_y); + graphic = (IS_WALL_AMOEBA(element) ? + IMG_MM_AMOEBA_WALL_GROWING : + IMG_MM_ICE_WALL_SHRINKING); + frame = phase; } else { - gx = src_x + dx; - gy = src_y + dy; - - BlitBitmap(bitmap, drawto, gx, gy, MINI_TILEX, MINI_TILEY, - dest_x, dest_y); + graphic = (IS_WALL_AMOEBA(element) ? + IMG_MM_AMOEBA_WALL : + IMG_MM_ICE_WALL); + frame = 0; } + + getGraphicSource(graphic, frame, &bitmap, &src_x, &src_y); + + BlitBitmap(bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY, + dst_x, dst_y); } } @@ -528,7 +521,7 @@ void DrawWallsAnimation_MM(int x, int y, int element, int phase, int bit_mask) void DrawElement_MM(int x, int y, int element) { if (element == EL_EMPTY) - DrawGraphic_MM(x, y, GFX_EMPTY); + DrawGraphic_MM(x, y, IMG_EMPTY); else if (IS_WALL(element)) DrawWalls_MM(x, y, element); #if 0 @@ -731,113 +724,13 @@ int get_rotated_element(int element, int step) int el2gfx(int element) { - switch(element) + switch (element) { - case EL_EMPTY: return -1; - case EL_GRID_STEEL_00: return GFX_GRID_STEEL_00; - case EL_GRID_STEEL_01: return GFX_GRID_STEEL_01; - case EL_GRID_STEEL_02: return GFX_GRID_STEEL_02; - case EL_GRID_STEEL_03: return GFX_GRID_STEEL_03; - case EL_MCDUFFIN_RIGHT: return GFX_MCDUFFIN_RIGHT; - case EL_MCDUFFIN_UP: return GFX_MCDUFFIN_UP; - case EL_MCDUFFIN_LEFT: return GFX_MCDUFFIN_LEFT; - case EL_MCDUFFIN_DOWN: return GFX_MCDUFFIN_DOWN; - case EL_EXIT_CLOSED: return GFX_EXIT_CLOSED; - case EL_EXIT_OPENING_1: return GFX_EXIT_OPENING_1; - case EL_EXIT_OPENING_2: return GFX_EXIT_OPENING_2; - case EL_EXIT_OPEN: return GFX_EXIT_OPEN; - case EL_KETTLE: return GFX_KETTLE; - case EL_BOMB: return GFX_BOMB; - case EL_PRISM: return GFX_PRISM; - case EL_BLOCK_WOOD: return GFX_BLOCK_WOOD; - case EL_BALL_GRAY: return GFX_BALL_GRAY; - case EL_FUSE_ON: return GFX_FUSE_ON; - case EL_PACMAN_RIGHT: return GFX_PACMAN_RIGHT; - case EL_PACMAN_UP: return GFX_PACMAN_UP; - case EL_PACMAN_LEFT: return GFX_PACMAN_LEFT; - case EL_PACMAN_DOWN: return GFX_PACMAN_DOWN; - case EL_POLAR_CROSS_00: return GFX_POLAR_CROSS_00; - case EL_POLAR_CROSS_01: return GFX_POLAR_CROSS_01; - case EL_POLAR_CROSS_02: return GFX_POLAR_CROSS_02; - case EL_POLAR_CROSS_03: return GFX_POLAR_CROSS_03; - case EL_MIRROR_FIXED_00: return GFX_MIRROR_FIXED_00; - case EL_MIRROR_FIXED_01: return GFX_MIRROR_FIXED_01; - case EL_MIRROR_FIXED_02: return GFX_MIRROR_FIXED_02; - case EL_MIRROR_FIXED_03: return GFX_MIRROR_FIXED_03; - case EL_GATE_STONE: return GFX_GATE_STONE; - case EL_KEY: return GFX_KEY; - case EL_LIGHTBULB_ON: return GFX_LIGHTBULB_ON; - case EL_LIGHTBULB_OFF: return GFX_LIGHTBULB_OFF; - case EL_LIGHTBALL: return GFX_BALL_RED + RND(3);; - case EL_BLOCK_STONE: return GFX_BLOCK_STONE; - case EL_GATE_WOOD: return GFX_GATE_WOOD; - case EL_FUEL_FULL: return GFX_FUEL_FULL; - case EL_GRID_WOOD_00: return GFX_GRID_WOOD_00; - case EL_GRID_WOOD_01: return GFX_GRID_WOOD_01; - case EL_GRID_WOOD_02: return GFX_GRID_WOOD_02; - case EL_GRID_WOOD_03: return GFX_GRID_WOOD_03; - case EL_FUEL_EMPTY: return GFX_FUEL_EMPTY; - case EL_FUSE_OFF: return GFX_FUSE_OFF; - case EL_PACMAN: return GFX_PACMAN; - case EL_REFRACTOR: return GFX_REFRACTOR; - case EL_CELL: return GFX_CELL; - case EL_MINE: return GFX_MINE; - - /* pseudo-graphics; will be mapped to other graphics */ - case EL_WALL_STEEL: return GFX_WALL_STEEL; - case EL_WALL_WOOD: return GFX_WALL_WOOD; - case EL_WALL_ICE: return GFX_WALL_ICE; - case EL_WALL_AMOEBA: return GFX_WALL_AMOEBA; - case EL_DF_WALL_STEEL: return GFX_DF_WALL_STEEL; - case EL_DF_WALL_WOOD: return GFX_DF_WALL_WOOD; + case EL_LIGHTBALL: + return IMG_MM_LIGHTBALL_RED + RND(3); default: - { - boolean ed = (game_status == LEVELED); - int base_element = get_base_element(element); - int element_phase = element - base_element; - int base_graphic; - - if (IS_BEAMER(element)) - element_phase = element - EL_BEAMER_RED_START; - else if (IS_FIBRE_OPTIC(element)) - element_phase = element - EL_FIBRE_OPTIC_START; - - if (IS_MIRROR(element)) - base_graphic = GFX_MIRROR_START; - else if (IS_BEAMER_OLD(element)) - base_graphic = GFX_BEAMER_START; - else if (IS_POLAR(element)) - base_graphic = GFX_POLAR_START; - else if (IS_CHAR(element)) - base_graphic = GFX_CHAR_START; - else if (IS_GRID_WOOD_FIXED(element)) - base_graphic = GFX_GRID_WOOD_FIXED_00; - else if (IS_GRID_STEEL_FIXED(element)) - base_graphic = GFX_GRID_STEEL_FIXED_00; - else if (IS_DF_MIRROR(element)) - base_graphic = GFX_DF_MIRROR_00; - else if (IS_LASER(element)) - base_graphic = GFX_LASER_RIGHT; - else if (IS_RECEIVER(element)) - base_graphic = GFX_RECEIVER_RIGHT; - else if (IS_DF_MIRROR(element)) - base_graphic = GFX_DF_MIRROR_00; - else if (IS_FIBRE_OPTIC(element)) - base_graphic = (ed ? GFX_FIBRE_OPTIC_ED_00 : GFX_FIBRE_OPTIC_00); - else if (IS_GRID_WOOD_AUTO(element)) - base_graphic = (ed ? GFX_GRID_WOOD_AUTO_00 : GFX_GRID_WOOD_FIXED_00); - else if (IS_GRID_STEEL_AUTO(element)) - base_graphic = (ed ? GFX_GRID_STEEL_AUTO_00 : GFX_GRID_STEEL_FIXED_00); - else if (IS_DF_MIRROR_AUTO(element)) - base_graphic = (ed ? GFX_DF_MIRROR_AUTO_00 : GFX_DF_MIRROR_00); - else if (IS_BEAMER(element)) - base_graphic = GFX_BEAMER_RED_START; - else - return GFX_EMPTY; - - return base_graphic + element_phase; - } + return el2img_mm(element); } } @@ -848,5 +741,6 @@ void RedrawPlayfield_MM() void BlitScreenToBitmap_MM(Bitmap *target_bitmap) { - BlitBitmap(drawto_field, target_bitmap, 0, 0, SXSIZE, SYSIZE, SX, SY); + BlitBitmap(drawto_field, target_bitmap, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, REAL_SX, REAL_SY); } -- 2.34.1