/***********************************************************
* Rocks'n'Diamonds -- McDuffin Strikes Back! *
*----------------------------------------------------------*
-* (c) 1995-2001 Artsoft Entertainment *
+* (c) 1995-2002 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
/* screens in the setup menu */
#define SETUP_MODE_MAIN 0
-#define SETUP_MODE_INPUT 1
-#define SETUP_MODE_SHORTCUT 2
-#define SETUP_MODE_GRAPHICS 3
-#define SETUP_MODE_SOUND 4
-
-#define MAX_SETUP_MODES 5
+#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
/* for input setup functions */
#define SETUPINPUT_SCREEN_POS_START 0
static void HandleSetupScreen_Input(int, int, int, int, int);
static void CustomizeKeyboard(int);
static void CalibrateJoystick(int);
+static void execSetupArtwork(void);
+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)
{
UnmapAllGadgets();
FadeSounds();
KeyboardAutoRepeatOn();
- ActivateJoystickIfAvailable();
+ ActivateJoystick();
SetDrawDeactivationMask(REDRAW_NONE);
+ audio.sound_deactivated = FALSE;
/* needed if last screen was the playing screen, invoked from level editor */
if (level_editor_test_game)
/* needed if last screen was the setup screen and fullscreen state changed */
ToggleFullscreenIfNeeded();
+ /* needed if last screen (level choice) changed graphics, sounds or music */
+ ReloadCustomArtwork();
+
#ifdef TARGET_SDL
SetDrawtoField(DRAW_BACKBUFFER);
#endif
/* leveldir_current may be invalid (level group, parent link) */
if (!validLevelSeries(leveldir_current))
- leveldir_current = getFirstValidLevelSeries(leveldir_last_valid);
+ leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid);
/* store valid level series information */
leveldir_last_valid = leveldir_current;
#if 0
ClearEventQueue();
#endif
-
}
static void gotoTopLevelDir()
else if (y == 6)
{
game_status = SETUP;
+ setup_mode = SETUP_MODE_MAIN;
DrawSetupScreen();
}
else if (y == 7)
FadeToFront();
InitAnimation();
- PlaySoundLoop(SND_RHYTHMLOOP);
+ PlaySoundLoop(SND_MENU_INFO_SCREEN);
}
void HandleHelpScreen(int button)
for(i=0;i<MAX_HELPSCREEN_ELS;i++)
helpscreen_step[i] = helpscreen_frame[i] = helpscreen_delay[i] = 0;
helpscreen_state++;
- DrawHelpScreenElText(helpscreen_state*MAX_HELPSCREEN_ELS);
- DrawHelpScreenElAction(helpscreen_state*MAX_HELPSCREEN_ELS);
+ DrawHelpScreenElText(helpscreen_state * MAX_HELPSCREEN_ELS);
+ DrawHelpScreenElAction(helpscreen_state * MAX_HELPSCREEN_ELS);
}
else if (helpscreen_state <
num_helpscreen_els_pages + num_helpscreen_music - 1)
}
else
{
- if (DelayReached(&hs_delay,GAME_FRAME_DELAY * 2))
+ if (DelayReached(&hs_delay, GAME_FRAME_DELAY * 2))
{
- if (helpscreen_state<num_helpscreen_els_pages)
- DrawHelpScreenElAction(helpscreen_state*MAX_HELPSCREEN_ELS);
+ if (helpscreen_state < num_helpscreen_els_pages)
+ DrawHelpScreenElAction(helpscreen_state * MAX_HELPSCREEN_ELS);
}
+
+ /* !!! workaround for playing "music" that is really a sound loop (and
+ must therefore periodically be reactivated with the current sound
+ engine !!! */
+ PlaySoundLoop(SND_MENU_INFO_SCREEN);
+
DoAnimation();
}
BackToFront();
}
-void DrawChooseLevel()
+static void DrawChooseTree(TreeInfo **ti_ptr)
{
UnmapAllGadgets();
CloseDoor(DOOR_CLOSE_2);
ClearWindow();
- HandleChooseLevel(0,0, 0,0, MB_MENU_INITIALIZE);
- MapChooseLevelGadgets();
+ HandleChooseTree(0,0, 0,0, MB_MENU_INITIALIZE, ti_ptr);
+ MapChooseTreeGadgets(*ti_ptr);
FadeToFront();
InitAnimation();
}
-static void AdjustChooseLevelScrollbar(int id, int first_entry)
+static void AdjustChooseTreeScrollbar(int id, int first_entry, TreeInfo *ti)
{
struct GadgetInfo *gi = screen_gadget[id];
int items_max, items_visible, item_position;
- items_max = numTreeInfoInGroup(leveldir_current);
+ items_max = numTreeInfoInGroup(ti);
items_visible = MAX_MENU_ENTRIES_ON_SCREEN - 1;
item_position = first_entry;
GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
}
-static void drawChooseLevelList(int first_entry, int num_page_entries)
+static void drawChooseTreeList(int first_entry, int num_page_entries,
+ TreeInfo *ti)
{
int i;
char buffer[SCR_FIELDX * 2];
int max_buffer_len = (SCR_FIELDX - 2) * 2;
- int num_leveldirs = numTreeInfoInGroup(leveldir_current);
+ int num_entries = numTreeInfoInGroup(ti);
+ char *title_string = NULL;
+ int offset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : 16);
ClearRectangle(backbuffer, SX, SY, SXSIZE - 32, SYSIZE);
redraw_mask |= REDRAW_FIELD;
- DrawText(SX, SY, "Level Directories", FS_BIG, FC_GREEN);
+ title_string =
+ (ti->type == TREE_TYPE_LEVEL_DIR ? "Level Directories" :
+ ti->type == TREE_TYPE_GRAPHICS_DIR ? "Custom Graphics" :
+ ti->type == TREE_TYPE_SOUNDS_DIR ? "Custom Sounds" :
+ ti->type == TREE_TYPE_MUSIC_DIR ? "Custom Music" : "");
+
+ DrawText(SX + offset, SY + offset, title_string, FS_BIG,
+ (ti->type == TREE_TYPE_LEVEL_DIR ? FC_GREEN : FC_YELLOW));
for(i=0; i<num_page_entries; i++)
{
- LevelDirTree *node, *node_first;
- int leveldir_pos = first_entry + i;
+ TreeInfo *node, *node_first;
+ int entry_pos = first_entry + i;
int ypos = MENU_SCREEN_START_YPOS + i;
- node_first = getTreeInfoFirstGroupEntry(leveldir_current);
- node = getTreeInfoFromPos(node_first, leveldir_pos);
+ node_first = getTreeInfoFirstGroupEntry(ti);
+ node = getTreeInfoFromPos(node_first, entry_pos);
strncpy(buffer, node->name , max_buffer_len);
buffer[max_buffer_len] = '\0';
if (first_entry > 0)
DrawGraphic(0, 1, GFX_ARROW_BLUE_UP);
- if (first_entry + num_page_entries < num_leveldirs)
+ if (first_entry + num_page_entries < num_entries)
DrawGraphic(0, MAX_MENU_ENTRIES_ON_SCREEN + 1, GFX_ARROW_BLUE_DOWN);
}
-static void drawChooseLevelInfo(int leveldir_pos)
+static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
{
- LevelDirTree *node, *node_first;
+ TreeInfo *node, *node_first;
int x, last_redraw_mask = redraw_mask;
- node_first = getTreeInfoFirstGroupEntry(leveldir_current);
- node = getTreeInfoFromPos(node_first, leveldir_pos);
+ if (ti->type != TREE_TYPE_LEVEL_DIR)
+ return;
+
+ node_first = getTreeInfoFirstGroupEntry(ti);
+ node = getTreeInfoFromPos(node_first, entry_pos);
ClearRectangle(drawto, SX + 32, SY + 32, SXSIZE - 64, 32);
DrawTextFCentered(40, FC_RED, "leave group \"%s\"", node->class_desc);
else if (node->level_group)
DrawTextFCentered(40, FC_RED, "enter group \"%s\"", node->class_desc);
- else
+ else if (ti->type == TREE_TYPE_LEVEL_DIR)
DrawTextFCentered(40, FC_RED, "%3d levels (%s)",
node->levels, node->class_desc);
MarkTileDirty(x, 1);
}
-void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
+static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
+ TreeInfo **ti_ptr)
{
static unsigned long choose_delay = 0;
+ TreeInfo *ti = *ti_ptr;
int x = 0;
- int y = leveldir_current->cl_cursor;
+ int y = ti->cl_cursor;
int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
- int num_leveldirs = numTreeInfoInGroup(leveldir_current);
+ int num_entries = numTreeInfoInGroup(ti);
int num_page_entries;
- if (num_leveldirs <= MAX_MENU_ENTRIES_ON_SCREEN)
- num_page_entries = num_leveldirs;
+ if (num_entries <= MAX_MENU_ENTRIES_ON_SCREEN)
+ num_page_entries = num_entries;
else
num_page_entries = MAX_MENU_ENTRIES_ON_SCREEN - 1;
if (button == MB_MENU_INITIALIZE)
{
- int leveldir_pos = posTreeInfo(leveldir_current);
+ int entry_pos = posTreeInfo(ti);
- if (leveldir_current->cl_first == -1)
+ if (ti->cl_first == -1)
{
- leveldir_current->cl_first = MAX(0, leveldir_pos - num_page_entries + 1);
- leveldir_current->cl_cursor =
- leveldir_pos - leveldir_current->cl_first;
+ ti->cl_first = MAX(0, entry_pos - num_page_entries + 1);
+ ti->cl_cursor =
+ entry_pos - ti->cl_first;
}
if (dx == 999) /* first entry is set by scrollbar position */
- leveldir_current->cl_first = dy;
+ ti->cl_first = dy;
else
- AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
- leveldir_current->cl_first);
+ AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
+ ti->cl_first, ti);
- drawChooseLevelList(leveldir_current->cl_first, num_page_entries);
- drawChooseLevelInfo(leveldir_current->cl_first +
- leveldir_current->cl_cursor);
- drawCursor(leveldir_current->cl_cursor, FC_RED);
+ drawChooseTreeList(ti->cl_first, num_page_entries, ti);
+ drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti);
+ drawCursor(ti->cl_cursor, FC_RED);
return;
}
else if (button == MB_MENU_LEAVE)
{
- if (leveldir_current->node_parent)
+ if (ti->node_parent)
+ {
+ *ti_ptr = ti->node_parent;
+ DrawChooseTree(ti_ptr);
+ }
+ else if (game_status == SETUP)
{
- leveldir_current = leveldir_current->node_parent;
- DrawChooseLevel();
+ execSetupArtwork();
}
else
{
game_status = MAINMENU;
DrawMainMenu();
}
+
return;
}
else if (dx || dy) /* keyboard input */
{
if (dy)
- y = leveldir_current->cl_cursor + dy;
+ y = ti->cl_cursor + dy;
if (ABS(dy) == SCR_FIELDY) /* handle KSYM_Page_Up, KSYM_Page_Down */
{
if (x == 0 && y == -1)
{
- if (leveldir_current->cl_first > 0 &&
+ if (ti->cl_first > 0 &&
(dy || DelayReached(&choose_delay, GADGET_FRAME_DELAY)))
{
- leveldir_current->cl_first -= step;
- if (leveldir_current->cl_first < 0)
- leveldir_current->cl_first = 0;
-
- drawChooseLevelList(leveldir_current->cl_first, num_page_entries);
- drawChooseLevelInfo(leveldir_current->cl_first +
- leveldir_current->cl_cursor);
- drawCursor(leveldir_current->cl_cursor, FC_RED);
- AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
- leveldir_current->cl_first);
+ ti->cl_first -= step;
+ if (ti->cl_first < 0)
+ ti->cl_first = 0;
+
+ drawChooseTreeList(ti->cl_first, num_page_entries, ti);
+ drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti);
+ drawCursor(ti->cl_cursor, FC_RED);
+ AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
+ ti->cl_first, ti);
return;
}
}
else if (x == 0 && y > num_page_entries - 1)
{
- if (leveldir_current->cl_first + num_page_entries < num_leveldirs &&
+ if (ti->cl_first + num_page_entries < num_entries &&
(dy || DelayReached(&choose_delay, GADGET_FRAME_DELAY)))
{
- leveldir_current->cl_first += step;
- if (leveldir_current->cl_first + num_page_entries > num_leveldirs)
- leveldir_current->cl_first = MAX(0, num_leveldirs - num_page_entries);
-
- drawChooseLevelList(leveldir_current->cl_first, num_page_entries);
- drawChooseLevelInfo(leveldir_current->cl_first +
- leveldir_current->cl_cursor);
- drawCursor(leveldir_current->cl_cursor, FC_RED);
- AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
- leveldir_current->cl_first);
+ ti->cl_first += step;
+ if (ti->cl_first + num_page_entries > num_entries)
+ ti->cl_first = MAX(0, num_entries - num_page_entries);
+
+ drawChooseTreeList(ti->cl_first, num_page_entries, ti);
+ drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti);
+ drawCursor(ti->cl_cursor, FC_RED);
+ AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
+ ti->cl_first, ti);
return;
}
}
if (dx == 1)
{
- LevelDirTree *node_first, *node_cursor;
- int leveldir_pos = leveldir_current->cl_first + y;
+ TreeInfo *node_first, *node_cursor;
+ int entry_pos = ti->cl_first + y;
- node_first = getTreeInfoFirstGroupEntry(leveldir_current);
- node_cursor = getTreeInfoFromPos(node_first, leveldir_pos);
+ node_first = getTreeInfoFirstGroupEntry(ti);
+ node_cursor = getTreeInfoFromPos(node_first, entry_pos);
if (node_cursor->node_group)
{
- node_cursor->cl_first = leveldir_current->cl_first;
- node_cursor->cl_cursor = leveldir_current->cl_cursor;
- leveldir_current = node_cursor->node_group;
- DrawChooseLevel();
+ node_cursor->cl_first = ti->cl_first;
+ node_cursor->cl_cursor = ti->cl_cursor;
+ *ti_ptr = node_cursor->node_group;
+ DrawChooseTree(ti_ptr);
return;
}
}
- else if (dx == -1 && leveldir_current->node_parent)
+ else if (dx == -1 && ti->node_parent)
{
- leveldir_current = leveldir_current->node_parent;
- DrawChooseLevel();
+ *ti_ptr = ti->node_parent;
+ DrawChooseTree(ti_ptr);
return;
}
{
if (button)
{
- if (y != leveldir_current->cl_cursor)
+ if (y != ti->cl_cursor)
{
drawCursor(y, FC_RED);
- drawCursor(leveldir_current->cl_cursor, FC_BLUE);
- drawChooseLevelInfo(leveldir_current->cl_first + y);
- leveldir_current->cl_cursor = y;
+ drawCursor(ti->cl_cursor, FC_BLUE);
+ drawChooseTreeInfo(ti->cl_first + y, ti);
+ ti->cl_cursor = y;
}
}
else
{
- LevelDirTree *node_first, *node_cursor;
- int leveldir_pos = leveldir_current->cl_first + y;
+ TreeInfo *node_first, *node_cursor;
+ int entry_pos = ti->cl_first + y;
- node_first = getTreeInfoFirstGroupEntry(leveldir_current);
- node_cursor = getTreeInfoFromPos(node_first, leveldir_pos);
+ node_first = getTreeInfoFirstGroupEntry(ti);
+ node_cursor = getTreeInfoFromPos(node_first, entry_pos);
if (node_cursor->node_group)
{
- node_cursor->cl_first = leveldir_current->cl_first;
- node_cursor->cl_cursor = leveldir_current->cl_cursor;
- leveldir_current = node_cursor->node_group;
-
- DrawChooseLevel();
+ node_cursor->cl_first = ti->cl_first;
+ node_cursor->cl_cursor = ti->cl_cursor;
+ *ti_ptr = node_cursor->node_group;
+ DrawChooseTree(ti_ptr);
}
else if (node_cursor->parent_link)
{
- leveldir_current = node_cursor->node_parent;
-
- DrawChooseLevel();
+ *ti_ptr = node_cursor->node_parent;
+ DrawChooseTree(ti_ptr);
}
else
{
- node_cursor->cl_first = leveldir_current->cl_first;
- node_cursor->cl_cursor = leveldir_current->cl_cursor;
- leveldir_current = node_cursor;
+ node_cursor->cl_first = ti->cl_first;
+ node_cursor->cl_cursor = ti->cl_cursor;
+ *ti_ptr = node_cursor;
- LoadLevelSetup_SeriesInfo();
+ if (ti->type == TREE_TYPE_LEVEL_DIR)
+ {
+ LoadLevelSetup_SeriesInfo();
- SaveLevelSetup_LastSeries();
- SaveLevelSetup_SeriesInfo();
- TapeErase();
+ SaveLevelSetup_LastSeries();
+ SaveLevelSetup_SeriesInfo();
+ TapeErase();
+ }
- game_status = MAINMENU;
- DrawMainMenu();
+ if (game_status == SETUP)
+ {
+ execSetupArtwork();
+ }
+ else
+ {
+ game_status = MAINMENU;
+ DrawMainMenu();
+ }
}
}
}
BackToFront();
- if (game_status == CHOOSELEVEL)
+ if (game_status == CHOOSELEVEL || game_status == SETUP)
DoAnimation();
}
+void DrawChooseLevel()
+{
+ DrawChooseTree(&leveldir_current);
+}
+
+void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
+{
+ HandleChooseTree(mx, my, dx, dy, button, &leveldir_current);
+}
+
void DrawHallOfFame(int highlight_position)
{
UnmapAllGadgets();
FadeToFront();
InitAnimation();
HandleHallOfFame(highlight_position,0, 0,0, MB_MENU_INITIALIZE);
- PlaySound(SND_HALLOFFAME);
+ PlaySound(SND_MENU_HALL_OF_FAME);
}
static void drawHallOfFameList(int first_entry, int highlight_position)
if (button_released)
{
- FadeSound(SND_HALLOFFAME);
+ FadeSound(SND_MENU_HALL_OF_FAME);
game_status = MAINMENU;
DrawMainMenu();
}
static struct TokenInfo *setup_info;
static int num_setup_info;
-static int setup_mode = SETUP_MODE_MAIN;
+
+static char *graphics_set_name;
+static char *sounds_set_name;
+static char *music_set_name;
static void execSetupMain()
{
DrawSetupScreen();
}
+static void execSetupGame()
+{
+ setup_mode = SETUP_MODE_GAME;
+ DrawSetupScreen();
+}
+
+static void execSetupGraphics()
+{
+ setup_mode = SETUP_MODE_GRAPHICS;
+ DrawSetupScreen();
+}
+
static void execSetupSound()
{
setup_mode = SETUP_MODE_SOUND;
DrawSetupScreen();
}
+static void execSetupArtwork()
+{
+ /* needed if last screen (setup choice) changed graphics, sounds or music */
+ ReloadCustomArtwork();
+
+ setup.graphics_set = artwork.gfx_current->identifier;
+ setup.sounds_set = artwork.snd_current->identifier;
+ setup.music_set = artwork.mus_current->identifier;
+
+ /* needed for displaying artwork name instead of artwork identifier */
+ graphics_set_name = artwork.gfx_current->name;
+ sounds_set_name = artwork.snd_current->name;
+ music_set_name = artwork.mus_current->name;
+
+ setup_mode = SETUP_MODE_ARTWORK;
+ DrawSetupScreen();
+}
+
+static void execSetupChooseGraphics()
+{
+ setup_mode = SETUP_MODE_CHOOSE_GRAPHICS;
+ DrawSetupScreen();
+}
+
+static void execSetupChooseSounds()
+{
+ setup_mode = SETUP_MODE_CHOOSE_SOUNDS;
+ DrawSetupScreen();
+}
+
+static void execSetupChooseMusic()
+{
+ setup_mode = SETUP_MODE_CHOOSE_MUSIC;
+ DrawSetupScreen();
+}
+
static void execSetupInput()
{
setup_mode = SETUP_MODE_INPUT;
static struct TokenInfo setup_info_main[] =
{
- { TYPE_ENTER_MENU, execSetupSound, "Sound Setup" },
- { TYPE_ENTER_MENU, execSetupInput, "Input Devices" },
- { TYPE_ENTER_MENU, execSetupShortcut, "Key Shortcuts" },
-#if 0
- { TYPE_EMPTY, NULL, "" },
- { TYPE_SWITCH, &setup.sound, "Sound:", },
- { TYPE_SWITCH, &setup.sound_loops, " Sound Loops:" },
- { TYPE_SWITCH, &setup.sound_music, " Game Music:" },
-#endif
- { TYPE_SWITCH, &setup.toons, "Toons:" },
-#if 0
- { TYPE_SWITCH, &setup.double_buffering,"Buffered gfx:" },
-#endif
- { TYPE_SWITCH, &setup.scroll_delay, "Scroll Delay:" },
- { TYPE_SWITCH, &setup.soft_scrolling, "Soft Scroll.:" },
+ { TYPE_ENTER_MENU, execSetupGame, "Game Settings" },
+ { TYPE_ENTER_MENU, execSetupGraphics, "Graphics" },
+ { TYPE_ENTER_MENU, execSetupSound, "Sound & Music" },
+ { TYPE_ENTER_MENU, execSetupArtwork, "Custom Artwork" },
+ { TYPE_ENTER_MENU, execSetupInput, "Input Devices" },
+ { TYPE_ENTER_MENU, execSetupShortcut, "Key Shortcuts" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execExitSetup, "Exit" },
+ { TYPE_LEAVE_MENU, execSaveAndExitSetup, "Save and exit" },
+ { 0, NULL, NULL }
+};
+
+static struct TokenInfo setup_info_game[] =
+{
+ { TYPE_SWITCH, &setup.team_mode, "Team-Mode:" },
+ { TYPE_SWITCH, &setup.handicap, "Handicap:" },
+ { TYPE_SWITCH, &setup.time_limit, "Timelimit:" },
+ { TYPE_SWITCH, &setup.autorecord, "Auto-Record:" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execSetupMain, "Exit" },
+ { 0, NULL, NULL }
+};
+
+static struct TokenInfo setup_info_graphics[] =
+{
+ { TYPE_SWITCH, &setup.fullscreen, "Fullscreen:" },
+ { TYPE_SWITCH, &setup.scroll_delay, "Scroll Delay:" },
+ { TYPE_SWITCH, &setup.soft_scrolling, "Soft Scroll.:" },
#if 0
- { TYPE_SWITCH, &setup.fading, "Fading:" },
+ { TYPE_SWITCH, &setup.double_buffering,"Buffered gfx:" },
+ { TYPE_SWITCH, &setup.fading, "Fading:" },
#endif
- { TYPE_SWITCH, &setup.fullscreen, "Fullscreen:" },
- { TYPE_SWITCH, &setup.quick_doors, "Quick Doors:" },
- { TYPE_SWITCH, &setup.autorecord, "Auto-Record:" },
- { TYPE_SWITCH, &setup.team_mode, "Team-Mode:" },
- { TYPE_SWITCH, &setup.handicap, "Handicap:" },
- { TYPE_SWITCH, &setup.time_limit, "Timelimit:" },
- { TYPE_EMPTY, NULL, "" },
- { TYPE_LEAVE_MENU, execExitSetup, "Exit" },
- { TYPE_LEAVE_MENU, execSaveAndExitSetup, "Save and exit" },
- { 0, NULL, NULL }
+ { TYPE_SWITCH, &setup.quick_doors, "Quick Doors:" },
+ { TYPE_SWITCH, &setup.toons, "Toons:" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execSetupMain, "Exit" },
+ { 0, NULL, NULL }
};
static struct TokenInfo setup_info_sound[] =
{
- { TYPE_SWITCH, &setup.sound, "Sound:", },
- { TYPE_EMPTY, NULL, "" },
- { TYPE_SWITCH, &setup.sound_simple, "Simple Sound:" },
- { TYPE_SWITCH, &setup.sound_loops, "Sound Loops:" },
- { TYPE_SWITCH, &setup.sound_music, "Game Music:" },
- { TYPE_EMPTY, NULL, "" },
- { TYPE_LEAVE_MENU, execSetupMain, "Exit" },
- { 0, NULL, NULL }
+ { TYPE_SWITCH, &setup.sound, "Sound:", },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_SWITCH, &setup.sound_simple, "Simple Sound:" },
+ { TYPE_SWITCH, &setup.sound_loops, "Sound Loops:" },
+ { TYPE_SWITCH, &setup.sound_music, "Game Music:" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execSetupMain, "Exit" },
+ { 0, NULL, NULL }
+};
+
+static struct TokenInfo setup_info_artwork[] =
+{
+ { TYPE_ENTER_MENU, execSetupChooseGraphics,"Custom Graphics" },
+ { TYPE_STRING, &graphics_set_name, "" },
+ { TYPE_ENTER_MENU, execSetupChooseSounds, "Custom Sounds" },
+ { TYPE_STRING, &sounds_set_name, "" },
+ { TYPE_ENTER_MENU, execSetupChooseMusic, "Custom Music" },
+ { TYPE_STRING, &music_set_name, "" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_STRING, NULL, "Override Level Artwork:"},
+ { TYPE_YES_NO, &setup.override_level_graphics, "Graphics:" },
+ { TYPE_YES_NO, &setup.override_level_sounds, "Sounds:" },
+ { TYPE_YES_NO, &setup.override_level_music, "Music:" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execSetupMain, "Exit" },
+ { 0, NULL, NULL }
};
static struct TokenInfo setup_info_shortcut[] =
{ TYPE_KEY, &setup.shortcut.save_game, "" },
{ TYPE_KEYTEXT, NULL, "Quick Load Game:", },
{ TYPE_KEY, &setup.shortcut.load_game, "" },
+ { TYPE_KEYTEXT, NULL, "Toggle Pause:", },
+ { TYPE_KEY, &setup.shortcut.toggle_pause, "" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_YES_NO, &setup.ask_on_escape, "Ask on Esc:" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execSetupMain, "Exit" },
{ 0, NULL, NULL }
{
int xpos = MENU_SCREEN_VALUE_XPOS;
int ypos = MENU_SCREEN_START_YPOS + pos;
- int value_color = FC_YELLOW;
+ int font_size = FS_BIG;
+ int font_color = FC_YELLOW;
char *value_string = getSetupValue(setup_info[pos].type & ~TYPE_GHOSTED,
setup_info[pos].value);
+ if (value_string == NULL)
+ return;
+
if (setup_info[pos].type & TYPE_KEY)
{
xpos = 3;
if (setup_info[pos].type & TYPE_QUERY)
{
value_string = "<press key>";
- value_color = FC_RED;
+ font_color = FC_RED;
}
}
+ else if (setup_info[pos].type & TYPE_STRING)
+ {
+ int max_value_len = (SCR_FIELDX - 2) * 2;
+
+ xpos = 1;
+ font_size = FS_MEDIUM;
- if (setup_info[pos].type & TYPE_BOOLEAN_STYLE &&
- !*(boolean *)(setup_info[pos].value))
- value_color = FC_BLUE;
+ if (strlen(value_string) > max_value_len)
+ value_string[max_value_len] = '\0';
+ }
+ else if (setup_info[pos].type & TYPE_BOOLEAN_STYLE &&
+ !*(boolean *)(setup_info[pos].value))
+ font_color = FC_BLUE;
DrawText(SX + xpos * 32, SY + ypos * 32,
(xpos == 3 ? " " : " "), FS_BIG, FC_YELLOW);
- DrawText(SX + xpos * 32, SY + ypos * 32, value_string, FS_BIG, value_color);
+ DrawText(SX + xpos * 32, SY + ypos * 32, value_string, font_size,font_color);
}
static void changeSetupValue(int pos)
setup_info = setup_info_main;
title_string = "Setup";
}
+ else if (setup_mode == SETUP_MODE_GAME)
+ {
+ setup_info = setup_info_game;
+ title_string = "Setup Game";
+ }
+ else if (setup_mode == SETUP_MODE_GRAPHICS)
+ {
+ setup_info = setup_info_graphics;
+ title_string = "Setup Graphics";
+ }
else if (setup_mode == SETUP_MODE_SOUND)
{
setup_info = setup_info_sound;
title_string = "Setup Sound";
}
+ else if (setup_mode == SETUP_MODE_ARTWORK)
+ {
+ setup_info = setup_info_artwork;
+ title_string = "Custom Artwork";
+ }
else if (setup_mode == SETUP_MODE_SHORTCUT)
{
setup_info = setup_info_shortcut;
{
void *value_ptr = setup_info[i].value;
int ypos = MENU_SCREEN_START_YPOS + i;
+ int font_size = FS_BIG;
/* set some entries to "unchangeable" according to other variables */
if ((value_ptr == &setup.sound && !audio.sound_available) ||
(value_ptr == &setup.sound_loops && !audio.loops_available) ||
(value_ptr == &setup.sound_music && !audio.music_available) ||
- (value_ptr == &setup.sound_music && !audio.music_available) ||
(value_ptr == &setup.fullscreen && !video.fullscreen_available))
setup_info[i].type |= TYPE_GHOSTED;
- DrawText(SX + 32, SY + ypos * 32, setup_info[i].text, FS_BIG, FC_GREEN);
+ if (setup_info[i].type & TYPE_STRING)
+ font_size = FS_MEDIUM;
+
+ DrawText(SX + 32, SY + ypos * 32, setup_info[i].text, font_size, FC_GREEN);
if (setup_info[i].type & TYPE_ENTER_MENU)
initCursor(i, GFX_ARROW_BLUE_RIGHT);
}
else if (!(setup_info[y].type & TYPE_GHOSTED))
{
-#if 0
- if (setup_info[y].type & TYPE_BOOLEAN_STYLE)
- {
- boolean new_value = !*(boolean *)(setup_info[y].value);
-
- *(boolean *)setup_info[y].value = new_value;
- drawSetupValue(y);
- }
- else if (setup_info[y].type == TYPE_KEYTEXT &&
- setup_info[y + 1].type == TYPE_KEY)
- {
- changeSetupValue(y + 1);
- }
- else if (setup_info[y].type & TYPE_ENTER_OR_LEAVE_MENU)
- {
- void (*menu_callback_function)(void) = setup_info[choice].value;
-
- menu_callback_function();
- }
-#else
if (setup_info[y].type & TYPE_ENTER_OR_LEAVE_MENU)
{
void (*menu_callback_function)(void) = setup_info[choice].value;
if (setup_info[y].type & TYPE_VALUE)
changeSetupValue(y);
}
-#endif
}
}
DrawText(SX+32, SY+3*32, "Device:", FS_BIG, FC_GREEN);
DrawText(SX+32, SY+15*32, "Exit", FS_BIG, FC_GREEN);
+#if 0
DeactivateJoystickForCalibration();
DrawTextFCentered(SYSIZE - 20, FC_BLUE,
"Joysticks deactivated on this screen");
+#endif
HandleSetupScreen_Input(0,0, 0,0, MB_MENU_INITIALIZE);
FadeToFront();
{
case EVENT_KEYPRESS:
{
- Key key = GetEventKey((KeyEvent *)&event, TRUE);
+ Key key = GetEventKey((KeyEvent *)&event, FALSE);
if (key == KSYM_Escape || (key == KSYM_Return && step_nr == 6))
{
void DrawSetupScreen()
{
+ DeactivateJoystick();
+
if (setup_mode == SETUP_MODE_INPUT)
DrawSetupScreen_Input();
+ else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
+ DrawChooseTree(&artwork.gfx_current);
+ else if (setup_mode == SETUP_MODE_CHOOSE_SOUNDS)
+ DrawChooseTree(&artwork.snd_current);
+ else if (setup_mode == SETUP_MODE_CHOOSE_MUSIC)
+ DrawChooseTree(&artwork.mus_current);
else
DrawSetupScreen_Generic();
}
{
if (setup_mode == SETUP_MODE_INPUT)
HandleSetupScreen_Input(mx, my, dx, dy, button);
+ else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
+ HandleChooseTree(mx, my, dx, dy, button, &artwork.gfx_current);
+ else if (setup_mode == SETUP_MODE_CHOOSE_SOUNDS)
+ HandleChooseTree(mx, my, dx, dy, button, &artwork.snd_current);
+ else if (setup_mode == SETUP_MODE_CHOOSE_MUSIC)
+ HandleChooseTree(mx, my, dx, dy, button, &artwork.mus_current);
else
HandleSetupScreen_Generic(mx, my, dx, dy, button);
}
SC_SCROLLBUTTON_XPOS + 0 * SC_SCROLLBUTTON_XSIZE, SC_SCROLLBUTTON_YPOS,
SC_SCROLL_UP_XPOS, SC_SCROLL_UP_YPOS,
SCREEN_CTRL_ID_SCROLL_UP,
- "scroll level series up"
+ "scroll up"
},
{
SC_SCROLLBUTTON_XPOS + 1 * SC_SCROLLBUTTON_XSIZE, SC_SCROLLBUTTON_YPOS,
SC_SCROLL_DOWN_XPOS, SC_SCROLL_DOWN_YPOS,
SCREEN_CTRL_ID_SCROLL_DOWN,
- "scroll level series down"
+ "scroll down"
}
};
CreateScreenScrollbars();
}
-void MapChooseLevelGadgets()
+void MapChooseTreeGadgets(TreeInfo *ti)
{
- int num_leveldirs = numTreeInfoInGroup(leveldir_current);
+ int num_entries = numTreeInfoInGroup(ti);
int i;
- if (num_leveldirs <= MAX_MENU_ENTRIES_ON_SCREEN)
+ if (num_entries <= MAX_MENU_ENTRIES_ON_SCREEN)
return;
for (i=0; i<NUM_SCREEN_GADGETS; i++)
MapGadget(screen_gadget[i]);
}
-void UnmapChooseLevelGadgets()
+void UnmapChooseTreeGadgets()
{
int i;
{
int id = gi->custom_id;
- if (game_status != CHOOSELEVEL)
+ if (game_status != CHOOSELEVEL && game_status != SETUP)
return;
switch (id)
{
case SCREEN_CTRL_ID_SCROLL_UP:
- HandleChooseLevel(SX,SY + 32, 0,0, MB_MENU_MARK);
+ if (game_status == CHOOSELEVEL)
+ HandleChooseLevel(SX,SY + 32, 0,0, MB_MENU_MARK);
+ else if (game_status == SETUP)
+ HandleSetupScreen(SX,SY + 32, 0,0, MB_MENU_MARK);
break;
case SCREEN_CTRL_ID_SCROLL_DOWN:
- HandleChooseLevel(SX,SY + SYSIZE - 32, 0,0, MB_MENU_MARK);
+ if (game_status == CHOOSELEVEL)
+ HandleChooseLevel(SX,SY + SYSIZE - 32, 0,0, MB_MENU_MARK);
+ else if (game_status == SETUP)
+ HandleSetupScreen(SX,SY + SYSIZE - 32, 0,0, MB_MENU_MARK);
break;
case SCREEN_CTRL_ID_SCROLL_VERTICAL:
- HandleChooseLevel(0,0, 999,gi->event.item_position, MB_MENU_INITIALIZE);
+ if (game_status == CHOOSELEVEL)
+ HandleChooseLevel(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
+ else if (game_status == SETUP)
+ HandleSetupScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
break;
default: