summaryrefslogtreecommitdiff
path: root/src/xtra1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xtra1.c')
-rw-r--r--src/xtra1.c4772
1 files changed, 0 insertions, 4772 deletions
diff --git a/src/xtra1.c b/src/xtra1.c
deleted file mode 100644
index 933bc265..00000000
--- a/src/xtra1.c
+++ /dev/null
@@ -1,4772 +0,0 @@
-/* File: misc.c */
-
-/* Purpose: misc code */
-
-/*
- * Copyright (c) 1989 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.
- */
-
-#include "angband.h"
-
-
-/*
- * Converts stat num into a six-char (right justified) string
- */
-void cnv_stat(int val, char *out_val)
-{
- if (!linear_stats)
- {
- /* Above 18 */
- if (val > 18)
- {
- int bonus = (val - 18);
-
- if (bonus >= 220)
- {
- sprintf(out_val, "18/%3s", "***");
- }
- else if (bonus >= 100)
- {
- sprintf(out_val, "18/%03d", bonus);
- }
- else
- {
- sprintf(out_val, " 18/%02d", bonus);
- }
- }
-
- /* From 3 to 18 */
- else
- {
- sprintf(out_val, " %2d", val);
- }
- }
- else
- {
- /* Above 18 */
- if (val > 18)
- {
- int bonus = (val - 18);
-
- if (bonus >= 220)
- {
- sprintf(out_val, " 40");
- }
- else
- {
- sprintf(out_val, " %2d", 18 + (bonus / 10));
- }
- }
-
- /* From 3 to 18 */
- else
- {
- sprintf(out_val, " %2d", val);
- }
- }
-}
-
-
-
-/*
- * Modify a stat value by a "modifier", return new value
- *
- * Stats go up: 3,4,...,17,18,18/10,18/20,...,18/220
- * Or even: 18/13, 18/23, 18/33, ..., 18/220
- *
- * Stats go down: 18/220, 18/210,..., 18/10, 18, 17, ..., 3
- * Or even: 18/13, 18/03, 18, 17, ..., 3
- */
-s16b modify_stat_value(int value, int amount)
-{
- int i;
-
- /* Reward */
- if (amount > 0)
- {
- /* Apply each point */
- for (i = 0; i < amount; i++)
- {
- /* One point at a time */
- if (value < 18) value++;
-
- /* Ten "points" at a time */
- else value += 10;
- }
- }
-
- /* Penalty */
- else if (amount < 0)
- {
- /* Apply each point */
- for (i = 0; i < (0 - amount); i++)
- {
- /* Ten points at a time */
- if (value >= 18 + 10) value -= 10;
-
- /* Hack -- prevent weirdness */
- else if (value > 18) value = 18;
-
- /* One point at a time */
- else if (value > 3) value--;
- }
- }
-
- /* Return new value */
- return (value);
-}
-
-
-
-/*
- * Print character info at given row, column in a 13 char field
- */
-static void prt_field(cptr info, int row, int col)
-{
- /* Dump 13 spaces to clear */
- c_put_str(TERM_WHITE, " ", row, col);
-
- /* Dump the info itself */
- c_put_str(TERM_L_BLUE, info, row, col);
-}
-
-/*
- * Prints players max/cur piety
- */
-static void prt_piety(void)
-{
- char tmp[32];
-
- /* Do not show piety unless it matters */
- if (!p_ptr->pgod) return;
-
- c_put_str(TERM_L_WHITE, "Pt ", ROW_PIETY, COL_PIETY);
-
- sprintf(tmp, "%9ld", (long) p_ptr->grace);
-
- c_put_str((p_ptr->praying) ? TERM_L_BLUE : TERM_GREEN, tmp, ROW_PIETY,
- COL_PIETY + 3);
-}
-
-
-/*
- * Prints the player's current sanity.
- */
-static void prt_sane(void)
-{
- char tmp[32];
- byte color;
- int perc;
-
- if (p_ptr->msane == 0)
- {
- perc = 100;
- }
- else
- {
- perc = (100 * p_ptr->csane) / p_ptr->msane;
- }
-
- c_put_str(TERM_ORANGE, "SN ", ROW_SANITY, COL_SANITY);
-
- sprintf(tmp, "%4d/%4d", p_ptr->csane, p_ptr->msane);
-
- if (perc >= 100)
- {
- color = TERM_L_GREEN;
- }
- else if (perc > (10 * hitpoint_warn))
- {
- color = TERM_YELLOW;
- }
- else
- {
- color = TERM_RED;
- }
-
- c_put_str(color, tmp, ROW_SANITY, COL_SANITY + 3);
-}
-
-
-/*
- * Print character stat in given row, column
- */
-static void prt_stat(int stat)
-{
- char tmp[32];
-
- cnv_stat(p_ptr->stat_use[stat], tmp);
-
- /* Display "injured" stat */
- if (p_ptr->stat_cur[stat] < p_ptr->stat_max[stat])
- {
- int colour;
-
- if (p_ptr->stat_cnt[stat])
- colour = TERM_ORANGE;
- else
- colour = TERM_YELLOW;
-
- put_str(format("%s: ", stat_names_reduced[stat]), ROW_STAT + stat, 0);
- c_put_str(colour, tmp, ROW_STAT + stat, COL_STAT + 6);
- }
-
- /* Display "healthy" stat */
- else
- {
- put_str(format("%s: ", stat_names[stat]), ROW_STAT + stat, 0);
- c_put_str(TERM_L_GREEN, tmp, ROW_STAT + stat, COL_STAT + 6);
- }
-
- /* Display "boosted" stat */
- if (p_ptr->stat_cur[stat] > p_ptr->stat_max[stat])
- {
- put_str(format("%s: ", stat_names[stat]), ROW_STAT + stat, 0);
- c_put_str(TERM_VIOLET, tmp, ROW_STAT + stat, COL_STAT + 6);
- }
-
- /* Indicate natural maximum */
- if (p_ptr->stat_max[stat] == 18 + 100)
- {
- put_str("!", ROW_STAT + stat, 3);
- }
-}
-
-
-
-
-/*
- * Prints "title", including "wizard" or "winner" as needed.
- */
-static void prt_title(void)
-{
- cptr p = "";
-
- /* Mimic shape */
- if (p_ptr->mimic_form)
- {
- call_lua("get_mimic_info", "(d,s)", "s", p_ptr->mimic_form, "show_name", &p);
- }
-
- /* Wizard */
- else if (wizard)
- {
- p = "[=-WIZARD-=]";
- }
-
- /* Winner */
- else if (total_winner == WINNER_NORMAL)
- {
- p = "***WINNER***";
- }
-
- /* Ultra Winner */
- else if (total_winner == WINNER_ULTRA)
- {
- p = "***GOD***";
- }
-
- /* Normal */
- else
- {
- p = cp_ptr->titles[(p_ptr->lev - 1) / 5] + c_text;
-
- }
-
- prt_field(p, ROW_TITLE, COL_TITLE);
-}
-
-
-/*
- * Prints level
- */
-static void prt_level(void)
-{
- char tmp[32];
-
- sprintf(tmp, "%6d", p_ptr->lev);
-
- if (p_ptr->lev >= p_ptr->max_plv)
- {
- put_str("LEVEL ", ROW_LEVEL, 0);
- c_put_str(TERM_L_GREEN, tmp, ROW_LEVEL, COL_LEVEL + 6);
- }
- else
- {
- put_str("Level ", ROW_LEVEL, 0);
- c_put_str(TERM_YELLOW, tmp, ROW_LEVEL, COL_LEVEL + 6);
- }
-}
-
-
-/*
- * Display the experience
- */
-static void prt_exp(void)
-{
- char out_val[32];
-
- if (!exp_need)
- {
- (void)sprintf(out_val, "%8ld", (long)p_ptr->exp);
- }
- else
- {
- if ((p_ptr->lev >= PY_MAX_LEVEL) || (p_ptr->lev >= max_plev))
- {
- (void)sprintf(out_val, "********");
- }
- else
- {
- (void)sprintf(out_val, "%8ld", (long)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp);
- }
- }
-
- if (p_ptr->exp >= p_ptr->max_exp)
- {
- put_str("EXP ", ROW_EXP, 0);
- c_put_str(TERM_L_GREEN, out_val, ROW_EXP, COL_EXP + 4);
- }
- else
- {
- put_str("Exp ", ROW_EXP, 0);
- c_put_str(TERM_YELLOW, out_val, ROW_EXP, COL_EXP + 4);
- }
-}
-
-
-/*
- * Prints current gold
- */
-static void prt_gold(void)
-{
- char tmp[32];
-
- put_str("AU ", ROW_GOLD, COL_GOLD);
- sprintf(tmp, "%9ld", (long)p_ptr->au);
- c_put_str(TERM_L_GREEN, tmp, ROW_GOLD, COL_GOLD + 3);
-}
-
-
-
-/*
- * Prints current AC
- */
-static void prt_ac(void)
-{
- char tmp[32];
-
- put_str("Cur AC ", ROW_AC, COL_AC);
- sprintf(tmp, "%5d", p_ptr->dis_ac + p_ptr->dis_to_a);
- c_put_str(TERM_L_GREEN, tmp, ROW_AC, COL_AC + 7);
-}
-
-
-/*
- * Prints Cur/Max hit points
- */
-static void prt_hp(void)
-{
- char tmp[32];
-
- byte color;
-
- if (player_char_health) lite_spot(p_ptr->py, p_ptr->px);
-
- if (p_ptr->necro_extra & CLASS_UNDEAD)
- {
- c_put_str(TERM_L_DARK, "DP ", ROW_HP, COL_HP);
-
- sprintf(tmp, "%4d/%4d", p_ptr->chp, p_ptr->mhp);
-
- if (p_ptr->chp >= p_ptr->mhp)
- {
- color = TERM_L_BLUE;
- }
- else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10)
- {
- color = TERM_VIOLET;
- }
- else
- {
- color = TERM_L_RED;
- }
- c_put_str(color, tmp, ROW_HP, COL_HP + 3);
- }
- else
- {
- c_put_str(TERM_RED, "HP ", ROW_HP, COL_HP);
-
- sprintf(tmp, "%4d/%4d", p_ptr->chp, p_ptr->mhp);
-
- if (p_ptr->chp >= p_ptr->mhp)
- {
- color = TERM_L_GREEN;
- }
- else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10)
- {
- color = TERM_YELLOW;
- }
- else
- {
- color = TERM_RED;
- }
- c_put_str(color, tmp, ROW_HP, COL_HP + 3);
- }
-}
-
-/*
- * Prints Cur/Max monster hit points
- */
-static void prt_mh(void)
-{
- char tmp[32];
-
- byte color;
-
- object_type *o_ptr;
-
- /* Get the carried monster */
- o_ptr = &p_ptr->inventory[INVEN_CARRY];
-
- if (!o_ptr->pval2)
- {
- put_str(" ", ROW_MH, COL_MH);
- return;
- }
-
- put_str("MH ", ROW_MH, COL_MH);
-
- sprintf(tmp, "%4d/%4d", o_ptr->pval2, (int)o_ptr->pval3);
- if (o_ptr->pval2 >= o_ptr->pval3)
- {
- color = TERM_L_GREEN;
- }
- else if (o_ptr->pval2 > (o_ptr->pval3 * hitpoint_warn) / 10)
- {
- color = TERM_YELLOW;
- }
- else
- {
- color = TERM_RED;
- }
- c_put_str(color, tmp, ROW_MH, COL_MH + 3);
-}
-
-
-/*
- * Prints players max/cur spell points
- */
-static void prt_sp(void)
-{
- char tmp[32];
- byte color;
-
-
- c_put_str(TERM_L_GREEN, "SP ", ROW_SP, COL_SP);
-
- sprintf(tmp, "%4d/%4d", p_ptr->csp, p_ptr->msp);
- if (p_ptr->csp >= p_ptr->msp)
- {
- color = TERM_L_GREEN;
- }
- else if (p_ptr->csp > (p_ptr->msp * hitpoint_warn) / 10)
- {
- color = TERM_YELLOW;
- }
- else
- {
- color = TERM_RED;
- }
- c_put_str(color, tmp, ROW_SP, COL_SP + 3);
-}
-
-
-/*
- * Prints depth in stat area
- */
-static void prt_depth(void)
-{
- char depths[32];
- dungeon_info_type *d_ptr = &d_info[dungeon_type];
-
- if (p_ptr->wild_mode)
- {
- strcpy(depths, " ");
- }
- else if (p_ptr->inside_arena)
- {
- strcpy(depths, "Arena");
- }
- else if (get_dungeon_name(depths))
- {
- /* Empty */
- }
- else if (dungeon_flags2 & DF2_SPECIAL)
- {
- strcpy(depths, "Special");
- }
- else if (p_ptr->inside_quest)
- {
- strcpy(depths, "Quest");
- }
- else if (!dun_level)
- {
- if (wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].name + wf_name)
- strcpy(depths, wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].name + wf_name);
- else
- strcpy(depths, "Town/Wild");
- }
- else if (depth_in_feet)
- {
- if (dungeon_flags1 & DF1_TOWER)
- {
- (void)strnfmt(depths, 32, "%c%c%c -%d ft",
- d_ptr->short_name[0],
- d_ptr->short_name[1],
- d_ptr->short_name[2],
- dun_level * 50);
- }
- else
- {
- (void)strnfmt(depths, 32, "%c%c%c %d ft",
- d_ptr->short_name[0],
- d_ptr->short_name[1],
- d_ptr->short_name[2],
- dun_level * 50);
- }
- }
- else
- {
- if (dungeon_flags1 & DF1_TOWER)
- {
- (void)strnfmt(depths, 32, "%c%c%c -%d",
- d_ptr->short_name[0],
- d_ptr->short_name[1],
- d_ptr->short_name[2],
- dun_level);
- }
- else
- {
- (void)strnfmt(depths, 32, "%c%c%c %d",
- d_ptr->short_name[0],
- d_ptr->short_name[1],
- d_ptr->short_name[2],
- dun_level);
- }
- }
-
- /* Right-Adjust the "depth", and clear old values */
- if (p_ptr->word_recall)
- c_prt(TERM_ORANGE, format("%13s", depths), ROW_DEPTH, COL_DEPTH);
- else
- prt(format("%13s", depths), ROW_DEPTH, COL_DEPTH);
-}
-
-
-/*
- * Prints status of hunger
- */
-static void prt_hunger(void)
-{
- /* Fainting / Starving */
- if (p_ptr->food < PY_FOOD_FAINT)
- {
- c_put_str(TERM_RED, "Weak ", ROW_HUNGRY, COL_HUNGRY);
- }
-
- /* Weak */
- else if (p_ptr->food < PY_FOOD_WEAK)
- {
- c_put_str(TERM_ORANGE, "Weak ", ROW_HUNGRY, COL_HUNGRY);
- }
-
- /* Hungry */
- else if (p_ptr->food < PY_FOOD_ALERT)
- {
- c_put_str(TERM_YELLOW, "Hungry", ROW_HUNGRY, COL_HUNGRY);
- }
-
- /* Normal */
- else if (p_ptr->food < PY_FOOD_FULL)
- {
- c_put_str(TERM_L_GREEN, " ", ROW_HUNGRY, COL_HUNGRY);
- }
-
- /* Full */
- else if (p_ptr->food < PY_FOOD_MAX)
- {
- c_put_str(TERM_L_GREEN, "Full ", ROW_HUNGRY, COL_HUNGRY);
- }
-
- /* Gorged */
- else
- {
- c_put_str(TERM_GREEN, "Gorged", ROW_HUNGRY, COL_HUNGRY);
- }
-}
-
-
-/*
- * Prints Blind status
- */
-static void prt_blind(void)
-{
- if (p_ptr->blind)
- {
- c_put_str(TERM_ORANGE, "Blind", ROW_BLIND, COL_BLIND);
- }
- else
- {
- put_str(" ", ROW_BLIND, COL_BLIND);
- }
-}
-
-
-/*
- * Prints Confusion status
- */
-static void prt_confused(void)
-{
- if (p_ptr->confused)
- {
- c_put_str(TERM_ORANGE, "Conf", ROW_CONFUSED, COL_CONFUSED);
- }
- else
- {
- put_str(" ", ROW_CONFUSED, COL_CONFUSED);
- }
-}
-
-
-/*
- * Prints Fear status
- */
-static void prt_afraid(void)
-{
- if (p_ptr->afraid)
- {
- c_put_str(TERM_ORANGE, "Afraid", ROW_AFRAID, COL_AFRAID);
- }
- else
- {
- put_str(" ", ROW_AFRAID, COL_AFRAID);
- }
-}
-
-
-/*
- * Prints Poisoned status
- */
-static void prt_poisoned(void)
-{
- if (p_ptr->poisoned)
- {
- c_put_str(TERM_ORANGE, "Poison", ROW_POISONED, COL_POISONED);
- }
- else
- {
- put_str(" ", ROW_POISONED, COL_POISONED);
- }
-}
-
-
-/*
- * Prints trap detection status
- */
-static void prt_dtrap(void)
-{
- if (cave[p_ptr->py][p_ptr->px].info & CAVE_DETECT)
- {
- c_put_str(TERM_L_GREEN, "DTrap", ROW_DTRAP, COL_DTRAP);
- }
- else
- {
- put_str(" ", ROW_DTRAP, COL_DTRAP);
- }
-}
-
-
-/*
- * Prints Searching, Resting, Paralysis, or 'count' status
- * Display is always exactly 10 characters wide (see below)
- *
- * This function was a major bottleneck when resting, so a lot of
- * the text formatting code was optimized in place below.
- */
-static void prt_state(void)
-{
- byte attr = TERM_WHITE;
-
- char text[16];
-
-
- /* Paralysis */
- if (p_ptr->paralyzed)
- {
- attr = TERM_RED;
-
- strcpy(text, "Paralyzed!");
- }
-
- /* Resting */
- else if (resting)
- {
- int i;
-
- /* Start with "Rest" */
- strcpy(text, "Rest ");
-
- /* Extensive (timed) rest */
- if (resting >= 1000)
- {
- i = resting / 100;
- text[9] = '0';
- text[8] = '0';
- text[7] = '0' + (i % 10);
- if (i >= 10)
- {
- i = i / 10;
- text[6] = '0' + (i % 10);
- if (i >= 10)
- {
- text[5] = '0' + (i / 10);
- }
- }
- }
-
- /* Long (timed) rest */
- else if (resting >= 100)
- {
- i = resting;
- text[9] = '0' + (i % 10);
- i = i / 10;
- text[8] = '0' + (i % 10);
- text[7] = '0' + (i / 10);
- }
-
- /* Medium (timed) rest */
- else if (resting >= 10)
- {
- i = resting;
- text[9] = '0' + (i % 10);
- text[8] = '0' + (i / 10);
- }
-
- /* Short (timed) rest */
- else if (resting > 0)
- {
- i = resting;
- text[9] = '0' + (i);
- }
-
- /* Rest until healed */
- else if (resting == -1)
- {
- text[5] = text[6] = text[7] = text[8] = text[9] = '*';
- }
-
- /* Rest until done */
- else if (resting == -2)
- {
- text[5] = text[6] = text[7] = text[8] = text[9] = '&';
- }
- }
-
- /* Repeating */
- else if (command_rep)
- {
- if (command_rep > 999)
- {
- (void)sprintf(text, "Rep. %3d00", command_rep / 100);
- }
- else
- {
- (void)sprintf(text, "Repeat %3d", command_rep);
- }
- }
-
- /* Searching */
- else if (p_ptr->searching)
- {
- strcpy(text, "Searching ");
- }
-
- /* Nothing interesting */
- else
- {
- strcpy(text, " ");
- }
-
- /* Display the info (or blanks) */
- c_put_str(attr, text, ROW_STATE, COL_STATE);
-}
-
-
-/*
- * Prints the speed of a character. -CJS-
- */
-static void prt_speed(void)
-{
- int i = p_ptr->pspeed;
-
- byte attr = TERM_WHITE;
- char buf[32] = "";
-
- /* Hack -- Visually "undo" the Search Mode Slowdown */
- if (p_ptr->searching) i += 10;
-
- /* Fast */
- if (i > 110)
- {
- attr = TERM_L_GREEN;
- sprintf(buf, "Fast (+%d)", (i - 110));
- }
-
- /* Slow */
- else if (i < 110)
- {
- attr = TERM_L_UMBER;
- sprintf(buf, "Slow (-%d)", (110 - i));
- }
-
- /* Display the speed */
- c_put_str(attr, format("%-10s", buf), ROW_SPEED, COL_SPEED);
-}
-
-
-static void prt_study(void)
-{
- if (p_ptr->skill_points)
- {
- put_str("Skill", ROW_STUDY, COL_STUDY);
- }
- else
- {
- put_str(" ", ROW_STUDY, COL_STUDY);
- }
-}
-
-
-static void prt_cut(void)
-{
- int c = p_ptr->cut;
-
- if (c > 1000)
- {
- c_put_str(TERM_L_RED, "Mortal wound", ROW_CUT, COL_CUT);
- }
- else if (c > 200)
- {
- c_put_str(TERM_RED, "Deep gash ", ROW_CUT, COL_CUT);
- }
- else if (c > 100)
- {
- c_put_str(TERM_RED, "Severe cut ", ROW_CUT, COL_CUT);
- }
- else if (c > 50)
- {
- c_put_str(TERM_ORANGE, "Nasty cut ", ROW_CUT, COL_CUT);
- }
- else if (c > 25)
- {
- c_put_str(TERM_ORANGE, "Bad cut ", ROW_CUT, COL_CUT);
- }
- else if (c > 10)
- {
- c_put_str(TERM_YELLOW, "Light cut ", ROW_CUT, COL_CUT);
- }
- else if (c)
- {
- c_put_str(TERM_YELLOW, "Graze ", ROW_CUT, COL_CUT);
- }
- else
- {
- put_str(" ", ROW_CUT, COL_CUT);
- }
-}
-
-
-
-static void prt_stun(void)
-{
- int s = p_ptr->stun;
-
- if (s > 100)
- {
- c_put_str(TERM_RED, "Knocked out ", ROW_STUN, COL_STUN);
- }
- else if (s > 50)
- {
- c_put_str(TERM_ORANGE, "Heavy stun ", ROW_STUN, COL_STUN);
- }
- else if (s)
- {
- c_put_str(TERM_ORANGE, "Stun ", ROW_STUN, COL_STUN);
- }
- else
- {
- put_str(" ", ROW_STUN, COL_STUN);
- }
-}
-
-
-
-/*
- * Redraw the "monster health bar" -DRS-
- * Rather extensive modifications by -BEN-
- *
- * The "monster health bar" provides visual feedback on the "health"
- * of the monster currently being "tracked". There are several ways
- * to "track" a monster, including targetting it, attacking it, and
- * affecting it (and nobody else) with a ranged attack.
- *
- * Display the monster health bar (affectionately known as the
- * "health-o-meter"). Clear health bar if nothing is being tracked.
- * Auto-track current target monster when bored. Note that the
- * health-bar stops tracking any monster that "disappears".
- */
-static void health_redraw(void)
-{
-
-#ifdef DRS_SHOW_HEALTH_BAR
-
- /* Not tracking */
- if (!health_who)
- {
- /* Erase the health bar */
- Term_erase(COL_INFO, ROW_INFO, 12);
- }
-
- /* Tracking an unseen monster */
- else if (!m_list[health_who].ml)
- {
- /* Indicate that the monster health is "unknown" */
- Term_putstr(COL_INFO, ROW_INFO, 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, "[----------]");
- }
-
- /* Tracking a dead monster (???) */
- else if (!m_list[health_who].hp < 0)
- {
- /* Indicate that the monster health is "unknown" */
- Term_putstr(COL_INFO, ROW_INFO, 12, TERM_WHITE, "[----------]");
- }
-
- /* Tracking a visible monster */
- else
- {
- int pct, len;
-
- monster_type *m_ptr = &m_list[health_who];
-
- /* Default to almost dead */
- byte attr = TERM_RED;
-
- /* Extract the "percent" of health */
- pct = 100L * m_ptr->hp / m_ptr->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;
-
- /* Poisoned */
- if (m_ptr->poisoned) attr = TERM_GREEN;
-
- /* Bleeding */
- if (m_ptr->bleeding) attr = TERM_RED;
-
- /* Convert percent into "health" */
- len = (pct < 10) ? 1 : (pct < 90) ? (pct / 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
-
-}
-
-
-
-/*
- * Display basic info (mostly left of map)
- */
-static void prt_frame_basic(void)
-{
- int i;
-
- /* Race and Class */
- prt_field(rp_ptr->title + rp_name, ROW_RACE, COL_RACE);
- prt_field(spp_ptr->title + c_name, ROW_CLASS, COL_CLASS);
-
- /* Title */
- prt_title();
-
- /* Level/Experience */
- prt_level();
- prt_exp();
-
- /* All Stats */
- for (i = 0; i < 6; i++) prt_stat(i);
-
- /* Armor */
- prt_ac();
-
- /* Hitpoints */
- prt_hp();
-
- /* Current sanity */
- prt_sane();
-
- /* Spellpoints */
- prt_sp();
-
- /* Piety */
- prt_piety();
-
- /* Monster hitpoints */
- prt_mh();
-
- /* Gold */
- prt_gold();
-
- /* Current depth */
- prt_depth();
-
- /* Special */
- health_redraw();
-}
-
-
-/*
- * Display extra info (mostly below map)
- */
-static void prt_frame_extra(void)
-{
- /* Cut/Stun */
- prt_cut();
- prt_stun();
-
- /* Food */
- prt_hunger();
-
- /* Various */
- prt_blind();
- prt_confused();
- prt_afraid();
- prt_poisoned();
- prt_dtrap();
-
- /* State */
- prt_state();
-
- /* Speed */
- prt_speed();
-
- /* Study spells */
- prt_study();
-}
-
-
-/*
- * Hack -- display inventory in sub-windows
- */
-static void fix_inven(void)
-{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_INVEN))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Display inventory */
- display_inven();
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-
-
-/*
- * Hack -- display equipment in sub-windows
- */
-static void fix_equip(void)
-{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_EQUIP))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Display equipment */
- display_equip();
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-/*
- * Hack -- display character in sub-windows
- */
-static void fix_player(void)
-{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_PLAYER))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Display player */
- display_player(0);
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-
-
-/*
- * Hack -- display recent messages in sub-windows
- *
- * XXX XXX XXX Adjust for width and split messages
- */
-void fix_message(void)
-{
- int j, i;
- int w, h;
- int x, y;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_MESSAGE))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Get size */
- Term_get_size(&w, &h);
-
- /* Dump messages */
- for (i = 0; i < h; i++)
- {
- /* Dump the message on the appropriate line */
- display_message(0, (h - 1) - i, strlen(message_str((s16b)i)), message_color((s16b)i), message_str((s16b)i));
-
- /* Cursor */
- Term_locate(&x, &y);
-
- /* Clear to end of line */
- Term_erase(x, y, 255);
- }
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-
-/*
- * Hack -- display overhead view in sub-windows
- *
- * Note that the "player" symbol does NOT appear on the map.
- */
-static void fix_overhead(void)
-{
- int j;
-
- int cy, cx;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_OVERHEAD))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Redraw map */
- display_map(&cy, &cx);
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-
-/*
- * Hack -- display monster recall in sub-windows
- */
-static void fix_monster(void)
-{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_MONSTER))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Display monster race info */
- if (monster_race_idx) display_roff(monster_race_idx, monster_ego_idx);
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-
-/*
- * Hack -- display object recall in sub-windows
- */
-static void fix_object(void)
-{
- int j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_OBJECT))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Clear */
- Term_clear();
-
- /* Display object info */
- if (tracked_object)
- if (!object_out_desc(tracked_object, NULL, FALSE, FALSE)) text_out("You see nothing special.");
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-/* Show the monster list in a window */
-
-static void fix_m_list(void)
-{
- int i, j;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- int c = 0;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_M_LIST))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Clear */
- Term_clear();
-
- /* Hallucination */
- if (p_ptr->image)
- {
- c_prt(TERM_WHITE, "You can not see clearly", 0, 0);
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
-
- return;
- }
-
- /* reset visible count */
- for (i = 1; i < max_r_idx; i++)
- {
- monster_race *r_ptr = &r_info[i];
-
- r_ptr->total_visible = 0;
- }
-
- /* Count up the number visible in each race */
- for (i = 1; i < m_max; i++)
- {
- monster_type *m_ptr = &m_list[i];
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
-
- /* Skip dead monsters */
- if (m_ptr->hp < 0) continue;
-
- /* Skip unseen monsters */
- if (r_ptr->flags9 & RF9_MIMIC)
- {
- object_type *o_ptr;
-
- /* Acquire object */
- o_ptr = &o_list[m_ptr->hold_o_idx];
-
- /* Memorized objects */
- if (!o_ptr->marked) continue;
- }
- else
- {
- if (!m_ptr->ml) continue;
- }
-
- /* Increase for this race */
- r_ptr->total_visible++;
-
- /* Increase total Count */
- c++;
- }
-
- /* Are monsters visible? */
- if (c)
- {
- int w, h, num = 0;
-
- (void)Term_get_size(&w, &h);
-
- c_prt(TERM_WHITE, format("You can see %d monster%s", c, (c > 1 ? "s:" : ":")), 0, 0);
-
- for (i = 1; i < max_r_idx; i++)
- {
- monster_race *r_ptr = &r_info[i];
-
- /* Default Colour */
- byte attr = TERM_SLATE;
-
- /* Only visible monsters */
- if (!r_ptr->total_visible) continue;
-
- /* Uniques */
- if (r_ptr->flags1 & RF1_UNIQUE)
- {
- attr = TERM_L_BLUE;
- }
-
- /* Have we ever killed one? */
- if (r_ptr->r_tkills)
- {
- if (r_ptr->level > dun_level)
- {
- attr = TERM_VIOLET;
-
- if (r_ptr->flags1 & RF1_UNIQUE)
- {
- attr = TERM_RED;
- }
- }
- }
- else
- {
- if (!(r_ptr->flags1 & RF1_UNIQUE)) attr = TERM_GREEN;
- }
-
-
- /* Dump the monster name */
- if (r_ptr->total_visible == 1)
- {
- c_prt(attr, (r_name + r_ptr->name), (num % (h - 1)) + 1, (num / (h - 1) * 26));
- }
- else
- {
- c_prt(attr, format("%s (x%d)", r_name + r_ptr->name, r_ptr->total_visible), (num % (h - 1)) + 1, (num / (h - 1)) * 26);
- }
-
- num++;
-
- }
-
- }
- else
- {
- c_prt(TERM_WHITE, "You see no monsters.", 0, 0);
- }
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-
-/*
- * Calculate number of spells player should have, and forget,
- * or remember, spells until that number is properly reflected.
- *
- * Note that this function induces various "status" messages,
- * which must be bypasses until the character is created.
- */
-static void calc_spells(void)
-{
- p_ptr->new_spells = 0;
-}
-
-/* Ugly hack */
-bool_ calc_powers_silent = FALSE;
-
-/* Calc the player powers */
-static void calc_powers(void)
-{
- int i, p = 0;
- bool_ *old_powers;
-
- /* Hack -- wait for creation */
- if (!character_generated) return;
-
- /* Hack -- handle "xtra" mode */
- if (character_xtra) return;
-
- C_MAKE(old_powers, power_max, bool_);
-
- /* Save old powers */
- for (i = 0; i < power_max; i++) old_powers[i] = p_ptr->powers[i];
-
- /* Get intrinsincs */
- for (i = 0; i < POWER_MAX_INIT; i++) p_ptr->powers[i] = p_ptr->powers_mod[i];
- for (; i < power_max; i++) p_ptr->powers[i] = 0;
-
- /* Hooked powers */
- process_hooks(HOOK_CALC_POWERS, "()");
-
- /* Add objects powers */
- for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
- {
- object_type *o_ptr = &p_ptr->inventory[i];
-
- if (!o_ptr->k_idx) continue;
-
- p = object_power(o_ptr);
- if (p != -1) p_ptr->powers[p] = TRUE;
- }
-
- if ((!p_ptr->tim_mimic) && (!p_ptr->body_monster))
- {
- /* Add in racial and subracial powers */
- for (i = 0; i < 4; i++)
- {
- p = rp_ptr->powers[i];
- if (p != -1) p_ptr->powers[p] = TRUE;
-
- p = rmp_ptr->powers[i];
- if (p != -1) p_ptr->powers[p] = TRUE;
- }
- }
- else if (p_ptr->mimic_form)
- call_lua("calc_mimic_power", "(d)", "", p_ptr->mimic_form);
-
- /* Add in class powers */
- for (i = 0; i < 4; i++)
- {
- p = cp_ptr->powers[i];
- if (p != -1) p_ptr->powers[p] = TRUE;
- }
-
- if (p_ptr->disembodied)
- {
- p = PWR_INCARNATE;
- p_ptr->powers[p] = TRUE;
- }
-
- /* Now lets warn the player */
- for (i = 0; i < power_max; i++)
- {
- s32b old = old_powers[i];
- s32b new_ = p_ptr->powers[i];
-
- if (new_ > old)
- {
- if (!calc_powers_silent) cmsg_print(TERM_GREEN, powers_type[i].gain_text);
- }
- else if (new_ < old)
- {
- if (!calc_powers_silent) cmsg_print(TERM_RED, powers_type[i].lose_text);
- }
- }
-
- calc_powers_silent = FALSE;
- C_FREE(old_powers, power_max, bool_);
-}
-
-
-/*
- * Calculate the player's sanity
- */
-
-void calc_sanity(void)
-{
- int bonus, msane;
-
- /* Hack -- use the con/hp table for sanity/wis */
- bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_WIS]]) - 128);
-
- /* Hack -- assume 5 sanity points per level. */
- msane = 5 * (p_ptr->lev + 1) + (bonus * p_ptr->lev / 2);
-
- if (msane < p_ptr->lev + 1) msane = p_ptr->lev + 1;
-
- if (p_ptr->msane != msane)
- {
- /* Sanity carries over between levels. */
- p_ptr->csane += (msane - p_ptr->msane);
-
- p_ptr->msane = msane;
-
- if (p_ptr->csane >= msane)
- {
- p_ptr->csane = msane;
- p_ptr->csane_frac = 0;
- }
-
- p_ptr->redraw |= (PR_SANITY);
- p_ptr->window |= (PW_PLAYER);
- }
-}
-
-
-/*
- * Calculate maximum mana. You do not need to know any spells.
- * Note that mana is lowered by heavy (or inappropriate) armor.
- *
- * This function induces status messages.
- */
-static void calc_mana(void)
-{
- int msp, levels, cur_wgt, max_wgt;
- u32b f1, f2, f3, f4, f5, esp;
-
- object_type *o_ptr;
-
- levels = p_ptr->lev;
-
- /* Hack -- no negative mana */
- if (levels < 0) levels = 0;
-
- /* Extract total mana */
- msp = get_skill_scale(SKILL_MAGIC, 200) +
- (adj_mag_mana[
- (p_ptr->stat_ind[A_INT] > p_ptr->stat_ind[A_WIS]) ?
- p_ptr->stat_ind[A_INT] : p_ptr->stat_ind[A_WIS]
- ] * levels / 4);
-
- /* Hack -- usually add one mana */
- if (msp) msp++;
-
- /* Possessors mana is different */
- if (p_ptr->body_monster && (!p_ptr->disembodied))
- {
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
- int f = 100 / (r_ptr->freq_spell ? r_ptr->freq_spell : 1);
-
- msp = 21 - f;
-
- if (msp < 1) msp = 1;
- }
-
- /* Apply race mod mana */
- msp = msp * rmp_ptr->mana / 100;
-
- /* Apply class mana */
- msp += msp * cp_ptr->mana / 100;
-
- /* Apply Eru mana */
- GOD(GOD_ERU)
- {
- s32b tmp = p_ptr->grace;
-
- if (tmp >= 35000) tmp = 35000;
- tmp /= 100;
- msp += msp * tmp / 1000;
- }
-
- /* Only mages are affected */
- if (forbid_gloves())
- {
- /* Assume player is not encumbered by gloves */
- p_ptr->cumber_glove = FALSE;
-
- /* Get the gloves */
- o_ptr = &p_ptr->inventory[INVEN_HANDS];
-
- /* Examine the gloves */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- /* Normal gloves hurt mage-type spells */
- if (o_ptr->k_idx &&
- !(f2 & (TR2_FREE_ACT)) &&
- !((f1 & (TR1_DEX)) && (o_ptr->pval > 0)) &&
- !(f5 & TR5_SPELL_CONTAIN))
- {
- /* Encumbered */
- p_ptr->cumber_glove = TRUE;
-
- /* Reduce mana */
- msp = (3 * msp) / 4;
- }
- }
-
- /* Augment mana */
- if (munchkin_multipliers)
- {
- if (p_ptr->to_m) msp += msp * p_ptr->to_m / 5;
- }
- else
- {
- if (p_ptr->to_m) msp += msp * p_ptr->to_m / 10;
- }
-
- /* Assume player not encumbered by armor */
- p_ptr->cumber_armor = FALSE;
-
- /* Weigh the armor */
- cur_wgt = 0;
- cur_wgt += p_ptr->inventory[INVEN_BODY].weight;
- cur_wgt += p_ptr->inventory[INVEN_HEAD].weight;
- cur_wgt += p_ptr->inventory[INVEN_ARM].weight;
- cur_wgt += p_ptr->inventory[INVEN_OUTER].weight;
- cur_wgt += p_ptr->inventory[INVEN_HANDS].weight;
- cur_wgt += p_ptr->inventory[INVEN_FEET].weight;
-
- /* Determine the weight allowance */
- max_wgt = 200 + get_skill_scale(SKILL_COMBAT, 500);
-
- /* Heavy armor penalizes mana */
- if (((cur_wgt - max_wgt) / 10) > 0)
- {
- /* Encumbered */
- p_ptr->cumber_armor = TRUE;
-
- /* Reduce mana */
- msp -= ((cur_wgt - max_wgt) / 10);
- }
-
- /* When meditating your mana is increased ! */
- if (p_ptr->meditation)
- {
- msp += 50;
- p_ptr->csp += 50;
- }
-
- /* Sp mods? */
- if (process_hooks_ret(HOOK_CALC_MANA, "d", "(d)", msp))
- {
- msp = process_hooks_return[0].num;
- }
-
- /* Mana can never be negative */
- if (msp < 0) msp = 0;
-
-
- /* Maximum mana has changed */
- if (p_ptr->msp != msp)
- {
- /* Save new limit */
- p_ptr->msp = msp;
-
- /* Enforce new limit */
- if (p_ptr->csp >= msp)
- {
- p_ptr->csp = msp;
- p_ptr->csp_frac = 0;
- }
-
- /* Display mana later */
- p_ptr->redraw |= (PR_MANA);
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- }
-
-
- /* Hack -- handle "xtra" mode */
- if (character_xtra) return;
-
- /* Take note when "glove state" changes */
- if (p_ptr->old_cumber_glove != p_ptr->cumber_glove)
- {
- /* Message */
- if (p_ptr->cumber_glove)
- {
- msg_print("Your covered hands feel unsuitable for spellcasting.");
- }
- else
- {
- msg_print("Your hands feel more suitable for spellcasting.");
- }
-
- /* Save it */
- p_ptr->old_cumber_glove = p_ptr->cumber_glove;
- }
-
-
- /* Take note when "armor state" changes */
- if (p_ptr->old_cumber_armor != p_ptr->cumber_armor)
- {
- /* Message */
- if (p_ptr->cumber_armor)
- {
- msg_print("The weight of your armor encumbers your movement.");
- }
- else
- {
- msg_print("You feel able to move more freely.");
- }
-
- /* Save it */
- p_ptr->old_cumber_armor = p_ptr->cumber_armor;
- }
-}
-
-
-
-/*
- * Calculate the players (maximal) hit points
- * Adjust current hitpoints if necessary
- */
-void calc_hitpoints(void)
-{
- int bonus, mhp;
-
- /* Un-inflate "half-hitpoint bonus per level" value */
- bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128);
-
- /* Calculate hitpoints */
- mhp = player_hp[p_ptr->lev - 1] + (bonus * p_ptr->lev / 2);
-
- /* Always have at least one hitpoint per level */
- if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1;
-
- /* Factor in the pernament hp modifications */
- mhp += p_ptr->hp_mod;
- if (mhp < 1) mhp = 1;
-
- /* Hack: Sorcery impose a hp penality */
- if (mhp && (get_skill(SKILL_SORCERY)))
- {
- mhp -= mhp * get_skill_scale(SKILL_SORCERY, 50) / 100;
- if (mhp < 1) mhp = 1;
- }
-
- /* Factor in the melkor hp modifications */
- GOD(GOD_MELKOR)
- {
- mhp -= (p_ptr->melkor_sacrifice * 10);
- if (mhp < 1) mhp = 1;
- }
-
- /* Factor in the hero / superhero settings */
- if (p_ptr->hero) mhp += 10;
- if (p_ptr->shero) mhp += 30;
-
- /* Augment Hitpoint */
- if (munchkin_multipliers)
- {
- mhp += mhp * p_ptr->to_l / 5;
- }
- else
- {
- mhp += mhp * p_ptr->to_l / 10;
- }
- if (mhp < 1) mhp = 1;
-
- if (p_ptr->body_monster)
- {
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
- u32b rhp = maxroll(r_ptr->hdice, r_ptr->hside);
-
- /* Adjust the hp with the possession skill */
- rhp = (rhp * (20 + get_skill_scale(SKILL_POSSESSION, 80))) / 100;
-
- mhp = (rhp + sroot(rhp) + mhp) / 3;
- }
- if (p_ptr->disembodied) mhp = 1;
-
- /* HACK - being undead means less DP */
- if (p_ptr->necro_extra & CLASS_UNDEAD)
- {
- int divisor = p_ptr->lev / 4;
-
- /* Beware of the horrible division by zero ! :) */
- if (divisor == 0) divisor = 1;
-
- /* Actually decrease the max hp */
- mhp /= divisor;
-
- /* Never less than 1 */
- if (mhp < 1) mhp = 1;
- }
-
- /* Hp mods? */
- if (process_hooks_ret(HOOK_CALC_HP, "d", "(d)", mhp))
- {
- mhp = process_hooks_return[0].num;
- }
-
- /* Never less than 1 */
- if (mhp < 1) mhp = 1;
-
- /* New maximum hitpoints */
- if (p_ptr->mhp != mhp)
- {
- /* XXX XXX XXX New hitpoint maintenance */
-
- /* Enforce maximum */
- if (p_ptr->chp >= mhp)
- {
- p_ptr->chp = mhp;
- p_ptr->chp_frac = 0;
- }
-
- /* Save the new max-hitpoints */
- p_ptr->mhp = mhp;
-
- /* Display hitpoints (later) */
- p_ptr->redraw |= (PR_HP);
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- }
-}
-
-
-
-/*
- * Extract and set the current "lite radius"
- *
- * SWD: Experimental modification: multiple light sources have additive effect.
- *
- */
-static void calc_torch(void)
-{
- int i;
- object_type *o_ptr;
- u32b f1, f2, f3, f4, f5, esp;
-
- /* Assume no light */
- p_ptr->cur_lite = 0;
-
- /* Loop through all wielded items */
- for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
- {
- o_ptr = &p_ptr->inventory[i];
-
- /* Skip empty slots */
- if (!o_ptr->k_idx) continue;
-
- /* Extract the flags */
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
- /* does this item glow? */
- if (((f4 & TR4_FUEL_LITE) && (o_ptr->timeout > 0)) || (!(f4 & TR4_FUEL_LITE)))
- {
- if (f3 & TR3_LITE1) p_ptr->cur_lite++;
- if (f4 & TR4_LITE2) p_ptr->cur_lite += 2;
- if (f4 & TR4_LITE3) p_ptr->cur_lite += 3;
- }
-
- }
-
- if (p_ptr->tim_lite) p_ptr->cur_lite += 2;
-
- if (p_ptr->holy) p_ptr->cur_lite += 1;
-
- /* max radius is 5 without rewriting other code -- */
- /* see cave.c:update_lite() and defines.h:LITE_MAX */
- if (p_ptr->cur_lite > 5) p_ptr->cur_lite = 5;
-
- /* 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;
-
- /* Hooked powers */
- process_hooks(HOOK_CALC_LITE, "()");
-
- /* end experimental mods */
-
- /* Reduce lite in the small-scale wilderness map */
- if (p_ptr->wild_mode)
- {
- /* Reduce the lite radius if needed */
- if (p_ptr->cur_lite > WILDERNESS_SEE_RADIUS)
- {
- p_ptr->cur_lite = WILDERNESS_SEE_RADIUS;
- }
- }
-
-
- /* 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 view */
- p_ptr->update |= (PU_VIEW);
-
- /* Update the monsters */
- p_ptr->update |= (PU_MONSTERS);
-
- /* Remember the old lite */
- p_ptr->old_lite = p_ptr->cur_lite;
- }
-}
-
-
-
-/*
- * Computes current weight limit.
- */
-int weight_limit(void)
-{
- int i;
-
- /* Weight limit based only on strength */
- i = adj_str_wgt[p_ptr->stat_ind[A_STR]] * 100;
-
- if (process_hooks_ret(HOOK_CALC_WEIGHT, "d", "(d)", i))
- i = process_hooks_return[0].num;
-
- /* Return the result */
- return (i);
-}
-
-void calc_wield_monster()
-{
- object_type *o_ptr;
- monster_race *r_ptr;
-
- /* Get the carried monster */
- o_ptr = &p_ptr->inventory[INVEN_CARRY];
-
- if (o_ptr->k_idx)
- {
- r_ptr = &r_info[o_ptr->pval];
-
- if (r_ptr->flags2 & RF2_INVISIBLE)
- p_ptr->invis += 20;
- if (r_ptr->flags2 & RF2_REFLECTING)
- p_ptr->reflect = TRUE;
- if (r_ptr->flags7 & RF7_CAN_FLY)
- p_ptr->ffall = TRUE;
- if (r_ptr->flags7 & RF7_AQUATIC)
- p_ptr->water_breath = TRUE;
- }
-}
-
-/*
- * Calc which body parts the player have, based on the
- * monster he incarnate, note that that's bnot a hack
- * since body parts of the player when in it's own body
- * are also defined in r_info(monster 0)
- */
-void calc_body()
-{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
- int i, b_weapon, b_legs, b_arms;
- byte *body_parts, bp[BODY_MAX];
-
- if (!p_ptr->body_monster)
- {
- body_parts = bp;
- for (i = 0; i < BODY_MAX; i++)
- {
- int b;
-
- b = rp_ptr->body_parts[i] + rmp_ptr->body_parts[i];
- if (b < 0) b = 0;
-
- if (p_ptr->mimic_form == resolve_mimic_name("Bear"))
- {
- if (i == BODY_ARMS) b = 0;
- else if (i == BODY_LEGS) b = 0;
- }
-
- bp[i] = b;
- }
- }
- else
- {
- body_parts = bp;
- for (i = 0; i < BODY_MAX; i++)
- {
- int b;
-
- b = r_ptr->body_parts[i];
- if (b < 0) b = 0;
-
- bp[i] = b;
- }
- }
-
- for (i = 0; i < BODY_MAX; i++)
- {
- int b;
-
- b = bp[i] + cp_ptr->body_parts[i];
- if (b < 0) b = 0;
- if (b > max_body_part[i]) b = max_body_part[i];
-
- bp[i] = b;
- }
-
- b_weapon = body_parts[BODY_WEAPON];
- b_arms = body_parts[BODY_ARMS];
- b_legs = body_parts[BODY_LEGS];
-
- if (p_ptr->mimic_extra & CLASS_ARMS)
- {
- b_weapon++;
- b_arms++;
-
- if (b_weapon > 3) b_weapon = 3;
- if (b_arms > 3) b_arms = 3;
- }
-
- if (p_ptr->mimic_extra & CLASS_LEGS)
- {
- b_legs++;
-
- if (b_legs > 2) b_legs = 2;
- }
-
- for (i = 0; i < INVEN_TOTAL - INVEN_WIELD; i++)
- p_ptr->body_parts[i] = 0;
-
- for (i = 0; i < b_weapon; i++)
- p_ptr->body_parts[INVEN_WIELD - INVEN_WIELD + i] = INVEN_WIELD;
- if (body_parts[BODY_WEAPON])
- p_ptr->body_parts[INVEN_BOW - INVEN_WIELD] = INVEN_BOW;
-
- for (i = 0; i < body_parts[BODY_TORSO]; i++)
- {
- p_ptr->body_parts[INVEN_BODY - INVEN_WIELD + i] = INVEN_BODY;
- p_ptr->body_parts[INVEN_OUTER - INVEN_WIELD + i] = INVEN_OUTER;
- p_ptr->body_parts[INVEN_LITE - INVEN_WIELD + i] = INVEN_LITE;
- p_ptr->body_parts[INVEN_AMMO - INVEN_WIELD + i] = INVEN_AMMO;
- p_ptr->body_parts[INVEN_CARRY - INVEN_WIELD + i] = INVEN_CARRY;
- }
-
- for (i = 0; i < body_parts[BODY_FINGER]; i++)
- p_ptr->body_parts[INVEN_RING - INVEN_WIELD + i] = INVEN_RING;
-
- for (i = 0; i < body_parts[BODY_HEAD]; i++)
- {
- p_ptr->body_parts[INVEN_HEAD - INVEN_WIELD + i] = INVEN_HEAD;
- p_ptr->body_parts[INVEN_NECK - INVEN_WIELD + i] = INVEN_NECK;
- }
-
- for (i = 0; i < b_arms; i++)
- {
- p_ptr->body_parts[INVEN_ARM - INVEN_WIELD + i] = INVEN_ARM;
- p_ptr->body_parts[INVEN_HANDS - INVEN_WIELD + i] = INVEN_HANDS;
- }
- if (body_parts[BODY_ARMS])
- p_ptr->body_parts[INVEN_TOOL - INVEN_WIELD] = INVEN_TOOL;
-
- for (i = 0; i < b_legs; i++)
- p_ptr->body_parts[INVEN_FEET - INVEN_WIELD + i] = INVEN_FEET;
-
- /* Ok now if the player lost a body part, he must drop the object he had on it */
- for (i = 0; i < INVEN_TOTAL - INVEN_WIELD; i++)
- {
- if ((!p_ptr->body_parts[i]) && (p_ptr->inventory[i + INVEN_WIELD].k_idx))
- {
- /* Drop it NOW ! */
- inven_takeoff(i + INVEN_WIELD, 255, TRUE);
- }
- }
-}
-
-/* Should be called by every calc_bonus call */
-void calc_body_bonus()
-{
- monster_race *r_ptr = &r_info[p_ptr->body_monster];
-
- /* If in the player body nothing have to be done */
- if (!p_ptr->body_monster) return;
-
- if (p_ptr->disembodied)
- {
- p_ptr->wraith_form = TRUE;
- return;
- }
-
- p_ptr->ac += r_ptr->ac;
- p_ptr->pspeed = r_ptr->speed;
-
- if (r_ptr->flags1 & RF1_NEVER_MOVE) p_ptr->immovable = TRUE;
- if (r_ptr->flags2 & RF2_STUPID) p_ptr->stat_add[A_INT] -= 1;
- if (r_ptr->flags2 & RF2_SMART) p_ptr->stat_add[A_INT] += 1;
- if (r_ptr->flags2 & RF2_REFLECTING) p_ptr->reflect = TRUE;
- if (r_ptr->flags2 & RF2_INVISIBLE) p_ptr->invis += 20;
- if (r_ptr->flags2 & RF2_REGENERATE) p_ptr->regenerate = TRUE;
- if (r_ptr->flags2 & RF2_AURA_FIRE) p_ptr->sh_fire = TRUE;
- if (r_ptr->flags2 & RF2_AURA_ELEC) p_ptr->sh_elec = TRUE;
- if (r_ptr->flags2 & RF2_PASS_WALL) p_ptr->wraith_form = TRUE;
- if (r_ptr->flags3 & RF3_SUSCEP_FIRE) p_ptr->sensible_fire = TRUE;
- if (r_ptr->flags3 & RF3_IM_ACID) p_ptr->resist_acid = TRUE;
- if (r_ptr->flags3 & RF3_IM_ELEC) p_ptr->resist_elec = TRUE;
- if (r_ptr->flags3 & RF3_IM_FIRE) p_ptr->resist_fire = TRUE;
- if (r_ptr->flags3 & RF3_IM_POIS) p_ptr->resist_pois = TRUE;
- if (r_ptr->flags3 & RF3_IM_COLD) p_ptr->resist_cold = TRUE;
- if (r_ptr->flags3 & RF3_RES_NETH) p_ptr->resist_neth = TRUE;
- if (r_ptr->flags3 & RF3_RES_NEXU) p_ptr->resist_nexus = TRUE;
- if (r_ptr->flags3 & RF3_RES_DISE) p_ptr->resist_disen = TRUE;
- if (r_ptr->flags3 & RF3_NO_FEAR) p_ptr->resist_fear = TRUE;
- if (r_ptr->flags3 & RF3_NO_SLEEP) p_ptr->free_act = TRUE;
- if (r_ptr->flags3 & RF3_NO_CONF) p_ptr->resist_conf = TRUE;
- if (r_ptr->flags7 & RF7_CAN_FLY) p_ptr->ffall = TRUE;
- if (r_ptr->flags7 & RF7_AQUATIC) p_ptr->water_breath = TRUE;
-}
-
-
-byte calc_mimic()
-{
- s32b blow = 0;
-
- call_lua("calc_mimic", "(d)", "d", p_ptr->mimic_form, &blow);
- return blow;
-}
-
-/* Returns the number of extra blows based on abilities. */
-static int get_extra_blows_ability() {
- /* Count bonus abilities */
- int num = 0;
- if (has_ability(AB_MAX_BLOW1)) num++;
- if (has_ability(AB_MAX_BLOW2)) num++;
- return num;
-}
-
-/* Returns the blow information based on class */
-void analyze_blow(int *num, int *wgt, int *mul)
-{
- *num = cp_ptr->blow_num;
- *wgt = cp_ptr->blow_wgt;
- *mul = cp_ptr->blow_mul;
-
- /* Count bonus abilities */
- (*num) += get_extra_blows_ability();
-}
-
-/* Are all the weapons wielded of the right type ? */
-int get_weaponmastery_skill()
-{
- int i, skill = 0;
- object_type *o_ptr;
-
- i = 0;
- /* All weapons must be of the same type */
- while ((p_ptr->body_parts[i] == INVEN_WIELD) && (i < INVEN_TOTAL))
- {
- o_ptr = &p_ptr->inventory[INVEN_WIELD + i];
-
- if (!o_ptr->k_idx)
- {
- i++;
- continue;
- }
- switch (o_ptr->tval)
- {
- case TV_DAEMON_BOOK:
- case TV_SWORD:
- if ((!skill) || (skill == SKILL_SWORD)) skill = SKILL_SWORD;
- else skill = -1;
- break;
- case TV_AXE:
- if ((!skill) || (skill == SKILL_AXE)) skill = SKILL_AXE;
- else skill = -1;
- break;
- case TV_HAFTED:
- if ((!skill) || (skill == SKILL_HAFTED)) skill = SKILL_HAFTED;
- else skill = -1;
- break;
- case TV_POLEARM:
- if ((!skill) || (skill == SKILL_POLEARM)) skill = SKILL_POLEARM;
- else skill = -1;
- break;
- }
- i++;
- }
-
- /* Everything is ok */
- return skill;
-}
-
-/* Are all the ranged weapons wielded of the right type ? */
-int get_archery_skill()
-{
- int i, skill = 0;
-
- i = INVEN_BOW - INVEN_WIELD;
- /* All weapons must be of the same type */
- while (p_ptr->body_parts[i] == INVEN_BOW)
- {
- if (p_ptr->inventory[INVEN_WIELD + i].tval == TV_BOW)
- {
- switch (p_ptr->inventory[INVEN_WIELD + i].sval / 10)
- {
- case 0:
- if ((!skill) || (skill == SKILL_SLING)) skill = SKILL_SLING;
- else skill = -1;
- break;
- case 1:
- if ((!skill) || (skill == SKILL_BOW)) skill = SKILL_BOW;
- else skill = -1;
- break;
- case 2:
- if ((!skill) || (skill == SKILL_XBOW)) skill = SKILL_XBOW;
- else skill = -1;
- break;
- }
- }
- else
- {
- if ((!skill) || (skill == SKILL_BOOMERANG)) skill = SKILL_BOOMERANG;
- else skill = -1;
- }
-
- i++;
- }
-
- /* Everything is ok */
- return skill;
-}
-
-/* Apply gods */
-void calc_gods()
-{
- /* Boost WIS if the player follows Eru */
- GOD(GOD_ERU)
- {
- if (p_ptr->grace > 10000) p_ptr->stat_add[A_WIS] += 1;
- if (p_ptr->grace > 20000) p_ptr->stat_add[A_WIS] += 1;
- if (p_ptr->grace > 30000) p_ptr->stat_add[A_WIS] += 1;
- }
-
- /* Boost str, con, chr and reduce int, wis if the player follows Melkor */
- GOD(GOD_MELKOR)
- {
- if (p_ptr->grace > 10000) p_ptr->stat_add[A_STR] += 1;
- if (p_ptr->grace > 20000) p_ptr->stat_add[A_STR] += 1;
- if (p_ptr->grace > 30000) p_ptr->stat_add[A_STR] += 1;
-
- if (p_ptr->grace > 10000) p_ptr->stat_add[A_CON] += 1;
- if (p_ptr->grace > 20000) p_ptr->stat_add[A_CON] += 1;
- if (p_ptr->grace > 30000) p_ptr->stat_add[A_CON] += 1;
-
- if (p_ptr->grace > 10000) p_ptr->stat_add[A_CHR] += 1;
- if (p_ptr->grace > 20000) p_ptr->stat_add[A_CHR] += 1;
- if (p_ptr->grace > 30000) p_ptr->stat_add[A_CHR] += 1;
-
- if (p_ptr->grace > 10000) p_ptr->stat_add[A_INT] -= 1;
- if (p_ptr->grace > 20000) p_ptr->stat_add[A_INT] -= 1;
- if (p_ptr->grace > 30000) p_ptr->stat_add[A_INT] -= 1;
-
- if (p_ptr->grace > 10000) p_ptr->stat_add[A_WIS] -= 1;
- if (p_ptr->grace > 20000) p_ptr->stat_add[A_WIS] -= 1;
- if (p_ptr->grace > 30000) p_ptr->stat_add[A_WIS] -= 1;
-
- PRAY_GOD(GOD_MELKOR)
- {
- if (p_ptr->grace > 5000) p_ptr->invis += 30;
- if (p_ptr->grace > 15000) p_ptr->immune_fire = TRUE;
- }
- p_ptr->resist_fire = TRUE;
- }
-
- /* Gifts of Manwe if the player is praying to Manwe */
- PRAY_GOD(GOD_MANWE)
- {
- s32b add = p_ptr->grace;
-
- /* provides speed every 5000 grace */
- if (add > 35000) add = 35000;
- add /= 5000;
- p_ptr->pspeed += add;
-
- /* Provides fly & FA */
- if (p_ptr->grace >= 7000) p_ptr->free_act = TRUE;
- if (p_ptr->grace >= 15000) p_ptr->fly = TRUE;
- }
-
- /* Manwe bonus not requiring the praying status */
- GOD(GOD_MANWE)
- {
- if (p_ptr->grace >= 2000) p_ptr->ffall = TRUE;
- }
-
- /* Boost Str and Con if the player is following Tulkas */
- GOD(GOD_TULKAS)
- {
- if (p_ptr->grace > 5000) p_ptr->stat_add[A_CON] += 1;
- if (p_ptr->grace > 10000) p_ptr->stat_add[A_CON] += 1;
- if (p_ptr->grace > 15000) p_ptr->stat_add[A_CON] += 1;
-
- if (p_ptr->grace > 10000) p_ptr->stat_add[A_STR] += 1;
- if (p_ptr->grace > 15000) p_ptr->stat_add[A_STR] += 1;
- if (p_ptr->grace > 20000) p_ptr->stat_add[A_STR] += 1;
- }
-}
-
-/* Apply flags */
-static int extra_blows;
-static int extra_shots;
-void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a)
-{
- s16b antimagic_mod;
-
- /* Affect stats */
- if (f1 & (TR1_STR)) p_ptr->stat_add[A_STR] += pval;
- if (f1 & (TR1_INT)) p_ptr->stat_add[A_INT] += pval;
- if (f1 & (TR1_WIS)) p_ptr->stat_add[A_WIS] += pval;
- if (f1 & (TR1_DEX)) p_ptr->stat_add[A_DEX] += pval;
- if (f1 & (TR1_CON)) p_ptr->stat_add[A_CON] += pval;
- if (f1 & (TR1_CHR)) p_ptr->stat_add[A_CHR] += pval;
- if (f5 & (TR5_LUCK)) p_ptr->luck_cur += pval;
-
- /* Affect spell power */
- if (f1 & (TR1_SPELL)) p_ptr->to_s += pval;
-
- /* Affect mana capacity */
- if (f1 & (TR1_MANA)) p_ptr->to_m += pval;
-
- /* Affect life capacity */
- if (f2 & (TR2_LIFE)) p_ptr->to_l += pval;
-
- /* Affect stealth */
- if (f1 & (TR1_STEALTH)) p_ptr->skill_stl += pval;
-
- /* Affect searching ability (factor of five) */
- if (f1 & (TR1_SEARCH)) p_ptr->skill_srh += (pval * 5);
-
- /* Affect searching frequency (factor of five) */
- if (f1 & (TR1_SEARCH)) p_ptr->skill_fos += (pval * 5);
-
- /* Affect infravision */
- if (f1 & (TR1_INFRA)) p_ptr->see_infra += pval;
-
- /* Affect digging (factor of 20) */
- if (f1 & (TR1_TUNNEL)) p_ptr->skill_dig += (pval * 20);
-
- /* Affect speed */
- if (f1 & (TR1_SPEED)) p_ptr->pspeed += pval;
-
- /* Affect blows */
- if (f1 & (TR1_BLOWS)) extra_blows += pval;
- if (f5 & (TR5_CRIT)) p_ptr->xtra_crit += pval;
-
- /* Hack -- Sensible fire */
- if (f2 & (TR2_SENS_FIRE)) p_ptr->sensible_fire = TRUE;
-
- /* Hack -- cause earthquakes */
- if (f1 & (TR1_IMPACT)) p_ptr->impact = TRUE;
-
- /* Affect invisibility */
- if (f2 & (TR2_INVIS)) p_ptr->invis += (pval * 10);
-
- /* Boost shots */
- if (f3 & (TR3_XTRA_SHOTS)) extra_shots++;
-
- /* Various flags */
- if (f3 & (TR3_AGGRAVATE)) p_ptr->aggravate = TRUE;
- if (f3 & (TR3_TELEPORT)) p_ptr->teleport = TRUE;
- if (f5 & (TR5_DRAIN_MANA)) p_ptr->drain_mana++;
- if (f5 & (TR5_DRAIN_HP)) p_ptr->drain_life++;
- if (f3 & (TR3_DRAIN_EXP)) p_ptr->exp_drain = TRUE;
- if (f3 & (TR3_BLESSED)) p_ptr->bless_blade = TRUE;
- if (f3 & (TR3_XTRA_MIGHT)) p_ptr->xtra_might += pval;
- if (f3 & (TR3_SLOW_DIGEST)) p_ptr->slow_digest = TRUE;
- if (f3 & (TR3_REGEN)) p_ptr->regenerate = TRUE;
- if (esp) p_ptr->telepathy |= esp;
- if ((tval != TV_LITE) && (f3 & (TR3_LITE1))) p_ptr->lite = TRUE;
- if ((tval != TV_LITE) && (f4 & (TR4_LITE2))) p_ptr->lite = TRUE;
- if ((tval != TV_LITE) && (f4 & (TR4_LITE3))) p_ptr->lite = TRUE;
- if (f3 & (TR3_SEE_INVIS)) p_ptr->see_inv = TRUE;
- if (f2 & (TR2_FREE_ACT)) p_ptr->free_act = TRUE;
- if (f2 & (TR2_HOLD_LIFE)) p_ptr->hold_life = TRUE;
- if (f3 & (TR3_WRAITH)) p_ptr->wraith_form = TRUE;
- if (f3 & (TR3_FEATHER)) p_ptr->ffall = TRUE;
- if (f4 & (TR4_FLY)) p_ptr->fly = TRUE;
- if (f4 & (TR4_CLIMB)) p_ptr->climb = TRUE;
-
- /* Immunity flags */
- if (f2 & (TR2_IM_FIRE)) p_ptr->immune_fire = TRUE;
- if (f2 & (TR2_IM_ACID)) p_ptr->immune_acid = TRUE;
- if (f2 & (TR2_IM_COLD)) p_ptr->immune_cold = TRUE;
- if (f2 & (TR2_IM_ELEC)) p_ptr->immune_elec = TRUE;
-
- /* Resistance flags */
- if (f2 & (TR2_RES_ACID)) p_ptr->resist_acid = TRUE;
- if (f2 & (TR2_RES_ELEC)) p_ptr->resist_elec = TRUE;
- if (f2 & (TR2_RES_FIRE)) p_ptr->resist_fire = TRUE;
- if (f2 & (TR2_RES_COLD)) p_ptr->resist_cold = TRUE;
- if (f2 & (TR2_RES_POIS)) p_ptr->resist_pois = TRUE;
- if (f2 & (TR2_RES_FEAR)) p_ptr->resist_fear = TRUE;
- if (f2 & (TR2_RES_CONF)) p_ptr->resist_conf = TRUE;
- if (f2 & (TR2_RES_SOUND)) p_ptr->resist_sound = TRUE;
- if (f2 & (TR2_RES_LITE)) p_ptr->resist_lite = TRUE;
- if (f2 & (TR2_RES_DARK)) p_ptr->resist_dark = TRUE;
- if (f2 & (TR2_RES_CHAOS)) p_ptr->resist_chaos = TRUE;
- if (f2 & (TR2_RES_DISEN)) p_ptr->resist_disen = TRUE;
- if (f2 & (TR2_RES_SHARDS)) p_ptr->resist_shard = TRUE;
- if (f2 & (TR2_RES_NEXUS)) p_ptr->resist_nexus = TRUE;
- if (f2 & (TR2_RES_BLIND)) p_ptr->resist_blind = TRUE;
- if (f2 & (TR2_RES_NETHER)) p_ptr->resist_neth = TRUE;
- if (f4 & (TR4_IM_NETHER)) p_ptr->immune_neth = TRUE;
-
- if (f2 & (TR2_REFLECT)) p_ptr->reflect = TRUE;
- if (f3 & (TR3_SH_FIRE)) p_ptr->sh_fire = TRUE;
- if (f3 & (TR3_SH_ELEC)) p_ptr->sh_elec = TRUE;
- if (f3 & (TR3_NO_MAGIC)) p_ptr->anti_magic = TRUE;
- if (f3 & (TR3_NO_TELE)) p_ptr->anti_tele = TRUE;
-
- /* Sustain flags */
- if (f2 & (TR2_SUST_STR)) p_ptr->sustain_str = TRUE;
- if (f2 & (TR2_SUST_INT)) p_ptr->sustain_int = TRUE;
- if (f2 & (TR2_SUST_WIS)) p_ptr->sustain_wis = TRUE;
- if (f2 & (TR2_SUST_DEX)) p_ptr->sustain_dex = TRUE;
- if (f2 & (TR2_SUST_CON)) p_ptr->sustain_con = TRUE;
- if (f2 & (TR2_SUST_CHR)) p_ptr->sustain_chr = TRUE;
-
- if (f4 & (TR4_PRECOGNITION)) p_ptr->precognition = TRUE;
-
- antimagic_mod = to_h + to_d + to_a;
-
- if (f4 & (TR4_ANTIMAGIC_50))
- {
- s32b tmp;
-
- tmp = 10 + get_skill_scale(SKILL_ANTIMAGIC, 40) - antimagic_mod;
- if (tmp > 0) p_ptr->antimagic += tmp;
-
- tmp = 1 + get_skill_scale(SKILL_ANTIMAGIC, 4) - antimagic_mod / 15;
- if (tmp > 0) p_ptr->antimagic_dis += tmp;
- }
-
- if (f4 & (TR4_ANTIMAGIC_30))
- {
- s32b tmp;
-
- tmp = 7 + get_skill_scale(SKILL_ANTIMAGIC, 33) - antimagic_mod;
- if (tmp > 0) p_ptr->antimagic += tmp;
-
- tmp = 1 + get_skill_scale(SKILL_ANTIMAGIC, 2) - antimagic_mod / 15;
- if (tmp > 0) p_ptr->antimagic_dis += tmp;
- }
-
- if (f4 & (TR4_ANTIMAGIC_20))
- {
- s32b tmp;
-
- tmp = 5 + get_skill_scale(SKILL_ANTIMAGIC, 15) - antimagic_mod;
- if (tmp > 0) p_ptr->antimagic += tmp;
-
- p_ptr->antimagic_dis += 2;
- }
-
- if (f4 & (TR4_ANTIMAGIC_10))
- {
- s32b tmp;
-
- tmp = 1 + get_skill_scale(SKILL_ANTIMAGIC, 9) - antimagic_mod;
- if (tmp > 0) p_ptr->antimagic += tmp;
-
- p_ptr->antimagic_dis += 1;
- }
-
- if (f4 & (TR4_AUTO_ID))
- {
- p_ptr->auto_id = TRUE;
- }
-
- /* The new code implementing Tolkien's concept of "Black Breath"
- * takes advantage of the existing drain_exp character flag, renamed
- * "black_breath". This flag can also be set by a unlucky blow from
- * an undead. -LM-
- */
- if (f4 & (TR4_BLACK_BREATH)) p_ptr->black_breath = TRUE;
-
- if (f5 & (TR5_IMMOVABLE)) p_ptr->immovable = TRUE;
-
- /* Breaths */
- if (f5 & (TR5_WATER_BREATH)) p_ptr->water_breath = TRUE;
- if (f5 & (TR5_MAGIC_BREATH))
- {
- p_ptr->magical_breath = TRUE;
- p_ptr->water_breath = TRUE;
- }
-}
-
-/*
- * Calculate the players current "state", taking into account
- * not only race/class intrinsics, but also objects being worn
- * and temporary spell effects.
- *
- * See also calc_mana() and calc_hitpoints().
- *
- * Take note of the new "speed code", in particular, a very strong
- * player will start slowing down as soon as he reaches 150 pounds,
- * but not until he reaches 450 pounds will he be half as fast as
- * a normal kobold. This both hurts and helps the player, hurts
- * because in the old days a player could just avoid 300 pounds,
- * and helps because now carrying 300 pounds is not very painful.
- *
- * The "weapon" and "bow" do *not* add to the bonuses to hit or to
- * damage, since that would affect non-combat things. These values
- * are actually added in later, at the appropriate place.
- *
- * This function induces various "status" messages, unless silent is
- * TRUE.
- */
-void calc_bonuses(bool_ silent)
-{
- int i, j, hold;
- int old_speed;
- u32b old_telepathy;
- int old_see_inv;
- int old_dis_ac;
- int old_dis_to_a;
- object_type *o_ptr;
- u32b f1, f2, f3, f4, f5, esp;
-
-
- /* Save the old speed */
- old_speed = p_ptr->pspeed;
-
- /* Save the old vision stuff */
- old_telepathy = p_ptr->telepathy;
- old_see_inv = p_ptr->see_inv;
-
- /* Save the old armor class */
- old_dis_ac = p_ptr->dis_ac;
- old_dis_to_a = p_ptr->dis_to_a;
-
- /* Clear extra blows/shots */
- extra_blows = extra_shots = 0;
-
- /* Clear the stat modifiers */
- for (i = 0; i < 6; i++) p_ptr->stat_add[i] = 0;
-
- /* Mana multiplier */
- p_ptr->to_m = 0;
-
- /* Life multiplier */
- p_ptr->to_l = 0;
-
- /* Spell power */
- p_ptr->to_s = 0;
-
- /* Clear the Displayed/Real armor class */
- p_ptr->dis_ac = p_ptr->ac = 0;
-
- /* Clear the Displayed/Real Bonuses */
- p_ptr->dis_to_h = p_ptr->to_h = p_ptr->to_h_melee = p_ptr->to_h_ranged = 0;
- p_ptr->dis_to_d = p_ptr->to_d = p_ptr->to_d_melee = p_ptr->to_d_ranged = 0;
- p_ptr->dis_to_a = p_ptr->to_a = 0;
-
- /* Start with "normal" speed */
- p_ptr->pspeed = 110;
-
- /* Start with 0% additionnal crits */
- p_ptr->xtra_crit = 0;
-
- /* Start with a single blow per turn */
- p_ptr->num_blow = 1;
-
- /* Start with a single shot per turn */
- p_ptr->num_fire = 1;
-
- /* Starts with single throwing damage */
- p_ptr->throw_mult = 1;
-
- /* Reset the "xtra" tval */
- p_ptr->tval_xtra = 0;
-
- /* Reset the "ammo" tval */
- p_ptr->tval_ammo = 0;
-
- /* Clear all the flags */
- p_ptr->invis = 0;
- p_ptr->immovable = FALSE;
- p_ptr->aggravate = FALSE;
- p_ptr->teleport = FALSE;
- p_ptr->exp_drain = FALSE;
- p_ptr->drain_mana = 0;
- p_ptr->drain_life = 0;
- p_ptr->bless_blade = FALSE;
- p_ptr->xtra_might = 0;
- p_ptr->auto_id = FALSE;
- p_ptr->impact = FALSE;
- p_ptr->see_inv = FALSE;
- p_ptr->free_act = FALSE;
- p_ptr->slow_digest = FALSE;
- p_ptr->regenerate = FALSE;
- p_ptr->fly = FALSE;
- p_ptr->climb = FALSE;
- p_ptr->ffall = FALSE;
- p_ptr->hold_life = FALSE;
- p_ptr->telepathy = 0;
- p_ptr->lite = FALSE;
- p_ptr->sustain_str = FALSE;
- p_ptr->sustain_int = FALSE;
- p_ptr->sustain_wis = FALSE;
- p_ptr->sustain_con = FALSE;
- p_ptr->sustain_dex = FALSE;
- p_ptr->sustain_chr = FALSE;
- p_ptr->resist_acid = FALSE;
- p_ptr->resist_elec = FALSE;
- p_ptr->resist_fire = FALSE;
- p_ptr->resist_cold = FALSE;
- p_ptr->resist_pois = FALSE;
- p_ptr->resist_conf = FALSE;
- p_ptr->resist_sound = FALSE;
- p_ptr->resist_lite = FALSE;
- p_ptr->resist_dark = FALSE;
- p_ptr->resist_chaos = FALSE;
- p_ptr->resist_disen = FALSE;
- p_ptr->resist_shard = FALSE;
- p_ptr->resist_nexus = FALSE;
- p_ptr->resist_blind = FALSE;
- p_ptr->resist_neth = FALSE;
- p_ptr->immune_neth = FALSE;
- p_ptr->resist_fear = FALSE;
- p_ptr->resist_continuum = FALSE;
- p_ptr->reflect = FALSE;
- p_ptr->sh_fire = FALSE;
- p_ptr->sh_elec = FALSE;
- p_ptr->anti_magic = FALSE;
- p_ptr->anti_tele = FALSE;
- p_ptr->water_breath = FALSE;
- p_ptr->magical_breath = FALSE;
-
- p_ptr->sensible_fire = FALSE;
- p_ptr->sensible_lite = FALSE;
-
- p_ptr->immune_acid = FALSE;
- p_ptr->immune_elec = FALSE;
- p_ptr->immune_fire = FALSE;
- p_ptr->immune_cold = FALSE;
-
- p_ptr->precognition = FALSE;
-
- p_ptr->wraith_form = FALSE;
-
- /* The anti magic field surrounding the player */
- p_ptr->antimagic = 0;
- p_ptr->antimagic_dis = 0;
-
-
- /* Base infravision (purely racial) */
- p_ptr->see_infra = rp_ptr->infra + rmp_ptr->infra;
-
-
- /* Base skill -- disarming */
- p_ptr->skill_dis = 0;
-
- /* Base skill -- magic devices */
- p_ptr->skill_dev = 0;
-
- /* Base skill -- saving throw */
- p_ptr->skill_sav = 0;
-
- /* Base skill -- stealth */
- p_ptr->skill_stl = 0;
-
- /* Base skill -- searching ability */
- p_ptr->skill_srh = 0;
-
- /* Base skill -- searching frequency */
- p_ptr->skill_fos = 0;
-
- /* Base skill -- combat (normal) */
- p_ptr->skill_thn = 0;
-
- /* Base skill -- combat (shooting) */
- p_ptr->skill_thb = 0;
-
- /* Base skill -- combat (throwing) */
- p_ptr->skill_tht = 0;
-
-
- /* Base skill -- digging */
- p_ptr->skill_dig = 0;
-
- /* Xtra player flags */
- p_ptr->xtra_f1 = 0;
- p_ptr->xtra_f2 = 0;
- p_ptr->xtra_f3 = 0;
- p_ptr->xtra_f4 = 0;
- p_ptr->xtra_f5 = 0;
- p_ptr->xtra_esp = 0;
-
- /* Hide the skills that should auto hide */
- for (i = 0; i < max_s_idx; i++)
- {
- if (s_info[i].flags1 & SKF1_AUTO_HIDE)
- s_info[i].hidden = TRUE;
- }
-
- /* Base Luck */
- p_ptr->luck_cur = p_ptr->luck_base;
-
- /* Mimic override body's bonuses */
- if (p_ptr->mimic_form)
- {
- extra_blows += calc_mimic();
- }
- else
- {
- calc_body_bonus();
- }
-
- /* Let the scripts do what they need */
- process_hooks(HOOK_CALC_BONUS, "()");
-
- /* The powers gived by the wielded monster */
- calc_wield_monster();
-
- for (i = 1; i <= p_ptr->lev; i++)
- {
- apply_flags(cp_ptr->oflags1[i], cp_ptr->oflags2[i], cp_ptr->oflags3[i], cp_ptr->oflags4[i], cp_ptr->oflags5[i], cp_ptr->oesp[i], cp_ptr->opval[i], 0, 0, 0, 0);
- }
-
- if (p_ptr->melee_style == SKILL_HAND)
- {
- /* Unencumbered Monks become faster every 10 levels */
- if (!(monk_heavy_armor()))
- p_ptr->pspeed += get_skill_scale(SKILL_HAND, 5);
-
- /* Free action if unencumbered at level 25 */
- if ((get_skill(SKILL_HAND) > 24) && !(monk_heavy_armor()))
- p_ptr->free_act = TRUE;
- }
-
- if (get_skill(SKILL_ANTIMAGIC))
- {
- p_ptr->antimagic += get_skill(SKILL_ANTIMAGIC);
- p_ptr->antimagic_dis += get_skill_scale(SKILL_ANTIMAGIC, 10) + 1;
-
- if (p_ptr->antimagic_extra & CLASS_ANTIMAGIC)
- {
- p_ptr->anti_tele = TRUE;
- p_ptr->resist_continuum = TRUE;
- }
- }
-
- if (get_skill(SKILL_DAEMON) > 20) p_ptr->resist_conf = TRUE;
- if (get_skill(SKILL_DAEMON) > 30) p_ptr->resist_fear = TRUE;
-
- if ( get_skill(SKILL_MINDCRAFT) >= 40 ) p_ptr->telepathy = ESP_ALL;
-
- if (p_ptr->astral)
- {
- p_ptr->wraith_form = TRUE;
- }
-
- /***** Races ****/
- if ((!p_ptr->mimic_form) && (!p_ptr->body_monster))
- {
- int i;
-
- for (i = 1; i <= p_ptr->lev; i++)
- {
- apply_flags(rp_ptr->oflags1[i], rp_ptr->oflags2[i], rp_ptr->oflags3[i], rp_ptr->oflags4[i], rp_ptr->oflags5[i], rp_ptr->oesp[i], rp_ptr->opval[i], 0, 0, 0, 0);
- apply_flags(rmp_ptr->oflags1[i], rmp_ptr->oflags2[i], rmp_ptr->oflags3[i], rmp_ptr->oflags4[i], rmp_ptr->oflags5[i], rmp_ptr->oesp[i], rmp_ptr->opval[i], 0, 0, 0, 0);
- }
-
- if (PRACE_FLAG(PR1_HURT_LITE))
- p_ptr->sensible_lite = TRUE;
- }
-
- /* The extra flags */
- apply_flags(p_ptr->xtra_f1, p_ptr->xtra_f2, p_ptr->xtra_f3, p_ptr->xtra_f4, p_ptr->xtra_f5, p_ptr->xtra_esp, 0, 0, 0, 0, 0);
-
- /* Hack -- apply racial/class stat maxes */
- if (p_ptr->maximize)
- {
- /* Apply the racial modifiers */
- for (i = 0; i < 6; i++)
- {
- /* Modify the stats for "race" */
- p_ptr->stat_add[i] += (rp_ptr->r_adj[i] + rmp_ptr->r_adj[i] + cp_ptr->c_adj[i]);
- }
- }
-
-
- /* Scan the usable inventory */
- for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
- {
- o_ptr = &p_ptr->inventory[i];
-
- /* Skip non-objects */
- if (!o_ptr->k_idx) continue;
-
- /* Extract the item flags */
- object_flags_no_set = TRUE;
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- object_flags_no_set = FALSE;
-
- /* MEGA ugly hack -- set spacetime distortion resistance */
- if (o_ptr->name1 == ART_ANCHOR)
- {
- p_ptr->resist_continuum = TRUE;
- }
-
- /* Hack - don't give the Black Breath when merely inspecting a weapon */
- if (silent)
- {
- f4 &= ~TR4_BLACK_BREATH;
- }
-
- apply_flags(f1, f2, f3, f4, f5, esp, o_ptr->pval, o_ptr->tval, o_ptr->to_h, o_ptr->to_d, o_ptr->to_a);
-
- if (o_ptr->name1)
- {
- apply_set(o_ptr->name1, a_info[o_ptr->name1].set);
- }
-
- /* Modify the base armor class */
- p_ptr->ac += o_ptr->ac;
-
- /* The base armor class is always known */
- p_ptr->dis_ac += o_ptr->ac;
-
- /* Apply the bonuses to armor class */
- 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;
-
- /* Hack -- do not apply "weapon" bonuses */
- if (p_ptr->body_parts[i - INVEN_WIELD] == INVEN_WIELD) continue;
-
- /* Hack -- do not apply "bow" bonuses */
- if (p_ptr->body_parts[i - INVEN_WIELD] == INVEN_BOW) continue;
-
- /* Hack -- do not apply "ammo" bonuses */
- if (p_ptr->body_parts[i - INVEN_WIELD] == INVEN_AMMO) continue;
-
- /* Hack -- do not apply "tool" bonuses */
- if (p_ptr->body_parts[i - INVEN_WIELD] == INVEN_TOOL) continue;
-
- /* Apply the bonuses to hit/damage */
- p_ptr->to_h += o_ptr->to_h;
- p_ptr->to_d += o_ptr->to_d;
-
- /* Apply the mental bonuses tp hit/damage, if known */
- if (object_known_p(o_ptr)) p_ptr->dis_to_h += o_ptr->to_h;
- if (object_known_p(o_ptr)) p_ptr->dis_to_d += o_ptr->to_d;
- }
-
- /* Monks get extra ac for armour _not worn_ */
- if ((p_ptr->melee_style == SKILL_HAND) && !(monk_heavy_armor()))
- {
- if (!(p_ptr->inventory[INVEN_BODY].k_idx))
- {
- p_ptr->to_a += get_skill_scale(SKILL_HAND, 75);
- p_ptr->dis_to_a += get_skill_scale(SKILL_HAND, 75);
- }
- if (!(p_ptr->inventory[INVEN_OUTER].k_idx) && (get_skill(SKILL_HAND) > 15))
- {
- p_ptr->to_a += ((get_skill(SKILL_HAND) - 13) / 3);
- p_ptr->dis_to_a += ((get_skill(SKILL_HAND) - 13) / 3);
- }
- if (!(p_ptr->inventory[INVEN_ARM].k_idx) && (get_skill(SKILL_HAND) > 10))
- {
- p_ptr->to_a += ((get_skill(SKILL_HAND) - 8) / 3);
- p_ptr->dis_to_a += ((get_skill(SKILL_HAND) - 8) / 3);
- }
- if (!(p_ptr->inventory[INVEN_HEAD].k_idx) && (get_skill(SKILL_HAND) > 4))
- {
- p_ptr->to_a += (get_skill(SKILL_HAND) - 2) / 3;
- p_ptr->dis_to_a += (get_skill(SKILL_HAND) - 2) / 3;
- }
- if (!(p_ptr->inventory[INVEN_HANDS].k_idx))
- {
- p_ptr->to_a += (get_skill(SKILL_HAND) / 2);
- p_ptr->dis_to_a += (get_skill(SKILL_HAND) / 2);
- }
- if (!(p_ptr->inventory[INVEN_FEET].k_idx))
- {
- p_ptr->to_a += (get_skill(SKILL_HAND) / 3);
- p_ptr->dis_to_a += (get_skill(SKILL_HAND) / 3);
- }
- }
-
- /* Hack -- aura of fire also provides light */
- if (p_ptr->sh_fire) p_ptr->lite = TRUE;
-
- if (PRACE_FLAG(PR1_AC_LEVEL))
- {
- p_ptr->to_a += 20 + (p_ptr->lev / 5);
- p_ptr->dis_to_a += 20 + (p_ptr->lev / 5);
- }
-
- /* Take care of gods */
- calc_gods();
-
- /* Calculate stats */
- for (i = 0; i < 6; i++)
- {
- int top, use, ind;
-
-
- /* Extract the new "stat_use" value for the stat */
- top = modify_stat_value(p_ptr->stat_max[i], p_ptr->stat_add[i]);
-
- /* Notice changes */
- if (p_ptr->stat_top[i] != top)
- {
- /* Save the new value */
- p_ptr->stat_top[i] = top;
-
- /* Redisplay the stats later */
- p_ptr->redraw |= (PR_STATS);
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- }
-
- /* Extract the new "stat_use" value for the stat */
- use = modify_stat_value(p_ptr->stat_cur[i], p_ptr->stat_add[i]);
-
- /* Notice changes */
- if (p_ptr->stat_use[i] != use)
- {
- /* Save the new value */
- p_ptr->stat_use[i] = use;
-
- /* Redisplay the stats later */
- p_ptr->redraw |= (PR_STATS);
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- }
-
-
- /* Values: 3, 4, ..., 17 */
- if (use <= 18) ind = (use - 3);
-
- /* Ranges: 18/00-18/09, ..., 18/210-18/219 */
- else if (use <= 18 + 219) ind = (15 + (use - 18) / 10);
-
- /* Range: 18/220+ */
- else ind = (37);
-
- /* Notice changes */
- if (p_ptr->stat_ind[i] != ind)
- {
- /* Save the new index */
- p_ptr->stat_ind[i] = ind;
-
- /* Change in CON affects Hitpoints */
- if (i == A_CON)
- {
- p_ptr->update |= (PU_HP);
- }
-
- /* Change in WIS affects Sanity Points */
- else if (i == A_WIS)
- {
- p_ptr->update |= (PU_MANA | PU_SANITY);
- }
-
- /* Change in spell stat affects Mana/Spells */
- if (i == A_INT)
- {
- p_ptr->update |= (PU_MANA | PU_SPELLS);
- }
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- }
- }
-
- /* Provide the damage we get from sacrifice */
- GOD(GOD_MELKOR)
- {
- int x = wisdom_scale(4);
- if (x < 1) x = 1;
-
- p_ptr->dis_to_d += x * p_ptr->melkor_sacrifice;
- p_ptr->to_d += x * p_ptr->melkor_sacrifice;
- }
-
- /* jk - add in the tactics */
- p_ptr->dis_to_h += tactic_info[(byte)p_ptr->tactic].to_hit;
- p_ptr->to_h += tactic_info[(byte)p_ptr->tactic].to_hit;
- p_ptr->dis_to_d += tactic_info[(byte)p_ptr->tactic].to_dam;
- p_ptr->to_d += tactic_info[(byte)p_ptr->tactic].to_dam;
- p_ptr->dis_to_a += tactic_info[(byte)p_ptr->tactic].to_ac;
- p_ptr->to_a += tactic_info[(byte)p_ptr->tactic].to_ac;
-
- p_ptr->skill_stl += tactic_info[(byte)p_ptr->tactic].to_stealth;
- p_ptr->skill_dis += tactic_info[(byte)p_ptr->tactic].to_disarm;
- p_ptr->skill_sav += tactic_info[(byte)p_ptr->tactic].to_saving;
-
- p_ptr->pspeed += move_info[(byte)p_ptr->movement].to_speed;
- p_ptr->skill_srh += move_info[(byte)p_ptr->movement].to_search;
- p_ptr->skill_fos += move_info[(byte)p_ptr->movement].to_percep;
- p_ptr->skill_stl += move_info[(byte)p_ptr->movement].to_stealth;
-
- /* Apply temporary "stun" */
- if (p_ptr->stun > 50)
- {
- p_ptr->to_h -= 20;
- p_ptr->dis_to_h -= 20;
- p_ptr->to_d -= 20;
- p_ptr->dis_to_d -= 20;
- }
- else if (p_ptr->stun)
- {
- p_ptr->to_h -= 5;
- p_ptr->dis_to_h -= 5;
- p_ptr->to_d -= 5;
- p_ptr->dis_to_d -= 5;
- }
-
-
- /* Invulnerability */
- if (p_ptr->invuln)
- {
- p_ptr->to_a += 100;
- p_ptr->dis_to_a += 100;
- }
-
- /* Breath */
- if (p_ptr->tim_water_breath)
- {
- p_ptr->water_breath = TRUE;
- }
- if (p_ptr->tim_magic_breath)
- {
- p_ptr->magical_breath = TRUE;
- }
-
- /* wraith_form */
- if (p_ptr->tim_wraith)
- {
- if (p_ptr->disembodied)
- {
- p_ptr->to_a += 10;
- p_ptr->dis_to_a += 10;
- }
- else
- {
- p_ptr->to_a += 50;
- p_ptr->dis_to_a += 50;
- p_ptr->reflect = TRUE;
- }
- p_ptr->wraith_form = TRUE;
- }
-
- /* Temporary holy aura */
- if (p_ptr->holy)
- {
- p_ptr->hold_life = TRUE;
- p_ptr->luck_cur += 5;
- }
-
- /* Temporary blessing */
- if (p_ptr->blessed)
- {
- p_ptr->to_a += 5;
- p_ptr->dis_to_a += 5;
- p_ptr->to_h += 10;
- p_ptr->dis_to_h += 10;
- }
-
- /* Temporary invisibility */
- if (p_ptr->tim_invisible)
- {
- p_ptr->invis += p_ptr->tim_inv_pow;
- }
-
- /* Temporary shield */
- if (p_ptr->shield)
- {
- p_ptr->to_a += p_ptr->shield_power;
- p_ptr->dis_to_a += p_ptr->shield_power;
- }
-
- /* Temporary "Hero" */
- if (p_ptr->hero)
- {
- p_ptr->to_h += 12;
- p_ptr->dis_to_h += 12;
- }
-
- /* Temporary "roots" */
- if (p_ptr->tim_roots)
- {
- set_stun(0);
- p_ptr->to_d_melee += p_ptr->tim_roots_dam;
- p_ptr->to_a += p_ptr->tim_roots_ac;
- p_ptr->dis_to_a += p_ptr->tim_roots_ac;
- }
-
- /* Temporary "Beserk" */
- if (p_ptr->shero)
- {
- p_ptr->to_h += 24;
- p_ptr->dis_to_h += 24;
- p_ptr->to_a -= 10;
- p_ptr->dis_to_a -= 10;
- }
-
- /* Temporary "Accurancy" */
- if (p_ptr->strike)
- {
- p_ptr->to_d += 15;
- p_ptr->dis_to_d += 15;
- p_ptr->to_h += 15;
- p_ptr->dis_to_h += 15;
- }
-
- /* Temporary "Meditation" */
- if (p_ptr->meditation)
- {
- p_ptr->to_d -= 25;
- p_ptr->dis_to_d -= 25;
- p_ptr->to_h -= 25;
- p_ptr->dis_to_h -= 25;
- }
-
- /* Temporary "Reflection" */
- if (p_ptr->tim_reflect)
- {
- p_ptr->reflect = TRUE;
- }
-
- /* Temporary "Time Resistance" */
- if (p_ptr->tim_res_time)
- {
- p_ptr->resist_continuum = TRUE;
- }
-
- /* Temporary "Levitation" and "Flying" */
- if (p_ptr->tim_ffall)
- {
- p_ptr->ffall = TRUE;
- }
- if (p_ptr->tim_fly)
- {
- p_ptr->fly = TRUE;
- }
-
- /* Temporary "Fire Aura" */
- if (p_ptr->tim_fire_aura)
- {
- p_ptr->sh_fire = TRUE;
- }
-
- /* Oppose Light & Dark */
- if (p_ptr->oppose_ld)
- {
- p_ptr->resist_lite = TRUE;
- p_ptr->resist_dark = TRUE;
- }
-
- /* Oppose Chaos & Confusion */
- if (p_ptr->oppose_cc)
- {
- p_ptr->resist_chaos = TRUE;
- p_ptr->resist_conf = TRUE;
- }
-
- /* Oppose Sound & Shards */
- if (p_ptr->oppose_ss)
- {
- p_ptr->resist_sound = TRUE;
- p_ptr->resist_shard = TRUE;
- }
-
- /* Oppose Nexus */
- if (p_ptr->oppose_nex)
- {
- p_ptr->resist_nexus = TRUE;
- }
-
- /* Mental barrier */
- if (p_ptr->tim_mental_barrier)
- {
- p_ptr->sustain_int = TRUE;
- p_ptr->sustain_wis = TRUE;
- }
-
- /* Temporary "fast" */
- if (p_ptr->fast)
- {
- p_ptr->pspeed += p_ptr->speed_factor;
- }
-
- /* Temporary "light speed" */
- if (p_ptr->lightspeed)
- {
- p_ptr->pspeed += 50;
- }
-
- /* Temporary "slow" */
- if (p_ptr->slow)
- {
- p_ptr->pspeed -= 10;
- }
-
- if (p_ptr->tim_esp)
- {
- p_ptr->telepathy |= ESP_ALL;
- }
-
- /* Temporary see invisible */
- if (p_ptr->tim_invis)
- {
- p_ptr->see_inv = TRUE;
- }
-
- /* Temporary infravision boost */
- if (p_ptr->tim_infra)
- {
- p_ptr->see_infra++;
- }
-
- /* Hack -- Magic breath -> Water breath */
- if (p_ptr->magical_breath)
- {
- p_ptr->water_breath = TRUE;
- }
-
- /* Hack -- Can Fly -> Can Levitate */
- if (p_ptr->fly)
- {
- p_ptr->ffall = TRUE;
- }
-
- /* Hack -- Res Chaos -> Res Conf */
- if (p_ptr->resist_chaos)
- {
- p_ptr->resist_conf = TRUE;
- }
-
- /* Hack -- Hero/Shero -> Res fear */
- if (p_ptr->hero || p_ptr->shero)
- {
- p_ptr->resist_fear = TRUE;
- }
-
-
- /* Hack -- Telepathy Change */
- if (p_ptr->telepathy != old_telepathy)
- {
- p_ptr->update |= (PU_MONSTERS);
- }
-
- /* Hack -- See Invis Change */
- if (p_ptr->see_inv != old_see_inv)
- {
- p_ptr->update |= (PU_MONSTERS);
- }
-
-
- /* Extract the current weight (in tenth pounds) */
- j = calc_total_weight();
-
- /* Extract the "weight limit" (in tenth pounds) */
- i = weight_limit();
-
- /* XXX XXX XXX Apply "encumbrance" from weight */
- if (j > i / 2) p_ptr->pspeed -= ((j - (i / 2)) / (i / 10));
-
- /* Bloating slows the player down (a little) */
- if (p_ptr->food >= PY_FOOD_MAX) p_ptr->pspeed -= 10;
-
- /* Searching slows the player down */
- if (p_ptr->searching) p_ptr->pspeed -= 10;
-
- /* In order to get a "nice" mana path druids need to ahve a 0 speed */
- if ((p_ptr->druid_extra2 == CLASS_MANA_PATH) && (p_ptr->pspeed > 110))
- p_ptr->pspeed = 110;
-
- /* Display the speed (if needed) */
- if (p_ptr->pspeed != old_speed) p_ptr->redraw |= (PR_SPEED);
-
-
- /* Actual Modifier Bonuses (Un-inflate stat bonuses) */
- p_ptr->to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
- p_ptr->to_d += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
- p_ptr->to_h += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
- p_ptr->to_h += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
-
- /* Displayed Modifier Bonuses (Un-inflate stat bonuses) */
- p_ptr->dis_to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
- p_ptr->dis_to_d += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
- p_ptr->dis_to_h += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
- p_ptr->dis_to_h += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
-
- /* Redraw armor (if needed) */
- if ((p_ptr->dis_ac != old_dis_ac) || (p_ptr->dis_to_a != old_dis_to_a))
- {
- /* Redraw */
- p_ptr->redraw |= (PR_ARMOR);
-
- /* Window stuff */
- p_ptr->window |= (PW_PLAYER);
- }
-
-
- /* Obtain the "hold" value */
- hold = adj_str_hold[p_ptr->stat_ind[A_STR]];
-
-
- /* Examine the "current bow" */
- o_ptr = &p_ptr->inventory[INVEN_BOW];
-
-
- /* Assume not heavy */
- p_ptr->heavy_shoot = FALSE;
-
- /* It is hard to carholdry a heavy bow */
- if (hold < o_ptr->weight / 10)
- {
- /* Hard to wield a heavy bow */
- p_ptr->to_h += 2 * (hold - o_ptr->weight / 10);
- p_ptr->dis_to_h += 2 * (hold - o_ptr->weight / 10);
-
- /* Heavy Bow */
- p_ptr->heavy_shoot = TRUE;
- }
-
- /* Take note of required "tval" for missiles */
- switch (o_ptr->sval)
- {
- case SV_SLING:
- {
- p_ptr->tval_ammo = TV_SHOT;
- break;
- }
-
- case SV_SHORT_BOW:
- case SV_LONG_BOW:
- {
- p_ptr->tval_ammo = TV_ARROW;
- break;
- }
-
- case SV_LIGHT_XBOW:
- case SV_HEAVY_XBOW:
- {
- p_ptr->tval_ammo = TV_BOLT;
- break;
- }
- }
-
- /* Compute "extra shots" if needed */
- if (o_ptr->k_idx && !p_ptr->heavy_shoot)
- {
- int archery = get_archery_skill();
-
- if (archery != -1)
- {
- p_ptr->to_h_ranged += get_skill_scale(archery, 25);
- p_ptr->num_fire += (get_skill(archery) / 16);
- p_ptr->xtra_might += (get_skill(archery) / 25);
- switch (archery)
- {
- case SKILL_SLING:
- if (p_ptr->tval_ammo == TV_SHOT) p_ptr->xtra_might += get_skill(archery) / 30;
- break;
- case SKILL_BOW:
- if (p_ptr->tval_ammo == TV_ARROW) p_ptr->xtra_might += get_skill(archery) / 30;
- break;
- case SKILL_XBOW:
- if (p_ptr->tval_ammo == TV_BOLT) p_ptr->xtra_might += get_skill(archery) / 30;
- break;
- }
- }
-
- /* Add in the "bonus shots" */
- p_ptr->num_fire += extra_shots;
-
- /* Require at least one shot */
- if (p_ptr->num_fire < 1) p_ptr->num_fire = 1;
- }
-
- if (PRACE_FLAG(PR1_XTRA_MIGHT_BOW) && p_ptr->tval_ammo == TV_ARROW)
- p_ptr->xtra_might += 1;
-
- if (PRACE_FLAG(PR1_XTRA_MIGHT_SLING) && p_ptr->tval_ammo == TV_SHOT)
- p_ptr->xtra_might += 1;
-
- if (PRACE_FLAG(PR1_XTRA_MIGHT_XBOW) && p_ptr->tval_ammo == TV_BOLT)
- p_ptr->xtra_might += 1;
-
- /* Examine the "current tool" */
- o_ptr = &p_ptr->inventory[INVEN_TOOL];
-
- /* Boost digging skill by tool weight */
- if (o_ptr->k_idx && (o_ptr->tval == TV_DIGGING))
- {
- p_ptr->skill_dig += (o_ptr->weight / 10);
- }
-
- /* Examine the main weapon */
- o_ptr = &p_ptr->inventory[INVEN_WIELD];
-
- /* Assume not heavy */
- p_ptr->heavy_wield = FALSE;
-
- /* Normal weapons */
- if (o_ptr->k_idx && !p_ptr->heavy_wield)
- {
- int str_index, dex_index;
-
- int num = 0, wgt = 0, mul = 0, div = 0;
-
- analyze_blow(&num, &wgt, &mul);
-
- /* Enforce a minimum "weight" (tenth pounds) */
- div = ((o_ptr->weight < wgt) ? wgt : o_ptr->weight);
-
- /* Access the strength vs weight */
- str_index = (adj_str_blow[p_ptr->stat_ind[A_STR]] * mul / div);
-
- /* Maximal value */
- if (str_index > 11) str_index = 11;
-
- /* Index by dexterity */
- dex_index = (adj_dex_blow[p_ptr->stat_ind[A_DEX]]);
-
- /* Maximal value */
- if (dex_index > 11) dex_index = 11;
-
- /* Use the blows table */
- p_ptr->num_blow = blows_table[str_index][dex_index];
-
- /* Maximal value */
- if (p_ptr->num_blow > num) p_ptr->num_blow = num;
-
- /* Add in the "bonus blows" */
- p_ptr->num_blow += extra_blows;
-
- /* Special class bonus blows */
- p_ptr->num_blow += p_ptr->lev * cp_ptr->extra_blows / 50;
-
- /* Weapon specialization bonus blows */
- if (get_weaponmastery_skill() != -1)
- p_ptr->num_blow += get_skill_scale(get_weaponmastery_skill(), 2);
-
- /* Bonus blows for plain weaponmastery skill */
- p_ptr->num_blow += get_skill_scale(SKILL_MASTERY, 3);
-
- /* Require at least one blow */
- if (p_ptr->num_blow < 1) p_ptr->num_blow = 1;
- }
- /* Different calculation for bear form with empty hands */
- else if ((p_ptr->melee_style == SKILL_HAND) && monk_empty_hands())
- {
- int plev = get_skill(SKILL_HAND);
-
- p_ptr->num_blow = get_extra_blows_ability();
-
- if (plev > 9) p_ptr->num_blow++;
- if (plev > 19) p_ptr->num_blow++;
- if (plev > 29) p_ptr->num_blow++;
- if (plev > 34) p_ptr->num_blow++;
- if (plev > 39) p_ptr->num_blow++;
- if (plev > 44) p_ptr->num_blow++;
- if (plev > 49) p_ptr->num_blow++;
-
- if (monk_heavy_armor()) p_ptr->num_blow /= 2;
-
- p_ptr->num_blow += 1 + extra_blows;
-
- if (!monk_heavy_armor())
- {
- p_ptr->to_h += (plev / 3);
- p_ptr->to_d += (plev / 3);
-
- p_ptr->dis_to_h += (plev / 3);
- p_ptr->dis_to_d += (plev / 3);
- }
- }
-
- /* Monsters that only have their "natural" attacks */
- else if (!r_info[p_ptr->body_monster].body_parts[BODY_WEAPON])
- {
- int str_index, dex_index;
- int num = 0, wgt = 0, mul = 0;
- monster_race *r_ptr = race_info_idx(p_ptr->body_monster, 0);
-
- analyze_blow(&num, &wgt, &mul);
-
- /* Access the strength vs weight */
- str_index = (adj_str_blow[p_ptr->stat_ind[A_STR]] * mul / 3);
-
- /* Maximal value */
- if (str_index > 11) str_index = 11;
-
- /* Index by dexterity */
- dex_index = (adj_dex_blow[p_ptr->stat_ind[A_DEX]]);
-
- /* Maximal value */
- if (dex_index > 11) dex_index = 11;
-
- /* Use the blows table */
- p_ptr->num_blow = blows_table[str_index][dex_index];
-
- /* Add in the "bonus blows" */
- p_ptr->num_blow += extra_blows;
-
- /* Maximal value */
- if (p_ptr->num_blow > 4) p_ptr->num_blow = 4;
-
- /* Require at least one blow */
- if (p_ptr->num_blow < 1) p_ptr->num_blow = 1;
-
- /* Limit as defined by monster body */
- for (num = 0; num < p_ptr->num_blow; num++)
- if (!r_ptr->blow[num].effect)
- break;
- p_ptr->num_blow = num;
- }
-
- /* Different calculation for monks with empty hands */
- else if ((!p_ptr->body_monster) && (p_ptr->mimic_form == resolve_mimic_name("Bear")) && (p_ptr->melee_style == SKILL_BEAR))
- {
- int plev = get_skill(SKILL_BEAR);
-
- p_ptr->num_blow = 0;
-
- p_ptr->num_blow += 2 + (plev / 5) + extra_blows;
-
- p_ptr->to_h -= (plev / 5);
- p_ptr->dis_to_h -= (plev / 5);
-
- p_ptr->to_d += (plev / 2);
- p_ptr->dis_to_d += (plev / 2);
- }
-
- /* Assume okay */
- p_ptr->icky_wield = FALSE;
- monk_armour_aux = FALSE;
-
- if (get_weaponmastery_skill() != -1)
- {
- int lev = get_skill(get_weaponmastery_skill());
-
- p_ptr->to_h_melee += lev;
- p_ptr->to_d_melee += lev / 2;
- }
-
- if (get_skill(SKILL_COMBAT))
- {
- int lev = get_skill_scale(SKILL_COMBAT, 10);
-
- p_ptr->to_d += lev;
- p_ptr->dis_to_d += lev;
- }
-
- if (get_skill(SKILL_DODGE))
- {
- /* Get the armor weight */
- int cur_wgt = 0;
-
- cur_wgt += p_ptr->inventory[INVEN_BODY].weight;
- cur_wgt += p_ptr->inventory[INVEN_HEAD].weight;
- cur_wgt += p_ptr->inventory[INVEN_ARM].weight;
- cur_wgt += p_ptr->inventory[INVEN_OUTER].weight;
- cur_wgt += p_ptr->inventory[INVEN_HANDS].weight;
- cur_wgt += p_ptr->inventory[INVEN_FEET].weight;
-
- /* Base dodge chance */
- p_ptr->dodge_chance = get_skill_scale(SKILL_DODGE, 150) + get_skill(SKILL_HAND);
-
- /* Armor weight bonus/penalty */
- p_ptr->dodge_chance -= cur_wgt * 2;
-
- /* Encumberance bonus/penalty */
- p_ptr->dodge_chance = p_ptr->dodge_chance - (calc_total_weight() / 100);
-
- /* Never below 0 */
- if (p_ptr->dodge_chance < 0) p_ptr->dodge_chance = 0;
- }
- else
- {
- p_ptr->dodge_chance = 0;
- }
-
- /* Parse all the weapons */
- i = 0;
- while (p_ptr->body_parts[i] == INVEN_WIELD)
- {
- o_ptr = &p_ptr->inventory[INVEN_WIELD + i];
-
- /* 2handed weapon and shield = less damage */
- if (p_ptr->inventory[INVEN_WIELD + i].k_idx && p_ptr->inventory[INVEN_ARM + i].k_idx)
- {
- /* Extract the item flags */
- object_flags(&p_ptr->inventory[INVEN_WIELD + i], &f1, &f2, &f3, &f4, &f5, &esp);
-
- if (f4 & TR4_COULD2H)
- {
- int tmp;
-
- /* Reduce the bonuses */
- tmp = o_ptr->to_h / 2;
- if (tmp < 0) tmp = -tmp;
- p_ptr->to_h_melee -= tmp;
-
- tmp = o_ptr->to_d / 2;
- if (tmp < 0) tmp = -tmp;
- tmp += (o_ptr->dd * o_ptr->ds) / 2;
- p_ptr->to_d_melee -= tmp;
- }
- }
-
- /* Priest weapon penalty for non-blessed edged weapons */
- if (((forbid_non_blessed()) && (!p_ptr->bless_blade) &&
- ((o_ptr->tval == TV_AXE) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM))) && (o_ptr->k_idx))
- {
- /* Reduce the real bonuses */
- p_ptr->to_h -= 15;
- p_ptr->to_d -= 15;
-
- /* Reduce the mental bonuses */
- p_ptr->dis_to_h -= 15;
- p_ptr->dis_to_d -= 15;
-
- /* Icky weapon */
- p_ptr->icky_wield = TRUE;
- }
-
- /* Sorcerer can't wield a weapon unless it's a mage staff */
- if (get_skill(SKILL_SORCERY))
- {
- int malus = get_skill_scale(SKILL_SORCERY, 100);
-
- if ((o_ptr->tval != TV_MSTAFF) && (o_ptr->k_idx))
- {
- /* Reduce the real bonuses */
- p_ptr->to_h -= malus;
- p_ptr->to_d -= malus;
-
- /* Reduce the mental bonuses */
- p_ptr->dis_to_h -= malus;
- p_ptr->dis_to_d -= malus;
-
- /* Icky weapon */
- p_ptr->icky_wield = TRUE;
- }
- else
- {
- /* Reduce the real bonuses */
- p_ptr->to_h -= malus / 10;
- p_ptr->to_d -= malus / 10;
-
- /* Reduce the mental bonuses */
- p_ptr->dis_to_h -= malus / 10;
- p_ptr->dis_to_d -= malus / 10;
- }
- }
-
- /* Check next weapon */
- i++;
- }
-
- if (monk_heavy_armor())
- {
- monk_armour_aux = TRUE;
- }
-
- /* Affect Skill -- stealth (bonus one) */
- p_ptr->skill_stl += 1;
-
- /* Affect Skill -- disarming (DEX and INT) */
- p_ptr->skill_dis += adj_dex_dis[p_ptr->stat_ind[A_DEX]];
- p_ptr->skill_dis += adj_int_dis[p_ptr->stat_ind[A_INT]];
-
- /* Affect Skill -- magic devices (INT) */
- p_ptr->skill_dev += get_skill_scale(SKILL_DEVICE, 20);
-
- /* Affect Skill -- saving throw (WIS) */
- p_ptr->skill_sav += adj_wis_sav[p_ptr->stat_ind[A_WIS]];
-
- /* Affect Skill -- digging (STR) */
- p_ptr->skill_dig += adj_str_dig[p_ptr->stat_ind[A_STR]];
-
- /* Affect Skill -- disarming (skill) */
- p_ptr->skill_dis += (get_skill_scale(SKILL_DISARMING, 75));
-
- /* Affect Skill -- magic devices (skill) */
- p_ptr->skill_dev += (get_skill_scale(SKILL_DEVICE, 150));
-
- /* Affect Skill -- saving throw (skill and level) */
- p_ptr->skill_sav += (get_skill_scale(SKILL_SPIRITUALITY, 75));
-
- /* Affect Skill -- stealth (skill) */
- p_ptr->skill_stl += (get_skill_scale(SKILL_STEALTH, 25));
-
- /* Affect Skill -- search ability (Sneakiness skill) */
- p_ptr->skill_srh += (get_skill_scale(SKILL_SNEAK, 35));
-
- /* Affect Skill -- search frequency (Sneakiness skill) */
- p_ptr->skill_fos += (get_skill_scale(SKILL_SNEAK, 25));
-
- /* Affect Skill -- combat (Combat skill + mastery) */
- p_ptr->skill_thn += (50 * (((7 * get_skill(p_ptr->melee_style)) + (3 * get_skill(SKILL_COMBAT))) / 10) / 10);
-
- /* Affect Skill -- combat (shooting) (Level, by Class) */
- p_ptr->skill_thb += (50 * (((7 * get_skill(SKILL_ARCHERY)) + (3 * get_skill(SKILL_COMBAT))) / 10) / 10);
-
- /* Affect Skill -- combat (throwing) (Level) */
- p_ptr->skill_tht += (50 * p_ptr->lev / 10);
-
-
- /* Limit Skill -- stealth from 0 to 30 */
- if (p_ptr->skill_stl > 30) p_ptr->skill_stl = 30;
- if (p_ptr->skill_stl < 0) p_ptr->skill_stl = 0;
-
- /* Limit Skill -- digging from 1 up */
- if (p_ptr->skill_dig < 1) p_ptr->skill_dig = 1;
-
- if ((p_ptr->anti_magic) && (p_ptr->skill_sav < 95)) p_ptr->skill_sav = 95;
-
- /* Hack -- handle "xtra" mode */
- if (character_xtra) return;
-
- /* Take note when "heavy bow" changes */
- if (p_ptr->old_heavy_shoot != p_ptr->heavy_shoot)
- {
- if (silent)
- {
- /* do nothing */
- }
- /* Message */
- else if (p_ptr->heavy_shoot)
- {
- msg_print("You have trouble wielding such a heavy bow.");
- }
- else if (p_ptr->inventory[INVEN_BOW].k_idx)
- {
- msg_print("You have no trouble wielding your bow.");
- }
- else
- {
- msg_print("You feel relieved to put down your heavy bow.");
- }
-
- /* Save it */
- p_ptr->old_heavy_shoot = p_ptr->heavy_shoot;
- }
-
-
- /* Take note when "heavy weapon" changes */
- if (p_ptr->old_heavy_wield != p_ptr->heavy_wield)
- {
- if (silent)
- {
- /* do nothing */
- }
- /* Message */
- else if (p_ptr->heavy_wield)
- {
- msg_print("You have trouble wielding such a heavy weapon.");
- }
- else if (p_ptr->inventory[INVEN_WIELD].k_idx)
- {
- msg_print("You have no trouble wielding your weapon.");
- }
- else
- {
- msg_print("You feel relieved to put down your heavy weapon.");
- }
-
- /* Save it */
- p_ptr->old_heavy_wield = p_ptr->heavy_wield;
- }
-
-
- /* Take note when "illegal weapon" changes */
- if (p_ptr->old_icky_wield != p_ptr->icky_wield)
- {
- if (silent)
- {
- /* do nothing */
- }
- /* Message */
- else if (p_ptr->icky_wield)
- {
- msg_print("You do not feel comfortable with your weapon.");
- }
- else if (p_ptr->inventory[INVEN_WIELD].k_idx)
- {
- msg_print("You feel comfortable with your weapon.");
- }
- else
- {
- msg_print("You feel more comfortable after removing your weapon.");
- }
-
- /* Save it */
- p_ptr->old_icky_wield = p_ptr->icky_wield;
- }
-
- if (monk_armour_aux != monk_notify_aux)
- {
- if ((p_ptr->melee_style != SKILL_HAND) || silent)
- {
- /* do nothing */
- }
- else if (monk_heavy_armor())
- msg_print("The weight of your armor disrupts your balance.");
- else
- msg_print("You regain your balance.");
- monk_notify_aux = monk_armour_aux;
- }
-
- /* Resist lite & senseible lite negates one an other */
- if (p_ptr->resist_lite && p_ptr->sensible_lite)
- {
- p_ptr->resist_lite = p_ptr->sensible_lite = FALSE;
- }
-
- /* resistance to fire cancel sensibility to fire */
- if (p_ptr->resist_fire || p_ptr->oppose_fire || p_ptr->immune_fire)
- p_ptr->sensible_fire = FALSE;
-
- /* Minimum saving throw */
- if(p_ptr->skill_sav <= 10)
- p_ptr->skill_sav = 10;
- else
- p_ptr->skill_sav += 10;
-
- /* Let the scripts do what they need */
- process_hooks(HOOK_CALC_BONUS_END, "(d)", silent);
-}
-
-
-
-/*
- * Handle "p_ptr->notice"
- */
-void notice_stuff(void)
-{
- /* Notice stuff */
- if (!p_ptr->notice) return;
-
-
- /* Combine the pack */
- if (p_ptr->notice & (PN_COMBINE))
- {
- p_ptr->notice &= ~(PN_COMBINE);
- combine_pack();
- }
-
- /* Reorder the pack */
- if (p_ptr->notice & (PN_REORDER))
- {
- p_ptr->notice &= ~(PN_REORDER);
- reorder_pack();
- }
-}
-
-
-/*
- * Handle "p_ptr->update"
- */
-void update_stuff(void)
-{
- /* Update stuff */
- if (!p_ptr->update) return;
-
-
- if (p_ptr->update & (PU_BODY))
- {
- p_ptr->update &= ~(PU_BODY);
- calc_body();
- }
-
- if (p_ptr->update & (PU_BONUS))
- {
- /* Ok now THAT is an ugly hack */
- p_ptr->update &= ~(PU_POWERS);
- calc_powers();
-
- p_ptr->update &= ~(PU_BONUS);
- calc_bonuses(FALSE);
- }
-
- if (p_ptr->update & (PU_TORCH))
- {
- p_ptr->update &= ~(PU_TORCH);
- calc_torch();
- }
-
- if (p_ptr->update & (PU_HP))
- {
- p_ptr->update &= ~(PU_HP);
- calc_hitpoints();
- }
-
- if (p_ptr->update & (PU_SANITY))
- {
- p_ptr->update &= ~(PU_SANITY);
- calc_sanity();
- }
-
- if (p_ptr->update & (PU_MANA))
- {
- p_ptr->update &= ~(PU_MANA);
- calc_mana();
- }
-
- if (p_ptr->update & (PU_SPELLS))
- {
- p_ptr->update &= ~(PU_SPELLS);
- calc_spells();
- }
-
- if (p_ptr->update & (PU_POWERS))
- {
- p_ptr->update &= ~(PU_POWERS);
- calc_powers();
- }
-
- /* Character is not ready yet, no screen updates */
- if (!character_generated) return;
-
-
- /* Character is in "icky" mode, no screen updates */
- if (character_icky) return;
-
-
- if (p_ptr->update & (PU_UN_VIEW))
- {
- p_ptr->update &= ~(PU_UN_VIEW);
- forget_view();
- }
-
- if (p_ptr->update & (PU_VIEW))
- {
- p_ptr->update &= ~(PU_VIEW);
- update_view();
- }
-
- if (p_ptr->update & (PU_FLOW))
- {
- p_ptr->update &= ~(PU_FLOW);
- update_flow();
- }
-
- if (p_ptr->update & (PU_DISTANCE))
- {
- p_ptr->update &= ~(PU_DISTANCE);
- p_ptr->update &= ~(PU_MONSTERS);
- update_monsters(TRUE);
- }
-
- if (p_ptr->update & (PU_MONSTERS))
- {
- p_ptr->update &= ~(PU_MONSTERS);
- update_monsters(FALSE);
- }
-
- if (p_ptr->update & (PU_MON_LITE))
- {
- p_ptr->update &= ~(PU_MON_LITE);
- if (monster_lite) update_mon_lite();
- }
-}
-
-
-/*
- * Handle "p_ptr->redraw"
- */
-void redraw_stuff(void)
-{
- /* Redraw stuff */
- if (!p_ptr->redraw) return;
-
-
- /* Character is not ready yet, no screen updates */
- if (!character_generated) return;
-
-
- /* Character is in "icky" mode, no screen updates */
- if (character_icky) return;
-
-
- /* Should we tell lua to redisplay too ? */
- process_hooks(HOOK_REDRAW, "()");
-
-
- /* Hack -- clear the screen */
- if (p_ptr->redraw & (PR_WIPE))
- {
- p_ptr->redraw &= ~(PR_WIPE);
- msg_print(NULL);
- Term_clear();
- }
-
-
- if (p_ptr->redraw & (PR_MAP))
- {
- p_ptr->redraw &= ~(PR_MAP);
- prt_map();
- }
-
-
- if (p_ptr->redraw & (PR_BASIC))
- {
- p_ptr->redraw &= ~(PR_BASIC);
- p_ptr->redraw &= ~(PR_MISC | PR_TITLE | PR_STATS);
- p_ptr->redraw &= ~(PR_LEV | PR_EXP | PR_GOLD);
- p_ptr->redraw &= ~(PR_ARMOR | PR_HP | PR_MANA | PR_PIETY | PR_MH);
- p_ptr->redraw &= ~(PR_DEPTH | PR_HEALTH);
- prt_frame_basic();
- }
-
- if (p_ptr->redraw & (PR_MISC))
- {
- p_ptr->redraw &= ~(PR_MISC);
- prt_field(rp_ptr->title + rp_name, ROW_RACE, COL_RACE);
- prt_field(spp_ptr->title + c_name, ROW_CLASS, COL_CLASS);
- }
-
- if (p_ptr->redraw & (PR_TITLE))
- {
- p_ptr->redraw &= ~(PR_TITLE);
- prt_title();
- }
-
- if (p_ptr->redraw & (PR_LEV))
- {
- p_ptr->redraw &= ~(PR_LEV);
- prt_level();
- }
-
- if (p_ptr->redraw & (PR_EXP))
- {
- p_ptr->redraw &= ~(PR_EXP);
- prt_exp();
- }
-
- if (p_ptr->redraw & (PR_STATS))
- {
- p_ptr->redraw &= ~(PR_STATS);
- prt_stat(A_STR);
- prt_stat(A_INT);
- prt_stat(A_WIS);
- prt_stat(A_DEX);
- prt_stat(A_CON);
- prt_stat(A_CHR);
- }
-
- if (p_ptr->redraw & (PR_ARMOR))
- {
- p_ptr->redraw &= ~(PR_ARMOR);
- prt_ac();
- }
-
- if (p_ptr->redraw & (PR_HP))
- {
- p_ptr->redraw &= ~(PR_HP);
- prt_hp();
- }
-
- if (p_ptr->redraw & (PR_MANA))
- {
- p_ptr->redraw &= ~(PR_MANA);
- prt_sp();
- }
-
- if (p_ptr->redraw & (PR_PIETY))
- {
- p_ptr->redraw &= ~(PR_PIETY);
- prt_piety();
- }
-
- if (p_ptr->redraw & (PR_MH))
- {
- p_ptr->redraw &= ~(PR_MH);
- prt_mh();
- }
-
- if (p_ptr->redraw & (PR_GOLD))
- {
- p_ptr->redraw &= ~(PR_GOLD);
- prt_gold();
- }
-
- if (p_ptr->redraw & (PR_DEPTH))
- {
- p_ptr->redraw &= ~(PR_DEPTH);
- prt_depth();
- }
-
- if (p_ptr->redraw & (PR_HEALTH))
- {
- p_ptr->redraw &= ~(PR_HEALTH);
- health_redraw();
- }
-
-
- if (p_ptr->redraw & (PR_EXTRA))
- {
- p_ptr->redraw &= ~(PR_EXTRA);
- p_ptr->redraw &= ~(PR_CUT | PR_STUN);
- p_ptr->redraw &= ~(PR_HUNGER);
- p_ptr->redraw &= ~(PR_BLIND | PR_CONFUSED);
- p_ptr->redraw &= ~(PR_AFRAID | PR_POISONED);
- p_ptr->redraw &= ~(PR_STATE | PR_SPEED | PR_STUDY | PR_SANITY);
- prt_frame_extra();
- }
-
- if (p_ptr->redraw & (PR_CUT))
- {
- p_ptr->redraw &= ~(PR_CUT);
- prt_cut();
- }
-
- if (p_ptr->redraw & (PR_STUN))
- {
- p_ptr->redraw &= ~(PR_STUN);
- prt_stun();
- }
-
- if (p_ptr->redraw & (PR_HUNGER))
- {
- p_ptr->redraw &= ~(PR_HUNGER);
- prt_hunger();
- }
-
- if (p_ptr->redraw & (PR_BLIND))
- {
- p_ptr->redraw &= ~(PR_BLIND);
- prt_blind();
- }
-
- if (p_ptr->redraw & (PR_CONFUSED))
- {
- p_ptr->redraw &= ~(PR_CONFUSED);
- prt_confused();
- }
-
- if (p_ptr->redraw & (PR_AFRAID))
- {
- p_ptr->redraw &= ~(PR_AFRAID);
- prt_afraid();
- }
-
- if (p_ptr->redraw & (PR_POISONED))
- {
- p_ptr->redraw &= ~(PR_POISONED);
- prt_poisoned();
- }
-
- if (p_ptr->redraw & (PR_DTRAP))
- {
- p_ptr->redraw &= ~(PR_DTRAP);
- prt_dtrap();
- }
-
- if (p_ptr->redraw & (PR_STATE))
- {
- p_ptr->redraw &= ~(PR_STATE);
- prt_state();
- }
-
- if (p_ptr->redraw & (PR_SPEED))
- {
- p_ptr->redraw &= ~(PR_SPEED);
- prt_speed();
- }
-
- if (p_ptr->redraw & (PR_STUDY))
- {
- p_ptr->redraw &= ~(PR_STUDY);
- prt_study();
- }
-
- if (p_ptr->redraw & (PR_SANITY))
- {
- p_ptr->redraw &= ~(PR_SANITY);
- prt_sane();
- }
-}
-
-
-/*
- * Handle "p_ptr->window"
- */
-void window_stuff(void)
-{
- int j;
-
- u32b mask = 0L;
-
-
- /* Nothing to do */
- if (!p_ptr->window) return;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- /* Save usable flags */
- if (angband_term[j]) mask |= window_flag[j];
- }
-
- /* Apply usable flags */
- p_ptr->window &= mask;
-
- /* Nothing to do */
- if (!p_ptr->window) return;
-
-
- /* Display p_ptr->inventory */
- if (p_ptr->window & (PW_INVEN))
- {
- p_ptr->window &= ~(PW_INVEN);
- fix_inven();
- }
-
- /* Display equipment */
- if (p_ptr->window & (PW_EQUIP))
- {
- p_ptr->window &= ~(PW_EQUIP);
- fix_equip();
- }
-
- /* Display player */
- if (p_ptr->window & (PW_PLAYER))
- {
- p_ptr->window &= ~(PW_PLAYER);
- fix_player();
- }
-
- /* Display monster list */
- if (p_ptr->window & (PW_M_LIST))
- {
- p_ptr->window &= ~(PW_M_LIST);
- fix_m_list();
- }
-
- /* Display overhead view */
- if (p_ptr->window & (PW_MESSAGE))
- {
- p_ptr->window &= ~(PW_MESSAGE);
- fix_message();
- }
-
- /* Display overhead view */
- if (p_ptr->window & (PW_OVERHEAD))
- {
- p_ptr->window &= ~(PW_OVERHEAD);
- fix_overhead();
- }
-
- /* Display monster recall */
- if (p_ptr->window & (PW_MONSTER))
- {
- p_ptr->window &= ~(PW_MONSTER);
- fix_monster();
- }
-
- /* Display object recall */
- if (p_ptr->window & (PW_OBJECT))
- {
- p_ptr->window &= ~(PW_OBJECT);
- fix_object();
- }
-}
-
-
-/*
- * Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window"
- */
-void handle_stuff(void)
-{
- /* Update stuff */
- if (p_ptr->update) update_stuff();
-
- /* Redraw stuff */
- if (p_ptr->redraw) redraw_stuff();
-
- /* Window stuff */
- if (p_ptr->window) window_stuff();
-}
-
-
-bool_ monk_empty_hands(void)
-{
- int i;
- object_type *o_ptr;
-
- if (p_ptr->melee_style != SKILL_HAND) return FALSE;
-
- i = 0;
- while (p_ptr->body_parts[i] == INVEN_WIELD)
- {
- o_ptr = &p_ptr->inventory[INVEN_WIELD + i];
-
- if (o_ptr->k_idx) return FALSE;
-
- i++;
- }
-
- return TRUE;
-}
-
-bool_ monk_heavy_armor(void)
-{
- u16b monk_arm_wgt = 0;
-
- if (p_ptr->melee_style != SKILL_HAND) return FALSE;
-
- /* Weight the armor */
- monk_arm_wgt += p_ptr->inventory[INVEN_BODY].weight;
- monk_arm_wgt += p_ptr->inventory[INVEN_HEAD].weight;
- monk_arm_wgt += p_ptr->inventory[INVEN_ARM].weight;
- monk_arm_wgt += p_ptr->inventory[INVEN_OUTER].weight;
- monk_arm_wgt += p_ptr->inventory[INVEN_HANDS].weight;
- monk_arm_wgt += p_ptr->inventory[INVEN_FEET].weight;
-
- return (monk_arm_wgt > (100 + (get_skill(SKILL_HAND) * 4))) ;
-}
-
-static int get_artifact_idx(int level)
-{
- int count = 0, i;
-
- while (count < 1000)
- {
- artifact_type *a_ptr;
-
- count++;
- i = randint(max_a_idx - 1);
- a_ptr = &a_info[i];
- if (!a_ptr->tval) continue;
-
- /* It is found/lost */
- if (a_ptr->cur_num) continue;
-
- /* OoD */
- if (a_ptr->level > level) continue;
-
- /* Avoid granting SPECIAL_GENE artifacts */
- if (a_ptr->flags4 & TR4_SPECIAL_GENE) continue;
-
- return i;
- }
-
- /* No matches found */
- /* Grant a randart */
- return 0;
-}
-
-/* Chose a fate */
-void gain_fate(byte fate)
-{
- int i;
- int level;
-
- for (i = 0; i < MAX_FATES; i++)
- {
- if (!fates[i].fate)
- {
- fates[i].level = 0;
-
- cmsg_print(TERM_VIOLET, "More of your prophecy has been unearthed!");
- cmsg_print(TERM_VIOLET, "You should see a soothsayer quickly.");
-
- if (fate)
- fates[i].fate = fate;
- else
- /* If lucky (current luck > 0) avoid death fate */
- switch (rand_int(p_ptr->luck_cur > 0 ? 17 : 18))
- {
- case 6:
- case 2:
- case 3:
- case 7:
- case 8:
- case 9:
- case 13:
- fates[i].fate = FATE_FIND_O;
- break;
- case 1:
- case 4:
- case 5:
- case 10:
- case 11:
- case 12:
- case 14:
- fates[i].fate = FATE_FIND_R;
- break;
- case 15:
- case 16:
- fates[i].fate = FATE_FIND_A;
- break;
- case 17:
- fates[i].fate = FATE_DIE;
- break;
- case 0:
- {
- /* The deepest the better */
- int chance = dun_level / 4;
-
- /* No more than 1/2 chances */
- if (chance > 50) chance = 50;
-
- /* It's HARD to get now */
- if (magik(chance))
- {
- fates[i].fate = FATE_NO_DIE_MORTAL;
- }
- else
- {
- fates[i].fate = FATE_FIND_O;
- }
- break;
- }
- }
-
- switch (fates[i].fate)
- {
- case FATE_FIND_O:
- {
- while (TRUE)
- {
- object_kind *k_ptr;
- obj_theme theme;
-
- /* No themes */
- theme.treasure = 100;
- theme.combat = 100;
- theme.magic = 100;
- theme.tools = 100;
- init_match_theme(theme);
-
- /* Apply restriction */
- get_obj_num_hook = kind_is_legal;
-
- /* Rebuild allocation table */
- get_obj_num_prep();
-
- fates[i].o_idx = get_obj_num(max_dlv[dungeon_type] + randint(10));
-
- /* Invalidate the cached allocation table */
- alloc_kind_table_valid = FALSE;
-
- k_ptr = &k_info[fates[i].o_idx];
-
- if (!(k_ptr->flags3 & TR3_INSTA_ART) && !(k_ptr->flags3 & TR3_NORM_ART)) break;
- }
- level = rand_range(max_dlv[dungeon_type] - 20, max_dlv[dungeon_type] + 20);
- fates[i].level = (level < 1) ? 1 : (level > 98) ? 98 : level;
- fates[i].serious = rand_int(2);
- fates[i].know = FALSE;
- if (wizard) msg_format("New fate : Find object %d on level %d", fates[i].o_idx, fates[i].level);
- break;
- }
- case FATE_FIND_R:
- /* Prepare allocation table */
- get_mon_num_prep();
-
- fates[i].r_idx = get_mon_num(max_dlv[dungeon_type] + randint(10));
- level = rand_range(max_dlv[dungeon_type] - 20, max_dlv[dungeon_type] + 20);
- fates[i].level = (level < 1) ? 1 : (level > 98) ? 98 : level;
- fates[i].serious = rand_int(2);
- fates[i].know = FALSE;
- if (wizard) msg_format("New fate : Meet monster %d on level %d", fates[i].r_idx, fates[i].level);
- break;
-
- case FATE_FIND_A:
- fates[i].a_idx = get_artifact_idx(max_dlv[dungeon_type] + randint(10));
- level = rand_range(max_dlv[dungeon_type] - 20, max_dlv[dungeon_type] + 20);
- fates[i].level = (level < 1) ? 1 : (level > 98) ? 98 : level;
- fates[i].serious = TRUE;
- fates[i].know = FALSE;
- if (wizard) msg_format("New fate : Find artifact %d on level %d", fates[i].a_idx, fates[i].level);
- break;
-
- case FATE_DIE:
- level = rand_range(max_dlv[dungeon_type] - 20, max_dlv[dungeon_type] + 20);
- fates[i].level = (level < 1) ? 1 : (level > 98) ? 98 : level;
- fates[i].serious = TRUE;
- fates[i].know = FALSE;
- if ((wizard) || (p_ptr->precognition)) msg_format("New fate : Death on level %d", fates[i].level);
- break;
-
- case FATE_NO_DIE_MORTAL:
- fates[i].serious = TRUE;
- p_ptr->no_mortal = TRUE;
- if ((wizard) || (p_ptr->precognition)) msg_format("New fate : Never to die by the hand of a mortal being.");
- break;
- }
-
- break;
- }
- }
-}
-
-void fate_desc(char *desc, int fate)
-{
- char buf[120];
-
- if (fates[fate].serious)
- {
- strcpy(desc, "You are fated to ");
- }
- else
- {
- strcpy(desc, "You may ");
- }
- switch (fates[fate].fate)
- {
- case FATE_FIND_O:
- {
- object_type *o_ptr, forge;
- char o_name[80];
-
- o_ptr = &forge;
- object_prep(o_ptr, fates[fate].o_idx);
- object_desc_store(o_name, o_ptr, 1, 0);
-
- sprintf(buf, "find %s on level %d.", o_name, fates[fate].level);
- strcat(desc, buf);
- break;
- }
- case FATE_FIND_A:
- {
- object_type *q_ptr, forge;
- char o_name[80];
- artifact_type *a_ptr = &a_info[fates[fate].a_idx];
- int I_kind;
-
- /* Failed artefact allocation XXX XXX XXX */
- if (fates[fate].a_idx == 0)
- {
- strcpy(o_name, "something special");
- }
-
- /* Legal artefacts */
- else
- {
- /* Get local object */
- q_ptr = &forge;
-
- /* Wipe the object */
- object_wipe(q_ptr);
-
- /* Acquire the "kind" index */
- I_kind = lookup_kind(a_ptr->tval, a_ptr->sval);
-
- /* Create the artifact */
- object_prep(q_ptr, I_kind);
-
- /* Save the name */
- q_ptr->name1 = fates[fate].a_idx;
-
- /* Extract the fields */
- q_ptr->pval = a_ptr->pval;
- q_ptr->ac = a_ptr->ac;
- q_ptr->dd = a_ptr->dd;
- q_ptr->ds = a_ptr->ds;
- q_ptr->to_a = a_ptr->to_a;
- q_ptr->to_h = a_ptr->to_h;
- q_ptr->to_d = a_ptr->to_d;
- q_ptr->weight = a_ptr->weight;
-
- /* Hack -- acquire "cursed" flag */
- if (a_ptr->flags3 & (TR3_CURSED)) q_ptr->ident |= (IDENT_CURSED);
-
- random_artifact_resistance(q_ptr);
-
- object_desc_store(o_name, q_ptr, 1, 0);
- }
-
- sprintf(buf, "find %s on level %d.", o_name, fates[fate].level);
- strcat(desc, buf);
- break;
- }
- case FATE_FIND_R:
- {
- char m_name[80];
-
- monster_race_desc(m_name, fates[fate].r_idx, 0);
- sprintf(buf, "meet %s on level %d.", m_name, fates[fate].level);
- strcat(desc, buf);
- break;
- }
- case FATE_DIE:
- {
- sprintf(buf, "die on level %d.", fates[fate].level);
- strcat(desc, buf);
- break;
- }
- case FATE_NO_DIE_MORTAL:
- {
- strcat(desc, "never to die by the hand of a mortal being.");
- break;
- }
- }
-}
-
-void dump_fates(FILE *outfile)
-{
- int i;
- char buf[120];
- bool_ pending = FALSE;
-
- if (!outfile) return;
-
- for (i = 0; i < MAX_FATES; i++)
- {
- if ((fates[i].fate) && (fates[i].know))
- {
- fate_desc(buf, i);
- fprintf(outfile, "%s\n", buf);
- }
- if ((fates[i].fate) && !(fates[i].know)) pending = TRUE;
- }
- if (pending)
- {
- fprintf(outfile, "You do not know all of your fate.\n");
- }
-}
-
-/*
- * Return a luck number between a certain range
- */
-int luck(int min, int max)
-{
- int luck = p_ptr->luck_cur;
- int range = max - min;
-
- if (luck < -30) luck = -30;
- if (luck > 30) luck = 30;
- luck += 30;
-
- luck *= range;
- luck /= 60;
-
- return (luck + min);
-}