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 |
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
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
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
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
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
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
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
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 |
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
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:よだれを垂らしている昆虫型のエイリアンで、気持ち悪い習性を持っている。
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 |
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 |
"SUPERHURT",
"INERTIA",
"STUN",
+ "FLAVOR",
NULL
};
#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
case RBE_STUN:
lore_ptr->q = _("朦朧とさせる", "stun");
break;
+ case RBE_FLAVOR:
+ // フレーバー打撃には何の効果もないので付加説明もない。
+ break;
}
}
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;
RBE_SUPERHURT = 33, /*!< モンスターの攻撃効果: 強力に攻撃する*/
RBE_INERTIA = 34, /*!< モンスターの攻撃効果: 減速させる*/
RBE_STUN = 35, /*!< モンスターの攻撃効果: 朦朧とさせる*/
+ RBE_FLAVOR = 36, /*!< モンスターの攻撃効果: フレーバー(メッセージ表示のみ) */
} rbe_type;
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;
// effect が RBE_NONE (無効値)になることはあり得ないはずだが、万一そう
// なっていたら単に攻撃を打ち切る。
+ // r_info.txt の "B:" トークンに effect 以降を書き忘れた場合が該当する。
if (monap_ptr->effect == RBE_NONE) {
plog("unexpected: monap_ptr->effect == RBE_NONE");
break;
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);
{
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 */
process_stun_attack(target_ptr, monap_ptr);
break;
+ case RBE_FLAVOR:
+ // フレーバー打撃は自明かつダメージ 0。
+ monap_ptr->obvious = TRUE;
+ monap_ptr->damage = 0;
+ break;
}
}