X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells3.c;h=8e7a21cf08dfd55b48e07e68cad01e977bebd01e;hb=97ab6e743be47c3c082d699ddf862a792fe08e9b;hp=c89602bc55154f760cf5432c393d6a0ac8b89fe1;hpb=e9b92e93f62dcc0ef755a03e1af88ada42c6f878;p=hengband%2Fhengband.git diff --git a/src/spells3.c b/src/spells3.c index c89602bc5..8e7a21cf0 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(IDX m_idx, int y, int x, u32b 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(IDX m_idx, int y, int x, u32b mode) * Attempt to move the monster at least "dis/2" grids away. * But allow variation to prevent infinite loops. */ -bool teleport_away(IDX m_idx, int dis, u32b 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(IDX m_idx, int dis, u32b mode) if (tries > MAX_TRIES) return (FALSE); } - /* Sound */ sound(SOUND_TPOTHER); /* Update the old location */ @@ -178,21 +143,21 @@ bool teleport_away(IDX m_idx, int dis, u32b mode) * @param mode オプション * @return なし */ -void teleport_monster_to(IDX m_idx, POSITION ty, POSITION tx, int power, u32b 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(IDX m_idx, POSITION ty, POSITION tx, int power, u32b mo if (attempts < 1) return; - /* Sound */ sound(SOUND_TPOTHER); /* Update the old location */ @@ -272,56 +236,6 @@ void teleport_monster_to(IDX m_idx, POSITION ty, POSITION tx, int power, u32b mo } /*! - * @brief 指定されたマスにプレイヤーがテレポート可能かどうかを判定する。 - * @param y 移動先Y座標 - * @param x 移動先X座標 - * @param mode オプション - * @return テレポート先として妥当ならばtrue - */ -bool cave_player_teleportable_bold(int y, int x, u32b 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, u32b mode) * */ -bool teleport_player_aux(int dis, u32b 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, u32b mode) if (player_bold(y, x)) return FALSE; - /* Sound */ sound(SOUND_TELEPORT); #ifdef JP @@ -461,13 +374,13 @@ bool teleport_player_aux(int dis, u32b mode) * @param mode オプション * @return なし */ -void teleport_player(int dis, u32b 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; @@ -476,7 +389,7 @@ void teleport_player(int dis, u32b mode) { for (yy = -1; yy < 2; yy++) { - int tmp_m_idx = cave[oy+yy][ox+xx].m_idx; + MONSTER_IDX tmp_m_idx = cave[oy+yy][ox+xx].m_idx; /* A monster except your mount may follow */ if (tmp_m_idx && (p_ptr->riding != tmp_m_idx)) @@ -505,13 +418,13 @@ void teleport_player(int dis, u32b mode) * @param dis テレポート距離 * @return なし */ -void teleport_player_away(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; @@ -556,10 +469,10 @@ void teleport_player_away(IDX m_idx, int dis) * This function allows teleporting into vaults (!) * */ -void teleport_player_to(POSITION ny, POSITION nx, u32b mode) +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, u32b mode) } } - /* Sound */ sound(SOUND_TELEPORT); /* Move the player */ @@ -600,7 +512,7 @@ void teleport_player_to(POSITION ny, POSITION nx, u32b mode) } -void teleport_away_followable(IDX m_idx) +void teleport_away_followable(MONSTER_IDX m_idx) { monster_type *m_ptr = &m_list[m_idx]; int oldfy = m_ptr->fy; @@ -617,7 +529,7 @@ void teleport_away_followable(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; @@ -659,7 +571,7 @@ void teleport_away_followable(IDX m_idx) * @param m_idx テレポートの対象となるモンスターID(0ならばプレイヤー) / If m_idx <= 0, target is player. * @return なし */ -void teleport_level(IDX m_idx) +void teleport_level(MONSTER_IDX m_idx) { bool go_up; char m_name[160]; @@ -827,23 +739,23 @@ void teleport_level(IDX m_idx) delete_monster_idx(m_idx); } - /* Sound */ sound(SOUND_TPLEVEL); } /*! - * @brief これまでに入ったダンジョンの一覧を表示する + * @brief これまでに入ったダンジョンの一覧を表示し、選択させる。 * @param note ダンジョンに施す処理記述 * @param y コンソールY座標 * @param x コンソールX座標 - * @return なし + * @return 選択されたダンジョンID */ -IDX choose_dungeon(cptr note, int y, int x) +DUNGEON_IDX choose_dungeon(cptr note, POSITION y, POSITION x) { - int select_dungeon; - int i, num = 0; - s16b *dun; + DUNGEON_IDX select_dungeon; + DUNGEON_IDX i; + int num = 0; + DUNGEON_IDX *dun; /* Hack -- No need to choose dungeon in some case */ if (lite_town || vanilla_town || ironman_downward) @@ -875,7 +787,7 @@ IDX choose_dungeon(cptr note, int y, int x) else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE; sprintf(buf,_(" %c) %c%-12s : 最大 %d 階", " %c) %c%-16s : Max level %d"), - 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]); + 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]); prt(buf, y + num, x); dun[num++] = i; } @@ -919,7 +831,7 @@ IDX choose_dungeon(cptr note, int y, int x) * @param turns 発動までのターン数 * @return 常にTRUEを返す */ -bool recall_player(int turns) +bool recall_player(TIME_EFFECT turns) { /* * TODO: Recall the player to the last @@ -947,7 +859,7 @@ bool recall_player(int turns) { if (!dun_level) { - int select_dungeon; + DUNGEON_IDX select_dungeon; select_dungeon = choose_dungeon(_("に帰還", "recall"), 2, 14); if (!select_dungeon) return FALSE; p_ptr->recall_dungeon = select_dungeon; @@ -995,7 +907,8 @@ bool reset_recall(void) if (!select_dungeon) return FALSE; /* Prompt */ - sprintf(ppp, _("何階にセットしますか (%d-%d):", "Reset to which level (%d-%d): "), d_info[select_dungeon].mindepth, max_dlv[select_dungeon]); + sprintf(ppp, _("何階にセットしますか (%d-%d):", "Reset to which level (%d-%d): "), + (int)d_info[select_dungeon].mindepth, (int)max_dlv[select_dungeon]); /* Default */ sprintf(tmp_val, "%d", (int)MAX(dun_level, 1)); @@ -1040,7 +953,7 @@ msg_format("%sの帰還レベルを %d 階にセット。", d_name+d_info[select * @return 劣化処理に関するメッセージが発せられた場合はTRUEを返す / * Return "TRUE" if the player notices anything */ -bool apply_disenchant(int mode) +bool apply_disenchant(BIT_FLAGS mode) { int t = 0; object_type *o_ptr; @@ -1060,7 +973,6 @@ bool apply_disenchant(int mode) case 8: t = INVEN_FEET; break; } - /* Get the item */ o_ptr = &inventory[t]; /* No item, nothing happens */ @@ -1078,14 +990,12 @@ bool apply_disenchant(int 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 @@ -1095,7 +1005,6 @@ msg_format("%s(%c)は劣化を跳ね返した!",o_name, index_to_label(t) ); #endif - /* Notice */ return (TRUE); } @@ -1125,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) ); @@ -1141,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); } @@ -1241,7 +1147,7 @@ void apply_nexus(monster_type *m_ptr) */ void phlogiston(void) { - int max_flog = 0; + GAME_TURN max_flog = 0; object_type * o_ptr = &inventory[INVEN_LITE]; /* It's a lamp */ @@ -1270,15 +1176,13 @@ void phlogiston(void) } /* Refuel */ - o_ptr->xtra4 += (max_flog / 2); + 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 = max_flog; + o_ptr->xtra4 = (XTRA16)max_flog; msg_print(_("照明用アイテムは満タンになった。", "Your light item is full.")); } @@ -1295,7 +1199,7 @@ void phlogiston(void) */ void brand_weapon(int brand_type) { - int item; + OBJECT_IDX item; object_type *o_ptr; cptr q, s; @@ -1304,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."); @@ -1346,7 +1249,7 @@ void brand_weapon(int brand_type) act = _("は鋭さを増した!", "becomes very sharp!"); o_ptr->name2 = EGO_SHARPNESS; - o_ptr->pval = m_bonus(5, dun_level) + 1; + o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, dun_level) + 1; if ((o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2)) o_ptr->pval = 2; @@ -1355,7 +1258,7 @@ void brand_weapon(int brand_type) { act = _("は破壊力を増した!", "seems very powerful."); o_ptr->name2 = EGO_EARTHQUAKES; - o_ptr->pval = m_bonus(3, dun_level); + o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, dun_level); } break; case 16: @@ -1453,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) @@ -1573,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 */ @@ -1582,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; @@ -1675,13 +1576,13 @@ void call_the_(void) * @param require_los 射線の通りを要求するならばTRUE * @return なし */ -void fetch(int dir, int wgt, bool require_los) +void fetch(DIRECTION dir, WEIGHT wgt, bool require_los) { - int ty, tx; - DEPTH i; - cave_type *c_ptr; - object_type *o_ptr; - char o_name[MAX_NLEN]; + POSITION ty, tx; + OBJECT_IDX i; + cave_type *c_ptr; + object_type *o_ptr; + char o_name[MAX_NLEN]; /* Check to see if an object is already there */ if (cave[p_ptr->y][p_ptr->x].o_idx) @@ -1763,6 +1664,7 @@ void fetch(int dir, int wgt, bool require_los) i = c_ptr->o_idx; c_ptr->o_idx = o_ptr->next_o_idx; cave[p_ptr->y][p_ptr->x].o_idx = i; /* 'move' it */ + o_ptr->next_o_idx = 0; o_ptr->iy = (byte)p_ptr->y; o_ptr->ix = (byte)p_ptr->x; @@ -1789,7 +1691,7 @@ void alter_reality(void) if (!p_ptr->alter_reality) { - int turns = randint0(21) + 15; + TIME_EFFECT turns = randint0(21) + 15; p_ptr->alter_reality = turns; msg_print(_("回りの景色が変わり始めた...", "The view around you begins to change...")); @@ -1813,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.")); @@ -1824,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 */ @@ -1839,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.")); @@ -1853,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 */ @@ -1872,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.")); @@ -1883,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 */ @@ -1901,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++) @@ -1988,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); } @@ -2028,9 +1927,10 @@ int remove_all_curse(void) */ bool alchemy(void) { - int item, amt = 1; + OBJECT_IDX item; + int amt = 1; ITEM_NUMBER old_number; - long price; + PRICE price; bool force = FALSE; object_type *o_ptr; char o_name[MAX_NLEN]; @@ -2041,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."); @@ -2071,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); @@ -2091,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; } @@ -2102,7 +1998,6 @@ bool alchemy(void) if (price <= 0) { - /* Message */ msg_format(_("%sをニセの金に変えた。", "You turn %s to fool's gold."), o_name); } else @@ -2119,7 +2014,6 @@ bool alchemy(void) /* Redraw gold */ p_ptr->redraw |= (PR_GOLD); - /* Window stuff */ p_ptr->window |= (PW_PLAYER); } @@ -2274,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(); @@ -2295,9 +2188,9 @@ bool enchant(object_type *o_ptr, int n, int eflag) * Note that "num_ac" requires armour, else weapon * Returns TRUE if attempted, FALSE if cancelled */ -bool enchant_spell(int num_hit, int num_dam, int num_ac) +bool enchant_spell(HIT_PROB num_hit, HIT_POINT num_dam, ARMOUR_CLASS num_ac) { - int item; + OBJECT_IDX item; bool okay = FALSE; object_type *o_ptr; char o_name[MAX_NLEN]; @@ -2311,7 +2204,6 @@ bool enchant_spell(int num_hit, int num_dam, int 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."); @@ -2332,11 +2224,8 @@ bool enchant_spell(int num_hit, int num_dam, int num_ac) /* Description */ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - - /* Describe */ #ifdef JP -msg_format("%s は明るく輝いた!", - o_name); + msg_format("%s は明るく輝いた!", o_name); #else msg_format("%s %s glow%s brightly!", ((item >= 0) ? "Your" : "The"), o_name, @@ -2352,12 +2241,8 @@ msg_format("%s は明るく輝いた!", /* Failure */ if (!okay) { - /* Flush */ if (flush_failure) flush(); - - /* Message */ msg_print(_("強化に失敗した。", "The enchantment failed.")); - if (one_in_(3)) chg_virtue(V_ENCHANT, -1); } else @@ -2371,30 +2256,12 @@ 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を返す */ bool artifact_scroll(void) { - int item; + OBJECT_IDX item; bool okay = FALSE; object_type *o_ptr; char o_name[MAX_NLEN]; @@ -2406,7 +2273,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."); @@ -2427,8 +2293,6 @@ bool artifact_scroll(void) /* Description */ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - - /* Describe */ #ifdef JP msg_format("%s は眩い光を発した!",o_name); #else @@ -2501,19 +2365,14 @@ bool artifact_scroll(void) /* Failure */ if (!okay) { - /* Flush */ if (flush_failure) flush(); - - /* Message */ msg_print(_("強化に失敗した。", "The enchantment failed.")); - if (one_in_(3)) chg_virtue(V_ENCHANT, -1); } else { if (record_rand_art) { - /* Description */ object_desc(o_name, o_ptr, OD_NAME_ONLY); do_cmd_write_nikki(NIKKI_ART_SCROLL, 0, o_name); } @@ -2563,7 +2422,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); @@ -2581,28 +2439,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を返す @@ -2613,7 +2449,7 @@ static bool item_tester_hook_identify_weapon_armour(object_type *o_ptr) */ bool ident_spell(bool only_equip) { - int item; + OBJECT_IDX item; object_type *o_ptr; char o_name[MAX_NLEN]; cptr q, s; @@ -2640,7 +2476,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); @@ -2662,8 +2497,6 @@ bool ident_spell(bool only_equip) /* Description */ object_desc(o_name, o_ptr, 0); - - /* Describe */ if (item >= INVEN_RARM) { msg_format(_("%^s: %s(%c)。", "%^s: %s (%c)."), describe_use(item), o_name, index_to_label(item)); @@ -2699,14 +2532,13 @@ bool ident_spell(bool only_equip) */ bool mundane_spell(bool only_equip) { - int item; + OBJECT_IDX item; object_type *o_ptr; cptr q, s; 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."); @@ -2724,7 +2556,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 */ @@ -2751,28 +2582,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を返す @@ -2783,7 +2592,7 @@ static bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr) */ bool identify_fully(bool only_equip) { - int item; + OBJECT_IDX item; object_type *o_ptr; char o_name[MAX_NLEN]; cptr q, s; @@ -2809,7 +2618,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); @@ -2837,8 +2645,6 @@ bool identify_fully(bool only_equip) /* Description */ object_desc(o_name, o_ptr, 0); - - /* Describe */ if (item >= INVEN_RARM) { msg_format(_("%^s: %s(%c)。", "%^s: %s (%c)."), describe_use(item), o_name, index_to_label(item)); @@ -2863,27 +2669,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 魔力充填処理 / @@ -2903,12 +2688,14 @@ 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) { - int item, lev; - int recharge_strength, recharge_amount; + OBJECT_IDX item; + DEPTH lev; + int recharge_strength; + TIME_EFFECT recharge_amount; object_type *o_ptr; object_kind *k_ptr; @@ -2922,7 +2709,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."); @@ -2951,7 +2737,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 */ @@ -2983,12 +2769,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; @@ -3020,7 +2804,7 @@ bool recharge(int power) */ if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1)) { - recharge_amount /= o_ptr->number; + recharge_amount /= (TIME_EFFECT)o_ptr->number; if (recharge_amount < 1) recharge_amount = 1; } @@ -3062,7 +2846,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) @@ -3185,7 +2969,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 */ @@ -3200,9 +2983,9 @@ bool recharge(int power) */ bool bless_weapon(void) { - int item; + 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; @@ -3211,7 +2994,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."); @@ -3276,7 +3058,6 @@ msg_format("%s から邪悪なオーラが消えた。", /* Recalculate the bonuses */ p_ptr->update |= (PU_BONUS); - /* Window stuff */ p_ptr->window |= (PW_EQUIP); } @@ -3304,10 +3085,8 @@ msg_format("%s は既に祝福されている。", if (!(object_is_artifact(o_ptr) || object_is_ego(o_ptr)) || one_in_(3)) { - /* Describe */ #ifdef JP -msg_format("%sは輝いた!", - o_name); + msg_format("%sは輝いた!", o_name); #else msg_format("%s %s shine%s!", ((item >= 0) ? "Your" : "The"), o_name, @@ -3368,7 +3147,6 @@ msg_format("%s は劣化した!", /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); - /* Window stuff */ p_ptr->window |= (PW_EQUIP | PW_PLAYER); calc_android_exp(); @@ -3384,9 +3162,9 @@ msg_format("%s は劣化した!", */ bool pulish_shield(void) { - int item; + 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; @@ -3394,7 +3172,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."); @@ -3478,7 +3255,7 @@ msg_format("%sは輝いた!", o_name); * o_ptr --- pointer to the potion object. * */ -bool potion_smash_effect(int who, POSITION y, POSITION x, int k_idx) +bool potion_smash_effect(MONSTER_IDX who, POSITION y, POSITION x, KIND_OBJECT_IDX k_idx) { int radius = 2; int dt = 0; @@ -3624,17 +3401,17 @@ bool potion_smash_effect(int who, POSITION y, POSITION x, int k_idx) * 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 */ @@ -3644,7 +3421,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(); @@ -3659,7 +3435,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]; @@ -3845,7 +3621,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; @@ -3863,7 +3639,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 @@ -3904,7 +3680,7 @@ int mod_need_mana(int need_mana, int spell, int realm) * @return 失敗率(%) * @todo 統合を検討 */ -int mod_spell_chance_1(int chance) +PERCENTAGE mod_spell_chance_1(PERCENTAGE chance) { chance += p_ptr->to_m_chance; @@ -3929,7 +3705,7 @@ int mod_spell_chance_1(int chance) * Note: variable "chance" cannot be negative. * @todo 統合を検討 */ -int mod_spell_chance_2(int chance) +PERCENTAGE mod_spell_chance_2(PERCENTAGE chance) { if (p_ptr->dec_mana) chance--; @@ -3946,12 +3722,12 @@ int mod_spell_chance_2(int chance) * @param use_realm 魔法領域ID * @return 失敗率(%) */ -s16b spell_chance(int spell, int use_realm) +PERCENTAGE spell_chance(SPELL_IDX spell, REALM_IDX use_realm) { - int chance, minfail; + PERCENTAGE chance, minfail; const magic_type *s_ptr; - int need_mana; - int penalty = (mp_ptr->spell_stat == A_WIS) ? 10 : 4; + MANA_POINT need_mana; + PERCENTAGE penalty = (mp_ptr->spell_stat == A_WIS) ? 10 : 4; /* Paranoia -- must be literate */ @@ -4037,7 +3813,7 @@ s16b spell_chance(int spell, int 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--; } @@ -4105,28 +3881,29 @@ bool spell_okay(int spell, bool learned, bool study_pray, int use_realm) /*! * @brief 呪文情報の表示処理 / * Print a list of spells (for browsing or casting or viewing) - * @param target_spell 呪文ID - * @param spells アクセス開始するスペルの参照ポイント - * @param num 表示する + * @param target_spell 呪文ID + * @param spells 表示するスペルID配列の参照ポインタ + * @param num 表示するスペルの数(spellsの要素数) * @param y 表示メッセージ左上Y座標 * @param x 表示メッセージ左上X座標 * @param use_realm 魔法領域ID * @return なし */ -void print_spells(int target_spell, int *spells, int num, TERM_POSITION y, TERM_POSITION x, int 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")); @@ -4147,10 +3924,8 @@ void print_spells(int target_spell, int *spells, int num, TERM_POSITION y, TERM_ /* 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]; @@ -4164,7 +3939,7 @@ void print_spells(int target_spell, int *spells, int num, TERM_POSITION y, TERM_ 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); @@ -4273,599 +4048,6 @@ void print_spells(int target_spell, int *spells, int num, TERM_POSITION y, TERM_ } -/*! - * @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(int 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(int 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(int 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(int 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 防具の錆止め防止処理 @@ -4873,7 +4055,7 @@ int cold_dam(int dam, cptr kb_str, int monspell, bool aura) */ bool rustproof(void) { - int item; + OBJECT_IDX item; object_type *o_ptr; char o_name[MAX_NLEN]; cptr q, s; @@ -4882,7 +4064,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."); @@ -4909,27 +4090,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; } @@ -4953,8 +4128,6 @@ bool curse_armor(void) /* Nothing to curse */ if (!o_ptr->k_idx) return (FALSE); - - /* Describe */ object_desc(o_name, o_ptr, OD_OMIT_PREFIX); /* Attempt a saving throw for artifacts */ @@ -4974,7 +4147,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); @@ -5003,7 +4175,6 @@ msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返し /* Recalculate mana */ p_ptr->update |= (PU_MANA); - /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); } @@ -5024,8 +4195,6 @@ bool curse_weapon_object(bool force, object_type *o_ptr) /* Nothing to curse */ if (!o_ptr->k_idx) return (FALSE); - - /* Describe */ object_desc(o_name, o_ptr, OD_OMIT_PREFIX); /* Attempt a saving throw */ @@ -5044,7 +4213,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); @@ -5073,11 +4241,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); } @@ -5122,26 +4288,19 @@ bool brand_bolts(void) /* Randomize */ if (randint0(100) < 75) continue; - /* Message */ msg_print(_("クロスボウの矢が炎のオーラに包まれた!", "Your bolts are covered in a fiery aura!")); /* Ego-item */ o_ptr->name2 = EGO_FLAME; - - /* Enchant */ enchant(o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM); - - /* Notice */ return (TRUE); } - /* Flush */ if (flush_failure) flush(); /* Fail */ msg_print(_("炎で強化するのに失敗した。", "The fiery enchantment failed.")); - /* Notice */ return (TRUE); } @@ -5158,7 +4317,8 @@ static IDX poly_r_idx(MONRACE_IDX r_idx) { monster_race *r_ptr = &r_info[r_idx]; - int i, r; + int i; + MONRACE_IDX r; DEPTH lev1, lev2; /* Hack -- Uniques/Questors never polymorph */ @@ -5191,11 +4351,8 @@ static IDX poly_r_idx(MONRACE_IDX r_idx) /* Use that index */ r_idx = r; - /* Done */ break; } - - /* Result */ return (r_idx); } @@ -5206,13 +4363,13 @@ static IDX poly_r_idx(MONRACE_IDX r_idx) * @param x 指定のX座標 * @return 実際に変身したらTRUEを返す */ -bool polymorph_monster(int y, int x) +bool polymorph_monster(POSITION y, POSITION x) { cave_type *c_ptr = &cave[y][x]; monster_type *m_ptr = &m_list[c_ptr->m_idx]; bool polymorphed = FALSE; - int new_r_idx; - int old_r_idx = m_ptr->r_idx; + MONRACE_IDX new_r_idx; + MONRACE_IDX old_r_idx = m_ptr->r_idx; bool targeted = (target_who == c_ptr->m_idx) ? TRUE : FALSE; bool health_tracked = (p_ptr->health_who == c_ptr->m_idx) ? TRUE : FALSE; monster_type back_m; @@ -5230,9 +4387,9 @@ bool polymorph_monster(int y, int x) /* Handle polymorph */ if (new_r_idx != old_r_idx) { - u32b mode = 0L; + 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; @@ -5291,7 +4448,6 @@ bool polymorph_monster(int y, int x) /* Acquire next object */ next_o_idx = o_list[this_o_idx].next_o_idx; - /* Delete the object */ delete_object_idx(this_o_idx); } } @@ -5363,7 +4519,7 @@ bool dimension_door(void) */ bool mirror_tunnel(void) { - int x = 0, y = 0; + POSITION x = 0, y = 0; /* Rerutn FALSE if cancelled */ if (!tgt_pt(&x, &y)) return FALSE; @@ -5382,9 +4538,10 @@ bool mirror_tunnel(void) */ bool eat_magic(int power) { - object_type * o_ptr; + object_type *o_ptr; object_kind *k_ptr; - int lev, item; + DEPTH lev; + OBJECT_IDX item; int recharge_strength = 0; bool fail = FALSE; @@ -5395,7 +4552,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."); @@ -5480,7 +4636,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.")); } } @@ -5517,7 +4672,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) @@ -5661,7 +4816,7 @@ bool eat_magic(int power) * @param mode 召喚オプション * @return ターンを消費した場合TRUEを返す */ -bool summon_kin_player(int level, int y, int x, u32b 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; @@ -5777,10 +4932,10 @@ bool summon_kin_player(int level, int y, int x, u32b 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++) { @@ -5796,3 +4951,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