#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[MAX_NLEN];
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[MAX_NLEN];
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[MAX_NLEN];
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;
}
}
-
/*!
* @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[MAX_NLEN];
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[MAX_NLEN];
char ddesc[80];
if (apply_disenchant(0))
{
/* Hack -- Update AC */
- handle_stuff();
+ update_creature(p_ptr);
obvious = TRUE;
}
}
o_ptr->pval = 0;
/* Combine / Reorder the pack */
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
+ p_ptr->update |= (PU_COMBINE | PU_REORDER);
p_ptr->window |= (PW_INVEN);
break;
/* Find an item */
for (k = 0; k < 10; k++)
{
- s16b o_idx;
+ OBJECT_IDX o_idx;
/* Pick an item */
i = (INVENTORY_IDX)randint0(INVEN_PACK);
obvious = TRUE;
msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
get_damage += acid_dam(damage, ddesc, -1, FALSE);
- handle_stuff();
+ update_creature(p_ptr);
update_smart_learn(m_idx, DRS_ACID);
break;
}
{
msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
- for (k = 0; k < 6; k++)
+ for (k = 0; k < A_MAX; k++)
{
p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
if (p_ptr->riding && damage)
{
- char m_steed_name[80];
+ char m_steed_name[MAX_NLEN];
monster_desc(m_steed_name, &m_list[p_ptr->riding], 0);
if (rakuba((damage > 200) ? 200 : damage, FALSE))
{
#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);
if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
{
- char m_target_name[80];
+ char m_target_name[MAX_NLEN];
monster_desc(m_target_name, m_ptr, 0);
p_ptr->csp -= 7;