#include "system/floor-type-definition.h"
#include "view/display-messages.h"
-/* todo モンスター共通なので、monster-attack-player.cでも使うはず */
-const int MAX_BLOW = 4;
-
static void heal_monster_by_melee(player_type *subject_ptr, mam_type *mam_ptr)
{
if (!monster_living(mam_ptr->m_idx) || (mam_ptr->damage <= 2))
void repeat_melee(player_type *subject_ptr, mam_type *mam_ptr)
{
monster_race *r_ptr = &r_info[mam_ptr->m_ptr->r_idx];
- for (mam_ptr->ap_cnt = 0; mam_ptr->ap_cnt < MAX_BLOW; mam_ptr->ap_cnt++) {
- mam_ptr->effect = r_ptr->blow[mam_ptr->ap_cnt].effect;
- mam_ptr->method = r_ptr->blow[mam_ptr->ap_cnt].method;
- mam_ptr->d_dice = r_ptr->blow[mam_ptr->ap_cnt].d_dice;
- mam_ptr->d_side = r_ptr->blow[mam_ptr->ap_cnt].d_side;
+ for (int ap_cnt = 0; ap_cnt < MAX_NUM_BLOWS; ap_cnt++) {
+ mam_ptr->effect = r_ptr->blow[ap_cnt].effect;
+ mam_ptr->method = r_ptr->blow[ap_cnt].method;
+ mam_ptr->d_dice = r_ptr->blow[ap_cnt].d_dice;
+ mam_ptr->d_side = r_ptr->blow[ap_cnt].d_side;
if (!monster_is_valid(mam_ptr->m_ptr) || (mam_ptr->t_ptr->fx != mam_ptr->x_saver) || (mam_ptr->t_ptr->fy != mam_ptr->y_saver) || !mam_ptr->method)
break;
if (!is_original_ap_and_seen(subject_ptr, mam_ptr->m_ptr) || mam_ptr->do_silly_attack)
continue;
- if (!mam_ptr->obvious && !mam_ptr->damage && (r_ptr->r_blows[mam_ptr->ap_cnt] <= 10))
+ if (!mam_ptr->obvious && !mam_ptr->damage && (r_ptr->r_blows[ap_cnt] <= 10))
continue;
- if (r_ptr->r_blows[mam_ptr->ap_cnt] < MAX_UCHAR)
- r_ptr->r_blows[mam_ptr->ap_cnt]++;
+ if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
+ r_ptr->r_blows[ap_cnt]++;
}
}
* @param monap_ptr モンスターからプレーヤーへの直接攻撃構造体への参照ポインタ
* @return 攻撃続行ならばTRUE、打ち切りになったらFALSE
*/
-static bool check_monster_attack_terminated(player_type *target_ptr, monap_type *monap_ptr)
+static bool check_monster_continuous_attack(player_type *target_ptr, monap_type *monap_ptr)
{
if (!monster_is_valid(monap_ptr->m_ptr))
return FALSE;
/*!
* @brief モンスターの打撃に関する知識を増やすことを試みる
*/
-static void increase_blow_type_seen(player_type *target_ptr, monap_type *monap_ptr)
+static void increase_blow_type_seen(player_type *target_ptr, monap_type *monap_ptr, const int ap_cnt)
{
// どの敵が何をしてきたか正しく認識できていなければならない。
if (!is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr) || monap_ptr->do_silly_attack)
// 非自明な類の打撃については、そのダメージが 0 ならば基本的に知識が増えない。
// ただし、既に一定以上の知識があれば常に知識が増える(何をされたのか察知できる)。
- if (!monap_ptr->obvious && (monap_ptr->damage == 0) && (r_ptr->r_blows[monap_ptr->ap_cnt] <= 10))
+ if (!monap_ptr->obvious && (monap_ptr->damage == 0) && (r_ptr->r_blows[ap_cnt] <= 10))
return;
- if (r_ptr->r_blows[monap_ptr->ap_cnt] < MAX_UCHAR)
- r_ptr->r_blows[monap_ptr->ap_cnt]++;
+ if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
+ r_ptr->r_blows[ap_cnt]++;
}
/*!
{
monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx];
- for (monap_ptr->ap_cnt = 0; monap_ptr->ap_cnt < 4; monap_ptr->ap_cnt++) {
+ 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[monap_ptr->ap_cnt].effect;
- monap_ptr->method = r_ptr->blow[monap_ptr->ap_cnt].method;
- monap_ptr->d_dice = r_ptr->blow[monap_ptr->ap_cnt].d_dice;
- monap_ptr->d_side = r_ptr->blow[monap_ptr->ap_cnt].d_side;
+ monap_ptr->effect = r_ptr->blow[ap_cnt].effect;
+ monap_ptr->method = r_ptr->blow[ap_cnt].method;
+ monap_ptr->d_dice = r_ptr->blow[ap_cnt].d_dice;
+ monap_ptr->d_side = r_ptr->blow[ap_cnt].d_side;
- if (!check_monster_attack_terminated(target_ptr, monap_ptr))
+ if (!check_monster_continuous_attack(target_ptr, monap_ptr))
break;
// effect が RBE_NONE (無効値)になることはあり得ないはずだが、万一そう
// 命中した。命中処理と思い出処理を行う。
// 打撃そのものは対邪悪結界で撃退した可能性がある。
const bool protect = !process_monster_attack_hit(target_ptr, monap_ptr);
- increase_blow_type_seen(target_ptr, monap_ptr);
+ increase_blow_type_seen(target_ptr, monap_ptr, ap_cnt);
// 撃退成功時はそのまま次の打撃へ移行。
if (protect)
} else {
// 命中しなかった。回避時の処理、思い出処理を行う。
process_monster_attack_evasion(target_ptr, monap_ptr);
- increase_blow_type_seen(target_ptr, monap_ptr);
+ increase_blow_type_seen(target_ptr, monap_ptr, ap_cnt);
}
}
#include "monster-attack/monster-attack-types.h"
#include "system/angband.h"
+/*! モンスターが1ターンに攻撃する最大回数 (射撃を含む) / The maximum number of times a monster can attack in a turn (including SHOOT) */
+#define MAX_NUM_BLOWS 4
+
/*
* Monster blow structure
*
BIT_FLAGS a_ability_flags2; /* Activate Ability Flags 6 (special spells) */
BIT_FLAGS a_ability_flags3; /* Activate Ability Flags 7 (implementing) */
BIT_FLAGS a_ability_flags4; /* Activate Ability Flags 8 (implementing) */
- monster_blow blow[4]; /* Up to four blows per round */
+ monster_blow blow[MAX_NUM_BLOWS]; /* Up to four blows per round */
MONRACE_IDX reinforce_id[6];
DICE_NUMBER reinforce_dd[6];
DICE_SID reinforce_ds[6];
ITEM_NUMBER r_drop_gold; /*!< これまでに撃破時に落とした財宝の数 / Max number of gold dropped at once */
ITEM_NUMBER r_drop_item; /*!< これまでに撃破時に落としたアイテムの数 / Max number of item dropped at once */
byte r_cast_spell; /* Max number of other spells seen */
- byte r_blows[4]; /* Number of times each blow type was seen */
+ byte r_blows[MAX_NUM_BLOWS]; /* Number of times each blow type was seen */
u32b r_flags1; /* Observed racial flags */
u32b r_flags2; /* Observed racial flags */
u32b r_flags3; /* Observed racial flags */