OSDN Git Service

[Refactor] #40392 Separated select_race() from get_player_race()
authorHourier <hourier@users.sourceforge.jp>
Tue, 19 May 2020 12:17:00 +0000 (21:17 +0900)
committerHourier <hourier@users.sourceforge.jp>
Tue, 19 May 2020 12:17:00 +0000 (21:17 +0900)
src/birth/birth-select-race.c

index f5b5ba5..240ee98 100644 (file)
@@ -3,6 +3,54 @@
 #include "term/gameterm.h"
 #include "birth/birth-util.h"
 
+static const char p2 = ')';
+
+static void enumerate_race_list(char *sym)
+{
+    char buf[80];
+    for (int n = 0; n < MAX_RACES; n++) {
+        rp_ptr = &race_info[n];
+        concptr str = rp_ptr->title;
+        if (n < 26)
+            sym[n] = I2A(n);
+        else
+            sym[n] = ('A' + n - 26);
+
+        sprintf(buf, "%c%c%s", sym[n], p2, str);
+        put_str(buf, 12 + (n / 5), 1 + 16 * (n % 5));
+    }
+}
+
+static void display_race_stat(int cs, int *os, char *cur, char *sym)
+{
+    char buf[80];
+    if (cs == *os)
+        return;
+
+    c_put_str(TERM_WHITE, cur, 12 + (*os / 5), 1 + 16 * (*os % 5));
+    put_str("                                   ", 3, 40);
+    if (cs == MAX_RACES) {
+        sprintf(cur, "%c%c%s", '*', p2, _("ランダム", "Random"));
+        put_str("                                   ", 4, 40);
+        put_str("                                   ", 5, 40);
+    } else {
+        rp_ptr = &race_info[cs];
+        concptr str = rp_ptr->title;
+        sprintf(cur, "%c%c%s", sym[cs], p2, str);
+        c_put_str(TERM_L_BLUE, rp_ptr->title, 3, 40);
+        put_str(_("腕力 知能 賢さ 器用 耐久 魅力 経験 ", "Str  Int  Wis  Dex  Con  Chr   EXP "), 4, 40);
+        put_str(_("の種族修正", ": Race modification"), 3, 40 + strlen(rp_ptr->title));
+
+        sprintf(buf, "%+3d  %+3d  %+3d  %+3d  %+3d  %+3d %+4d%% ",
+            rp_ptr->r_adj[0], rp_ptr->r_adj[1], rp_ptr->r_adj[2], rp_ptr->r_adj[3],
+            rp_ptr->r_adj[4], rp_ptr->r_adj[5], (rp_ptr->r_exp - 100));
+        c_put_str(TERM_L_BLUE, buf, 5, 40);
+    }
+
+    c_put_str(TERM_YELLOW, cur, 12 + (cs / 5), 1 + 16 * (cs % 5));
+    *os = cs;
+}
+
 static void interpret_race_select_key_move(char c, int *cs)
 {
     if (c == '8') {
@@ -26,109 +74,81 @@ static void interpret_race_select_key_move(char c, int *cs)
     }
 }
 
-/*!
- * @brief プレイヤーの種族選択を行う / Player race
- * @return なし
- */
-bool get_player_race(player_type *creature_ptr)
+static bool select_race(player_type *creature_ptr, char *sym, int *k)
 {
-    char p2 = ')';
-    char buf[80];
     char cur[80];
-
-    clear_from(10);
-    put_str(_("注意:《種族》によってキャラクターの先天的な資質やボーナスが変化します。",
-                "Note: Your 'race' determines various intrinsic factors and bonuses."),
-        23, 5);
-
-    char sym[MAX_RACES];
-    for (int n = 0; n < MAX_RACES; n++) {
-        rp_ptr = &race_info[n];
-        concptr str = rp_ptr->title;
-        if (n < 26)
-            sym[n] = I2A(n);
-        else
-            sym[n] = ('A' + n - 26);
-
-        sprintf(buf, "%c%c%s", sym[n], p2, str);
-        put_str(buf, 12 + (n / 5), 1 + 16 * (n % 5));
-    }
-
     sprintf(cur, "%c%c%s", '*', p2, _("ランダム", "Random"));
-    int k = -1;
     int cs = creature_ptr->prace;
     int os = MAX_RACES;
     while (TRUE) {
-        if (cs != os) {
-            c_put_str(TERM_WHITE, cur, 12 + (os / 5), 1 + 16 * (os % 5));
-            put_str("                                   ", 3, 40);
-            if (cs == MAX_RACES) {
-                sprintf(cur, "%c%c%s", '*', p2, _("ランダム", "Random"));
-                put_str("                                   ", 4, 40);
-                put_str("                                   ", 5, 40);
-            } else {
-                rp_ptr = &race_info[cs];
-                concptr str = rp_ptr->title;
-                sprintf(cur, "%c%c%s", sym[cs], p2, str);
-                c_put_str(TERM_L_BLUE, rp_ptr->title, 3, 40);
-                put_str(_("腕力 知能 賢さ 器用 耐久 魅力 経験 ", "Str  Int  Wis  Dex  Con  Chr   EXP "), 4, 40);
-                put_str(_("の種族修正", ": Race modification"), 3, 40 + strlen(rp_ptr->title));
-
-                sprintf(buf, "%+3d  %+3d  %+3d  %+3d  %+3d  %+3d %+4d%% ",
-                    rp_ptr->r_adj[0], rp_ptr->r_adj[1], rp_ptr->r_adj[2], rp_ptr->r_adj[3],
-                    rp_ptr->r_adj[4], rp_ptr->r_adj[5], (rp_ptr->r_exp - 100));
-                c_put_str(TERM_L_BLUE, buf, 5, 40);
-            }
-
-            c_put_str(TERM_YELLOW, cur, 12 + (cs / 5), 1 + 16 * (cs % 5));
-            os = cs;
-        }
-
-        if (k >= 0)
+        display_race_stat(cs, &os, cur, sym);
+        if (*k >= 0)
             break;
 
+        char buf[80];
         sprintf(buf, _("種族を選んで下さい (%c-%c) ('='初期オプション設定): ", "Choose a race (%c-%c) ('=' for options): "), sym[0], sym[MAX_RACES - 1]);
-
         put_str(buf, 10, 10);
         char c = inkey();
         if (c == 'Q')
             birth_quit();
+
         if (c == 'S')
             return FALSE;
+
         if (c == ' ' || c == '\r' || c == '\n') {
             if (cs == MAX_RACES) {
-                k = randint0(MAX_RACES);
-                cs = k;
+                *k = randint0(MAX_RACES);
+                cs = *k;
                 continue;
             } else {
-                k = cs;
+                *k = cs;
                 break;
             }
         }
 
         if (c == '*') {
-            k = randint0(MAX_RACES);
-            cs = k;
+            *k = randint0(MAX_RACES);
+            cs = *k;
             continue;
         }
 
         interpret_race_select_key_move(c, &cs);
-        k = (islower(c) ? A2I(c) : -1);
-        if ((k >= 0) && (k < MAX_RACES)) {
-            cs = k;
+        *k = (islower(c) ? A2I(c) : -1);
+        if ((*k >= 0) && (*k < MAX_RACES)) {
+            cs = *k;
             continue;
         }
 
-        k = (isupper(c) ? (26 + c - 'A') : -1);
-        if ((k >= 26) && (k < MAX_RACES)) {
-            cs = k;
+        *k = (isupper(c) ? (26 + c - 'A') : -1);
+        if ((*k >= 26) && (*k < MAX_RACES)) {
+            cs = *k;
             continue;
         } else
-            k = -1;
+            *k = -1;
 
         birth_help_option(creature_ptr, c, BK_RACE);
     }
 
+    return TRUE;
+}
+
+/*!
+ * @brief プレイヤーの種族選択を行う / Player race
+ * @return なし
+ */
+bool get_player_race(player_type *creature_ptr)
+{
+    clear_from(10);
+    put_str(_("注意:《種族》によってキャラクターの先天的な資質やボーナスが変化します。",
+                "Note: Your 'race' determines various intrinsic factors and bonuses."),
+        23, 5);
+
+    char sym[MAX_RACES];
+    enumerate_race_list(sym);
+    int k = -1;
+    if (!select_race(creature_ptr, sym, &k))
+        return FALSE;
+
     creature_ptr->prace = (byte)k;
     rp_ptr = &race_info[creature_ptr->prace];
     c_put_str(TERM_L_BLUE, rp_ptr->title, 4, 15);