rnd-20140129-1-src
authorHolger Schemel <info@artsoft.org>
Wed, 29 Jan 2014 00:50:30 +0000 (01:50 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 09:00:43 +0000 (11:00 +0200)
* added envelope style requester dialog (alternative to door requester)

ChangeLog
src/conf_fnt.c
src/conf_gfx.c
src/conf_gfx.h
src/conf_var.c
src/conftime.h
src/libgame/system.c
src/main.c
src/main.h
src/tools.c
src/tools.h

index 7e3533438cb93853141505ad09ed44a009348b5f..414b0d229438e6b1e48edb3b872ecaa2a124af1a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2014-01-28
+       * added envelope style requester dialog (alternative to door requester)
+
 2014-01-27
        * fixed problems with window scaling and updating related setup value
        * added setup option to select anti-aliasing quality of scaled windows
index c0ba77e61cbb05d01198dc8d0d3b013904b1e5e8..d4709dfdfe58a87162443e77372ffb8eb596a483 100644 (file)
@@ -215,6 +215,10 @@ font_to_graphic[] =
     FONT_ENVELOPE_4,                           -1,
     IMG_FONT_ENVELOPE_4
   },
+  {
+    FONT_REQUEST,                              -1,
+    IMG_FONT_REQUEST
+  },
   {
     FONT_INPUT_1,                              -1,
     IMG_FONT_INPUT_1
index 76333abd86686dcff61b65488a57ed53df895487..4c7a117f890ee24df18e5da0ccd90c62ea9a47ba 100644 (file)
@@ -5091,6 +5091,12 @@ struct ConfigInfo image_config[] =
   { "font.envelope_4.width",                   "16"                    },
   { "font.envelope_4.height",                  "16"                    },
 
+  { "font.request",                            "RocksFontSmall.png"    },
+  { "font.request.x",                          "0"                     },
+  { "font.request.y",                          "210"                   },
+  { "font.request.width",                      "14"                    },
+  { "font.request.height",                     "14"                    },
+
   { "font.input_1",                            "RocksFontSmall.png"    },
   { "font.input_1.x",                          "0"                     },
   { "font.input_1.y",                          "210"                   },
@@ -6725,6 +6731,16 @@ struct ConfigInfo image_config[] =
   { "request.button.player_4.draw_player",     "true"                  },
   { "request.button.player_4.tile_size",       "16"                    },
 
+  { "request.x",                               "-1"                    },
+  { "request.y",                               "-1"                    },
+  { "request.width",                           "120"                   },
+  { "request.height",                          "300"                   },
+  { "request.border_size",                     "10"                    },
+  { "request.line_spacing",                    "2"                     },
+  { "request.step_offset",                     "10"                    },
+  { "request.step_delay",                      "20"                    },
+  { "request.anim_mode",                       "default"               },
+
   { "global.use_envelope_request",             "false"                 },
 
   { "game.forced_scroll_delay_value",          "-1"                    },
index 01f9fbd52eedd3afc97bc3ca3746ea73e2cfc2ba..9935b1ad01e680c15be94db3160a569cc0390b71 100644 (file)
 #define IMG_FONT_ENVELOPE_2                            1766
 #define IMG_FONT_ENVELOPE_3                            1767
 #define IMG_FONT_ENVELOPE_4                            1768
-#define IMG_FONT_INPUT_1                               1769
-#define IMG_FONT_INPUT_1_MAIN                          1770
-#define IMG_FONT_INPUT_1_ACTIVE                                1771
-#define IMG_FONT_INPUT_1_ACTIVE_MAIN                   1772
-#define IMG_FONT_INPUT_1_ACTIVE_SETUP                  1773
-#define IMG_FONT_INPUT_2                               1774
-#define IMG_FONT_INPUT_2_ACTIVE                                1775
-#define IMG_FONT_OPTION_OFF                            1776
-#define IMG_FONT_OPTION_ON                             1777
-#define IMG_FONT_VALUE_1                               1778
-#define IMG_FONT_VALUE_2                               1779
-#define IMG_FONT_VALUE_OLD                             1780
-#define IMG_FONT_LEVEL_NUMBER                          1781
-#define IMG_FONT_LEVEL_NUMBER_ACTIVE                   1782
-#define IMG_FONT_TAPE_RECORDER                         1783
-#define IMG_FONT_GAME_INFO                             1784
-#define IMG_FONT_INFO_ELEMENTS                         1785
-#define IMG_FONT_INFO_LEVELSET                         1786
-#define IMG_GLOBAL_BORDER                              1787
-#define IMG_GLOBAL_DOOR                                        1788
-#define IMG_GLOBAL_BUSY                                        1789
-#define IMG_EDITOR_ELEMENT_BORDER                      1790
-#define IMG_EDITOR_ELEMENT_BORDER_INPUT                        1791
-#define IMG_EDITOR_CASCADE_LIST                                1792
-#define IMG_EDITOR_CASCADE_LIST_ACTIVE                 1793
-#define IMG_BACKGROUND                                 1794
-#define IMG_BACKGROUND_TITLE_INITIAL                   1795
-#define IMG_BACKGROUND_TITLE                           1796
-#define IMG_BACKGROUND_MAIN                            1797
-#define IMG_BACKGROUND_LEVELS                          1798
-#define IMG_BACKGROUND_LEVELNR                         1799
-#define IMG_BACKGROUND_SCORES                          1800
-#define IMG_BACKGROUND_EDITOR                          1801
-#define IMG_BACKGROUND_INFO                            1802
-#define IMG_BACKGROUND_INFO_ELEMENTS                   1803
-#define IMG_BACKGROUND_INFO_MUSIC                      1804
-#define IMG_BACKGROUND_INFO_CREDITS                    1805
-#define IMG_BACKGROUND_INFO_PROGRAM                    1806
-#define IMG_BACKGROUND_INFO_VERSION                    1807
-#define IMG_BACKGROUND_INFO_LEVELSET                   1808
-#define IMG_BACKGROUND_SETUP                           1809
-#define IMG_BACKGROUND_PLAYING                         1810
-#define IMG_BACKGROUND_DOOR                            1811
-#define IMG_BACKGROUND_TAPE                            1812
-#define IMG_BACKGROUND_PANEL                           1813
-#define IMG_BACKGROUND_TITLESCREEN_INITIAL_1           1814
-#define IMG_BACKGROUND_TITLESCREEN_INITIAL_2           1815
-#define IMG_BACKGROUND_TITLESCREEN_INITIAL_3           1816
-#define IMG_BACKGROUND_TITLESCREEN_INITIAL_4           1817
-#define IMG_BACKGROUND_TITLESCREEN_INITIAL_5           1818
-#define IMG_BACKGROUND_TITLESCREEN_1                   1819
-#define IMG_BACKGROUND_TITLESCREEN_2                   1820
-#define IMG_BACKGROUND_TITLESCREEN_3                   1821
-#define IMG_BACKGROUND_TITLESCREEN_4                   1822
-#define IMG_BACKGROUND_TITLESCREEN_5                   1823
-#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_1          1824
-#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_2          1825
-#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_3          1826
-#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_4          1827
-#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_5          1828
-#define IMG_BACKGROUND_TITLEMESSAGE_1                  1829
-#define IMG_BACKGROUND_TITLEMESSAGE_2                  1830
-#define IMG_BACKGROUND_TITLEMESSAGE_3                  1831
-#define IMG_BACKGROUND_TITLEMESSAGE_4                  1832
-#define IMG_BACKGROUND_TITLEMESSAGE_5                  1833
-#define IMG_BACKGROUND_ENVELOPE_1                      1834
-#define IMG_BACKGROUND_ENVELOPE_2                      1835
-#define IMG_BACKGROUND_ENVELOPE_3                      1836
-#define IMG_BACKGROUND_ENVELOPE_4                      1837
-#define IMG_BACKGROUND_REQUEST                         1838
-#define IMG_TITLESCREEN_INITIAL_1                      1839
-#define IMG_TITLESCREEN_INITIAL_2                      1840
-#define IMG_TITLESCREEN_INITIAL_3                      1841
-#define IMG_TITLESCREEN_INITIAL_4                      1842
-#define IMG_TITLESCREEN_INITIAL_5                      1843
-#define IMG_TITLESCREEN_1                              1844
-#define IMG_TITLESCREEN_2                              1845
-#define IMG_TITLESCREEN_3                              1846
-#define IMG_TITLESCREEN_4                              1847
-#define IMG_TITLESCREEN_5                              1848
+#define IMG_FONT_REQUEST                               1769
+#define IMG_FONT_INPUT_1                               1770
+#define IMG_FONT_INPUT_1_MAIN                          1771
+#define IMG_FONT_INPUT_1_ACTIVE                                1772
+#define IMG_FONT_INPUT_1_ACTIVE_MAIN                   1773
+#define IMG_FONT_INPUT_1_ACTIVE_SETUP                  1774
+#define IMG_FONT_INPUT_2                               1775
+#define IMG_FONT_INPUT_2_ACTIVE                                1776
+#define IMG_FONT_OPTION_OFF                            1777
+#define IMG_FONT_OPTION_ON                             1778
+#define IMG_FONT_VALUE_1                               1779
+#define IMG_FONT_VALUE_2                               1780
+#define IMG_FONT_VALUE_OLD                             1781
+#define IMG_FONT_LEVEL_NUMBER                          1782
+#define IMG_FONT_LEVEL_NUMBER_ACTIVE                   1783
+#define IMG_FONT_TAPE_RECORDER                         1784
+#define IMG_FONT_GAME_INFO                             1785
+#define IMG_FONT_INFO_ELEMENTS                         1786
+#define IMG_FONT_INFO_LEVELSET                         1787
+#define IMG_GLOBAL_BORDER                              1788
+#define IMG_GLOBAL_DOOR                                        1789
+#define IMG_GLOBAL_BUSY                                        1790
+#define IMG_EDITOR_ELEMENT_BORDER                      1791
+#define IMG_EDITOR_ELEMENT_BORDER_INPUT                        1792
+#define IMG_EDITOR_CASCADE_LIST                                1793
+#define IMG_EDITOR_CASCADE_LIST_ACTIVE                 1794
+#define IMG_BACKGROUND                                 1795
+#define IMG_BACKGROUND_TITLE_INITIAL                   1796
+#define IMG_BACKGROUND_TITLE                           1797
+#define IMG_BACKGROUND_MAIN                            1798
+#define IMG_BACKGROUND_LEVELS                          1799
+#define IMG_BACKGROUND_LEVELNR                         1800
+#define IMG_BACKGROUND_SCORES                          1801
+#define IMG_BACKGROUND_EDITOR                          1802
+#define IMG_BACKGROUND_INFO                            1803
+#define IMG_BACKGROUND_INFO_ELEMENTS                   1804
+#define IMG_BACKGROUND_INFO_MUSIC                      1805
+#define IMG_BACKGROUND_INFO_CREDITS                    1806
+#define IMG_BACKGROUND_INFO_PROGRAM                    1807
+#define IMG_BACKGROUND_INFO_VERSION                    1808
+#define IMG_BACKGROUND_INFO_LEVELSET                   1809
+#define IMG_BACKGROUND_SETUP                           1810
+#define IMG_BACKGROUND_PLAYING                         1811
+#define IMG_BACKGROUND_DOOR                            1812
+#define IMG_BACKGROUND_TAPE                            1813
+#define IMG_BACKGROUND_PANEL                           1814
+#define IMG_BACKGROUND_TITLESCREEN_INITIAL_1           1815
+#define IMG_BACKGROUND_TITLESCREEN_INITIAL_2           1816
+#define IMG_BACKGROUND_TITLESCREEN_INITIAL_3           1817
+#define IMG_BACKGROUND_TITLESCREEN_INITIAL_4           1818
+#define IMG_BACKGROUND_TITLESCREEN_INITIAL_5           1819
+#define IMG_BACKGROUND_TITLESCREEN_1                   1820
+#define IMG_BACKGROUND_TITLESCREEN_2                   1821
+#define IMG_BACKGROUND_TITLESCREEN_3                   1822
+#define IMG_BACKGROUND_TITLESCREEN_4                   1823
+#define IMG_BACKGROUND_TITLESCREEN_5                   1824
+#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_1          1825
+#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_2          1826
+#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_3          1827
+#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_4          1828
+#define IMG_BACKGROUND_TITLEMESSAGE_INITIAL_5          1829
+#define IMG_BACKGROUND_TITLEMESSAGE_1                  1830
+#define IMG_BACKGROUND_TITLEMESSAGE_2                  1831
+#define IMG_BACKGROUND_TITLEMESSAGE_3                  1832
+#define IMG_BACKGROUND_TITLEMESSAGE_4                  1833
+#define IMG_BACKGROUND_TITLEMESSAGE_5                  1834
+#define IMG_BACKGROUND_ENVELOPE_1                      1835
+#define IMG_BACKGROUND_ENVELOPE_2                      1836
+#define IMG_BACKGROUND_ENVELOPE_3                      1837
+#define IMG_BACKGROUND_ENVELOPE_4                      1838
+#define IMG_BACKGROUND_REQUEST                         1839
+#define IMG_TITLESCREEN_INITIAL_1                      1840
+#define IMG_TITLESCREEN_INITIAL_2                      1841
+#define IMG_TITLESCREEN_INITIAL_3                      1842
+#define IMG_TITLESCREEN_INITIAL_4                      1843
+#define IMG_TITLESCREEN_INITIAL_5                      1844
+#define IMG_TITLESCREEN_1                              1845
+#define IMG_TITLESCREEN_2                              1846
+#define IMG_TITLESCREEN_3                              1847
+#define IMG_TITLESCREEN_4                              1848
+#define IMG_TITLESCREEN_5                              1849
 
-#define NUM_IMAGE_FILES                                        1849
+#define NUM_IMAGE_FILES                                        1850
 
 #endif /* CONF_GFX_H */
index 9676d1d76a789e614098704e31f56894353cc2ac..bee7f5ab1803a4f726c3718e18d699c236e2c2c8 100644 (file)
@@ -5436,6 +5436,42 @@ struct TokenIntPtrInfo image_config_vars[] =
     "request.button.player_4.tile_size",
     &request.button.player_4.size
   },
+  {
+    "request.x",
+    &request.x
+  },
+  {
+    "request.y",
+    &request.y
+  },
+  {
+    "request.width",
+    &request.width
+  },
+  {
+    "request.height",
+    &request.height
+  },
+  {
+    "request.border_size",
+    &request.border_size
+  },
+  {
+    "request.line_spacing",
+    &request.line_spacing
+  },
+  {
+    "request.step_offset",
+    &request.step_offset
+  },
+  {
+    "request.step_delay",
+    &request.step_delay
+  },
+  {
+    "request.anim_mode",
+    &request.anim_mode
+  },
   {
     "global.use_envelope_request",
     &global.use_envelope_request
index 62dbfd32837375daf9383454ee49c489bce597e0..3922a95af873d35649dce7990d4ddb1134ae9acb 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2014-01-27 22:11"
+#define COMPILE_DATE_STRING "2014-01-29 01:41"
index 94fe631b87a12e3f421dbf0b6148fc55443ce23d..f08c88c762aa1519e71965eee0e58f6a2b92eb1a 100644 (file)
@@ -318,11 +318,9 @@ void SetBackgroundBitmap(Bitmap *background_bitmap_tile, int mask)
                       gfx.real_sx, gfx.real_sy,
                       gfx.full_sxsize, gfx.full_sysize);
   else if (mask == REDRAW_DOOR_1)
-  {
     DrawBitmapFromTile(gfx.background_bitmap, background_bitmap_tile,
                       gfx.dx, gfx.dy,
                       gfx.dxsize, gfx.dysize);
-  }
 }
 
 #else
@@ -350,10 +348,8 @@ void SetBackgroundBitmap(Bitmap *background_bitmap_tile, int mask)
     BlitBitmapTiled(background_bitmap_tile, gfx.background_bitmap, 0, 0, 0, 0,
                    gfx.real_sx, gfx.real_sy, gfx.full_sxsize, gfx.full_sysize);
   else if (mask == REDRAW_DOOR_1)
-  {
     BlitBitmapTiled(background_bitmap_tile, gfx.background_bitmap, 0, 0, 0, 0,
                    gfx.dx, gfx.dy, gfx.dxsize, gfx.dysize);
-  }
 }
 
 #endif
index ca59e8f692fc7a70d71b948f6197db1fe5067334..b3453d8def56e6c4601933343801ae566087908e 100644 (file)
@@ -5517,6 +5517,7 @@ struct FontInfo font_info[NUM_FONTS + 1] =
   { "font.envelope_2"          },
   { "font.envelope_3"          },
   { "font.envelope_4"          },
+  { "font.request"             },
   { "font.input_1.active"      },
   { "font.input_2.active"      },
   { "font.input_1"             },
index ab6d8933ebe6f9aadc2ce57ad71477a9e4b458d1..835e8f4121fc5dd32b08f51fc72bd8d14efb8938 100644 (file)
 #define FONT_ENVELOPE_2                        19
 #define FONT_ENVELOPE_3                        20
 #define FONT_ENVELOPE_4                        21
-#define FONT_INPUT_1_ACTIVE            22
-#define FONT_INPUT_2_ACTIVE            23
-#define FONT_INPUT_1                   24
-#define FONT_INPUT_2                   25
-#define FONT_OPTION_OFF                        26
-#define FONT_OPTION_ON                 27
-#define FONT_VALUE_1                   28
-#define FONT_VALUE_2                   29
-#define FONT_VALUE_OLD                 30
-#define FONT_LEVEL_NUMBER_ACTIVE       31
-#define FONT_LEVEL_NUMBER              32
-#define FONT_TAPE_RECORDER             33
-#define FONT_GAME_INFO                 34
-#define FONT_INFO_ELEMENTS             35
-#define FONT_INFO_LEVELSET             36
-
-#define NUM_FONTS                      37
+#define FONT_REQUEST                   22
+#define FONT_INPUT_1_ACTIVE            23
+#define FONT_INPUT_2_ACTIVE            24
+#define FONT_INPUT_1                   25
+#define FONT_INPUT_2                   26
+#define FONT_OPTION_OFF                        27
+#define FONT_OPTION_ON                 28
+#define FONT_VALUE_1                   29
+#define FONT_VALUE_2                   30
+#define FONT_VALUE_OLD                 31
+#define FONT_LEVEL_NUMBER_ACTIVE       32
+#define FONT_LEVEL_NUMBER              33
+#define FONT_TAPE_RECORDER             34
+#define FONT_GAME_INFO                 35
+#define FONT_INFO_ELEMENTS             36
+#define FONT_INFO_LEVELSET             37
+
+#define NUM_FONTS                      38
 #define NUM_INITIAL_FONTS              4
 
 #if 0
@@ -2172,6 +2173,17 @@ struct BorderInfo
   boolean draw_masked_when_fading;
 };
 
+struct RequestButtonInfo
+{
+  struct TextPosInfo yes;
+  struct TextPosInfo no;
+  struct TextPosInfo confirm;
+  struct TextPosInfo player_1;
+  struct TextPosInfo player_2;
+  struct TextPosInfo player_3;
+  struct TextPosInfo player_4;
+};
+
 struct MenuMainButtonInfo
 {
   struct MenuPosInfo name;
@@ -2284,8 +2296,19 @@ struct MenuInfo
 
 struct DoorInfo
 {
-  int width;
-  int height;
+  int width, height;
+  int step_offset;
+  int step_delay;
+  int anim_mode;
+};
+
+struct RequestInfo
+{
+  struct RequestButtonInfo button;
+  int x, y;
+  int width, height;
+  int border_size;
+  int line_spacing;
   int step_offset;
   int step_delay;
   int anim_mode;
@@ -2970,6 +2993,7 @@ extern struct TitleMessageInfo    readme;
 extern struct InitInfo         init, init_last;
 extern struct MenuInfo         menu;
 extern struct DoorInfo         door_1, door_2;
+extern struct RequestInfo      request;
 extern struct PreviewInfo      preview;
 extern struct ElementInfo      element_info[];
 extern struct ElementNameInfo  element_name_info[];
index 6f67e1432953addc1ea27e143c3613ece3b14bb6..5cbf8053324b2f9ab255e5739cc374ef007eab1c 100644 (file)
@@ -2465,49 +2465,57 @@ void DrawMiniElementOrWall(int sx, int sy, int scroll_x, int scroll_y)
     DrawMiniGraphic(sx, sy, el2edimg(getBorderElement(x, y)));
 }
 
-void DrawEnvelopeBackground(int graphic, int startx, int starty,
-                           int x, int y, int xsize, int ysize, int font_nr,
-                           int line_spacing)
+void DrawEnvelopeBackgroundTiles(int graphic, int startx, int starty,
+                                int x, int y, int xsize, int ysize,
+                                int tile_width, int tile_height)
 {
-  int font_width  = getFontWidth(font_nr);
-  int font_height = getFontHeight(font_nr) + line_spacing;
   Bitmap *src_bitmap;
   int src_x, src_y;
-  int dst_x = SX + startx + x * font_width;
-  int dst_y = SY + starty + y * font_height;
+  int dst_x = startx + x * tile_width;
+  int dst_y = starty + y * tile_height;
   int width  = graphic_info[graphic].width;
   int height = graphic_info[graphic].height;
-  int inner_width  = MAX(width  - 2 * font_width,  font_width);
-  int inner_height = MAX(height - 2 * font_height, font_height);
-  int inner_sx = (width >= 3 * font_width ? font_width : 0);
-  int inner_sy = (height >= 3 * font_height ? font_height : 0);
+  int inner_width  = MAX(width  - 2 * tile_width,  tile_width);
+  int inner_height = MAX(height - 2 * tile_height, tile_height);
+  int inner_sx = (width >= 3 * tile_width ? tile_width : 0);
+  int inner_sy = (height >= 3 * tile_height ? tile_height : 0);
   boolean draw_masked = graphic_info[graphic].draw_masked;
 
   getFixedGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y);
 
-  if (src_bitmap == NULL || width < font_width || height < font_height)
+  if (src_bitmap == NULL || width < tile_width || height < tile_height)
   {
-    ClearRectangle(drawto, dst_x, dst_y, font_width, font_height);
+    ClearRectangle(drawto, dst_x, dst_y, tile_width, tile_height);
     return;
   }
 
-  src_x += (x == 0 ? 0 : x == xsize - 1 ? width  - font_width  :
-           inner_sx + (x - 1) * font_width  % inner_width);
-  src_y += (y == 0 ? 0 : y == ysize - 1 ? height - font_height :
-           inner_sy + (y - 1) * font_height % inner_height);
+  src_x += (x == 0 ? 0 : x == xsize - 1 ? width  - tile_width  :
+           inner_sx + (x - 1) * tile_width  % inner_width);
+  src_y += (y == 0 ? 0 : y == ysize - 1 ? height - tile_height :
+           inner_sy + (y - 1) * tile_height % inner_height);
 
   if (draw_masked)
   {
     SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc,
                  dst_x - src_x, dst_y - src_y);
-    BlitBitmapMasked(src_bitmap, drawto, src_x, src_y, font_width, font_height,
+    BlitBitmapMasked(src_bitmap, drawto, src_x, src_y, tile_width, tile_height,
                     dst_x, dst_y);
   }
   else
-    BlitBitmap(src_bitmap, drawto, src_x, src_y, font_width, font_height,
+    BlitBitmap(src_bitmap, drawto, src_x, src_y, tile_width, tile_height,
               dst_x, dst_y);
 }
 
+void DrawEnvelopeBackground(int graphic, int startx, int starty,
+                           int x, int y, int xsize, int ysize, int font_nr)
+{
+  int font_width  = getFontWidth(font_nr);
+  int font_height = getFontHeight(font_nr);
+
+  DrawEnvelopeBackgroundTiles(graphic, startx, starty, x, y, xsize, ysize,
+                             font_width, font_height);
+}
+
 void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
 {
   int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr;
@@ -2535,8 +2543,8 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
   {
     int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
     int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2;
-    int sx = (SXSIZE - xsize * font_width)  / 2;
-    int sy = (SYSIZE - ysize * font_height) / 2;
+    int sx = SX + (SXSIZE - xsize * font_width)  / 2;
+    int sy = SY + (SYSIZE - ysize * font_height) / 2;
     int xx, yy;
 
     SetDrawtoField(DRAW_BUFFERED);
@@ -2551,17 +2559,16 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
 
     for (yy = 0; yy < ysize; yy++)
       for (xx = 0; xx < xsize; xx++)
-       DrawEnvelopeBackground(graphic, sx,sy, xx,yy, xsize, ysize,
-                              font_nr, 0);
+       DrawEnvelopeBackground(graphic, sx, sy, xx, yy, xsize, ysize, font_nr);
 
 #if 1
-    DrawTextBuffer(SX + sx + font_width, SY + sy + font_height,
+    DrawTextBuffer(sx + font_width, sy + font_height,
                   level.envelope[envelope_nr].text, font_nr, max_xsize,
                   xsize - 2, ysize - 2, 0, mask_mode,
                   level.envelope[envelope_nr].autowrap,
                   level.envelope[envelope_nr].centered, FALSE);
 #else
-    DrawTextToTextArea(SX + sx + font_width, SY + sy + font_height,
+    DrawTextToTextArea(sx + font_width, sy + font_height,
                       level.envelope[envelope_nr].text, font_nr, max_xsize,
                       xsize - 2, ysize - 2, mask_mode);
 #endif
@@ -2573,6 +2580,244 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
   }
 }
 
+void ShowEnvelope(int envelope_nr)
+{
+  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];
+  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);
+  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);
+
+  game.envelope_active = TRUE; /* needed for RedrawPlayfield() events */
+
+  PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE);
+
+  if (anim_mode == ANIM_DEFAULT)
+    AnimateEnvelope(envelope_nr, ANIM_DEFAULT, ACTION_OPENING);
+
+  AnimateEnvelope(envelope_nr, main_anim_mode, ACTION_OPENING);
+
+  if (tape.playing)
+    Delay(wait_delay_value);
+  else
+    WaitForEventToContinue();
+
+  PlayMenuSoundStereo(sound_closing, SOUND_MIDDLE);
+
+  if (anim_mode != ANIM_NONE)
+    AnimateEnvelope(envelope_nr, main_anim_mode, ACTION_CLOSING);
+
+  if (anim_mode == ANIM_DEFAULT)
+    AnimateEnvelope(envelope_nr, ANIM_DEFAULT, ACTION_CLOSING);
+
+  game.envelope_active = FALSE;
+
+  SetDrawtoField(DRAW_BUFFERED);
+
+  redraw_mask |= REDRAW_FIELD;
+  BackToFront();
+}
+
+static void setRequestPosition(int *x, int *y, boolean add_border_size)
+{
+  int border_size = request.border_size;
+  int sx_center = (request.x != -1 ? request.x : SX + SXSIZE / 2);
+  int sy_center = (request.y != -1 ? request.y : SY + SYSIZE / 2);
+  int sx = sx_center - request.width  / 2;
+  int sy = sy_center - request.height / 2;
+
+  if (add_border_size)
+  {
+    sx += border_size;
+    sy += border_size;
+  }
+
+  *x = sx;
+  *y = sy;
+}
+
+void DrawEnvelopeRequest(char *text)
+{
+  int graphic = IMG_BACKGROUND_REQUEST;
+  Bitmap *src_bitmap = graphic_info[graphic].bitmap;
+  int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND);
+  int font_nr = FONT_REQUEST;
+  int font_width = getFontWidth(font_nr);
+  int font_height = getFontHeight(font_nr);
+  int border_size = request.border_size;
+  int line_spacing = request.line_spacing;
+  int line_height = font_height + line_spacing;
+  int text_width = request.width - 2 * border_size;
+  int text_height = request.height - 2 * border_size;
+  int line_length = text_width / font_width;
+  int max_lines = text_height / line_height;
+  boolean autowrap = FALSE;
+  boolean centered = TRUE;
+  int width = request.width;
+  int height = request.height;
+  int tile_size = request.step_offset;
+  int x_steps = width  / tile_size;
+  int y_steps = height / tile_size;
+  int sx, sy;
+  int i, x, y;
+
+  setRequestPosition(&sx, &sy, FALSE);
+
+  ClearRectangle(backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE);
+
+  for (y = 0; y < y_steps; y++)
+    for (x = 0; x < x_steps; x++)
+      DrawEnvelopeBackgroundTiles(graphic, sx, sy,
+                                 x, y, x_steps, y_steps,
+                                 tile_size, tile_size);
+
+  DrawTextBuffer(sx + border_size, sy + border_size, text, font_nr,
+                line_length, -1, max_lines, line_spacing, mask_mode,
+                autowrap, centered, FALSE);
+
+  for (i = 0; i < NUM_TOOL_BUTTONS; i++)
+    RedrawGadget(tool_gadget[i]);
+
+  // store readily prepared envelope request for later use when animating
+  BlitBitmap(backbuffer, bitmap_db_cross, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+
+#if 0
+  // !!! TEST !!!
+  BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+  BlitBitmap(bitmap_db_cross, backbuffer, sx, sy, width, height, sx, sy);
+
+  redraw_mask = REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+  BackToFront();
+
+  Delay(3000);
+
+  BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+
+  redraw_mask = REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+  BackToFront();
+
+  Delay(1000);
+#endif
+}
+
+#if 1
+
+void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
+{
+  int graphic = IMG_BACKGROUND_REQUEST;
+  boolean draw_masked = graphic_info[graphic].draw_masked;
+#if 1
+  int delay_value_normal = request.step_delay;
+  int delay_value_fast = delay_value_normal / 2;
+#else
+  int delay_value_normal = GameFrameDelay;
+  int delay_value_fast = FfwdFrameDelay;
+#endif
+  boolean ffwd_delay = (tape.playing && tape.fast_forward);
+  boolean no_delay = (tape.warp_forward);
+  int delay_value = (ffwd_delay ? delay_value_fast : delay_value_normal);
+  int anim_delay_value = (no_delay ? 0 : delay_value + 500 * 0);
+  unsigned int anim_delay = 0;
+
+  int width = request.width;
+  int height = request.height;
+  int tile_size = request.step_offset;
+  int max_xsize = width  / tile_size;
+  int max_ysize = height / tile_size;
+  int max_xsize_inner = max_xsize - 2;
+  int max_ysize_inner = max_ysize - 2;
+
+  int xstart = (anim_mode & ANIM_VERTICAL ? max_xsize_inner : 0);
+  int ystart = (anim_mode & ANIM_HORIZONTAL ? max_ysize_inner : 0);
+  int xend = max_xsize_inner;
+  int yend = (anim_mode != ANIM_DEFAULT ? max_ysize_inner : 0);
+  int xstep = (xstart < xend ? 1 : 0);
+  int ystep = (ystart < yend || xstep == 0 ? 1 : 0);
+  int x, y;
+
+  for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep)
+  {
+    int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
+    int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2;
+    int sx_center = (request.x != -1 ? request.x : SX + SXSIZE / 2);
+    int sy_center = (request.y != -1 ? request.y : SY + SYSIZE / 2);
+    int src_x = sx_center - width  / 2;
+    int src_y = sy_center - height / 2;
+    int dst_x = sx_center - xsize * tile_size / 2;
+    int dst_y = sy_center - ysize * tile_size / 2;
+    int xsize_size_left = (xsize - 1) * tile_size;
+    int ysize_size_top  = (ysize - 1) * tile_size;
+    int max_xsize_pos = (max_xsize - 1) * tile_size;
+    int max_ysize_pos = (max_ysize - 1) * tile_size;
+    int xx, yy;
+
+    BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+
+#if 1
+    for (yy = 0; yy < 2; yy++)
+    {
+      for (xx = 0; xx < 2; xx++)
+      {
+       int src_xx = src_x + xx * max_xsize_pos;
+       int src_yy = src_y + yy * max_ysize_pos;
+       int dst_xx = dst_x + xx * xsize_size_left;
+       int dst_yy = dst_y + yy * ysize_size_top;
+       int xx_size = (xx ? tile_size : xsize_size_left);
+       int yy_size = (yy ? tile_size : ysize_size_top);
+
+       if (draw_masked)
+         BlitBitmapMasked(bitmap_db_cross, backbuffer,
+                          src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy);
+       else
+         BlitBitmap(bitmap_db_cross, backbuffer,
+                    src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy);
+      }
+    }
+#else
+    BlitBitmap(bitmap_db_cross, backbuffer,
+              src_x, src_y,
+              xsize_size_left, ysize_size_top,
+              dst_x, dst_y);
+    BlitBitmap(bitmap_db_cross, backbuffer,
+              src_x + max_xsize_pos, src_y,
+              tile_size, ysize_size_top,
+              dst_x + xsize_size_left, dst_y);
+    BlitBitmap(bitmap_db_cross, backbuffer,
+              src_x, src_y + max_ysize_pos,
+              xsize_size_left, tile_size,
+              dst_x, dst_y + ysize_size_top);
+    BlitBitmap(bitmap_db_cross, backbuffer,
+              src_x + max_xsize_pos, src_y + max_ysize_pos,
+              tile_size, tile_size,
+              dst_x + xsize_size_left, dst_y + ysize_size_top);
+#endif
+
+#if 1
+    redraw_mask = REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+    // redraw_mask |= REDRAW_ALL | REDRAW_FROM_BACKBUFFER;
+#else
+    redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+#endif
+
+#if 1
+    DoAnimation();
+    BackToFront();
+#else
+    BackToFront();
+#endif
+
+    WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
+  }
+}
+
+#else
+
 void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
 {
 #if 0
@@ -2674,9 +2919,9 @@ void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
   {
     int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
     int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2;
-    int sx = (SXSIZE - xsize * font_width)  / 2;
-    // int sy = (SYSIZE - ysize * font_height) / 2;
-    int sy = (SYSIZE - ysize * (font_height + line_spacing)) / 2;
+    int sx = SX + (SXSIZE - xsize * font_width)  / 2;
+    // int sy = SX + (SYSIZE - ysize * font_height) / 2;
+    int sy = SY + (SYSIZE - ysize * (font_height + line_spacing)) / 2;
     int xx, yy;
 
 #if 1
@@ -2695,18 +2940,19 @@ void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
 
     for (yy = 0; yy < ysize; yy++)
       for (xx = 0; xx < xsize; xx++)
-       DrawEnvelopeBackground(graphic, sx,sy, xx,yy, xsize, ysize,
-                              font_nr, line_spacing);
+       DrawEnvelopeBackgroundTiles(graphic, sx, sy, xx, yy, xsize, ysize,
+                                   getFontWidth(font_nr),
+                                   getFontHeight(font_nr) + line_spacing);
 
 #if 1
 
 #if 1
-    DrawTextBuffer(SX + sx + font_width, SY + sy + font_height + 8,
+    DrawTextBuffer(sx + font_width, sy + font_height + 8,
                   text_copy, font_nr, max_xsize,
                   xsize - 2, ysize - 2, line_spacing, mask_mode,
                   FALSE, TRUE, FALSE);
 #else
-    DrawTextBuffer(SX + sx + font_width, SY + sy + font_height,
+    DrawTextBuffer(sx + font_width, sy + font_height,
                   level.envelope[envelope_nr].text, font_nr, max_xsize,
                   xsize - 2, ysize - 2, 0, mask_mode,
                   level.envelope[envelope_nr].autowrap,
@@ -2714,7 +2960,7 @@ void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
 #endif
 
 #else
-    DrawTextToTextArea(SX + sx + font_width, SY + sy + font_height,
+    DrawTextToTextArea(sx + font_width, sy + font_height,
                       level.envelope[envelope_nr].text, font_nr, max_xsize,
                       xsize - 2, ysize - 2, mask_mode);
 #endif
@@ -2728,8 +2974,8 @@ void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
                 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));
+                sx + font_width,
+                sy + font_height * (1 + 13));
     */
     if ((ysize - 2) > 13)
       BlitBitmap(bitmap_db_door, drawto,
@@ -2737,8 +2983,8 @@ void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
                 DOOR_GFX_PAGEY1 + 11 * (font_height + line_spacing * 0),
                 (xsize - 2) * font_width,
                 (ysize - 2 - 13) * (font_height + line_spacing),
-                SX + sx + font_width,
-                SY + sy + (font_height + line_spacing) * (1 + 13));
+                sx + font_width,
+                sy + (font_height + line_spacing) * (1 + 13));
 #else
     if ((ysize - 2) > 13)
       BlitBitmap(bitmap_db_door, drawto,
@@ -2746,8 +2992,8 @@ void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
                 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));
+                sx + font_width,
+                sy + font_height * (1 + 13));
 #endif
 
 #if 1
@@ -2772,51 +3018,9 @@ void AnimateEnvelopeRequest(char *text, int anim_mode, int action)
 #endif
 }
 
-void ShowEnvelope(int envelope_nr)
-{
-  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];
-  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);
-  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);
-
-  game.envelope_active = TRUE; /* needed for RedrawPlayfield() events */
-
-  PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE);
-
-  if (anim_mode == ANIM_DEFAULT)
-    AnimateEnvelope(envelope_nr, ANIM_DEFAULT, ACTION_OPENING);
-
-  AnimateEnvelope(envelope_nr, main_anim_mode, ACTION_OPENING);
-
-  if (tape.playing)
-    Delay(wait_delay_value);
-  else
-    WaitForEventToContinue();
-
-  PlayMenuSoundStereo(sound_closing, SOUND_MIDDLE);
-
-  if (anim_mode != ANIM_NONE)
-    AnimateEnvelope(envelope_nr, main_anim_mode, ACTION_CLOSING);
-
-  if (anim_mode == ANIM_DEFAULT)
-    AnimateEnvelope(envelope_nr, ANIM_DEFAULT, ACTION_CLOSING);
-
-  game.envelope_active = FALSE;
-
-  SetDrawtoField(DRAW_BUFFERED);
-
-  redraw_mask |= REDRAW_FIELD;
-  BackToFront();
-}
+#endif
 
-void ShowEnvelopeRequest(char *text, int action)
+void ShowEnvelopeRequest(char *text, unsigned int req_state, int action)
 {
 #if 1
   int last_game_status = game_status;  /* save current game status */
@@ -2842,6 +3046,12 @@ void ShowEnvelopeRequest(char *text, int action)
   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);
+  char *text_copy = getStringCopy(text);
+  char *text_ptr;
+
+  for (text_ptr = text_copy; *text_ptr; text_ptr++)
+    if (*text_ptr == ' ')
+      *text_ptr = '\n';
 
 #if 1
   if (game_status == GAME_MODE_PLAYING)
@@ -2864,6 +3074,27 @@ void ShowEnvelopeRequest(char *text, int action)
   {
     BlitBitmap(backbuffer, bitmap_db_store, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
 
+#if 1
+  if (req_state & REQ_ASK)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_NO]);
+  }
+  else if (req_state & REQ_CONFIRM)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]);
+  }
+  else if (req_state & REQ_PLAYER)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]);
+  }
+#endif
+
+    DrawEnvelopeRequest(text_copy);
+
     if (game_status != GAME_MODE_MAIN)
       InitAnimation();
   }
@@ -2941,6 +3172,8 @@ void ShowEnvelopeRequest(char *text, int action)
 #else
   BackToFront();
 #endif
+
+  free(text_copy);
 }
 
 void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize)
@@ -3900,52 +4133,595 @@ void WaitForEventToContinue()
 #define MAX_REQUEST_LINE_FONT1_LEN     7
 #define MAX_REQUEST_LINE_FONT2_LEN     10
 
-boolean Request(char *text, unsigned int req_state)
+#if 1
+
+static int RequestHandleEvents(unsigned int req_state)
 {
-  int mx, my, ty, result = -1;
-  unsigned int old_door_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;
-#if 0
-  int max_word_len = 0;
-#endif
-  char *text_ptr;
-  int i;
+  int result;
+  int mx, my;
 
-#if 0
-  global.use_envelope_request = 1;
-#endif
+  button_status = MB_RELEASED;
 
-#if 1
-  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);
+  request_gadget_id = -1;
+  result = -1;
 
-    if (max_word_len > MAX_REQUEST_LINE_FONT1_LEN)
+  while (result < 0)
+  {
+    if (PendingEvent())
     {
-      max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN;
-#if 1
-      font_nr = FONT_TEXT_1;
-#else
-      font_nr = FONT_LEVEL_NUMBER;
-#endif
+      Event event;
 
-      break;
-    }
-  }
-#endif
+      NextEvent(&event);
 
-  if (game_status == GAME_MODE_PLAYING)
-  {
-    if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
-      BlitScreenToBitmap_EM(backbuffer);
+      switch (event.type)
+      {
+       case EVENT_BUTTONPRESS:
+       case EVENT_BUTTONRELEASE:
+       case EVENT_MOTIONNOTIFY:
+       {
+         if (event.type == EVENT_MOTIONNOTIFY)
+         {
+           if (!PointerInWindow(window))
+             continue; /* window and pointer are on different screens */
+
+           if (!button_status)
+             continue;
+
+           motion_status = TRUE;
+           mx = ((MotionEvent *) &event)->x;
+           my = ((MotionEvent *) &event)->y;
+         }
+         else
+         {
+           motion_status = FALSE;
+           mx = ((ButtonEvent *) &event)->x;
+           my = ((ButtonEvent *) &event)->y;
+           if (event.type == EVENT_BUTTONPRESS)
+             button_status = ((ButtonEvent *) &event)->button;
+           else
+             button_status = MB_RELEASED;
+         }
+
+         /* this sets 'request_gadget_id' */
+         HandleGadgets(mx, my, button_status);
+
+         switch (request_gadget_id)
+         {
+           case TOOL_CTRL_ID_YES:
+             result = TRUE;
+             break;
+           case TOOL_CTRL_ID_NO:
+             result = FALSE;
+             break;
+           case TOOL_CTRL_ID_CONFIRM:
+             result = TRUE | FALSE;
+             break;
+
+           case TOOL_CTRL_ID_PLAYER_1:
+             result = 1;
+             break;
+           case TOOL_CTRL_ID_PLAYER_2:
+             result = 2;
+             break;
+           case TOOL_CTRL_ID_PLAYER_3:
+             result = 3;
+             break;
+           case TOOL_CTRL_ID_PLAYER_4:
+             result = 4;
+             break;
+
+           default:
+             break;
+         }
+
+         break;
+       }
+
+       case EVENT_KEYPRESS:
+         switch (GetEventKey((KeyEvent *)&event, TRUE))
+         {
+           case KSYM_space:
+             if (req_state & REQ_CONFIRM)
+               result = 1;
+             break;
+
+           case KSYM_Return:
+             result = 1;
+             break;
+
+           case KSYM_Escape:
+#if defined(TARGET_SDL2)
+           case KSYM_Back:
+#endif
+             result = 0;
+             break;
+
+           default:
+             break;
+         }
+
+         if (req_state & REQ_PLAYER)
+           result = 0;
+         break;
+
+       case EVENT_KEYRELEASE:
+         ClearPlayerAction();
+         break;
+
+       default:
+         HandleOtherEvents(&event);
+         break;
+      }
+    }
+    else if (AnyJoystickButton() == JOY_BUTTON_NEW_PRESSED)
+    {
+      int joy = AnyJoystick();
+
+      if (joy & JOY_BUTTON_1)
+       result = 1;
+      else if (joy & JOY_BUTTON_2)
+       result = 0;
+    }
+
+#if 1
+
+    if (game_status == GAME_MODE_PLAYING && local_player->LevelSolved_GameEnd)
+    {
+      HandleGameActions();
+    }
+    else
+    {
+      DoAnimation();
+
+      if (!PendingEvent())     /* delay only if no pending events */
+       Delay(10);
+    }
+
+#if 1
+    game_status = GAME_MODE_PSEUDO_DOOR;
+#endif
+
+    BackToFront();
+
+#if 1
+    game_status = last_game_status;    /* restore current game status */
+#endif
+
+#else
+
+    DoAnimation();
+
+#if 1
+    if (!PendingEvent())       /* delay only if no pending events */
+      Delay(10);
+#else
+    /* don't eat all CPU time */
+    Delay(10);
+#endif
+
+#endif
+  }
+
+  return result;
+}
+
+static boolean RequestDoor(char *text, unsigned int req_state)
+{
+  unsigned int old_door_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;
+  char *text_ptr;
+  int result;
+  int ty;
+
+  if (maxWordLengthInString(text) > MAX_REQUEST_LINE_FONT1_LEN)
+  {
+    max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN;
+    font_nr = FONT_TEXT_1;
+  }
+
+  if (game_status == GAME_MODE_PLAYING)
+  {
+    if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+      BlitScreenToBitmap_EM(backbuffer);
+    else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+      BlitScreenToBitmap_SP(backbuffer);
+  }
+
+  /* disable deactivated drawing when quick-loading level tape recording */
+  if (tape.playing && tape.deactivate_display)
+    TapeDeactivateDisplayOff(TRUE);
+
+  SetMouseCursor(CURSOR_DEFAULT);
+
+#if defined(NETWORK_AVALIABLE)
+  /* pause network game while waiting for request to answer */
+  if (options.network &&
+      game_status == GAME_MODE_PLAYING &&
+      req_state & REQUEST_WAIT_FOR_INPUT)
+    SendToServer_PausePlaying();
+#endif
+
+  old_door_state = GetDoorState();
+
+  /* simulate releasing mouse button over last gadget, if still pressed */
+  if (button_status)
+    HandleGadgets(-1, -1, 0);
+
+  UnmapAllGadgets();
+
+  /* draw released gadget before proceeding */
+  // BackToFront();
+
+  if (old_door_state & DOOR_OPEN_1)
+  {
+    CloseDoor(DOOR_CLOSE_1);
+
+    /* save old door content */
+    BlitBitmap(bitmap_db_door, bitmap_db_door,
+              DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE,
+              DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1);
+  }
+
+  SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
+  SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
+
+  /* clear door drawing field */
+  DrawBackground(DX, DY, DXSIZE, DYSIZE);
+
+  /* force DOOR font inside door area */
+  game_status = GAME_MODE_PSEUDO_DOOR;
+
+  /* write text for request */
+  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_ptr)
+      break;
+
+    for (tl = 0, tx = 0; tx < max_request_line_len; tl++, tx++)
+    {
+      tc = *(text_ptr + tx);
+      if (!tc || tc == ' ')
+       break;
+    }
+
+    if (!tl)
+    { 
+      text_ptr++; 
+      ty--; 
+      continue; 
+    }
+
+    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_ptr += tl + (tc == ' ' ? 1 : 0);
+  }
+
+  game_status = last_game_status;      /* restore current game status */
+
+  if (req_state & REQ_ASK)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_NO]);
+  }
+  else if (req_state & REQ_CONFIRM)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]);
+  }
+  else if (req_state & REQ_PLAYER)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]);
+  }
+
+  /* copy request gadgets to door backbuffer */
+  BlitBitmap(drawto, bitmap_db_door,
+            DX, DY, DXSIZE, DYSIZE,
+            DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+
+  OpenDoor(DOOR_OPEN_1);
+
+  if (!(req_state & REQUEST_WAIT_FOR_INPUT))
+  {
+    if (game_status == GAME_MODE_PLAYING)
+    {
+      SetPanelBackground();
+      SetDrawBackgroundMask(REDRAW_DOOR_1);
+    }
+    else
+    {
+      SetDrawBackgroundMask(REDRAW_FIELD);
+    }
+
+    return FALSE;
+  }
+
+  if (game_status != GAME_MODE_MAIN)
+    InitAnimation();
+
+  SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
+
+  // ---------- handle request buttons ----------
+  result = RequestHandleEvents(req_state);
+
+  if (game_status != GAME_MODE_MAIN)
+    StopAnimation();
+
+  UnmapToolButtons();
+
+  if (!(req_state & REQ_STAY_OPEN))
+  {
+    CloseDoor(DOOR_CLOSE_1);
+
+    if (((old_door_state & DOOR_OPEN_1) && !(req_state & REQ_STAY_CLOSED)) ||
+       (req_state & REQ_REOPEN))
+      OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+  }
+
+  RemapAllGadgets();
+
+  if (game_status == GAME_MODE_PLAYING)
+  {
+    SetPanelBackground();
+    SetDrawBackgroundMask(REDRAW_DOOR_1);
+  }
+  else
+  {
+    SetDrawBackgroundMask(REDRAW_FIELD);
+  }
+
+#if defined(NETWORK_AVALIABLE)
+  /* continue network game after request */
+  if (options.network &&
+      game_status == GAME_MODE_PLAYING &&
+      req_state & REQUEST_WAIT_FOR_INPUT)
+    SendToServer_ContinuePlaying();
+#endif
+
+  /* restore deactivated drawing when quick-loading level tape recording */
+  if (tape.playing && tape.deactivate_display)
+    TapeDeactivateDisplayOn();
+
+  return result;
+}
+
+static boolean RequestEnvelope(char *text, unsigned int req_state)
+{
+  int result;
+#if 0
+  int i;
+#endif
+
+  if (game_status == GAME_MODE_PLAYING)
+  {
+    if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+      BlitScreenToBitmap_EM(backbuffer);
+    else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+      BlitScreenToBitmap_SP(backbuffer);
+  }
+
+  /* disable deactivated drawing when quick-loading level tape recording */
+  if (tape.playing && tape.deactivate_display)
+    TapeDeactivateDisplayOff(TRUE);
+
+  SetMouseCursor(CURSOR_DEFAULT);
+
+#if defined(NETWORK_AVALIABLE)
+  /* pause network game while waiting for request to answer */
+  if (options.network &&
+      game_status == GAME_MODE_PLAYING &&
+      req_state & REQUEST_WAIT_FOR_INPUT)
+    SendToServer_PausePlaying();
+#endif
+
+  /* simulate releasing mouse button over last gadget, if still pressed */
+  if (button_status)
+    HandleGadgets(-1, -1, 0);
+
+  UnmapAllGadgets();
+
+  // (replace with setting corresponding request background)
+  // SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
+  // SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
+
+  /* clear door drawing field */
+  // DrawBackground(DX, DY, DXSIZE, DYSIZE);
+
+#if 0
+  if (global.use_envelope_request)
+  {
+    /* !!! TMP !!! */
+    FreeToolButtons();
+    CreateToolButtons();
+  }
+#endif
+
+#if 0
+#if 0
+  if (req_state & REQ_ASK)
+  {
+    MapGadgetExt(tool_gadget[TOOL_CTRL_ID_YES], FALSE);
+    MapGadgetExt(tool_gadget[TOOL_CTRL_ID_NO], FALSE);
+  }
+  else if (req_state & REQ_CONFIRM)
+  {
+    MapGadgetExt(tool_gadget[TOOL_CTRL_ID_CONFIRM], FALSE);
+  }
+  else if (req_state & REQ_PLAYER)
+  {
+    MapGadgetExt(tool_gadget[TOOL_CTRL_ID_PLAYER_1], FALSE);
+    MapGadgetExt(tool_gadget[TOOL_CTRL_ID_PLAYER_2], FALSE);
+    MapGadgetExt(tool_gadget[TOOL_CTRL_ID_PLAYER_3], FALSE);
+    MapGadgetExt(tool_gadget[TOOL_CTRL_ID_PLAYER_4], FALSE);
+  }
+#else
+  if (req_state & REQ_ASK)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_NO]);
+  }
+  else if (req_state & REQ_CONFIRM)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]);
+  }
+  else if (req_state & REQ_PLAYER)
+  {
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]);
+    MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]);
+  }
+#endif
+#endif
+
+  ShowEnvelopeRequest(text, req_state, ACTION_OPENING);
+
+#if 0
+  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 (!(req_state & REQUEST_WAIT_FOR_INPUT))
+  {
+    if (game_status == GAME_MODE_PLAYING)
+    {
+      SetPanelBackground();
+      SetDrawBackgroundMask(REDRAW_DOOR_1);
+    }
+    else
+    {
+      SetDrawBackgroundMask(REDRAW_FIELD);
+    }
+
+    return FALSE;
+  }
+
+#if 0
+  if (game_status != GAME_MODE_MAIN)
+    InitAnimation();
+#endif
+
+  SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
+
+  // ---------- handle request buttons ----------
+  result = RequestHandleEvents(req_state);
+
+  if (game_status != GAME_MODE_MAIN)
+    StopAnimation();
+
+  UnmapToolButtons();
+
+  ShowEnvelopeRequest(text, req_state, ACTION_CLOSING);
+
+  RemapAllGadgets();
+
+  if (game_status == GAME_MODE_PLAYING)
+  {
+    SetPanelBackground();
+    SetDrawBackgroundMask(REDRAW_DOOR_1);
+  }
+  else
+  {
+    SetDrawBackgroundMask(REDRAW_FIELD);
+  }
+
+#if defined(NETWORK_AVALIABLE)
+  /* continue network game after request */
+  if (options.network &&
+      game_status == GAME_MODE_PLAYING &&
+      req_state & REQUEST_WAIT_FOR_INPUT)
+    SendToServer_ContinuePlaying();
+#endif
+
+  /* restore deactivated drawing when quick-loading level tape recording */
+  if (tape.playing && tape.deactivate_display)
+    TapeDeactivateDisplayOn();
+
+  return result;
+}
+
+boolean Request(char *text, unsigned int req_state)
+{
+  if (global.use_envelope_request)
+    return RequestEnvelope(text, req_state);
+  else
+    return RequestDoor(text, req_state);
+}
+
+#else  // =====================================================================
+
+boolean Request(char *text, unsigned int req_state)
+{
+  int mx, my, ty, result = -1;
+  unsigned int old_door_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;
+#if 0
+  int max_word_len = 0;
+#endif
+  char *text_ptr;
+  int i;
+
+#if 0
+  global.use_envelope_request = 1;
+#endif
+
+#if 1
+  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);
+
+    if (max_word_len > MAX_REQUEST_LINE_FONT1_LEN)
+    {
+      max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN;
+#if 1
+      font_nr = FONT_TEXT_1;
+#else
+      font_nr = FONT_LEVEL_NUMBER;
+#endif
+
+      break;
+    }
+  }
+#endif
+
+  if (game_status == GAME_MODE_PLAYING)
+  {
+    if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+      BlitScreenToBitmap_EM(backbuffer);
     else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
       BlitScreenToBitmap_SP(backbuffer);
   }
@@ -4339,6 +5115,8 @@ boolean Request(char *text, unsigned int req_state)
   return result;
 }
 
+#endif
+
 unsigned int OpenDoor(unsigned int door_state)
 {
   if (door_state & DOOR_COPY_BACK)
@@ -4756,12 +5534,17 @@ void CreateToolButtons()
     Bitmap *deco_bitmap = None;
     int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0;
     unsigned int event_mask = GD_EVENT_RELEASED;
-    int gd_x   = gfx->src_x;
-    int gd_y   = gfx->src_y;
-    int gd_xp  = gfx->src_x + gfx->pressed_xoffset;
-    int gd_yp  = gfx->src_y + gfx->pressed_yoffset;
+    int dx = DX;
+    int dy = DY;
+    int gd_x = gfx->src_x;
+    int gd_y = gfx->src_y;
+    int gd_xp = gfx->src_x + gfx->pressed_xoffset;
+    int gd_yp = gfx->src_y + gfx->pressed_yoffset;
     int id = i;
 
+    if (global.use_envelope_request)
+      setRequestPosition(&dx, &dy, TRUE);
+
     if (id >= TOOL_CTRL_ID_PLAYER_1 && id <= TOOL_CTRL_ID_PLAYER_4)
     {
       int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
@@ -4774,8 +5557,8 @@ void CreateToolButtons()
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_INFO_TEXT, toolbutton_info[i].infotext,
-                     GDI_X, DX + pos->x,
-                     GDI_Y, DY + pos->y,
+                     GDI_X, dx + pos->x,
+                     GDI_Y, dy + pos->y,
                      GDI_WIDTH, gfx->width,
                      GDI_HEIGHT, gfx->height,
                      GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
index a09eee5a877533500388c3e76b6f80b7337c4be2..dfe2e5728776a6fd8421f2d11d6dc3ab2c082ca4 100644 (file)
 #define REQUEST_WAIT_FOR_INPUT (REQ_ASK | REQ_CONFIRM | REQ_PLAYER)
 
 
-struct RequestButtonInfo
-{
-  struct TextPosInfo yes;
-  struct TextPosInfo no;
-  struct TextPosInfo confirm;
-  struct TextPosInfo player_1;
-  struct TextPosInfo player_2;
-  struct TextPosInfo player_3;
-  struct TextPosInfo player_4;
-};
-
-struct RequestInfo
-{
-  struct RequestButtonInfo button;
-};
-
-extern struct RequestInfo request;
-
-
 void DumpTile(int, int);
 
 void DrawMaskedBorder_FIELD();