OSDN Git Service

[Refactor] ボール系魔法のコピペを低減
[hengbandforosx/hengbandosx.git] / src / flavor / flavor-describer.cpp
index e16959b..e767cb7 100644 (file)
@@ -16,8 +16,6 @@
 #include "mind/mind-sniper.h"
 #include "mind/mind-weaponsmith.h"
 #include "object-enchant/object-ego.h"
-#include "object-enchant/object-smith.h"
-#include "object-enchant/smith-types.h"
 #include "object-enchant/special-object-flags.h"
 #include "object-enchant/tr-types.h"
 #include "object-enchant/trg-types.h"
 #include "object/object-flags.h"
 #include "object/object-kind.h"
 #include "perception/object-perception.h"
+#include "player-base/player-class.h"
 #include "player/player-status-table.h"
 #include "player/player-status.h"
+#include "smith/object-smith.h"
+#include "smith/smith-types.h"
 #include "specific-object/bow.h"
 #include "sv-definition/sv-lite-types.h"
 #include "sv-definition/sv-weapon-types.h"
@@ -65,7 +66,7 @@ static void describe_chest_trap(flavor_type *flavor_ptr)
         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
         break;
     case ChestTrapType::EXPLODE:
-        flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(爆発装置)", " (Explosion Device)"));
+        flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(爆発装置)", " (Explosive Device)"));
         break;
     case ChestTrapType::SUMMON:
     case ChestTrapType::BIRD_STORM:
@@ -79,18 +80,23 @@ static void describe_chest_trap(flavor_type *flavor_ptr)
     case ChestTrapType::ALARM:
         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(警報装置)", " (Alarm)"));
         break;
-    default:
+    case ChestTrapType::SCATTER:
+        flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(アイテム散乱)", " (Scatter)"));
+        break;
+    case ChestTrapType::MAX:
         throw("Invalid chest trap type is specified!");
     }
 }
 
 static void describe_chest(flavor_type *flavor_ptr)
 {
-    if (flavor_ptr->o_ptr->tval != ItemPrimaryType::TV_CHEST)
+    if (flavor_ptr->o_ptr->tval != ItemKindType::CHEST) {
         return;
+    }
 
-    if (!flavor_ptr->known)
+    if (!flavor_ptr->known) {
         return;
+    }
 
     if (!flavor_ptr->o_ptr->pval) {
         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(空)", " (empty)"));
@@ -98,10 +104,11 @@ static void describe_chest(flavor_type *flavor_ptr)
     }
 
     if (flavor_ptr->o_ptr->pval < 0) {
-        if (chest_traps[0 - flavor_ptr->o_ptr->pval].any())
+        if (chest_traps[0 - flavor_ptr->o_ptr->pval].any()) {
             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(解除済)", " (disarmed)"));
-        else
+        } else {
             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(非施錠)", " (unlocked)"));
+        }
 
         return;
     }
@@ -111,23 +118,28 @@ static void describe_chest(flavor_type *flavor_ptr)
 
 static void decide_tval_show(flavor_type *flavor_ptr)
 {
-    if (flavor_ptr->tr_flags.has(TR_SHOW_MODS))
+    if (flavor_ptr->tr_flags.has(TR_SHOW_MODS)) {
         flavor_ptr->show_weapon = true;
+    }
 
-    if (flavor_ptr->o_ptr->is_smith() && (Smith::object_effect(flavor_ptr->o_ptr) == SmithEffect::SLAY_GLOVE))
+    if (flavor_ptr->o_ptr->is_smith() && (Smith::object_effect(flavor_ptr->o_ptr) == SmithEffectType::SLAY_GLOVE)) {
         flavor_ptr->show_weapon = true;
+    }
 
-    if (flavor_ptr->o_ptr->to_h && flavor_ptr->o_ptr->to_d)
+    if (flavor_ptr->o_ptr->to_h && flavor_ptr->o_ptr->to_d) {
         flavor_ptr->show_weapon = true;
+    }
 
-    if (flavor_ptr->o_ptr->ac)
+    if (flavor_ptr->o_ptr->ac) {
         flavor_ptr->show_armour = true;
+    }
 }
 
-static void describe_weapon_dice(player_type *player_ptr, flavor_type *flavor_ptr)
+static void describe_weapon_dice(PlayerType *player_ptr, flavor_type *flavor_ptr)
 {
-    if (!flavor_ptr->known && object_is_quest_target(player_ptr->current_floor_ptr->inside_quest, flavor_ptr->o_ptr))
+    if (!flavor_ptr->known && object_is_quest_target(player_ptr->current_floor_ptr->quest_number, flavor_ptr->o_ptr)) {
         return;
+    }
 
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
@@ -139,11 +151,12 @@ static void describe_weapon_dice(player_type *player_ptr, flavor_type *flavor_pt
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
 }
 
-static void describe_bow(player_type *player_ptr, flavor_type *flavor_ptr)
+static void describe_bow(PlayerType *player_ptr, flavor_type *flavor_ptr)
 {
     flavor_ptr->power = bow_tmul(flavor_ptr->o_ptr->sval);
-    if (flavor_ptr->tr_flags.has(TR_XTRA_MIGHT))
+    if (flavor_ptr->tr_flags.has(TR_XTRA_MIGHT)) {
         flavor_ptr->power++;
+    }
 
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
@@ -156,11 +169,13 @@ static void describe_bow(player_type *player_ptr, flavor_type *flavor_ptr)
         num_fire = calc_num_fire(player_ptr, flavor_ptr->o_ptr);
     } else {
         auto flgs = object_flags(flavor_ptr->o_ptr);
-        if (flgs.has(TR_XTRA_SHOTS))
+        if (flgs.has(TR_XTRA_SHOTS)) {
             num_fire += 100;
+        }
     }
-    if ((num_fire == 0) || (flavor_ptr->power <= 0) || !flavor_ptr->known)
+    if ((num_fire == 0) || (flavor_ptr->power <= 0) || !flavor_ptr->known) {
         return;
+    }
 
     flavor_ptr->fire_rate = bow_energy(flavor_ptr->o_ptr->sval) / num_fire;
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
@@ -172,19 +187,19 @@ static void describe_bow(player_type *player_ptr, flavor_type *flavor_ptr)
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
 }
 
-static void describe_tval(player_type *player_ptr, flavor_type *flavor_ptr)
+static void describe_tval(PlayerType *player_ptr, flavor_type *flavor_ptr)
 {
     switch (flavor_ptr->o_ptr->tval) {
-    case ItemPrimaryType::TV_SHOT:
-    case ItemPrimaryType::TV_BOLT:
-    case ItemPrimaryType::TV_ARROW:
-    case ItemPrimaryType::TV_HAFTED:
-    case ItemPrimaryType::TV_POLEARM:
-    case ItemPrimaryType::TV_SWORD:
-    case ItemPrimaryType::TV_DIGGING:
+    case ItemKindType::SHOT:
+    case ItemKindType::BOLT:
+    case ItemKindType::ARROW:
+    case ItemKindType::HAFTED:
+    case ItemKindType::POLEARM:
+    case ItemKindType::SWORD:
+    case ItemKindType::DIGGING:
         describe_weapon_dice(player_ptr, flavor_ptr);
         break;
-    case ItemPrimaryType::TV_BOW:
+    case ItemKindType::BOW:
         describe_bow(player_ptr, flavor_ptr);
         break;
 
@@ -195,8 +210,9 @@ static void describe_tval(player_type *player_ptr, flavor_type *flavor_ptr)
 
 static void describe_named_item_tval(flavor_type *flavor_ptr)
 {
-    if (!flavor_ptr->known)
+    if (!flavor_ptr->known) {
         return;
+    }
 
     if (flavor_ptr->show_weapon) {
         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
@@ -224,7 +240,7 @@ static void describe_named_item_tval(flavor_type *flavor_ptr)
     }
 }
 
-static void describe_fire_energy(player_type *player_ptr, flavor_type *flavor_ptr)
+static void describe_fire_energy(PlayerType *player_ptr, flavor_type *flavor_ptr)
 {
     ENERGY energy_fire = bow_energy(flavor_ptr->bow_ptr->sval);
     if (player_ptr->num_fire == 0) {
@@ -236,40 +252,46 @@ static void describe_fire_energy(player_type *player_ptr, flavor_type *flavor_pt
     flavor_ptr->avgdam /= energy_fire;
     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->avgdam);
     flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "/turn" : "");
-    if (!show_ammo_crit_ratio)
+    if (!show_ammo_crit_ratio) {
         return;
+    }
 
     int percent = calc_crit_ratio_shot(player_ptr, flavor_ptr->known ? flavor_ptr->o_ptr->to_h : 0, flavor_ptr->known ? flavor_ptr->bow_ptr->to_h : 0);
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '/');
     flavor_ptr->t = object_desc_num(flavor_ptr->t, percent / 100);
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '.');
-    if (percent % 100 < 10)
+    if (percent % 100 < 10) {
         flavor_ptr->t = object_desc_chr(flavor_ptr->t, '0');
+    }
 
     flavor_ptr->t = object_desc_num(flavor_ptr->t, percent % 100);
     flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "% crit" : "%");
 }
 
-static void describe_bow_power(player_type *player_ptr, flavor_type *flavor_ptr)
+static void describe_bow_power(PlayerType *player_ptr, flavor_type *flavor_ptr)
 {
     flavor_ptr->avgdam = flavor_ptr->o_ptr->dd * (flavor_ptr->o_ptr->ds + 1) * 10 / 2;
     int tmul = bow_tmul(flavor_ptr->bow_ptr->sval);
-    if (flavor_ptr->bow_ptr->is_known())
+    if (flavor_ptr->bow_ptr->is_known()) {
         flavor_ptr->avgdam += (flavor_ptr->bow_ptr->to_d * 10);
+    }
 
-    if (flavor_ptr->known)
+    if (flavor_ptr->known) {
         flavor_ptr->avgdam += (flavor_ptr->o_ptr->to_d * 10);
+    }
 
-    if (player_ptr->xtra_might)
+    if (player_ptr->xtra_might) {
         tmul++;
+    }
 
     tmul = tmul * (100 + (int)(adj_str_td[player_ptr->stat_index[A_STR]]) - 128);
     flavor_ptr->avgdam *= tmul;
     flavor_ptr->avgdam /= (100 * 10);
     flavor_ptr->avgdam = boost_concentration_damage(player_ptr, flavor_ptr->avgdam);
 
-    if (flavor_ptr->avgdam < 0)
+    if (flavor_ptr->avgdam < 0) {
         flavor_ptr->avgdam = 0;
+    }
 
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
@@ -286,7 +308,7 @@ static void describe_bow_power(player_type *player_ptr, flavor_type *flavor_ptr)
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
 }
 
-static void describe_spike_power(player_type *player_ptr, flavor_type *flavor_ptr)
+static void describe_spike_power(PlayerType *player_ptr, flavor_type *flavor_ptr)
 {
     int avgdam = player_ptr->mighty_throw ? (1 + 3) : 1;
     int16_t energy_fire = 100 - player_ptr->lev;
@@ -312,8 +334,9 @@ static void describe_known_item_ac(flavor_type *flavor_ptr)
         return;
     }
 
-    if (flavor_ptr->o_ptr->to_a == 0)
+    if (flavor_ptr->o_ptr->to_a == 0) {
         return;
+    }
 
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
@@ -328,8 +351,9 @@ static void describe_ac(flavor_type *flavor_ptr)
         return;
     }
 
-    if (!flavor_ptr->show_armour)
+    if (!flavor_ptr->show_armour) {
         return;
+    }
 
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
@@ -341,7 +365,7 @@ static void describe_charges_staff_wand(flavor_type *flavor_ptr)
 {
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
-    if ((flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_STAFF) && (flavor_ptr->o_ptr->number > 1)) {
+    if ((flavor_ptr->o_ptr->tval == ItemKindType::STAFF) && (flavor_ptr->o_ptr->number > 1)) {
         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->number);
         flavor_ptr->t = object_desc_str(flavor_ptr->t, "x ");
     }
@@ -350,8 +374,9 @@ static void describe_charges_staff_wand(flavor_type *flavor_ptr)
     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("回分", " charge"));
 #ifdef JP
 #else
-    if (flavor_ptr->o_ptr->pval != 1)
+    if (flavor_ptr->o_ptr->pval != 1) {
         flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
+    }
 #endif
 
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
@@ -359,20 +384,23 @@ static void describe_charges_staff_wand(flavor_type *flavor_ptr)
 
 static void describe_charges_rod(flavor_type *flavor_ptr)
 {
-    if (flavor_ptr->o_ptr->timeout == 0)
+    if (flavor_ptr->o_ptr->timeout == 0) {
         return;
+    }
 
     if (flavor_ptr->o_ptr->number <= 1) {
         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
         return;
     }
 
-    if (flavor_ptr->k_ptr->pval == 0)
+    if (flavor_ptr->k_ptr->pval == 0) {
         flavor_ptr->k_ptr->pval = 1;
+    }
 
     flavor_ptr->power = (flavor_ptr->o_ptr->timeout + (flavor_ptr->k_ptr->pval - 1)) / flavor_ptr->k_ptr->pval;
-    if (flavor_ptr->power > flavor_ptr->o_ptr->number)
+    if (flavor_ptr->power > flavor_ptr->o_ptr->number) {
         flavor_ptr->power = flavor_ptr->o_ptr->number;
+    }
 
     flavor_ptr->t = object_desc_str(flavor_ptr->t, " (");
     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->power);
@@ -390,8 +418,9 @@ static void describe_specific_pval(flavor_type *flavor_ptr)
         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("攻撃", " attack"));
 #ifdef JP
 #else
-        if (ABS(flavor_ptr->o_ptr->pval) != 1)
+        if (std::abs(flavor_ptr->o_ptr->pval) != 1) {
             flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
+        }
 #endif
 
         return;
@@ -407,14 +436,16 @@ static void describe_specific_pval(flavor_type *flavor_ptr)
         return;
     }
 
-    if (flavor_ptr->tr_flags.has(TR_INFRA))
+    if (flavor_ptr->tr_flags.has(TR_INFRA)) {
         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("赤外線視力", " to infravision"));
+    }
 }
 
 static void describe_pval(flavor_type *flavor_ptr)
 {
-    if (flavor_ptr->tr_flags.has_none_of(TR_PVAL_FLAG_MASK))
+    if (flavor_ptr->tr_flags.has_none_of(TR_PVAL_FLAG_MASK)) {
         return;
+    }
 
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
@@ -430,15 +461,13 @@ static void describe_pval(flavor_type *flavor_ptr)
 
 static void describe_lamp_life(flavor_type *flavor_ptr)
 {
-    if ((flavor_ptr->o_ptr->tval != ItemPrimaryType::TV_LITE) || (flavor_ptr->o_ptr->is_fixed_artifact() || (flavor_ptr->o_ptr->sval == SV_LITE_FEANOR)))
+    if ((flavor_ptr->o_ptr->tval != ItemKindType::LITE) || (flavor_ptr->o_ptr->is_fixed_artifact() || (flavor_ptr->o_ptr->sval == SV_LITE_FEANOR))) {
         return;
+    }
 
     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(", " (with "));
-    if (flavor_ptr->o_ptr->name2 == EGO_LITE_LONG)
-        flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->xtra4 * 2);
-    else
-        flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->xtra4);
-
+    auto fuel_magnification = flavor_ptr->o_ptr->ego_idx == EgoType::LITE_LONG ? 2 : 1;
+    flavor_ptr->t = object_desc_num(flavor_ptr->t, fuel_magnification * flavor_ptr->o_ptr->fuel);
     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("ターンの寿命)", " turns of light)"));
 }
 
@@ -448,18 +477,21 @@ static void describe_lamp_life(flavor_type *flavor_ptr)
  */
 static void describe_remaining(flavor_type *flavor_ptr)
 {
-    if (!flavor_ptr->known)
+    if (!flavor_ptr->known) {
         return;
+    }
 
-    if (((flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_STAFF) || (flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_WAND)))
+    if (((flavor_ptr->o_ptr->tval == ItemKindType::STAFF) || (flavor_ptr->o_ptr->tval == ItemKindType::WAND))) {
         describe_charges_staff_wand(flavor_ptr);
-    else if (flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_ROD)
+    } else if (flavor_ptr->o_ptr->tval == ItemKindType::ROD) {
         describe_charges_rod(flavor_ptr);
+    }
 
     describe_pval(flavor_ptr);
     describe_lamp_life(flavor_ptr);
-    if (flavor_ptr->o_ptr->timeout && (flavor_ptr->o_ptr->tval != ItemPrimaryType::TV_ROD))
+    if (flavor_ptr->o_ptr->timeout && (flavor_ptr->o_ptr->tval != ItemKindType::ROD)) {
         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
+    }
 }
 
 static void decide_item_feeling(flavor_type *flavor_ptr)
@@ -475,9 +507,7 @@ static void decide_item_feeling(flavor_type *flavor_ptr)
         return;
     }
 
-    if (((flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_RING) || (flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_AMULET) || (flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_LITE)
-            || (flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_FIGURINE))
-        && flavor_ptr->aware && !flavor_ptr->known && !(flavor_ptr->o_ptr->ident & IDENT_SENSE)) {
+    if (((flavor_ptr->o_ptr->tval == ItemKindType::RING) || (flavor_ptr->o_ptr->tval == ItemKindType::AMULET) || (flavor_ptr->o_ptr->tval == ItemKindType::LITE) || (flavor_ptr->o_ptr->tval == ItemKindType::FIGURINE)) && flavor_ptr->aware && !flavor_ptr->known && !(flavor_ptr->o_ptr->ident & IDENT_SENSE)) {
         strcpy(flavor_ptr->fake_insc_buf, _("未鑑定", "unidentified"));
         return;
     }
@@ -487,8 +517,9 @@ static void decide_item_feeling(flavor_type *flavor_ptr)
         return;
     }
 
-    if (!flavor_ptr->aware && flavor_ptr->o_ptr->is_tried())
+    if (!flavor_ptr->aware && flavor_ptr->o_ptr->is_tried()) {
         strcpy(flavor_ptr->fake_insc_buf, _("未判明", "tried"));
+    }
 }
 
 /*!
@@ -499,7 +530,7 @@ static void decide_item_feeling(flavor_type *flavor_ptr)
  * @param mode 表記に関するオプション指定
  * @return 現在クエスト達成目的のアイテムならばTRUEを返す
  */
-void describe_flavor(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode)
+void describe_flavor(PlayerType *player_ptr, char *buf, ObjectType *o_ptr, BIT_FLAGS mode)
 {
     flavor_type tmp_flavor;
     flavor_type *flavor_ptr = initialize_flavor_type(&tmp_flavor, buf, o_ptr, mode);
@@ -515,10 +546,11 @@ void describe_flavor(player_type *player_ptr, char *buf, object_type *o_ptr, BIT
     describe_named_item_tval(flavor_ptr);
     if (!(mode & OD_DEBUG)) {
         flavor_ptr->bow_ptr = &player_ptr->inventory_list[INVEN_BOW];
-        if ((flavor_ptr->bow_ptr->k_idx != 0) && (flavor_ptr->o_ptr->tval == bow_tval_ammo(flavor_ptr->bow_ptr)))
+        if ((flavor_ptr->bow_ptr->k_idx != 0) && (flavor_ptr->o_ptr->tval == bow_tval_ammo(flavor_ptr->bow_ptr))) {
             describe_bow_power(player_ptr, flavor_ptr);
-        else if ((player_ptr->pclass == CLASS_NINJA) && (flavor_ptr->o_ptr->tval == ItemPrimaryType::TV_SPIKE))
+        } else if (PlayerClass(player_ptr).equals(PlayerClassType::NINJA) && (flavor_ptr->o_ptr->tval == ItemKindType::SPIKE)) {
             describe_spike_power(player_ptr, flavor_ptr);
+        }
     }
 
     describe_ac(flavor_ptr);