X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fdungeon.c;h=46a54c55386edff3d3ffc565aec91dbc93f40b54;hb=7b2bbca769920e3f61544238b23f9d9fa813c2a1;hp=9fe36cc1de6e919e605f09c7f1d1377de305a9d0;hpb=bdcfe777e847d4449fa93dd5a3f7a9b7e8e092ae;p=hengband%2Fhengband.git diff --git a/src/dungeon.c b/src/dungeon.c index 9fe36cc1d..46a54c553 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)); @@ -590,7 +590,7 @@ static void pattern_teleport(void) /* Ask for level */ #ifdef JP -if (get_check("¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) + if (get_check("¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) #else if (get_check("Teleport level? ")) #endif @@ -619,7 +619,7 @@ if (get_check("¾ /* Prompt */ #ifdef JP -sprintf(ppp, "¥Æ¥ì¥Ý¡¼¥ÈÀè:(%d-%d)", min_level, max_level); + sprintf(ppp, "¥Æ¥ì¥Ý¡¼¥ÈÀè:(%d-%d)", min_level, max_level); #else sprintf(ppp, "Teleport to level (%d-%d): ", min_level, max_level); #endif @@ -635,13 +635,12 @@ sprintf(ppp, " command_arg = atoi(tmp_val); } #ifdef JP -else if (get_check("Ä̾ï¥Æ¥ì¥Ý¡¼¥È¡©")) + else if (get_check("Ä̾ï¥Æ¥ì¥Ý¡¼¥È¡©")) #else else if (get_check("Normal teleport? ")) #endif - { - teleport_player(200); + teleport_player(200, 0L); return; } else @@ -657,7 +656,7 @@ else if (get_check(" /* Accept request */ #ifdef JP -msg_format("%d ³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤·¤¿¡£", command_arg); + msg_format("%d ³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤·¤¿¡£", command_arg); #else msg_format("You teleport to dungeon level %d.", command_arg); #endif @@ -689,22 +688,22 @@ msg_format("%d static void wreck_the_pattern(void) { int to_ruin = 0, r_y, r_x; + int pattern_type = f_info[cave[py][px].feat].subtype; - if (cave[py][px].feat == FEAT_PATTERN_XTRA2) + if (pattern_type == PATTERN_TILE_WRECKED) { /* Ruined already */ return; } #ifdef JP -msg_print("¥Ñ¥¿¡¼¥ó¤ò·ì¤Ç±ø¤·¤Æ¤·¤Þ¤Ã¤¿¡ª"); -msg_print("²¿¤«¶²¤í¤·¤¤»ö¤¬µ¯¤³¤Ã¤¿¡ª"); + msg_print("¥Ñ¥¿¡¼¥ó¤ò·ì¤Ç±ø¤·¤Æ¤·¤Þ¤Ã¤¿¡ª"); + msg_print("²¿¤«¶²¤í¤·¤¤»ö¤¬µ¯¤³¤Ã¤¿¡ª"); #else msg_print("You bleed on the Pattern!"); msg_print("Something terrible happens!"); #endif - if (!IS_INVULN()) #ifdef JP take_hit(DAMAGE_NOESCAPE, damroll(10, 8), "¥Ñ¥¿¡¼¥ó»²õ", -1); @@ -712,30 +711,29 @@ msg_print(" take_hit(DAMAGE_NOESCAPE, damroll(10, 8), "corrupting the Pattern", -1); #endif - to_ruin = randint1(45) + 35; while (to_ruin--) { scatter(&r_y, &r_x, py, px, 4, 0); - if ((cave[r_y][r_x].feat >= FEAT_PATTERN_START) && - (cave[r_y][r_x].feat < FEAT_PATTERN_XTRA2)) + if (pattern_tile(r_y, r_x) && + (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); } /* Returns TRUE if we are on the Pattern... */ static bool pattern_effect(void) { - if ((cave[py][px].feat < FEAT_PATTERN_START) || - (cave[py][px].feat > FEAT_PATTERN_XTRA2)) - return FALSE; + int pattern_type; + + if (!pattern_tile(py, px)) return FALSE; if ((prace_is_(RACE_AMBERITE)) && (p_ptr->cut > 0) && one_in_(10)) @@ -743,8 +741,11 @@ static bool pattern_effect(void) wreck_the_pattern(); } - if (cave[py][px].feat == FEAT_PATTERN_END) + pattern_type = f_info[cave[py][px].feat].subtype; + + switch (pattern_type) { + case PATTERN_TILE_END: (void)set_poisoned(0); (void)set_image(0); (void)set_stun(0); @@ -759,44 +760,42 @@ static bool pattern_effect(void) (void)do_res_stat(A_CHR); (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("¡Ö¥Ñ¥¿¡¼¥ó¡×¤Î¤³¤ÎÉôʬ¤Ï¾¤ÎÉôʬ¤è¤ê¶¯ÎϤǤʤ¤¤è¤¦¤À¡£"); + msg_print("¡Ö¥Ñ¥¿¡¼¥ó¡×¤Î¤³¤ÎÉôʬ¤Ï¾¤ÎÉôʬ¤è¤ê¶¯ÎϤǤʤ¤¤è¤¦¤À¡£"); #else msg_print("This section of the Pattern looks less powerful."); #endif - } - - - /* - * We could make the healing effect of the - * Pattern center one-time only to avoid various kinds - * of abuse, like luring the win monster into fighting you - * in the middle of the pattern... - */ + /* + * We could make the healing effect of the + * Pattern center one-time only to avoid various kinds + * of abuse, like luring the win monster into fighting you + * in the middle of the pattern... + */ + break; - else if (cave[py][px].feat == FEAT_PATTERN_OLD) - { + case PATTERN_TILE_OLD: /* No effect */ - } - else if (cave[py][px].feat == FEAT_PATTERN_XTRA1) - { + break; + + case PATTERN_TILE_TELEPORT: pattern_teleport(); - } - else if (cave[py][px].feat == FEAT_PATTERN_XTRA2) - { + break; + + case PATTERN_TILE_WRECKED: if (!IS_INVULN()) #ifdef JP take_hit(DAMAGE_NOESCAPE, 200, "²õ¤ì¤¿¡Ö¥Ñ¥¿¡¼¥ó¡×¤òÊ⤤¤¿¥À¥á¡¼¥¸", -1); #else take_hit(DAMAGE_NOESCAPE, 200, "walking the corrupted Pattern", -1); #endif + break; - } - else - { - if ((prace_is_(RACE_AMBERITE)) && !one_in_(2)) + default: + if (prace_is_(RACE_AMBERITE) && !one_in_(2)) return TRUE; else if (!IS_INVULN()) #ifdef JP @@ -804,7 +803,7 @@ msg_print(" #else take_hit(DAMAGE_NOESCAPE, damroll(1, 3), "walking the Pattern", -1); #endif - + break; } return TRUE; @@ -819,33 +818,33 @@ msg_print(" */ static void regenhp(int percent) { - s32b new_chp, new_chp_frac; - int old_chp; + s32b new_chp; + u32b new_chp_frac; + s32b old_chp; if (p_ptr->special_defense & KATA_KOUKIJIN) return; if (p_ptr->action == ACTION_HAYAGAKE) return; + /* Save the old hitpoints */ old_chp = p_ptr->chp; - /* Extract the new hitpoints */ - new_chp = ((long)p_ptr->mhp) * percent + PY_REGEN_HPBASE; - p_ptr->chp += (s16b)(new_chp >> 16); /* div 65536 */ + /* + * 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); + + /* 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); - /* check for overflow */ - if ((p_ptr->chp < 0) && (old_chp > 0)) p_ptr->chp = MAX_SHORT; - new_chp_frac = (new_chp & 0xFFFF) + p_ptr->chp_frac; /* mod 65536 */ - if (new_chp_frac >= 0x10000L) - { - p_ptr->chp_frac = (u16b)(new_chp_frac - 0x10000L); - p_ptr->chp++; - } - else - { - p_ptr->chp_frac = (u16b)new_chp_frac; - } /* Fully healed */ - if (p_ptr->chp >= p_ptr->mhp) + if (0 < s64b_cmp(p_ptr->chp, p_ptr->chp_frac, p_ptr->mhp, 0)) { p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; @@ -866,56 +865,80 @@ static void regenhp(int percent) /* - * Regenerate mana points -RAK- + * Regenerate mana points */ static void regenmana(int percent) { - s32b new_mana, new_mana_frac; - int old_csp; - bool old_csp_msp = (p_ptr->csp > p_ptr->msp); + s32b old_csp = p_ptr->csp; - if (p_ptr->special_defense & KATA_KOUKIJIN) return; - if ((p_ptr->pclass == CLASS_SAMURAI) && (p_ptr->regenerate)) percent /= 2; - old_csp = p_ptr->csp; - new_mana = ((long)p_ptr->msp) * percent + PY_REGEN_MNBASE; - if (old_csp_msp && (new_mana > 0)) - { - new_mana *= 32; - p_ptr->csp--; - p_ptr->csp -= (s16b)(new_mana >> 16); /* div 65536 */ - new_mana_frac = p_ptr->csp_frac + 0x10000L - (new_mana & 0xFFFF); - } - else + /* + * Excess mana will decay 32 times faster than normal + * regeneration rate. + */ + if (p_ptr->csp > p_ptr->msp) { - if (old_csp_msp) new_mana += ((((long)p_ptr->msp) * percent + PY_REGEN_MNBASE) * 32); - p_ptr->csp += (s16b)(new_mana >> 16); /* div 65536 */ + /* 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); - new_mana_frac = (new_mana & 0xFFFF) + p_ptr->csp_frac; /* mod 65536 */ - } - if (new_mana_frac >= 0x10000L) - { - p_ptr->csp_frac = (u16b)(new_mana_frac - 0x10000L); - p_ptr->csp++; - } - else - { - p_ptr->csp_frac = (u16b)(new_mana_frac); + /* 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), decay, decay_frac); + + /* Stop decaying */ + if (p_ptr->csp < p_ptr->msp) + { + p_ptr->csp = p_ptr->msp; + p_ptr->csp_frac = 0; + } } - /* check for overflow */ - if (p_ptr->csp < 0) + /* Regenerating mana (unless the player has excess mana) */ + else if (percent > 0) { - p_ptr->csp = 0; - p_ptr->csp_frac = 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); + + /* 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), new_mana, new_mana_frac); + + /* Must set frac to zero even if equal */ + if (p_ptr->csp >= p_ptr->msp) + { + p_ptr->csp = p_ptr->msp; + p_ptr->csp_frac = 0; + } } - /* Must set frac to zero even if equal */ - if ((old_csp_msp && p_ptr->csp < p_ptr->msp) || (!old_csp_msp && p_ptr->csp >= p_ptr->msp)) + + /* Reduce mana (even when the player has excess mana) */ + if (percent < 0) { - p_ptr->csp = p_ptr->msp; - p_ptr->csp_frac = 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); + + /* 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), reduce_mana, reduce_mana_frac); + + /* Check overflow */ + if (p_ptr->csp < 0) + { + p_ptr->csp = 0; + p_ptr->csp_frac = 0; + } } + /* Redraw mana */ if (old_csp != p_ptr->csp) { @@ -947,7 +970,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); @@ -1073,354 +1096,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 */ @@ -1446,6 +1121,11 @@ msg_print(" #else msg_print("Your light has gone out!"); #endif + + /* Recalculate torch radius */ + p_ptr->update |= (PU_TORCH); + + /* Some ego light lose its effects without fuel */ p_ptr->update |= (PU_BONUS); } @@ -1552,7 +1232,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("²¿¤â¿·¤·¤¤¤³¤È¤ÏȽ¤é¤Ê¤«¤Ã¤¿¡£"); @@ -1597,6 +1277,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); @@ -1640,102 +1323,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- @@ -1787,35 +1374,36 @@ static void check_music(void) { magic_type *s_ptr; int spell; - u32b need_mana; + s32b need_mana; + u32b need_mana_frac; /* Music singed by player */ if (p_ptr->pclass != CLASS_BARD) return; if (!p_ptr->magic_num1[0] && !p_ptr->magic_num1[1]) return; + if (p_ptr->anti_magic) + { + stop_singing(); + return; + } + spell = p_ptr->magic_num2[0]; s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell]; need_mana = mod_need_mana(s_ptr->smana, spell, REALM_MUSIC); - need_mana *= 0x8000; - if (((u32b)p_ptr->csp < (need_mana / 0x10000)) || (p_ptr->anti_magic)) + need_mana_frac = 0; + + /* 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) { stop_singing(); return; } else { - p_ptr->csp -= (u16b) (need_mana / 0x10000); - need_mana = (need_mana & 0xffff); - if ((u32b)p_ptr->csp_frac < need_mana) - { - p_ptr->csp--; - p_ptr->csp_frac += (u16b)(0x10000L - need_mana); - } - else - { - p_ptr->csp_frac -= (u16b)need_mana; - } + s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), need_mana, need_mana_frac); p_ptr->redraw |= PR_MANA; if (p_ptr->magic_num1[1]) @@ -1851,9 +1439,11 @@ 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); } + /* Choose one of items that have cursed flag */ static object_type *choose_cursed_obj_name(u32b flag) { @@ -1882,516 +1472,219 @@ static object_type *choose_cursed_obj_name(u32b flag) /* - * Handle certain things once every 10 game turns + * Handle timed damage and regeneration every 10 game turns */ -static void process_world(void) +static void process_world_aux_hp_and_sp(void) { - int x, y, i, j; - int regen_amount; + feature_type *f_ptr = &f_info[cave[py][px].feat]; bool cave_no_regen = FALSE; int upkeep_factor = 0; - cave_type *c_ptr; - object_type *o_ptr; - int temp; - object_kind *k_ptr; - const int dec_count = (easy_band ? 2 : 1); - - int day, hour, min, prev_min; + int upkeep_regen; - s32b len = TURNS_PER_TICK * TOWN_DAWN; - s32b tick = turn % len + len / 4; + /* Default regeneration */ + int regen_amount = PY_REGEN_NORMAL; - int quest_num = quest_number(dun_level); - extract_day_hour_min(&day, &hour, &min); - prev_min = (1440 * (tick - TURNS_PER_TICK) / len) % 60; + /*** Damage over Time ***/ - if ((turn - old_turn == (150 - dun_level) * TURNS_PER_TICK) - && dun_level && - !(quest_num && (is_fixed_quest_idx(quest_num) && - !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) || - !(quest[quest_num].flags & QUEST_FLAG_PRESET)))) && - !p_ptr->inside_battle) + /* Take damage from poison */ + if (p_ptr->poisoned && !IS_INVULN()) { - /* Announce feeling */ - do_cmd_feeling(); - - /* Update the level indicator */ - p_ptr->redraw |= (PR_DEPTH); + /* Take damage */ +#ifdef JP + take_hit(DAMAGE_NOESCAPE, 1, "ÆÇ", -1); +#else + take_hit(DAMAGE_NOESCAPE, 1, "poison", -1); +#endif - /* Disturb */ - if (disturb_minor) disturb(0, 0); } - if (p_ptr->inside_battle && !p_ptr->leaving) + /* Take damage from cuts */ + if (p_ptr->cut && !IS_INVULN()) { + int dam; - int i2, j2; - int win_m_idx = 0; - int number_mon = 0; + /* Mortal wound or Deep Gash */ + if (p_ptr->cut > 1000) + { + dam = 200; + } - /* Count all hostile monsters */ - for (i2 = 0; i2 < cur_wid; ++i2) - for (j2 = 0; j2 < cur_hgt; j2++) - if ((cave[j2][i2].m_idx > 0) && (cave[j2][i2].m_idx != p_ptr->riding)) - { - number_mon++; - win_m_idx = cave[j2][i2].m_idx; - } + else if (p_ptr->cut > 200) + { + dam = 80; + } - if (number_mon == 0) + /* Severe cut */ + else if (p_ptr->cut > 100) { -#ifdef JP -msg_print("ÁêÂǤÁ¤Ë½ª¤ï¤ê¤Þ¤·¤¿¡£"); -#else - msg_print("They have kill each other at the same time."); -#endif - msg_print(NULL); - p_ptr->energy_need = 0; - battle_monsters(); + dam = 32; } - else if ((number_mon-1) == 0) + + else if (p_ptr->cut > 50) { - char m_name[80]; - monster_type *wm_ptr; + dam = 16; + } - wm_ptr = &m_list[win_m_idx]; + else if (p_ptr->cut > 25) + { + dam = 7; + } - monster_desc(m_name, wm_ptr, 0); + else if (p_ptr->cut > 10) + { + dam = 3; + } + + /* Other cuts */ + else + { + dam = 1; + } + + /* Take damage */ #ifdef JP -msg_format("%s¤¬¾¡Íø¤·¤¿¡ª", m_name); + take_hit(DAMAGE_NOESCAPE, dam, "Ã×Ì¿½ý", -1); #else - msg_format("%s is winner!", m_name); + take_hit(DAMAGE_NOESCAPE, dam, "a fatal wound", -1); #endif - msg_print(NULL); - if (win_m_idx == (sel_monster+1)) + } + + + /* (Vampires) Take damage from sunlight */ + if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) + { + if (!dun_level && !p_ptr->resist_lite && !IS_INVULN() && is_daytime()) + { + if ((cave[py][px].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) { + /* Take damage */ #ifdef JP -msg_print("¤ª¤á¤Ç¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£"); -#else - msg_print("Congratulations."); -#endif -#ifdef JP -msg_format("%d¡ð¤ò¼õ¤±¼è¤Ã¤¿¡£", battle_odds); +msg_print("Æü¸÷¤¬¤¢¤Ê¤¿¤Î¥¢¥ó¥Ç¥Ã¥É¤ÎÆùÂΤò¾Æ¤­¾Ç¤¬¤·¤¿¡ª"); +take_hit(DAMAGE_NOESCAPE, 1, "Æü¸÷", -1); #else - msg_format("You received %d gold.", battle_odds); + msg_print("The sun's rays scorch your undead flesh!"); + take_hit(DAMAGE_NOESCAPE, 1, "sunlight", -1); #endif - p_ptr->au += battle_odds; + + cave_no_regen = TRUE; } - else - { + } + + if (inventory[INVEN_LITE].tval && (inventory[INVEN_LITE].name2 != EGO_LITE_DARKNESS) && + !p_ptr->resist_lite) + { + object_type * o_ptr = &inventory[INVEN_LITE]; + char o_name [MAX_NLEN]; + char ouch [MAX_NLEN+40]; + + /* Get an object description */ + object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); + #ifdef JP -msg_print("»ÄÇ°¤Ç¤·¤¿¡£"); +msg_format("%s¤¬¤¢¤Ê¤¿¤Î¥¢¥ó¥Ç¥Ã¥É¤ÎÆùÂΤò¾Æ¤­¾Ç¤¬¤·¤¿¡ª", o_name); #else - msg_print("You lost gold."); + msg_format("The %s scorches your undead flesh!", o_name); #endif - } - msg_print(NULL); - p_ptr->energy_need = 0; - battle_monsters(); - } - else if(turn - old_turn == 150*TURNS_PER_TICK) - { + + + cave_no_regen = TRUE; + + /* Get an object description */ + object_desc(o_name, o_ptr, OD_NAME_ONLY); + #ifdef JP -msg_print("¿½¤·Ê¬¤±¤¢¤ê¤Þ¤»¤ó¤¬¡¢¤³¤Î¾¡Éé¤Ï°ú¤­Ê¬¤±¤È¤µ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡£"); +sprintf(ouch, "%s¤òÁõÈ÷¤·¤¿¥À¥á¡¼¥¸", o_name); #else - msg_format("This battle have ended in a draw."); + sprintf(ouch, "wielding %s", o_name); #endif - p_ptr->au += kakekin; - msg_print(NULL); - p_ptr->energy_need = 0; - battle_monsters(); + + if (!IS_INVULN()) take_hit(DAMAGE_NOESCAPE, 1, ouch, -1); } } - /* Every 10 game turns */ - if (turn % TURNS_PER_TICK) return; + if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN() && !p_ptr->immune_fire) + { + int damage = 0; - /*** Check the Time and Load ***/ + if (have_flag(f_ptr->flags, FF_DEEP)) + { + damage = 6000 + randint0(4000); + } + else if (!p_ptr->levitation) + { + damage = 3000 + randint0(2000); + } - if (!(turn % (50*TURNS_PER_TICK))) - { - /* Check time and load */ - if ((0 != check_time()) || (0 != check_load())) + if (damage) { - /* Warning */ - if (closing_flag <= 2) - { - /* Disturb */ - disturb(0, 0); + if (prace_is_(RACE_ENT)) damage += damage / 3; + if (p_ptr->resist_fire) damage = damage / 3; + if (IS_OPPOSE_FIRE()) damage = damage / 3; - /* Count warnings */ - closing_flag++; + if (p_ptr->levitation) damage = damage / 5; - /* Message */ + damage = damage / 100 + (randint0(100) < (damage % 100)); + + if (p_ptr->levitation) + { #ifdef JP -msg_print("¥¢¥ó¥°¥Ð¥ó¥É¤Ø¤ÎÌ礬ÊĤ¸¤«¤«¤Ã¤Æ¤¤¤Þ¤¹..."); -msg_print("¥²¡¼¥à¤ò½ªÎ»¤¹¤ë¤«¥»¡¼¥Ö¤¹¤ë¤«¤·¤Æ²¼¤µ¤¤¡£"); + msg_print("Ç®¤Ç²Ð½ý¤·¤¿¡ª"); + take_hit(DAMAGE_NOESCAPE, damage, format("%s¤Î¾å¤ËÉâÍ·¤·¤¿¥À¥á¡¼¥¸", f_name + f_info[get_feat_mimic(&cave[py][px])].name), -1); #else - msg_print("The gates to ANGBAND are closing..."); - msg_print("Please finish up and/or save your game."); + msg_print("The heat burns you!"); + take_hit(DAMAGE_NOESCAPE, damage, format("flying over %s", f_name + f_info[get_feat_mimic(&cave[py][px])].name), -1); #endif - } - - /* Slam the gate */ else { - /* Message */ + cptr name = f_name + f_info[get_feat_mimic(&cave[py][px])].name; #ifdef JP -msg_print("º£¡¢¥¢¥ó¥°¥Ð¥ó¥É¤Ø¤ÎÌ礬ÊĤ¶¤µ¤ì¤Þ¤·¤¿¡£"); + msg_format("%s¤Ç²Ð½ý¤·¤¿¡ª", name); #else - msg_print("The gates to ANGBAND are now closed."); + msg_format("The %s burns you!", name); #endif - - - /* Stop playing */ - p_ptr->playing = FALSE; - - /* Leaving */ - p_ptr->leaving = TRUE; + take_hit(DAMAGE_NOESCAPE, damage, name, -1); } - } - } - /*** Attempt timed autosave ***/ - if (autosave_t && autosave_freq && !p_ptr->inside_battle) - { - if (!(turn % ((s32b)autosave_freq * TURNS_PER_TICK))) - do_cmd_save_game(TRUE); + cave_no_regen = TRUE; + } } - if (mon_fight) + if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) && + !p_ptr->levitation && !p_ptr->can_swim) { + if (p_ptr->total_weight > weight_limit()) + { + /* Take damage */ #ifdef JP - msg_print("²¿¤«¤¬Ê¹¤³¤¨¤¿¡£"); + msg_print("Å®¤ì¤Æ¤¤¤ë¡ª"); + take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->lev), "Å®¤ì", -1); #else - msg_print("You hear noise."); + msg_print("You are drowning!"); + take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->lev), "drowning", -1); #endif - } - /*** Handle the wilderness/town (sunshine) ***/ + cave_no_regen = TRUE; + } + } - /* While in town/wilderness */ - if (!dun_level && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena && !p_ptr->wild_mode) + if (p_ptr->riding) { - /* Hack -- Daybreak/Nighfall in town */ - if (!(turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2))) + int damage; + if ((r_info[m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !p_ptr->immune_fire) { - bool dawn; - - /* Check for dawn */ - dawn = (!(turn % (TURNS_PER_TICK * TOWN_DAWN))); - - /* Day breaks */ - if (dawn) - { - /* Message */ + damage = r_info[m_list[p_ptr->riding].r_idx].level / 2; + if (prace_is_(RACE_ENT)) damage += damage / 3; + if (p_ptr->resist_fire) damage = damage / 3; + if (IS_OPPOSE_FIRE()) damage = damage / 3; #ifdef JP - msg_print("Ì뤬ÌÀ¤±¤¿¡£"); +msg_print("Ç®¤¤¡ª"); +take_hit(DAMAGE_NOESCAPE, damage, "±ê¤Î¥ª¡¼¥é", -1); #else - msg_print("The sun has risen."); -#endif - - /* Hack -- Scan the town */ - for (y = 0; y < cur_hgt; y++) - { - for (x = 0; x < cur_wid; x++) - { - /* Get the cave grid */ - c_ptr = &cave[y][x]; - - /* Assume lit */ - c_ptr->info |= (CAVE_GLOW); - - /* Hack -- Memorize lit grids if allowed */ - if (view_perma_grids) c_ptr->info |= (CAVE_MARK); - - /* Hack -- Notice spot */ - note_spot(y, x); - } - } - } - - /* Night falls */ - else - { - byte feat; - - /* Message */ -#ifdef JP - msg_print("Æü¤¬ÄÀ¤ó¤À¡£"); -#else - msg_print("The sun has fallen."); -#endif - - /* Hack -- Scan the town */ - for (y = 0; y < cur_hgt; y++) - { - for (x = 0; x < cur_wid; x++) - { - /* Get the cave grid */ - c_ptr = &cave[y][x]; - - /* Feature code (applying "mimic" field) */ - feat = get_feat_mimic(c_ptr); - - if (!is_mirror_grid(c_ptr) && (feat != FEAT_QUEST_ENTER) && (feat != FEAT_ENTRANCE)) - { - /* Assume dark */ - c_ptr->info &= ~(CAVE_GLOW); - - if ((feat <= FEAT_INVIS) || (feat == FEAT_DIRT) || (feat == FEAT_GRASS)) - { - /* 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(); - } - } - - /* Update the monsters */ - p_ptr->update |= (PU_MONSTERS | PU_MON_LITE); - - /* Redraw map */ - p_ptr->redraw |= (PR_MAP); - - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - } - } - - /* While in the dungeon (vanilla_town or lite_town mode only) */ - else if ((vanilla_town || (lite_town && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena)) && dun_level) - { - /*** Shuffle the Storekeepers ***/ - - /* Chance is only once a day (while in dungeon) */ - if (!(turn % (TURNS_PER_TICK * STORE_TICKS))) - { - /* Sometimes, shuffle the shop-keepers */ - if (one_in_(STORE_SHUFFLE)) - { - int n; - - /* Pick a random shop (except home) */ - do - { - n = randint0(MAX_STORES); - } - while ((n == STORE_HOME) || (n == STORE_MUSEUM)); - - /* Message */ -#ifdef JP - if (cheat_xtra) msg_format("%s¤ÎŹ¼ç¤ò¥·¥ã¥Ã¥Õ¥ë¤·¤Þ¤¹¡£", f_name + f_info[FEAT_SHOP_HEAD + n].name); -#else - if (cheat_xtra) msg_format("Shuffle a Shopkeeper of %s.", f_name + f_info[FEAT_SHOP_HEAD + n].name); -#endif - - /* Shuffle it */ - store_shuffle(n); - } - } - } - - - /*** Process the monsters ***/ - - /* Check for creature generation. */ - if (one_in_(d_info[dungeon_type].max_m_alloc_chance) && - !p_ptr->inside_arena && !p_ptr->inside_quest && !p_ptr->inside_battle) - { - /* Make a new monster */ - (void)alloc_monster(MAX_SIGHT + 5, 0); - } - - /* Hack -- Check for creature regeneration */ - 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(); - - - /*** Damage over Time ***/ - - /* Take damage from poison */ - if (p_ptr->poisoned && !IS_INVULN()) - { - /* Take damage */ -#ifdef JP - take_hit(DAMAGE_NOESCAPE, 1, "ÆÇ", -1); -#else - take_hit(DAMAGE_NOESCAPE, 1, "poison", -1); -#endif - - } - - - /* (Vampires) Take damage from sunlight */ - if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) - { - if (!dun_level && !p_ptr->resist_lite && !IS_INVULN() && is_daytime()) - { - if ((cave[py][px].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) - { - /* Take damage */ -#ifdef JP -msg_print("Æü¸÷¤¬¤¢¤Ê¤¿¤Î¥¢¥ó¥Ç¥Ã¥É¤ÎÆùÂΤò¾Æ¤­¾Ç¤¬¤·¤¿¡ª"); -take_hit(DAMAGE_NOESCAPE, 1, "Æü¸÷", -1); -#else - msg_print("The sun's rays scorch your undead flesh!"); - take_hit(DAMAGE_NOESCAPE, 1, "sunlight", -1); -#endif - - cave_no_regen = TRUE; - } - } - - if (inventory[INVEN_LITE].tval && (inventory[INVEN_LITE].name2 != EGO_LITE_DARKNESS) && - !p_ptr->resist_lite) - { - object_type * o_ptr = &inventory[INVEN_LITE]; - char o_name [MAX_NLEN]; - char ouch [MAX_NLEN+40]; - - /* Get an object description */ - object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - -#ifdef JP -msg_format("%s¤¬¤¢¤Ê¤¿¤Î¥¢¥ó¥Ç¥Ã¥É¤ÎÆùÂΤò¾Æ¤­¾Ç¤¬¤·¤¿¡ª", o_name); -#else - msg_format("The %s scorches your undead flesh!", o_name); -#endif - - - cave_no_regen = TRUE; - - /* Get an object description */ - object_desc(o_name, o_ptr, OD_NAME_ONLY); - -#ifdef JP -sprintf(ouch, "%s¤òÁõÈ÷¤·¤¿¥À¥á¡¼¥¸", o_name); -#else - sprintf(ouch, "wielding %s", o_name); -#endif - - if (!IS_INVULN()) take_hit(DAMAGE_NOESCAPE, 1, ouch, -1); - } - } - - if ((cave[py][px].feat == FEAT_SHAL_LAVA) && - !IS_INVULN() && !p_ptr->immune_fire && !p_ptr->ffall) - { - int damage = 3000 + randint0(2000); - - if (prace_is_(RACE_ENT)) damage += damage/3; - if (p_ptr->resist_fire) damage = damage / 3; - if (IS_OPPOSE_FIRE()) damage = damage / 3; - damage = damage / 100 + (randint0(100) < (damage % 100)); - - if (damage) - { - /* Take damage */ -#ifdef JP -msg_print("ÍÏ´ä¤Ç²Ð½ý¤·¤¿¡ª"); -take_hit(DAMAGE_NOESCAPE, damage, "Àõ¤¤ÍÏ´äή", -1); -#else - msg_print("The lava burns you!"); - take_hit(DAMAGE_NOESCAPE, damage, "shallow lava", -1); -#endif - - cave_no_regen = TRUE; - } - } - - else if ((cave[py][px].feat == FEAT_DEEP_LAVA) && - !IS_INVULN() && !p_ptr->immune_fire) - { - int damage = 6000 + randint0(4000); - - cptr message; - cptr hit_from; - - if (p_ptr->resist_fire) damage = damage / 3; - if (IS_OPPOSE_FIRE()) damage = damage / 3; - - if (p_ptr->ffall) - { - damage = damage / 5; - -#ifdef JP -message = "Ç®¤Ç²Ð½ý¤·¤¿¡ª"; -hit_from = "¿¼¤¤ÍÏ´äή¤Î¾å¤ËÉâÍ·¤·¤¿¥À¥á¡¼¥¸"; -#else - message = "The heat burns you!"; - hit_from = "flying over deep lava"; -#endif - - } - else - { -#ifdef JP -message = "ÍÏ´ä¤Ç²Ð½ý¤·¤¿¡ª"; -hit_from = "¿¼¤¤ÍÏ´äή"; -#else - message = "The lava burns you!"; - hit_from = "deep lava"; -#endif - - } - - damage = damage / 100 + (randint0(100) < (damage % 100)); - if (damage) - { - /* Take damage */ - msg_print(message); - take_hit(DAMAGE_NOESCAPE, damage, hit_from, -1); - - cave_no_regen = TRUE; - } - } - - else if ((cave[py][px].feat == FEAT_DEEP_WATER) && !p_ptr->ffall && !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)) - { - /* Take damage */ -#ifdef JP -msg_print("Å®¤ì¤Æ¤¤¤ë¡ª"); -take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->lev), "Å®¤ì", -1); -#else - msg_print("You are drowning!"); - take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->lev), "drowning", -1); -#endif - - cave_no_regen = TRUE; - } - } - - if (p_ptr->riding) - { - int damage; - if ((r_info[m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !p_ptr->immune_fire) - { - damage = r_info[m_list[p_ptr->riding].r_idx].level / 2; - if (prace_is_(RACE_ENT)) damage += damage / 3; - if (p_ptr->resist_fire) damage = damage / 3; - if (IS_OPPOSE_FIRE()) damage = damage / 3; -#ifdef JP -msg_print("Ç®¤¤¡ª"); -take_hit(DAMAGE_NOESCAPE, damage, "±ê¤Î¥ª¡¼¥é", -1); -#else - msg_print("It's hot!"); - take_hit(DAMAGE_NOESCAPE, damage, "Fire aura", -1); + msg_print("It's hot!"); + take_hit(DAMAGE_NOESCAPE, damage, "Fire aura", -1); #endif } if ((r_info[m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !p_ptr->immune_elec) @@ -2430,14 +1723,9 @@ take_hit(DAMAGE_NOESCAPE, damage, " * reduced below 0 hp by being inside a stone wall; others * WILL BE! */ - if (!cave_floor_bold(py, px)) + if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) { - /* Player can walk through trees */ - if ((cave[py][px].feat == FEAT_TREES) || ((cave[py][px].feat == FEAT_MOUNTAIN) && !dun_level && p_ptr->ffall)) - { - /* Do nothing */ - } - else if (!IS_INVULN() && !p_ptr->wraith_form && !p_ptr->kabenuke && + if (!IS_INVULN() && !p_ptr->wraith_form && !p_ptr->kabenuke && ((p_ptr->chp > (p_ptr->lev / 5)) || !p_ptr->pass_wall)) { cptr dam_desc; @@ -2447,262 +1735,51 @@ take_hit(DAMAGE_NOESCAPE, damage, " if (p_ptr->pass_wall) { #ifdef JP -msg_print("ÂΤÎʬ»Ò¤¬Ê¬²ò¤·¤¿µ¤¤¬¤¹¤ë¡ª"); -dam_desc = "Ì©ÅÙ"; + msg_print("ÂΤÎʬ»Ò¤¬Ê¬²ò¤·¤¿µ¤¤¬¤¹¤ë¡ª"); + dam_desc = "Ì©ÅÙ"; #else msg_print("Your molecules feel disrupted!"); dam_desc = "density"; #endif - } else { #ifdef JP -msg_print("Êø¤ì¤¿´ä¤Ë²¡¤·ÄÙ¤µ¤ì¤¿¡ª"); -dam_desc = "¹Å¤¤´ä"; + msg_print("Êø¤ì¤¿´ä¤Ë²¡¤·ÄÙ¤µ¤ì¤¿¡ª"); + dam_desc = "¹Å¤¤´ä"; #else msg_print("You are being crushed!"); dam_desc = "solid rock"; #endif - } take_hit(DAMAGE_NOESCAPE, 1 + (p_ptr->lev / 5), dam_desc, -1); } } - if (!hour && !min) + + /*** handle regeneration ***/ + + /* Getting Weak */ + if (p_ptr->food < PY_FOOD_WEAK) { - if (min != prev_min) + /* Lower regeneration */ + if (p_ptr->food < PY_FOOD_STARVE) { - do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL); - determine_today_mon(FALSE); + regen_amount = 0; + } + else if (p_ptr->food < PY_FOOD_FAINT) + { + regen_amount = PY_REGEN_FAINT; + } + else + { + regen_amount = PY_REGEN_WEAK; } } - /* Nightmare mode activates the TY_CURSE at midnight */ - if (ironman_nightmare) - { - /* Require exact minute */ - if (min != prev_min) - { - /* Every 15 minutes after 11:00 pm */ - if ((hour == 23) && !(min % 15)) - { - /* Disturbing */ - disturb(0, 0); - - switch (min / 15) - { - case 0: - { -#ifdef JP -msg_print("±ó¤¯¤ÇÉÔµ¤Ì£¤Ê¾â¤Î²»¤¬ÌĤä¿¡£"); -#else - msg_print("You hear a distant bell toll ominously."); -#endif - - break; - } - case 1: - { -#ifdef JP -msg_print("±ó¤¯¤Ç¾â¤¬Æó²óÌĤä¿¡£"); -#else - msg_print("A distant bell sounds twice."); -#endif - - break; - } - case 2: - { -#ifdef JP -msg_print("±ó¤¯¤Ç¾â¤¬»°²óÌĤä¿¡£"); -#else - msg_print("A distant bell sounds three times."); -#endif - - break; - } - case 3: - { -#ifdef JP -msg_print("±ó¤¯¤Ç¾â¤¬»Í²óÌĤä¿¡£"); -#else - msg_print("A distant bell tolls four times."); -#endif - - break; - } - } - } - - /* TY_CURSE activates at mignight! */ - if (!hour && !min) - { - int count = 0; - - disturb(1, 0); -#ifdef JP -msg_print("±ó¤¯¤Ç¾â¤¬²¿²ó¤âÌĤꡢ»à¤ó¤À¤è¤¦¤ÊÀŤ±¤µ¤ÎÃæ¤Ø¾Ã¤¨¤Æ¤¤¤Ã¤¿¡£"); -#else - msg_print("A distant bell tolls many times, fading into an deathly silence."); -#endif - - activate_ty_curse(FALSE, &count); - } - } - } - - /* Take damage from cuts */ - if (p_ptr->cut && !IS_INVULN()) - { - /* Mortal wound or Deep Gash */ - if (p_ptr->cut > 1000) - { - i = 200; - } - - else if (p_ptr->cut > 200) - { - i = 80; - } - - /* Severe cut */ - else if (p_ptr->cut > 100) - { - i = 32; - } - - else if (p_ptr->cut > 50) - { - i = 16; - } - - else if (p_ptr->cut > 25) - { - i = 7; - } - - else if (p_ptr->cut > 10) - { - i = 3; - } - - /* Other cuts */ - else - { - i = 1; - } - - /* Take damage */ -#ifdef JP -take_hit(DAMAGE_NOESCAPE, i, "Ã×Ì¿½ý", -1); -#else - take_hit(DAMAGE_NOESCAPE, i, "a fatal wound", -1); -#endif - - } - - - /*** Check the Food, and Regenerate ***/ - - if (!p_ptr->inside_battle) - { - /* Digest normally */ - if (p_ptr->food < PY_FOOD_MAX) - { - /* Every 50 game turns */ - if (!(turn % (TURNS_PER_TICK*5))) - { - /* Basic digestion rate based on speed */ - i = SPEED_TO_ENERGY(p_ptr->pspeed); - - /* Regeneration takes more food */ - if (p_ptr->regenerate) i += 20; - if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK)) i+= 20; - if (p_ptr->cursed & TRC_FAST_DIGEST) i += 30; - - /* Slow digestion takes less food */ - if (p_ptr->slow_digest) i -= 5; - - /* Minimal digestion */ - if (i < 1) i = 1; - /* Maximal digestion */ - if (i > 100) i = 100; - - /* Digest some food */ - (void)set_food(p_ptr->food - i); - } - } - - /* Digest quickly when gorged */ - else - { - /* Digest a lot of food */ - (void)set_food(p_ptr->food - 100); - } - } - - /* Starve to death (slowly) */ - if (p_ptr->food < PY_FOOD_STARVE) - { - /* Calculate damage */ - i = (PY_FOOD_STARVE - p_ptr->food) / 10; - - /* Take damage */ -#ifdef JP - if (!IS_INVULN()) take_hit(DAMAGE_LOSELIFE, i, "¶õÊ¢", -1); -#else - if (!IS_INVULN()) take_hit(DAMAGE_LOSELIFE, i, "starvation", -1); -#endif - - } - - /* Default regeneration */ - regen_amount = PY_REGEN_NORMAL; - - /* Getting Weak */ - if (p_ptr->food < PY_FOOD_WEAK) - { - /* Lower regeneration */ - if (p_ptr->food < PY_FOOD_STARVE) - { - regen_amount = 0; - } - else if (p_ptr->food < PY_FOOD_FAINT) - { - regen_amount = PY_REGEN_FAINT; - } - else - { - regen_amount = PY_REGEN_WEAK; - } - - /* Getting Faint */ - if ((p_ptr->food < PY_FOOD_FAINT) && !p_ptr->inside_battle) - { - /* Faint occasionally */ - if (!p_ptr->paralyzed && (randint0(100) < 10)) - { - /* Message */ -#ifdef JP -msg_print("¤¢¤Þ¤ê¤Ë¤â¶õÊ¢¤Çµ¤À䤷¤Æ¤·¤Þ¤Ã¤¿¡£"); -#else - msg_print("You faint from the lack of food."); -#endif - - disturb(1, 0); - - /* Hack -- faint (bypass free action) */ - (void)set_paralyzed(p_ptr->paralyzed + 1 + randint0(5)); - } - } - } - - - /* Are we walking the pattern? */ - if (pattern_effect()) + /* Are we walking the pattern? */ + if (pattern_effect()) { cave_no_regen = TRUE; } @@ -2732,33 +1809,20 @@ msg_print(" upkeep_factor = calculate_upkeep(); - /* Regenerate the mana */ -/* if (p_ptr->csp < p_ptr->msp) */ + /* No regeneration while special action */ + if ((p_ptr->action == ACTION_LEARN) || + (p_ptr->action == ACTION_HAYAGAKE) || + (p_ptr->special_defense & KATA_KOUKIJIN)) { - if (upkeep_factor) - { - s32b upkeep_regen = ((100 - upkeep_factor) * regen_amount); - if ((p_ptr->action == ACTION_LEARN) || (p_ptr->action == ACTION_HAYAGAKE)) upkeep_regen -= regen_amount; - regenmana(upkeep_regen/100); + upkeep_factor += 100; + } -#ifdef TRACK_FRIENDS - if (p_ptr->wizard) - { -#ifdef JP -msg_format("£Í£Ð²óÉü: %d/%d", upkeep_regen, regen_amount); -#else - msg_format("Regen: %d/%d", upkeep_regen, regen_amount); -#endif + /* Regenerate the mana */ + upkeep_regen = (100 - upkeep_factor) * regen_amount; + regenmana(upkeep_regen); - } -#endif /* TRACK_FRIENDS */ - } - else if (p_ptr->action != ACTION_LEARN) - { - regenmana(regen_amount); - } - } + /* Recharge magic eater's power */ if (p_ptr->pclass == CLASS_MAGIC_EATER) { regenmagic(regen_amount); @@ -2769,9 +1833,9 @@ msg_format(" while (upkeep_factor > 100) { #ifdef JP -msg_print("¤³¤ó¤Ê¤Ë¿¤¯¤Î¥Ú¥Ã¥È¤òÀ©¸æ¤Ç¤­¤Ê¤¤¡ª"); + msg_print("¤³¤ó¤Ê¤Ë¿¤¯¤Î¥Ú¥Ã¥È¤òÀ©¸æ¤Ç¤­¤Ê¤¤¡ª"); #else - msg_print("Such much pets cannot be controled at once!"); + msg_print("Too many pets to control at once!"); #endif msg_print(NULL); do_cmd_pet_dismiss(); @@ -2799,18 +1863,18 @@ msg_print(" /* Regenerate Hit Points if needed */ if ((p_ptr->chp < p_ptr->mhp) && !cave_no_regen) { - if ((cave[py][px].feat < FEAT_PATTERN_END) && - (cave[py][px].feat >= FEAT_PATTERN_START)) - { - regenhp(regen_amount / 5); /* Hmmm. this should never happen? */ - } - else - { - regenhp(regen_amount); - } + regenhp(regen_amount); } +} +/* + * Handle timeout every 10 game turns + */ +static void process_world_aux_timeout(void) +{ + const int dec_count = (easy_band ? 2 : 1); + /*** Timeout Various Things ***/ /* Mimic */ @@ -2879,9 +1943,9 @@ msg_print(" } /* 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 */ @@ -3112,19 +2176,22 @@ msg_print(" /* Apply some healing */ (void)set_cut(p_ptr->cut - adjust); } +} - - /*** Process Light ***/ - +/* + * Handle burning fuel every 10 game turns + */ +static void process_world_aux_light(void) +{ /* Check for light being wielded */ - o_ptr = &inventory[INVEN_LITE]; + object_type *o_ptr = &inventory[INVEN_LITE]; /* Burn some fuel in the current lite */ 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) @@ -3137,634 +2204,654 @@ msg_print(" notice_lite_change(o_ptr); } } +} + + +/* + * Handle mutation effects once every 10 game turns + */ +static void process_world_aux_mutation(void) +{ + /* No mutation with effects */ + if (!p_ptr->muta2) return; + + /* No effect on monster arena */ + if (p_ptr->inside_battle) return; - /* Calculate torch radius */ - p_ptr->update |= (PU_TORCH); + /* No effect on the global map */ + if (p_ptr->wild_mode) return; - /*** Process mutation effects ***/ - if (p_ptr->muta2 && !p_ptr->inside_battle && !p_ptr->wild_mode) + if ((p_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000)) { - if ((p_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000)) - { - disturb(0, 0); + disturb(0, 0); #ifdef JP -msg_print("¥¦¥¬¥¡¥¡¥¢¡ª"); -msg_print("·ãÅܤÎȯºî¤Ë½±¤ï¤ì¤¿¡ª"); + msg_print("¥¦¥¬¥¡¥¡¥¢¡ª"); + msg_print("·ãÅܤÎȯºî¤Ë½±¤ï¤ì¤¿¡ª"); #else - msg_print("RAAAAGHH!"); - msg_print("You feel a fit of rage coming over you!"); + msg_print("RAAAAGHH!"); + msg_print("You feel a fit of rage coming over you!"); #endif - (void)set_shero(10 + randint1(p_ptr->lev), FALSE); - } + (void)set_shero(10 + randint1(p_ptr->lev), FALSE); + } - if ((p_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13)) + if ((p_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13)) + { + if (!p_ptr->resist_fear) { - if (!p_ptr->resist_fear) - { - disturb(0, 0); + disturb(0, 0); #ifdef JP -msg_print("¤È¤Æ¤â°Å¤¤... ¤È¤Æ¤â¶²¤¤¡ª"); + msg_print("¤È¤Æ¤â°Å¤¤... ¤È¤Æ¤â¶²¤¤¡ª"); #else - msg_print("It's so dark... so scary!"); + msg_print("It's so dark... so scary!"); #endif - set_afraid(p_ptr->afraid + 13 + randint1(26)); - } + set_afraid(p_ptr->afraid + 13 + randint1(26)); } + } - if ((p_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88)) + if ((p_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88)) + { + if (!p_ptr->resist_nexus && !(p_ptr->muta1 & MUT1_VTELEPORT) && + !p_ptr->anti_tele) { - if (!p_ptr->resist_nexus && !(p_ptr->muta1 & MUT1_VTELEPORT) && - !p_ptr->anti_tele) - { - disturb(0, 0); + disturb(0, 0); - /* Teleport player */ + /* Teleport player */ #ifdef JP -msg_print("¤¢¤Ê¤¿¤Î°ÌÃÖ¤ÏÆÍÁ³¤Ò¤¸¤ç¤¦¤ËÉÔ³ÎÄê¤Ë¤Ê¤Ã¤¿..."); + msg_print("¤¢¤Ê¤¿¤Î°ÌÃÖ¤ÏÆÍÁ³¤Ò¤¸¤ç¤¦¤ËÉÔ³ÎÄê¤Ë¤Ê¤Ã¤¿..."); #else - msg_print("Your position suddenly seems very uncertain..."); + msg_print("Your position suddenly seems very uncertain..."); #endif - msg_print(NULL); - teleport_player(40); - } + msg_print(NULL); + teleport_player(40, TELEPORT_PASSIVE); } + } - if ((p_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321)) + if ((p_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321)) + { + if (!p_ptr->resist_conf && !p_ptr->resist_chaos) { - if (!p_ptr->resist_conf && !p_ptr->resist_chaos) - { - disturb(0, 0); - p_ptr->redraw |= PR_EXTRA; + disturb(0, 0); + p_ptr->redraw |= PR_EXTRA; #ifdef JP -msg_print("¤¤¤Ò¤­¤¬¤â¡¼¤í¡¼¤È¤Ò¤Æ¤­¤¿¤­¤¬¤Õ¤ë...¥Ò¥Ã¥¯¡ª"); + msg_print("¤¤¤Ò¤­¤¬¤â¡¼¤í¡¼¤È¤Ò¤Æ¤­¤¿¤­¤¬¤Õ¤ë...¥Ò¥Ã¥¯¡ª"); #else - msg_print("You feel a SSSCHtupor cOmINg over yOu... *HIC*!"); + msg_print("You feel a SSSCHtupor cOmINg over yOu... *HIC*!"); #endif - } + } - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr->confused + randint0(20) + 15); - } + if (!p_ptr->resist_conf) + { + (void)set_confused(p_ptr->confused + randint0(20) + 15); + } - if (!p_ptr->resist_chaos) + if (!p_ptr->resist_chaos) + { + if (one_in_(20)) { - if (one_in_(20)) - { - msg_print(NULL); - if (one_in_(3)) lose_all_info(); - else wiz_dark(); - teleport_player(100); - wiz_dark(); + msg_print(NULL); + if (one_in_(3)) lose_all_info(); + else wiz_dark(); + (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE); + wiz_dark(); #ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¸«ÃΤé¤Ì¾ì½ê¤ÇÌܤ¬Àä᤿...Ƭ¤¬Äˤ¤¡£"); -msg_print("²¿¤â³Ð¤¨¤Æ¤¤¤Ê¤¤¡£¤É¤¦¤ä¤Ã¤Æ¤³¤³¤ËÍ褿¤«¤âʬ¤«¤é¤Ê¤¤¡ª"); + msg_print("¤¢¤Ê¤¿¤Ï¸«ÃΤé¤Ì¾ì½ê¤ÇÌܤ¬Àä᤿...Ƭ¤¬Äˤ¤¡£"); + msg_print("²¿¤â³Ð¤¨¤Æ¤¤¤Ê¤¤¡£¤É¤¦¤ä¤Ã¤Æ¤³¤³¤ËÍ褿¤«¤âʬ¤«¤é¤Ê¤¤¡ª"); #else - msg_print("You wake up somewhere with a sore head..."); - msg_print("You can't remember a thing, or how you got here!"); + msg_print("You wake up somewhere with a sore head..."); + msg_print("You can't remember a thing, or how you got here!"); #endif - } - else + } + else + { + if (one_in_(3)) { - if (one_in_(3)) - { #ifdef JP -msg_print("¤­¡Á¤ì¤¤¤Ê¤Á¤ç¤ª¤Á¤ç¤é¤È¤ó¤ì¤¤¤ë¡Á"); + msg_print("¤­¡Á¤ì¤¤¤Ê¤Á¤ç¤ª¤Á¤ç¤é¤È¤ó¤ì¤¤¤ë¡Á"); #else - msg_print("Thishcischs GooDSChtuff!"); + msg_print("Thishcischs GooDSChtuff!"); #endif - (void)set_image(p_ptr->image + randint0(150) + 150); - } + (void)set_image(p_ptr->image + randint0(150) + 150); } } } + } - if ((p_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42)) + if ((p_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42)) + { + if (!p_ptr->resist_chaos) { - if (!p_ptr->resist_chaos) - { - disturb(0, 0); - p_ptr->redraw |= PR_EXTRA; - (void)set_image(p_ptr->image + randint0(50) + 20); - } + disturb(0, 0); + p_ptr->redraw |= PR_EXTRA; + (void)set_image(p_ptr->image + randint0(50) + 20); } + } - if ((p_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13)) - { - disturb(0, 0); + if ((p_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13)) + { + disturb(0, 0); #ifdef JP -msg_print("¥Ö¥¥¡¼¡¼¥Ã¡ª¤ª¤Ã¤È¡£"); + msg_print("¥Ö¥¥¡¼¡¼¥Ã¡ª¤ª¤Ã¤È¡£"); #else - msg_print("BRRAAAP! Oops."); + msg_print("BRRAAAP! Oops."); #endif - msg_print(NULL); - fire_ball(GF_POIS, 0, p_ptr->lev, 3); - } + msg_print(NULL); + fire_ball(GF_POIS, 0, p_ptr->lev, 3); + } - if ((p_ptr->muta2 & MUT2_PROD_MANA) && - !p_ptr->anti_magic && one_in_(9000)) - { - int dire = 0; - disturb(0, 0); + if ((p_ptr->muta2 & MUT2_PROD_MANA) && + !p_ptr->anti_magic && one_in_(9000)) + { + int dire = 0; + disturb(0, 0); #ifdef JP -msg_print("ËâË¡¤Î¥¨¥Í¥ë¥®¡¼¤¬ÆÍÁ³¤¢¤Ê¤¿¤ÎÃæ¤Ëή¤ì¹þ¤ó¤Ç¤­¤¿¡ª¥¨¥Í¥ë¥®¡¼¤ò²òÊü¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡ª"); + msg_print("ËâË¡¤Î¥¨¥Í¥ë¥®¡¼¤¬ÆÍÁ³¤¢¤Ê¤¿¤ÎÃæ¤Ëή¤ì¹þ¤ó¤Ç¤­¤¿¡ª¥¨¥Í¥ë¥®¡¼¤ò²òÊü¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡ª"); #else - msg_print("Magical energy flows through you! You must release it!"); + msg_print("Magical energy flows through you! You must release it!"); #endif - flush(); - msg_print(NULL); - (void)get_hack_dir(&dire); - fire_ball(GF_MANA, dire, p_ptr->lev * 2, 3); - } + flush(); + msg_print(NULL); + (void)get_hack_dir(&dire); + fire_ball(GF_MANA, dire, p_ptr->lev * 2, 3); + } - if ((p_ptr->muta2 & MUT2_ATT_DEMON) && - !p_ptr->anti_magic && (randint1(6666) == 666)) - { - bool pet = one_in_(6); - u32b mode = PM_ALLOW_GROUP; + if ((p_ptr->muta2 & MUT2_ATT_DEMON) && + !p_ptr->anti_magic && (randint1(6666) == 666)) + { + bool pet = one_in_(6); + u32b mode = PM_ALLOW_GROUP; - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); + if (pet) mode |= PM_FORCE_PET; + else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - if (summon_specific((pet ? -1 : 0), py, px, + if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_DEMON, mode)) - { + { #ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤ò°ú¤­´ó¤»¤¿¡ª"); + msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤ò°ú¤­´ó¤»¤¿¡ª"); #else - msg_print("You have attracted a demon!"); + msg_print("You have attracted a demon!"); #endif - disturb(0, 0); - } + disturb(0, 0); } + } - if ((p_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000)) + if ((p_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000)) + { + disturb(0, 0); + if (one_in_(2)) { - disturb(0, 0); - if (one_in_(2)) - { #ifdef JP -msg_print("ÀºÎÏŪ¤Ç¤Ê¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£"); + msg_print("ÀºÎÏŪ¤Ç¤Ê¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£"); #else - msg_print("You feel less energetic."); + msg_print("You feel less energetic."); #endif - if (p_ptr->fast > 0) - { - set_fast(0, TRUE); - } - else - { - set_slow(randint1(30) + 10, FALSE); - } + if (p_ptr->fast > 0) + { + set_fast(0, TRUE); } else { + set_slow(randint1(30) + 10, FALSE); + } + } + else + { #ifdef JP -msg_print("ÀºÎÏŪ¤Ë¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£"); + msg_print("ÀºÎÏŪ¤Ë¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£"); #else - msg_print("You feel more energetic."); + msg_print("You feel more energetic."); #endif - if (p_ptr->slow > 0) - { - set_slow(0, TRUE); - } - else - { - set_fast(randint1(30) + 10, FALSE); - } + if (p_ptr->slow > 0) + { + set_slow(0, TRUE); + } + else + { + set_fast(randint1(30) + 10, FALSE); } - msg_print(NULL); } - if ((p_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000)) - { - disturb(0, 0); + msg_print(NULL); + } + if ((p_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000)) + { + disturb(0, 0); #ifdef JP -msg_print("ÆÍÁ³¤Û¤È¤ó¤É¸ÉÆȤˤʤ俵¤¤¬¤¹¤ë¡£"); + msg_print("ÆÍÁ³¤Û¤È¤ó¤É¸ÉÆȤˤʤ俵¤¤¬¤¹¤ë¡£"); #else - msg_print("You suddenly feel almost lonely."); + msg_print("You suddenly feel almost lonely."); #endif - banish_monsters(100); - if (!dun_level && p_ptr->town_num) - { - int n; + banish_monsters(100); + if (!dun_level && p_ptr->town_num) + { + int n; - /* Pick a random shop (except home) */ - do - { - n = randint0(MAX_STORES); - } - while ((n == STORE_HOME) || (n == STORE_MUSEUM)); + /* Pick a random shop (except home) */ + do + { + n = randint0(MAX_STORES); + } + while ((n == STORE_HOME) || (n == STORE_MUSEUM)); #ifdef JP - msg_print("Ź¤Î¼ç¿Í¤¬µÖ¤Ë¸þ¤«¤Ã¤ÆÁö¤Ã¤Æ¤¤¤ë¡ª"); + msg_print("Ź¤Î¼ç¿Í¤¬µÖ¤Ë¸þ¤«¤Ã¤ÆÁö¤Ã¤Æ¤¤¤ë¡ª"); #else - msg_print("You see one of the shopkeepers running for the hills!"); + msg_print("You see one of the shopkeepers running for the hills!"); #endif - store_shuffle(n); - } - msg_print(NULL); + store_shuffle(n); } + msg_print(NULL); + } - if ((p_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000)) - { - object_type *o_ptr; + if ((p_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000)) + { + object_type *o_ptr; #ifdef JP -msg_print("±Æ¤Ë¤Ä¤Ä¤Þ¤ì¤¿¡£"); + msg_print("±Æ¤Ë¤Ä¤Ä¤Þ¤ì¤¿¡£"); #else - msg_print("A shadow passes over you."); + msg_print("A shadow passes over you."); #endif - msg_print(NULL); + msg_print(NULL); - /* Absorb light from the current possition */ - if ((cave[py][px].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) - { - hp_player(10); - } + /* Absorb light from the current possition */ + if ((cave[py][px].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) + { + hp_player(10); + } - o_ptr = &inventory[INVEN_LITE]; + o_ptr = &inventory[INVEN_LITE]; - /* Absorb some fuel in the current lite */ - if (o_ptr->tval == TV_LITE) + /* Absorb some fuel in the current lite */ + if (o_ptr->tval == TV_LITE) + { + /* Use some fuel (except on artifacts) */ + if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0)) { - /* Use some fuel (except on artifacts) */ - if (!artifact_p(o_ptr) && (o_ptr->xtra4 > 0)) - { - /* Heal the player a bit */ - hp_player(o_ptr->xtra4 / 20); + /* Heal the player a bit */ + hp_player(o_ptr->xtra4 / 20); - /* Decrease life-span of lite */ - o_ptr->xtra4 /= 2; + /* Decrease life-span of lite */ + o_ptr->xtra4 /= 2; #ifdef JP -msg_print("¸÷¸»¤«¤é¥¨¥Í¥ë¥®¡¼¤òµÛ¼ý¤·¤¿¡ª"); + msg_print("¸÷¸»¤«¤é¥¨¥Í¥ë¥®¡¼¤òµÛ¼ý¤·¤¿¡ª"); #else - msg_print("You absorb energy from your light!"); + msg_print("You absorb energy from your light!"); #endif - /* Notice interesting fuel steps */ - notice_lite_change(o_ptr); - } + /* Notice interesting fuel steps */ + notice_lite_change(o_ptr); } - - /* - * Unlite the area (radius 10) around player and - * do 50 points damage to every affected monster - */ - unlite_area(50, 10); } - if ((p_ptr->muta2 & MUT2_ATT_ANIMAL) && - !p_ptr->anti_magic && one_in_(7000)) - { - bool pet = one_in_(3); - u32b mode = PM_ALLOW_GROUP; + /* + * Unlite the area (radius 10) around player and + * do 50 points damage to every affected monster + */ + unlite_area(50, 10); + } + + if ((p_ptr->muta2 & MUT2_ATT_ANIMAL) && + !p_ptr->anti_magic && one_in_(7000)) + { + bool pet = one_in_(3); + u32b mode = PM_ALLOW_GROUP; - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); + if (pet) mode |= PM_FORCE_PET; + else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_ANIMAL, mode)) - { + if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_ANIMAL, mode)) + { #ifdef JP -msg_print("ưʪ¤ò°ú¤­´ó¤»¤¿¡ª"); + msg_print("ưʪ¤ò°ú¤­´ó¤»¤¿¡ª"); #else - msg_print("You have attracted an animal!"); + msg_print("You have attracted an animal!"); #endif - disturb(0, 0); - } + disturb(0, 0); } + } - if ((p_ptr->muta2 & MUT2_RAW_CHAOS) && - !p_ptr->anti_magic && one_in_(8000)) - { - disturb(0, 0); + if ((p_ptr->muta2 & MUT2_RAW_CHAOS) && + !p_ptr->anti_magic && one_in_(8000)) + { + disturb(0, 0); #ifdef JP -msg_print("¼þ¤ê¤Î¶õ´Ö¤¬ÏĤó¤Ç¤¤¤ëµ¤¤¬¤¹¤ë¡ª"); + msg_print("¼þ¤ê¤Î¶õ´Ö¤¬ÏĤó¤Ç¤¤¤ëµ¤¤¬¤¹¤ë¡ª"); #else - msg_print("You feel the world warping around you!"); + msg_print("You feel the world warping around you!"); #endif - msg_print(NULL); - fire_ball(GF_CHAOS, 0, p_ptr->lev, 8); - } - if ((p_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000)) - { - if (!lose_mutation(0)) + msg_print(NULL); + fire_ball(GF_CHAOS, 0, p_ptr->lev, 8); + } + if ((p_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000)) + { + if (!lose_mutation(0)) #ifdef JP -msg_print("´ñ̯¤Ê¤¯¤é¤¤ÉáÄ̤ˤʤ俵¤¤¬¤¹¤ë¡£"); + msg_print("´ñ̯¤Ê¤¯¤é¤¤ÉáÄ̤ˤʤ俵¤¤¬¤¹¤ë¡£"); #else - msg_print("You feel oddly normal."); + msg_print("You feel oddly normal."); #endif - } - if ((p_ptr->muta2 & MUT2_WRAITH) && !p_ptr->anti_magic && one_in_(3000)) - { - disturb(0, 0); + } + if ((p_ptr->muta2 & MUT2_WRAITH) && !p_ptr->anti_magic && one_in_(3000)) + { + disturb(0, 0); #ifdef JP -msg_print("Èóʪ¼Á²½¤·¤¿¡ª"); + msg_print("Èóʪ¼Á²½¤·¤¿¡ª"); #else - msg_print("You feel insubstantial!"); + msg_print("You feel insubstantial!"); #endif - msg_print(NULL); - set_wraith_form(randint1(p_ptr->lev / 2) + (p_ptr->lev / 2), FALSE); - } - if ((p_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000)) - { - do_poly_wounds(); - } - if ((p_ptr->muta2 & MUT2_WASTING) && one_in_(3000)) - { - int which_stat = randint0(6); - int sustained = FALSE; + msg_print(NULL); + set_wraith_form(randint1(p_ptr->lev / 2) + (p_ptr->lev / 2), FALSE); + } + if ((p_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000)) + { + do_poly_wounds(); + } + if ((p_ptr->muta2 & MUT2_WASTING) && one_in_(3000)) + { + int which_stat = randint0(6); + int sustained = FALSE; - switch (which_stat) - { - case A_STR: - if (p_ptr->sustain_str) sustained = TRUE; - break; - case A_INT: - if (p_ptr->sustain_int) sustained = TRUE; - break; - case A_WIS: - if (p_ptr->sustain_wis) sustained = TRUE; - break; - case A_DEX: - if (p_ptr->sustain_dex) sustained = TRUE; - break; - case A_CON: - if (p_ptr->sustain_con) sustained = TRUE; - break; - case A_CHR: - if (p_ptr->sustain_chr) sustained = TRUE; - break; - default: + switch (which_stat) + { + case A_STR: + if (p_ptr->sustain_str) sustained = TRUE; + break; + case A_INT: + if (p_ptr->sustain_int) sustained = TRUE; + break; + case A_WIS: + if (p_ptr->sustain_wis) sustained = TRUE; + break; + case A_DEX: + if (p_ptr->sustain_dex) sustained = TRUE; + break; + case A_CON: + if (p_ptr->sustain_con) sustained = TRUE; + break; + case A_CHR: + if (p_ptr->sustain_chr) sustained = TRUE; + break; + default: #ifdef JP -msg_print("ÉÔÀµ¤Ê¾õÂÖ¡ª"); + msg_print("ÉÔÀµ¤Ê¾õÂÖ¡ª"); #else - msg_print("Invalid stat chosen!"); + msg_print("Invalid stat chosen!"); #endif - sustained = TRUE; - } + sustained = TRUE; + } - if (!sustained) - { - disturb(0, 0); + if (!sustained) + { + disturb(0, 0); #ifdef JP -msg_print("¼«Ê¬¤¬¿ê¼å¤·¤Æ¤¤¤¯¤Î¤¬Ê¬¤«¤ë¡ª"); + msg_print("¼«Ê¬¤¬¿ê¼å¤·¤Æ¤¤¤¯¤Î¤¬Ê¬¤«¤ë¡ª"); #else - msg_print("You can feel yourself wasting away!"); + msg_print("You can feel yourself wasting away!"); #endif - msg_print(NULL); - (void)dec_stat(which_stat, randint1(6) + 6, one_in_(3)); - } + msg_print(NULL); + (void)dec_stat(which_stat, randint1(6) + 6, one_in_(3)); } - if ((p_ptr->muta2 & MUT2_ATT_DRAGON) && - !p_ptr->anti_magic && one_in_(3000)) - { - bool pet = one_in_(5); - u32b mode = PM_ALLOW_GROUP; + } + if ((p_ptr->muta2 & MUT2_ATT_DRAGON) && + !p_ptr->anti_magic && one_in_(3000)) + { + bool pet = one_in_(5); + u32b mode = PM_ALLOW_GROUP; - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); + if (pet) mode |= PM_FORCE_PET; + else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_DRAGON, mode)) - { + if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_DRAGON, mode)) + { #ifdef JP -msg_print("¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª"); + msg_print("¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª"); #else - msg_print("You have attracted a dragon!"); + msg_print("You have attracted a dragon!"); #endif - disturb(0, 0); - } + disturb(0, 0); } - if ((p_ptr->muta2 & MUT2_WEIRD_MIND) && !p_ptr->anti_magic && - one_in_(3000)) + } + if ((p_ptr->muta2 & MUT2_WEIRD_MIND) && !p_ptr->anti_magic && + one_in_(3000)) + { + if (p_ptr->tim_esp > 0) { - if (p_ptr->tim_esp > 0) - { #ifdef JP -msg_print("Àº¿À¤Ë¤â¤ä¤¬¤«¤«¤Ã¤¿¡ª"); + msg_print("Àº¿À¤Ë¤â¤ä¤¬¤«¤«¤Ã¤¿¡ª"); #else - msg_print("Your mind feels cloudy!"); + msg_print("Your mind feels cloudy!"); #endif - set_tim_esp(0, TRUE); - } - else - { + set_tim_esp(0, TRUE); + } + else + { #ifdef JP -msg_print("Àº¿À¤¬¹­¤¬¤Ã¤¿¡ª"); + msg_print("Àº¿À¤¬¹­¤¬¤Ã¤¿¡ª"); #else - msg_print("Your mind expands!"); + msg_print("Your mind expands!"); #endif - set_tim_esp(p_ptr->lev, FALSE); - } + set_tim_esp(p_ptr->lev, FALSE); } - if ((p_ptr->muta2 & MUT2_NAUSEA) && !p_ptr->slow_digest && - one_in_(9000)) - { - disturb(0, 0); + } + if ((p_ptr->muta2 & MUT2_NAUSEA) && !p_ptr->slow_digest && + one_in_(9000)) + { + disturb(0, 0); #ifdef JP -msg_print("°ß¤¬áÛÚ»¤·¡¢¿©»ö¤ò¼º¤Ã¤¿¡ª"); + msg_print("°ß¤¬áÛÚ»¤·¡¢¿©»ö¤ò¼º¤Ã¤¿¡ª"); #else - msg_print("Your stomach roils, and you lose your lunch!"); + msg_print("Your stomach roils, and you lose your lunch!"); #endif - msg_print(NULL); - set_food(PY_FOOD_WEAK); - } + msg_print(NULL); + set_food(PY_FOOD_WEAK); + if (music_singing_any()) stop_singing(); + } - if ((p_ptr->muta2 & MUT2_WALK_SHAD) && - !p_ptr->anti_magic && one_in_(12000) && !p_ptr->inside_arena) - { - alter_reality(); - } + if ((p_ptr->muta2 & MUT2_WALK_SHAD) && + !p_ptr->anti_magic && one_in_(12000) && !p_ptr->inside_arena) + { + alter_reality(); + } - if ((p_ptr->muta2 & MUT2_WARNING) && one_in_(1000)) - { - int danger_amount = 0; - int monster; + if ((p_ptr->muta2 & MUT2_WARNING) && one_in_(1000)) + { + int danger_amount = 0; + int monster; - for (monster = 0; monster < m_max; monster++) - { - monster_type *m_ptr = &m_list[monster]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + for (monster = 0; monster < m_max; monster++) + { + monster_type *m_ptr = &m_list[monster]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; - /* Paranoia -- Skip dead monsters */ - if (!m_ptr->r_idx) continue; + /* Paranoia -- Skip dead monsters */ + if (!m_ptr->r_idx) continue; - if (r_ptr->level >= p_ptr->lev) - { - danger_amount += r_ptr->level - p_ptr->lev + 1; - } + if (r_ptr->level >= p_ptr->lev) + { + danger_amount += r_ptr->level - p_ptr->lev + 1; } + } - if (danger_amount > 100) + if (danger_amount > 100) #ifdef JP -msg_print("Èó¾ï¤Ë¶²¤í¤·¤¤µ¤¤¬¤¹¤ë¡ª"); + msg_print("Èó¾ï¤Ë¶²¤í¤·¤¤µ¤¤¬¤¹¤ë¡ª"); #else - msg_print("You feel utterly terrified!"); + msg_print("You feel utterly terrified!"); #endif - else if (danger_amount > 50) + else if (danger_amount > 50) #ifdef JP -msg_print("¶²¤í¤·¤¤µ¤¤¬¤¹¤ë¡ª"); + msg_print("¶²¤í¤·¤¤µ¤¤¬¤¹¤ë¡ª"); #else - msg_print("You feel terrified!"); + msg_print("You feel terrified!"); #endif - else if (danger_amount > 20) + else if (danger_amount > 20) #ifdef JP -msg_print("Èó¾ï¤Ë¿´Çۤʵ¤¤¬¤¹¤ë¡ª"); + msg_print("Èó¾ï¤Ë¿´Çۤʵ¤¤¬¤¹¤ë¡ª"); #else - msg_print("You feel very worried!"); + msg_print("You feel very worried!"); #endif - else if (danger_amount > 10) + else if (danger_amount > 10) #ifdef JP -msg_print("¿´Çۤʵ¤¤¬¤¹¤ë¡ª"); + msg_print("¿´Çۤʵ¤¤¬¤¹¤ë¡ª"); #else - msg_print("You feel paranoid!"); + msg_print("You feel paranoid!"); #endif - else if (danger_amount > 5) + else if (danger_amount > 5) #ifdef JP -msg_print("¤Û¤È¤ó¤É°ÂÁ´¤Êµ¤¤¬¤¹¤ë¡£"); + msg_print("¤Û¤È¤ó¤É°ÂÁ´¤Êµ¤¤¬¤¹¤ë¡£"); #else - msg_print("You feel almost safe."); + msg_print("You feel almost safe."); #endif - else + else #ifdef JP -msg_print("¼ä¤·¤¤µ¤¤¬¤¹¤ë¡£"); + msg_print("¼ä¤·¤¤µ¤¤¬¤¹¤ë¡£"); #else - msg_print("You feel lonely."); + msg_print("You feel lonely."); #endif - } - if ((p_ptr->muta2 & MUT2_INVULN) && !p_ptr->anti_magic && - one_in_(5000)) - { - disturb(0, 0); + } + if ((p_ptr->muta2 & MUT2_INVULN) && !p_ptr->anti_magic && + one_in_(5000)) + { + disturb(0, 0); #ifdef JP -msg_print("̵Ũ¤Êµ¤¤¬¤¹¤ë¡ª"); + msg_print("̵Ũ¤Êµ¤¤¬¤¹¤ë¡ª"); #else - msg_print("You feel invincible!"); + msg_print("You feel invincible!"); #endif - msg_print(NULL); - (void)set_invuln(randint1(8) + 8, FALSE); - } - if ((p_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000)) + msg_print(NULL); + (void)set_invuln(randint1(8) + 8, FALSE); + } + if ((p_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000)) + { + int wounds = p_ptr->mhp - p_ptr->chp; + + if (wounds > 0) { - int wounds = p_ptr->mhp - p_ptr->chp; + int healing = p_ptr->csp; - if (wounds > 0) + if (healing > wounds) { - int healing = p_ptr->csp; - - if (healing > wounds) - { - healing = wounds; - } + healing = wounds; + } - hp_player(healing); - p_ptr->csp -= healing; + hp_player(healing); + p_ptr->csp -= healing; - /* Redraw mana */ - p_ptr->redraw |= (PR_MANA); - } + /* Redraw mana */ + p_ptr->redraw |= (PR_MANA); } - if ((p_ptr->muta2 & MUT2_HP_TO_SP) && !p_ptr->anti_magic && - one_in_(4000)) + } + if ((p_ptr->muta2 & MUT2_HP_TO_SP) && !p_ptr->anti_magic && + one_in_(4000)) + { + int wounds = p_ptr->msp - p_ptr->csp; + + if (wounds > 0) { - int wounds = p_ptr->msp - p_ptr->csp; + int healing = p_ptr->chp; - if (wounds > 0) + if (healing > wounds) { - int healing = p_ptr->chp; - - if (healing > wounds) - { - healing = wounds; - } + healing = wounds; + } - p_ptr->csp += healing; + p_ptr->csp += healing; - /* Redraw mana */ - p_ptr->redraw |= (PR_MANA); + /* Redraw mana */ + p_ptr->redraw |= (PR_MANA); #ifdef JP -take_hit(DAMAGE_LOSELIFE, healing, "Ƭ¤Ë¾º¤Ã¤¿·ì", -1); + take_hit(DAMAGE_LOSELIFE, healing, "Ƭ¤Ë¾º¤Ã¤¿·ì", -1); #else - take_hit(DAMAGE_LOSELIFE, healing, "blood rushing to the head", -1); + take_hit(DAMAGE_LOSELIFE, healing, "blood rushing to the head", -1); #endif - } } - if ((p_ptr->muta2 & MUT2_DISARM) && one_in_(10000)) - { - object_type *o_ptr; + } + if ((p_ptr->muta2 & MUT2_DISARM) && one_in_(10000)) + { + int slot = 0; + object_type *o_ptr = NULL; - disturb(0, 0); + disturb(0, 0); #ifdef JP -msg_print("­¤¬¤â¤Ä¤ì¤Æž¤ó¤À¡ª"); -take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), "žÅÝ", -1); + msg_print("­¤¬¤â¤Ä¤ì¤Æž¤ó¤À¡ª"); + take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), "žÅÝ", -1); #else - msg_print("You trip over your own feet!"); - take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), "tripping", -1); + msg_print("You trip over your own feet!"); + take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), "tripping", -1); #endif + msg_print(NULL); + if (buki_motteruka(INVEN_RARM)) + { + slot = INVEN_RARM; + o_ptr = &inventory[INVEN_RARM]; - msg_print(NULL); - if (buki_motteruka(INVEN_RARM)) + if (buki_motteruka(INVEN_LARM) && one_in_(2)) { - int 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)) - { + o_ptr = &inventory[INVEN_LARM]; + slot = INVEN_LARM; + } + } + 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); } } +} - /*** Process Inventory ***/ - +/* + * Handle curse effects once every 10 game turns + */ +static void process_world_aux_curse(void) +{ if ((p_ptr->cursed & TRC_P_FLAG_MASK) && !p_ptr->inside_battle && !p_ptr->wild_mode) { /* @@ -3775,23 +2862,32 @@ msg_print(" { 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 @@ -3807,7 +2903,7 @@ msg_print(" #endif { disturb(0, 0); - teleport_player(50); + teleport_player(50, 0L); } else { @@ -3974,7 +3070,7 @@ msg_print(" 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)) @@ -3990,7 +3086,7 @@ msg_print(" 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]; @@ -4018,13 +3114,13 @@ msg_print(" 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!"); @@ -4032,13 +3128,22 @@ msg_print(" #endif } } +} +/* + * Handle recharging objects once every 10 game turns + */ +static void process_world_aux_recharge(void) +{ + int i; + bool changed; + /* Process equipment */ - for (j = 0, i = INVEN_RARM; i < INVEN_TOTAL; i++) + for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++) { /* Get the object */ - o_ptr = &inventory[i]; + object_type *o_ptr = &inventory[i]; /* Skip non-objects */ if (!o_ptr->k_idx) continue; @@ -4053,13 +3158,13 @@ msg_print(" if (!o_ptr->timeout) { recharged_notice(o_ptr); - j++; + changed = TRUE; } } } /* Notice changes */ - if (j) + if (changed) { /* Window stuff */ p_ptr->window |= (PW_EQUIP); @@ -4071,10 +3176,10 @@ msg_print(" * and each charging rod in a stack decreases the stack's timeout by * one per turn. -LM- */ - for (j = 0, i = 0; i < INVEN_PACK; i++) + for (changed = FALSE, i = 0; i < INVEN_PACK; i++) { - o_ptr = &inventory[i]; - k_ptr = &k_info[o_ptr->k_idx]; + object_type *o_ptr = &inventory[i]; + object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Skip non-objects */ if (!o_ptr->k_idx) continue; @@ -4083,7 +3188,7 @@ msg_print(" if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout)) { /* Determine how many rods are charging. */ - temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; + int temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; if (temp > o_ptr->number) temp = o_ptr->number; /* Decrease timeout by that number. */ @@ -4096,34 +3201,30 @@ msg_print(" if (!(o_ptr->timeout)) { recharged_notice(o_ptr); - j++; + changed = TRUE; + } + + /* One of the stack of rod is charged */ + else if (o_ptr->timeout % k_ptr->pval) + { + changed = TRUE; } } } /* Notice changes */ - if (j) + if (changed) { - /* Combine pack */ - p_ptr->notice |= (PN_COMBINE); - /* Window stuff */ p_ptr->window |= (PW_INVEN); wild_regen = 20; } - /* Feel the inventory */ - sense_inventory1(); - sense_inventory2(); - - - /*** Process Objects ***/ - - /* Process objects */ + /* Process objects on floor */ for (i = 1; i < o_max; i++) { /* Access object */ - o_ptr = &o_list[i]; + object_type *o_ptr = &o_list[i]; /* Skip dead objects */ if (!o_ptr->k_idx) continue; @@ -4138,10 +3239,14 @@ msg_print(" if (o_ptr->timeout < 0) o_ptr->timeout = 0; } } +} - /*** Involuntary Movement ***/ - +/* + * Handle involuntary movement once every 10 game turns + */ +static void process_world_aux_movement(void) +{ /* Delayed Word-of-Recall */ if (p_ptr->word_recall) { @@ -4173,7 +3278,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); @@ -4244,6 +3349,8 @@ msg_print(" if (dungeon_type == DUNGEON_ANGBAND) { + int i; + for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++) { if ((quest[i].type == QUEST_TYPE_RANDOM) && @@ -4261,51 +3368,829 @@ msg_print(" /* Sound */ sound(SOUND_TPLEVEL); } - } + } + + + /* 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; + + 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; + + /* 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); +} + + +/* + * Handle certain things once every 10 game turns + */ +static void process_world(void) +{ + int day, hour, min; + + const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN; + 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); + + /* Update dungeon feeling, and announce it if changed */ + update_dungeon_feeling(); + + /*** Check monster arena ***/ + if (p_ptr->inside_battle && !p_ptr->leaving) + { + int i2, j2; + int win_m_idx = 0; + int number_mon = 0; + + /* Count all hostile monsters */ + for (i2 = 0; i2 < cur_wid; ++i2) + for (j2 = 0; j2 < cur_hgt; j2++) + { + cave_type *c_ptr = &cave[j2][i2]; + + if ((c_ptr->m_idx > 0) && (c_ptr->m_idx != p_ptr->riding)) + { + number_mon++; + win_m_idx = c_ptr->m_idx; + } + } + + if (number_mon == 0) + { +#ifdef JP + msg_print("ÁêÂǤÁ¤Ë½ª¤ï¤ê¤Þ¤·¤¿¡£"); +#else + msg_print("They have kill each other at the same time."); +#endif + msg_print(NULL); + p_ptr->energy_need = 0; + battle_monsters(); + } + else if ((number_mon-1) == 0) + { + char m_name[80]; + monster_type *wm_ptr; + + wm_ptr = &m_list[win_m_idx]; + + monster_desc(m_name, wm_ptr, 0); +#ifdef JP + msg_format("%s¤¬¾¡Íø¤·¤¿¡ª", m_name); +#else + msg_format("%s is winner!", m_name); +#endif + msg_print(NULL); + + if (win_m_idx == (sel_monster+1)) + { +#ifdef JP + msg_print("¤ª¤á¤Ç¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£"); +#else + msg_print("Congratulations."); +#endif +#ifdef JP + msg_format("%d¡ð¤ò¼õ¤±¼è¤Ã¤¿¡£", battle_odds); +#else + msg_format("You received %d gold.", battle_odds); +#endif + p_ptr->au += battle_odds; + } + else + { +#ifdef JP + msg_print("»ÄÇ°¤Ç¤·¤¿¡£"); +#else + msg_print("You lost gold."); +#endif + } + msg_print(NULL); + p_ptr->energy_need = 0; + battle_monsters(); + } + else if (turn - old_turn == 150*TURNS_PER_TICK) + { +#ifdef JP + msg_print("¿½¤·Ê¬¤±¤¢¤ê¤Þ¤»¤ó¤¬¡¢¤³¤Î¾¡Éé¤Ï°ú¤­Ê¬¤±¤È¤µ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡£"); +#else + msg_format("This battle have ended in a draw."); +#endif + p_ptr->au += kakekin; + msg_print(NULL); + p_ptr->energy_need = 0; + battle_monsters(); + } + } + + /* Every 10 game turns */ + if (turn % TURNS_PER_TICK) return; + + /*** Check the Time and Load ***/ + + if (!(turn % (50*TURNS_PER_TICK))) + { + /* Check time and load */ + if ((0 != check_time()) || (0 != check_load())) + { + /* Warning */ + if (closing_flag <= 2) + { + /* Disturb */ + disturb(0, 0); + + /* Count warnings */ + closing_flag++; + + /* Message */ +#ifdef JP +msg_print("¥¢¥ó¥°¥Ð¥ó¥É¤Ø¤ÎÌ礬ÊĤ¸¤«¤«¤Ã¤Æ¤¤¤Þ¤¹..."); +msg_print("¥²¡¼¥à¤ò½ªÎ»¤¹¤ë¤«¥»¡¼¥Ö¤¹¤ë¤«¤·¤Æ²¼¤µ¤¤¡£"); +#else + msg_print("The gates to ANGBAND are closing..."); + msg_print("Please finish up and/or save your game."); +#endif + + } + + /* Slam the gate */ + else + { + /* Message */ +#ifdef JP +msg_print("º£¡¢¥¢¥ó¥°¥Ð¥ó¥É¤Ø¤ÎÌ礬ÊĤ¶¤µ¤ì¤Þ¤·¤¿¡£"); +#else + msg_print("The gates to ANGBAND are now closed."); +#endif + + + /* Stop playing */ + p_ptr->playing = FALSE; + + /* Leaving */ + p_ptr->leaving = TRUE; + } + } + } + + /*** Attempt timed autosave ***/ + if (autosave_t && autosave_freq && !p_ptr->inside_battle) + { + if (!(turn % ((s32b)autosave_freq * TURNS_PER_TICK))) + do_cmd_save_game(TRUE); + } + + if (mon_fight && !ignore_unview) + { +#ifdef JP + msg_print("²¿¤«¤¬Ê¹¤³¤¨¤¿¡£"); +#else + msg_print("You hear noise."); +#endif + } + + /*** Handle the wilderness/town (sunshine) ***/ + + /* While in town/wilderness */ + 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))) + { + bool dawn; + + /* Check for dawn */ + dawn = (!(turn % (TURNS_PER_TICK * TOWN_DAWN))); + + /* Day breaks */ + if (dawn) + { + int y, x; + + /* Message */ +#ifdef JP + msg_print("Ì뤬ÌÀ¤±¤¿¡£"); +#else + msg_print("The sun has risen."); +#endif + + if (!p_ptr->wild_mode) + { + /* Hack -- Scan the town */ + for (y = 0; y < cur_hgt; y++) + { + 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); + + /* Hack -- Memorize lit grids if allowed */ + if (view_perma_grids) c_ptr->info |= (CAVE_MARK); + + /* Hack -- Notice spot */ + note_spot(y, x); + } + } + } + } + + /* Night falls */ + else + { + int y, x; + + /* Message */ +#ifdef JP + msg_print("Æü¤¬ÄÀ¤ó¤À¡£"); +#else + msg_print("The sun has fallen."); +#endif + + if (!p_ptr->wild_mode) + { + /* Hack -- Scan the town */ + for (y = 0; y < cur_hgt; y++) + { + for (x = 0; x < cur_wid; x++) + { + /* 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)) + { + /* Assume dark */ + c_ptr->info &= ~(CAVE_GLOW); + + 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(); + } + } + } + + /* Update the monsters */ + p_ptr->update |= (PU_MONSTERS | PU_MON_LITE); + + /* Redraw map */ + p_ptr->redraw |= (PR_MAP); + + /* 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); + } + } + } + + /* While in the dungeon (vanilla_town or lite_town mode only) */ + else if ((vanilla_town || (lite_town && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena)) && dun_level) + { + /*** Shuffle the Storekeepers ***/ + + /* Chance is only once a day (while in dungeon) */ + if (!(turn % (TURNS_PER_TICK * STORE_TICKS))) + { + /* Sometimes, shuffle the shop-keepers */ + if (one_in_(STORE_SHUFFLE)) + { + int n, i; + + /* Pick a random shop (except home and museum) */ + do + { + n = randint0(MAX_STORES); + } + while ((n == STORE_HOME) || (n == STORE_MUSEUM)); + + /* Check every feature */ + for (i = 1; i < max_f_idx; i++) + { + /* Access the index */ + feature_type *f_ptr = &f_info[i]; + + /* Skip empty index */ + if (!f_ptr->name) continue; + + /* Skip non-store features */ + if (!have_flag(f_ptr->flags, FF_STORE)) continue; + + /* Verify store type */ + if (f_ptr->subtype == n) + { + /* Message */ +#ifdef JP + if (cheat_xtra) msg_format("%s¤ÎŹ¼ç¤ò¥·¥ã¥Ã¥Õ¥ë¤·¤Þ¤¹¡£", f_name + f_ptr->name); +#else + if (cheat_xtra) msg_format("Shuffle a Shopkeeper of %s.", f_name + f_ptr->name); +#endif + + /* Shuffle it */ + store_shuffle(n); + + break; + } + } + } + } + } + + + /*** Process the monsters ***/ + + /* Check for creature generation. */ + if (one_in_(d_info[dungeon_type].max_m_alloc_chance) && + !p_ptr->inside_arena && !p_ptr->inside_quest && !p_ptr->inside_battle) + { + /* Make a new monster */ + (void)alloc_monster(MAX_SIGHT + 5, 0); + } + + /* Hack -- Check for creature regeneration */ + if (!(turn % (TURNS_PER_TICK*10)) && !p_ptr->inside_battle) regen_monsters(); + if (!(turn % (TURNS_PER_TICK*3))) regen_captured_monsters(); + + 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 */ + if (!hour && !min) + { + if (min != prev_min) + { + do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL); + determine_today_mon(FALSE); + } + } + + /* + * Nightmare mode activates the TY_CURSE at midnight + * + * Require exact minute -- Don't activate multiple times in a minute + */ + if (ironman_nightmare && (min != prev_min)) + { + /* Every 15 minutes after 11:00 pm */ + if ((hour == 23) && !(min % 15)) + { + /* Disturbing */ + disturb(0, 0); + + switch (min / 15) + { + case 0: +#ifdef JP + msg_print("±ó¤¯¤ÇÉÔµ¤Ì£¤Ê¾â¤Î²»¤¬ÌĤä¿¡£"); +#else + msg_print("You hear a distant bell toll ominously."); +#endif + break; + + case 1: +#ifdef JP + msg_print("±ó¤¯¤Ç¾â¤¬Æó²óÌĤä¿¡£"); +#else + msg_print("A distant bell sounds twice."); +#endif + break; + + case 2: +#ifdef JP + msg_print("±ó¤¯¤Ç¾â¤¬»°²óÌĤä¿¡£"); +#else + msg_print("A distant bell sounds three times."); +#endif + break; + + case 3: +#ifdef JP + msg_print("±ó¤¯¤Ç¾â¤¬»Í²óÌĤä¿¡£"); +#else + msg_print("A distant bell tolls four times."); +#endif + break; + } + } + + /* TY_CURSE activates at midnight! */ + if (!hour && !min) + { + int count = 0; + + disturb(1, 0); +#ifdef JP + msg_print("±ó¤¯¤Ç¾â¤¬²¿²ó¤âÌĤꡢ»à¤ó¤À¤è¤¦¤ÊÀŤ±¤µ¤ÎÃæ¤Ø¾Ã¤¨¤Æ¤¤¤Ã¤¿¡£"); +#else + msg_print("A distant bell tolls many times, fading into an deathly silence."); +#endif + + activate_ty_curse(FALSE, &count); + } + } + + + /*** Check the Food, and Regenerate ***/ + + if (!p_ptr->inside_battle) + { + /* Digest quickly when gorged */ + if (p_ptr->food >= PY_FOOD_MAX) + { + /* Digest a lot of food */ + (void)set_food(p_ptr->food - 100); + } + /* Digest normally -- Every 50 game turns */ + else if (!(turn % (TURNS_PER_TICK*5))) + { + /* Basic digestion rate based on speed */ + int digestion = SPEED_TO_ENERGY(p_ptr->pspeed); - /* 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); + /* Regeneration takes more food */ + if (p_ptr->regenerate) + digestion += 20; + if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK)) + digestion += 20; + if (p_ptr->cursed & TRC_FAST_DIGEST) + digestion += 30; - /* Count down towards alter */ - p_ptr->alter_reality--; + /* Slow digestion takes less food */ + if (p_ptr->slow_digest) + digestion -= 5; - p_ptr->redraw |= (PR_STATUS); + /* Minimal digestion */ + if (digestion < 1) digestion = 1; + /* Maximal digestion */ + if (digestion > 100) digestion = 100; - /* Activate the alter reality */ - if (!p_ptr->alter_reality) - { - /* Disturbing! */ - disturb(0, 0); + /* Digest some food */ + (void)set_food(p_ptr->food - digestion); + } - /* Determine the level */ - if (!quest_number(dun_level) && dun_level) + + /* Getting Faint */ + if ((p_ptr->food < PY_FOOD_FAINT)) + { + /* Faint occasionally */ + if (!p_ptr->paralyzed && (randint0(100) < 10)) { + /* Message */ #ifdef JP - msg_print("À¤³¦¤¬ÊѤï¤Ã¤¿¡ª"); + msg_print("¤¢¤Þ¤ê¤Ë¤â¶õÊ¢¤Çµ¤À䤷¤Æ¤·¤Þ¤Ã¤¿¡£"); #else - msg_print("The world changes!"); + msg_print("You faint from the lack of food."); #endif - /* Leaving */ - p_ptr->leaving = TRUE; + disturb(1, 0); + + /* Hack -- faint (bypass free action) */ + (void)set_paralyzed(p_ptr->paralyzed + 1 + randint0(5)); } - else + + /* Starve to death (slowly) */ + if (p_ptr->food < PY_FOOD_STARVE) { + /* Calculate damage */ + int dam = (PY_FOOD_STARVE - p_ptr->food) / 10; + + /* Take damage */ #ifdef JP - msg_print("À¤³¦¤¬¾¯¤·¤Î´ÖÊѲ½¤·¤¿¤è¤¦¤À¡£"); + if (!IS_INVULN()) take_hit(DAMAGE_LOSELIFE, dam, "¶õÊ¢", -1); #else - msg_print("The world seems to change for a moment!"); + if (!IS_INVULN()) take_hit(DAMAGE_LOSELIFE, dam, "starvation", -1); #endif } - - /* Sound */ - sound(SOUND_TPLEVEL); } } + + + + /* Process timed damage and regeneration */ + process_world_aux_hp_and_sp(); + + /* Process timeout */ + process_world_aux_timeout(); + + /* Process light */ + process_world_aux_light(); + + /* Process mutation effects */ + process_world_aux_mutation(); + + /* Process curse effects */ + process_world_aux_curse(); + + /* Process recharging */ + process_world_aux_recharge(); + + /* Feel the inventory */ + sense_inventory1(); + sense_inventory2(); + + /* Involuntary Movement */ + process_world_aux_movement(); } @@ -4769,35 +4654,31 @@ msg_print(" /* Go up staircase */ case '<': { - if(!p_ptr->wild_mode && !dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest) + if (!p_ptr->wild_mode && !dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest) { - if (!vanilla_town) + if (vanilla_town) break; + + if (ambush_flag) { - if(ambush_flag) - { #ifdef JP - msg_print("½±·â¤«¤éƨ¤²¤ë¤Ë¤Ï¥Þ¥Ã¥×¤Îü¤Þ¤Ç°ÜÆ°¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£"); + msg_print("½±·â¤«¤éƨ¤²¤ë¤Ë¤Ï¥Þ¥Ã¥×¤Îü¤Þ¤Ç°ÜÆ°¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£"); #else - msg_print("To flee the ambush you have to reach the edge of the map."); + msg_print("To flee the ambush you have to reach the edge of the map."); #endif - } - else if (p_ptr->food < PY_FOOD_WEAK) - { + break; + } + + if (p_ptr->food < PY_FOOD_WEAK) + { #ifdef JP - msg_print("¤½¤ÎÁ°¤Ë¿©»ö¤ò¤È¤é¤Ê¤¤¤È¡£"); + msg_print("¤½¤ÎÁ°¤Ë¿©»ö¤ò¤È¤é¤Ê¤¤¤È¡£"); #else - msg_print("You must eat something here."); + msg_print("You must eat something here."); #endif - } - else - { - if (change_wild_mode()) - { - p_ptr->oldpx = px; - p_ptr->oldpy = py; - } - } + break; } + + change_wild_mode(); } else do_cmd_go_up(); @@ -4807,13 +4688,11 @@ msg_print(" /* Go down staircase */ case '>': { - if(!p_ptr->wild_mode) do_cmd_go_down(); - else - { - p_ptr->wilderness_x = px; - p_ptr->wilderness_y = py; + if (p_ptr->wild_mode) change_wild_mode(); - } + else + do_cmd_go_down(); + break; } @@ -5307,6 +5186,7 @@ msg_print(" case '=': { do_cmd_options(); + (void)combine_and_reorder_home(STORE_HOME); do_cmd_redraw(); break; } @@ -5473,6 +5353,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 * @@ -5633,143 +5565,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); } } @@ -5798,24 +5666,24 @@ msg_format("%^s } if (p_ptr->action == ACTION_LEARN) { - int hoge = ((p_ptr->msp * 0x10000L) / 256L)+7680L; - if ((p_ptr->csp * 0x10000L + p_ptr->csp_frac) < hoge) + s32b cost = 0L; + u32b cost_frac = (p_ptr->msp + 30L) * 256L; + + /* 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) { + /* Mana run out */ p_ptr->csp = 0; p_ptr->csp_frac = 0; set_action(ACTION_NONE); } else { - p_ptr->csp -= (s16b)(hoge >> 16); - hoge &= 0xFFFFL; - if (p_ptr->csp_frac < hoge) - { - p_ptr->csp_frac += 0x10000L - hoge; - p_ptr->csp--; - } - else - p_ptr->csp_frac -= hoge; + /* Reduce mana */ + s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), cost, cost_frac); } p_ptr->redraw |= PR_MANA; } @@ -5860,53 +5728,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" */ @@ -6006,6 +5828,10 @@ msg_format("%s(%c) } + /* Hack -- Pack Overflow */ + pack_overflow(); + + /*** Clean up ***/ /* Significant */ @@ -6134,7 +5960,7 @@ msg_format("%s(%c) } } new_mane = FALSE; - p_ptr->redraw |= (PR_MANE); + p_ptr->redraw |= (PR_IMITATION); } if (p_ptr->action == ACTION_LEARN) { @@ -6254,9 +6080,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(); @@ -6357,6 +6185,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 */ @@ -6374,6 +6204,9 @@ msg_print(" /* Not leaving dungeon */ p_ptr->leaving_dungeon = FALSE; + /* Initialize monster process */ + mproc_init(); + /* Main loop */ while (TRUE) { @@ -6451,8 +6284,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--; } @@ -6888,6 +6728,9 @@ quit(" determine_bounty_uniques(); determine_today_mon(FALSE); + + /* Initialize object array */ + wipe_o_list(); } else { @@ -6938,11 +6781,6 @@ quit(" /* Flavor the objects */ flavor_init(); - if (new_game) - { - wipe_o_list(); - player_outfit(); - } /* Flash a message */ #ifdef JP @@ -7002,6 +6840,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; @@ -7033,6 +6894,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); @@ -7070,6 +6937,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) { @@ -7079,9 +6949,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; @@ -7137,11 +7012,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; @@ -7154,12 +7028,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 */ @@ -7181,25 +7053,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 @@ -7221,21 +7080,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) { @@ -7262,7 +7133,6 @@ msg_print("Ä¥ /* Leaving */ p_ptr->wild_mode = FALSE; - p_ptr->leaving = TRUE; #ifdef JP @@ -7270,6 +7140,10 @@ msg_print("Ä¥ #else do_cmd_write_nikki(NIKKI_BUNSHOU, 1, " but revived."); #endif + + /* Prepare next floor */ + leave_floor(); + wipe_m_list(); } } } @@ -7301,3 +7175,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; + } + } + } +}