rnd-20100521-1-src
authorHolger Schemel <info@artsoft.org>
Thu, 20 May 2010 22:58:25 +0000 (00:58 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:59:12 +0000 (10:59 +0200)
16 files changed:
src/conftime.h
src/editor.c
src/engines.h
src/files.c
src/game_em/graphics.c
src/game_em/input.c
src/game_sp/main.c
src/libgame/gadgets.c
src/libgame/misc.c
src/libgame/text.c
src/libgame/text.h
src/main.c
src/main.h
src/screens.c
src/tools.c
src/tools.h

index 2dbe9d4166fafa26617e62528e202c0de67ee7f2..64f6d5a32c813d6f8e531a883c26e38d6e124b0e 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2010-04-22 01:39"
+#define COMPILE_DATE_STRING "2010-05-21 00:52"
index 7f1ec19f128fd20935d2fce1332786339313a9c9..5752d7420e34397251e9c344aea87e536efd70a8 100644 (file)
@@ -8173,7 +8173,7 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line)
   int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1;
 
   return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
-                     max_lines_per_screen, -1, TRUE, FALSE, FALSE);
+                     max_lines_per_screen, 0, -1, TRUE, FALSE, FALSE);
 }
 
 static void DrawPropertiesInfo()
index 42d64b549aba8f94501f4f2db58aa8e682e62776..8bd49cb837457269404701adf9571abc721f13b8 100644 (file)
@@ -34,6 +34,7 @@ extern int getGameFrameDelay_EM(int);
 
 extern void PlayLevelSound_EM(int, int, int, int);
 extern void InitGraphicInfo_EM(void);
+extern void CheckSingleStepMode_EM(byte action[], int, boolean);
 
 void SetGfxAnimation_EM(struct GraphicInfo_EM *, int, int, int, int);
 void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *, int, int, int, int);
@@ -48,6 +49,8 @@ void getGraphicSourcePlayerExt_EM(struct GraphicInfo_EM *, int, int, int);
 extern void SetBitmaps_SP(Bitmap **);
 #endif
 
+void CheckSingleStepMode_SP(boolean);
+
 void getGraphicSource_SP(struct GraphicInfo_SP *, int, int, int, int);
 int getGraphicInfo_Delay(int);
 boolean isNextAnimationFrame_SP(int, int);
index 52589dff17be7b69ca0a540e9c0070cf52788866..d7ba3c9348264318b0fb9ff08e7e9a4f3e05e141 100644 (file)
@@ -10334,6 +10334,10 @@ void LoadMusicInfo()
     if (!music_info_listed(music_file_info, music->filename))
     {
       *new = get_music_file_info(music->filename, i);
+#if 0
+      if (*new != NULL)
+       printf(":1: adding '%s' ['%s'] ...\n", (*new)->title, music->filename);
+#endif
       if (*new != NULL)
        new = &(*new)->next;
     }
@@ -10379,6 +10383,10 @@ void LoadMusicInfo()
     if (!music_info_listed(music_file_info, basename))
     {
       *new = get_music_file_info(basename, MAP_NOCONF_MUSIC(num_music_noconf));
+#if 0
+      if (*new != NULL)
+       printf(":2: adding '%s' ['%s'] ...\n", (*new)->title, basename);
+#endif
       if (*new != NULL)
        new = &(*new)->next;
     }
index d7640e77ca9fb7ff00856825a84638a35465b551..5764e9e3390ba056584cc75fb41f0c4301c6e27d 100644 (file)
@@ -130,8 +130,23 @@ void BackToFront_EM(void)
   else
   {
 #if 1
-    boolean half_shifted_x = (EVEN(SCR_FIELDX) && screen_x % TILEX);
-    boolean half_shifted_y = (EVEN(SCR_FIELDY) && screen_y % TILEY);
+#if 1
+    boolean half_shifted_x = (screen_x % TILEX != 0);
+    boolean half_shifted_y = (screen_y % TILEY != 0);
+#else
+    boolean half_shifted_x = (EVEN(SCR_FIELDX) && screen_x % TILEX != 0);
+    boolean half_shifted_y = (EVEN(SCR_FIELDY) && screen_y % TILEY != 0);
+#endif
+
+#if 0
+#if 1
+    printf("::: %d, %d\n", EVEN(SCR_FIELDX), screen_x);
+#else
+    half_shifted_x = TRUE;
+    half_shifted_y = FALSE;
+#endif
+#endif
+
     int x1 = 0, x2 = SCR_FIELDX - (half_shifted_x ? 0 : 1);
     int y1 = 0, y2 = SCR_FIELDY - (half_shifted_y ? 0 : 1);
     int scroll_xoffset = (half_shifted_x ? TILEX / 2 : 0);
@@ -254,7 +269,11 @@ static void DrawLevelField_EM(int x, int y, int sx, int sy,
 static void DrawLevelFieldCrumbled_EM(int x, int y, int sx, int sy,
                                      int crm, boolean draw_masked)
 {
+#if 1
+  struct GraphicInfo_EM *g;
+#else
   struct GraphicInfo_EM *g = getObjectGraphic(x, y);
+#endif
   int left = screen_x / TILEX;
   int top  = screen_y / TILEY;
   int i;
@@ -267,6 +286,10 @@ static void DrawLevelFieldCrumbled_EM(int x, int y, int sx, int sy,
   if (crm == 0)                /* no crumbled edges for this tile */
     return;
 
+#if 1
+  g = getObjectGraphic(x, y);
+#endif
+
 #if 0
   if (x == 3 && y == 3 && frame == 0)
     printf("::: %d, %d\n",
index cc703ba96cb4ab622f7bec3c2e7f7e5a1dd1b5f1..7447f4b1901d4ba642bc4841898c1eb3e3865dfa 100644 (file)
@@ -91,6 +91,7 @@ void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode)
     printf("::: %05d: %lu, %d\n", FrameCounter, RandomEM, frame);
 #endif
 
+#if 0
   game_animscreen();
 
 #if 1
@@ -99,6 +100,7 @@ void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode)
 #endif
 
   blitscreen();
+#endif
 #endif
 
   RandomEM = RandomEM * 129 + 1;
@@ -124,6 +126,20 @@ void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode)
     if (!warp_mode)            /* do not redraw values in warp mode */
       DrawGameDoorValues_EM();
   }
+
+  CheckSingleStepMode_EM(action, frame, game_em.any_player_moving);
+
+#if 1
+  game_animscreen();
+
+#if 1
+#if 0
+  SyncDisplay();
+#endif
+
+  blitscreen();
+#endif
+#endif
 }
 
 /* read input device for players */
index 4da92cd3286972936cdb5a7d8034a621c4f269c6..1308353d0ba96f29ea7713681d4861f2fc299ab7 100644 (file)
@@ -86,6 +86,8 @@ void GameActions_SP(byte action[MAX_PLAYERS], boolean warp_mode)
   if (!warp_mode)              /* do not redraw values in warp mode */
     DrawGameDoorValues_SP();
 
+  CheckSingleStepMode_SP(PlayField16[MurphyPosIndex] != fiMurphy);
+
   for (x = DisplayMinX; x <= DisplayMaxX; x++)
     for (y = DisplayMinY; y <= DisplayMaxY; y++)
       GfxFrame[x][y]++;
index 3d593a9b1f12ba6ee05346c898bcb6775ddf29ee..4ac2a294202b249eb88fc6831dc7b0c623fd6d6b 100644 (file)
@@ -383,7 +383,7 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct)
        /* gadget text value */
 #if 1
        DrawTextBuffer(gi->x + border_x, gi->y + border_y, gi->textarea.value,
-                      font_nr, gi->textarea.xsize, -1, gi->textarea.ysize,
+                      font_nr, gi->textarea.xsize, 0, -1, gi->textarea.ysize,
                       BLIT_ON_BACKGROUND, FALSE, FALSE, FALSE);
 #else
        DrawTextToTextArea(gi->x + border_x, gi->y + border_y,
index d21815b29b48db5dc91e27de15558b5f50984880..b8f2fe5c4d502d6e3896dedc7103613be5fcb52c 100644 (file)
@@ -1873,7 +1873,7 @@ boolean FileIsMusic(char *filename)
     return TRUE;
 
 #if defined(TARGET_SDL)
-  if (fileHasPrefix(basename, "mod") ||
+  if ((fileHasPrefix(basename, "mod") && !fileHasSuffix(basename, "txt")) ||
       fileHasSuffix(basename, "mod") ||
       fileHasSuffix(basename, "s3m") ||
       fileHasSuffix(basename, "it") ||
index f0cdb01adaecedd75fb3325b440ba40dd840b1dd..23de7cac548849a90e4c395a35391e9b0b1fb640 100644 (file)
@@ -188,6 +188,22 @@ void getFontCharSource(int font_nr, char c, Bitmap **bitmap, int *x, int *y)
 }
 
 
+/* ========================================================================= */
+/* text string helper functions                                              */
+/* ========================================================================= */
+
+int maxWordLengthInString(char *text)
+{
+  char *text_ptr;
+  int max_word_len = 0;
+
+  for (text_ptr = text; *text_ptr; text_ptr++)
+    max_word_len = (*text_ptr != ' ' ? max_word_len + 1 : 0);
+
+  return max_word_len;
+}
+
+
 /* ========================================================================= */
 /* simple text drawing functions                                             */
 /* ========================================================================= */
@@ -728,7 +744,8 @@ static boolean getCheckedTokenValueFromString(char *string, char **token,
 }
 
 static void DrawTextBuffer_Flush(int x, int y, char *buffer, int font_nr,
-                                int line_length, int cut_length, int mask_mode,
+                                int line_length, int cut_length,
+                                int line_spacing, int mask_mode,
                                 boolean centered, int current_line)
 {
   int buffer_len = strlen(buffer);
@@ -739,7 +756,7 @@ static void DrawTextBuffer_Flush(int x, int y, char *buffer, int font_nr,
     (centered ? font_width * (line_length - buffer_len) / 2 : 0);
   int final_cut_length = MAX(0, cut_length - offset_chars);
   int xx = x + offset_xsize;
-  int yy = y + current_line * font_height;
+  int yy = y + current_line * (font_height + line_spacing);
 
   buffer[final_cut_length] = '\0';
 
@@ -751,8 +768,8 @@ static void DrawTextBuffer_Flush(int x, int y, char *buffer, int font_nr,
 
 int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
                   int line_length, int cut_length, int max_lines,
-                  int mask_mode, boolean autowrap, boolean centered,
-                  boolean parse_comments)
+                  int line_spacing, int mask_mode, boolean autowrap,
+                  boolean centered, boolean parse_comments)
 {
 #if 0
   int font_width = getFontWidth(font_nr);
@@ -808,7 +825,7 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
        if (buffer_len > 0 && current_line < max_lines)
        {
          DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length,
-                              mask_mode, centered, current_line);
+                              line_spacing, mask_mode, centered, current_line);
 
          current_line++;
 
@@ -876,7 +893,7 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
       {
 #if 1
        DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length,
-                            mask_mode, centered, current_line);
+                            line_spacing, mask_mode, centered, current_line);
 #else
        int offset_chars = (centered ? (line_length - buffer_len) / 2 : 0);
        int offset_xsize =
@@ -907,7 +924,7 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
   {
 #if 1
     DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length,
-                        mask_mode, centered, current_line);
+                        line_spacing, mask_mode, centered, current_line);
 #else
     int offset_chars = (centered ? (line_length - buffer_len) / 2 : 0);
        int offset_xsize =
@@ -932,14 +949,14 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
 
 int DrawTextFile(int x, int y, char *filename, int font_nr,
                 int line_length, int cut_length, int max_lines,
-                int mask_mode, boolean autowrap, boolean centered,
-                boolean parse_comments)
+                int line_spacing, int mask_mode, boolean autowrap,
+                boolean centered, boolean parse_comments)
 {
   char *text_buffer = GetTextBufferFromFile(filename, MAX_LINES_FROM_FILE);
   int num_lines_printed = DrawTextBuffer(x, y, text_buffer, font_nr,
                                         line_length, cut_length, max_lines,
-                                        mask_mode, autowrap, centered,
-                                        parse_comments);
+                                        line_spacing, mask_mode, autowrap,
+                                        centered, parse_comments);
   checked_free(text_buffer);
 
   return num_lines_printed;
index 146648a311febdce38fcad7249dc607ce96c74ce..1d54a716d22d64b47eae590f88b9ed39a35cafea 100644 (file)
@@ -73,6 +73,8 @@ int getTextWidth(char *, int);
 
 void getFontCharSource(int, char, Bitmap **, int *, int *);
 
+int maxWordLengthInString(char *);
+
 void DrawInitText(char *, int, int);
 void DrawInitTextIfNeeded(char *, int, int);
 void DrawInitTextExt(char *, int, int, boolean);
@@ -87,9 +89,9 @@ void DrawText(int, int, char *, int);
 void DrawTextExt(DrawBuffer *, int, int, char *, int, int);
 
 char *GetTextBufferFromFile(char *, int);
-int DrawTextBuffer(int, int, char *, int, int, int, int, int, boolean, boolean,
-                  boolean);
-int DrawTextFile(int, int, char *, int, int, int, int, int, boolean, boolean,
-                boolean);
+int DrawTextBuffer(int, int, char *, int, int, int, int, int, int,
+                  boolean, boolean, boolean);
+int DrawTextFile(int, int, char *, int, int, int, int, int, int,
+                boolean, boolean, boolean);
 
 #endif /* TEXT_H */
index 63d70d6ecb8ca04a389fb04f049e71f4e9b15168..d5dbe91c9d35f12f3f20d6b745c11bf60785d86c 100644 (file)
@@ -96,6 +96,7 @@ int                   REAL_SX = 6, REAL_SY = 6;
 int                    DX = 566, DY = 60;
 int                    VX = 566, VY = 400;
 int                    EX = 566, EY = 356;
+int                    dDX, dDY;
 
 #if 1
 int                    FX, FY;
index c237aa33a4de4b1c03acc7b7a197cfc4680b7844..97f991156ee959e99e2b6fdaed8e72c8597b32f3 100644 (file)
@@ -2869,6 +2869,7 @@ extern int                        REAL_SX, REAL_SY;
 extern int                     DX, DY;
 extern int                     VX, VY;
 extern int                     EX, EY;
+extern int                     dDX, dDY;
 
 extern int                     FX, FY;
 extern int                     ScrollStepSize;
index 4bee7dc22bca3cb6539f5a72229ea59c1b546c84..493e9984018ac836575dd459ebe1346de072a4d8 100644 (file)
@@ -1190,7 +1190,7 @@ void DrawTitleScreenMessage(int nr, boolean initial)
   ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
 
   DrawTextFile(ALIGNED_TEXT_XPOS(tmi), ALIGNED_TEXT_YPOS(tmi),
-              filename, tmi->font, tmi->chars, -1, tmi->lines, -1,
+              filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1,
               tmi->autowrap, tmi->centered, tmi->parse_comments);
 
   game_status = last_game_status;      /* restore current game status */
@@ -2256,7 +2256,7 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
     sy += getFontHeight(font_nr) / 2;
 
   DrawTextBuffer(sx, sy + ypos * ystep, text, font_nr,
-                max_chars_per_line, -1, max_lines_per_text, -1,
+                max_chars_per_line, -1, max_lines_per_text, 0, -1,
                 TRUE, FALSE, FALSE);
 }
 
@@ -3060,7 +3060,7 @@ void DrawInfoScreen_LevelSet()
 
   if (filename != NULL)
     DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi),
-                filename, tmi->font, tmi->chars, -1, tmi->lines, -1,
+                filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1,
                 tmi->autowrap, tmi->centered, tmi->parse_comments);
   else
     DrawTextCentered(mSY + ALIGNED_TEXT_YPOS(tmi), FONT_TEXT_2,
index 978884624e51baaf48c9a77a823f96e8982bff0a..0875bf5d6bad99c94e5a245f7dd09b235f383f33 100644 (file)
@@ -2099,7 +2099,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
 #if 1
     DrawTextBuffer(SX + sx + font_width, SY + sy + font_height,
                   level.envelope[envelope_nr].text, font_nr, max_xsize,
-                  xsize - 2, ysize - 2, mask_mode,
+                  xsize - 2, ysize - 2, 0, mask_mode,
                   level.envelope[envelope_nr].autowrap,
                   level.envelope[envelope_nr].centered, FALSE);
 #else
@@ -2128,12 +2128,24 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action)
   unsigned long anim_delay = 0;
   int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
   int anim_delay_value = (no_delay ? 0 : frame_delay_value);
+#if 1
+  int max_word_len = maxWordLengthInString(text);
+  int font_nr = (max_word_len > 7 ? FONT_TEXT_1 : FONT_TEXT_2);
+#else
   int font_nr = FONT_ENVELOPE_1 + envelope_nr;
+#endif
   int font_width = getFontWidth(font_nr);
   int font_height = getFontHeight(font_nr);
 #if 1
+
+#if 1
+  int max_xsize = DXSIZE / font_width;
+  int max_ysize = DYSIZE / font_height;
+#else
   int max_xsize = 7;   /* tools.c: MAX_REQUEST_LINE_FONT1_LEN == 7 */
   int max_ysize = 13;  /* tools.c: MAX_REQUEST_LINES == 13 */
+#endif
+
 #else
   int max_xsize = level.envelope[envelope_nr].xsize;
   int max_ysize = level.envelope[envelope_nr].ysize;
@@ -2147,6 +2159,18 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action)
   int x, y;
 
 #if 1
+  char *text_ptr;
+  char *text_copy = getStringCopy(text);
+#else
+#if 1
+  font_nr = FONT_TEXT_2;
+
+  if (maxWordLengthInString(text) > 7) /* MAX_REQUEST_LINE_FONT1_LEN == 7 */
+  {
+    max_xsize = 10;    /* tools.c: MAX_REQUEST_LINE_FONT2_LEN == 10 */
+    font_nr = FONT_TEXT_1;
+  }
+#else
   int max_word_len = 0;
   char *text_ptr;
   char *text_copy = getStringCopy(text);
@@ -2165,12 +2189,23 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action)
       break;
     }
   }
+#endif
+#endif
 
+#if 1
   for (text_ptr = text_copy; *text_ptr; text_ptr++)
     if (*text_ptr == ' ')
       *text_ptr = '\n';
 #endif
 
+#if 1
+  dDX = SX + (SXSIZE - DXSIZE) / 2 - DX;
+  dDY = SY + (SYSIZE - DYSIZE) / 2 - DY;
+#else
+  dDX = SX + SXSIZE / 2 - max_xsize * font_width  / 2 - DX;
+  dDY = SY + SYSIZE / 2 - max_ysize * font_height / 2 - DY;
+#endif
+
   for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep)
   {
     int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
@@ -2195,14 +2230,14 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action)
 #if 1
 
 #if 1
-    DrawTextBuffer(SX + sx + font_width, SY + sy + font_height,
+    DrawTextBuffer(SX + sx + font_width, SY + sy + font_height + 8,
                   text_copy, font_nr, max_xsize,
-                  xsize - 2, ysize - 2, mask_mode,
+                  xsize - 2, ysize - 2, 2, mask_mode,
                   FALSE, TRUE, FALSE);
 #else
     DrawTextBuffer(SX + sx + font_width, SY + sy + font_height,
                   level.envelope[envelope_nr].text, font_nr, max_xsize,
-                  xsize - 2, ysize - 2, mask_mode,
+                  xsize - 2, ysize - 2, 0, mask_mode,
                   level.envelope[envelope_nr].autowrap,
                   level.envelope[envelope_nr].centered, FALSE);
 #endif
@@ -2213,8 +2248,30 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action)
                       xsize - 2, ysize - 2, mask_mode);
 #endif
 
+    /* copy request gadgets to door backbuffer */
+#if 1
+    if ((ysize - 2) > 13)
+      BlitBitmap(bitmap_db_door, drawto,
+                DOOR_GFX_PAGEX1 + (DXSIZE - (xsize - 2) * font_width) / 2,
+                DOOR_GFX_PAGEY1 + 13 * font_height,
+                (xsize - 2) * font_width,
+                (ysize - 2 - 13) * font_height,
+                SX + sx + font_width,
+                SY + sy + font_height * (1 + 13));
+#else
+    if ((ysize - 2) > 13)
+      BlitBitmap(bitmap_db_door, drawto,
+                DOOR_GFX_PAGEX1 + (DXSIZE - (xsize - 2) * font_width) / 2,
+                DOOR_GFX_PAGEY1 + 13 * font_height,
+                (xsize - 2) * font_width,
+                (ysize - 2 - 13) * font_height,
+                SX + sx + font_width,
+                SY + sy + font_height * (1 + 13));
+#endif
+
 #if 1
-    redraw_mask |= REDRAW_ALL | REDRAW_FROM_BACKBUFFER;
+    redraw_mask = REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+    // redraw_mask |= REDRAW_ALL | REDRAW_FROM_BACKBUFFER;
 #else
     redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
 #endif
@@ -2229,7 +2286,9 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action)
     WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
   }
 
+#if 1
   free(text_copy);
+#endif
 }
 
 void ShowEnvelope(int envelope_nr)
@@ -2276,20 +2335,23 @@ void ShowEnvelope(int envelope_nr)
   BackToFront();
 }
 
-void ShowEnvelopeDoor(char *text)
+void ShowEnvelopeDoor(char *text, int action)
 {
 #if 1
   int last_game_status = game_status;  /* save current game status */
+  // int last_draw_background_mask = gfx.draw_background_mask;
   int envelope_nr = 0;
 #endif
   int element = EL_ENVELOPE_1 + envelope_nr;
   int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr;
   int sound_opening = element_info[element].sound[ACTION_OPENING];
   int sound_closing = element_info[element].sound[ACTION_CLOSING];
+#if 0
   boolean ffwd_delay = (tape.playing && tape.fast_forward);
   boolean no_delay = (tape.warp_forward);
   int normal_delay_value = ONE_SECOND_DELAY / (ffwd_delay ? 2 : 1);
   int wait_delay_value = (no_delay ? 0 : normal_delay_value);
+#endif
   int anim_mode = graphic_info[graphic].anim_mode;
   int main_anim_mode = (anim_mode == ANIM_NONE ? ANIM_VERTICAL|ANIM_HORIZONTAL:
                        anim_mode == ANIM_DEFAULT ? ANIM_VERTICAL : anim_mode);
@@ -2309,10 +2371,15 @@ void ShowEnvelopeDoor(char *text)
 
   SetDrawtoField(DRAW_BACKBUFFER);
 
-  BlitBitmap(backbuffer, bitmap_db_store, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+  // SetDrawBackgroundMask(REDRAW_NONE);
 
-  if (game_status != GAME_MODE_MAIN)
-    InitAnimation();
+  if (action == ACTION_OPENING)
+  {
+    BlitBitmap(backbuffer, bitmap_db_store, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+
+    if (game_status != GAME_MODE_MAIN)
+      InitAnimation();
+  }
 
   /* force DOOR font inside door area */
   game_status = GAME_MODE_PSEUDO_DOOR;
@@ -2320,41 +2387,54 @@ void ShowEnvelopeDoor(char *text)
 
   game.envelope_active = TRUE; /* needed for RedrawPlayfield() events */
 
-  PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE);
+  if (action == ACTION_OPENING)
+  {
+    PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE);
 
-  if (anim_mode == ANIM_DEFAULT)
-    AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_OPENING);
+    if (anim_mode == ANIM_DEFAULT)
+      AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_OPENING);
 
-  AnimateEnvelopeDoor(text, main_anim_mode, ACTION_OPENING);
+    AnimateEnvelopeDoor(text, main_anim_mode, ACTION_OPENING);
 
-  if (tape.playing)
-    Delay(wait_delay_value);
+#if 0
+    if (tape.playing)
+      Delay(wait_delay_value);
+    else
+      WaitForEventToContinue();
+#endif
+  }
   else
-    WaitForEventToContinue();
-
-  PlayMenuSoundStereo(sound_closing, SOUND_MIDDLE);
+  {
+    PlayMenuSoundStereo(sound_closing, SOUND_MIDDLE);
 
-  if (anim_mode != ANIM_NONE)
-    AnimateEnvelopeDoor(text, main_anim_mode, ACTION_CLOSING);
+    if (anim_mode != ANIM_NONE)
+      AnimateEnvelopeDoor(text, main_anim_mode, ACTION_CLOSING);
 
-  if (anim_mode == ANIM_DEFAULT)
-    AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_CLOSING);
+    if (anim_mode == ANIM_DEFAULT)
+      AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_CLOSING);
+  }
 
   game.envelope_active = FALSE;
 
 #if 1
   game_status = last_game_status;      /* restore current game status */
 
-  if (game_status != GAME_MODE_MAIN)
-    StopAnimation();
+  if (action == ACTION_CLOSING)
+  {
+    if (game_status != GAME_MODE_MAIN)
+      StopAnimation();
 
-  BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+    BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+  }
 #else
   SetDrawtoField(DRAW_BUFFERED);
 #endif
 
+  // SetDrawBackgroundMask(last_draw_background_mask);
+
 #if 1
-  redraw_mask |= REDRAW_ALL;
+  redraw_mask = REDRAW_FIELD;
+  // redraw_mask |= REDRAW_ALL;
 #else
   redraw_mask |= REDRAW_FIELD;
 #endif
@@ -3298,13 +3378,20 @@ boolean Request(char *text, unsigned int req_state)
   int last_game_status = game_status;  /* save current game status */
   int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN;
   int font_nr = FONT_TEXT_2;
+  boolean use_envelope_request = TRUE  * 0;
+#if 0
   int max_word_len = 0;
+#endif
   char *text_ptr;
+  int i;
 
 #if 1
-  ShowEnvelopeDoor(text);
-#endif
-
+  if (maxWordLengthInString(text) > MAX_REQUEST_LINE_FONT1_LEN)
+  {
+    max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN;
+    font_nr = FONT_TEXT_1;
+  }
+#else
   for (text_ptr = text; *text_ptr; text_ptr++)
   {
     max_word_len = (*text_ptr != ' ' ? max_word_len + 1 : 0);
@@ -3321,6 +3408,7 @@ boolean Request(char *text, unsigned int req_state)
       break;
     }
   }
+#endif
 
   if (game_status == GAME_MODE_PLAYING)
   {
@@ -3352,7 +3440,11 @@ boolean Request(char *text, unsigned int req_state)
 
   UnmapAllGadgets();
 
+#if 1
+  if (old_door_state & DOOR_OPEN_1 && !use_envelope_request)
+#else
   if (old_door_state & DOOR_OPEN_1)
+#endif
   {
     CloseDoor(DOOR_CLOSE_1);
 
@@ -3375,40 +3467,49 @@ boolean Request(char *text, unsigned int req_state)
   game_status = GAME_MODE_PSEUDO_DOOR;
 
   /* write text for request */
-  for (ty = 0; ty < MAX_REQUEST_LINES; ty++)
+  for (text_ptr = text, ty = 0; ty < MAX_REQUEST_LINES; ty++)
   {
     char text_line[max_request_line_len + 1];
     int tx, tl, tc = 0;
 
-    if (!*text)
+    if (!*text_ptr)
       break;
 
     for (tl = 0, tx = 0; tx < max_request_line_len; tl++, tx++)
     {
-      tc = *(text + tx);
+      tc = *(text_ptr + tx);
       if (!tc || tc == ' ')
        break;
     }
 
     if (!tl)
     { 
-      text++; 
+      text_ptr++; 
       ty--; 
       continue; 
     }
 
-    strncpy(text_line, text, tl);
+    strncpy(text_line, text_ptr, tl);
     text_line[tl] = 0;
 
     DrawText(DX + (DXSIZE - tl * getFontWidth(font_nr)) / 2,
             DY + 8 + ty * (getFontHeight(font_nr) + 2),
             text_line, font_nr);
 
-    text += tl + (tc == ' ' ? 1 : 0);
+    text_ptr += tl + (tc == ' ' ? 1 : 0);
   }
 
   game_status = last_game_status;      /* restore current game status */
 
+#if 1
+  if (use_envelope_request)
+  {
+    /* !!! TMP !!! */
+    FreeToolButtons();
+    CreateToolButtons();
+  }
+#endif
+
   if (req_state & REQ_ASK)
   {
     MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
@@ -3431,7 +3532,36 @@ boolean Request(char *text, unsigned int req_state)
             DX, DY, DXSIZE, DYSIZE,
             DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
+#if 1
+  if (use_envelope_request)
+  {
+    ShowEnvelopeDoor(text, ACTION_OPENING);
+
+    for (i = 0; i < NUM_TOOL_BUTTONS; i++)
+    {
+      if ((req_state & REQ_ASK && (i == TOOL_CTRL_ID_YES ||
+                                  i == TOOL_CTRL_ID_NO)) ||
+         (req_state & REQ_CONFIRM && i == TOOL_CTRL_ID_CONFIRM) ||
+         (req_state & REQ_PLAYER && (i == TOOL_CTRL_ID_PLAYER_1 &&
+                                     i == TOOL_CTRL_ID_PLAYER_2 &&
+                                     i == TOOL_CTRL_ID_PLAYER_3 &&
+                                     i == TOOL_CTRL_ID_PLAYER_4)))
+      {
+       int x = tool_gadget[i]->x + dDX;
+       int y = tool_gadget[i]->y + dDY;
+
+       ModifyGadget(tool_gadget[i], GDI_X, x, GDI_Y, y, GDI_END);
+      }
+    }
+  }
+#endif
+
+#if 1
+  if (!use_envelope_request)
+    OpenDoor(DOOR_OPEN_1);
+#else
   OpenDoor(DOOR_OPEN_1);
+#endif
 
   if (!(req_state & REQUEST_WAIT_FOR_INPUT))
   {
@@ -3448,8 +3578,13 @@ boolean Request(char *text, unsigned int req_state)
     return FALSE;
   }
 
+#if 1
+  if (game_status != GAME_MODE_MAIN && !use_envelope_request)
+    InitAnimation();
+#else
   if (game_status != GAME_MODE_MAIN)
     InitAnimation();
+#endif
 
   button_status = MB_RELEASED;
 
@@ -3608,7 +3743,16 @@ boolean Request(char *text, unsigned int req_state)
 
   UnmapToolButtons();
 
+#if 1
+  if (use_envelope_request)
+    ShowEnvelopeDoor(text, ACTION_CLOSING);
+#endif
+
+#if 1
+  if (!(req_state & REQ_STAY_OPEN) && !use_envelope_request)
+#else
   if (!(req_state & REQ_STAY_OPEN))
+#endif
   {
     CloseDoor(DOOR_CLOSE_1);
 
@@ -6633,6 +6777,12 @@ inline static int get_effective_element_EM(int tile, int frame_em)
       case Yacid_splash_wB:
        return (frame_em > 5 ? EL_EMPTY : element);
 
+#if 0
+      case Ydiamond_stone:
+       //  if (!game.use_native_emc_graphics_engine)
+       return EL_ROCK;
+#endif
+
       default:
        return element;
     }
@@ -6710,6 +6860,11 @@ inline static boolean check_linear_animation_EM(int tile)
     case Ytank_s_e:
     case Ytank_w_s:
     case Ytank_n_w:
+#if 1
+    case Yacid_splash_eB:
+    case Yacid_splash_wB:
+    case Yemerald_stone:
+#endif
       return TRUE;
   }
 
@@ -7318,6 +7473,23 @@ void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em,
 #endif
 
 
+#if 1
+  if (tile == Ydiamond_stone)
+    printf("::: stone smashing diamond... %d: %d, %d, %d, %d, %d -> %d [%d, %d, %d, %d, %d, %d] [%d]\n",
+          frame_em,
+          g->anim_frames,
+          g->anim_delay,
+          g->anim_mode,
+          g->anim_start_frame,
+          sync_frame,
+          frame,
+          g_em->src_x, g_em->src_y,
+          g_em->src_offset_x, g_em->src_offset_y,
+          g_em->dst_offset_x, g_em->dst_offset_y,
+          graphic);
+#endif
+
+
 #if 0
   return;
 #endif
@@ -8160,6 +8332,33 @@ void InitGraphicInfo_EM(void)
 #endif
 }
 
+void CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame,
+                           boolean any_player_moving)
+{
+  int i;
+
+  if (tape.single_step && tape.recording && !tape.pausing)
+  {
+    boolean active_players = FALSE;
+
+    for (i = 0; i < MAX_PLAYERS; i++)
+      if (action[i] != JOY_NO_ACTION)
+       active_players = TRUE;
+
+    if (frame == 0)
+      TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+  }
+}
+
+void CheckSingleStepMode_SP(boolean murphy_is_moving)
+{
+  if (tape.single_step && tape.recording && !tape.pausing)
+  {
+    if (!murphy_is_moving)
+      TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+  }
+}
+
 void getGraphicSource_SP(struct GraphicInfo_SP *g_sp,
                         int graphic, int sync_frame, int x, int y)
 {
index e0a6fcd6916645939109347ce6a0d4efe61c342c..510524af77f4ac381be3bffb62fa56c583594786 100644 (file)
@@ -147,7 +147,7 @@ void DrawMiniElement(int, int, int);
 void DrawMiniElementOrWall(int, int, int, int);
 
 void ShowEnvelope(int);
-void ShowEnvelopeDoor(char *text);
+void ShowEnvelopeDoor(char *text, int);
 
 void DrawLevel(void);
 void DrawMiniLevel(int, int, int, int);