X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells3.c;h=1359bac1dabdd447a66f9f932f15d50e4ed47b5f;hb=10cec28f48cd2bc3286419f0ac263ad07d40712a;hp=9c7ffe3667df994f408d76620d97f20e284922f0;hpb=dde770ef16ff93c895d1d69a888cd61172a29452;p=hengband%2Fhengband.git diff --git a/src/spells3.c b/src/spells3.c index 9c7ffe366..1359bac1d 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -12,45 +12,11 @@ */ #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 モンスターのテレポートアウェイ処理 / @@ -63,9 +29,9 @@ static bool cave_monster_teleportable_bold(MONSTER_IDX m_idx, int y, int x, BIT_ * 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; @@ -136,7 +102,6 @@ bool teleport_away(MONSTER_IDX m_idx, int dis, BIT_FLAGS mode) if (tries > MAX_TRIES) return (FALSE); } - /* Sound */ sound(SOUND_TPOTHER); /* Update the old location */ @@ -180,19 +145,19 @@ bool teleport_away(MONSTER_IDX m_idx, int dis, BIT_FLAGS mode) */ 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; nx = m_ptr->fx; @@ -245,7 +210,6 @@ void teleport_monster_to(MONSTER_IDX m_idx, POSITION ty, POSITION tx, int power, if (attempts < 1) return; - /* Sound */ sound(SOUND_TPOTHER); /* Update the old location */ @@ -272,56 +236,6 @@ void teleport_monster_to(MONSTER_IDX m_idx, POSITION ty, POSITION tx, int power, } /*! - * @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; -} - - -/*! テレポート最大距離 */ -#define MAX_TELEPORT_DISTANCE 200 - -/*! * @brief プレイヤーのテレポート先選定と移動処理 / * Teleport the player to a location up to "dis" grids away. * @param dis 基本移動距離 @@ -344,7 +258,7 @@ bool cave_player_teleportable_bold(int y, int x, BIT_FLAGS mode) * */ -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; @@ -441,7 +355,6 @@ bool teleport_player_aux(int dis, BIT_FLAGS mode) if (player_bold(y, x)) return FALSE; - /* Sound */ sound(SOUND_TELEPORT); #ifdef JP @@ -461,13 +374,13 @@ bool teleport_player_aux(int dis, BIT_FLAGS mode) * @param mode オプション * @return なし */ -void teleport_player(int dis, BIT_FLAGS mode) +void teleport_player(POSITION dis, BIT_FLAGS mode) { - int yy, xx; + POSITION yy, xx; /* Save the old location */ - int oy = p_ptr->y; - int ox = p_ptr->x; + POSITION oy = p_ptr->y; + POSITION ox = p_ptr->x; if (!teleport_player_aux(dis, mode)) return; @@ -505,13 +418,13 @@ void teleport_player(int dis, BIT_FLAGS mode) * @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; + POSITION yy, xx; /* Save the old location */ - int oy = p_ptr->y; - int ox = p_ptr->x; + POSITION oy = p_ptr->y; + POSITION ox = p_ptr->x; if (!teleport_player_aux(dis, TELEPORT_PASSIVE)) return; @@ -559,7 +472,7 @@ void teleport_player_away(MONSTER_IDX m_idx, int dis) 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)) { @@ -592,7 +505,6 @@ void teleport_player_to(POSITION ny, POSITION nx, BIT_FLAGS mode) } } - /* Sound */ sound(SOUND_TELEPORT); /* Move the player */ @@ -617,7 +529,7 @@ void teleport_away_followable(MONSTER_IDX m_idx) 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; @@ -827,7 +739,6 @@ void teleport_level(MONSTER_IDX m_idx) delete_monster_idx(m_idx); } - /* Sound */ sound(SOUND_TPLEVEL); } @@ -1062,7 +973,6 @@ bool apply_disenchant(BIT_FLAGS mode) case 8: t = INVEN_FEET; break; } - /* Get the item */ o_ptr = &inventory[t]; /* No item, nothing happens */ @@ -1080,14 +990,12 @@ bool apply_disenchant(BIT_FLAGS mode) } - /* Describe the object */ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); /* 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 @@ -1097,7 +1005,6 @@ msg_format("%s(%c)は劣化を跳ね返した!",o_name, index_to_label(t) ); #endif - /* Notice */ return (TRUE); } @@ -1127,7 +1034,6 @@ msg_format("%s(%c)は劣化を跳ね返した!",o_name, index_to_label(t) ); 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) ); @@ -1143,13 +1049,11 @@ 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(); } - /* Notice */ return (TRUE); } @@ -1274,10 +1178,8 @@ void phlogiston(void) /* Refuel */ o_ptr->xtra4 += (XTRA16)(max_flog / 2); - /* Message */ msg_print(_("照明用アイテムに燃素を補充した。", "You add phlogiston to your light item.")); - /* Comment */ if (o_ptr->xtra4 >= max_flog) { o_ptr->xtra4 = (XTRA16)max_flog; @@ -1306,7 +1208,6 @@ void brand_weapon(int brand_type) 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."); @@ -1455,11 +1356,11 @@ void brand_weapon(int brand_type) */ static bool vanish_dungeon(void) { - int y, x; - cave_type *c_ptr; + POSITION y, x; + cave_type *c_ptr; feature_type *f_ptr; monster_type *m_ptr; - char m_name[80]; + char m_name[80]; /* Prevent vasishing of quest levels and town */ if ((p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest)) || !dun_level) @@ -1575,7 +1476,6 @@ static bool vanish_dungeon(void) /* 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 */ @@ -1584,7 +1484,6 @@ static bool vanish_dungeon(void) /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); return TRUE; @@ -1816,7 +1715,6 @@ void alter_reality(void) */ bool warding_glyph(void) { - /* XXX XXX XXX */ if (!cave_clean_bold(p_ptr->y, p_ptr->x)) { msg_print(_("床上のアイテムが呪文を跳ね返した。", "The object resists the spell.")); @@ -1827,7 +1725,6 @@ bool warding_glyph(void) cave[p_ptr->y][p_ptr->x].info |= CAVE_OBJECT; cave[p_ptr->y][p_ptr->x].mimic = feat_glyph; - /* Notice */ note_spot(p_ptr->y, p_ptr->x); /* Redraw */ @@ -1842,7 +1739,6 @@ bool warding_glyph(void) */ bool place_mirror(void) { - /* XXX XXX XXX */ if (!cave_clean_bold(p_ptr->y, p_ptr->x)) { msg_print(_("床上のアイテムが呪文を跳ね返した。", "The object resists the spell.")); @@ -1856,7 +1752,6 @@ bool place_mirror(void) /* Turn on the light */ cave[p_ptr->y][p_ptr->x].info |= CAVE_GLOW; - /* Notice */ note_spot(p_ptr->y, p_ptr->x); /* Redraw */ @@ -1875,7 +1770,6 @@ bool place_mirror(void) */ bool explosive_rune(void) { - /* XXX XXX XXX */ if (!cave_clean_bold(p_ptr->y, p_ptr->x)) { msg_print(_("床上のアイテムが呪文を跳ね返した。", "The object resists the spell.")); @@ -1886,7 +1780,6 @@ bool explosive_rune(void) cave[p_ptr->y][p_ptr->x].info |= CAVE_OBJECT; cave[p_ptr->y][p_ptr->x].mimic = feat_explosive_rune; - /* Notice */ note_spot(p_ptr->y, p_ptr->x); /* Redraw */ @@ -1904,7 +1797,7 @@ bool explosive_rune(void) */ void identify_pack(void) { - int i; + INVENTORY_IDX i; /* Simply identify and know every item */ for (i = 0; i < INVEN_TOTAL; i++) @@ -1991,13 +1884,16 @@ static int remove_curse_aux(int all) /* 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); } @@ -2045,7 +1941,6 @@ bool alchemy(void) /* 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."); @@ -2075,7 +1970,6 @@ bool alchemy(void) } - /* Describe the object */ old_number = o_ptr->number; o_ptr->number = amt; object_desc(o_name, o_ptr, 0); @@ -2095,10 +1989,8 @@ bool alchemy(void) /* 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; } @@ -2106,7 +1998,6 @@ bool alchemy(void) if (price <= 0) { - /* Message */ msg_format(_("%sをニセの金に変えた。", "You turn %s to fool's gold."), o_name); } else @@ -2123,7 +2014,6 @@ bool alchemy(void) /* Redraw gold */ p_ptr->redraw |= (PR_GOLD); - /* Window stuff */ p_ptr->window |= (PW_PLAYER); } @@ -2278,7 +2168,6 @@ bool enchant(object_type *o_ptr, int n, int eflag) /* 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(); @@ -2315,7 +2204,6 @@ bool enchant_spell(HIT_PROB num_hit, HIT_POINT num_dam, ARMOUR_CLASS num_ac) /* 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."); @@ -2359,7 +2247,6 @@ msg_format("%s は明るく輝いた!", /* Flush */ if (flush_failure) flush(); - /* Message */ msg_print(_("強化に失敗した。", "The enchantment failed.")); if (one_in_(3)) chg_virtue(V_ENCHANT, -1); @@ -2375,24 +2262,6 @@ msg_format("%s は明るく輝いた!", /*! - * @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を返す */ @@ -2410,7 +2279,6 @@ bool artifact_scroll(void) /* 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."); @@ -2508,7 +2376,6 @@ bool artifact_scroll(void) /* Flush */ if (flush_failure) flush(); - /* Message */ msg_print(_("強化に失敗した。", "The enchantment failed.")); if (one_in_(3)) chg_virtue(V_ENCHANT, -1); @@ -2567,7 +2434,6 @@ bool identify_item(object_type *o_ptr) /* 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); @@ -2585,28 +2451,6 @@ bool identify_item(object_type *o_ptr) } /*! - * @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を返す @@ -2644,7 +2488,6 @@ bool ident_spell(bool only_equip) 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); @@ -2710,7 +2553,6 @@ bool mundane_spell(bool only_equip) 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."); @@ -2728,7 +2570,6 @@ bool mundane_spell(bool only_equip) 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 */ @@ -2755,28 +2596,6 @@ bool mundane_spell(bool only_equip) } /*! - * @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を返す @@ -2813,7 +2632,6 @@ bool identify_fully(bool only_equip) 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); @@ -2867,27 +2685,6 @@ bool identify_fully(bool only_equip) } -/*! - * @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 魔力充填処理 / @@ -2907,12 +2704,12 @@ bool item_tester_hook_recharge(object_type *o_ptr) * 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; @@ -2928,7 +2725,6 @@ bool recharge(int power) /* Only accept legal items */ item_tester_hook = item_tester_hook_recharge; - /* Get an item */ q = _("どのアイテムに魔力を充填しますか? ", "Recharge which item? "); s = _("魔力を充填すべきアイテムがない。", "You have nothing to recharge."); @@ -2957,7 +2753,7 @@ bool recharge(int power) 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 */ @@ -2989,12 +2785,10 @@ bool recharge(int power) * 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; @@ -3068,7 +2862,7 @@ bool recharge(int power) /*** 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) @@ -3191,7 +2985,6 @@ bool recharge(int power) /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); - /* Window stuff */ p_ptr->window |= (PW_INVEN); /* Something was done */ @@ -3217,7 +3010,6 @@ bool bless_weapon(void) /* Bless only weapons */ item_tester_hook = object_is_weapon; - /* Get an item */ q = _("どのアイテムを祝福しますか?", "Bless which weapon? "); s = _("祝福できる武器がありません。", "You have weapon to bless."); @@ -3282,7 +3074,6 @@ msg_format("%s から邪悪なオーラが消えた。", /* Recalculate the bonuses */ p_ptr->update |= (PU_BONUS); - /* Window stuff */ p_ptr->window |= (PW_EQUIP); } @@ -3374,7 +3165,6 @@ msg_format("%s は劣化した!", /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); - /* Window stuff */ p_ptr->window |= (PW_EQUIP | PW_PLAYER); calc_android_exp(); @@ -3392,7 +3182,7 @@ bool pulish_shield(void) { 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; @@ -3400,7 +3190,6 @@ bool pulish_shield(void) /* Assume enchant weapon */ item_tester_tval = TV_SHIELD; - /* Get an item */ q = _("どの盾を磨きますか?", "Pulish which weapon? "); s = _("磨く盾がありません。", "You have weapon to pulish."); @@ -3630,17 +3419,17 @@ bool potion_smash_effect(MONSTER_IDX who, POSITION y, POSITION x, KIND_OBJECT_ID * 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) { - int i, j; - int y, x; - int m[9]; + int i, j; + TERM_LEN y, x; + int m[9]; const magic_type *s_ptr; - char name[80]; - char out_val[160]; + char name[80]; + char out_val[160]; /* Erase window */ @@ -3650,7 +3439,6 @@ void display_spell_list(void) if (p_ptr->pclass == CLASS_SORCERER) return; if (p_ptr->pclass == CLASS_RED_MAGE) return; - /* Snipers */ if (p_ptr->pclass == CLASS_SNIPER) { display_snipe_list(); @@ -3665,7 +3453,7 @@ 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]; @@ -3851,7 +3639,7 @@ void display_spell_list(void) * @param use_realm 魔法領域 * @return 経験値 */ -s16b experience_of_spell(int spell, int use_realm) +EXP experience_of_spell(SPELL_IDX spell, REALM_IDX use_realm) { if (p_ptr->pclass == CLASS_SORCERER) return SPELL_EXP_MASTER; else if (p_ptr->pclass == CLASS_RED_MAGE) return SPELL_EXP_SKILLED; @@ -3869,7 +3657,7 @@ s16b experience_of_spell(int spell, int use_realm) * @param realm 魔法領域 * @return 消費MP */ -int mod_need_mana(int need_mana, int spell, int realm) +MANA_POINT mod_need_mana(MANA_POINT need_mana, SPELL_IDX spell, REALM_IDX realm) { #define MANA_CONST 2400 #define MANA_DIV 4 @@ -4043,7 +3831,7 @@ PERCENTAGE spell_chance(SPELL_IDX spell, REALM_IDX use_realm) if ((use_realm == p_ptr->realm1) || (use_realm == p_ptr->realm2) || (p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE)) { - s16b exp = experience_of_spell(spell, use_realm); + EXP exp = experience_of_spell(spell, use_realm); if (exp >= SPELL_EXP_EXPERT) chance--; if (exp >= SPELL_EXP_MASTER) chance--; } @@ -4119,20 +3907,21 @@ bool spell_okay(int spell, bool learned, bool study_pray, int use_realm) * @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; + int i; + SPELL_IDX spell; + int exp_level, increment = 64; const magic_type *s_ptr; - cptr comment; - char info[80]; - char out_val[160]; - byte line_attr; - int need_mana; - char ryakuji[5]; - char buf[256]; + cptr comment; + char info[80]; + char out_val[160]; + byte line_attr; + MANA_POINT need_mana; + char ryakuji[5]; + char buf[256]; bool max = FALSE; - if (((use_realm <= REALM_NONE) || (use_realm > MAX_REALM)) && p_ptr->wizard) msg_print(_("警告! print_spell が領域なしに呼ばれた", "Warning! print_spells called with null realm")); @@ -4153,10 +3942,8 @@ void print_spells(SPELL_IDX target_spell, SPELL_IDX *spells, int num, TERM_POSIT /* Dump the spells */ for (i = 0; i < num; i++) { - /* Access the spell */ spell = spells[i]; - /* Access the spell */ if (!is_magic(use_realm)) { s_ptr = &technic_info[use_realm - MIN_TECHNIC][spell]; @@ -4170,7 +3957,7 @@ void print_spells(SPELL_IDX target_spell, SPELL_IDX *spells, int num, TERM_POSIT need_mana = s_ptr->smana; else { - s16b exp = experience_of_spell(spell, use_realm); + EXP exp = experience_of_spell(spell, use_realm); /* Extract mana consumption rate */ need_mana = mod_need_mana(s_ptr->smana, spell, use_realm); @@ -4279,599 +4066,6 @@ void print_spells(SPELL_IDX target_spell, SPELL_IDX *spells, int num, TERM_POSIT } -/*! - * @brief アイテムが酸で破損するかどうかを判定する - * @param o_ptr アイテムの情報参照ポインタ - * @return 破損するならばTRUEを返す - * Note that amulets, rods, and high-level spell books are immune - * to "inventory damage" of any kind. Also sling ammo and shovels. - * Does a given class of objects (usually) hate acid? - * Note that acid can either melt or corrode something. - */ -bool hates_acid(object_type *o_ptr) -{ - /* Analyze the type */ - switch (o_ptr->tval) - { - /* Wearable items */ - case TV_ARROW: - case TV_BOLT: - case TV_BOW: - case TV_SWORD: - case TV_HAFTED: - case TV_POLEARM: - case TV_HELM: - case TV_CROWN: - case TV_SHIELD: - case TV_BOOTS: - case TV_GLOVES: - case TV_CLOAK: - case TV_SOFT_ARMOR: - case TV_HARD_ARMOR: - case TV_DRAG_ARMOR: - { - return (TRUE); - } - - /* Staffs/Scrolls are wood/paper */ - case TV_STAFF: - case TV_SCROLL: - { - return (TRUE); - } - - /* Ouch */ - case TV_CHEST: - { - return (TRUE); - } - - /* Junk is useless */ - case TV_SKELETON: - case TV_BOTTLE: - case TV_JUNK: - { - return (TRUE); - } - } - - return (FALSE); -} - - -/*! - * @brief アイテムが電撃で破損するかどうかを判定する / - * Does a given object (usually) hate electricity? - * @param o_ptr アイテムの情報参照ポインタ - * @return 破損するならばTRUEを返す - */ -bool hates_elec(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_RING: - case TV_WAND: - { - return (TRUE); - } - } - - return (FALSE); -} - - -/*! - * @brief アイテムが火炎で破損するかどうかを判定する / - * Does a given object (usually) hate fire? - * @param o_ptr アイテムの情報参照ポインタ - * @return 破損するならばTRUEを返す - * @details - * Hafted/Polearm weapons have wooden shafts. - * Arrows/Bows are mostly wooden. - */ -bool hates_fire(object_type *o_ptr) -{ - /* Analyze the type */ - switch (o_ptr->tval) - { - /* Wearable */ - case TV_LITE: - case TV_ARROW: - case TV_BOW: - case TV_HAFTED: - case TV_POLEARM: - case TV_BOOTS: - case TV_GLOVES: - case TV_CLOAK: - case TV_SOFT_ARMOR: - { - return (TRUE); - } - - /* Books */ - case TV_LIFE_BOOK: - case TV_SORCERY_BOOK: - case TV_NATURE_BOOK: - case TV_CHAOS_BOOK: - case TV_DEATH_BOOK: - case TV_TRUMP_BOOK: - case TV_ARCANE_BOOK: - case TV_CRAFT_BOOK: - case TV_DAEMON_BOOK: - case TV_CRUSADE_BOOK: - case TV_MUSIC_BOOK: - case TV_HISSATSU_BOOK: - case TV_HEX_BOOK: - { - return (TRUE); - } - - /* Chests */ - case TV_CHEST: - { - return (TRUE); - } - - /* Staffs/Scrolls burn */ - case TV_STAFF: - case TV_SCROLL: - { - return (TRUE); - } - } - - return (FALSE); -} - - -/*! - * @brief アイテムが冷気で破損するかどうかを判定する / - * Does a given object (usually) hate cold? - * @param o_ptr アイテムの情報参照ポインタ - * @return 破損するならばTRUEを返す - */ -bool hates_cold(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_POTION: - case TV_FLASK: - case TV_BOTTLE: - { - return (TRUE); - } - } - - return (FALSE); -} - - -/*! - * @brief アイテムが酸で破損するかどうかを判定する(メインルーチン) / - * Melt something - * @param o_ptr アイテムの情報参照ポインタ - * @return 破損するならばTRUEを返す - * @todo 統合を検討 - */ -int set_acid_destroy(object_type *o_ptr) -{ - u32b 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); - return (TRUE); -} - - -/*! - * @brief アイテムが電撃で破損するかどうかを判定する(メインルーチン) / - * Electrical damage - * @param o_ptr アイテムの情報参照ポインタ - * @return 破損するならばTRUEを返す - * @todo 統合を検討 - */ -int set_elec_destroy(object_type *o_ptr) -{ - u32b 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); - return (TRUE); -} - - -/*! - * @brief アイテムが火炎で破損するかどうかを判定する(メインルーチン) / - * Burn something - * @param o_ptr アイテムの情報参照ポインタ - * @return 破損するならばTRUEを返す - * @todo 統合を検討 - */ -int set_fire_destroy(object_type *o_ptr) -{ - u32b 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); - return (TRUE); -} - - -/*! - * @brief アイテムが冷気で破損するかどうかを判定する(メインルーチン) / - * Freeze things - * @param o_ptr アイテムの情報参照ポインタ - * @return 破損するならばTRUEを返す - * @todo 統合を検討 - */ -int set_cold_destroy(object_type *o_ptr) -{ - u32b 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); - return (TRUE); -} - - -/*! - * @brief アイテムが指定確率で破損するかどうかを判定する / - * Destroys a type of item on a given percent chance - * @param typ 破損判定関数ポインタ - * @param perc 基本確率 - * @return 破損したアイテムの数 - * @details - * Note that missiles are no longer necessarily all destroyed - * Destruction taken from "melee.c" code for "stealing". - * New-style wands and rods handled correctly. -LM- - * Returns number of items destroyed. - */ -int inven_damage(inven_func typ, int perc) -{ - int i, j, k, amt; - object_type *o_ptr; - char o_name[MAX_NLEN]; - - if (CHECK_MULTISHADOW()) return 0; - - if (p_ptr->inside_arena) return 0; - - /* Count the casualties */ - k = 0; - - /* Scan through the slots backwards */ - for (i = 0; i < INVEN_PACK; i++) - { - o_ptr = &inventory[i]; - - /* Skip non-objects */ - if (!o_ptr->k_idx) continue; - - /* Hack -- for now, skip artifacts */ - if (object_is_artifact(o_ptr)) continue; - - /* Give this item slot a shot at death */ - if ((*typ)(o_ptr)) - { - /* Count the casualties */ - for (amt = j = 0; j < o_ptr->number; ++j) - { - if (randint0(100) < perc) amt++; - } - - /* Some casualities */ - if (amt) - { - /* 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 -o_name, index_to_label(i), - ((o_ptr->number > 1) ? - ((amt == o_ptr->number) ? "全部" : - (amt > 1 ? "何個か" : "一個")) : "") ); -#else - ((o_ptr->number > 1) ? - ((amt == o_ptr->number) ? "All of y" : - (amt > 1 ? "Some of y" : "One of y")) : "Y"), - o_name, index_to_label(i), - ((amt > 1) ? "were" : "was")); -#endif - -#ifdef JP - if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)) - msg_print("やりやがったな!"); -#endif - - /* Potions smash open */ - if (object_is_potion(o_ptr)) - { - (void)potion_smash_effect(0, p_ptr->y, p_ptr->x, o_ptr->k_idx); - } - - /* Reduce the charges of rods/wands */ - reduce_charges(o_ptr, amt); - - /* Destroy "amt" items */ - inven_item_increase(i, -amt); - inven_item_optimize(i); - - /* Count the casualties */ - k += amt; - } - } - } - - /* Return the casualty count */ - return (k); -} - - -/*! - * @brief 酸攻撃による装備のAC劣化処理 / - * Acid has hit the player, attempt to affect some armor. - * @return ACが実際に劣化したらTRUEを返す - * @details - * Note that the "base armor" of an object never changes. - * If any armor is damaged (or resists), the player takes less damage. - */ -static int minus_ac(void) -{ - object_type *o_ptr = NULL; - u32b flgs[TR_FLAG_SIZE]; - char o_name[MAX_NLEN]; - - - /* Pick a (possibly empty) inventory slot */ - switch (randint1(7)) - { - case 1: o_ptr = &inventory[INVEN_RARM]; break; - case 2: o_ptr = &inventory[INVEN_LARM]; break; - case 3: o_ptr = &inventory[INVEN_BODY]; break; - case 4: o_ptr = &inventory[INVEN_OUTER]; break; - case 5: o_ptr = &inventory[INVEN_HANDS]; break; - case 6: o_ptr = &inventory[INVEN_HEAD]; break; - case 7: o_ptr = &inventory[INVEN_FEET]; break; - } - - /* Nothing to damage */ - if (!o_ptr->k_idx) return (FALSE); - - if (!object_is_armour(o_ptr)) return (FALSE); - - /* No damage left to be done */ - if (o_ptr->ac + o_ptr->to_a <= 0) return (FALSE); - - - /* Describe */ - object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - - /* Extract the flags */ - object_flags(o_ptr, flgs); - - /* Object resists */ - if (have_flag(flgs, TR_IGNORE_ACID)) - { - msg_format(_("しかし%sには効果がなかった!", "Your %s is unaffected!"), o_name); - return (TRUE); - } - - /* Message */ - msg_format(_("%sがダメージを受けた!", "Your %s is damaged!"), o_name); - - /* Damage the item */ - o_ptr->to_a--; - - /* Calculate bonuses */ - p_ptr->update |= (PU_BONUS); - - /* Window stuff */ - p_ptr->window |= (PW_EQUIP | PW_PLAYER); - - calc_android_exp(); - - /* Item was damaged */ - return (TRUE); -} - - -/*! - * @brief 酸属性によるプレイヤー損害処理 / - * Hurt the player with Acid - * @param dam 基本ダメージ量 - * @param kb_str ダメージ原因記述 - * @param monspell 原因となったモンスター特殊攻撃ID - * @param aura オーラよるダメージが原因ならばTRUE - * @return 修正HPダメージ量 - */ -int acid_dam(HIT_POINT dam, cptr kb_str, int monspell, bool aura) -{ - int get_damage; - int inv = (dam < 30) ? 1 : (dam < 60) ? 2 : 3; - bool double_resist = IS_OPPOSE_ACID(); - - /* Total Immunity */ - if (p_ptr->immune_acid || (dam <= 0)) - { - learn_spell(monspell); - return 0; - } - - /* Vulnerability (Ouch!) */ - if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - - /* Resist the damage */ - if (p_ptr->resist_acid) dam = (dam + 2) / 3; - if (double_resist) dam = (dam + 2) / 3; - - if (aura || !CHECK_MULTISHADOW()) - { - if ((!(double_resist || p_ptr->resist_acid)) && - one_in_(HURT_CHANCE)) - (void)do_dec_stat(A_CHR); - - /* If any armor gets hit, defend the player */ - if (minus_ac()) dam = (dam + 1) / 2; - } - - /* Take damage */ - get_damage = take_hit(aura ? DAMAGE_NOESCAPE : DAMAGE_ATTACK, dam, kb_str, monspell); - - /* Inventory damage */ - if (!aura && !(double_resist && p_ptr->resist_acid)) - inven_damage(set_acid_destroy, inv); - return get_damage; -} - - -/*! - * @brief 電撃属性によるプレイヤー損害処理 / - * Hurt the player with electricity - * @param dam 基本ダメージ量 - * @param kb_str ダメージ原因記述 - * @param monspell 原因となったモンスター特殊攻撃ID - * @param aura オーラよるダメージが原因ならばTRUE - * @return 修正HPダメージ量 - */ -int elec_dam(HIT_POINT dam, cptr kb_str, int monspell, bool aura) -{ - int get_damage; - int inv = (dam < 30) ? 1 : (dam < 60) ? 2 : 3; - bool double_resist = IS_OPPOSE_ELEC(); - - /* Total immunity */ - if (p_ptr->immune_elec || (dam <= 0)) - { - learn_spell(monspell); - return 0; - } - - /* Vulnerability (Ouch!) */ - if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (prace_is_(RACE_ANDROID)) dam += dam / 3; - - /* Resist the damage */ - if (p_ptr->resist_elec) dam = (dam + 2) / 3; - if (double_resist) dam = (dam + 2) / 3; - - if (aura || !CHECK_MULTISHADOW()) - { - if ((!(double_resist || p_ptr->resist_elec)) && - one_in_(HURT_CHANCE)) - (void)do_dec_stat(A_DEX); - } - - /* Take damage */ - get_damage = take_hit(aura ? DAMAGE_NOESCAPE : DAMAGE_ATTACK, dam, kb_str, monspell); - - /* Inventory damage */ - if (!aura && !(double_resist && p_ptr->resist_elec)) - inven_damage(set_elec_destroy, inv); - - return get_damage; -} - - -/*! - * @brief 火炎属性によるプレイヤー損害処理 / - * Hurt the player with Fire - * @param dam 基本ダメージ量 - * @param kb_str ダメージ原因記述 - * @param monspell 原因となったモンスター特殊攻撃ID - * @param aura オーラよるダメージが原因ならばTRUE - * @return 修正HPダメージ量 - */ -int fire_dam(HIT_POINT dam, cptr kb_str, int monspell, bool aura) -{ - int get_damage; - int inv = (dam < 30) ? 1 : (dam < 60) ? 2 : 3; - bool double_resist = IS_OPPOSE_FIRE(); - - /* Totally immune */ - if (p_ptr->immune_fire || (dam <= 0)) - { - learn_spell(monspell); - return 0; - } - - /* Vulnerability (Ouch!) */ - if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (prace_is_(RACE_ENT)) dam += dam / 3; - if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - - /* Resist the damage */ - if (p_ptr->resist_fire) dam = (dam + 2) / 3; - if (double_resist) dam = (dam + 2) / 3; - - if (aura || !CHECK_MULTISHADOW()) - { - if ((!(double_resist || p_ptr->resist_fire)) && - one_in_(HURT_CHANCE)) - (void)do_dec_stat(A_STR); - } - - /* Take damage */ - get_damage = take_hit(aura ? DAMAGE_NOESCAPE : DAMAGE_ATTACK, dam, kb_str, monspell); - - /* Inventory damage */ - if (!aura && !(double_resist && p_ptr->resist_fire)) - inven_damage(set_fire_destroy, inv); - - return get_damage; -} - - -/*! - * @brief 冷気属性によるプレイヤー損害処理 / - * Hurt the player with Cold - * @param dam 基本ダメージ量 - * @param kb_str ダメージ原因記述 - * @param monspell 原因となったモンスター特殊攻撃ID - * @param aura オーラよるダメージが原因ならばTRUE - * @return 修正HPダメージ量 - */ -int cold_dam(HIT_POINT dam, cptr kb_str, int monspell, bool aura) -{ - int get_damage; - int inv = (dam < 30) ? 1 : (dam < 60) ? 2 : 3; - bool double_resist = IS_OPPOSE_COLD(); - - /* Total immunity */ - if (p_ptr->immune_cold || (dam <= 0)) - { - learn_spell(monspell); - return 0; - } - - /* Vulnerability (Ouch!) */ - if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - - /* Resist the damage */ - if (p_ptr->resist_cold) dam = (dam + 2) / 3; - if (double_resist) dam = (dam + 2) / 3; - - if (aura || !CHECK_MULTISHADOW()) - { - if ((!(double_resist || p_ptr->resist_cold)) && - one_in_(HURT_CHANCE)) - (void)do_dec_stat(A_STR); - } - - /* Take damage */ - get_damage = take_hit(aura ? DAMAGE_NOESCAPE : DAMAGE_ATTACK, dam, kb_str, monspell); - - /* Inventory damage */ - if (!aura && !(double_resist && p_ptr->resist_cold)) - inven_damage(set_cold_destroy, inv); - - return get_damage; -} /*! * @brief 防具の錆止め防止処理 @@ -4888,7 +4082,6 @@ bool rustproof(void) /* 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."); @@ -4915,27 +4108,21 @@ bool rustproof(void) if ((o_ptr->to_a < 0) && !object_is_cursed(o_ptr)) { #ifdef JP -msg_format("%sは新品同様になった!",o_name); + msg_format("%sは新品同様になった!",o_name); #else - msg_format("%s %s look%s as good as new!", - ((item >= 0) ? "Your" : "The"), o_name, - ((o_ptr->number > 1) ? "" : "s")); + msg_format("%s %s look%s as good as new!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); #endif o_ptr->to_a = 0; } #ifdef JP -msg_format("%sは腐食しなくなった。", o_name); + msg_format("%sは腐食しなくなった。", o_name); #else - msg_format("%s %s %s now protected against corrosion.", - ((item >= 0) ? "Your" : "The"), o_name, - ((o_ptr->number > 1) ? "are" : "is")); + msg_format("%s %s %s now protected against corrosion.", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "are" : "is")); #endif - calc_android_exp(); - return TRUE; } @@ -4980,7 +4167,6 @@ msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返し /* not artifact or failed save... */ else { - /* Oops */ msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name); chg_virtue(V_ENCHANT, -5); @@ -5009,7 +4195,6 @@ msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返し /* Recalculate mana */ p_ptr->update |= (PU_MANA); - /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); } @@ -5050,7 +4235,6 @@ bool curse_weapon_object(bool force, object_type *o_ptr) /* 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); @@ -5079,11 +4263,9 @@ bool curse_weapon_object(bool force, object_type *o_ptr) /* Recalculate mana */ p_ptr->update |= (PU_MANA); - /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); } - /* Notice */ return (TRUE); } @@ -5128,7 +4310,6 @@ bool brand_bolts(void) /* Randomize */ if (randint0(100) < 75) continue; - /* Message */ msg_print(_("クロスボウの矢が炎のオーラに包まれた!", "Your bolts are covered in a fiery aura!")); /* Ego-item */ @@ -5137,7 +4318,6 @@ bool brand_bolts(void) /* Enchant */ enchant(o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM); - /* Notice */ return (TRUE); } @@ -5147,7 +4327,6 @@ bool brand_bolts(void) /* Fail */ msg_print(_("炎で強化するのに失敗した。", "The fiery enchantment failed.")); - /* Notice */ return (TRUE); } @@ -5198,11 +4377,8 @@ static IDX poly_r_idx(MONRACE_IDX r_idx) /* Use that index */ r_idx = r; - /* Done */ break; } - - /* Result */ return (r_idx); } @@ -5239,7 +4415,7 @@ bool polymorph_monster(POSITION y, POSITION x) { 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; @@ -5298,7 +4474,6 @@ bool polymorph_monster(POSITION y, POSITION x) /* Acquire next object */ next_o_idx = o_list[this_o_idx].next_o_idx; - /* Delete the object */ delete_object_idx(this_o_idx); } } @@ -5389,9 +4564,9 @@ bool mirror_tunnel(void) */ 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; @@ -5403,7 +4578,6 @@ bool eat_magic(int power) item_tester_hook = item_tester_hook_recharge; - /* Get an item */ q = _("どのアイテムから魔力を吸収しますか?", "Drain which item? "); s = _("魔力を吸収できるアイテムがありません。", "You have nothing to drain."); @@ -5488,7 +4662,6 @@ bool eat_magic(int power) p_ptr->total_weight -= q_ptr->weight; item = inven_carry(q_ptr); - /* Message */ msg_print(_("杖をまとめなおした。", "You unstack your staff.")); } } @@ -5525,7 +4698,7 @@ bool eat_magic(int power) /*** 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) @@ -5669,7 +4842,7 @@ bool eat_magic(int power) * @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; @@ -5785,10 +4958,10 @@ bool summon_kin_player(int level, int y, int x, BIT_FLAGS mode) */ 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++) { @@ -5804,3 +4977,130 @@ void massacre(void) 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_direction(&dir, FALSE, FALSE)) 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