www.pudn.com > ro4fserver.rar > itemdb.c


#include 
#include 
#include 

#include "mmo.h"
#include "grfio.h"
#include "itemdb.h"

#define ITEMDB_HASH_SIZE 64

static int itemdb_hash[ITEMDB_HASH_SIZE];
static int itemdb_size,itemdb_num;
static struct {
  // for hash
  int nameid;
  int next;

  // data
  int value;
  int type;
  int class;
  int equip;
  int weight;
  int atk;
  int def;
  int slot;
  int look;
} *itemdb;

static int search_itemdb_index(int nameid)
{
  int i;
  for(i=itemdb_hash[nameid%ITEMDB_HASH_SIZE];i>=0;i=itemdb[i].next)
    if(itemdb[i].nameid==nameid)
      return i;
  if(itemdb_size<=itemdb_num){
    itemdb_size+=ITEMDB_HASH_SIZE;
    itemdb=realloc(itemdb,sizeof(itemdb[0])*itemdb_size);
  }

  i=itemdb_num;
  itemdb_num++;
  itemdb[i].nameid=nameid;
  itemdb[i].next=itemdb_hash[nameid%ITEMDB_HASH_SIZE];
  itemdb_hash[nameid%ITEMDB_HASH_SIZE]=i;

  itemdb[i].value=10;
  itemdb[i].type=0;
  itemdb[i].class=0;
  itemdb[i].equip=0;
  itemdb[i].weight=10;
  itemdb[i].atk=0;
  itemdb[i].def=0;
  itemdb[i].slot=0;
  itemdb[i].look=0;

  return i;
}

int itemdb_type(int nameid)
{
  if(nameid>500 && nameid<600)
    return 0;	//heal item
  if(nameid>600 && nameid<700)
    return 2;	//use item
  if((nameid>700 && nameid<1100) ||
     (nameid>7000 && nameid<8000))
    return 3;	//correction
  if(nameid>=1750 && nameid<1760)
    return 10;	//arrow
  if(nameid>1100 && nameid<2000)
    return 4;	//weapon
  if((nameid>2100 && nameid<3000) ||
     (nameid>5000 && nameid<6000))
    return 5;	//armor
  if(nameid>4000 && nameid<5000)
    return 6;	//card
  return 0;
}

int itemdb_sellvalue(int nameid)
{
  return itemdb[search_itemdb_index(nameid)].value;
}

int itemdb_weight(int nameid)
{
  return itemdb[search_itemdb_index(nameid)].weight;
}

int itemdb_isequip(int nameid)
{
  return itemdb[search_itemdb_index(nameid)].equip!=0;
}

int itemdb_equip_point(int nameid,struct map_session_data *sd)
{
  return itemdb[search_itemdb_index(nameid)].equip;
}

static int itemdb_read_itemslottable(void)
{
  char *buf,*p;
  int s;

  buf=grfio_read("data\\itemslottable.txt");
  if(buf==NULL)
    return -1;
  s=grfio_size("data\\itemslottable.txt");
  buf[s]=0;
  for(p=buf;p-buf=0;j=itemdb[j].next,c++);
    printf("%4d",c);
    if(i%16==15) printf("\n");
  }
  exit(1);
#endif
  return 0;
}