+ static int choice = 0;
+ static int redraw = TRUE;
+ int x = (mx - SX) / 32;
+ int y = (my - SY) / 32 - MENU_SCREEN_START_YPOS;
+ int pos_start = SETUP_SCREEN_POS_START;
+ int pos_empty1 = SETUP_SCREEN_POS_EMPTY1;
+ int pos_empty2 = SETUP_SCREEN_POS_EMPTY2;
+ int pos_end = SETUP_SCREEN_POS_END;
+
+ if (button == MB_MENU_INITIALIZE)
+ redraw = TRUE;
+
+ if (redraw)
+ {
+ drawCursor(choice, FC_RED);
+ redraw = FALSE;
+ }
+
+ if (button == MB_MENU_INITIALIZE)
+ return;
+
+ if (dx || dy)
+ {
+ x = 0;
+ y = choice;
+
+ if (dx)
+ {
+ int type = (dx < 0 ? TYPE_LEAVE_MENU : TYPE_ENTER_MENU);
+
+ if (!(setup_info[choice].type & TYPE_ENTER_OR_LEAVE_MENU) ||
+ setup_info[choice].type == type)
+ button = MB_MENU_CHOICE;
+ }
+ else if (dy)
+ y = choice + dy;
+
+ /* stay in valid range */
+ if (y < 0)
+ y = 0;
+ else if (y > num_setup_info - 1)
+ y = num_setup_info - 1;
+
+ /* jump to next non-empty menu entry (up or down) */
+ if (setup_info[y].type == TYPE_EMPTY)
+ while (y > 0 && y < num_setup_info - 1 &&
+ setup_info[y].type == TYPE_EMPTY)
+ y += dy;
+ }
+
+ if (!mx && !my && !dx && !dy)
+ {
+ x = 0;
+ y = choice;
+ }
+
+ if (x == 0 && y >= 0 && y < num_setup_info &&
+ setup_info[y].type != TYPE_EMPTY)
+ {
+ if (button)
+ {
+ if (y != choice)
+ {
+ drawCursor(y, FC_RED);
+ drawCursor(choice, FC_BLUE);
+ choice = y;
+ }
+ }
+ else if (!(setup_info[y].type & TYPE_GHOSTED))
+ {
+ if (setup_info[y].type & TYPE_BOOLEAN_STYLE)
+ {
+ boolean new_value = !*(boolean *)(setup_info[y].value);
+
+ *(boolean *)setup_info[y].value = new_value;
+
+ drawSetupValue(setup_info, y);
+ }
+ else if (setup_info[y].type & TYPE_ENTER_OR_LEAVE_MENU)
+ {
+ void (*menu_callback_function)(void) = setup_info[choice].value;
+
+ menu_callback_function();
+ redraw = TRUE;
+ }
+ }
+ }
+
+ BackToFront();
+
+ if (game_status == SETUP)
+ DoAnimation();
+
+ return;
+
+
+
+ if (x == 0 && y >= pos_start && y <= pos_end &&
+ !(y >= pos_empty1 && y <= pos_empty2))
+ {
+ if (button)
+ {
+ if (y != choice)
+ {
+ drawCursor(y, FC_RED);
+ drawCursor(choice, FC_BLUE);
+ }
+ choice = y;
+ }
+ else
+ {
+ int yy = MENU_SCREEN_START_YPOS + y;
+
+ if (y == 0 && audio.sound_available)
+ {
+ if (setup.sound)
+ {
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ DrawText(SX+14*32, SY+(yy+1)*32,"off",FS_BIG,FC_BLUE);
+ DrawText(SX+14*32, SY+(yy+2)*32,"off",FS_BIG,FC_BLUE);
+ setup.sound_loops = FALSE;
+ setup.sound_music = FALSE;
+ }
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.sound = !setup.sound;
+ }
+ else if (y == 1 && audio.loops_available)
+ {
+ if (setup.sound_loops)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ {
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ DrawText(SX+14*32, SY+(yy-1)*32,"on ",FS_BIG,FC_YELLOW);
+ setup.sound = TRUE;
+ }
+ setup.sound_loops = !setup.sound_loops;
+ }
+ else if (y == 2 && audio.loops_available)
+ {
+ if (setup.sound_music)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ {
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ DrawText(SX+14*32, SY+(yy-2)*32,"on ",FS_BIG,FC_YELLOW);
+ setup.sound = TRUE;
+ }
+ setup.sound_music = !setup.sound_music;
+ }
+
+#if 0
+ else if (y == 3)
+ {
+ if (setup.toons)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.toons = !setup.toons;
+ }
+ else if (y == 4)
+ {
+#if 0
+ if (setup.double_buffering)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.double_buffering = !setup.double_buffering;
+ setup.direct_draw = !setup.double_buffering;
+#else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.double_buffering = TRUE;
+ setup.direct_draw = !setup.double_buffering;
+#endif
+ }
+#endif
+
+ else if (y == 3)
+ {
+ if (setup.scroll_delay)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.scroll_delay = !setup.scroll_delay;
+ }
+ else if (y == 4)
+ {
+ if (setup.soft_scrolling)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.soft_scrolling = !setup.soft_scrolling;
+ }
+#if 0
+ else if (y == 5)
+ {
+ if (setup.fading)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.fading = !setup.fading;
+ }
+#endif
+ else if (y == 5 && video.fullscreen_available)
+ {
+ if (setup.fullscreen)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.fullscreen = !setup.fullscreen;
+ }
+ else if (y == 6)
+ {
+ if (setup.quick_doors)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.quick_doors = !setup.quick_doors;
+ }
+ else if (y == 7)
+ {
+ if (setup.autorecord)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.autorecord = !setup.autorecord;
+ }
+ else if (y == 8)
+ {
+ if (setup.team_mode)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.team_mode = !setup.team_mode;
+ }
+ else if (y == 9)
+ {
+ if (setup.handicap)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.handicap = !setup.handicap;
+ }
+ else if (y == 10)
+ {
+ if (setup.time_limit)
+ DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+ else
+ DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+ setup.time_limit = !setup.time_limit;
+ }
+ else if (y == 11)
+ {
+ game_status = SETUPINPUT;
+ DrawSetupInputScreen();
+ redraw = TRUE;
+ }
+ else if (y == pos_end - 1 || y == pos_end)
+ {
+ if (y == pos_end)
+ SaveSetup();
+
+ game_status = MAINMENU;
+ DrawMainMenu();
+ redraw = TRUE;
+ }
+ }
+ }
+ BackToFront();
+
+ if (game_status==SETUP)
+ DoAnimation();
+}
+
+#else
+
+void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
+{
+ static int choice = 0;