Changeset 891
- Timestamp:
- 05/11/08 21:53:09 (4 months ago)
- Files:
-
- trunk/lib/edit/store.txt (added)
- trunk/src/defines.h (modified) (1 diff)
- trunk/src/externs.h (modified) (1 diff)
- trunk/src/init.h (modified) (2 diffs)
- trunk/src/init1.c (modified) (2 diffs)
- trunk/src/init2.c (modified) (9 diffs)
- trunk/src/tables.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/defines.h
r887 r891 235 235 #define STORE_TURNS 1000 /* Number of turns between turnovers */ 236 236 #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 */238 237 239 238 trunk/src/externs.h
r828 r891 77 77 extern const char *inscrip_text[]; 78 78 extern const grouper object_text_order[]; 79 extern const byte store_choices[MAX_STORES-2][STORE_CHOICES][2];80 79 81 80 /* variable.c */ trunk/src/init.h
r564 r891 18 18 * Parse errors 19 19 */ 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 20 enum 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, 35 40 36 #define PARSE_ERROR_MAX 16 41 PARSE_ERROR_MAX 42 }; 37 43 38 44 … … 105 111 extern errr init_info_txt(ang_file *fp, char *buf, header *head, 106 112 parse_info_txt_func parse_info_txt_line); 113 extern errr init_store_txt(ang_file *fp, char *buf); 107 114 108 115 extern errr eval_info(eval_info_power_func eval_info_process, header *head); trunk/src/init1.c
r887 r891 676 676 return (index); 677 677 } 678 679 680 /** 681 * Initialise the store stocking lists. 682 */ 683 errr 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 678 799 679 800 … … 4383 4504 4384 4505 #endif /* ALLOW_TEMPLATES */ 4506 trunk/src/init2.c
r856 r891 217 217 218 218 219 #ifdef ALLOW_TEMPLATES220 221 219 222 220 /* … … 234 232 NULL, 235 233 "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", 237 239 "missing record header", 238 240 "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", 240 247 "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", 249 250 "vault too big", 250 251 }; 251 252 253 #endif /* ALLOW_TEMPLATES */254 252 255 253 … … 358 356 359 357 360 #ifdef ALLOW_TEMPLATES361 362 358 /* 363 359 * Display a parser error message. … … 379 375 quit_fmt("Error in '%s.txt' file.", filename); 380 376 } 381 382 #endif /* ALLOW_TEMPLATES */383 377 384 378 … … 963 957 } 964 958 959 960 /* 961 * Initialise stores, from the edit file. 962 */ 963 static 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 965 987 /*** Initialize others ***/ 966 988 … … 1067 1089 inventory = C_ZNEW(INVEN_TOTAL, object_type); 1068 1090 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 }1123 1091 1124 1092 … … 1391 1359 /* This must occur before preference files are read(?) */ 1392 1360 init_cmd4_c(); 1393 1361 1362 1394 1363 /*** Initialize some arrays ***/ 1395 1364 … … 1441 1410 event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (flavors)"); 1442 1411 if (init_flavor_info()) quit("Cannot initialize flavors"); 1443 1412 1444 1413 /* Initialize spell info */ 1445 1414 event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (spells)"); … … 1449 1418 event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (spellbooks)"); 1450 1419 init_books(); 1420 1421 /* Initialise store stocking data */ 1422 event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (store stocks)"); 1423 init_stores(); 1451 1424 1452 1425 /* Initialize some other arrays */ trunk/src/tables.c
r887 r891 1415 1415 }; 1416 1416 1417 const grouper object_text_order [] =1417 const grouper object_text_order[] = 1418 1418 { 1419 1419 {TV_RING, "Ring" }, … … 1450 1450 {0, NULL } 1451 1451 }; 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 };
