X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fxtra1.c;h=12ec3fa4716c233592b0fedf9ff40788814519e3;hb=26280f252025a95dc50284d4defa51ca19da27ee;hp=72e701505f11cde4bc2b85c10bd9d378857455e2;hpb=61e5a00f790609af775d6d799f6d43a0dc16c754;p=hengband%2Fhengband.git diff --git a/src/xtra1.c b/src/xtra1.c index 72e701505..12ec3fa47 100644 --- a/src/xtra1.c +++ b/src/xtra1.c @@ -1,16 +1,16 @@ /* File: misc.c */ -/* Purpose: misc code */ - /* - * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke + * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. + * This software may be copied and distributed for educational, research, + * and not for profit purposes provided that this copyright and statement + * are included in all such copies. Other copyrights may also apply. */ +/* Purpose: misc code */ + #include "angband.h" @@ -129,18 +129,23 @@ bool is_daytime(void) */ void extract_day_hour_min(int *day, int *hour, int *min) { - s32b len = TURNS_PER_TICK * TOWN_DAWN; - s32b tick = turn % len + len / 4; - - if ((p_ptr->prace == RACE_VAMPIRE) || - (p_ptr->prace == RACE_SKELETON) || - (p_ptr->prace == RACE_ZOMBIE) || - (p_ptr->prace == RACE_SPECTRE)) - *day = (turn - (TURNS_PER_TICK * TOWN_DAWN *3/4)) / len + 1; - else - *day = (turn + (TURNS_PER_TICK * TOWN_DAWN /4))/ len + 1; - *hour = (24 * tick / len) % 24; - *min = (1440 * tick / len) % 60; + const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN; + s32b turn_in_today = (turn + A_DAY / 4) % A_DAY; + + switch (p_ptr->start_race) + { + case RACE_VAMPIRE: + case RACE_SKELETON: + case RACE_ZOMBIE: + case RACE_SPECTRE: + *day = (turn - A_DAY * 3 / 4) / A_DAY + 1; + break; + default: + *day = (turn + A_DAY / 4) / A_DAY + 1; + break; + } + *hour = (24 * turn_in_today / A_DAY) % 24; + *min = (1440 * turn_in_today / A_DAY) % 60; } /* @@ -156,26 +161,26 @@ void prt_time(void) extract_day_hour_min(&day, &hour, &min); /* Dump the info itself */ - c_put_str(TERM_WHITE, format( #ifdef JP - "%2dÆüÌÜ", + if (day < 1000) c_put_str(TERM_WHITE, format("%2dÆüÌÜ", day), ROW_DAY, COL_DAY); + else c_put_str(TERM_WHITE, "***ÆüÌÜ", ROW_DAY, COL_DAY); #else - "Day %-2d", + if (day < 1000) c_put_str(TERM_WHITE, format("Day%3d", day), ROW_DAY, COL_DAY); + else c_put_str(TERM_WHITE, "Day***", ROW_DAY, COL_DAY); #endif - day), ROW_DAY, COL_DAY); - + c_put_str(TERM_WHITE, format("%2d:%02d", hour, min), ROW_DAY, COL_DAY+7); } cptr map_name(void) { - if (p_ptr->inside_quest && (p_ptr->inside_quest < MIN_RANDOM_QUEST) + if (p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest) && (quest[p_ptr->inside_quest].flags & QUEST_FLAG_PRESET)) #ifdef JP return "¥¯¥¨¥¹¥È"; #else - return "Quest"; + return "Quest"; #endif else if (p_ptr->wild_mode) #ifdef JP @@ -187,13 +192,13 @@ cptr map_name(void) #ifdef JP return "¥¢¥ê¡¼¥Ê"; #else - return "Monster Arena"; + return "Arena"; #endif else if (p_ptr->inside_battle) #ifdef JP return "Æ®µ»¾ì"; #else - return "Arena"; + return "Monster Arena"; #endif else if (!dun_level && p_ptr->town_num) return town[p_ptr->town_num].name; @@ -317,7 +322,21 @@ static void prt_stat(int stat) #define BAR_STEALTH 49 #define BAR_SUPERSTEALTH 50 #define BAR_RECALL 51 - +#define BAR_ALTER 52 +#define BAR_SHCOLD 53 +#define BAR_SHELEC 54 +#define BAR_SHSHADOW 55 +#define BAR_MIGHT 56 +#define BAR_BUILD 57 +#define BAR_ANTIMULTI 58 +#define BAR_ANTITELE 59 +#define BAR_ANTIMAGIC 60 +#define BAR_PATIENCE 61 +#define BAR_REVENGE 62 +#define BAR_RUNESWORD 63 +#define BAR_VAMPILIC 64 +#define BAR_CURE 65 +#define BAR_ESP_EVIL 66 static struct { byte attr; @@ -378,12 +397,28 @@ static struct { {TERM_UMBER, "±£", "±£Ì©"}, {TERM_YELLOW, "±£", "Ķ±£Ì©"}, {TERM_WHITE, "µ¢", "µ¢´Ô"}, + {TERM_WHITE, "¸½", "¸½¼ÂÊÑÍÆ"}, + /* Hex */ + {TERM_WHITE, "¥ª", "ɹ¥ª¡¼¥é"}, + {TERM_BLUE, "¥ª", "ÅÅ¥ª¡¼¥é"}, + {TERM_L_DARK, "¥ª", "±Æ¥ª¡¼¥é"}, + {TERM_YELLOW, "ÏÓ", "ÏÓÎ϶¯²½"}, + {TERM_RED, "Æù", "ÆùÂζ¯²½"}, + {TERM_L_DARK, "¿£", "È¿Áý¿£"}, + {TERM_ORANGE, "¥Æ", "È¿¥Æ¥ì¥Ý"}, + {TERM_RED, "Ëâ", "È¿ËâË¡"}, + {TERM_SLATE, "²æ", "²æËý"}, + {TERM_SLATE, "Àë", "Àë¹ð"}, + {TERM_L_DARK, "·õ", "Ëâ·õ²½"}, + {TERM_RED, "µÛ", "µÛ·ìÂÇ·â"}, + {TERM_WHITE, "²ó", "²óÉü"}, + {TERM_L_DARK, "´¶", "¼Ù°­´¶ÃÎ"}, {0, NULL, NULL} }; #else = { {TERM_YELLOW, "Ts", "Tsuyoshi"}, - {TERM_VIOLET, "Hu", "Hullc"}, + {TERM_VIOLET, "Ha", "Halluc"}, {TERM_L_DARK, "Bl", "Blind"}, {TERM_RED, "Pa", "Paralyzed"}, {TERM_VIOLET, "Cf", "Confused"}, @@ -434,6 +469,22 @@ static struct { {TERM_UMBER, "Sl", "Stealth"}, {TERM_YELLOW, "Stlt", "Stealth"}, {TERM_WHITE, "Rc", "Recall"}, + {TERM_WHITE, "Al", "Alter"}, + /* Hex */ + {TERM_WHITE, "SCo", "SCold"}, + {TERM_BLUE, "SEl", "SElec"}, + {TERM_L_DARK, "SSh", "SShadow"}, + {TERM_YELLOW, "EMi", "ExMight"}, + {TERM_RED, "Bu", "BuildUp"}, + {TERM_L_DARK, "AMl", "AntiMulti"}, + {TERM_ORANGE, "AT", "AntiTele"}, + {TERM_RED, "AM", "AntiMagic"}, + {TERM_SLATE, "Pa", "Patience"}, + {TERM_SLATE, "Rv", "Revenge"}, + {TERM_L_DARK, "Rs", "RuneSword"}, + {TERM_RED, "Vm", "Vampiric"}, + {TERM_WHITE, "Cu", "Cure"}, + {TERM_L_DARK, "ET", "EvilTele"}, {0, NULL, NULL} }; #endif @@ -447,7 +498,7 @@ static struct { */ static void prt_status(void) { - u32b bar_flags[2]; + u32b bar_flags[3]; int wid, hgt, row_statbar, max_col_statbar; int i, col = 0, num = 0; int space = 2; @@ -458,7 +509,7 @@ static void prt_status(void) Term_erase(0, row_statbar, max_col_statbar); - bar_flags[0] = bar_flags[1] = 0L; + bar_flags[0] = bar_flags[1] = bar_flags[2] = 0L; /* Tsuyoshi */ if (p_ptr->tsuyoshi) ADD_FLG(BAR_TSUYOSHI); @@ -482,7 +533,7 @@ static void prt_status(void) if (p_ptr->tim_invis) ADD_FLG(BAR_SENSEUNSEEN); /* Timed esp */ - if (p_ptr->tim_esp || music_singing(MUSIC_MIND)) ADD_FLG(BAR_TELEPATHY); + if (IS_TIM_ESP()) ADD_FLG(BAR_TELEPATHY); /* Timed regenerate */ if (p_ptr->tim_regen) ADD_FLG(BAR_REGENERATION); @@ -494,7 +545,7 @@ static void prt_status(void) if (p_ptr->protevil) ADD_FLG(BAR_PROTEVIL); /* Invulnerability */ - if (p_ptr->invuln || music_singing(MUSIC_INVULN)) ADD_FLG(BAR_INVULN); + if (IS_INVULN()) ADD_FLG(BAR_INVULN); /* Wraith form */ if (p_ptr->wraith_form) ADD_FLG(BAR_WRAITH); @@ -505,13 +556,13 @@ static void prt_status(void) if (p_ptr->tim_reflect) ADD_FLG(BAR_REFLECTION); /* Heroism */ - if (p_ptr->hero || music_singing(MUSIC_HERO) || music_singing(MUSIC_SHERO)) ADD_FLG(BAR_HEROISM); + if (IS_HERO()) ADD_FLG(BAR_HEROISM); /* Super Heroism / berserk */ if (p_ptr->shero) ADD_FLG(BAR_BERSERK); /* Blessed */ - if (p_ptr->blessed || music_singing(MUSIC_BLESS)) ADD_FLG(BAR_BLESSED); + if (IS_BLESSED()) ADD_FLG(BAR_BLESSED); /* Shield */ if (p_ptr->magicdef) ADD_FLG(BAR_MAGICDEFENSE); @@ -524,26 +575,29 @@ static void prt_status(void) /* Oppose Acid */ if (p_ptr->special_defense & DEFENSE_ACID) ADD_FLG(BAR_IMMACID); - if (p_ptr->oppose_acid || music_singing(MUSIC_RESIST) || (p_ptr->special_defense & KATA_MUSOU)) ADD_FLG(BAR_RESACID); + if (IS_OPPOSE_ACID()) ADD_FLG(BAR_RESACID); /* Oppose Lightning */ if (p_ptr->special_defense & DEFENSE_ELEC) ADD_FLG(BAR_IMMELEC); - if (p_ptr->oppose_elec || music_singing(MUSIC_RESIST) || (p_ptr->special_defense & KATA_MUSOU)) ADD_FLG(BAR_RESELEC); + if (IS_OPPOSE_ELEC()) ADD_FLG(BAR_RESELEC); /* Oppose Fire */ if (p_ptr->special_defense & DEFENSE_FIRE) ADD_FLG(BAR_IMMFIRE); - if (p_ptr->oppose_fire || music_singing(MUSIC_RESIST) || (p_ptr->special_defense & KATA_MUSOU)) ADD_FLG(BAR_RESFIRE); + if (IS_OPPOSE_FIRE()) ADD_FLG(BAR_RESFIRE); /* Oppose Cold */ if (p_ptr->special_defense & DEFENSE_COLD) ADD_FLG(BAR_IMMCOLD); - if (p_ptr->oppose_cold || music_singing(MUSIC_RESIST) || (p_ptr->special_defense & KATA_MUSOU)) ADD_FLG(BAR_RESCOLD); + if (IS_OPPOSE_COLD()) ADD_FLG(BAR_RESCOLD); /* Oppose Poison */ - if (p_ptr->oppose_pois || music_singing(MUSIC_RESIST) || (p_ptr->special_defense & KATA_MUSOU)) ADD_FLG(BAR_RESPOIS); + if (IS_OPPOSE_POIS()) ADD_FLG(BAR_RESPOIS); /* Word of Recall */ if (p_ptr->word_recall) ADD_FLG(BAR_RECALL); + /* Alter realiry */ + if (p_ptr->alter_reality) ADD_FLG(BAR_ALTER); + /* Afraid */ if (p_ptr->afraid) ADD_FLG(BAR_AFRAID); @@ -561,9 +615,9 @@ static void prt_status(void) if (p_ptr->ult_res) ADD_FLG(BAR_ULTIMATE); /* tim levitation */ - if (p_ptr->tim_ffall) ADD_FLG(BAR_LEVITATE); + if (p_ptr->tim_levitation) ADD_FLG(BAR_LEVITATE); - if (p_ptr->tim_res_nether) ADD_FLG(BAR_RESNETH); + if (p_ptr->tim_res_nether) ADD_FLG(BAR_RESNETH); if (p_ptr->dustrobe) ADD_FLG(BAR_DUSTROBE); @@ -575,10 +629,10 @@ static void prt_status(void) if (p_ptr->special_attack & ATTACK_POIS) ADD_FLG(BAR_ATTKPOIS); if (p_ptr->special_defense & NINJA_S_STEALTH) ADD_FLG(BAR_SUPERSTEALTH); - /* tim stealth */ if (p_ptr->tim_sh_fire) ADD_FLG(BAR_SHFIRE); - if (p_ptr->tim_stealth || music_singing(MUSIC_STEALTH)) ADD_FLG(BAR_STEALTH); + /* tim stealth */ + if (IS_TIM_STEALTH()) ADD_FLG(BAR_STEALTH); if (p_ptr->tim_sh_touki) ADD_FLG(BAR_TOUKI); @@ -588,6 +642,35 @@ static void prt_status(void) /* An Eye for an Eye */ if (p_ptr->tim_eyeeye) ADD_FLG(BAR_EYEEYE); + /* Hex spells */ + if (p_ptr->realm1 == REALM_HEX) + { + if (hex_spelling(HEX_BLESS)) ADD_FLG(BAR_BLESSED); + if (hex_spelling(HEX_DEMON_AURA)) { ADD_FLG(BAR_SHFIRE); ADD_FLG(BAR_REGENERATION); } + if (hex_spelling(HEX_XTRA_MIGHT)) ADD_FLG(BAR_MIGHT); + if (hex_spelling(HEX_DETECT_EVIL)) ADD_FLG(BAR_ESP_EVIL); + if (hex_spelling(HEX_ICE_ARMOR)) ADD_FLG(BAR_SHCOLD); + if (hex_spelling(HEX_RUNESWORD)) ADD_FLG(BAR_RUNESWORD); + if (hex_spelling(HEX_BUILDING)) ADD_FLG(BAR_BUILD); + if (hex_spelling(HEX_ANTI_TELE)) ADD_FLG(BAR_ANTITELE); + if (hex_spelling(HEX_SHOCK_CLOAK)) ADD_FLG(BAR_SHELEC); + if (hex_spelling(HEX_SHADOW_CLOAK)) ADD_FLG(BAR_SHSHADOW); + if (hex_spelling(HEX_CONFUSION)) ADD_FLG(BAR_ATTKCONF); + if (hex_spelling(HEX_EYE_FOR_EYE)) ADD_FLG(BAR_EYEEYE); + if (hex_spelling(HEX_ANTI_MULTI)) ADD_FLG(BAR_ANTIMULTI); + if (hex_spelling(HEX_VAMP_BLADE)) ADD_FLG(BAR_VAMPILIC); + if (hex_spelling(HEX_ANTI_MAGIC)) ADD_FLG(BAR_ANTIMAGIC); + if (hex_spelling(HEX_CURE_LIGHT) || + hex_spelling(HEX_CURE_SERIOUS) || + hex_spelling(HEX_CURE_CRITICAL)) ADD_FLG(BAR_CURE); + + if (p_ptr->magic_num2[2]) + { + if (p_ptr->magic_num2[1] == 1) ADD_FLG(BAR_PATIENCE); + if (p_ptr->magic_num2[1] == 2) ADD_FLG(BAR_REVENGE); + } + } + /* Calcurate length */ for (i = 0; bar[i].sstr; i++) { @@ -655,7 +738,7 @@ static void prt_title(void) if (p_ptr->wizard) { #ifdef JP - /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½ ¾Î¹æ */ + /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½ ¾Î¹æ */ p = "[¥¦¥£¥¶¡¼¥É]"; #else p = "[=-WIZARD-=]"; @@ -666,12 +749,11 @@ static void prt_title(void) /* Winner */ else if (p_ptr->total_winner || (p_ptr->lev > PY_MAX_LEVEL)) { - if ((p_ptr->arena_number > MAX_ARENA_MONS+2) && (p_ptr->arena_number < 99)) + if (p_ptr->arena_number > MAX_ARENA_MONS + 2) { #ifdef JP /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½ ¾Î¹æ */ p = "*¿¿¡¦¾¡Íø¼Ô*"; - #else p = "*TRUEWINNER*"; #endif @@ -679,9 +761,8 @@ static void prt_title(void) else { #ifdef JP - /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½ ¾Î¹æ */ + /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½ ¾Î¹æ */ p = "***¾¡Íø¼Ô***"; - #else p = "***WINNER***"; #endif @@ -691,12 +772,7 @@ static void prt_title(void) /* Normal */ else { -#ifdef JP - mb_strlcpy(str, player_title[p_ptr->pclass][(p_ptr->lev - 1) / 5], 14); -#else - strncpy(str, player_title[p_ptr->pclass][(p_ptr->lev - 1) / 5], 13); - str[13] = '\0'; -#endif + my_strcpy(str, player_title[p_ptr->pclass][(p_ptr->lev - 1) / 5], sizeof(str)); p = str; } @@ -750,23 +826,39 @@ static void prt_exp(void) { char out_val[32]; - if ((p_ptr->prace == RACE_ANDROID) && !cheat_xtra) - (void)strcpy(out_val, "*******"); - else + if ((!exp_need)||(p_ptr->prace == RACE_ANDROID)) + { #ifdef JP -(void)sprintf(out_val, "%7ld", (long)p_ptr->exp); + (void)sprintf(out_val, "%7ld", (long)p_ptr->exp); #else (void)sprintf(out_val, "%8ld", (long)p_ptr->exp); #endif - + } + else + { + if (p_ptr->lev >= PY_MAX_LEVEL) + { + (void)sprintf(out_val, "********"); + } + else + { +#ifdef JP + (void)sprintf(out_val, "%7ld", (long)(player_exp [p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp); +#else + (void)sprintf(out_val, "%8ld", (long)(player_exp [p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp); +#endif + } + } if (p_ptr->exp >= p_ptr->max_exp) { #ifdef JP - put_str("·Ð¸³ ", ROW_EXP, 0); + if (p_ptr->prace == RACE_ANDROID) put_str("¶¯²½ ", ROW_EXP, 0); + else put_str("·Ð¸³ ", ROW_EXP, 0); c_put_str(TERM_L_GREEN, out_val, ROW_EXP, COL_EXP + 5); #else - put_str("EXP ", ROW_EXP, 0); + if (p_ptr->prace == RACE_ANDROID) put_str("Cst ", ROW_EXP, 0); + else put_str("EXP ", ROW_EXP, 0); c_put_str(TERM_L_GREEN, out_val, ROW_EXP, COL_EXP + 4); #endif @@ -784,7 +876,6 @@ static void prt_exp(void) } } - /* * Prints current gold */ @@ -841,7 +932,7 @@ static void prt_hp(void) put_str("HP", ROW_CURHP, COL_CURHP); /* ¸½ºß¤Î¥Ò¥Ã¥È¥Ý¥¤¥ó¥È */ - sprintf(tmp, "%4d", p_ptr->chp); + sprintf(tmp, "%4ld", p_ptr->chp); if (p_ptr->chp >= p_ptr->mhp) { @@ -862,7 +953,7 @@ static void prt_hp(void) put_str( "/", ROW_CURHP, COL_CURHP + 7 ); /* ºÇÂç¥Ò¥Ã¥È¥Ý¥¤¥ó¥È */ - sprintf(tmp, "%4d", p_ptr->mhp); + sprintf(tmp, "%4ld", p_ptr->mhp); color = TERM_L_GREEN; c_put_str(color, tmp, ROW_CURHP, COL_CURHP + 8 ); @@ -892,13 +983,13 @@ static void prt_sp(void) #endif /* ¸½ºß¤Î¥Þ¥¸¥Ã¥¯¥Ý¥¤¥ó¥È */ - sprintf(tmp, "%4d", p_ptr->csp); + sprintf(tmp, "%4ld", p_ptr->csp); if (p_ptr->csp >= p_ptr->msp) { color = TERM_L_GREEN; } - else if (p_ptr->csp > (p_ptr->msp * hitpoint_warn) / 10) + else if (p_ptr->csp > (p_ptr->msp * mana_warn) / 10) { color = TERM_YELLOW; } @@ -913,7 +1004,7 @@ static void prt_sp(void) put_str( "/", ROW_CURSP, COL_CURSP + 7 ); /* ºÇÂç¥Þ¥¸¥Ã¥¯¥Ý¥¤¥ó¥È */ - sprintf(tmp, "%4d", p_ptr->msp); + sprintf(tmp, "%4ld", p_ptr->msp); color = TERM_L_GREEN; c_put_str(color, tmp, ROW_CURSP, COL_CURSP + 8); @@ -927,6 +1018,7 @@ static void prt_depth(void) { char depths[32]; int wid, hgt, row_depth, col_depth; + byte attr = TERM_WHITE; Term_get_size(&wid, &hgt); col_depth = wid + COL_DEPTH; @@ -943,33 +1035,41 @@ static void prt_depth(void) else if (p_ptr->inside_quest && !dungeon_type) { #ifdef JP -strcpy(depths, "ÃϾå"); + strcpy(depths, "ÃϾå"); #else strcpy(depths, "Quest"); #endif - - } - else if (depth_in_feet) - { -#ifdef JP -(void)sprintf(depths, "%d ft", dun_level * 50); -#else - (void)sprintf(depths, "%d ft", dun_level * 50); -#endif - } else { #ifdef JP -sprintf(depths, "%d ³¬", dun_level); + if (depth_in_feet) (void)sprintf(depths, "%d ft", dun_level * 50); + else (void)sprintf(depths, "%d ³¬", dun_level); #else - (void)sprintf(depths, "Lev %d", dun_level); + if (depth_in_feet) (void)sprintf(depths, "%d ft", dun_level * 50); + else (void)sprintf(depths, "Lev %d", dun_level); #endif + + /* Get color of level based on feeling -JSV- */ + switch (p_ptr->feeling) + { + case 0: attr = TERM_SLATE; break; /* Unknown */ + case 1: attr = TERM_L_BLUE; break; /* Special */ + case 2: attr = TERM_VIOLET; break; /* Horrible visions */ + case 3: attr = TERM_RED; break; /* Very dangerous */ + case 4: attr = TERM_L_RED; break; /* Very bad feeling */ + case 5: attr = TERM_ORANGE; break; /* Bad feeling */ + case 6: attr = TERM_YELLOW; break; /* Nervous */ + case 7: attr = TERM_L_UMBER; break; /* Luck is turning */ + case 8: attr = TERM_L_WHITE; break; /* Don't like */ + case 9: attr = TERM_WHITE; break; /* Reasonably safe */ + case 10: attr = TERM_WHITE; break; /* Boring place */ + } } /* Right-Adjust the "depth", and clear old values */ - prt(format("%7s", depths), row_depth, col_depth); + c_prt(attr, format("%7s", depths), row_depth, col_depth); } @@ -1211,6 +1311,15 @@ sprintf(text, " %2d", command_rep); #endif break; } + case ACTION_SPELL: + { +#ifdef JP + strcpy(text, "±Ó¾§"); +#else + strcpy(text, "Spel"); +#endif + break; + } default: { strcpy(text, " "); @@ -1230,7 +1339,7 @@ sprintf(text, " %2d", command_rep); static void prt_speed(void) { int i = p_ptr->pspeed; - bool is_fast = (p_ptr->fast || music_singing(MUSIC_SPEED) || music_singing(MUSIC_SHERO)); + bool is_fast = IS_FAST(); byte attr = TERM_WHITE; char buf[32] = ""; @@ -1241,15 +1350,16 @@ static void prt_speed(void) row_speed = hgt + ROW_SPEED; /* Hack -- Visually "undo" the Search Mode Slowdown */ - if (p_ptr->action == ACTION_SEARCH) i += 10; + if (p_ptr->action == ACTION_SEARCH && !p_ptr->lightspeed) i += 10; /* Fast */ if (i > 110) { if (p_ptr->riding) { - if (m_list[p_ptr->riding].fast && !m_list[p_ptr->riding].slow) attr = TERM_L_BLUE; - else if (m_list[p_ptr->riding].slow && !m_list[p_ptr->riding].fast) attr = TERM_VIOLET; + monster_type *m_ptr = &m_list[p_ptr->riding]; + if (MON_FAST(m_ptr) && !MON_SLOW(m_ptr)) attr = TERM_L_BLUE; + else if (MON_SLOW(m_ptr) && !MON_FAST(m_ptr)) attr = TERM_VIOLET; else attr = TERM_GREEN; } else if ((is_fast && !p_ptr->slow) || p_ptr->lightspeed) attr = TERM_YELLOW; @@ -1268,8 +1378,9 @@ static void prt_speed(void) { if (p_ptr->riding) { - if (m_list[p_ptr->riding].fast && !m_list[p_ptr->riding].slow) attr = TERM_L_BLUE; - else if (m_list[p_ptr->riding].slow && !m_list[p_ptr->riding].fast) attr = TERM_VIOLET; + monster_type *m_ptr = &m_list[p_ptr->riding]; + if (MON_FAST(m_ptr) && !MON_SLOW(m_ptr)) attr = TERM_L_BLUE; + else if (MON_SLOW(m_ptr) && !MON_FAST(m_ptr)) attr = TERM_VIOLET; else attr = TERM_RED; } else if (is_fast && !p_ptr->slow) attr = TERM_YELLOW; @@ -1320,7 +1431,7 @@ static void prt_study(void) } -static void prt_mane(void) +static void prt_imitation(void) { int wid, hgt, row_study, col_study; @@ -1338,7 +1449,7 @@ static void prt_mane(void) #ifdef JP c_put_str(attr, "¤Þ¤Í", row_study, col_study); #else - c_put_str(attr, "Mane", row_study, col_study); + c_put_str(attr, "Imit", row_study, col_study); #endif } else @@ -1477,163 +1588,95 @@ static void prt_stun(void) * Auto-track current target monster when bored. Note that the * health-bar stops tracking any monster that "disappears". */ -static void health_redraw(void) +static void health_redraw(bool riding) { + s16b health_who; + int row, col; + monster_type *m_ptr; + + if (riding) + { + health_who = p_ptr->riding; + row = ROW_RIDING_INFO; + col = COL_RIDING_INFO; + } + else + { + health_who = p_ptr->health_who; + row = ROW_INFO; + col = COL_INFO; + } -#ifdef DRS_SHOW_HEALTH_BAR + m_ptr = &m_list[health_who]; /* Not tracking */ - if (!p_ptr->health_who) + if (!health_who) { /* Erase the health bar */ - Term_erase(COL_INFO, ROW_INFO, 12); + Term_erase(col, row, 12); } /* Tracking an unseen monster */ - else if (!m_list[p_ptr->health_who].ml) + else if (!m_ptr->ml) { /* Indicate that the monster health is "unknown" */ - Term_putstr(COL_INFO, ROW_INFO, 12, TERM_WHITE, "[----------]"); + Term_putstr(col, row, 12, TERM_WHITE, "[----------]"); } /* Tracking a hallucinatory monster */ else if (p_ptr->image) { /* Indicate that the monster health is "unknown" */ - Term_putstr(COL_INFO, ROW_INFO, 12, TERM_WHITE, "[----------]"); + Term_putstr(col, row, 12, TERM_WHITE, "[----------]"); } /* Tracking a dead monster (???) */ - else if (!m_list[p_ptr->health_who].hp < 0) + else if (m_ptr->hp < 0) { /* Indicate that the monster health is "unknown" */ - Term_putstr(COL_INFO, ROW_INFO, 12, TERM_WHITE, "[----------]"); + Term_putstr(col, row, 12, TERM_WHITE, "[----------]"); } /* Tracking a visible monster */ else { - int pct, pct2, len; - - monster_type *m_ptr = &m_list[p_ptr->health_who]; - - /* Default to almost dead */ - byte attr = TERM_RED; - /* Extract the "percent" of health */ - pct = 100L * m_ptr->hp / m_ptr->maxhp; - pct2 = 100L * m_ptr->hp / m_ptr->max_maxhp; - - /* Badly wounded */ - if (pct >= 10) attr = TERM_L_RED; - - /* Wounded */ - if (pct >= 25) attr = TERM_ORANGE; - - /* Somewhat Wounded */ - if (pct >= 60) attr = TERM_YELLOW; - - /* Healthy */ - if (pct >= 100) attr = TERM_L_GREEN; - - /* Afraid */ - if (m_ptr->monfear) attr = TERM_VIOLET; - - /* Asleep */ - if (m_ptr->csleep) attr = TERM_BLUE; - - /* Invulnerable */ - if (m_ptr->invulner) attr = TERM_WHITE; + int pct = 100L * m_ptr->hp / m_ptr->maxhp; + int pct2 = 100L * m_ptr->hp / m_ptr->max_maxhp; /* Convert percent into "health" */ - len = (pct2 < 10) ? 1 : (pct2 < 90) ? (pct2 / 10 + 1) : 10; - - /* Default to "unknown" */ - Term_putstr(COL_INFO, ROW_INFO, 12, TERM_WHITE, "[----------]"); - - /* Dump the current "health" (use '*' symbols) */ - Term_putstr(COL_INFO + 1, ROW_INFO, len, attr, "**********"); - } - -#endif - -} - - - -static void riding_health_redraw(void) -{ - -#ifdef DRS_SHOW_HEALTH_BAR - - /* Not tracking */ - if (!p_ptr->riding) - { - /* Erase the health bar */ - Term_erase(COL_RIDING_INFO, ROW_RIDING_INFO, 12); - } - - /* Tracking a hallucinatory monster */ - else if (p_ptr->image) - { - /* Indicate that the monster health is "unknown" */ - Term_putstr(COL_RIDING_INFO, ROW_RIDING_INFO, 12, TERM_WHITE, "[----------]"); - } - - /* Tracking a dead monster (???) */ - else if (!m_list[p_ptr->health_who].hp < 0) - { - /* Indicate that the monster health is "unknown" */ - Term_putstr(COL_RIDING_INFO, ROW_RIDING_INFO, 12, TERM_WHITE, "[----------]"); - } - - /* Tracking a visible monster */ - else - { - int pct, pct2, len; - - monster_type *m_ptr = &m_list[p_ptr->riding]; + int len = (pct2 < 10) ? 1 : (pct2 < 90) ? (pct2 / 10 + 1) : 10; /* Default to almost dead */ byte attr = TERM_RED; - /* Extract the "percent" of health */ - pct = 100L * m_ptr->hp / m_ptr->maxhp; - pct2 = 100L * m_ptr->hp / m_ptr->max_maxhp; - - /* Badly wounded */ - if (pct >= 10) attr = TERM_L_RED; + /* Invulnerable */ + if (MON_INVULNER(m_ptr)) attr = TERM_WHITE; - /* Wounded */ - if (pct >= 25) attr = TERM_ORANGE; + /* Asleep */ + else if (MON_CSLEEP(m_ptr)) attr = TERM_BLUE; - /* Somewhat Wounded */ - if (pct >= 60) attr = TERM_YELLOW; + /* Afraid */ + else if (MON_MONFEAR(m_ptr)) attr = TERM_VIOLET; /* Healthy */ - if (pct >= 100) attr = TERM_L_GREEN; + else if (pct >= 100) attr = TERM_L_GREEN; - /* Afraid */ - if (m_ptr->monfear) attr = TERM_VIOLET; - - /* Asleep */ - if (m_ptr->csleep) attr = TERM_BLUE; + /* Somewhat Wounded */ + else if (pct >= 60) attr = TERM_YELLOW; - /* Invulnerable */ - if (m_ptr->invulner) attr = TERM_WHITE; + /* Wounded */ + else if (pct >= 25) attr = TERM_ORANGE; - /* Convert percent into "health" */ - len = (pct2 < 10) ? 1 : (pct2 < 90) ? (pct2 / 10 + 1) : 10; + /* Badly wounded */ + else if (pct >= 10) attr = TERM_L_RED; /* Default to "unknown" */ - Term_putstr(COL_RIDING_INFO, ROW_RIDING_INFO, 12, TERM_WHITE, "[----------]"); + Term_putstr(col, row, 12, TERM_WHITE, "[----------]"); /* Dump the current "health" (use '*' symbols) */ - Term_putstr(COL_RIDING_INFO + 1, ROW_RIDING_INFO, len, attr, "**********"); + Term_putstr(col + 1, row, len, attr, "**********"); } - -#endif - } @@ -1650,13 +1693,9 @@ static void prt_frame_basic(void) prt_field(mimic_info[p_ptr->mimic_form].title, ROW_RACE, COL_RACE); else { -#ifdef JP char str[14]; - mb_strlcpy(str, rp_ptr->title, 14); + my_strcpy(str, rp_ptr->title, sizeof(str)); prt_field(str, ROW_RACE, COL_RACE); -#else - prt_field(rp_ptr->title, ROW_RACE, COL_RACE); -#endif } /* prt_field(cp_ptr->title, ROW_CLASS, COL_CLASS); */ /* prt_field(ap_ptr->title, ROW_SEIKAKU, COL_SEIKAKU); */ @@ -1688,8 +1727,8 @@ static void prt_frame_basic(void) prt_depth(); /* Special */ - health_redraw(); - riding_health_redraw(); + health_redraw(FALSE); + health_redraw(TRUE); } @@ -1714,7 +1753,7 @@ static void prt_frame_extra(void) /* Study spells */ prt_study(); - prt_mane(); + prt_imitation(); prt_status(); } @@ -2059,7 +2098,7 @@ static void calc_spells(void) { int i, j, k, levels; int num_allowed; - int num_boukyaku = 0; + int num_boukyaku = 0; magic_type *s_ptr; int which; @@ -2083,7 +2122,7 @@ static void calc_spells(void) return; } - p = spell_categoly_name(mp_ptr->spell_book); + p = spell_category_name(mp_ptr->spell_book); /* Determine the number of spells allowed */ levels = p_ptr->lev - mp_ptr->spell_first + 1; @@ -2116,17 +2155,17 @@ static void calc_spells(void) if (num_allowed>(80+bonus)) num_allowed = 80+bonus; } - /* Count the number of spells we know */ - for (j = 0; j < 64; j++) + /* Count the number of spells we know */ + for (j = 0; j < 64; j++) { /* Count known spells */ if ((j < 32) ? - (p_ptr->spell_forgotten1 & (1L << j)) : - (p_ptr->spell_forgotten2 & (1L << (j - 32)))) + (p_ptr->spell_forgotten1 & (1L << j)) : + (p_ptr->spell_forgotten2 & (1L << (j - 32)))) { num_boukyaku++; - } - } + } + } /* See how many spells we must forget or may learn */ p_ptr->new_spells = num_allowed + p_ptr->add_spells + num_boukyaku - p_ptr->learned_spells; @@ -2191,11 +2230,11 @@ static void calc_spells(void) /* Message */ #ifdef JP - msg_format("%s¤Î%s¤ò˺¤ì¤Æ¤·¤Þ¤Ã¤¿¡£", - spell_names[technic2magic(which)-1][j%32], p ); + msg_format("%s¤Î%s¤ò˺¤ì¤Æ¤·¤Þ¤Ã¤¿¡£", + do_spell(which, j%32, SPELL_NAME), p ); #else msg_format("You have forgotten the %s of %s.", p, - spell_names[technic2magic(which)-1][j%32]); + do_spell(which, j%32, SPELL_NAME)); #endif @@ -2251,11 +2290,11 @@ static void calc_spells(void) /* Message */ #ifdef JP - msg_format("%s¤Î%s¤ò˺¤ì¤Æ¤·¤Þ¤Ã¤¿¡£", - spell_names[technic2magic(which)-1][j%32], p ); + msg_format("%s¤Î%s¤ò˺¤ì¤Æ¤·¤Þ¤Ã¤¿¡£", + do_spell(which, j%32, SPELL_NAME), p ); #else msg_format("You have forgotten the %s of %s.", p, - spell_names[technic2magic(which)-1][j%32]); + do_spell(which, j%32, SPELL_NAME)); #endif @@ -2327,11 +2366,11 @@ static void calc_spells(void) /* Message */ #ifdef JP - msg_format("%s¤Î%s¤ò»×¤¤½Ð¤·¤¿¡£", - spell_names[technic2magic(which)-1][j%32], p ); + msg_format("%s¤Î%s¤ò»×¤¤½Ð¤·¤¿¡£", + do_spell(which, j%32, SPELL_NAME), p ); #else msg_format("You have remembered the %s of %s.", - p, spell_names[technic2magic(which)-1][j%32]); + p, do_spell(which, j%32, SPELL_NAME)); #endif @@ -2362,7 +2401,7 @@ static void calc_spells(void) /* Count it */ k++; } - if (k>32) k = 32; + if (k > 32) k = 32; if ((p_ptr->new_spells > k) && ((mp_ptr->spell_book == TV_LIFE_BOOK) || (mp_ptr->spell_book == TV_HISSATSU_BOOK))) p_ptr->new_spells = k; } @@ -2383,8 +2422,8 @@ static void calc_spells(void) } #else msg_format("You can learn %d more %s%s.", - p_ptr->new_spells, p, - (p_ptr->new_spells != 1) ? "s" : ""); + p_ptr->new_spells, p, + (p_ptr->new_spells != 1) ? "s" : ""); #endif } @@ -2395,8 +2434,8 @@ static void calc_spells(void) /* Redraw Study Status */ p_ptr->redraw |= (PR_STUDY); - /* Redraw object recall */ - p_ptr->window |= (PW_OBJECT); + /* Redraw object recall */ + p_ptr->window |= (PW_OBJECT); } } @@ -2480,7 +2519,7 @@ static void calc_mana(void) if (o_ptr->k_idx && !(have_flag(flgs, TR_FREE_ACT)) && !(have_flag(flgs, TR_MAGIC_MASTERY)) && - !(have_flag(flgs, TR_DEX)) && (o_ptr->pval > 0)) + !((have_flag(flgs, TR_DEX)) && (o_ptr->pval > 0))) { /* Encumbered */ p_ptr->cumber_glove = TRUE; @@ -2657,12 +2696,12 @@ static void calc_mana(void) } #ifdef JP - /* ¥ì¥Ù¥ë¥¢¥Ã¥×¤Î»þ¤Ï¾å¾ºÎ̤òɽ¼¨¤¹¤ë */ - if ((level_up == 1) && (msp > p_ptr->msp)) - { - msg_format("ºÇÂç¥Þ¥¸¥Ã¥¯¡¦¥Ý¥¤¥ó¥È¤¬ %d Áý²Ã¤·¤¿¡ª", - (msp - p_ptr->msp)); - } + /* ¥ì¥Ù¥ë¥¢¥Ã¥×¤Î»þ¤Ï¾å¾ºÎ̤òɽ¼¨¤¹¤ë */ + if ((level_up == 1) && (msp > p_ptr->msp)) + { + msg_format("ºÇÂç¥Þ¥¸¥Ã¥¯¡¦¥Ý¥¤¥ó¥È¤¬ %d Áý²Ã¤·¤¿¡ª", + (msp - p_ptr->msp)); + } #endif /* Save new mana */ p_ptr->msp = msp; @@ -2781,10 +2820,14 @@ static void calc_hitpoints(void) if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1; /* Factor in the hero / superhero settings */ - if (p_ptr->hero || music_singing(MUSIC_HERO) || music_singing(MUSIC_SHERO)) mhp += 10; + if (IS_HERO()) mhp += 10; if (p_ptr->shero && (p_ptr->pclass != CLASS_BERSERKER)) mhp += 30; if (p_ptr->tsuyoshi) mhp += 50; + /* Factor in the hex spell settings */ + if (hex_spelling(HEX_XTRA_MIGHT)) mhp += 15; + if (hex_spelling(HEX_BUILDING)) mhp += 60; + /* New maximum hitpoints */ if (p_ptr->mhp != mhp) { @@ -2796,12 +2839,12 @@ static void calc_hitpoints(void) } #ifdef JP - /* ¥ì¥Ù¥ë¥¢¥Ã¥×¤Î»þ¤Ï¾å¾ºÎ̤òɽ¼¨¤¹¤ë */ - if ((level_up == 1) && (mhp > p_ptr->mhp)) - { - msg_format("ºÇÂç¥Ò¥Ã¥È¡¦¥Ý¥¤¥ó¥È¤¬ %d Áý²Ã¤·¤¿¡ª", - (mhp - p_ptr->mhp) ); - } + /* ¥ì¥Ù¥ë¥¢¥Ã¥×¤Î»þ¤Ï¾å¾ºÎ̤òɽ¼¨¤¹¤ë */ + if ((level_up == 1) && (mhp > p_ptr->mhp)) + { + msg_format("ºÇÂç¥Ò¥Ã¥È¡¦¥Ý¥¤¥ó¥È¤¬ %d Áý²Ã¤·¤¿¡ª", + (mhp - p_ptr->mhp) ); + } #endif /* Save the new max-hitpoints */ p_ptr->mhp = mhp; @@ -2875,7 +2918,7 @@ static void calc_torch(void) } /* Artifact Lites provide permanent, bright, lite */ - else if (artifact_p(o_ptr)) + else if (object_is_fixed_artifact(o_ptr)) { p_ptr->cur_lite += 3; } @@ -2900,34 +2943,28 @@ static void calc_torch(void) } - /* max radius is 5 without rewriting other code -- */ + /* max radius is 14 (was 5) without rewriting other code -- */ /* see cave.c:update_lite() and defines.h:LITE_MAX */ if (d_info[dungeon_type].flags1 & DF1_DARKNESS && p_ptr->cur_lite > 1) p_ptr->cur_lite = 1; + + /* + * check if the player doesn't have light radius, + * but does weakly glow as an intrinsic. + */ + if (p_ptr->cur_lite <= 0 && p_ptr->lite) p_ptr->cur_lite++; + if (p_ptr->cur_lite > 14) p_ptr->cur_lite = 14; if (p_ptr->cur_lite < 0) p_ptr->cur_lite = 0; - /* check if the player doesn't have a lite source, */ - /* but does glow as an intrinsic. */ - if (p_ptr->cur_lite == 0 && p_ptr->lite) p_ptr->cur_lite = 1; - /* end experimental mods */ - /* Reduce lite when running if requested */ - if (running && view_reduce_lite) - { - /* Reduce the lite radius if needed */ - if (p_ptr->cur_lite > 1) p_ptr->cur_lite = 1; - } - /* Notice changes in the "lite radius" */ if (p_ptr->old_lite != p_ptr->cur_lite) { - /* Update the lite */ - p_ptr->update |= (PU_LITE); - - /* Update the monsters */ - p_ptr->update |= (PU_MONSTERS); + /* Update stuff */ + /* Hack -- PU_MON_LITE for monsters' darkness */ + p_ptr->update |= (PU_LITE | PU_MON_LITE | PU_MONSTERS); /* Remember the old lite */ p_ptr->old_lite = p_ptr->cur_lite; @@ -2942,24 +2979,25 @@ static void calc_torch(void) /* * Computes current weight limit. */ -static int weight_limit(void) +u32b weight_limit(void) { - int i; + u32b i; /* Weight limit based only on strength */ - i = adj_str_wgt[p_ptr->stat_ind[A_STR]] * 100; - if (p_ptr->pclass == CLASS_BERSERKER) i = i*3/2; + i = (u32b)adj_str_wgt[p_ptr->stat_ind[A_STR]] * 50; /* Constant was 100 */ + if (p_ptr->pclass == CLASS_BERSERKER) i = i * 3 / 2; /* Return the result */ - return (i); + return i; } bool buki_motteruka(int i) { - return ((inventory[i].k_idx && inventory[i].tval >= TV_DIGGING && inventory[i].tval <= TV_SWORD) ? TRUE : FALSE); + return ((inventory[i].k_idx && object_is_melee_weapon(&inventory[i])) ? TRUE : FALSE); } + /* * Calculate the players current "state", taking into account * not only race/class intrinsics, but also objects being worn @@ -2983,23 +3021,9 @@ bool buki_motteruka(int i) void calc_bonuses(void) { int i, j, hold, neutral[2]; - int old_speed; - bool old_telepathy; - bool old_esp_animal; - bool old_esp_undead; - bool old_esp_demon; - bool old_esp_orc; - bool old_esp_troll; - bool old_esp_giant; - bool old_esp_dragon; - bool old_esp_human; - bool old_esp_evil; - bool old_esp_good; - bool old_esp_nonliving; - bool old_esp_unique; - int old_see_inv; - int old_dis_ac; - int old_dis_to_a; + int new_speed; + int default_hand = 0; + int empty_hands_status = empty_hands(TRUE); int extra_blows[2]; int extra_shots; object_type *o_ptr; @@ -3007,35 +3031,35 @@ void calc_bonuses(void) bool omoi = FALSE; bool yoiyami = FALSE; bool down_saving = FALSE; - bool have_dd_s, have_dd_t, have_sw, have_kabe; +#if 0 + bool have_dd_s = FALSE, have_dd_t = FALSE; +#endif + bool have_sw = FALSE, have_kabe = FALSE; bool easy_2weapon = FALSE; + bool riding_levitation = FALSE; s16b this_o_idx, next_o_idx = 0; player_race *tmp_rp_ptr; - - /* Save the old speed */ - old_speed = p_ptr->pspeed; - /* Save the old vision stuff */ - old_telepathy = p_ptr->telepathy; - old_esp_animal = p_ptr->esp_animal; - old_esp_undead = p_ptr->esp_undead; - old_esp_demon = p_ptr->esp_demon; - old_esp_orc = p_ptr->esp_orc; - old_esp_troll = p_ptr->esp_troll; - old_esp_giant = p_ptr->esp_giant; - old_esp_dragon = p_ptr->esp_dragon; - old_esp_human = p_ptr->esp_human; - old_esp_evil = p_ptr->esp_evil; - old_esp_good = p_ptr->esp_good; - old_esp_nonliving = p_ptr->esp_nonliving; - old_esp_unique = p_ptr->esp_unique; - - old_see_inv = p_ptr->see_inv; + bool old_telepathy = p_ptr->telepathy; + bool old_esp_animal = p_ptr->esp_animal; + bool old_esp_undead = p_ptr->esp_undead; + bool old_esp_demon = p_ptr->esp_demon; + bool old_esp_orc = p_ptr->esp_orc; + bool old_esp_troll = p_ptr->esp_troll; + bool old_esp_giant = p_ptr->esp_giant; + bool old_esp_dragon = p_ptr->esp_dragon; + bool old_esp_human = p_ptr->esp_human; + bool old_esp_evil = p_ptr->esp_evil; + bool old_esp_good = p_ptr->esp_good; + bool old_esp_nonliving = p_ptr->esp_nonliving; + bool old_esp_unique = p_ptr->esp_unique; + bool old_see_inv = p_ptr->see_inv; + bool old_mighty_throw = p_ptr->mighty_throw; /* Save the old armor class */ - old_dis_ac = p_ptr->dis_ac; - old_dis_to_a = p_ptr->dis_to_a; + bool old_dis_ac = p_ptr->dis_ac; + bool old_dis_to_a = p_ptr->dis_to_a; /* Clear extra blows/shots */ @@ -3060,8 +3084,12 @@ void calc_bonuses(void) p_ptr->to_m_chance = 0; + /* Clear the Extra Dice Bonuses */ + p_ptr->to_dd[0] = p_ptr->to_ds[0] = 0; + p_ptr->to_dd[1] = p_ptr->to_ds[1] = 0; + /* Start with "normal" speed */ - p_ptr->pspeed = 110; + new_speed = 110; /* Start with a single blow per turn */ p_ptr->num_blow[0] = 1; @@ -3092,7 +3120,7 @@ void calc_bonuses(void) p_ptr->slow_digest = FALSE; p_ptr->regenerate = FALSE; p_ptr->can_swim = FALSE; - p_ptr->ffall = FALSE; + p_ptr->levitation = FALSE; p_ptr->hold_life = FALSE; p_ptr->telepathy = FALSE; p_ptr->esp_animal = FALSE; @@ -3139,6 +3167,7 @@ void calc_bonuses(void) p_ptr->anti_tele = FALSE; p_ptr->warning = FALSE; p_ptr->mighty_throw = FALSE; + p_ptr->see_nocto = FALSE; p_ptr->immune_acid = FALSE; p_ptr->immune_elec = FALSE; @@ -3150,7 +3179,7 @@ void calc_bonuses(void) p_ptr->hidarite = FALSE; p_ptr->no_flowed = FALSE; - p_ptr->align = 0; + p_ptr->align = friend_align; if (p_ptr->mimic_form) tmp_rp_ptr = &mimic_info[p_ptr->mimic_form]; else tmp_rp_ptr = &race_info[p_ptr->prace]; @@ -3188,14 +3217,55 @@ void calc_bonuses(void) /* Base skill -- digging */ p_ptr->skill_dig = 0; - if (buki_motteruka(INVEN_RARM) && (empty_hands(FALSE) & 0x00000001) && ((inventory[INVEN_RARM].weight > 99) || (inventory[INVEN_RARM].tval == TV_POLEARM)) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE))) p_ptr->ryoute = TRUE; - if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(TRUE) == 3) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE))) p_ptr->ryoute = TRUE; - if (buki_motteruka(INVEN_RARM) || !buki_motteruka(INVEN_LARM)) p_ptr->migite = TRUE; - if (buki_motteruka(INVEN_LARM)) p_ptr->hidarite = TRUE; + if (buki_motteruka(INVEN_RARM)) p_ptr->migite = TRUE; + if (buki_motteruka(INVEN_LARM)) + { + p_ptr->hidarite = TRUE; + if (!p_ptr->migite) default_hand = 1; + } + + if (CAN_TWO_HANDS_WIELDING()) + { + if (p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) && + object_allow_two_hands_wielding(&inventory[INVEN_RARM])) + { + p_ptr->ryoute = TRUE; + } + else if (p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) && + object_allow_two_hands_wielding(&inventory[INVEN_LARM])) + { + p_ptr->ryoute = TRUE; + } + else + { + switch (p_ptr->pclass) + { + case CLASS_MONK: + case CLASS_FORCETRAINER: + case CLASS_BERSERKER: + if (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM)) + { + p_ptr->migite = TRUE; + p_ptr->ryoute = TRUE; + } + break; + } + } + } + + if (!p_ptr->migite && !p_ptr->hidarite) + { + if (empty_hands_status & EMPTY_HAND_RARM) p_ptr->migite = TRUE; + else if (empty_hands_status == EMPTY_HAND_LARM) + { + p_ptr->hidarite = TRUE; + default_hand = 1; + } + } if (p_ptr->special_defense & KAMAE_MASK) { - if (empty_hands(TRUE) < 2) + if (!(empty_hands_status & EMPTY_HAND_RARM)) { set_action(ACTION_NONE); } @@ -3225,10 +3295,10 @@ void calc_bonuses(void) /* Unencumbered Monks become faster every 10 levels */ if (!(heavy_armor())) { - if (!((p_ptr->prace == RACE_KLACKON) || - (p_ptr->prace == RACE_SPRITE) || + if (!(prace_is_(RACE_KLACKON) || + prace_is_(RACE_SPRITE) || (p_ptr->pseikaku == SEIKAKU_MUNCHKIN))) - p_ptr->pspeed += (p_ptr->lev) / 10; + new_speed += (p_ptr->lev) / 10; /* Free action if unencumbered at level 25 */ if (p_ptr->lev > 24) @@ -3252,11 +3322,11 @@ void calc_bonuses(void) p_ptr->sustain_con = TRUE; p_ptr->regenerate = TRUE; p_ptr->free_act = TRUE; - p_ptr->pspeed += 2; - if (p_ptr->lev > 29) p_ptr->pspeed++; - if (p_ptr->lev > 39) p_ptr->pspeed++; - if (p_ptr->lev > 44) p_ptr->pspeed++; - if (p_ptr->lev > 49) p_ptr->pspeed++; + new_speed += 2; + if (p_ptr->lev > 29) new_speed++; + if (p_ptr->lev > 39) new_speed++; + if (p_ptr->lev > 44) new_speed++; + if (p_ptr->lev > 49) new_speed++; p_ptr->to_a += 10+p_ptr->lev/2; p_ptr->dis_to_a += 10+p_ptr->lev/2; p_ptr->skill_dig += (100+p_ptr->lev*8); @@ -3267,26 +3337,28 @@ void calc_bonuses(void) if (p_ptr->lev > 39) p_ptr->reflect = TRUE; break; case CLASS_NINJA: - /* Unencumbered Monks become faster every 10 levels */ + /* Unencumbered Ninjas become faster every 10 levels */ if (heavy_armor()) { - p_ptr->pspeed -= (p_ptr->lev) / 10; + new_speed -= (p_ptr->lev) / 10; p_ptr->skill_stl -= (p_ptr->lev)/10; } - else if (!inventory[INVEN_LARM].tval || p_ptr->hidarite) + else if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) && + (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite)) { - p_ptr->pspeed += 3; - if (!((p_ptr->prace == RACE_KLACKON) || - (p_ptr->prace == RACE_SPRITE) || + new_speed += 3; + if (!(prace_is_(RACE_KLACKON) || + prace_is_(RACE_SPRITE) || (p_ptr->pseikaku == SEIKAKU_MUNCHKIN))) - p_ptr->pspeed += (p_ptr->lev) / 10; + new_speed += (p_ptr->lev) / 10; p_ptr->skill_stl += (p_ptr->lev)/10; /* Free action if unencumbered at level 25 */ if (p_ptr->lev > 24) p_ptr->free_act = TRUE; } - if (!inventory[INVEN_LARM].tval || p_ptr->hidarite) + if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) && + (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite)) { p_ptr->to_a += p_ptr->lev/2+5; p_ptr->dis_to_a += p_ptr->lev/2+5; @@ -3301,48 +3373,51 @@ void calc_bonuses(void) p_ptr->oppose_pois = 1; p_ptr->redraw |= PR_STATUS; } + p_ptr->see_nocto = TRUE; break; } /***** Races ****/ if (p_ptr->mimic_form) { - switch(p_ptr->mimic_form) + switch (p_ptr->mimic_form) { case MIMIC_DEMON: - p_ptr->hold_life=TRUE; - p_ptr->resist_chaos=TRUE; - p_ptr->resist_neth=TRUE; - p_ptr->resist_fire=TRUE; + p_ptr->hold_life = TRUE; + p_ptr->resist_chaos = TRUE; + p_ptr->resist_neth = TRUE; + p_ptr->resist_fire = TRUE; p_ptr->oppose_fire = 1; - p_ptr->see_inv=TRUE; - p_ptr->pspeed += 3; + p_ptr->see_inv=TRUE; + new_speed += 3; p_ptr->redraw |= PR_STATUS; p_ptr->to_a += 10; p_ptr->dis_to_a += 10; + p_ptr->align -= 200; break; case MIMIC_DEMON_LORD: - p_ptr->hold_life=TRUE; - p_ptr->resist_chaos=TRUE; - p_ptr->resist_neth=TRUE; - p_ptr->immune_fire=TRUE; - p_ptr->resist_acid = TRUE; - p_ptr->resist_fire=TRUE; - p_ptr->resist_cold = TRUE; - p_ptr->resist_elec = TRUE; - p_ptr->resist_pois = TRUE; - p_ptr->resist_conf = TRUE; - p_ptr->resist_disen = TRUE; - p_ptr->resist_nexus = TRUE; - p_ptr->resist_fear = TRUE; - p_ptr->sh_fire = TRUE; - p_ptr->see_inv = TRUE; + p_ptr->hold_life = TRUE; + p_ptr->resist_chaos = TRUE; + p_ptr->resist_neth = TRUE; + p_ptr->immune_fire = TRUE; + p_ptr->resist_acid = TRUE; + p_ptr->resist_fire = TRUE; + p_ptr->resist_cold = TRUE; + p_ptr->resist_elec = TRUE; + p_ptr->resist_pois = TRUE; + p_ptr->resist_conf = TRUE; + p_ptr->resist_disen = TRUE; + p_ptr->resist_nexus = TRUE; + p_ptr->resist_fear = TRUE; + p_ptr->sh_fire = TRUE; + p_ptr->see_inv = TRUE; p_ptr->telepathy = TRUE; - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; p_ptr->kill_wall = TRUE; - p_ptr->pspeed += 5; + new_speed += 5; p_ptr->to_a += 20; p_ptr->dis_to_a += 20; + p_ptr->align -= 200; break; case MIMIC_VAMPIRE: p_ptr->resist_dark = TRUE; @@ -3351,7 +3426,7 @@ void calc_bonuses(void) p_ptr->resist_cold = TRUE; p_ptr->resist_pois = TRUE; p_ptr->see_inv = TRUE; - p_ptr->pspeed += 3; + new_speed += 3; p_ptr->to_a += 10; p_ptr->dis_to_a += 10; if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE; @@ -3360,13 +3435,13 @@ void calc_bonuses(void) } else { - switch (p_ptr->prace) - { + switch (p_ptr->prace) + { case RACE_ELF: p_ptr->resist_lite = TRUE; break; case RACE_HOBBIT: - p_ptr->sustain_dex = TRUE; + p_ptr->hold_life = TRUE; break; case RACE_GNOME: p_ptr->free_act = TRUE; @@ -3430,7 +3505,7 @@ void calc_bonuses(void) p_ptr->resist_acid = TRUE; /* Klackons become faster */ - p_ptr->pspeed += (p_ptr->lev) / 10; + new_speed += (p_ptr->lev) / 10; break; case RACE_KOBOLD: p_ptr->resist_pois = TRUE; @@ -3444,7 +3519,7 @@ void calc_bonuses(void) if (p_ptr->lev > 19) p_ptr->see_inv = TRUE; break; case RACE_DRACONIAN: - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; if (p_ptr->lev > 4) p_ptr->resist_fire = TRUE; if (p_ptr->lev > 9) p_ptr->resist_cold = TRUE; if (p_ptr->lev > 14) p_ptr->resist_acid = TRUE; @@ -3492,7 +3567,7 @@ void calc_bonuses(void) if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE; break; case RACE_SPECTRE: - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; p_ptr->free_act = TRUE; p_ptr->resist_neth = TRUE; p_ptr->hold_life = TRUE; @@ -3504,11 +3579,11 @@ void calc_bonuses(void) if (p_ptr->lev > 34) p_ptr->telepathy = TRUE; break; case RACE_SPRITE: - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; p_ptr->resist_lite = TRUE; /* Sprites become faster */ - p_ptr->pspeed += (p_ptr->lev) / 10; + new_speed += (p_ptr->lev) / 10; break; case RACE_BEASTMAN: p_ptr->resist_conf = TRUE; @@ -3532,28 +3607,29 @@ void calc_bonuses(void) if (p_ptr->lev > 45) p_ptr->stat_add[A_CON]++; break; case RACE_ANGEL: - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; p_ptr->see_inv = TRUE; + p_ptr->align += 200; break; case RACE_DEMON: p_ptr->resist_fire = TRUE; p_ptr->resist_neth = TRUE; p_ptr->hold_life = TRUE; - if (p_ptr->lev > 9) - p_ptr->see_inv = TRUE; + if (p_ptr->lev > 9) p_ptr->see_inv = TRUE; if (p_ptr->lev > 44) { p_ptr->oppose_fire = 1; p_ptr->redraw |= PR_STATUS; } + p_ptr->align -= 200; break; case RACE_DUNADAN: p_ptr->sustain_con = TRUE; break; case RACE_S_FAIRY: - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; break; - case RACE_KUTA: + case RACE_KUTAR: p_ptr->resist_conf = TRUE; break; case RACE_ANDROID: @@ -3565,7 +3641,7 @@ void calc_bonuses(void) default: /* Do nothing */ ; - } + } } if (p_ptr->ult_res || (p_ptr->special_defense & KATA_MUSOU)) @@ -3574,7 +3650,7 @@ void calc_bonuses(void) p_ptr->free_act = TRUE; p_ptr->slow_digest = TRUE; p_ptr->regenerate = TRUE; - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; p_ptr->hold_life = TRUE; p_ptr->telepathy = TRUE; p_ptr->lite = TRUE; @@ -3645,19 +3721,13 @@ void calc_bonuses(void) if ((p_ptr->prace != RACE_KLACKON) && (p_ptr->prace != RACE_SPRITE)) /* Munchkin become faster */ - p_ptr->pspeed += (p_ptr->lev) / 10 + 5; + new_speed += (p_ptr->lev) / 10 + 5; } - if (p_ptr->riding) + if (music_singing(MUSIC_WALL)) { - if (!(r_info[m_list[p_ptr->riding].r_idx].flags2 & RF2_PASS_WALL)) - p_ptr->pass_wall = FALSE; - if (r_info[m_list[p_ptr->riding].r_idx].flags2 & RF2_KILL_WALL) - p_ptr->pass_wall = TRUE; + p_ptr->kill_wall = TRUE; } - if (music_singing(MUSIC_WALL)) p_ptr->kill_wall = TRUE; - - if (p_ptr->kill_wall) p_ptr->pass_wall = TRUE; /* Hack -- apply racial/class stat maxes */ /* Apply the racial modifiers */ @@ -3705,7 +3775,7 @@ void calc_bonuses(void) if (p_ptr->muta3 & MUT3_XTRA_FAT) { p_ptr->stat_add[A_CON] += 2; - p_ptr->pspeed -= 2; + new_speed -= 2; } if (p_ptr->muta3 & MUT3_ALBINO) @@ -3754,12 +3824,12 @@ void calc_bonuses(void) if (p_ptr->muta3 & MUT3_XTRA_LEGS) { - p_ptr->pspeed += 3; + new_speed += 3; } if (p_ptr->muta3 & MUT3_SHORT_LEG) { - p_ptr->pspeed -= 3; + new_speed -= 3; } if (p_ptr->muta3 & MUT3_ELEC_TOUC) @@ -3796,7 +3866,7 @@ void calc_bonuses(void) if (p_ptr->muta3 & MUT3_WINGS) { - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; } if (p_ptr->muta3 & MUT3_FEARLESS) @@ -3883,7 +3953,7 @@ void calc_bonuses(void) if (have_flag(flgs, TR_TUNNEL)) p_ptr->skill_dig += (o_ptr->pval * 20); /* Affect speed */ - if (have_flag(flgs, TR_SPEED)) p_ptr->pspeed += o_ptr->pval; + if (have_flag(flgs, TR_SPEED)) new_speed += o_ptr->pval; /* Affect blows */ if (have_flag(flgs, TR_BLOWS)) @@ -3923,19 +3993,33 @@ void calc_bonuses(void) if (have_flag(flgs, TR_ESP_UNIQUE)) p_ptr->esp_unique = TRUE; if (have_flag(flgs, TR_SEE_INVIS)) p_ptr->see_inv = TRUE; - if (have_flag(flgs, TR_FEATHER)) p_ptr->ffall = TRUE; + if (have_flag(flgs, TR_LEVITATION)) p_ptr->levitation = TRUE; if (have_flag(flgs, TR_FREE_ACT)) p_ptr->free_act = TRUE; if (have_flag(flgs, TR_HOLD_LIFE)) p_ptr->hold_life = TRUE; if (have_flag(flgs, TR_WARNING)){ - if (!o_ptr->inscription || !(strchr(quark_str(o_ptr->inscription),'$'))) + if (!o_ptr->inscription || !(my_strchr(quark_str(o_ptr->inscription),'$'))) p_ptr->warning = TRUE; } if (have_flag(flgs, TR_TELEPORT)) { - if (cursed_p(o_ptr)) p_ptr->cursed |= TRC_TELEPORT; - else if (!o_ptr->inscription || !(strchr(quark_str(o_ptr->inscription),'.'))) - p_ptr->cursed |= TRC_TELEPORT_SELF; + if (object_is_cursed(o_ptr)) p_ptr->cursed |= TRC_TELEPORT; + else + { + cptr insc = quark_str(o_ptr->inscription); + + if (o_ptr->inscription && my_strchr(insc, '.')) + { + /* + * {.} will stop random teleportation. + */ + } + else + { + /* Controlled random teleportation */ + p_ptr->cursed |= TRC_TELEPORT_SELF; + } + } } /* Immunity flags */ @@ -3981,7 +4065,7 @@ void calc_bonuses(void) if (o_ptr->name2 == EGO_2WEAPON) easy_2weapon = TRUE; if (o_ptr->name2 == EGO_RING_RES_TIME) p_ptr->resist_time = TRUE; if (o_ptr->name2 == EGO_RING_THROW) p_ptr->mighty_throw = TRUE; - if (o_ptr->name2 == EGO_RING_WIZARD) p_ptr->easy_spell = TRUE; + if (have_flag(flgs, TR_EASY_SPELL)) p_ptr->easy_spell = TRUE; if (o_ptr->name2 == EGO_AMU_FOOL) p_ptr->heavy_spell = TRUE; if (o_ptr->name2 == EGO_AMU_NAIVETY) down_saving = TRUE; @@ -4009,7 +4093,7 @@ void calc_bonuses(void) p_ptr->to_a += o_ptr->to_a; /* Apply the mental bonuses to armor class, if known */ - if (object_known_p(o_ptr)) p_ptr->dis_to_a += o_ptr->to_a; + if (object_is_known(o_ptr)) p_ptr->dis_to_a += o_ptr->to_a; if (o_ptr->curse_flags & TRC_LOW_MELEE) { @@ -4080,7 +4164,7 @@ void calc_bonuses(void) p_ptr->to_d_m += bonus_to_d; /* Apply the mental bonuses tp hit/damage, if known */ - if (object_known_p(o_ptr)) p_ptr->dis_to_h_b += bonus_to_h; + if (object_is_known(o_ptr)) p_ptr->dis_to_h_b += bonus_to_h; /* To Melee */ if ((i == INVEN_LEFT || i == INVEN_RIGHT) && !p_ptr->ryoute) @@ -4090,7 +4174,7 @@ void calc_bonuses(void) p_ptr->to_d[i-INVEN_RIGHT] += bonus_to_d; /* Apply the mental bonuses tp hit/damage, if known */ - if (object_known_p(o_ptr)) + if (object_is_known(o_ptr)) { p_ptr->dis_to_h[i-INVEN_RIGHT] += bonus_to_h; p_ptr->dis_to_d[i-INVEN_RIGHT] += bonus_to_d; @@ -4105,7 +4189,7 @@ void calc_bonuses(void) p_ptr->to_d[1] += (bonus_to_d > 0) ? bonus_to_d/2 : bonus_to_d; /* Apply the mental bonuses tp hit/damage, if known */ - if (object_known_p(o_ptr)) + if (object_is_known(o_ptr)) { p_ptr->dis_to_h[0] += (bonus_to_h > 0) ? (bonus_to_h+1)/2 : bonus_to_h; p_ptr->dis_to_h[1] += (bonus_to_h > 0) ? bonus_to_h/2 : bonus_to_h; @@ -4116,18 +4200,24 @@ void calc_bonuses(void) else { /* Apply the bonuses to hit/damage */ - p_ptr->to_h[0] += bonus_to_h; - p_ptr->to_d[0] += bonus_to_d; + p_ptr->to_h[default_hand] += bonus_to_h; + p_ptr->to_d[default_hand] += bonus_to_d; - /* Apply the mental bonuses tp hit/damage, if known */ - if (object_known_p(o_ptr)) + /* Apply the mental bonuses to hit/damage, if known */ + if (object_is_known(o_ptr)) { - p_ptr->dis_to_h[0] += bonus_to_h; - p_ptr->dis_to_d[0] += bonus_to_d; + p_ptr->dis_to_h[default_hand] += bonus_to_h; + p_ptr->dis_to_d[default_hand] += bonus_to_d; } } } + if (old_mighty_throw != p_ptr->mighty_throw) + { + /* Redraw average damege display of Shuriken */ + p_ptr->window |= PW_INVEN; + } + if (p_ptr->cursed & TRC_TELEPORT) p_ptr->cursed &= ~(TRC_TELEPORT_SELF); /* Monks get extra ac for armour _not worn_ */ @@ -4201,12 +4291,55 @@ void calc_bonuses(void) if (p_ptr->sh_fire) p_ptr->lite = TRUE; /* Golems also get an intrinsic AC bonus */ - if ((p_ptr->prace == RACE_GOLEM) || (p_ptr->prace == RACE_ANDROID)) + if (prace_is_(RACE_GOLEM) || prace_is_(RACE_ANDROID)) { p_ptr->to_a += 10 + (p_ptr->lev * 2 / 5); p_ptr->dis_to_a += 10 + (p_ptr->lev * 2 / 5); } + /* Hex bonuses */ + if (p_ptr->realm1 == REALM_HEX) + { + if (hex_spelling_any()) p_ptr->skill_stl -= (1 + p_ptr->magic_num2[0]); + if (hex_spelling(HEX_DETECT_EVIL)) p_ptr->esp_evil = TRUE; + if (hex_spelling(HEX_XTRA_MIGHT)) p_ptr->stat_add[A_STR] += 4; + if (hex_spelling(HEX_BUILDING)) + { + p_ptr->stat_add[A_STR] += 4; + p_ptr->stat_add[A_DEX] += 4; + p_ptr->stat_add[A_CON] += 4; + } + if (hex_spelling(HEX_DEMON_AURA)) + { + p_ptr->sh_fire = TRUE; + p_ptr->regenerate = TRUE; + } + if (hex_spelling(HEX_ICE_ARMOR)) + { + p_ptr->sh_cold = TRUE; + p_ptr->to_a += 30; + p_ptr->dis_to_a += 30; + } + if (hex_spelling(HEX_SHOCK_CLOAK)) + { + p_ptr->sh_elec = TRUE; + new_speed += 3; + } + for (i = INVEN_RARM; i <= INVEN_FEET; i++) + { + int ac = 0; + o_ptr = &inventory[i]; + if (!o_ptr->k_idx) continue; + if (!object_is_armour(o_ptr)) continue; + if (!object_is_cursed(o_ptr)) continue; + ac += 5; + if (o_ptr->curse_flags & TRC_HEAVY_CURSE) ac += 7; + if (o_ptr->curse_flags & TRC_PERMA_CURSE) ac += 13; + p_ptr->to_a += ac; + p_ptr->dis_to_a += ac; + } + } + /* Calculate stats */ for (i = 0; i < 6; i++) { @@ -4341,14 +4474,20 @@ void calc_bonuses(void) p_ptr->dis_to_d[1] -= 5; } - /* wraith_form */ + /* Wraith form */ if (p_ptr->wraith_form) { p_ptr->reflect = TRUE; + p_ptr->pass_wall = TRUE; + } + + if (p_ptr->kabenuke) + { + p_ptr->pass_wall = TRUE; } /* Temporary blessing */ - if (p_ptr->blessed || music_singing(MUSIC_BLESS)) + if (IS_BLESSED()) { p_ptr->to_a += 5; p_ptr->dis_to_a += 5; @@ -4367,11 +4506,11 @@ void calc_bonuses(void) p_ptr->resist_conf = TRUE; p_ptr->reflect = TRUE; p_ptr->free_act = TRUE; - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; } /* Temporary "Hero" */ - if (p_ptr->hero || music_singing(MUSIC_HERO) || music_singing(MUSIC_SHERO)) + if (IS_HERO()) { p_ptr->to_h[0] += 12; p_ptr->to_h[1] += 12; @@ -4408,20 +4547,20 @@ void calc_bonuses(void) p_ptr->skill_dig += 30; } -/* Temporary "fast" */ - if (p_ptr->fast || music_singing(MUSIC_SPEED) || music_singing(MUSIC_SHERO)) + /* Temporary "fast" */ + if (IS_FAST()) { - p_ptr->pspeed += 10; + new_speed += 10; } /* Temporary "slow" */ if (p_ptr->slow) { - p_ptr->pspeed -= 10; + new_speed -= 10; } /* Temporary "telepathy" */ - if (p_ptr->tim_esp || music_singing(MUSIC_MIND)) + if (IS_TIM_ESP()) { p_ptr->telepathy = TRUE; } @@ -4457,13 +4596,19 @@ void calc_bonuses(void) } /* Temporary levitation */ - if (p_ptr->tim_ffall) + if (p_ptr->tim_levitation) + { + p_ptr->levitation = TRUE; + } + + /* Temporary reflection */ + if (p_ptr->tim_reflect) { - p_ptr->ffall = TRUE; + p_ptr->reflect = TRUE; } /* Hack -- Hero/Shero -> Res fear */ - if (p_ptr->hero || p_ptr->shero || music_singing(MUSIC_HERO) || music_singing(MUSIC_SHERO)) + if (IS_HERO() || p_ptr->shero) { p_ptr->resist_fear = TRUE; } @@ -4498,26 +4643,27 @@ void calc_bonuses(void) } /* Bloating slows the player down (a little) */ - if (p_ptr->food >= PY_FOOD_MAX) p_ptr->pspeed -= 10; + if (p_ptr->food >= PY_FOOD_MAX) new_speed -= 10; - if (p_ptr->special_defense & KAMAE_SUZAKU) p_ptr->pspeed += 10; + if (p_ptr->special_defense & KAMAE_SUZAKU) new_speed += 10; - if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM)) + if ((p_ptr->migite && (empty_hands_status & EMPTY_HAND_RARM)) || + (p_ptr->hidarite && (empty_hands_status & EMPTY_HAND_LARM))) { - p_ptr->to_h[0] += (p_ptr->skill_exp[GINOU_SUDE]-4000)/200; - p_ptr->dis_to_h[0] += (p_ptr->skill_exp[GINOU_SUDE]-4000)/200; + p_ptr->to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200; + p_ptr->dis_to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200; } if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM)) { int penalty1, penalty2; - penalty1 = ((100-p_ptr->skill_exp[GINOU_NITOURYU]/160) - (130-inventory[INVEN_RARM].weight)/8); - penalty2 = ((100-p_ptr->skill_exp[GINOU_NITOURYU]/160) - (130-inventory[INVEN_LARM].weight)/8); + penalty1 = ((100 - p_ptr->skill_exp[GINOU_NITOURYU] / 160) - (130 - inventory[INVEN_RARM].weight) / 8); + penalty2 = ((100 - p_ptr->skill_exp[GINOU_NITOURYU] / 160) - (130 - inventory[INVEN_LARM].weight) / 8); if ((inventory[INVEN_RARM].name1 == ART_QUICKTHORN) && (inventory[INVEN_LARM].name1 == ART_TINYTHORN)) { penalty1 = penalty1 / 2 - 5; penalty2 = penalty2 / 2 - 5; - p_ptr->pspeed += 7; + new_speed += 7; p_ptr->to_a += 10; p_ptr->dis_to_a += 10; } @@ -4556,36 +4702,46 @@ void calc_bonuses(void) /* Extract the current weight (in tenth pounds) */ j = p_ptr->total_weight; - /* Extract the "weight limit" (in tenth pounds) */ - i = weight_limit(); - - if (p_ptr->riding) + if (!p_ptr->riding) + { + /* Extract the "weight limit" (in tenth pounds) */ + i = (int)weight_limit(); + } + else { - int speed = m_list[p_ptr->riding].mspeed; - if (m_list[p_ptr->riding].mspeed > 110) + monster_type *riding_m_ptr = &m_list[p_ptr->riding]; + monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx]; + int speed = riding_m_ptr->mspeed; + + if (riding_m_ptr->mspeed > 110) { - p_ptr->pspeed = 110 + (s16b)((speed-110)*(p_ptr->skill_exp[GINOU_RIDING]*3 + p_ptr->lev*160L - 10000L)/(22000L)); - if (p_ptr->pspeed < 110) p_ptr->pspeed = 110; + new_speed = 110 + (s16b)((speed - 110) * (p_ptr->skill_exp[GINOU_RIDING] * 3 + p_ptr->lev * 160L - 10000L) / (22000L)); + if (new_speed < 110) new_speed = 110; } else { - p_ptr->pspeed = speed; + new_speed = speed; } - if (m_list[p_ptr->riding].fast) p_ptr->pspeed += 10; - if (m_list[p_ptr->riding].slow) p_ptr->pspeed -= 10; - if (r_info[m_list[p_ptr->riding].r_idx].flags7 & RF7_CAN_FLY) p_ptr->ffall = TRUE; - if (r_info[m_list[p_ptr->riding].r_idx].flags7 & (RF7_CAN_SWIM | RF7_AQUATIC)) p_ptr->can_swim = TRUE; + new_speed += (p_ptr->skill_exp[GINOU_RIDING] + p_ptr->lev *160L)/3200; + if (MON_FAST(riding_m_ptr)) new_speed += 10; + if (MON_SLOW(riding_m_ptr)) new_speed -= 10; + riding_levitation = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? TRUE : FALSE; + if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC)) p_ptr->can_swim = TRUE; - if (p_ptr->skill_exp[GINOU_RIDING] < 2000) j += (p_ptr->wt*3*(2000 - p_ptr->skill_exp[GINOU_RIDING]))/2000; + if (!(riding_r_ptr->flags2 & RF2_PASS_WALL)) p_ptr->pass_wall = FALSE; + if (riding_r_ptr->flags2 & RF2_KILL_WALL) p_ptr->kill_wall = TRUE; - i = 3000 + r_info[m_list[p_ptr->riding].r_idx].level * 50; + if (p_ptr->skill_exp[GINOU_RIDING] < RIDING_EXP_SKILLED) j += (p_ptr->wt * 3 * (RIDING_EXP_SKILLED - p_ptr->skill_exp[GINOU_RIDING])) / RIDING_EXP_SKILLED; + + /* Extract the "weight limit" */ + i = 1500 + riding_r_ptr->level * 25; } /* XXX XXX XXX Apply "encumbrance" from weight */ - if (j > i/2) p_ptr->pspeed -= ((j - (i/2)) / (i / 10)); + if (j > i) new_speed -= ((j - i) / (i / 5)); /* Searching slows the player down */ - if (p_ptr->action == ACTION_SEARCH) p_ptr->pspeed -= 10; + if (p_ptr->action == ACTION_SEARCH) new_speed -= 10; /* Actual Modifier Bonuses (Un-inflate stat bonuses) */ p_ptr->to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128); @@ -4711,6 +4867,14 @@ void calc_bonuses(void) { p_ptr->num_fire += (p_ptr->lev * 4); } + + /* Snipers love Cross bows */ + if ((p_ptr->pclass == CLASS_SNIPER) && + (p_ptr->tval_ammo == TV_BOLT)) + { + p_ptr->to_h_b += (10 + (p_ptr->lev / 5)); + p_ptr->dis_to_h_b += (10 + (p_ptr->lev / 5)); + } } } @@ -4772,7 +4936,7 @@ void calc_bonuses(void) case CLASS_BLUE_MAGE: num = 3; wgt = 100; mul = 2; break; - /* Priest, Mindcrafter */ + /* Priest, Mindcrafter, Magic-Eater */ case CLASS_PRIEST: case CLASS_MAGIC_EATER: case CLASS_MINDCRAFTER: @@ -4791,7 +4955,7 @@ void calc_bonuses(void) case CLASS_SAMURAI: num = 5; wgt = 70; mul = 4; break; - /* Kaji */ + /* Weaponsmith */ case CLASS_SMITH: num = 5; wgt = 150; mul = 5; break; @@ -4820,6 +4984,7 @@ void calc_bonuses(void) case CLASS_BEASTMASTER: num = 5; wgt = 70; mul = 3; break; + /* Cavalry */ case CLASS_CAVALRY: if ((p_ptr->riding) && (have_flag(flgs, TR_RIDING))) {num = 5; wgt = 70; mul = 4;} else {num = 5; wgt = 100; mul = 3;} @@ -4829,7 +4994,7 @@ void calc_bonuses(void) case CLASS_SORCERER: num = 1; wgt = 1; mul = 1; break; - /* Archer, Magic eater */ + /* Archer, Bard */ case CLASS_ARCHER: case CLASS_BARD: num = 4; wgt = 70; mul = 2; break; @@ -4838,8 +5003,9 @@ void calc_bonuses(void) case CLASS_FORCETRAINER: num = 4; wgt = 60; mul = 2; break; - /* Mirror Master */ + /* Mirror Master, Sniper */ case CLASS_MIRROR_MASTER: + case CLASS_SNIPER: num = 3; wgt = 100; mul = 3; break; /* Ninja */ @@ -4847,6 +5013,9 @@ void calc_bonuses(void) num = 4; wgt = 20; mul = 1; break; } + /* Hex - extra mights gives +1 bonus to max blows */ + if (hex_spelling(HEX_XTRA_MIGHT) || hex_spelling(HEX_BUILDING)) { num++; wgt /= 2; mul += 2; } + /* Enforce a minimum "weight" (tenth pounds) */ div = ((o_ptr->weight < wgt) ? wgt : o_ptr->weight); @@ -4916,7 +5085,7 @@ void calc_bonuses(void) p_ptr->to_d[i] += p_ptr->lev/6; p_ptr->dis_to_h[i] += p_ptr->lev/5; p_ptr->dis_to_d[i] += p_ptr->lev/6; - if (!p_ptr->hidarite || p_ptr->ryoute) + if (((i == 0) && !p_ptr->hidarite) || p_ptr->ryoute) { p_ptr->to_h[i] += p_ptr->lev/5; p_ptr->to_d[i] += p_ptr->lev/6; @@ -4950,12 +5119,30 @@ void calc_bonuses(void) p_ptr->dis_to_d[i] -= 10; } } + /* Hex bonuses */ + if (p_ptr->realm1 == REALM_HEX) + { + if (object_is_cursed(o_ptr)) + { + if (o_ptr->curse_flags & (TRC_CURSED)) { p_ptr->to_h[i] += 5; p_ptr->dis_to_h[i] += 5; } + if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) { p_ptr->to_h[i] += 7; p_ptr->dis_to_h[i] += 7; } + if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) { p_ptr->to_h[i] += 13; p_ptr->dis_to_h[i] += 13; } + if (o_ptr->curse_flags & (TRC_TY_CURSE)) { p_ptr->to_h[i] += 5; p_ptr->dis_to_h[i] += 5; } + if (hex_spelling(HEX_RUNESWORD)) + { + if (o_ptr->curse_flags & (TRC_CURSED)) { p_ptr->to_d[i] += 5; p_ptr->dis_to_d[i] += 5; } + if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) { p_ptr->to_d[i] += 7; p_ptr->dis_to_d[i] += 7; } + if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) { p_ptr->to_d[i] += 13; p_ptr->dis_to_d[i] += 13; } + } + } + } if (p_ptr->riding) { if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))) { p_ptr->to_h[i] +=15; p_ptr->dis_to_h[i] +=15; + p_ptr->to_dd[i] += 2; } else if (!(have_flag(flgs, TR_RIDING))) { @@ -4984,7 +5171,20 @@ void calc_bonuses(void) int penalty = 0; p_ptr->riding_ryoute = FALSE; - if (p_ptr->ryoute || !empty_hands(FALSE)) p_ptr->riding_ryoute = TRUE; + + if (p_ptr->ryoute || (empty_hands(FALSE) == EMPTY_HAND_NONE)) p_ptr->riding_ryoute = TRUE; + else if (p_ptr->pet_extra_flags & PF_RYOUTE) + { + switch (p_ptr->pclass) + { + case CLASS_MONK: + case CLASS_FORCETRAINER: + case CLASS_BERSERKER: + if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM)) + p_ptr->riding_ryoute = TRUE; + break; + } + } if ((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY)) { @@ -5002,7 +5202,8 @@ void calc_bonuses(void) } /* Different calculation for monks with empty hands */ - if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(TRUE) > 1)) + if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && + (empty_hands_status & EMPTY_HAND_RARM) && !p_ptr->hidarite) { int blow_base = p_ptr->lev + adj_dex_blow[p_ptr->stat_ind[A_DEX]]; p_ptr->num_blow[0] = 0; @@ -5059,7 +5260,7 @@ void calc_bonuses(void) p_ptr->sh_fire = TRUE; p_ptr->sh_elec = TRUE; p_ptr->sh_cold = TRUE; - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; } else if (p_ptr->special_defense & KAMAE_GENBU) { @@ -5078,12 +5279,14 @@ void calc_bonuses(void) p_ptr->dis_to_h[0] -= (p_ptr->lev / 3); p_ptr->dis_to_d[0] -= (p_ptr->lev / 6); p_ptr->num_blow[0] /= 2; - p_ptr->ffall = TRUE; + p_ptr->levitation = TRUE; } p_ptr->num_blow[0] += 1+extra_blows[0]; } + if (p_ptr->riding) p_ptr->levitation = riding_levitation; + monk_armour_aux = FALSE; if (heavy_armor()) @@ -5091,30 +5294,27 @@ void calc_bonuses(void) monk_armour_aux = TRUE; } - for (i = 0 ; i < 2 ; i++) + for (i = 0; i < 2; i++) { - if(buki_motteruka(INVEN_RARM+i)) + if (buki_motteruka(INVEN_RARM+i)) { - int tval = inventory[INVEN_RARM+i].tval - TV_BOW; + int tval = inventory[INVEN_RARM+i].tval - TV_WEAPON_BEGIN; int sval = inventory[INVEN_RARM+i].sval; - p_ptr->to_h[i] += (p_ptr->weapon_exp[tval][sval]-4000)/200; - p_ptr->dis_to_h[i] += (p_ptr->weapon_exp[tval][sval]-4000)/200; - if ((p_ptr->pclass == CLASS_MONK) && !(s_info[CLASS_MONK].w_max[tval][sval])) - { - p_ptr->to_h[i] -= 40; - p_ptr->dis_to_h[i] -= 40; - p_ptr->icky_wield[i] = TRUE; - } - else if ((p_ptr->pclass == CLASS_FORCETRAINER) && !(s_info[CLASS_FORCETRAINER].w_max[tval][sval])) + p_ptr->to_h[i] += (p_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200; + p_ptr->dis_to_h[i] += (p_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200; + if ((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER)) { - p_ptr->to_h[i] -= 40; - p_ptr->dis_to_h[i] -= 40; - p_ptr->icky_wield[i] = TRUE; + if (!s_info[p_ptr->pclass].w_max[tval][sval]) + { + p_ptr->to_h[i] -= 40; + p_ptr->dis_to_h[i] -= 40; + p_ptr->icky_wield[i] = TRUE; + } } else if (p_ptr->pclass == CLASS_NINJA) { - if ((s_info[CLASS_NINJA].w_max[tval][sval] <= 4000) || (inventory[INVEN_LARM-i].tval == TV_SHIELD)) + if ((s_info[CLASS_NINJA].w_max[tval][sval] <= WEAPON_EXP_BEGINNER) || (inventory[INVEN_LARM-i].tval == TV_SHIELD)) { p_ptr->to_h[i] -= 40; p_ptr->dis_to_h[i] -= 40; @@ -5123,18 +5323,27 @@ void calc_bonuses(void) if (p_ptr->num_blow[i] < 1) p_ptr->num_blow[i] = 1; } } + + if (inventory[INVEN_RARM + i].name1 == ART_IRON_BALL) p_ptr->align -= 1000; } } - /* Temporary lightspeed */ - if ((p_ptr->lightspeed && !p_ptr->riding) || (p_ptr->pspeed > 209)) + /* Maximum speed is (+99). (internally it's 110 + 99) */ + /* Temporary lightspeed forces to be maximum speed */ + if ((p_ptr->lightspeed && !p_ptr->riding) || (new_speed > 209)) { - p_ptr->pspeed = 209; + new_speed = 209; } - if (p_ptr->pspeed < 11) p_ptr->pspeed = 11; + + /* Minimum speed is (-99). (internally it's 110 - 99) */ + if (new_speed < 11) new_speed = 11; /* Display the speed (if needed) */ - if (p_ptr->pspeed != old_speed) p_ptr->redraw |= (PR_SPEED); + if (p_ptr->pspeed != (byte)new_speed) + { + p_ptr->pspeed = (byte)new_speed; + p_ptr->redraw |= (PR_SPEED); + } if (yoiyami) { @@ -5161,19 +5370,18 @@ void calc_bonuses(void) bonus_to_d = ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128)/2; bonus_to_h = ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128) + ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128); - p_ptr->to_h[0] += MAX(bonus_to_h,1); - p_ptr->dis_to_h[0] += MAX(bonus_to_h,1); - p_ptr->to_d[0] += MAX(bonus_to_d,1); - p_ptr->dis_to_d[0] += MAX(bonus_to_d,1); + p_ptr->to_h[default_hand] += MAX(bonus_to_h,1); + p_ptr->dis_to_h[default_hand] += MAX(bonus_to_h,1); + p_ptr->to_d[default_hand] += MAX(bonus_to_d,1); + p_ptr->dis_to_d[default_hand] += MAX(bonus_to_d,1); } - if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(TRUE) == 3)) p_ptr->ryoute = FALSE; + if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))) p_ptr->ryoute = FALSE; /* Affect Skill -- stealth (bonus one) */ p_ptr->skill_stl += 1; - if (p_ptr->tim_stealth || music_singing(MUSIC_STEALTH)) - p_ptr->skill_stl += 99; + if (IS_TIM_STEALTH()) p_ptr->skill_stl += 99; /* Affect Skill -- disarming (DEX and INT) */ p_ptr->skill_dis += adj_dex_dis[p_ptr->stat_ind[A_DEX]]; @@ -5237,6 +5445,50 @@ void calc_bonuses(void) if (down_saving) p_ptr->skill_sav /= 2; + /* Hack -- Each elemental immunity includes resistance */ + if (p_ptr->immune_acid) p_ptr->resist_acid = TRUE; + if (p_ptr->immune_elec) p_ptr->resist_elec = TRUE; + if (p_ptr->immune_fire) p_ptr->resist_fire = TRUE; + if (p_ptr->immune_cold) p_ptr->resist_cold = TRUE; + + /* Determine player alignment */ + for (i = 0, j = 0; i < 8; i++) + { + switch (p_ptr->vir_types[i]) + { + case V_JUSTICE: + p_ptr->align += p_ptr->virtues[i] * 2; + break; + case V_CHANCE: + /* Do nothing */ + break; + case V_NATURE: + case V_HARMONY: + neutral[j++] = i; + break; + case V_UNLIFE: + p_ptr->align -= p_ptr->virtues[i]; + break; + default: + p_ptr->align += p_ptr->virtues[i]; + break; + } + } + + for (i = 0; i < j; i++) + { + if (p_ptr->align > 0) + { + p_ptr->align -= p_ptr->virtues[neutral[i]] / 2; + if (p_ptr->align < 0) p_ptr->align = 0; + } + else if (p_ptr->align < 0) + { + p_ptr->align += p_ptr->virtues[neutral[i]] / 2; + if (p_ptr->align > 0) p_ptr->align = 0; + } + } + /* Hack -- handle "xtra" mode */ if (character_xtra) return; @@ -5276,7 +5528,7 @@ void calc_bonuses(void) p_ptr->old_heavy_shoot = p_ptr->heavy_shoot; } - for(i = 0 ; i < 2 ; i++) + for (i = 0 ; i < 2 ; i++) { /* Take note when "heavy weapon" changes */ if (p_ptr->old_heavy_wield[i] != p_ptr->heavy_wield[i]) @@ -5404,7 +5656,7 @@ void calc_bonuses(void) if (p_ptr->riding_ryoute) { #ifdef JP - msg_print("ξ¼ê¤¬¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ÆÇϤòÁà¤ì¤Ê¤¤¡£"); + msg_format("%sÇϤòÁà¤ì¤Ê¤¤¡£", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "ξ¼ê¤¬¤Õ¤µ¤¬¤Ã¤Æ¤¤¤Æ" : ""); #else msg_print("You are using both hand for fighting, and you can't control a riding pet."); #endif @@ -5412,7 +5664,7 @@ void calc_bonuses(void) else { #ifdef JP - msg_print("¼ê¤¬¶õ¤¤¤ÆÇϤòÁà¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£"); + msg_format("%sÇϤòÁà¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "¼ê¤¬¶õ¤¤¤Æ" : ""); #else msg_print("You began to control riding pet with one hand."); #endif @@ -5446,49 +5698,14 @@ msg_print(" monk_notify_aux = monk_armour_aux; } - j = 0; - p_ptr->align = friend_align; - - /* Determine player alignment */ - for (i = 0; i < 8; i++) - { - if ((p_ptr->vir_types[i] == V_HARMONY) || (p_ptr->vir_types[i] == V_NATURE)) - { - neutral[j] = i; - j++; - } - else if (p_ptr->vir_types[i] == V_UNLIFE) p_ptr->align -= p_ptr->virtues[i]; - else if (p_ptr->vir_types[i] == V_JUSTICE) p_ptr->align += (p_ptr->virtues[i]*2); - else if (p_ptr->vir_types[i] != V_CHANCE) p_ptr->align += p_ptr->virtues[i]; - } - if ((inventory[INVEN_RARM].name1 == ART_IRON_BALL) || (inventory[INVEN_LARM].name1 == ART_IRON_BALL)) p_ptr->align -= 1000; - if (prace_is_(RACE_ANGEL)) p_ptr->align += 200; - if ((prace_is_(RACE_DEMON)) || (p_ptr->mimic_form == MIMIC_DEMON_LORD) || (p_ptr->mimic_form == MIMIC_DEMON)) p_ptr->align -= 200; - while (j) - { - j--; - if (p_ptr->align > 0) - { - p_ptr->align -= (p_ptr->virtues[neutral[j]]/2); - if (p_ptr->align < 0) p_ptr->align = 0; - } - else if (p_ptr->align < 0) - { - p_ptr->align += (p_ptr->virtues[neutral[j]]/2); - if (p_ptr->align > 0) p_ptr->align = 0; - } - } - - have_dd_s = FALSE; - have_dd_t = FALSE; - have_sw = FALSE; - have_kabe = FALSE; for (i = 0; i < INVEN_PACK; i++) { - if ((inventory[i].tval == TV_SORCERY_BOOK) && (inventory[i].sval == 3)) have_dd_s = TRUE; +#if 0 + if ((inventory[i].tval == TV_SORCERY_BOOK) && (inventory[i].sval == 2)) have_dd_s = TRUE; if ((inventory[i].tval == TV_TRUMP_BOOK) && (inventory[i].sval == 1)) have_dd_t = TRUE; +#endif if ((inventory[i].tval == TV_NATURE_BOOK) && (inventory[i].sval == 2)) have_sw = TRUE; - if ((inventory[i].tval == TV_ENCHANT_BOOK) && (inventory[i].sval == 2)) have_kabe = TRUE; + if ((inventory[i].tval == TV_CRAFT_BOOK) && (inventory[i].sval == 2)) have_kabe = TRUE; } for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx) { @@ -5500,13 +5717,15 @@ msg_print(" /* Acquire next object */ next_o_idx = o_ptr->next_o_idx; +#if 0 if ((o_ptr->tval == TV_SORCERY_BOOK) && (o_ptr->sval == 3)) have_dd_s = TRUE; if ((o_ptr->tval == TV_TRUMP_BOOK) && (o_ptr->sval == 1)) have_dd_t = TRUE; +#endif if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2)) have_sw = TRUE; - if ((o_ptr->tval == TV_ENCHANT_BOOK) && (o_ptr->sval == 2)) have_kabe = TRUE; + if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2)) have_kabe = TRUE; } - if ((p_ptr->pass_wall && !p_ptr->kill_wall) || p_ptr->kabenuke || p_ptr->wraith_form) p_ptr->no_flowed = TRUE; + if (p_ptr->pass_wall && !p_ptr->kill_wall) p_ptr->no_flowed = TRUE; #if 0 if (have_dd_s && ((p_ptr->realm1 == REALM_SORCERY) || (p_ptr->realm2 == REALM_SORCERY) || (p_ptr->pclass == CLASS_SORCERER))) { @@ -5526,9 +5745,9 @@ msg_print(" if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE; } - if (have_kabe && ((p_ptr->realm1 == REALM_ENCHANT) || (p_ptr->realm2 == REALM_ENCHANT) || (p_ptr->pclass == CLASS_SORCERER))) + if (have_kabe && ((p_ptr->realm1 == REALM_CRAFT) || (p_ptr->realm2 == REALM_CRAFT) || (p_ptr->pclass == CLASS_SORCERER))) { - magic_type *s_ptr = &mp_ptr->info[REALM_ENCHANT-1][SPELL_KABE]; + magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT-1][SPELL_KABE]; if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE; } } @@ -5544,6 +5763,13 @@ void notice_stuff(void) if (!p_ptr->notice) return; + /* Actually do auto-destroy */ + if (p_ptr->notice & (PN_AUTODESTROY)) + { + p_ptr->notice &= ~(PN_AUTODESTROY); + autopick_delayed_alter(); + } + /* Combine the pack */ if (p_ptr->notice & (PN_COMBINE)) { @@ -5639,17 +5865,30 @@ void update_stuff(void) update_flow(); } + if (p_ptr->update & (PU_DISTANCE)) + { + p_ptr->update &= ~(PU_DISTANCE); + + /* Still need to call update_monsters(FALSE) after update_mon_lite() */ + /* p_ptr->update &= ~(PU_MONSTERS); */ + + update_monsters(TRUE); + } + if (p_ptr->update & (PU_MON_LITE)) { p_ptr->update &= ~(PU_MON_LITE); update_mon_lite(); } - if (p_ptr->update & (PU_DISTANCE)) + /* + * Mega-Hack -- Delayed visual update + * Only used if update_view(), update_lite() or update_mon_lite() was called + */ + if (p_ptr->update & (PU_DELAY_VIS)) { - p_ptr->update &= ~(PU_DISTANCE); - p_ptr->update &= ~(PU_MONSTERS); - update_monsters(TRUE); + p_ptr->update &= ~(PU_DELAY_VIS); + delayed_visual_update(); } if (p_ptr->update & (PU_MONSTERS)) @@ -5706,11 +5945,6 @@ void redraw_stuff(void) prt_dungeon(); } - if (p_ptr->redraw & (PR_DUNGEON)) - { - p_ptr->redraw &= ~(PR_DUNGEON); - } - if (p_ptr->redraw & (PR_EQUIPPY)) { p_ptr->redraw &= ~(PR_EQUIPPY); @@ -5793,13 +6027,13 @@ void redraw_stuff(void) if (p_ptr->redraw & (PR_HEALTH)) { p_ptr->redraw &= ~(PR_HEALTH); - health_redraw(); + health_redraw(FALSE); } if (p_ptr->redraw & (PR_UHEALTH)) { p_ptr->redraw &= ~(PR_UHEALTH); - riding_health_redraw(); + health_redraw(TRUE); } @@ -5808,7 +6042,7 @@ void redraw_stuff(void) p_ptr->redraw &= ~(PR_EXTRA); p_ptr->redraw &= ~(PR_CUT | PR_STUN); p_ptr->redraw &= ~(PR_HUNGER); - p_ptr->redraw &= ~(PR_STATE | PR_SPEED | PR_STUDY | PR_MANE | PR_STATUS); + p_ptr->redraw &= ~(PR_STATE | PR_SPEED | PR_STUDY | PR_IMITATION | PR_STATUS); prt_frame_extra(); } @@ -5844,10 +6078,10 @@ void redraw_stuff(void) if (p_ptr->pclass == CLASS_IMITATOR) { - if (p_ptr->redraw & (PR_MANE)) + if (p_ptr->redraw & (PR_IMITATION)) { - p_ptr->redraw &= ~(PR_MANE); - prt_mane(); + p_ptr->redraw &= ~(PR_IMITATION); + prt_imitation(); } } else if (p_ptr->redraw & (PR_STUDY)) @@ -5966,14 +6200,20 @@ void handle_stuff(void) } -s16b empty_hands(bool is_monk) +s16b empty_hands(bool riding_control) { - s16b kaerichi = 0; - if (is_monk && (p_ptr->pclass != CLASS_MONK) && (p_ptr->pclass != CLASS_FORCETRAINER) && (p_ptr->pclass != CLASS_BERSERKER)) return FALSE; + s16b status = EMPTY_HAND_NONE; + + if (!inventory[INVEN_RARM].k_idx) status |= EMPTY_HAND_RARM; + if (!inventory[INVEN_LARM].k_idx) status |= EMPTY_HAND_LARM; - if (!(inventory[INVEN_RARM].k_idx)) kaerichi +=2; - if (!(inventory[INVEN_LARM].k_idx)) kaerichi +=1; - return kaerichi; + if (riding_control && (status != EMPTY_HAND_NONE) && p_ptr->riding && !(p_ptr->pet_extra_flags & PF_RYOUTE)) + { + if (status & EMPTY_HAND_LARM) status &= ~(EMPTY_HAND_LARM); + else if (status & EMPTY_HAND_RARM) status &= ~(EMPTY_HAND_RARM); + } + + return status; } @@ -5994,23 +6234,3 @@ bool heavy_armor(void) return (monk_arm_wgt > (100 + (p_ptr->lev * 4))); } - -int number_of_quests(void) -{ - int i, j; - - /* Clear the counter */ - i = 0; - - for (j = MIN_RANDOM_QUEST; j < MAX_RANDOM_QUEST+1; j++) - { - if (quest[j].status != QUEST_STATUS_UNTAKEN) - { - /* Increment count of quests taken. */ - i++; - } - } - - /* Return the number of quests taken */ - return (i); -}