OSDN Git Service

[Feature] モンスターにダメージを与えた際の属性を取得
authordis- <dis.rogue@gmail.com>
Sun, 7 Nov 2021 10:48:05 +0000 (19:48 +0900)
committerdis- <dis.rogue@gmail.com>
Sun, 7 Nov 2021 12:00:59 +0000 (21:00 +0900)
MonsterDamageProcessorからダメージの属性を取得可能とした。
打撃/射撃に関しては既存の属性に該当しそうなもののみ暫定で定義した。
必要ならばスレイングに対して拡張する。

17 files changed:
src/cmd-action/cmd-attack.cpp
src/combat/aura-counterattack.cpp
src/combat/shoot.cpp
src/combat/slaying.cpp
src/combat/slaying.h
src/effect/effect-monster-util.h
src/effect/effect-monster.cpp
src/effect/effect-monster.h
src/monster-attack/monster-attack-player.cpp
src/monster/monster-damage.cpp
src/monster/monster-damage.h
src/object-use/throw-execution.cpp
src/player-attack/player-attack-util.h
src/player-attack/player-attack.cpp
src/specific-object/torch.cpp
src/specific-object/torch.h
src/spell/spell-types.h

index 1be06dd..db5525c 100644 (file)
@@ -149,7 +149,7 @@ static void natural_attack(player_type *player_ptr, MONSTER_IDX m_idx, MUTA atta
     case MUTA::TRUNK:
     case MUTA::TENTACLES:
     default: {
-        MonsterDamageProcessor mdp(player_ptr, m_idx, k, fear);
+        MonsterDamageProcessor mdp(player_ptr, m_idx, k, fear, GF_ATTACK);
         *mdeath = mdp.mon_take_hit(nullptr);
         break;
     }
index c8ed3ec..c85069e 100644 (file)
@@ -46,7 +46,7 @@ static void aura_fire_by_monster_attack(player_type *player_ptr, monap_type *mon
     HIT_POINT dam = damroll(2, 6);
     dam = mon_damage_mod(player_ptr, monap_ptr->m_ptr, dam, false);
     msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), monap_ptr->m_name);
-    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear);
+    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, GF_FIRE);
     if (mdp.mon_take_hit(_("は灰の山になった。", " turns into a pile of ash."))) {
         monap_ptr->blinked = false;
         monap_ptr->alive = false;
@@ -69,7 +69,7 @@ static void aura_elec_by_monster_attack(player_type *player_ptr, monap_type *mon
     HIT_POINT dam = damroll(2, 6);
     dam = mon_damage_mod(player_ptr, monap_ptr->m_ptr, dam, false);
     msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), monap_ptr->m_name);
-    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear);
+    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, GF_ELEC);
     if (mdp.mon_take_hit(_("は燃え殻の山になった。", " turns into a pile of cinders."))) {
         monap_ptr->blinked = false;
         monap_ptr->alive = false;
@@ -92,7 +92,7 @@ static void aura_cold_by_monster_attack(player_type *player_ptr, monap_type *mon
     HIT_POINT dam = damroll(2, 6);
     dam = mon_damage_mod(player_ptr, monap_ptr->m_ptr, dam, false);
     msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), monap_ptr->m_name);
-    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear);
+    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, GF_COLD);
     if (mdp.mon_take_hit(_("は凍りついた。", " was frozen."))) {
         monap_ptr->blinked = false;
         monap_ptr->alive = false;
@@ -112,7 +112,7 @@ static void aura_shards_by_monster_attack(player_type *player_ptr, monap_type *m
         HIT_POINT dam = damroll(2, 6);
         dam = mon_damage_mod(player_ptr, monap_ptr->m_ptr, dam, false);
         msg_format(_("%^sは鏡の破片をくらった!", "%^s gets sliced!"), monap_ptr->m_name);
-        MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear);
+        MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, GF_SHARDS);
         if (mdp.mon_take_hit(_("はズタズタになった。", " is torn to pieces."))) {
             monap_ptr->blinked = false;
             monap_ptr->alive = false;
@@ -142,7 +142,7 @@ static void aura_holy_by_monster_attack(player_type *player_ptr, monap_type *mon
     HIT_POINT dam = damroll(2, 6);
     dam = mon_damage_mod(player_ptr, monap_ptr->m_ptr, dam, false);
     msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), monap_ptr->m_name);
-    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear);
+    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, GF_HOLY_FIRE);
     if (mdp.mon_take_hit(_("は倒れた。", " is destroyed."))) {
         monap_ptr->blinked = false;
         monap_ptr->alive = false;
@@ -168,7 +168,7 @@ static void aura_force_by_monster_attack(player_type *player_ptr, monap_type *mo
     HIT_POINT dam = damroll(2, 6);
     dam = mon_damage_mod(player_ptr, monap_ptr->m_ptr, dam, false);
     msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), monap_ptr->m_name);
-    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear);
+    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, GF_MANA);
     if (mdp.mon_take_hit(_("は倒れた。", " is destroyed."))) {
         monap_ptr->blinked = false;
         monap_ptr->alive = false;
@@ -201,7 +201,7 @@ static void aura_shadow_by_monster_attack(player_type *player_ptr, monap_type *m
 
     dam = mon_damage_mod(player_ptr, monap_ptr->m_ptr, dam, false);
     msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), monap_ptr->m_name);
-    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear);
+    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, GF_DARK);
     if (mdp.mon_take_hit(_("は倒れた。", " is destroyed."))) {
         monap_ptr->blinked = false;
         monap_ptr->alive = false;
index 86e2c15..09ae036 100644 (file)
 #include "world/world-object.h"
 
 /*!
+ * @brief 矢弾の属性を定義する
+ * @param bow_ptr 弓のオブジェクト構造体参照ポインタ
+ * @param arrow_ptr 矢弾のオブジェクト構造体参照ポインタ
+ * @return スナイパーの射撃属性、弓矢の属性を考慮する。デフォルトはGF_PLAYER_SHOOT。
+ */
+EFFECT_ID shot_effect_type(player_type *player_ptr, object_type *bow_ptr, object_type *arrow_ptr, SPELL_IDX snipe_type)
+{
+    TrFlags flags{};
+    auto arrow_flags = object_flags(arrow_ptr);
+    auto bow_flags = object_flags(bow_ptr);
+
+    flags = bow_flags | arrow_flags;
+
+    static const struct snipe_convert_table_t {
+        SPELL_IDX snipe_type;
+        EFFECT_ID effect_type;
+    } snipe_convert_table[] = {
+        { SP_LITE,      GF_LITE },
+        { SP_FIRE,      GF_FIRE },
+        { SP_COLD,      GF_COLD },
+        { SP_ELEC,      GF_ELEC },
+        { SP_KILL_WALL, GF_KILL_WALL },
+        { SP_EVILNESS,  GF_HELL_FIRE },
+        { SP_HOLYNESS,  GF_HOLY_FIRE },
+        { SP_FINAL,     GF_MANA },
+    };
+
+    static const struct brand_convert_table_t {
+        tr_type brand_type;
+        EFFECT_ID effect_type;
+    } brand_convert_table[] = {
+        { TR_BRAND_ACID,    GF_ACID },
+        { TR_BRAND_FIRE,    GF_FIRE },
+        { TR_BRAND_ELEC,    GF_ELEC },
+        { TR_BRAND_COLD,    GF_COLD },
+        { TR_BRAND_POIS,    GF_POIS },
+        { TR_SLAY_GOOD,     GF_HELL_FIRE },
+        { TR_KILL_GOOD,     GF_HELL_FIRE },
+        { TR_SLAY_EVIL,     GF_HOLY_FIRE },
+        { TR_KILL_EVIL,     GF_HOLY_FIRE },
+    };
+
+    for (size_t i = 0; i < sizeof(snipe_convert_table) / sizeof(snipe_convert_table[0]); ++i) {
+        const struct snipe_convert_table_t *p = &snipe_convert_table[i];
+
+        if (snipe_type == p->snipe_type)
+            return p->effect_type;
+    }
+
+    for (size_t i = 0; i < sizeof(brand_convert_table) / sizeof(brand_convert_table[0]); ++i) {
+        const struct brand_convert_table_t *p = &brand_convert_table[i];
+
+        if (flags.has(p->brand_type))
+            return p->effect_type;
+    }
+
+    if ((flags.has(TR_FORCE_WEAPON)) && (player_ptr->csp > (player_ptr->msp / 30))) {
+        return GF_MANA;
+    }
+
+    return GF_PLAYER_SHOOT;
+}
+
+/*!
  * @brief 矢弾を射撃した際のスレイ倍率をかけた結果を返す /
  * Determines the odds of an object breaking when thrown at a monster
  * @param bow_ptr 弓のオブジェクト構造体参照ポインタ
@@ -392,9 +456,10 @@ void exe_fire(player_type *player_ptr, INVENTORY_IDX item, object_type *j_ptr, S
 
     object_type forge;
     object_type *q_ptr;
-
     object_type *o_ptr;
 
+    EFFECT_ID effect_type = GF_PLAYER_SHOOT;
+
     bool hit_body = false;
 
     GAME_TEXT o_name[MAX_NLEN];
@@ -691,6 +756,8 @@ void exe_fire(player_type *player_ptr, INVENTORY_IDX item, object_type *j_ptr, S
                             base_dam = tdam;
                         }
                     } else {
+
+                        effect_type = shot_effect_type(player_ptr, j_ptr, q_ptr, snipe_type);
                         /* Apply special damage */
                         tdam = calc_shot_damage_with_slay(player_ptr, j_ptr, q_ptr, tdam, m_ptr, snipe_type);
                         tdam = critical_shot(player_ptr, q_ptr->weight, q_ptr->to_h, j_ptr->to_h, tdam);
@@ -724,7 +791,7 @@ void exe_fire(player_type *player_ptr, INVENTORY_IDX item, object_type *j_ptr, S
                     }
 
                     /* Hit the monster, check for death */
-                    MonsterDamageProcessor mdp(player_ptr, c_mon_ptr->m_idx, tdam, &fear);
+                    MonsterDamageProcessor mdp(player_ptr, c_mon_ptr->m_idx, tdam, &fear, effect_type);
                     if (mdp.mon_take_hit(extract_note_dies(real_r_idx(m_ptr)))) {
                         /* Dead monster */
                     }
index 3bd43e8..224a433 100644 (file)
@@ -14,6 +14,7 @@
 #include "realm/realm-hex-numbers.h"
 #include "specific-object/torch.h"
 #include "spell-realm/spells-hex.h"
+#include "spell/spell-types.h"
 #include "system/monster-race-definition.h"
 #include "system/monster-type-definition.h"
 #include "system/object-type-definition.h"
@@ -206,3 +207,71 @@ HIT_POINT calc_attack_damage_with_slay(player_type *player_ptr, object_type *o_p
         mult = 150;
     return (tdam * mult / 10);
 }
+
+EFFECT_ID melee_effect_type(player_type *player_ptr, object_type *o_ptr, combat_options mode)
+{
+    if (player_ptr->pclass == PlayerClassType::SAMURAI) {
+        static const struct samurai_convert_table_t {
+            combat_options hissatsu_type;
+            EFFECT_ID effect_type;
+        } samurai_convert_table[] = {
+            { HISSATSU_FIRE,    GF_FIRE },
+            { HISSATSU_COLD,    GF_COLD },
+            { HISSATSU_ELEC,    GF_ELEC },
+            { HISSATSU_POISON,  GF_POIS },
+            { HISSATSU_HAGAN,   GF_KILL_WALL },
+        };
+
+        for (size_t i = 0; i < sizeof(samurai_convert_table) / sizeof(samurai_convert_table[0]); ++i) {
+            const struct samurai_convert_table_t *p = &samurai_convert_table[i];
+
+            if (mode == p->hissatsu_type)
+                return p->effect_type;
+        }
+    }
+
+    auto flgs = object_flags(o_ptr);
+
+    if (player_ptr->special_attack & (ATTACK_ACID))
+        flgs.set(TR_BRAND_ACID);
+    if (player_ptr->special_attack & (ATTACK_COLD))
+        flgs.set(TR_BRAND_COLD);
+    if (player_ptr->special_attack & (ATTACK_ELEC))
+        flgs.set(TR_BRAND_ELEC);
+    if (player_ptr->special_attack & (ATTACK_FIRE))
+        flgs.set(TR_BRAND_FIRE);
+    if (player_ptr->special_attack & (ATTACK_POIS))
+        flgs.set(TR_BRAND_POIS);
+
+    if (SpellHex(player_ptr).is_spelling_specific(HEX_RUNESWORD))
+        flgs.set(TR_SLAY_GOOD);
+    
+    static const struct brand_convert_table_t {
+        tr_type brand_type;
+        EFFECT_ID effect_type;
+    } brand_convert_table[] = {
+        { TR_BRAND_ACID, GF_ACID },
+        { TR_BRAND_FIRE, GF_FIRE },
+        { TR_BRAND_ELEC, GF_ELEC },
+        { TR_BRAND_COLD, GF_COLD },
+        { TR_BRAND_POIS, GF_POIS },
+        { TR_SLAY_GOOD, GF_HELL_FIRE },
+        { TR_KILL_GOOD, GF_HELL_FIRE },
+        { TR_SLAY_EVIL, GF_HOLY_FIRE },
+        { TR_KILL_EVIL, GF_HOLY_FIRE },
+    };
+
+    for (size_t i = 0; i < sizeof(brand_convert_table) / sizeof(brand_convert_table[0]); ++i) {
+        const struct brand_convert_table_t *p = &brand_convert_table[i];
+
+        if (flgs.has(p->brand_type))
+            return p->effect_type;
+    }
+
+    
+    if ((flgs.has(TR_FORCE_WEAPON)) && (player_ptr->csp > (o_ptr->dd * o_ptr->ds / 5))) {
+        return GF_MANA;
+    }
+
+    return GF_ATTACK;
+}
index eda45f7..52dd81c 100644 (file)
@@ -11,3 +11,4 @@ struct player_type;
 MULTIPLY mult_slaying(player_type *player_ptr, MULTIPLY mult, const TrFlags &flgs, monster_type *m_ptr);
 MULTIPLY mult_brand(player_type *player_ptr, MULTIPLY mult, const TrFlags &flgs, monster_type *m_ptr);
 HIT_POINT calc_attack_damage_with_slay(player_type *player_ptr, object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, combat_options mode, bool thrown);
+EFFECT_ID melee_effect_type(player_type *player_ptr, object_type *o_ptr, combat_options mode);
index 26df61b..dd794d8 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "system/angband.h"
+#include "spell/spell-types.h"
 
 struct grid_type;;
 struct monster_type;
index cb91abf..6be7040 100644 (file)
@@ -248,7 +248,7 @@ static bool heal_leaper(player_type *player_ptr, effect_monster_type *em_ptr)
 static bool deal_effect_damage_from_player(player_type *player_ptr, effect_monster_type *em_ptr)
 {
     bool fear = false;
-    MonsterDamageProcessor mdp(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam, &fear);
+    MonsterDamageProcessor mdp(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam, &fear, em_ptr->effect_type);
     if (mdp.mon_take_hit(em_ptr->note_dies))
         return true;
 
index 40c2eed..1390c31 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "system/angband.h"
+#include "spell/spell-types.h"
 
 struct player_type;
 bool affect_monster(player_type *player_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flag, bool see_s_msg);
index 8e85835..822d137 100644 (file)
@@ -243,7 +243,7 @@ static void monster_explode(player_type *player_ptr, monap_type *monap_ptr)
     }
 
     sound(SOUND_EXPLODE);
-    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, monap_ptr->m_ptr->hp + 1, &monap_ptr->fear);
+    MonsterDamageProcessor mdp(player_ptr, monap_ptr->m_idx, monap_ptr->m_ptr->hp + 1, &monap_ptr->fear, GF_NONE);
     if (mdp.mon_take_hit(nullptr)) {
         monap_ptr->blinked = false;
         monap_ptr->alive = false;
index 59d4b5b..716f00c 100644 (file)
  * @param m_idx ダメージを与えたモンスターのID
  * @param dam 与えたダメージ量
  * @param fear ダメージによってモンスターが恐慌状態に陥ったならばtrue
+ * @param type 与えたダメージの種類
  * @param note モンスターが倒された際の特別なメッセージ述語
  */
-MonsterDamageProcessor::MonsterDamageProcessor(player_type *player_ptr, MONSTER_IDX m_idx, HIT_POINT dam, bool *fear)
+MonsterDamageProcessor::MonsterDamageProcessor(player_type *player_ptr, MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, EFFECT_ID effect_type)
     : player_ptr(player_ptr)
     , m_idx(m_idx)
     , dam(dam)
     , fear(fear)
+    , effect_type(effect_type)
 {
 }
 
@@ -88,7 +90,7 @@ bool MonsterDamageProcessor::mon_take_hit(concptr note)
     }
 
     if (allow_debug_options) {
-        msg_format(_("合計%d/%dのダメージを与えた。", "You do %d (out of %d) damage."), m_ptr->dealt_damage, m_ptr->maxhp);
+        msg_format(_("合計%d/%dのダメージを与えた。(EffectID: %d)", "You do %d (out of %d) damage. (EffectID: %d)"), m_ptr->dealt_damage, m_ptr->maxhp, this->effect_type);
     }
 
     if (this->process_dead_exp_virtue(note, &exp_mon)) {
index 18b5227..21c9904 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "monster-race/race-indice-types.h"
 #include "system/angband.h"
+#include "spell/spell-types.h"
 #include <tuple>
 #include <vector>
 
@@ -11,7 +12,7 @@ struct player_type;
 typedef std::vector<std::tuple<monster_race_type, monster_race_type, monster_race_type>> combined_uniques;
 class MonsterDamageProcessor {
 public:
-    MonsterDamageProcessor(player_type *player_ptr, MONSTER_IDX m_idx, HIT_POINT dam, bool *fear);
+    MonsterDamageProcessor(player_type *player_ptr, MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, EFFECT_ID effect_type);
     virtual ~MonsterDamageProcessor() = default;
     bool mon_take_hit(concptr note);
 
@@ -20,6 +21,7 @@ private:
     MONSTER_IDX m_idx;
     HIT_POINT dam;
     bool *fear;
+    EFFECT_ID effect_type;
     void get_exp_from_mon(monster_type *m_ptr, HIT_POINT exp_dam);
     bool genocide_chaos_patron();
     bool process_dead_exp_virtue(concptr note, monster_type *exp_mon);
index 0d96282..f793979 100644 (file)
@@ -52,6 +52,7 @@
 #include "player/player-status-table.h"
 #include "racial/racial-android.h"
 #include "specific-object/torch.h"
+#include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
 #include "system/grid-type-definition.h"
 #include "system/monster-type-definition.h"
@@ -434,7 +435,11 @@ void ObjectThrowEntity::attack_racial_power()
         this->m_ptr->hp - this->tdam, this->m_ptr->maxhp, this->m_ptr->max_maxhp);
 
     auto fear = false;
-    MonsterDamageProcessor mdp(this->player_ptr, this->g_ptr->m_idx, this->tdam, &fear);
+    EFFECT_ID effect_type = GF_PLAYER_SHOOT;
+    if (is_active_torch(this->o_ptr))
+        effect_type = GF_FIRE;
+
+    MonsterDamageProcessor mdp(this->player_ptr, this->g_ptr->m_idx, this->tdam, &fear, effect_type);
     if (mdp.mon_take_hit(extract_note_dies(real_r_idx(this->m_ptr)))) {
         return;
     }
index ca9cf9e..150d53c 100644 (file)
@@ -54,4 +54,5 @@ typedef struct player_attack_type {
     int drain_result{}; //!< 吸血した累積量
     int drain_left{}; //!< 吸血できる残量(最大MAX_VAMPIRIC_DRAIN)
     bool weak{}; //!< 打撃効果でモンスターが弱くなったかどうか
+    EFFECT_ID effect_type{}; //!< 与えたダメージの種類 
 } player_attack_type;
index cad9a0e..53597b0 100644 (file)
@@ -414,7 +414,7 @@ static void apply_damage_negative_effect(player_attack_type *pa_ptr, bool is_zan
  */
 static bool check_fear_death(player_type *player_ptr, player_attack_type *pa_ptr, const int num, const bool is_lowlevel)
 {
-    MonsterDamageProcessor mdp(player_ptr, pa_ptr->m_idx, pa_ptr->attack_damage, pa_ptr->fear);
+    MonsterDamageProcessor mdp(player_ptr, pa_ptr->m_idx, pa_ptr->attack_damage, pa_ptr->fear, pa_ptr->effect_type);
     if (!mdp.mon_take_hit(nullptr))
         return false;
 
@@ -539,6 +539,7 @@ void exe_player_attack_to_monster(player_type *player_ptr, POSITION y, POSITION
         if (!process_attack_hit(player_ptr, pa_ptr, chance))
             continue;
 
+        pa_ptr->effect_type = melee_effect_type(player_ptr, o_ptr, pa_ptr->mode);
         apply_actual_attack(player_ptr, pa_ptr, &do_quake, is_zantetsu_nullified, is_ej_nullified);
         calc_drain(pa_ptr);
         if (check_fear_death(player_ptr, pa_ptr, num, is_lowlevel))
index f5c6d78..1bb6536 100644 (file)
 #include <vector>
 
 /*!
+ * @brief 該当オブジェクトが残量アリの松明か否かを判定。
+ * @param o_ptr オブジェクトの構造体参照ポインタ
+ * @return 残量アリの松明ならtrue
+ */
+bool is_active_torch(object_type *o_ptr)
+{
+    return (o_ptr->tval == ItemKindType::LITE) && (o_ptr->sval == SV_LITE_TORCH) && (o_ptr->xtra4 > 0);
+}
+
+/*!
  * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
  * Torches have special abilities when they are flaming.
  * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
@@ -27,7 +37,7 @@
  */
 void torch_flags(object_type *o_ptr, TrFlags &flgs)
 {
-    if ((o_ptr->tval != ItemKindType::LITE) || (o_ptr->sval != SV_LITE_TORCH) || (o_ptr->xtra4 <= 0))
+    if (!is_active_torch(o_ptr))
         return;
 
     flgs.set(TR_BRAND_FIRE);
@@ -44,7 +54,7 @@ void torch_flags(object_type *o_ptr, TrFlags &flgs)
  */
 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
 {
-    if ((o_ptr->tval != ItemKindType::LITE) || (o_ptr->sval != SV_LITE_TORCH) || (o_ptr->xtra4 <= 0))
+    if (!is_active_torch(o_ptr))
         return;
 
     *dd = 1;
@@ -58,7 +68,7 @@ void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
  */
 void torch_lost_fuel(object_type *o_ptr)
 {
-    if ((o_ptr->tval != ItemKindType::LITE) || (o_ptr->sval != SV_LITE_TORCH))
+    if (!is_active_torch(o_ptr))
         return;
 
     o_ptr->xtra4 -= (FUEL_TORCH / 25);
index 2250381..756add8 100644 (file)
@@ -6,6 +6,7 @@
 
 struct object_type;
 struct player_type;
+bool is_active_torch(object_type *o_ptr);
 void torch_flags(object_type *o_ptr, TrFlags &flgs);
 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds);
 void torch_lost_fuel(object_type *o_ptr);
index 4c9eeed..7b7448a 100644 (file)
@@ -106,5 +106,6 @@ enum spells_type
        GF_VOID = 118,              /*!< 魔法効果: 虚無 */
        GF_ABYSS = 119,             /*!< 魔法効果: 深淵 */
     GF_HUNGRY = 120,            /*!< 魔法効果: 空腹>*/
-       MAX_GF = 121,                   /*!< 欠番を無視した最大サイズ (直上の値+1) */
+    GF_PLAYER_SHOOT = 121,             /*!< 属性取得用: プレイヤーの射撃/投擲>*/
+       MAX_GF = 122,                   /*!< 欠番を無視した最大サイズ (直上の値+1) */
 };