projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed various graphics functions for Mirror Magic game engine
[rocksndiamonds.git]
/
src
/
game_mm
/
mm_game.c
diff --git
a/src/game_mm/mm_game.c
b/src/game_mm/mm_game.c
index 9534849f1341077ed8483e1e4a5f9f4a8da9067d..6b8d02aeba340cbae2f6c72d414747dc6904344f 100644
(file)
--- 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))
{
}
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);
InitMovDir_MM(x, y);
-#endif
}
else if (IS_MCDUFFIN(element) || IS_LASER(element))
{
}
else if (IS_MCDUFFIN(element) || IS_LASER(element))
{
@@
-353,7
+344,9
@@
void InitGameEngine_MM()
}
}
}
}
+#if 0
CloseDoor(DOOR_CLOSE_1);
CloseDoor(DOOR_CLOSE_1);
+#endif
DrawLevel_MM();
InitCycleElements();
DrawLevel_MM();
InitCycleElements();
@@
-374,13
+367,10
@@
void InitGameEngine_MM()
int2str(game_mm.score, 4), FONT_TEXT_2);
#endif
int2str(game_mm.score, 4), FONT_TEXT_2);
#endif
+#if 0
UnmapGameButtons();
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();
MapGameButtons();
+#endif
#if 0
/* copy actual game door content to door double buffer for OpenDoor() */
#if 0
/* copy actual game door content to door double buffer for OpenDoor() */
@@
-388,7
+378,9
@@
void InitGameEngine_MM()
DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
#endif
DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
#endif
+#if 0
OpenDoor(DOOR_OPEN_ALL);
OpenDoor(DOOR_OPEN_ALL);
+#endif
if (setup.sound_loops)
PlaySoundExt(SND_FUEL, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, SND_CTRL_PLAY_LOOP);
if (setup.sound_loops)
PlaySoundExt(SND_FUEL, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, SND_CTRL_PLAY_LOOP);
@@
-475,13
+467,13
@@
boolean StepBehind()
static int getMaskFromElement(int element)
{
if (IS_GRID(element))
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))
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))
else if (IS_RECTANGLE(element) || IS_DF_GRID(element))
- return
GFX
_MASK_RECTANGLE;
+ return
IMG_MM
_MASK_RECTANGLE;
else
else
- return
GFX
_MASK_CIRCLE;
+ return
IMG_MM
_MASK_CIRCLE;
}
int ScanPixel()
}
int ScanPixel()
@@
-499,7
+491,7
@@
int ScanPixel()
int i;
#if 0
int i;
#if 0
- /* for s
ecuri
ty */
+ /* for s
afe
ty */
if (SX + LX < REAL_SX || SX + LX >= REAL_SX + FULL_SXSIZE ||
SY + LY < REAL_SY || SY + LY >= REAL_SY + FULL_SYSIZE)
{
if (SX + LX < REAL_SX || SX + LX >= REAL_SX + FULL_SXSIZE ||
SY + LY < REAL_SY || SY + LY >= REAL_SY + FULL_SYSIZE)
{
@@
-539,16
+531,15
@@
int ScanPixel()
int mask_x, mask_y;
int dx = px - lx * TILEX;
int dy = py - ly * TILEY;
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
}
}
else
@@
-579,23
+570,10
@@
void ScanLaser()
{
int element;
int end = 0, rf = laser.num_edges;
{
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;
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
DrawLaser(0, DL_LASER_ENABLED);
#if 0
@@
-658,7
+636,6
@@
void ScanLaser()
ELY = (LY - 2) / TILEY;
}
ELY = (LY - 2) / TILEY;
}
-
#if 0
printf("hit_mask (2) == '%x' (%d, %d) (%d, %d)\n",
hit_mask, LX, LY, ELX, ELY);
#if 0
printf("hit_mask (2) == '%x' (%d, %d) (%d, %d)\n",
hit_mask, LX, LY, ELX, ELY);
@@
-680,11
+657,6
@@
void ScanLaser()
printf("WARNING! (1) %d, %d (%d)\n", ELX, ELY, element);
#endif
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))
if (element == EL_EMPTY)
{
if (!HitOnlyAnEdge(element, hit_mask))
@@
-744,14
+716,6
@@
void ScanLaser()
rf = laser.num_edges;
}
rf = laser.num_edges;
}
- /*
- element = Feld[ELX][ELY];
- laser.dest_element = element;
- */
-
-
-
-
#if 0
if (laser.dest_element != Feld[ELX][ELY])
{
#if 0
if (laser.dest_element != Feld[ELX][ELY])
{
@@
-760,7
+724,6
@@
void ScanLaser()
}
#endif
}
#endif
-
if (!end && !laser.stops_inside_element && !StepBehind())
{
#if 0
if (!end && !laser.stops_inside_element && !StepBehind())
{
#if 0
@@
-777,19
+740,10
@@
void ScanLaser()
Ct = CT = Counter();
Ct = CT = Counter();
-
#if 0
if (!IN_LEV_FIELD(ELX, ELY))
printf("WARNING! (2) %d, %d\n", ELX, ELY);
#endif
#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)
}
void DrawLaserExt(int start_edge, int num_edges, int mode)
@@
-871,7
+825,6
@@
void DrawLaserExt(int start_edge, int num_edges, int mode)
ely = laser.damage[damage_start].y;
element = Feld[elx][ely];
ely = laser.damage[damage_start].y;
element = Feld[elx][ely];
-
#if 0
if (IS_BEAMER(element))
{
#if 0
if (IS_BEAMER(element))
{
@@
-1071,18
+1024,6
@@
boolean HitElement(int element, int hit_mask)
AddDamagedField(ELX, ELY);
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)
{
/* 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
+1048,6
@@
boolean HitElement(int element, int hit_mask)
return FALSE;
}
return FALSE;
}
-#endif
#if 0
printf("HitElement (2): element == %d\n", element);
#if 0
printf("HitElement (2): element == %d\n", element);
@@
-1252,11
+1192,6
@@
boolean HitElement(int element, int hit_mask)
if (element == EL_KETTLE || element == EL_CELL)
{
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)
RaiseScore_MM(10);
if (game_mm.kettles_still_needed == 0)
@@
-1491,18
+1426,6
@@
boolean HitPolarizer(int element, int hit_mask)
if (laser.current_angle == grid_angle ||
laser.current_angle == get_opposite_angle(grid_angle))
{
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
{
/* skip the whole element before continuing the scan */
do
{
@@
-1521,7
+1444,6
@@
boolean HitPolarizer(int element, int hit_mask)
LX -= XS;
LY -= YS;
}
LX -= XS;
LY -= YS;
}
-#endif
AddLaserEdge(LX, LY);
AddLaserEdge(LX, LY);
@@
-2045,14
+1967,7
@@
void OpenSurpriseBall(int x, int y)
if (MovDelay[x][y]) /* wait some time before next frame */
{
if (MovDelay[x][y]) /* wait some time before next frame */
{
-#if 0
- int phase;
-#endif
-
MovDelay[x][y]--;
MovDelay[x][y]--;
-#if 0
- phase = MovDelay[x][y] / delay;
-#endif
if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y))
{
Bitmap *bitmap;
if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y))
{
Bitmap *bitmap;
@@
-2161,9
+2076,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;
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;
laser.redraw = TRUE;
@@
-2203,10
+2115,6
@@
static void Explode_MM(int x, int y, int phase, int mode)
if (phase == last_phase)
{
if (phase == last_phase)
{
-#if 0
- int element;
-#endif
-
if (Store[x][y] == EL_BOMB)
{
laser.num_damages--;
if (Store[x][y] == EL_BOMB)
{
laser.num_damages--;
@@
-2223,9
+2131,6
@@
static void Explode_MM(int x, int y, int phase, int mode)
Store[x][y] = EL_EMPTY;
}
Store[x][y] = EL_EMPTY;
}
-#if 0
- element = Feld[x][y] = Store[x][y];
-#endif
Store[x][y] = Store2[x][y] = 0;
MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0;
InitField(x, y, FALSE);
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)))
{
}
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);
int graphic_phase = (phase / delay - 1);
+ Bitmap *bitmap;
+ int src_x, src_y;
if (Store2[x][y] == EX_KETTLE)
{
if (graphic_phase < 3)
if (Store2[x][y] == EX_KETTLE)
{
if (graphic_phase < 3)
- graphic =
GFX_EXPLOSION_KETTLE
;
+ graphic =
IMG_MM_KETTLE_EXPLODING
;
else if (graphic_phase < 5)
{
else if (graphic_phase < 5)
{
- graphic = GFX_EXPLOSION_LAST;
- graphic_phase -= graphic_phase;
+ graphic_phase += 3;
}
else
{
}
else
{
- graphic =
GFX
_EMPTY;
+ graphic =
IMG
_EMPTY;
graphic_phase = 0;
}
}
else if (Store2[x][y] == EX_SHORT)
{
if (graphic_phase < 4)
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;
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];
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;
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;
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)
{
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;
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;
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;
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)
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);
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)
{
}
else if (element == EL_LIGHTBALL)
{
@@
-2795,24
+2686,12
@@
void GameActions_MM(byte action[MAX_PLAYERS], boolean warp_mode)
static unsigned int pacman_delay = 0;
static unsigned int energy_delay = 0;
static unsigned int overload_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;
int element;
int x, y, i;
int r, d;
-#if 1
WaitUntilDelayReached(&action_delay, GameFrameDelay);
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<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
Stop[x][y] = FALSE;
for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
Stop[x][y] = FALSE;
@@
-3091,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);
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)
}
if (element == EL_BALL_GRAY && CT > 1500)
@@
-3529,7
+3408,7
@@
void MovePacMen()
game_mm.pacman[p].x = nx;
game_mm.pacman[p].y = ny;
g = Feld[nx][ny] - EL_PACMAN_RIGHT;
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)
{
if (element != EL_EMPTY)
{
@@
-3551,11
+3430,6
@@
void MovePacMen()
SX + g * TILEX, SY + 4 * TILEY, TILEX, TILEY,
ox + i * mx, oy + i * my);
#endif
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;
}
}
Ct = Ct + Counter() - CT;
}