X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fdungeon.c;h=484acab3c8d21c27185fce4e59ff60001013ceed;hb=45ca5a591afb758d4d5617b7d4cf73fc540d9fb7;hp=de232138c093829c850d5916e422e59b96a1b4d7;hpb=a656ac86e352cdd459723556edb7f8c8f708308d;p=hengband%2Fhengband.git diff --git a/src/dungeon.c b/src/dungeon.c index de232138c..484acab3c 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -24,30 +24,30 @@ static int wild_regen = 20; static byte value_check_aux1(object_type *o_ptr) { /* Artifacts */ - if (artifact_p(o_ptr) || o_ptr->art_name) + if (object_is_artifact(o_ptr)) { /* Cursed/Broken */ - if (cursed_p(o_ptr) || broken_p(o_ptr)) return FEEL_TERRIBLE; + if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE; /* Normal */ return FEEL_SPECIAL; } /* Ego-Items */ - if (ego_item_p(o_ptr)) + if (object_is_ego(o_ptr)) { /* Cursed/Broken */ - if (cursed_p(o_ptr) || broken_p(o_ptr)) return FEEL_WORTHLESS; + if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS; /* Normal */ return FEEL_EXCELLENT; } /* Cursed items */ - if (cursed_p(o_ptr)) return FEEL_CURSED; + if (object_is_cursed(o_ptr)) return FEEL_CURSED; /* Broken items */ - if (broken_p(o_ptr)) return FEEL_BROKEN; + if (object_is_broken(o_ptr)) return FEEL_BROKEN; if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE; @@ -68,16 +68,16 @@ static byte value_check_aux1(object_type *o_ptr) static byte value_check_aux2(object_type *o_ptr) { /* Cursed items (all of them) */ - if (cursed_p(o_ptr)) return FEEL_CURSED; + if (object_is_cursed(o_ptr)) return FEEL_CURSED; /* Broken items (all of them) */ - if (broken_p(o_ptr)) return FEEL_BROKEN; + if (object_is_broken(o_ptr)) return FEEL_BROKEN; /* Artifacts -- except cursed/broken ones */ - if (artifact_p(o_ptr) || o_ptr->art_name) return FEEL_UNCURSED; + if (object_is_artifact(o_ptr)) return FEEL_UNCURSED; /* Ego-Items -- except cursed/broken ones */ - if (ego_item_p(o_ptr)) return FEEL_UNCURSED; + if (object_is_ego(o_ptr)) return FEEL_UNCURSED; /* Good armor bonus */ if (o_ptr->to_a > 0) return FEEL_UNCURSED; @@ -101,7 +101,7 @@ static void sense_inventory_aux(int slot, bool heavy) if (o_ptr->ident & (IDENT_SENSE))return; /* It is fully known, no information needed */ - if (object_known_p(o_ptr)) return; + if (object_is_known(o_ptr)) return; /* Check for a feeling */ feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr)); @@ -313,6 +313,7 @@ static void sense_inventory1(void) } case CLASS_PALADIN: + case CLASS_SNIPER: { /* Bad sensing */ if (0 != randint0(77777L / (plev * plev + 40))) return; @@ -476,6 +477,7 @@ static void sense_inventory2(void) case CLASS_SAMURAI: case CLASS_CAVALRY: case CLASS_BERSERKER: + case CLASS_SNIPER: { return; } @@ -639,9 +641,8 @@ static void pattern_teleport(void) #else else if (get_check("Normal teleport? ")) #endif - { - teleport_player(200); + teleport_player(200, 0L); return; } else @@ -689,7 +690,7 @@ static void pattern_teleport(void) static void wreck_the_pattern(void) { int to_ruin = 0, r_y, r_x; - int pattern_type = f_info[cave[py][px].feat].power; + int pattern_type = f_info[cave[py][px].feat].subtype; if (pattern_type == PATTERN_TILE_WRECKED) { @@ -719,13 +720,13 @@ static void wreck_the_pattern(void) scatter(&r_y, &r_x, py, px, 4, 0); if (pattern_tile(r_y, r_x) && - (f_info[cave[r_y][r_x].feat].power != PATTERN_TILE_WRECKED)) + (f_info[cave[r_y][r_x].feat].subtype != PATTERN_TILE_WRECKED)) { - cave_set_feat(r_y, r_x, FEAT_PATTERN_XTRA2); + cave_set_feat(r_y, r_x, feat_pattern_corrupted); } } - cave_set_feat(py, px, FEAT_PATTERN_XTRA2); + cave_set_feat(py, px, feat_pattern_corrupted); } @@ -742,7 +743,7 @@ static bool pattern_effect(void) wreck_the_pattern(); } - pattern_type = f_info[cave[py][px].feat].power; + pattern_type = f_info[cave[py][px].feat].subtype; switch (pattern_type) { @@ -762,7 +763,7 @@ static bool pattern_effect(void) (void)restore_level(); (void)hp_player(1000); - cave_set_feat(py, px, FEAT_PATTERN_OLD); + cave_set_feat(py, px, feat_pattern_old); #ifdef JP msg_print("¡Ö¥Ñ¥¿¡¼¥ó¡×¤Î¤³¤ÎÉôʬ¤Ï¾¤ÎÉôʬ¤è¤ê¶¯ÎϤǤʤ¤¤è¤¦¤À¡£"); @@ -829,10 +830,18 @@ static void regenhp(int percent) /* Save the old hitpoints */ old_chp = p_ptr->chp; - /* Extract the new hitpoints */ + /* + * Extract the new hitpoints + * + * 'percent' is the Regen factor in unit (1/2^16) + */ new_chp = 0; - new_chp_frac = (p_ptr->mhp * percent + PY_REGEN_HPBASE) << 16; + new_chp_frac = (p_ptr->mhp * percent + PY_REGEN_HPBASE); + + /* Convert the unit (1/2^16) to (1/2^32) */ + s64b_LSHIFT(new_chp, new_chp_frac, 16); + /* Regenerating */ s64b_add(&(p_ptr->chp), &(p_ptr->chp_frac), new_chp, new_chp_frac); @@ -859,7 +868,6 @@ static void regenhp(int percent) /* * Regenerate mana points - * Get ((new_mana) / 2^32) mana point once called. */ static void regenmana(int percent) { @@ -871,10 +879,15 @@ static void regenmana(int percent) */ if (p_ptr->csp > p_ptr->msp) { - u32b decay_frac = (p_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE) << 16; + /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */ + s32b decay = 0; + u32b decay_frac = (p_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE); + + /* Convert the unit (1/2^16) to (1/2^32) */ + s64b_LSHIFT(decay, decay_frac, 16); /* Decay */ - s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), 0, decay_frac); + s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), decay, decay_frac); /* Stop decaying */ if (p_ptr->csp < p_ptr->msp) @@ -884,13 +897,18 @@ static void regenmana(int percent) } } - /* Regerating mana (unless the player has excess mana) */ + /* Regenerating mana (unless the player has excess mana) */ else if (percent > 0) { - u32b new_mana_frac = (p_ptr->msp * percent / 100 + PY_REGEN_MNBASE) << 16; + /* (percent/100) is the Regen factor in unit (1/2^16) */ + s32b new_mana = 0; + u32b new_mana_frac = (p_ptr->msp * percent / 100 + PY_REGEN_MNBASE); + + /* Convert the unit (1/2^16) to (1/2^32) */ + s64b_LSHIFT(new_mana, new_mana_frac, 16); /* Regenerate */ - s64b_add(&(p_ptr->csp), &(p_ptr->csp_frac), 0, new_mana_frac); + s64b_add(&(p_ptr->csp), &(p_ptr->csp_frac), new_mana, new_mana_frac); /* Must set frac to zero even if equal */ if (p_ptr->csp >= p_ptr->msp) @@ -904,12 +922,17 @@ static void regenmana(int percent) /* Reduce mana (even when the player has excess mana) */ if (percent < 0) { - u32b reduce_mana_frac = (p_ptr->msp * PY_REGEN_NORMAL + PY_REGEN_MNBASE) << 16; + /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */ + s32b reduce_mana = 0; + u32b reduce_mana_frac = (p_ptr->msp * PY_REGEN_NORMAL + PY_REGEN_MNBASE); + + /* Convert the unit (1/2^16) to (1/2^32) */ + s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16); /* Reduce mana */ - s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), 0, reduce_mana_frac); + s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), reduce_mana, reduce_mana_frac); - /* check for overflow */ + /* Check overflow */ if (p_ptr->csp < 0) { p_ptr->csp = 0; @@ -949,7 +972,7 @@ static void regenmagic(int percent) new_mana = ((long)p_ptr->magic_num2[i]+adj_mag_mana[A_INT]+13) * percent / 8; p_ptr->magic_num1[i] += new_mana; - /* Must set frac to zero even if equal */ + /* Check maximum charge */ if (p_ptr->magic_num1[i] > (p_ptr->magic_num2[i] << 16)) { p_ptr->magic_num1[i] = ((long)p_ptr->magic_num2[i] << 16); @@ -1075,354 +1098,6 @@ static void regen_captured_monsters(void) } -/* - * Process the counters of monsters (once per 10 game turns) - * - * This function is to process monsters' counters same as player's. - */ -static void process_monsters_counters(void) -{ - int m_idx; - monster_type *m_ptr; - monster_race *r_ptr; - - u32b noise; /* Hack -- local "player stealth" value */ - - /* Handle "leaving" */ - if (p_ptr->leaving) return; - - /* Hack -- calculate the "player noise" */ - noise = (1L << (30 - p_ptr->skill_stl)); - - /* Process the monsters (backwards) */ - for (m_idx = m_max - 1; m_idx >= 1; m_idx--) - { - /* Access the monster */ - m_ptr = &m_list[m_idx]; - r_ptr = &r_info[m_ptr->r_idx]; - - /* Ignore "dead" monsters */ - if (!m_ptr->r_idx) continue; - - /* Handle Invulnerability */ - if (m_ptr->invulner) - { - /* Reduce by one, note if expires */ - m_ptr->invulner--; - - if (!m_ptr->invulner) - { - if (m_ptr->ml) - { - char m_name[80]; - - /* Acquire the monster name */ - monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ -#ifdef JP - msg_format("%^s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ê¤¤¡£", m_name); -#else - msg_format("%^s is no longer invulnerable.", m_name); -#endif - - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); - } - if (!p_ptr->wild_mode) m_ptr->energy_need += ENERGY_NEED(); - } - } - - /* Handle fast */ - if (m_ptr->fast) - { - /* Reduce by one, note if expires */ - m_ptr->fast--; - - if (!m_ptr->fast && m_ptr->ml) - { - char m_name[80]; - - /* Acquire the monster name */ - monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ -#ifdef JP - msg_format("%^s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name); -#else - msg_format("%^s is no longer fast.", m_name); -#endif - - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) - { - p_ptr->redraw |= (PR_UHEALTH); - p_ptr->update |= (PU_BONUS); - } - } - } - - /* Handle slow */ - if (m_ptr->slow) - { - /* Reduce by one, note if expires */ - m_ptr->slow--; - - if (!m_ptr->slow && m_ptr->ml) - { - char m_name[80]; - - /* Acquire the monster name */ - monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ -#ifdef JP - msg_format("%^s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name); -#else - msg_format("%^s is no longer slow.", m_name); -#endif - - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) - { - p_ptr->redraw |= (PR_UHEALTH); - p_ptr->update |= (PU_BONUS); - } - } - } - - /* Handle "sleep" */ - if (m_ptr->csleep) - { - /* Assume does not wake up */ - bool test = FALSE; - - /* Hack -- Require proximity */ - if (m_ptr->cdis < AAF_LIMIT) - { - /* Handle "sensing radius" */ - if (m_ptr->cdis <= (is_pet(m_ptr) ? ((r_ptr->aaf > MAX_SIGHT) ? MAX_SIGHT : r_ptr->aaf) : r_ptr->aaf)) - { - /* We may wake up */ - test = TRUE; - } - - /* Handle "sight" and "aggravation" */ - else if ((m_ptr->cdis <= MAX_SIGHT) && (player_has_los_bold(m_ptr->fy, m_ptr->fx))) - { - /* We may wake up */ - test = TRUE; - } - } - - if (test) - { - u32b notice = randint0(1024); - - /* Nightmare monsters are more alert */ - if (ironman_nightmare) notice /= 2; - - /* Hack -- See if monster "notices" player */ - if ((notice * notice * notice) <= noise) - { - /* Hack -- amount of "waking" */ - /* Wake up faster near the player */ - int d = (m_ptr->cdis < AAF_LIMIT / 2) ? (AAF_LIMIT / m_ptr->cdis) : 1; - - /* Hack -- amount of "waking" is affected by speed of player */ - d = (d * SPEED_TO_ENERGY(p_ptr->pspeed)) / 10; - if (d < 0) d = 1; - - /* Still asleep */ - if (m_ptr->csleep > d) - { - /* Monster wakes up "a little bit" */ - m_ptr->csleep -= d; - - /* Notice the "not waking up" */ - if (m_ptr->ml) - { - /* Hack -- Count the ignores */ - if (r_ptr->r_ignore < MAX_UCHAR) - { - r_ptr->r_ignore++; - } - } - } - - /* Just woke up */ - else - { - /* Reset sleep counter */ - m_ptr->csleep = 0; - - if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); - - /* Notice the "waking up" */ - if (m_ptr->ml) - { - char m_name[80]; - - /* Acquire the monster name */ - monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ -#ifdef JP - msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name); -#else - msg_format("%^s wakes up.", m_name); -#endif - - /* Redraw the health bar */ - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); - - /* Hack -- Count the wakings */ - if (r_ptr->r_wake < MAX_UCHAR) - { - r_ptr->r_wake++; - } - } - } - } - } - } - - /* Handle "stun" */ - if (m_ptr->stunned) - { - int d = 1; - - /* Make a "saving throw" against stun */ - if (randint0(10000) <= r_ptr->level * r_ptr->level) - { - /* Recover fully */ - d = m_ptr->stunned; - } - - /* Hack -- Recover from stun */ - if (m_ptr->stunned > d) - { - /* Recover somewhat */ - m_ptr->stunned -= d; - } - - /* Fully recover */ - else - { - /* Recover fully */ - m_ptr->stunned = 0; - - /* Message if visible */ - if (m_ptr->ml) - { - char m_name[80]; - - /* Acquire the monster name */ - monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ -#ifdef JP - msg_format("%^s¤ÏÛ¯Û°¾õÂÖ¤«¤éΩ¤Áľ¤Ã¤¿¡£", m_name); -#else - msg_format("%^s is no longer stunned.", m_name); -#endif - - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); - } - } - } - - /* Handle confusion */ - if (m_ptr->confused) - { - /* Amount of "boldness" */ - int d = randint1(r_ptr->level / 20 + 1); - - /* Still confused */ - if (m_ptr->confused > d) - { - /* Reduce the confusion */ - m_ptr->confused -= d; - } - - /* Recovered */ - else - { - /* No longer confused */ - m_ptr->confused = 0; - - /* Message if visible */ - if (m_ptr->ml) - { - char m_name[80]; - - /* Acquire the monster name */ - monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ -#ifdef JP - msg_format("%^s¤Ïº®Í𤫤éΩ¤Áľ¤Ã¤¿¡£", m_name); -#else - msg_format("%^s is no longer confused.", m_name); -#endif - - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); - } - } - } - - /* Handle "fear" */ - if (m_ptr->monfear) - { - /* Amount of "boldness" */ - int d = randint1(r_ptr->level / 20 + 1); - - /* Still afraid */ - if (m_ptr->monfear > d) - { - /* Reduce the fear */ - m_ptr->monfear -= d; - } - - /* Recover from fear, take note if seen */ - else - { - /* No longer afraid */ - m_ptr->monfear = 0; - - /* Visual note */ - if (m_ptr->ml) - { - char m_name[80]; -#ifndef JP - char m_poss[80]; - - /* Acquire the monster possessive */ - monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE); -#endif - - /* Acquire the monster name */ - monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ -#ifdef JP - msg_format("%^s¤Ïͦµ¤¤ò¼è¤êÌᤷ¤¿¡£", m_name); -#else - msg_format("%^s recovers %s courage.", m_name, m_poss); -#endif - - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); - } - } - } - } -} - - static void notice_lite_change(object_type *o_ptr) { /* Hack -- notice interesting fuel steps */ @@ -1559,7 +1234,7 @@ s = "Ä´ } /* It is fully known, no information needed */ - if (object_known_p(o_ptr)) + if (object_is_known(o_ptr)) { #ifdef JP msg_print("²¿¤â¿·¤·¤¤¤³¤È¤ÏȽ¤é¤Ê¤«¤Ã¤¿¡£"); @@ -1604,6 +1279,9 @@ msg_format("%s /* "Inscribe" it */ o_ptr->feeling = feel; + /* Player touches it */ + o_ptr->marked |= OM_TOUCHED; + /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); @@ -1647,102 +1325,6 @@ msg_format("%s } -static void gere_music(s32b music) -{ - switch(music) - { - case MUSIC_SLOW: - slow_monsters(); - break; - case MUSIC_STUN: - stun_monsters(damroll(p_ptr->lev/10,2)); - break; - case MUSIC_L_LIFE: - hp_player(damroll(2,6)); - break; - case MUSIC_FEAR: - project_hack(GF_TURN_ALL, p_ptr->lev); - break; - case MUSIC_PSI: - project_hack(GF_PSI, randint1(p_ptr->lev * 3 / 2)); - break; - case MUSIC_ID: - project(0, 1, py, px, 0, GF_IDENTIFY, PROJECT_ITEM, -1); - break; - case MUSIC_CONF: - confuse_monsters(p_ptr->lev * 2); - break; - case MUSIC_SOUND: - project_hack(GF_SOUND, damroll(10 + p_ptr->lev/5,7)); - break; - case MUSIC_CHARM: - charm_monsters(damroll(10 + p_ptr->lev/15,6)); - break; - case MUSIC_WALL: - project(0, 0, py, px, - 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1); - break; - case MUSIC_DISPEL: - dispel_monsters(randint1(p_ptr->lev * 3)); - dispel_evil(randint1(p_ptr->lev * 3)); - break; - case MUSIC_SARUMAN: - slow_monsters(); - sleep_monsters(); - break; - case MUSIC_QUAKE: - earthquake(py, px, 10); - break; - case MUSIC_STASIS: - stasis_monsters(p_ptr->lev * 4); - break; - case MUSIC_SHERO: - dispel_monsters(randint1(p_ptr->lev * 3)); - break; - case MUSIC_H_LIFE: - hp_player(damroll(15,10)); - set_stun(0); - set_cut(0); - break; - case MUSIC_DETECT+19: - wiz_lite(FALSE); - case MUSIC_DETECT+11: - case MUSIC_DETECT+12: - case MUSIC_DETECT+13: - case MUSIC_DETECT+14: - case MUSIC_DETECT+15: - case MUSIC_DETECT+16: - case MUSIC_DETECT+17: - case MUSIC_DETECT+18: - map_area(DETECT_RAD_MAP); - if ((p_ptr->lev > 39) && (music < MUSIC_DETECT+19)) p_ptr->magic_num1[0] = music+1; - case MUSIC_DETECT+6: - case MUSIC_DETECT+7: - case MUSIC_DETECT+8: - case MUSIC_DETECT+9: - case MUSIC_DETECT+10: - /* There are too many hidden treasure. So... */ - /* detect_treasure(DETECT_RAD_DEFAULT); */ - detect_objects_gold(DETECT_RAD_DEFAULT); - detect_objects_normal(DETECT_RAD_DEFAULT); - if ((p_ptr->lev > 24) && (music < MUSIC_DETECT+11)) p_ptr->magic_num1[0] = music+1; - case MUSIC_DETECT+3: - case MUSIC_DETECT+4: - case MUSIC_DETECT+5: - detect_monsters_invis(DETECT_RAD_DEFAULT); - detect_monsters_normal(DETECT_RAD_DEFAULT); - if ((p_ptr->lev > 19) && (music < MUSIC_DETECT+6)) p_ptr->magic_num1[0] = music+1; - case MUSIC_DETECT: - case MUSIC_DETECT+1: - case MUSIC_DETECT+2: - detect_traps(DETECT_RAD_DEFAULT, TRUE); - detect_doors(DETECT_RAD_DEFAULT); - detect_stairs(DETECT_RAD_DEFAULT); - if ((p_ptr->lev > 14) && (music < MUSIC_DETECT+3)) p_ptr->magic_num1[0] = music+1; - break; - } -} - /* * If player has inscribed the object with "!!", let him know when it's * recharged. -LM- @@ -1813,7 +1395,8 @@ static void check_music(void) need_mana = mod_need_mana(s_ptr->smana, spell, REALM_MUSIC); need_mana_frac = 0; - s64b_RSHIFT(need_mana, need_mana_frac); + /* Divide by 2 */ + s64b_RSHIFT(need_mana, need_mana_frac, 1); if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, need_mana, need_mana_frac) < 0) { @@ -1858,7 +1441,8 @@ static void check_music(void) else if(p_ptr->spell_exp[spell] < SPELL_EXP_MASTER) { if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; } - gere_music(p_ptr->magic_num1[0]); + /* Do any effects of continual song */ + do_spell(REALM_MUSIC, spell, SPELL_CONT); } @@ -2030,7 +1614,7 @@ sprintf(ouch, "%s { damage = 6000 + randint0(4000); } - else if (!p_ptr->ffall) + else if (!p_ptr->levitation) { damage = 3000 + randint0(2000); } @@ -2041,11 +1625,11 @@ sprintf(ouch, "%s if (p_ptr->resist_fire) damage = damage / 3; if (IS_OPPOSE_FIRE()) damage = damage / 3; - if (p_ptr->ffall) damage = damage / 5; + if (p_ptr->levitation) damage = damage / 5; damage = damage / 100 + (randint0(100) < (damage % 100)); - if (p_ptr->ffall) + if (p_ptr->levitation) { #ifdef JP msg_print("Ç®¤Ç²Ð½ý¤·¤¿¡ª"); @@ -2071,9 +1655,9 @@ sprintf(ouch, "%s } if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) && - !p_ptr->ffall && !p_ptr->can_swim) + !p_ptr->levitation && !p_ptr->can_swim) { - if (p_ptr->total_weight > (((u32b)adj_str_wgt[p_ptr->stat_ind[A_STR]] * (p_ptr->pclass == CLASS_BERSERKER ? 150 : 100)) / 2)) + if (p_ptr->total_weight > weight_limit()) { /* Take damage */ #ifdef JP @@ -2361,9 +1945,9 @@ static void process_world_aux_timeout(void) } /* Timed levitation */ - if (p_ptr->tim_ffall) + if (p_ptr->tim_levitation) { - (void)set_tim_ffall(p_ptr->tim_ffall - 1, TRUE); + (void)set_tim_levitation(p_ptr->tim_levitation - 1, TRUE); } /* Timed sh_touki */ @@ -2609,7 +2193,7 @@ static void process_world_aux_light(void) if (o_ptr->tval == TV_LITE) { /* Hack -- Use some fuel (except on artifacts) */ - if (!(artifact_p(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0)) + if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0)) { /* Decrease life-span */ if (o_ptr->name2 == EGO_LITE_LONG) @@ -2652,6 +2236,7 @@ static void process_world_aux_mutation(void) #endif (void)set_shero(10 + randint1(p_ptr->lev), FALSE); + (void)set_afraid(0); } if ((p_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13)) @@ -2684,7 +2269,7 @@ static void process_world_aux_mutation(void) #endif msg_print(NULL); - teleport_player(40); + teleport_player(40, TELEPORT_PASSIVE); } } @@ -2714,7 +2299,7 @@ static void process_world_aux_mutation(void) msg_print(NULL); if (one_in_(3)) lose_all_info(); else wiz_dark(); - teleport_player(100); + (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE); wiz_dark(); #ifdef JP msg_print("¤¢¤Ê¤¿¤Ï¸«ÃΤé¤Ì¾ì½ê¤ÇÌܤ¬Àä᤿...Ƭ¤¬Äˤ¤¡£"); @@ -2899,7 +2484,7 @@ static void process_world_aux_mutation(void) if (o_ptr->tval == TV_LITE) { /* Use some fuel (except on artifacts) */ - if (!artifact_p(o_ptr) && (o_ptr->xtra4 > 0)) + if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0)) { /* Heal the player a bit */ hp_player(o_ptr->xtra4 / 20); @@ -3090,6 +2675,8 @@ static void process_world_aux_mutation(void) msg_print(NULL); set_food(PY_FOOD_WEAK); + if (music_singing_any()) stop_singing(); + if (hex_spelling_any()) stop_hex_spell_all(); } if ((p_ptr->muta2 & MUT2_WALK_SHAD) && @@ -3221,7 +2808,8 @@ static void process_world_aux_mutation(void) } if ((p_ptr->muta2 & MUT2_DISARM) && one_in_(10000)) { - object_type *o_ptr; + int slot = 0; + object_type *o_ptr = NULL; disturb(0, 0); #ifdef JP @@ -3232,27 +2820,32 @@ static void process_world_aux_mutation(void) take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), "tripping", -1); #endif - msg_print(NULL); if (buki_motteruka(INVEN_RARM)) { - int slot = INVEN_RARM; + slot = INVEN_RARM; o_ptr = &inventory[INVEN_RARM]; + if (buki_motteruka(INVEN_LARM) && one_in_(2)) { o_ptr = &inventory[INVEN_LARM]; slot = INVEN_LARM; } - if (!cursed_p(o_ptr)) - { + } + else if (buki_motteruka(INVEN_LARM)) + { + o_ptr = &inventory[INVEN_LARM]; + slot = INVEN_LARM; + } + + if (slot && !object_is_cursed(o_ptr)) + { #ifdef JP - msg_print("Éð´ï¤òÍ¤Æ¤·¤Þ¤Ã¤¿¡ª"); + msg_print("Éð´ï¤òÍî¤È¤·¤Æ¤·¤Þ¤Ã¤¿¡ª"); #else - msg_print("You drop your weapon!"); + msg_print("You drop your weapon!"); #endif - - inven_drop(slot, 1); - } + inven_drop(slot, 1); } } } @@ -3273,23 +2866,32 @@ static void process_world_aux_curse(void) { char o_name[MAX_NLEN]; object_type *o_ptr; - int i; + int i, i_keep = 0, count = 0; /* Scan the equipment with random teleport ability */ for (i = INVEN_RARM; i < INVEN_TOTAL; i++) { u32b flgs[TR_FLAG_SIZE]; o_ptr = &inventory[i]; - + /* Skip non-objects */ if (!o_ptr->k_idx) continue; - + /* Extract the item flags */ object_flags(o_ptr, flgs); - - if (have_flag(flgs, TR_TELEPORT)) break; + + if (have_flag(flgs, TR_TELEPORT)) + { + /* {.} will stop random teleportation. */ + if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.')) + { + count++; + if (one_in_(count)) i_keep = i; + } + } } + o_ptr = &inventory[i_keep]; object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); #ifdef JP @@ -3305,7 +2907,7 @@ static void process_world_aux_curse(void) #endif { disturb(0, 0); - teleport_player(50); + teleport_player(50, 0L); } else { @@ -3472,7 +3074,7 @@ static void process_world_aux_curse(void) disturb(0, 0); /* Teleport player */ - teleport_player(40); + teleport_player(40, TELEPORT_PASSIVE); } /* Handle HP draining */ if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666)) @@ -3488,7 +3090,7 @@ static void process_world_aux_curse(void) take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev*2, 100), o_name, -1); } /* Handle mana draining */ - if ((p_ptr->cursed & TRC_DRAIN_MANA) && one_in_(666)) + if ((p_ptr->cursed & TRC_DRAIN_MANA) && p_ptr->csp && one_in_(666)) { char o_name[MAX_NLEN]; @@ -3516,13 +3118,13 @@ static void process_world_aux_curse(void) if (o_ptr->name1 == ART_JUDGE) { #ifdef JP - if (object_known_p(o_ptr)) + if (object_is_known(o_ptr)) msg_print("¡Ø¿³È½¤ÎÊõÀС٤Ϥ¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª"); else msg_print("¤Ê¤Ë¤«¤¬¤¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª"); take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "¿³È½¤ÎÊõÀÐ", -1); #else - if (object_known_p(o_ptr)) + if (object_is_known(o_ptr)) msg_print("The Jewel of Judgement drains life from you!"); else msg_print("Something drains life from you!"); @@ -3680,7 +3282,7 @@ msg_print(" msg_print("You feel yourself yanked upwards!"); #endif - p_ptr->recall_dungeon = dungeon_type; + if (dungeon_type) p_ptr->recall_dungeon = dungeon_type; if (record_stair) do_cmd_write_nikki(NIKKI_RECALL, dun_level, NULL); @@ -3782,39 +3384,279 @@ msg_print(" /* Count down towards alter */ p_ptr->alter_reality--; - p_ptr->redraw |= (PR_STATUS); + p_ptr->redraw |= (PR_STATUS); + + /* Activate the alter reality */ + if (!p_ptr->alter_reality) + { + /* Disturbing! */ + disturb(0, 0); + + /* Determine the level */ + if (!quest_number(dun_level) && dun_level) + { +#ifdef JP + msg_print("À¤³¦¤¬ÊѤï¤Ã¤¿¡ª"); +#else + msg_print("The world changes!"); +#endif + + /* + * Clear all saved floors + * and create a first saved floor + */ + prepare_change_floor_mode(CFM_FIRST_FLOOR); + + /* Leaving */ + p_ptr->leaving = TRUE; + } + else + { +#ifdef JP + msg_print("À¤³¦¤¬¾¯¤·¤Î´ÖÊѲ½¤·¤¿¤è¤¦¤À¡£"); +#else + msg_print("The world seems to change for a moment!"); +#endif + } + + /* Sound */ + sound(SOUND_TPLEVEL); + } + } +} + + +/* + * Count number of adjacent monsters + */ +static int get_monster_crowd_number(int m_idx) +{ + monster_type *m_ptr = &m_list[m_idx]; + int my = m_ptr->fy; + int mx = m_ptr->fx; + int i; + int count = 0; + + for (i = 0; i < 7; i++) + { + int ay = my + ddy_ddd[i]; + int ax = mx + ddx_ddd[i]; + + if (!in_bounds(ay, ax)) continue; + + /* Count number of monsters */ + if (cave[ay][ax].m_idx > 0) count++; + } + + return count; +} + + + +/* + * Dungeon rating is no longer linear + */ +#define RATING_BOOST(delta) (delta * delta + 50 * delta) + +/* + * Examine all monsters and unidentified objects, + * and get the feeling of current dungeon floor + */ +static byte get_dungeon_feeling(void) +{ + const int base = 10; + int rating = 0; + int i; + + /* Hack -- no feeling in the town */ + if (!dun_level) return 0; + + /* Examine each monster */ + for (i = 1; i < m_max; i++) + { + monster_type *m_ptr = &m_list[i]; + monster_race *r_ptr; + int delta = 0; + + /* Skip dead monsters */ + if (!m_ptr->r_idx) continue; + + /* Ignore pet */ + if (is_pet(m_ptr)) continue; + + r_ptr = &r_info[m_ptr->r_idx]; + + /* Unique monsters */ + if (r_ptr->flags1 & (RF1_UNIQUE)) + { + /* Nearly out-of-depth unique monsters */ + if (r_ptr->level + 10 > dun_level) + { + /* Boost rating by twice delta-depth */ + delta += (r_ptr->level + 10 - dun_level) * 2 * base; + } + } + else + { + /* Out-of-depth monsters */ + if (r_ptr->level > dun_level) + { + /* Boost rating by delta-depth */ + delta += (r_ptr->level - dun_level) * base; + } + } + + /* Unusually crowded monsters get a little bit of rating boost */ + if (r_ptr->flags1 & RF1_FRIENDS) + { + if (5 <= get_monster_crowd_number(i)) delta += 1; + } + else + { + if (2 <= get_monster_crowd_number(i)) delta += 1; + } + + + rating += RATING_BOOST(delta); + } + + /* Examine each unidentified object */ + for (i = 1; i < o_max; i++) + { + object_type *o_ptr = &o_list[i]; + object_kind *k_ptr = &k_info[o_ptr->k_idx]; + int delta = 0; + + /* Skip dead objects */ + if (!o_ptr->k_idx) continue; + + /* Skip known objects */ + if (object_is_known(o_ptr)) + { + /* Touched? */ + if (o_ptr->marked & OM_TOUCHED) continue; + } + + /* Skip pseudo-known objects */ + if (o_ptr->ident & IDENT_SENSE) continue; + + /* Ego objects */ + if (object_is_ego(o_ptr)) + { + ego_item_type *e_ptr = &e_info[o_ptr->name2]; + + delta += e_ptr->rating * base; + } + + /* Artifacts */ + if (object_is_artifact(o_ptr)) + { + s32b cost = object_value_real(o_ptr); + + delta += 10 * base; + if (cost > 10000L) delta += 10 * base; + if (cost > 50000L) delta += 10 * base; + if (cost > 100000L) delta += 10 * base; + + /* Special feeling */ + if (!preserve_mode) return 1; + } + + if (o_ptr->tval == TV_DRAG_ARMOR) delta += 30 * base; + if (o_ptr->tval == TV_SHIELD && + o_ptr->sval == SV_DRAGON_SHIELD) delta += 5 * base; + if (o_ptr->tval == TV_GLOVES && + o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) delta += 5 * base; + if (o_ptr->tval == TV_BOOTS && + o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) delta += 5 * base; + if (o_ptr->tval == TV_HELM && + o_ptr->sval == SV_DRAGON_HELM) delta += 5 * base; + if (o_ptr->tval == TV_RING && + o_ptr->sval == SV_RING_SPEED && + !object_is_cursed(o_ptr)) delta += 25 * base; + if (o_ptr->tval == TV_RING && + o_ptr->sval == SV_RING_LORDLY && + !object_is_cursed(o_ptr)) delta += 15 * base; + if (o_ptr->tval == TV_AMULET && + o_ptr->sval == SV_AMULET_THE_MAGI && + !object_is_cursed(o_ptr)) delta += 15 * base; + + /* Out-of-depth objects */ + if (!object_is_cursed(o_ptr) && !object_is_broken(o_ptr) && + k_ptr->level > dun_level) + { + /* Rating increase */ + delta += (k_ptr->level - dun_level) * base; + } + + rating += RATING_BOOST(delta); + } + + + if (rating > RATING_BOOST(1000)) return 2; + if (rating > RATING_BOOST(800)) return 3; + if (rating > RATING_BOOST(600)) return 4; + if (rating > RATING_BOOST(400)) return 5; + if (rating > RATING_BOOST(300)) return 6; + if (rating > RATING_BOOST(200)) return 7; + if (rating > RATING_BOOST(100)) return 8; + if (rating > RATING_BOOST(0)) return 9; + + return 10; +} + + +/* + * Update dungeon feeling, and announce it if changed + */ +static void update_dungeon_feeling(void) +{ + byte new_feeling; + int quest_num; + int delay; + + /* No feeling on the surface */ + if (!dun_level) return; + + /* No feeling in the arena */ + if (p_ptr->inside_battle) return; + + /* Extract delay time */ + delay = MAX(10, 150 - p_ptr->skill_fos) * (150 - dun_level) * TURNS_PER_TICK / 100; + + /* Not yet felt anything */ + if (turn < p_ptr->feeling_turn + delay && !cheat_xtra) return; + + /* Extract quest number (if any) */ + quest_num = quest_number(dun_level); + + /* No feeling in a quest */ + if (quest_num && + (is_fixed_quest_idx(quest_num) && + !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) || + !(quest[quest_num].flags & QUEST_FLAG_PRESET)))) return; + + + /* Get new dungeon feeling */ + new_feeling = get_dungeon_feeling(); + + /* Remember last time updated */ + p_ptr->feeling_turn = turn; - /* Activate the alter reality */ - if (!p_ptr->alter_reality) - { - /* Disturbing! */ - disturb(0, 0); + /* No change */ + if (p_ptr->feeling == new_feeling) return; - /* Determine the level */ - if (!quest_number(dun_level) && dun_level) - { -#ifdef JP - msg_print("À¤³¦¤¬ÊѤï¤Ã¤¿¡ª"); -#else - msg_print("The world changes!"); -#endif + /* Dungeon feeling is changed */ + p_ptr->feeling = new_feeling; - /* Leaving */ - p_ptr->leaving = TRUE; - } - else - { -#ifdef JP - msg_print("À¤³¦¤¬¾¯¤·¤Î´ÖÊѲ½¤·¤¿¤è¤¦¤À¡£"); -#else - msg_print("The world seems to change for a moment!"); -#endif - } + /* Announce feeling */ + do_cmd_feeling(); - /* Sound */ - sound(SOUND_TPLEVEL); - } - } + /* Update the level indicator */ + p_ptr->redraw |= (PR_DEPTH); + + /* Disturb */ + if (disturb_minor) disturb(0, 0); } @@ -3823,36 +3665,16 @@ msg_print(" */ static void process_world(void) { - int day, hour, min, prev_min; + int day, hour, min; const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN; - s32b turn_in_today = (turn + A_DAY / 4) % A_DAY; + s32b prev_turn_in_today = ((turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY; + int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60; extract_day_hour_min(&day, &hour, &min); - prev_min = (1440 * (turn_in_today - TURNS_PER_TICK) / A_DAY) % 60; - - if ((turn - old_turn == (150 - dun_level) * TURNS_PER_TICK) - && dun_level && !p_ptr->inside_battle) - { - int quest_num = quest_number(dun_level); - - /* Get dungeon level feeling */ - if (!(quest_num && - (is_fixed_quest_idx(quest_num) && - !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) || - !(quest[quest_num].flags & QUEST_FLAG_PRESET))))) - { - /* Announce feeling */ - do_cmd_feeling(); - - /* Update the level indicator */ - p_ptr->redraw |= (PR_DEPTH); - - /* Disturb */ - if (disturb_minor) disturb(0, 0); - } - } + /* Update dungeon feeling, and announce it if changed */ + update_dungeon_feeling(); /*** Check monster arena ***/ if (p_ptr->inside_battle && !p_ptr->leaving) @@ -3926,7 +3748,7 @@ static void process_world(void) p_ptr->energy_need = 0; battle_monsters(); } - else if(turn - old_turn == 150*TURNS_PER_TICK) + else if (turn - old_turn == 150*TURNS_PER_TICK) { #ifdef JP msg_print("¿½¤·Ê¬¤±¤¢¤ê¤Þ¤»¤ó¤¬¡¢¤³¤Î¾¡Éé¤Ï°ú¤­Ê¬¤±¤È¤µ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡£"); @@ -3997,7 +3819,7 @@ msg_print(" do_cmd_save_game(TRUE); } - if (mon_fight) + if (mon_fight && !ignore_unview) { #ifdef JP msg_print("²¿¤«¤¬Ê¹¤³¤¨¤¿¡£"); @@ -4009,7 +3831,7 @@ msg_print(" /*** Handle the wilderness/town (sunshine) ***/ /* While in town/wilderness */ - if (!dun_level && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena && !p_ptr->wild_mode) + if (!dun_level && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena) { /* Hack -- Daybreak/Nighfall in town */ if (!(turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2))) @@ -4031,22 +3853,25 @@ msg_print(" msg_print("The sun has risen."); #endif - /* Hack -- Scan the town */ - for (y = 0; y < cur_hgt; y++) + if (!p_ptr->wild_mode) { - for (x = 0; x < cur_wid; x++) + /* Hack -- Scan the town */ + for (y = 0; y < cur_hgt; y++) { - /* Get the cave grid */ - cave_type *c_ptr = &cave[y][x]; + for (x = 0; x < cur_wid; x++) + { + /* Get the cave grid */ + cave_type *c_ptr = &cave[y][x]; - /* Assume lit */ - c_ptr->info |= (CAVE_GLOW); + /* Assume lit */ + c_ptr->info |= (CAVE_GLOW); - /* Hack -- Memorize lit grids if allowed */ - if (view_perma_grids) c_ptr->info |= (CAVE_MARK); + /* Hack -- Memorize lit grids if allowed */ + if (view_perma_grids) c_ptr->info |= (CAVE_MARK); - /* Hack -- Notice spot */ - note_spot(y, x); + /* Hack -- Notice spot */ + note_spot(y, x); + } } } } @@ -4063,36 +3888,39 @@ msg_print(" msg_print("The sun has fallen."); #endif - /* Hack -- Scan the town */ - for (y = 0; y < cur_hgt; y++) + if (!p_ptr->wild_mode) { - for (x = 0; x < cur_wid; x++) + /* Hack -- Scan the town */ + for (y = 0; y < cur_hgt; y++) { - /* Get the cave grid */ - cave_type *c_ptr = &cave[y][x]; - - /* Feature code (applying "mimic" field) */ - feature_type *f_ptr = &f_info[get_feat_mimic(c_ptr)]; - - if (!is_mirror_grid(c_ptr) && !have_flag(f_ptr->flags, FF_QUEST_ENTER) && - !have_flag(f_ptr->flags, FF_ENTRANCE)) + for (x = 0; x < cur_wid; x++) { - /* Assume dark */ - c_ptr->info &= ~(CAVE_GLOW); + /* Get the cave grid */ + cave_type *c_ptr = &cave[y][x]; + + /* Feature code (applying "mimic" field) */ + feature_type *f_ptr = &f_info[get_feat_mimic(c_ptr)]; - if (!have_flag(f_ptr->flags, FF_REMEMBER)) + if (!is_mirror_grid(c_ptr) && !have_flag(f_ptr->flags, FF_QUEST_ENTER) && + !have_flag(f_ptr->flags, FF_ENTRANCE)) { - /* Forget the normal floor grid */ - c_ptr->info &= ~(CAVE_MARK); + /* Assume dark */ + c_ptr->info &= ~(CAVE_GLOW); - /* Hack -- Notice spot */ - note_spot(y, x); + if (!have_flag(f_ptr->flags, FF_REMEMBER)) + { + /* Forget the normal floor grid */ + c_ptr->info &= ~(CAVE_MARK); + + /* Hack -- Notice spot */ + note_spot(y, x); + } } } - } - /* Glow deep lava and building entrances */ - glow_deep_lava_and_bldg(); + /* Glow deep lava and building entrances */ + glow_deep_lava_and_bldg(); + } } } @@ -4104,6 +3932,11 @@ msg_print(" /* Window stuff */ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + + if (p_ptr->special_defense & NINJA_S_STEALTH) + { + if (cave[py][px].info & CAVE_GLOW) set_superstealth(FALSE); + } } } @@ -4140,7 +3973,7 @@ msg_print(" if (!have_flag(f_ptr->flags, FF_STORE)) continue; /* Verify store type */ - if (f_ptr->power == n) + if (f_ptr->subtype == n) { /* Message */ #ifdef JP @@ -4174,8 +4007,16 @@ msg_print(" if (!(turn % (TURNS_PER_TICK*10)) && !p_ptr->inside_battle) regen_monsters(); if (!(turn % (TURNS_PER_TICK*3))) regen_captured_monsters(); - /* Hack -- Process the counters of all monsters */ - process_monsters_counters(); + if (!p_ptr->leaving) + { + int i; + + /* Hack -- Process the counters of monsters if needed */ + for (i = 0; i < MAX_MTIMED; i++) + { + if (mproc_max[i] > 0) process_monsters_mtimed(i); + } + } /* Date changes */ @@ -4237,7 +4078,7 @@ msg_print(" } } - /* TY_CURSE activates at mignight! */ + /* TY_CURSE activates at midnight! */ if (!hour && !min) { int count = 0; @@ -4547,6 +4388,10 @@ static void process_command(void) now_message = 0; + /* Sniper */ + if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->concent)) + reset_concent = TRUE; + /* Parse the command */ switch (command_cmd) { @@ -4927,6 +4772,8 @@ msg_print(" do_cmd_kaji(TRUE); else if (p_ptr->pclass == CLASS_MAGIC_EATER) do_cmd_magic_eater(TRUE); + else if (p_ptr->pclass == CLASS_SNIPER) + do_cmd_snipe_browse(); else do_cmd_browse(); break; } @@ -5033,6 +4880,8 @@ msg_print(" do_cmd_cast_learned(); else if (p_ptr->pclass == CLASS_SMITH) do_cmd_kaji(FALSE); + else if (p_ptr->pclass == CLASS_SNIPER) + do_cmd_snipe(); else do_cmd_cast(); } @@ -5349,6 +5198,7 @@ msg_print(" case '=': { do_cmd_options(); + (void)combine_and_reorder_home(STORE_HOME); do_cmd_redraw(); break; } @@ -5464,6 +5314,13 @@ msg_print(" break; } + /* Record/stop "Movie" */ + case ']': + { + prepare_movie_hooks(); + break; + } + /* Make random artifact list */ case KTRL('V'): { @@ -5471,6 +5328,14 @@ msg_print(" break; } +#ifdef TRAVEL + case '`': + { + if (!p_ptr->wild_mode) do_cmd_travel(); + break; + } +#endif + /* Hack -- Unknown command */ default: { @@ -5515,6 +5380,58 @@ static bool monster_tsuri(int r_idx) } +/* Hack -- Pack Overflow */ +static void pack_overflow(void) +{ + if (inventory[INVEN_PACK].k_idx) + { + char o_name[MAX_NLEN]; + object_type *o_ptr; + + /* Is auto-destroy done? */ + notice_stuff(); + if (!inventory[INVEN_PACK].k_idx) return; + + /* Access the slot to be dropped */ + o_ptr = &inventory[INVEN_PACK]; + + /* Disturbing */ + disturb(0, 0); + + /* Warning */ +#ifdef JP + msg_print("¥¶¥Ã¥¯¤«¤é¥¢¥¤¥Æ¥à¤¬¤¢¤Õ¤ì¤¿¡ª"); +#else + msg_print("Your pack overflows!"); +#endif + + /* Describe */ + object_desc(o_name, o_ptr, 0); + + /* Message */ +#ifdef JP + msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(INVEN_PACK)); +#else + msg_format("You drop %s (%c).", o_name, index_to_label(INVEN_PACK)); +#endif + + /* Drop it (carefully) near the player */ + (void)drop_near(o_ptr, 0, py, px); + + /* Modify, Describe, Optimize */ + inven_item_increase(INVEN_PACK, -255); + inven_item_describe(INVEN_PACK); + inven_item_optimize(INVEN_PACK); + + /* Handle "p_ptr->notice" */ + notice_stuff(); + + /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ + handle_stuff(); + } +} + + /* * Process the player * @@ -5675,143 +5592,79 @@ msg_print(" monster_type *m_ptr = &m_list[p_ptr->riding]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - if (m_ptr->csleep) + if (MON_CSLEEP(m_ptr)) { char m_name[80]; /* Recover fully */ - m_ptr->csleep = 0; - - if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); + (void)set_monster_csleep(p_ptr->riding, 0); /* Acquire the monster name */ monster_desc(m_name, m_ptr, 0); #ifdef JP -msg_format("%^s¤òµ¯¤³¤·¤¿¡£", m_name); + msg_format("%^s¤òµ¯¤³¤·¤¿¡£", m_name); #else msg_format("You have waked %s up.", m_name); #endif - if (p_ptr->health_who == p_ptr->riding) p_ptr->redraw |= (PR_HEALTH); - p_ptr->redraw |= (PR_UHEALTH); } - if (m_ptr->stunned) + if (MON_STUNNED(m_ptr)) { - int d = 1; - - /* Make a "saving throw" against stun */ - if (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) - { - /* Recover fully */ - d = m_ptr->stunned; - } - /* Hack -- Recover from stun */ - if (m_ptr->stunned > d) - { - /* Recover somewhat */ - m_ptr->stunned -= d; - } - - /* Fully recover */ - else + if (set_monster_stunned(p_ptr->riding, + (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1))) { char m_name[80]; - /* Recover fully */ - m_ptr->stunned = 0; - /* Acquire the monster name */ monster_desc(m_name, m_ptr, 0); /* Dump a message */ #ifdef JP -msg_format("%^s¤òÛ¯Û°¾õÂÖ¤«¤éΩ¤Áľ¤é¤»¤¿¡£", m_name); + msg_format("%^s¤òÛ¯Û°¾õÂÖ¤«¤éΩ¤Áľ¤é¤»¤¿¡£", m_name); #else msg_format("%^s is no longer stunned.", m_name); #endif - if (p_ptr->health_who == p_ptr->riding) p_ptr->redraw |= (PR_HEALTH); - p_ptr->redraw |= (PR_UHEALTH); } } - if (m_ptr->confused) + if (MON_CONFUSED(m_ptr)) { - int d = 1; - - /* Make a "saving throw" against stun */ - if (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) - { - /* Recover fully */ - d = m_ptr->confused; - } - - /* Hack -- Recover from stun */ - if (m_ptr->confused > d) - { - /* Recover somewhat */ - m_ptr->confused -= d; - } - - /* Fully recover */ - else + /* Hack -- Recover from confusion */ + if (set_monster_confused(p_ptr->riding, + (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1))) { char m_name[80]; - /* Recover fully */ - m_ptr->confused = 0; - /* Acquire the monster name */ monster_desc(m_name, m_ptr, 0); /* Dump a message */ #ifdef JP -msg_format("%^s¤òº®Íð¾õÂÖ¤«¤éΩ¤Áľ¤é¤»¤¿¡£", m_name); + msg_format("%^s¤òº®Íð¾õÂÖ¤«¤éΩ¤Áľ¤é¤»¤¿¡£", m_name); #else msg_format("%^s is no longer confused.", m_name); #endif - if (p_ptr->health_who == p_ptr->riding) p_ptr->redraw |= (PR_HEALTH); - p_ptr->redraw |= (PR_UHEALTH); } } - if (m_ptr->monfear) + if (MON_MONFEAR(m_ptr)) { - int d = 1; - - /* Make a "saving throw" against stun */ - if (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) - { - /* Recover fully */ - d = m_ptr->monfear; - } - - /* Hack -- Recover from stun */ - if (m_ptr->monfear > d) - { - /* Recover somewhat */ - m_ptr->monfear -= d; - } - - /* Fully recover */ - else + /* Hack -- Recover from fear */ + if (set_monster_monfear(p_ptr->riding, + (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1))) { char m_name[80]; - /* Recover fully */ - m_ptr->monfear = 0; - /* Acquire the monster name */ monster_desc(m_name, m_ptr, 0); /* Dump a message */ #ifdef JP -msg_format("%^s¤ò¶²Éݤ«¤éΩ¤Áľ¤é¤»¤¿¡£", m_name); + msg_format("%^s¤ò¶²Éݤ«¤éΩ¤Áľ¤é¤»¤¿¡£", m_name); #else msg_format("%^s is no longer fear.", m_name); #endif - if (p_ptr->health_who == p_ptr->riding) p_ptr->redraw |= (PR_HEALTH); - p_ptr->redraw |= (PR_UHEALTH); } } @@ -5822,6 +5675,10 @@ msg_format("%^s /* Handle the player song */ if (!load) check_music(); + /* Hex - Handle the hex spells */ + if (!load) check_hex(); + if (!load) revenge_spell(); + load = FALSE; /* Fast */ @@ -5841,9 +5698,10 @@ msg_format("%^s if (p_ptr->action == ACTION_LEARN) { s32b cost = 0L; - u32b cost_frac = (p_ptr->msp + 30L); + u32b cost_frac = (p_ptr->msp + 30L) * 256L; - s64b_mul(&cost, &cost_frac, 0, (256 << 16)); + /* Convert the unit (1/2^16) to (1/2^32) */ + s64b_LSHIFT(cost, cost_frac, 16); if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, cost, cost_frac) < 0) @@ -5901,53 +5759,7 @@ msg_format("%^s /* Hack -- Pack Overflow */ - if (inventory[INVEN_PACK].k_idx) - { - int item = INVEN_PACK; - - char o_name[MAX_NLEN]; - - object_type *o_ptr; - - /* Access the slot to be dropped */ - o_ptr = &inventory[item]; - - /* Disturbing */ - disturb(0, 0); - - /* Warning */ -#ifdef JP -msg_print("¥¶¥Ã¥¯¤«¤é¥¢¥¤¥Æ¥à¤¬¤¢¤Õ¤ì¤¿¡ª"); -#else - msg_print("Your pack overflows!"); -#endif - - - /* Describe */ - object_desc(o_name, o_ptr, 0); - - /* Message */ -#ifdef JP -msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(item)); -#else - msg_format("You drop %s (%c).", o_name, index_to_label(item)); -#endif - - - /* Drop it (carefully) near the player */ - (void)drop_near(o_ptr, 0, py, px); - - /* Modify, Describe, Optimize */ - inven_item_increase(item, -255); - inven_item_describe(item); - inven_item_optimize(item); - - /* Handle "p_ptr->notice" */ - notice_stuff(); - - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ - handle_stuff(); - } + pack_overflow(); /* Hack -- cancel "lurking browse mode" */ @@ -6009,6 +5821,15 @@ msg_format("%s(%c) run_step(0); } +#ifdef TRAVEL + /* Traveling */ + else if (travel.run) + { + /* Take a step */ + travel_step(); + } +#endif + /* Repeated command */ else if (command_rep) { @@ -6047,6 +5868,10 @@ msg_format("%s(%c) } + /* Hack -- Pack Overflow */ + pack_overflow(); + + /*** Clean up ***/ /* Significant */ @@ -6175,7 +6000,7 @@ msg_format("%s(%c) } } new_mane = FALSE; - p_ptr->redraw |= (PR_MANE); + p_ptr->redraw |= (PR_IMITATION); } if (p_ptr->action == ACTION_LEARN) { @@ -6215,6 +6040,9 @@ msg_format("%s(%c) break; } + /* Sniper */ + if (energy_use && reset_concent) reset_concentration(TRUE); + /* Handle "leaving" */ if (p_ptr->leaving) break; } @@ -6295,9 +6123,11 @@ static void dungeon(bool load_game) if ((max_dlv[dungeon_type] < dun_level) && !p_ptr->inside_quest) { max_dlv[dungeon_type] = dun_level; - if (record_maxdeapth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, dun_level, NULL); + if (record_maxdepth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, dun_level, NULL); } + (void)calculate_upkeep(); + /* Validate the panel */ panel_bounds_center(); @@ -6398,6 +6228,8 @@ msg_print(" #endif } + if (!load_game && (p_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(FALSE); + /*** Process this dungeon level ***/ /* Reset the monster generation level */ @@ -6415,6 +6247,9 @@ msg_print(" /* Not leaving dungeon */ p_ptr->leaving_dungeon = FALSE; + /* Initialize monster process */ + mproc_init(); + /* Main loop */ while (TRUE) { @@ -6492,8 +6327,15 @@ msg_print(" /* Count game turns */ turn++; - if (!p_ptr->wild_mode || wild_regen) dungeon_turn++; - else if (p_ptr->wild_mode && !(turn % ((MAX_HGT + MAX_WID) / 2))) dungeon_turn++; + + if (dungeon_turn < dungeon_turn_limit) + { + if (!p_ptr->wild_mode || wild_regen) dungeon_turn++; + else if (p_ptr->wild_mode && !(turn % ((MAX_HGT + MAX_WID) / 2))) dungeon_turn++; + } + + prevent_turn_overflow(); + if (wild_regen) wild_regen--; } @@ -6734,6 +6576,13 @@ void play_game(bool new_game) } #endif + if (browsing_movie) + { + reset_visuals(); + browse_movie(); + return; + } + hack_mutation = FALSE; /* Hack -- Character is "icky" */ @@ -6847,6 +6696,8 @@ quit(" quit(0); } + creating_savefile = new_game; + /* Nothing loaded */ if (!character_loaded) { @@ -6929,6 +6780,9 @@ quit(" determine_bounty_uniques(); determine_today_mon(FALSE); + + /* Initialize object array */ + wipe_o_list(); } else { @@ -6958,6 +6812,8 @@ quit(" } } + creating_savefile = FALSE; + p_ptr->teleport_town = FALSE; p_ptr->sutemi = FALSE; world_monster = FALSE; @@ -6979,11 +6835,6 @@ quit(" /* Flavor the objects */ flavor_init(); - if (new_game) - { - wipe_o_list(); - player_outfit(); - } /* Flash a message */ #ifdef JP @@ -7043,6 +6894,29 @@ prt(" change_floor(); } + else + { + /* HACK -- Restore from panic-save */ + if (p_ptr->panic_save) + { + /* No player? -- Try to regenerate floor */ + if (!py || !px) + { +#ifdef JP + msg_print("¥×¥ì¥¤¥ä¡¼¤Î°ÌÃÖ¤¬¤ª¤«¤·¤¤¡£¥Õ¥í¥¢¤òºÆÀ¸À®¤·¤Þ¤¹¡£"); +#else + msg_print("What a strange player location. Regenerate the dungeon floor."); +#endif + change_floor(); + } + + /* Still no player? -- Try to locate random place */ + if (!py || !px) py = px = 10; + + /* No longer in panic */ + p_ptr->panic_save = 0; + } + } /* Character is now "complete" */ character_generated = TRUE; @@ -7074,6 +6948,12 @@ prt(" /* Load the "pref" files */ load_all_pref_files(); + /* Give startup outfit (after loading pref files) */ + if (new_game) + { + player_outfit(); + } + /* React to changes */ Term_xtra(TERM_XTRA_REACT, 0); @@ -7111,6 +6991,9 @@ prt(" m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED(); } + (void)combine_and_reorder_home(STORE_HOME); + (void)combine_and_reorder_home(STORE_MUSEUM); + /* Process */ while (TRUE) { @@ -7120,9 +7003,14 @@ prt(" /* Handle "p_ptr->notice" */ notice_stuff(); + /* Hack -- prevent "icky" message */ + character_xtra = TRUE; + /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); + character_xtra = FALSE; + /* Cancel the target */ target_who = 0; @@ -7178,11 +7066,10 @@ prt(" { /* Mega-Hack -- Allow player to cheat death */ #ifdef JP -if ((p_ptr->wizard || cheat_live) && !get_check("»à¤Ë¤Þ¤¹¤«? ")) + if ((p_ptr->wizard || cheat_live) && !get_check("»à¤Ë¤Þ¤¹¤«? ")) #else if ((p_ptr->wizard || cheat_live) && !get_check("Die? ")) #endif - { /* Mark social class, reset age, if needed */ if (p_ptr->sc) p_ptr->sc = p_ptr->age = 0; @@ -7195,12 +7082,10 @@ if ((p_ptr->wizard || cheat_live) && !get_check(" /* Message */ #ifdef JP -msg_print("¥¦¥£¥¶¡¼¥É¥â¡¼¥É¤ËÇ°¤òÁ÷¤ê¡¢»à¤òµ½¤¤¤¿¡£"); + msg_print("¥¦¥£¥¶¡¼¥É¥â¡¼¥É¤ËÇ°¤òÁ÷¤ê¡¢»à¤òµ½¤¤¤¿¡£"); #else msg_print("You invoke wizard mode and cheat death."); #endif - wipe_m_list(); - msg_print(NULL); /* Restore hit points */ @@ -7222,25 +7107,12 @@ msg_print(" p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; - /* Hack -- Healing */ - (void)set_blind(0); - (void)set_confused(0); - (void)set_poisoned(0); - (void)set_afraid(0); - (void)set_paralyzed(0); - (void)set_image(0); - (void)set_stun(0); - (void)set_cut(0); - - /* Hack -- Prevent starvation */ - (void)set_food(PY_FOOD_MAX - 1); - /* Hack -- cancel recall */ if (p_ptr->word_recall) { /* Message */ #ifdef JP -msg_print("Ä¥¤ê¤Ä¤á¤¿Â絤¤¬Î®¤ìµî¤Ã¤¿..."); + msg_print("Ä¥¤ê¤Ä¤á¤¿Â絤¤¬Î®¤ìµî¤Ã¤¿..."); #else msg_print("A tension leaves the air around you..."); #endif @@ -7262,21 +7134,33 @@ msg_print("Ä¥ /* Note cause of death XXX XXX XXX */ #ifdef JP -(void)strcpy(p_ptr->died_from, "»à¤Îµ½¤­"); + (void)strcpy(p_ptr->died_from, "»à¤Îµ½¤­"); #else (void)strcpy(p_ptr->died_from, "Cheating death"); #endif - /* Do not die */ p_ptr->is_dead = FALSE; + /* Hack -- Healing */ + (void)set_blind(0); + (void)set_confused(0); + (void)set_poisoned(0); + (void)set_afraid(0); + (void)set_paralyzed(0); + (void)set_image(0); + (void)set_stun(0); + (void)set_cut(0); + + /* Hack -- Prevent starvation */ + (void)set_food(PY_FOOD_MAX - 1); + dun_level = 0; p_ptr->inside_arena = FALSE; p_ptr->inside_battle = FALSE; leaving_quest = 0; p_ptr->inside_quest = 0; - p_ptr->recall_dungeon = dungeon_type; + if (dungeon_type) p_ptr->recall_dungeon = dungeon_type; dungeon_type = 0; if (lite_town || vanilla_town) { @@ -7303,7 +7187,6 @@ msg_print("Ä¥ /* Leaving */ p_ptr->wild_mode = FALSE; - p_ptr->leaving = TRUE; #ifdef JP @@ -7311,6 +7194,10 @@ msg_print("Ä¥ #else do_cmd_write_nikki(NIKKI_BUNSHOU, 1, " but revived."); #endif + + /* Prepare next floor */ + leave_floor(); + wipe_m_list(); } } } @@ -7342,3 +7229,47 @@ s32b turn_real(s32b hoge) return hoge; } } + +/* + * ¥¿¡¼¥ó¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ËÂФ¹¤ëÂнè + * ¥¿¡¼¥óµÚ¤Ó¥¿¡¼¥ó¤òµ­Ï¿¤¹¤ëÊÑ¿ô¤ò¥¿¡¼¥ó¤Î¸Â³¦¤Î1ÆüÁ°¤Þ¤Ç´¬¤­Ì᤹. + */ +void prevent_turn_overflow(void) +{ + int rollback_days, i, j; + s32b rollback_turns; + + if (turn < turn_limit) return; + + rollback_days = 1 + (turn - turn_limit) / (TURNS_PER_TICK * TOWN_DAWN); + rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days; + + if (turn > rollback_turns) turn -= rollback_turns; + else turn = 1; /* Paranoia */ + if (old_turn > rollback_turns) old_turn -= rollback_turns; + else old_turn = 1; + if (old_battle > rollback_turns) old_battle -= rollback_turns; + else old_battle = 1; + if (p_ptr->feeling_turn > rollback_turns) p_ptr->feeling_turn -= rollback_turns; + else p_ptr->feeling_turn = 1; + + for (i = 1; i < max_towns; i++) + { + for (j = 0; j < MAX_STORES; j++) + { + store_type *st_ptr = &town[i].store[j]; + + if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS) + { + st_ptr->last_visit -= rollback_turns; + if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS; + } + + if (st_ptr->store_open) + { + st_ptr->store_open -= rollback_turns; + if (st_ptr->store_open < 1) st_ptr->store_open = 1; + } + } + } +}