X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells3.c;h=68264b9698278114c59c1926cbf205b3fbbbc334;hb=56d92cdb7bca9a842b46ae7b0a7ba3264d50db97;hp=d5ed04c776ea86060e94b140e2b9cbdea32e590a;hpb=4b1386ecde375208c9f58eb8b0dbb714a6f1c872;p=hengband%2Fhengband.git diff --git a/src/spells3.c b/src/spells3.c index d5ed04c77..68264b969 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -19,6 +19,31 @@ #define HURT_CHANCE 16 +static bool cave_monster_teleportable_bold(int 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; +} + + /* * Teleport a monster, normally up to "dis" grids away. * @@ -26,7 +51,7 @@ * * But allow variation to prevent infinite loops. */ -bool teleport_away(int m_idx, int dis, bool dec_valour) +bool teleport_away(int m_idx, int dis, u32b mode) { int oy, ox, d, i, min; int tries = 0; @@ -36,7 +61,6 @@ bool teleport_away(int m_idx, int dis, bool dec_valour) monster_type *m_ptr = &m_list[m_idx]; - /* Paranoia */ if (!m_ptr->r_idx) return (FALSE); @@ -47,10 +71,10 @@ bool teleport_away(int m_idx, int dis, bool dec_valour) /* Minimum distance */ min = dis / 2; - if (dec_valour && + if ((mode & TELEPORT_DEC_VALOUR) && (((p_ptr->chp * 10) / p_ptr->mhp) > 5) && (4+randint1(5) < ((p_ptr->chp * 10) / p_ptr->mhp))) - { + { chg_virtue(V_VALOUR, -1); } @@ -77,15 +101,7 @@ bool teleport_away(int m_idx, int dis, bool dec_valour) /* Ignore illegal locations */ if (!in_bounds(ny, nx)) continue; - /* Require "empty" floor space */ - if (!cave_empty_bold(ny, nx)) continue; - - /* Hack -- no teleport onto glyph of warding */ - if (is_glyph_grid(&cave[ny][nx])) continue; - if (is_explosive_rune_grid(&cave[ny][nx])) continue; - - /* ...nor onto the Pattern */ - if (pattern_tile(ny, nx)) continue; + if (!cave_monster_teleportable_bold(m_idx, ny, nx, mode)) continue; /* No teleporting into vaults and such */ if (!(p_ptr->inside_quest || p_ptr->inside_arena)) @@ -111,12 +127,12 @@ bool teleport_away(int m_idx, int dis, bool dec_valour) /* Sound */ sound(SOUND_TPOTHER); - /* Update the new location */ - cave[ny][nx].m_idx = m_idx; - /* Update the old location */ cave[oy][ox].m_idx = 0; + /* Update the new location */ + cave[ny][nx].m_idx = m_idx; + /* Move the monster */ m_ptr->fy = ny; m_ptr->fx = nx; @@ -144,7 +160,7 @@ bool teleport_away(int m_idx, int dis, bool dec_valour) /* * Teleport monster next to a grid near the given location */ -void teleport_monster_to(int m_idx, int ty, int tx, int power) +void teleport_monster_to(int m_idx, int ty, int tx, int power, u32b mode) { int ny, nx, oy, ox, d, i, min; int attempts = 500; @@ -152,7 +168,6 @@ void teleport_monster_to(int m_idx, int ty, int tx, int power) bool look = TRUE; monster_type *m_ptr = &m_list[m_idx]; - /* Paranoia */ if (!m_ptr->r_idx) return; @@ -179,8 +194,6 @@ void teleport_monster_to(int m_idx, int ty, int tx, int power) /* Try several locations */ for (i = 0; i < 500; i++) { - cave_type *c_ptr; - /* Pick a (possibly illegal) location */ while (1) { @@ -193,20 +206,10 @@ void teleport_monster_to(int m_idx, int ty, int tx, int power) /* Ignore illegal locations */ if (!in_bounds(ny, nx)) continue; - /* Require "empty" floor space */ - if (!cave_empty_bold(ny, nx)) continue; - - c_ptr = &cave[ny][nx]; - - /* Hack -- no teleport onto glyph of warding */ - if (is_glyph_grid(c_ptr)) continue; - if (is_explosive_rune_grid(c_ptr)) continue; - - /* ...nor onto the Pattern */ - if (pattern_tile(ny, nx)) continue; + if (!cave_monster_teleportable_bold(m_idx, ny, nx, mode)) continue; /* No teleporting into vaults and such */ - /* if (c_ptr->info & (CAVE_ICKY)) continue; */ + /* if (cave[ny][nx].info & (CAVE_ICKY)) continue; */ /* This grid looks good */ look = FALSE; @@ -227,12 +230,12 @@ void teleport_monster_to(int m_idx, int ty, int tx, int power) /* Sound */ sound(SOUND_TPOTHER); - /* Update the new location */ - cave[ny][nx].m_idx = m_idx; - /* Update the old location */ cave[oy][ox].m_idx = 0; + /* Update the new location */ + cave[ny][nx].m_idx = m_idx; + /* Move the monster */ m_ptr->fy = ny; m_ptr->fx = nx; @@ -251,7 +254,7 @@ void teleport_monster_to(int m_idx, int ty, int tx, int power) } -bool cave_teleportable_bold(int y, int x, u16b mode) +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]; @@ -259,24 +262,32 @@ bool cave_teleportable_bold(int y, int x, u16b mode) /* Require "teleportable" space */ if (!have_flag(f_ptr->flags, FF_TELEPORTABLE)) return FALSE; - if (!(mode & TELEPORT_ALLOW_OBJECT) && (c_ptr->info & CAVE_OBJECT)) 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) return FALSE; - if (player_bold(y, x)) return FALSE; - - if (!player_can_enter(c_ptr->feat, 0)) return FALSE; + if (c_ptr->m_idx && (c_ptr->m_idx != p_ptr->riding)) return FALSE; - if ((mode & TELEPORT_REQUIRE_PROJECT) && !have_flag(f_ptr->flags, FF_PROJECT)) return FALSE; - - if (!(mode & TELEPORT_ALLOW_DEEP)) + 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->ffall && !p_ptr->can_swim) return FALSE; + if (!p_ptr->levitation && !p_ptr->can_swim) return FALSE; } + if (have_flag(f_ptr->flags, FF_LAVA) && !p_ptr->immune_fire && !IS_INVULN()) { - if (have_flag(f_ptr->flags, FF_DEEP) || !p_ptr->ffall) return FALSE; + /* 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; + } + + if (have_flag(f_ptr->flags, FF_HIT_TRAP)) + { + if (!is_known_trap(c_ptr) || !trap_can_be_ignored(c_ptr->feat)) return FALSE; } } @@ -290,89 +301,120 @@ bool cave_teleportable_bold(int y, int x, u16b mode) * If no such spaces are readily available, the distance may increase. * Try very hard to move the player at least a quarter that distance. * - * When long-range teleport effects are considered, there is a nasty - * tendency to "bounce" the player between two or three different spots - * because these are the only spots that are "far enough" way to satisfy - * the algorithm. Therefore, if the teleport distance is more than 50, - * we decrease the minimum acceptable distance to try to increase randomness. - * -GJW + * There was a nasty tendency for a long time; which was causing the + * player to "bounce" between two or three different spots because + * these are the only spots that are "far enough" way to satisfy the + * algorithm. + * + * But this tendency is now removed; in the new algorithm, a list of + * candidates is selected first, which includes at least 50% of all + * floor grids within the distance, and any single grid in this list + * of candidates has equal possibility to be choosen as a destination. */ -void teleport_player(int dis) -{ - int d, i, min, ox, oy; - int tries = 0; - int xx, yy; +#define MAX_TELEPORT_DISTANCE 200 - /* Initialize */ - int y = py; - int x = px; +bool teleport_player_aux(int dis, u32b mode) +{ + int candidates_at[MAX_TELEPORT_DISTANCE + 1]; + int total_candidates, cur_candidates; + int y = 0, x = 0, min, pick, i; - bool look = TRUE; + int left = MAX(1, px - dis); + int right = MIN(cur_wid - 2, px + dis); + int top = MAX(1, py - dis); + int bottom = MIN(cur_hgt - 2, py + dis); - if (p_ptr->wild_mode) return; + if (p_ptr->wild_mode) return FALSE; - if (p_ptr->anti_tele) + if (p_ptr->anti_tele && !(mode & TELEPORT_NONMAGICAL)) { #ifdef JP -msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª"); + msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª"); #else msg_print("A mysterious force prevents you from teleporting!"); #endif - return; + return FALSE; } - if (dis > 200) dis = 200; /* To be on the safe side... */ + /* Initialize counters */ + total_candidates = 0; + for (i = 0; i <= MAX_TELEPORT_DISTANCE; i++) + candidates_at[i] = 0; - /* Minimum distance */ - min = dis / (dis > 50 ? 3 : 2); + /* Limit the distance */ + if (dis > MAX_TELEPORT_DISTANCE) dis = MAX_TELEPORT_DISTANCE; - /* Look until done */ - while (look) + /* Search valid locations */ + for (y = top; y <= bottom; y++) { - tries++; - - /* Verify max distance */ - if (dis > 200) dis = 200; - - /* Try several locations */ - for (i = 0; i < 500; i++) + for (x = left; x <= right; x++) { - /* Pick a (possibly illegal) location */ - while (1) - { - y = rand_spread(py, dis); - x = rand_spread(px, dis); - d = distance(py, px, y, x); - if ((d >= min) && (d <= dis)) break; - } + int d; - /* Ignore illegal locations */ - if (!in_bounds(y, x)) continue; + /* Skip illegal locations */ + if (!cave_player_teleportable_bold(y, x, mode)) continue; - /* No teleporting into vaults and such */ - if (cave[y][x].info & CAVE_ICKY) continue; + /* Calculate distance */ + d = distance(py, px, y, x); - if (!cave_teleportable_bold(y, x, 0)) continue; + /* Skip too far locations */ + if (d > dis) continue; - /* This grid looks good */ - look = FALSE; + /* Count the total number of candidates */ + total_candidates++; - /* Stop looking */ - break; + /* Count the number of candidates in this circumference */ + candidates_at[d]++; } + } - /* Increase the maximum distance */ - dis = dis * 2; + /* No valid location! */ + if (0 == total_candidates) return FALSE; - /* Decrease the minimum distance */ - min = min / 2; + /* Fix the minimum distance */ + for (cur_candidates = 0, min = dis; min >= 0; min--) + { + cur_candidates += candidates_at[min]; - /* Stop after MAX_TRIES tries */ - if (tries > MAX_TRIES) return; + /* 50% of all candidates will have an equal chance to be choosen. */ + if (cur_candidates && (cur_candidates >= total_candidates / 2)) break; } + /* Pick up a single location randomly */ + pick = randint1(cur_candidates); + + /* Search again the choosen location */ + for (y = top; y <= bottom; y++) + { + for (x = left; x <= right; x++) + { + int d; + + /* Skip illegal locations */ + if (!cave_player_teleportable_bold(y, x, mode)) continue; + + /* Calculate distance */ + d = distance(py, px, y, x); + + /* Skip too far locations */ + if (d > dis) continue; + + /* Skip too close locations */ + if (d < min) continue; + + /* This grid was picked up? */ + pick--; + if (!pick) break; + } + + /* Exit the loop */ + if (!pick) break; + } + + if (player_bold(y, x)) return FALSE; + /* Sound */ sound(SOUND_TELEPORT); @@ -381,25 +423,21 @@ msg_print(" msg_format("¡Ø¤³¤Ã¤Á¤À¤¡¡¢%s¡Ù", player_name); #endif - /* Save the old location */ - oy = py; - ox = px; - /* Move the player */ - py = y; - px = x; + (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP); - if (p_ptr->riding) - { - cave[oy][ox].m_idx = cave[py][px].m_idx; - cave[py][px].m_idx = p_ptr->riding; - m_list[p_ptr->riding].fy = py; - m_list[p_ptr->riding].fx = px; - update_mon(p_ptr->riding, TRUE); - } + return TRUE; +} - /* Redraw the old spot */ - lite_spot(oy, ox); +void teleport_player(int dis, u32b mode) +{ + int yy, xx; + + /* Save the old location */ + int oy = py; + int ox = px; + + if (!teleport_player_aux(dis, mode)) return; /* Monsters with teleport ability may follow the player */ for (xx = -1; xx < 2; xx++) @@ -409,7 +447,7 @@ msg_print(" int 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) + if (tmp_m_idx && (p_ptr->riding != tmp_m_idx)) { monster_type *m_ptr = &m_list[tmp_m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; @@ -421,46 +459,63 @@ msg_print(" if ((r_ptr->flags6 & RF6_TPORT) && !(r_ptr->flagsr & RFR_RES_TELE)) { - if (!m_ptr->csleep) teleport_monster_to(tmp_m_idx, py, px, r_ptr->level); + if (!MON_CSLEEP(m_ptr)) teleport_monster_to(tmp_m_idx, py, px, r_ptr->level, 0L); } } } } +} - forget_flow(); - /* Redraw the new spot */ - lite_spot(py, px); +void teleport_player_away(int m_idx, int dis) +{ + int yy, xx; - /* Check for new panel (redraw map) */ - verify_panel(); + /* Save the old location */ + int oy = py; + int ox = px; - /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE); + if (!teleport_player_aux(dis, TELEPORT_PASSIVE)) return; - /* Update the monsters */ - p_ptr->update |= (PU_DISTANCE); + /* Monsters with teleport ability may follow the player */ + for (xx = -1; xx < 2; xx++) + { + for (yy = -1; yy < 2; yy++) + { + int tmp_m_idx = cave[oy+yy][ox+xx].m_idx; - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + /* A monster except your mount or caster may follow */ + if (tmp_m_idx && (p_ptr->riding != tmp_m_idx) && (m_idx != tmp_m_idx)) + { + monster_type *m_ptr = &m_list[tmp_m_idx]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; - /* Handle stuff XXX XXX XXX */ - handle_stuff(); + /* + * The latter limitation is to avoid + * totally unkillable suckers... + */ + if ((r_ptr->flags6 & RF6_TPORT) && + !(r_ptr->flagsr & RFR_RES_TELE)) + { + if (!MON_CSLEEP(m_ptr)) teleport_monster_to(tmp_m_idx, py, px, r_ptr->level, 0L); + } + } + } + } } - /* * Teleport player to a grid near the given location * * This function is slightly obsessive about correctness. * This function allows teleporting into vaults (!) */ -void teleport_player_to(int ny, int nx, bool no_tele) +void teleport_player_to(int ny, int nx, u32b mode) { - int y, x, oy, ox, dis = 0, ctr = 0; + int y, x, dis = 0, ctr = 0; - if (p_ptr->anti_tele && no_tele) + if (p_ptr->anti_tele && !(mode & TELEPORT_NONMAGICAL)) { #ifdef JP msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª"); @@ -482,9 +537,11 @@ void teleport_player_to(int ny, int nx, bool no_tele) if (in_bounds(y, x)) break; } - /* Accept "naked" floor grids */ - if (!no_tele && player_bold(y, x)) break; - if (cave_teleportable_bold(y, x, TELEPORT_ALLOW_DEEP | (no_tele ? 0 : TELEPORT_ALLOW_OBJECT))) break; + /* Accept any grid when wizard mode */ + if (p_ptr->wizard && !(mode & TELEPORT_PASSIVE) && (!cave[y][x].m_idx || (cave[y][x].m_idx == p_ptr->riding))) break; + + /* Accept teleportable floor grids */ + if (cave_player_teleportable_bold(y, x, mode)) break; /* Occasionally advance the distance */ if (++ctr > (4 * dis * dis + 4 * dis + 1)) @@ -497,49 +554,72 @@ void teleport_player_to(int ny, int nx, bool no_tele) /* Sound */ sound(SOUND_TELEPORT); - /* Save the old location */ - oy = py; - ox = px; - /* Move the player */ - py = y; - px = x; - - if (p_ptr->riding) - { - cave[oy][ox].m_idx = cave[py][px].m_idx; - cave[py][px].m_idx = p_ptr->riding; - m_list[p_ptr->riding].fy = py; - m_list[p_ptr->riding].fx = px; - update_mon(p_ptr->riding, TRUE); - } + (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP); +} - forget_flow(); - /* Redraw the old spot */ - lite_spot(oy, ox); - - /* Redraw the new spot */ - lite_spot(py, px); +void teleport_away_followable(int m_idx) +{ + monster_type *m_ptr = &m_list[m_idx]; + int oldfy = m_ptr->fy; + int oldfx = m_ptr->fx; + bool old_ml = m_ptr->ml; + int old_cdis = m_ptr->cdis; - /* Check for new panel (redraw map) */ - verify_panel(); + teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L); - /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE); + if (old_ml && (old_cdis <= MAX_SIGHT) && !world_monster && !p_ptr->inside_battle && los(py, px, oldfy, oldfx)) + { + bool follow = FALSE; - /* Update the monsters */ - p_ptr->update |= (PU_DISTANCE); + if ((p_ptr->muta1 & MUT1_VTELEPORT) || (p_ptr->pclass == CLASS_IMITATOR)) follow = TRUE; + else + { + u32b flgs[TR_FLAG_SIZE]; + object_type *o_ptr; + int i; - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + for (i = INVEN_RARM; i < INVEN_TOTAL; i++) + { + o_ptr = &inventory[i]; + if (o_ptr->k_idx && !object_is_cursed(o_ptr)) + { + object_flags(o_ptr, flgs); + if (have_flag(flgs, TR_TELEPORT)) + { + follow = TRUE; + break; + } + } + } + } - /* Handle stuff XXX XXX XXX */ - handle_stuff(); + if (follow) + { +#ifdef JP + if (get_check_strict("¤Ä¤¤¤Æ¤¤¤­¤Þ¤¹¤«¡©", CHECK_OKAY_CANCEL)) +#else + if (get_check_strict("Do you follow it? ", CHECK_OKAY_CANCEL)) +#endif + { + if (one_in_(3)) + { + teleport_player(200, TELEPORT_PASSIVE); +#ifdef JP + msg_print("¼ºÇÔ¡ª"); +#else + msg_print("Failed!"); +#endif + } + else teleport_player_to(m_ptr->fy, m_ptr->fx, 0L); + p_ptr->energy_need += ENERGY_NEED(); + } + } + } } - /* * Teleport the player one level up or down (random when legal) * Note: If m_idx <= 0, target is player. @@ -565,7 +645,7 @@ void teleport_level(int m_idx) /* Get the monster name (or "it") */ monster_desc(m_name, m_ptr, 0); - see_m = m_ptr->ml; + see_m = is_seen(m_ptr); } /* No effect in some case */ @@ -714,6 +794,14 @@ void teleport_level(int m_idx) /* Check for quest completion */ check_quest_completion(m_ptr); + if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) + { + char m2_name[80]; + + monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE); + do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_TELE_LEVEL, m2_name); + } + delete_monster_idx(m_idx); } @@ -843,7 +931,7 @@ if (get_check(" #endif { max_dlv[dungeon_type] = dun_level; - if (record_maxdeapth) + if (record_maxdepth) #ifdef JP do_cmd_write_nikki(NIKKI_TRUMP, dungeon_type, "µ¢´Ô¤Î¤È¤­¤Ë"); #else @@ -946,7 +1034,7 @@ sprintf(ppp, " max_dlv[select_dungeon] = dummy; - if (record_maxdeapth) + if (record_maxdepth) #ifdef JP do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "¥Õ¥í¥¢¡¦¥ê¥»¥Ã¥È¤Ç"); #else @@ -1001,6 +1089,9 @@ bool apply_disenchant(int mode) /* No item, nothing happens */ if (!o_ptr->k_idx) return (FALSE); + /* Disenchant equipments only -- No disenchant on monster ball */ + if (!object_is_weapon_armour_ammo(o_ptr)) + return FALSE; /* Nothing to disenchant */ if ((o_ptr->to_h <= 0) && (o_ptr->to_d <= 0) && (o_ptr->to_a <= 0) && (o_ptr->pval <= 1)) @@ -1015,7 +1106,7 @@ bool apply_disenchant(int mode) /* Artifacts have 71% chance to resist */ - if ((artifact_p(o_ptr) || o_ptr->art_name) && (randint0(100) < 71)) + if (object_is_artifact(o_ptr) && (randint0(100) < 71)) { /* Message */ #ifdef JP @@ -1121,13 +1212,13 @@ void apply_nexus(monster_type *m_ptr) { case 1: case 2: case 3: { - teleport_player(200); + teleport_player(200, TELEPORT_PASSIVE); break; } case 4: case 5: { - teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE); + teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_PASSIVE); break; } @@ -1246,25 +1337,6 @@ msg_print(" } -static bool item_tester_hook_weapon_nobow(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_HAFTED: - case TV_POLEARM: - case TV_DIGGING: - { - return (TRUE); - } - case TV_SWORD: - { - if (o_ptr->sval != SV_DOKUBARI) return (TRUE); - } - } - - return (FALSE); -} - /* * Brand the current weapon */ @@ -1276,7 +1348,7 @@ void brand_weapon(int brand_type) /* Assume enchant weapon */ - item_tester_hook = item_tester_hook_weapon_nobow; + item_tester_hook = object_allow_enchant_melee_weapon; item_tester_no_ryoute = TRUE; /* Get an item */ @@ -1306,8 +1378,8 @@ s = " /* you can never modify artifacts / ego-items */ /* you can never modify cursed items */ /* TY: You _can_ modify broken items (if you're silly enough) */ - if (o_ptr->k_idx && !artifact_p(o_ptr) && !ego_item_p(o_ptr) && - !o_ptr->art_name && !cursed_p(o_ptr) && + if (o_ptr->k_idx && !object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && + !object_is_cursed(o_ptr) && !((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) && !((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) && !((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE))) @@ -1331,6 +1403,9 @@ act = " o_ptr->name2 = EGO_SHARPNESS; o_ptr->pval = m_bonus(5, dun_level) + 1; + + if ((o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2)) + o_ptr->pval = 2; } else { @@ -1561,10 +1636,10 @@ static bool vanish_dungeon(void) m_ptr = &m_list[c_ptr->m_idx]; /* Awake monster */ - if (c_ptr->m_idx && m_ptr->csleep) + if (c_ptr->m_idx && MON_CSLEEP(m_ptr)) { /* Reset sleep counter */ - m_ptr->csleep = 0; + (void)set_monster_csleep(c_ptr->m_idx, 0); /* Notice the "waking up" */ if (m_ptr->ml) @@ -1578,10 +1653,6 @@ static bool vanish_dungeon(void) #else msg_format("%^s wakes up.", m_name); #endif - - /* Redraw the health bar */ - if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == c_ptr->m_idx) p_ptr->redraw |= (PR_UHEALTH); } } @@ -1680,18 +1751,21 @@ static bool vanish_dungeon(void) void call_the_(void) { int i; - int y, x; + cave_type *c_ptr; bool do_call = TRUE; for (i = 0; i < 9; i++) { - y = py + ddy_ddd[i]; - x = px + ddx_ddd[i]; + c_ptr = &cave[py + ddy_ddd[i]][px + ddx_ddd[i]]; - if (!cave_floor_bold(y, x) && !boundary_floor_bold(y, x)) + if (!cave_have_flag_grid(c_ptr, FF_PROJECT)) { - do_call = FALSE; - break; + if (!c_ptr->mimic || !have_flag(f_info[c_ptr->mimic].flags, FF_PROJECT) || + !permanent_wall(&f_info[c_ptr->feat])) + { + do_call = FALSE; + break; + } } } @@ -1836,15 +1910,28 @@ msg_print(" } /* We need to see the item */ - if (require_los && !player_has_los_bold(ty, tx)) + if (require_los) { + if (!player_has_los_bold(ty, tx)) + { #ifdef JP -msg_print("¤½¤³¤Ï¤¢¤Ê¤¿¤Î»ë³¦¤ËÆþ¤Ã¤Æ¤¤¤Þ¤»¤ó¡£"); + msg_print("¤½¤³¤Ï¤¢¤Ê¤¿¤Î»ë³¦¤ËÆþ¤Ã¤Æ¤¤¤Þ¤»¤ó¡£"); #else - msg_print("You have no direct line of sight to that location."); + msg_print("You have no direct line of sight to that location."); #endif - return; + return; + } + else if (!projectable(py, px, ty, tx)) + { +#ifdef JP + msg_print("¤½¤³¤ÏÊɤθþ¤³¤¦¤Ç¤¹¡£"); +#else + msg_print("You have no direct line of sight to that location."); +#endif + + return; + } } } else @@ -1860,7 +1947,7 @@ msg_print(" c_ptr = &cave[ty][tx]; if ((distance(py, px, ty, tx) > MAX_RANGE) || - !cave_floor_bold(ty, tx)) return; + !cave_have_flag_bold(ty, tx, FF_PROJECT)) return; } while (!c_ptr->o_idx); } @@ -1959,7 +2046,7 @@ msg_print(" /* Create a glyph */ cave[py][px].info |= CAVE_OBJECT; - cave[py][px].mimic = FEAT_GLYPH; + cave[py][px].mimic = feat_glyph; /* Notice */ note_spot(py, px); @@ -1970,7 +2057,7 @@ msg_print(" return TRUE; } -bool warding_mirror(void) +bool place_mirror(void) { /* XXX XXX XXX */ if (!cave_clean_bold(py, px)) @@ -1986,17 +2073,19 @@ msg_print(" /* Create a mirror */ cave[py][px].info |= CAVE_OBJECT; - cave[py][px].mimic = FEAT_MIRROR; + cave[py][px].mimic = feat_mirror; /* Turn on the light */ cave[py][px].info |= CAVE_GLOW; /* Notice */ note_spot(py, px); - + /* Redraw */ lite_spot(py, px); + update_local_illumination(py, px); + return TRUE; } @@ -2020,7 +2109,7 @@ msg_print(" /* Create a glyph */ cave[py][px].info |= CAVE_OBJECT; - cave[py][px].mimic = FEAT_MINOR_GLYPH; + cave[py][px].mimic = feat_explosive_rune; /* Notice */ note_spot(py, px); @@ -2093,7 +2182,7 @@ static int remove_curse_aux(int all) if (!o_ptr->k_idx) continue; /* Uncursed already */ - if (!cursed_p(o_ptr)) continue; + if (!object_is_cursed(o_ptr)) continue; /* Heavily Cursed Items need a special spell */ if (!all && (o_ptr->curse_flags & TRC_HEAVY_CURSE)) continue; @@ -2291,153 +2380,12 @@ msg_format("%s } - -/* - * Hook to specify "weapon" - */ -bool item_tester_hook_weapon(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_HAFTED: - case TV_POLEARM: - case TV_DIGGING: - case TV_BOW: - case TV_BOLT: - case TV_ARROW: - case TV_SHOT: - { - return (TRUE); - } - case TV_SWORD: - { - if (o_ptr->sval != SV_DOKUBARI) return (TRUE); - } - } - - return (FALSE); -} - -static bool item_tester_hook_weapon2(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_SWORD: - case TV_HAFTED: - case TV_POLEARM: - case TV_DIGGING: - case TV_BOW: - case TV_BOLT: - case TV_ARROW: - case TV_SHOT: - { - return (TRUE); - } - } - - return (FALSE); -} - - -/* - * Hook to specify "armour" - */ -bool item_tester_hook_armour(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_DRAG_ARMOR: - case TV_HARD_ARMOR: - case TV_SOFT_ARMOR: - case TV_SHIELD: - case TV_CLOAK: - case TV_CROWN: - case TV_HELM: - case TV_BOOTS: - case TV_GLOVES: - { - return (TRUE); - } - } - - return (FALSE); -} - - -/* - * Check if an object is weapon or armour (but not arrow, bolt, or shot) - */ -bool item_tester_hook_weapon_armour(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_SWORD: - case TV_HAFTED: - case TV_POLEARM: - case TV_DIGGING: - case TV_BOW: - case TV_BOLT: - case TV_ARROW: - case TV_SHOT: - case TV_DRAG_ARMOR: - case TV_HARD_ARMOR: - case TV_SOFT_ARMOR: - case TV_SHIELD: - case TV_CLOAK: - case TV_CROWN: - case TV_HELM: - case TV_BOOTS: - case TV_GLOVES: - { - return (TRUE); - } - } - - return (FALSE); -} - - -/* - * Check if an object is nameless weapon or armour - */ -static bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_SWORD: - case TV_HAFTED: - case TV_POLEARM: - case TV_DIGGING: - case TV_BOW: - case TV_BOLT: - case TV_ARROW: - case TV_SHOT: - case TV_DRAG_ARMOR: - case TV_HARD_ARMOR: - case TV_SOFT_ARMOR: - case TV_SHIELD: - case TV_CLOAK: - case TV_CROWN: - case TV_HELM: - case TV_BOOTS: - case TV_GLOVES: - if (o_ptr->name1 || o_ptr->art_name || o_ptr->name2 || o_ptr->xtra3) - { - if (object_known_p(o_ptr)) return FALSE; - } - return TRUE; - } - - return FALSE; -} - - /* * Break the curse of an item */ static void break_curse(object_type *o_ptr) { - if (cursed_p(o_ptr) && !(o_ptr->curse_flags & TRC_PERMA_CURSE) && !(o_ptr->curse_flags & TRC_HEAVY_CURSE) && (randint0(100) < 25)) + if (object_is_cursed(o_ptr) && !(o_ptr->curse_flags & TRC_PERMA_CURSE) && !(o_ptr->curse_flags & TRC_HEAVY_CURSE) && (randint0(100) < 25)) { #ifdef JP msg_print("¤«¤±¤é¤ì¤Æ¤¤¤¿¼ö¤¤¤¬ÂǤÁÇˤé¤ì¤¿¡ª"); @@ -2473,7 +2421,7 @@ bool enchant(object_type *o_ptr, int n, int eflag) { int i, chance, prob; bool res = FALSE; - bool a = (artifact_p(o_ptr) || o_ptr->art_name); + bool a = object_is_artifact(o_ptr); bool force = (eflag & ENCH_FORCE); @@ -2584,11 +2532,11 @@ bool enchant_spell(int num_hit, int num_dam, int num_ac) /* Assume enchant weapon */ - item_tester_hook = item_tester_hook_weapon; + item_tester_hook = object_allow_enchant_weapon; item_tester_no_ryoute = TRUE; /* Enchant armor if requested */ - if (num_ac) item_tester_hook = item_tester_hook_armour; + if (num_ac) item_tester_hook = object_is_armour; /* Get an item */ #ifdef JP @@ -2658,6 +2606,22 @@ msg_print(" } +/* + * Check if an object is nameless weapon or armour + */ +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; +} + + bool artifact_scroll(void) { int item; @@ -2668,6 +2632,7 @@ bool artifact_scroll(void) item_tester_no_ryoute = TRUE; + /* Enchant weapon/armour */ item_tester_hook = item_tester_hook_nameless_weapon_armour; @@ -2707,7 +2672,7 @@ bool artifact_scroll(void) ((o_ptr->number > 1) ? "" : "s")); #endif - if (o_ptr->name1 || o_ptr->art_name) + if (object_is_artifact(o_ptr)) { #ifdef JP msg_format("%s¤Ï´û¤ËÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Ç¤¹¡ª", o_name ); @@ -2720,7 +2685,7 @@ bool artifact_scroll(void) okay = FALSE; } - else if (o_ptr->name2) + else if (object_is_ego(o_ptr)) { #ifdef JP msg_format("%s¤Ï´û¤Ë̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à¤Ç¤¹¡ª", o_name ); @@ -2809,7 +2774,7 @@ bool identify_item(object_type *o_ptr) if (!(o_ptr->ident & (IDENT_MENTAL))) { - if ((o_ptr->art_name) || (artifact_p(o_ptr)) || one_in_(5)) + if (object_is_artifact(o_ptr) || one_in_(5)) chg_virtue(V_KNOWLEDGE, 1); } @@ -2832,7 +2797,7 @@ bool identify_item(object_type *o_ptr) /* Description */ object_desc(o_name, o_ptr, OD_NAME_ONLY); - if(record_fix_art && !old_known && artifact_p(o_ptr)) + if(record_fix_art && !old_known && object_is_fixed_artifact(o_ptr)) do_cmd_write_nikki(NIKKI_ART, 0, o_name); if(record_rand_art && !old_known && o_ptr->art_name) do_cmd_write_nikki(NIKKI_ART, 0, o_name); @@ -2843,14 +2808,14 @@ bool identify_item(object_type *o_ptr) static bool item_tester_hook_identify(object_type *o_ptr) { - return (bool)!object_known_p(o_ptr); + return (bool)!object_is_known(o_ptr); } static bool item_tester_hook_identify_weapon_armour(object_type *o_ptr) { - if (object_known_p(o_ptr)) + if (object_is_known(o_ptr)) return FALSE; - return item_tester_hook_weapon_armour(o_ptr); + return object_is_weapon_armour_ammo(o_ptr); } /* @@ -2873,24 +2838,32 @@ bool ident_spell(bool only_equip) else item_tester_hook = item_tester_hook_identify; - if (!can_get_item()) + if (can_get_item()) + { +#ifdef JP + q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? "; +#else + q = "Identify which item? "; +#endif + } + else { if (only_equip) - { - item_tester_hook = item_tester_hook_weapon_armour; - } + item_tester_hook = object_is_weapon_armour_ammo; else - { item_tester_hook = NULL; - } + +#ifdef JP + q = "¤¹¤Ù¤Æ´ÕÄêºÑ¤ß¤Ç¤¹¡£ "; +#else + q = "All items are identified. "; +#endif } /* Get an item */ #ifdef JP -q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? "; -s = "´ÕÄꤹ¤ë¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£"; + s = "´ÕÄꤹ¤ë¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£"; #else - q = "Identify which item? "; s = "You have nothing to identify."; #endif @@ -2959,7 +2932,7 @@ bool mundane_spell(bool only_equip) object_type *o_ptr; cptr q, s; - if (only_equip) item_tester_hook = item_tester_hook_weapon_armour; + if (only_equip) item_tester_hook = object_is_weapon_armour_ammo; item_tester_no_ryoute = TRUE; /* Get an item */ @@ -3019,14 +2992,14 @@ s = " static bool item_tester_hook_identify_fully(object_type *o_ptr) { - return (bool)(!object_known_p(o_ptr) || !(o_ptr->ident & IDENT_MENTAL)); + return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL)); } static bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr) { if (!item_tester_hook_identify_fully(o_ptr)) return FALSE; - return item_tester_hook_weapon_armour(o_ptr); + return object_is_weapon_armour_ammo(o_ptr); } /* @@ -3047,21 +3020,33 @@ bool identify_fully(bool only_equip) else item_tester_hook = item_tester_hook_identify_fully; - if (!can_get_item()) + if (can_get_item()) + { +#ifdef JP + q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò*´ÕÄê*¤·¤Þ¤¹¤«? "; +#else + q = "*Identify* which item? "; +#endif + } + else { if (only_equip) - item_tester_hook = item_tester_hook_weapon_armour; + item_tester_hook = object_is_weapon_armour_ammo; else item_tester_hook = NULL; + +#ifdef JP + q = "¤¹¤Ù¤Æ*´ÕÄê*ºÑ¤ß¤Ç¤¹¡£ "; +#else + q = "All items are *identified*. "; +#endif } /* Get an item */ #ifdef JP -q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò´ÕÄꤷ¤Þ¤¹¤«? "; -s = "´ÕÄꤹ¤ë¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£"; + s = "*´ÕÄê*¤¹¤ë¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£"; #else - q = "Identify which item? "; - s = "You have nothing to identify."; + s = "You have nothing to *identify*."; #endif if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE); @@ -3119,7 +3104,7 @@ s = " } /* Describe it fully */ - (void)screen_object(o_ptr, TRUE); + (void)screen_object(o_ptr, 0L); /* Auto-inscription/destroy */ autopick_alter_item(item, (bool)(destroy_identify && !old_known)); @@ -3211,7 +3196,7 @@ s = " k_ptr = &k_info[o_ptr->k_idx]; /* Extract the object "level" */ - lev = get_object_level(o_ptr); + lev = k_info[o_ptr->k_idx].level; /* Recharge a rod */ @@ -3308,7 +3293,7 @@ s = " if (fail) { /* Artifacts are never destroyed. */ - if (artifact_p(o_ptr)) + if (object_is_fixed_artifact(o_ptr)) { object_desc(o_name, o_ptr, OD_NAME_ONLY); #ifdef JP @@ -3507,8 +3492,9 @@ bool bless_weapon(void) cptr q, s; item_tester_no_ryoute = TRUE; - /* Assume enchant weapon */ - item_tester_hook = item_tester_hook_weapon2; + + /* Bless only weapons */ + item_tester_hook = object_is_weapon; /* Get an item */ #ifdef JP @@ -3541,7 +3527,7 @@ s = " /* Extract the flags */ object_flags(o_ptr, flgs); - if (cursed_p(o_ptr)) + if (object_is_cursed(o_ptr)) { if (((o_ptr->curse_flags & TRC_HEAVY_CURSE) && (randint1(100) < 33)) || (o_ptr->curse_flags & TRC_PERMA_CURSE)) @@ -3604,7 +3590,7 @@ msg_format("%s return TRUE; } - if (!(o_ptr->art_name || o_ptr->name1 || o_ptr->name2) || one_in_(3)) + if (!(object_is_artifact(o_ptr) || object_is_ego(o_ptr)) || one_in_(3)) { /* Describe */ #ifdef JP @@ -3735,8 +3721,8 @@ s = " /* Extract the flags */ object_flags(o_ptr, flgs); - if (o_ptr->k_idx && !artifact_p(o_ptr) && !ego_item_p(o_ptr) && - !o_ptr->art_name && !cursed_p(o_ptr) && (o_ptr->sval != SV_MIRROR_SHIELD)) + if (o_ptr->k_idx && !object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && + !object_is_cursed(o_ptr) && (o_ptr->sval != SV_MIRROR_SHIELD)) { #ifdef JP msg_format("%s¤Ïµ±¤¤¤¿¡ª", o_name); @@ -4090,7 +4076,7 @@ put_str("Lv MP s_ptr = &mp_ptr->info[((j < 1) ? p_ptr->realm1 : p_ptr->realm2) - 1][i % 32]; } - strcpy(name, spell_names[technic2magic((j < 1) ? p_ptr->realm1 : p_ptr->realm2)-1][i % 32]); + strcpy(name, do_spell((j < 1) ? p_ptr->realm1 : p_ptr->realm2, i % 32, SPELL_NAME)); /* Illegible */ if (s_ptr->slevel >= 99) @@ -4376,338 +4362,6 @@ bool spell_okay(int spell, bool learned, bool study_pray, int use_realm) } - -/* - * Extra information on a spell -DRS- - * - * We can use up to 14 characters of the buffer 'p' - * - * The strings in this function were extracted from the code in the - * functions "do_cmd_cast()" and "do_cmd_pray()" and may be dated. - */ -static void spell_info(char *p, int spell, int use_realm) -{ - int plev = p_ptr->lev; - - /* See below */ - int orb = plev + (plev / ((p_ptr->pclass == CLASS_PRIEST || - p_ptr->pclass == CLASS_HIGH_MAGE || - p_ptr->pclass == CLASS_SORCERER) ? 2 : 4)); - - int burst = plev + (plev / ((p_ptr->pclass == CLASS_MAGE || - p_ptr->pclass == CLASS_HIGH_MAGE || - p_ptr->pclass == CLASS_SORCERER) ? 2 : 4)); -#ifdef JP - cptr s_dam = "»½ý:"; - cptr s_dur = "´ü´Ö:"; - cptr s_range = "ÈÏ°Ï:"; - cptr s_heal = "²óÉü:"; - cptr s_random = "¥é¥ó¥À¥à"; - cptr s_delay = "ÃÙ±ä:"; -#else - cptr s_dam = "dam "; - cptr s_dur = "dur "; - cptr s_range = "range "; - cptr s_heal = "heal "; - cptr s_random = "random"; - cptr s_delay = "delay "; -#endif - /* Default */ - strcpy(p, ""); - - /* Analyze the spell */ - switch (use_realm) - { - case REALM_LIFE: /* Life */ - switch (spell) - { - case 0: sprintf(p, " %s2d10", s_heal); break; - case 1: sprintf(p, " %s12+d12", s_dur); break; - case 2: sprintf(p, " %s%dd4", s_dam, 3 + ((plev - 1) / 5)); break; - case 3: sprintf(p, " %s%d", s_dam, 10 + (plev / 2)); break; - case 5: sprintf(p, " %s4d10", s_heal); break; - case 9: sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 1) / 5)); break; - case 10: sprintf(p, " %s8d10", s_heal); break; - case 11: sprintf(p, " %s20+d20", s_dur); break; - case 14: sprintf(p, " %s300", s_heal); break; - case 18: sprintf(p, " %sd%d", s_dam, 5 * plev); break; - case 20: sprintf(p, " %s%dd15", s_dam, 5 + ((plev - 1) / 3)); break; - case 21: sprintf(p, " %s15+d21", s_delay); break; - case 29: sprintf(p, " %s2000", s_heal); break; - case 31: sprintf(p, " %s%d+d%d", s_dur,(plev/2), (plev/2)); break; - } - break; - - case REALM_SORCERY: /* Sorcery */ - switch (spell) - { - case 1: sprintf(p, " %s10", s_range); break; - case 3: sprintf(p, " %s%d", s_dam, 10 + (plev / 2)); break; - case 5: sprintf(p, " %s%d", s_range, plev * 5); break; - case 13: sprintf(p, " %s%d+d%d", s_dur, plev, plev + 20); break; - case 18: sprintf(p, " %s25+d30", s_dur); break; - case 22: sprintf(p, " %s15+d21", s_delay); break; - case 23: sprintf(p, " %s%d", s_range, plev / 2 + 10); break; - case 25: sprintf(p, " %s7d7+%d", s_dam, plev); break; -#ifdef JP - case 26: sprintf(p, " ºÇÂç½ÅÎÌ:%d.%dkg", lbtokg1(plev * 15),lbtokg2(plev * 15)); break; -#else - case 26: sprintf(p, " max wgt %d", plev * 15 / 10); break; -#endif - case 27: sprintf(p, " %s25+d30", s_dur); break; - case 31: sprintf(p, " %s4+d4", s_dur); break; - } - break; - - case REALM_NATURE: /* Nature */ - switch (spell) - { -#ifdef JP - case 1: sprintf(p, " %s%dd4 ¼ÍÄø%d", s_dam, (3 + ((plev - 1) / 5)), plev/6+2); break; -#else - case 1: sprintf(p, " %s%dd4 rng %d", s_dam, (3 + ((plev - 1) / 5)), plev/6+2); break; -#endif - case 4: sprintf(p, " %s%d", s_dam, 10 + (plev / 2)); break; - case 6: sprintf(p, " %s20+d20", s_dur); break; - case 7: sprintf(p, " %s2d8", s_heal); break; - case 9: sprintf(p, " %s%dd8", s_dam, (3 + ((plev - 5) / 4))); break; - case 11: sprintf(p, " %s%dd8", s_dam, (5 + ((plev - 5) / 4))); break; - case 12: sprintf(p, " %s6d8", s_dam); break; - case 15: sprintf(p, " %s500", s_heal); break; - case 17: sprintf(p, " %s20+d30", s_dur); break; - case 18: sprintf(p, " %s20+d20", s_dur); break; -#ifdef JP - case 24: sprintf(p, " Ⱦ·Â:10"); break; -#else - case 24: sprintf(p, " rad 10"); break; -#endif - case 26: sprintf(p, " %s%d", s_dam, 70 + plev * 3 / 2); break; - case 27: sprintf(p, " %s%d", s_dam, 90 + plev * 3 / 2); break; - case 28: sprintf(p, " %s%d", s_dam, 100 + plev * 3 / 2); break; - case 29: sprintf(p, " %s75", s_dam); break; - case 31: sprintf(p, " %s%d+%d", s_dam, 4 * plev, 100 + plev); break; - } - break; - - case REALM_CHAOS: /* Chaos */ - switch (spell) - { - case 0: sprintf(p, " %s%dd4", s_dam, 3 + ((plev - 1) / 5)); break; - case 2: sprintf(p, " %s%d", s_dam, 10 + (plev / 2)); break; - case 4: sprintf(p, " %s3d5+%d", s_dam, burst); break; - case 5: sprintf(p, " %s%dd8", s_dam, (6 + ((plev - 5) / 4))); break; - case 6: sprintf(p, " %s%dd8", s_dam, (8 + ((plev - 5) / 4))); break; - case 7: sprintf(p, " %s%d", s_range, plev * 5); break; - case 8: sprintf(p, " %s", s_random); break; - case 9: sprintf(p, " %s%dd8", s_dam, (10 + ((plev - 5) / 4))); break; - case 10: sprintf(p, " %s%d", s_dam, (60 + plev)/2); break; - case 11: sprintf(p, " %s%dd8", s_dam, (11 + ((plev - 5) / 4))); break; - case 12: sprintf(p, " %s%d", s_dam, 55 + plev); break; - case 15: sprintf(p, " %s%d", s_dam, 99 + plev*2); break; - case 17: sprintf(p, " %s%dd8", s_dam, (5 + (plev / 10))); break; - case 19: sprintf(p, " %s%d", s_dam, 70 + plev); break; - case 21: sprintf(p, " %s%d", s_dam, 120 + plev*2); break; - case 24: sprintf(p, " %s%dd8", s_dam, (9 + (plev / 10))); break; -#ifdef JP - case 25: sprintf(p, " %s³Æ%d", s_dam, plev * 2); break; -#else - case 25: sprintf(p, " dam %d each", plev * 2); break; -#endif - case 26: sprintf(p, " %s%d", s_dam, 150 + plev*3/2); break; - case 27: sprintf(p, " %s150 / 250", s_dam); break; - case 29: sprintf(p, " %s%d", s_dam, 300 + (plev * 4)); break; - case 30: sprintf(p, " %s%d", s_dam, p_ptr->chp); break; - case 31: sprintf(p, " %s3 * 175", s_dam); break; - } - break; - - case REALM_DEATH: /* Death */ - switch (spell) - { - case 1: sprintf(p, " %s%dd3", s_dam, (3 + ((plev - 1) / 5))); break; - case 3: sprintf(p, " %s%d", s_dam, 10 + (plev / 2)); break; - case 5: sprintf(p, " %s20+d20", s_dur); break; - case 8: sprintf(p, " %s3d6+%d", s_dam, burst); break; - case 9: sprintf(p, " %s%dd8", s_dam, (8 + ((plev - 5) / 4))); break; - case 10: sprintf(p, " %s%d", s_dam, 30+plev); break; -#ifdef JP - case 13: sprintf(p, " »:%d+d%d", plev * 2, plev * 2); break; -#else - case 13: sprintf(p, " d %d+d%d", plev * 2, plev * 2); break; -#endif - case 16: sprintf(p, " %s25+d25", s_dur); break; - case 17: sprintf(p, " %s", s_random); break; - case 18: sprintf(p, " %s%dd8", s_dam, (4 + ((plev - 5) / 4))); break; - case 19: sprintf(p, " %s25+d25", s_dur); break; - case 21: sprintf(p, " %s3*100", s_dam); break; - case 22: sprintf(p, " %sd%d", s_dam, plev * 3); break; - case 23: sprintf(p, " %s%d", s_dam, 100 + plev * 2); break; - case 27: sprintf(p, " %s%d+d%d", s_dur,10+plev/2, 10+plev/2); break; - case 30: sprintf(p, " %s666", s_dam); break; - case 31: sprintf(p, " %s%d+d%d", s_dur, (plev / 2), (plev / 2)); break; - } - break; - - case REALM_TRUMP: /* Trump */ - switch (spell) - { - case 0: sprintf(p, " %s10", s_range); break; - case 2: sprintf(p, " %s", s_random); break; - case 4: sprintf(p, " %s%d", s_range, plev * 4); break; - case 5: sprintf(p, " %s25+d30", s_dur); break; -#ifdef JP - case 8: sprintf(p, " ºÇÂç½ÅÎÌ:%d.%d", lbtokg1(plev * 15 / 10),lbtokg2(plev * 15 / 10)); break; -#else - case 8: sprintf(p, " max wgt %d", plev * 15 / 10); break; -#endif - case 13: sprintf(p, " %s%d", s_range, plev / 2 + 10); break; - case 14: sprintf(p, " %s15+d21", s_delay); break; - case 26: sprintf(p, " %s%d", s_heal, plev * 10 + 200); break; -#ifdef JP - case 28: sprintf(p, " %s³Æ%d", s_dam, plev * 2); break; -#else - case 28: sprintf(p, " %s%d each", s_dam, plev * 2); break; -#endif - } - break; - - case REALM_ARCANE: /* Arcane */ - switch (spell) - { - case 0: sprintf(p, " %s%dd3", s_dam, 3 + ((plev - 1) / 5)); break; - case 4: sprintf(p, " %s10", s_range); break; - case 5: sprintf(p, " %s2d%d", s_dam, plev / 2); break; - case 7: sprintf(p, " %s2d8", s_heal); break; - case 14: - case 15: - case 16: - case 17: sprintf(p, " %s20+d20", s_dur); break; - case 18: sprintf(p, " %s4d8", s_heal); break; - case 19: sprintf(p, " %s%d", s_range, plev * 5); break; - case 21: sprintf(p, " %s6d8", s_dam); break; - case 24: sprintf(p, " %s24+d24", s_dur); break; - case 28: sprintf(p, " %s%d", s_dam, 75 + plev); break; - case 30: sprintf(p, " %s15+d21", s_delay); break; - case 31: sprintf(p, " %s25+d30", s_dur); break; - } - break; - - case REALM_ENCHANT: /* Craft */ - switch (spell) - { - case 0: sprintf(p, " %s100+d100", s_dur); break; - case 1: sprintf(p, " %s80+d80", s_dur); break; - case 3: - case 4: - case 6: - case 7: - case 10: - case 18: sprintf(p, " %s20+d20", s_dur); break; - case 5: sprintf(p, " %s25+d25", s_dur); break; - case 8: sprintf(p, " %s24+d24", s_dur); break; - case 11: sprintf(p, " %s25+d25", s_dur); break; - case 13: sprintf(p, " %s%d+d25", s_dur, plev * 3); break; - case 15: sprintf(p, " %s%d+d%d", s_dur, plev/2, plev/2); break; - case 16: sprintf(p, " %s25+d30", s_dur); break; - case 17: sprintf(p, " %s30+d20", s_dur); break; - case 19: sprintf(p, " %s%d+d%d", s_dur, plev, plev+20); break; - case 20: sprintf(p, " %s50+d50", s_dur); break; - case 23: sprintf(p, " %s20+d20", s_dur); break; - case 31: sprintf(p, " %s13+d13", s_dur); break; - } - break; - - case REALM_DAEMON: /* Daemon */ - switch (spell) - { - case 0: sprintf(p, " %s%dd4", s_dam, 3 + ((plev - 1) / 5)); break; - case 2: sprintf(p, " %s12+d12", s_dur); break; - case 3: sprintf(p, " %s20+d20", s_dur); break; - case 5: sprintf(p, " %s%dd8", s_dam, (6 + ((plev - 5) / 4))); break; - case 7: sprintf(p, " %s3d6+%d", s_dam, burst); break; - case 10: sprintf(p, " %s20+d20", s_dur); break; - case 11: sprintf(p, " %s%dd8", s_dam, (11 + ((plev - 5) / 4))); break; - case 12: sprintf(p, " %s%d", s_dam, 55 + plev); break; - case 14: sprintf(p, " %s%d", s_dam, 100 + plev*3/2); break; - case 16: sprintf(p, " %s30+d25", s_dur); break; - case 17: sprintf(p, " %s20+d20", s_dur); break; - case 18: sprintf(p, " %s%d", s_dam, 55 + plev); break; - case 19: sprintf(p, " %s%d", s_dam, 80 + plev*3/2); break; - case 20: sprintf(p, " %s%d+d%d", s_dur,10+plev/2, 10+plev/2); break; - case 21: sprintf(p, " %sd%d+d%d", s_dam, 2 * plev, 2 * plev); break; - case 22: sprintf(p, " %s%d", s_dam, 100 + plev*2); break; - case 24: sprintf(p, " %s25+d25", s_dur); break; - case 25: sprintf(p, " %s20+d20", s_dur); break; - case 26: sprintf(p, " %s%d+%d", s_dam, 25+plev/2, 25+plev/2); break; - case 29: sprintf(p, " %s%d", s_dam, plev*15); break; - case 30: sprintf(p, " %s600", s_dam); break; - case 31: sprintf(p, " %s15+d15", s_dur); break; - } - break; - - case REALM_CRUSADE: /* Crusade */ - switch (spell) - { - case 0: sprintf(p, " %s%dd4", s_dam, 3 + ((plev - 1) / 5)); break; - case 5: sprintf(p, " %s%d", s_range, 25+plev/2); break; -#ifdef JP - case 6: sprintf(p, " %s³Æ%dd2", s_dam, 3+((plev-1)/9)); break; -#else - case 6: sprintf(p, " %s%dd2 each", s_dam, 3+((plev-1)/9)); break; -#endif - case 9: sprintf(p, " %s3d6+%d", s_dam, orb); break; - case 10: sprintf(p, " %sd%d", s_dam, plev); break; - case 12: sprintf(p, " %s24+d24", s_dur); break; - case 13: sprintf(p, " %sd25+%d", s_dur, 3 * plev); break; - case 14: sprintf(p, " %s%d", s_dam, plev*5); break; -#ifdef JP - case 15: sprintf(p, " »:d%d/²ó:100", 6 * plev); break; -#else - case 15: sprintf(p, " dam:d%d/h100", 6 * plev); break; -#endif - case 18: sprintf(p, " %s18+d18", s_dur); break; - case 19: sprintf(p, " %sd%d", s_dam, 4 * plev); break; - case 20: sprintf(p, " %sd%d", s_dam, 4 * plev); break; - case 22: sprintf(p, " %s%d", s_dam, 2 * plev+100); break; - case 24: sprintf(p, " %s25+d25", s_dur); break; - case 28: sprintf(p, " %s10+d10", s_dur); break; -#ifdef JP - case 29: sprintf(p, " %s³Æ%d", s_dam, plev*3+25); break; -#else - case 29: sprintf(p, " %s%d each", s_dam, plev*3+25); break; -#endif -#ifdef JP - case 30: sprintf(p, " ²ó100/»%d+%d", plev * 4, plev*11/2); break; -#else - case 30: sprintf(p, " h100/dm%d+%d", plev * 4, plev*11/2); break; -#endif - } - break; - - case REALM_MUSIC: /* Music */ - switch (spell) - { - case 2 : sprintf(p, " %s%dd4", s_dam, 4 + ((plev - 1) / 5)); break; - case 4 : sprintf(p, " %s2d6", s_heal); break; - case 9 : sprintf(p, " %sd%d", s_dam, plev * 3 / 2); break; - case 13: sprintf(p, " %s%dd7", s_dam, 10 + (plev / 5)); break; - case 20: sprintf(p, " %sd%d+d%d", s_dam, plev * 3, plev * 3); break; - case 22: sprintf(p, " %s%dd10", s_dam, 15 + ((plev - 1) / 2)); break; - case 27: sprintf(p, " %sd%d", s_dam, plev * 3); break; - case 28: sprintf(p, " %s15d10", s_heal); break; - case 30: sprintf(p, " %s%dd10", s_dam, 50 + plev); break; - } - break; - default: -#ifdef JP - sprintf(p, "̤ÃΤΥ¿¥¤¥×: %d", use_realm); -#else - sprintf(p, "Unknown type: %d.", use_realm); -#endif - } -} - - /* * Print a list of spells (for browsing or casting or viewing) */ @@ -4827,7 +4481,7 @@ strcat(out_val, format("%-30s", "(Ƚ /* XXX XXX Could label spells above the players level */ /* Get extra info */ - spell_info(info, spell, use_realm); + strcpy(info, do_spell(use_realm, spell, SPELL_INFO)); /* Use that info */ comment = info; @@ -4841,9 +4495,9 @@ strcat(out_val, format("%-30s", "(Ƚ if (s_ptr->slevel > p_ptr->max_plv) { #ifdef JP -comment = " ̤ÃÎ"; +comment = "̤ÃÎ"; #else - comment = " unknown"; + comment = "unknown"; #endif line_attr = TERM_L_BLUE; @@ -4851,9 +4505,9 @@ comment = " ̤ else if (s_ptr->slevel > p_ptr->lev) { #ifdef JP -comment = " ˺µÑ"; +comment = "˺µÑ"; #else - comment = " forgotten"; + comment = "forgotten"; #endif line_attr = TERM_YELLOW; @@ -4862,9 +4516,9 @@ comment = " ˺ else if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) { #ifdef JP -comment = " ̤ÃÎ"; +comment = "̤ÃÎ"; #else - comment = " unknown"; + comment = "unknown"; #endif line_attr = TERM_L_BLUE; @@ -4874,9 +4528,9 @@ comment = " ̤ ((p_ptr->spell_forgotten2 & (1L << spell)))) { #ifdef JP -comment = " ˺µÑ"; +comment = "˺µÑ"; #else - comment = " forgotten"; + comment = "forgotten"; #endif line_attr = TERM_YELLOW; @@ -4886,9 +4540,9 @@ comment = " ˺ (p_ptr->spell_learned2 & (1L << spell)))) { #ifdef JP -comment = " ̤ÃÎ"; +comment = "̤ÃÎ"; #else - comment = " unknown"; + comment = "unknown"; #endif line_attr = TERM_L_BLUE; @@ -4898,9 +4552,9 @@ comment = " ̤ (p_ptr->spell_worked2 & (1L << spell)))) { #ifdef JP -comment = " ̤·Ð¸³"; +comment = "̤·Ð¸³"; #else - comment = " untried"; + comment = "untried"; #endif line_attr = TERM_L_GREEN; @@ -4910,13 +4564,13 @@ comment = " ̤ if (use_realm == REALM_HISSATSU) { strcat(out_val, format("%-25s %2d %4d", - spell_names[technic2magic(use_realm)-1][spell], /* realm, spell */ + do_spell(use_realm, spell, SPELL_NAME), /* realm, spell */ s_ptr->slevel, need_mana)); } else { - strcat(out_val, format("%-25s%c%-4s %2d %4d %3d%%%s", - spell_names[technic2magic(use_realm)-1][spell], /* realm, spell */ + strcat(out_val, format("%-25s%c%-4s %2d %4d %3d%% %s", + do_spell(use_realm, spell, SPELL_NAME), /* realm, spell */ (max ? '!' : ' '), ryakuji, s_ptr->slevel, need_mana, spell_chance(spell, use_realm), comment)); } @@ -5039,7 +4693,7 @@ bool hates_fire(object_type *o_ptr) case TV_DEATH_BOOK: case TV_TRUMP_BOOK: case TV_ARCANE_BOOK: - case TV_ENCHANT_BOOK: + case TV_CRAFT_BOOK: case TV_DAEMON_BOOK: case TV_CRUSADE_BOOK: case TV_MUSIC_BOOK: @@ -5150,8 +4804,7 @@ int inven_damage(inven_func typ, int perc) object_type *o_ptr; char o_name[MAX_NLEN]; - /* Multishadow effects is determined by turn */ - if( p_ptr->multishadow && (turn & 1) )return 0; + if (CHECK_MULTISHADOW()) return 0; if (p_ptr->inside_arena) return 0; @@ -5167,7 +4820,7 @@ int inven_damage(inven_func typ, int perc) if (!o_ptr->k_idx) continue; /* Hack -- for now, skip artifacts */ - if (artifact_p(o_ptr) || o_ptr->art_name) continue; + if (object_is_artifact(o_ptr)) continue; /* Give this item slot a shot at death */ if ((*typ)(o_ptr)) @@ -5262,7 +4915,7 @@ static int minus_ac(void) /* Nothing to damage */ if (!o_ptr->k_idx) return (FALSE); - if (o_ptr->tval <= TV_WEAPON_END) 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); @@ -5335,15 +4988,18 @@ int acid_dam(int dam, cptr kb_str, int monspell) if (p_ptr->resist_acid) dam = (dam + 2) / 3; if (double_resist) dam = (dam + 2) / 3; - if ((!(double_resist || p_ptr->resist_acid)) && - one_in_(HURT_CHANCE)) - (void)do_dec_stat(A_CHR); + if (!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; + /* If any armor gets hit, defend the player */ + if (minus_ac()) dam = (dam + 1) / 2; + } /* Take damage */ - get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell); + get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell); /* Inventory damage */ if (!(double_resist && p_ptr->resist_acid)) @@ -5378,11 +5034,11 @@ int elec_dam(int dam, cptr kb_str, int monspell) if (double_resist) dam = (dam + 2) / 3; if ((!(double_resist || p_ptr->resist_elec)) && - one_in_(HURT_CHANCE)) + one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW()) (void)do_dec_stat(A_DEX); /* Take damage */ - get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell); + get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell); /* Inventory damage */ if (!(double_resist && p_ptr->resist_elec)) @@ -5418,11 +5074,11 @@ int fire_dam(int dam, cptr kb_str, int monspell) if (double_resist) dam = (dam + 2) / 3; if ((!(double_resist || p_ptr->resist_fire)) && - one_in_(HURT_CHANCE)) + one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW()) (void)do_dec_stat(A_STR); /* Take damage */ - get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell); + get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell); /* Inventory damage */ if (!(double_resist && p_ptr->resist_fire)) @@ -5457,11 +5113,11 @@ int cold_dam(int dam, cptr kb_str, int monspell) if (double_resist) dam = (dam + 2) / 3; if ((!(double_resist || p_ptr->resist_cold)) && - one_in_(HURT_CHANCE)) + one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW()) (void)do_dec_stat(A_STR); /* Take damage */ - get_damage=take_hit(DAMAGE_ATTACK, dam, kb_str, monspell); + get_damage = take_hit(DAMAGE_ATTACK, dam, kb_str, monspell); /* Inventory damage */ if (!(double_resist && p_ptr->resist_cold)) @@ -5480,7 +5136,7 @@ bool rustproof(void) item_tester_no_ryoute = TRUE; /* Select a piece of armour */ - item_tester_hook = item_tester_hook_armour; + item_tester_hook = object_is_armour; /* Get an item */ #ifdef JP @@ -5511,7 +5167,7 @@ s = " add_flag(o_ptr->art_flags, TR_IGNORE_ACID); - if ((o_ptr->to_a < 0) && !cursed_p(o_ptr)) + if ((o_ptr->to_a < 0) && !object_is_cursed(o_ptr)) { #ifdef JP msg_format("%s¤Ï¿·ÉÊƱÍͤˤʤä¿¡ª",o_name); @@ -5561,7 +5217,7 @@ bool curse_armor(void) object_desc(o_name, o_ptr, OD_OMIT_PREFIX); /* Attempt a saving throw for artifacts */ - if ((o_ptr->art_name || artifact_p(o_ptr)) && (randint0(100) < 50)) + if (object_is_artifact(o_ptr) && (randint0(100) < 50)) { /* Cool */ #ifdef JP @@ -5642,7 +5298,7 @@ bool curse_weapon(bool force, int slot) object_desc(o_name, o_ptr, OD_OMIT_PREFIX); /* Attempt a saving throw */ - if ((artifact_p(o_ptr) || o_ptr->art_name) && (randint0(100) < 50) && !force) + if (object_is_artifact(o_ptr) && (randint0(100) < 50) && !force) { /* Cool */ #ifdef JP @@ -5718,11 +5374,11 @@ bool brand_bolts(void) if (o_ptr->tval != TV_BOLT) continue; /* Skip artifacts and ego-items */ - if (o_ptr->art_name || artifact_p(o_ptr) || ego_item_p(o_ptr)) + if (object_is_artifact(o_ptr) || object_is_ego(o_ptr)) continue; /* Skip cursed/broken items */ - if (cursed_p(o_ptr) || broken_p(o_ptr)) continue; + if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) continue; /* Randomize */ if (randint0(100) < 75) continue; @@ -5836,18 +5492,27 @@ bool polymorph_monster(int y, int x) if (new_r_idx != old_r_idx) { u32b mode = 0L; + bool preserve_hold_objects = back_m.hold_o_idx ? TRUE : FALSE; + s16b this_o_idx, next_o_idx = 0; /* Get the monsters attitude */ if (is_friendly(m_ptr)) mode |= PM_FORCE_FRIENDLY; if (is_pet(m_ptr)) mode |= PM_FORCE_PET; if (m_ptr->mflag2 & MFLAG2_NOPET) mode |= PM_NO_PET; + /* Mega-hack -- ignore held objects */ + m_ptr->hold_o_idx = 0; + /* "Kill" the "old" monster */ delete_monster_idx(c_ptr->m_idx); /* Create a new monster (no groups) */ if (place_monster_aux(0, y, x, new_r_idx, mode)) { + m_list[hack_m_idx_ii].nickname = back_m.nickname; + m_list[hack_m_idx_ii].parent_m_idx = back_m.parent_m_idx; + m_list[hack_m_idx_ii].hold_o_idx = back_m.hold_o_idx; + /* Success */ polymorphed = TRUE; } @@ -5855,7 +5520,41 @@ bool polymorph_monster(int y, int x) { /* Placing the new monster failed */ if (place_monster_aux(0, y, x, old_r_idx, (mode | PM_NO_KAGE | PM_IGNORE_TERRAIN))) + { m_list[hack_m_idx_ii] = back_m; + + /* Re-initialize monster process */ + mproc_init(); + } + else preserve_hold_objects = FALSE; + } + + /* Mega-hack -- preserve held objects */ + if (preserve_hold_objects) + { + for (this_o_idx = back_m.hold_o_idx; this_o_idx; this_o_idx = next_o_idx) + { + /* Acquire object */ + object_type *o_ptr = &o_list[this_o_idx]; + + /* Acquire next object */ + next_o_idx = o_ptr->next_o_idx; + + /* Held by new monster */ + o_ptr->held_m_idx = hack_m_idx_ii; + } + } + else if (back_m.hold_o_idx) /* Failed (paranoia) */ + { + /* Delete objects */ + for (this_o_idx = back_m.hold_o_idx; this_o_idx; this_o_idx = next_o_idx) + { + /* Acquire next object */ + next_o_idx = o_list[this_o_idx].next_o_idx; + + /* Delete the object */ + delete_object_idx(this_o_idx); + } } if (targeted) target_who = hack_m_idx_ii; @@ -5875,20 +5574,19 @@ static bool dimension_door_aux(int x, int y) p_ptr->energy_need += (s16b)((s32b)(60 - plev) * ENERGY_NEED() / 100L); - if (!cave_teleportable_bold(y, x, TELEPORT_ALLOW_DEEP | TELEPORT_ALLOW_OBJECT | TELEPORT_REQUIRE_PROJECT) || - (cave[y][x].info & CAVE_ICKY) || + if (!cave_player_teleportable_bold(y, x, 0L) || (distance(y, x, py, px) > plev / 2 + 10) || (!randint0(plev / 10 + 10))) { p_ptr->energy_need += (s16b)((s32b)(60 - plev) * ENERGY_NEED() / 100L); - teleport_player((plev+2)*2); + teleport_player((plev + 2) * 2, TELEPORT_PASSIVE); /* Failed */ return FALSE; } else { - teleport_player_to(y, x, TRUE); + teleport_player_to(y, x, 0L); /* Success */ return TRUE; @@ -5976,7 +5674,7 @@ s = " } k_ptr = &k_info[o_ptr->k_idx]; - lev = get_object_level(o_ptr); + lev = k_info[o_ptr->k_idx].level; if (o_ptr->tval == TV_ROD) { @@ -6076,7 +5774,7 @@ msg_print(" if (fail) { /* Artifacts are never destroyed. */ - if (artifact_p(o_ptr)) + if (object_is_fixed_artifact(o_ptr)) { object_desc(o_name, o_ptr, OD_NAME_ONLY); #ifdef JP