OSDN Git Service

[Fix] 打撃効果 RBE_NONE の警告メッセージが出るバグを修正
authortaotao54321 <taotao54321@gmail.com>
Sat, 13 Feb 2021 05:51:22 +0000 (14:51 +0900)
committertaotao54321 <taotao54321@gmail.com>
Sat, 13 Feb 2021 07:40:26 +0000 (16:40 +0900)
r_info.txt の "B:" トークンで method だけが定義されていて effect がない
ものがあり、その場合 effect が RBE_NONE になっていた。
これに該当するのは「金をせがむ」「よだれをたらす」などのフレーバー的行動
のみなので、Discord での議論も踏まえて RBE_FLAVOR を新設し、RBE_NONE は
従来通り異常値扱いにした。

とりあえず v2.2.1 の仕様を踏襲し、RBE_FLAVOR は必中扱いとする。
ただしこれだとフレーバー的行動でも対邪悪結界や変わり身が発動するので、そ
の辺は議論の余地ありかも。
また、rbe_type のバリアントが増えたので MAX_MBE, mbe_info も更新する必要
があるが、それは #105 に回す。

lib/edit/r_info.txt
src/info-reader/race-info-tokens-table.c
src/info-reader/race-info-tokens-table.h
src/lore/combat-types-setter.c
src/melee/melee-switcher.c
src/monster-attack/monster-attack-effect.h
src/monster-attack/monster-attack-player.c
src/monster-attack/monster-attack-switcher.c

index 08aea00..7257ca6 100644 (file)
@@ -207,7 +207,7 @@ E:Filthy street urchin
 G:t:D
 I:110:1d4:4:1:40
 W:0:2:0:0:10:14
-B:BEG
+B:BEG:FLAVOR
 B:TOUCH:EAT_GOLD
 F:MALE | EVIL | WILD_TOWN | WILD_ONLY
 F:RAND_25 | FRIENDS | HUMAN |
@@ -303,8 +303,8 @@ E:Farmer Maggot
 G:h:w
 I:110:35d10:40:10:3
 W:0:3:0:0:0:0
-B:MOAN
-B:MOAN
+B:MOAN:FLAVOR
+B:MOAN:FLAVOR
 B:HIT:HURT:1d5
 F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | FRIENDLY
 F:FORCE_MAXHP | WILD_TOWN | WILD_ONLY | ONLY_ITEM | DROP_90 | DROP_GREAT
@@ -328,7 +328,7 @@ E:Blubbering idiot
 G:t:W
 I:110:1d2:6:1:0
 W:0:1:0:0:0:0
-B:DROOL
+B:DROOL:FLAVOR
 F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOWN | WILD_ONLY
 F:RAND_25 | EAT_LOSE_INT | HUMAN |
 F:TAKE_ITEM
@@ -342,7 +342,7 @@ E:Hobo
 G:t:g
 I:110:1d2:6:1:0
 W:0:1:0:0:0:0
-B:DROOL
+B:DROOL:FLAVOR
 F:MALE | DROP_SKELETON | DROP_CORPSE | WILD_TOWN | WILD_ONLY
 F:RAND_25 | EAT_LOSE_CHR | HUMAN |
 F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR
@@ -355,7 +355,7 @@ E:Raving lunatic
 G:t:G
 I:120:4d4:6:1:0
 W:0:1:0:0:0:0
-B:DROOL
+B:DROOL:FLAVOR
 F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOWN | WILD_ONLY
 F:RAND_25 | EAT_LOSE_WIS | HUMAN |
 F:TAKE_ITEM
@@ -368,7 +368,7 @@ E:Pitiful looking beggar
 G:t:U
 I:110:1d4:10:1:40
 W:0:1:0:0:10:14
-B:BEG
+B:BEG:FLAVOR
 F:MALE | DROP_SKELETON | DROP_CORPSE | HUMAN |
 F:RAND_25 | WILD_TOWN | WILD_ONLY
 F:TAKE_ITEM | OPEN_DOOR
@@ -388,7 +388,7 @@ E:Mangy looking leper
 G:t:u
 I:110:1d1:10:1:50
 W:0:1:0:0:0:0
-B:BEG
+B:BEG:FLAVOR
 B:TOUCH:DISEASE
 F:MALE | DROP_CORPSE | DROP_SKELETON | HUMAN |
 F:RAND_25 | WILD_TOWN | WILD_ONLY
@@ -418,7 +418,7 @@ E:Singing, happy drunk
 G:t:y
 I:110:2d3:10:1:0
 W:0:1:0:0:0:0
-B:BEG
+B:BEG:FLAVOR
 F:MALE | HAS_LITE_1
 F:RAND_50 | DROP_SKELETON | DROP_CORPSE | HUMAN |
 F:ONLY_GOLD | DROP_60 | WILD_TOWN | WILD_ONLY
@@ -751,9 +751,9 @@ E:Greater Hell-Beast
 G:U:s
 I:115:15d100:10:100:99
 W:1:6:0:250:0:0
-B:GAZE
-B:GAZE
-B:CRUSH
+B:GAZE:FLAVOR
+B:GAZE:FLAVOR
+B:CRUSH:FLAVOR
 F:EVIL | IM_ACID | IM_ELEC | IM_FIRE | IM_POIS | IM_COLD | UNIQUE |
 F:RES_LITE | RES_DARK | RES_NETH | RES_WATE | RES_PLAS | RES_SHAR | RES_SOUN |
 F:RES_CHAO | RES_NEXU | RES_DISE | RES_WALL | RES_INER | RES_TIME | RES_GRAV |
@@ -787,8 +787,8 @@ I:110:5d6:14:4:10
 W:2:1:0:8:12:103
 B:CRAWL:POISON:1d10
 B:CRAWL:EAT_FOOD
-B:DROOL
-B:DROOL
+B:DROOL:FLAVOR
+B:DROOL:FLAVOR
 F:RAND_50 | DROP_90 | CAN_SWIM | DROP_CORPSE
 F:EMPTY_MIND | TAKE_ITEM | KILL_BODY | EAT_CONF |
 F:IM_POIS
@@ -1638,7 +1638,7 @@ I:110:13d9:20:20:20
 W:5:2:0:25:0:0
 B:HIT:HURT:2d5
 B:HIT:HURT:2d5
-B:DROOL
+B:DROOL:FLAVOR
 F:EVIL | OPEN_DOOR | BASH_DOOR | DROP_90 | DROP_SKELETON
 D:$Drooling, insectoid aliens with disgusting habits.
 D:よだれを垂らしている昆虫型のエイリアンで、気持ち悪い習性を持っている。
@@ -2937,8 +2937,8 @@ I:120:12d10:18:20:10
 W:10:3:0:80:0:0
 B:HIT:HURT:1d9
 B:HIT:HURT:1d8
-B:INSULT
-B:INSULT
+B:INSULT:FLAVOR
+B:INSULT:FLAVOR
 F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE
 F:PREVENT_SUDDEN_MAGIC | FORCE_MAXHP | 
 F:ESCORT | ESCORTS | HAS_LITE_2 |
@@ -20835,8 +20835,8 @@ E:Madame Debby
 G:k:v
 I:120:24d100:30:100:5
 W:51:3:0:16000:0:0
-B:INSULT
-B:INSULT
+B:INSULT:FLAVOR
+B:INSULT:FLAVOR
 F:UNIQUE | FEMALE | CAN_SPEAK | DROP_CORPSE
 F:PREVENT_SUDDEN_MAGIC | FORCE_MAXHP | CAN_SWIM | ELDRITCH_HORROR | HUMAN |
 F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | 
index c532ed9..ce59888 100644 (file)
@@ -75,6 +75,7 @@ concptr r_info_blow_effect[NUM_R_BLOW_EFFECT] = {
        "SUPERHURT",
        "INERTIA",
        "STUN",
+       "FLAVOR",
        NULL
 };
 
index ec21cf3..b8afc28 100644 (file)
@@ -3,7 +3,7 @@
 #include "system/angband.h"
 
 #define NUM_R_BLOW_METHOD 27
-#define NUM_R_BLOW_EFFECT 37
+#define NUM_R_BLOW_EFFECT 38
 #define NUM_R_FLAGS_1 32
 #define NUM_R_FLAGS_2 32
 #define NUM_R_FLAGS_3 32
index d4cbe62..4ca1b86 100644 (file)
@@ -191,5 +191,8 @@ void set_monster_blow_effect(lore_type *lore_ptr, int m)
     case RBE_STUN:
         lore_ptr->q = _("朦朧とさせる", "stun");
         break;
+    case RBE_FLAVOR:
+        // フレーバー打撃には何の効果もないので付加説明もない。
+        break;
     }
 }
index 601a6d4..e31fd25 100644 (file)
@@ -229,6 +229,10 @@ void decide_monster_attack_effect(player_type *subject_ptr, mam_type *mam_ptr)
     case RBE_STUN:
         mam_ptr->pt = GF_SOUND;
         break;
+    case RBE_FLAVOR:
+        // フレーバー打撃には何の効果もない。
+        mam_ptr->pt = GF_NONE;
+        break;
     default:
         mam_ptr->pt = GF_NONE;
         break;
index d1366f3..d1504c7 100644 (file)
@@ -40,4 +40,5 @@ typedef enum rbe_type {
     RBE_SUPERHURT = 33, /*!< モンスターの攻撃効果: 強力に攻撃する*/
     RBE_INERTIA = 34, /*!< モンスターの攻撃効果: 減速させる*/
     RBE_STUN = 35, /*!< モンスターの攻撃効果: 朦朧とさせる*/
+    RBE_FLAVOR = 36, /*!< モンスターの攻撃効果: フレーバー(メッセージ表示のみ) */
 } rbe_type;
index 100eaf6..62ecb41 100644 (file)
@@ -390,7 +390,6 @@ static bool process_monster_blows(player_type *target_ptr, monap_type *monap_ptr
 
     for (int ap_cnt = 0; ap_cnt < MAX_NUM_BLOWS; ap_cnt++) {
         monap_ptr->obvious = FALSE;
-        HIT_POINT power = 0;
         monap_ptr->damage = 0;
         monap_ptr->act = NULL;
         monap_ptr->effect = r_ptr->blow[ap_cnt].effect;
@@ -403,6 +402,7 @@ static bool process_monster_blows(player_type *target_ptr, monap_type *monap_ptr
 
         // effect が RBE_NONE (無効値)になることはあり得ないはずだが、万一そう
         // なっていたら単に攻撃を打ち切る。
+        // r_info.txt の "B:" トークンに effect 以降を書き忘れた場合が該当する。
         if (monap_ptr->effect == RBE_NONE) {
             plog("unexpected: monap_ptr->effect == RBE_NONE");
             break;
@@ -411,10 +411,17 @@ static bool process_monster_blows(player_type *target_ptr, monap_type *monap_ptr
         if (monap_ptr->method == RBM_SHOOT)
             continue;
 
-        // 命中判定。
-        power = mbe_info[monap_ptr->effect].power;
+        // フレーバーの打撃は必中扱い。それ以外は通常の命中判定を行う。
         monap_ptr->ac = target_ptr->ac + target_ptr->to_a;
-        if (check_hit_from_monster_to_player(target_ptr, power, monap_ptr->rlev, monster_stunned_remaining(monap_ptr->m_ptr))) {
+        bool hit;
+        if (monap_ptr->effect == RBE_FLAVOR) {
+            hit = TRUE;
+        } else {
+            const int power = mbe_info[monap_ptr->effect].power;
+            hit = (bool)check_hit_from_monster_to_player(target_ptr, power, monap_ptr->rlev, monster_stunned_remaining(monap_ptr->m_ptr));
+        }
+
+        if (hit) {
             // 命中した。命中処理と思い出処理を行う。
             // 打撃そのものは対邪悪結界で撃退した可能性がある。
             const bool protect = !process_monster_attack_hit(target_ptr, monap_ptr);
index 8bba812..64061f1 100644 (file)
@@ -293,7 +293,8 @@ void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_pt
 {
     switch (monap_ptr->effect) {
     case RBE_NONE:
-        monap_ptr->obvious = TRUE;
+        // ここには来ないはずだが、何らかのバグで来た場合はプレイヤーの不利益に
+        // ならないようダメージを 0 にしておく。
         monap_ptr->damage = 0;
         break;
     case RBE_SUPERHURT: { /* AC軽減あり / Player armor reduces total damage */
@@ -472,5 +473,10 @@ void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_pt
 
         process_stun_attack(target_ptr, monap_ptr);
         break;
+    case RBE_FLAVOR:
+        // フレーバー打撃は自明かつダメージ 0。
+        monap_ptr->obvious = TRUE;
+        monap_ptr->damage = 0;
+        break;
     }
 }