+Release Version 3.0.6 [06 OCT 2003]
+-----------------------------------
+ - fixed bug when initializing font graphic structure
+ - fixed bug with animation mode "pingpong" when using only 1 frame
+ - fixed bug with extended change target introduced in 3.0.5
+ - fixed bug where passing over moving element doubles player speed
+ - fixed bug with elements continuing to move into push direction
+ - fixed bug with duplicated player when dropping bomb with shield on
+ - fixed switching bug (resetting flag when not switching but not idle)
+ - fixed element tokens for certain file elements with ".active" etc.
+ - added "switching" event for custom elements ("pressing" only once)
+ - added support for MP3 music for SDL version through SMPEG library
+
Release Version 3.0.5 [29 SEP 2003]
-----------------------------------
- fixed bug in multiple config pages loader code that caused crashes
ifeq ($(TARGET),sdl)
SYS_CFLAGS = -DTARGET_SDL $(shell sdl-config --cflags)
+ifeq ($(PLATFORM),macosx)
+SYS_LDFLAGS = -lSDL_image -lSDL_mixer -lsmpeg $(shell sdl-config --libs)
+else
SYS_LDFLAGS = -lSDL_image -lSDL_mixer $(shell sdl-config --libs)
endif
+endif
ifeq ($(TARGET),allegro)
SYS_CFLAGS = -DTARGET_ALLEGRO -I$(CROSS_PATH_MSDOS)/include
-#define COMPILE_DATE_STRING "[2003-09-29 00:44]"
+#define COMPILE_DATE_STRING "[2003-10-06 01:34]"
{ CE_ENTERED_BY_PLAYER, "entered by player ..." },
{ CE_LEFT_BY_PLAYER, "left by player ..." },
{ CE_DROPPED_BY_PLAYER, "dropped by player" },
+ { CE_SWITCHED, "switched ..." },
{ CE_COLLISION, "collision ..." },
{ CE_IMPACT, "impact" },
{ CE_SMASHED, "smashed" },
{ CE_OTHER_GETS_COLLECTED, "player collects" },
{ CE_OTHER_GETS_DROPPED, "player drops" },
{ CE_OTHER_IS_TOUCHING, "touching ..." },
+ { CE_OTHER_IS_SWITCHING, "switch of ..." },
{ CE_OTHER_IS_CHANGING, "change of" },
{ CE_OTHER_IS_EXPLODING, "explosion of" },
{ -1, NULL }
HAS_CHANGE_EVENT(element, CE_ENTERED_BY_PLAYER) ? CE_ENTERED_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_LEFT_BY_PLAYER) ? CE_LEFT_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_DROPPED_BY_PLAYER) ? CE_DROPPED_BY_PLAYER :
+ HAS_CHANGE_EVENT(element, CE_SWITCHED) ? CE_SWITCHED :
HAS_CHANGE_EVENT(element, CE_COLLISION) ? CE_COLLISION :
HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT :
HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED :
HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED :
HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING :
+ HAS_CHANGE_EVENT(element, CE_OTHER_IS_SWITCHING) ? CE_OTHER_IS_SWITCHING :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING :
custom_element_change.other_action);
custom_element_change_events[CE_ENTERED_BY_PLAYER] = FALSE;
custom_element_change_events[CE_LEFT_BY_PLAYER] = FALSE;
custom_element_change_events[CE_DROPPED_BY_PLAYER] = FALSE;
+ custom_element_change_events[CE_SWITCHED] = FALSE;
custom_element_change_events[CE_COLLISION] = FALSE;
custom_element_change_events[CE_IMPACT] = FALSE;
custom_element_change_events[CE_SMASHED] = FALSE;
custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE;
custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE;
custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE;
+ custom_element_change_events[CE_OTHER_IS_SWITCHING] = FALSE;
custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE;
custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE;
custom_element_change_events[custom_element_change.other_action] =
printf(" Feld[%d][%d] == %d ('%s')\n", x,y, Feld[x][y],
element_info[Feld[x][y]].token_name);
+ printf(" Back[%d][%d] == %d\n", x,y, Back[x][y]);
printf(" Store[%d][%d] == %d\n", x,y, Store[x][y]);
printf(" Store2[%d][%d] == %d\n", x,y, Store2[x][y]);
printf(" StorePlayer[%d][%d] == %d\n", x,y, StorePlayer[x][y]);
player->Frame = 0;
player->StepFrame = 0;
+ player->switch_x = -1;
+ player->switch_y = -1;
+
player->use_murphy_graphic = FALSE;
player->use_disk_red_graphic = FALSE;
int element = Feld[x][y];
#endif
+#if 1
+ if (IS_PLAYER(x, y) && !PLAYER_PROTECTED(x, y))
+#else
if (IS_PLAYER(x, y))
+#endif
{
struct PlayerInfo *player = PLAYERINFO(x, y);
else
{
CheckElementChange(x, y + 1, smashed, CE_SMASHED);
+
+ CheckTriggeredElementSideChange(x, y + 1, smashed, CH_SIDE_TOP,
+ CE_OTHER_IS_SWITCHING);
+ CheckElementSideChange(x, y + 1, smashed, CH_SIDE_TOP,
+ CE_SWITCHED, -1);
}
}
else
Stop[newx][newy] = TRUE; /* ignore this element until the next frame */
+ /* prevent pushed element from moving on in pushed direction */
+ if (pushed && CAN_MOVE(element) &&
+ element_info[element].move_pattern & MV_ANY_DIRECTION &&
+ !(element_info[element].move_pattern & MovDir[newx][newy]))
+ TurnRound(newx, newy);
+
if (!pushed) /* special case: moving object pushed by player */
JustStopped[newx][newy] = 3;
if (IS_MOVING(ex, ey) || IS_BLOCKED(ex, ey))
RemoveMovingField(ex, ey);
+ ChangeEvent[ex][ey] = ChangeEvent[x][y];
+
ChangeElementNowExt(ex, ey, change->content[xx][yy]);
something_has_changed = TRUE;
}
}
- if (TimeFrames >= (1000 / GameFrameDelay))
+ if (TimeFrames >= FRAMES_PER_SECOND)
{
TimeFrames = 0;
TimePlayed++;
#if 1
player->snapped = FALSE;
#endif
+
+#if 1
+ player->Switching = FALSE;
+#endif
}
else
{
switch (element)
{
+#if 0
case EL_ROBOT_WHEEL:
Feld[x][y] = EL_ROBOT_WHEEL_ACTIVE;
ZX = x;
PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVATING);
return MF_ACTION;
break;
+#endif
+#if 0
case EL_SP_TERMINAL:
{
int xx, yy;
return MF_ACTION;
}
break;
+#endif
+#if 0
case EL_CONVEYOR_BELT_1_SWITCH_LEFT:
case EL_CONVEYOR_BELT_1_SWITCH_MIDDLE:
case EL_CONVEYOR_BELT_1_SWITCH_RIGHT:
case EL_CONVEYOR_BELT_4_SWITCH_LEFT:
case EL_CONVEYOR_BELT_4_SWITCH_MIDDLE:
case EL_CONVEYOR_BELT_4_SWITCH_RIGHT:
+#if 1
+ if (!PLAYER_SWITCHING(player, x, y))
+#else
if (!player->Switching)
+#endif
{
player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
ToggleBeltSwitch(x, y);
PlaySoundLevel(x, y, SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING);
}
return MF_ACTION;
break;
+#endif
+#if 0
case EL_SWITCHGATE_SWITCH_UP:
case EL_SWITCHGATE_SWITCH_DOWN:
+#if 1
+ if (!PLAYER_SWITCHING(player, x, y))
+#else
if (!player->Switching)
+#endif
{
player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
ToggleSwitchgateSwitch(x, y);
PlaySoundLevel(x, y, SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING);
}
return MF_ACTION;
break;
+#endif
+#if 0
case EL_LIGHT_SWITCH:
case EL_LIGHT_SWITCH_ACTIVE:
+#if 1
+ if (!PLAYER_SWITCHING(player, x, y))
+#else
if (!player->Switching)
+#endif
{
player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
ToggleLightSwitch(x, y);
PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
SND_LIGHT_SWITCH_ACTIVATING :
}
return MF_ACTION;
break;
+#endif
+#if 0
case EL_TIMEGATE_SWITCH:
ActivateTimegateSwitch(x, y);
PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVATING);
return MF_ACTION;
break;
+#endif
+#if 0
case EL_BALLOON_SWITCH_LEFT:
case EL_BALLOON_SWITCH_RIGHT:
case EL_BALLOON_SWITCH_UP:
return MF_ACTION;
break;
+#endif
case EL_SP_PORT_LEFT:
case EL_SP_PORT_RIGHT:
}
break;
+#if 0
case EL_LAMP:
Feld[x][y] = EL_LAMP_ACTIVE;
local_player->lights_still_needed--;
PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
return MF_ACTION;
break;
+#endif
+#if 0
case EL_TIME_ORB_FULL:
Feld[x][y] = EL_TIME_ORB_EMPTY;
TimeLeft += 10;
PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE);
return MF_ACTION;
break;
+#endif
default:
if (!IN_LEV_FIELD(nextx, nexty) || !IS_FREE(nextx, nexty))
return MF_NO_ACTION;
+#if 1
+ if (CAN_MOVE(element)) /* only fixed elements can be passed! */
+ return MF_NO_ACTION;
+#endif
+
if (element >= EL_EM_GATE_1 && element <= EL_EM_GATE_4)
{
if (!player->key[element - EL_EM_GATE_1])
return MF_NO_ACTION;
#if 1
- /*
- printf("::: %d [%d,%d,%d => %d]\n", MovDir[x][y],
- CAN_MOVE(element), move_direction, getElementMoveStepsize(x, y),
- (CAN_MOVE(element) && MovDir[x][y] == move_direction &&
- getElementMoveStepsize(x, y) > MOVE_STEPSIZE_NORMAL) );
- */
-
/* do not push elements already moving away faster than player */
if (CAN_MOVE(element) && MovDir[x][y] == move_direction &&
ABS(getElementMoveStepsize(x, y)) > MOVE_STEPSIZE_NORMAL)
break;
}
+ else if (IS_SWITCHABLE(element))
+ {
+ if (PLAYER_SWITCHING(player, x, y))
+ return MF_ACTION;
+
+#if 1
+ PlaySoundLevelElementAction(x, y, element, ACTION_ACTIVATING);
+#endif
+
+ if (element == EL_ROBOT_WHEEL)
+ {
+ Feld[x][y] = EL_ROBOT_WHEEL_ACTIVE;
+ ZX = x;
+ ZY = y;
+
+ DrawLevelField(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVATING);
+#endif
+ }
+ else if (element == EL_SP_TERMINAL)
+ {
+ int xx, yy;
+
+#if 0
+ PlaySoundLevel(x, y, SND_SP_TERMINAL_ACTIVATING);
+#endif
+
+ for (yy=0; yy<lev_fieldy; yy++)
+ {
+ for (xx=0; xx<lev_fieldx; xx++)
+ {
+ if (Feld[xx][yy] == EL_SP_DISK_YELLOW)
+ Bang(xx, yy);
+ else if (Feld[xx][yy] == EL_SP_TERMINAL)
+ Feld[xx][yy] = EL_SP_TERMINAL_ACTIVE;
+ }
+ }
+ }
+ else if (IS_BELT_SWITCH(element))
+ {
+#if 0
+ if (!PLAYER_SWITCHING(player, x, y))
+#endif
+ {
+ player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
+ ToggleBeltSwitch(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING);
+#endif
+ }
+ }
+ else if (element == EL_SWITCHGATE_SWITCH_UP ||
+ element == EL_SWITCHGATE_SWITCH_DOWN)
+ {
+#if 0
+ if (!PLAYER_SWITCHING(player, x, y))
+#endif
+ {
+ player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
+ ToggleSwitchgateSwitch(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING);
+#endif
+ }
+ }
+ else if (element == EL_LIGHT_SWITCH ||
+ element == EL_LIGHT_SWITCH_ACTIVE)
+ {
+#if 0
+ if (!PLAYER_SWITCHING(player, x, y))
+#endif
+ {
+ player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
+ ToggleLightSwitch(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
+ SND_LIGHT_SWITCH_ACTIVATING :
+ SND_LIGHT_SWITCH_DEACTIVATING);
+#endif
+ }
+ }
+ else if (element == EL_TIMEGATE_SWITCH)
+ {
+ ActivateTimegateSwitch(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVATING);
+#endif
+ }
+ else if (element == EL_BALLOON_SWITCH_LEFT ||
+ element == EL_BALLOON_SWITCH_RIGHT ||
+ element == EL_BALLOON_SWITCH_UP ||
+ element == EL_BALLOON_SWITCH_DOWN ||
+ element == EL_BALLOON_SWITCH_ANY)
+ {
+ if (element == EL_BALLOON_SWITCH_ANY)
+ game.balloon_dir = move_direction;
+ else
+ game.balloon_dir = (element == EL_BALLOON_SWITCH_LEFT ? MV_LEFT :
+ element == EL_BALLOON_SWITCH_RIGHT ? MV_RIGHT :
+ element == EL_BALLOON_SWITCH_UP ? MV_UP :
+ element == EL_BALLOON_SWITCH_DOWN ? MV_DOWN :
+ MV_NO_MOVING);
+
+#if 0
+ PlaySoundLevel(x, y, SND_CLASS_BALLOON_SWITCH_ACTIVATING);
+#endif
+ }
+ else if (element == EL_LAMP)
+ {
+ Feld[x][y] = EL_LAMP_ACTIVE;
+ local_player->lights_still_needed--;
+
+ DrawLevelField(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
+#endif
+ }
+ else if (element == EL_TIME_ORB_FULL)
+ {
+ Feld[x][y] = EL_TIME_ORB_EMPTY;
+ TimeLeft += 10;
+ DrawText(DX_TIME, DY_TIME, int2str(TimeLeft, 3), FONT_TEXT_2);
+
+ DrawLevelField(x, y);
+
+#if 0
+ PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE);
+#endif
+ }
+
+ return MF_ACTION;
+ }
else
{
#if 1
+ if (!PLAYER_SWITCHING(player, x, y))
+#else
+ if (!player->Switching)
+#endif
+ {
+ player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
+ CheckTriggeredElementSideChange(x, y, element, dig_side,
+ CE_OTHER_IS_SWITCHING);
+ CheckElementSideChange(x, y, element, dig_side, CE_SWITCHED, -1);
+ }
+
CheckTriggeredElementSideChange(x, y, element, dig_side,
- CE_OTHER_GETS_PRESSED);
+ CE_OTHER_GETS_PRESSED);
CheckElementSideChange(x, y, element, dig_side,
CE_PRESSED_BY_PLAYER, -1);
-#else
- CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_PRESSED);
- CheckElementChange(x, y, element, CE_PRESSED_BY_PLAYER);
-#endif
}
return MF_NO_ACTION;
/* ---------- initialize font graphic definitions ---------- */
/* always start with reliable default values (normal font graphics) */
+#if 1
+ for (i=0; i < NUM_FONTS; i++)
+ font_info[i].graphic = IMG_FONT_INITIAL_1;
+#else
for (i=0; i < NUM_FONTS; i++)
font_info[i].graphic = FONT_INITIAL_1;
+#endif
/* initialize normal font/graphic mapping from static configuration */
for (i=0; font_to_graphic[i].font_nr > -1; i++)
}
}
+#if 1
+ /* set animation mode to "none" for each graphic with only 1 frame */
+ for (i=0; i<MAX_NUM_ELEMENTS; i++)
+ {
+ for (act=0; act<NUM_ACTIONS; act++)
+ {
+ int graphic = element_info[i].graphic[act];
+ int crumbled = element_info[i].crumbled[act];
+
+ if (graphic_info[graphic].anim_frames == 1)
+ graphic_info[graphic].anim_mode = ANIM_NONE;
+ if (graphic_info[crumbled].anim_frames == 1)
+ graphic_info[crumbled].anim_mode = ANIM_NONE;
+
+ for (dir=0; dir<NUM_DIRECTIONS; dir++)
+ {
+ graphic = element_info[i].direction_graphic[act][dir];
+ crumbled = element_info[i].direction_crumbled[act][dir];
+
+ if (graphic_info[graphic].anim_frames == 1)
+ graphic_info[graphic].anim_mode = ANIM_NONE;
+ if (graphic_info[crumbled].anim_frames == 1)
+ graphic_info[crumbled].anim_mode = ANIM_NONE;
+ }
+ }
+ }
+#endif
+
#if 0
#if DEBUG
if (options.verbose)
graphic_info[graphic].anim_delay = 1;
graphic_info[graphic].anim_mode = parameter[GFX_ARG_ANIM_MODE];
+#if 0
+ if (graphic_info[graphic].anim_frames == 1)
+ graphic_info[graphic].anim_mode = ANIM_NONE;
+#endif
/* automatically determine correct start frame, if not defined */
if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE)
}
else if (mode & ANIM_PINGPONG) /* oscillate (border frames once) */
{
+#if 1
+ int max_anim_frames = (num_frames > 1 ? 2 * num_frames - 2 : 1);
+#else
int max_anim_frames = 2 * num_frames - 2;
+#endif
frame = (sync_frame % (delay * max_anim_frames)) / delay;
frame = (frame < num_frames ? frame : max_anim_frames - frame);
"biomaze"
},
{
- "dynamite_active",
+ "dynamite.active",
"dynamite",
"burning dynamite"
},
"magic wheel"
},
{
- "robot_wheel_active",
+ "robot_wheel.active",
"robot_wheel",
"magic wheel (running)"
},
"lamp (off)"
},
{
- "lamp_active",
+ "lamp.active",
"lamp",
"lamp (on)"
},
"sokoban field with object"
},
{
- "bd_butterfly_right",
+ "bd_butterfly.right",
"bd_butterfly",
"butterfly (starts moving right)"},
{
- "bd_butterfly_up",
+ "bd_butterfly.up",
"bd_butterfly",
"butterfly (starts moving up)"
},
{
- "bd_butterfly_left",
+ "bd_butterfly.left",
"bd_butterfly",
"butterfly (starts moving left)"},
{
- "bd_butterfly_down",
+ "bd_butterfly.down",
"bd_butterfly",
"butterfly (starts moving down)"},
{
- "bd_firefly_right",
+ "bd_firefly.right",
"bd_firefly",
"firefly (starts moving right)"
},
{
- "bd_firefly_up",
+ "bd_firefly.up",
"bd_firefly",
"firefly (starts moving up)"
},
{
- "bd_firefly_left",
+ "bd_firefly.left",
"bd_firefly",
"firefly (starts moving left)"
},
{
- "bd_firefly_down",
+ "bd_firefly.down",
"bd_firefly",
"firefly (starts moving down)"
},
"blue player"
},
{
- "bug_right",
+ "bug.right",
"bug",
"bug (starts moving right)"
},
{
- "bug_up",
+ "bug.up",
"bug",
"bug (starts moving up)"
},
{
- "bug_left",
+ "bug.left",
"bug",
"bug (starts moving left)"
},
{
- "bug_down",
+ "bug.down",
"bug",
"bug (starts moving down)"
},
{
- "spaceship_right",
+ "spaceship.right",
"spaceship",
"spaceship (starts moving right)"},
{
- "spaceship_up",
+ "spaceship.up",
"spaceship",
"spaceship (starts moving up)"
},
{
- "spaceship_left",
+ "spaceship.left",
"spaceship",
"spaceship (starts moving left)"},
{
- "spaceship_down",
+ "spaceship.down",
"spaceship",
"spaceship (starts moving down)"},
{
- "pacman_right",
+ "pacman.right",
"pacman",
"pac man (starts moving right)"
},
{
- "pacman_up",
+ "pacman.up",
"pacman",
"pac man (starts moving up)"
},
{
- "pacman_left",
+ "pacman.left",
"pacman",
"pac man (starts moving left)"
},
{
- "pacman_down",
+ "pacman.down",
"pacman",
"pac man (starts moving down)"
},
"light switch (off)"
},
{
- "light_switch_active",
+ "light_switch.active",
"light_switch",
"light switch (on)"
},
"sign (other)"
},
{
- "mole_left",
+ "mole.left",
"mole",
"mole (starts moving left)"
},
{
- "mole_right",
+ "mole.right",
"mole",
"mole (starts moving right)"
},
{
- "mole_up",
+ "mole.up",
"mole",
"mole (starts moving up)"
},
{
- "mole_down",
+ "mole.down",
"mole",
"mole (starts moving down)"
},
"time gate (closed)"
},
{
- "timegate_switch_active",
+ "timegate_switch.active",
"timegate_switch",
"switch for time gate"
},
/* ----------------------------------------------------------------------- */
{
- "dynabomb_player_1_active",
+ "dynabomb_player_1.active",
"dynabomb",
"-"
},
{
- "dynabomb_player_2_active",
+ "dynabomb_player_2.active",
"dynabomb",
"-"
},
{
- "dynabomb_player_3_active",
+ "dynabomb_player_3.active",
"dynabomb",
"-"
},
{
- "dynabomb_player_4_active",
+ "dynabomb_player_4.active",
"dynabomb",
"-"
},
{
- "sp_disk_red_active",
+ "sp_disk_red.active",
"dynamite",
"-"
},
{
- "switchgate_opening",
+ "switchgate.opening",
"switchgate",
"-"
},
{
- "switchgate_closing",
+ "switchgate.closing",
"switchgate",
"-"
},
{
- "timegate_opening",
+ "timegate.opening",
"timegate",
"-"
},
{
- "timegate_closing",
+ "timegate.closing",
"timegate",
"-"
},
{
- "pearl_breaking",
+ "pearl.breaking",
"pearl",
"-"
},
{
- "trap_active",
+ "trap.active",
"trap",
"-"
},
{
- "invisible_steelwall_active",
+ "invisible_steelwall.active",
"wall",
"-"
},
{
- "invisible_wall_active",
+ "invisible_wall.active",
"wall",
"-"
},
{
- "invisible_sand_active",
+ "invisible_sand.active",
"sand",
"-"
},
{
- "conveyor_belt_1_left_active",
+ "conveyor_belt_1_left.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_1_middle_active",
+ "conveyor_belt_1_middle.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_1_right_active",
+ "conveyor_belt_1_right.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_2_left_active",
+ "conveyor_belt_2_left.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_2_middle_active",
+ "conveyor_belt_2_middle.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_2_right_active",
+ "conveyor_belt_2_right.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_3_left_active",
+ "conveyor_belt_3_left.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_3_middle_active",
+ "conveyor_belt_3_middle.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_3_right_active",
+ "conveyor_belt_3_right.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_4_left_active",
+ "conveyor_belt_4_left.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_4_middle_active",
+ "conveyor_belt_4_middle.active",
"conveyor_belt",
"-"
},
{
- "conveyor_belt_4_right_active",
+ "conveyor_belt_4_right.active",
"conveyor_belt",
"-"
},
{
- "exit_opening",
+ "exit.opening",
"exit",
"-"
},
{
- "exit_closing",
+ "exit.closing",
"exit",
"-"
},
"-"
},
{
- "sp_terminal_active",
+ "sp_terminal.active",
"sp_terminal",
"-"
},
{
- "sp_buggy_base_activating",
+ "sp_buggy_base.activating",
"sp_buggy_base",
"-"
},
{
- "sp_buggy_base_active",
+ "sp_buggy_base.active",
"sp_buggy_base",
"-"
},
"-"
},
{
- "amoeba_dropping",
+ "amoeba.dropping",
"amoeba",
"-"
},
{
- "quicksand_emptying",
+ "quicksand.emptying",
"quicksand",
"-"
},
{
- "magic_wall_active",
+ "magic_wall.active",
"magic_wall",
"-"
},
{
- "bd_magic_wall_active",
+ "bd_magic_wall.active",
"magic_wall",
"-"
},
"-"
},
{
- "magic_wall_emptying",
+ "magic_wall.emptying",
"magic_wall",
"-"
},
{
- "bd_magic_wall_emptying",
+ "bd_magic_wall.emptying",
"magic_wall",
"-"
},
"-"
},
{
- "expandable_wall_growing",
+ "expandable_wall.growing",
"-",
"-"
},
"-"
},
{
- "quicksand_filling",
+ "quicksand.filling",
"quicksand",
"-"
},
{
- "magic_wall_filling",
+ "magic_wall.filling",
"-",
"-"
},
{
- "bd_magic_wall_filling",
+ "bd_magic_wall.filling",
"-",
"-"
},
"-"
},
{
- "dynabomb_active",
+ "dynabomb.active",
"-",
"-"
},
"-"
},
{
- "shield_normal_active",
+ "shield_normal.active",
"-",
"-"
},
{
- "shield_deadly_active",
+ "shield_deadly.active",
"-",
"-"
},
#define CE_LEFT_BY_PLAYER 22
#define CE_OTHER_GETS_ENTERED 23
#define CE_OTHER_GETS_LEFT 24
+#define CE_SWITCHED 25
+#define CE_OTHER_IS_SWITCHING 26
-/* values for derived change events (determined from properties above) */
-#define CE_TOUCHING_SOME_SIDE 25 /* summarized left/right/up/down/any */
-
-#define NUM_CHANGE_EVENTS 26
+#define NUM_CHANGE_EVENTS 27
#define CE_BITMASK_DEFAULT 0
#define PLAYER_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
PROTECTED_FIELD(x, y))
+#define PLAYER_SWITCHING(p,x,y) ((p)->Switching && \
+ (p)->switch_x == (x) && (p)->switch_y == (y))
+
#define PLAYER_NR_GFX(g,i) ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1))
#define ANIM_FRAMES(g) (graphic_info[g].anim_frames)
#define PROGRAM_VERSION_MAJOR 3
#define PROGRAM_VERSION_MINOR 0
-#define PROGRAM_VERSION_PATCH 5
+#define PROGRAM_VERSION_PATCH 6
#define PROGRAM_VERSION_RELEASE 0
-#define PROGRAM_VERSION_STRING "3.0.5"
+#define PROGRAM_VERSION_STRING "3.0.6"
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
#define PROGRAM_AUTHOR_STRING "Holger Schemel"
boolean LevelSolved, GameOver;
boolean snapped;
+ int switch_x, switch_y;
+
int last_move_dir;
boolean is_moving;
boolean is_waiting;
int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : yoffset_setup);
int last_game_status = game_status; /* save current game status */
-#if 1
- DrawBackground(mSX, mSY, SXSIZE - 32 + menu.scrollbar_xoffset, SYSIZE);
-#else
- DrawBackground(SX, SY, SXSIZE - 32, SYSIZE);
-#endif
-
title_string =
(ti->type == TREE_TYPE_LEVEL_DIR ? "Level Directories" :
ti->type == TREE_TYPE_GRAPHICS_DIR ? "Custom Graphics" :
/* force LEVELS font on artwork setup screen */
game_status = GAME_MODE_LEVELS;
+ /* clear tree list area, but not title or scrollbar */
+ DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32,
+ SXSIZE - 32 + menu.scrollbar_xoffset, SYSIZE);
+
for(i=0; i<num_page_entries; i++)
{
TreeInfo *node, *node_first;