X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_mm%2Fmm_game.c;h=4f4af5f87c9aac8c71acb7a51ab4ffd0803cf6e6;hb=e67a93043d558993882f89c5f2a933882f934a29;hp=9534849f1341077ed8483e1e4a5f9f4a8da9067d;hpb=06128e16cb5b3837d7c436f08f9ccd6ea6f91b8c;p=rocksndiamonds.git diff --git a/src/game_mm/mm_game.c b/src/game_mm/mm_game.c index 9534849f..4f4af5f8 100644 --- a/src/game_mm/mm_game.c +++ b/src/game_mm/mm_game.c @@ -202,16 +202,7 @@ static void InitField(int x, int y, boolean init_game) } else if (IS_PACMAN(element)) { -#if 0 - int phase = element - EL_PACMAN_RIGHT; - - game_mm.pacman[game_mm.num_pacman].x = x; - game_mm.pacman[game_mm.num_pacman].y = y; - game_mm.pacman[game_mm.num_pacman].dir = phase + ((phase + 1) % 2) * 2; - game_mm.num_pacman++; -#else InitMovDir_MM(x, y); -#endif } else if (IS_MCDUFFIN(element) || IS_LASER(element)) { @@ -353,9 +344,15 @@ void InitGameEngine_MM() } } +#if 0 CloseDoor(DOOR_CLOSE_1); +#endif DrawLevel_MM(); +} + +void InitGameEngine_MM_AfterFadingIn() +{ InitCycleElements(); InitLaser(); @@ -374,13 +371,10 @@ void InitGameEngine_MM() int2str(game_mm.score, 4), FONT_TEXT_2); #endif +#if 0 UnmapGameButtons(); - /* - game_gadget[SOUND_CTRL_ID_MUSIC]->checked = setup.sound_music; - game_gadget[SOUND_CTRL_ID_LOOPS]->checked = setup.sound_loops; - game_gadget[SOUND_CTRL_ID_SIMPLE]->checked = setup.sound_simple; - */ MapGameButtons(); +#endif #if 0 /* copy actual game door content to door double buffer for OpenDoor() */ @@ -388,7 +382,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); @@ -475,13 +471,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() @@ -499,7 +495,7 @@ int ScanPixel() int i; #if 0 - /* for security */ + /* for safety */ if (SX + LX < REAL_SX || SX + LX >= REAL_SX + FULL_SXSIZE || SY + LY < REAL_SY || SY + LY >= REAL_SY + FULL_SYSIZE) { @@ -511,53 +507,47 @@ int ScanPixel() for (i=0; i<4; i++) { + int px = LX + (i % 2) * 2; + int py = LY + (i / 2) * 2; + int dx = px % TILEX; + int dy = py % TILEY; + int lx = (px + TILEX) / TILEX - 1; /* ...+TILEX...-1 to get correct */ + int ly = (py + TILEY) / TILEY - 1; /* negative values! */ Pixel pixel; - int px, py, lx, ly; - - px = SX + LX + (i % 2) * 2; - py = SY + LY + (i / 2) * 2; - lx = (px - SX + TILEX) / TILEX - 1; /* ...+TILEX...-1 to get correct */ - ly = (py - SY + TILEY) / TILEY - 1; /* negative values! */ if (IN_LEV_FIELD(lx, ly)) { int element = Feld[lx][ly]; if (element == EL_EMPTY || element == EL_EXPLODING_TRANSP) + { pixel = 0; + } else if (IS_WALL(element) || IS_WALL_CHANGING(element)) { - int pos = - ((py - SY - ly * TILEY) / MINI_TILEX) * 2 + - (px - SX - lx * TILEX) / MINI_TILEY; + int pos = dy / MINI_TILEY * 2 + dx / MINI_TILEX; pixel = ((element & (1 << pos)) ? 1 : 0); } else { int graphic_mask = getMaskFromElement(element); + Bitmap *bitmap; + int src_x, src_y; int mask_x, mask_y; - int dx = px - lx * TILEX; - int dy = py - ly * TILEY; - 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 { - if (px < REAL_SX || px >= REAL_SX + FULL_SXSIZE || - py < REAL_SY || py >= REAL_SY + FULL_SYSIZE) - pixel = 1; - else - pixel = 0; + pixel = (SX + px < REAL_SX || SX + px >= REAL_SX + FULL_SXSIZE || + SY + py < REAL_SY || SY + py >= REAL_SY + FULL_SYSIZE); } if ((Sign[laser.current_angle] & (1 << i)) && pixel) @@ -579,23 +569,10 @@ void ScanLaser() { int element; int end = 0, rf = laser.num_edges; -#if 0 - unsigned short color_scale = 0xFFFF / 15; -#endif -#if 0 - int testx, testy; -#endif laser.overloaded = FALSE; laser.stops_inside_element = FALSE; -#if 0 - if (laser.overload_value < MAX_LASER_OVERLOAD - 8) - SetRGB(pen_ray, - (laser.overload_value / 6) * color_scale, 0x0000, - (15 - (laser.overload_value / 6)) * color_scale); -#endif - DrawLaser(0, DL_LASER_ENABLED); #if 0 @@ -658,7 +635,6 @@ void ScanLaser() ELY = (LY - 2) / TILEY; } - #if 0 printf("hit_mask (2) == '%x' (%d, %d) (%d, %d)\n", hit_mask, LX, LY, ELX, ELY); @@ -680,11 +656,6 @@ void ScanLaser() printf("WARNING! (1) %d, %d (%d)\n", ELX, ELY, element); #endif -#if 0 - testx = ELX; - testy = ELY; -#endif - if (element == EL_EMPTY) { if (!HitOnlyAnEdge(element, hit_mask)) @@ -744,14 +715,6 @@ void ScanLaser() rf = laser.num_edges; } - /* - element = Feld[ELX][ELY]; - laser.dest_element = element; - */ - - - - #if 0 if (laser.dest_element != Feld[ELX][ELY]) { @@ -760,7 +723,6 @@ void ScanLaser() } #endif - if (!end && !laser.stops_inside_element && !StepBehind()) { #if 0 @@ -777,19 +739,10 @@ void ScanLaser() Ct = CT = Counter(); - #if 0 if (!IN_LEV_FIELD(ELX, ELY)) printf("WARNING! (2) %d, %d\n", ELX, ELY); #endif - - -#if 0 - printf("(%d, %d) == %d [(%d, %d) == %d]\n", - testx, testy, laser.dest_element, - ELX, ELY, (IN_SCR_FIELD(ELX,ELY) ? Feld[ELX][ELY] : -1)); -#endif - } void DrawLaserExt(int start_edge, int num_edges, int mode) @@ -871,7 +824,6 @@ void DrawLaserExt(int start_edge, int num_edges, int mode) ely = laser.damage[damage_start].y; element = Feld[elx][ely]; - #if 0 if (IS_BEAMER(element)) { @@ -1071,18 +1023,6 @@ boolean HitElement(int element, int hit_mask) AddDamagedField(ELX, ELY); -#if 0 - if (ELX != (LX + 5 * XS) / TILEX || - ELY != (LY + 5 * YS) / TILEY) - { - LX += 2 * XS; - LY += 2 * YS; - - return FALSE; - } - -#else - /* this is more precise: check if laser would go through the center */ if ((ELX * TILEX + 14 - LX) * YS != (ELY * TILEY + 14 - LY) * XS) { @@ -1107,7 +1047,6 @@ boolean HitElement(int element, int hit_mask) return FALSE; } -#endif #if 0 printf("HitElement (2): element == %d\n", element); @@ -1252,11 +1191,6 @@ boolean HitElement(int element, int hit_mask) if (element == EL_KETTLE || element == EL_CELL) { -#if 0 - if (game_mm.kettles_still_needed) - DrawText(DX_KETTLES, DY_KETTLES, - int2str(--game_mm.kettles_still_needed, 3), FONT_TEXT_2); -#endif RaiseScore_MM(10); if (game_mm.kettles_still_needed == 0) @@ -1491,18 +1425,6 @@ boolean HitPolarizer(int element, int hit_mask) if (laser.current_angle == grid_angle || laser.current_angle == get_opposite_angle(grid_angle)) { -#if 0 - int step_size; - - if (!IS_22_5_ANGLE(laser.current_angle)) /* 90° or 45° angle */ - step_size = 8; - else - step_size = 4; - - LX += step_size * XS; - LY += step_size * YS; -#else - /* skip the whole element before continuing the scan */ do { @@ -1521,7 +1443,6 @@ boolean HitPolarizer(int element, int hit_mask) LX -= XS; LY -= YS; } -#endif AddLaserEdge(LX, LY); @@ -2045,14 +1966,7 @@ void OpenSurpriseBall(int x, int y) if (MovDelay[x][y]) /* wait some time before next frame */ { -#if 0 - int phase; -#endif - MovDelay[x][y]--; -#if 0 - phase = MovDelay[x][y] / delay; -#endif if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y)) { Bitmap *bitmap; @@ -2161,9 +2075,6 @@ static void Explode_MM(int x, int y, int phase, int mode) int num_phase = 9, delay = 2; int last_phase = num_phase * delay; int half_phase = (num_phase / 2) * delay; -#if 0 - int first_phase_after_start = EX_PHASE_START + 1; -#endif laser.redraw = TRUE; @@ -2203,10 +2114,6 @@ static void Explode_MM(int x, int y, int phase, int mode) if (phase == last_phase) { -#if 0 - int element; -#endif - if (Store[x][y] == EL_BOMB) { laser.num_damages--; @@ -2223,9 +2130,7 @@ static void Explode_MM(int x, int y, int phase, int mode) Store[x][y] = EL_EMPTY; } -#if 0 - element = Feld[x][y] = Store[x][y]; -#endif + Feld[x][y] = Store[x][y]; Store[x][y] = Store2[x][y] = 0; MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0; InitField(x, y, FALSE); @@ -2233,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; @@ -2262,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); } } @@ -2334,34 +2244,15 @@ void TurnRound(int x, int y) int element = Feld[x][y]; int old_move_dir = MovDir[x][y]; -#if 0 - int left_dir = turn[old_move_dir].left; -#endif int right_dir = turn[old_move_dir].right; int back_dir = turn[old_move_dir].back; - -#if 0 - int left_dx = move_xy[left_dir].x, left_dy = move_xy[left_dir].y; -#endif int right_dx = move_xy[right_dir].x, right_dy = move_xy[right_dir].y; - -#if 0 - int left_x = x+left_dx, left_y = y+left_dy; -#endif int right_x = x+right_dx, right_y = y+right_dy; if (element == EL_PACMAN) { -#if 0 - boolean can_turn_left = FALSE; -#endif boolean can_turn_right = FALSE; -#if 0 - if (IN_LEV_FIELD(left_x, left_y) && - IS_EATABLE4PACMAN(Feld[left_x][left_y])) - can_turn_left = TRUE; -#endif if (IN_LEV_FIELD(right_x, right_y) && IS_EATABLE4PACMAN(Feld[right_x][right_y])) can_turn_right = TRUE; @@ -2544,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) @@ -2555,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) { @@ -2789,30 +2680,18 @@ void ColorCycling(void) } } -void GameActions_MM(byte action[MAX_PLAYERS], boolean warp_mode) +static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode) { static unsigned int action_delay = 0; static unsigned int pacman_delay = 0; static unsigned int energy_delay = 0; static unsigned int overload_delay = 0; -#if 0 - unsigned short color_scale = 0xFFFF / 15; -#endif int element; int x, y, i; int r, d; -#if 1 WaitUntilDelayReached(&action_delay, GameFrameDelay); -#else - if (!DelayReached(&action_delay, GameFrameDelay)) - { - if (!PendingEvent()) /* delay only if no pending events */ - Delay(10); - return; - } -#endif for (y=0; y 1500) @@ -3477,6 +3356,14 @@ void GameActions_MM(byte action[MAX_PLAYERS], boolean warp_mode) return; } +void GameActions_MM(byte action[MAX_PLAYERS], boolean warp_mode) +{ + if (!button_status) + ClickElement(0, 0, MB_NOT_PRESSED); + + GameActions_MM_Ext(action, warp_mode); +} + void MovePacMen() { static int p = -1; @@ -3529,7 +3416,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) { @@ -3551,11 +3438,6 @@ void MovePacMen() SX + g * TILEX, SY + 4 * TILEY, TILEX, TILEY, ox + i * mx, oy + i * my); #endif - -#if 0 - FlushDisplay(); - Delay(1); -#endif } Ct = Ct + Counter() - CT; }