summaryrefslogtreecommitdiff
path: root/src/bldg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bldg.c')
-rw-r--r--src/bldg.c2198
1 files changed, 0 insertions, 2198 deletions
diff --git a/src/bldg.c b/src/bldg.c
deleted file mode 100644
index 48e94e9f..00000000
--- a/src/bldg.c
+++ /dev/null
@@ -1,2198 +0,0 @@
-/* File: bldg.c */
-
-/*
- * Purpose: Building commands
- * Created by Ken Wigle for Kangband - a variant of Angband 2.8.3
- * -KMW-
- *
- * Rewritten for Kangband 2.8.3i using Kamband's version of
- * bldg.c as written by Ivan Tkatchev
- *
- * Changed for ZAngband by Robert Ruehlmann
- *
- * Heavily modified for ToME by DarkGod
- */
-
-#include "angband.h"
-
-/* hack as in leave_store in store.c */
-static bool_ leave_bldg = FALSE;
-
-/* remember building location */
-static int building_loc = 0;
-
-
-/*
- * A helper function for is_state
- */
-bool_ is_state_aux(store_type *s_ptr, int state)
-{
- owner_type *ow_ptr = &ow_info[s_ptr->owner];
-
-
- /* Check race */
- if (ow_ptr->races[state][p_ptr->prace / 32] & (1 << p_ptr->prace))
- {
- return (TRUE);
- }
-
- /* Check class */
- if (ow_ptr->classes[state][p_ptr->prace / 32] & (1 << p_ptr->pclass))
- {
- return (TRUE);
- }
-
- /* All failed */
- return (FALSE);
-}
-
-
-/*
- * Test if the state accords with the player
- */
-bool_ is_state(store_type *s_ptr, int state)
-{
- if (state == STORE_NORMAL)
- {
- if (is_state_aux(s_ptr, STORE_LIKED)) return (FALSE);
- if (is_state_aux(s_ptr, STORE_HATED)) return (FALSE);
- return (TRUE);
- }
-
- else
- {
- return (is_state_aux(s_ptr, state));
- }
-}
-
-
-/*
- * Clear the building information
- */
-static void clear_bldg(int min_row, int max_row)
-{
- int i;
-
-
- for (i = min_row; i <= max_row; i++)
- {
- prt("", i, 0);
- }
-}
-
-
-/*
- * Display a building.
- */
-void show_building(store_type *s_ptr)
-{
- char buff[20];
-
- int i;
-
- byte action_color;
-
- char tmp_str[80];
-
- store_info_type *st_ptr = &st_info[s_ptr->st_idx];
-
- store_action_type *ba_ptr;
-
-
- for (i = 0; i < 6; i++)
- {
- ba_ptr = &ba_info[st_ptr->actions[i]];
-
- if (ba_ptr->letter != '.')
- {
- if (ba_ptr->action_restr == 0)
- {
- if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) ||
- (is_state(s_ptr, STORE_HATED) && (ba_ptr->costs[STORE_HATED] == 0)) ||
- (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0)))
- {
- action_color = TERM_WHITE;
- buff[0] = '\0';
- }
- else if (is_state(s_ptr, STORE_LIKED))
- {
- action_color = TERM_L_GREEN;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
- }
- else if (is_state(s_ptr, STORE_HATED))
- {
- action_color = TERM_RED;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_HATED]);
- }
- else
- {
- action_color = TERM_YELLOW;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]);
- }
- }
- else if (ba_ptr->action_restr == 1)
- {
- if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) ||
- (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0)))
- {
- action_color = TERM_WHITE;
- buff[0] = '\0';
- }
- else if (is_state(s_ptr, STORE_LIKED))
- {
- action_color = TERM_L_GREEN;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
- }
- else if (is_state(s_ptr, STORE_HATED))
- {
- action_color = TERM_L_DARK;
- strnfmt(buff, 20, "(closed)");
- }
- else
- {
- action_color = TERM_YELLOW;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]);
- }
- }
- else
- {
- if (is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0))
- {
- action_color = TERM_WHITE;
- buff[0] = '\0';
- }
- else if (is_state(s_ptr, STORE_LIKED))
- {
- action_color = TERM_L_GREEN;
- strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]);
- }
- else
- {
- action_color = TERM_L_DARK;
- strnfmt(buff, 20, "(closed)");
- }
- }
-
- strnfmt(tmp_str, 80, " %c", ba_ptr->letter);
- c_put_str(TERM_YELLOW, tmp_str, 21 + (i / 2), 17 + (30 * (i % 2)));
-
- strnfmt(tmp_str, 80, ") %s %s", ba_ptr->name + ba_name, buff);
- c_put_str(action_color, tmp_str, 21 + (i / 2), 2 + 17 + (30 * (i % 2)));
- }
- }
-}
-
-
-/* reset timed flags */
-static void reset_tim_flags()
-{
- p_ptr->fast = 0; /* Timed -- Fast */
- p_ptr->slow = 0; /* Timed -- Slow */
- p_ptr->blind = 0; /* Timed -- Blindness */
- p_ptr->paralyzed = 0; /* Timed -- Paralysis */
- p_ptr->confused = 0; /* Timed -- Confusion */
- p_ptr->afraid = 0; /* Timed -- Fear */
- p_ptr->image = 0; /* Timed -- Hallucination */
- p_ptr->poisoned = 0; /* Timed -- Poisoned */
- p_ptr->cut = 0; /* Timed -- Cut */
- p_ptr->stun = 0; /* Timed -- Stun */
-
- p_ptr->protevil = 0; /* Timed -- Protection */
- p_ptr->protgood = 0; /* Timed -- Protection */
- p_ptr->invuln = 0; /* Timed -- Invulnerable */
- p_ptr->hero = 0; /* Timed -- Heroism */
- p_ptr->shero = 0; /* Timed -- Super Heroism */
- p_ptr->shield = 0; /* Timed -- Shield Spell */
- p_ptr->blessed = 0; /* Timed -- Blessed */
- p_ptr->tim_invis = 0; /* Timed -- Invisibility */
- p_ptr->tim_infra = 0; /* Timed -- Infra Vision */
-
- p_ptr->oppose_acid = 0; /* Timed -- oppose acid */
- p_ptr->oppose_elec = 0; /* Timed -- oppose lightning */
- p_ptr->oppose_fire = 0; /* Timed -- oppose heat */
- p_ptr->oppose_cold = 0; /* Timed -- oppose cold */
- p_ptr->oppose_pois = 0; /* Timed -- oppose poison */
-
- p_ptr->confusing = 0; /* Touch of Confusion */
-}
-
-
-/*
- * arena commands
- */
-static void arena_comm(int cmd)
-{
- char tmp_str[80];
-
- monster_race *r_ptr;
-
- cptr name;
-
-
- switch (cmd)
- {
- case BACT_ARENA:
- {
- if (p_ptr->arena_number == MAX_ARENA_MONS)
- {
- clear_bldg(5, 19);
- prt(" Arena Victor!", 5, 0);
- prt("Congratulations! You have defeated all before you.", 7, 0);
- prt("For that, receive the prize: 10,000 gold pieces", 8, 0);
- prt("", 10, 0);
- prt("", 11, 0);
- p_ptr->au += 10000;
- msg_print("Press the space bar to continue");
- msg_print(NULL);
- p_ptr->arena_number++;
- }
- else if (p_ptr->arena_number > MAX_ARENA_MONS)
- {
- msg_print("You enter the arena briefly and bask in your glory.");
- msg_print(NULL);
- }
- else
- {
- p_ptr->inside_arena = TRUE;
- p_ptr->exit_bldg = FALSE;
- reset_tim_flags();
- p_ptr->leaving = TRUE;
- p_ptr->oldpx = p_ptr->px;
- p_ptr->oldpy = p_ptr->py;
- leave_bldg = TRUE;
- }
-
- break;
- }
-
- case BACT_POSTER:
- {
- if (p_ptr->arena_number == MAX_ARENA_MONS)
- msg_print("You are victorious. Enter the arena for the ceremony.");
- else if (p_ptr->arena_number > MAX_ARENA_MONS)
- msg_print("You have won against all foes.");
- else
- {
- r_ptr = &r_info[arena_monsters[p_ptr->arena_number]];
- name = (r_name + r_ptr->name);
- strnfmt(tmp_str, 80, "Do I hear any challenges against: %s", name);
- msg_print(tmp_str);
- msg_print(NULL);
- }
-
- break;
- }
-
- case BACT_ARENA_RULES:
- {
- /* Save screen */
- screen_save();
-
- /* Peruse the arena help file */
- (void)show_file("arena.txt", NULL, 0, 0);
-
- /* Load screen */
- screen_load();
-
- break;
- }
- }
-}
-
-
-/*
- * display fruit for dice slots
- */
-static void display_fruit(int row, int col, int fruit)
-{
- switch (fruit)
- {
- case 0: /* lemon */
- {
- c_put_str(TERM_YELLOW, " ####.", row, col);
- c_put_str(TERM_YELLOW, " # #", row + 1, col);
- c_put_str(TERM_YELLOW, " # #", row + 2, col);
- c_put_str(TERM_YELLOW, "# #", row + 3, col);
- c_put_str(TERM_YELLOW, "# #", row + 4, col);
- c_put_str(TERM_YELLOW, "# # ", row + 5, col);
- c_put_str(TERM_YELLOW, "# # ", row + 6, col);
- c_put_str(TERM_YELLOW, ".#### ", row + 7, col);
- prt(" Lemon ", row + 8, col);
-
- break;
- }
-
- case 1: /* orange */
- {
- c_put_str(TERM_ORANGE, " ## ", row, col);
- c_put_str(TERM_ORANGE, " #..# ", row + 1, col);
- c_put_str(TERM_ORANGE, " #....# ", row + 2, col);
- c_put_str(TERM_ORANGE, "#......#", row + 3, col);
- c_put_str(TERM_ORANGE, "#......#", row + 4, col);
- c_put_str(TERM_ORANGE, " #....# ", row + 5, col);
- c_put_str(TERM_ORANGE, " #..# ", row + 6, col);
- c_put_str(TERM_ORANGE, " ## ", row + 7, col);
- prt(" Orange ", row + 8, col);
-
- break;
- }
-
- case 2: /* sword */
- {
- c_put_str(TERM_SLATE, " /\\ ", row, col);
- c_put_str(TERM_SLATE, " ## ", row + 1, col);
- c_put_str(TERM_SLATE, " ## ", row + 2, col);
- c_put_str(TERM_SLATE, " ## ", row + 3, col);
- c_put_str(TERM_SLATE, " ## ", row + 4, col);
- c_put_str(TERM_SLATE, " ## ", row + 5, col);
- c_put_str(TERM_UMBER, " ###### ", row + 6, col);
- c_put_str(TERM_UMBER, " ## ", row + 7, col);
- prt(" Sword ", row + 8, col);
-
- break;
- }
-
- case 3: /* shield */
- {
- c_put_str(TERM_SLATE, " ###### ", row, col);
- c_put_str(TERM_SLATE, "# #", row + 1, col);
- c_put_str(TERM_SLATE, "# ++++ #", row + 2, col);
- c_put_str(TERM_SLATE, "# +==+ #", row + 3, col);
- c_put_str(TERM_SLATE, "# ++ #", row + 4, col);
- c_put_str(TERM_SLATE, " # # ", row + 5, col);
- c_put_str(TERM_SLATE, " # # ", row + 6, col);
- c_put_str(TERM_SLATE, " ## ", row + 7, col);
- prt(" Shield ", row + 8, col);
-
- break;
- }
-
- case 4: /* plum */
- {
- c_put_str(TERM_VIOLET, " ## ", row, col);
- c_put_str(TERM_VIOLET, " ###### ", row + 1, col);
- c_put_str(TERM_VIOLET, "########", row + 2, col);
- c_put_str(TERM_VIOLET, "########", row + 3, col);
- c_put_str(TERM_VIOLET, "########", row + 4, col);
- c_put_str(TERM_VIOLET, " ###### ", row + 5, col);
- c_put_str(TERM_VIOLET, " #### ", row + 6, col);
- c_put_str(TERM_VIOLET, " ## ", row + 7, col);
- prt(" Plum ", row + 8, col);
-
- break;
- }
-
- case 5: /* cherry */
- {
- c_put_str(TERM_RED, " ##", row, col);
- c_put_str(TERM_RED, " ### ", row + 1, col);
- c_put_str(TERM_RED, " #..# ", row + 2, col);
- c_put_str(TERM_RED, " #..# ", row + 3, col);
- c_put_str(TERM_RED, " ###### ", row + 4, col);
- c_put_str(TERM_RED, "#..##..#", row + 5, col);
- c_put_str(TERM_RED, "#..##..#", row + 6, col);
- c_put_str(TERM_RED, " ## ## ", row + 7, col);
- prt(" Cherry ", row + 8, col);
-
- break;
- }
- }
-}
-
-
-/*
- * gamble_comm
- */
-static bool_ gamble_comm(int cmd)
-{
- int roll1, roll2, roll3, choice, odds, win;
-
- s32b wager;
-
- s32b maxbet;
-
- s32b oldgold;
-
- static const char *fruit[6] =
- {"Lemon", "Orange", "Sword", "Shield", "Plum", "Cherry"
- };
-
- char out_val[160], tmp_str[80], again;
-
- cptr p;
-
-
- screen_save();
-
- if (cmd == BACT_GAMBLE_RULES)
- {
- /* Peruse the gambling help file */
- (void)show_file("gambling.txt", NULL, 0, 0);
- }
- else
- {
- clear_bldg(5, 23);
-
- /* Set maximum bet */
- if (p_ptr->lev < 10)
- maxbet = (p_ptr->lev * 100);
- else
- maxbet = (p_ptr->lev * 1000);
-
- /* Get the wager */
- strcpy(out_val, "");
- strnfmt(tmp_str, 80, "Your wager (1-%ld) ? ", maxbet);
- get_string(tmp_str, out_val, 32);
-
- /* Strip spaces */
- for (p = out_val; *p == ' '; p++);
-
- wager = atol(p);
-
- if (wager > p_ptr->au)
- {
- msg_print("Hey! You don't have the gold - get out of here!");
- msg_print(NULL);
- screen_load();
- return (FALSE);
- }
- else if (wager > maxbet)
- {
- msg_format("I'll take $%ld of that. Keep the rest.", maxbet);
- wager = maxbet;
- }
- else if (wager < 1)
- {
- msg_print("Ok, we'll start with $1.");
-
- wager = 1;
- }
- msg_print(NULL);
- win = FALSE;
- odds = 0;
- oldgold = p_ptr->au;
-
- strnfmt(tmp_str, 80, "Gold before game: %9ld", oldgold);
- prt(tmp_str, 20, 2);
-
- strnfmt(tmp_str, 80, "Current Wager: %9ld", wager);
- prt(tmp_str, 21, 2);
-
- do
- {
- switch (cmd)
- {
- case BACT_IN_BETWEEN: /* Game of In-Between */
- {
- c_put_str(TERM_GREEN, "In Between", 5, 2);
- odds = 3;
- win = FALSE;
- roll1 = randint(10);
- roll2 = randint(10);
- choice = randint(10);
- strnfmt(tmp_str, 80, "Black die: %d Black Die: %d",
- roll1, roll2);
- prt(tmp_str, 8, 3);
- strnfmt(tmp_str, 80, "Red die: %d", choice);
- prt(tmp_str, 11, 14);
- if (((choice > roll1) && (choice < roll2)) ||
- ((choice < roll1) && (choice > roll2)))
- win = TRUE;
-
- break;
- }
- case BACT_CRAPS: /* Game of Craps */
- {
- c_put_str(TERM_GREEN, "Craps", 5, 2);
- win = 3;
- odds = 1;
- roll1 = randint(6);
- roll2 = randint(6);
- roll3 = roll1 + roll2;
- choice = roll3;
- strnfmt(tmp_str, 80, "First roll: %d %d Total: %d", roll1,
- roll2, roll3);
- prt(tmp_str, 7, 5);
- if ((roll3 == 7) || (roll3 == 11))
- win = TRUE;
- else if ((roll3 == 2) || (roll3 == 3) || (roll3 == 12))
- win = FALSE;
- else
- {
- do
- {
- msg_print("Hit any key to roll again");
- msg_print(NULL);
- roll1 = randint(6);
- roll2 = randint(6);
- roll3 = roll1 + roll2;
-
- strnfmt(tmp_str, 80, "Roll result: %d %d Total: %d",
- roll1, roll2, roll3);
- prt(tmp_str, 8, 5);
- if (roll3 == choice)
- win = TRUE;
- else if (roll3 == 7)
- win = FALSE;
- }
- while ((win != TRUE) && (win != FALSE));
- }
-
- break;
- }
-
- case BACT_SPIN_WHEEL: /* Spin the Wheel Game */
- {
- win = FALSE;
- odds = 10;
- c_put_str(TERM_GREEN, "Wheel", 5, 2);
- prt("0 1 2 3 4 5 6 7 8 9", 7, 5);
- prt("--------------------------------", 8, 3);
- strcpy(out_val, "");
- get_string ("Pick a number (1-9): ", out_val, 32);
- for (p = out_val; *p == ' '; p++);
- choice = atol(p);
- if (choice < 0)
- {
- msg_print("I'll put you down for 0.");
- choice = 0;
- }
- else if (choice > 9)
- {
- msg_print("Ok, I'll put you down for 9.");
- choice = 9;
- }
- msg_print(NULL);
- roll1 = randint(10) - 1;
- strnfmt(tmp_str, 80, "The wheel spins to a stop and the winner is %d",
- roll1);
- prt(tmp_str, 13, 3);
- prt("", 9, 0);
- prt("*", 9, (3 * roll1 + 5));
- if (roll1 == choice)
- win = TRUE;
-
- break;
- }
-
- case BACT_DICE_SLOTS: /* The Dice Slots */
- {
- c_put_str(TERM_GREEN, "Dice Slots", 5, 2);
- win = FALSE;
- roll1 = randint(6);
- roll2 = randint(6);
- choice = randint(6);
- strnfmt(tmp_str, 80, "%s %s %s",
- fruit[roll1 - 1], fruit[roll2 - 1],
- fruit[choice - 1]);
- prt(tmp_str, 15, 37);
- prt("/--------------------------\\", 7, 2);
- prt("\\--------------------------/", 17, 2);
- display_fruit(8, 3, roll1 - 1);
- display_fruit(8, 12, roll2 - 1);
- display_fruit(8, 21, choice - 1);
- if ((roll1 == roll2) && (roll2 == choice))
- {
- win = TRUE;
- if (roll1 == 1)
- odds = 4;
- else if (roll1 == 2)
- odds = 6;
- else
- odds = roll1 * roll1;
- }
- else if ((roll1 == 6) && (roll2 == 6))
- {
- win = TRUE;
- odds = choice + 1;
- }
-
- break;
- }
- }
-
- if (win)
- {
- prt("YOU WON", 16, 37);
- p_ptr->au = p_ptr->au + (odds * wager);
- strnfmt(tmp_str, 80, "Payoff: %d", odds);
- prt(tmp_str, 17, 37);
- }
- else
- {
- prt("You Lost", 16, 37);
- p_ptr->au = p_ptr->au - wager;
- prt("", 17, 37);
- }
- strnfmt(tmp_str, 80, "Current Gold: %9ld", p_ptr->au);
- prt(tmp_str, 22, 2);
- prt("Again(Y/N)?", 18, 37);
- move_cursor(18, 49);
- again = inkey();
- if (wager > p_ptr->au)
- {
- msg_print("Hey! You don't have the gold - get out of here!");
- msg_print(NULL);
- screen_load();
- return (FALSE);
- /* strnfmt(tmp_str, 80, "Current Wager: %9ld",wager);
- prt(tmp_str, 17, 2); */
- }
- }
- while ((again == 'y') || (again == 'Y'));
-
- prt("", 18, 37);
- if (p_ptr->au >= oldgold)
- msg_print("You came out a winner! We'll win next time, I'm sure.");
- else
- msg_print("You lost gold! Haha, better head home.");
- msg_print(NULL);
- }
-
- screen_load();
-
- return (TRUE);
-}
-
-
-/*
- * inn commands
- * Note that resting for the night was a perfect way to avoid player
- * ghosts in the town *if* you could only make it to the inn in time (-:
- * Now that the ghosts are temporarily disabled in 2.8.X, this function
- * will not be that useful. I will keep it in the hopes the player
- * ghost code does become a reality again. Does help to avoid filthy urchins.
- * Resting at night is also a quick way to restock stores -KMW-
- */
-static bool_ inn_comm(int cmd)
-{
- bool_ vampire;
-
-
- /* Extract race info */
- vampire = ((PRACE_FLAG(PR1_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire")));
-
- switch (cmd)
- {
- case BACT_FOOD: /* Buy food & drink */
- {
- if (!vampire)
- {
- msg_print("The barkeep gives you some gruel and a beer.");
- msg_print(NULL);
- (void) set_food(PY_FOOD_MAX - 1);
- }
- else
- msg_print("You're a vampire and I don't have any food for you!");
-
- break;
- }
-
- /*
- * I revamped this... Don't know why normal races didn't get
- * mana regenerated. It is the grand tradition of p&p games -- pelpel
- */
- case BACT_REST: /* Rest for the night */
- {
- bool_ nighttime;
-
- /* Extract the current time */
- nighttime = ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18));
-
- /* Normal races rest at night */
- if (!vampire && !nighttime)
- {
- msg_print("The rooms are available only at night.");
- msg_print(NULL);
- return (FALSE);
- }
-
- /* Vampires rest during daytime */
- if (vampire && nighttime)
- {
- msg_print("The rooms are available only during daylight for your kind.");
- msg_print(NULL);
- return (FALSE);
- }
-
- /* Must cure HP draining status first */
- if ((p_ptr->poisoned > 0) || (p_ptr->cut > 0))
- {
- msg_print("You need a healer, not a room.");
- msg_print(NULL);
- msg_print("Sorry, but I don't want anyone dying in here.");
- return (FALSE);
- }
-
- /* Let the time pass XXX XXX XXX */
- if (vampire)
- {
- /* Wait for sunset */
- while ((bst(HOUR, turn) >= 6) && (bst(HOUR, turn) < 18))
- {
- turn += (10L * MINUTE);
- }
- }
- else
- {
- /* Wait for sunrise */
- while ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18))
- {
- turn += (10L * MINUTE);
- }
- }
-
- /* Regen */
- p_ptr->chp = p_ptr->mhp;
- p_ptr->csp = p_ptr->msp;
-
- /* Restore status */
- set_blind(0);
- set_confused(0);
- p_ptr->stun = 0;
-
- /* Message */
- if (vampire) msg_print("You awake refreshed for the new night.");
- else msg_print("You awake refreshed for the new day.");
-
- /* Dungeon stuff */
- p_ptr->leaving = TRUE;
- p_ptr->oldpx = p_ptr->px;
- p_ptr->oldpy = p_ptr->py;
-
- /* Select new bounties. */
- select_bounties();
-
- break;
- }
-
- case BACT_RUMORS: /* Listen for rumors */
- {
- char rumor[80];
-
- get_rnd_line("rumors.txt", rumor);
- msg_format("%s", rumor);
- msg_print(NULL);
-
- break;
- }
- }
-
- return (TRUE);
-}
-
-
-/*
- * Display quest information
- */
-static void get_questinfo(int questnum)
-{
- int i;
-
-
- /* Print the quest info */
- prt(format("Quest Information (Danger level: %d)", quest[questnum].level), 5, 0);
-
- prt(quest[questnum].name, 7, 0);
-
- i = 0;
- while ((i < 10) && (quest[questnum].desc[i][0] != '\0'))
- {
- c_put_str(TERM_YELLOW, quest[questnum].desc[i], i + 8, 0);
- i++;
- }
-}
-
-
-/*
- * Request a quest from the Lord.
- */
-static bool_ castle_quest(int y, int x)
-{
- int plot = 0;
-
- quest_type *q_ptr;
-
-
- clear_bldg(7, 18);
-
- /* Current plot of the building */
- plot = cave[y][x].special;
-
- /* Is there a quest available at the building? */
- if ((!plot) || (plots[plot] == QUEST_NULL))
- {
- put_str("I don't have a quest for you at the moment.", 8, 0);
- return FALSE;
- }
-
- q_ptr = &quest[plots[plot]];
-
- /* Quest is completed */
- if (q_ptr->status == QUEST_STATUS_COMPLETED)
- {
- /* Rewarded quest */
- q_ptr->status = QUEST_STATUS_FINISHED;
-
- process_hooks(HOOK_QUEST_FINISH, "(d)", plots[plot]);
-
- return (TRUE);
- }
-
- /* Quest is still unfinished */
- else if (q_ptr->status == QUEST_STATUS_TAKEN)
- {
- put_str("You have not completed your current quest yet!", 8, 0);
- put_str("Use CTRL-Q to check the status of your quest.", 9, 0);
- put_str("Return when you have completed your quest.", 12, 0);
-
- return (FALSE);
- }
- /* Failed quest */
- else if (q_ptr->status == QUEST_STATUS_FAILED)
- {
- /* Mark quest as done (but failed) */
- q_ptr->status = QUEST_STATUS_FAILED_DONE;
-
- process_hooks(HOOK_QUEST_FAIL, "(d)", plots[plot]);
-
- return (FALSE);
- }
- /* No quest yet */
- else if (q_ptr->status == QUEST_STATUS_UNTAKEN)
- {
- if (process_hooks(HOOK_INIT_QUEST, "(d)", plots[plot])) return (FALSE);
-
- q_ptr->status = QUEST_STATUS_TAKEN;
-
- /* Assign a new quest */
- get_questinfo(plots[plot]);
-
- /* Add the hooks */
- if (quest[plots[plot]].type == HOOK_TYPE_C) quest[plots[plot]].init(plots[plot]);
-
- return (TRUE);
- }
-
- return FALSE;
-}
-
-/*
- * Displaying town history -KMW-
- */
-static void town_history(void)
-{
- /* Save screen */
- screen_save();
-
- /* Peruse the building help file */
- (void)show_file("bldg.txt", NULL, 0, 0);
-
- /* Load screen */
- screen_load();
-}
-
-
-/*
- * compare_weapon_aux2 -KMW-
- */
-static void compare_weapon_aux2(object_type *o_ptr, int numblows, int r, int c, int mult, char attr[80], u32b f1, u32b f2, u32b f3, byte color)
-{
- char tmp_str[80];
-
- c_put_str(color, attr, r, c);
- strnfmt(tmp_str, 80, "Attack: %d-%d damage",
- numblows * ((o_ptr->dd * mult) + o_ptr->to_d),
- numblows * ((o_ptr->ds * o_ptr->dd * mult) + o_ptr->to_d));
- put_str(tmp_str, r, c + 8);
- r++;
-}
-
-
-/*
- * compare_weapon_aux1 -KMW-
- */
-static void compare_weapon_aux1(object_type *o_ptr, int col, int r)
-{
- u32b f1, f2, f3, f4, f5, esp;
-
- object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-
-
- if (f1 & (TR1_SLAY_ANIMAL))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 2, "Animals:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_SLAY_EVIL))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 2, "Evil:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_SLAY_UNDEAD))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Undead:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_SLAY_DEMON))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Demons:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_SLAY_ORC))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Orcs:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_SLAY_TROLL))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Trolls:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_SLAY_GIANT))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Giants:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_SLAY_DRAGON))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Dragons:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_KILL_DRAGON))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 5, "Dragons:",
- f1, f2, f3, TERM_YELLOW);
- }
- if (f1 & (TR1_BRAND_ACID))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Acid:",
- f1, f2, f3, TERM_RED);
- }
- if (f1 & (TR1_BRAND_ELEC))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Elec:",
- f1, f2, f3, TERM_RED);
- }
- if (f1 & (TR1_BRAND_FIRE))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Fire:",
- f1, f2, f3, TERM_RED);
- }
- if (f1 & (TR1_BRAND_COLD))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Cold:",
- f1, f2, f3, TERM_RED);
- }
- if (f1 & (TR1_BRAND_POIS))
- {
- compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Poison:",
- f1, f2, f3, TERM_RED);
- }
-}
-
-
-/*
- * list_weapon -KMW-
- */
-static void list_weapon(object_type *o_ptr, int row, int col)
-{
- char o_name[80];
-
- char tmp_str[80];
-
-
- object_desc(o_name, o_ptr, TRUE, 0);
- c_put_str(TERM_YELLOW, o_name, row, col);
- strnfmt(tmp_str, 80, "To Hit: %d To Damage: %d", o_ptr->to_h, o_ptr->to_d);
- put_str(tmp_str, row + 1, col);
- strnfmt(tmp_str, 80, "Dice: %d Sides: %d", o_ptr->dd, o_ptr->ds);
- put_str(tmp_str, row + 2, col);
- strnfmt(tmp_str, 80, "Number of Blows: %d", p_ptr->num_blow);
- put_str(tmp_str, row + 3, col);
- c_put_str(TERM_YELLOW, "Possible Damage:", row + 5, col);
- strnfmt(tmp_str, 80, "One Strike: %d-%d damage", o_ptr->dd + o_ptr->to_d,
- (o_ptr->ds*o_ptr->dd) + o_ptr->to_d);
- put_str(tmp_str, row + 6, col + 1);
- strnfmt(tmp_str, 80, "One Attack: %d-%d damage", p_ptr->num_blow*(o_ptr->dd + o_ptr->to_d),
- p_ptr->num_blow*(o_ptr->ds*o_ptr->dd + o_ptr->to_d));
- put_str(tmp_str, row + 7, col + 1);
-}
-
-
-/*
- * Select melee weapons
- */
-static bool_ item_tester_hook_melee_weapon(object_type *o_ptr)
-{
- return (wield_slot(o_ptr) == INVEN_WIELD);
-}
-
-/*
- * compare_weapons -KMW-
- */
-static bool_ compare_weapons(void)
-{
- int item, item2, i;
-
- object_type *o1_ptr, *o2_ptr, *orig_ptr;
-
- object_type *i_ptr;
-
- cptr q, s;
-
-
- clear_bldg(6, 18);
-
- o1_ptr = NULL;
- o2_ptr = NULL;
- i_ptr = NULL;
-
- /* Store copy of original wielded weapon in pack slot */
- i_ptr = &p_ptr->inventory[INVEN_WIELD];
- orig_ptr = &p_ptr->inventory[INVEN_PACK];
- object_copy(orig_ptr, i_ptr);
-
- i = 6;
- /* Get first weapon */
- /* Restrict choices to meele weapons */
- item_tester_hook = item_tester_hook_melee_weapon;
-
- q = "What is your first melee weapon? ";
- s = "You have nothing to compare.";
- if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN)))
- {
- object_wipe(orig_ptr);
- return (FALSE);
- }
-
- /* Get the item (in the pack) */
- if (item >= 0)
- o1_ptr = &p_ptr->inventory[item];
-
- /* Get second weapon */
- /* Restrict choices to melee weapons */
- item_tester_hook = item_tester_hook_melee_weapon;
-
- q = "What is your second melee weapon? ";
- s = "You have nothing to compare.";
- if (!get_item(&item2, q, s, (USE_EQUIP | USE_INVEN)))
- {
- object_wipe(orig_ptr);
- return (FALSE);
- }
-
- /* Get the item (in the pack) */
- if (item2 >= 0) o2_ptr = &p_ptr->inventory[item2];
-
- put_str("Based on your current abilities, here is what your weapons will do", 4, 2);
-
- i_ptr = &p_ptr->inventory[INVEN_WIELD];
- object_copy(i_ptr, o1_ptr);
- calc_bonuses(TRUE);
-
- list_weapon(o1_ptr, i, 2);
- compare_weapon_aux1(o1_ptr, 2, i + 8);
-
- i_ptr = &p_ptr->inventory[INVEN_WIELD];
- if (item2 == INVEN_WIELD)
- object_copy(i_ptr, orig_ptr);
- else
- object_copy(i_ptr, o2_ptr);
- calc_bonuses(TRUE);
-
- list_weapon(o2_ptr, i, 40);
- compare_weapon_aux1(o2_ptr, 40, i + 8);
-
- i_ptr = &p_ptr->inventory[INVEN_WIELD];
- object_copy(i_ptr, orig_ptr);
- calc_bonuses(TRUE);
-
- object_wipe(orig_ptr);
-
- put_str("(Only highest damage applies per monster. Special damage not cumulative)", 20, 0);
-
- return (TRUE);
-}
-
-
-/*
- * general all-purpose fixing routine for items from building personnel
- * sharpen arrows, repair armor, repair weapon
- * -KMW-
- */
-static bool_ fix_item(int istart, int iend, int ispecific, bool_ iac,
- int ireward, bool_ set_reward)
-{
- int i;
-
- int j = 9;
-
- int maxenchant = (p_ptr->lev / 5);
-
- object_type *o_ptr;
-
- char out_val[80], tmp_str[80];
-
- bool_ repaired = FALSE;
-
- clear_bldg(5, 18);
- strnfmt(tmp_str, 80, " Based on your skill, we can improve up to +%d", maxenchant);
- prt(tmp_str, 5, 0);
- prt("Status", 7, 30);
-
- for (i = istart; i <= iend; i++)
- {
- o_ptr = &p_ptr->inventory[i];
- if (ispecific > 0)
- {
- if (o_ptr->tval != ispecific)
- continue;
- }
-
- if (o_ptr->tval)
- {
- object_desc(tmp_str, o_ptr, FALSE, 1);
-
- if ((o_ptr->name1 && (o_ptr->ident & 0x08)))
- strnfmt(out_val, 80, "%-40s: beyond our skills!", tmp_str);
- else if (o_ptr->name1)
- strnfmt(out_val, 80, "%-40s: in fine condition", tmp_str);
- else
- {
- if ((iac) && (o_ptr->to_a <= -3))
- {
- strnfmt(out_val, 80, "%-40s: beyond repair, buy a new one", tmp_str);
- }
- else if ((iac) && (o_ptr->to_a < maxenchant))
- {
- o_ptr->to_a++;
- strnfmt(out_val, 80, "%-40s: polished -> (%d)", tmp_str, o_ptr->to_a);
- repaired = TRUE;
- }
- else if ((!iac) && ((o_ptr->to_h <= -3) || (o_ptr->to_d <= -3)))
- {
- strnfmt(out_val, 80, "%-40s: beyond repair, buy a new one", tmp_str);
- }
- /* Sharpen a weapon */
- else if ((!iac) && ((o_ptr->to_h < maxenchant) ||
- (o_ptr->to_d < maxenchant)))
- {
- if (o_ptr->to_h < maxenchant)
- o_ptr->to_h++;
- if (o_ptr->to_d < maxenchant)
- o_ptr->to_d++;
- strnfmt(out_val, 80, "%-40s: sharpened -> (%d,%d)", tmp_str,
- o_ptr->to_h, o_ptr->to_d);
- repaired = TRUE;
- }
- else
- strnfmt(out_val, 80, "%-40s: in fine condition", tmp_str);
- }
- prt(out_val, j++, 0);
- }
- }
-
- if (!repaired)
- {
- msg_print("You don't have anything appropriate.");
- msg_print(NULL);
- }
- else
- {
- msg_print("Press the spacebar to continue");
- msg_print(NULL);
-
- /* Window stuff */
- p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
- p_ptr->update |= (PU_BONUS);
- }
- clear_bldg(5, 18);
-
- return (repaired);
-}
-
-
-/*
- * Research Item
- */
-static bool_ research_item(void)
-{
- clear_bldg(5, 18);
- return (identify_fully());
-}
-
-
-/*
- * Show the current quest monster.
- */
-static void show_quest_monster(void)
-{
- monster_race* r_ptr = &r_info[bounties[0][0]];
-
-
- msg_format("Quest monster: %s. "
- "Need to turn in %d corpse%s to receive reward.",
- r_name + r_ptr->name, bounties[0][1],
- (bounties[0][1] > 1 ? "s" : ""));
- msg_print(NULL);
-}
-
-
-/*
- * Show the current bounties.
- */
-static void show_bounties(void)
-{
- int i, j = 6;
-
- monster_race* r_ptr;
-
- char buff[80];
-
-
- clear_bldg(7, 18);
-
- c_prt(TERM_YELLOW, "Currently active bounties:", 4, 2);
-
- for (i = 1; i < MAX_BOUNTIES; i++, j++)
- {
- r_ptr = &r_info[bounties[i][0]];
-
- strnfmt(buff, 80, "%-30s (%d gp)", r_name + r_ptr->name, bounties[i][1]);
-
- prt(buff, j, 2);
-
- if (j >= 17)
- {
- msg_print("Press space for more.");
- msg_print(NULL);
-
- clear_bldg(7, 18);
- j = 5;
- }
- }
-}
-
-
-/*
- * Filter for corpses that currently have a bounty on them.
- */
-static bool_ item_tester_hook_bounty(object_type* o_ptr)
-{
- int i;
-
-
- if (o_ptr->tval == TV_CORPSE)
- {
- for (i = 1; i < MAX_BOUNTIES; i++)
- {
- if (bounties[i][0] == o_ptr->pval2) return (TRUE);
- }
- }
-
- return (FALSE);
-}
-
-/* Filter to match the quest monster's corpse. */
-static bool_ item_tester_hook_quest_monster(object_type* o_ptr)
-{
- if ((o_ptr->tval == TV_CORPSE) &&
- (o_ptr->pval2 == bounties[0][0])) return (TRUE);
- return (FALSE);
-}
-
-
-/*
- * Return the boost in the corpse's value depending on how rare the body
- * part is.
- */
-static int corpse_value_boost(int sval)
-{
- switch (sval)
- {
- case SV_CORPSE_HEAD:
- case SV_CORPSE_SKULL:
- {
- return (1);
- }
-
- /* Default to no boost. */
- default:
- {
- return (0);
- }
- }
-}
-
-/*
- * Sell a corpse, if there's currently a bounty on it.
- */
-static void sell_corpses(void)
-{
- object_type* o_ptr;
-
- int i, boost = 0;
-
- s16b value;
-
- int item;
-
-
- /* Set the hook. */
- item_tester_hook = item_tester_hook_bounty;
-
- /* Select a corpse to sell. */
- if (!get_item(&item, "Sell which corpse",
- "You have no corpses you can sell.", USE_INVEN)) return;
-
- o_ptr = &p_ptr->inventory[item];
-
- /* Exotic body parts are worth more. */
- boost = corpse_value_boost(o_ptr->sval);
-
- /* Try to find a match. */
- for (i = 1; i < MAX_BOUNTIES; i++)
- {
- if (o_ptr->pval2 == bounties[i][0])
- {
- value = bounties[i][1] + boost * (r_info[o_ptr->pval2].level);
-
- msg_format("Sold for %ld gold pieces.", value);
- msg_print(NULL);
- p_ptr->au += value;
-
- /* Increase the number of collected bounties */
- total_bounties++;
-
- inc_stack_size(item, -1);
-
- return;
- }
- }
-
- msg_print("Sorry, but that monster does not have a bounty on it.");
- msg_print(NULL);
-}
-
-
-
-/*
- * Hook for bounty monster selection.
- */
-static bool_ mon_hook_bounty(int r_idx)
-{
- monster_race* r_ptr = &r_info[r_idx];
-
-
- /* Reject uniques */
- if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
-
- /* Reject those who cannot leave anything */
- if (!(r_ptr->flags9 & RF9_DROP_CORPSE) &&
- !(r_ptr->flags9 & RF9_DROP_SKELETON)) return (FALSE);
-
- /* Reject pets */
- if (r_ptr->flags7 & RF7_PET) return (FALSE);
-
- /* Reject friendly creatures */
- if (r_ptr->flags7 & RF7_FRIENDLY) return (FALSE);
-
- /* The rest are acceptable */
- return (TRUE);
-}
-
-
-static void select_quest_monster(void)
-{
- monster_race* r_ptr;
-
- int amt;
-
-
- /*
- * Set up the hooks -- no bounties on uniques or monsters
- * with no corpses
- */
- get_mon_num_hook = mon_hook_bounty;
- get_mon_num_prep();
-
- /* Set up the quest monster. */
- bounties[0][0] = get_mon_num(p_ptr->lev);
-
- r_ptr = &r_info[bounties[0][0]];
-
- /*
- * Select the number of monsters needed to kill. Groups and
- * breeders require more
- */
- amt = randnor(5, 3);
-
- if (amt < 2) amt = 2;
-
- if (r_ptr->flags1 & RF1_FRIEND) amt *= 3; amt /= 2;
- if (r_ptr->flags1 & RF1_FRIENDS) amt *= 2;
- if (r_ptr->flags4 & RF4_MULTIPLY) amt *= 3;
-
- if (r_ptr->flags7 & RF7_AQUATIC) amt /= 2;
-
- bounties[0][1] = amt;
-
- /* Undo the filters */
- get_mon_num_hook = NULL;
- get_mon_num_prep();
-}
-
-
-
-/*
- * Sell a corpse for a reward.
- */
-static void sell_quest_monster(void)
-{
- object_type* o_ptr;
-
- int item;
-
-
- /* Set the hook. */
- item_tester_hook = item_tester_hook_quest_monster;
-
- /* Select a corpse to sell. */
- if (!get_item(&item, "Sell which corpse",
- "You have no corpses you can sell.", USE_INVEN)) return;
-
- o_ptr = &p_ptr->inventory[item];
-
- bounties[0][1] -= o_ptr->number;
-
- /* Completed the quest. */
- if (bounties[0][1] <= 0)
- {
- int m;
- monster_race *r_ptr;
-
- cmsg_print(TERM_YELLOW, "You have completed your quest!");
- msg_print(NULL);
-
- /* Give full knowledge */
-
- /* Hack -- Maximal info */
- r_ptr = &r_info[bounties[0][0]];
-
- msg_print(format("Well done! As a reward I'll teach you everything "
- "about the %s, (check your recall)",
- r_name + r_ptr->name));
-
- r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
-
- /* Observe "maximal" attacks */
- for (m = 0; m < 4; m++)
- {
- /* Examine "actual" blows */
- if (r_ptr->blow[m].effect || r_ptr->blow[m].method)
- {
- /* Hack -- maximal observations */
- r_ptr->r_blows[m] = MAX_UCHAR;
- }
- }
-
- /* Hack -- maximal drops */
- r_ptr->r_drop_gold = r_ptr->r_drop_item =
- (((r_ptr->flags1 & (RF1_DROP_4D2)) ? 8 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_3D2)) ? 6 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_2D2)) ? 4 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_1D2)) ? 2 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_90)) ? 1 : 0) +
- ((r_ptr->flags1 & (RF1_DROP_60)) ? 1 : 0));
-
- /* Hack -- but only "valid" drops */
- if (r_ptr->flags1 & (RF1_ONLY_GOLD)) r_ptr->r_drop_item = 0;
- if (r_ptr->flags1 & (RF1_ONLY_ITEM)) r_ptr->r_drop_gold = 0;
-
- /* Hack -- observe many spells */
- r_ptr->r_cast_inate = MAX_UCHAR;
- r_ptr->r_cast_spell = MAX_UCHAR;
-
- /* Hack -- know all the flags */
- r_ptr->r_flags1 = r_ptr->flags1;
- r_ptr->r_flags2 = r_ptr->flags2;
- r_ptr->r_flags3 = r_ptr->flags3;
- r_ptr->r_flags4 = r_ptr->flags4;
- r_ptr->r_flags5 = r_ptr->flags5;
- r_ptr->r_flags6 = r_ptr->flags6;
- r_ptr->r_flags4 = r_ptr->flags7;
- r_ptr->r_flags5 = r_ptr->flags8;
- r_ptr->r_flags6 = r_ptr->flags9;
-
- msg_print(NULL);
-
- select_quest_monster();
-
- }
- else
- {
- msg_format("Well done, only %d more to go.", bounties[0][1]);
- msg_print(NULL);
- }
-
- inc_stack_size(item, -1);
-}
-
-
-
-/*
- * Fill the bounty list with monsters.
- */
-void select_bounties(void)
-{
- int i, j;
-
-
- select_quest_monster();
-
- /*
- * Set up the hooks -- no bounties on uniques or monsters
- * with no corpses
- */
- get_mon_num_hook = mon_hook_bounty;
- get_mon_num_prep();
-
- for (i = 1; i < MAX_BOUNTIES; i++)
- {
- int lev = i * 5 + randnor(0, 2);
- monster_race* r_ptr;
- s16b r_idx;
- s16b val;
-
- if (lev < 1) lev = 1;
-
- if (lev >= MAX_DEPTH) lev = MAX_DEPTH - 1;
-
- /* We don't want to duplicate entries in the list */
- while (TRUE)
- {
- r_idx = get_mon_num(lev);
-
- for (j = 0; j < i; j++)
- {
- if (bounties[j][0] == r_idx) continue;
- }
-
- break;
- }
-
- bounties[i][0] = r_idx;
-
- r_ptr = &r_info[r_idx];
-
- val = r_ptr->mexp + r_ptr->level * 20 + randnor(0, r_ptr->level * 2);
-
- if (val < 1) val = 1;
-
- bounties[i][1] = val;
- }
-
- /* Undo the filters. */
- get_mon_num_hook = NULL;
- get_mon_num_prep();
-}
-
-/*
- * Execute a building command
- */
-bool_ bldg_process_command(store_type *s_ptr, int i)
-{
- store_action_type *ba_ptr = &ba_info[st_info[s_ptr->st_idx].actions[i]];
-
- int bact = ba_ptr->action;
-
- int bcost;
-
- bool_ paid = FALSE;
-
- bool_ set_reward = FALSE;
-
- bool_ recreate = FALSE;
-
-
- if (is_state(s_ptr, STORE_LIKED))
- {
- bcost = ba_ptr->costs[STORE_LIKED];
- }
- else if (is_state(s_ptr, STORE_HATED))
- {
- bcost = ba_ptr->costs[STORE_HATED];
- }
- else
- {
- bcost = ba_ptr->costs[STORE_NORMAL];
- }
-
- /* action restrictions */
- if (((ba_ptr->action_restr == 1) && (is_state(s_ptr, STORE_LIKED))) ||
- ((ba_ptr->action_restr == 2) && (!is_state(s_ptr, STORE_LIKED))))
- {
- msg_print("You have no right to choose that!");
- msg_print(NULL);
- return FALSE;
- }
-
- /* If player has loan and the time is out, few things work in stores */
- if (p_ptr->loan && !p_ptr->loan_time)
- {
- if ((bact != BACT_SELL) && (bact != BACT_VIEW_BOUNTIES) &&
- (bact != BACT_SELL_CORPSES) &&
- (bact != BACT_VIEW_QUEST_MON) &&
- (bact != BACT_SELL_QUEST_MON) &&
- (bact != BACT_EXAMINE) && (bact != BACT_STEAL) &&
- (bact != BACT_PAY_BACK_LOAN))
- {
- msg_print("You are not allowed to do that until you have paid back your loan.");
- msg_print(NULL);
- return FALSE;
- }
- }
-
- /* check gold */
- if (bcost > p_ptr->au)
- {
- msg_print("You do not have the gold!");
- msg_print(NULL);
- return FALSE;
- }
-
- if (!bcost) set_reward = TRUE;
-
- switch (bact)
- {
- case BACT_RESEARCH_ITEM:
- {
- paid = research_item();
- break;
- }
-
- case BACT_TOWN_HISTORY:
- {
- town_history();
- break;
- }
-
- case BACT_RACE_LEGENDS:
- {
- race_legends();
- break;
- }
-
- case BACT_QUEST1:
- case BACT_QUEST2:
- case BACT_QUEST3:
- case BACT_QUEST4:
- {
- int y = 1, x = 1;
- bool_ ok = FALSE;
-
- while ((x < cur_wid - 1) && !ok)
- {
- y = 1;
- while ((y < cur_hgt - 1) && !ok)
- {
- /* Found the location of the quest info ? */
- if (bact - BACT_QUEST1 + FEAT_QUEST1 == cave[y][x].feat)
- {
- /* Stop the loop */
- ok = TRUE;
- }
- y++;
- }
- x++;
- }
-
- if (ok)
- {
- recreate = castle_quest(y - 1, x - 1);
- ;
- }
- else
- {
- msg_format("ERROR: no quest info feature found: %d", bact - BACT_QUEST1 + FEAT_QUEST1);
- }
- break;
- }
-
- case BACT_KING_LEGENDS:
- case BACT_ARENA_LEGENDS:
- case BACT_LEGENDS:
- {
- show_highclass(building_loc);
- break;
- }
-
- case BACT_POSTER:
- case BACT_ARENA_RULES:
- case BACT_ARENA:
- {
- arena_comm(bact);
- break;
- }
-
- case BACT_IN_BETWEEN:
- case BACT_CRAPS:
- case BACT_SPIN_WHEEL:
- case BACT_DICE_SLOTS:
- case BACT_GAMBLE_RULES:
- {
- gamble_comm(bact);
- break;
- }
-
- case BACT_REST:
- case BACT_RUMORS:
- case BACT_FOOD:
- {
- paid = inn_comm(bact);
- break;
- }
-
- case BACT_RESEARCH_MONSTER:
- {
- paid = !research_mon();
- break;
- }
-
- case BACT_COMPARE_WEAPONS:
- {
- paid = compare_weapons();
- break;
- }
-
- case BACT_ENCHANT_WEAPON:
- {
- paid = fix_item(INVEN_WIELD, INVEN_WIELD, 0, FALSE,
- BACT_ENCHANT_WEAPON, set_reward);
- break;
- }
-
- case BACT_ENCHANT_ARMOR:
- {
- paid = fix_item(INVEN_BODY, INVEN_FEET, 0, TRUE,
- BACT_ENCHANT_ARMOR, set_reward);
- break;
- }
-
- /* needs work */
- case BACT_RECHARGE:
- {
- if (recharge(80)) paid = TRUE;
- break;
- }
-
- /* needs work */
- case BACT_IDENTS:
- {
- identify_pack();
- msg_print("Your possessions have been identified.");
- msg_print(NULL);
- paid = TRUE;
- break;
- }
-
- /* needs work */
- case BACT_STAR_HEAL:
- {
- hp_player(200);
- set_poisoned(0);
- set_blind(0);
- set_confused(0);
- set_cut(0);
- set_stun(0);
- if (p_ptr->black_breath)
- {
- msg_print("The hold of the Black Breath on you is broken!");
- p_ptr->black_breath = FALSE;
- }
- paid = TRUE;
- break;
- }
-
- /* needs work */
- case BACT_HEALING:
- {
- hp_player(200);
- set_poisoned(0);
- set_blind(0);
- set_confused(0);
- set_cut(0);
- set_stun(0);
- paid = TRUE;
- break;
- }
-
- /* needs work */
- case BACT_RESTORE:
- {
- if (do_res_stat(A_STR, TRUE)) paid = TRUE;
- if (do_res_stat(A_INT, TRUE)) paid = TRUE;
- if (do_res_stat(A_WIS, TRUE)) paid = TRUE;
- if (do_res_stat(A_DEX, TRUE)) paid = TRUE;
- if (do_res_stat(A_CON, TRUE)) paid = TRUE;
- if (do_res_stat(A_CHR, TRUE)) paid = TRUE;
- break;
- }
-
- case BACT_ENCHANT_ARROWS:
- {
- paid = fix_item(0, INVEN_WIELD, TV_ARROW, FALSE,
- BACT_ENCHANT_ARROWS, set_reward);
- break;
- }
-
- case BACT_ENCHANT_BOW:
- {
- paid = fix_item(INVEN_BOW, INVEN_BOW, TV_BOW, FALSE,
- BACT_ENCHANT_BOW, set_reward);
- break;
- }
-
- case BACT_RECALL:
- {
- p_ptr->word_recall = 1;
- msg_print("The air about you becomes charged...");
- paid = TRUE;
- break;
- }
-
- case BACT_TELEPORT_LEVEL:
- {
- if (reset_recall(FALSE))
- {
- p_ptr->word_recall = 1;
- msg_print("The air about you becomes charged...");
- paid = TRUE;
- }
- break;
- }
-
- case BACT_MIMIC_NORMAL:
- {
- set_mimic(0, 0, 0);
- paid = TRUE;
- break;
- }
-
- case BACT_VIEW_BOUNTIES:
- {
- show_bounties();
- break;
- }
-
- case BACT_VIEW_QUEST_MON:
- {
- show_quest_monster();
- break;
- }
-
- case BACT_SELL_QUEST_MON:
- {
- sell_quest_monster();
- break;
- }
-
- case BACT_SELL_CORPSES:
- {
- sell_corpses();
- break;
- }
-
- case BACT_DIVINATION:
- {
- int i, count = 0;
- bool_ something = FALSE;
-
- while (count < 1000)
- {
- count++;
- i = rand_int(MAX_FATES);
- if (!fates[i].fate) continue;
- if (fates[i].know) continue;
- msg_print("You know a little more of your fate.");
-
- fates[i].know = TRUE;
- something = TRUE;
- break;
- }
-
- if (!something) msg_print("Well, you have no fate, but I'll keep your money anyway!");
-
- paid = TRUE;
- break;
-
- }
-
- case BACT_BUY:
- {
- store_purchase();
- break;
- }
-
- case BACT_SELL:
- {
- store_sell();
- break;
- }
-
- case BACT_EXAMINE:
- {
- store_examine();
- break;
- }
-
- case BACT_STEAL:
- {
- store_stole();
- break;
- }
-
- case BACT_REQUEST_ITEM:
- {
- store_request_item();
- paid = TRUE;
- break;
- }
-
- case BACT_GET_LOAN:
- {
- s32b i, req;
- char prompt[80];
-
- if (p_ptr->loan)
- {
- msg_print("You already have a loan!");
- break;
- }
-
- req = p_ptr->au;
-
- for (i = 0; i < INVEN_TOTAL; i++)
- req += object_value_real(&p_ptr->inventory[i]);
-
- if (req > 100000) req = 100000;
- if ((req + p_ptr->au) > PY_MAX_GOLD) req = PY_MAX_GOLD - p_ptr->au;
-
- strnfmt(prompt, sizeof (prompt),
- "How much would you like to get (0-%ld) ?", req);
-
- req = get_quantity(prompt, req);
-
- if (req)
- {
- p_ptr->loan += req;
- p_ptr->au += req;
- p_ptr->loan_time += req;
-
- msg_format("You receive %i gold pieces", req);
-
- paid = TRUE;
- }
- else
- msg_format("You did not request any money!");
-
- break;
- }
-
- case BACT_PAY_BACK_LOAN:
- {
- s32b req;
- char prompt[80];
-
- if (p_ptr->loan)
- {
- msg_format("You have nothing to payback!");
- break;
- }
-
- msg_format("You have a loan of %i.", p_ptr->loan);
-
- req = ((p_ptr->loan + bcost) > p_ptr->au) ? p_ptr->au - bcost : p_ptr->loan;
-
- strnfmt(prompt, sizeof (prompt),
- "How much would you like to pay back (0-%ld) ?", req);
-
- req = get_quantity(prompt, req);
-
- p_ptr->loan -= req;
- p_ptr->au -= req;
-
- if (!p_ptr->loan) p_ptr->loan_time = 0;
-
- msg_format("You pay back %i gold pieces", req);
- paid = TRUE;
- break;
- }
-
- default:
- {
- if (process_hooks_ret(HOOK_BUILDING_ACTION, "dd", "(d)", bact))
- {
- paid = process_hooks_return[0].num;
- recreate = process_hooks_return[1].num;
- }
- break;
- }
- }
-
- if (paid)
- {
- p_ptr->au -= bcost;
-
- /* Display the current gold */
- store_prt_gold();
- }
-
- return (recreate);
-}
-
-
-/*
- * Enter quest level
- */
-void enter_quest(void)
-{
- if (!(cave[p_ptr->py][p_ptr->px].feat == FEAT_QUEST_ENTER))
- {
- msg_print("You see no quest level here.");
- return;
- }
- else
- {
- /* Player enters a new quest */
- p_ptr->oldpy = p_ptr->py;
- p_ptr->oldpx = p_ptr->px;
-
- leaving_quest = p_ptr->inside_quest;
-
- p_ptr->inside_quest = cave[p_ptr->py][p_ptr->px].special;
- dun_level = 1;
- p_ptr->leaving = TRUE;
- p_ptr->oldpx = p_ptr->px;
- p_ptr->oldpy = p_ptr->py;
- }
-}
-
-
-/*
- * Do building commands
- */
-void do_cmd_bldg(void)
-{
- int i, which, x = p_ptr->px, y = p_ptr->py;
-
- char command;
-
- bool_ validcmd;
-
- store_type *s_ptr;
-
- store_action_type *ba_ptr;
-
-
- if (cave[p_ptr->py][p_ptr->px].feat != FEAT_SHOP)
- {
- msg_print("You see no building here.");
- return;
- }
-
- which = cave[p_ptr->py][p_ptr->px].special;
- building_loc = which;
-
- s_ptr = &town_info[p_ptr->town_num].store[which];
-
- p_ptr->oldpy = p_ptr->py;
- p_ptr->oldpx = p_ptr->px;
-
- /* Forget the lite */
- /* forget_lite(); */
-
- /* Forget the view */
- forget_view();
-
- /* Hack -- Increase "icky" depth */
- character_icky++;
-
- command_arg = 0;
- command_rep = 0;
- command_new = 0;
-
- show_building(s_ptr);
- leave_bldg = FALSE;
-
- while (!leave_bldg)
- {
- validcmd = FALSE;
- prt("", 1, 0);
- command = inkey();
-
- if (command == ESCAPE)
- {
- leave_bldg = TRUE;
- p_ptr->inside_arena = FALSE;
- break;
- }
-
- for (i = 0; i < 6; i++)
- {
- ba_ptr = &ba_info[st_info->actions[i]];
-
- if (ba_ptr->letter)
- {
- if (ba_ptr->letter == command)
- {
- validcmd = TRUE;
- break;
- }
- }
- if (ba_ptr->letter_aux)
- {
- if (ba_ptr->letter_aux == command)
- {
- validcmd = TRUE;
- break;
- }
- }
- }
-
- if (validcmd)
- bldg_process_command(s_ptr, i);
-
- /* Notice stuff */
- notice_stuff();
-
- /* Handle stuff */
- handle_stuff();
- }
-
- /* Flush messages XXX XXX XXX */
- msg_print(NULL);
-
- /* Reinit wilderness to activate quests ... */
- wilderness_gen(TRUE);
- p_ptr->py = y;
- p_ptr->px = x;
-
- /* Hack -- Decrease "icky" depth */
- character_icky--;
-
- /* Clear the screen */
- Term_clear();
-
- /* Update the visuals */
- p_ptr->update |= (PU_VIEW | PU_MON_LITE | PU_MONSTERS | PU_BONUS);
-
- /* Redraw entire screen */
- p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP);
-
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
-}
-
-