initial Caanoo port
[gpsp.git] / gui.c
diff --git a/gui.c b/gui.c
index cd8f4f3..b28392d 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -42,7 +42,7 @@
 
 #define FILE_LIST_ROWS 25
 #define FILE_LIST_POSITION 5
-#define DIR_LIST_POSITION 360
+#define DIR_LIST_POSITION (resolution_width * 3 / 4)
 
 #endif
 
@@ -78,7 +78,7 @@
     clock_speed = (clock_speed_number + 1) * 33
   #define get_clock_speed_number() \
     clock_speed_number = (clock_speed / 33) - 1
-#elif defined(WIZ_BUILD)
+#elif defined(POLLUX_BUILD)
   static const char *clock_speed_options[] =
   {
     "300MHz", "333MHz", "366MHz", "400MHz", "433MHz",
@@ -735,7 +735,7 @@ u32 gamepad_config_line_to_button[] =
 #ifdef GP2X_BUILD
 
 u32 gamepad_config_line_to_button[] =
- { 0, 2, 1, 3, 8, 9, 10, 11, 6, 7, 4, 5, 14 };
+ { 0, 2, 1, 3, 8, 9, 10, 11, 6, 7, 4, 5, 14, 15 };
 
 #endif
 
@@ -753,6 +753,8 @@ static const char *scale_options[] =
 #elif defined(WIZ_BUILD)
   "unscaled 3:2", "scaled 3:2 (slower)",
   "unscaled 3:2 (anti-tear)", "scaled 3:2 (anti-tear)"
+#elif defined(POLLUX_BUILD)
+  "unscaled 3:2", "scaled 3:2 (slower)"
 #elif defined(PND_BUILD)
   "unscaled", "2x", "3x", "fullscreen"
 #elif defined(GP2X_BUILD)
@@ -762,12 +764,33 @@ static const char *scale_options[] =
 #endif
 };
 
+const char *filter2_options[] =
+{
+  "none", "scale2x", "scale3x", "eagle2x"
+};
+
+#ifndef PSP_BUILD
+static const char *audio_buffer_options[] =
+{
+  "16 bytes", "32 bytes", "64 bytes",
+  "128 bytes", "256 bytes", "512 bytes", "1024 bytes", "2048 bytes",
+  "4096 bytes", "8192 bytes", "16284 bytes"
+};
+#else
+const char *audio_buffer_options[] =
+{
+  "3072 bytes", "4096 bytes", "5120 bytes", "6144 bytes", "7168 bytes",
+  "8192 bytes", "9216 bytes", "10240 bytes", "11264 bytes", "12288 bytes"
+};
+#endif
+
+
 s32 load_game_config_file()
 {
   char game_config_filename[512];
   u32 file_loaded = 0;
   u32 i;
-  change_ext(gamepak_filename, game_config_filename, ".cfg");
+  make_rpath(game_config_filename, sizeof(game_config_filename), ".cfg");
 
   file_open(game_config_file, game_config_filename, read);
 
@@ -786,7 +809,7 @@ s32 load_game_config_file()
       random_skip = file_options[2] % 2;
       clock_speed = file_options[3];
 
-#ifdef WIZ_BUILD
+#ifdef POLLUX_BUILD
       if(clock_speed > 900)
         clock_speed = 533;
 #elif defined(GP2X_BUILD)
@@ -808,7 +831,7 @@ s32 load_game_config_file()
 
       for(i = 0; i < 10; i++)
       {
-        cheats[i].cheat_active = file_options[3 + i] % 2;
+        cheats[i].cheat_active = file_options[4 + i] % 2;
         cheats[i].cheat_name[0] = 0;
       }
 
@@ -822,7 +845,7 @@ s32 load_game_config_file()
 
   current_frameskip_type = auto_frameskip;
   frameskip_value = 4;
-#ifdef WIZ_BUILD
+#ifdef POLLUX_BUILD
   frameskip_value = 1;
 #endif
   random_skip = 0;
@@ -837,15 +860,28 @@ s32 load_game_config_file()
   return -1;
 }
 
+enum file_options {
+  fo_screen_scale = 0,
+  fo_screen_filter,
+  fo_global_enable_audio,
+  fo_audio_buffer_size,
+  fo_update_backup_flag,
+  fo_global_enable_analog,
+  fo_analog_sensitivity_level,
+  fo_screen_filter2,
+  fo_main_option_count,
+};
+
+#ifdef PC_BUILD
+#define PLAT_BUTTON_COUNT 0
+#endif
+#define FILE_OPTION_COUNT (fo_main_option_count + PLAT_BUTTON_COUNT)
+
 s32 load_config_file()
 {
   char config_path[512];
 
-  #if defined(_WIN32) || defined(_WIN32_WCE)
-    sprintf(config_path, "%s\\%s", main_path, GPSP_CONFIG_FILENAME);
-  #else
-    sprintf(config_path, "%s/%s", main_path, GPSP_CONFIG_FILENAME);
-  #endif
+  sprintf(config_path, "%s" PATH_SEPARATOR "%s", main_path, GPSP_CONFIG_FILENAME);
 
   file_open(config_file, config_path, read);
 
@@ -854,25 +890,24 @@ s32 load_config_file()
     u32 file_size = file_length(config_path, config_file);
 
     // Sanity check: File size must be the right size
-    if(file_size == 92)
+    if(file_size == FILE_OPTION_COUNT * 4)
     {
       u32 file_options[file_size / 4];
       file_read_array(config_file, file_options);
 
-      screen_scale = file_options[0] %
+      screen_scale = file_options[fo_screen_scale] %
         (sizeof(scale_options) / sizeof(scale_options[0]));
-      screen_filter = file_options[1] % 2;
-      global_enable_audio = file_options[2] % 2;
+      screen_filter = file_options[fo_screen_filter] % 2;
+      global_enable_audio = file_options[fo_global_enable_audio] % 2;
+      screen_filter2 = file_options[fo_screen_filter2] %
+        (sizeof(filter2_options) / sizeof(filter2_options[0]));
 
-#ifdef PSP_BUILD
-      audio_buffer_size_number = file_options[3] % 10;
-#else
-      audio_buffer_size_number = file_options[3] % 11;
-#endif
+      audio_buffer_size_number = file_options[fo_audio_buffer_size] %
+        (sizeof(audio_buffer_options) / sizeof(audio_buffer_options[0]));
 
-      update_backup_flag = file_options[4] % 2;
-      global_enable_analog = file_options[5] % 2;
-      analog_sensitivity_level = file_options[6] % 8;
+      update_backup_flag = file_options[fo_update_backup_flag] % 2;
+      global_enable_analog = file_options[fo_global_enable_analog] % 2;
+      analog_sensitivity_level = file_options[fo_analog_sensitivity_level] % 8;
 
 #ifdef PSP_BUILD
     scePowerSetClockFrequency(clock_speed, clock_speed, clock_speed / 2);
@@ -884,9 +919,9 @@ s32 load_config_file()
 #ifndef PC_BUILD
       u32 i;
       s32 menu_button = -1;
-      for(i = 0; i < 16; i++)
+      for(i = 0; i < PLAT_BUTTON_COUNT; i++)
       {
-        gamepad_config_map[i] = file_options[7 + i] %
+        gamepad_config_map[i] = file_options[fo_main_option_count + i] %
          (BUTTON_ID_NONE + 1);
 
         if(gamepad_config_map[i] == BUTTON_ID_MENU)
@@ -895,9 +930,9 @@ s32 load_config_file()
         }
       }
 
-      if(menu_button == -1)
+      if(menu_button == -1 && PLAT_MENU_BUTTON >= 0)
       {
-        gamepad_config_map[0] = BUTTON_ID_MENU;
+        gamepad_config_map[PLAT_MENU_BUTTON] = BUTTON_ID_MENU;
       }
 #endif
 
@@ -915,7 +950,7 @@ s32 save_game_config_file()
   char game_config_filename[512];
   u32 i;
 
-  change_ext(gamepak_filename, game_config_filename, ".cfg");
+  make_rpath(game_config_filename, sizeof(game_config_filename), ".cfg");
 
   file_open(game_config_file, game_config_filename, write);
 
@@ -947,11 +982,7 @@ s32 save_config_file()
 {
   char config_path[512];
 
-  #if (defined(PSP_BUILD) || defined(ARM_ARCH)) && !defined(_WIN32_WCE)
-    sprintf(config_path, "%s/%s", main_path, GPSP_CONFIG_FILENAME);
-  #else
-    sprintf(config_path, "%s\\%s", main_path, GPSP_CONFIG_FILENAME);
-  #endif
+  sprintf(config_path, "%s" PATH_SEPARATOR "%s", main_path, GPSP_CONFIG_FILENAME);
 
   file_open(config_file, config_path, write);
 
@@ -959,21 +990,22 @@ s32 save_config_file()
 
   if(file_check_valid(config_file))
   {
-    u32 file_options[23];
+    u32 file_options[FILE_OPTION_COUNT];
 
-    file_options[0] = screen_scale;
-    file_options[1] = screen_filter;
-    file_options[2] = global_enable_audio;
-    file_options[3] = audio_buffer_size_number;
-    file_options[4] = update_backup_flag;
-    file_options[5] = global_enable_analog;
-    file_options[6] = analog_sensitivity_level;
+    file_options[fo_screen_scale] = screen_scale;
+    file_options[fo_screen_filter] = screen_filter;
+    file_options[fo_global_enable_audio] = global_enable_audio;
+    file_options[fo_audio_buffer_size] = audio_buffer_size_number;
+    file_options[fo_update_backup_flag] = update_backup_flag;
+    file_options[fo_global_enable_analog] = global_enable_analog;
+    file_options[fo_analog_sensitivity_level] = analog_sensitivity_level;
+    file_options[fo_screen_filter2] = screen_filter2;
 
 #ifndef PC_BUILD
     u32 i;
-    for(i = 0; i < 16; i++)
+    for(i = 0; i < PLAT_BUTTON_COUNT; i++)
     {
-      file_options[7 + i] = gamepad_config_map[i];
+      file_options[fo_main_option_count + i] = gamepad_config_map[i];
     }
 #endif
 
@@ -1044,22 +1076,18 @@ void get_savestate_snapshot(char *savestate_filename)
 #endif
 }
 
-void get_savestate_filename(u32 slot, char *name_buffer)
+void get_savestate_filename_noshot(u32 slot, char *name_buffer)
 {
   char savestate_ext[16];
 
   sprintf(savestate_ext, "%d.svs", slot);
-  change_ext(gamepak_filename, name_buffer, savestate_ext);
-
-  get_savestate_snapshot(name_buffer);
+  make_rpath(name_buffer, 512, savestate_ext);
 }
 
-void get_savestate_filename_noshot(u32 slot, char *name_buffer)
+void get_savestate_filename(u32 slot, char *name_buffer)
 {
-  char savestate_ext[16];
-
-  sprintf(savestate_ext, "%d.svs", slot);
-  change_ext(gamepak_filename, name_buffer, savestate_ext);
+  get_savestate_filename_noshot(slot, name_buffer);
+  get_savestate_snapshot(name_buffer);
 }
 
 #ifdef PSP_BUILD
@@ -1298,21 +1326,6 @@ u32 menu(u16 *original_screen)
   const char *frameskip_options[] = { "automatic", "manual", "off" };
   const char *frameskip_variation_options[] = { "uniform", "random" };
 
-#ifndef PSP_BUILD
-  static const char *audio_buffer_options[] =
-  {
-    "16 bytes", "32 bytes", "64 bytes",
-    "128 bytes", "256 bytes", "512 bytes", "1024 bytes", "2048 bytes",
-    "4096 bytes", "8192 bytes", "16284 bytes"
-  };
-#else
-  const char *audio_buffer_options[] =
-  {
-    "3072 bytes", "4096 bytes", "5120 bytes", "6144 bytes", "7168 bytes",
-    "8192 bytes", "9216 bytes", "10240 bytes", "11264 bytes", "12288 bytes"
-  };
-#endif
-
   static const char *update_backup_options[] = { "Exit only", "Automatic" };
 
   // Marker for help information, don't go past this mark (except \n)------*
@@ -1338,6 +1351,12 @@ u32 menu(u16 *original_screen)
      "scaling the screen. Selecting this will produce a more even and\n"
      "smooth image, at the cost of being blurry and having less vibrant\n"
      "colors.", 3),
+#endif
+#ifdef PND_BUILD
+    string_selection_option(NULL, "Scaling filter", filter2_options,
+     (u32 *)(&screen_filter2),
+     sizeof(filter2_options) / sizeof(filter2_options[0]),
+     "Optional pixel art scaling filter", 4),
 #endif
     string_selection_option(NULL, "Frameskip type", frameskip_options,
      (u32 *)(&current_frameskip_type), 3,
@@ -1385,7 +1404,8 @@ u32 menu(u16 *original_screen)
      "This option requires gpSP to be restarted before it will take effect.",
 #else
      "Set the size (in bytes) of the audio buffer.\n"
-     "This option requires gpSP restart to take effect.",
+     "This option requires gpSP restart to take effect.\n"
+     "Settable values may be limited by SDL implementation.",
 #endif
      10),
     submenu_option(NULL, "Back", "Return to the main menu.", 12)
@@ -1513,18 +1533,25 @@ u32 menu(u16 *original_screen)
     gamepad_config_option("Right Trigger", 9),
 #ifdef WIZ_BUILD
     gamepad_config_option("Menu         ", 10),
-#else
+    gamepad_config_option("Select       ", 11),
+#elif defined(POLLUX_BUILD)
+    gamepad_config_option("I            ", 10),
+    gamepad_config_option("II           ", 11),
+    gamepad_config_option("Push         ", 12),
+    gamepad_config_option("Home         ", 13),
+#elif defined(PND_BUILD)
     gamepad_config_option("Start        ", 10),
-#endif
     gamepad_config_option("Select       ", 11),
-#if !defined(WIZ_BUILD) && !defined(PND_BUILD)
-    gamepad_config_option("Stick Push   ", 12),
-#endif
-#ifdef PND_BUILD
     gamepad_config_option("1            ", 12),
     gamepad_config_option("2            ", 13),
     gamepad_config_option("3            ", 14),
     gamepad_config_option("4            ", 15),
+#else // GP2X
+    gamepad_config_option("Start        ", 10),
+    gamepad_config_option("Select       ", 11),
+    gamepad_config_option("Stick Push   ", 12),
+#endif
+#ifdef PND_BUILD
     submenu_option(NULL, "Back", "Return to the main menu.", 16)
 #else
     submenu_option(NULL, "Back", "Return to the main menu.", 14)
@@ -1534,6 +1561,12 @@ u32 menu(u16 *original_screen)
 
   menu_option_type analog_config_options[] =
   {
+#if defined(POLLUX_BUILD)
+    numeric_selection_option(NULL, "Analog sensitivity",
+     &analog_sensitivity_level, 10,
+     "Determine sensitivity/responsiveness of the analog input.\n"
+     "Lower numbers are less sensitive.", 8),
+#endif
     submenu_option(NULL, "Back", "Return to the main menu.", 11)
   };
 
@@ -1578,9 +1611,9 @@ u32 menu(u16 *original_screen)
     submenu_option(&gamepad_config_menu, "Configure gamepad input",
      "Select to change the in-game behavior of buttons\n"
      "and d-pad.", 6),
-#ifndef GP2X_BUILD
+#ifndef WIZ_BUILD
     submenu_option(&analog_config_menu, "Configure analog input",
-     "Select to change the in-game behavior of the PSP analog nub.", 7),
+     "Select to change the in-game behavior of the analog nub.", 7),
 #endif
     submenu_option(&cheats_misc_menu, "Cheats and Miscellaneous options",
      "Select to manage cheats, set backup behavior,\n"