Changeset 891

Show
Ignore:
Timestamp:
05/11/08 21:53:09 (4 months ago)
Author:
takkaria
Message:

Fix #140: Move store stocking information into an external edit file, at long long last. This is actually less easy to break than the old system, since I realised that stores were still trying to stock non-existent staffs when getting errors with the new system...

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/defines.h

    r887 r891  
    235235#define STORE_TURNS             1000    /* Number of turns between turnovers */ 
    236236#define STORE_SHUFFLE   25              /* 1/Chance (per day) of an owner changing */ 
    237 #define STORE_CHOICES   32              /* Number of choices in the store selection table */ 
    238237 
    239238 
  • trunk/src/externs.h

    r828 r891  
    7777extern const char *inscrip_text[]; 
    7878extern const grouper object_text_order[]; 
    79 extern const byte store_choices[MAX_STORES-2][STORE_CHOICES][2]; 
    8079 
    8180/* variable.c */ 
  • trunk/src/init.h

    r564 r891  
    1818 * Parse errors 
    1919 */ 
    20 #define PARSE_ERROR_GENERIC                  1 
    21 #define PARSE_ERROR_OBSOLETE_FILE            2 
    22 #define PARSE_ERROR_MISSING_RECORD_HEADER    3 
    23 #define PARSE_ERROR_NON_SEQUENTIAL_RECORDS   4 
    24 #define PARSE_ERROR_INVALID_FLAG             5 
    25 #define PARSE_ERROR_UNDEFINED_DIRECTIVE      6 
    26 #define PARSE_ERROR_OUT_OF_MEMORY            7 
    27 #define PARSE_ERROR_OUT_OF_BOUNDS            8 
    28 #define PARSE_ERROR_TOO_FEW_ARGUMENTS        9 
    29 #define PARSE_ERROR_TOO_MANY_ARGUMENTS      10 
    30 #define PARSE_ERROR_TOO_MANY_ALLOCATIONS    11 
    31 #define PARSE_ERROR_INVALID_SPELL_FREQ      12 
    32 #define PARSE_ERROR_INVALID_ITEM_NUMBER     13 
    33 #define PARSE_ERROR_TOO_MANY_ENTRIES        14 
    34 #define PARSE_ERROR_VAULT_TOO_BIG           15 
     20enum 
     21
     22        PARSE_ERROR_GENERIC = 1, 
     23        PARSE_ERROR_INVALID_FLAG, 
     24        PARSE_ERROR_INVALID_ITEM_NUMBER, 
     25        PARSE_ERROR_INVALID_SPELL_FREQ, 
     26        PARSE_ERROR_MISSING_COLON, 
     27        PARSE_ERROR_MISSING_FIELD, 
     28        PARSE_ERROR_MISSING_RECORD_HEADER, 
     29        PARSE_ERROR_NON_SEQUENTIAL_RECORDS, 
     30        PARSE_ERROR_OBSOLETE_FILE, 
     31        PARSE_ERROR_OUT_OF_BOUNDS, 
     32        PARSE_ERROR_OUT_OF_MEMORY, 
     33        PARSE_ERROR_TOO_MANY_ARGUMENTS, 
     34        PARSE_ERROR_TOO_FEW_ENTRIES, 
     35        PARSE_ERROR_TOO_MANY_ENTRIES, 
     36        PARSE_ERROR_UNDEFINED_DIRECTIVE, 
     37        PARSE_ERROR_UNRECOGNISED_TVAL, 
     38        PARSE_ERROR_UNRECOGNISED_SVAL, 
     39        PARSE_ERROR_VAULT_TOO_BIG, 
    3540 
    36 #define PARSE_ERROR_MAX                     16 
     41        PARSE_ERROR_MAX 
     42}; 
    3743 
    3844 
     
    105111extern errr init_info_txt(ang_file *fp, char *buf, header *head, 
    106112                          parse_info_txt_func parse_info_txt_line); 
     113extern errr init_store_txt(ang_file *fp, char *buf); 
    107114 
    108115extern errr eval_info(eval_info_power_func eval_info_process, header *head); 
  • trunk/src/init1.c

    r887 r891  
    676676        return (index); 
    677677} 
     678 
     679 
     680/** 
     681 * Initialise the store stocking lists. 
     682 */ 
     683errr init_store_txt(ang_file *fp, char *buf) 
     684{ 
     685        int i; 
     686 
     687        int store_num = -1; 
     688        store_type *st_ptr; 
     689 
     690        error_idx = -1; 
     691        error_line = 0; 
     692 
     693 
     694        /* Allocate the stores */ 
     695        store = C_ZNEW(MAX_STORES, store_type); 
     696        for (i = 0; i < MAX_STORES; i++) 
     697        { 
     698                st_ptr = &store[i]; 
     699 
     700                /* Assume stock */ 
     701                st_ptr->stock_size = STORE_INVEN_MAX; 
     702                st_ptr->stock = C_ZNEW(st_ptr->stock_size, object_type); 
     703        } 
     704 
     705        st_ptr = NULL; 
     706 
     707 
     708        while (file_getl(fp, buf, 1024)) 
     709        { 
     710                error_line++; 
     711 
     712                if (!buf[0] || buf[0] == '#') 
     713                        continue; 
     714 
     715                else if (buf[0] == 'S') 
     716                { 
     717                        int num, slots; 
     718 
     719                        /* Make sure all the previous slots have been filled */ 
     720                        if (st_ptr) 
     721                        { 
     722                                if (st_ptr->table_num != st_ptr->table_size) 
     723                                { 
     724                                        msg_format("Store %d has too few entries (read %d, expected %d).", error_idx, st_ptr->table_num, st_ptr->table_size); 
     725                                        return PARSE_ERROR_TOO_FEW_ENTRIES; 
     726                                } 
     727                        } 
     728 
     729 
     730                        if (2 != sscanf(buf, "S:%d:%d", &num, &slots)) 
     731                                return PARSE_ERROR_GENERIC; 
     732 
     733                        if (num < 2 || num > 6) 
     734                                return PARSE_ERROR_GENERIC; 
     735 
     736                        error_idx = num; 
     737 
     738                        /* Account for 0-based indexing */ 
     739                        num--; 
     740                        store_num = num; 
     741 
     742                        /* Set up this store */ 
     743                        st_ptr = &store[num]; 
     744                        st_ptr->table_size = slots; 
     745                        st_ptr->table = C_ZNEW(st_ptr->table_size, s16b); 
     746                } 
     747 
     748                else if (buf[0] == 'I') 
     749                { 
     750                        int slots, tval; 
     751                        int k_idx; 
     752 
     753                        char *tval_s; 
     754                        char *sval_s; 
     755 
     756                        if (store_num == -1 || !st_ptr) 
     757                                return PARSE_ERROR_GENERIC; 
     758 
     759                        if (1 != sscanf(buf, "I:%d:", &slots)) 
     760                                return PARSE_ERROR_GENERIC; 
     761 
     762                        if (st_ptr->table_num + slots > st_ptr->table_size) 
     763                                return PARSE_ERROR_TOO_MANY_ENTRIES; 
     764 
     765                        /* Find the beginning of the tval field */ 
     766                        tval_s = strchr(buf+2, ':'); 
     767                        if (!tval_s) return PARSE_ERROR_MISSING_COLON; 
     768                        *tval_s++ = '\0'; 
     769                        if (!*tval_s) return PARSE_ERROR_MISSING_FIELD; 
     770 
     771                        /* Now find the beginning of the sval field */ 
     772                        sval_s = strchr(tval_s, ':'); 
     773                        if (!sval_s) return PARSE_ERROR_MISSING_COLON; 
     774                        *sval_s++ = '\0'; 
     775                        if (!*sval_s) return PARSE_ERROR_MISSING_FIELD; 
     776 
     777                        /* Now convert the tval into its numeric equivalent */ 
     778                        tval = tval_find_idx(tval_s); 
     779                        if (tval == -1) return PARSE_ERROR_UNRECOGNISED_TVAL; 
     780 
     781                        k_idx = lookup_name(tval, sval_s); 
     782                        if (!k_idx) return PARSE_ERROR_UNRECOGNISED_SVAL; 
     783 
     784                        while (slots--) 
     785                                st_ptr->table[st_ptr->table_num++] = k_idx; 
     786                } 
     787 
     788                else 
     789                { 
     790                        return PARSE_ERROR_UNDEFINED_DIRECTIVE; 
     791                } 
     792        } 
     793 
     794        /* No errors */ 
     795        return 0; 
     796} 
     797 
     798 
    678799 
    679800 
     
    43834504 
    43844505#endif  /* ALLOW_TEMPLATES */ 
     4506 
  • trunk/src/init2.c

    r856 r891  
    217217 
    218218 
    219 #ifdef ALLOW_TEMPLATES 
    220  
    221219 
    222220/* 
     
    234232        NULL, 
    235233        "parse error", 
    236         "obsolete file", 
     234        "invalid flag specification", 
     235        "invalid number of items (0-99)", 
     236        "invalid spell frequency", 
     237        "missing colon", 
     238        "missing field", 
    237239        "missing record header", 
    238240        "non-sequential records", 
    239         "invalid flag specification", 
     241        "obsolete file", 
     242        "value out of bounds", 
     243        "out of memory", 
     244        "too many arguments", 
     245        "too few entries", 
     246        "too many entries", 
    240247        "undefined directive", 
    241         "out of memory", 
    242         "value out of bounds", 
    243         "too few arguments", 
    244         "too many arguments", 
    245         "too many allocation entries", 
    246         "invalid spell frequency", 
    247         "invalid number of items (0-99)", 
    248         "too many entries", 
     248        "unrecognised tval name", 
     249        "unrecognised sval name", 
    249250        "vault too big", 
    250251}; 
    251  
    252  
    253 #endif /* ALLOW_TEMPLATES */ 
    254252 
    255253 
     
    358356 
    359357 
    360 #ifdef ALLOW_TEMPLATES 
    361  
    362358/* 
    363359 * Display a parser error message. 
     
    379375        quit_fmt("Error in '%s.txt' file.", filename); 
    380376} 
    381  
    382 #endif /* ALLOW_TEMPLATES */ 
    383377 
    384378 
     
    963957} 
    964958 
     959 
     960/* 
     961 * Initialise stores, from the edit file. 
     962 */ 
     963static void init_stores(void) 
     964{ 
     965        errr err; 
     966        char filename[1024]; 
     967        char buf[1024]; 
     968        ang_file *fh; 
     969 
     970        path_build(filename, sizeof(filename), ANGBAND_DIR_EDIT, "store.txt"); 
     971 
     972        /* Open the file */ 
     973        fh = file_open(filename, MODE_READ, -1); 
     974        if (!fh) quit("Cannot open 'store.txt' file."); 
     975 
     976        /* Parse the file */ 
     977        err = init_store_txt(fh, buf); 
     978        file_close(fh); 
     979 
     980        /* Errors */ 
     981        if (err) display_parse_error("store", err, buf); 
     982 
     983        return; 
     984} 
     985 
     986 
    965987/*** Initialize others ***/ 
    966988 
     
    10671089        inventory = C_ZNEW(INVEN_TOTAL, object_type); 
    10681090 
    1069  
    1070         /*** Prepare the stores ***/ 
    1071  
    1072         /* Allocate the stores */ 
    1073         store = C_ZNEW(MAX_STORES, store_type); 
    1074  
    1075         /* Fill in each store */ 
    1076         for (i = 0; i < MAX_STORES; i++) 
    1077         { 
    1078                 int k; 
    1079  
    1080                 /* Get the store */ 
    1081                 store_type *st_ptr = &store[i]; 
    1082  
    1083                 /* Assume full stock */ 
    1084                 st_ptr->stock_size = STORE_INVEN_MAX; 
    1085  
    1086                 /* Allocate the stock */ 
    1087                 st_ptr->stock = C_ZNEW(st_ptr->stock_size, object_type); 
    1088  
    1089                 /* No table for the black market or home */ 
    1090                 if ((i == STORE_B_MARKET) || (i == STORE_HOME)) continue; 
    1091  
    1092                 /* Assume full table */ 
    1093                 st_ptr->table_size = STORE_CHOICES; 
    1094  
    1095                 /* Allocate the stock */ 
    1096                 st_ptr->table = C_ZNEW(st_ptr->table_size, s16b); 
    1097  
    1098                 /* Scan the choices */ 
    1099                 for (k = 0; k < STORE_CHOICES; k++) 
    1100                 { 
    1101                         int k_idx; 
    1102  
    1103                         /* Extract the tval/sval codes */ 
    1104                         int tv = store_choices[i][k][0]; 
    1105                         int sv = store_choices[i][k][1]; 
    1106  
    1107                         /* Look for it */ 
    1108                         for (k_idx = 1; k_idx < z_info->k_max; k_idx++) 
    1109                         { 
    1110                                 object_kind *k_ptr = &k_info[k_idx]; 
    1111  
    1112                                 /* Found a match */ 
    1113                                 if ((k_ptr->tval == tv) && (k_ptr->sval == sv)) break; 
    1114                         } 
    1115  
    1116                         /* Catch errors */ 
    1117                         if (k_idx == z_info->k_max) continue; 
    1118  
    1119                         /* Add that item index to the table */ 
    1120                         st_ptr->table[st_ptr->table_num++] = k_idx; 
    1121                 } 
    1122         } 
    11231091 
    11241092 
     
    13911359        /* This must occur before preference files are read(?) */ 
    13921360        init_cmd4_c(); 
    1393          
     1361 
     1362 
    13941363        /*** Initialize some arrays ***/ 
    13951364 
     
    14411410        event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (flavors)"); 
    14421411        if (init_flavor_info()) quit("Cannot initialize flavors"); 
    1443          
     1412 
    14441413        /* Initialize spell info */ 
    14451414        event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (spells)"); 
     
    14491418        event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (spellbooks)"); 
    14501419        init_books(); 
     1420 
     1421        /* Initialise store stocking data */ 
     1422        event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (store stocks)"); 
     1423        init_stores(); 
    14511424 
    14521425        /* Initialize some other arrays */ 
  • trunk/src/tables.c

    r887 r891  
    14151415}; 
    14161416 
    1417 const grouper object_text_order [] = 
     1417const grouper object_text_order[] = 
    14181418{ 
    14191419        {TV_RING,                       "Ring"                  }, 
     
    14501450        {0,                                     NULL                    } 
    14511451}; 
    1452  
    1453  
    1454  
    1455 /* 
    1456  * Objects sold in the stores, by tval/sval pair. 
    1457  */ 
    1458 const byte store_choices[MAX_STORES-2][STORE_CHOICES][2] = 
    1459 { 
    1460         { 
    1461                 /* General Store */ 
    1462  
    1463                 { 0, 0 }, 
    1464         }, 
    1465  
    1466         { 
    1467                 /* Armoury */ 
    1468  
    1469                 { TV_BOOTS, SV_PAIR_OF_SOFT_LEATHER_BOOTS }, 
    1470                 { TV_BOOTS, SV_PAIR_OF_SOFT_LEATHER_BOOTS }, 
    1471                 { TV_BOOTS, SV_PAIR_OF_HARD_LEATHER_BOOTS }, 
    1472                 { TV_BOOTS, SV_PAIR_OF_HARD_LEATHER_BOOTS }, 
    1473                 { TV_HELM, SV_HARD_LEATHER_CAP }, 
    1474                 { TV_HELM, SV_HARD_LEATHER_CAP }, 
    1475                 { TV_HELM, SV_METAL_CAP }, 
    1476                 { TV_HELM, SV_IRON_HELM }, 
    1477  
    1478                 { TV_SOFT_ARMOR, SV_ROBE }, 
    1479                 { TV_SOFT_ARMOR, SV_ROBE }, 
    1480                 { TV_SOFT_ARMOR, SV_SOFT_LEATHER_ARMOR }, 
    1481                 { TV_SOFT_ARMOR, SV_SOFT_LEATHER_ARMOR }, 
    1482                 { TV_SOFT_ARMOR, SV_HARD_LEATHER_ARMOR }, 
    1483                 { TV_SOFT_ARMOR, SV_HARD_LEATHER_ARMOR }, 
    1484                 { TV_SOFT_ARMOR, SV_HARD_STUDDED_LEATHER }, 
    1485                 { TV_SOFT_ARMOR, SV_HARD_STUDDED_LEATHER }, 
    1486  
    1487                 { TV_SOFT_ARMOR, SV_LEATHER_SCALE_MAIL }, 
    1488                 { TV_SOFT_ARMOR, SV_LEATHER_SCALE_MAIL }, 
    1489                 { TV_HARD_ARMOR, SV_METAL_SCALE_MAIL }, 
    1490                 { TV_HARD_ARMOR, SV_CHAIN_MAIL }, 
    1491                 { TV_HARD_ARMOR, SV_CHAIN_MAIL }, 
    1492                 { TV_HARD_ARMOR, SV_AUGMENTED_CHAIN_MAIL }, 
    1493                 { TV_HARD_ARMOR, SV_BAR_CHAIN_MAIL }, 
    1494                 { TV_HARD_ARMOR, SV_DOUBLE_CHAIN_MAIL }, 
    1495  
    1496                 { TV_HARD_ARMOR, SV_METAL_BRIGANDINE_ARMOUR }, 
    1497                 { TV_GLOVES, SV_SET_OF_LEATHER_GLOVES }, 
    1498                 { TV_GLOVES, SV_SET_OF_LEATHER_GLOVES }, 
    1499                 { TV_GLOVES, SV_SET_OF_GAUNTLETS }, 
    1500                 { TV_SHIELD, SV_SMALL_LEATHER_SHIELD }, 
    1501                 { TV_SHIELD, SV_SMALL_LEATHER_SHIELD }, 
    1502                 { TV_SHIELD, SV_LARGE_LEATHER_SHIELD }, 
    1503                 { TV_SHIELD, SV_SMALL_METAL_SHIELD } 
    1504         }, 
    1505  
    1506         { 
    1507                 /* Weaponsmith */ 
    1508  
    1509                 { TV_SWORD, SV_DAGGER }, 
    1510                 { TV_SWORD, SV_MAIN_GAUCHE }, 
    1511                 { TV_SWORD, SV_RAPIER }, 
    1512                 { TV_SWORD, SV_SMALL_SWORD }, 
    1513                 { TV_SWORD, SV_SHORT_SWORD }, 
    1514                 { TV_SWORD, SV_SABRE }, 
    1515                 { TV_SWORD, SV_CUTLASS }, 
    1516                 { TV_SWORD, SV_TULWAR }, 
    1517  
    1518                 { TV_SWORD, SV_BROAD_SWORD }, 
    1519                 { TV_SWORD, SV_LONG_SWORD }, 
    1520                 { TV_SWORD, SV_SCIMITAR }, 
    1521                 { TV_SWORD, SV_KATANA }, 
    1522                 { TV_SWORD, SV_BASTARD_SWORD }, 
    1523                 { TV_POLEARM, SV_SPEAR }, 
    1524                 { TV_POLEARM, SV_AWL_PIKE }, 
    1525                 { TV_POLEARM, SV_TRIDENT }, 
    1526  
    1527                 { TV_POLEARM, SV_PIKE }, 
    1528                 { TV_POLEARM, SV_BEAKED_AXE }, 
    1529                 { TV_POLEARM, SV_BROAD_AXE }, 
    1530                 { TV_POLEARM, SV_LANCE }, 
    1531                 { TV_POLEARM, SV_BATTLE_AXE }, 
    1532                 { TV_HAFTED, SV_WHIP }, 
    1533                 { TV_BOW, SV_SLING }, 
    1534                 { TV_BOW, SV_SHORT_BOW }, 
    1535  
    1536                 { TV_BOW, SV_LONG_BOW }, 
    1537                 { TV_BOW, SV_LIGHT_XBOW }, 
    1538                 { TV_SHOT, SV_AMMO_NORMAL }, 
    1539                 { TV_SHOT, SV_AMMO_NORMAL }, 
    1540                 { TV_ARROW, SV_AMMO_NORMAL }, 
    1541                 { TV_ARROW, SV_AMMO_NORMAL }, 
    1542                 { TV_BOLT, SV_AMMO_NORMAL }, 
    1543                 { TV_BOLT, SV_AMMO_NORMAL }, 
    1544         }, 
    1545  
    1546         { 
    1547                 /* Temple */ 
    1548  
    1549                 { TV_HAFTED, SV_WHIP }, 
    1550                 { TV_HAFTED, SV_QUARTERSTAFF }, 
    1551                 { TV_HAFTED, SV_MACE }, 
    1552                 { TV_HAFTED, SV_MACE }, 
    1553                 { TV_HAFTED, SV_BALL_AND_CHAIN }, 
    1554                 { TV_HAFTED, SV_WAR_HAMMER }, 
    1555                 { TV_HAFTED, SV_LUCERN_HAMMER }, 
    1556                 { TV_HAFTED, SV_MORNING_STAR }, 
    1557  
    1558                 { TV_HAFTED, SV_FLAIL }, 
    1559                 { TV_HAFTED, SV_FLAIL }, 
    1560                 { TV_HAFTED, SV_LEAD_FILLED_MACE }, 
    1561                 { TV_SCROLL, SV_SCROLL_REMOVE_CURSE }, 
    1562                 { TV_SCROLL, SV_SCROLL_BLESSING }, 
    1563                 { TV_SCROLL, SV_SCROLL_HOLY_CHANT }, 
    1564                 { TV_POTION, SV_POTION_BOLDNESS }, 
    1565                 { TV_POTION, SV_POTION_HEROISM }, 
    1566  
    1567                 { TV_POTION, SV_POTION_CURE_LIGHT }, 
    1568                 { TV_POTION, SV_POTION_CURE_LIGHT }, 
    1569                 { TV_POTION, SV_POTION_CURE_SERIOUS }, 
    1570                 { TV_POTION, SV_POTION_CURE_SERIOUS }, 
    1571                 { TV_POTION, SV_POTION_CURE_SERIOUS }, 
    1572                 { TV_POTION, SV_POTION_RESTORE_EXP }, 
    1573                 { TV_POTION, SV_POTION_RESTORE_EXP }, 
    1574                 { TV_POTION, SV_POTION_RESTORE_EXP }, 
    1575  
    1576                 { TV_PRAYER_BOOK, 0 }, 
    1577                 { TV_PRAYER_BOOK, 0 }, 
    1578                 { TV_PRAYER_BOOK, 0 }, 
    1579                 { TV_PRAYER_BOOK, 1 }, 
    1580                 { TV_PRAYER_BOOK, 1 }, 
    1581                 { TV_PRAYER_BOOK, 2 }, 
    1582                 { TV_PRAYER_BOOK, 2 }, 
    1583                 { TV_PRAYER_BOOK, 3 } 
    1584         }, 
    1585  
    1586         { 
    1587                 /* Alchemy shop */ 
    1588  
    1589                 { TV_SCROLL, SV_SCROLL_ENCHANT_WEAPON_TO_HIT }, 
    1590                 { TV_SCROLL, SV_SCROLL_ENCHANT_WEAPON_TO_DAM }, 
    1591                 { TV_SCROLL, SV_SCROLL_ENCHANT_ARMOR }, 
    1592                 { TV_SCROLL, SV_SCROLL_IDENTIFY }, 
    1593                 { TV_SCROLL, SV_SCROLL_IDENTIFY }, 
    1594                 { TV_SCROLL, SV_SCROLL_IDENTIFY }, 
    1595                 { TV_SCROLL, SV_SCROLL_IDENTIFY }, 
    1596                 { TV_SCROLL, SV_SCROLL_LIGHT }, 
    1597  
    1598                 { TV_SCROLL, SV_SCROLL_PHASE_DOOR }, 
    1599                 { TV_SCROLL, SV_SCROLL_PHASE_DOOR }, 
    1600                 { TV_SCROLL, SV_SCROLL_PHASE_DOOR }, 
    1601                 { TV_SCROLL, SV_SCROLL_MONSTER_CONFUSION }, 
    1602                 { TV_SCROLL, SV_SCROLL_MAPPING }, 
    1603                 { TV_SCROLL, SV_SCROLL_DETECT_GOLD }, 
    1604                 { TV_SCROLL, SV_SCROLL_DETECT_ITEM }, 
    1605                 { TV_SCROLL, SV_SCROLL_DETECT_TRAP }, 
    1606  
    1607                 { TV_SCROLL, SV_SCROLL_DETECT_DOOR }, 
    1608                 { TV_SCROLL, SV_SCROLL_DETECT_INVIS }, 
    1609                 { TV_SCROLL, SV_SCROLL_RECHARGING }, 
    1610                 { TV_SCROLL, SV_SCROLL_SATISFY_HUNGER }, 
    1611                 { TV_SCROLL, SV_SCROLL_WORD_OF_RECALL }, 
    1612                 { TV_SCROLL, SV_SCROLL_WORD_OF_RECALL }, 
    1613                 { TV_SCROLL, SV_SCROLL_WORD_OF_RECALL }, 
    1614                 { TV_SCROLL, SV_SCROLL_WORD_OF_RECALL }, 
    1615  
    1616                 { TV_POTION, SV_POTION_RESIST_HEAT }, 
    1617                 { TV_POTION, SV_POTION_RESIST_COLD }, 
    1618                 { TV_POTION, SV_POTION_RES_STR }, 
    1619                 { TV_POTION, SV_POTION_RES_INT }, 
    1620                 { TV_POTION, SV_POTION_RES_WIS }, 
    1621                 { TV_POTION, SV_POTION_RES_DEX }, 
    1622                 { TV_POTION, SV_POTION_RES_CON }, 
    1623                 { TV_POTION, SV_POTION_RES_CHR } 
    1624         }, 
    1625  
    1626         { 
    1627                 /* Magic-User store */ 
    1628  
    1629                 { TV_RING, SV_RING_SEARCHING }, 
    1630                 { TV_RING, SV_RING_FEATHER_FALL }, 
    1631                 { TV_RING, SV_RING_PROTECTION }, 
    1632                 { TV_AMULET, SV_AMULET_CHARISMA }, 
    1633                 { TV_AMULET, SV_AMULET_SLOW_DIGEST }, 
    1634                 { TV_AMULET, SV_AMULET_RESIST_ACID }, 
    1635                 { TV_WAND, SV_WAND_SLOW_MONSTER }, 
    1636                 { TV_WAND, SV_WAND_CONFUSE_MONSTER }, 
    1637  
    1638                 { TV_WAND, SV_WAND_SLEEP_MONSTER }, 
    1639                 { TV_WAND, SV_WAND_MAGIC_MISSILE }, 
    1640                 { TV_WAND, SV_WAND_STINKING_CLOUD }, 
    1641                 { TV_WAND, SV_WAND_WONDER }, 
    1642                 { TV_STAFF, SV_STAFF_LITE }, 
    1643                 { TV_STAFF, SV_STAFF_MAPPING }, 
    1644                 { TV_STAFF, SV_STAFF_DETECT_TRAP }, 
    1645                 { TV_STAFF, SV_STAFF_DETECT_DOOR }, 
    1646  
    1647                 { TV_STAFF, SV_STAFF_DETECT_GOLD }, 
    1648                 { TV_STAFF, SV_STAFF_DETECT_ITEM }, 
    1649                 { TV_STAFF, SV_STAFF_DETECT_INVIS }, 
    1650                 { TV_STAFF, SV_STAFF_DETECT_EVIL }, 
    1651                 { TV_STAFF, SV_STAFF_TELEPORTATION }, 
    1652                 { TV_STAFF, SV_STAFF_TELEPORTATION }, 
    1653                 { TV_STAFF, SV_STAFF_IDENTIFY }, 
    1654                 { TV_STAFF, SV_STAFF_IDENTIFY }, 
    1655  
    1656                 { TV_MAGIC_BOOK, 0 }, 
    1657                 { TV_MAGIC_BOOK, 0 }, 
    1658                 { TV_MAGIC_BOOK, 0 }, 
    1659                 { TV_MAGIC_BOOK, 1 }, 
    1660                 { TV_MAGIC_BOOK, 1 }, 
    1661                 { TV_MAGIC_BOOK, 2 }, 
    1662                 { TV_MAGIC_BOOK, 2 }, 
    1663                 { TV_MAGIC_BOOK, 3 } 
    1664         } 
    1665 };