X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fstore.c;h=b0e613896cd5216c380c5c365ef5fb99d21e3fdb;hb=8c269bce318e5179aa5c6586c406841e3ffcd877;hp=5ddff60eb696ef5bdf03bbc6b9749579234afcd4;hpb=0426d26655379e5f3d036b18756a3ba5f88234b5;p=hengband%2Fhengband.git diff --git a/src/store.c b/src/store.c index 5ddff60eb..b0e613896 100644 --- a/src/store.c +++ b/src/store.c @@ -1,25 +1,27 @@ /* File: store.c */ -/* Purpose: Store commands */ - /* - * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke + * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. + * This software may be copied and distributed for educational, research, + * and not for profit purposes provided that this copyright and statement + * are included in all such copies. Other copyrights may also apply. */ +/* Purpose: Store commands */ + #include "angband.h" +#define MIN_STOCK 12 -#ifdef JP -/* ²¼¤ÎÊý¤«¤é°ÜÆ°¤·¤Æ¤­¤Þ¤·¤¿ */ static int cur_store_num = 0; static int store_top = 0; +static int store_bottom = 0; +static int xtra_stock = 0; static store_type *st_ptr = NULL; -static owner_type *ot_ptr = NULL; -#endif +static const owner_type *ot_ptr = NULL; +static s16b old_town_num = 0; +static s16b inner_town_num = 0; #define RUMOR_CHANCE 8 #define MAX_COMMENT_1 6 @@ -304,16 +306,14 @@ static cptr comment_6[MAX_COMMENT_6] = */ static void say_comment_1(void) { - char rumour[1024]; - #ifdef JP - /* ¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤Î¤È¤­¤ÏÊ̤Υá¥Ã¥»¡¼¥¸¤ò½Ð¤¹ */ - if ( cur_store_num == STORE_BLACK ) { - msg_print(comment_1_B[randint0(MAX_COMMENT_1)]); - } - else{ - msg_print(comment_1[randint0(MAX_COMMENT_1)]); - } + /* ¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤Î¤È¤­¤ÏÊ̤Υá¥Ã¥»¡¼¥¸¤ò½Ð¤¹ */ + if ( cur_store_num == STORE_BLACK ) { + msg_print(comment_1_B[randint0(MAX_COMMENT_1)]); + } + else{ + msg_print(comment_1[randint0(MAX_COMMENT_1)]); + } #else msg_print(comment_1[randint0(MAX_COMMENT_1)]); #endif @@ -322,19 +322,11 @@ static void say_comment_1(void) if (one_in_(RUMOR_CHANCE)) { #ifdef JP -msg_print("Ź¼ç¤Ï¼ª¤¦¤Á¤·¤¿:"); + msg_print("Ź¼ç¤Ï¼ª¤¦¤Á¤·¤¿:"); #else msg_print("The shopkeeper whispers something into your ear:"); #endif - - -#ifdef JP -if (!get_rnd_line_jonly("rumors_j.txt", 0, rumour, 10)) -#else - if (!get_rnd_line("rumors.txt", 0, rumour)) -#endif - - msg_print(rumour); + display_rumor(TRUE); } } @@ -419,15 +411,15 @@ static void say_comment_3(s32b value, int annoyed) static void say_comment_4(void) { #ifdef JP - /* ¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤Î»þ¤ÏÊ̤Υá¥Ã¥»¡¼¥¸¤ò½Ð¤¹ */ - if ( cur_store_num == STORE_BLACK ){ - msg_print(comment_4a_B[randint0(MAX_COMMENT_4A)]); - msg_print(comment_4b_B[randint0(MAX_COMMENT_4B)]); - } - else{ - msg_print(comment_4a[randint0(MAX_COMMENT_4A)]); - msg_print(comment_4b[randint0(MAX_COMMENT_4B)]); - } + /* ¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤Î»þ¤ÏÊ̤Υá¥Ã¥»¡¼¥¸¤ò½Ð¤¹ */ + if ( cur_store_num == STORE_BLACK ){ + msg_print(comment_4a_B[randint0(MAX_COMMENT_4A)]); + msg_print(comment_4b_B[randint0(MAX_COMMENT_4B)]); + } + else{ + msg_print(comment_4a[randint0(MAX_COMMENT_4A)]); + msg_print(comment_4b[randint0(MAX_COMMENT_4B)]); + } #else msg_print(comment_4a[randint0(MAX_COMMENT_4A)]); msg_print(comment_4b[randint0(MAX_COMMENT_4B)]); @@ -442,13 +434,13 @@ static void say_comment_4(void) static void say_comment_5(void) { #ifdef JP - /* ¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤Î»þ¤ÏÊ̤Υá¥Ã¥»¡¼¥¸¤ò½Ð¤¹ */ - if ( cur_store_num == STORE_BLACK ){ - msg_print(comment_5_B[randint0(MAX_COMMENT_5)]); - } - else{ - msg_print(comment_5[randint0(MAX_COMMENT_5)]); - } + /* ¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤Î»þ¤ÏÊ̤Υá¥Ã¥»¡¼¥¸¤ò½Ð¤¹ */ + if ( cur_store_num == STORE_BLACK ){ + msg_print(comment_5_B[randint0(MAX_COMMENT_5)]); + } + else{ + msg_print(comment_5[randint0(MAX_COMMENT_5)]); + } #else msg_print(comment_5[randint0(MAX_COMMENT_5)]); #endif @@ -613,36 +605,10 @@ static void purchase_analyze(s32b price, s32b value, s32b guess) - - -#ifdef JP -/* ÆüËܸìÈǤξì¹ç¤Ï¾å¤ÎÊý¤Ë°ÜÆ°¤·¤Æ¤¢¤ê¤Þ¤¹ */ -#else -/* - * We store the current "store number" here so everyone can access it - */ -static int cur_store_num = 7; - /* - * We store the current "store page" here so everyone can access it + * We store the current "store feat" here so everyone can access it */ -static int store_top = 0; - -/* - * We store the current "store pointer" here so everyone can access it - */ -static store_type *st_ptr = NULL; - -/* - * We store the current "owner type" here so everyone can access it - */ -static owner_type *ot_ptr = NULL; -#endif - - - - - +static int cur_store_feat; /* @@ -654,7 +620,7 @@ static byte rgold_adj[MAX_RACES][MAX_RACES] = /*Hum, HfE, Elf, Hal, Gno, Dwa, HfO, HfT, Dun, HiE, Barbarian, HfOg, HGn, HTn, Cyc, Yek, Klc, Kbd, Nbl, DkE, Drc, Mind Flayer, Imp, Glm, Skl, Zombie, Vampire, Spectre, Fairy, Beastman, Ent, - Angel, Demon, Kuta*/ + Angel, Demon, Kutar */ /* Human */ { 100, 105, 105, 110, 113, 115, 120, 125, 100, 105, 100, @@ -866,7 +832,7 @@ static byte rgold_adj[MAX_RACES][MAX_RACES] = 110, 110, 112, 122, 110, 110, 110, 115, 110, 120, 120, 110, 101, 115, 110 }, - /* Kuta */ + /* Kutar */ { 110, 110, 105, 105, 110, 115, 115, 115, 110, 105, 110, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 125, 125, 125, 125, 105, 115, 105, 95, 140, @@ -934,6 +900,10 @@ static s32b price_item(object_type *o_ptr, int greed, bool flip) /* Mega-Hack -- Black market sucks */ if (cur_store_num == STORE_BLACK) price = price / 2; + + /* Compute the final price (with rounding) */ + /* Hack -- prevent underflow */ + price = (price * adjust + 50L) / 100L; } /* Shop is selling */ @@ -948,10 +918,11 @@ static s32b price_item(object_type *o_ptr, int greed, bool flip) /* Mega-Hack -- Black market sucks */ if (cur_store_num == STORE_BLACK) price = price * 2; - } - /* Compute the final price (with rounding) */ - price = (price * adjust + 50L) / 100L; + /* Compute the final price (with rounding) */ + /* Hack -- prevent overflow */ + price = (s32b)(((u32b)price * (u32b)adjust + 50UL) / 100UL); + } /* Note -- Never become "free" */ if (price <= 0L) return (1L); @@ -983,6 +954,7 @@ static void mass_produce(object_type *o_ptr) { if (cost <= 5L) size += damroll(3, 5); if (cost <= 20L) size += damroll(3, 5); + if (cost <= 50L) size += damroll(2, 2); break; } @@ -1003,10 +975,12 @@ static void mass_produce(object_type *o_ptr) case TV_DEATH_BOOK: case TV_TRUMP_BOOK: case TV_ARCANE_BOOK: - case TV_ENCHANT_BOOK: + case TV_CRAFT_BOOK: case TV_DAEMON_BOOK: + case TV_CRUSADE_BOOK: case TV_MUSIC_BOOK: case TV_HISSATSU_BOOK: + case TV_HEX_BOOK: { if (cost <= 50L) size += damroll(2, 3); if (cost <= 500L) size += damroll(1, 3); @@ -1027,7 +1001,8 @@ static void mass_produce(object_type *o_ptr) case TV_DIGGING: case TV_BOW: { - if (o_ptr->name2) break; + if (object_is_artifact(o_ptr)) break; + if (object_is_ego(o_ptr)) break; if (cost <= 10L) size += damroll(3, 5); if (cost <= 100L) size += damroll(3, 5); break; @@ -1073,12 +1048,6 @@ static void mass_produce(object_type *o_ptr) if (cost < 1601L) size += damroll(1, 5); else if (cost < 3201L) size += damroll(1, 3); } - - /* Ensure that mass-produced rods and wands get the correct pvals. */ - if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND)) - { - o_ptr->pval *= size; - } break; } } @@ -1126,6 +1095,12 @@ msg_print(" /* Save the total pile size */ o_ptr->number = size - (size * discount / 100); + + /* Ensure that mass-produced rods and wands get the correct pvals. */ + if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND)) + { + o_ptr->pval *= o_ptr->number; + } } @@ -1137,6 +1112,8 @@ msg_print(" */ static bool store_object_similar(object_type *o_ptr, object_type *j_ptr) { + int i; + /* Hack -- Identical items cannot be stacked */ if (o_ptr == j_ptr) return (0); @@ -1151,20 +1128,15 @@ static bool store_object_similar(object_type *o_ptr, object_type *j_ptr) if (o_ptr->to_d != j_ptr->to_d) return (0); if (o_ptr->to_a != j_ptr->to_a) return (0); - /* Require identical "artifact" names */ - if (o_ptr->name1 != j_ptr->name1) return (0); - /* Require identical "ego-item" names */ if (o_ptr->name2 != j_ptr->name2) return (0); - /* Random artifacts don't stack !*/ - if (o_ptr->art_name || j_ptr->art_name) return (0); + /* Artifacts don't stack! */ + if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return (0); /* Hack -- Identical art_flags! */ - if ((o_ptr->art_flags1 != j_ptr->art_flags1) || - (o_ptr->art_flags2 != j_ptr->art_flags2) || - (o_ptr->art_flags3 != j_ptr->art_flags3)) - return (0); + for (i = 0; i < TR_FLAG_SIZE; i++) + if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return (0); /* Hack -- Never stack "powerful" items */ if (o_ptr->xtra1 || j_ptr->xtra1) return (0); @@ -1195,21 +1167,24 @@ static bool store_object_similar(object_type *o_ptr, object_type *j_ptr) */ static void store_object_absorb(object_type *o_ptr, object_type *j_ptr) { + int max_num = (o_ptr->tval == TV_ROD) ? + MIN(99, MAX_SHORT / k_info[o_ptr->k_idx].pval) : 99; int total = o_ptr->number + j_ptr->number; + int diff = (total > max_num) ? total - max_num : 0; /* Combine quantity, lose excess items */ - o_ptr->number = (total > 99) ? 99 : total; + o_ptr->number = (total > max_num) ? max_num : total; /* Hack -- if rods are stacking, add the pvals (maximum timeouts) together. -LM- */ if (o_ptr->tval == TV_ROD) { - o_ptr->pval += j_ptr->pval; + o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number; } /* Hack -- if wands are stacking, combine the charges. -LM- */ if (o_ptr->tval == TV_WAND) { - o_ptr->pval += j_ptr->pval; + o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number; } } @@ -1232,6 +1207,15 @@ static int store_check_num(object_type *o_ptr) /* The "home" acts like the player */ if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM)) { + bool old_stack_force_notes = stack_force_notes; + bool old_stack_force_costs = stack_force_costs; + + if (cur_store_num != STORE_HOME) + { + stack_force_notes = FALSE; + stack_force_costs = FALSE; + } + /* Check all the items */ for (i = 0; i < st_ptr->stock_num; i++) { @@ -1239,7 +1223,22 @@ static int store_check_num(object_type *o_ptr) j_ptr = &st_ptr->stock[i]; /* Can the new object be combined with the old one? */ - if (object_similar(j_ptr, o_ptr)) return -1; + if (object_similar(j_ptr, o_ptr)) + { + if (cur_store_num != STORE_HOME) + { + stack_force_notes = old_stack_force_notes; + stack_force_costs = old_stack_force_costs; + } + + return -1; + } + } + + if (cur_store_num != STORE_HOME) + { + stack_force_notes = old_stack_force_notes; + stack_force_costs = old_stack_force_costs; } } @@ -1280,9 +1279,9 @@ static int store_check_num(object_type *o_ptr) static bool is_blessed(object_type *o_ptr) { - u32b f1, f2, f3; - object_flags(o_ptr, &f1, &f2, &f3); - if (f3 & TR3_BLESSED) return (TRUE); + u32b flgs[TR_FLAG_SIZE]; + object_flags(o_ptr, flgs); + if (have_flag(flgs, TR_BLESSED)) return (TRUE); else return (FALSE); } @@ -1307,6 +1306,9 @@ static bool store_will_buy(object_type *o_ptr) /* Analyze the type */ switch (o_ptr->tval) { + case TV_POTION: + if (o_ptr->sval != SV_POTION_WATER) return FALSE; + case TV_WHISTLE: case TV_FOOD: case TV_LITE: @@ -1384,6 +1386,7 @@ static bool store_will_buy(object_type *o_ptr) switch (o_ptr->tval) { case TV_LIFE_BOOK: + case TV_CRUSADE_BOOK: case TV_SCROLL: case TV_POTION: case TV_HAFTED: @@ -1405,7 +1408,7 @@ static bool store_will_buy(object_type *o_ptr) if (r_ptr->flags3 & RF3_ANIMAL) break; /* Accept mimics */ - if (strchr("?!", r_ptr->d_char)) break; + if (my_strchr("?!", r_ptr->d_char)) break; } } case TV_POLEARM: @@ -1446,9 +1449,10 @@ static bool store_will_buy(object_type *o_ptr) case TV_DEATH_BOOK: case TV_TRUMP_BOOK: case TV_ARCANE_BOOK: - case TV_ENCHANT_BOOK: + case TV_CRAFT_BOOK: case TV_DAEMON_BOOK: case TV_MUSIC_BOOK: + case TV_HEX_BOOK: case TV_AMULET: case TV_RING: case TV_STAFF: @@ -1481,9 +1485,11 @@ static bool store_will_buy(object_type *o_ptr) case TV_LIFE_BOOK: case TV_TRUMP_BOOK: case TV_ARCANE_BOOK: - case TV_ENCHANT_BOOK: + case TV_CRAFT_BOOK: case TV_DAEMON_BOOK: + case TV_CRUSADE_BOOK: case TV_MUSIC_BOOK: + case TV_HEX_BOOK: break; default: return (FALSE); @@ -1500,6 +1506,165 @@ static bool store_will_buy(object_type *o_ptr) } +/* + * Combine and reorder items in the home + */ +bool combine_and_reorder_home(int store_num) +{ + int i, j, k; + s32b o_value; + object_type forge, *o_ptr, *j_ptr; + bool flag = FALSE, combined; + store_type *old_st_ptr = st_ptr; + bool old_stack_force_notes = stack_force_notes; + bool old_stack_force_costs = stack_force_costs; + + st_ptr = &town[1].store[store_num]; + if (store_num != STORE_HOME) + { + stack_force_notes = FALSE; + stack_force_costs = FALSE; + } + + do + { + combined = FALSE; + + /* Combine the items in the home (backwards) */ + for (i = st_ptr->stock_num - 1; i > 0; i--) + { + /* Get the item */ + o_ptr = &st_ptr->stock[i]; + + /* Skip empty items */ + if (!o_ptr->k_idx) continue; + + /* Scan the items above that item */ + for (j = 0; j < i; j++) + { + int max_num; + + /* Get the item */ + j_ptr = &st_ptr->stock[j]; + + /* Skip empty items */ + if (!j_ptr->k_idx) continue; + + /* + * Get maximum number of the stack if these + * are similar, get zero otherwise. + */ + max_num = object_similar_part(j_ptr, o_ptr); + + /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */ + if (max_num && j_ptr->number < max_num) + { + if (o_ptr->number + j_ptr->number <= max_num) + { + /* Add together the item counts */ + object_absorb(j_ptr, o_ptr); + + /* One object is gone */ + st_ptr->stock_num--; + + /* Slide everything down */ + for (k = i; k < st_ptr->stock_num; k++) + { + /* Structure copy */ + st_ptr->stock[k] = st_ptr->stock[k + 1]; + } + + /* Erase the "final" slot */ + object_wipe(&st_ptr->stock[k]); + } + else + { + int old_num = o_ptr->number; + int remain = j_ptr->number + o_ptr->number - max_num; + + /* Add together the item counts */ + object_absorb(j_ptr, o_ptr); + + o_ptr->number = remain; + + /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */ + if (o_ptr->tval == TV_ROD) + { + o_ptr->pval = o_ptr->pval * remain / old_num; + o_ptr->timeout = o_ptr->timeout * remain / old_num; + } + + /* Hack -- if wands are stacking, combine the charges. -LM- */ + else if (o_ptr->tval == TV_WAND) + { + o_ptr->pval = o_ptr->pval * remain / old_num; + } + } + + /* Take note */ + combined = TRUE; + + /* Done */ + break; + } + } + } + + flag |= combined; + } + while (combined); + + /* Re-order the items in the home (forwards) */ + for (i = 0; i < st_ptr->stock_num; i++) + { + /* Get the item */ + o_ptr = &st_ptr->stock[i]; + + /* Skip empty slots */ + if (!o_ptr->k_idx) continue; + + /* Get the "value" of the item */ + o_value = object_value(o_ptr); + + /* Scan every occupied slot */ + for (j = 0; j < st_ptr->stock_num; j++) + { + if (object_sort_comp(o_ptr, o_value, &st_ptr->stock[j])) break; + } + + /* Never move down */ + if (j >= i) continue; + + /* Take note */ + flag = TRUE; + + /* Get local object */ + j_ptr = &forge; + + /* Save a copy of the moving item */ + object_copy(j_ptr, &st_ptr->stock[i]); + + /* Slide the objects */ + for (k = i; k > j; k--) + { + /* Slide the item */ + object_copy(&st_ptr->stock[k], &st_ptr->stock[k - 1]); + } + + /* Insert the moving item */ + object_copy(&st_ptr->stock[j], j_ptr); + } + + st_ptr = old_st_ptr; + if (store_num != STORE_HOME) + { + stack_force_notes = old_stack_force_notes; + stack_force_costs = old_stack_force_costs; + } + + return flag; +} + /* * Add the item "o_ptr" to the inventory of the "Home" @@ -1514,10 +1679,17 @@ static bool store_will_buy(object_type *o_ptr) static int home_carry(object_type *o_ptr) { int slot; - s32b value, j_value; + s32b value; int i; object_type *j_ptr; + bool old_stack_force_notes = stack_force_notes; + bool old_stack_force_costs = stack_force_costs; + if (cur_store_num != STORE_HOME) + { + stack_force_notes = FALSE; + stack_force_costs = FALSE; + } /* Check each existing item (try to combine) */ for (slot = 0; slot < st_ptr->stock_num; slot++) @@ -1531,18 +1703,30 @@ static int home_carry(object_type *o_ptr) /* Save the new number of items */ object_absorb(j_ptr, o_ptr); + if (cur_store_num != STORE_HOME) + { + stack_force_notes = old_stack_force_notes; + stack_force_costs = old_stack_force_costs; + } + /* All done */ return (slot); } } + if (cur_store_num != STORE_HOME) + { + stack_force_notes = old_stack_force_notes; + stack_force_costs = old_stack_force_costs; + } + /* No space? */ /* * ±£¤·µ¡Ç½: ¥ª¥×¥·¥ç¥ó powerup_home ¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¤È * ²æ¤¬²È¤¬ 20 ¥Ú¡¼¥¸¤Þ¤Ç»È¤¨¤ë */ /* No space? */ - if ( powerup_home == TRUE) { + if ((cur_store_num != STORE_HOME) || (powerup_home == TRUE)) { if (st_ptr->stock_num >= st_ptr->stock_size) { return (-1); } @@ -1560,50 +1744,7 @@ static int home_carry(object_type *o_ptr) /* Check existing slots to see if we must "slide" */ for (slot = 0; slot < st_ptr->stock_num; slot++) { - /* Get that item */ - j_ptr = &st_ptr->stock[slot]; - - /* Hack -- readable books always come first */ - if ((o_ptr->tval == mp_ptr->spell_book) && - (j_ptr->tval != mp_ptr->spell_book)) break; - if ((j_ptr->tval == mp_ptr->spell_book) && - (o_ptr->tval != mp_ptr->spell_book)) continue; - - /* Objects sort by decreasing type */ - if (o_ptr->tval > j_ptr->tval) break; - if (o_ptr->tval < j_ptr->tval) continue; - - /* Can happen in the home */ - if (!object_aware_p(o_ptr)) continue; - if (!object_aware_p(j_ptr)) break; - - /* Objects sort by increasing sval */ - if (o_ptr->sval < j_ptr->sval) break; - if (o_ptr->sval > j_ptr->sval) continue; - - /* Objects in the home can be unknown */ - if (!object_known_p(o_ptr)) continue; - if (!object_known_p(j_ptr)) break; - - /* - * Hack: otherwise identical rods sort by - * increasing recharge time --dsb - */ - if (o_ptr->tval == TV_ROD) - { - if (o_ptr->pval < j_ptr->pval) break; - if (o_ptr->pval > j_ptr->pval) continue; - } - if ((o_ptr->tval == TV_CORPSE) || (o_ptr->tval == TV_FIGURINE) || (o_ptr->tval == TV_STATUE)) - { - if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) break; - if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) break; - } - - /* Objects sort by decreasing value */ - j_value = object_value(j_ptr); - if (value > j_value) break; - if (value < j_value) continue; + if (object_sort_comp(o_ptr, value, &st_ptr->stock[slot])) break; } /* Slide the others up */ @@ -1620,6 +1761,8 @@ static int home_carry(object_type *o_ptr) chg_virtue(V_SACRIFICE, -1); + (void)combine_and_reorder_home(cur_store_num); + /* Return the location */ return (slot); } @@ -1793,7 +1936,7 @@ static bool black_market_crap(object_type *o_ptr) int i, j; /* Ego items are never crap */ - if (o_ptr->name2) return (FALSE); + if (object_is_ego(o_ptr)) return (FALSE); /* Good items are never crap */ if (o_ptr->to_a > 0) return (FALSE); @@ -1910,7 +2053,7 @@ static void store_create(void) object_prep(q_ptr, i); /* Apply some "low-level" magic (no artifacts) */ - apply_magic(q_ptr, level, FALSE, FALSE, FALSE, FALSE); + apply_magic(q_ptr, level, AM_NO_FIXED_ART); /* Require valid object */ if (!store_will_buy(q_ptr)) continue; @@ -1927,7 +2070,7 @@ static void store_create(void) object_known(q_ptr); /* Mark it storebought */ - q_ptr->ident |= IDENT_STOREB; + q_ptr->ident |= IDENT_STORE; /* Mega-Hack -- no chests in stores */ if (q_ptr->tval == TV_CHEST) continue; @@ -2041,10 +2184,10 @@ static void display_entry(int pos) o_ptr = &st_ptr->stock[pos]; /* Get the "offset" */ - i = (pos % 12); + i = (pos % store_bottom); /* Label it, clear the line --(-- */ - (void)sprintf(out_val, "%c) ", I2A(i)); + (void)sprintf(out_val, "%c) ", ((i > 25) ? toupper(I2A(i - 26)) : I2A(i))); prt(out_val, i+6, 0); cur_col = 3; @@ -2058,13 +2201,9 @@ static void display_entry(int pos) a |= 0x40; #endif - Term_draw(cur_col, i + 6, a, c); - if (use_bigtile) - { - cur_col++; - if (a & 0x80) - Term_draw(cur_col, i + 6, 255, 255); - } + Term_queue_bigchar(cur_col, i + 6, a, c, 0, 0); + if (use_bigtile) cur_col++; + cur_col += 2; } @@ -2077,7 +2216,7 @@ static void display_entry(int pos) if (show_weights) maxwid -= 10; /* Describe the object */ - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); o_name[maxwid] = '\0'; c_put_str(tval_to_attr[o_ptr->tval], o_name, i+6, cur_col); @@ -2087,8 +2226,8 @@ static void display_entry(int pos) /* Only show the weight of an individual item */ int wgt = o_ptr->weight; #ifdef JP - sprintf(out_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt) ); - put_str(out_val, i+6, 67); + sprintf(out_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt) ); + put_str(out_val, i+6, 67); #else (void)sprintf(out_val, "%3d.%d lb", wgt / 10, wgt % 10); put_str(out_val, i+6, 68); @@ -2107,7 +2246,7 @@ static void display_entry(int pos) if (show_weights) maxwid -= 7; /* Describe the object (fully) */ - object_desc_store(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); o_name[maxwid] = '\0'; c_put_str(tval_to_attr[o_ptr->tval], o_name, i+6, cur_col); @@ -2117,8 +2256,8 @@ static void display_entry(int pos) /* Only show the weight of an individual item */ int wgt = o_ptr->weight; #ifdef JP - sprintf(out_val, "%3d.%1d", lbtokg1(wgt) , lbtokg2(wgt) ); - put_str(out_val, i+6, 60); + sprintf(out_val, "%3d.%1d", lbtokg1(wgt) , lbtokg2(wgt) ); + put_str(out_val, i+6, 60); #else (void)sprintf(out_val, "%3d.%d", wgt / 10, wgt % 10); put_str(out_val, i+6, 61); @@ -2179,7 +2318,7 @@ static void display_inventory(void) int i, k; /* Display the next 12 items */ - for (k = 0; k < 12; k++) + for (k = 0; k < store_bottom; k++) { /* Do not display "dead" items */ if (store_top + k >= st_ptr->stock_num) break; @@ -2189,7 +2328,7 @@ static void display_inventory(void) } /* Erase the extra lines and the "more" prompt */ - for (i = k; i < 13; i++) prt("", i + 6, 0); + for (i = k; i < store_bottom + 1; i++) prt("", i + 6, 0); /* Assume "no current page" */ #ifdef JP @@ -2200,7 +2339,7 @@ static void display_inventory(void) /* Visual reminder of "more items" */ - if (st_ptr->stock_num > 12) + if (st_ptr->stock_num > store_bottom) { /* Show "more" reminder (after the last item) */ #ifdef JP @@ -2211,13 +2350,26 @@ static void display_inventory(void) /* Indicate the "current page" */ + /* Trailing spaces are to display (Page xx) and (Page x) */ #ifdef JP - put_str(format("(%d¥Ú¡¼¥¸)", store_top/12 + 1), 5, 20); + put_str(format("(%d¥Ú¡¼¥¸) ", store_top/store_bottom + 1), 5, 20); #else - put_str(format("(Page %d)", store_top/12 + 1), 5, 20); + put_str(format("(Page %d) ", store_top/store_bottom + 1), 5, 20); #endif } + + if (cur_store_num == STORE_HOME || cur_store_num == STORE_MUSEUM) + { + k = st_ptr->stock_size; + + if (cur_store_num == STORE_HOME && !powerup_home) k /= 10; +#ifdef JP + put_str(format("¥¢¥¤¥Æ¥à¿ô: %4d/%4d", st_ptr->stock_num, k), 19 + xtra_stock, 27); +#else + put_str(format("Objects: %4d/%4d", st_ptr->stock_num, k), 19 + xtra_stock, 30); +#endif + } } @@ -2229,14 +2381,14 @@ static void store_prt_gold(void) char out_val[64]; #ifdef JP - prt("¼ê»ý¤Á¤Î¤ª¶â: ", 19, 53); + prt("¼ê»ý¤Á¤Î¤ª¶â: ", 19 + xtra_stock, 53); #else - prt("Gold Remaining: ", 19, 53); + prt("Gold Remaining: ", 19 + xtra_stock, 53); #endif sprintf(out_val, "%9ld", (long)p_ptr->au); - prt(out_val, 19, 68); + prt(out_val, 19 + xtra_stock, 68); } @@ -2316,7 +2468,7 @@ static void display_store(void) /* Normal stores */ else { - cptr store_name = (f_name + f_info[FEAT_SHOP_HEAD + cur_store_num].name); + cptr store_name = (f_name + f_info[cur_store_feat].name); cptr owner_name = (ot_ptr->owner_name); cptr race_name = race_info[ot_ptr->owner_race].title; @@ -2371,8 +2523,8 @@ static void display_store(void) static int get_stock(int *com_val, cptr pmt, int i, int j) { char command; - char out_val[160]; + char lo, hi; #ifdef ALLOW_REPEAT /* TNB */ @@ -2397,13 +2549,15 @@ static int get_stock(int *com_val, cptr pmt, int i, int j) *com_val = (-1); /* Build the prompt */ + lo = I2A(i); + hi = (j > 25) ? toupper(I2A(j - 26)) : I2A(j); #ifdef JP - (void)sprintf(out_val, "(%s:%c-%c, ESC¤ÇÃæÃÇ) %s", - (((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM)) ? "¥¢¥¤¥Æ¥à" : "¾¦ÉÊ"), - I2A(i), I2A(j), pmt); + (void)sprintf(out_val, "(%s:%c-%c, ESC¤ÇÃæÃÇ) %s", + (((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM)) ? "¥¢¥¤¥Æ¥à" : "¾¦ÉÊ"), + lo, hi, pmt); #else (void)sprintf(out_val, "(Items %c-%c, ESC to exit) %s", - I2A(i), I2A(j), pmt); + lo, hi, pmt); #endif @@ -2416,7 +2570,12 @@ static int get_stock(int *com_val, cptr pmt, int i, int j) if (!get_com(out_val, &command, FALSE)) break; /* Convert */ - k = (islower(command) ? A2I(command) : -1); + if (islower(command)) + k = A2I(command); + else if (isupper(command)) + k = A2I(tolower(command)) + 26; + else + k = -1; /* Legal responses */ if ((k >= i) && (k <= j)) @@ -2578,11 +2737,25 @@ static int get_haggle(cptr pmt, s32b *poffer, s32b price, int final) /* Ask until done */ while (TRUE) { + bool res; + + /* Display prompt */ + prt(buf, 0, 0); + /* Default */ strcpy(out_val, ""); - /* Ask the user for a response */ - if (!get_string(buf, out_val, 32)) return (FALSE); + /* + * Ask the user for a response. + * Don't allow to use numpad as cursor key. + */ + res = askfor_aux(out_val, 32, FALSE); + + /* Clear prompt */ + prt("", 0, 0); + + /* Cancelled */ + if (!res) return FALSE; /* Skip leading spaces */ for (p = out_val; *p == ' '; p++) /* loop */; @@ -2656,8 +2829,8 @@ static int get_haggle(cptr pmt, s32b *poffer, s32b price, int final) * Return TRUE if offer is NOT okay */ static bool receive_offer(cptr pmt, s32b *poffer, - s32b last_offer, int factor, - s32b price, int final) + s32b last_offer, int factor, + s32b price, int final) { /* Haggle till done */ while (TRUE) @@ -2797,7 +2970,7 @@ static bool purchase_haggle(object_type *o_ptr, s32b *price) cancel = receive_offer("What do you offer? ", #endif - &offer, last_offer, 1, cur_ask, final); + &offer, last_offer, 1, cur_ask, final); if (cancel) { @@ -2934,6 +3107,12 @@ static bool sell_haggle(object_type *o_ptr, s32b *price) /* No need to haggle */ if (noneed || !manual_haggle || (final_ask >= purse)) { + /* Apply Sales Tax (if needed) */ + if (!manual_haggle && !noneed) + { + final_ask -= final_ask / 10; + } + /* No reason to haggle */ if (final_ask >= purse) { @@ -2974,9 +3153,6 @@ static bool sell_haggle(object_type *o_ptr, s32b *price) #endif msg_print(NULL); - - /* Apply Sales Tax */ - final_ask -= final_ask / 10; } /* Final price */ @@ -3110,7 +3286,7 @@ static bool sell_haggle(object_type *o_ptr, s32b *price) prt("", 1, 0); (void)sprintf(out_val, #ifdef JP - "Á°²ó¤ÎÄ󼨲Á³Ê $%ld", (long)last_offer); + "Á°²ó¤ÎÄ󼨲Á³Ê $%ld", (long)last_offer); #else "Your last bid %ld", (long)last_offer); #endif @@ -3151,7 +3327,6 @@ static void store_purchase(void) char out_val[160]; - if (cur_store_num == STORE_MUSEUM) { #ifdef JP @@ -3187,22 +3362,22 @@ static void store_purchase(void) i = (st_ptr->stock_num - store_top); /* And then restrict it to the current page */ - if (i > 12) i = 12; + if (i > store_bottom) i = store_bottom; /* Prompt */ #ifdef JP - /* ¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤Î»þ¤ÏÊ̤Υá¥Ã¥»¡¼¥¸ */ - switch( cur_store_num ) { - case 7: - sprintf(out_val, "¤É¤Î¥¢¥¤¥Æ¥à¤ò¼è¤ê¤Þ¤¹¤«? "); - break; - case 6: - sprintf(out_val, "¤É¤ì? "); - break; - default: - sprintf(out_val, "¤É¤ÎÉÊʪ¤¬Íߤ·¤¤¤ó¤À¤¤? "); - break; - } + /* ¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤Î»þ¤ÏÊ̤Υá¥Ã¥»¡¼¥¸ */ + switch( cur_store_num ) { + case 7: + sprintf(out_val, "¤É¤Î¥¢¥¤¥Æ¥à¤ò¼è¤ê¤Þ¤¹¤«? "); + break; + case 6: + sprintf(out_val, "¤É¤ì? "); + break; + default: + sprintf(out_val, "¤É¤ÎÉÊʪ¤¬Íߤ·¤¤¤ó¤À¤¤? "); + break; + } #else if (cur_store_num == STORE_HOME) { @@ -3323,7 +3498,7 @@ msg_format(" else { /* Describe the object (fully) */ - object_desc_store(o_name, j_ptr, TRUE, 3); + object_desc(o_name, j_ptr, 0); /* Message */ #ifdef JP @@ -3377,7 +3552,7 @@ msg_format("%s(%c) j_ptr->ident &= ~(IDENT_FIXED); /* Describe the transaction */ - object_desc(o_name, j_ptr, TRUE, 3); + object_desc(o_name, j_ptr, 0); /* Message */ #ifdef JP @@ -3390,7 +3565,7 @@ msg_format("%s record_turn = turn; if (record_buy) do_cmd_write_nikki(NIKKI_BUY, 0, o_name); - object_desc(o_name, o_ptr, TRUE, 0); + object_desc(o_name, o_ptr, OD_NAME_ONLY); if(record_rand_art && o_ptr->art_name) do_cmd_write_nikki(NIKKI_ART, 0, o_name); @@ -3399,12 +3574,12 @@ msg_format("%s /* Erase the "feeling" */ j_ptr->feeling = FEEL_NONE; - j_ptr->ident &= ~(IDENT_STOREB); + j_ptr->ident &= ~(IDENT_STORE); /* Give it to the player */ item_new = inven_carry(j_ptr); /* Describe the final result */ - object_desc(o_name, &inventory[item_new], TRUE, 3); + object_desc(o_name, &inventory[item_new], 0); /* Message */ #ifdef JP @@ -3414,6 +3589,8 @@ msg_format("%s o_name, index_to_label(item_new)); #endif + /* Auto-inscription */ + autopick_alter_item(item_new, FALSE); /* Now, reduce the original stack's pval. */ if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND)) @@ -3454,7 +3631,7 @@ msg_format("%s ot_ptr->owner_name, race_info[ot_ptr->owner_race].title); put_str(buf, 3, 10); sprintf(buf, "%s (%ld)", - (f_name + f_info[FEAT_SHOP_HEAD + cur_store_num].name), (long)(ot_ptr->max_cost)); + (f_name + f_info[cur_store_feat].name), (long)(ot_ptr->max_cost)); prt(buf, 3, 50); } @@ -3488,7 +3665,7 @@ msg_format("%s else if (st_ptr->stock_num != i) { /* Pick the correct screen */ - if (store_top >= st_ptr->stock_num) store_top -= 12; + if (store_top >= st_ptr->stock_num) store_top -= store_bottom; /* Redraw everything */ display_inventory(); @@ -3519,6 +3696,8 @@ msg_format("%s /* Home is much easier */ else { + bool combined_or_reordered; + /* Distribute charges of wands/rods */ distribute_charges(o_ptr, j_ptr, amt); @@ -3526,7 +3705,7 @@ msg_format("%s item_new = inven_carry(j_ptr); /* Describe just the result */ - object_desc(o_name, &inventory[item_new], TRUE, 3); + object_desc(o_name, &inventory[item_new], 0); /* Message */ #ifdef JP @@ -3546,11 +3725,16 @@ msg_format("%s store_item_increase(item, -amt); store_item_optimize(item); + combined_or_reordered = combine_and_reorder_home(STORE_HOME); + /* Hack -- Item is still here */ if (i == st_ptr->stock_num) { + /* Redraw everything */ + if (combined_or_reordered) display_inventory(); + /* Redraw the item */ - display_entry(item); + else display_entry(item); } /* The item is gone */ @@ -3560,7 +3744,7 @@ msg_format("%s if (st_ptr->stock_num == 0) store_top = 0; /* Nothing left on that screen */ - else if (store_top >= st_ptr->stock_num) store_top -= 12; + else if (store_top >= st_ptr->stock_num) store_top -= store_bottom; /* Redraw everything */ display_inventory(); @@ -3665,7 +3849,7 @@ static void store_sell(void) /* Hack -- Cannot remove cursed items */ - if ((item >= INVEN_RARM) && cursed_p(o_ptr)) + if ((item >= INVEN_RARM) && object_is_cursed(o_ptr)) { /* Oops */ #ifdef JP @@ -3712,7 +3896,7 @@ static void store_sell(void) } /* Get a full description */ - object_desc(o_name, q_ptr, TRUE, 3); + object_desc(o_name, q_ptr, 0); /* Remove any inscription, feeling for stores */ if ((cur_store_num != STORE_HOME) && (cur_store_num != STORE_MUSEUM)) @@ -3805,6 +3989,9 @@ static void store_sell(void) /* Modify quantity */ q_ptr->number = amt; + /* Make it look like to be known */ + q_ptr->ident |= IDENT_STORE; + /* * Hack -- If a rod or wand, let the shopkeeper know just * how many charges he really paid for. -LM- @@ -3818,7 +4005,7 @@ static void store_sell(void) value = object_value(q_ptr) * q_ptr->number; /* Get the description all over again */ - object_desc(o_name, q_ptr, TRUE, 3); + object_desc(o_name, q_ptr, 0); /* Describe the result (in message buffer) */ #ifdef JP @@ -3847,6 +4034,11 @@ msg_format("%s /* Take the item from the player, describe the result */ inven_item_increase(item, -amt); inven_item_describe(item); + + /* If items remain, auto-inscribe before optimizing */ + if (o_ptr->number > 0) + autopick_alter_item(item, FALSE); + inven_item_optimize(item); /* Handle stuff */ @@ -3858,7 +4050,7 @@ msg_format("%s /* Re-display if item is now in store */ if (item_pos >= 0) { - store_top = (item_pos / 12) * 12; + store_top = (item_pos / store_bottom) * store_bottom; display_inventory(); } } @@ -3868,7 +4060,7 @@ msg_format("%s else if (cur_store_num == STORE_MUSEUM) { char o2_name[MAX_NLEN]; - object_desc(o2_name, q_ptr, TRUE, 0); + object_desc(o2_name, q_ptr, OD_NAME_ONLY); if (-1 == store_check_num(q_ptr)) { @@ -3922,7 +4114,7 @@ msg_format("%s /* Update store display */ if (item_pos >= 0) { - store_top = (item_pos / 12) * 12; + store_top = (item_pos / store_bottom) * store_bottom; display_inventory(); } } @@ -3955,12 +4147,16 @@ msg_format("%s /* Update store display */ if (item_pos >= 0) { - store_top = (item_pos / 12) * 12; + store_top = (item_pos / store_bottom) * store_bottom; display_inventory(); } } - if (item >= INVEN_RARM) calc_android_exp(); - if ((choice == 0) && ((item == INVEN_RARM) || (item == INVEN_LARM))) kamaenaoshi(item); + + if ((choice == 0) && (item >= INVEN_RARM)) + { + calc_android_exp(); + kamaenaoshi(item); + } } @@ -3981,21 +4177,21 @@ static void store_examine(void) { if (cur_store_num == STORE_HOME) #ifdef JP -msg_print("²æ¤¬²È¤Ë¤Ï²¿¤âÃÖ¤¤¤Æ¤¢¤ê¤Þ¤»¤ó¡£"); + msg_print("²æ¤¬²È¤Ë¤Ï²¿¤âÃÖ¤¤¤Æ¤¢¤ê¤Þ¤»¤ó¡£"); #else msg_print("Your home is empty."); #endif - if (cur_store_num == STORE_MUSEUM) + else if (cur_store_num == STORE_MUSEUM) #ifdef JP -msg_print("Çîʪ´Û¤Ë¤Ï²¿¤âÃÖ¤¤¤Æ¤¢¤ê¤Þ¤»¤ó¡£"); + msg_print("Çîʪ´Û¤Ë¤Ï²¿¤âÃÖ¤¤¤Æ¤¢¤ê¤Þ¤»¤ó¡£"); #else msg_print("Museum is empty."); #endif else #ifdef JP -msg_print("¸½ºß¾¦Éʤκ߸ˤòÀڤ餷¤Æ¤¤¤Þ¤¹¡£"); + msg_print("¸½ºß¾¦Éʤκ߸ˤòÀڤ餷¤Æ¤¤¤Þ¤¹¡£"); #else msg_print("I am currently out of stock."); #endif @@ -4008,7 +4204,7 @@ msg_print(" i = (st_ptr->stock_num - store_top); /* And then restrict it to the current page */ - if (i > 12) i = 12; + if (i > store_bottom) i = store_bottom; /* Prompt */ #ifdef JP @@ -4041,7 +4237,7 @@ msg_print(" } /* Description */ - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); /* Describe */ #ifdef JP @@ -4052,7 +4248,7 @@ msg_format("%s /* Describe it fully */ - if (!identify_fully_aux(o_ptr)) + if (!screen_object(o_ptr, SCROBJ_FORCE_DETAIL)) #ifdef JP msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£"); #else @@ -4065,6 +4261,90 @@ msg_print(" /* + * Remove an item from museum (Originally from TOband) + */ +static void museum_remove_object(void) +{ + int i; + int item; + object_type *o_ptr; + char o_name[MAX_NLEN]; + char out_val[160]; + + /* Empty? */ + if (st_ptr->stock_num <= 0) + { +#ifdef JP + msg_print("Çîʪ´Û¤Ë¤Ï²¿¤âÃÖ¤¤¤Æ¤¢¤ê¤Þ¤»¤ó¡£"); +#else + msg_print("Museum is empty."); +#endif + + return; + } + + /* Find the number of objects on this and following pages */ + i = st_ptr->stock_num - store_top; + + /* And then restrict it to the current page */ + if (i > store_bottom) i = store_bottom; + + /* Prompt */ +#ifdef JP + sprintf(out_val, "¤É¤Î¥¢¥¤¥Æ¥à¤ÎŸ¼¨¤ò¤ä¤á¤µ¤»¤Þ¤¹¤«¡©"); +#else + sprintf(out_val, "Which item do you want to order to remove? "); +#endif + + /* Get the item number to be removed */ + if (!get_stock(&item, out_val, 0, i - 1)) return; + + /* Get the actual index */ + item = item + store_top; + + /* Get the actual item */ + o_ptr = &st_ptr->stock[item]; + + /* Description */ + object_desc(o_name, o_ptr, 0); + +#ifdef JP + msg_print("Ÿ¼¨¤ò¤ä¤á¤µ¤»¤¿¥¢¥¤¥Æ¥à¤ÏÆóÅ٤ȸ«¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡ª"); + if (!get_check(format("ËÜÅö¤Ë%s¤ÎŸ¼¨¤ò¤ä¤á¤µ¤»¤Þ¤¹¤«¡©", o_name))) return; +#else + msg_print("You cannot see items which is removed from the Museum!"); + if (!get_check(format("Really order to remove %s from the Museum? ", o_name))) return; +#endif + + /* Message */ +#ifdef JP + msg_format("%s¤ÎŸ¼¨¤ò¤ä¤á¤µ¤»¤¿¡£", o_name); +#else + msg_format("You ordered to remove %s.", o_name); +#endif + + /* Remove the items from the home */ + store_item_increase(item, -o_ptr->number); + store_item_optimize(item); + + (void)combine_and_reorder_home(STORE_MUSEUM); + + /* The item is gone */ + + /* Nothing left */ + if (st_ptr->stock_num == 0) store_top = 0; + + /* Nothing left on that screen */ + else if (store_top >= st_ptr->stock_num) store_top -= store_bottom; + + /* Redraw everything */ + display_inventory(); + + return; +} + + +/* * Hack -- set this to leave the store */ static bool leave_store = FALSE; @@ -4106,7 +4386,7 @@ static void store_process_command(void) /* 1 ¥Ú¡¼¥¸Ìá¤ë¥³¥Þ¥ó¥É: ²æ¤¬²È¤Î¥Ú¡¼¥¸¿ô¤¬Â¿¤¤¤Î¤Ç½ÅÊõ¤¹¤ë¤Ï¤º By BUG */ case '-': { - if (st_ptr->stock_num <= 12) { + if (st_ptr->stock_num <= store_bottom) { #ifdef JP msg_print("¤³¤ì¤ÇÁ´Éô¤Ç¤¹¡£"); #else @@ -4114,11 +4394,11 @@ static void store_process_command(void) #endif } else{ - store_top -= 12; + store_top -= store_bottom; if ( store_top < 0 ) - store_top = ((st_ptr->stock_num - 1 )/12) * 12; + store_top = ((st_ptr->stock_num - 1 )/store_bottom) * store_bottom; if ( (cur_store_num == STORE_HOME) && (powerup_home == FALSE) ) - if ( store_top >= 12 ) store_top = 12; + if ( store_top >= store_bottom ) store_top = store_bottom; display_inventory(); } break; @@ -4127,7 +4407,7 @@ static void store_process_command(void) /* Browse */ case ' ': { - if (st_ptr->stock_num <= 12) + if (st_ptr->stock_num <= store_bottom) { #ifdef JP msg_print("¤³¤ì¤ÇÁ´Éô¤Ç¤¹¡£"); @@ -4138,24 +4418,24 @@ static void store_process_command(void) } else { - store_top += 12; - /* - * ±£¤·¥ª¥×¥·¥ç¥ó(powerup_home)¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¤È¤­¤Ï - * ²æ¤¬²È¤Ç¤Ï 2 ¥Ú¡¼¥¸¤Þ¤Ç¤·¤«É½¼¨¤·¤Ê¤¤ - */ - if ((cur_store_num == STORE_HOME) && - (powerup_home == FALSE) && - (st_ptr->stock_num >= STORE_INVEN_MAX)) - { - if (store_top >= (STORE_INVEN_MAX - 1)) - { - store_top = 0; - } - } - else - { - if (store_top >= st_ptr->stock_num) store_top = 0; - } + store_top += store_bottom; + /* + * ±£¤·¥ª¥×¥·¥ç¥ó(powerup_home)¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¤È¤­¤Ï + * ²æ¤¬²È¤Ç¤Ï 2 ¥Ú¡¼¥¸¤Þ¤Ç¤·¤«É½¼¨¤·¤Ê¤¤ + */ + if ((cur_store_num == STORE_HOME) && + (powerup_home == FALSE) && + (st_ptr->stock_num >= STORE_INVEN_MAX)) + { + if (store_top >= (STORE_INVEN_MAX - 1)) + { + store_top = 0; + } + } + else + { + if (store_top >= st_ptr->stock_num) store_top = 0; + } display_inventory(); } @@ -4258,7 +4538,18 @@ static void store_process_command(void) /* Browse a book */ case 'b': { - do_cmd_browse(); + if ( (p_ptr->pclass == CLASS_MINDCRAFTER) || + (p_ptr->pclass == CLASS_BERSERKER) || + (p_ptr->pclass == CLASS_NINJA) || + (p_ptr->pclass == CLASS_MIRROR_MASTER) + ) do_cmd_mind_browse(); + else if (p_ptr->pclass == CLASS_SMITH) + do_cmd_kaji(TRUE); + else if (p_ptr->pclass == CLASS_MAGIC_EATER) + do_cmd_magic_eater(TRUE, FALSE); + else if (p_ptr->pclass == CLASS_SNIPER) + do_cmd_snipe_browse(); + else do_cmd_browse(); break; } @@ -4297,7 +4588,9 @@ static void store_process_command(void) /* Character description */ case 'C': { + p_ptr->town_num = old_town_num; do_cmd_change_name(); + p_ptr->town_num = inner_town_num; display_store(); break; } @@ -4315,28 +4608,36 @@ static void store_process_command(void) /* Single line from a pref file */ case '"': { + p_ptr->town_num = old_town_num; do_cmd_pref(); + p_ptr->town_num = inner_town_num; break; } /* Interact with macros */ case '@': { + p_ptr->town_num = old_town_num; do_cmd_macros(); + p_ptr->town_num = inner_town_num; break; } /* Interact with visuals */ case '%': { + p_ptr->town_num = old_town_num; do_cmd_visuals(); + p_ptr->town_num = inner_town_num; break; } /* Interact with colors */ case '&': { + p_ptr->town_num = old_town_num; do_cmd_colors(); + p_ptr->town_num = inner_town_num; break; } @@ -4344,6 +4645,9 @@ static void store_process_command(void) case '=': { do_cmd_options(); + (void)combine_and_reorder_home(STORE_HOME); + do_cmd_redraw(); + display_store(); break; } @@ -4414,11 +4718,18 @@ static void store_process_command(void) /* Hack -- Unknown command */ default: { + if ((cur_store_num == STORE_MUSEUM) && (command_cmd == 'r')) + { + museum_remove_object(); + } + else + { #ifdef JP - msg_print("¤½¤Î¥³¥Þ¥ó¥É¤ÏŹ¤ÎÃæ¤Ç¤Ï»È¤¨¤Þ¤»¤ó¡£"); + msg_print("¤½¤Î¥³¥Þ¥ó¥É¤ÏŹ¤ÎÃæ¤Ç¤Ï»È¤¨¤Þ¤»¤ó¡£"); #else - msg_print("That command does not work in stores."); + msg_print("That command does not work in stores."); #endif + } break; } @@ -4440,19 +4751,23 @@ void do_cmd_store(void) { int which; int maintain_num; - int tmp_chr; int i; cave_type *c_ptr; - s16b old_town_num; + bool need_redraw_store_inv; /* To redraw missiles damage and prices in store */ + int w, h; + + /* Get term size */ + Term_get_size(&w, &h); + /* Calculate stocks per 1 page */ + xtra_stock = MIN(14+26, ((h > 24) ? (h - 24) : 0)); + store_bottom = MIN_STOCK + xtra_stock; /* Access the player grid */ c_ptr = &cave[py][px]; /* Verify a store */ - if (!((c_ptr->feat >= FEAT_SHOP_HEAD) && - (c_ptr->feat <= FEAT_SHOP_TAIL)) && - (c_ptr->feat != FEAT_MUSEUM)) + if (!cave_have_flag_grid(c_ptr, FF_STORE)) { #ifdef JP msg_print("¤³¤³¤Ë¤ÏŹ¤¬¤¢¤ê¤Þ¤»¤ó¡£"); @@ -4464,12 +4779,12 @@ void do_cmd_store(void) } /* Extract the store code */ - if (c_ptr->feat == FEAT_MUSEUM) which = STORE_MUSEUM; - else which = (c_ptr->feat - FEAT_SHOP_HEAD); + which = f_info[c_ptr->feat].subtype; old_town_num = p_ptr->town_num; if ((which == STORE_HOME) || (which == STORE_MUSEUM)) p_ptr->town_num = 1; if (dun_level) p_ptr->town_num = NO_TOWN; + inner_town_num = p_ptr->town_num; /* Hack -- Check the "locked doors" */ if ((town[p_ptr->town_num].store[which].store_open >= turn) || @@ -4486,7 +4801,7 @@ void do_cmd_store(void) } /* Calculate the number of store maintainances since the last visit */ - maintain_num = (turn - town[p_ptr->town_num].store[which].last_visit) / (TURNS_PER_TICK * STORE_TURNS); + maintain_num = (turn - town[p_ptr->town_num].store[which].last_visit) / (TURNS_PER_TICK * STORE_TICKS); /* Maintain the store max. 10 times */ if (maintain_num > 10) maintain_num = 10; @@ -4521,10 +4836,15 @@ void do_cmd_store(void) /* No automatic command */ command_new = 0; + /* Do not expand macros */ + get_com_no_macros = TRUE; /* Save the store number */ cur_store_num = which; + /* Hack -- save the store feature */ + cur_store_feat = c_ptr->feat; + /* Save the store and owner pointers */ st_ptr = &town[p_ptr->town_num].store[cur_store_num]; ot_ptr = &owners[cur_store_num][st_ptr->owner]; @@ -4545,30 +4865,27 @@ void do_cmd_store(void) /* Hack -- Clear line 1 */ prt("", 1, 0); - /* Hack -- Check the charisma */ - tmp_chr = p_ptr->stat_use[A_CHR]; - /* Clear */ - clear_from(20); + clear_from(20 + xtra_stock); /* Basic commands */ #ifdef JP - prt(" ESC) ·úʪ¤«¤é½Ð¤ë", 21, 0); + prt(" ESC) ·úʪ¤«¤é½Ð¤ë", 21 + xtra_stock, 0); #else - prt(" ESC) Exit from Building.", 21, 0); + prt(" ESC) Exit from Building.", 21 + xtra_stock, 0); #endif /* Browse if necessary */ - if (st_ptr->stock_num > 12) + if (st_ptr->stock_num > store_bottom) { #ifdef JP - prt(" -)Á°¥Ú¡¼¥¸", 22, 0); - prt(" ¥¹¥Ú¡¼¥¹) ¼¡¥Ú¡¼¥¸", 23, 0); + prt(" -)Á°¥Ú¡¼¥¸", 22 + xtra_stock, 0); + prt(" ¥¹¥Ú¡¼¥¹) ¼¡¥Ú¡¼¥¸", 23 + xtra_stock, 0); #else - prt(" -) Previous page", 22, 0); - prt(" SPACE) Next page", 23, 0); + prt(" -) Previous page", 22 + xtra_stock, 0); + prt(" SPACE) Next page", 23 + xtra_stock, 0); #endif } @@ -4577,75 +4894,74 @@ void do_cmd_store(void) if (cur_store_num == STORE_HOME) { #ifdef JP - prt("g) ¥¢¥¤¥Æ¥à¤ò¼è¤ë", 21, 27); - prt("d) ¥¢¥¤¥Æ¥à¤òÃÖ¤¯", 22, 27); - prt("x) ²È¤Î¥¢¥¤¥Æ¥à¤òÄ´¤Ù¤ë", 23,27); + prt("g) ¥¢¥¤¥Æ¥à¤ò¼è¤ë", 21 + xtra_stock, 27); + prt("d) ¥¢¥¤¥Æ¥à¤òÃÖ¤¯", 22 + xtra_stock, 27); + prt("x) ²È¤Î¥¢¥¤¥Æ¥à¤òÄ´¤Ù¤ë", 23 + xtra_stock, 27); #else - prt("g) Get an item.", 21, 27); - prt("d) Drop an item.", 22, 27); - prt("x) eXamine an item in the home.", 23,27); + prt("g) Get an item.", 21 + xtra_stock, 27); + prt("d) Drop an item.", 22 + xtra_stock, 27); + prt("x) eXamine an item in the home.", 23 + xtra_stock, 27); #endif - } /* Museum commands */ else if (cur_store_num == STORE_MUSEUM) { #ifdef JP - prt("d) ¥¢¥¤¥Æ¥à¤òÃÖ¤¯", 21, 27); - prt("x) Çîʪ´Û¤Î¥¢¥¤¥Æ¥à¤òÄ´¤Ù¤ë", 23,27); + prt("d) ¥¢¥¤¥Æ¥à¤òÃÖ¤¯", 21 + xtra_stock, 27); + prt("r) ¥¢¥¤¥Æ¥à¤ÎŸ¼¨¤ò¤ä¤á¤ë", 22 + xtra_stock, 27); + prt("x) Çîʪ´Û¤Î¥¢¥¤¥Æ¥à¤òÄ´¤Ù¤ë", 23 + xtra_stock, 27); #else - prt("d) Drop an item.", 21, 27); - prt("x) eXamine an item in the museum.", 23,27); + prt("d) Drop an item.", 21 + xtra_stock, 27); + prt("r) order to Remove an item.", 22 + xtra_stock, 27); + prt("x) eXamine an item in the museum.", 23 + xtra_stock, 27); #endif - } /* Shop commands XXX XXX XXX */ else { #ifdef JP - prt("p) ¾¦ÉʤòÇ㤦", 21, 30); - prt("s) ¥¢¥¤¥Æ¥à¤òÇä¤ë", 22, 30); - prt("x) ¾¦ÉʤòÄ´¤Ù¤ë", 23,30); + prt("p) ¾¦ÉʤòÇ㤦", 21 + xtra_stock, 30); + prt("s) ¥¢¥¤¥Æ¥à¤òÇä¤ë", 22 + xtra_stock, 30); + prt("x) ¾¦ÉʤòÄ´¤Ù¤ë", 23 + xtra_stock,30); #else - prt("p) Purchase an item.", 21, 30); - prt("s) Sell an item.", 22, 30); - prt("x) eXamine an item in the shop", 23,30); + prt("p) Purchase an item.", 21 + xtra_stock, 30); + prt("s) Sell an item.", 22 + xtra_stock, 30); + prt("x) eXamine an item in the shop", 23 + xtra_stock,30); #endif - } #ifdef JP - /* ´ðËÜŪ¤Ê¥³¥Þ¥ó¥É¤ÎÄɲÃɽ¼¨ */ - - prt("i/e) »ý¤Áʪ/ÁõÈ÷¤Î°ìÍ÷", 21, 56); - - if( rogue_like_commands == TRUE ) - { - prt("w/T) ÁõÈ÷¤¹¤ë/¤Ï¤º¤¹", 22, 56); - } - else - { - prt("w/t) ÁõÈ÷¤¹¤ë/¤Ï¤º¤¹", 22, 56); - } + /* ´ðËÜŪ¤Ê¥³¥Þ¥ó¥É¤ÎÄɲÃɽ¼¨ */ + + prt("i/e) »ý¤Áʪ/ÁõÈ÷¤Î°ìÍ÷", 21 + xtra_stock, 56); + + if (rogue_like_commands) + { + prt("w/T) ÁõÈ÷¤¹¤ë/¤Ï¤º¤¹", 22 + xtra_stock, 56); + } + else + { + prt("w/t) ÁõÈ÷¤¹¤ë/¤Ï¤º¤¹", 22 + xtra_stock, 56); + } #else - prt("i/e) Inventry/Equipment list", 21, 56); - - if( rogue_like_commands == TRUE ) - { - prt("w/T) Wear/Take off equipment", 22, 56); - } - else - { - prt("w/t) Wear/Take off equipment", 22, 56); - } + prt("i/e) Inventry/Equipment list", 21 + xtra_stock, 56); + + if (rogue_like_commands) + { + prt("w/T) Wear/Take off equipment", 22 + xtra_stock, 56); + } + else + { + prt("w/t) Wear/Take off equipment", 22 + xtra_stock, 56); + } #endif /* Prompt */ #ifdef JP - prt("¥³¥Þ¥ó¥É:", 20, 0); + prt("¥³¥Þ¥ó¥É:", 20 + xtra_stock, 0); #else - prt("You may: ", 20, 0); + prt("You may: ", 20 + xtra_stock, 0); #endif @@ -4655,6 +4971,12 @@ void do_cmd_store(void) /* Process the command */ store_process_command(); + /* + * Hack -- To redraw missiles damage and prices in store + * If player's charisma changes, or if player changes a bow, PU_BONUS is set + */ + need_redraw_store_inv = (p_ptr->update & PU_BONUS) ? TRUE : FALSE; + /* Hack -- Character is still in "icky" mode */ character_icky = TRUE; @@ -4733,7 +5055,7 @@ void do_cmd_store(void) object_copy(q_ptr, o_ptr); /* Describe it */ - object_desc(o_name, q_ptr, TRUE, 3); + object_desc(o_name, q_ptr, 0); /* Message */ #ifdef JP @@ -4757,14 +5079,15 @@ void do_cmd_store(void) /* Redraw the home */ if (item_pos >= 0) { - store_top = (item_pos / 12) * 12; + store_top = (item_pos / store_bottom) * store_bottom; display_inventory(); } } } /* Hack -- Redisplay store prices if charisma changes */ - if (tmp_chr != p_ptr->stat_use[A_CHR]) display_inventory(); + /* Hack -- Redraw missiles damage if player changes bow */ + if (need_redraw_store_inv) display_inventory(); /* Hack -- get kicked out of the store */ if (st_ptr->store_open >= turn) leave_store = TRUE; @@ -4786,6 +5109,8 @@ void do_cmd_store(void) /* Hack -- Cancel "see" mode */ command_see = FALSE; + /* Allow expanding macros */ + get_com_no_macros = FALSE; /* Flush messages XXX XXX XXX */ msg_print(NULL); @@ -4796,7 +5121,7 @@ void do_cmd_store(void) /* Update everything */ - p_ptr->update |= (PU_VIEW | PU_LITE); + p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE); p_ptr->update |= (PU_MONSTERS); /* Redraw entire screen */ @@ -4863,20 +5188,21 @@ void store_shuffle(int which) /* Get the item */ o_ptr = &st_ptr->stock[i]; - /* Hack -- Sell all old items for "half price" */ - if (!(o_ptr->art_name)) + if (!object_is_artifact(o_ptr)) + { + /* Hack -- Sell all non-artifact old items for "half price" */ o_ptr->discount = 50; - /* Hack -- Items are no longer "fixed price" */ - o_ptr->ident &= ~(IDENT_FIXED); + /* Hack -- Items are no longer "fixed price" */ + o_ptr->ident &= ~(IDENT_FIXED); - /* Mega-Hack -- Note that the item is "on sale" */ + /* Mega-Hack -- Note that the item is "on sale" */ #ifdef JP - o_ptr->inscription = quark_add("Çä½ÐÃæ"); + o_ptr->inscription = quark_add("Çä½ÐÃæ"); #else - o_ptr->inscription = quark_add("on sale"); + o_ptr->inscription = quark_add("on sale"); #endif - + } } } @@ -4888,8 +5214,6 @@ void store_maint(int town_num, int store_num) { int j; - int old_rating = rating; - cur_store_num = store_num; /* Ignore home */ @@ -4960,10 +5284,6 @@ void store_maint(int town_num, int store_num) /* Acquire some new items */ while (st_ptr->stock_num < j) store_create(); - - - /* Hack -- Restore the rating */ - rating = old_rating; } @@ -5011,7 +5331,7 @@ void store_init(int town_num, int store_num) * MEGA-HACK - Last visit to store is * BEFORE player birth to enable store restocking */ - st_ptr->last_visit = -200L * STORE_TURNS; + st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS; /* Clear any old items */ for (k = 0; k < st_ptr->stock_size; k++) @@ -5028,7 +5348,7 @@ void move_to_black_market(object_type *o_ptr) st_ptr = &town[p_ptr->town_num].store[STORE_BLACK]; - o_ptr->ident |= IDENT_STOREB; + o_ptr->ident |= IDENT_STORE; (void)store_carry(o_ptr);