*/
#include "angband.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 "object-flavor.h"
#include "object-hook.h"
#include "grid.h"
#include "player-move.h"
-#include "floor.h"
-#include "spells.h"
-#include "files.h"
-#include "player-effects.h"
-#include "player-skill.h"
-#include "player-damage.h"
-#include "player-status.h"
-#include "view-mainwindow.h"
-
-
- /*!
- * @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
/*!
/* Obtain the item */
o_ptr = &inventory[i];
+
+ /* Skip non-objects */
if (!o_ptr->k_idx) continue;
/* Drain charged wands/staffs */
/* Obtain the item */
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 */
i = (INVENTORY_IDX)randint0(INVEN_PACK);
o_ptr = &inventory[i];
+
+ /* Skip non-objects */
if (!o_ptr->k_idx) continue;
/* Skip non-food objects */
/* 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)
- {
- mon_fight = 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;
-}