#include "cmd-pet.h"
#include "player-damage.h"
#include "monsterrace-hook.h"
+#include "melee.h"
* Determine if the player "hits" a monster (normal combat).
* @param chance 基本命中値
* @param ac モンスターのAC
- * @param vis 目標を視界に捕らえているならばTRUEを指定
+ * @param visible 目標を視界に捕らえているならばTRUEを指定
* @return 命中と判定された場合TRUEを返す
* @note Always miss 5%, always hit 5%, otherwise random.
*/
-bool test_hit_norm(int chance, ARMOUR_CLASS ac, int vis)
+bool test_hit_norm(HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
{
- int k;
-
- /* Percentile dice */
- k = randint0(100);
-
- /* Hack -- Instant miss or hit */
- if (k < 10) return (k < 5);
-
- if (p_ptr->pseikaku == SEIKAKU_NAMAKE)
- if (one_in_(20)) return (FALSE);
-
- /* Wimpy attack never hits */
- if (chance <= 0) return (FALSE);
+ if (!visible) chance = (chance + 1) / 2;
+ return hit_chance(chance, ac) >= randint1(100);
+}
- /* Penalize invisible targets */
- if (!vis) chance = (chance + 1) / 2;
+/*!
+ * @brief モンスターへの命中率の計算
+ * @param to_h 命中値
+ * @param ac 敵AC
+ * @return 命中確率
+ */
+PERCENTAGE hit_chance(HIT_RELIABILITY reli, ARMOUR_CLASS ac)
+{
+ PERCENTAGE chance = 5, chance_left = 90;
- /* Power must defeat armor */
- if (randint0(chance) < (ac * 3 / 4)) return (FALSE);
+ if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
+ chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
- /* Assume hit */
- return (TRUE);
+ return chance;
}
+
/*!
* @brief プレイヤーからモンスターへの打撃クリティカル判定 /
* Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
return (FALSE);
}
-
-
/*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
static cptr desc_insult[] =
{
};
-
/*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
static cptr desc_moan[] =
{
};
-
/*!
* @brief 敵オーラによるプレイヤーのダメージ処理(補助)
* @param m_ptr オーラを持つモンスターの構造体参照ポインタ
if ((atoffset(u32b, r_ptr, flags_offset) & aura_flag) && !immune)
{
- char mon_name[80];
+ GAME_TEXT mon_name[80];
int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
/* Hack -- Get the "died from" name */
}
}
-
-
-
/*!
* @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
* @param m_ptr オーラを持つモンスターの構造体参照ポインタ
int n_weight = 0;
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
- char m_name[80];
+ GAME_TEXT m_name[80];
int dice_num, dice_side;
/* Extract monster name (or "it") */
monster_desc(m_name, m_ptr, 0);
-
/* Calculate the "attack quality" */
- bonus = p_ptr->to_h_m;
- bonus += (p_ptr->lev * 6 / 5);
+ bonus = p_ptr->to_h_m + (p_ptr->lev * 6 / 5);
chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
/* Test for hit */
/* Access the weapon */
object_type *o_ptr = &inventory[INVEN_RARM + hand];
- char m_name[80];
+ GAME_TEXT m_name[80];
bool success_hit = FALSE;
bool backstab = FALSE;
chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
if (mode == HISSATSU_IAI) chance += 60;
if (p_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
-
if (p_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
vir = virtue_number(V_VALOUR);
if (target_ptr->hold_o_idx)
{
object_type *q_ptr = &o_list[target_ptr->hold_o_idx];
- char o_name[MAX_NLEN];
+ GAME_TEXT o_name[MAX_NLEN];
object_desc(o_name, q_ptr, OD_NAME_ONLY);
q_ptr->held_m_idx = 0;
if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
{
- u32b flgs_aux[TR_FLAG_SIZE];
+ BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
sound(SOUND_HIT);
if (k < 0) k = 0;
take_hit(DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
- redraw_stuff();
+ handle_stuff();
}
else
{
sound(SOUND_MISS);
-
msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
}
}
}
}
-
/*!
* @brief プレイヤーの打撃処理メインルーチン
* @param y 攻撃目標のY座標
cave_type *c_ptr = &cave[y][x];
monster_type *m_ptr = &m_list[c_ptr->m_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
- char m_name[80];
+ GAME_TEXT m_name[80];
disturb(FALSE, TRUE);
return mdeath;
}
-
/*!
* @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
* @param m_idx 打撃を行うモンスターのID
object_type *o_ptr;
- char o_name[MAX_NLEN];
+ GAME_TEXT o_name[MAX_NLEN];
- char m_name[80];
+ GAME_TEXT m_name[80];
char ddesc[80];
if (apply_disenchant(0))
{
/* Hack -- Update AC */
- update_stuff();
+ handle_stuff();
obvious = TRUE;
}
}
obvious = TRUE;
msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
get_damage += acid_dam(damage, ddesc, -1, FALSE);
- update_stuff();
+ handle_stuff();
update_smart_learn(m_idx, DRS_ACID);
break;
}
#ifdef JP
msg_format("攻撃が%s自身を傷つけた!", m_name);
#else
- char m_name_self[80];
+ GAME_TEXT m_name_self[80];
/* hisself */
monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);