X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells3.c;h=68264b9698278114c59c1926cbf205b3fbbbc334;hb=56d92cdb7bca9a842b46ae7b0a7ba3264d50db97;hp=50eff623d95d370105caa516b1e3f6ed67e0e4f5;hpb=f17eb53044f55133f4def1ae9ce28cb42f2d280f;p=hengband%2Fhengband.git diff --git a/src/spells3.c b/src/spells3.c index 50eff623d..68264b969 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -19,7 +19,7 @@ #define HURT_CHANCE 16 -static bool cave_monster_teleportable_bold(int m_idx, int y, int x, bool passive) +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]; @@ -35,7 +35,7 @@ static bool cave_monster_teleportable_bold(int m_idx, int y, int x, bool passive if (is_glyph_grid(c_ptr)) return FALSE; if (is_explosive_rune_grid(c_ptr)) return FALSE; - if (!passive) + if (!(mode & TELEPORT_PASSIVE)) { if (!monster_can_cross_terrain(c_ptr->feat, &r_info[m_ptr->r_idx], 0)) return FALSE; } @@ -51,7 +51,7 @@ static bool cave_monster_teleportable_bold(int m_idx, int y, int x, bool passive * * But allow variation to prevent infinite loops. */ -bool teleport_away(int m_idx, int dis, bool dec_valour, bool passive) +bool teleport_away(int m_idx, int dis, u32b mode) { int oy, ox, d, i, min; int tries = 0; @@ -71,7 +71,7 @@ bool teleport_away(int m_idx, int dis, bool dec_valour, bool passive) /* 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))) { @@ -101,7 +101,7 @@ bool teleport_away(int m_idx, int dis, bool dec_valour, bool passive) /* Ignore illegal locations */ if (!in_bounds(ny, nx)) continue; - if (!cave_monster_teleportable_bold(m_idx, ny, nx, passive)) 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)) @@ -127,12 +127,12 @@ bool teleport_away(int m_idx, int dis, bool dec_valour, bool passive) /* 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; @@ -160,7 +160,7 @@ bool teleport_away(int m_idx, int dis, bool dec_valour, bool passive) /* * Teleport monster next to a grid near the given location */ -void teleport_monster_to(int m_idx, int ty, int tx, int power, bool passive) +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; @@ -206,7 +206,7 @@ void teleport_monster_to(int m_idx, int ty, int tx, int power, bool passive) /* Ignore illegal locations */ if (!in_bounds(ny, nx)) continue; - if (!cave_monster_teleportable_bold(m_idx, ny, nx, passive)) continue; + if (!cave_monster_teleportable_bold(m_idx, ny, nx, mode)) continue; /* No teleporting into vaults and such */ /* if (cave[ny][nx].info & (CAVE_ICKY)) continue; */ @@ -230,12 +230,12 @@ void teleport_monster_to(int m_idx, int ty, int tx, int power, bool passive) /* 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; @@ -254,7 +254,7 @@ void teleport_monster_to(int m_idx, int ty, int tx, int power, bool passive) } -bool cave_player_teleportable_bold(int y, int x, bool passive, bool nonmagical) +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]; @@ -263,11 +263,11 @@ bool cave_player_teleportable_bold(int y, int x, bool passive, bool nonmagical) if (!have_flag(f_ptr->flags, FF_TELEPORTABLE)) return FALSE; /* No magical teleporting into vaults and such */ - if (!nonmagical && (c_ptr->info & CAVE_ICKY)) return FALSE; + 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; - if (!passive) + if (!(mode & TELEPORT_PASSIVE)) { if (!player_can_enter(c_ptr->feat, 0)) return FALSE; @@ -301,86 +301,120 @@ bool cave_player_teleportable_bold(int y, int x, bool passive, bool nonmagical) * 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, bool passive) -{ - 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; - if (!cave_player_teleportable_bold(y, x, passive, FALSE)) continue; + /* Calculate distance */ + d = distance(py, px, y, x); - /* This grid looks good */ - look = FALSE; + /* Skip too far locations */ + if (d > dis) continue; - /* Stop looking */ - break; + /* Count the total number of candidates */ + total_candidates++; + + /* 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); @@ -389,13 +423,22 @@ msg_print(" msg_format("¡Ø¤³¤Ã¤Á¤À¤¡¡¢%s¡Ù", player_name); #endif - /* Save the old location */ - oy = py; - ox = px; - /* Move the player */ (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP); + return TRUE; +} + +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++) { @@ -404,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]; @@ -416,7 +459,7 @@ msg_print(" if ((r_ptr->flags6 & RF6_TPORT) && !(r_ptr->flagsr & RFR_RES_TELE)) { - if (!m_ptr->csleep) teleport_monster_to(tmp_m_idx, y, x, r_ptr->level, FALSE); + if (!MON_CSLEEP(m_ptr)) teleport_monster_to(tmp_m_idx, py, px, r_ptr->level, 0L); } } } @@ -424,6 +467,43 @@ msg_print(" } +void teleport_player_away(int m_idx, int dis) +{ + int yy, xx; + + /* Save the old location */ + int oy = py; + int ox = px; + + if (!teleport_player_aux(dis, TELEPORT_PASSIVE)) return; + + /* 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; + + /* 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]; + + /* + * 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 @@ -431,11 +511,11 @@ msg_print(" * This function is slightly obsessive about correctness. * This function allows teleporting into vaults (!) */ -void teleport_player_to(int ny, int nx, bool no_tele, bool passive) +void teleport_player_to(int ny, int nx, u32b mode) { 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("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª"); @@ -458,10 +538,10 @@ void teleport_player_to(int ny, int nx, bool no_tele, bool passive) } /* Accept any grid when wizard mode */ - if (p_ptr->wizard && (!cave[y][x].m_idx || (cave[y][x].m_idx == p_ptr->riding))) break; + 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, passive, !no_tele)) break; + if (cave_player_teleportable_bold(y, x, mode)) break; /* Occasionally advance the distance */ if (++ctr > (4 * dis * dis + 4 * dis + 1)) @@ -479,6 +559,66 @@ void teleport_player_to(int ny, int nx, bool no_tele, bool passive) } +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; + + teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L); + + if (old_ml && (old_cdis <= MAX_SIGHT) && !world_monster && !p_ptr->inside_battle && los(py, px, oldfy, oldfx)) + { + bool follow = FALSE; + + 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; + + 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; + } + } + } + } + + 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) @@ -654,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); } @@ -1064,13 +1212,13 @@ void apply_nexus(monster_type *m_ptr) { case 1: case 2: case 3: { - teleport_player(200, TRUE); + teleport_player(200, TELEPORT_PASSIVE); break; } case 4: case 5: { - teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE, TRUE); + teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_PASSIVE); break; } @@ -1255,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 { @@ -1485,13 +1636,13 @@ 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 (is_seen(m_ptr)) + if (m_ptr->ml) { /* Acquire the monster name */ monster_desc(m_name, m_ptr, 0); @@ -1503,13 +1654,6 @@ static bool vanish_dungeon(void) msg_format("%^s wakes up.", m_name); #endif } - - if (m_ptr->ml) - { - /* 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); - } } /* Process all walls, doors and patterns */ @@ -1902,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); @@ -1929,7 +2073,7 @@ 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; @@ -1965,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); @@ -2694,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 = 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 @@ -2868,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 = 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); @@ -2940,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)); @@ -3912,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) @@ -4198,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%ld", 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) */ @@ -4649,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; @@ -4663,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; @@ -4673,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; @@ -4684,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; @@ -4696,9 +4528,9 @@ comment = " ̤ ((p_ptr->spell_forgotten2 & (1L << spell)))) { #ifdef JP -comment = " ˺µÑ"; +comment = "˺µÑ"; #else - comment = " forgotten"; + comment = "forgotten"; #endif line_attr = TERM_YELLOW; @@ -4708,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; @@ -4720,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; @@ -4732,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)); } @@ -4861,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: @@ -4972,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; @@ -5157,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)) @@ -5200,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)) @@ -5240,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)) @@ -5279,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)) @@ -5658,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; } @@ -5677,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; @@ -5697,19 +5574,19 @@ static bool dimension_door_aux(int x, int y) p_ptr->energy_need += (s16b)((s32b)(60 - plev) * ENERGY_NEED() / 100L); - if (!cave_player_teleportable_bold(y, x, FALSE, FALSE) || + 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, TRUE); + teleport_player((plev + 2) * 2, TELEPORT_PASSIVE); /* Failed */ return FALSE; } else { - teleport_player_to(y, x, TRUE, FALSE); + teleport_player_to(y, x, 0L); /* Success */ return TRUE;