+ 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);
+}
+
+static void changeSetupValue(int pos)
+{
+ if (setup_info[pos].type & TYPE_BOOLEAN_STYLE)
+ {
+ *(boolean *)setup_info[pos].value ^= TRUE;
+ }
+ else if (setup_info[pos].type & TYPE_KEY)
+ {
+ Key key;
+
+ setup_info[pos].type |= TYPE_QUERY;
+ drawSetupValue(pos);
+ setup_info[pos].type &= ~TYPE_QUERY;
+
+ key = getSetupKey();
+ if (key != KSYM_UNDEFINED)
+ *(Key *)setup_info[pos].value = key;
+ }
+
+ drawSetupValue(pos);
+}
+
+static void DrawSetupScreen_Generic()
+{
+ char *title_string = NULL;
+ int i;
+
+ UnmapAllGadgets();
+ CloseDoor(DOOR_CLOSE_2);
+ ClearWindow();
+
+ if (setup_mode == SETUP_MODE_MAIN)
+ {
+ setup_info = setup_info_main;
+ title_string = "Setup";
+ }
+ else if (setup_mode == SETUP_MODE_SOUND)
+ {
+ setup_info = setup_info_sound;
+ title_string = "Setup Sound";
+ }
+ else if (setup_mode == SETUP_MODE_SHORTCUT)
+ {
+ setup_info = setup_info_shortcut;
+ title_string = "Setup Shortcuts";
+ }
+
+ DrawText(SX + 16, SY + 16, title_string, FS_BIG, FC_YELLOW);
+
+ num_setup_info = 0;
+ for(i=0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
+ {
+ void *value_ptr = setup_info[i].value;
+ int ypos = MENU_SCREEN_START_YPOS + i;
+
+ /* 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_ENTER_MENU)
+ initCursor(i, GFX_ARROW_BLUE_RIGHT);
+ else if (setup_info[i].type & TYPE_LEAVE_MENU)
+ initCursor(i, GFX_ARROW_BLUE_LEFT);
+ else if (setup_info[i].type & ~TYPE_SKIP_ENTRY)
+ initCursor(i, GFX_KUGEL_BLAU);
+
+ if (setup_info[i].type & TYPE_VALUE)
+ drawSetupValue(i);
+
+ num_setup_info++;
+ }
+
+ FadeToFront();
+ InitAnimation();
+ HandleSetupScreen_Generic(0,0,0,0,MB_MENU_INITIALIZE);
+}
+
+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 x = 0;
+ int y = choice;
+
+ if (button == MB_MENU_INITIALIZE)
+ {
+ drawCursor(choice, FC_RED);
+ return;
+ }
+ else if (button == MB_MENU_LEAVE)
+ {
+ for (y=0; y<num_setup_info; y++)
+ {
+ if (setup_info[y].type & TYPE_LEAVE_MENU)
+ {
+ void (*menu_callback_function)(void) = setup_info[y].value;
+
+ menu_callback_function();
+ break; /* absolutely needed because function changes 'setup_info'! */
+ }
+ }
+
+ return;
+ }
+
+ if (mx || my) /* mouse input */
+ {
+ x = (mx - SX) / 32;
+ y = (my - SY) / 32 - MENU_SCREEN_START_YPOS;
+ }
+ else if (dx || dy) /* keyboard input */
+ {
+ if (dx)
+ {
+ int menu_navigation_type = (dx < 0 ? TYPE_LEAVE_MENU : TYPE_ENTER_MENU);
+
+ if ((setup_info[choice].type & menu_navigation_type) ||
+ (setup_info[choice].type & TYPE_BOOLEAN_STYLE))
+ button = MB_MENU_CHOICE;
+ }
+ else if (dy)
+ y = choice + dy;
+
+ /* jump to next non-empty menu entry (up or down) */
+ while (y > 0 && y < num_setup_info - 1 &&
+ (setup_info[y].type & TYPE_SKIP_ENTRY))
+ y += dy;
+ }
+
+ if (x == 0 && y >= 0 && y < num_setup_info &&
+ (setup_info[y].type & ~TYPE_SKIP_ENTRY))
+ {
+ if (button)
+ {
+ if (y != choice)
+ {
+ drawCursor(y, FC_RED);
+ drawCursor(choice, FC_BLUE);
+ choice = choice_store[setup_mode] = y;
+ }
+ }
+ 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;
+
+ menu_callback_function();
+ }
+ else
+ {
+ if ((setup_info[y].type & TYPE_KEYTEXT) &&
+ (setup_info[y + 1].type & TYPE_KEY))
+ y++;
+
+ if (setup_info[y].type & TYPE_VALUE)
+ changeSetupValue(y);
+ }
+#endif
+ }
+ }
+
+ BackToFront();
+
+ if (game_status == SETUP)
+ DoAnimation();
+}
+
+void DrawSetupScreen_Input()
+{
+ ClearWindow();
+ DrawText(SX+16, SY+16, "Setup Input", FS_BIG, FC_YELLOW);
+
+ initCursor(0, GFX_KUGEL_BLAU);
+ initCursor(1, GFX_KUGEL_BLAU);
+ initCursor(2, GFX_ARROW_BLUE_RIGHT);
+ initCursor(13, GFX_ARROW_BLUE_LEFT);
+
+ DrawGraphic(10, MENU_SCREEN_START_YPOS, GFX_ARROW_BLUE_LEFT);
+ DrawGraphic(12, MENU_SCREEN_START_YPOS, GFX_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);
+
+ DeactivateJoystickForCalibration();
+ DrawTextFCentered(SYSIZE - 20, FC_BLUE,
+ "Joysticks deactivated on this screen");
+
+ HandleSetupScreen_Input(0,0, 0,0, MB_MENU_INITIALIZE);
+ FadeToFront();
+ InitAnimation();