X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fdungeon.c;h=fcd877fa7101a11db479d2a608a0f11ee05f5df4;hb=f3f82e939e0ac4806b8db90e9d7bf897f91eef99;hp=2a970f5c349f039ac347cba3123475f13f25575b;hpb=9323485e29f0e22ea429a9935ad4cc0d2b186ac5;p=hengband%2Fhengband.git diff --git a/src/dungeon.c b/src/dungeon.c index 2a970f5c3..fcd877fa7 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, FALSE); + 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("¡Ö¥Ñ¥¿¡¼¥ó¡×¤Î¤³¤ÎÉôʬ¤Ï¾¤ÎÉôʬ¤è¤ê¶¯ÎϤǤʤ¤¤è¤¦¤À¡£"); @@ -868,9 +869,10 @@ static void regenhp(int percent) /* * Regenerate mana points */ -static void regenmana(int percent) +static void regenmana(int upkeep_factor, int regen_amount) { s32b old_csp = p_ptr->csp; + s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL; /* * Excess mana will decay 32 times faster than normal @@ -897,11 +899,11 @@ static void regenmana(int percent) } /* Regenerating mana (unless the player has excess mana) */ - else if (percent > 0) + else if (regen_rate > 0) { /* (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); + u32b new_mana_frac = (p_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE); /* Convert the unit (1/2^16) to (1/2^32) */ s64b_LSHIFT(new_mana, new_mana_frac, 16); @@ -919,11 +921,11 @@ static void regenmana(int percent) /* Reduce mana (even when the player has excess mana) */ - if (percent < 0) + if (regen_rate < 0) { /* 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); + u32b reduce_mana_frac = (p_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE); /* Convert the unit (1/2^16) to (1/2^32) */ s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16); @@ -958,17 +960,22 @@ static void regenmana(int percent) /* * Regenerate magic + * regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate) */ -static void regenmagic(int percent) +static void regenmagic(int regen_amount) { - s32b new_mana; + s32b new_mana; int i; + int dev = 30; + int mult = (dev + adj_mag_mana[p_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */ for (i = 0; i < EATER_EXT*2; i++) { if (!p_ptr->magic_num2[i]) continue; if (p_ptr->magic_num1[i] == ((long)p_ptr->magic_num2[i] << 16)) continue; - new_mana = ((long)p_ptr->magic_num2[i]+adj_mag_mana[A_INT]+13) * percent / 8; + + /* Increase remaining charge number like float value */ + new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 13)) / (dev * 8); p_ptr->magic_num1[i] += new_mana; /* Check maximum charge */ @@ -982,7 +989,13 @@ static void regenmagic(int percent) { if (!p_ptr->magic_num1[i]) continue; if (!p_ptr->magic_num2[i]) continue; - p_ptr->magic_num1[i] -= (long)(p_ptr->magic_num2[i] * (adj_mag_mana[A_INT] + 10)) * EATER_ROD_CHARGE/16; + + /* Decrease remaining period for charging */ + new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE) + / (dev * 16 * PY_REGEN_NORMAL); + p_ptr->magic_num1[i] -= new_mana; + + /* Check minimum remaining period for charging */ if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0; wild_regen = 20; } @@ -1097,354 +1110,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 */ @@ -1520,17 +1185,50 @@ void leave_quest_check(void) { quest[leaving_quest].status = QUEST_STATUS_FAILED; quest[leaving_quest].complev = (byte)p_ptr->lev; - if (quest[leaving_quest].type == QUEST_TYPE_RANDOM) + + /* Additional settings */ + switch (quest[leaving_quest].type) { + case QUEST_TYPE_TOWER: + quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED; + quest[QUEST_TOWER1].complev = (byte)p_ptr->lev; + break; + case QUEST_TYPE_FIND_ARTIFACT: + a_info[quest[leaving_quest].k_idx].gen_flags &= ~(TRG_QUESTITEM); + break; + case QUEST_TYPE_RANDOM: r_info[quest[leaving_quest].r_idx].flags1 &= ~(RF1_QUESTOR); - if (record_rand_quest) - do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL); /* Floor of random quest will be blocked */ prepare_change_floor_mode(CFM_NO_RETURN); + break; + } + + /* Record finishing a quest */ + if (quest[leaving_quest].type == QUEST_TYPE_RANDOM) + { + if (record_rand_quest) do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL); + } + else + { + if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL); + } + } +} + +void leave_tower_check(void) +{ + leaving_quest = p_ptr->inside_quest; + /* Check for Tower Quest */ + if (leaving_quest && + (quest[leaving_quest].type == QUEST_TYPE_TOWER) && + (quest[QUEST_TOWER1].status != QUEST_STATUS_COMPLETED)) + { + if(quest[leaving_quest].type == QUEST_TYPE_TOWER) + { + quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED; + quest[QUEST_TOWER1].complev = (byte)p_ptr->lev; } - else if (record_fix_quest) - do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL); } } @@ -1581,7 +1279,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("²¿¤â¿·¤·¤¤¤³¤È¤ÏȽ¤é¤Ê¤«¤Ã¤¿¡£"); @@ -1626,6 +1324,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); @@ -1669,102 +1370,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- @@ -1814,7 +1419,7 @@ static void recharged_notice(object_type *o_ptr) static void check_music(void) { - magic_type *s_ptr; + const magic_type *s_ptr; int spell; s32b need_mana; u32b need_mana_frac; @@ -1881,7 +1486,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); } @@ -1905,6 +1511,17 @@ static object_type *choose_cursed_obj_name(u32b flag) choices[number] = i; number++; } + else if ((flag == TRC_ADD_L_CURSE) || (flag == TRC_ADD_H_CURSE)) + { + u32b cf = (flag == TRC_ADD_L_CURSE) ? TR_ADD_L_CURSE : TR_ADD_H_CURSE; + u32b flgs[4]; + object_flags(o_ptr, flgs); + if (have_flag(flgs, cf)) + { + choices[number] = i; + number++; + } + } } /* Choice one of them */ @@ -1920,7 +1537,6 @@ static void process_world_aux_hp_and_sp(void) feature_type *f_ptr = &f_info[cave[py][px].feat]; bool cave_no_regen = FALSE; int upkeep_factor = 0; - int upkeep_regen; /* Default regeneration */ int regen_amount = PY_REGEN_NORMAL; @@ -2053,7 +1669,7 @@ sprintf(ouch, "%s { damage = 6000 + randint0(4000); } - else if (!p_ptr->ffall) + else if (!p_ptr->levitation) { damage = 3000 + randint0(2000); } @@ -2064,11 +1680,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("Ç®¤Ç²Ð½ý¤·¤¿¡ª"); @@ -2094,9 +1710,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 @@ -2259,8 +1875,7 @@ take_hit(DAMAGE_NOESCAPE, damage, " } /* Regenerate the mana */ - upkeep_regen = (100 - upkeep_factor) * regen_amount; - regenmana(upkeep_regen); + regenmana(upkeep_factor, regen_amount); /* Recharge magic eater's power */ @@ -2384,9 +1999,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 */ @@ -2632,7 +2247,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) @@ -2675,6 +2290,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)) @@ -2707,7 +2323,7 @@ static void process_world_aux_mutation(void) #endif msg_print(NULL); - teleport_player(40, TRUE); + teleport_player(40, TELEPORT_PASSIVE); } } @@ -2737,7 +2353,7 @@ static void process_world_aux_mutation(void) msg_print(NULL); if (one_in_(3)) lose_all_info(); else wiz_dark(); - teleport_player(100, TRUE); + (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE); wiz_dark(); #ifdef JP msg_print("¤¢¤Ê¤¿¤Ï¸«ÃΤé¤Ì¾ì½ê¤ÇÌܤ¬Àä᤿...Ƭ¤¬Äˤ¤¡£"); @@ -2922,7 +2538,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); @@ -3113,6 +2729,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) && @@ -3244,7 +2862,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 @@ -3255,32 +2874,36 @@ 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); } } } - /* * Handle curse effects once every 10 game turns */ @@ -3296,23 +2919,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 @@ -3328,7 +2960,7 @@ static void process_world_aux_curse(void) #endif { disturb(0, 0); - teleport_player(50, FALSE); + teleport_player(50, 0L); } else { @@ -3495,7 +3127,7 @@ static void process_world_aux_curse(void) disturb(0, 0); /* Teleport player */ - teleport_player(40, TRUE); + teleport_player(40, TELEPORT_PASSIVE); } /* Handle HP draining */ if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666)) @@ -3511,7 +3143,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]; @@ -3539,13 +3171,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!"); @@ -3695,15 +3327,12 @@ static void process_world_aux_movement(void) disturb(0, 0); /* Determine the level */ - if (dun_level || p_ptr->inside_quest) + if (dun_level || p_ptr->inside_quest || p_ptr->enter_dungeon) { -#ifdef JP -msg_print("¾å¤Ë°ú¤ÃÄ¥¤ê¤¢¤²¤é¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª"); -#else - msg_print("You feel yourself yanked upwards!"); -#endif + msg_print(_("¾å¤Ë°ú¤ÃÄ¥¤ê¤¢¤²¤é¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª", + "You feel yourself yanked upwards!")); - 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); @@ -3711,6 +3340,7 @@ msg_print(" dungeon_type = 0; leave_quest_check(); + leave_tower_check(); p_ptr->inside_quest = 0; @@ -3718,11 +3348,8 @@ msg_print(" } else { -#ifdef JP -msg_print("²¼¤Ë°ú¤­¤º¤ê¹ß¤í¤µ¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª"); -#else - msg_print("You feel yourself yanked downwards!"); -#endif + msg_print(_("²¼¤Ë°ú¤­¤º¤ê¹ß¤í¤µ¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª", + "You feel yourself yanked downwards!")); dungeon_type = p_ptr->recall_dungeon; @@ -3796,48 +3423,288 @@ msg_print(" } - /* Delayed Alter reality */ - if (p_ptr->alter_reality) - { - if (autosave_l && (p_ptr->alter_reality == 1) && !p_ptr->inside_battle) - do_cmd_save_game(TRUE); + /* Delayed Alter reality */ + if (p_ptr->alter_reality) + { + if (autosave_l && (p_ptr->alter_reality == 1) && !p_ptr->inside_battle) + do_cmd_save_game(TRUE); + + /* Count down towards alter */ + p_ptr->alter_reality--; + + 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; - /* Count down towards alter */ - p_ptr->alter_reality--; + return 10; +} - p_ptr->redraw |= (PR_STATUS); - /* Activate the alter reality */ - if (!p_ptr->alter_reality) - { - /* Disturbing! */ - disturb(0, 0); +/* + * Update dungeon feeling, and announce it if changed + */ +static void update_dungeon_feeling(void) +{ + byte new_feeling; + int quest_num; + int delay; - /* Determine the level */ - if (!quest_number(dun_level) && dun_level) - { -#ifdef JP - msg_print("À¤³¦¤¬ÊѤï¤Ã¤¿¡ª"); -#else - msg_print("The world changes!"); -#endif + /* No feeling on the surface */ + if (!dun_level) return; - /* Leaving */ - p_ptr->leaving = TRUE; - } - else - { -#ifdef JP - msg_print("À¤³¦¤¬¾¯¤·¤Î´ÖÊѲ½¤·¤¿¤è¤¦¤À¡£"); -#else - msg_print("The world seems to change for a moment!"); -#endif - } + /* No feeling in the arena */ + if (p_ptr->inside_battle) return; - /* Sound */ - sound(SOUND_TPLEVEL); - } - } + /* 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; + + /* No change */ + if (p_ptr->feeling == new_feeling) return; + + /* Dungeon feeling is changed */ + p_ptr->feeling = new_feeling; + + /* Announce feeling */ + do_cmd_feeling(); + + /* Update the level indicator */ + p_ptr->redraw |= (PR_DEPTH); + + /* Disturb */ + if (disturb_minor) disturb(0, 0); } @@ -3854,28 +3721,8 @@ static void process_world(void) extract_day_hour_min(&day, &hour, &min); - - 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) @@ -3949,7 +3796,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("¿½¤·Ê¬¤±¤¢¤ê¤Þ¤»¤ó¤¬¡¢¤³¤Î¾¡Éé¤Ï°ú¤­Ê¬¤±¤È¤µ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡£"); @@ -4020,7 +3867,7 @@ msg_print(" do_cmd_save_game(TRUE); } - if (mon_fight) + if (mon_fight && !ignore_unview) { #ifdef JP msg_print("²¿¤«¤¬Ê¹¤³¤¨¤¿¡£"); @@ -4032,7 +3879,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))) @@ -4054,22 +3901,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); + } } } } @@ -4086,36 +3936,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(); + } } } @@ -4127,6 +3980,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); + } } } @@ -4163,7 +4021,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 @@ -4197,8 +4055,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 */ @@ -4260,7 +4126,7 @@ msg_print(" } } - /* TY_CURSE activates at mignight! */ + /* TY_CURSE activates at midnight! */ if (!hour && !min) { int count = 0; @@ -4570,6 +4436,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) { @@ -4949,7 +4819,9 @@ msg_print(" else if (p_ptr->pclass == CLASS_SMITH) do_cmd_kaji(TRUE); else if (p_ptr->pclass == CLASS_MAGIC_EATER) - do_cmd_magic_eater(TRUE); + do_cmd_magic_eater(TRUE, FALSE); + else if (p_ptr->pclass == CLASS_SNIPER) + do_cmd_snipe_browse(); else do_cmd_browse(); break; } @@ -5049,13 +4921,15 @@ msg_print(" else if (p_ptr->pclass == CLASS_IMITATOR) do_cmd_mane(FALSE); else if (p_ptr->pclass == CLASS_MAGIC_EATER) - do_cmd_magic_eater(FALSE); + do_cmd_magic_eater(FALSE, FALSE); else if (p_ptr->pclass == CLASS_SAMURAI) do_cmd_hissatsu(); else if (p_ptr->pclass == CLASS_BLUE_MAGE) 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(); } @@ -5372,6 +5246,7 @@ msg_print(" case '=': { do_cmd_options(); + (void)combine_and_reorder_home(STORE_HOME); do_cmd_redraw(); break; } @@ -5487,6 +5362,13 @@ msg_print(" break; } + /* Record/stop "Movie" */ + case ']': + { + prepare_movie_hooks(); + break; + } + /* Make random artifact list */ case KTRL('V'): { @@ -5494,6 +5376,18 @@ msg_print(" break; } +#ifdef TRAVEL + case '`': + { + if (!p_ptr->wild_mode) do_cmd_travel(); + if (p_ptr->special_defense & KATA_MUSOU) + { + set_action(ACTION_NONE); + } + break; + } +#endif + /* Hack -- Unknown command */ default: { @@ -5538,6 +5432,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 * @@ -5698,143 +5644,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); } } @@ -5845,6 +5727,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 */ @@ -5925,53 +5811,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" */ @@ -6033,6 +5873,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) { @@ -6071,6 +5920,10 @@ msg_format("%s(%c) } + /* Hack -- Pack Overflow */ + pack_overflow(); + + /*** Clean up ***/ /* Significant */ @@ -6199,7 +6052,7 @@ msg_format("%s(%c) } } new_mane = FALSE; - p_ptr->redraw |= (PR_MANE); + p_ptr->redraw |= (PR_IMITATION); } if (p_ptr->action == ACTION_LEARN) { @@ -6239,6 +6092,9 @@ msg_format("%s(%c) break; } + /* Sniper */ + if (energy_use && reset_concent) reset_concentration(TRUE); + /* Handle "leaving" */ if (p_ptr->leaving) break; } @@ -6322,6 +6178,8 @@ static void dungeon(bool load_game) if (record_maxdepth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, dun_level, NULL); } + (void)calculate_upkeep(); + /* Validate the panel */ panel_bounds_center(); @@ -6422,6 +6280,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 */ @@ -6439,6 +6299,9 @@ msg_print(" /* Not leaving dungeon */ p_ptr->leaving_dungeon = FALSE; + /* Initialize monster process */ + mproc_init(); + /* Main loop */ while (TRUE) { @@ -6516,8 +6379,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--; } @@ -6758,6 +6628,13 @@ void play_game(bool new_game) } #endif + if (browsing_movie) + { + reset_visuals(); + browse_movie(); + return; + } + hack_mutation = FALSE; /* Hack -- Character is "icky" */ @@ -6871,6 +6748,8 @@ quit(" quit(0); } + creating_savefile = new_game; + /* Nothing loaded */ if (!character_loaded) { @@ -6953,6 +6832,9 @@ quit(" determine_bounty_uniques(); determine_today_mon(FALSE); + + /* Initialize object array */ + wipe_o_list(); } else { @@ -6982,6 +6864,8 @@ quit(" } } + creating_savefile = FALSE; + p_ptr->teleport_town = FALSE; p_ptr->sutemi = FALSE; world_monster = FALSE; @@ -7003,11 +6887,6 @@ quit(" /* Flavor the objects */ flavor_init(); - if (new_game) - { - wipe_o_list(); - player_outfit(); - } /* Flash a message */ #ifdef JP @@ -7067,6 +6946,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; @@ -7098,6 +7000,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); @@ -7135,6 +7043,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) { @@ -7144,9 +7055,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; @@ -7202,11 +7118,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; @@ -7219,12 +7134,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 */ @@ -7251,7 +7164,7 @@ msg_print(" { /* Message */ #ifdef JP -msg_print("Ä¥¤ê¤Ä¤á¤¿Â絤¤¬Î®¤ìµî¤Ã¤¿..."); + msg_print("Ä¥¤ê¤Ä¤á¤¿Â絤¤¬Î®¤ìµî¤Ã¤¿..."); #else msg_print("A tension leaves the air around you..."); #endif @@ -7299,7 +7212,7 @@ msg_print("Ä¥ 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) { @@ -7326,7 +7239,6 @@ msg_print("Ä¥ /* Leaving */ p_ptr->wild_mode = FALSE; - p_ptr->leaving = TRUE; #ifdef JP @@ -7334,6 +7246,10 @@ msg_print("Ä¥ #else do_cmd_write_nikki(NIKKI_BUNSHOU, 1, " but revived."); #endif + + /* Prepare next floor */ + leave_floor(); + wipe_m_list(); } } } @@ -7365,3 +7281,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; + } + } + } +}