projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added unpausing tape by key or mouse button for appropriate tape mode
[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 22d2065b5bc904a5a5c02d37fd30372c095e2bca..a649d2333583832d335f48dd8a0d6e59669907ea 100644
(file)
--- a/
src/game_mm/mm_game.c
+++ b/
src/game_mm/mm_game.c
@@
-55,20
+55,23
@@
#define IS_MUSIC_SOUND(s) ((s) == SND_TYGER || (s) == SND_VOYAGER)
/* game button identifiers */
#define IS_MUSIC_SOUND(s) ((s) == SND_TYGER || (s) == SND_VOYAGER)
/* game button identifiers */
-#define GAME_CTRL_ID_LEFT
0
-#define GAME_CTRL_ID_MIDDLE
1
-#define GAME_CTRL_ID_RIGHT
2
+#define GAME_CTRL_ID_LEFT 0
+#define GAME_CTRL_ID_MIDDLE 1
+#define GAME_CTRL_ID_RIGHT 2
-#define NUM_GAME_BUTTONS
3
+#define NUM_GAME_BUTTONS 3
/* values for DrawLaser() */
/* values for DrawLaser() */
-#define DL_LASER_DISABLED
0
-#define DL_LASER_ENABLED
1
+#define DL_LASER_DISABLED 0
+#define DL_LASER_ENABLED 1
/* values for 'click_delay_value' in ClickElement() */
#define CLICK_DELAY_SHORT 125
#define CLICK_DELAY_LONG 250
/* values for 'click_delay_value' in ClickElement() */
#define CLICK_DELAY_SHORT 125
#define CLICK_DELAY_LONG 250
+
#define AUTO_ROTATE_DELAY CLICK_DELAY_SHORT
#define AUTO_ROTATE_DELAY CLICK_DELAY_SHORT
+#define INIT_GAME_ACTIONS_DELAY ONE_SECOND_DELAY
+#define NUM_INIT_CYCLE_STEPS 16
/* forward declaration for internal use */
static int MovingOrBlocked2Element_MM(int, int);
/* forward declaration for internal use */
static int MovingOrBlocked2Element_MM(int, int);
@@
-114,9
+117,9
@@
static void InitMovDir_MM(int x, int y)
int element = Feld[x][y];
static int direction[3][4] =
{
int element = Feld[x][y];
static int direction[3][4] =
{
- { MV_RIGHT, MV_UP, MV_LEFT, MV_DOWN },
- { MV_LEFT, MV_DOWN,
MV_RIGHT, MV_UP
},
- { MV_LEFT, MV_RIGHT, MV_UP, MV_DOWN }
+ { MV_RIGHT, MV_UP,
MV_LEFT, MV_DOWN },
+ { MV_LEFT, MV_DOWN,
MV_RIGHT, MV_UP
},
+ { MV_LEFT, MV_RIGHT, MV_UP,
MV_DOWN }
};
switch(element)
};
switch(element)
@@
-215,41
+218,28
@@
static void InitField(int x, int y, boolean init_game)
}
}
}
}
-static void InitCycleElements()
+static void InitCycleElements
_RotateSingleStep
()
{
{
- int i
, j
;
+ int i;
if (game_mm.num_cycle == 0) /* no elements to cycle */
return;
if (game_mm.num_cycle == 0) /* no elements to cycle */
return;
- for
(i=0; i<16
; i++)
+ for
(i = 0; i < game_mm.num_cycle
; i++)
{
{
- for(j=0; j<game_mm.num_cycle; j++)
- {
- int x = game_mm.cycle[j].x;
- int y = game_mm.cycle[j].y;
- int step = SIGN(game_mm.cycle[j].steps);
- int last_element = Feld[x][y];
- int next_element = get_rotated_element(last_element, step);
-
- if (!game_mm.cycle[j].steps)
- continue;
+ int x = game_mm.cycle[i].x;
+ int y = game_mm.cycle[i].y;
+ int step = SIGN(game_mm.cycle[i].steps);
+ int last_element = Feld[x][y];
+ int next_element = get_rotated_element(last_element, step);
- Feld[x][y] = next_element;
-
- DrawField_MM(x, y);
- game_mm.cycle[j].steps -= step;
- }
-
- BackToFront();
- ColorCycling();
-
-#ifdef DEBUG
- if (setup.quick_doors)
+ if (!game_mm.cycle[i].steps)
continue;
continue;
-#endif
- Delay(AUTO_ROTATE_DELAY);
+ Feld[x][y] = next_element;
+
+ DrawField_MM(x, y);
+ game_mm.cycle[i].steps -= step;
}
}
}
}
@@
-292,15
+282,12
@@
void InitGameEngine_MM()
{
int i, x, y;
{
int i, x, y;
- /* set global editor control values */
- editor.draw_walls_masked = FALSE;
-
/* set global game control values */
game_mm.num_cycle = 0;
game_mm.num_pacman = 0;
game_mm.score = 0;
/* set global game control values */
game_mm.num_cycle = 0;
game_mm.num_pacman = 0;
game_mm.score = 0;
- game_mm.energy_left =
native_mm_level.time;
+ game_mm.energy_left =
0; // later set to "native_mm_level.time"
game_mm.kettles_still_needed =
(native_mm_level.auto_count_kettles ? 0 : native_mm_level.kettles_needed);
game_mm.lights_still_needed = 0;
game_mm.kettles_still_needed =
(native_mm_level.auto_count_kettles ? 0 : native_mm_level.kettles_needed);
game_mm.lights_still_needed = 0;
@@
-310,12
+297,14
@@
void InitGameEngine_MM()
game_mm.game_over = FALSE;
game_mm.game_over_cause = 0;
game_mm.game_over = FALSE;
game_mm.game_over_cause = 0;
+ game_mm.laser_overload_value = 0;
+
/* set global laser control values (must be set before "InitLaser()") */
laser.start_edge.x = 0;
laser.start_edge.y = 0;
laser.start_angle = 0;
/* set global laser control values (must be set before "InitLaser()") */
laser.start_edge.x = 0;
laser.start_edge.y = 0;
laser.start_angle = 0;
- for (i
=0; i<
MAX_NUM_BEAMERS; i++)
+ for (i
= 0; i <
MAX_NUM_BEAMERS; i++)
laser.beamer[i][0].num = laser.beamer[i][1].num = 0;
laser.overloaded = FALSE;
laser.beamer[i][0].num = laser.beamer[i][1].num = 0;
laser.overloaded = FALSE;
@@
-328,9
+317,9
@@
void InitGameEngine_MM()
CT = Ct = 0;
CT = Ct = 0;
- for (x
=0; x<
lev_fieldx; x++)
+ for (x
= 0; x <
lev_fieldx; x++)
{
{
- for (y
=0; y<
lev_fieldy; y++)
+ for (y
= 0; y <
lev_fieldy; y++)
{
Feld[x][y] = Ur[x][y];
Hit[x][y] = Box[x][y] = 0;
{
Feld[x][y] = Ur[x][y];
Hit[x][y] = Box[x][y] = 0;
@@
-351,9
+340,12
@@
void InitGameEngine_MM()
DrawLevel_MM();
}
DrawLevel_MM();
}
-void InitGame
Engine_MM_AfterFadingIn
()
+void InitGame
Actions_MM
()
{
{
- InitCycleElements();
+ int num_init_game_frames = INIT_GAME_ACTIONS_DELAY / GAME_FRAME_DELAY;
+ int cycle_steps_done = 0;
+ int i;
+
InitLaser();
#if 0
InitLaser();
#if 0
@@
-389,21
+381,22
@@
void InitGameEngine_MM_AfterFadingIn()
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);
-#if 0 // !!! TEMPORARILY DISABLED !!!
- for(i=0; i<=game_mm.energy_left; i+=2)
+ for (i = 0; i <= num_init_game_frames; i++)
{
if (!setup.sound_loops)
PlaySoundStereo(SND_FUEL, SOUND_MAX_RIGHT);
{
if (!setup.sound_loops)
PlaySoundStereo(SND_FUEL, SOUND_MAX_RIGHT);
-#if 0
- BlitBitmap(pix[PIX_DOOR], drawto,
- DOOR_GFX_PAGEX4 + XX_ENERGY,
- DOOR_GFX_PAGEY1 + YY_ENERGY + ENERGY_YSIZE - i,
- ENERGY_XSIZE, i,
- DX_ENERGY, DY_ENERGY + ENERGY_YSIZE - i);
-#endif
+ game_mm.energy_left = native_mm_level.time * i / num_init_game_frames;
+
+ UpdateAndDisplayGameControlValues();
+
+ while (cycle_steps_done < NUM_INIT_CYCLE_STEPS * i / num_init_game_frames)
+ {
+ InitCycleElements_RotateSingleStep();
+
+ cycle_steps_done++;
+ }
- redraw_mask |= REDRAW_DOOR_1;
BackToFront();
ColorCycling();
BackToFront();
ColorCycling();
@@
-412,13
+405,10
@@
void InitGameEngine_MM_AfterFadingIn()
if (setup.quick_doors)
continue;
#endif
if (setup.quick_doors)
continue;
#endif
-
- Delay(20);
}
if (setup.sound_loops)
StopSound(SND_FUEL);
}
if (setup.sound_loops)
StopSound(SND_FUEL);
-#endif
#if 0
if (setup.sound_music && num_bg_loops)
#if 0
if (setup.sound_music && num_bg_loops)
@@
-433,6
+423,7
@@
void AddLaserEdge(int lx, int ly)
if (lx < -2 || ly < -2 || lx >= SXSIZE + 2 || ly >= SYSIZE + 2)
{
Error(ERR_WARN, "AddLaserEdge: out of bounds: %d, %d", lx, ly);
if (lx < -2 || ly < -2 || lx >= SXSIZE + 2 || ly >= SYSIZE + 2)
{
Error(ERR_WARN, "AddLaserEdge: out of bounds: %d, %d", lx, ly);
+
return;
}
return;
}
@@
-464,8
+455,8
@@
boolean StepBehind()
return ((x - last_x) * XS < 0 || (y - last_y) * YS < 0);
}
return ((x - last_x) * XS < 0 || (y - last_y) * YS < 0);
}
- else
-
return FALSE;
+
+ return FALSE;
}
static int getMaskFromElement(int element)
}
static int getMaskFromElement(int element)
@@
-505,7
+496,7
@@
int ScanPixel()
}
#endif
}
#endif
- for (i
=0; i<
4; i++)
+ for (i
= 0; i <
4; i++)
{
int px = LX + (i % 2) * 2;
int py = LY + (i / 2) * 2;
{
int px = LX + (i % 2) * 2;
int py = LY + (i / 2) * 2;
@@
-570,6
+561,10
@@
void ScanLaser()
int element;
int end = 0, rf = laser.num_edges;
int element;
int end = 0, rf = laser.num_edges;
+ /* do not scan laser again after the game was lost for whatever reason */
+ if (game_mm.game_over)
+ return;
+
laser.overloaded = FALSE;
laser.stops_inside_element = FALSE;
laser.overloaded = FALSE;
laser.stops_inside_element = FALSE;
@@
-588,6
+583,7
@@
void ScanLaser()
{
end = 1;
laser.overloaded = TRUE;
{
end = 1;
laser.overloaded = TRUE;
+
break;
}
break;
}
@@
-677,6
+673,7
@@
void ScanLaser()
if (HitBlock(element, hit_mask))
{
rf = 1;
if (HitBlock(element, hit_mask))
{
rf = 1;
+
break;
}
}
break;
}
}
@@
-731,6
+728,7
@@
void ScanLaser()
LX -= XS;
LY -= YS;
LX -= XS;
LY -= YS;
+
AddLaserEdge(LX, LY);
}
AddLaserEdge(LX, LY);
}
@@
-758,12
+756,14
@@
void DrawLaserExt(int start_edge, int num_edges, int mode)
if (start_edge < 0)
{
Error(ERR_WARN, "DrawLaserExt: start_edge < 0");
if (start_edge < 0)
{
Error(ERR_WARN, "DrawLaserExt: start_edge < 0");
+
return;
}
if (num_edges < 0)
{
Error(ERR_WARN, "DrawLaserExt: num_edges < 0");
return;
}
if (num_edges < 0)
{
Error(ERR_WARN, "DrawLaserExt: num_edges < 0");
+
return;
}
return;
}
@@
-792,18
+792,19
@@
void DrawLaserExt(int start_edge, int num_edges, int mode)
/* determine the starting edge, from which graphics need to be restored */
if (start_edge > 0)
{
/* determine the starting edge, from which graphics need to be restored */
if (start_edge > 0)
{
- for
(i=0; i<
laser.num_damages; i++)
+ for
(i = 0; i <
laser.num_damages; i++)
{
if (laser.damage[i].edge == start_edge + 1)
{
damage_start = i;
{
if (laser.damage[i].edge == start_edge + 1)
{
damage_start = i;
+
break;
}
}
}
/* restore graphics from this starting edge to the end of damage list */
break;
}
}
}
/* restore graphics from this starting edge to the end of damage list */
- for
(i=damage_start; i<
laser.num_damages; i++)
+ for
(i = damage_start; i <
laser.num_damages; i++)
{
int lx = laser.damage[i].x;
int ly = laser.damage[i].y;
{
int lx = laser.damage[i].x;
int ly = laser.damage[i].y;
@@
-829,7
+830,7
@@
void DrawLaserExt(int start_edge, int num_edges, int mode)
{
int i;
{
int i;
- for (i
=0; i<
laser.num_beamers; i++)
+ for (i
= 0; i <
laser.num_beamers; i++)
printf("-> %d\n", laser.beamer_edge[i]);
printf("DrawLaserExt: IS_BEAMER: [%d]: Hit[%d][%d] == %d [%d]\n",
mode, elx, ely, Hit[elx][ely], start_edge);
printf("-> %d\n", laser.beamer_edge[i]);
printf("DrawLaserExt: IS_BEAMER: [%d]: Hit[%d][%d] == %d [%d]\n",
mode, elx, ely, Hit[elx][ely], start_edge);
@@
-844,6
+845,7
@@
void DrawLaserExt(int start_edge, int num_edges, int mode)
{
/* element is outgoing beamer */
laser.num_damages = damage_start + 1;
{
/* element is outgoing beamer */
laser.num_damages = damage_start + 1;
+
if (IS_BEAMER(element))
laser.current_angle = get_element_angle(element);
}
if (IS_BEAMER(element))
laser.current_angle = get_element_angle(element);
}
@@
-866,6
+868,7
@@
void DrawLaserExt(int start_edge, int num_edges, int mode)
laser.num_edges = start_edge + 1;
if (start_edge == 0)
laser.current_angle = laser.start_angle;
laser.num_edges = start_edge + 1;
if (start_edge == 0)
laser.current_angle = laser.start_angle;
+
LX = laser.edge[start_edge].x - (SX + 2);
LY = laser.edge[start_edge].y - (SY + 2);
XS = 2 * Step[laser.current_angle].x;
LX = laser.edge[start_edge].x - (SX + 2);
LY = laser.edge[start_edge].y - (SY + 2);
XS = 2 * Step[laser.current_angle].x;
@@
-936,6
+939,7
@@
void DrawLaser(int start_edge, int mode)
if (laser.num_edges - start_edge < 0)
{
Error(ERR_WARN, "DrawLaser: laser.num_edges - start_edge < 0");
if (laser.num_edges - start_edge < 0)
{
Error(ERR_WARN, "DrawLaser: laser.num_edges - start_edge < 0");
+
return;
}
return;
}
@@
-949,7
+953,7
@@
void DrawLaser(int start_edge, int mode)
int tmp_start_edge = start_edge;
/* draw laser segments forward from the start to the last beamer */
int tmp_start_edge = start_edge;
/* draw laser segments forward from the start to the last beamer */
- for (i
=0; i<
laser.num_beamers; i++)
+ for (i
= 0; i <
laser.num_beamers; i++)
{
int tmp_num_edges = laser.beamer_edge[i] - tmp_start_edge;
{
int tmp_num_edges = laser.beamer_edge[i] - tmp_start_edge;
@@
-962,6
+966,7
@@
void DrawLaser(int start_edge, int mode)
#endif
DrawLaserExt(tmp_start_edge, tmp_num_edges, DL_LASER_ENABLED);
#endif
DrawLaserExt(tmp_start_edge, tmp_num_edges, DL_LASER_ENABLED);
+
tmp_start_edge = laser.beamer_edge[i];
}
tmp_start_edge = laser.beamer_edge[i];
}
@@
-976,7
+981,7
@@
void DrawLaser(int start_edge, int mode)
int num_beamers = laser.num_beamers;
/* delete laser segments backward from the end to the first beamer */
int num_beamers = laser.num_beamers;
/* delete laser segments backward from the end to the first beamer */
- for (i
=num_beamers-1; i>=
0; i--)
+ for (i
= num_beamers-1; i >=
0; i--)
{
int tmp_num_edges = last_num_edges - laser.beamer_edge[i];
{
int tmp_num_edges = last_num_edges - laser.beamer_edge[i];
@@
-984,6
+989,7
@@
void DrawLaser(int start_edge, int mode)
break;
DrawLaserExt(laser.beamer_edge[i], tmp_num_edges, DL_LASER_DISABLED);
break;
DrawLaserExt(laser.beamer_edge[i], tmp_num_edges, DL_LASER_DISABLED);
+
last_num_edges = laser.beamer_edge[i];
laser.num_beamers--;
}
last_num_edges = laser.beamer_edge[i];
laser.num_beamers--;
}
@@
-999,7
+1005,9
@@
void DrawLaser(int start_edge, int mode)
}
}
else
}
}
else
+ {
DrawLaserExt(start_edge, laser.num_edges - start_edge, mode);
DrawLaserExt(start_edge, laser.num_edges - start_edge, mode);
+ }
}
boolean HitElement(int element, int hit_mask)
}
boolean HitElement(int element, int hit_mask)
@@
-1070,6
+1078,7
@@
boolean HitElement(int element, int hit_mask)
(element - EL_POLAR_START) / 2 != laser.current_angle % 8))
{
PlaySoundStereo(SND_KINK, ST(ELX));
(element - EL_POLAR_START) / 2 != laser.current_angle % 8))
{
PlaySoundStereo(SND_KINK, ST(ELX));
+
laser.num_damages--;
return TRUE;
laser.num_damages--;
return TRUE;
@@
-1079,6
+1088,7
@@
boolean HitElement(int element, int hit_mask)
(element - EL_POLAR_CROSS_START) != laser.current_angle % 4)
{
PlaySoundStereo(SND_KINK, ST(ELX));
(element - EL_POLAR_CROSS_START) != laser.current_angle % 4)
{
PlaySoundStereo(SND_KINK, ST(ELX));
+
laser.num_damages--;
return TRUE;
laser.num_damages--;
return TRUE;
@@
-1098,6
+1108,7
@@
boolean HitElement(int element, int hit_mask)
LX = ELX * TILEX + 14;
LY = ELY * TILEY + 14;
LX = ELX * TILEX + 14;
LY = ELY * TILEY + 14;
+
AddLaserEdge(LX, LY);
}
AddLaserEdge(LX, LY);
}
@@
-1114,7
+1125,9
@@
boolean HitElement(int element, int hit_mask)
int step_size;
laser.num_damages--;
int step_size;
laser.num_damages--;
+
AddDamagedField(ELX, ELY);
AddDamagedField(ELX, ELY);
+
laser.damage[laser.num_damages - 1].is_mirror = TRUE;
if (!Hit[ELX][ELY])
laser.damage[laser.num_damages - 1].is_mirror = TRUE;
if (!Hit[ELX][ELY])
@@
-1191,6
+1204,9
@@
boolean HitElement(int element, int hit_mask)
if (element == EL_KETTLE || element == EL_CELL)
{
if (element == EL_KETTLE || element == EL_CELL)
{
+ if (game_mm.kettles_still_needed > 0)
+ game_mm.kettles_still_needed--;
+
RaiseScore_MM(10);
if (game_mm.kettles_still_needed == 0)
RaiseScore_MM(10);
if (game_mm.kettles_still_needed == 0)
@@
-1206,9
+1222,9
@@
boolean HitElement(int element, int hit_mask)
PlaySoundStereo(SND_KLING, ST(ELX));
PlaySoundStereo(SND_KLING, ST(ELX));
- for
(y=0; y<
lev_fieldy; y++)
+ for
(y = 0; y <
lev_fieldy; y++)
{
{
- for
(x=0; x<
lev_fieldx; x++)
+ for
(x = 0; x <
lev_fieldx; x++)
{
/* initiate opening animation of exit door */
if (Feld[x][y] == EL_EXIT_CLOSED)
{
/* initiate opening animation of exit door */
if (Feld[x][y] == EL_EXIT_CLOSED)
@@
-1226,6
+1242,7
@@
boolean HitElement(int element, int hit_mask)
if (IN_LEV_FIELD(blocking_x, blocking_y))
{
Feld[blocking_x][blocking_y] = EL_EMPTY;
if (IN_LEV_FIELD(blocking_x, blocking_y))
{
Feld[blocking_x][blocking_y] = EL_EMPTY;
+
DrawField_MM(blocking_x, blocking_y);
}
}
DrawField_MM(blocking_x, blocking_y);
}
}
@@
-1236,9
+1253,13
@@
boolean HitElement(int element, int hit_mask)
}
}
else if (element == EL_KEY)
}
}
else if (element == EL_KEY)
+ {
game_mm.num_keys++;
game_mm.num_keys++;
+ }
else if (element == EL_LIGHTBALL)
else if (element == EL_LIGHTBALL)
+ {
RaiseScore_MM(10);
RaiseScore_MM(10);
+ }
else if (IS_PACMAN(element))
{
DeletePacMan(ELX, ELY);
else if (IS_PACMAN(element))
{
DeletePacMan(ELX, ELY);
@@
-1301,8
+1322,10
@@
boolean HitElement(int element, int hit_mask)
LX = ELX * TILEX + 14;
LY = ELY * TILEY + 14;
LX = ELX * TILEX + 14;
LY = ELY * TILEY + 14;
+
AddLaserEdge(LX, LY);
AddDamagedField(ELX, ELY);
AddLaserEdge(LX, LY);
AddDamagedField(ELX, ELY);
+
laser.damage[laser.num_damages - 1].is_mirror = TRUE;
if (!Hit[ELX][ELY])
laser.damage[laser.num_damages - 1].is_mirror = TRUE;
if (!Hit[ELX][ELY])
@@
-1323,8
+1346,10
@@
boolean HitElement(int element, int hit_mask)
}
laser.beamer_edge[laser.num_beamers] = laser.num_edges;
}
laser.beamer_edge[laser.num_beamers] = laser.num_edges;
+
AddLaserEdge(LX, LY);
AddDamagedField(ELX, ELY);
AddLaserEdge(LX, LY);
AddDamagedField(ELX, ELY);
+
laser.damage[laser.num_damages - 1].is_mirror = TRUE;
if (!Hit[ELX][ELY])
laser.damage[laser.num_damages - 1].is_mirror = TRUE;
if (!Hit[ELX][ELY])
@@
-1385,6
+1410,7
@@
boolean HitOnlyAnEdge(int element, int hit_mask)
}
AddDamagedField((LX + 2 * dx) / TILEX, (LY + 2 * dy) / TILEY);
}
AddDamagedField((LX + 2 * dx) / TILEX, (LY + 2 * dy) / TILEY);
+
LX += XS;
LY += YS;
LX += XS;
LY += YS;
@@
-1459,14
+1485,22
@@
boolean HitPolarizer(int element, int hit_mask)
return FALSE;
}
else if (IS_GRID_STEEL_FIXED(element) || IS_GRID_STEEL_AUTO(element))
return FALSE;
}
else if (IS_GRID_STEEL_FIXED(element) || IS_GRID_STEEL_AUTO(element))
+ {
return HitReflectingWalls(element, hit_mask);
return HitReflectingWalls(element, hit_mask);
+ }
else
else
+ {
return HitAbsorbingWalls(element, hit_mask);
return HitAbsorbingWalls(element, hit_mask);
+ }
}
else if (IS_GRID_STEEL(element))
}
else if (IS_GRID_STEEL(element))
+ {
return HitReflectingWalls(element, hit_mask);
return HitReflectingWalls(element, hit_mask);
+ }
else /* IS_GRID_WOOD */
else /* IS_GRID_WOOD */
+ {
return HitAbsorbingWalls(element, hit_mask);
return HitAbsorbingWalls(element, hit_mask);
+ }
return TRUE;
}
return TRUE;
}
@@
-1487,7
+1521,7
@@
boolean HitBlock(int element, int hit_mask)
check = TRUE;
check = TRUE;
- for
(i=1; i<
32; i++)
+ for
(i = 1; i <
32; i++)
{
x = LX + i * XS;
y = LY + i * YS;
{
x = LX + i * XS;
y = LY + i * YS;
@@
-1521,6
+1555,7
@@
boolean HitBlock(int element, int hit_mask)
(hit_mask & hit_mask_diagonal2) == hit_mask_diagonal2)
{
laser.overloaded = (element == EL_GATE_STONE);
(hit_mask & hit_mask_diagonal2) == hit_mask_diagonal2)
{
laser.overloaded = (element == EL_GATE_STONE);
+
return TRUE;
}
return TRUE;
}
@@
-1538,6
+1573,7
@@
boolean HitBlock(int element, int hit_mask)
Bang_MM(ELX, ELY);
game_mm.num_keys--;
Bang_MM(ELX, ELY);
game_mm.num_keys--;
+
if (element == EL_GATE_STONE && Box[ELX][ELY])
{
DrawLaser(Box[ELX][ELY] - 1, DL_LASER_DISABLED);
if (element == EL_GATE_STONE && Box[ELX][ELY])
{
DrawLaser(Box[ELX][ELY] - 1, DL_LASER_DISABLED);
@@
-1579,6
+1615,7
@@
boolean HitBlock(int element, int hit_mask)
LX = ELX * TILEX + 14;
LY = ELY * TILEY + 14;
LX = ELX * TILEX + 14;
LY = ELY * TILEY + 14;
+
AddLaserEdge(LX, LY);
laser.stops_inside_element = TRUE;
AddLaserEdge(LX, LY);
laser.stops_inside_element = TRUE;
@@
-1650,8
+1687,10
@@
boolean HitReflectingWalls(int element, int hit_mask)
hit_mask == HIT_MASK_BOTTOM))
{
PlaySoundStereo(SND_HUI, ST(ELX));
hit_mask == HIT_MASK_BOTTOM))
{
PlaySoundStereo(SND_HUI, ST(ELX));
+
LX -= XS;
LY -= YS;
LX -= XS;
LY -= YS;
+
if (!IS_DF_GRID(element))
AddLaserEdge(LX, LY);
if (!IS_DF_GRID(element))
AddLaserEdge(LX, LY);
@@
-1672,6
+1711,7
@@
boolean HitReflectingWalls(int element, int hit_mask)
}
AddLaserEdge(LX, LY);
}
AddLaserEdge(LX, LY);
+
XS = 2 * Step[laser.current_angle].x;
YS = 2 * Step[laser.current_angle].y;
XS = 2 * Step[laser.current_angle].x;
YS = 2 * Step[laser.current_angle].y;
@@
-1746,6
+1786,7
@@
boolean HitReflectingWalls(int element, int hit_mask)
ANG_MIRROR_135 : ANG_MIRROR_45);
PlaySoundStereo(SND_HUI, ST(ELX));
ANG_MIRROR_135 : ANG_MIRROR_45);
PlaySoundStereo(SND_HUI, ST(ELX));
+
AddDamagedField(ELX, ELY);
AddLaserEdge(LX, LY);
AddDamagedField(ELX, ELY);
AddLaserEdge(LX, LY);
@@
-1756,6
+1797,7
@@
boolean HitReflectingWalls(int element, int hit_mask)
LX += XS;
LY += YS;
LX += XS;
LY += YS;
+
AddLaserEdge(LX, LY);
return FALSE;
AddLaserEdge(LX, LY);
return FALSE;
@@
-1780,9
+1822,11
@@
boolean HitReflectingWalls(int element, int hit_mask)
ANG_MIRROR_135 : ANG_MIRROR_45);
PlaySoundStereo(SND_HUI, ST(ELX));
ANG_MIRROR_135 : ANG_MIRROR_45);
PlaySoundStereo(SND_HUI, ST(ELX));
+
/*
AddDamagedField(ELX, ELY);
*/
/*
AddDamagedField(ELX, ELY);
*/
+
AddLaserEdge(LX - XS, LY - YS);
AddLaserEdge(LX - XS + (ABS(XS) == 4 ? XS/2 : 0),
LY - YS + (ABS(YS) == 4 ? YS/2 : 0));
AddLaserEdge(LX - XS, LY - YS);
AddLaserEdge(LX - XS + (ABS(XS) == 4 ? XS/2 : 0),
LY - YS + (ABS(YS) == 4 ? YS/2 : 0));
@@
-1794,6
+1838,7
@@
boolean HitReflectingWalls(int element, int hit_mask)
LX += XS;
LY += YS;
LX += XS;
LY += YS;
+
AddLaserEdge(LX, LY);
return FALSE;
AddLaserEdge(LX, LY);
return FALSE;
@@
-1814,6
+1859,7
@@
boolean HitReflectingWalls(int element, int hit_mask)
if (LX != last_LX || LY != last_LY || hit_mask == last_hit_mask)
{
AddDamagedField(ELX, ELY);
if (LX != last_LX || LY != last_LY || hit_mask == last_hit_mask)
{
AddDamagedField(ELX, ELY);
+
LX += 8 * XS;
LY += 8 * YS;
LX += 8 * XS;
LY += 8 * YS;
@@
-1829,6
+1875,7
@@
boolean HitReflectingWalls(int element, int hit_mask)
if (!HitOnlyAnEdge(element, hit_mask))
{
laser.overloaded = TRUE;
if (!HitOnlyAnEdge(element, hit_mask))
{
laser.overloaded = TRUE;
+
return TRUE;
}
return TRUE;
}
@@
-1844,6
+1891,7
@@
boolean HitAbsorbingWalls(int element, int hit_mask)
(hit_mask == HIT_MASK_LEFT || hit_mask == HIT_MASK_RIGHT))
{
AddLaserEdge(LX - XS, LY - YS);
(hit_mask == HIT_MASK_LEFT || hit_mask == HIT_MASK_RIGHT))
{
AddLaserEdge(LX - XS, LY - YS);
+
LX = LX + XS / 2;
LY = LY + YS;
}
LX = LX + XS / 2;
LY = LY + YS;
}
@@
-1852,6
+1900,7
@@
boolean HitAbsorbingWalls(int element, int hit_mask)
(hit_mask == HIT_MASK_TOP || hit_mask == HIT_MASK_BOTTOM))
{
AddLaserEdge(LX - XS, LY - YS);
(hit_mask == HIT_MASK_TOP || hit_mask == HIT_MASK_BOTTOM))
{
AddLaserEdge(LX - XS, LY - YS);
+
LX = LX + XS;
LY = LY + YS / 2;
}
LX = LX + XS;
LY = LY + YS / 2;
}
@@
-1866,6
+1915,7
@@
boolean HitAbsorbingWalls(int element, int hit_mask)
element == EL_GATE_WOOD)
{
PlaySoundStereo(SND_HOLZ, ST(ELX));
element == EL_GATE_WOOD)
{
PlaySoundStereo(SND_HOLZ, ST(ELX));
+
return TRUE;
}
return TRUE;
}
@@
-1884,7
+1934,7
@@
boolean HitAbsorbingWalls(int element, int hit_mask)
{
int i;
{
int i;
- for
(i=0; i<
4; i++)
+ for
(i = 0; i <
4; i++)
{
if (mask == (1 << i) && (XS > 0) == (i % 2) && (YS > 0) == (i / 2))
mask = 15 - (8 >> i);
{
if (mask == (1 << i) && (XS > 0) == (i % 2) && (YS > 0) == (i / 2))
mask = 15 - (8 >> i);
@@
-1913,6
+1963,7
@@
boolean HitAbsorbingWalls(int element, int hit_mask)
if (element2 != EL_EMPTY && !IS_WALL_AMOEBA(element2))
{
laser.dest_element = EL_EMPTY;
if (element2 != EL_EMPTY && !IS_WALL_AMOEBA(element2))
{
laser.dest_element = EL_EMPTY;
+
return TRUE;
}
return TRUE;
}
@@
-1946,8
+1997,9
@@
void OpenExit(int x, int y)
MovDelay[x][y]--;
phase = MovDelay[x][y] / delay;
MovDelay[x][y]--;
phase = MovDelay[x][y] / delay;
+
if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y))
if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y))
- DrawGraphic
_MM(x, y, EL_EXIT_OPEN
- phase);
+ DrawGraphic
Animation_MM(x, y, IMG_MM_EXIT_OPENING, 3
- phase);
if (!MovDelay[x][y])
{
if (!MovDelay[x][y])
{
@@
-1967,6
+2019,7
@@
void OpenSurpriseBall(int x, int y)
if (MovDelay[x][y]) /* wait some time before next frame */
{
MovDelay[x][y]--;
if (MovDelay[x][y]) /* wait some time before next frame */
{
MovDelay[x][y]--;
+
if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y))
{
Bitmap *bitmap;
if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y))
{
Bitmap *bitmap;
@@
-1975,8
+2028,10
@@
void OpenSurpriseBall(int x, int y)
int dx = RND(26), dy = RND(26);
getGraphicSource(graphic, 0, &bitmap, &gx, &gy);
int dx = RND(26), dy = RND(26);
getGraphicSource(graphic, 0, &bitmap, &gx, &gy);
+
BlitBitmap(bitmap, drawto, gx + dx, gy + dy, 6, 6,
SX + x * TILEX + dx, SY + y * TILEY + dy);
BlitBitmap(bitmap, drawto, gx + dx, gy + dy, 6, 6,
SX + x * TILEX + dx, SY + y * TILEY + dy);
+
MarkTileDirty(x, y);
}
MarkTileDirty(x, y);
}
@@
-2020,7
+2075,7
@@
void MeltIce(int x, int y)
if (Feld[x][y] == EL_WALL_ICE)
Feld[x][y] = EL_EMPTY;
if (Feld[x][y] == EL_WALL_ICE)
Feld[x][y] = EL_EMPTY;
- for (i = (laser.num_damages > 0 ? laser.num_damages - 1 : 0); i
>=
0; i--)
+ for (i = (laser.num_damages > 0 ? laser.num_damages - 1 : 0); i
>=
0; i--)
if (laser.damage[i].is_mirror)
break;
if (laser.damage[i].is_mirror)
break;
@@
-2066,7
+2121,9
@@
void GrowAmoeba(int x, int y)
DrawLaser(0, DL_LASER_ENABLED);
}
else if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y))
DrawLaser(0, DL_LASER_ENABLED);
}
else if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(x, y))
+ {
DrawWallsAnimation_MM(x, y, real_element, phase, wall_mask);
DrawWallsAnimation_MM(x, y, real_element, phase, wall_mask);
+ }
}
}
}
}
@@
-2087,6
+2144,7
@@
static void Explode_MM(int x, int y, int phase, int mode)
/* put moving element to center field (and let it explode there) */
center_element = MovingOrBlocked2Element_MM(x, y);
RemoveMovingField_MM(x, y);
/* put moving element to center field (and let it explode there) */
center_element = MovingOrBlocked2Element_MM(x, y);
RemoveMovingField_MM(x, y);
+
Feld[x][y] = center_element;
}
Feld[x][y] = center_element;
}
@@
-2094,6
+2152,7
@@
static void Explode_MM(int x, int y, int phase, int mode)
Store[x][y] = center_element;
else
Store[x][y] = EL_EMPTY;
Store[x][y] = center_element;
else
Store[x][y] = EL_EMPTY;
+
Store2[x][y] = mode;
Feld[x][y] = EL_EXPLODING_OPAQUE;
MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0;
Store2[x][y] = mode;
Feld[x][y] = EL_EXPLODING_OPAQUE;
MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0;
@@
-2133,6
+2192,7
@@
static void Explode_MM(int x, int y, int phase, int mode)
Feld[x][y] = Store[x][y];
Store[x][y] = Store2[x][y] = 0;
MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0;
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);
DrawField_MM(x, y);
}
InitField(x, y, FALSE);
DrawField_MM(x, y);
}
@@
-2146,7
+2206,9
@@
static void Explode_MM(int x, int y, int phase, int mode)
if (Store2[x][y] == EX_KETTLE)
{
if (graphic_phase < 3)
if (Store2[x][y] == EX_KETTLE)
{
if (graphic_phase < 3)
+ {
graphic = IMG_MM_KETTLE_EXPLODING;
graphic = IMG_MM_KETTLE_EXPLODING;
+ }
else if (graphic_phase < 5)
{
graphic_phase += 3;
else if (graphic_phase < 5)
{
graphic_phase += 3;
@@
-2160,7
+2222,9
@@
static void Explode_MM(int x, int y, int phase, int mode)
else if (Store2[x][y] == EX_SHORT)
{
if (graphic_phase < 4)
else if (Store2[x][y] == EX_SHORT)
{
if (graphic_phase < 4)
+ {
graphic_phase += 4;
graphic_phase += 4;
+ }
else
{
graphic = IMG_EMPTY;
else
{
graphic = IMG_EMPTY;
@@
-2172,6
+2236,7
@@
static void Explode_MM(int x, int y, int phase, int mode)
BlitBitmap(bitmap, drawto_field, src_x, src_y, TILEX, TILEY,
FX + x * TILEX, FY + y * TILEY);
BlitBitmap(bitmap, drawto_field, src_x, src_y, TILEX, TILEY,
FX + x * TILEX, FY + y * TILEY);
+
MarkTileDirty(x, y);
}
}
MarkTileDirty(x, y);
}
}
@@
-2247,7
+2312,7
@@
void TurnRound(int x, int y)
int right_dir = turn[old_move_dir].right;
int back_dir = turn[old_move_dir].back;
int right_dx = move_xy[right_dir].x, right_dy = move_xy[right_dir].y;
int right_dir = turn[old_move_dir].right;
int back_dir = turn[old_move_dir].back;
int right_dx = move_xy[right_dir].x, right_dy = move_xy[right_dir].y;
- int right_x = x
+right_dx, right_y = y+
right_dy;
+ int right_x = x
+ right_dx, right_y = y +
right_dy;
if (element == EL_PACMAN)
{
if (element == EL_PACMAN)
{
@@
-2295,6
+2360,7
@@
static void StartMoving_MM(int x, int y)
{
Store[newx][newy] = Feld[newx][newy];
Feld[newx][newy] = EL_EMPTY;
{
Store[newx][newy] = Feld[newx][newy];
Feld[newx][newy] = EL_EMPTY;
+
DrawField_MM(newx, newy);
}
else if (!IN_LEV_FIELD(newx, newy) || !IS_FREE(newx, newy) ||
DrawField_MM(newx, newy);
}
else if (!IN_LEV_FIELD(newx, newy) || !IS_FREE(newx, newy) ||
@@
-2357,18
+2423,23
@@
static void ContinueMoving_MM(int x, int y)
}
}
else /* still moving on */
}
}
else /* still moving on */
+ {
DrawField_MM(x, y);
DrawField_MM(x, y);
+ }
laser.redraw = TRUE;
}
laser.redraw = TRUE;
}
-void ClickElement(int
mx, int m
y, int button)
+void ClickElement(int
x, int
y, int button)
{
static unsigned int click_delay = 0;
static int click_delay_value = CLICK_DELAY_SHORT;
static boolean new_button = TRUE;
int element;
{
static unsigned int click_delay = 0;
static int click_delay_value = CLICK_DELAY_SHORT;
static boolean new_button = TRUE;
int element;
- int x = (mx - SX) / TILEX, y = (my - SY) / TILEY;
+
+ /* do not rotate objects hit by the laser after the game was solved */
+ if (game_mm.level_solved && Hit[x][y])
+ return;
if (button == MB_RELEASED)
{
if (button == MB_RELEASED)
{
@@
-2387,7
+2458,7
@@
void ClickElement(int mx, int my, int button)
if (button == MB_MIDDLEBUTTON) /* middle button has no function */
return;
if (button == MB_MIDDLEBUTTON) /* middle button has no function */
return;
- if (!IN_
PIX_FIELD(mx - SX, my - SY
))
+ if (!IN_
LEV_FIELD(x, y
))
return;
if (Feld[x][y] == EL_EMPTY)
return;
if (Feld[x][y] == EL_EMPTY)
@@
-2409,6
+2480,7
@@
void ClickElement(int mx, int my, int button)
if (!laser.fuse_off)
{
DrawLaser(0, DL_LASER_DISABLED);
if (!laser.fuse_off)
{
DrawLaser(0, DL_LASER_DISABLED);
+
/*
BackToFront();
*/
/*
BackToFront();
*/
@@
-2421,9
+2493,11
@@
void ClickElement(int mx, int my, int button)
Feld[x][y] = element;
DrawField_MM(x, y);
Feld[x][y] = element;
DrawField_MM(x, y);
+
/*
BackToFront();
*/
/*
BackToFront();
*/
+
if (!laser.fuse_off)
ScanLaser();
}
if (!laser.fuse_off)
ScanLaser();
}
@@
-2492,7
+2566,9
@@
void RotateMirror(int x, int y, int button)
hold_y = y;
}
else if (button == MB_RIGHTBUTTON && (hold_x != x || hold_y != y))
hold_y = y;
}
else if (button == MB_RIGHTBUTTON && (hold_x != x || hold_y != y))
+ {
Feld[x][y] = get_rotated_element(Feld[x][y], ROTATE_RIGHT);
Feld[x][y] = get_rotated_element(Feld[x][y], ROTATE_RIGHT);
+ }
}
if (IS_GRID_STEEL_AUTO(Feld[x][y]) || IS_GRID_WOOD_AUTO(Feld[x][y]))
}
if (IS_GRID_STEEL_AUTO(Feld[x][y]) || IS_GRID_WOOD_AUTO(Feld[x][y]))
@@
-2562,12
+2638,16
@@
void AutoRotateMirrors()
if (!DelayReached(&rotate_delay, AUTO_ROTATE_DELAY))
return;
if (!DelayReached(&rotate_delay, AUTO_ROTATE_DELAY))
return;
- for (x
=0; x<
lev_fieldx; x++)
+ for (x
= 0; x <
lev_fieldx; x++)
{
{
- for (y
=0; y<
lev_fieldy; y++)
+ for (y
= 0; y <
lev_fieldy; y++)
{
int element = Feld[x][y];
{
int element = Feld[x][y];
+ /* do not rotate objects hit by the laser after the game was solved */
+ if (game_mm.level_solved && Hit[x][y])
+ continue;
+
if (IS_DF_MIRROR_AUTO(element) ||
IS_GRID_WOOD_AUTO(element) ||
IS_GRID_STEEL_AUTO(element) ||
if (IS_DF_MIRROR_AUTO(element) ||
IS_GRID_WOOD_AUTO(element) ||
IS_GRID_STEEL_AUTO(element) ||
@@
-2592,7
+2672,7
@@
boolean ObjHit(int obx, int oby, int bits)
if (bits & HIT_POS_EDGE)
{
if (bits & HIT_POS_EDGE)
{
- for
(i=0; i<
4; i++)
+ for
(i = 0; i <
4; i++)
if (ReadPixel(drawto,
SX + obx + 31 * (i % 2),
SY + oby + 31 * (i / 2)) == pen_ray)
if (ReadPixel(drawto,
SX + obx + 31 * (i % 2),
SY + oby + 31 * (i / 2)) == pen_ray)
@@
-2601,7
+2681,7
@@
boolean ObjHit(int obx, int oby, int bits)
if (bits & HIT_POS_BETWEEN)
{
if (bits & HIT_POS_BETWEEN)
{
- for
(i=0; i<
4; i++)
+ for
(i = 0; i <
4; i++)
if (ReadPixel(drawto,
SX + 4 + obx + 22 * (i % 2),
SY + 4 + oby + 22 * (i / 2)) == pen_ray)
if (ReadPixel(drawto,
SX + 4 + obx + 22 * (i % 2),
SY + 4 + oby + 22 * (i / 2)) == pen_ray)
@@
-2623,16
+2703,16
@@
void DeletePacMan(int px, int py)
return;
}
return;
}
- for
(i=0; i<
game_mm.num_pacman; i++)
+ for
(i = 0; i <
game_mm.num_pacman; i++)
if (game_mm.pacman[i].x == px && game_mm.pacman[i].y == py)
break;
game_mm.num_pacman--;
if (game_mm.pacman[i].x == px && game_mm.pacman[i].y == py)
break;
game_mm.num_pacman--;
- for
(j=i; j<
game_mm.num_pacman; j++)
+ for
(j = i; j <
game_mm.num_pacman; j++)
{
{
- game_mm.pacman[j].x = game_mm.pacman[j + 1].x;
- game_mm.pacman[j].y = game_mm.pacman[j + 1].y;
+ game_mm.pacman[j].x
= game_mm.pacman[j + 1].x;
+ game_mm.pacman[j].y
= game_mm.pacman[j + 1].y;
game_mm.pacman[j].dir = game_mm.pacman[j + 1].dir;
}
}
game_mm.pacman[j].dir = game_mm.pacman[j + 1].dir;
}
}
@@
-2664,6
+2744,7
@@
void ColorCycling(void)
mult =- mult / 16;
old = color;
new = new << 4;
mult =- mult / 16;
old = color;
new = new << 4;
+
if (new > 0x100)
new = 0x001;
}
if (new > 0x100)
new = 0x001;
}
@@
-2680,7
+2761,7
@@
void ColorCycling(void)
}
}
}
}
-static void GameActions_MM_Ext(
byte action[MAX_PLAYERS]
, boolean warp_mode)
+static void GameActions_MM_Ext(
struct MouseActionInfo action
, boolean warp_mode)
{
static unsigned int action_delay = 0;
static unsigned int pacman_delay = 0;
{
static unsigned int action_delay = 0;
static unsigned int pacman_delay = 0;
@@
-2693,10
+2774,10
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
WaitUntilDelayReached(&action_delay, GameFrameDelay);
WaitUntilDelayReached(&action_delay, GameFrameDelay);
- for (y
=0; y<lev_fieldy; y++) for (x=0; x<
lev_fieldx; x++)
+ for (y
= 0; y < lev_fieldy; y++) for (x = 0; x <
lev_fieldx; x++)
Stop[x][y] = FALSE;
Stop[x][y] = FALSE;
- for (y
=0; y<lev_fieldy; y++) for (x=0; x<
lev_fieldx; x++)
+ for (y
= 0; y < lev_fieldy; y++) for (x = 0; x <
lev_fieldx; x++)
{
element = Feld[x][y];
{
element = Feld[x][y];
@@
-2757,7
+2838,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
{
int i;
{
int i;
- for
(i=15; i>=
0; i--)
+ for
(i = 15; i >=
0; i--)
{
#if 0
SetRGB(pen_ray, 0x0000, 0x0000, i * color_scale);
{
#if 0
SetRGB(pen_ray, 0x0000, 0x0000, i * color_scale);
@@
-2766,6
+2847,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
native_mm_level.laser_red * 0x11 * i,
native_mm_level.laser_green * 0x11 * i,
native_mm_level.laser_blue * 0x11 * i);
native_mm_level.laser_red * 0x11 * i,
native_mm_level.laser_green * 0x11 * i,
native_mm_level.laser_blue * 0x11 * i);
+
DrawLaser(0, DL_LASER_ENABLED);
BackToFront();
Delay(50);
DrawLaser(0, DL_LASER_ENABLED);
BackToFront();
Delay(50);
@@
-2832,6
+2914,8
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
laser.overload_value = 0;
}
laser.overload_value = 0;
}
+ game_mm.laser_overload_value = laser.overload_value;
+
if (laser.overload_value < MAX_LASER_OVERLOAD - 8)
{
int color_up = 0xFF * laser.overload_value / MAX_LASER_OVERLOAD;
if (laser.overload_value < MAX_LASER_OVERLOAD - 8)
{
int color_up = 0xFF * laser.overload_value / MAX_LASER_OVERLOAD;
@@
-2841,10
+2925,12
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
SetRGB(pen_ray, (laser.overload_value / 6) * color_scale, 0x0000,
(15 - (laser.overload_value / 6)) * color_scale);
#endif
SetRGB(pen_ray, (laser.overload_value / 6) * color_scale, 0x0000,
(15 - (laser.overload_value / 6)) * color_scale);
#endif
- pen_ray = GetPixelFromRGB(window,
- (native_mm_level.laser_red ? 0xFF : color_up),
- (native_mm_level.laser_green ? color_down : 0x00),
- (native_mm_level.laser_blue ? color_down : 0x00));
+ pen_ray =
+ GetPixelFromRGB(window,
+ (native_mm_level.laser_red ? 0xFF : color_up),
+ (native_mm_level.laser_green ? color_down : 0x00),
+ (native_mm_level.laser_blue ? color_down : 0x00));
+
DrawLaser(0, DL_LASER_ENABLED);
BackToFront();
}
DrawLaser(0, DL_LASER_ENABLED);
BackToFront();
}
@@
-2852,7
+2938,8
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
if (laser.overloaded)
{
if (setup.sound_loops)
if (laser.overloaded)
{
if (setup.sound_loops)
- PlaySoundExt(SND_WARNTON, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, SND_CTRL_PLAY_LOOP);
+ PlaySoundExt(SND_WARNTON, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT,
+ SND_CTRL_PLAY_LOOP);
else
PlaySoundStereo(SND_WARNTON, SOUND_MAX_RIGHT);
}
else
PlaySoundStereo(SND_WARNTON, SOUND_MAX_RIGHT);
}
@@
-2888,19
+2975,21
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
{
int i;
{
int i;
- for
(i=15; i>=
0; i--)
+ for
(i = 15; i >=
0; i--)
{
#if 0
SetRGB(pen_ray, i * color_scale, 0x0000, 0x0000);
#endif
pen_ray = GetPixelFromRGB(window, 0x11 * i, 0x00, 0x00);
{
#if 0
SetRGB(pen_ray, i * color_scale, 0x0000, 0x0000);
#endif
pen_ray = GetPixelFromRGB(window, 0x11 * i, 0x00, 0x00);
+
DrawLaser(0, DL_LASER_ENABLED);
BackToFront();
Delay(50);
}
DrawLaser(0, DL_LASER_DISABLED);
DrawLaser(0, DL_LASER_ENABLED);
BackToFront();
Delay(50);
}
DrawLaser(0, DL_LASER_DISABLED);
+
game_mm.game_over = TRUE;
game_mm.game_over_cause = GAME_OVER_OVERLOADED;
game_mm.game_over = TRUE;
game_mm.game_over_cause = GAME_OVER_OVERLOADED;
@@
-2969,6
+3058,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
laser.fuse_off = TRUE;
laser.fuse_x = ELX;
laser.fuse_y = ELY;
laser.fuse_off = TRUE;
laser.fuse_x = ELX;
laser.fuse_y = ELY;
+
DrawLaser(0, DL_LASER_DISABLED);
DrawGraphic_MM(ELX, ELY, IMG_MM_FUSE);
}
DrawLaser(0, DL_LASER_DISABLED);
DrawGraphic_MM(ELX, ELY, IMG_MM_FUSE);
}
@@
-3027,7
+3117,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
graphic = el2gfx(element);
graphic = el2gfx(element);
- for
(i=0; i<
50; i++)
+ for
(i = 0; i <
50; i++)
{
int x = RND(26);
int y = RND(26);
{
int x = RND(26);
int y = RND(26);
@@
-3096,8
+3186,6
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
{
PlaySoundStereo(SND_SLURP, ST(ELX));
{
PlaySoundStereo(SND_SLURP, ST(ELX));
-
-
{
Feld[ELX][ELY] = Feld[ELX][ELY] - EL_WALL_ICE + EL_WALL_CHANGING;
Store[ELX][ELY] = EL_WALL_ICE;
{
Feld[ELX][ELY] = Feld[ELX][ELY] - EL_WALL_ICE + EL_WALL_CHANGING;
Store[ELX][ELY] = EL_WALL_ICE;
@@
-3108,10
+3196,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
return;
}
return;
}
-
-
-
- for(i=0; i<5; i++)
+ for (i = 0; i < 5; i++)
{
int phase = i + 1;
{
int phase = i + 1;
@@
-3135,7
+3220,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
LY = laser.edge[laser.num_edges].y - (SY + 2);
*/
LY = laser.edge[laser.num_edges].y - (SY + 2);
*/
- for (i = (laser.num_damages > 0 ? laser.num_damages - 1 : 0); i
>=
0; i--)
+ for (i = (laser.num_damages > 0 ? laser.num_damages - 1 : 0); i
>=
0; i--)
if (laser.damage[i].is_mirror)
break;
if (laser.damage[i].is_mirror)
break;
@@
-3157,7
+3242,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
if (element2 != EL_EMPTY && !IS_WALL_AMOEBA(element))
return;
if (element2 != EL_EMPTY && !IS_WALL_AMOEBA(element))
return;
- for (i = laser.num_damages - 1; i
>=
0; i--)
+ for (i = laser.num_damages - 1; i
>=
0; i--)
if (laser.damage[i].is_mirror)
break;
if (laser.damage[i].is_mirror)
break;
@@
-3177,10
+3262,11
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
x = laser.damage[k1].x;
y = laser.damage[k1].y;
x = laser.damage[k1].x;
y = laser.damage[k1].y;
+
DrawField_MM(x, y);
}
DrawField_MM(x, y);
}
- for
(i=0; i<
4; i++)
+ for
(i = 0; i <
4; i++)
{
if (laser.wall_mask & (1 << i))
{
{
if (laser.wall_mask & (1 << i))
{
@@
-3197,7
+3283,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
k2 = i;
k2 = i;
- for
(i=0; i<
4; i++)
+ for
(i = 0; i <
4; i++)
{
if (laser.wall_mask & (1 << i))
{
{
if (laser.wall_mask & (1 << i))
{
@@
-3217,30
+3303,27
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
{
laser.num_edges = r;
laser.num_damages = d;
{
laser.num_edges = r;
laser.num_damages = d;
+
DrawLaser(0, DL_LASER_DISABLED);
}
Feld[ELX][ELY] = element | laser.wall_mask;
DrawLaser(0, DL_LASER_DISABLED);
}
Feld[ELX][ELY] = element | laser.wall_mask;
+
dx = ELX;
dy = ELY;
de = Feld[ELX][ELY];
dm = laser.wall_mask;
dx = ELX;
dy = ELY;
de = Feld[ELX][ELY];
dm = laser.wall_mask;
-
-
#if 1
{
int x = ELX, y = ELY;
int wall_mask = laser.wall_mask;
#if 1
{
int x = ELX, y = ELY;
int wall_mask = laser.wall_mask;
-
ScanLaser();
DrawLaser(0, DL_LASER_ENABLED);
PlaySoundStereo(SND_AMOEBE, ST(dx));
ScanLaser();
DrawLaser(0, DL_LASER_ENABLED);
PlaySoundStereo(SND_AMOEBE, ST(dx));
-
-
Feld[x][y] = Feld[x][y] - EL_WALL_AMOEBA + EL_WALL_CHANGING;
Store[x][y] = EL_WALL_AMOEBA;
Store2[x][y] = wall_mask;
Feld[x][y] = Feld[x][y] - EL_WALL_AMOEBA + EL_WALL_CHANGING;
Store[x][y] = EL_WALL_AMOEBA;
Store2[x][y] = wall_mask;
@@
-3249,17
+3332,16
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
}
#endif
}
#endif
-
-
DrawWallsAnimation_MM(dx, dy, de, 4, dm);
ScanLaser();
DrawLaser(0, DL_LASER_ENABLED);
PlaySoundStereo(SND_AMOEBE, ST(dx));
DrawWallsAnimation_MM(dx, dy, de, 4, dm);
ScanLaser();
DrawLaser(0, DL_LASER_ENABLED);
PlaySoundStereo(SND_AMOEBE, ST(dx));
- for
(i=4; i>=
0; i--)
+ for
(i = 4; i >=
0; i--)
{
DrawWallsAnimation_MM(dx, dy, de, i, dm);
{
DrawWallsAnimation_MM(dx, dy, de, i, dm);
+
BackToFront();
Delay(20);
}
BackToFront();
Delay(20);
}
@@
-3282,12
+3364,12
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
if (XS < YS)
k += 2;
if (XS < YS)
k += 2;
- for
(i=0; i<
4; i++)
+ for
(i = 0; i <
4; i++)
{
if (i)
k++;
if (k > 3)
{
if (i)
k++;
if (k > 3)
- k
=
0;
+ k
=
0;
x = ELX + Step[k * 4].x;
y = ELY + Step[k * 4].y;
x = ELX + Step[k * 4].x;
y = ELY + Step[k * 4].y;
@@
-3304,6
+3386,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
if (i > 3)
{
laser.overloaded = (element == EL_BLOCK_STONE);
if (i > 3)
{
laser.overloaded = (element == EL_BLOCK_STONE);
+
return;
}
return;
}
@@
-3328,7
+3411,7
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
if (element == EL_FUEL_FULL && CT > 200)
{
if (element == EL_FUEL_FULL && CT > 200)
{
- for
(i=game_mm.energy_left; i<=
MAX_LASER_ENERGY; i+=2)
+ for
(i = game_mm.energy_left; i <=
MAX_LASER_ENERGY; i+=2)
{
#if 0
BlitBitmap(pix[PIX_DOOR], drawto,
{
#if 0
BlitBitmap(pix[PIX_DOOR], drawto,
@@
-3356,10
+3439,9
@@
static void GameActions_MM_Ext(byte action[MAX_PLAYERS], boolean warp_mode)
return;
}
return;
}
-void GameActions_MM(
byte action[MAX_PLAYERS]
, boolean warp_mode)
+void GameActions_MM(
struct MouseActionInfo action
, boolean warp_mode)
{
{
- if (!button_status)
- ClickElement(0, 0, MB_NOT_PRESSED);
+ ClickElement(action.lx, action.ly, action.button);
GameActions_MM_Ext(action, warp_mode);
}
GameActions_MM_Ext(action, warp_mode);
}
@@
-3373,9
+3455,10
@@
void MovePacMen()
if (++p >= game_mm.num_pacman)
p = 0;
if (++p >= game_mm.num_pacman)
p = 0;
+
game_mm.pacman[p].dir--;
game_mm.pacman[p].dir--;
- for
(l=1; l<
5; l++)
+ for
(l = 1; l <
5; l++)
{
game_mm.pacman[p].dir++;
{
game_mm.pacman[p].dir++;
@@
-3398,6
+3481,7
@@
void MovePacMen()
nx = ox + mx;
ny = oy + my;
element = Feld[nx][ny];
nx = ox + mx;
ny = oy + my;
element = Feld[nx][ny];
+
if (nx < 0 || nx > 15 || ny < 0 || ny > 11)
continue;
if (nx < 0 || nx > 15 || ny < 0 || ny > 11)
continue;
@@
-3431,12
+3515,13
@@
void MovePacMen()
ox = SX + ox * TILEX;
oy = SY + oy * TILEY;
ox = SX + ox * TILEX;
oy = SY + oy * TILEY;
- for
(i=1; i<33; i+=
2)
+ for
(i = 1; i < 33; i +=
2)
BlitBitmap(bitmap, window,
src_x, src_y, TILEX, TILEY,
ox + i * mx, oy + i * my);
Ct = Ct + Counter() - CT;
}
BlitBitmap(bitmap, window,
src_x, src_y, TILEX, TILEY,
ox + i * mx, oy + i * my);
Ct = Ct + Counter() - CT;
}
+
DrawField_MM(nx, ny);
BackToFront();
DrawField_MM(nx, ny);
BackToFront();
@@
-3447,14
+3532,13
@@
void MovePacMen()
if (ObjHit(nx, ny, HIT_POS_BETWEEN))
{
AddDamagedField(nx, ny);
if (ObjHit(nx, ny, HIT_POS_BETWEEN))
{
AddDamagedField(nx, ny);
+
laser.damage[laser.num_damages - 1].edge = 0;
}
}
if (element == EL_BOMB)
laser.damage[laser.num_damages - 1].edge = 0;
}
}
if (element == EL_BOMB)
- {
DeletePacMan(nx, ny);
DeletePacMan(nx, ny);
- }
if (IS_WALL_AMOEBA(element) &&
(LX + 2 * XS) / TILEX == nx &&
if (IS_WALL_AMOEBA(element) &&
(LX + 2 * XS) / TILEX == nx &&
@@
-3463,6
+3547,7
@@
void MovePacMen()
laser.num_edges--;
ScanLaser();
}
laser.num_edges--;
ScanLaser();
}
+
break;
}
}
break;
}
}
@@
-3482,9
+3567,10
@@
void GameWon_MM()
if (game_mm.energy_left)
{
if (setup.sound_loops)
if (game_mm.energy_left)
{
if (setup.sound_loops)
- PlaySoundExt(SND_SIRR, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, SND_CTRL_PLAY_LOOP);
+ PlaySoundExt(SND_SIRR, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT,
+ SND_CTRL_PLAY_LOOP);
- while(game_mm.energy_left > 0)
+ while
(game_mm.energy_left > 0)
{
if (!setup.sound_loops)
PlaySoundStereo(SND_SIRR, SOUND_MAX_RIGHT);
{
if (!setup.sound_loops)
PlaySoundStereo(SND_SIRR, SOUND_MAX_RIGHT);
@@
-3518,9
+3604,10
@@
void GameWon_MM()
else if (native_mm_level.time == 0) /* level without time limit */
{
if (setup.sound_loops)
else if (native_mm_level.time == 0) /* level without time limit */
{
if (setup.sound_loops)
- PlaySoundExt(SND_SIRR, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, SND_CTRL_PLAY_LOOP);
+ PlaySoundExt(SND_SIRR, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT,
+ SND_CTRL_PLAY_LOOP);
- while(TimePlayed < 999)
+ while
(TimePlayed < 999)
{
if (!setup.sound_loops)
PlaySoundStereo(SND_SIRR, SOUND_MAX_RIGHT);
{
if (!setup.sound_loops)
PlaySoundStereo(SND_SIRR, SOUND_MAX_RIGHT);
@@
-3565,15
+3652,19
@@
void GameWon_MM()
if ((hi_pos = NewHiScore_MM()) >= 0)
{
game_status = HALLOFFAME;
if ((hi_pos = NewHiScore_MM()) >= 0)
{
game_status = HALLOFFAME;
+
// DrawHallOfFame(hi_pos);
// DrawHallOfFame(hi_pos);
+
if (raise_level)
level_nr++;
}
else
{
game_status = MAINMENU;
if (raise_level)
level_nr++;
}
else
{
game_status = MAINMENU;
+
if (raise_level)
level_nr++;
if (raise_level)
level_nr++;
+
// DrawMainMenu();
}
// DrawMainMenu();
}
@@
-3591,7
+3682,7
@@
int NewHiScore_MM()
game_mm.score < highscore[MAX_SCORE_ENTRIES - 1].Score)
return -1;
game_mm.score < highscore[MAX_SCORE_ENTRIES - 1].Score)
return -1;
- for (k
=0; k<
MAX_SCORE_ENTRIES; k++)
+ for (k
= 0; k <
MAX_SCORE_ENTRIES; k++)
{
if (game_mm.score > highscore[k].Score)
{
{
if (game_mm.score > highscore[k].Score)
{
@@
-3602,14
+3693,14
@@
int NewHiScore_MM()
int m = MAX_SCORE_ENTRIES - 1;
#ifdef ONE_PER_NAME
int m = MAX_SCORE_ENTRIES - 1;
#ifdef ONE_PER_NAME
- for (l
=k; l<
MAX_SCORE_ENTRIES; l++)
+ for (l
= k; l <
MAX_SCORE_ENTRIES; l++)
if (!strcmp(setup.player_name, highscore[l].Name))
m = l;
if (m == k) /* player's new highscore overwrites his old one */
goto put_into_list;
#endif
if (!strcmp(setup.player_name, highscore[l].Name))
m = l;
if (m == k) /* player's new highscore overwrites his old one */
goto put_into_list;
#endif
- for (l
=
m; l>k; l--)
+ for (l
=
m; l>k; l--)
{
strcpy(highscore[l].Name, highscore[l - 1].Name);
highscore[l].Score = highscore[l - 1].Score;
{
strcpy(highscore[l].Name, highscore[l - 1].Name);
highscore[l].Score = highscore[l - 1].Score;
@@
-3623,6
+3714,7
@@
int NewHiScore_MM()
highscore[k].Name[MAX_PLAYER_NAME_LEN] = '\0';
highscore[k].Score = game_mm.score;
position = k;
highscore[k].Name[MAX_PLAYER_NAME_LEN] = '\0';
highscore[k].Score = game_mm.score;
position = k;
+
break;
}
break;
}
@@
-3647,6
+3739,7
@@
static void InitMovingField_MM(int x, int y, int direction)
MovDir[x][y] = direction;
MovDir[newx][newy] = direction;
MovDir[x][y] = direction;
MovDir[newx][newy] = direction;
+
if (Feld[newx][newy] == EL_EMPTY)
Feld[newx][newy] = EL_BLOCKED;
}
if (Feld[newx][newy] == EL_EMPTY)
Feld[newx][newy] = EL_BLOCKED;
}
@@
-3689,10
+3782,11
@@
static int MovingOrBlocked2Element_MM(int x, int y)
int oldx, oldy;
Blocked2Moving_MM(x, y, &oldx, &oldy);
int oldx, oldy;
Blocked2Moving_MM(x, y, &oldx, &oldy);
+
return Feld[oldx][oldy];
}
return Feld[oldx][oldy];
}
- else
-
return element;
+
+ return element;
}
#if 0
}
#if 0
@@
-3775,6
+3869,7
@@
void PlaySoundLevel(int x, int y, int sound_nr)
static void RaiseScore_MM(int value)
{
game_mm.score += value;
static void RaiseScore_MM(int value)
{
game_mm.score += value;
+
#if 0
DrawText(DX_SCORE, DY_SCORE, int2str(game_mm.score, 4),
FONT_TEXT_2);
#if 0
DrawText(DX_SCORE, DY_SCORE, int2str(game_mm.score, 4),
FONT_TEXT_2);
@@
-3788,9
+3883,11
@@
void RaiseScoreElement_MM(int element)
case EL_PACMAN:
RaiseScore_MM(native_mm_level.score[SC_PACMAN]);
break;
case EL_PACMAN:
RaiseScore_MM(native_mm_level.score[SC_PACMAN]);
break;
+
case EL_KEY:
RaiseScore_MM(native_mm_level.score[SC_KEY]);
break;
case EL_KEY:
RaiseScore_MM(native_mm_level.score[SC_KEY]);
break;
+
default:
break;
}
default:
break;
}