X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmelee1.c;h=163e3de09798e572d0fab85aa39391ccf116e4ef;hb=e70ba712cf4b753e7d3876f60980c87cfeec09e3;hp=eefc8357ef4ac2bcf2fa877860d1694bb3e450ba;hpb=f8191610df8d2640b6a95369048c5fa060609681;p=hengband%2Fhengband.git diff --git a/src/melee1.c b/src/melee1.c index eefc8357e..163e3de09 100644 --- a/src/melee1.c +++ b/src/melee1.c @@ -14,6 +14,8 @@ #include "angband.h" #include "cmd-pet.h" #include "player-damage.h" +#include "monsterrace-hook.h" +#include "melee.h" @@ -22,37 +24,34 @@ * 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 @@ -183,8 +182,6 @@ static int check_hit(int power, DEPTH level, int stun) return (FALSE); } - - /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */ static cptr desc_insult[] = { @@ -214,7 +211,6 @@ static cptr desc_insult[] = }; - /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */ static cptr desc_moan[] = { @@ -232,7 +228,6 @@ static cptr desc_moan[] = }; - /*! * @brief 敵オーラによるプレイヤーのダメージ処理(補助) * @param m_ptr オーラを持つモンスターの構造体参照ポインタ @@ -251,7 +246,7 @@ static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_off 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 */ @@ -270,9 +265,6 @@ static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_off } } - - - /*! * @brief 敵オーラによるプレイヤーのダメージ処理(メイン) * @param m_ptr オーラを持つモンスターの構造体参照ポインタ @@ -303,7 +295,7 @@ static void natural_attack(s16b m_idx, int attack, bool *fear, bool *mdeath) 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; @@ -355,10 +347,8 @@ static void natural_attack(s16b m_idx, int attack, bool *fear, bool *mdeath) /* 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 */ @@ -416,7 +406,6 @@ static void natural_attack(s16b m_idx, int attack, bool *fear, bool *mdeath) else { sound(SOUND_MISS); - msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name); } } @@ -447,7 +436,7 @@ static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b /* 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; @@ -550,7 +539,6 @@ static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b 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); @@ -650,7 +638,7 @@ static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b 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; @@ -881,13 +869,13 @@ static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b 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; } @@ -1172,7 +1160,7 @@ static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b 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; @@ -1193,7 +1181,7 @@ static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b 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); @@ -1285,12 +1273,11 @@ static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b 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); } } @@ -1318,7 +1305,6 @@ static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b } } - /*! * @brief プレイヤーの打撃処理メインルーチン * @param y 攻撃目標のY座標 @@ -1337,7 +1323,7 @@ bool py_attack(POSITION y, POSITION x, BIT_FLAGS mode) 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); @@ -1513,7 +1499,6 @@ bool py_attack(POSITION y, POSITION x, BIT_FLAGS mode) return mdeath; } - /*! * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks. * @param m_idx 打撃を行うモンスターのID @@ -1534,9 +1519,9 @@ bool make_attack_normal(MONSTER_IDX m_idx) 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]; @@ -1545,7 +1530,7 @@ bool make_attack_normal(MONSTER_IDX m_idx) 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); @@ -1639,11 +1624,9 @@ bool make_attack_normal(MONSTER_IDX m_idx) 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 @@ -1909,15 +1892,9 @@ bool make_attack_normal(MONSTER_IDX m_idx) else { if (one_in_(3)) -#ifdef JP - act = "は♪僕らは楽しい家族♪と歌っている。"; - else - act = "は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。"; -#else - act = "sings 'We are a happy family.'"; + 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); @@ -1936,11 +1913,11 @@ bool make_attack_normal(MONSTER_IDX m_idx) } #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." : ""); @@ -1957,23 +1934,18 @@ bool make_attack_normal(MONSTER_IDX m_idx) * 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()) { @@ -1985,15 +1957,11 @@ bool make_attack_normal(MONSTER_IDX m_idx) 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; } @@ -2010,7 +1978,6 @@ bool make_attack_normal(MONSTER_IDX m_idx) } } - /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); /* Learn about the player */ @@ -2030,12 +1997,11 @@ bool make_attack_normal(MONSTER_IDX m_idx) 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 */ @@ -2046,7 +2012,6 @@ bool make_attack_normal(MONSTER_IDX m_idx) case RBE_UN_POWER: { - /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; @@ -2091,8 +2056,7 @@ bool make_attack_normal(MONSTER_IDX m_idx) 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; @@ -2104,7 +2068,6 @@ bool make_attack_normal(MONSTER_IDX m_idx) case RBE_EAT_GOLD: { - /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); /* Confused monsters cannot steal successfully. -LM-*/ @@ -2165,7 +2128,6 @@ bool make_attack_normal(MONSTER_IDX m_idx) case RBE_EAT_ITEM: { - /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); /* Confused monsters cannot steal successfully. -LM-*/ @@ -2183,16 +2145,14 @@ bool make_attack_normal(MONSTER_IDX m_idx) /* 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); @@ -2206,17 +2166,12 @@ bool make_attack_normal(MONSTER_IDX m_idx) /* 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); @@ -2279,7 +2234,6 @@ bool make_attack_normal(MONSTER_IDX m_idx) case RBE_EAT_FOOD: { - /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; @@ -2290,7 +2244,6 @@ bool make_attack_normal(MONSTER_IDX m_idx) /* Pick an item from the pack */ i = (INVENTORY_IDX)randint0(INVEN_PACK); - /* Get the item */ o_ptr = &inventory[i]; /* Skip non-objects */ @@ -2299,20 +2252,14 @@ bool make_attack_normal(MONSTER_IDX m_idx) /* 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 - 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 eaten!", - ((o_ptr->number > 1) ? "One of y" : "Y"), - o_name, index_to_label(i)); + msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i)); #endif - /* Steal the items */ inven_item_increase(i, -1); inven_item_optimize(i); @@ -2329,8 +2276,6 @@ bool make_attack_normal(MONSTER_IDX m_idx) { /* 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; @@ -2358,18 +2303,10 @@ bool make_attack_normal(MONSTER_IDX m_idx) { 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; } @@ -2377,15 +2314,9 @@ bool make_attack_normal(MONSTER_IDX m_idx) { 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; } @@ -2393,15 +2324,9 @@ bool make_attack_normal(MONSTER_IDX m_idx) { 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; } @@ -2409,22 +2334,15 @@ bool make_attack_normal(MONSTER_IDX m_idx) { 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" */ @@ -2695,7 +2613,6 @@ bool make_attack_normal(MONSTER_IDX m_idx) case RBE_DISEASE: { - /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; @@ -2773,7 +2690,7 @@ bool make_attack_normal(MONSTER_IDX m_idx) { 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; @@ -3316,7 +3233,7 @@ bool make_attack_normal(MONSTER_IDX m_idx) 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)) { @@ -3339,7 +3256,7 @@ bool make_attack_normal(MONSTER_IDX m_idx) #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); @@ -3352,15 +3269,13 @@ bool make_attack_normal(MONSTER_IDX m_idx) 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); }