*/
#include "angband.h"
+#include "object-curse.h"
/*!
* @param prob 基本確率(%)
* @return 適した選択を取るならばTRUEを返す。
*/
-static bool int_outof(monster_race *r_ptr, int prob)
+static bool int_outof(monster_race *r_ptr, PERCENTAGE prob)
{
/* Non-Smart monsters are half as "smart" */
if (!(r_ptr->flags2 & RF2_SMART)) prob = prob / 2;
f5 &= ~(RF5_DRAIN_MANA);
}
- /* XXX XXX XXX No spells left? */
+ /* No spells left? */
/* if (!f4 && !f5 && !f6) ... */
(*f4p) = f4;
* @param x1 判定を行いたいマスのX座標
* @return 召還に相応しいならばTRUEを返す
*/
-bool summon_possible(int y1, int x1)
+bool summon_possible(POSITION y1, POSITION x1)
{
- int y, x;
+ POSITION y, x;
/* Start at the player's location, and check 2 grids in each dir */
for (y = y1 - 2; y <= y1 + 2; y++)
*/
bool raise_possible(monster_type *m_ptr)
{
- int xx, yy;
- int y = m_ptr->fy;
- int x = m_ptr->fx;
- s16b this_o_idx, next_o_idx = 0;
+ POSITION xx, yy;
+ POSITION y = m_ptr->fy;
+ POSITION x = m_ptr->fx;
+ OBJECT_IDX this_o_idx, next_o_idx = 0;
cave_type *c_ptr;
for (xx = x - 5; xx <= x + 5; xx++)
* no equally friendly monster is\n
* between the attacker and target.\n
*/
-bool clean_shot(int y1, int x1, int y2, int x2, bool is_friend)
+bool clean_shot(POSITION y1, POSITION x1, POSITION y2, POSITION x2, bool is_friend)
{
/* Must be the same as projectable() */
- int i, y, x;
+ int i;
+ POSITION y, x;
int grid_n = 0;
u16b grid_g[512];
* @param target_type モンスターからモンスターへ撃つならMONSTER_TO_MONSTER、モンスターからプレイヤーならMONSTER_TO_PLAYER
* @return なし
*/
-void bolt(MONSTER_IDX m_idx, int y, int x, int typ, int dam_hp, int monspell, int target_type)
+void bolt(MONSTER_IDX m_idx, POSITION y, POSITION x, EFFECT_ID typ, int dam_hp, int monspell, int target_type)
{
BIT_FLAGS flg = 0;
bool learnable = spell_learnable(m_idx);
* @param target_type モンスターからモンスターへ撃つならMONSTER_TO_MONSTER、モンスターからプレイヤーならMONSTER_TO_PLAYER
* @return なし
*/
-void beam(MONSTER_IDX m_idx, int y, int x, int typ, int dam_hp, int monspell, int target_type)
+void beam(MONSTER_IDX m_idx, POSITION y, POSITION x, EFFECT_ID typ, int dam_hp, int monspell, int target_type)
{
BIT_FLAGS flg = 0;
bool learnable = spell_learnable(m_idx);
* @param typ 効果属性ID
* @param dam_hp 威力
* @param rad 半径
- * @param breath TRUEならばブ・E構萢・.ALSEならばボー・E萢
+ * @param breath
* @param monspell モンスター魔法のID
* @param target_type モンスターからモンスターへ撃つならMONSTER_TO_MONSTER、モンスターからプレイヤーならMONSTER_TO_PLAYER
* @return なし
*/
-void breath(int y, int x, MONSTER_IDX m_idx, int typ, int dam_hp, int rad, bool breath, int monspell, int target_type)
+void breath(POSITION y, POSITION x, MONSTER_IDX m_idx, EFFECT_ID typ, int dam_hp, POSITION rad, bool breath, int monspell, int target_type)
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
(void)project(m_idx, rad, y, x, dam_hp, typ, flg, (learnable ? monspell : -1));
}
-/*!
- * @brief モンスターのボール型&ブレス型魔法処理 /
- * @param power 呪いの段階
- * @param o_ptr 呪いをかけられる装備オブジェクトの構造体参照ポインタ
- * @return 与える呪いのID
- */
-u32b get_curse(int power, object_type *o_ptr)
-{
- u32b new_curse;
-
- while(1)
- {
- new_curse = (1 << (randint0(MAX_CURSE)+4));
- if (power == 2)
- {
- if (!(new_curse & TRC_HEAVY_MASK)) continue;
- }
- else if (power == 1)
- {
- if (new_curse & TRC_SPECIAL_MASK) continue;
- }
- else if (power == 0)
- {
- if (new_curse & TRC_HEAVY_MASK) continue;
- }
- if (new_curse == TRC_LOW_MELEE && !object_is_weapon(o_ptr)) continue;
- if (new_curse == TRC_LOW_AC && !object_is_armour(o_ptr)) continue;
- break;
- }
- return new_curse;
-}
-
-/*!
- * @brief 装備への呪い付加判定と付加処理 /
- * @param chance 呪いの基本確率
- * @param heavy_chance 重い呪いを選択肢に入れるか否か。
- * @return なし
- */
-void curse_equipment(int chance, int heavy_chance)
-{
- bool changed = FALSE;
- int curse_power = 0;
- u32b new_curse;
- u32b oflgs[TR_FLAG_SIZE];
- object_type *o_ptr = &inventory[INVEN_RARM + randint0(12)];
- char o_name[MAX_NLEN];
-
- if (randint1(100) > chance) return;
-
- if (!o_ptr->k_idx) return;
- object_flags(o_ptr, oflgs);
-
- object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-
- /* Extra, biased saving throw for blessed items */
- if (have_flag(oflgs, TR_BLESSED))
- {
-#ifdef JP
- msg_format("祝福された%sは呪いを跳ね返した!", o_name,
-#else
- msg_format("Your blessed %s resist%s cursing!", o_name,
-#endif
-
- ((o_ptr->number > 1) ? "" : "s"));
- /* Hmmm -- can we wear multiple items? If not, this is unnecessary */
- return;
- }
-
- if ((randint1(100) <= heavy_chance) &&
- (object_is_artifact(o_ptr) || object_is_ego(o_ptr)))
- {
- if (!(o_ptr->curse_flags & TRC_HEAVY_CURSE))
- changed = TRUE;
- o_ptr->curse_flags |= TRC_HEAVY_CURSE;
- o_ptr->curse_flags |= TRC_CURSED;
- curse_power++;
- }
- else
- {
- if (!object_is_cursed(o_ptr))
- changed = TRUE;
- o_ptr->curse_flags |= TRC_CURSED;
- }
- if (heavy_chance >= 50) curse_power++;
-
- new_curse = get_curse(curse_power, o_ptr);
- if (!(o_ptr->curse_flags & new_curse))
- {
- changed = TRUE;
- o_ptr->curse_flags |= new_curse;
- }
-
- if (changed)
- {
-#ifdef JP
-msg_format("悪意に満ちた黒いオーラが%sをとりまいた...", o_name);
-#else
- msg_format("There is a malignant black aura surrounding %s...", o_name);
-#endif
-
- o_ptr->feeling = FEEL_NONE;
- }
- p_ptr->update |= (PU_BONUS);
-}
/*!
* @details
* Returns "TRUE" if a spell (or whatever) was (successfully) cast.\n
*\n
- * XXX XXX XXX This function could use some work, but remember to\n
+ * This function could use some work, but remember to\n
* keep it as optimized as possible, while retaining generic code.\n
*\n
* Verify the various "blind-ness" checks in the code.\n
*\n
- * XXX XXX XXX Note that several effects should really not be "seen"\n
+ * Note that several effects should really not be "seen"\n
* if the player is blind. See also "effects.c" for other "mistakes".\n
*\n
* Perhaps monsters should breathe at locations *near* the player,\n
PERCENTAGE failrate;
byte spell[96], num = 0;
BIT_FLAGS f4, f5, f6;
- monster_type *m_ptr = &m_list[m_idx];
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
- char m_name[80];
+ monster_type *m_ptr = &m_list[m_idx];
+ monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ char m_name[80];
#ifndef JP
- char m_poss[80];
+ char m_poss[80];
#endif
bool no_inate = FALSE;
bool do_spell = DO_SPELL_NONE;
/* Sometimes forbid inate attacks (breaths) */
if (randint0(100) >= (r_ptr->freq_spell * 2)) no_inate = TRUE;
- /* XXX XXX XXX Handle "track_target" option (?) */
+ /* Handle "track_target" option (?) */
/* Extract the racial spell flags */
}
else if ((f5 & RF5_BA_LITE) && (m_ptr->cdis <= MAX_RANGE))
{
- int by = y, bx = x;
+ POSITION by = y, bx = x;
get_project_point(m_ptr->fy, m_ptr->fx, &by, &bx, 0L);
if ((distance(by, bx, y, x) <= 3) && los(by, bx, y, x) && one_in_(5))
{
if (!spell_is_inate(thrown_spell)
&& (in_no_magic_dungeon || (MON_STUNNED(m_ptr) && one_in_(2)) || (randint0(100) < failrate)))
{
- disturb(1, 1);
- /* Message */
+ disturb(TRUE, TRUE);
msg_format(_("%^sは呪文を唱えようとしたが失敗した。", "%^s tries to cast a spell, but fails."), m_name);
return (TRUE);