#define VENDOR_TYPE_WEAPONS     0
#define VENDOR_TYPE_ARMOR       1
#define VENDOR_TYPE_FOOD        2
#define VENDOR_TYPE_TAVERN      3
#define VENDOR_TYPE_REAGENTS    4
#define VENDOR_TYPE_HEALER      5
#define VENDOR_TYPE_INN         6
#define VENDOR_TYPE_GUILD       7
#define VENDOR_TYPE_STABLE      8

#define VENDOR_TYPE_TABLE_COMPRESSED_SIZE    125

#define LOCATION_LCB            0x01
#define LOCATION_LYCAEUM        0x02
#define LOCATION_EMPATH         0x03
#define LOCATION_SERPENTS       0x04
#define LOCATION_MOONGLOW       0x05
#define LOCATION_BRITAIN        0x06
#define LOCATION_JHELOM         0x07
#define LOCATION_YEW            0x08
#define LOCATION_MINOC          0x09
#define LOCATION_TRINSIC        0x0a
#define LOCATION_SKARA_BRAE     0x0b
#define LOCATION_MAGINCIA       0x0c
#define LOCATION_PAWS           0x0d
#define LOCATION_BUCCYS_DEN     0x0e
#define LOCATION_VESPER         0x0f
#define LOCATION_COVE           0x10

/* ----------------------------------------------------------------------
   Returns:
   -1, if the NPC is not a vendor
   vendor type, if the NPC is a vendor

   Note:
   npcNumber should not be confused with NPC identity.
   npcNumber ranges from 0-31 (maximum of 32 NPC's per town).
   NPC identity ranges from 0-15 (maximum of 16 talkable NPC's per town).
   ---------------------------------------------------------------------- */
    
int npcVendorType(int npcNumber, int locationNumber) {
    unsigned char *vendorTypeTable;
    unsigned char *vendorTypeTableCompressed;
    FILE *avatar;
    int i,dest;
    unsigned char vendorType;

    vendorTypeTable = malloc(sizeof(unsigned char) * 8 * 16);
    vendorTypeTableCompressed = malloc(sizeof(unsigned char) * VENDOR_TYPE_TABLE_COMPRESSED_SIZE);
    if ((!vendorTypeTable) || (!vendorTypeTableCompressed))
        return(-1);

    /* read compressed vendor type table from avatar.exe */
    avatar = u4fopen("avatar.exe");
    if (!avatar)
        return(-1);
    fseek(avatar, 0x11f7f, SEEK_SET);
    for (i = 0; i < 125; i++) {
        vendorTypeTableCompressed[i] = fgetc(avatar);
    }
    u4fclose(avatar);

    /* decompress the table */
    i = VENDOR_TYPE_TABLE_COMPRESSED_SIZE - 1;
    dest = 8*16 - 1;
    while (i > 0) {
        if (vendorTypeTableCompressed[i] > 0x1f) {
            switch (vendorTypeTableCompressed[i]) {
            case 0xb0: {
                long j,run_length;

                run_length = (vendorTypeTableCompressed[i-1] << 8) + vendorTypeTableCompressed[i-2];
                for (j = 0; j < run_length; j++) {
                    vendorTypeTable[dest] = vendorTypeTableCompressed[i-3];
                    dest--;
                }
                i -= 4;
                break;
            }
            case 0xb2:
                i -= 3;
                break;
            }
        }
        else {
            vendorTypeTable[dest] = vendorTypeTableCompressed[i];
            i--;
            dest--;
        }
    }

    /* clean up */
    free(vendorTypeTableCompressed);

    /* try to find the NPC in the vendor type table */
    vendorType = -1;
    for (i = 0; i < 8; i++) {
        if (vendorTypeTable[(locationNumber-1) * 8 + i] == npcNumber)
            vendorType = i;
    }

    if ((locationNumber == LOCATION_PAWS) && (vendorType == -1))
        vendorType = 8;  /* stable */

    /* clean up */
    free(vendorTypeTable);

    return(vendorType);
}
