|
@@ -19,18 +19,20 @@
|
|
|
#include <string.h>
|
|
|
|
|
|
static struct item_data* itemdb_array[MAX_ITEMDB];
|
|
|
-static DBMap* itemdb_other;// int nameid -> struct item_data*
|
|
|
-
|
|
|
-static struct s_item_group_db itemgroup_db[MAX_ITEMGROUP];
|
|
|
-
|
|
|
struct item_data dummy_item; //This is the default dummy item used for non-existant items. [Skotlex]
|
|
|
|
|
|
+static DBMap* itemdb_other;// int nameid -> struct item_data*
|
|
|
static DBMap *itemdb_combo;
|
|
|
+static DBMap *itemdb_group;
|
|
|
|
|
|
DBMap * itemdb_get_combodb(){
|
|
|
return itemdb_combo;
|
|
|
}
|
|
|
|
|
|
+DBMap * itemdb_get_groupdb() {
|
|
|
+ return itemdb_group;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* Search for item name
|
|
|
* name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
|
|
@@ -150,9 +152,10 @@ int itemdb_searchname_array(struct item_data** data, int size, const char *str)
|
|
|
*/
|
|
|
unsigned short itemdb_searchrandomid(uint16 group_id, uint8 sub_group)
|
|
|
{
|
|
|
+ struct s_item_group_db *group = (struct s_item_group_db *) idb_get(itemdb_group, group_id);
|
|
|
if (sub_group)
|
|
|
sub_group -= 1;
|
|
|
- if (!group_id || group_id >= MAX_ITEMGROUP || !&itemgroup_db[group_id]) {
|
|
|
+ if (!group) {
|
|
|
ShowError("itemdb_searchrandomid: Invalid group id %d\n", group_id);
|
|
|
return UNKNOWN_ITEM_ID;
|
|
|
}
|
|
@@ -160,8 +163,8 @@ unsigned short itemdb_searchrandomid(uint16 group_id, uint8 sub_group)
|
|
|
ShowError("itemdb_searchrandomid: Invalid sub_group %d\n", sub_group+1);
|
|
|
return UNKNOWN_ITEM_ID;
|
|
|
}
|
|
|
- if (&itemgroup_db[group_id].random[sub_group] && itemgroup_db[group_id].random[sub_group].data_qty)
|
|
|
- return itemgroup_db[group_id].random[sub_group].data[rand()%itemgroup_db[group_id].random[sub_group].data_qty].nameid;
|
|
|
+ if (&group->random[sub_group] && group->random[sub_group].data_qty)
|
|
|
+ return group->random[sub_group].data[rand()%group->random[sub_group].data_qty].nameid;
|
|
|
|
|
|
ShowError("itemdb_searchrandomid: No item entries for group id %d and sub group %d\n", group_id, sub_group+1);
|
|
|
return UNKNOWN_ITEM_ID;
|
|
@@ -177,9 +180,11 @@ unsigned short itemdb_searchrandomid(uint16 group_id, uint8 sub_group)
|
|
|
*/
|
|
|
uint16 itemdb_get_randgroupitem_count(uint16 group_id, uint8 sub_group, uint16 nameid) {
|
|
|
uint16 i, amt = 1;
|
|
|
+ struct s_item_group_db *group = (struct s_item_group_db *) idb_get(itemdb_group, group_id);
|
|
|
+
|
|
|
if (sub_group)
|
|
|
sub_group -= 1;
|
|
|
- if (!group_id || group_id >= MAX_ITEMGROUP || !&itemgroup_db[group_id]) {
|
|
|
+ if (!group) {
|
|
|
ShowError("itemdb_get_randgroupitem_count: Invalid group id %d\n", group_id);
|
|
|
return amt;
|
|
|
}
|
|
@@ -187,11 +192,12 @@ uint16 itemdb_get_randgroupitem_count(uint16 group_id, uint8 sub_group, uint16 n
|
|
|
ShowError("itemdb_get_randgroupitem_count: Invalid sub_group id %d\n", group_id+1);
|
|
|
return amt;
|
|
|
}
|
|
|
- if (!(&itemgroup_db[group_id].random[sub_group]) || !itemgroup_db[group_id].random[sub_group].data_qty)
|
|
|
+ if (!(&group->random[sub_group]) || !group->random[sub_group].data_qty)
|
|
|
return amt;
|
|
|
- ARR_FIND(0,itemgroup_db[group_id].random[sub_group].data_qty,i,itemgroup_db[group_id].random[sub_group].data[i].nameid == nameid);
|
|
|
- if (i < itemgroup_db[group_id].random[sub_group].data_qty)
|
|
|
- amt = itemgroup_db[group_id].random[sub_group].data[i].amount;
|
|
|
+ for (i = 0; i < group->random[sub_group].data_qty; i++) {
|
|
|
+ if (group->random[sub_group].data[i].nameid == nameid)
|
|
|
+ return group->random[sub_group].data[i].amount;
|
|
|
+ }
|
|
|
return amt;
|
|
|
}
|
|
|
|
|
@@ -201,37 +207,37 @@ uint16 itemdb_get_randgroupitem_count(uint16 group_id, uint8 sub_group, uint16 n
|
|
|
* @param group_id: The group ID of item that obtained by player
|
|
|
* @param *group: struct s_item_group from itemgroup_db[group_id].random[idx] or itemgroup_db[group_id].must[sub_group][idx]
|
|
|
*/
|
|
|
-static void itemdb_pc_get_itemgroup_sub(struct map_session_data *sd, uint16 group_id, struct s_item_group *group) {
|
|
|
+static void itemdb_pc_get_itemgroup_sub(struct map_session_data *sd, struct s_item_group_entry *data) {
|
|
|
uint16 i;
|
|
|
struct item tmp;
|
|
|
|
|
|
- nullpo_retv(group);
|
|
|
+ nullpo_retv(data);
|
|
|
|
|
|
- memset(&tmp,0,sizeof(tmp));
|
|
|
+ memset(&tmp, 0, sizeof(tmp));
|
|
|
|
|
|
- tmp.nameid = group->nameid;
|
|
|
- tmp.amount = (itemdb_isstackable(group->nameid)) ? group->amount : 1;
|
|
|
- tmp.bound = group->bound;
|
|
|
+ tmp.nameid = data->nameid;
|
|
|
+ tmp.amount = (itemdb_isstackable(data->nameid)) ? data->amount : 1;
|
|
|
+ tmp.bound = data->bound;
|
|
|
tmp.identify = 1;
|
|
|
- tmp.expire_time = (group->duration) ? (unsigned int)(time(NULL) + group->duration*60) : 0;
|
|
|
- if (group->isNamed) {
|
|
|
- tmp.card[0] = itemdb_isequip(group->nameid) ? CARD0_FORGE : CARD0_CREATE;
|
|
|
+ tmp.expire_time = (data->duration) ? (unsigned int)(time(NULL) + data->duration*60) : 0;
|
|
|
+ if (data->isNamed) {
|
|
|
+ tmp.card[0] = itemdb_isequip(data->nameid) ? CARD0_FORGE : CARD0_CREATE;
|
|
|
tmp.card[1] = 0;
|
|
|
tmp.card[2] = GetWord(sd->status.char_id, 0);
|
|
|
tmp.card[3] = GetWord(sd->status.char_id, 1);
|
|
|
}
|
|
|
- //Do loop for non-stackable item
|
|
|
- for (i = 0; i < group->amount; i++) {
|
|
|
- int flag;
|
|
|
- if ((flag = pc_additem(sd,&tmp,tmp.amount,LOG_TYPE_SCRIPT)))
|
|
|
- clif_additem(sd,0,0,flag);
|
|
|
- else if (!flag && group->isAnnounced) { ///TODO: Move this broadcast to proper behavior (it should on at different packet)
|
|
|
+ // Do loop for non-stackable item
|
|
|
+ for (i = 0; i < data->amount; i++) {
|
|
|
+ char flag;
|
|
|
+ if ((flag = pc_additem(sd, &tmp, tmp.amount, LOG_TYPE_SCRIPT)))
|
|
|
+ clif_additem(sd, 0, 0, flag);
|
|
|
+ else if (!flag && data->isAnnounced) { ///TODO: Move this broadcast to proper behavior (it should on at different packet)
|
|
|
char output[CHAT_SIZE_MAX];
|
|
|
- sprintf(output,msg_txt(NULL,717),sd->status.name,itemdb_jname(group->nameid),itemdb_jname(sd->itemid));
|
|
|
- clif_broadcast(&sd->bl,output,strlen(output),BC_DEFAULT,ALL_CLIENT);
|
|
|
+ sprintf(output, msg_txt(NULL, 717), sd->status.name, itemdb_jname(data->nameid), itemdb_jname(sd->itemid));
|
|
|
+ clif_broadcast(&sd->bl, output, strlen(output), BC_DEFAULT, ALL_CLIENT);
|
|
|
//clif_broadcast_obtain_special_item();
|
|
|
}
|
|
|
- if (itemdb_isstackable(group->nameid))
|
|
|
+ if (itemdb_isstackable(data->nameid))
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -244,53 +250,36 @@ static void itemdb_pc_get_itemgroup_sub(struct map_session_data *sd, uint16 grou
|
|
|
*/
|
|
|
char itemdb_pc_get_itemgroup(uint16 group_id, struct map_session_data *sd) {
|
|
|
uint16 i = 0;
|
|
|
+ struct s_item_group_db *group;
|
|
|
|
|
|
nullpo_retr(1,sd);
|
|
|
|
|
|
- if (!group_id || group_id >= MAX_ITEMGROUP) {
|
|
|
+ if (!(group = (struct s_item_group_db *) idb_get(itemdb_group, group_id))) {
|
|
|
ShowError("itemdb_pc_get_itemgroup: Invalid group id '%d' specified.",group_id);
|
|
|
return 2;
|
|
|
}
|
|
|
|
|
|
- //Get the 'must' item(s)
|
|
|
- if (itemgroup_db[group_id].must_qty)
|
|
|
- for (i = 0; i < itemgroup_db[group_id].must_qty; i++)
|
|
|
- if (&itemgroup_db[group_id].must[i] && itemdb_exists(itemgroup_db[group_id].must[i].nameid))
|
|
|
- itemdb_pc_get_itemgroup_sub(sd,group_id,&itemgroup_db[group_id].must[i]);
|
|
|
+ // Get the 'must' item(s)
|
|
|
+ if (group->must_qty) {
|
|
|
+ for (i = 0; i < group->must_qty; i++)
|
|
|
+ if (&group->must[i])
|
|
|
+ itemdb_pc_get_itemgroup_sub(sd,&group->must[i]);
|
|
|
+ }
|
|
|
|
|
|
- //Get the 'random' item each random group
|
|
|
+ // Get the 'random' item each random group
|
|
|
for (i = 0; i < MAX_ITEMGROUP_RANDGROUP; i++) {
|
|
|
uint16 rand;
|
|
|
- if (!(&itemgroup_db[group_id].random[i]) || !itemgroup_db[group_id].random[i].data_qty) //Skip empty random group
|
|
|
+ if (!(&group->random[i]) || !group->random[i].data_qty) //Skip empty random group
|
|
|
continue;
|
|
|
- rand = rnd()%itemgroup_db[group_id].random[i].data_qty;
|
|
|
- //Woops, why is the data empty? Every check should be done when load the item group! So this is bad day for the player :P
|
|
|
- if (!&itemgroup_db[group_id].random[i].data[rand] || !itemgroup_db[group_id].random[i].data[rand].nameid) {
|
|
|
+ rand = rnd()%group->random[i].data_qty;
|
|
|
+ if (!(&group->random[i].data[rand]) || !group->random[i].data[rand].nameid)
|
|
|
continue;
|
|
|
- }
|
|
|
- if (itemdb_exists(itemgroup_db[group_id].random[i].data[rand].nameid))
|
|
|
- itemdb_pc_get_itemgroup_sub(sd,group_id,&itemgroup_db[group_id].random[i].data[rand]);
|
|
|
+ itemdb_pc_get_itemgroup_sub(sd,&group->random[i].data[rand]);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/*==========================================
|
|
|
- * Calculates total item-group related bonuses for the given item
|
|
|
- *------------------------------------------*/
|
|
|
-int itemdb_group_bonus(struct map_session_data* sd, int itemid)
|
|
|
-{
|
|
|
- int bonus = 0, i, j;
|
|
|
- for (i=0; i < MAX_ITEMGROUP; i++) {
|
|
|
- if (!sd->itemgrouphealrate[i])
|
|
|
- continue;
|
|
|
- ARR_FIND(0,itemgroup_db[i].random[0].data_qty,j,itemgroup_db[i].random[0].data[j].nameid == itemid );
|
|
|
- if( j < itemgroup_db[i].random[0].data_qty )
|
|
|
- bonus += sd->itemgrouphealrate[i];
|
|
|
- }
|
|
|
- return bonus;
|
|
|
-}
|
|
|
-
|
|
|
/// Searches for the item_data.
|
|
|
/// Returns the item_data or NULL if it does not exist.
|
|
|
struct item_data* itemdb_exists(int nameid)
|
|
@@ -672,11 +661,13 @@ static void itemdb_read_itemgroup_sub(const char* filename, bool silent)
|
|
|
}
|
|
|
|
|
|
while (fgets(line,sizeof(line),fp)) {
|
|
|
- uint16 nameid;
|
|
|
- int j, group_id, prob = 1, amt = 1, rand_group = 1, announced = 0, dur = 0, named = 0, bound = 0;
|
|
|
- char *str[3], *p;
|
|
|
+ int group_id = -1;
|
|
|
+ unsigned int j, prob = 1;
|
|
|
+ uint16 nameid, amt = 1, dur = 0;
|
|
|
+ char *str[9], *p, rand_group = 1, announced = 0, named = 0, bound = 0;
|
|
|
+ struct s_item_group_random *random = NULL;
|
|
|
+ struct s_item_group_db *group = NULL;
|
|
|
bool found = false;
|
|
|
- struct s_item_group_random *random;
|
|
|
|
|
|
ln++;
|
|
|
if (line[0] == '/' && line[1] == '/')
|
|
@@ -692,44 +683,45 @@ static void itemdb_read_itemgroup_sub(const char* filename, bool silent)
|
|
|
}
|
|
|
}
|
|
|
memset(str,0,sizeof(str));
|
|
|
- for (j = 0, p = line; j < 3 && p;j++) {
|
|
|
+ for (j = 0, p = line; j < 9 && p;j++) {
|
|
|
str[j] = p;
|
|
|
- if (j == 2)
|
|
|
- sscanf(str[j],"%d,%d,%d,%d,%d,%d,%d",&prob,&amt,&rand_group,&announced,&dur,&named,&bound);
|
|
|
p = strchr(p,',');
|
|
|
if (p) *p++=0;
|
|
|
}
|
|
|
- if (str[0] == NULL)
|
|
|
+ if (str[0] == NULL) //Empty Group ID
|
|
|
continue;
|
|
|
if (j < 3) {
|
|
|
- if (j > 1) //Or else it barks on blank lines...
|
|
|
+ if (j > 1) // Or else it barks on blank lines...
|
|
|
ShowWarning("itemdb_read_itemgroup: Insufficient fields for entry at %s:%d\n", filename, ln);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- //Checking group_id
|
|
|
+ // Checking group_id
|
|
|
trim(str[0]);
|
|
|
if (ISDIGIT(str[0][0]))
|
|
|
group_id = atoi(str[0]);
|
|
|
- else //Try reads group id by const
|
|
|
- script_get_constant(trim(str[0]),&group_id);
|
|
|
- if (!group_id || group_id >= MAX_ITEMGROUP) {
|
|
|
- ShowWarning("itemdb_read_itemgroup: Cannot save '%s' because invalid group id or group db is overflow in %s:%d\n", str[0], filename, ln);
|
|
|
+ else // Try reads group id by const
|
|
|
+ script_get_constant(trim(str[0]), &group_id);
|
|
|
+
|
|
|
+ if (group_id < 0) {
|
|
|
+ ShowWarning("itemdb_read_itemgroup: Invlaid Group ID '%s' (%s:%d)\n", str[0], filename, ln);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- //Checking sub group
|
|
|
+ // Checking sub group
|
|
|
+ prob = atoi(str[2]);
|
|
|
+ if (str[4] != NULL) rand_group = atoi(str[4]);
|
|
|
if (rand_group < 0 || rand_group > MAX_ITEMGROUP_RANDGROUP) {
|
|
|
- ShowWarning("itemdb_read_itemgroup: Invalid sub group %d for group '%s' in %s:%d\n", rand_group, str[0], filename, ln);
|
|
|
+ ShowWarning("itemdb_read_itemgroup: Invalid sub group '%d' for group '%s' in %s:%d\n", rand_group, str[0], filename, ln);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (rand_group && prob < 1) {
|
|
|
- ShowWarning("itemdb_read_itemgroup: Invalid probaility for group '%s' sub: %d in %s:%d\n", str[0], rand_group, filename, ln);
|
|
|
+ if (rand_group != 0 && prob < 1) {
|
|
|
+ ShowWarning("itemdb_read_itemgroup: Random item must has probability. Group '%s' in %s:%d\n", str[0], filename, ln);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- //Checking item
|
|
|
+ // Checking item
|
|
|
trim(str[1]);
|
|
|
if (ISDIGIT(str[1][0]) && itemdb_exists((nameid = atoi(str[1]))))
|
|
|
found = true;
|
|
@@ -742,27 +734,40 @@ static void itemdb_read_itemgroup_sub(const char* filename, bool silent)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- amt = cap_value(amt,1,MAX_AMOUNT);
|
|
|
- dur = cap_value(dur,0,UINT16_MAX);
|
|
|
- bound = cap_value(bound,0,4);
|
|
|
+ if (str[3] != NULL) amt = cap_value(atoi(str[3]),1,MAX_AMOUNT);
|
|
|
+ if (str[5] != NULL) announced = atoi(str[5]);
|
|
|
+ if (str[6] != NULL) dur = cap_value(atoi(str[6]),0,UINT16_MAX);
|
|
|
+ if (str[7] != NULL) named = atoi(str[7]);
|
|
|
+ if (str[8] != NULL) bound = cap_value(atoi(str[8]),0,4);
|
|
|
+
|
|
|
+ found = true;
|
|
|
+ if (!(group = (struct s_item_group_db *) idb_get(itemdb_group, group_id))) {
|
|
|
+ found = false;
|
|
|
+ CREATE(group, struct s_item_group_db, 1);
|
|
|
+ group->id = group_id;
|
|
|
+ }
|
|
|
|
|
|
- //Must item (rand_group == 0), place it here
|
|
|
+ // Must item (rand_group == 0), place it here
|
|
|
if (!rand_group) {
|
|
|
- uint16 idx = itemgroup_db[group_id].must_qty;
|
|
|
+ uint16 idx = group->must_qty;
|
|
|
if (!idx)
|
|
|
- CREATE(itemgroup_db[group_id].must,struct s_item_group,1);
|
|
|
+ CREATE(group->must, struct s_item_group_entry, 1);
|
|
|
else
|
|
|
- RECREATE(itemgroup_db[group_id].must,struct s_item_group,idx+1);
|
|
|
-
|
|
|
- itemgroup_db[group_id].must[idx].nameid = nameid;
|
|
|
- itemgroup_db[group_id].must[idx].amount = amt;
|
|
|
- itemgroup_db[group_id].must[idx].isAnnounced = announced;
|
|
|
- itemgroup_db[group_id].must[idx].duration = dur;
|
|
|
- itemgroup_db[group_id].must[idx].isNamed = named;
|
|
|
- itemgroup_db[group_id].must[idx].bound = bound;
|
|
|
- itemgroup_db[group_id].must_qty++;
|
|
|
- //If 'must' item isn't set as random item, skip the next process
|
|
|
+ RECREATE(group->must, struct s_item_group_entry, idx+1);
|
|
|
+
|
|
|
+ group->must[idx].nameid = nameid;
|
|
|
+ group->must[idx].amount = amt;
|
|
|
+ group->must[idx].isAnnounced = announced;
|
|
|
+ group->must[idx].duration = dur;
|
|
|
+ group->must[idx].isNamed = named;
|
|
|
+ group->must[idx].bound = bound;
|
|
|
+ group->must_qty++;
|
|
|
+ // If 'must' item isn't set as random item, skip the next process
|
|
|
if (!prob) {
|
|
|
+ if (!found) {
|
|
|
+ idb_put(itemdb_group, group->id, group);
|
|
|
+ itemdb_itemgroup_count++;
|
|
|
+ }
|
|
|
entries++;
|
|
|
continue;
|
|
|
}
|
|
@@ -771,15 +776,16 @@ static void itemdb_read_itemgroup_sub(const char* filename, bool silent)
|
|
|
else
|
|
|
rand_group -= 1;
|
|
|
|
|
|
- random = &itemgroup_db[group_id].random[rand_group];
|
|
|
+ random = &group->random[rand_group];
|
|
|
|
|
|
- //Check, if the entry for this random group already created or not
|
|
|
+ // Check, if the entry for this random group already created or not
|
|
|
if (!random->data_qty) {
|
|
|
- CREATE(random->data,struct s_item_group,prob);
|
|
|
+ CREATE(random->data, struct s_item_group_entry, prob);
|
|
|
random->data_qty = 0;
|
|
|
}
|
|
|
else
|
|
|
- RECREATE(random->data,struct s_item_group,random->data_qty+prob);
|
|
|
+ RECREATE(random->data, struct s_item_group_entry, random->data_qty+prob);
|
|
|
+
|
|
|
//Now put the entry to its rand_group
|
|
|
for (j = random->data_qty; j < random->data_qty+prob; j++) {
|
|
|
random->data[j].nameid = nameid;
|
|
@@ -790,6 +796,11 @@ static void itemdb_read_itemgroup_sub(const char* filename, bool silent)
|
|
|
random->data[j].bound = bound;
|
|
|
}
|
|
|
random->data_qty += prob;
|
|
|
+
|
|
|
+ if (!found) {
|
|
|
+ idb_put(itemdb_group, group->id, group);
|
|
|
+ itemdb_itemgroup_count++;
|
|
|
+ }
|
|
|
entries++;
|
|
|
}
|
|
|
fclose(fp);
|
|
@@ -1590,7 +1601,7 @@ static void itemdb_read(void) {
|
|
|
else
|
|
|
itemdb_readdb();
|
|
|
|
|
|
- memset(&itemgroup_db, 0, sizeof(itemgroup_db));
|
|
|
+ itemdb_itemgroup_count = 0;
|
|
|
|
|
|
for(i=0; i<ARRAYLENGTH(dbsubpath); i++){
|
|
|
uint8 n1 = strlen(db_path)+strlen(dbsubpath[i])+1;
|
|
@@ -1675,6 +1686,24 @@ static int itemdb_final_sub(DBKey key, DBData *data, va_list ap)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int itemdb_group_free(DBKey key, DBData *data, va_list ap) {
|
|
|
+ struct s_item_group_db *group = db_data2ptr(data);
|
|
|
+ uint8 j;
|
|
|
+ if (!group)
|
|
|
+ return 0;
|
|
|
+ if (group->must_qty)
|
|
|
+ aFree(group->must);
|
|
|
+ group->must_qty = 0;
|
|
|
+ for (j = 0; j < MAX_ITEMGROUP_RANDGROUP; j++) {
|
|
|
+ if (!group->random[j].data_qty || !(&group->random[j]))
|
|
|
+ continue;
|
|
|
+ aFree(group->random[j].data);
|
|
|
+ group->random[j].data_qty = 0;
|
|
|
+ }
|
|
|
+ aFree(group);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* Reload Item DB
|
|
|
*/
|
|
@@ -1689,19 +1718,7 @@ void itemdb_reload(void) {
|
|
|
if( itemdb_array[i] )
|
|
|
destroy_item_data(itemdb_array[i], true);
|
|
|
|
|
|
- for (i = 0; i < MAX_ITEMGROUP; i++) {
|
|
|
- uint8 j;
|
|
|
- if (!(&itemgroup_db[i]))
|
|
|
- continue;
|
|
|
- if (itemgroup_db[i].must_qty)
|
|
|
- aFree(itemgroup_db[i].must);
|
|
|
- for (j = 0; j < MAX_ITEMGROUP_RANDGROUP; j++) {
|
|
|
- if (!(&itemgroup_db[i].random[j]) || !itemgroup_db[i].random[j].data_qty)
|
|
|
- continue;
|
|
|
- aFree(itemgroup_db[i].random[j].data);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ itemdb_group->clear(itemdb_group, itemdb_group_free);
|
|
|
itemdb_other->clear(itemdb_other, itemdb_final_sub);
|
|
|
db_clear(itemdb_combo);
|
|
|
|
|
@@ -1769,20 +1786,8 @@ void do_final_itemdb(void) {
|
|
|
for( i = 0; i < ARRAYLENGTH(itemdb_array); ++i )
|
|
|
if( itemdb_array[i] )
|
|
|
destroy_item_data(itemdb_array[i], true);
|
|
|
-
|
|
|
- for (i = 0; i < MAX_ITEMGROUP; i++) {
|
|
|
- uint8 j;
|
|
|
- if (!(&itemgroup_db[i]))
|
|
|
- continue;
|
|
|
- if (itemgroup_db[i].must_qty)
|
|
|
- aFree(itemgroup_db[i].must);
|
|
|
- for (j = 0; j < MAX_ITEMGROUP_RANDGROUP; j++) {
|
|
|
- if (!(&itemgroup_db[i].random[j]) || !itemgroup_db[i].random[j].data_qty)
|
|
|
- continue;
|
|
|
- aFree(itemgroup_db[i].random[j].data);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
+ itemdb_group->destroy(itemdb_group, itemdb_group_free);
|
|
|
itemdb_other->destroy(itemdb_other, itemdb_final_sub);
|
|
|
destroy_item_data(&dummy_item, false);
|
|
|
db_destroy(itemdb_combo);
|
|
@@ -1795,6 +1800,7 @@ void do_init_itemdb(void) {
|
|
|
memset(itemdb_array, 0, sizeof(itemdb_array));
|
|
|
itemdb_other = idb_alloc(DB_OPT_BASE);
|
|
|
itemdb_combo = idb_alloc(DB_OPT_BASE);
|
|
|
+ itemdb_group = idb_alloc(DB_OPT_BASE);
|
|
|
create_dummy_data(); //Dummy data item.
|
|
|
|
|
|
itemdb_read();
|