FONT_TEXT_2, GFX_SPECIAL_ARG_PREVIEW,
IMG_FONT_TEXT_2_PREVIEW
},
+ {
+ FONT_TEXT_2, GFX_SPECIAL_ARG_PLAYING,
+ IMG_FONT_TEXT_2_PLAYING
+ },
{
FONT_TEXT_2, GFX_SPECIAL_ARG_SCORES,
IMG_FONT_TEXT_2_SCORES
FONT_TEXT_3, GFX_SPECIAL_ARG_PREVIEW,
IMG_FONT_TEXT_3_PREVIEW
},
+ {
+ FONT_TEXT_3, GFX_SPECIAL_ARG_PLAYING,
+ IMG_FONT_TEXT_3_PLAYING
+ },
{
FONT_TEXT_3, GFX_SPECIAL_ARG_SCORES,
IMG_FONT_TEXT_3_SCORES
FONT_TEXT_4, GFX_SPECIAL_ARG_LEVELS,
IMG_FONT_TEXT_4_LEVELS
},
+ {
+ FONT_TEXT_4, GFX_SPECIAL_ARG_PLAYING,
+ IMG_FONT_TEXT_4_PLAYING
+ },
{
FONT_TEXT_4, GFX_SPECIAL_ARG_SCORES,
IMG_FONT_TEXT_4_SCORES
{ "font.text_2.PREVIEW.y", "160" },
{ "font.text_2.PREVIEW.width", "16" },
{ "font.text_2.PREVIEW.height", "16" },
+ { "font.text_2.PLAYING", "RocksFontEM.pcx" },
+ { "font.text_2.PLAYING.x", "0" },
+ { "font.text_2.PLAYING.y", "160" },
+ { "font.text_2.PLAYING.width", "16" },
+ { "font.text_2.PLAYING.height", "16" },
{ "font.text_2.SCORES", "RocksFontBig.pcx" },
{ "font.text_2.SCORES.x", "0" },
{ "font.text_2.SCORES.y", "320" },
{ "font.text_3.PREVIEW.y", "160" },
{ "font.text_3.PREVIEW.width", "16" },
{ "font.text_3.PREVIEW.height", "16" },
+ { "font.text_3.PLAYING", "RocksFontEM.pcx" },
+ { "font.text_3.PLAYING.x", "0" },
+ { "font.text_3.PLAYING.y", "160" },
+ { "font.text_3.PLAYING.width", "16" },
+ { "font.text_3.PLAYING.height", "16" },
{ "font.text_3.SCORES", "RocksFontMedium.pcx" },
{ "font.text_3.SCORES.x", "0" },
{ "font.text_3.SCORES.y", "480" },
{ "font.text_4.LEVELS.y", "480" },
{ "font.text_4.LEVELS.width", "16" },
{ "font.text_4.LEVELS.height", "32" },
+ { "font.text_4.PLAYING", "RocksFontEM.pcx" },
+ { "font.text_4.PLAYING.x", "0" },
+ { "font.text_4.PLAYING.y", "160" },
+ { "font.text_4.PLAYING.width", "16" },
+ { "font.text_4.PLAYING.height", "16" },
{ "font.text_4.SCORES", "RocksFontMedium.pcx" },
{ "font.text_4.SCORES.x", "0" },
{ "font.text_4.SCORES.y", "480" },
#define IMG_FONT_TEXT_2 1236
#define IMG_FONT_TEXT_2_LEVELS 1237
#define IMG_FONT_TEXT_2_PREVIEW 1238
-#define IMG_FONT_TEXT_2_SCORES 1239
-#define IMG_FONT_TEXT_2_ACTIVE_SCORES 1240
-#define IMG_FONT_TEXT_3 1241
-#define IMG_FONT_TEXT_3_LEVELS 1242
-#define IMG_FONT_TEXT_3_PREVIEW 1243
-#define IMG_FONT_TEXT_3_SCORES 1244
-#define IMG_FONT_TEXT_3_ACTIVE_SCORES 1245
-#define IMG_FONT_TEXT_4 1246
-#define IMG_FONT_TEXT_4_LEVELS 1247
-#define IMG_FONT_TEXT_4_SCORES 1248
-#define IMG_FONT_TEXT_4_ACTIVE_SCORES 1249
-#define IMG_FONT_INPUT_1 1250
-#define IMG_FONT_INPUT_1_MAIN 1251
-#define IMG_FONT_INPUT_1_ACTIVE 1252
-#define IMG_FONT_INPUT_1_ACTIVE_MAIN 1253
-#define IMG_FONT_INPUT_1_ACTIVE_SETUP 1254
-#define IMG_FONT_INPUT_2 1255
-#define IMG_FONT_INPUT_2_ACTIVE 1256
-#define IMG_FONT_OPTION_OFF 1257
-#define IMG_FONT_OPTION_ON 1258
-#define IMG_FONT_VALUE_1 1259
-#define IMG_FONT_VALUE_2 1260
-#define IMG_FONT_VALUE_OLD 1261
-#define IMG_FONT_LEVEL_NUMBER 1262
-#define IMG_FONT_TAPE_RECORDER 1263
-#define IMG_FONT_GAME_INFO 1264
-#define IMG_GLOBAL_BORDER 1265
-#define IMG_GLOBAL_DOOR 1266
-#define IMG_EDITOR_ELEMENT_BORDER 1267
-#define IMG_EDITOR_ELEMENT_BORDER_INPUT 1268
-#define IMG_GAME_ENVELOPE_BACKGROUND 1269
-#define IMG_GAME_ENVELOPE_1_BACKGROUND 1270
-#define IMG_GAME_ENVELOPE_2_BACKGROUND 1271
-#define IMG_GAME_ENVELOPE_3_BACKGROUND 1272
-#define IMG_GAME_ENVELOPE_4_BACKGROUND 1273
-#define IMG_BACKGROUND 1274
-#define IMG_BACKGROUND_MAIN 1275
-#define IMG_BACKGROUND_LEVELS 1276
-#define IMG_BACKGROUND_SCORES 1277
-#define IMG_BACKGROUND_EDITOR 1278
-#define IMG_BACKGROUND_INFO 1279
-#define IMG_BACKGROUND_SETUP 1280
-#define IMG_BACKGROUND_DOOR 1281
+#define IMG_FONT_TEXT_2_PLAYING 1239
+#define IMG_FONT_TEXT_2_SCORES 1240
+#define IMG_FONT_TEXT_2_ACTIVE_SCORES 1241
+#define IMG_FONT_TEXT_3 1242
+#define IMG_FONT_TEXT_3_LEVELS 1243
+#define IMG_FONT_TEXT_3_PREVIEW 1244
+#define IMG_FONT_TEXT_3_PLAYING 1245
+#define IMG_FONT_TEXT_3_SCORES 1246
+#define IMG_FONT_TEXT_3_ACTIVE_SCORES 1247
+#define IMG_FONT_TEXT_4 1248
+#define IMG_FONT_TEXT_4_LEVELS 1249
+#define IMG_FONT_TEXT_4_PLAYING 1250
+#define IMG_FONT_TEXT_4_SCORES 1251
+#define IMG_FONT_TEXT_4_ACTIVE_SCORES 1252
+#define IMG_FONT_INPUT_1 1253
+#define IMG_FONT_INPUT_1_MAIN 1254
+#define IMG_FONT_INPUT_1_ACTIVE 1255
+#define IMG_FONT_INPUT_1_ACTIVE_MAIN 1256
+#define IMG_FONT_INPUT_1_ACTIVE_SETUP 1257
+#define IMG_FONT_INPUT_2 1258
+#define IMG_FONT_INPUT_2_ACTIVE 1259
+#define IMG_FONT_OPTION_OFF 1260
+#define IMG_FONT_OPTION_ON 1261
+#define IMG_FONT_VALUE_1 1262
+#define IMG_FONT_VALUE_2 1263
+#define IMG_FONT_VALUE_OLD 1264
+#define IMG_FONT_LEVEL_NUMBER 1265
+#define IMG_FONT_TAPE_RECORDER 1266
+#define IMG_FONT_GAME_INFO 1267
+#define IMG_GLOBAL_BORDER 1268
+#define IMG_GLOBAL_DOOR 1269
+#define IMG_EDITOR_ELEMENT_BORDER 1270
+#define IMG_EDITOR_ELEMENT_BORDER_INPUT 1271
+#define IMG_GAME_ENVELOPE_BACKGROUND 1272
+#define IMG_GAME_ENVELOPE_1_BACKGROUND 1273
+#define IMG_GAME_ENVELOPE_2_BACKGROUND 1274
+#define IMG_GAME_ENVELOPE_3_BACKGROUND 1275
+#define IMG_GAME_ENVELOPE_4_BACKGROUND 1276
+#define IMG_BACKGROUND 1277
+#define IMG_BACKGROUND_MAIN 1278
+#define IMG_BACKGROUND_LEVELS 1279
+#define IMG_BACKGROUND_SCORES 1280
+#define IMG_BACKGROUND_EDITOR 1281
+#define IMG_BACKGROUND_INFO 1282
+#define IMG_BACKGROUND_SETUP 1283
+#define IMG_BACKGROUND_DOOR 1284
-#define NUM_IMAGE_FILES 1282
+#define NUM_IMAGE_FILES 1285
#endif /* CONF_GFX_H */
-#define COMPILE_DATE_STRING "[2003-09-27 11:36]"
+#define COMPILE_DATE_STRING "[2003-09-27 18:33]"
GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP,
GADGET_ID_CHANGE_CONT_RND_TEXT, GADGET_ID_NONE,
&custom_element_change.random,
- NULL, "use random change:", "(%)"
+ NULL, "use random replace:", "%"
},
};
{ MV_ALONG_RIGHT_SIDE, "along right side" },
{ MV_TURNING_LEFT, "turning left" },
{ MV_TURNING_RIGHT, "turning right" },
+ { MV_WHEN_PUSHED, "when pushed" },
{ -1, NULL }
};
static struct ValueTextInfo options_time_units[] =
{
- { FRAMES_PER_SECOND, "seconds" },
{ 1, "frames" },
+ { FRAMES_PER_SECOND, "seconds" },
{ -1, NULL }
};
static struct ValueTextInfo options_change_direct_action[] =
{
- { CE_TOUCHED_BY_PLAYER, "touched by player" },
- { CE_PRESSED_BY_PLAYER, "pressed by player" },
- { CE_PUSHED_BY_PLAYER, "pushed by player" },
+ { CE_TOUCHED_BY_PLAYER, "touched by player ..." },
+ { CE_PRESSED_BY_PLAYER, "pressed by player ..." },
+ { CE_PUSHED_BY_PLAYER, "pushed by player ..." },
{ CE_ENTERED_BY_PLAYER, "entered by player ..." },
{ CE_LEFT_BY_PLAYER, "left by player ..." },
{ CE_DROPPED_BY_PLAYER, "dropped by player" },
- { CE_COLLISION, "collision" },
+ { CE_COLLISION, "collision ..." },
{ CE_IMPACT, "impact" },
{ CE_SMASHED, "smashed" },
{ -1, NULL }
static struct ValueTextInfo options_change_other_action[] =
{
- { CE_OTHER_GETS_TOUCHED, "player touches" },
- { CE_OTHER_GETS_PRESSED, "player presses" },
- { CE_OTHER_GETS_PUSHED, "player pushes" },
+ { CE_OTHER_GETS_TOUCHED, "player touches ..." },
+ { CE_OTHER_GETS_PRESSED, "player presses ..." },
+ { CE_OTHER_GETS_PUSHED, "player pushes ..." },
{ CE_OTHER_GETS_ENTERED, "player enters ..." },
{ CE_OTHER_GETS_LEFT, "player leaves ..." },
{ CE_OTHER_GETS_DIGGED, "player digs" },
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11),
GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE,
&custom_element_change.only_complete,
- NULL, "only use complete change", "only use complete extended content"
+ NULL, "replace all or nothing", "only replace when all can be changed"
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(12),
GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE,
&custom_element_change.use_random_change,
- NULL, NULL, "use random value for new content"
+ NULL, NULL, "use percentage for random replace"
},
{
ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13),
Request("Level has changed! Exit without saving ?",
REQ_ASK | REQ_STAY_OPEN))
{
+#if 1
CloseDoor(DOOR_CLOSE_1);
- /*
+ SetDoorState(DOOR_CLOSE_2);
+#else
CloseDoor(DOOR_CLOSE_ALL);
- */
+#endif
game_status = GAME_MODE_MAIN;
DrawMainMenu();
}
#define LEVEL_CHUNK_CNT3_UNUSED 10 /* unused CNT3 chunk bytes */
#define LEVEL_CPART_CUS3_SIZE 134 /* size of CUS3 chunk part */
#define LEVEL_CPART_CUS3_UNUSED 15 /* unused CUS3 bytes / part */
-#define LEVEL_CPART_CUS4_SIZE ??? /* size of CUS4 chunk part */
-#define LEVEL_CPART_CUS4_UNUSED ??? /* unused CUS4 bytes / part */
#define TAPE_HEADER_SIZE 20 /* size of tape file header */
#define TAPE_HEADER_UNUSED 3 /* unused tape header bytes */
change->delay_fixed = 0;
change->delay_random = 0;
- change->delay_frames = -1; /* later set to reliable default value */
+ change->delay_frames = 1;
change->trigger_element = EL_EMPTY_SPACE;
change->use_content = FALSE;
change->only_complete = FALSE;
change->use_random_change = FALSE;
- change->random = 0;
+ change->random = 100;
change->power = CP_NON_DESTRUCTIVE;
for(x=0; x<3; x++)
change->can_change = getFile8Bit(file);
+ change->sides = getFile8Bit(file);
+
+ if (change->sides == CH_SIDE_NONE) /* correct empty sides field */
+ change->sides = CH_SIDE_ANY;
+
/* some free bytes for future change property values and padding */
- ReadUnusedBytesFromFile(file, 9);
+ ReadUnusedBytesFromFile(file, 8);
}
/* mark this custom element as modified */
putFile8Bit(file, change->can_change);
+ putFile8Bit(file, change->sides);
+
/* some free bytes for future change property values and padding */
- WriteUnusedBytesToFile(file, 9);
+ WriteUnusedBytesToFile(file, 8);
}
}
MovDir[x][y] = old_move_dir;
}
}
+ else if (element_info[element].move_pattern == MV_WHEN_PUSHED)
+ {
+ if (!IN_LEV_FIELD_AND_IS_FREE(move_x, move_y))
+ MovDir[x][y] = MV_NO_MOVING;
+
+ MovDelay[x][y] = 0;
+ }
}
static boolean JustBeingPushed(int x, int y)
{
int newx, newy;
+#if 1
+ if (IS_PUSHABLE(element) && JustBeingPushed(x, y))
+ return;
+#else
if ((element == EL_SATELLITE ||
element == EL_BALLOON ||
element == EL_SPRING)
&& JustBeingPushed(x, y))
return;
+#endif
#if 0
#if 0
Impact(x, newy);
if (!IN_LEV_FIELD(nextx, nexty) || !IS_FREE(nextx, nexty))
- CheckElementChange(newx, newy, element, CE_COLLISION);
+ CheckElementSideChange(newx, newy, element, direction, CE_COLLISION, -1);
#if 1
TestIfElementTouchesCustomElement(x, y); /* for empty space */
{ +1, 0 },
{ 0, +1 }
};
+ static int change_sides[4][2] =
+ {
+ /* center side border side */
+ { CH_SIDE_TOP, CH_SIDE_BOTTOM }, /* check top */
+ { CH_SIDE_LEFT, CH_SIDE_RIGHT }, /* check left */
+ { CH_SIDE_RIGHT, CH_SIDE_LEFT }, /* check right */
+ { CH_SIDE_BOTTOM, CH_SIDE_TOP } /* check bottom */
+ };
int i;
#if 0
{
int xx = x + xy[i][0];
int yy = y + xy[i][1];
+ int center_side = change_sides[i][0];
+ int border_side = change_sides[i][1];
if (!IN_LEV_FIELD(xx, yy))
continue;
+#if 1
+ if (IS_PLAYER(x, y))
+ {
+ CheckTriggeredElementSideChange(xx, yy, Feld[xx][yy], border_side,
+ CE_OTHER_GETS_TOUCHED);
+ CheckElementSideChange(xx, yy, Feld[xx][yy], border_side,
+ CE_TOUCHED_BY_PLAYER, -1);
+ }
+ else if (IS_PLAYER(xx, yy))
+ {
+ CheckTriggeredElementSideChange(x, y, Feld[x][y], center_side,
+ CE_OTHER_GETS_TOUCHED);
+ CheckElementSideChange(x, y, Feld[x][y], center_side,
+ CE_TOUCHED_BY_PLAYER, -1);
+
+ break;
+ }
+#else
if (IS_PLAYER(x, y))
{
CheckTriggeredElementChange(xx, yy, Feld[xx][yy], CE_OTHER_GETS_TOUCHED);
break;
}
+#endif
}
#if 0
int DigField(struct PlayerInfo *player,
int x, int y, int real_dx, int real_dy, int mode)
{
-#if 0
- static int change_sides[4][2] =
+ static int change_sides[4] =
{
- /* enter side leave side */
- { CH_SIDE_RIGHT, CH_SIDE_LEFT }, /* moving left */
- { CH_SIDE_LEFT, CH_SIDE_RIGHT }, /* moving right */
- { CH_SIDE_BOTTOM, CH_SIDE_TOP }, /* moving up */
- { CH_SIDE_TOP, CH_SIDE_BOTTOM } /* moving down */
+ CH_SIDE_RIGHT, /* moving left */
+ CH_SIDE_LEFT, /* moving right */
+ CH_SIDE_BOTTOM, /* moving up */
+ CH_SIDE_TOP, /* moving down */
};
-#endif
boolean use_spring_bug = (game.engine_version < VERSION_IDENT(2,2,0));
int jx = player->jx, jy = player->jy;
int dx = x - jx, dy = y - jy;
dx == +1 ? MV_RIGHT :
dy == -1 ? MV_UP :
dy == +1 ? MV_DOWN : MV_NO_MOVING);
-#if 0
- int enter_side = change_sides[MV_DIR_BIT(move_direction)][0];
- int leave_side = change_sides[MV_DIR_BIT(move_direction)][1];
-#endif
+ int dig_side = change_sides[MV_DIR_BIT(move_direction)];
int element;
if (player->MovPos == 0)
!(element == EL_SPRING && use_spring_bug))
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)
+ return MF_NO_ACTION;
+#else
if (element == EL_SPRING && MovDir[x][y] != MV_NO_MOVING)
return MF_NO_ACTION;
-
+#endif
if (!player->Pushing &&
game.engine_version >= RELEASE_IDENT(2,2,0,7))
player->push_delay_value = GET_NEW_PUSH_DELAY(element);
if (game.engine_version < RELEASE_IDENT(2,2,0,7))
player->push_delay_value = GET_NEW_PUSH_DELAY(element);
+#if 1
+ CheckTriggeredElementSideChange(x, y, element, dig_side,
+ CE_OTHER_GETS_PUSHED);
+ CheckElementSideChange(x, y, element, dig_side,
+ CE_PUSHED_BY_PLAYER, -1);
+#else
CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_PUSHED);
CheckElementChange(x, y, element, CE_PUSHED_BY_PLAYER);
+#endif
break;
}
else
{
+#if 1
+ CheckTriggeredElementSideChange(x, y, element, dig_side,
+ 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;
if (Feld[x][y] != element) /* really digged/collected something */
player->is_collecting = !player->is_digging;
-#if 0
- if (IS_CUSTOM_ELEMENT(Feld[jx][jy]))
- {
- CheckTriggeredElementSideChange(jx, jy, Feld[jx][jy], leave_side,
- CE_OTHER_GETS_LEFT);
- CheckElementSideChange(jx, jy, Feld[jx][jy], leave_side,
- CE_LEFT_BY_PLAYER, -1);
- }
-
- if (IS_CUSTOM_ELEMENT(Feld[x][y]))
- {
- CheckTriggeredElementSideChange(x, y, Feld[x][y], enter_side,
- CE_OTHER_GETS_ENTERED);
- CheckElementSideChange(x, y, Feld[x][y], enter_side,
- CE_ENTERED_BY_PLAYER, -1);
- }
-#endif
-
return MF_MOVING;
}
(CH_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0)
/* values for change sides for custom elements */
+#define CH_SIDE_NONE MV_NO_MOVING
#define CH_SIDE_LEFT MV_LEFT
#define CH_SIDE_RIGHT MV_RIGHT
#define CH_SIDE_TOP MV_UP
#define MV_BIT_ALONG_RIGHT_SIDE 7
#define MV_BIT_TURNING_LEFT 8
#define MV_BIT_TURNING_RIGHT 9
+#define MV_BIT_WHEN_PUSHED 10
/* values for special move patterns for custom elements */
#define MV_HORIZONTAL (MV_LEFT | MV_RIGHT)
#define MV_ALONG_RIGHT_SIDE (1 << MV_BIT_ALONG_RIGHT_SIDE)
#define MV_TURNING_LEFT (1 << MV_BIT_TURNING_LEFT)
#define MV_TURNING_RIGHT (1 << MV_BIT_TURNING_RIGHT)
+#define MV_WHEN_PUSHED (1 << MV_BIT_WHEN_PUSHED)
/* values for slippery property for custom elements */
#define SLIPPERY_ANY_RANDOM 0
{
game_status = GAME_MODE_EDITOR;
DrawLevelEd();
+
return;
}
dst_x, dst_y);
}
+#if 1
+
+void AnimateEnvelope(int envelope_nr)
+{
+}
+
+void ShowEnvelope(int envelope_nr)
+{
+ int element = EL_ENVELOPE_1 + envelope_nr;
+ int graphic = IMG_GAME_ENVELOPE_1_BACKGROUND + envelope_nr;
+ int sound_opening = element_info[element].sound[ACTION_OPENING];
+ int sound_closing = element_info[element].sound[ACTION_CLOSING];
+ boolean draw_masked = graphic_info[graphic].draw_masked;
+ int anim_mode = graphic_info[graphic].anim_mode;
+ int mask_mode = (draw_masked ? BLIT_MASKED : BLIT_ON_BACKGROUND);
+ int font_nr = FONT_TEXT_1 + envelope_nr;
+ int font_width = getFontWidth(font_nr);
+ int font_height = getFontHeight(font_nr);
+ boolean ffwd_delay = (tape.playing && tape.fast_forward);
+ unsigned long anim_delay = 0;
+ int anim_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
+ int wait_delay_value = (ffwd_delay ? 500 : 1000);
+ int start_pos_vertically = 0;
+ int i, x, y;
+
+ game.envelope_active = TRUE;
+
+ if (anim_mode != ANIM_NONE)
+ PlaySoundStereo(sound_opening, SOUND_MIDDLE);
+
+ if (anim_mode == ANIM_DEFAULT)
+ {
+ /* open envelope window horizontally */
+ for (i = 0; i <= level.envelope_xsize[envelope_nr]; i++)
+ {
+ int xsize = i + 2;
+ int ysize = 2;
+ int startx = (SXSIZE - xsize * font_width) / 2;
+ int starty = (SYSIZE - ysize * font_height) / 2;
+
+ SetDrawtoField(DRAW_BUFFERED);
+
+ BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
+
+ SetDrawtoField(DRAW_BACKBUFFER);
+
+ for (y=0; y < ysize; y++) for (x=0; x < xsize; x++)
+ DrawEnvelopeBackground(envelope_nr, startx, starty, x, y, xsize, ysize,
+ font_nr);
+
+ redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+ BackToFront();
+
+ WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
+ }
+ }
+
+ if (anim_mode == ANIM_NONE)
+ start_pos_vertically = level.envelope_ysize[envelope_nr];
+
+ /* open envelope window vertically */
+ for (i = start_pos_vertically; i <= level.envelope_ysize[envelope_nr]; i++)
+ {
+ int xsize = level.envelope_xsize[envelope_nr] + 2;
+ int ysize = i + 2;
+ int startx = (SXSIZE - xsize * font_width) / 2;
+ int starty = (SYSIZE - ysize * font_height) / 2;
+
+ SetDrawtoField(DRAW_BUFFERED);
+
+ BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
+
+ SetDrawtoField(DRAW_BACKBUFFER);
+
+ for (y=0; y < ysize; y++) for (x=0; x < xsize; x++)
+ DrawEnvelopeBackground(envelope_nr, startx, starty, x, y, xsize, ysize,
+ font_nr);
+
+ DrawTextToTextArea(SX + startx + font_width, SY + starty + font_height,
+ level.envelope_text[envelope_nr], font_nr,
+ level.envelope_xsize[envelope_nr], i, mask_mode);
+
+ redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+ BackToFront();
+
+ WaitUntilDelayReached(&anim_delay, anim_delay_value);
+ }
+
+ if (tape.playing)
+ Delay(wait_delay_value);
+ else
+ WaitForEventToContinue();
+
+ if (anim_mode != ANIM_NONE)
+ PlaySoundStereo(sound_closing, SOUND_MIDDLE);
+
+ if (anim_mode != ANIM_NONE)
+ {
+ /* close envelope window vertically */
+ for (i = level.envelope_ysize[envelope_nr]; i >= 0; i--)
+ {
+ int xsize = level.envelope_xsize[envelope_nr] + 2;
+ int ysize = i + 2;
+ int startx = (SXSIZE - xsize * font_width) / 2;
+ int starty = (SYSIZE - ysize * font_height) / 2;
+
+ SetDrawtoField(DRAW_BUFFERED);
+
+ BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
+
+ SetDrawtoField(DRAW_BACKBUFFER);
+
+ for (y=0; y < ysize; y++) for (x=0; x < xsize; x++)
+ DrawEnvelopeBackground(envelope_nr, startx, starty, x, y, xsize, ysize,
+ font_nr);
+
+ DrawTextToTextArea(SX + startx + font_width, SY + starty + font_height,
+ level.envelope_text[envelope_nr], font_nr,
+ level.envelope_xsize[envelope_nr], i, mask_mode);
+
+ redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+ BackToFront();
+
+ WaitUntilDelayReached(&anim_delay, anim_delay_value);
+ }
+ }
+
+ if (anim_mode == ANIM_DEFAULT)
+ {
+ /* close envelope window horizontally */
+ for (i = level.envelope_xsize[envelope_nr]; i >= 0; i--)
+ {
+ int xsize = i + 2;
+ int ysize = 2;
+ int startx = (SXSIZE - xsize * font_width) / 2;
+ int starty = (SYSIZE - ysize * font_height) / 2;
+
+ SetDrawtoField(DRAW_BUFFERED);
+
+ BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
+
+ SetDrawtoField(DRAW_BACKBUFFER);
+
+ for (y=0; y < ysize; y++) for (x=0; x < xsize; x++)
+ DrawEnvelopeBackground(envelope_nr, startx, starty, x, y, xsize, ysize,
+ font_nr);
+
+ redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+ BackToFront();
+
+ WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
+ }
+ }
+
+ game.envelope_active = FALSE;
+
+ SetDrawtoField(DRAW_BUFFERED);
+
+ redraw_mask |= REDRAW_FIELD;
+ BackToFront();
+}
+
+#else
+
void ShowEnvelope(int envelope_nr)
{
int element = EL_ENVELOPE_1 + envelope_nr;
BackToFront();
}
+#endif
+
void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y)
{
Bitmap *src_bitmap = graphic_info[graphic].bitmap;
static int door1 = DOOR_OPEN_1;
static int door2 = DOOR_CLOSE_2;
unsigned long door_delay = 0;
- unsigned long door_delay_value = door_1.step_delay;
+ unsigned long door_delay_value;
int stepsize = 1;
if (door_state == DOOR_GET_STATE)
else if (door2 == DOOR_CLOSE_2 && door_state & DOOR_CLOSE_2)
door_state &= ~DOOR_CLOSE_2;
+ door_delay_value = (door_state & DOOR_ACTION_1 ? door_1.step_delay :
+ door_2.step_delay);
+
if (setup.quick_doors)
{
stepsize = 20; /* must be choosen to always draw last frame */