OSDN Git Service

[Refactor] レイシャルパワーの定義配列をstd::vectorに変更
authoriks <iks3@users.noreply.github.com>
Tue, 20 Apr 2021 05:42:23 +0000 (14:42 +0900)
committeriks <iks3@users.noreply.github.com>
Tue, 20 Apr 2021 13:46:28 +0000 (22:46 +0900)
src/cmd-action/cmd-racial.cpp
src/mind/mind-elementalist.cpp
src/racial/class-racial-switcher.cpp
src/racial/mutation-racial-selector.cpp
src/racial/race-racial-command-setter.cpp
src/racial/racial-util.cpp
src/racial/racial-util.h

index 820df09..80d35ce 100644 (file)
@@ -21,6 +21,7 @@
 #include "status/action-setter.h"
 #include "term/screen-processor.h"
 #include "util/int-char-converter.h"
+#include "view/display-messages.h"
 #include <string>
 
 static bool input_racial_power_selection(player_type *creature_ptr, rc_type *rc_ptr)
@@ -33,7 +34,7 @@ static bool input_racial_power_selection(player_type *creature_ptr, rc_type *rc_
     case '8':
     case 'k':
     case 'K':
-        rc_ptr->menu_line += (rc_ptr->num - 1);
+        rc_ptr->menu_line += (rc_ptr->size() - 1);
         return FALSE;
     case '2':
     case 'j':
@@ -48,7 +49,7 @@ static bool input_racial_power_selection(player_type *creature_ptr, rc_type *rc_
     case 'H':
         if (rc_ptr->menu_line > 18)
             rc_ptr->menu_line -= 18;
-        else if (rc_ptr->menu_line + 18 <= rc_ptr->num)
+        else if (rc_ptr->menu_line + 18 <= rc_ptr->size())
             rc_ptr->menu_line += 18;
 
         return FALSE;
@@ -71,8 +72,8 @@ static bool check_input_racial_power(player_type *creature_ptr, rc_type *rc_ptr)
     if (input_racial_power_selection(creature_ptr, rc_ptr))
         return TRUE;
 
-    if (rc_ptr->menu_line > rc_ptr->num)
-        rc_ptr->menu_line -= rc_ptr->num;
+    if (rc_ptr->menu_line > rc_ptr->size())
+        rc_ptr->menu_line -= rc_ptr->size();
 
     return FALSE;
 }
@@ -84,7 +85,7 @@ static void display_racial_list(rc_type *rc_ptr, char *dummy)
     if (!use_menu)
         screen_save();
 
-    if (rc_ptr->num < 18) {
+    if (rc_ptr->size() < 18) {
         prt(_("                            Lv   MP 失率", "                            Lv Cost Fail"), 1, 0);
         return;
     }
@@ -101,7 +102,7 @@ static void select_racial_power(player_type *creature_ptr, rc_type *rc_ptr)
     byte y = 2;
     byte x = 0;
     int ctr = 0;
-    while (ctr < rc_ptr->num) {
+    while (ctr < rc_ptr->size()) {
         TERM_LEN x1 = ((ctr < 18) ? x : x + 40);
         TERM_LEN y1 = ((ctr < 18) ? y + ctr : y + ctr - 18);
         if (use_menu) {
@@ -147,7 +148,7 @@ static void decide_racial_command(rc_type *rc_ptr)
     if (use_menu)
         return;
 
-    if (rc_ptr->choice == '\r' && rc_ptr->num == 1)
+    if (rc_ptr->choice == '\r' && rc_ptr->size() == 1)
         rc_ptr->choice = 'a';
 
     if (!isalpha(rc_ptr->choice)) {
@@ -165,7 +166,7 @@ static void decide_racial_command(rc_type *rc_ptr)
 
 static bool ask_invoke_racial_power(rc_type *rc_ptr)
 {
-    if ((rc_ptr->command_code < 0) || (rc_ptr->command_code >= rc_ptr->num)) {
+    if ((rc_ptr->command_code < 0) || (rc_ptr->command_code >= rc_ptr->size())) {
         bell();
         return FALSE;
     }
@@ -205,7 +206,7 @@ static bool process_racial_power_choice(player_type *creature_ptr, rc_type *rc_p
 
 static bool repeat_racial_power(player_type *creature_ptr, rc_type *rc_ptr)
 {
-    if (repeat_pull(&rc_ptr->command_code) && (rc_ptr->command_code >= 0) && (rc_ptr->command_code < rc_ptr->num))
+    if (repeat_pull(&rc_ptr->command_code) && (rc_ptr->command_code >= 0) && (rc_ptr->command_code < rc_ptr->size()))
         return FALSE;
 
     if (use_menu)
@@ -281,8 +282,8 @@ void do_cmd_racial_power(player_type *creature_ptr)
     if (creature_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
         set_action(creature_ptr, ACTION_NONE);
 
-    rc_type tmp_rc;
-    rc_type *rc_ptr = initialize_rc_type(creature_ptr, &tmp_rc);
+    rc_type tmp_r = rc_type(creature_ptr);
+    rc_type *rc_ptr = &tmp_r;
     switch_class_racial(creature_ptr, rc_ptr);
     if (creature_ptr->mimic_form)
         set_mimic_racial_command(creature_ptr, rc_ptr);
@@ -293,9 +294,14 @@ void do_cmd_racial_power(player_type *creature_ptr)
     rc_ptr->flag = FALSE;
     rc_ptr->redraw = FALSE;
 
+    if (rc_ptr->size() == 0) {
+        msg_print(_("特殊能力はありません。", "You have no special powers."));
+        return;
+    }
+
     (void)strnfmt(rc_ptr->out_val, 78,
         _("(特殊能力 %c-%c, *'で一覧, ESCで中断) どの特殊能力を使いますか?", "(Powers %c-%c, *=List, ESC=exit) Use which power? "), I2A(0),
-        (rc_ptr->num <= 26) ? I2A(rc_ptr->num - 1) : '0' + rc_ptr->num - 27);
+        (rc_ptr->size() <= 26) ? I2A(rc_ptr->size() - 1) : '0' + rc_ptr->size() - 27);
 
     if (repeat_racial_power(creature_ptr, rc_ptr))
         return;
index f83f66a..6072d1f 100644 (file)
@@ -1244,70 +1244,71 @@ void switch_element_racial(player_type *creature_ptr, rc_type *rc_ptr)
 {
     auto plev = creature_ptr->lev;
     auto realm = static_cast<ElementRealm>(creature_ptr->element);
+    rpi_type rpi;
     switch (realm) {
     case ElementRealm::FIRE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ライト・エリア", "Light area");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 3;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("ライト・エリア", "Light area"));
+        rpi.min_level = 3;
+        rpi.cost = 5;
+        rpi.stat = A_WIS;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     case ElementRealm::ICE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("周辺フリーズ", "Sleep monsters");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 25;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("周辺フリーズ", "Sleep monsters"));
+        rpi.min_level = 10;
+        rpi.cost = 15;
+        rpi.stat = A_WIS;
+        rpi.fail = 25;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     case ElementRealm::SKY:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("魔力充填", "Recharging");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 25;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("魔力充填", "Recharging"));
+        rpi.min_level = 20;
+        rpi.cost = 15;
+        rpi.stat = A_WIS;
+        rpi.fail = 25;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     case ElementRealm::SEA:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("岩石溶解", "Stone to mud");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("岩石溶解", "Stone to mud"));
+        rpi.min_level = 5;
+        rpi.cost = 5;
+        rpi.stat = A_WIS;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     case ElementRealm::DARKNESS:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("闇の扉(半径%d)", "Door to darkness(rad %d)"), 15 + plev / 2);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5 + plev / 7;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(format(_("闇の扉(半径%d)", "Door to darkness(rad %d)"), 15 + plev / 2));
+        rpi.min_level = 5;
+        rpi.cost = 5 + plev / 7;
+        rpi.stat = A_WIS;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     case ElementRealm::CHAOS:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("現実変容", "Alter reality");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 35;
-        rc_ptr->power_desc[rc_ptr->num].cost = 30;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 40;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("現実変容", "Alter reality"));
+        rpi.min_level = 35;
+        rpi.cost = 30;
+        rpi.stat = A_WIS;
+        rpi.fail = 40;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     case ElementRealm::EARTH:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("地震", "Earthquake");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("地震", "Earthquake"));
+        rpi.min_level = 25;
+        rpi.cost = 15;
+        rpi.stat = A_WIS;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     case ElementRealm::DEATH:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("増殖阻止", "Sterilization");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("増殖阻止", "Sterilization"));
+        rpi.min_level = 5;
+        rpi.cost = 5;
+        rpi.stat = A_WIS;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     default:
         break;
index 88ff031..a90c68d 100644 (file)
 
 void switch_class_racial(player_type *creature_ptr, rc_type *rc_ptr)
 {
+    rpi_type rpi;
     switch (creature_ptr->pclass) {
     case CLASS_WARRIOR:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("剣の舞い", "Sword Dancing");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 40;
-        rc_ptr->power_desc[rc_ptr->num].cost = 75;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 35;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("剣の舞い", "Sword Dancing"));
+        rpi.min_level = 40;
+        rpi.cost = 75;
+        rpi.stat = A_DEX;
+        rpi.fail = 35;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_HIGH_MAGE:
         if (creature_ptr->realm1 == REALM_HEX) {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("詠唱をやめる", "Stop spell casting");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-            rc_ptr->power_desc[rc_ptr->num].cost = 0;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-            rc_ptr->power_desc[rc_ptr->num].fail = 0;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+            rpi = rc_ptr->make_power(_("詠唱をやめる", "Stop spell casting"));
+            rpi.min_level = 1;
+            rpi.cost = 0;
+            rpi.stat = A_INT;
+            rpi.fail = 0;
+            rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
             break;
         }
         /* Fall through */
     case CLASS_MAGE:
     case CLASS_SORCERER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("魔力食い", "Eat Magic");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 1;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 25;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("魔力食い", "Eat Magic"));
+        rpi.min_level = 25;
+        rpi.cost = 1;
+        rpi.stat = A_INT;
+        rpi.fail = 25;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_PRIEST:
         if (is_good_realm(creature_ptr->realm1)) {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("武器祝福", "Bless Weapon");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 35;
-            rc_ptr->power_desc[rc_ptr->num].cost = 70;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 50;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+            rpi = rc_ptr->make_power(_("武器祝福", "Bless Weapon"));
+            rpi.min_level = 35;
+            rpi.cost = 70;
+            rpi.stat = A_WIS;
+            rpi.fail = 50;
+            rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         } else {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("召魂", "Evocation");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 42;
-            rc_ptr->power_desc[rc_ptr->num].cost = 40;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 35;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+            rpi = rc_ptr->make_power(_("召魂", "Evocation"));
+            rpi.min_level = 42;
+            rpi.cost = 40;
+            rpi.stat = A_WIS;
+            rpi.fail = 35;
+            rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         }
 
         break;
     case CLASS_ROGUE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ヒット&アウェイ", "Hit and Away");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 8;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("ヒット&アウェイ", "Hit and Away"));
+        rpi.min_level = 8;
+        rpi.cost = 12;
+        rpi.stat = A_DEX;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_RANGER:
     case CLASS_SNIPER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("モンスター調査", "Probe Monster");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 20;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("モンスター調査", "Probe Monster"));
+        rpi.min_level = 15;
+        rpi.cost = 20;
+        rpi.stat = A_INT;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_PALADIN:
         if (is_good_realm(creature_ptr->realm1)) {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("ホーリー・ランス", "Holy Lance");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-            rc_ptr->power_desc[rc_ptr->num].cost = 30;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 30;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+            rpi = rc_ptr->make_power(_("ホーリー・ランス", "Holy Lance"));
+            rpi.min_level = 30;
+            rpi.cost = 30;
+            rpi.stat = A_WIS;
+            rpi.fail = 30;
+            rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         } else {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("ヘル・ランス", "Hell Lance");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-            rc_ptr->power_desc[rc_ptr->num].cost = 30;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 30;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+            rpi = rc_ptr->make_power(_("ヘル・ランス", "Hell Lance"));
+            rpi.min_level = 30;
+            rpi.cost = 30;
+            rpi.stat = A_WIS;
+            rpi.fail = 30;
+            rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         }
 
         break;
     case CLASS_WARRIOR_MAGE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("変換: HP→MP", "Convert HP to SP");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("変換: HP→MP", "Convert HP to SP"));
+        rpi.min_level = 25;
+        rpi.cost = 0;
+        rpi.stat = A_INT;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
 
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("変換: MP→HP", "Convert SP to HP");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("変換: MP→HP", "Convert SP to HP"));
+        rpi.min_level = 25;
+        rpi.cost = 0;
+        rpi.stat = A_INT;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_1);
         break;
     case CLASS_CHAOS_WARRIOR:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("幻惑の光", "Confusing Light");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 40;
-        rc_ptr->power_desc[rc_ptr->num].cost = 50;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 25;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("幻惑の光", "Confusing Light"));
+        rpi.min_level = 40;
+        rpi.cost = 50;
+        rpi.stat = A_INT;
+        rpi.fail = 25;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_MONK:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("構える", "Assume a Stance");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("構える", "Assume a Stance"));
+        rpi.min_level = 25;
+        rpi.cost = 0;
+        rpi.stat = A_DEX;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
 
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("百裂拳", "Double Attack");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = 30;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("百裂拳", "Double Attack"));
+        rpi.min_level = 30;
+        rpi.cost = 30;
+        rpi.stat = A_STR;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, -4);
         break;
     case CLASS_MINDCRAFTER:
     case CLASS_FORCETRAINER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("明鏡止水", "Clear Mind");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("明鏡止水", "Clear Mind"));
+        rpi.min_level = 15;
+        rpi.cost = 0;
+        rpi.stat = A_WIS;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_TOURIST:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("写真撮影", "Take a Photograph");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("写真撮影", "Take a Photograph"));
+        rpi.min_level = 1;
+        rpi.cost = 0;
+        rpi.stat = A_DEX;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
 
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("真・鑑定", "Identify True");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 20;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("真・鑑定", "Identify True"));
+        rpi.min_level = 25;
+        rpi.cost = 20;
+        rpi.stat = A_INT;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, -4);
         break;
     case CLASS_IMITATOR:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("倍返し", "Double Revenge");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = 100;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 30;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("倍返し", "Double Revenge"));
+        rpi.min_level = 30;
+        rpi.cost = 100;
+        rpi.stat = A_DEX;
+        rpi.fail = 30;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_BEASTMASTER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("生物支配", "Dominate a Living Thing");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = (creature_ptr->lev + 3) / 4;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("生物支配", "Dominate a Living Thing"));
+        rpi.min_level = 1;
+        rpi.cost = (creature_ptr->lev + 3) / 4;
+        rpi.stat = A_CHR;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
 
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("真・生物支配", "Dominate Living Things");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = (creature_ptr->lev + 20) / 2;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("真・生物支配", "Dominate Living Things"));
+        rpi.min_level = 30;
+        rpi.cost = (creature_ptr->lev + 20) / 2;
+        rpi.stat = A_CHR;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, -4);
         break;
     case CLASS_ARCHER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("弾/矢の製造", "Create Ammo");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("弾/矢の製造", "Create Ammo"));
+        rpi.min_level = 1;
+        rpi.cost = 0;
+        rpi.stat = A_DEX;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_MAGIC_EATER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("魔力の取り込み", "Absorb Magic");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("魔力の取り込み", "Absorb Magic"));
+        rpi.min_level = 1;
+        rpi.cost = 0;
+        rpi.stat = A_INT;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
 
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("強力発動", "Powerful Activation");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10 + (rc_ptr->lvl - 10) / 2;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("強力発動", "Powerful Activation"));
+        rpi.min_level = 10;
+        rpi.cost = 10 + (rc_ptr->lvl - 10) / 2;
+        rpi.stat = A_INT;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, -4);
         break;
     case CLASS_BARD:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("歌を止める", "Stop Singing");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("歌を止める", "Stop Singing"));
+        rpi.min_level = 1;
+        rpi.cost = 0;
+        rpi.stat = A_CHR;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_RED_MAGE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("連続魔", "Double Magic");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 48;
-        rc_ptr->power_desc[rc_ptr->num].cost = 20;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("連続魔", "Double Magic"));
+        rpi.min_level = 48;
+        rpi.cost = 20;
+        rpi.stat = A_INT;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_SAMURAI:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("気合いため", "Concentration");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("気合いため", "Concentration"));
+        rpi.min_level = 1;
+        rpi.cost = 0;
+        rpi.stat = A_WIS;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
 
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("型", "Assume a Stance");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("型", "Assume a Stance"));
+        rpi.min_level = 25;
+        rpi.cost = 0;
+        rpi.stat = A_DEX;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, -4);
         break;
     case CLASS_BLUE_MAGE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ラーニング", "Learning");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("ラーニング", "Learning"));
+        rpi.min_level = 1;
+        rpi.cost = 0;
+        rpi.stat = A_INT;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_CAVALRY:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("荒馬ならし", "Rodeo");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("荒馬ならし", "Rodeo"));
+        rpi.min_level = 10;
+        rpi.cost = 0;
+        rpi.stat = A_STR;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_BERSERKER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("帰還", "Recall");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("帰還", "Recall"));
+        rpi.min_level = 10;
+        rpi.cost = 10;
+        rpi.stat = A_DEX;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_MIRROR_MASTER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("鏡割り", "Break Mirrors");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("鏡割り", "Break Mirrors"));
+        rpi.min_level = 1;
+        rpi.cost = 0;
+        rpi.stat = A_INT;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
 
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("静水", "Mirror Concentration");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        rpi = rc_ptr->make_power(_("静水", "Mirror Concentration"));
+        rpi.min_level = 30;
+        rpi.cost = 0;
+        rpi.stat = A_INT;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, -4);
         break;
     case CLASS_SMITH:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("目利き", "Judgment");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("目利き", "Judgment"));
+        rpi.min_level = 5;
+        rpi.cost = 15;
+        rpi.stat = A_INT;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_NINJA:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("速駆け", "Quick Walk");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("速駆け", "Quick Walk"));
+        rpi.min_level = 20;
+        rpi.cost = 0;
+        rpi.stat = A_DEX;
+        rpi.fail = 0;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
         break;
     case CLASS_ELEMENTALIST:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("明鏡止水", "Clear Mind");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        rpi = rc_ptr->make_power(_("明鏡止水", "Clear Mind"));
+        rpi.min_level = 15;
+        rpi.cost = 0;
+        rpi.stat = A_WIS;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_CLASS_0);
 
         switch_element_racial(creature_ptr, rc_ptr);
         break;
     default:
-        rc_ptr->power_desc[0].racial_name = _("(なし)", "(none)");
         break;
     }
 }
index 512d4db..4122308 100644 (file)
 
 void select_mutation_racial(player_type *creature_ptr, rc_type *rc_ptr)
 {
+    rpi_type rpi;
+
     if (creature_ptr->muta.has(MUTA::SPIT_ACID)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("酸の唾", "Spit Acid");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 9;
-        rc_ptr->power_desc[rc_ptr->num].cost = 9;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::SPIT_ACID);
+        rpi = rc_ptr->make_power(_("酸の唾", "Spit Acid"));
+        rpi.min_level = 9;
+        rpi.cost = 9;
+        rpi.stat = A_DEX;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::SPIT_ACID));
     }
 
     if (creature_ptr->muta.has(MUTA::BR_FIRE)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("炎のブレス", "Fire Breath");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = rc_ptr->lvl;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 18;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::BR_FIRE);
+        rpi = rc_ptr->make_power(_("炎のブレス", "Fire Breath"));
+        rpi.min_level = 20;
+        rpi.cost = rc_ptr->lvl;
+        rpi.stat = A_CON;
+        rpi.fail = 18;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::BR_FIRE));
     }
 
     if (creature_ptr->muta.has(MUTA::HYPN_GAZE)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("催眠睨み", "Hypnotic Gaze");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 12;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 18;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::HYPN_GAZE);
+        rpi = rc_ptr->make_power(_("催眠睨み", "Hypnotic Gaze"));
+        rpi.min_level = 12;
+        rpi.cost = 12;
+        rpi.stat = A_CHR;
+        rpi.fail = 18;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::HYPN_GAZE));
     }
 
     if (creature_ptr->muta.has(MUTA::TELEKINES)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("念動力", "Telekinesis");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 9;
-        rc_ptr->power_desc[rc_ptr->num].cost = 9;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::TELEKINES);
+        rpi = rc_ptr->make_power(_("念動力", "Telekinesis"));
+        rpi.min_level = 9;
+        rpi.cost = 9;
+        rpi.stat = A_WIS;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::TELEKINES));
     }
 
     if (creature_ptr->muta.has(MUTA::VTELEPORT)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("テレポート", "Teleport");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 7;
-        rc_ptr->power_desc[rc_ptr->num].cost = 7;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::VTELEPORT);
+        rpi = rc_ptr->make_power(_("テレポート", "Teleport"));
+        rpi.min_level = 7;
+        rpi.cost = 7;
+        rpi.stat = A_WIS;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::VTELEPORT));
     }
 
     if (creature_ptr->muta.has(MUTA::MIND_BLST)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("精神攻撃", "Mind Blast");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 3;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::MIND_BLST);
+        rpi = rc_ptr->make_power(_("精神攻撃", "Mind Blast"));
+        rpi.min_level = 5;
+        rpi.cost = 3;
+        rpi.stat = A_WIS;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::MIND_BLST));
     }
 
     if (creature_ptr->muta.has(MUTA::RADIATION)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("放射能", "Emit Radiation");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::RADIATION);
+        rpi = rc_ptr->make_power(_("放射能", "Emit Radiation"));
+        rpi.min_level = 15;
+        rpi.cost = 15;
+        rpi.stat = A_CON;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::RADIATION));
     }
 
     if (creature_ptr->muta.has(MUTA::VAMPIRISM)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("吸血", "Vampiric Drain");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 2;
-        rc_ptr->power_desc[rc_ptr->num].cost = 1 + (rc_ptr->lvl / 3);
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 9;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::VAMPIRISM);
+        rpi = rc_ptr->make_power(_("吸血", "Vampiric Drain"));
+        rpi.min_level = 2;
+        rpi.cost = 1 + (rc_ptr->lvl / 3);
+        rpi.stat = A_CON;
+        rpi.fail = 9;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::VAMPIRISM));
     }
 
     if (creature_ptr->muta.has(MUTA::SMELL_MET)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("金属嗅覚", "Smell Metal");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 3;
-        rc_ptr->power_desc[rc_ptr->num].cost = 2;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::SMELL_MET);
+        rpi = rc_ptr->make_power(_("金属嗅覚", "Smell Metal"));
+        rpi.min_level = 3;
+        rpi.cost = 2;
+        rpi.stat = A_INT;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::SMELL_MET));
     }
 
     if (creature_ptr->muta.has(MUTA::SMELL_MON)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("敵臭嗅覚", "Smell Monsters");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 4;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::SMELL_MON);
+        rpi = rc_ptr->make_power(_("敵臭嗅覚", "Smell Monsters"));
+        rpi.min_level = 5;
+        rpi.cost = 4;
+        rpi.stat = A_INT;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::SMELL_MON));
     }
 
     if (creature_ptr->muta.has(MUTA::BLINK)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ショート・テレポート", "Blink");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 3;
-        rc_ptr->power_desc[rc_ptr->num].cost = 3;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::BLINK);
+        rpi = rc_ptr->make_power(_("ショート・テレポート", "Blink"));
+        rpi.min_level = 3;
+        rpi.cost = 3;
+        rpi.stat = A_WIS;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::BLINK));
     }
 
     if (creature_ptr->muta.has(MUTA::EAT_ROCK)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("岩食い", "Eat Rock");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 8;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 18;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::EAT_ROCK);
+        rpi = rc_ptr->make_power(_("岩食い", "Eat Rock"));
+        rpi.min_level = 8;
+        rpi.cost = 12;
+        rpi.stat = A_CON;
+        rpi.fail = 18;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::EAT_ROCK));
     }
 
     if (creature_ptr->muta.has(MUTA::SWAP_POS)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("位置交換", "Swap Position");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 16;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::SWAP_POS);
+        rpi = rc_ptr->make_power(_("位置交換", "Swap Position"));
+        rpi.min_level = 15;
+        rpi.cost = 12;
+        rpi.stat = A_DEX;
+        rpi.fail = 16;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::SWAP_POS));
     }
 
     if (creature_ptr->muta.has(MUTA::SHRIEK)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("叫び", "Shriek");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = 14;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 16;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::SHRIEK);
+        rpi = rc_ptr->make_power(_("叫び", "Shriek"));
+        rpi.min_level = 20;
+        rpi.cost = 14;
+        rpi.stat = A_CON;
+        rpi.fail = 16;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::SHRIEK));
     }
 
     if (creature_ptr->muta.has(MUTA::ILLUMINE)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("照明", "Illuminate");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 3;
-        rc_ptr->power_desc[rc_ptr->num].cost = 2;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::ILLUMINE);
+        rpi = rc_ptr->make_power(_("照明", "Illuminate"));
+        rpi.min_level = 3;
+        rpi.cost = 2;
+        rpi.stat = A_INT;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::ILLUMINE));
     }
 
     if (creature_ptr->muta.has(MUTA::DET_CURSE)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("呪い感知", "Detect Curses");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 7;
-        rc_ptr->power_desc[rc_ptr->num].cost = 14;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::DET_CURSE);
+        rpi = rc_ptr->make_power(_("呪い感知", "Detect Curses"));
+        rpi.min_level = 7;
+        rpi.cost = 14;
+        rpi.stat = A_WIS;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::DET_CURSE));
     }
 
     if (creature_ptr->muta.has(MUTA::BERSERK)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("狂戦士化", "Berserk");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 8;
-        rc_ptr->power_desc[rc_ptr->num].cost = 8;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::BERSERK);
+        rpi = rc_ptr->make_power(_("狂戦士化", "Berserk"));
+        rpi.min_level = 8;
+        rpi.cost = 8;
+        rpi.stat = A_STR;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::BERSERK));
     }
 
     if (creature_ptr->muta.has(MUTA::POLYMORPH)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("変身", "Polymorph");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 18;
-        rc_ptr->power_desc[rc_ptr->num].cost = 20;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 18;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::POLYMORPH);
+        rpi = rc_ptr->make_power(_("変身", "Polymorph"));
+        rpi.min_level = 18;
+        rpi.cost = 20;
+        rpi.stat = A_CON;
+        rpi.fail = 18;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::POLYMORPH));
     }
 
     if (creature_ptr->muta.has(MUTA::MIDAS_TCH)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ミダスの手", "Midas Touch");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::MIDAS_TCH);
+        rpi = rc_ptr->make_power(_("ミダスの手", "Midas Touch"));
+        rpi.min_level = 10;
+        rpi.cost = 5;
+        rpi.stat = A_INT;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::MIDAS_TCH));
     }
 
     if (creature_ptr->muta.has(MUTA::GROW_MOLD)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("カビ発生", "Grow Mold");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 6;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::GROW_MOLD);
+        rpi = rc_ptr->make_power(_("カビ発生", "Grow Mold"));
+        rpi.min_level = 1;
+        rpi.cost = 6;
+        rpi.stat = A_CON;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::GROW_MOLD));
     }
 
     if (creature_ptr->muta.has(MUTA::RESIST)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("エレメント耐性", "Resist Elements");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::RESIST);
+        rpi = rc_ptr->make_power(_("エレメント耐性", "Resist Elements"));
+        rpi.min_level = 10;
+        rpi.cost = 12;
+        rpi.stat = A_CON;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::RESIST));
     }
 
     if (creature_ptr->muta.has(MUTA::EARTHQUAKE)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("地震", "Earthquake");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 12;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 16;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::EARTHQUAKE);
+        rpi = rc_ptr->make_power(_("地震", "Earthquake"));
+        rpi.min_level = 12;
+        rpi.cost = 12;
+        rpi.stat = A_STR;
+        rpi.fail = 16;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::EARTHQUAKE));
     }
 
     if (creature_ptr->muta.has(MUTA::EAT_MAGIC)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("魔力食い", "Eat Magic");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 17;
-        rc_ptr->power_desc[rc_ptr->num].cost = 1;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::EAT_MAGIC);
+        rpi = rc_ptr->make_power(_("魔力食い", "Eat Magic"));
+        rpi.min_level = 17;
+        rpi.cost = 1;
+        rpi.stat = A_WIS;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::EAT_MAGIC));
     }
 
     if (creature_ptr->muta.has(MUTA::WEIGH_MAG)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("魔力感知", "Weigh Magic");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 6;
-        rc_ptr->power_desc[rc_ptr->num].cost = 6;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::WEIGH_MAG);
+        rpi = rc_ptr->make_power(_("魔力感知", "Weigh Magic"));
+        rpi.min_level = 6;
+        rpi.cost = 6;
+        rpi.stat = A_INT;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::WEIGH_MAG));
     }
 
     if (creature_ptr->muta.has(MUTA::STERILITY)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("増殖阻止", "Sterilize");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 12;
-        rc_ptr->power_desc[rc_ptr->num].cost = 23;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::STERILITY);
+        rpi = rc_ptr->make_power(_("増殖阻止", "Sterilize"));
+        rpi.min_level = 12;
+        rpi.cost = 23;
+        rpi.stat = A_CHR;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::STERILITY));
     }
 
     if (creature_ptr->muta.has(MUTA::HIT_AND_AWAY)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ヒット&アウェイ", "Panic Hit");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::HIT_AND_AWAY);
+        rpi = rc_ptr->make_power(_("ヒット&アウェイ", "Panic Hit"));
+        rpi.min_level = 10;
+        rpi.cost = 12;
+        rpi.stat = A_DEX;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::HIT_AND_AWAY));
     }
 
     if (creature_ptr->muta.has(MUTA::DAZZLE)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("眩惑", "Dazzle");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 7;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 8;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::DAZZLE);
+        rpi = rc_ptr->make_power(_("眩惑", "Dazzle"));
+        rpi.min_level = 7;
+        rpi.cost = 15;
+        rpi.stat = A_CHR;
+        rpi.fail = 8;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::DAZZLE));
     }
 
     if (creature_ptr->muta.has(MUTA::LASER_EYE)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("レーザー・アイ", "Laser Eye");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 7;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 9;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::LASER_EYE);
+        rpi = rc_ptr->make_power(_("レーザー・アイ", "Laser Eye"));
+        rpi.min_level = 7;
+        rpi.cost = 10;
+        rpi.stat = A_WIS;
+        rpi.fail = 9;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::LASER_EYE));
     }
 
     if (creature_ptr->muta.has(MUTA::RECALL)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("帰還", "Recall");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 17;
-        rc_ptr->power_desc[rc_ptr->num].cost = 50;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 16;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::RECALL);
+        rpi = rc_ptr->make_power(_("帰還", "Recall"));
+        rpi.min_level = 17;
+        rpi.cost = 50;
+        rpi.stat = A_INT;
+        rpi.fail = 16;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::RECALL));
     }
 
     if (creature_ptr->muta.has(MUTA::BANISH)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("邪悪消滅", "Banish Evil");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 25;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 18;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::BANISH);
+        rpi = rc_ptr->make_power(_("邪悪消滅", "Banish Evil"));
+        rpi.min_level = 25;
+        rpi.cost = 25;
+        rpi.stat = A_WIS;
+        rpi.fail = 18;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::BANISH));
     }
 
     if (creature_ptr->muta.has(MUTA::COLD_TOUCH)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("凍結の手", "Cold Touch");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 2;
-        rc_ptr->power_desc[rc_ptr->num].cost = 2;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 11;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::COLD_TOUCH);
+        rpi = rc_ptr->make_power(_("凍結の手", "Cold Touch"));
+        rpi.min_level = 2;
+        rpi.cost = 2;
+        rpi.stat = A_CON;
+        rpi.fail = 11;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::COLD_TOUCH));
     }
 
     if (creature_ptr->muta.has(MUTA::LAUNCHER)) {
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("アイテム投げ", "Throw Object");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = rc_ptr->lvl;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 6;
-        rc_ptr->power_desc[rc_ptr->num++].number = static_cast<int>(MUTA::LAUNCHER);
+        rpi = rc_ptr->make_power(_("アイテム投げ", "Throw Object"));
+        rpi.min_level = 1;
+        rpi.cost = rc_ptr->lvl;
+        rpi.stat = A_STR;
+        rpi.fail = 6;
+        rc_ptr->add_power(rpi, static_cast<int>(MUTA::LAUNCHER));
     }
 }
index 0a9f2e1..37e98d0 100644 (file)
 
 void set_mimic_racial_command(player_type *creature_ptr, rc_type *rc_ptr)
 {
+    rpi_type rpi;
     switch (creature_ptr->mimic_form) {
     case MIMIC_DEMON:
     case MIMIC_DEMON_LORD:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("地獄/火炎のブレス (ダメージ %d)", "Nether or Fire Breath (dam %d)"), rc_ptr->lvl * 3);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10 + rc_ptr->lvl / 3;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("地獄/火炎のブレス (ダメージ %d)", "Nether or Fire Breath (dam %d)"), rc_ptr->lvl * 3));
+        rpi.min_level = 15;
+        rpi.cost = 10 + rc_ptr->lvl / 3;
+        rpi.stat = A_CON;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case MIMIC_VAMPIRE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name, _("吸血", "Vampiric Drain");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 2;
-        rc_ptr->power_desc[rc_ptr->num].cost = 1 + (rc_ptr->lvl / 3);
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 9;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("吸血", "Vampiric Drain"));
+        rpi.min_level = 2;
+        rpi.cost = 1 + (rc_ptr->lvl / 3);
+        rpi.stat = A_CON;
+        rpi.fail = 9;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     }
 }
 
 void set_race_racial_command(player_type *creature_ptr, rc_type *rc_ptr)
 {
+    rpi_type rpi;
     switch (creature_ptr->prace) {
     case RACE_DWARF:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ドアと罠 感知", "Detect Doors+Traps");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("ドアと罠 感知", "Detect Doors+Traps"));
+        rpi.min_level = 5;
+        rpi.cost = 5;
+        rpi.stat = A_WIS;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_NIBELUNG:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ドアと罠 感知", "Detect Doors+Traps");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("ドアと罠 感知", "Detect Doors+Traps"));
+        rpi.min_level = 10;
+        rpi.cost = 5;
+        rpi.stat = A_WIS;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_HOBBIT:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("食糧生成", "Create Food");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("食糧生成", "Create Food"));
+        rpi.min_level = 15;
+        rpi.cost = 10;
+        rpi.stat = A_INT;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_GNOME:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("ショート・テレポート", "Blink");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("ショート・テレポート", "Blink"));
+        rpi.min_level = 5;
+        rpi.cost = 5;
+        rpi.stat = A_INT;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_HALF_ORC:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("恐怖除去", "Remove Fear");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 3;
-        rc_ptr->power_desc[rc_ptr->num].cost = 5;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = rc_ptr->is_warrior ? 5 : 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("恐怖除去", "Remove Fear"));
+        rpi.min_level = 3;
+        rpi.cost = 5;
+        rpi.stat = A_WIS;
+        rpi.fail = rc_ptr->is_warrior ? 5 : 10;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_HALF_TROLL:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("狂戦士化", "Berserk");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = rc_ptr->is_warrior ? 6 : 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("狂戦士化", "Berserk"));
+        rpi.min_level = 10;
+        rpi.cost = 12;
+        rpi.stat = A_STR;
+        rpi.fail = rc_ptr->is_warrior ? 6 : 12;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_BARBARIAN:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("狂戦士化", "Berserk");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 8;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = rc_ptr->is_warrior ? 6 : 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("狂戦士化", "Berserk"));
+        rpi.min_level = 8;
+        rpi.cost = 10;
+        rpi.stat = A_STR;
+        rpi.fail = rc_ptr->is_warrior ? 6 : 12;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_AMBERITE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("シャドウ・シフト", "Shadow Shifting");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = 50;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 50;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("シャドウ・シフト", "Shadow Shifting"));
+        rpi.min_level = 30;
+        rpi.cost = 50;
+        rpi.stat = A_INT;
+        rpi.fail = 50;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
 
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("パターン・ウォーク", "Pattern Mindwalking");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 40;
-        rc_ptr->power_desc[rc_ptr->num].cost = 75;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 50;
-        rc_ptr->power_desc[rc_ptr->num++].number = -2;
+        rpi = rc_ptr->make_power(_("パターン・ウォーク", "Pattern Mindwalking"));
+        rpi.min_level = 40;
+        rpi.cost = 75;
+        rpi.stat = A_WIS;
+        rpi.fail = 50;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_1);
         break;
     case RACE_HALF_OGRE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("爆発のルーン", "Explosive Rune");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 35;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("爆発のルーン", "Explosive Rune"));
+        rpi.min_level = 25;
+        rpi.cost = 35;
+        rpi.stat = A_INT;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_HALF_GIANT:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("岩石溶解", "Stone to Mud");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("岩石溶解", "Stone to Mud"));
+        rpi.min_level = 20;
+        rpi.cost = 10;
+        rpi.stat = A_STR;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_HALF_TITAN:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("スキャン・モンスター", "Probing");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("スキャン・モンスター", "Probing"));
+        rpi.min_level = 15;
+        rpi.cost = 10;
+        rpi.stat = A_INT;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_CYCLOPS:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("岩石投げ(ダメージ %d)", "Throw Boulder (dam %d)"), (3 * rc_ptr->lvl) / 2);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("岩石投げ(ダメージ %d)", "Throw Boulder (dam %d)"), (3 * rc_ptr->lvl) / 2));
+        rpi.min_level = 20;
+        rpi.cost = 15;
+        rpi.stat = A_STR;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_YEEK:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("モンスター恐慌", "Scare Monster");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("モンスター恐慌", "Scare Monster"));
+        rpi.min_level = 15;
+        rpi.cost = 15;
+        rpi.stat = A_WIS;
+        rpi.fail = 10;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_SPECTRE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("モンスター恐慌", "Scare Monster");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 4;
-        rc_ptr->power_desc[rc_ptr->num].cost = 6;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 3;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("モンスター恐慌", "Scare Monster"));
+        rpi.min_level = 4;
+        rpi.cost = 6;
+        rpi.stat = A_INT;
+        rpi.fail = 3;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_KLACKON:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("酸の唾 (ダメージ %d)", "Spit Acid (dam %d)"), rc_ptr->lvl);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 9;
-        rc_ptr->power_desc[rc_ptr->num].cost = 9;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("酸の唾 (ダメージ %d)", "Spit Acid (dam %d)"), rc_ptr->lvl));
+        rpi.min_level = 9;
+        rpi.cost = 9;
+        rpi.stat = A_DEX;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_KOBOLD:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("毒のダーツ (ダメージ %d)", "Poison Dart (dam %d)"), rc_ptr->lvl);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 12;
-        rc_ptr->power_desc[rc_ptr->num].cost = 8;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("毒のダーツ (ダメージ %d)", "Poison Dart (dam %d)"), rc_ptr->lvl));
+        rpi.min_level = 12;
+        rpi.cost = 8;
+        rpi.stat = A_DEX;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_DARK_ELF:
-        rc_ptr->power_desc[rc_ptr->num].racial_name
-            = format(_("マジック・ミサイル (ダメージ %dd%d)", "Magic Missile (dm %dd%d)"), 3 + ((rc_ptr->lvl - 1) / 5), 4);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 2;
-        rc_ptr->power_desc[rc_ptr->num].cost = 2;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 9;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("マジック・ミサイル (ダメージ %dd%d)", "Magic Missile (dm %dd%d)"), 3 + ((rc_ptr->lvl - 1) / 5), 4));
+        rpi.min_level = 2;
+        rpi.cost = 2;
+        rpi.stat = A_INT;
+        rpi.fail = 9;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_DRACONIAN:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("ブレス (ダメージ %d)", "Breath Weapon (dam %d)"), rc_ptr->lvl * 2);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = rc_ptr->lvl;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 12;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("ブレス (ダメージ %d)", "Breath Weapon (dam %d)"), rc_ptr->lvl * 2));
+        rpi.min_level = 1;
+        rpi.cost = rc_ptr->lvl;
+        rpi.stat = A_CON;
+        rpi.fail = 12;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_MIND_FLAYER:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("精神攻撃 (ダメージ %d)", "Mind Blast (dam %d)"), rc_ptr->lvl);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("精神攻撃 (ダメージ %d)", "Mind Blast (dam %d)"), rc_ptr->lvl));
+        rpi.min_level = 15;
+        rpi.cost = 12;
+        rpi.stat = A_INT;
+        rpi.fail = 14;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_IMP:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("ファイア・ボルト/ボール (ダメージ %d)", "Fire Bolt/Ball (dam %d)"), rc_ptr->lvl);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 9;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("ファイア・ボルト/ボール (ダメージ %d)", "Fire Bolt/Ball (dam %d)"), rc_ptr->lvl));
+        rpi.min_level = 9;
+        rpi.cost = 15;
+        rpi.stat = A_WIS;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_GOLEM:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("肌石化 (期間 1d20+30)", "Stone Skin (dur 1d20+30)");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 8;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("肌石化 (期間 1d20+30)", "Stone Skin (dur 1d20+30)"));
+        rpi.min_level = 20;
+        rpi.cost = 15;
+        rpi.stat = A_CON;
+        rpi.fail = 8;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_SKELETON:
     case RACE_ZOMBIE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("経験値復活", "Restore Experience");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = 30;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 18;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("経験値復活", "Restore Experience"));
+        rpi.min_level = 30;
+        rpi.cost = 30;
+        rpi.stat = A_WIS;
+        rpi.fail = 18;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_VAMPIRE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("吸血", "Vampiric Drain");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 2;
-        rc_ptr->power_desc[rc_ptr->num].cost = 1 + (rc_ptr->lvl / 3);
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 9;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("吸血", "Vampiric Drain"));
+        rpi.min_level = 2;
+        rpi.cost = 1 + (rc_ptr->lvl / 3);
+        rpi.stat = A_CON;
+        rpi.fail = 9;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_SPRITE:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("眠り粉", "Sleeping Dust");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 12;
-        rc_ptr->power_desc[rc_ptr->num].cost = 12;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("眠り粉", "Sleeping Dust"));
+        rpi.min_level = 12;
+        rpi.cost = 12;
+        rpi.stat = A_INT;
+        rpi.fail = 15;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_BALROG:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = format(_("地獄/火炎のブレス (ダメージ %d)", "Nether or Fire Breath (dam %d)"), rc_ptr->lvl * 3);
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10 + rc_ptr->lvl / 3;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(format(_("地獄/火炎のブレス (ダメージ %d)", "Nether or Fire Breath (dam %d)"), rc_ptr->lvl * 3));
+        rpi.min_level = 15;
+        rpi.cost = 10 + rc_ptr->lvl / 3;
+        rpi.stat = A_CON;
+        rpi.fail = 20;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_KUTAR:
-        rc_ptr->power_desc[rc_ptr->num].racial_name = _("横に伸びる", "Expand Horizontally (dur 30+1d20)");
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 8;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi = rc_ptr->make_power(_("横に伸びる", "Expand Horizontally (dur 30+1d20)"));
+        rpi.min_level = 20;
+        rpi.cost = 15;
+        rpi.stat = A_CHR;
+        rpi.fail = 8;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     case RACE_ANDROID:
         if (creature_ptr->lev < 10) {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("レイガン", "Ray Gun");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-            rc_ptr->power_desc[rc_ptr->num].cost = 7;
-            rc_ptr->power_desc[rc_ptr->num].fail = 8;
+            rpi = rc_ptr->make_power(_("レイガン", "Ray Gun"));
+            rpi.min_level = 1;
+            rpi.cost = 7;
+            rpi.fail = 8;
         } else if (creature_ptr->lev < 25) {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("ブラスター", "Blaster");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-            rc_ptr->power_desc[rc_ptr->num].cost = 13;
-            rc_ptr->power_desc[rc_ptr->num].fail = 10;
+            rpi = rc_ptr->make_power(_("ブラスター", "Blaster"));
+            rpi.min_level = 10;
+            rpi.cost = 13;
+            rpi.fail = 10;
         } else if (creature_ptr->lev < 35) {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("バズーカ", "Bazooka");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-            rc_ptr->power_desc[rc_ptr->num].cost = 26;
-            rc_ptr->power_desc[rc_ptr->num].fail = 12;
+            rpi = rc_ptr->make_power(_("バズーカ", "Bazooka"));
+            rpi.min_level = 25;
+            rpi.cost = 26;
+            rpi.fail = 12;
         } else if (creature_ptr->lev < 45) {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("ビームキャノン", "Beam Cannon");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 35;
-            rc_ptr->power_desc[rc_ptr->num].cost = 40;
-            rc_ptr->power_desc[rc_ptr->num].fail = 15;
+            rpi = rc_ptr->make_power(_("ビームキャノン", "Beam Cannon"));
+            rpi.min_level = 35;
+            rpi.cost = 40;
+            rpi.fail = 15;
         } else {
-            rc_ptr->power_desc[rc_ptr->num].racial_name = _("ロケット", "Rocket");
-            rc_ptr->power_desc[rc_ptr->num].min_level = 45;
-            rc_ptr->power_desc[rc_ptr->num].cost = 60;
-            rc_ptr->power_desc[rc_ptr->num].fail = 18;
+            rpi = rc_ptr->make_power(_("ロケット", "Rocket"));
+            rpi.min_level = 45;
+            rpi.cost = 60;
+            rpi.fail = 18;
         }
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num++].number = -1;
+        rpi.stat = A_STR;
+        rc_ptr->add_power(rpi, RC_IDX_RACE_0);
         break;
     default:
         break;
index 91f86d1..e05f15b 100644 (file)
@@ -1,15 +1,28 @@
 #include "racial/racial-util.h"
 #include "io/input-key-requester.h"
 
-rc_type *initialize_rc_type(player_type *creature_ptr, rc_type *rc_ptr)
+rc_type::rc_type(player_type *creature_ptr)
 {
-    rc_ptr->num = 0;
-    rc_ptr->command_code = 0;
-    rc_ptr->ask = TRUE;
-    rc_ptr->lvl = creature_ptr->lev;
-    rc_ptr->cast = FALSE;
-    rc_ptr->is_warrior = (creature_ptr->pclass == CLASS_WARRIOR || creature_ptr->pclass == CLASS_BERSERKER);
-    rc_ptr->menu_line = use_menu ? 1 : 0;
+    this->ask = true;
+    this->lvl = creature_ptr->lev;
+    this->is_warrior = (creature_ptr->pclass == CLASS_WARRIOR || creature_ptr->pclass == CLASS_BERSERKER);
+    this->menu_line = use_menu ? 1 : 0;
+}
+
+rpi_type rc_type::make_power(std::string name)
+{
+    auto rpi = rpi_type();
+    rpi.racial_name = name;
+    return rpi;
+}
 
-    return rc_ptr;
+void rc_type::add_power(rpi_type& rpi, int number)
+{
+    rpi.number = number;
+    this->power_desc.emplace_back(rpi);
+}
+
+COMMAND_CODE rc_type::size()
+{
+    return (COMMAND_CODE)this->power_desc.size();
 }
index 5b3acf2..c127de6 100644 (file)
@@ -2,39 +2,71 @@
 
 #include "system/angband.h"
 #include <string>
-#include <array>
+#include <vector>
 
-#define MAX_RACIAL_POWERS 36
+/*!
+ * @brief レイシャル/クラスパワー呼び出し番号
+ */
+enum rc_index : int {
+    RC_IDX_RACE_0 = -1, //!< 種族0
+    RC_IDX_RACE_1 = -2, //!< 種族1
+    RC_IDX_CLASS_0 = -3, //!< 職業0
+    RC_IDX_CLASS_1 = -4, //!< 職業1
+};
 
 /*!
  * レイシャル/クラスパワー定義構造体
  */
 struct rpi_type {
-    std::string racial_name{};
-    PLAYER_LEVEL min_level{}; //!<体得レベル
-    int cost{};
-    int stat{};
-    PERCENTAGE fail{};
-    int number{};
-    int racial_cost{};
+    std::string racial_name{}; //!< パワー名
+    PLAYER_LEVEL min_level{}; //!< 使用可能最小レベル
+    int cost{}; //!< コスト
+    int stat{}; //!< 使用に必要な能力値
+    PERCENTAGE fail{}; //!< 難易度(失敗率)
+    int number{}; //!< 呼び出し番号
+    int racial_cost{}; //!< @todo 種族コスト、おそらく不要
 };
 
 /*!
  * レイシャル/クラスパワー管理構造体
  */
 struct rc_type {
-    std::array<rpi_type, MAX_RACIAL_POWERS> power_desc{};
-    int num{};
-    COMMAND_CODE command_code{};
-    int ask{};
-    PLAYER_LEVEL lvl{};
-    bool flag{};
-    bool redraw{};
-    bool cast{};
-    bool is_warrior{};
-    char choice{};
-    char out_val[160]{};
-    int menu_line{};
-};
+    std::vector<rpi_type> power_desc{}; //!< パワー定義配列
+    COMMAND_CODE command_code{}; //!< 使用しようとしているパワー番号
+    int ask{}; //!< 選択後確認するかどうか
+    PLAYER_LEVEL lvl{}; //!< プレイヤーレベル
+    bool is_warrior{}; //!< 戦士/狂戦士かどうか
+    bool flag{}; //!< パワーを選んだかどうか
+    bool redraw{}; //!< 再描画するかどうか
+    bool cast{}; //!< パワーが使用されたかどうか
+    char choice{}; //!< コマンドキー
+    char out_val[160]{}; //!< 出力文字列用バッファ
+    int menu_line{}; //!< 現在選択中の行
 
-rc_type *initialize_rc_type(player_type *creature_ptr, rc_type *rc_ptr);
+    /*!
+     * @brief コンストラクタ
+     * @param creature_ptr プレイヤー情報への参照ポインタ
+     * @return 管理構造体
+     */
+    rc_type(player_type *creature_prt);
+
+    /*!
+     * @brief 指定したパワー名のレイシャル/クラスパワー定義構造体を返す
+     * @param name パワー名
+     * @return パワー定義構造体
+     */
+    rpi_type make_power(std::string name);
+
+    /*!
+     * @brief レイシャル/クラスパワー定義を追加
+     * @param rpi レイシャル/クラスパワー定義(参照渡し)
+     * @param number 呼び出し番号
+     */
+    void add_power(rpi_type &rpi, int number);
+
+    /*!
+     * @brief レイシャル/クラスパワー数を返す
+     * @return パワー数
+     */
+    COMMAND_CODE size();
+};