printf(" MovDir: %d\n", MovDir[x][y]);
printf(" MovDelay: %d\n", MovDelay[x][y]);
printf(" ChangeDelay: %d\n", ChangeDelay[x][y]);
- printf(" Count: %d\n", Count[x][y]);
+ printf(" CustomValue: %d\n", CustomValue[x][y]);
printf(" GfxElement: %d\n", GfxElement[x][y]);
printf(" GfxAction: %d\n", GfxAction[x][y]);
printf(" GfxFrame: %d\n", GfxFrame[x][y]);
IS_MOVING(xx, yy))
continue;
+#if 1
+ if (Feld[xx][yy] == EL_ELEMENT_SNAPPING)
+ continue;
+#endif
+
element = TILE_GFX_ELEMENT(xx, yy);
if (!GFX_CRUMBLED(element))
continue;
#endif
+#if 1
+ graphic = el_act2crm(element, ACTION_DEFAULT);
+#else
graphic = el_act2crm(Feld[xx][yy], ACTION_DEFAULT);
+#endif
crumbled_border_size = graphic_info[graphic].border_size;
getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y);
if (!IN_LEV_FIELD(x, y))
return;
+#if 1
+ if (Feld[x][y] == EL_ELEMENT_SNAPPING &&
+ GFX_CRUMBLED(GfxElement[x][y]))
+ {
+ DrawLevelFieldCrumbledSandDigging(x, y, GfxDir[x][y], GfxFrame[x][y]);
+ return;
+ }
+#endif
+
+#if 1
+ graphic = el_act2crm(TILE_GFX_ELEMENT(x, y), ACTION_DEFAULT);
+#else
graphic = el_act2crm(Feld[x][y], ACTION_DEFAULT);
+#endif
DrawLevelFieldCrumbledSandExt(x, y, graphic, 0);
}
DrawGraphicAnimation(sx, sy, graphic);
+#if 1
+ if (GFX_CRUMBLED(TILE_GFX_ELEMENT(x, y)))
+ DrawLevelFieldCrumbledSand(x, y);
+#else
if (GFX_CRUMBLED(Feld[x][y]))
DrawLevelFieldCrumbledSand(x, y);
+#endif
}
void DrawLevelElementAnimationIfNeeded(int x, int y, int element)
static int getPlayerGraphic(struct PlayerInfo *player, int move_dir)
{
- if (player->use_murphy_graphic)
+ if (player->use_murphy)
{
/* this works only because currently only one player can be "murphy" ... */
static int last_horizontal_dir = MV_LEFT;
return graphic;
}
else
- return el_act_dir2img(player->element_nr, player->GfxAction, move_dir);
+ return el_act_dir2img(player->artwork_element, player->GfxAction,move_dir);
}
static boolean equalGraphics(int graphic1, int graphic2)
unsigned long door_delay_value;
int stepsize = 1;
+ if (door_1.width < 0 || door_1.width > DXSIZE)
+ door_1.width = DXSIZE;
+ if (door_1.height < 0 || door_1.height > DYSIZE)
+ door_1.height = DYSIZE;
+ if (door_2.width < 0 || door_2.width > VXSIZE)
+ door_2.width = VXSIZE;
+ if (door_2.height < 0 || door_2.height > VYSIZE)
+ door_2.height = VYSIZE;
+
if (door_state == DOOR_GET_STATE)
return(door1 | door2);
if (door_state & DOOR_ACTION)
{
- boolean door_1_done = !(door_state & DOOR_ACTION_1);
- boolean door_2_done = !(door_state & DOOR_ACTION_2);
- int start = ((door_state & DOOR_NO_DELAY) ? DXSIZE : 0);
+ boolean handle_door_1 = (door_state & DOOR_ACTION_1);
+ boolean handle_door_2 = (door_state & DOOR_ACTION_2);
+ boolean door_1_done = (!handle_door_1);
+ boolean door_2_done = (!handle_door_2);
+ boolean door_1_vertical = (door_1.anim_mode & ANIM_VERTICAL);
+ boolean door_2_vertical = (door_2.anim_mode & ANIM_VERTICAL);
+ int door_size_1 = (door_1_vertical ? door_1.height : door_1.width);
+ int door_size_2 = (door_2_vertical ? door_2.height : door_2.width);
+ int max_door_size_1 = (door_1_vertical ? DYSIZE : DXSIZE);
+ int max_door_size_2 = (door_2_vertical ? VYSIZE : VXSIZE);
+ int door_size = (handle_door_1 ? door_size_1 : door_size_2);
+ int max_door_size = (handle_door_1 ? max_door_size_1 : max_door_size_2);
+ int door_skip = max_door_size - door_size;
+#if 1
+ int end = door_size;
+#else
int end = (door_state & DOOR_ACTION_1 &&
- door_1.anim_mode == ANIM_VERTICAL ? DYSIZE : DXSIZE);
- int x;
+ door_1.anim_mode & ANIM_VERTICAL ? DYSIZE : DXSIZE);
+#endif
+#if 1
+ int start = ((door_state & DOOR_NO_DELAY) ? end : 0);
+#else
+ int start = ((door_state & DOOR_NO_DELAY) ? end : offset_skip);
+#endif
+ int k;
if (!(door_state & DOOR_NO_DELAY) && !setup.quick_doors)
{
PlaySoundStereo(SND_DOOR_CLOSING, SOUND_MIDDLE);
}
- for (x = start; x <= end && !(door_1_done && door_2_done); x += stepsize)
+ for (k = start; k <= end && !(door_1_done && door_2_done); k += stepsize)
{
+ int x = k;
Bitmap *bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
GC gc = bitmap->stored_clip_gc;
if (door_state & DOOR_ACTION_1)
{
int a = MIN(x * door_1.step_offset, end);
- int i = (door_state & DOOR_OPEN_1 ? end - a : a);
+ int p = (door_state & DOOR_OPEN_1 ? end - a : a);
+ int i = p + door_skip;
- if (x <= a)
+ if (door_1.anim_mode & ANIM_STATIC_PANEL)
{
BlitBitmap(bitmap_db_door, drawto,
- DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1 + i / 2,
- DXSIZE, DYSIZE - i / 2, DX, DY);
+ DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1,
+ DXSIZE, DYSIZE, DX, DY);
+ }
+ else if (x <= a)
+ {
+ BlitBitmap(bitmap_db_door, drawto,
+ DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1 + p / 2,
+ DXSIZE, DYSIZE - p / 2, DX, DY);
- ClearRectangle(drawto, DX, DY + DYSIZE - i / 2, DXSIZE, i / 2);
+ ClearRectangle(drawto, DX, DY + DYSIZE - p / 2, DXSIZE, p / 2);
}
- if (door_1.anim_mode == ANIM_HORIZONTAL && x <= DXSIZE)
+ if (door_1.anim_mode & ANIM_HORIZONTAL && x <= DXSIZE)
{
int src1_x = DXSIZE, src1_y = DOOR_GFX_PAGEY1;
int dst1_x = DX + DXSIZE - i, dst1_y = DY;
BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height,
dst2_x, dst2_y);
}
- else if (door_1.anim_mode == ANIM_VERTICAL && x <= DYSIZE)
+ else if (door_1.anim_mode & ANIM_VERTICAL && x <= DYSIZE)
{
int src1_x = DXSIZE, src1_y = DOOR_GFX_PAGEY1;
int dst1_x = DX, dst1_y = DY + DYSIZE - i;
if (door_state & DOOR_ACTION_2)
{
- int a = MIN(x * door_2.step_offset, VXSIZE);
- int i = (door_state & DOOR_OPEN_2 ? VXSIZE - a : a);
+ int a = MIN(x * door_2.step_offset, door_size_2);
+ int p = (door_state & DOOR_OPEN_2 ? door_size_2 - a : a);
+ int i = p + door_skip;
- if (x <= VYSIZE)
+ if (door_2.anim_mode & ANIM_STATIC_PANEL)
+ {
+ BlitBitmap(bitmap_db_door, drawto,
+ DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2,
+ VXSIZE, VYSIZE, VX, VY);
+ }
+ else if (x <= VYSIZE)
{
BlitBitmap(bitmap_db_door, drawto,
- DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2 + i / 2,
- VXSIZE, VYSIZE - i / 2, VX, VY);
+ DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2 + p / 2,
+ VXSIZE, VYSIZE - p / 2, VX, VY);
- ClearRectangle(drawto, VX, VY + VYSIZE - i / 2, VXSIZE, i / 2);
+ ClearRectangle(drawto, VX, VY + VYSIZE - p / 2, VXSIZE, p / 2);
}
- if (door_2.anim_mode == ANIM_HORIZONTAL && x <= VXSIZE)
+ if (door_2.anim_mode & ANIM_HORIZONTAL && x <= VXSIZE)
{
int src1_x = VXSIZE, src1_y = DOOR_GFX_PAGEY2;
int dst1_x = VX + VXSIZE - i, dst1_y = VY;
BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height,
dst2_x, dst2_y);
}
- else if (door_2.anim_mode == ANIM_VERTICAL && x <= VYSIZE)
+ else if (door_2.anim_mode & ANIM_VERTICAL && x <= VYSIZE)
{
int src1_x = VXSIZE, src1_y = DOOR_GFX_PAGEY2;
int dst1_x = VX, dst1_y = VY + VYSIZE - i;
DOOR_GFX_PAGEX7, 0, EXSIZE + 8, 8,
EX - 4, EY - 12);
BlitBitmap(graphic_info[IMG_GLOBAL_BORDER].bitmap, drawto,
- EX - 4, VY - 4, EXSIZE + 8, EYSIZE - VYSIZE + 4,
- EX - 4, EY - 4);
+ EX - 6, VY - 4, EXSIZE + 12, EYSIZE - VYSIZE + 4,
+ EX - 6, EY - 4);
redraw_mask |= REDRAW_ALL;
}
{
/* draw normal tape recorder window */
BlitBitmap(graphic_info[IMG_GLOBAL_BORDER].bitmap, drawto,
- EX - 4, EY - 12, EXSIZE + 8, EYSIZE - VYSIZE + 12,
- EX - 4, EY - 12);
+ EX - 6, EY - 12, EXSIZE + 12, EYSIZE - VYSIZE + 12,
+ EX - 6, EY - 12);
redraw_mask |= REDRAW_ALL;
}
},
{
Yandroid_ne, FALSE, FALSE,
- EL_EMC_ANDROID, ACTION_TURNING_FROM_UP, MV_BIT_RIGHT
+ EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_UPRIGHT
},
{
Yandroid_neB, FALSE, TRUE,
- EL_EMC_ANDROID, ACTION_TURNING_FROM_UP, MV_BIT_RIGHT
+ EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_UPRIGHT
},
{
Yandroid_e, FALSE, FALSE,
},
{
Yandroid_se, FALSE, FALSE,
- EL_EMC_ANDROID, ACTION_TURNING_FROM_DOWN, MV_BIT_RIGHT
+ EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_DOWNRIGHT
},
{
Yandroid_seB, FALSE, TRUE,
- EL_EMC_ANDROID, ACTION_TURNING_FROM_DOWN, MV_BIT_RIGHT
+ EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_DOWNRIGHT
},
{
Yandroid_s, FALSE, FALSE,
},
{
Yandroid_sw, FALSE, FALSE,
- EL_EMC_ANDROID, ACTION_TURNING_FROM_DOWN, MV_BIT_LEFT
+ EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_DOWNLEFT
},
{
Yandroid_swB, FALSE, TRUE,
- EL_EMC_ANDROID, ACTION_TURNING_FROM_DOWN, MV_BIT_LEFT
+ EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_DOWNLEFT
},
{
Yandroid_w, FALSE, FALSE,
},
{
Yandroid_nw, FALSE, FALSE,
- EL_EMC_ANDROID, ACTION_TURNING_FROM_UP, MV_BIT_LEFT
+ EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_UPLEFT
},
{
Yandroid_nwB, FALSE, TRUE,
- EL_EMC_ANDROID, ACTION_TURNING_FROM_UP, MV_BIT_LEFT
+ EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_UPLEFT
},
{
Xspring, TRUE, FALSE,
SPR_still, 1,
EL_PLAYER_2, ACTION_DEFAULT, -1,
},
+ {
+ SPR_walk + 0, 2,
+ EL_PLAYER_3, ACTION_MOVING, MV_BIT_UP,
+ },
+ {
+ SPR_walk + 1, 2,
+ EL_PLAYER_3, ACTION_MOVING, MV_BIT_RIGHT,
+ },
+ {
+ SPR_walk + 2, 2,
+ EL_PLAYER_3, ACTION_MOVING, MV_BIT_DOWN,
+ },
+ {
+ SPR_walk + 3, 2,
+ EL_PLAYER_3, ACTION_MOVING, MV_BIT_LEFT,
+ },
+ {
+ SPR_push + 0, 2,
+ EL_PLAYER_3, ACTION_PUSHING, MV_BIT_UP,
+ },
+ {
+ SPR_push + 1, 2,
+ EL_PLAYER_3, ACTION_PUSHING, MV_BIT_RIGHT,
+ },
+ {
+ SPR_push + 2, 2,
+ EL_PLAYER_3, ACTION_PUSHING, MV_BIT_DOWN,
+ },
+ {
+ SPR_push + 3, 2,
+ EL_PLAYER_3, ACTION_PUSHING, MV_BIT_LEFT,
+ },
+ {
+ SPR_spray + 0, 2,
+ EL_PLAYER_3, ACTION_SNAPPING, MV_BIT_UP,
+ },
+ {
+ SPR_spray + 1, 2,
+ EL_PLAYER_3, ACTION_SNAPPING, MV_BIT_RIGHT,
+ },
+ {
+ SPR_spray + 2, 2,
+ EL_PLAYER_3, ACTION_SNAPPING, MV_BIT_DOWN,
+ },
+ {
+ SPR_spray + 3, 2,
+ EL_PLAYER_3, ACTION_SNAPPING, MV_BIT_LEFT,
+ },
+ {
+ SPR_walk + 0, 3,
+ EL_PLAYER_4, ACTION_MOVING, MV_BIT_UP,
+ },
+ {
+ SPR_walk + 1, 3,
+ EL_PLAYER_4, ACTION_MOVING, MV_BIT_RIGHT,
+ },
+ {
+ SPR_walk + 2, 3,
+ EL_PLAYER_4, ACTION_MOVING, MV_BIT_DOWN,
+ },
+ {
+ SPR_walk + 3, 3,
+ EL_PLAYER_4, ACTION_MOVING, MV_BIT_LEFT,
+ },
+ {
+ SPR_push + 0, 3,
+ EL_PLAYER_4, ACTION_PUSHING, MV_BIT_UP,
+ },
+ {
+ SPR_push + 1, 3,
+ EL_PLAYER_4, ACTION_PUSHING, MV_BIT_RIGHT,
+ },
+ {
+ SPR_push + 2, 3,
+ EL_PLAYER_4, ACTION_PUSHING, MV_BIT_DOWN,
+ },
+ {
+ SPR_push + 3, 3,
+ EL_PLAYER_4, ACTION_PUSHING, MV_BIT_LEFT,
+ },
+ {
+ SPR_spray + 0, 3,
+ EL_PLAYER_4, ACTION_SNAPPING, MV_BIT_UP,
+ },
+ {
+ SPR_spray + 1, 3,
+ EL_PLAYER_4, ACTION_SNAPPING, MV_BIT_RIGHT,
+ },
+ {
+ SPR_spray + 2, 3,
+ EL_PLAYER_4, ACTION_SNAPPING, MV_BIT_DOWN,
+ },
+ {
+ SPR_spray + 3, 3,
+ EL_PLAYER_4, ACTION_SNAPPING, MV_BIT_LEFT,
+ },
+ {
+ SPR_still, 2,
+ EL_PLAYER_3, ACTION_DEFAULT, -1,
+ },
+ {
+ SPR_still, 3,
+ EL_PLAYER_4, ACTION_DEFAULT, -1,
+ },
{
-1, -1,
return EL_UNKNOWN;
}
+void map_android_clone_elements_RND_to_EM(struct LevelInfo *level)
+{
+ struct LevelInfo_EM *level_em = level->native_em_level;
+ struct LEVEL *lev = level_em->lev;
+ int i, j;
+
+ for (i = 0; i < TILE_MAX; i++)
+ lev->android_array[i] = Xblank;
+
+ for (i = 0; i < level->num_android_clone_elements; i++)
+ {
+ int element_rnd = level->android_clone_element[i];
+ int element_em = map_element_RND_to_EM(element_rnd);
+
+ for (j = 0; em_object_mapping_list[j].element_em != -1; j++)
+ if (em_object_mapping_list[j].element_rnd == element_rnd)
+ lev->android_array[em_object_mapping_list[j].element_em] = element_em;
+ }
+}
+
+void map_android_clone_elements_EM_to_RND(struct LevelInfo *level)
+{
+ struct LevelInfo_EM *level_em = level->native_em_level;
+ struct LEVEL *lev = level_em->lev;
+ int i, j;
+
+ level->num_android_clone_elements = 0;
+
+ for (i = 0; i < TILE_MAX; i++)
+ {
+ int element_em = lev->android_array[i];
+ int element_rnd;
+ boolean element_found = FALSE;
+
+ if (element_em == Xblank)
+ continue;
+
+ element_rnd = map_element_EM_to_RND(element_em);
+
+ for (j = 0; j < level->num_android_clone_elements; j++)
+ if (level->android_clone_element[j] == element_rnd)
+ element_found = TRUE;
+
+ if (!element_found)
+ {
+ level->android_clone_element[level->num_android_clone_elements++] =
+ element_rnd;
+
+ if (level->num_android_clone_elements == MAX_ANDROID_ELEMENTS)
+ break;
+ }
+ }
+
+ if (level->num_android_clone_elements == 0)
+ {
+ level->num_android_clone_elements = 1;
+ level->android_clone_element[0] = EL_EMPTY;
+ }
+}
+
#if 0
int map_element_RND_to_EM(int element_rnd)
#endif
+int map_direction_RND_to_EM(int direction)
+{
+ return (direction == MV_UP ? 0 :
+ direction == MV_RIGHT ? 1 :
+ direction == MV_DOWN ? 2 :
+ direction == MV_LEFT ? 3 :
+ -1);
+}
+
+int map_direction_EM_to_RND(int direction)
+{
+ return (direction == 0 ? MV_UP :
+ direction == 1 ? MV_RIGHT :
+ direction == 2 ? MV_DOWN :
+ direction == 3 ? MV_LEFT :
+ MV_NONE);
+}
+
int get_next_element(int element)
{
switch(element)
{
element = GFX_ELEMENT(element);
- if (direction == MV_NO_MOVING)
+ if (direction == MV_NONE)
return element_info[element].graphic[action];
- direction = MV_DIR_BIT(direction);
+ direction = MV_DIR_TO_BIT(direction);
return element_info[element].direction_graphic[action][direction];
}
int el_act_dir2img(int element, int action, int direction)
{
element = GFX_ELEMENT(element);
- direction = MV_DIR_BIT(direction); /* default: MV_NO_MOVING => MV_DOWN */
+ direction = MV_DIR_TO_BIT(direction); /* default: MV_NONE => MV_DOWN */
/* direction_graphic[][] == graphic[] for undefined direction graphics */
return element_info[element].direction_graphic[action][direction];
{
element = GFX_ELEMENT(element);
- if (direction == MV_NO_MOVING)
+ if (direction == MV_NONE)
return element_info[element].crumbled[action];
- direction = MV_DIR_BIT(direction);
+ direction = MV_DIR_TO_BIT(direction);
return element_info[element].direction_crumbled[action][direction];
}
static int el_act_dir2crm(int element, int action, int direction)
{
element = GFX_ELEMENT(element);
- direction = MV_DIR_BIT(direction); /* default: MV_NO_MOVING => MV_DOWN */
+ direction = MV_DIR_TO_BIT(direction); /* default: MV_NONE => MV_DOWN */
/* direction_graphic[][] == graphic[] for undefined direction graphics */
return element_info[element].direction_crumbled[action][direction];
void InitGraphicInfo_EM(void)
{
struct Mapping_EM_to_RND_object object_mapping[TILE_MAX];
- struct Mapping_EM_to_RND_player player_mapping[2][SPR_MAX];
+ struct Mapping_EM_to_RND_player player_mapping[MAX_PLAYERS][SPR_MAX];
int i, j, p;
#if DEBUG_EM_GFX
object_mapping[i].element_rnd = EL_UNKNOWN;
object_mapping[i].is_backside = FALSE;
object_mapping[i].action = ACTION_DEFAULT;
- object_mapping[i].direction = MV_NO_MOVING;
+ object_mapping[i].direction = MV_NONE;
}
/* always start with reliable default values */
- for (p = 0; p < 2; p++)
+ for (p = 0; p < MAX_PLAYERS; p++)
{
for (i = 0; i < SPR_MAX; i++)
{
player_mapping[p][i].element_rnd = EL_UNKNOWN;
player_mapping[p][i].action = ACTION_DEFAULT;
- player_mapping[p][i].direction = MV_NO_MOVING;
+ player_mapping[p][i].direction = MV_NONE;
}
}
object_mapping[e].action = em_object_mapping_list[i].action;
if (em_object_mapping_list[i].direction != -1)
- object_mapping[e].direction = (1 << em_object_mapping_list[i].direction);
+ object_mapping[e].direction =
+ MV_DIR_FROM_BIT(em_object_mapping_list[i].direction);
}
for (i = 0; em_player_mapping_list[i].action_em != -1; i++)
if (em_player_mapping_list[i].direction != -1)
player_mapping[p][a].direction =
- (1 << em_player_mapping_list[i].direction);
+ MV_DIR_FROM_BIT(em_player_mapping_list[i].direction);
}
for (i = 0; i < TILE_MAX; i++)
g_em->height = TILEY - cy * step;
}
+#if 1
+ /* create unique graphic identifier to decide if tile must be redrawn */
+ /* bit 31 - 16 (16 bit): EM style graphic
+ bit 15 - 12 ( 4 bit): EM style frame
+ bit 11 - 6 ( 6 bit): graphic width
+ bit 5 - 0 ( 6 bit): graphic height */
+ g_em->unique_identifier =
+ (graphic << 16) | (frame << 12) | (g_em->width << 6) | g_em->height;
+#else
/* create unique graphic identifier to decide if tile must be redrawn */
/* bit 31 - 16 (16 bit): EM style element
bit 15 - 12 ( 4 bit): EM style frame
bit 5 - 0 ( 6 bit): graphic height */
g_em->unique_identifier =
(i << 16) | (j << 12) | (g_em->width << 6) | g_em->height;
+#endif
+
+#if 0
+ if (effective_element == EL_ROCK)
+ printf("::: EL_ROCK(%d, %d): %d, %d => %d\n",
+ effective_action, j, graphic, frame, g_em->unique_identifier);
+#endif
#if DEBUG_EM_GFX
+
+#if 1
+ /* skip check for EMC elements not contained in original EMC artwork */
+ if (element == EL_EMC_FAKE_ACID)
+ continue;
+#endif
+
if (g_em->bitmap != debug_bitmap ||
g_em->src_x != debug_src_x ||
g_em->src_y != debug_src_y ||
}
}
- for (p = 0; p < 2; p++)
+ for (p = 0; p < MAX_PLAYERS; p++)
{
for (i = 0; i < SPR_MAX; i++)
{
{
int effective_element = element;
int effective_action = action;
- int graphic = (direction == MV_NO_MOVING ?
+ int graphic = (direction == MV_NONE ?
el_act2img(effective_element, effective_action) :
el_act_dir2img(effective_element, effective_action,
direction));