projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed bug with cutting through laser emitter in special cases in MM engine
[rocksndiamonds.git]
/
src
/
tools.c
diff --git
a/src/tools.c
b/src/tools.c
index 627c77c61f842840eefe6ca162e4482776df9728..fbfb601af898908d12a8b5d1f2ee7ae255e7c5e5 100644
(file)
--- a/
src/tools.c
+++ b/
src/tools.c
@@
-1492,6
+1492,8
@@
int getGraphicAnimationFrame(int graphic, int sync_frame)
// animation synchronized with global frame counter, not move position
if (graphic_info[graphic].anim_global_sync || sync_frame < 0)
sync_frame = FrameCounter;
// animation synchronized with global frame counter, not move position
if (graphic_info[graphic].anim_global_sync || sync_frame < 0)
sync_frame = FrameCounter;
+ else if (graphic_info[graphic].anim_global_anim_sync)
+ sync_frame = getGlobalAnimSyncFrame();
return getAnimationFrame(graphic_info[graphic].anim_frames,
graphic_info[graphic].anim_delay,
return getAnimationFrame(graphic_info[graphic].anim_frames,
graphic_info[graphic].anim_delay,
@@
-4189,9
+4191,6
@@
static void DrawPlayerExt(struct PlayerInfo *player, int drawing_stage)
DrawDynamite(last_jx, last_jy);
else
DrawLevelField(last_jx, last_jy);
DrawDynamite(last_jx, last_jy);
else
DrawLevelField(last_jx, last_jy);
-
- if (player->is_pushing && IN_SCR_FIELD(SCREENX(next_jx), SCREENY(next_jy)))
- DrawLevelElement(next_jx, next_jy, EL_EMPTY);
}
else if (drawing_stage == DRAW_PLAYER_STAGE_FIELD_UNDER_PLAYER)
{
}
else if (drawing_stage == DRAW_PLAYER_STAGE_FIELD_UNDER_PLAYER)
{
@@
-4249,6
+4248,9
@@
static void DrawPlayerExt(struct PlayerInfo *player, int drawing_stage)
if (!player->is_pushing || !player->is_moving)
return;
if (!player->is_pushing || !player->is_moving)
return;
+ if (Tile[next_jx][next_jy] == EL_EXPLOSION)
+ return;
+
int gfx_frame = GfxFrame[jx][jy];
if (!IS_MOVING(jx, jy)) // push movement already finished
int gfx_frame = GfxFrame[jx][jy];
if (!IS_MOVING(jx, jy)) // push movement already finished
@@
-4270,14
+4272,12
@@
static void DrawPlayerExt(struct PlayerInfo *player, int drawing_stage)
DrawLevelElement(jx, jy, Back[jx][jy]);
else
DrawLevelElement(jx, jy, EL_EMPTY);
DrawLevelElement(jx, jy, Back[jx][jy]);
else
DrawLevelElement(jx, jy, EL_EMPTY);
-
- if (Back[next_jx][next_jy])
- DrawLevelElement(next_jx, next_jy, Back[next_jx][next_jy]);
- else
- DrawLevelElement(next_jx, next_jy, EL_EMPTY);
}
}
- else if (Back[next_jx][next_jy])
+
+ if (Back[next_jx][next_jy])
DrawLevelElement(next_jx, next_jy, Back[next_jx][next_jy]);
DrawLevelElement(next_jx, next_jy, Back[next_jx][next_jy]);
+ else
+ DrawLevelElement(next_jx, next_jy, EL_EMPTY);
int px = SCREENX(jx), py = SCREENY(jy);
int pxx = (TILEX - ABS(sxx)) * dx;
int px = SCREENX(jx), py = SCREENY(jy);
int pxx = (TILEX - ABS(sxx)) * dx;
@@
-5894,7
+5894,8
@@
void CreateToolButtons(void)
}
}
}
}
- if (id >= TOOL_CTRL_ID_PLAYER_1 && id <= TOOL_CTRL_ID_PLAYER_4)
+ if (id >= TOOL_CTRL_ID_PLAYER_1 && id <= TOOL_CTRL_ID_PLAYER_4 &&
+ pos->draw_player)
{
int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
{
int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
@@
-8203,10
+8204,6
@@
int map_element_RND_to_MM(int element_rnd)
element_rnd <= EL_MM_RUNTIME_END ?
EL_MM_RUNTIME_START_NATIVE + element_rnd - EL_MM_RUNTIME_START :
element_rnd <= EL_MM_RUNTIME_END ?
EL_MM_RUNTIME_START_NATIVE + element_rnd - EL_MM_RUNTIME_START :
- element_rnd >= EL_MM_DUMMY_START &&
- element_rnd <= EL_MM_DUMMY_END ?
- EL_MM_DUMMY_START_NATIVE + element_rnd - EL_MM_DUMMY_START :
-
EL_MM_EMPTY_NATIVE);
}
EL_MM_EMPTY_NATIVE);
}
@@
-8232,10
+8229,6
@@
int map_element_MM_to_RND(int element_mm)
element_mm <= EL_MM_RUNTIME_END_NATIVE ?
EL_MM_RUNTIME_START + element_mm - EL_MM_RUNTIME_START_NATIVE :
element_mm <= EL_MM_RUNTIME_END_NATIVE ?
EL_MM_RUNTIME_START + element_mm - EL_MM_RUNTIME_START_NATIVE :
- element_mm >= EL_MM_DUMMY_START_NATIVE &&
- element_mm <= EL_MM_DUMMY_END_NATIVE ?
- EL_MM_DUMMY_START + element_mm - EL_MM_DUMMY_START_NATIVE :
-
EL_EMPTY);
}
EL_EMPTY);
}
@@
-8329,6
+8322,11
@@
int el2img_mm(int element_mm)
return el2img(map_element_MM_to_RND(element_mm));
}
return el2img(map_element_MM_to_RND(element_mm));
}
+int el_act2img_mm(int element_mm, int action)
+{
+ return el_act2img(map_element_MM_to_RND(element_mm), action);
+}
+
int el_act_dir2img(int element, int action, int direction)
{
element = GFX_ELEMENT(element);
int el_act_dir2img(int element, int action, int direction)
{
element = GFX_ELEMENT(element);
@@
-8786,6
+8784,8
@@
void SetGfxAnimation_EM(struct GraphicInfo_EM *g_em,
if (graphic_info[graphic].anim_global_sync)
sync_frame = FrameCounter;
if (graphic_info[graphic].anim_global_sync)
sync_frame = FrameCounter;
+ else if (graphic_info[graphic].anim_global_anim_sync)
+ sync_frame = getGlobalAnimSyncFrame();
else if (IN_FIELD(x, y, MAX_LEV_FIELDX, MAX_LEV_FIELDY))
sync_frame = GfxFrame[x][y];
else
else if (IN_FIELD(x, y, MAX_LEV_FIELDX, MAX_LEV_FIELDY))
sync_frame = GfxFrame[x][y];
else
@@
-8845,6
+8845,8
@@
void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em,
if (graphic_info[graphic].anim_global_sync)
sync_frame = FrameCounter;
if (graphic_info[graphic].anim_global_sync)
sync_frame = FrameCounter;
+ else if (graphic_info[graphic].anim_global_anim_sync)
+ sync_frame = getGlobalAnimSyncFrame();
else if (IN_FIELD(x, y, MAX_LEV_FIELDX, MAX_LEV_FIELDY))
sync_frame = GfxFrame[x][y];
else
else if (IN_FIELD(x, y, MAX_LEV_FIELDX, MAX_LEV_FIELDY))
sync_frame = GfxFrame[x][y];
else
@@
-9308,7
+9310,7
@@
void InitGraphicInfo_EM(void)
}
}
}
}
-static void CheckSaveEngineSnapshot_EM(
byte action[MAX_PLAYERS],
int frame,
+static void CheckSaveEngineSnapshot_EM(int frame,
boolean any_player_moving,
boolean any_player_snapping,
boolean any_player_dropping)
boolean any_player_moving,
boolean any_player_snapping,
boolean any_player_dropping)
@@
-9365,7
+9367,7
@@
static void CheckSaveEngineSnapshot_MM(boolean element_clicked,
}
}
}
}
-boolean CheckSingleStepMode_EM(
byte action[MAX_PLAYERS],
int frame,
+boolean CheckSingleStepMode_EM(int frame,
boolean any_player_moving,
boolean any_player_snapping,
boolean any_player_dropping)
boolean any_player_moving,
boolean any_player_snapping,
boolean any_player_dropping)
@@
-9374,7
+9376,7
@@
boolean CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame,
if (frame == 7 && !any_player_dropping && FrameCounter > 6)
TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
if (frame == 7 && !any_player_dropping && FrameCounter > 6)
TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
- CheckSaveEngineSnapshot_EM(
action,
frame, any_player_moving,
+ CheckSaveEngineSnapshot_EM(frame, any_player_moving,
any_player_snapping, any_player_dropping);
return tape.pausing;
any_player_snapping, any_player_dropping);
return tape.pausing;
@@
-9408,7
+9410,7
@@
void CheckSingleStepMode_MM(boolean element_clicked,
}
void getGraphicSource_SP(struct GraphicInfo_SP *g_sp,
}
void getGraphicSource_SP(struct GraphicInfo_SP *g_sp,
- int graphic, int sync_frame
, int x, int y
)
+ int graphic, int sync_frame)
{
int frame = getGraphicAnimationFrame(graphic, sync_frame);
{
int frame = getGraphicAnimationFrame(graphic, sync_frame);