*/
#include "angband.h"
-#include "core.h"
-#include "util.h"
-
#include "artifact.h"
#include "cmd-pet.h"
+#include "player-damage.h"
#include "monsterrace-hook.h"
#include "melee.h"
+#include "projection.h"
#include "monster.h"
#include "monster-status.h"
#include "monster-spell.h"
#include "avatar.h"
+#include "player-status.h"
#include "realm-hex.h"
-#include "realm-song.h"
-#include "object-flavor.h"
#include "object-hook.h"
#include "grid.h"
-#include "dungeon.h"
-#include "floor.h"
-#include "dungeon.h"
-#include "spells.h"
-#include "files.h"
#include "player-move.h"
-#include "player-effects.h"
-#include "player-skill.h"
-#include "player-damage.h"
-#include "player-status.h"
-#include "player-race.h"
-#include "player-class.h"
-#include "player-personality.h"
-#include "view-mainwindow.h"
-#include "world.h"
- /*!
- * @brief モンスターの打撃効力テーブル /
- * The table of monsters' blow effects
- */
-const mbe_info_type mbe_info[] =
-{
- { 0, 0, }, /* None */
- { 60, GF_MISSILE, }, /* HURT */
- { 5, GF_POIS, }, /* POISON */
- { 20, GF_DISENCHANT, }, /* UN_BONUS */
- { 15, GF_MISSILE, }, /* UN_POWER */ /* ToDo: Apply the correct effects */
- { 5, GF_MISSILE, }, /* EAT_GOLD */
- { 5, GF_MISSILE, }, /* EAT_ITEM */
- { 5, GF_MISSILE, }, /* EAT_FOOD */
- { 5, GF_MISSILE, }, /* EAT_LITE */
- { 0, GF_ACID, }, /* ACID */
- { 10, GF_ELEC, }, /* ELEC */
- { 10, GF_FIRE, }, /* FIRE */
- { 10, GF_COLD, }, /* COLD */
- { 2, GF_MISSILE, }, /* BLIND */
- { 10, GF_CONFUSION, }, /* CONFUSE */
- { 10, GF_MISSILE, }, /* TERRIFY */
- { 2, GF_MISSILE, }, /* PARALYZE */
- { 0, GF_MISSILE, }, /* LOSE_STR */
- { 0, GF_MISSILE, }, /* LOSE_INT */
- { 0, GF_MISSILE, }, /* LOSE_WIS */
- { 0, GF_MISSILE, }, /* LOSE_DEX */
- { 0, GF_MISSILE, }, /* LOSE_CON */
- { 0, GF_MISSILE, }, /* LOSE_CHR */
- { 2, GF_MISSILE, }, /* LOSE_ALL */
- { 60, GF_ROCKET, }, /* SHATTER */
- { 5, GF_MISSILE, }, /* EXP_10 */
- { 5, GF_MISSILE, }, /* EXP_20 */
- { 5, GF_MISSILE, }, /* EXP_40 */
- { 5, GF_MISSILE, }, /* EXP_80 */
- { 5, GF_POIS, }, /* DISEASE */
- { 5, GF_TIME, }, /* TIME */
- { 5, GF_MISSILE, }, /* EXP_VAMP */
- { 5, GF_MANA, }, /* DR_MANA */
- { 60, GF_MISSILE, }, /* SUPERHURT */
-};
-
- /*!
- * @brief 幻覚時の打撃記述テーブル / Weird melee attack types when hallucinating
- */
-#ifdef JP
-const concptr silly_attacks[MAX_SILLY_ATTACK] =
-{
- "に小便をかけられた。",
- "があなたの回りを3回回ってワンと言った。",
- "にしばきまわされた。",
- "に靴をなめさせられた。",
- "にハナクソを飛ばされた。",
- "にジャン拳で攻撃された。",
- "があなたの頬を札束でしばいた。",
- "があなたの前でポージングをした。",
- "にアカンベーされた。",
- "に「神の国」発言の撤回を求められた。",
- "にメッ○ールを飲まされた。",
- "につっこみを入れられた。",
- "はあなたと踊った。",
- "に顔にらく書きをされた。",
- "に借金の返済をせまられた。",
- "にスカートをめくられた。",
- "はあなたの手相を占った。",
- "から役満を上がられた。",
- "から愛の告白をされた。",
- "はあなたを時給500円で雇った。",
- "はあなたの100の秘密について熱く語った。",
- "がニャーと鳴いた。",
- "はあなたに気をつけた。",
- "はあなたをポリゴン化させた。",
- "に少しかじられた。",
- "はアルテマの呪文を唱えた!",
- "はあなたのスパイクをブロックした。",
- "はスライド移動した。",
- "は昇龍拳コマンドの入力に失敗した。",
- "は拡散波動砲を発射した。",
- "はデスラー戦法をしかけた。",
- "にライダーキックで攻撃された。",
- "に二週間以内でビデオを人に見せないと死ぬ呪いをかけられた。",
- "はパルプンテを唱えた。",
- "はスーパーウルトラギャラクティカマグナムを放った。",
- "にしゃがみ小キックでハメられた。",
- "にジェットストリームアタックをかけられた。",
- "はあなたに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
- "は「いくじなし!ばかばかばか!」といって駆け出した。",
- "が「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
- "は言った。「変愚蛮怒、絶賛公開中!」",
-};
-
-/*!
- * @brief 幻覚時の打撃記述テーブル(フォーマットつき) / Weird melee attack types when hallucinating (%s for strfmt())
- */
-const concptr silly_attacks2[MAX_SILLY_ATTACK] =
-{
- "%sに小便をかけた。",
- "%sの回りを3回回ってワンと言った。",
- "%sをしばきまわした。",
- "%sに靴をなめさせた。",
- "%sにハナクソを飛ばした。",
- "%sをジャン拳で攻撃した。",
- "%sの頬を札束でしばいた。",
- "%sの前でポージングをした。",
- "%sにアカンベーした。",
- "%sに「神の国」発言の撤回を求めた。",
- "%sにメッ○ールを飲ませた。",
- "%sにつっこみを入れた。",
- "%sと踊った。",
- "%sの顔にらく書きをした。",
- "%sに借金の返済をせまった。",
- "%sのスカートをめくった。",
- "%sの手相を占った。",
- "%sから役満を上がった。",
- "%sに愛の告白をした。",
- "%sを時給500円で雇った。",
- "%sの100の秘密について熱く語った。",
- "ニャーと鳴いた。",
- "%sに気をつけた。",
- "%sをポリゴン化させた。",
- "%sを少しかじった。",
- "アルテマの呪文を唱えた!",
- "%sのスパイクをブロックした。",
- "スライド移動した。",
- "昇龍拳コマンドの入力に失敗した。",
- "%sに拡散波動砲を発射した。",
- "%sにデスラー戦法をしかけた。",
- "%sをライダーキックで攻撃した。",
- "%sに二週間以内でビデオを人に見せないと死ぬ呪いをかけた。",
- "パルプンテを唱えた。",
- "%sにスーパーウルトラギャラクティカマグナムを放った。",
- "%sをしゃがみ小キックでハメた。",
- "%sにジェットストリームアタックをかけた。",
- "%sに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
- "「いくじなし!ばかばかばか!」といって駆け出した。",
- "「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
- "言った。「変愚蛮怒、絶賛公開中!」",
-};
-#else
-const concptr silly_attacks[MAX_SILLY_ATTACK] =
-{
- "smothers",
- "hugs",
- "humiliates",
- "whips",
- "kisses",
-
- "disgusts",
- "pees all over",
- "passes the gas on",
- "makes obscene gestures at",
- "licks",
-
- "stomps on",
- "swallows",
- "drools on",
- "misses",
- "shrinks",
-
- "emasculates",
- "evaporates",
- "solidifies",
- "digitizes",
- "insta-kills",
-
- "massacres",
- "slaughters",
- "drugs",
- "psychoanalyzes",
- "deconstructs",
-
- "falsifies",
- "disbelieves",
- "molests",
- "pusupusu",
-};
-#endif
-
-
-
-/*!
- * @brief マーシャルアーツ打撃テーブル
- */
-const martial_arts ma_blows[MAX_MA] =
-{
-#ifdef JP
- { "%sを殴った。", 1, 0, 1, 5, 0 },
- { "%sを蹴った。", 2, 0, 1, 7, 0 },
- { "%sに正拳突きをくらわした。", 3, 0, 1, 9, 0 },
- { "%sに膝蹴りをくらわした。", 5, 5, 2, 4, MA_KNEE },
- { "%sに肘打ちをくらわした。", 7, 5, 1, 12, 0 },
- { "%sに体当りした。", 9, 10, 2, 6, 0 },
- { "%sを蹴った。", 11, 10, 3, 6, MA_SLOW },
- { "%sにアッパーをくらわした。", 13, 12, 5, 5, 6 },
- { "%sに二段蹴りをくらわした。", 16, 15, 5, 6, 8 },
- { "%sに猫爪撃をくらわした。", 20, 20, 5, 8, 0 },
- { "%sに跳空脚をくらわした。", 24, 25, 6, 8, 10 },
- { "%sに鷲爪襲をくらわした。", 28, 25, 7, 9, 0 },
- { "%sに回し蹴りをくらわした。", 32, 30, 8, 10, 10 },
- { "%sに鉄拳撃をくらわした。", 35, 35, 8, 11, 10 },
- { "%sに飛空脚をくらわした。", 39, 35, 8, 12, 12 },
- { "%sに昇龍拳をくらわした。", 43, 35, 9, 12, 16 },
- { "%sに石破天驚拳をくらわした。", 48, 40, 10, 13, 18 },
-#else
- { "You punch %s.", 1, 0, 1, 4, 0 },
- { "You kick %s.", 2, 0, 1, 6, 0 },
- { "You strike %s.", 3, 0, 1, 7, 0 },
- { "You hit %s with your knee.", 5, 5, 2, 3, MA_KNEE },
- { "You hit %s with your elbow.", 7, 5, 1, 8, 0 },
- { "You butt %s.", 9, 10, 2, 5, 0 },
- { "You kick %s.", 11, 10, 3, 4, MA_SLOW },
- { "You uppercut %s.", 13, 12, 4, 4, 6 },
- { "You double-kick %s.", 16, 15, 5, 4, 8 },
- { "You hit %s with a Cat's Claw.", 20, 20, 5, 5, 0 },
- { "You hit %s with a jump kick.", 25, 25, 5, 6, 10 },
- { "You hit %s with an Eagle's Claw.", 29, 25, 6, 6, 0 },
- { "You hit %s with a circle kick.", 33, 30, 6, 8, 10 },
- { "You hit %s with an Iron Fist.", 37, 35, 8, 8, 10 },
- { "You hit %s with a flying kick.", 41, 35, 8, 10, 12 },
- { "You hit %s with a Dragon Fist.", 45, 35, 10, 10, 16 },
- { "You hit %s with a Crushing Blow.", 48, 35, 10, 12, 18 },
-#endif
-
-};
-
-/*!
- * @brief 修行僧のターンダメージ算出テーブル
- */
-const int monk_ave_damage[PY_MAX_LEVEL + 1][3] =
-{
- {0, 0, 0},
- {249, 249, 249},
- {324, 324, 324},
- {382, 438, 382},
- {382, 439, 382},
- {390, 446, 390},
- {394, 473, 394},
- {425, 528, 425},
- {430, 535, 430},
- {505, 560, 435},
- {517, 575, 444},
- {566, 655, 474},
- {585, 713, 486},
- {653, 843, 527},
- {678, 890, 544},
- {703, 973, 558},
- {765, 1096, 596},
- {914, 1146, 614},
- {943, 1240, 629},
- {971, 1276, 643},
- {1018, 1350, 667},
- {1063, 1464, 688},
- {1099, 1515, 705},
- {1128, 1559, 721},
- {1153, 1640, 735},
- {1336, 1720, 757},
- {1387, 1789, 778},
- {1430, 1893, 794},
- {1610, 2199, 863},
- {1666, 2280, 885},
- {1713, 2401, 908},
- {1755, 2465, 925},
- {1909, 2730, 984},
- {2156, 2891, 1009},
- {2218, 2970, 1031},
- {2319, 3107, 1063},
- {2404, 3290, 1098},
- {2477, 3389, 1125},
- {2544, 3483, 1150},
- {2771, 3899, 1228},
- {2844, 3982, 1259},
- {3129, 4064, 1287},
- {3200, 4190, 1313},
- {3554, 4674, 1432},
- {3614, 4738, 1463},
- {3679, 4853, 1485},
- {3741, 4905, 1512},
- {3785, 4943, 1538},
- {4141, 5532, 1652},
- {4442, 5581, 1679},
- {4486, 5636, 1702},
-};
-
-/*!
- * 腕力による攻撃回数算定値テーブル
- * Stat Table (STR) -- help index into the "blow" table
- */
-const byte adj_str_blow[] =
-{
- 3 /* 3 */,
- 4 /* 4 */,
- 5 /* 5 */,
- 6 /* 6 */,
- 7 /* 7 */,
- 8 /* 8 */,
- 9 /* 9 */,
- 10 /* 10 */,
- 11 /* 11 */,
- 12 /* 12 */,
- 13 /* 13 */,
- 14 /* 14 */,
- 15 /* 15 */,
- 16 /* 16 */,
- 17 /* 17 */,
- 20 /* 18/00-18/09 */,
- 30 /* 18/10-18/19 */,
- 40 /* 18/20-18/29 */,
- 50 /* 18/30-18/39 */,
- 60 /* 18/40-18/49 */,
- 70 /* 18/50-18/59 */,
- 80 /* 18/60-18/69 */,
- 90 /* 18/70-18/79 */,
- 100 /* 18/80-18/89 */,
- 110 /* 18/90-18/99 */,
- 120 /* 18/100-18/109 */,
- 130 /* 18/110-18/119 */,
- 140 /* 18/120-18/129 */,
- 150 /* 18/130-18/139 */,
- 160 /* 18/140-18/149 */,
- 170 /* 18/150-18/159 */,
- 180 /* 18/160-18/169 */,
- 190 /* 18/170-18/179 */,
- 200 /* 18/180-18/189 */,
- 210 /* 18/190-18/199 */,
- 220 /* 18/200-18/209 */,
- 230 /* 18/210-18/219 */,
- 240 /* 18/220+ */
-};
-
-
-/*!
- * 器用さによる攻撃回数インデックステーブル
- * Stat Table (DEX) -- index into the "blow" table
- */
-const byte adj_dex_blow[] =
-{
- 0 /* 3 */,
- 0 /* 4 */,
- 0 /* 5 */,
- 0 /* 6 */,
- 0 /* 7 */,
- 0 /* 8 */,
- 0 /* 9 */,
- 1 /* 10 */,
- 1 /* 11 */,
- 1 /* 12 */,
- 1 /* 13 */,
- 1 /* 14 */,
- 2 /* 15 */,
- 2 /* 16 */,
- 2 /* 17 */,
- 2 /* 18/00-18/09 */,
- 3 /* 18/10-18/19 */,
- 3 /* 18/20-18/29 */,
- 3 /* 18/30-18/39 */,
- 4 /* 18/40-18/49 */,
- 4 /* 18/50-18/59 */,
- 5 /* 18/60-18/69 */,
- 5 /* 18/70-18/79 */,
- 6 /* 18/80-18/89 */,
- 6 /* 18/90-18/99 */,
- 7 /* 18/100-18/109 */,
- 7 /* 18/110-18/119 */,
- 8 /* 18/120-18/129 */,
- 8 /* 18/130-18/139 */,
- 9 /* 18/140-18/149 */,
- 9 /* 18/150-18/159 */,
- 10 /* 18/160-18/169 */,
- 10 /* 18/170-18/179 */,
- 11 /* 18/180-18/189 */,
- 11 /* 18/190-18/199 */,
- 12 /* 18/200-18/209 */,
- 12 /* 18/210-18/219 */,
- 13 /* 18/220+ */
-};
-
-
-/*!
- * @brief
- * 腕力、器用さに応じた攻撃回数テーブル /
- * This table is used to help calculate the number of blows the player can
- * make in a single round of attacks (one player current_world_ptr->game_turn) with a normal weapon.
- * @details
- * <pre>
- * This number ranges from a single blow/round for weak players to up to six
- * blows/round for powerful warriors.
- *
- * Note that certain artifacts and ego-items give "bonus" blows/round.
- *
- * First, from the player class, we extract some values:
- *
- * Warrior num = 6; mul = 5; div = MAX(70, weapon_weight);
- * Berserker num = 6; mul = 7; div = MAX(70, weapon_weight);
- * Mage num = 3; mul = 2; div = MAX(100, weapon_weight);
- * Priest num = 5; mul = 3; div = MAX(100, weapon_weight);
- * Mindcrafter num = 5; mul = 3; div = MAX(100, weapon_weight);
- * Rogue num = 5; mul = 3; div = MAX(40, weapon_weight);
- * Ranger num = 5; mul = 4; div = MAX(70, weapon_weight);
- * Paladin num = 5; mul = 4; div = MAX(70, weapon_weight);
- * Weaponsmith num = 5; mul = 5; div = MAX(150, weapon_weight);
- * Warrior-Mage num = 5; mul = 3; div = MAX(70, weapon_weight);
- * Chaos Warrior num = 5; mul = 4; div = MAX(70, weapon_weight);
- * Monk num = 5; mul = 3; div = MAX(60, weapon_weight);
- * Tourist num = 4; mul = 3; div = MAX(100, weapon_weight);
- * Imitator num = 5; mul = 4; div = MAX(70, weapon_weight);
- * Beastmaster num = 5; mul = 3; div = MAX(70, weapon_weight);
- * Cavalry(Ride) num = 5; mul = 4; div = MAX(70, weapon_weight);
- * Cavalry(Walk) num = 5; mul = 3; div = MAX(100, weapon_weight);
- * Sorcerer num = 1; mul = 1; div = MAX(1, weapon_weight);
- * Archer num = 4; mul = 2; div = MAX(70, weapon_weight);
- * Magic eater num = 4; mul = 2; div = MAX(70, weapon_weight);
- * ForceTrainer num = 4; mul = 2; div = MAX(60, weapon_weight);
- * Mirror Master num = 3; mul = 3; div = MAX(100, weapon_weight);
- * Ninja num = 4; mul = 1; div = MAX(20, weapon_weight);
- *
- * To get "P", we look up the relevant "adj_str_blow[]" (see above),
- * multiply it by "mul", and then divide it by "div".
- * Increase P by 1 if you wield a weapon two-handed.
- * Decrease P by 1 if you are a Ninja.
- *
- * To get "D", we look up the relevant "adj_dex_blow[]" (see above),
- *
- * The player gets "blows_table[P][D]" blows/round, as shown below,
- * up to a maximum of "num" blows/round, plus any "bonus" blows/round.
- * </pre>
- */
-const byte blows_table[12][12] =
-{
- /* P/D */
- /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */
- /* 3 10 15 /10 /40 /60 /80 /100 /120 /140 /160 /180 */
- /* 0 */{ 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4 },
- /* 1 */{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 },
- /* 2 */{ 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5 },
- /* 3 */{ 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5 },
- /* 4 */{ 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 },
- /* 5 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
- /* 6 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
- /* 7 */{ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
- /* 8 */{ 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 },
- /* 9 */{ 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6 },
- /* 10*/{ 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
- /*11+*/{ 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6 },
-};
/*!
* @brief プレイヤーからモンスターへの打撃命中判定 /
monster_race *r_ptr = &r_info[m_ptr->r_idx];
/* Access the weapon */
- object_type *o_ptr = &p_ptr->inventory_list[INVEN_RARM + hand];
+ object_type *o_ptr = &inventory[INVEN_RARM + hand];
GAME_TEXT m_name[MAX_NLEN];
{
if ((r_ptr->level + 10) > p_ptr->lev)
{
- OBJECT_TYPE_VALUE tval = p_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
- OBJECT_SUBTYPE_VALUE sval = p_ptr->inventory_list[INVEN_RARM + hand].sval;
+ OBJECT_TYPE_VALUE tval = inventory[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
+ OBJECT_SUBTYPE_VALUE sval = inventory[INVEN_RARM + hand].sval;
int now_exp = p_ptr->weapon_exp[tval][sval];
if (now_exp < s_info[p_ptr->pclass].w_max[tval][sval])
{
if ((r_ptr->flags1 & RF1_FEMALE) &&
!(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
{
- if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (p_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
+ if ((inventory[INVEN_RARM].name1 == ART_ZANTETSU) || (inventory[INVEN_LARM].name1 == ART_ZANTETSU))
{
msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
return FALSE;
!(p_ptr->stun || p_ptr->confused || p_ptr->image ||
p_ptr->shero || !m_ptr->ml))
{
- if (p_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
- if (p_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
+ if (inventory[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
+ if (inventory[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
if (stormbringer)
{
msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
}
}
- p_ptr->riding_t_m_idx = g_ptr->m_idx;
+ riding_t_m_idx = g_ptr->m_idx;
if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
i = (INVENTORY_IDX)randint0(INVEN_PACK);
/* Obtain the item */
- o_ptr = &p_ptr->inventory_list[i];
+ o_ptr = &inventory[i];
+
+ /* Skip non-objects */
if (!o_ptr->k_idx) continue;
/* Drain charged wands/staffs */
i = (INVENTORY_IDX)randint0(INVEN_PACK);
/* Obtain the item */
- o_ptr = &p_ptr->inventory_list[i];
+ o_ptr = &inventory[i];
+
+ /* Skip non-objects */
if (!o_ptr->k_idx) continue;
/* Skip artifacts */
#else
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);
+
+
+ /* Make an object */
o_idx = o_pop();
/* Success */
/* Pick an item from the pack */
i = (INVENTORY_IDX)randint0(INVEN_PACK);
- o_ptr = &p_ptr->inventory_list[i];
+ o_ptr = &inventory[i];
+
+ /* Skip non-objects */
if (!o_ptr->k_idx) continue;
/* Skip non-food objects */
case RBE_EAT_LITE:
{
/* Access the lite */
- o_ptr = &p_ptr->inventory_list[INVEN_LITE];
+ o_ptr = &inventory[INVEN_LITE];
get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
{
HIT_POINT dam = 1;
- object_type *o_armed_ptr = &p_ptr->inventory_list[INVEN_RARM];
+ object_type *o_armed_ptr = &inventory[INVEN_RARM];
if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
{
}
/* Cursed armor makes damages doubled */
- o_armed_ptr = &p_ptr->inventory_list[INVEN_BODY];
+ o_armed_ptr = &inventory[INVEN_BODY];
if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
/* Modify the damage */
/* Some cursed armours gives an extra effect */
for (j = 0; j < 4; j++)
{
- o_armed_ptr = &p_ptr->inventory_list[typ[j][0]];
+ o_armed_ptr = &inventory[typ[j][0]];
if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
}
}
/* Gain shield experience */
- if (object_is_armour(&p_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&p_ptr->inventory_list[INVEN_LARM]))
+ 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];
/* Assume we attacked */
return (TRUE);
}
-
-
-/*!
- * @brief モンスターが敵モンスターに行う打撃処理 /
- * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
- * @param m_idx 目標となるモンスターの参照ID
- * @param dam ダメージ量
- * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
- * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
- * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
- * @param who 打撃を行ったモンスターの参照ID
- * @return なし
- */
-void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
-{
- monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
- GAME_TEXT m_name[160];
- bool seen = is_seen(m_ptr);
-
- /* Can the player be aware of this attack? */
- bool known = (m_ptr->cdis <= MAX_SIGHT);
-
- /* Extract monster name */
- monster_desc(m_name, m_ptr, 0);
-
- /* Redraw (later) if needed */
- if (m_ptr->ml)
- {
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
-
- (void)set_monster_csleep(m_idx, 0);
-
- if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(TRUE, TRUE);
-
- if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
- {
- if (seen)
- {
- msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
- }
- return;
- }
-
- if (r_ptr->flagsr & RFR_RES_ALL)
- {
- if (dam > 0)
- {
- dam /= 100;
- if ((dam == 0) && one_in_(3)) dam = 1;
- }
- if (dam == 0)
- {
- if (seen)
- {
- msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
- }
- return;
- }
- }
-
- /* Hurt it */
- m_ptr->hp -= dam;
-
- /* It is dead now... or is it? */
- if (m_ptr->hp < 0)
- {
- if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
- (r_ptr->flags7 & RF7_NAZGUL)) &&
- !p_ptr->inside_battle)
- {
- m_ptr->hp = 1;
- }
- else
- {
- /* Make a sound */
- if (!monster_living(m_ptr->r_idx))
- {
- sound(SOUND_N_KILL);
- }
- else
- {
- sound(SOUND_KILL);
- }
-
- *dead = TRUE;
-
- if (known)
- {
- monster_desc(m_name, m_ptr, MD_TRUE_NAME);
- /* Unseen death by normal attack */
- if (!seen)
- {
- current_floor_ptr->monster_noise = TRUE;
- }
- /* Death by special attack */
- else if (note)
- {
- msg_format(_("%^s%s", "%^s%s"), m_name, note);
- }
- /* Death by normal attack -- nonliving monster */
- else if (!monster_living(m_ptr->r_idx))
- {
- msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
- }
- /* Death by normal attack -- living monster */
- else
- {
- msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
- }
- }
-
- monster_gain_exp(who, m_ptr->r_idx);
- monster_death(m_idx, FALSE);
- delete_monster_idx(m_idx);
-
- /* Not afraid */
- (*fear) = FALSE;
-
- /* Monster is dead */
- return;
- }
- }
-
- *dead = FALSE;
-
-#ifdef ALLOW_FEAR
-
- /* Mega-Hack -- Pain cancels fear */
- if (MON_MONFEAR(m_ptr) && (dam > 0))
- {
- /* Cure fear */
- if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
- {
- /* No more fear */
- (*fear) = FALSE;
- }
- }
-
- /* Sometimes a monster gets scared by damage */
- if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
- {
- /* Percentage of fully healthy */
- int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
-
- /*
- * Run (sometimes) if at 10% or less of max hit points,
- * or (usually) when hit for half its current hit points
- */
- if (((percentage <= 10) && (randint0(10) < percentage)) ||
- ((dam >= m_ptr->hp) && (randint0(100) < 80)))
- {
- /* Hack -- note fear */
- (*fear) = TRUE;
-
- /* Hack -- Add some timed fear */
- (void)set_monster_monfear(m_idx, (randint1(10) +
- (((dam >= m_ptr->hp) && (percentage > 7)) ?
- 20 : ((11 - percentage) * 5))));
- }
- }
-
-#endif /* ALLOW_FEAR */
-
- if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
- {
- if (is_pet(¤t_floor_ptr->m_list[who]) && !player_bold(m_ptr->target_y, m_ptr->target_x))
- {
- set_target(m_ptr, current_floor_ptr->m_list[who].fy, current_floor_ptr->m_list[who].fx);
- }
- }
-
- if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
- {
- /* Extract monster name */
- monster_desc(m_name, m_ptr, 0);
-
- if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
- if (rakuba((dam > 200) ? 200 : dam, FALSE))
- {
- msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);
- }
- }
-
- /* Not dead yet */
- return;
-}