added new setup option type "yes/no/ask"
authorHolger Schemel <info@artsoft.org>
Fri, 26 Apr 2024 11:29:09 +0000 (13:29 +0200)
committerHolger Schemel <info@artsoft.org>
Fri, 26 Apr 2024 13:41:50 +0000 (15:41 +0200)
src/libgame/setup.c
src/libgame/setup.h
src/libgame/types.h
src/screens.c

index 06190e0b4c71671fb1f1b76989bf5aadb9a9e7f9..42ae7bdc976e5bc53b703210e3b4361301c773c9 100644 (file)
@@ -4863,6 +4863,7 @@ char *getSetupValue(int type, void *value)
 
     case TYPE_SWITCH_3_STATES:
       strcpy(value_string, (*(int *)value == MODE_AUTO  ? "auto" :
+                           *(int *)value == MODE_ASK   ? "ask" :
                            *(int *)value == FALSE ? "off" : "on"));
       break;
 
@@ -4875,6 +4876,11 @@ char *getSetupValue(int type, void *value)
                            *(int *)value == FALSE ? "no" : "yes"));
       break;
 
+    case TYPE_YES_NO_ASK:
+      strcpy(value_string, (*(int *)value == MODE_ASK ? "ask" :
+                           *(int *)value == FALSE ? "no" : "yes"));
+      break;
+
     case TYPE_ECS_AGA:
       strcpy(value_string, (*(boolean *)value ? "AGA" : "ECS"));
       break;
index 92d201946e1cba83aeef95f03d00269d968f6e60..c7a5330267f819b55ac46af771399ed01885d1d7 100644 (file)
 #define TYPE_SWITCH_3_STATES           (1 << 2)
 #define TYPE_YES_NO                    (1 << 3)
 #define TYPE_YES_NO_AUTO               (1 << 4)
-#define TYPE_ECS_AGA                   (1 << 5)
-#define TYPE_KEY                       (1 << 6)
-#define TYPE_KEY_X11                   (1 << 7)
-#define TYPE_INTEGER                   (1 << 8)
-#define TYPE_STRING                    (1 << 9)
-#define TYPE_PLAYER                    (1 << 10)
-#define TYPE_ELEMENT                   (1 << 11)
-#define TYPE_GRAPHIC                   (1 << 12)
+#define TYPE_YES_NO_ASK                        (1 << 5)
+#define TYPE_ECS_AGA                   (1 << 6)
+#define TYPE_KEY                       (1 << 7)
+#define TYPE_KEY_X11                   (1 << 8)
+#define TYPE_INTEGER                   (1 << 9)
+#define TYPE_STRING                    (1 << 10)
+#define TYPE_PLAYER                    (1 << 11)
+#define TYPE_ELEMENT                   (1 << 12)
+#define TYPE_GRAPHIC                   (1 << 13)
 
 // additional values for setup screen
-#define TYPE_ENTER_SCREEN              (1 << 13)
-#define TYPE_LEAVE_SCREEN              (1 << 14)
-#define TYPE_ENTER_MENU                        (1 << 15)
-#define TYPE_LEAVE_MENU                        (1 << 16)
-#define TYPE_ENTER_LIST                        (1 << 17)
-#define TYPE_LEAVE_LIST                        (1 << 18)
-#define TYPE_TEXT_INPUT                        (1 << 19)
-#define TYPE_EMPTY                     (1 << 20)
-#define TYPE_SKIPPABLE                 (1 << 21)
-#define TYPE_KEYTEXT                   (1 << 22)
-#define TYPE_HEADLINE                  (1 << 23)
-
-#define TYPE_GHOSTED                   (1 << 24)
-#define TYPE_QUERY                     (1 << 25)
+#define TYPE_ENTER_SCREEN              (1 << 14)
+#define TYPE_LEAVE_SCREEN              (1 << 15)
+#define TYPE_ENTER_MENU                        (1 << 16)
+#define TYPE_LEAVE_MENU                        (1 << 17)
+#define TYPE_ENTER_LIST                        (1 << 18)
+#define TYPE_LEAVE_LIST                        (1 << 19)
+#define TYPE_TEXT_INPUT                        (1 << 20)
+#define TYPE_EMPTY                     (1 << 21)
+#define TYPE_SKIPPABLE                 (1 << 22)
+#define TYPE_KEYTEXT                   (1 << 23)
+#define TYPE_HEADLINE                  (1 << 24)
+
+#define TYPE_GHOSTED                   (1 << 25)
+#define TYPE_QUERY                     (1 << 26)
 
 // additional values for internal purposes
-#define TYPE_BITFIELD                  (1 << 26)
-#define TYPE_CONTENT                   (1 << 27)
-#define TYPE_ELEMENT_LIST              (1 << 28)
-#define TYPE_CONTENT_LIST              (1 << 29)
+#define TYPE_BITFIELD                  (1 << 27)
+#define TYPE_CONTENT                   (1 << 28)
+#define TYPE_ELEMENT_LIST              (1 << 29)
+#define TYPE_CONTENT_LIST              (1 << 30)
 
 // derived values for setup file handling
 #define TYPE_BOOLEAN_STYLE             (TYPE_BOOLEAN | \
@@ -63,6 +64,7 @@
 #define TYPE_VALUE                     (TYPE_BOOLEAN_STYLE     | \
                                         TYPE_SWITCH_3_STATES   | \
                                         TYPE_YES_NO_AUTO       | \
+                                        TYPE_YES_NO_ASK        | \
                                         TYPE_KEY               | \
                                         TYPE_KEY_X11           | \
                                         TYPE_INTEGER           | \
index bbe46f556a40015ac937502c08f6b43e60374428..2c678f705c125eed4a009bcb24edf331bfed3ba8 100644 (file)
@@ -36,10 +36,15 @@ typedef unsigned char byte;
 #undef MODE_AUTO
 #endif
 
+#ifdef MODE_ASK
+#undef MODE_ASK
+#endif
+
 #define TRUE                   1
 #define FALSE                  0
 
 #define MODE_AUTO              -1
+#define MODE_ASK               -1
 
 #ifndef MIN
 #define MIN(a, b)              ((a) < (b) ? (a) : (b))
index 1c4e14a15d9ea32d5c2fae14a7d18836efc59544..85b91cdea2292b2db64fa0ec72bdad679fde04ac 100644 (file)
@@ -2633,6 +2633,7 @@ static int getMenuTextFont(int type)
   if (type & (TYPE_SWITCH      |
              TYPE_YES_NO       |
              TYPE_YES_NO_AUTO  |
+             TYPE_YES_NO_ASK   |
              TYPE_STRING       |
              TYPE_PLAYER       |
              TYPE_ECS_AGA      |
@@ -3079,6 +3080,7 @@ static void HandleMenuScreen(int mx, int my, int dx, int dy, int button,
       if (menu_info[choice].type & menu_navigation_type ||
          menu_info[choice].type & TYPE_BOOLEAN_STYLE ||
          menu_info[choice].type & TYPE_YES_NO_AUTO ||
+         menu_info[choice].type & TYPE_YES_NO_ASK ||
          menu_info[choice].type & TYPE_PLAYER)
        button = MB_MENU_CHOICE;
     }
@@ -8381,6 +8383,9 @@ static int getSetupValueFont(int type, void *value)
   else if (type & TYPE_YES_NO_AUTO)
     return (*(int *)value == MODE_AUTO  ? FONT_OPTION_ON :
            *(int *)value == FALSE ? FONT_OPTION_OFF : FONT_OPTION_ON);
+  else if (type & TYPE_YES_NO_ASK)
+    return (*(int *)value == MODE_ASK  ? FONT_OPTION_ON :
+           *(int *)value == FALSE ? FONT_OPTION_OFF : FONT_OPTION_ON);
   else if (type & TYPE_PLAYER)
     return FONT_VALUE_1;
   else
@@ -8529,6 +8534,15 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx)
        (*(int *)si->value == TRUE ? MODE_AUTO :
        *(int *)si->value == MODE_AUTO ? FALSE : TRUE));
   }
+  else if (si->type & TYPE_YES_NO_ASK)
+  {
+    *(int *)si->value =
+      (dx == -1 ?
+       (*(int *)si->value == MODE_ASK ? TRUE :
+       *(int *)si->value == TRUE ? FALSE : MODE_ASK) :
+       (*(int *)si->value == TRUE ? MODE_ASK :
+       *(int *)si->value == MODE_ASK ? FALSE : TRUE));
+  }
   else if (si->type & TYPE_KEY)
   {
     Key key;