*/
#include "angband.h"
+#include "object-hook.h"
/*! テレポート先探索の試行数 / Maximum number of tries for teleporting */
#define MAX_TRIES 100
-/*! 能力値現象の基本確率(1 / HURT_CHANCE) / 1/x chance of reducing stats (for elemental attacks) */
-#define HURT_CHANCE 16
-
-/*!
- * @brief 指定されたマスがモンスターのテレポート可能先かどうかを判定する。
- * @param m_idx モンスターID
- * @param y 移動先Y座標
- * @param x 移動先X座標
- * @param mode オプション
- * @return テレポート先として妥当ならばtrue
- */
-static bool cave_monster_teleportable_bold(MONSTER_IDX m_idx, int y, int x, BIT_FLAGS mode)
-{
- monster_type *m_ptr = &m_list[m_idx];
- cave_type *c_ptr = &cave[y][x];
- feature_type *f_ptr = &f_info[c_ptr->feat];
-
- /* Require "teleportable" space */
- if (!have_flag(f_ptr->flags, FF_TELEPORTABLE)) return FALSE;
-
- if (c_ptr->m_idx && (c_ptr->m_idx != m_idx)) return FALSE;
- if (player_bold(y, x)) return FALSE;
-
- /* Hack -- no teleport onto glyph of warding */
- if (is_glyph_grid(c_ptr)) return FALSE;
- if (is_explosive_rune_grid(c_ptr)) return FALSE;
-
- if (!(mode & TELEPORT_PASSIVE))
- {
- if (!monster_can_cross_terrain(c_ptr->feat, &r_info[m_ptr->r_idx], 0)) return FALSE;
- }
-
- return TRUE;
-}
-
/*!
* @brief モンスターのテレポートアウェイ処理 /
* Attempt to move the monster at least "dis/2" grids away.
* But allow variation to prevent infinite loops.
*/
-bool teleport_away(MONSTER_IDX m_idx, int dis, BIT_FLAGS mode)
+bool teleport_away(MONSTER_IDX m_idx, POSITION dis, BIT_FLAGS mode)
{
- int oy, ox, d, i, min;
+ POSITION oy, ox, d, i, min;
int tries = 0;
POSITION ny = 0, nx = 0;
if (tries > MAX_TRIES) return (FALSE);
}
- /* Sound */
sound(SOUND_TPOTHER);
/* Update the old location */
*/
void teleport_monster_to(MONSTER_IDX m_idx, POSITION ty, POSITION tx, int power, BIT_FLAGS mode)
{
- int ny, nx, oy, ox, d, i, min;
+ POSITION ny, nx, oy, ox;
+ int d, i, min;
int attempts = 500;
- int dis = 2;
+ POSITION dis = 2;
bool look = TRUE;
monster_type *m_ptr = &m_list[m_idx];
/* Paranoia */
- if (!m_ptr->r_idx) return;
+ if(!m_ptr->r_idx) return;
/* "Skill" test */
- if (randint1(100) > power) return;
+ if(randint1(100) > power) return;
/* Initialize */
ny = m_ptr->fy;
if (attempts < 1) return;
- /* Sound */
sound(SOUND_TPOTHER);
/* Update the old location */
}
/*!
- * @brief 指定されたマスにプレイヤーがテレポート可能かどうかを判定する。
- * @param y 移動先Y座標
- * @param x 移動先X座標
- * @param mode オプション
- * @return テレポート先として妥当ならばtrue
- */
-bool cave_player_teleportable_bold(int y, int x, BIT_FLAGS mode)
-{
- cave_type *c_ptr = &cave[y][x];
- feature_type *f_ptr = &f_info[c_ptr->feat];
-
- /* Require "teleportable" space */
- if (!have_flag(f_ptr->flags, FF_TELEPORTABLE)) return FALSE;
-
- /* No magical teleporting into vaults and such */
- if (!(mode & TELEPORT_NONMAGICAL) && (c_ptr->info & CAVE_ICKY)) return FALSE;
-
- if (c_ptr->m_idx && (c_ptr->m_idx != p_ptr->riding)) return FALSE;
-
- /* don't teleport on a trap. */
- if (have_flag(f_ptr->flags, FF_HIT_TRAP)) return FALSE;
-
- if (!(mode & TELEPORT_PASSIVE))
- {
- if (!player_can_enter(c_ptr->feat, 0)) return FALSE;
-
- if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP))
- {
- if (!p_ptr->levitation && !p_ptr->can_swim) return FALSE;
- }
-
- if (have_flag(f_ptr->flags, FF_LAVA) && !p_ptr->immune_fire && !IS_INVULN())
- {
- /* Always forbid deep lava */
- if (have_flag(f_ptr->flags, FF_DEEP)) return FALSE;
-
- /* Forbid shallow lava when the player don't have levitation */
- if (!p_ptr->levitation) return FALSE;
- }
-
- }
-
- return TRUE;
-}
-
-
-/*!
* @brief プレイヤーのテレポート先選定と移動処理 /
* Teleport the player to a location up to "dis" grids away.
* @param dis 基本移動距離
* </pre>
*/
-bool teleport_player_aux(int dis, BIT_FLAGS mode)
+bool teleport_player_aux(POSITION dis, BIT_FLAGS mode)
{
int candidates_at[MAX_TELEPORT_DISTANCE + 1];
int total_candidates, cur_candidates;
if (player_bold(y, x)) return FALSE;
- /* Sound */
sound(SOUND_TELEPORT);
#ifdef JP
* @param mode オプション
* @return なし
*/
-void teleport_player(int dis, BIT_FLAGS mode)
+void teleport_player(POSITION dis, BIT_FLAGS mode)
{
int yy, xx;
* @param dis テレポート距離
* @return なし
*/
-void teleport_player_away(MONSTER_IDX m_idx, int dis)
+void teleport_player_away(MONSTER_IDX m_idx, POSITION dis)
{
int yy, xx;
void teleport_player_to(POSITION ny, POSITION nx, BIT_FLAGS mode)
{
POSITION y, x;
- int dis = 0, ctr = 0;
+ POSITION dis = 0, ctr = 0;
if (p_ptr->anti_tele && !(mode & TELEPORT_NONMAGICAL))
{
}
}
- /* Sound */
sound(SOUND_TELEPORT);
/* Move the player */
if ((p_ptr->muta1 & MUT1_VTELEPORT) || (p_ptr->pclass == CLASS_IMITATOR)) follow = TRUE;
else
{
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
object_type *o_ptr;
int i;
delete_monster_idx(m_idx);
}
- /* Sound */
sound(SOUND_TPLEVEL);
}
/* Artifacts have 71% chance to resist */
if (object_is_artifact(o_ptr) && (randint0(100) < 71))
{
- /* Message */
#ifdef JP
msg_format("%s(%c)は劣化を跳ね返した!",o_name, index_to_label(t) );
#else
if ((to_h != o_ptr->to_h) || (to_d != o_ptr->to_d) ||
(to_a != o_ptr->to_a) || (pval != o_ptr->pval))
{
- /* Message */
#ifdef JP
msg_format("%s(%c)は劣化してしまった!",
o_name, index_to_label(t) );
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
- /* Window stuff */
p_ptr->window |= (PW_EQUIP | PW_PLAYER);
calc_android_exp();
/* Refuel */
o_ptr->xtra4 += (XTRA16)(max_flog / 2);
- /* Message */
msg_print(_("照明用アイテムに燃素を補充した。", "You add phlogiston to your light item."));
/* Comment */
item_tester_hook = object_allow_enchant_melee_weapon;
item_tester_no_ryoute = TRUE;
- /* Get an item */
q = _("どの武器を強化しますか? ", "Enchant which weapon? ");
s = _("強化できる武器がない。", "You have nothing to enchant.");
/* Mega-Hack -- Forget the view and lite */
p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
- /* Update stuff */
p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
/* Update the monsters */
/* Redraw map */
p_ptr->redraw |= (PR_MAP);
- /* Window stuff */
p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
return TRUE;
*/
bool warding_glyph(void)
{
- /* XXX XXX XXX */
if (!cave_clean_bold(p_ptr->y, p_ptr->x))
{
msg_print(_("床上のアイテムが呪文を跳ね返した。", "The object resists the spell."));
*/
bool place_mirror(void)
{
- /* XXX XXX XXX */
if (!cave_clean_bold(p_ptr->y, p_ptr->x))
{
msg_print(_("床上のアイテムが呪文を跳ね返した。", "The object resists the spell."));
*/
bool explosive_rune(void)
{
- /* XXX XXX XXX */
if (!cave_clean_bold(p_ptr->y, p_ptr->x))
{
msg_print(_("床上のアイテムが呪文を跳ね返した。", "The object resists the spell."));
*/
void identify_pack(void)
{
- int i;
+ INVENTORY_IDX i;
/* Simply identify and know every item */
for (i = 0; i < INVEN_TOTAL; i++)
/* Recalculate the bonuses */
p_ptr->update |= (PU_BONUS);
- /* Window stuff */
p_ptr->window |= (PW_EQUIP);
/* Count the uncursings */
cnt++;
}
+ if (cnt)
+ {
+ msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
+ }
/* Return "something uncursed" */
return (cnt);
}
/* Hack -- force destruction */
if (command_arg > 0) force = TRUE;
- /* Get an item */
q = _("どのアイテムを金に変えますか?", "Turn which item to gold? ");
s = _("金に変えられる物がありません。", "You have nothing to turn to gold.");
/* Artifacts cannot be destroyed */
if (!can_player_destroy_object(o_ptr))
{
- /* Message */
msg_format(_("%sを金に変えることに失敗した。", "You fail to turn %s to gold!"), o_name);
- /* Done */
return FALSE;
}
if (price <= 0)
{
- /* Message */
msg_format(_("%sをニセの金に変えた。", "You turn %s to fool's gold."), o_name);
}
else
/* Redraw gold */
p_ptr->redraw |= (PR_GOLD);
- /* Window stuff */
p_ptr->window |= (PW_PLAYER);
}
/* Combine / Reorder the pack (later) */
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
- /* Window stuff */
p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
calc_android_exp();
/* Enchant armor if requested */
if (num_ac) item_tester_hook = object_is_armour;
- /* Get an item */
q = _("どのアイテムを強化しますか? ", "Enchant which item? ");
s = _("強化できるアイテムがない。", "You have nothing to enchant.");
/* Flush */
if (flush_failure) flush();
- /* Message */
msg_print(_("強化に失敗した。", "The enchantment failed."));
if (one_in_(3)) chg_virtue(V_ENCHANT, -1);
/*!
- * @brief アイテムが並の価値のアイテムかどうか判定する /
- * Check if an object is nameless weapon or armour
- * @param o_ptr 判定するアイテムの情報参照ポインタ
- * @return 並ならばTRUEを返す
- */
-static bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)
-{
- /* Require weapon or armour */
- if (!object_is_weapon_armour_ammo(o_ptr)) return FALSE;
-
- /* Require nameless object if the object is well known */
- if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
- return FALSE;
-
- return TRUE;
-}
-
-/*!
* @brief アーティファクト生成の巻物処理 /
* @return 生成が実際に試みられたらTRUEを返す
*/
/* Enchant weapon/armour */
item_tester_hook = item_tester_hook_nameless_weapon_armour;
- /* Get an item */
q = _("どのアイテムを強化しますか? ", "Enchant which item? ");
s = _("強化できるアイテムがない。", "You have nothing to enchant.");
/* Flush */
if (flush_failure) flush();
- /* Message */
msg_print(_("強化に失敗した。", "The enchantment failed."));
if (one_in_(3)) chg_virtue(V_ENCHANT, -1);
/* Combine / Reorder the pack (later) */
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
- /* Window stuff */
p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
strcpy(record_o_name, o_name);
}
/*!
- * @brief アイテムが鑑定済みかを判定する /
- * @param o_ptr 判定するアイテムの情報参照ポインタ
- * @return 実際に鑑定済みならばTRUEを返す
- */
-static bool item_tester_hook_identify(object_type *o_ptr)
-{
- return (bool)!object_is_known(o_ptr);
-}
-
-/*!
- * @brief アイテムが鑑定済みの武器防具かを判定する /
- * @param o_ptr 判定するアイテムの情報参照ポインタ
- * @return 実際に鑑定済みならばTRUEを返す
- */
-static bool item_tester_hook_identify_weapon_armour(object_type *o_ptr)
-{
- if (object_is_known(o_ptr))
- return FALSE;
- return object_is_weapon_armour_ammo(o_ptr);
-}
-
-/*!
* @brief アイテム鑑定のメインルーチン処理 /
* Identify an object in the inventory (or on the floor)
* @param only_equip 装備品のみを対象とするならばTRUEを返す
q = _("すべて鑑定済みです。 ", "All items are identified. ");
}
- /* Get an item */
s = _("鑑定するべきアイテムがない。", "You have nothing to identify.");
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE);
if (only_equip) item_tester_hook = object_is_weapon_armour_ammo;
item_tester_no_ryoute = TRUE;
- /* Get an item */
q = _("どれを使いますか?", "Use which item? ");
s = _("使えるものがありません。", "You have nothing you can use.");
o_ptr = &o_list[0 - item];
}
- /* Oops */
msg_print(_("まばゆい閃光が走った!", "There is a bright flash of light!"));
{
POSITION iy = o_ptr->iy; /* Y-position on map, or zero */
}
/*!
- * @brief アイテムが*鑑定*済みかを判定する /
- * @param o_ptr 判定するアイテムの情報参照ポインタ
- * @return 実際に鑑定済みならばTRUEを返す
- */
-static bool item_tester_hook_identify_fully(object_type *o_ptr)
-{
- return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL));
-}
-
-/*!
- * @brief アイテムが*鑑定*済みの武器防具かを判定する /
- * @param o_ptr 判定するアイテムの情報参照ポインタ
- * @return 実際に鑑定済みならばTRUEを返す
- */
-static bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr)
-{
- if (!item_tester_hook_identify_fully(o_ptr))
- return FALSE;
- return object_is_weapon_armour_ammo(o_ptr);
-}
-
-/*!
* @brief アイテム*鑑定*のメインルーチン処理 /
* Identify an object in the inventory (or on the floor)
* @param only_equip 装備品のみを対象とするならばTRUEを返す
q = _("すべて*鑑定*済みです。 ", "All items are *identified*. ");
}
- /* Get an item */
s = _("*鑑定*するべきアイテムがない。", "You have nothing to *identify*.");
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE);
}
-/*!
- * @brief 魔力充填が可能なアイテムかどうか判定する /
- * Hook for "get_item()". Determine if something is rechargable.
- * @param o_ptr 判定するアイテムの情報参照ポインタ
- * @return 魔力充填が可能ならばTRUEを返す
- */
-bool item_tester_hook_recharge(object_type *o_ptr)
-{
- /* Recharge staffs */
- if (o_ptr->tval == TV_STAFF) return (TRUE);
-
- /* Recharge wands */
- if (o_ptr->tval == TV_WAND) return (TRUE);
-
- /* Hack -- Recharge rods */
- if (o_ptr->tval == TV_ROD) return (TRUE);
-
- /* Nope */
- return (FALSE);
-}
-
/*!
* @brief 魔力充填処理 /
* strongly they recharge. Staffs, however, each get fewer charges if
* stacked.
*
- * XXX XXX XXX Beware of "sliding index errors".
+ * Beware of "sliding index errors".
*/
bool recharge(int power)
{
OBJECT_IDX item;
- int lev;
+ DEPTH lev;
int recharge_strength;
TIME_EFFECT recharge_amount;
/* Only accept legal items */
item_tester_hook = item_tester_hook_recharge;
- /* Get an item */
q = _("どのアイテムに魔力を充填しますか? ", "Recharge which item? ");
s = _("魔力を充填すべきアイテムがない。", "You have nothing to recharge.");
if (o_ptr->tval == TV_ROD)
{
/* Extract a recharge strength by comparing object level to power. */
- recharge_strength = ((power > lev/2) ? (power - lev/2) : 0) / 5;
+ recharge_strength = ((power > lev / 2) ? (power - lev / 2) : 0) / 5;
/* Back-fire */
* Divide up a stack of wands' charges to calculate charge penalty.
*/
if ((o_ptr->tval == TV_WAND) && (o_ptr->number > 1))
- recharge_strength = (100 + power - lev -
- (8 * o_ptr->pval / o_ptr->number)) / 15;
+ recharge_strength = (100 + power - lev - (8 * o_ptr->pval / o_ptr->number)) / 15;
/* All staffs, unstacked wands. */
- else recharge_strength = (100 + power - lev -
- (8 * o_ptr->pval)) / 15;
+ else recharge_strength = (100 + power - lev - (8 * o_ptr->pval)) / 15;
/* Paranoia */
if (recharge_strength < 0) recharge_strength = 0;
/*** Determine Seriousness of Failure ***/
/* Mages recharge objects more safely. */
- if (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER || p_ptr->pclass == CLASS_MAGIC_EATER || p_ptr->pclass == CLASS_BLUE_MAGE)
+ if (IS_WIZARD_CLASS() || p_ptr->pclass == CLASS_MAGIC_EATER || p_ptr->pclass == CLASS_BLUE_MAGE)
{
/* 10% chance to blow up one rod, otherwise draining. */
if (o_ptr->tval == TV_ROD)
/* Combine / Reorder the pack (later) */
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
- /* Window stuff */
p_ptr->window |= (PW_INVEN);
/* Something was done */
/* Bless only weapons */
item_tester_hook = object_is_weapon;
- /* Get an item */
q = _("どのアイテムを祝福しますか?", "Bless which weapon? ");
s = _("祝福できる武器がありません。", "You have weapon to bless.");
/* Recalculate the bonuses */
p_ptr->update |= (PU_BONUS);
- /* Window stuff */
p_ptr->window |= (PW_EQUIP);
}
/* Recalculate bonuses */
p_ptr->update |= (PU_BONUS);
- /* Window stuff */
p_ptr->window |= (PW_EQUIP | PW_PLAYER);
calc_android_exp();
{
OBJECT_IDX item;
object_type *o_ptr;
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
char o_name[MAX_NLEN];
cptr q, s;
/* Assume enchant weapon */
item_tester_tval = TV_SHIELD;
- /* Get an item */
q = _("どの盾を磨きますか?", "Pulish which weapon? ");
s = _("磨く盾がありません。", "You have weapon to pulish.");
* Hack -- Display all known spells in a window
* return なし
* @details
- * XXX XXX XXX Need to analyze size of the window.
- * XXX XXX XXX Need more color coding.
+ * Need to analyze size of the window.
+ * Need more color coding.
*/
void display_spell_list(void)
{
(p_ptr->pclass == CLASS_FORCETRAINER))
{
int minfail = 0;
- int plev = p_ptr->lev;
+ PLAYER_LEVEL plev = p_ptr->lev;
int chance = 0;
mind_type spell;
char comment[80];
* @param use_realm 魔法領域ID
* @return なし
*/
-void print_spells(SPELL_IDX target_spell, SPELL_IDX *spells, int num, TERM_POSITION y, TERM_POSITION x, REALM_IDX use_realm)
+void print_spells(SPELL_IDX target_spell, SPELL_IDX *spells, int num, TERM_LEN y, TERM_LEN x, REALM_IDX use_realm)
{
int i, spell, exp_level, increment = 64;
const magic_type *s_ptr;
*/
int set_acid_destroy(object_type *o_ptr)
{
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
if (!hates_acid(o_ptr)) return (FALSE);
object_flags(o_ptr, flgs);
if (have_flag(flgs, TR_IGNORE_ACID)) return (FALSE);
*/
int set_elec_destroy(object_type *o_ptr)
{
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
if (!hates_elec(o_ptr)) return (FALSE);
object_flags(o_ptr, flgs);
if (have_flag(flgs, TR_IGNORE_ELEC)) return (FALSE);
*/
int set_fire_destroy(object_type *o_ptr)
{
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
if (!hates_fire(o_ptr)) return (FALSE);
object_flags(o_ptr, flgs);
if (have_flag(flgs, TR_IGNORE_FIRE)) return (FALSE);
*/
int set_cold_destroy(object_type *o_ptr)
{
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
if (!hates_cold(o_ptr)) return (FALSE);
object_flags(o_ptr, flgs);
if (have_flag(flgs, TR_IGNORE_COLD)) return (FALSE);
*/
int inven_damage(inven_func typ, int perc)
{
- int i, j, k, amt;
+ INVENTORY_IDX i;
+ int j, k, amt;
object_type *o_ptr;
- char o_name[MAX_NLEN];
+ char o_name[MAX_NLEN];
if (CHECK_MULTISHADOW()) return 0;
/* Get a description */
object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
- /* Message */
msg_format(_("%s(%c)が%s壊れてしまった!", "%sour %s (%c) %s destroyed!"),
#ifdef JP
static int minus_ac(void)
{
object_type *o_ptr = NULL;
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
char o_name[MAX_NLEN];
return (TRUE);
}
- /* Message */
msg_format(_("%sがダメージを受けた!", "Your %s is damaged!"), o_name);
/* Damage the item */
/* Calculate bonuses */
p_ptr->update |= (PU_BONUS);
- /* Window stuff */
p_ptr->window |= (PW_EQUIP | PW_PLAYER);
calc_android_exp();
/* Select a piece of armour */
item_tester_hook = object_is_armour;
- /* Get an item */
q = _("どの防具に錆止めをしますか?", "Rustproof which piece of armour? ");
s = _("錆止めできるものがありません。", "You have nothing to rustproof.");
/* not artifact or failed save... */
else
{
- /* Oops */
msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
chg_virtue(V_ENCHANT, -5);
/* Recalculate mana */
p_ptr->update |= (PU_MANA);
- /* Window stuff */
p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
}
/* not artifact or failed save... */
else
{
- /* Oops */
if (!force) msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
chg_virtue(V_ENCHANT, -5);
/* Recalculate mana */
p_ptr->update |= (PU_MANA);
- /* Window stuff */
p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
}
/* Randomize */
if (randint0(100) < 75) continue;
- /* Message */
msg_print(_("クロスボウの矢が炎のオーラに包まれた!", "Your bolts are covered in a fiery aura!"));
/* Ego-item */
/* Use that index */
r_idx = r;
- /* Done */
break;
}
{
BIT_FLAGS mode = 0L;
bool preserve_hold_objects = back_m.hold_o_idx ? TRUE : FALSE;
- s16b this_o_idx, next_o_idx = 0;
+ OBJECT_IDX this_o_idx, next_o_idx = 0;
/* Get the monsters attitude */
if (is_friendly(m_ptr)) mode |= PM_FORCE_FRIENDLY;
*/
bool eat_magic(int power)
{
- object_type * o_ptr;
+ object_type *o_ptr;
object_kind *k_ptr;
- int lev;
+ DEPTH lev;
OBJECT_IDX item;
int recharge_strength = 0;
item_tester_hook = item_tester_hook_recharge;
- /* Get an item */
q = _("どのアイテムから魔力を吸収しますか?", "Drain which item? ");
s = _("魔力を吸収できるアイテムがありません。", "You have nothing to drain.");
p_ptr->total_weight -= q_ptr->weight;
item = inven_carry(q_ptr);
- /* Message */
msg_print(_("杖をまとめなおした。", "You unstack your staff."));
}
}
/*** Determine Seriousness of Failure ***/
/* Mages recharge objects more safely. */
- if (p_ptr->pclass == CLASS_MAGE || p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER || p_ptr->pclass == CLASS_MAGIC_EATER || p_ptr->pclass == CLASS_BLUE_MAGE)
+ if (IS_WIZARD_CLASS())
{
/* 10% chance to blow up one rod, otherwise draining. */
if (o_ptr->tval == TV_ROD)
* @param mode 召喚オプション
* @return ターンを消費した場合TRUEを返す
*/
-bool summon_kin_player(int level, int y, int x, BIT_FLAGS mode)
+bool summon_kin_player(DEPTH level, POSITION y, POSITION x, BIT_FLAGS mode)
{
bool pet = (bool)(mode & PM_FORCE_PET);
if (!pet) mode |= PM_NO_PET;
*/
void massacre(void)
{
- int x, y;
+ POSITION x, y;
cave_type *c_ptr;
monster_type *m_ptr;
- int dir;
+ DIRECTION dir;
for (dir = 0; dir < 8; dir++)
{
py_attack(y, x, 0);
}
}
+
+bool eat_lock(void)
+{
+ POSITION x, y;
+ cave_type *c_ptr;
+ feature_type *f_ptr, *mimic_f_ptr;
+ DIRECTION dir;
+
+ if (!get_rep_dir2(&dir)) return FALSE;
+ y = p_ptr->y + ddy[dir];
+ x = p_ptr->x + ddx[dir];
+ c_ptr = &cave[y][x];
+ f_ptr = &f_info[c_ptr->feat];
+ mimic_f_ptr = &f_info[get_feat_mimic(c_ptr)];
+
+ stop_mouth();
+
+ if (!have_flag(mimic_f_ptr->flags, FF_HURT_ROCK))
+ {
+ msg_print(_("この地形は食べられない。", "You cannot eat this feature."));
+ }
+ else if (have_flag(f_ptr->flags, FF_PERMANENT))
+ {
+ msg_format(_("いてっ!この%sはあなたの歯より硬い!", "Ouch! This %s is harder than your teeth!"), f_name + mimic_f_ptr->name);
+ }
+ else if (c_ptr->m_idx)
+ {
+ monster_type *m_ptr = &m_list[c_ptr->m_idx];
+ msg_print(_("何かが邪魔しています!", "There's something in the way!"));
+
+ if (!m_ptr->ml || !is_pet(m_ptr)) py_attack(y, x, 0);
+ }
+ else if (have_flag(f_ptr->flags, FF_TREE))
+ {
+ msg_print(_("木の味は好きじゃない!", "You don't like the woody taste!"));
+ }
+ else if (have_flag(f_ptr->flags, FF_GLASS))
+ {
+ msg_print(_("ガラスの味は好きじゃない!", "You don't like the glassy taste!"));
+ }
+ else if (have_flag(f_ptr->flags, FF_DOOR) || have_flag(f_ptr->flags, FF_CAN_DIG))
+ {
+ (void)set_food(p_ptr->food + 3000);
+ }
+ else if (have_flag(f_ptr->flags, FF_MAY_HAVE_GOLD) || have_flag(f_ptr->flags, FF_HAS_GOLD))
+ {
+ (void)set_food(p_ptr->food + 5000);
+ }
+ else
+ {
+ msg_format(_("この%sはとてもおいしい!", "This %s is very filling!"), f_name + mimic_f_ptr->name);
+ (void)set_food(p_ptr->food + 10000);
+ }
+
+ /* Destroy the wall */
+ cave_alter_feat(y, x, FF_HURT_ROCK);
+
+ /* Move the player */
+ (void)move_player_effect(y, x, MPE_DONT_PICKUP);
+ return TRUE;
+}
+
+
+bool shock_power(void)
+{
+ DIRECTION dir;
+ POSITION y, x;
+ HIT_POINT dam;
+ PLAYER_LEVEL plev = p_ptr->lev;
+ int boost = P_PTR_KI;
+ if (heavy_armor()) boost /= 2;
+
+ project_length = 1;
+ if (!get_aim_dir(&dir)) return FALSE;
+
+ y = p_ptr->y + ddy[dir];
+ x = p_ptr->x + ddx[dir];
+ dam = damroll(8 + ((plev - 5) / 4) + boost / 12, 8);
+ fire_beam(GF_MISSILE, dir, dam);
+ if (cave[y][x].m_idx)
+ {
+ int i;
+ int ty = y, tx = x;
+ int oy = y, ox = x;
+ MONSTER_IDX m_idx = cave[y][x].m_idx;
+ monster_type *m_ptr = &m_list[m_idx];
+ monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ char m_name[80];
+
+ monster_desc(m_name, m_ptr, 0);
+
+ if (randint1(r_ptr->level * 3 / 2) > randint0(dam / 2) + dam / 2)
+ {
+ msg_format(_("%sは飛ばされなかった。", "%^s was not blown away."), m_name);
+ }
+ else
+ {
+ for (i = 0; i < 5; i++)
+ {
+ y += ddy[dir];
+ x += ddx[dir];
+ if (cave_empty_bold(y, x))
+ {
+ ty = y;
+ tx = x;
+ }
+ else break;
+ }
+ if ((ty != oy) || (tx != ox))
+ {
+ msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
+ cave[oy][ox].m_idx = 0;
+ cave[ty][tx].m_idx = (s16b)m_idx;
+ m_ptr->fy = (byte_hack)ty;
+ m_ptr->fx = (byte_hack)tx;
+
+ update_mon(m_idx, TRUE);
+ lite_spot(oy, ox);
+ lite_spot(ty, tx);
+
+ if (r_ptr->flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
+ p_ptr->update |= (PU_MON_LITE);
+ }
+ }
+ }
+ return TRUE;
+}
\ No newline at end of file