summaryrefslogtreecommitdiffstats
path: root/stone_soup/crawl-ref/source/shopping.cc
diff options
context:
space:
mode:
Diffstat (limited to 'stone_soup/crawl-ref/source/shopping.cc')
-rw-r--r--stone_soup/crawl-ref/source/shopping.cc1610
1 files changed, 0 insertions, 1610 deletions
diff --git a/stone_soup/crawl-ref/source/shopping.cc b/stone_soup/crawl-ref/source/shopping.cc
deleted file mode 100644
index cff3ce8f51..0000000000
--- a/stone_soup/crawl-ref/source/shopping.cc
+++ /dev/null
@@ -1,1610 +0,0 @@
-/*
- * File: shopping.cc
- * Summary: Shop keeper functions.
- * Written by: Linley Henzell
- *
- * Change History (most recent first):
- *
- * <3> Jul 30 00 JDJ in_a_shop uses shoppy instead of i when calling shop_set_id.
- * <2> Oct 31 99 CDL right justify prices
- * <1> -/--/-- LRH Created
- */
-
-#include "AppHdr.h"
-#include "chardump.h"
-#include "shopping.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef DOS
-#include <conio.h>
-#endif
-
-#include "externs.h"
-
-#include "describe.h"
-#include "invent.h"
-#include "items.h"
-#include "itemname.h"
-#include "itemprop.h"
-#include "macro.h"
-#include "player.h"
-#include "randart.h"
-#include "spl-book.h"
-#include "stash.h"
-#include "stuff.h"
-
-static char in_a_shop(char shoppy, id_arr id);
-static char more3(void);
-static void purchase( int shop, int item_got, int cost );
-static void shop_init_id(int i, id_fix_arr &shop_id);
-static void shop_print(const char *shoppy, char sh_line);
-static void shop_set_ident_type(int i, id_fix_arr &shop_id,
- unsigned char base_type, unsigned char sub_type);
-static void shop_uninit_id(int i, const id_fix_arr &shop_id);
-
-char in_a_shop( char shoppy, id_arr id )
-{
- // easier to work with {dlb}
- unsigned int greedy = env.shop[shoppy].greed;
-
- id_fix_arr shop_id;
- FixedVector < int, 20 > shop_items;
-
- char st_pass[ ITEMNAME_SIZE ] = "";
- unsigned int gp_value = 0;
- char i;
- unsigned char ft;
-
-#ifdef DOS_TERM
- char buffer[4800];
- gettext(1, 1, 80, 25, buffer);
-#endif
-
-#ifdef DOS_TERM
- window(1, 1, 80, 25);
-#endif
-
- clrscr();
- int itty = 0;
-
- snprintf( info, INFO_SIZE, "Welcome to %s!",
- shop_name(env.shop[shoppy].x, env.shop[shoppy].y) );
-
-#ifdef STASH_TRACKING
- ShopInfo &si = stashes.get_shop(env.shop[shoppy].x, env.shop[shoppy].y);
-#endif
-
- shop_print(info, 20);
-
- more3();
- shop_init_id(shoppy, shop_id);
-
- /* *************************************
- THINGS TO DO:
- Allow inventory
- Remove id change for antique shops
- selling?
- ************************************* */
-
- save_id(id);
-
- print_stock:
- clrscr();
- itty = igrd[0][5 + shoppy];
-
-#ifdef STASH_TRACKING
- si.reset();
-#endif
- if (itty == NON_ITEM)
- {
- shop_print("I'm sorry, my shop is empty now.", 20);
- more3();
- goto goodbye;
- }
-
- for (i = 1; i < 20; i++)
- {
- shop_items[i - 1] = itty;
-
- if (itty == NON_ITEM) //mitm.link [itty] == NON_ITEM)
- {
- shop_items[i - 1] = NON_ITEM;
- continue;
- }
-
- itty = mitm[itty].link;
- }
-
- itty = igrd[0][5 + shoppy];
-
- for (i = 1; i < 18; i++)
- {
- gotoxy(1, i);
-
- textcolor((i % 2) ? WHITE : LIGHTGREY);
-
- it_name(itty, DESC_NOCAP_A, st_pass);
- putch(i + 96);
- cprintf(" - ");
- cprintf(st_pass);
-
- gp_value = greedy * item_value( mitm[itty], id );
- gp_value /= 10;
- if (gp_value <= 1)
- gp_value = 1;
-
- std::string desc;
- if (is_dumpable_artifact(mitm[itty], Options.verbose_dump))
- desc = munge_description(get_item_description(mitm[itty],
- Options.verbose_dump,
- true ));
-# ifdef STASH_TRACKING
- si.add_item(mitm[itty], gp_value);
-# endif
-
- gotoxy(60, i);
- // cdl - itoa(gp_value, st_pass, 10);
- snprintf(st_pass, sizeof(st_pass), "%5d", gp_value);
- cprintf(st_pass);
- cprintf(" gold");
- if (mitm[itty].link == NON_ITEM)
- break;
-
- itty = mitm[itty].link;
- }
-
- textcolor(LIGHTGREY);
-
- shop_print("Type letter to buy item, x/Esc to leave, ?/* for inventory, v to examine.", 23);
-
- purchase:
- snprintf( info, INFO_SIZE, "You have %d gold piece%s.", you.gold,
- (you.gold == 1) ? "" : "s" );
-
- textcolor(YELLOW);
- shop_print(info, 19);
-
- textcolor(CYAN);
- shop_print("What would you like to purchase?", 20);
- textcolor(LIGHTGREY);
-
- ft = get_ch();
-
- if (ft == 'x' || ft == ESCAPE)
- goto goodbye;
-
- if (ft == 'v')
- {
- textcolor(CYAN);
- shop_print("Examine which item?", 20);
- textcolor(LIGHTGREY);
- ft = get_ch();
-
- // wonder whether this should be recoded to permit uppercase, too? {dlb}
- if (ft < 'a' || ft > 'z')
- goto huh;
-
- ft -= 'a'; // see above comment {dlb}
-
- if (ft > 18)
- goto huh;
-
- if (shop_items[ft] == NON_ITEM)
- {
- shop_print("I'm sorry, you seem to be confused.", 20);
- more3();
- goto purchase;
- }
-
- describe_item( mitm[shop_items[ft]] );
-
- goto print_stock;
- }
-
- if (ft == '?' || ft == '*')
- {
- shop_uninit_id(shoppy, shop_id);
- invent(-1, false);
- shop_init_id(shoppy, shop_id);
-#ifdef DOS_TERM
- window(1, 1, 80, 25);
-#endif
- goto print_stock;
- }
-
- if (ft < 'a' || ft > 'z') // see earlier comments re: uppercase {dlb}
- {
- huh:
- shop_print("Huh?", 20);
- more3();
- goto purchase;
- }
-
- ft -= 'a'; // see earlier comments re: uppercase {dlb}
-
- if (ft > 18)
- goto huh;
-
- if (shop_items[ft] == NON_ITEM)
- {
- shop_print("I'm sorry, you seem to be confused.", 20);
- more3();
- goto purchase;
- }
-
- gp_value = greedy * item_value( mitm[shop_items[ft]], id ) / 10;
-
- if (gp_value > you.gold)
- {
- shop_print("I'm sorry, you don't seem to have enough money.", 20);
- more3();
- goto purchase;
- }
-
- shop_set_ident_type( shoppy, shop_id, mitm[shop_items[ft]].base_type,
- mitm[shop_items[ft]].sub_type );
-
- purchase( shoppy, shop_items[ft], gp_value );
-
- goto print_stock;
-
- goodbye:
- //clear_line();
- shop_print("Goodbye!", 20);
- more3();
-
-#ifdef DOS_TERM
- puttext(1, 1, 80, 25, buffer);
- gotoxy(1, 1);
- cprintf(" ");
-#endif
-
- shop_uninit_id( shoppy, shop_id );
- return 0;
-}
-
-void shop_init_id_type(int shoptype, id_fix_arr &shop_id)
-{
- if (shoptype != SHOP_WEAPON_ANTIQUE
- && shoptype != SHOP_ARMOUR_ANTIQUE
- && shoptype != SHOP_GENERAL_ANTIQUE)
- {
- for (int j = 0; j < 50; j++)
- {
- shop_id[ IDTYPE_WANDS ][j] = get_ident_type(OBJ_WANDS, j);
- set_ident_type(OBJ_WANDS, j, ID_KNOWN_TYPE);
-
- shop_id[ IDTYPE_SCROLLS ][j] = get_ident_type(OBJ_SCROLLS, j);
- set_ident_type(OBJ_SCROLLS, j, ID_KNOWN_TYPE);
-
- shop_id[ IDTYPE_JEWELLERY ][j] = get_ident_type(OBJ_JEWELLERY, j);
- set_ident_type(OBJ_JEWELLERY, j, ID_KNOWN_TYPE);
-
- shop_id[ IDTYPE_POTIONS ][j] = get_ident_type(OBJ_POTIONS, j);
- set_ident_type(OBJ_POTIONS, j, ID_KNOWN_TYPE);
- }
- }
-}
-
-static void shop_init_id(int i, id_fix_arr &shop_id)
-{
- shop_init_id_type( env.shop[i].type, shop_id );
-}
-
-void shop_uninit_id_type(int shoptype, const id_fix_arr &shop_id)
-{
- if (shoptype != SHOP_WEAPON_ANTIQUE
- && shoptype != SHOP_ARMOUR_ANTIQUE
- && shoptype != SHOP_GENERAL_ANTIQUE)
- {
- for (int j = 0; j < 50; j++)
- {
- set_ident_type( OBJ_WANDS, j,
- shop_id[ IDTYPE_WANDS ][j], true );
- set_ident_type( OBJ_SCROLLS, j,
- shop_id[ IDTYPE_SCROLLS ][j], true );
- set_ident_type( OBJ_JEWELLERY, j,
- shop_id[ IDTYPE_JEWELLERY ][j], true );
- set_ident_type( OBJ_POTIONS, j,
- shop_id[ IDTYPE_POTIONS ][j], true );
- }
- }
-}
-
-static void shop_uninit_id(int i, const id_fix_arr &shop_id)
-{
- shop_uninit_id_type(env.shop[i].type, shop_id);
-}
-
-void shop_set_ident_type( int i, id_fix_arr &shop_id,
- unsigned char base_type, unsigned char sub_type )
-{
- if (env.shop[i].type != SHOP_WEAPON_ANTIQUE
- && env.shop[i].type != SHOP_ARMOUR_ANTIQUE
- && env.shop[i].type != SHOP_GENERAL_ANTIQUE)
- {
- switch (base_type)
- {
- case OBJ_WANDS:
- shop_id[ IDTYPE_WANDS ][sub_type] = ID_KNOWN_TYPE;
- break;
- case OBJ_SCROLLS:
- shop_id[ IDTYPE_SCROLLS ][sub_type] = ID_KNOWN_TYPE;
- break;
- case OBJ_JEWELLERY:
- shop_id[ IDTYPE_JEWELLERY ][sub_type] = ID_KNOWN_TYPE;
- break;
- case OBJ_POTIONS:
- shop_id[ IDTYPE_POTIONS ][sub_type] = ID_KNOWN_TYPE;
- break;
- }
- }
-}
-
-void shop_print( const char *shoppy, char sh_lines )
-{
- gotoxy(1, sh_lines);
-
- cprintf(shoppy);
-
- for (int i = strlen(shoppy); i < 80; i++)
- cprintf(" ");
-}
-
-char more3(void)
-{
- char keyin = 0;
-
- gotoxy(70, 20);
- cprintf("-more-");
- keyin = getch();
- if (keyin == 0)
- getch();
- //clear_line();
- return keyin;
-}
-
-static void purchase( int shop, int item_got, int cost )
-{
- you.gold -= cost;
-
- origin_purchased(mitm[item_got]);
- int num = move_item_to_player( item_got, mitm[item_got].quantity, true );
-
- // Shopkeepers will now place goods you can't carry outside the shop.
- if (num < mitm[item_got].quantity)
- {
- snprintf( info, INFO_SIZE, "I'll put %s outside for you.",
- (mitm[item_got].quantity == 1) ? "it" :
- (num > 0) ? "the rest"
- : "these" );
-
- shop_print( info, 20 );
- more3();
-
- move_item_to_grid( &item_got, env.shop[shop].x, env.shop[shop].y );
- }
-} // end purchase()
-
-// This probably still needs some work. Rings used to be the only
-// artefacts which had a change in price, and that value corresponds
-// to returning 50 from this function. Good artefacts will probably
-// be returning just over 30 right now. Note that this isn't used
-// as a multiple, its used in the old ring way: 7 * ret is added to
-// the price of the artefact. -- bwr
-int randart_value( const item_def &item )
-{
- ASSERT( is_random_artefact( item ) );
-
- int ret = 10;
- FixedVector< char, RA_PROPERTIES > prop;
-
- randart_wpn_properties( item, prop );
-
- // Brands are already accounted for via existing ego checks
-
- // This should probably be more complex... but this isn't so bad:
- ret += 3 * prop[ RAP_AC ] + 3 * prop[ RAP_EVASION ]
- + 3 * prop[ RAP_ACCURACY ] + 3 * prop[ RAP_DAMAGE ]
- + 6 * prop[ RAP_STRENGTH ] + 6 * prop[ RAP_INTELLIGENCE ]
- + 6 * prop[ RAP_DEXTERITY ];
-
- // These resistances have meaningful levels
- if (prop[ RAP_FIRE ] > 0)
- ret += 5 + 5 * (prop[ RAP_FIRE ] * prop[ RAP_FIRE ]);
- else if (prop[ RAP_FIRE ] < 0)
- ret -= 10;
-
- if (prop[ RAP_COLD ] > 0)
- ret += 5 + 5 * (prop[ RAP_COLD ] * prop[ RAP_COLD ]);
- else if (prop[ RAP_COLD ] < 0)
- ret -= 10;
-
- // These normally come alone or in resist/susceptible pairs...
- // we're making items a bit more expensive if they have both positive.
- if (prop[ RAP_FIRE ] > 0 && prop[ RAP_COLD ] > 0)
- ret += 20;
-
- if (prop[ RAP_NEGATIVE_ENERGY ] > 0)
- ret += 5 + 5 * (prop[RAP_NEGATIVE_ENERGY] * prop[RAP_NEGATIVE_ENERGY]);
-
- // only one meaningful level:
- if (prop[ RAP_POISON ])
- ret += 15;
-
- // only one meaningful level (hard to get):
- if (prop[ RAP_ELECTRICITY ])
- ret += 30;
-
- // magic resistance is from 20-120
- if (prop[ RAP_MAGIC ])
- ret += 5 + prop[ RAP_MAGIC ] / 10;
-
- if (prop[ RAP_EYESIGHT ])
- ret += 10;
-
- // abilities:
- if (prop[ RAP_LEVITATE ])
- ret += 3;
-
- if (prop[ RAP_BLINK ])
- ret += 3;
-
- if (prop[ RAP_CAN_TELEPORT ])
- ret += 5;
-
- if (prop[ RAP_BERSERK ])
- ret += 5;
-
- if (prop[ RAP_MAPPING ])
- ret += 15;
-
- if (prop[ RAP_INVISIBLE ])
- ret += 20;
-
- if (prop[ RAP_ANGRY ])
- ret -= 3;
-
- if (prop[ RAP_CAUSE_TELEPORTATION ])
- ret -= 3;
-
- if (prop[ RAP_NOISES ])
- ret -= 5;
-
- if (prop[ RAP_PREVENT_TELEPORTATION ])
- ret -= 8;
-
- if (prop[ RAP_PREVENT_SPELLCASTING ])
- ret -= 10;
-
- // ranges from 2-5
- if (prop[ RAP_MUTAGENIC ])
- ret -= (5 + 3 * prop[ RAP_MUTAGENIC ]);
-
- // ranges from 1-3
- if (prop[ RAP_METABOLISM ])
- ret -= (2 * prop[ RAP_METABOLISM ]);
-
- return ((ret > 0) ? ret : 0);
-}
-
-unsigned int item_value( item_def item, id_arr id, bool ident )
-{
- // Note that we pass item in by value, since we want a local
- // copy to mangle as neccessary... maybe that should be fixed,
- // but this function isn't called too often.
- item.flags = (ident) ? (item.flags | ISFLAG_IDENT_MASK) : (item.flags);
-
- int valued = 0;
-
- switch (item.base_type)
- {
- case OBJ_WEAPONS:
- if (is_fixed_artefact( item ))
- {
- if (item_ident( item, ISFLAG_KNOW_PROPERTIES ))
- {
- switch (item.special)
- {
- case SPWPN_SWORD_OF_CEREBOV:
- valued += 2000;
- break;
-
- case SPWPN_SCEPTRE_OF_ASMODEUS:
- valued += 1500;
- break;
-
- case SPWPN_SWORD_OF_ZONGULDROK:
- valued += 1250;
- break;
-
- case SPWPN_SCEPTRE_OF_TORMENT:
- case SPWPN_SINGING_SWORD:
- case SPWPN_STAFF_OF_DISPATER:
- valued += 1200;
- break;
-
- case SPWPN_GLAIVE_OF_PRUNE:
- case SPWPN_WRATH_OF_TROG:
- valued += 1000;
- break;
-
- case SPWPN_SCYTHE_OF_CURSES:
- valued += 800;
- break;
-
- case SPWPN_MACE_OF_VARIABILITY:
- valued += 700;
- break;
-
- default:
- valued += 1000;
- break;
- }
- break;
- }
-
- } // end uniques
-
- switch (item.sub_type)
- {
- case WPN_CLUB:
- case WPN_KNIFE:
- valued += 10;
- break;
-
- case WPN_SLING:
- valued += 15;
- break;
-
- case WPN_GIANT_CLUB:
- valued += 17;
- break;
-
- case WPN_GIANT_SPIKED_CLUB:
- valued += 19;
- break;
-
- case WPN_DAGGER:
- valued += 20;
- break;
-
- case WPN_WHIP:
- case WPN_BLOWGUN:
- valued += 25;
- break;
-
- case WPN_HAND_AXE:
- valued += 28;
- break;
-
- case WPN_HAMMER:
- case WPN_FALCHION:
- case WPN_MACE:
- case WPN_SCYTHE:
- valued += 30;
- break;
-
- case WPN_BOW:
- valued += 31;
- break;
-
- case WPN_QUARTERSTAFF:
- case WPN_SHORT_SWORD:
- case WPN_SPEAR:
- valued += 32;
- break;
-
- case WPN_FLAIL:
- valued += 35;
- break;
-
- case WPN_ANCUS:
- case WPN_WAR_AXE:
- case WPN_MORNINGSTAR:
- case WPN_SABRE:
- valued += 40;
- break;
-
- case WPN_CROSSBOW:
- valued += 41;
- break;
-
- case WPN_TRIDENT:
- valued += 42;
- break;
-
- case WPN_LONG_SWORD:
- case WPN_LONGBOW:
- case WPN_SCIMITAR:
- valued += 45;
- break;
-
- case WPN_SPIKED_FLAIL:
- valued += 50;
-
- case WPN_HAND_CROSSBOW:
- valued += 51;
- break;
-
- case WPN_HALBERD:
- valued += 52;
- break;
-
- case WPN_GLAIVE:
- valued += 55;
- break;
-
- case WPN_BROAD_AXE:
- case WPN_GREAT_SWORD:
- valued += 60;
- break;
-
- case WPN_BATTLEAXE:
- case WPN_GREAT_MACE:
- valued += 65;
- break;
-
- case WPN_DIRE_FLAIL:
- case WPN_LOCHABER_AXE:
- valued += 90;
- break;
-
- case WPN_EVENINGSTAR:
- valued += 65;
- break;
-
- case WPN_EXECUTIONERS_AXE:
- valued += 100;
- break;
-
- case WPN_DOUBLE_SWORD:
- valued += 100;
- break;
-
- case WPN_DEMON_WHIP:
- valued += 130;
- break;
-
- case WPN_QUICK_BLADE:
- case WPN_DEMON_TRIDENT:
- valued += 150;
- break;
-
- case WPN_KATANA:
- case WPN_TRIPLE_SWORD:
- case WPN_DEMON_BLADE:
- case WPN_BLESSED_BLADE:
- case WPN_LAJATANG:
- valued += 200;
- break;
- }
-
- if (item_ident( item, ISFLAG_KNOW_TYPE ))
- {
- switch (get_weapon_brand( item ))
- {
- case SPWPN_NORMAL:
- default: // randart
- valued *= 10;
- break;
-
- case SPWPN_DRAINING:
- valued *= 64;
- break;
-
- case SPWPN_VAMPIRICISM:
- valued *= 60;
- break;
-
- case SPWPN_DISRUPTION:
- case SPWPN_FLAME:
- case SPWPN_FROST:
- case SPWPN_HOLY_WRATH:
- case SPWPN_REACHING:
- valued *= 50;
- break;
-
- case SPWPN_SPEED:
- valued *= 40;
- break;
-
- case SPWPN_DISTORTION:
- case SPWPN_ELECTROCUTION:
- case SPWPN_PAIN:
- case SPWPN_VORPAL:
- valued *= 30;
- break;
-
- case SPWPN_FLAMING:
- case SPWPN_FREEZING:
- valued *= 25;
- break;
-
- case SPWPN_VENOM:
- valued *= 23;
- break;
-
- case SPWPN_ORC_SLAYING:
- valued *= 21;
- break;
-
- case SPWPN_PROTECTION:
- valued *= 20;
- break;
- }
-
- valued /= 10;
- }
-
- // elf/dwarf
- if (get_equip_race(item) == ISFLAG_ELVEN
- || get_equip_race(item) == ISFLAG_DWARVEN)
- {
- valued *= 12;
- valued /= 10;
- }
-
- // value was "6" but comment read "orc", so I went with comment {dlb}
- if (get_equip_race(item) == ISFLAG_ORCISH)
- {
- valued *= 8;
- valued /= 10;
- }
-
- if (item_ident( item, ISFLAG_KNOW_PLUSES ))
- {
- if (item.plus >= 0)
- {
- valued += item.plus * 2;
- valued *= 10 + 3 * item.plus;
- valued /= 10;
- }
-
- if (item.plus2 >= 0)
- {
- valued += item.plus2 * 2;
- valued *= 10 + 3 * item.plus2;
- valued /= 10;
- }
-
- if (item.plus < 0)
- {
- valued -= 5;
- valued += (item.plus * item.plus * item.plus);
-
- if (valued < 1)
- valued = 1;
- //break;
- }
-
- if (item.plus2 < 0)
- {
- valued -= 5;
- valued += (item.plus2 * item.plus2 * item.plus2);
-
- if (valued < 1)
- valued = 1;
- }
- }
-
- if (is_random_artefact( item ))
- {
- if (item_ident( item, ISFLAG_KNOW_TYPE ))
- valued += (7 * randart_value( item ));
- else
- valued += 50;
- }
- else if (item_ident( item, ISFLAG_KNOW_TYPE )
- && get_equip_desc(item) != 0)
- {
- valued += 20;
- }
-
- if (item_cursed( item ))
- {
- valued *= 6;
- valued /= 10;
- }
- break;
-
- case OBJ_MISSILES: // ammunition
- if (item_ident( item, ISFLAG_KNOW_PLUSES ))
- {
- // assume not cursed (can they be anyway?)
- if (item.plus < 0)
- valued -= 11150;
-
- if (item.plus >= 0)
- valued += (item.plus * 2);
- }
-
- switch (item.sub_type)
- {
- case MI_DART:
- case MI_LARGE_ROCK:
- case MI_STONE:
- case MI_NONE:
- valued++;
- break;
- case MI_ARROW:
- case MI_BOLT:
- case MI_NEEDLE:
- valued += 2;
- break;
- default:
- // was: cases 6 through 16 with empty strcat()'s 15jan2000 {dlb}
- valued += 5;
- break; //strcat(glog , ""); break;
- }
- break;
-
- case OBJ_ARMOUR:
- switch (item.sub_type)
- {
- case ARM_GOLD_DRAGON_ARMOUR:
- valued += 1600;
- break;
-
- case ARM_GOLD_DRAGON_HIDE:
- valued += 1400;
- break;
-
- case ARM_STORM_DRAGON_ARMOUR:
- valued += 1050;
- break;
-
- case ARM_STORM_DRAGON_HIDE:
- valued += 900;
- break;
-
- case ARM_DRAGON_ARMOUR:
- case ARM_ICE_DRAGON_ARMOUR:
- valued += 750;
- break;
-
- case ARM_SWAMP_DRAGON_ARMOUR:
- valued += 650;
- break;
-
- case ARM_DRAGON_HIDE:
- case ARM_CRYSTAL_PLATE_MAIL:
- case ARM_TROLL_LEATHER_ARMOUR:
- case ARM_ICE_DRAGON_HIDE:
- valued += 500;
- break;
-
- case ARM_MOTTLED_DRAGON_ARMOUR:
- case ARM_SWAMP_DRAGON_HIDE:
- valued += 400;
- break;
-
- case ARM_STEAM_DRAGON_ARMOUR:
- case ARM_MOTTLED_DRAGON_HIDE:
- valued += 300;
- break;
-
- case ARM_PLATE_MAIL:
- valued += 230;
- break;
-
- case ARM_STEAM_DRAGON_HIDE:
- valued += 200;
- break;
-
- case ARM_BANDED_MAIL:
- case ARM_CENTAUR_BARDING:
- case ARM_NAGA_BARDING:
- valued += 150;
- break;
-
- case ARM_SPLINT_MAIL:
- valued += 140;
- break;
-
- case ARM_TROLL_HIDE:
- valued += 130;
- break;
-
- case ARM_CHAIN_MAIL:
- valued += 110;
- break;
-
- case ARM_SCALE_MAIL:
- valued += 83;
- break;
-
- case ARM_LARGE_SHIELD:
- valued += 75;
- break;
-
- case ARM_SHIELD:
- valued += 45;
- break;
-
- case ARM_RING_MAIL:
- valued += 40;
- break;
-
- case ARM_HELMET:
- case ARM_BUCKLER:
- valued += 25;
- break;
-
- case ARM_LEATHER_ARMOUR:
- valued += 20;
- break;
-
- case ARM_BOOTS:
- valued += 15;
- break;
-
- case ARM_GLOVES:
- valued += 12;
- break;
-
- case ARM_CLOAK:
- valued += 10;
- break;
-
- case ARM_ROBE:
- valued += 7;
- break;
-
- case ARM_ANIMAL_SKIN:
- valued += 3;
- break;
- }
-
- if (item_ident( item, ISFLAG_KNOW_TYPE ))
- {
- const int sparm = get_armour_ego_type( item );
- switch (sparm)
- {
- case SPARM_NORMAL:
- default:
- valued *= 10;
- break;
-
- case SPARM_ARCHMAGI:
- valued *= 100;
- break;
-
- case SPARM_DARKNESS:
- case SPARM_RESISTANCE:
- valued *= 60;
- break;
-
- case SPARM_POSITIVE_ENERGY:
- valued *= 50;
- break;
-
- case SPARM_MAGIC_RESISTANCE:
- case SPARM_PROTECTION:
- case SPARM_RUNNING:
- valued *= 40;
- break;
-
- case SPARM_COLD_RESISTANCE:
- case SPARM_DEXTERITY:
- case SPARM_FIRE_RESISTANCE:
- case SPARM_SEE_INVISIBLE:
- case SPARM_INTELLIGENCE:
- case SPARM_LEVITATION:
- case SPARM_PRESERVATION:
- case SPARM_STEALTH:
- case SPARM_STRENGTH:
- valued *= 30;
- break;
-
- case SPARM_POISON_RESISTANCE:
- valued *= 20;
- break;
-
- case SPARM_PONDEROUSNESS:
- valued *= 5;
- break;
- }
-
- valued /= 10;
- }
-
- if (get_equip_race(item) == ISFLAG_ELVEN
- || get_equip_race(item) == ISFLAG_DWARVEN)
- {
- valued *= 12;
- valued /= 10;
- }
-
- if (get_equip_race(item) == ISFLAG_ORCISH)
- {
- valued *= 8;
- valued /= 10;
- }
-
- if (item_ident( item, ISFLAG_KNOW_PLUSES ))
- {
- valued += 5;
- if (item.plus >= 0)
- {
- valued += item.plus * 30;
- valued *= 10 + 4 * item.plus;
- valued /= 10;
- }
-
- if (item.plus < 0)
- {
- valued += item.plus * item.plus * item.plus;
-
- if (valued < 1)
- valued = 1;
- }
- }
-
- if (is_random_artefact( item ))
- {
- if (item_ident( item, ISFLAG_KNOW_TYPE ))
- valued += (7 * randart_value( item ));
- else
- valued += 50;
- }
- else if (item_ident( item, ISFLAG_KNOW_TYPE )
- && get_equip_desc(item) != 0)
- {
- valued += 20;
- }
-
- if (item_cursed( item ))
- {
- valued *= 6;
- valued /= 10;
- }
- break;
-
- case OBJ_WANDS:
- if (!id[ IDTYPE_WANDS ][item.sub_type])
- valued += 200;
- else
- {
- switch (item.sub_type)
- {
- case WAND_FIREBALL:
- case WAND_HASTING:
- valued += 600;
- break;
-
- case WAND_HEALING:
- case WAND_TELEPORTATION:
- valued += 500;
- break;
-
- case WAND_INVISIBILITY:
- case WAND_DISINTEGRATION:
- case WAND_LIGHTNING:
- valued += 400;
- break;
-
- case WAND_COLD:
- case WAND_FIRE:
- valued += 350;
- break;
-
- case WAND_DIGGING:
- valued += 200;
- break;
-
- case WAND_FLAME:
- case WAND_FROST:
- case WAND_DRAINING:
- case WAND_PARALYSIS:
- valued += 150;
- break;
-
- case WAND_ENSLAVEMENT:
- case WAND_POLYMORPH_OTHER:
- case WAND_SLOWING:
- valued += 100;
- break;
-
- case WAND_CONFUSION:
- case WAND_MAGIC_DARTS:
- case WAND_RANDOM_EFFECTS:
- default:
- valued += 75;
- break;
- }
-
- if (item_ident( item, ISFLAG_KNOW_PLUSES ))
- {
- if (item.plus == 0)
- valued -= 50;
- else
- valued = (valued * (item.plus + 45)) / 50;
- }
- }
- break;
-
- case OBJ_POTIONS:
- if (!id[3][item.sub_type])
- valued += 9;
- else
- {
- switch (item.sub_type)
- {
- case POT_EXPERIENCE:
- valued += 500;
- break;
- case POT_GAIN_DEXTERITY:
- case POT_GAIN_INTELLIGENCE:
- case POT_GAIN_STRENGTH:
- valued += 350;
- break;
- case POT_CURE_MUTATION:
- valued += 150;
- break;
- case POT_MAGIC:
- valued += 120;
- break;
- case POT_INVISIBILITY:
- valued += 55;
- break;
- case POT_MUTATION:
- case POT_RESTORE_ABILITIES:
- valued += 50;
- break;
- case POT_BERSERK_RAGE:
- case POT_HEAL_WOUNDS:
- valued += 30;
- break;
- case POT_MIGHT:
- case POT_SPEED:
- valued += 25;
- break;
- case POT_HEALING:
- case POT_LEVITATION:
- valued += 20;
- break;
- case POT_PORRIDGE:
- valued += 10;
- break;
- case POT_CONFUSION:
- case POT_DECAY:
- case POT_DEGENERATION:
- case POT_PARALYSIS:
- case POT_POISON:
- case POT_SLOWING:
- case POT_STRONG_POISON:
- case POT_WATER:
- valued++;
- break;
- }
- }
- break;
-
- case OBJ_FOOD:
- switch (item.sub_type)
- {
- case FOOD_ROYAL_JELLY:
- valued = 120;
- break;
-
- case FOOD_MEAT_RATION:
- case FOOD_BREAD_RATION:
- valued = 40;
- break;
-
- case FOOD_HONEYCOMB:
- valued = 25;
- break;
-
- case FOOD_BEEF_JERKY:
- case FOOD_PIZZA:
- valued = 18;
- break;
-
- case FOOD_CHEESE:
- case FOOD_SAUSAGE:
- valued = 15;
- break;
-
- case FOOD_LEMON:
- case FOOD_ORANGE:
- case FOOD_BANANA:
- valued = 12;
- break;
-
- case FOOD_APPLE:
- case FOOD_APRICOT:
- case FOOD_PEAR:
- valued = 8;
- break;
-
- case FOOD_CHOKO:
- case FOOD_LYCHEE:
- case FOOD_RAMBUTAN:
- case FOOD_SNOZZCUMBER:
- case FOOD_CHUNK:
- valued = 4;
- break;
-
- case FOOD_STRAWBERRY:
- case FOOD_GRAPE:
- case FOOD_SULTANA:
- valued = 1;
- break;
- }
- break;
-
- case OBJ_SCROLLS:
- if (!id[1][item.sub_type])
- valued += 10;
- else
- switch (item.sub_type)
- {
- case SCR_ACQUIREMENT:
- valued += 520;
- break;
- case SCR_ENCHANT_WEAPON_III:
- case SCR_VORPALISE_WEAPON:
- valued += 200;
- break;
- case SCR_SUMMONING:
- valued += 95;
- break;
- case SCR_TORMENT:
- valued += 75;
- break;
- case SCR_ENCHANT_WEAPON_II:
- valued += 55;
- break;
- case SCR_RECHARGING:
- valued += 50;
- break;
- case SCR_ENCHANT_ARMOUR:
- case SCR_ENCHANT_WEAPON_I:
- valued += 48;
- break;
- case SCR_FEAR:
- valued += 45;
- break;
- case SCR_MAGIC_MAPPING:
- valued += 35;
- break;
- case SCR_BLINKING:
- case SCR_REMOVE_CURSE:
- case SCR_TELEPORTATION:
- valued += 30;
- break;
- case SCR_DETECT_CURSE:
- case SCR_IDENTIFY:
- valued += 20;
- break;
- case SCR_NOISE:
- case SCR_RANDOM_USELESSNESS:
- valued += 2;
- break;
- case SCR_CURSE_ARMOUR:
- case SCR_CURSE_WEAPON:
- case SCR_FORGETFULNESS:
- case SCR_PAPER:
- case SCR_IMMOLATION:
- valued++;
- break;
- }
- break;
-
- case OBJ_JEWELLERY:
- if (!id[2][item.sub_type])
- valued += 50;
-
- if (item_cursed( item ))
- valued -= 10;
-
- if (id[2][item.sub_type] > 0)
- {
- if (item_ident( item, ISFLAG_KNOW_PLUSES )
- && (item.sub_type == RING_PROTECTION
- || item.sub_type == RING_STRENGTH
- || item.sub_type == RING_EVASION
- || item.sub_type == RING_DEXTERITY
- || item.sub_type == RING_INTELLIGENCE
- || item.sub_type == RING_SLAYING))
- {
- if (item.plus > 0)
- valued += 10 * item.plus;
-
- if (item.sub_type == RING_SLAYING && item.plus2 > 0)
- valued += 10 * item.plus;
- }
-
- switch (item.sub_type)
- {
- case RING_INVISIBILITY:
- valued += 100;
- break;
- case RING_REGENERATION:
- valued += 75;
- break;
- case RING_FIRE:
- case RING_ICE:
- valued += 62;
- break;
- case RING_LIFE_PROTECTION:
- valued += 60;
- break;
- case RING_TELEPORT_CONTROL:
- valued += 42;
- break;
- case RING_MAGICAL_POWER:
- case RING_PROTECTION_FROM_MAGIC:
- valued += 40;
- break;
- case RING_WIZARDRY:
- valued += 35;
- break;
- case RING_LEVITATION:
- case RING_POISON_RESISTANCE:
- case RING_PROTECTION_FROM_COLD:
- case RING_PROTECTION_FROM_FIRE:
- case RING_SLAYING:
- valued += 30;
- break;
- case RING_SUSTAIN_ABILITIES:
- case RING_SUSTENANCE:
- valued += 25;
- break;
- case RING_SEE_INVISIBLE:
- valued += 20;
- break;
- case RING_DEXTERITY:
- case RING_EVASION:
- case RING_INTELLIGENCE:
- case RING_PROTECTION:
- case RING_STRENGTH:
- valued += 10;
- break;
- case RING_TELEPORTATION:
- valued -= 10;
- break;
- case RING_HUNGER:
- valued -= 50;
- break;
- case AMU_THE_GOURMAND:
- valued += 35;
- break;
- case AMU_CLARITY:
- case AMU_RESIST_CORROSION:
- case AMU_RESIST_MUTATION:
- case AMU_RESIST_SLOW:
- case AMU_WARDING:
- valued += 30;
- break;
- case AMU_CONSERVATION:
- case AMU_CONTROLLED_FLIGHT:
- valued += 25;
- break;
- case AMU_RAGE:
- valued += 20;
- break;
- case AMU_INACCURACY:
- valued -= 50;
- break;
- // got to do delusion!
- }
-
- if (is_random_artefact(item))
- {
- if (item_ident(item, ISFLAG_KNOW_TYPE))
- {
- if (valued < 0)
- valued = randart_value( item ) - 5;
- else
- valued += randart_value( item );
- }
- else
- {
- valued += 50;
- }
- }
-
- valued *= 7;
- }
- break;
-
- case OBJ_MISCELLANY:
- if (item_ident( item, ISFLAG_KNOW_TYPE ))
- {
- switch (item.sub_type)
- {
- case MISC_RUNE_OF_ZOT: // upped from 1200 to encourage collecting
- valued += 10000;
- break;
- case MISC_HORN_OF_GERYON:
- valued += 5000;
- break;
- case MISC_DISC_OF_STORMS:
- valued += 2000;
- break;
- case MISC_CRYSTAL_BALL_OF_SEEING:
- valued += 500;
- break;
- case MISC_BOTTLED_EFREET:
- valued += 400;
- break;
- case MISC_CRYSTAL_BALL_OF_FIXATION:
- case MISC_EMPTY_EBONY_CASKET:
- valued += 20;
- break;
- default:
- valued += 500;
- }
- }
- else
- {
- switch (item.sub_type)
- {
- case MISC_RUNE_OF_ZOT:
- valued += 5000;
- break;
- case MISC_HORN_OF_GERYON:
- valued += 1000;
- break;
- case MISC_CRYSTAL_BALL_OF_SEEING:
- valued += 450;
- break;
- case MISC_BOTTLED_EFREET:
- valued += 350;
- break;
- case MISC_DECK_OF_TRICKS:
- valued += 100;
- break;
- default:
- valued += 400;
- }
- }
- break;
-
- //case 10: break;
-
- case OBJ_BOOKS:
- valued = 150 + (item_ident( item, ISFLAG_KNOW_TYPE )
- ? book_rarity(item.sub_type) * 50 : 0);
- break;
-
- case OBJ_STAVES:
- if (!item_ident( item, ISFLAG_KNOW_TYPE ))
- valued = 120;
- else if (item.sub_type == STAFF_SMITING
- || item.sub_type == STAFF_STRIKING
- || item.sub_type == STAFF_WARDING
- || item.sub_type == STAFF_DISCOVERY)
- {
- valued = 150;
- }
- else
- valued = 250;
-
- if (item_is_rod( item ) && item_ident( item, ISFLAG_KNOW_PLUSES ))
- valued += 50 * (item.plus2 / ROD_CHARGE_MULT);
-
- break;
-
- case OBJ_ORBS:
- valued = 250000;
- break;
- } // end switch
-
- if (valued < 1)
- valued = 1;
-
- valued *= item.quantity;
-
- return (valued);
-} // end item_value()
-
-void shop(void)
-{
- unsigned char i = 0;
-
- for (i = 0; i < MAX_SHOPS; i++)
- {
- if (env.shop[i].x == you.x_pos && env.shop[i].y == you.y_pos)
- break;
- }
-
- if (i == MAX_SHOPS)
- {
- mpr("Help! Non-existent shop.");
- return;
- }
-
- id_arr identy;
-
- save_id(identy);
-
- in_a_shop(i, identy);
- you.redraw_gold = 1;
- burden_change();
-
- redraw_screen();
-} // end shop()
-
-const shop_struct *get_shop(int sx, int sy)
-{
- if (grd[sx][sy] != DNGN_ENTER_SHOP)
- return (NULL);
-
- // find shop
- for (int shoppy = 0; shoppy < MAX_SHOPS; shoppy ++)
- {
- // find shop index plus a little bit of paranoia
- if (env.shop[shoppy].x == sx && env.shop[shoppy].y == sy &&
- env.shop[shoppy].type != SHOP_UNASSIGNED)
- {
- return (&env.shop[shoppy]);
- }
- }
- return (NULL);
-}
-
-const char *shop_name(int sx, int sy)
-{
- static char sh_name[80];
- const shop_struct *cshop = get_shop(sx, sy);
-
- // paranoia
- if (grd[sx][sy] != DNGN_ENTER_SHOP)
- return ("");
-
- if (!cshop)
- {
- mpr("Help! Non-existent shop.");
- return ("Buggy Shop");
- }
-
- int shop_type = cshop->type;
-
- char st_p[ITEMNAME_SIZE];
-
- unsigned long seed = static_cast<unsigned long>( cshop->keeper_name[0] )
- | (static_cast<unsigned long>( cshop->keeper_name[1] ) << 8)
- | (static_cast<unsigned long>( cshop->keeper_name[1] ) << 16);
- make_name( seed, false, st_p );
-
- strcpy(sh_name, st_p);
- strcat(sh_name, "'s ");
-
- if (shop_type == SHOP_WEAPON_ANTIQUE || shop_type == SHOP_ARMOUR_ANTIQUE)
- strcat( sh_name, "Antique " );
-
- strcat(sh_name, (shop_type == SHOP_WEAPON
- || shop_type == SHOP_WEAPON_ANTIQUE) ? "Weapon" :
- (shop_type == SHOP_ARMOUR
- || shop_type == SHOP_ARMOUR_ANTIQUE) ? "Armour" :
-
- (shop_type == SHOP_JEWELLERY) ? "Jewellery" :
- (shop_type == SHOP_WAND) ? "Magical Wand" :
- (shop_type == SHOP_BOOK) ? "Book" :
- (shop_type == SHOP_FOOD) ? "Food" :
- (shop_type == SHOP_SCROLL) ? "Magic Scroll" :
- (shop_type == SHOP_GENERAL_ANTIQUE) ? "Assorted Antiques" :
- (shop_type == SHOP_DISTILLERY) ? "Distillery" :
- (shop_type == SHOP_GENERAL) ? "General Store"
- : "Bug");
-
-
- if (shop_type != SHOP_GENERAL
- && shop_type != SHOP_GENERAL_ANTIQUE && shop_type != SHOP_DISTILLERY)
- {
- int temp = sx + sy % 4;
- strcat( sh_name, (temp == 0) ? " Shoppe" :
- (temp == 1) ? " Boutique" :
- (temp == 2) ? " Emporium"
- : " Shop" );
- }
-
- return (sh_name);
-}