*/
#include "angband.h"
+#include "artifact.h"
#include "cmd-pet.h"
#include "player-damage.h"
+#include "monsterrace-hook.h"
+#include "melee.h"
+#include "projection.h"
+#include "monster-status.h"
+#include "avatar.h"
+#include "player-status.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[] =
+static concptr desc_insult[] =
{
#ifdef JP
"があなたを侮辱した!",
};
-
/*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
-static cptr desc_moan[] =
+static concptr desc_moan[] =
{
#ifdef JP
"は何かを悲しんでいるようだ。",
};
-
/*!
* @brief 敵オーラによるプレイヤーのダメージ処理(補助)
* @param m_ptr オーラを持つモンスターの構造体参照ポインタ
* @return なし
*/
static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
- HIT_POINT(*dam_func)(HIT_POINT dam, cptr kb_str, int monspell, bool aura), cptr message)
+ HIT_POINT(*dam_func)(HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
{
monster_race *r_ptr = &r_info[m_ptr->r_idx];
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;
- cptr atk_desc;
+ concptr atk_desc;
switch (attack)
{
/* 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 */
else
{
sound(SOUND_MISS);
-
msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
}
}
/* 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;
{
case CLASS_ROGUE:
case CLASS_NINJA:
- if (buki_motteruka(INVEN_RARM + hand) && !p_ptr->icky_wield[hand])
+ if (has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand])
{
int tmp = p_ptr->lev * 6 + (p_ptr->skill_stl + 10) * 4;
if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
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 ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
{
/* Only drain "living" monsters */
- if (monster_living(r_ptr))
+ if (monster_living(m_ptr->r_idx))
can_drain = TRUE;
else
can_drain = FALSE;
drain_result += p_ptr->to_d[hand];
if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
- if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(r_ptr)) k = 0;
+ if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
/* No negative damage */
if (k < 0) k = 0;
- if ((mode == HISSATSU_ZANMA) && !(!monster_living(r_ptr) && (r_ptr->flags3 & RF3_EVIL)))
+ if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
{
k = 0;
}
}
else k = 1;
}
- else if ((p_ptr->pclass == CLASS_NINJA) && buki_motteruka(INVEN_RARM + hand) && !p_ptr->icky_wield[hand] && ((p_ptr->cur_lite <= 0) || one_in_(7)))
+ else if ((p_ptr->pclass == CLASS_NINJA) && has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand] && ((p_ptr->cur_lite <= 0) || one_in_(7)))
{
int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
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);
msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
-
- /* Extract the flags */
object_flags(o_ptr, flgs_aux);
k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
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[MAX_NLEN];
disturb(FALSE, TRUE);
if (cur < max)
{
- int ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level;
- int targetlevel = r_ptr->level;
+ DEPTH ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level;
+ DEPTH targetlevel = r_ptr->level;
int inc = 0;
if ((cur / 200 - 5) < targetlevel)
}
p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
-
p_ptr->update |= (PU_BONUS);
}
}
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];
bool explode = FALSE;
bool do_silly_attack = (one_in_(2) && p_ptr->image);
HIT_POINT get_damage = 0;
- int abbreviate = 0;
+ int abbreviate = 0; // 2回目以降の省略表現フラグ
/* Not allowed to attack */
if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
HIT_POINT power = 0;
HIT_POINT damage = 0;
- cptr act = NULL;
+ concptr act = NULL;
/* Extract the attack infomation */
int effect = r_ptr->blow[ap_cnt].effect;
if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
#ifdef JP
- if (abbreviate)
- msg_format("撃退した。");
- else
- msg_format("%^sは撃退された。", m_name);
- abbreviate = 1;/*2回目以降は省略 */
+ if (abbreviate) msg_format("撃退した。");
+ else msg_format("%^sは撃退された。", m_name);
+ abbreviate = 1; /*2回目以降は省略 */
#else
msg_format("%^s is repelled.", m_name);
#endif
else
{
if (one_in_(3))
-#ifdef JP
- act = "は♪僕らは楽しい家族♪と歌っている。";
+ act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
else
- act = "は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。";
-#else
- act = "sings 'We are a happy family.'";
- else
- act = "sings 'I love you, you love me.'";
-#endif
+ act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
}
sound(SOUND_SHOW);
}
#ifdef JP
if (abbreviate == 0)
- msg_format("%^sに%s", m_name, act);
+ msg_format("%^sに%s", m_name, act);
else if (abbreviate == 1)
- msg_format("%s", act);
+ msg_format("%s", act);
else /* if (abbreviate == -1) */
- msg_format("%^s%s", m_name, act);
+ msg_format("%^s%s", m_name, act);
abbreviate = 1;/*2回目以降は省略 */
#else
msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
* Skip the effect when exploding, since the explosion
* already causes the effect.
*/
- if (explode)
- damage = 0;
+ if(explode) damage = 0;
/* Apply appropriate damage */
switch (effect)
{
case 0:
{
- /* Hack -- Assume obvious */
obvious = TRUE;
-
- /* Hack -- No damage */
damage = 0;
-
break;
}
- case RBE_SUPERHURT:
+ case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
{
if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
{
break;
}
}
- case RBE_HURT:
+ case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
{
obvious = TRUE;
-
- /* Hack -- Player armor reduces total damage */
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
-
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
-
break;
}
}
}
- /* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Learn about the player */
if (apply_disenchant(0))
{
/* Hack -- Update AC */
- update_stuff();
+ update_creature(p_ptr);
obvious = TRUE;
}
}
- /* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Learn about the player */
case RBE_UN_POWER:
{
- /* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
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;
case RBE_EAT_GOLD:
{
- /* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Confused monsters cannot steal successfully. -LM-*/
case RBE_EAT_ITEM:
{
- /* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
/* Confused monsters cannot steal successfully. -LM-*/
/* Occasional "blink" anyway */
blinked = TRUE;
-
obvious = TRUE;
-
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);
/* Skip artifacts */
if (object_is_artifact(o_ptr)) continue;
- /* Get a description */
object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
#ifdef JP
- msg_format("%s(%c)を%s盗まれた!",
- o_name, index_to_label(i),
- ((o_ptr->number > 1) ? "一つ" : ""));
+ msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
#else
- msg_format("%sour %s (%c) was stolen!",
- ((o_ptr->number > 1) ? "One of y" : "Y"),
- o_name, index_to_label(i));
+ msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
#endif
chg_virtue(V_SACRIFICE, 1);
if (o_idx)
{
object_type *j_ptr;
-
- /* Get new object */
j_ptr = &o_list[o_idx];
-
- /* Copy object */
object_copy(j_ptr, o_ptr);
/* Modify number */
case RBE_EAT_FOOD:
{
- /* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
/* Skip non-food objects */
if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
- /* Get a description */
object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
#ifdef JP
{
/* Access the lite */
o_ptr = &inventory[INVEN_LITE];
-
- /* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
{
if (explode) break;
obvious = TRUE;
-
msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
-
- /* Special damage */
get_damage += acid_dam(damage, ddesc, -1, FALSE);
-
- /* Hack -- Update AC */
- update_stuff();
-
- /* Learn about the player */
+ update_creature(p_ptr);
update_smart_learn(m_idx, DRS_ACID);
-
break;
}
{
if (explode) break;
obvious = TRUE;
-
msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
-
- /* Special damage */
get_damage += elec_dam(damage, ddesc, -1, FALSE);
-
- /* Learn about the player */
update_smart_learn(m_idx, DRS_ELEC);
-
break;
}
{
if (explode) break;
obvious = TRUE;
-
msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
-
- /* Special damage */
get_damage += fire_dam(damage, ddesc, -1, FALSE);
-
- /* Learn about the player */
update_smart_learn(m_idx, DRS_FIRE);
-
break;
}
{
if (explode) break;
obvious = TRUE;
-
msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
-
- /* Special damage */
get_damage += cold_dam(damage, ddesc, -1, FALSE);
-
- /* Learn about the player */
update_smart_learn(m_idx, DRS_COLD);
-
break;
}
case RBE_BLIND:
{
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
-
if (p_ptr->is_dead) break;
/* Increase "blind" */
case RBE_DISEASE:
{
- /* Take some damage */
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
if (p_ptr->is_dead || CHECK_MULTISHADOW()) 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;
#endif
}
+
+ /* Gain shield experience */
+ if (object_is_armour(&inventory[INVEN_RARM]) || object_is_armour(&inventory[INVEN_LARM]))
+ {
+ int cur = p_ptr->skill_exp[GINOU_SHIELD];
+ int max = s_info[p_ptr->pclass].s_max[GINOU_SHIELD];
+
+ if (cur < max)
+ {
+ DEPTH targetlevel = r_ptr->level;
+ int inc = 0;
+
+
+ /* Extra experience */
+ if ((cur / 100) < targetlevel)
+ {
+ if ((cur / 100 + 15) < targetlevel)
+ inc += 1 + (targetlevel - (cur / 100 + 15));
+ else
+ inc += 1;
+ }
+
+ p_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
+ p_ptr->update |= (PU_BONUS);
+ }
+ }
+
damage = 0;
break;
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;
msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
fear = FALSE;
-
- /* Redraw mana */
p_ptr->redraw |= (PR_MANA);
}