From: taotao54321 Date: Fri, 12 Feb 2021 14:43:12 +0000 (+0900) Subject: Merge pull request #36 from taotao54321/fix-wrong-evasion-message X-Git-Tag: vmacos3.0.0-alpha52~380^2~3 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=7d322cc57ac5031a86e58f4f84441ef95eb9b619;hp=2e4a36cfb367ec634fb45399bed835beb1be192d;p=hengbandforosx%2Fhengbandosx.git Merge pull request #36 from taotao54321/fix-wrong-evasion-message [Fix] 打撃回避判定のバグ修正 --- diff --git a/src/monster-attack/monster-attack-player.c b/src/monster-attack/monster-attack-player.c index 724bd07bc..55f7d1bf9 100644 --- a/src/monster-attack/monster-attack-player.c +++ b/src/monster-attack/monster-attack-player.c @@ -356,12 +356,19 @@ static void process_monster_attack_evasion(player_type *target_ptr, monap_type * } } +/*! + * @brief モンスターの打撃に関する知識を増やすことを試みる + */ static void increase_blow_type_seen(player_type *target_ptr, monap_type *monap_ptr) { + // どの敵が何をしてきたか正しく認識できていなければならない。 if (!is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr) || monap_ptr->do_silly_attack) return; monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx]; + + // 非自明な類の打撃については、そのダメージが 0 ならば基本的に知識が増えない。 + // ただし、既に一定以上の知識があれば常に知識が増える(何をされたのか察知できる)。 if (!monap_ptr->obvious && (monap_ptr->damage == 0) && (r_ptr->r_blows[monap_ptr->ap_cnt] <= 10)) return; @@ -369,9 +376,14 @@ static void increase_blow_type_seen(player_type *target_ptr, monap_type *monap_p r_ptr->r_blows[monap_ptr->ap_cnt]++; } +/*! + * @brief モンスターからプレイヤーへの打撃処理本体 + * @return 打撃に反応してプレイヤーがその場から離脱したかどうか + */ static bool process_monster_blows(player_type *target_ptr, monap_type *monap_ptr) { 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++) { monap_ptr->obvious = FALSE; HIT_POINT power = 0; @@ -385,27 +397,44 @@ static bool process_monster_blows(player_type *target_ptr, monap_type *monap_ptr if (!check_monster_attack_terminated(target_ptr, monap_ptr)) break; + // effect が RBE_NONE (無効値)になることはあり得ないはずだが、万一そう + // なっていたら単に攻撃を打ち切る。 + 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 ((monap_ptr->effect == RBE_NONE) - || check_hit_from_monster_to_player(target_ptr, power, monap_ptr->rlev, monster_stunned_remaining(monap_ptr->m_ptr))) { - if (!process_monster_attack_hit(target_ptr, monap_ptr)) + if (check_hit_from_monster_to_player(target_ptr, power, monap_ptr->rlev, monster_stunned_remaining(monap_ptr->m_ptr))) { + // 命中した。命中処理と思い出処理を行う。 + // 打撃そのものは対邪悪結界で撃退した可能性がある。 + const bool protect = !process_monster_attack_hit(target_ptr, monap_ptr); + increase_blow_type_seen(target_ptr, monap_ptr); + + // 撃退成功時はそのまま次の打撃へ移行。 + if (protect) continue; - else - process_monster_attack_evasion(target_ptr, monap_ptr); - } - increase_blow_type_seen(target_ptr, monap_ptr); - check_fall_off_horse(target_ptr, monap_ptr); - if (target_ptr->special_defense & NINJA_KAWARIMI) { - if (kawarimi(target_ptr, FALSE)) - return TRUE; + // 撃退失敗時は落馬処理、変わり身のテレポート処理を行う。 + check_fall_off_horse(target_ptr, monap_ptr); + if (target_ptr->special_defense & NINJA_KAWARIMI) { + // 変わり身のテレポートが成功したら攻撃を打ち切り、プレイヤーが離脱した旨を返す。 + if (kawarimi(target_ptr, FALSE)) + return TRUE; + } + } else { + // 命中しなかった。回避時の処理、思い出処理を行う。 + process_monster_attack_evasion(target_ptr, monap_ptr); + increase_blow_type_seen(target_ptr, monap_ptr); } } + // 通常はプレイヤーはその場にとどまる。 return FALSE; } @@ -497,4 +526,4 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) postprocess_monster_blows(target_ptr, monap_ptr); return TRUE; -} \ No newline at end of file +}