Skip to content

Commit

Permalink
Allow for plugins read custom fields from jobdb1.
Browse files Browse the repository at this point in the history
  • Loading branch information
4144 committed Apr 15, 2015
1 parent af72224 commit 50de773
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 130 deletions.
267 changes: 138 additions & 129 deletions src/map/status.c
Expand Up @@ -12052,18 +12052,11 @@ int status_get_sc_type(sc_type type) {
return status->sc_conf[type];
}

/*------------------------------------------
* DB reading.
* job_db1.txt - weight, hp, sp, aspd
* job_db2.txt - job level stat bonuses
* size_fix.txt - size adjustment table for weapons
* refine_db.txt - refining data table
*------------------------------------------*/
void status_read_job_db(void) { /* [malufett/Hercules] */
int i = 0;
config_t job_db_conf;
config_setting_t *jdb = NULL;
const char *config_filename = "db/"DBPATH"job_db.conf";
void status_read_job_db_sub(int idx, const char *name, config_setting_t *jdb)
{
config_setting_t *temp = NULL;
int i32 = 0;

struct {
const char *name;
int id;
Expand Down Expand Up @@ -12097,139 +12090,154 @@ void status_read_job_db(void) { /* [malufett/Hercules] */
#endif
};

if ( libconfig->read_file(&job_db_conf, config_filename) ) {
ShowError("can't read %s\n", config_filename);
return;
}
while ( (jdb = libconfig->setting_get_elem(job_db_conf.root, i++)) ) {
int class_, idx, i32 = 0;
config_setting_t *temp = NULL;
const char *name = config_setting_name(jdb);

if ( (class_ = pc->check_job_name(name)) == -1 ) {
ShowWarning("pc_read_job_db: '%s' unknown job name!\n", name);
continue;
}

idx = pc->class2idx(class_);
if ( (temp = libconfig->setting_get_member(jdb, "Inherit")) ) {
int nidx = 0, iidx, w;
const char *iname;
while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
int iclass, ave, total = 0;
if ( (iclass = pc->check_job_name(iname)) == -1 ) {
ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s'!\n", name, iname);
continue;
}
iidx = pc->class2idx(iclass);
status->max_weight_base[idx] = status->max_weight_base[iidx];
memcpy(&status->aspd_base[idx], &status->aspd_base[iidx], sizeof(status->aspd_base[iidx]));
for ( w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++ ) {
status->HP_table[idx][w] = status->HP_table[iidx][w];
total += status->HP_table[idx][w];
}
ave = total / (w - 1);
for ( ; w <= pc->max_level[idx][0]; w++ ) {
status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
}
for ( w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++ ) {
status->SP_table[idx][w] = status->SP_table[iidx][w];
total += status->SP_table[idx][w];
}
ave = total / (w - 1);
for ( ; w <= pc->max_level[idx][0]; w++ ) {
status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
}
if ((temp = libconfig->setting_get_member(jdb, "Inherit"))) {
int nidx = 0, iidx, w;
const char *iname;
while ((iname = libconfig->setting_get_string_elem(temp, nidx++))) {
int iclass, ave, total = 0;
if ((iclass = pc->check_job_name(iname)) == -1) {
ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s'!\n", name, iname);
continue;
}
iidx = pc->class2idx(iclass);
status->max_weight_base[idx] = status->max_weight_base[iidx];
memcpy(&status->aspd_base[idx], &status->aspd_base[iidx], sizeof(status->aspd_base[iidx]));
for (w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++) {
status->HP_table[idx][w] = status->HP_table[iidx][w];
total += status->HP_table[idx][w];
}
ave = total / (w - 1);
for ( ; w <= pc->max_level[idx][0]; w++) {
status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
}
for (w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++) {
status->SP_table[idx][w] = status->SP_table[iidx][w];
total += status->SP_table[idx][w];
}
ave = total / (w - 1);
for ( ; w <= pc->max_level[idx][0]; w++) {
status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
}
}
if ( (temp = libconfig->setting_get_member(jdb, "InheritHP")) ) {
int nidx = 0, iidx;
const char *iname;
while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
int iclass, w, ave, total = 0;
if ( (iclass = pc->check_job_name(iname)) == -1 ) {
ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' HP!\n", name, iname);
continue;
}
iidx = pc->class2idx(iclass);
for ( w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++ ) {
status->HP_table[idx][w] = status->HP_table[iidx][w];
total += status->HP_table[idx][w];
}
ave = total / (w - 1);
for ( ; w <= pc->max_level[idx][0]; w++ ) {
status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
}
}
if ((temp = libconfig->setting_get_member(jdb, "InheritHP"))) {
int nidx = 0, iidx;
const char *iname;
while ((iname = libconfig->setting_get_string_elem(temp, nidx++))) {
int iclass, w, ave, total = 0;
if ((iclass = pc->check_job_name(iname)) == -1) {
ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' HP!\n", name, iname);
continue;
}
iidx = pc->class2idx(iclass);
for (w = 1; w <= MAX_LEVEL && status->HP_table[iidx][w]; w++) {
status->HP_table[idx][w] = status->HP_table[iidx][w];
total += status->HP_table[idx][w];
}
ave = total / (w - 1);
for ( ; w <= pc->max_level[idx][0]; w++ ) {
status->HP_table[idx][w] = min(ave * w, battle_config.max_hp);
}
}
if ( (temp = libconfig->setting_get_member(jdb, "InheritSP")) ) {
int nidx = 0, iidx, ave, total = 0;
const char *iname;
while ( (iname = libconfig->setting_get_string_elem(temp, nidx++)) ) {
int iclass, w;
if ( (iclass = pc->check_job_name(iname)) == -1 ) {
ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' SP!\n", name, iname);
continue;
}
iidx = pc->class2idx(iclass);
for ( w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++ ) {
status->SP_table[idx][w] = status->SP_table[iidx][w];
total += status->SP_table[idx][w];
}
ave = total / (w - 1);
for ( ; w <= pc->max_level[idx][0]; w++ ) {
status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
}
}
if ((temp = libconfig->setting_get_member(jdb, "InheritSP"))) {
int nidx = 0, iidx, ave, total = 0;
const char *iname;
while ((iname = libconfig->setting_get_string_elem(temp, nidx++))) {
int iclass, w;
if ((iclass = pc->check_job_name(iname)) == -1) {
ShowWarning("status_read_job_db: '%s' trying to inherit unknown '%s' SP!\n", name, iname);
continue;
}
iidx = pc->class2idx(iclass);
for (w = 1; w <= MAX_LEVEL && status->SP_table[iidx][w]; w++) {
status->SP_table[idx][w] = status->SP_table[iidx][w];
total += status->SP_table[idx][w];
}
ave = total / (w - 1);
for ( ; w <= pc->max_level[idx][0]; w++) {
status->SP_table[idx][w] = min(ave * w, battle_config.max_sp);
}
}
}

if ( libconfig->setting_lookup_int(jdb, "Weight", &i32) )
status->max_weight_base[idx] = i32;
else if ( !status->max_weight_base[idx] )
status->max_weight_base[idx] = 20000;
if (libconfig->setting_lookup_int(jdb, "Weight", &i32))
status->max_weight_base[idx] = i32;
else if (!status->max_weight_base[idx])
status->max_weight_base[idx] = 20000;

if ( (temp = libconfig->setting_get_member(jdb, "BaseASPD")) ) {
int widx = 0;
config_setting_t *wpn = NULL;
while ( (wpn = libconfig->setting_get_elem(temp, widx++)) ) {
int w, wlen = ARRAYLENGTH(wnames);
const char *wname = config_setting_name(wpn);
if ((temp = libconfig->setting_get_member(jdb, "BaseASPD"))) {
int widx = 0;
config_setting_t *wpn = NULL;
while ((wpn = libconfig->setting_get_elem(temp, widx++))) {
int w, wlen = ARRAYLENGTH(wnames);
const char *wname = config_setting_name(wpn);

ARR_FIND(0, wlen, w, strcmp(wnames[w].name, wname) == 0);
if ( w != wlen ) {
status->aspd_base[idx][wnames[w].id] = libconfig->setting_get_int(wpn);
} else {
ShowWarning("status_read_job_db: unknown weapon type '%s'!\n", wname);
}
ARR_FIND(0, wlen, w, strcmp(wnames[w].name, wname) == 0);
if (w != wlen) {
status->aspd_base[idx][wnames[w].id] = libconfig->setting_get_int(wpn);
} else {
ShowWarning("status_read_job_db: unknown weapon type '%s'!\n", wname);
}
}
}

if ( (temp = libconfig->setting_get_member(jdb, "HPTable")) ) {
int level = 0, ave, total = 0;
config_setting_t *hp = NULL;
while ( (hp = libconfig->setting_get_elem(temp, level++)) ) {
status->HP_table[idx][level] = i32 = min(libconfig->setting_get_int(hp), battle_config.max_hp);
total += i32 - status->HP_table[idx][level - 1];
}
ave = total / (level - 1);
for ( ; level <= pc->max_level[idx][0]; level++ ) { /* limit only to possible maximum level of the given class */
status->HP_table[idx][level] = min(ave * level, battle_config.max_hp); /* some are still empty? then let's use the average increase */
}
if ((temp = libconfig->setting_get_member(jdb, "HPTable"))) {
int level = 0, ave, total = 0;
config_setting_t *hp = NULL;
while ((hp = libconfig->setting_get_elem(temp, level++))) {
status->HP_table[idx][level] = i32 = min(libconfig->setting_get_int(hp), battle_config.max_hp);
total += i32 - status->HP_table[idx][level - 1];
}
ave = total / (level - 1);
for ( ; level <= pc->max_level[idx][0]; level++ ) { /* limit only to possible maximum level of the given class */
status->HP_table[idx][level] = min(ave * level, battle_config.max_hp); /* some are still empty? then let's use the average increase */
}
}

if ( (temp = libconfig->setting_get_member(jdb, "SPTable")) ) {
int level = 0, ave, total = 0;
config_setting_t *sp = NULL;
while ( (sp = libconfig->setting_get_elem(temp, level++)) ) {
status->SP_table[idx][level] = i32 = min(libconfig->setting_get_int(sp), battle_config.max_sp);
total += i32 - status->SP_table[idx][level - 1];
}
ave = total / (level - 1);
for ( ; level <= pc->max_level[idx][0]; level++ ) {
status->SP_table[idx][level] = min(ave * level, battle_config.max_sp);
}
if ((temp = libconfig->setting_get_member(jdb, "SPTable"))) {
int level = 0, ave, total = 0;
config_setting_t *sp = NULL;
while ((sp = libconfig->setting_get_elem(temp, level++))) {
status->SP_table[idx][level] = i32 = min(libconfig->setting_get_int(sp), battle_config.max_sp);
total += i32 - status->SP_table[idx][level - 1];
}
ave = total / (level - 1);
for ( ; level <= pc->max_level[idx][0]; level++ ) {
status->SP_table[idx][level] = min(ave * level, battle_config.max_sp);
}
}
}

/*------------------------------------------
* DB reading.
* job_db1.txt - weight, hp, sp, aspd
* job_db2.txt - job level stat bonuses
* size_fix.txt - size adjustment table for weapons
* refine_db.txt - refining data table
*------------------------------------------*/
void status_read_job_db(void) { /* [malufett/Hercules] */
int i = 0;
config_t job_db_conf;
config_setting_t *jdb = NULL;
const char *config_filename = "db/"DBPATH"job_db.conf";

if ( libconfig->read_file(&job_db_conf, config_filename) ) {
ShowError("can't read %s\n", config_filename);
return;
}
while ( (jdb = libconfig->setting_get_elem(job_db_conf.root, i++)) ) {
int class_, idx;
const char *name = config_setting_name(jdb);

if ( (class_ = pc->check_job_name(name)) == -1 ) {
ShowWarning("pc_read_job_db: '%s' unknown job name!\n", name);
continue;
}

idx = pc->class2idx(class_);
status->read_job_db_sub(idx, name, jdb);
}
libconfig->destroy(&job_db_conf);
}

Expand Down Expand Up @@ -12547,4 +12555,5 @@ void status_defaults(void) {
status->readdb_refine = status_readdb_refine;
status->readdb_scconfig = status_readdb_scconfig;
status->read_job_db = status_read_job_db;
status->read_job_db_sub = status_read_job_db_sub;
}
3 changes: 2 additions & 1 deletion src/map/status.h
Expand Up @@ -6,7 +6,7 @@
#define MAP_STATUS_H

#include "../config/core.h" // defType, RENEWAL, RENEWAL_ASPD

#include "../common/conf.h"
#include "../common/cbasetypes.h"
#include "../common/mmo.h" // NEW_CARTS

Expand Down Expand Up @@ -2116,6 +2116,7 @@ struct status_interface {
bool (*readdb_refine) (char *fields[], int columns, int current);
bool (*readdb_scconfig) (char *fields[], int columns, int current);
void (*read_job_db) (void);
void (*read_job_db_sub) (int idx, const char *name, config_setting_t *jdb);
};

struct status_interface *status;
Expand Down

0 comments on commit 50de773

Please sign in to comment.