rnd-20030105-1-src
[rocksndiamonds.git] / src / screens.c
index 0532cdd19e2f054e9d42df7059653fe2c0f40faf..e99697810143aa152f42d5f42e9cb3e771450e14 100644 (file)
 /* screens in the setup menu */
 #define SETUP_MODE_MAIN                        0
 #define SETUP_MODE_GAME                        1
-#define SETUP_MODE_INPUT               2
-#define SETUP_MODE_SHORTCUT            3
-#define SETUP_MODE_GRAPHICS            4
-#define SETUP_MODE_SOUND               5
-#define SETUP_MODE_ARTWORK             6
-#define SETUP_MODE_CHOOSE_GRAPHICS     7
-#define SETUP_MODE_CHOOSE_SOUNDS       8
-#define SETUP_MODE_CHOOSE_MUSIC                9
-
-#define MAX_SETUP_MODES                        10
+#define SETUP_MODE_EDITOR              2
+#define SETUP_MODE_INPUT               3
+#define SETUP_MODE_SHORTCUT            4
+#define SETUP_MODE_GRAPHICS            5
+#define SETUP_MODE_SOUND               6
+#define SETUP_MODE_ARTWORK             7
+#define SETUP_MODE_CHOOSE_GRAPHICS     8
+#define SETUP_MODE_CHOOSE_SOUNDS       9
+#define SETUP_MODE_CHOOSE_MUSIC                10
+
+#define MAX_SETUP_MODES                        11
 
 /* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
@@ -70,31 +71,42 @@ static void HandleChooseTree(int, int, int, int, int, TreeInfo **);
 static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
 static int setup_mode = SETUP_MODE_MAIN;
 
-static void drawCursorExt(int pos, int color, int graphic)
+static void drawCursorExt(int xpos, int ypos, int color, int graphic)
 {
   static int cursor_array[SCR_FIELDY];
 
-  if (graphic)
-    cursor_array[pos] = graphic;
-
-  graphic = cursor_array[pos];
+  if (xpos == 0)
+  {
+    if (graphic != 0)
+      cursor_array[ypos] = graphic;
+    else
+      graphic = cursor_array[ypos];
+  }
 
   if (color == FC_RED)
     graphic = (graphic == IMG_ARROW_BLUE_LEFT  ? IMG_ARROW_RED_LEFT  :
               graphic == IMG_ARROW_BLUE_RIGHT ? IMG_ARROW_RED_RIGHT :
               IMG_BALL_RED);
 
-  DrawGraphic(0, MENU_SCREEN_START_YPOS + pos, graphic, 0);
+  ypos += MENU_SCREEN_START_YPOS;
+
+  DrawBackground(SX + xpos * 32, SY + ypos * 32, TILEX, TILEY);
+  DrawGraphicThruMask(xpos, ypos, graphic, 0);
 }
 
-static void initCursor(int pos, int graphic)
+static void initCursor(int ypos, int graphic)
 {
-  drawCursorExt(pos, FC_BLUE, graphic);
+  drawCursorExt(0, ypos, FC_BLUE, graphic);
 }
 
-static void drawCursor(int pos, int color)
+static void drawCursor(int ypos, int color)
 {
-  drawCursorExt(pos, color, 0);
+  drawCursorExt(0, ypos, color, 0);
+}
+
+static void drawCursorXY(int xpos, int ypos, int graphic)
+{
+  drawCursorExt(xpos, ypos, -1, graphic);
 }
 
 void DrawHeadline()
@@ -118,7 +130,7 @@ static void ToggleFullscreenIfNeeded()
     setup.fullscreen = video.fullscreen_enabled;
 
     /* redraw background to newly created backbuffer */
-    BlitBitmap(new_graphic_info[IMG_MENU_BACK].bitmap, backbuffer,
+    BlitBitmap(new_graphic_info[IMG_MENU_FRAME].bitmap, backbuffer,
               0,0, WIN_XSIZE,WIN_YSIZE, 0,0);
 
     /* restore old door content */
@@ -140,6 +152,7 @@ void DrawMainMenu()
   KeyboardAutoRepeatOn();
   ActivateJoystick();
   SetDrawDeactivationMask(REDRAW_NONE);
+  SetBackgroundBitmap(new_graphic_info[IMG_MENU_BACKGROUND].bitmap);
   audio.sound_deactivated = FALSE;
 
   /* needed if last screen was the playing screen, invoked from level editor */
@@ -180,7 +193,9 @@ void DrawMainMenu()
   GetPlayerConfig();
   LoadLevel(level_nr);
 
+  SetBackgroundBitmap(new_graphic_info[IMG_MENU_BACKGROUND].bitmap);
   ClearWindow();
+
   DrawHeadline();
   DrawText(SX + 32,    SY + 2*32, name_text, FS_BIG, FC_GREEN);
   DrawText(SX + 6*32,  SY + 2*32, setup.player_name, FS_BIG, FC_RED);
@@ -209,8 +224,13 @@ void DrawMainMenu()
   for(i=0; i<8; i++)
     initCursor(i, (i == 1 || i == 6 ? IMG_ARROW_BLUE_RIGHT : IMG_BALL_BLUE));
 
+#if 0
   DrawGraphic(10, 3, IMG_ARROW_BLUE_LEFT, 0);
   DrawGraphic(14, 3, IMG_ARROW_BLUE_RIGHT, 0);
+#else
+  drawCursorXY(10, 1, IMG_ARROW_BLUE_LEFT);
+  drawCursorXY(14, 1, IMG_ARROW_BLUE_RIGHT);
+#endif
 
   DrawText(SX + 56, SY + 326, "A Game by Artsoft Entertainment",
           FS_SMALL, FC_RED);
@@ -318,10 +338,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
     level_nr = new_level_nr;
 
-    DrawTextExt(drawto, SX + 11 * 32, SY + 3 * 32,
-               int2str(level_nr, 3), FS_BIG, font_color);
-    DrawTextExt(window, SX + 11 * 32, SY + 3 * 32,
-               int2str(level_nr, 3), FS_BIG, font_color);
+    DrawText(SX + 11 * 32, SY + 3 * 32, int2str(level_nr, 3),
+            FS_BIG, font_color);
 
     LoadLevel(level_nr);
     DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, TRUE);
@@ -1183,8 +1201,10 @@ void HandleTypeName(int newxpos, Key key)
   if (newxpos)
   {
     xpos = newxpos;
-    DrawText(SX + 6*32, SY + ypos*32, setup.player_name, FS_BIG, FC_YELLOW);
-    DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0);
+    DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name,
+            FS_BIG, FC_YELLOW);
+    drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED);
+
     return;
   }
 
@@ -1202,23 +1222,23 @@ void HandleTypeName(int newxpos, Key key)
     setup.player_name[xpos] = ascii;
     setup.player_name[xpos + 1] = 0;
     xpos++;
-    DrawTextExt(drawto, SX + 6*32, SY + ypos*32,
-               setup.player_name, FS_BIG, FC_YELLOW);
-    DrawTextExt(window, SX + 6*32, SY + ypos*32,
-               setup.player_name, FS_BIG, FC_YELLOW);
-    DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0);
+
+    DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name,
+            FS_BIG, FC_YELLOW);
+    drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED);
   }
   else if ((key == KSYM_Delete || key == KSYM_BackSpace) && xpos > 0)
   {
     xpos--;
     setup.player_name[xpos] = 0;
-    DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0);
-    DrawGraphic(xpos + 7, ypos, IMG_EMPTY, 0);
+
+    DrawBackground(SX + (xpos + 6) * 32, SY + ypos * 32, 2 * TILEX, TILEY);
+    drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED);
   }
   else if (key == KSYM_Return && xpos > 0)
   {
-    DrawText(SX + 6*32, SY + ypos*32, setup.player_name, FS_BIG, FC_RED);
-    DrawGraphic(xpos + 6, ypos, IMG_EMPTY, 0);
+    DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name, FS_BIG, FC_RED);
+    DrawBackground(SX + (xpos + 6) * 32, SY + ypos * 32, TILEX, TILEY);
 
     SaveSetup();
     game_status = MAINMENU;
@@ -1266,7 +1286,7 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   char *title_string = NULL;
   int offset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : 16);
 
-  ClearRectangle(backbuffer, SX, SY, SXSIZE - 32, SYSIZE);
+  DrawBackground(SX, SY, SXSIZE - 32, SYSIZE);
   redraw_mask |= REDRAW_FIELD;
 
   title_string =
@@ -1301,10 +1321,20 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   }
 
   if (first_entry > 0)
-    DrawGraphic(0, 1, IMG_ARROW_BLUE_UP, 0);
+  {
+    int ypos = 1;
+
+    DrawBackground(SX, SY + ypos * 32, TILEX, TILEY);
+    DrawGraphicThruMask(0, ypos, IMG_ARROW_BLUE_UP, 0);
+  }
 
   if (first_entry + num_page_entries < num_entries)
-    DrawGraphic(0, MAX_MENU_ENTRIES_ON_SCREEN + 1, IMG_ARROW_BLUE_DOWN, 0);
+  {
+    int ypos = MAX_MENU_ENTRIES_ON_SCREEN + 1;
+
+    DrawBackground(SX, SY + ypos * 32, TILEX, TILEY);
+    DrawGraphicThruMask(0, ypos, IMG_ARROW_BLUE_DOWN, 0);
+  }
 }
 
 static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
@@ -1318,7 +1348,7 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
   node_first = getTreeInfoFirstGroupEntry(ti);
   node = getTreeInfoFromPos(node_first, entry_pos);
 
-  ClearRectangle(drawto, SX + 32, SY + 32, SXSIZE - 64, 32);
+  DrawBackground(SX + 32, SY + 32, SXSIZE - 64, 32);
 
   if (node->parent_link)
     DrawTextFCentered(40, FC_RED, "leave group \"%s\"", node->class_desc);
@@ -1670,6 +1700,12 @@ static void execSetupGame()
   DrawSetupScreen();
 }
 
+static void execSetupEditor()
+{
+  setup_mode = SETUP_MODE_EDITOR;
+  DrawSetupScreen();
+}
+
 static void execSetupGraphics()
 {
   setup_mode = SETUP_MODE_GRAPHICS;
@@ -1745,6 +1781,7 @@ static void execSaveAndExitSetup()
 static struct TokenInfo setup_info_main[] =
 {
   { TYPE_ENTER_MENU,   execSetupGame,          "Game Settings"         },
+  { TYPE_ENTER_MENU,   execSetupEditor,        "Editor Settings"       },
   { TYPE_ENTER_MENU,   execSetupGraphics,      "Graphics"              },
   { TYPE_ENTER_MENU,   execSetupSound,         "Sound & Music"         },
   { TYPE_ENTER_MENU,   execSetupArtwork,       "Custom Artwork"        },
@@ -1752,7 +1789,7 @@ static struct TokenInfo setup_info_main[] =
   { TYPE_ENTER_MENU,   execSetupShortcut,      "Key Shortcuts"         },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execExitSetup,          "Exit"                  },
-  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and exit"         },
+  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and Exit"         },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1763,7 +1800,24 @@ static struct TokenInfo setup_info_game[] =
   { TYPE_SWITCH,       &setup.time_limit,      "Timelimit:"            },
   { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record:"          },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
+  { 0,                 NULL,                   NULL                    }
+};
+
+static struct TokenInfo setup_info_editor[] =
+{
+  { TYPE_STRING,       NULL,                   "Offer Special Elements:"},
+  { TYPE_SWITCH,       &setup.editor.el_boulderdash,   "BoulderDash:"  },
+  { TYPE_SWITCH,       &setup.editor.el_emerald_mine,  "Emerald Mine:" },
+  { TYPE_SWITCH,       &setup.editor.el_more,          "More:"         },
+  { TYPE_SWITCH,       &setup.editor.el_sokoban,       "Sokoban:"      },
+  { TYPE_SWITCH,       &setup.editor.el_supaplex,      "Supaplex:"     },
+  { TYPE_SWITCH,       &setup.editor.el_diamond_caves, "Diamd. Caves:" },
+  { TYPE_SWITCH,       &setup.editor.el_dx_boulderdash,"DX Boulderd.:" },
+  { TYPE_SWITCH,       &setup.editor.el_chars,         "Characters:"   },
+  { TYPE_SWITCH,       &setup.editor.el_custom,        "Custom:"       },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1779,7 +1833,7 @@ static struct TokenInfo setup_info_graphics[] =
   { TYPE_SWITCH,       &setup.quick_doors,     "Quick Doors:"          },
   { TYPE_SWITCH,       &setup.toons,           "Toons:"                },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1791,7 +1845,7 @@ static struct TokenInfo setup_info_sound[] =
   { TYPE_SWITCH,       &setup.sound_loops,     "Sound Loops:"          },
   { TYPE_SWITCH,       &setup.sound_music,     "Game Music:"           },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1809,7 +1863,7 @@ static struct TokenInfo setup_info_artwork[] =
   { TYPE_YES_NO,       &setup.override_level_sounds,   "Sounds:"       },
   { TYPE_YES_NO,       &setup.override_level_music,    "Music:"        },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1824,7 +1878,7 @@ static struct TokenInfo setup_info_shortcut[] =
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_YES_NO,       &setup.ask_on_escape,   "Ask on Esc:"           },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
@@ -1957,6 +2011,11 @@ static void DrawSetupScreen_Generic()
     setup_info = setup_info_game;
     title_string = "Setup Game";
   }
+  else if (setup_mode == SETUP_MODE_EDITOR)
+  {
+    setup_info = setup_info_editor;
+    title_string = "Setup Editor";
+  }
   else if (setup_mode == SETUP_MODE_GRAPHICS)
   {
     setup_info = setup_info_graphics;
@@ -2020,12 +2079,18 @@ static void DrawSetupScreen_Generic()
 void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
 {
   static int choice_store[MAX_SETUP_MODES];
-  int choice = choice_store[setup_mode];
+  int choice = choice_store[setup_mode];       /* always starts with 0 */
   int x = 0;
   int y = choice;
 
   if (button == MB_MENU_INITIALIZE)
   {
+    /* advance to first valid menu entry */
+    while (choice < num_setup_info &&
+          (setup_info[choice].type & TYPE_SKIP_ENTRY))
+      choice++;
+    choice_store[setup_mode] = choice;
+
     drawCursor(choice, FC_RED);
     return;
   }
@@ -2117,12 +2182,12 @@ void DrawSetupScreen_Input()
   initCursor(2, IMG_ARROW_BLUE_RIGHT);
   initCursor(13, IMG_ARROW_BLUE_LEFT);
 
-  DrawGraphic(10, MENU_SCREEN_START_YPOS, IMG_ARROW_BLUE_LEFT, 0);
-  DrawGraphic(12, MENU_SCREEN_START_YPOS, IMG_ARROW_BLUE_RIGHT, 0);
+  drawCursorXY(10, 0, IMG_ARROW_BLUE_LEFT);
+  drawCursorXY(12, 0, IMG_ARROW_BLUE_RIGHT);
 
   DrawText(SX+32, SY+2*32, "Player:", FS_BIG, FC_GREEN);
   DrawText(SX+32, SY+3*32, "Device:", FS_BIG, FC_GREEN);
-  DrawText(SX+32, SY+15*32, "Exit", FS_BIG, FC_GREEN);
+  DrawText(SX+32, SY+15*32, "Back", FS_BIG, FC_GREEN);
 
 #if 0
   DeactivateJoystickForCalibration();
@@ -2184,7 +2249,7 @@ static void drawPlayerSetupInputInfo(int player_nr)
   custom_key = setup.input[player_nr].key;
 
   DrawText(SX+11*32, SY+2*32, int2str(player_nr + 1, 1), FS_BIG, FC_RED);
-  DrawGraphic(8, 2, PLAYER_NR_GFX(IMG_PLAYER1, player_nr), 0);
+  DrawGraphicThruMask(8, 2, PLAYER_NR_GFX(IMG_PLAYER1, player_nr), 0);
 
   if (setup.input[player_nr].use_joystick)
   {
@@ -2202,10 +2267,10 @@ static void drawPlayerSetupInputInfo(int player_nr)
   }
 
   DrawText(SX+32, SY+5*32, "Actual Settings:", FS_BIG, FC_GREEN);
-  DrawGraphic(1, 6, IMG_ARROW_BLUE_LEFT, 0);
-  DrawGraphic(1, 7, IMG_ARROW_BLUE_RIGHT, 0);
-  DrawGraphic(1, 8, IMG_ARROW_BLUE_UP, 0);
-  DrawGraphic(1, 9, IMG_ARROW_BLUE_DOWN, 0);
+  drawCursorXY(1, 4, IMG_ARROW_BLUE_LEFT);
+  drawCursorXY(1, 5, IMG_ARROW_BLUE_RIGHT);
+  drawCursorXY(1, 6, IMG_ARROW_BLUE_UP);
+  drawCursorXY(1, 7, IMG_ARROW_BLUE_DOWN);
   DrawText(SX+2*32, SY+6*32, ":", FS_BIG, FC_BLUE);
   DrawText(SX+2*32, SY+7*32, ":", FS_BIG, FC_BLUE);
   DrawText(SX+2*32, SY+8*32, ":", FS_BIG, FC_BLUE);
@@ -2897,6 +2962,14 @@ void CreateScreenGadgets()
   CreateScreenScrollbars();
 }
 
+void FreeScreenGadgets()
+{
+  int i;
+
+  for (i=0; i<NUM_SCREEN_GADGETS; i++)
+    FreeGadget(screen_gadget[i]);
+}
+
 void MapChooseTreeGadgets(TreeInfo *ti)
 {
   int num_entries = numTreeInfoInGroup(ti);