From 3a5f48dc84b6ec95ca034093f9c199a0ca326a0a Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 11 Jul 2016 04:17:43 +0300 Subject: Fix reading skill_db.conf --- src/map/skill.c | 61 ++++++++++++++++++++++++++++++++------------------------- src/map/skill.h | 1 + 2 files changed, 35 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/map/skill.c b/src/map/skill.c index dceebb5b2..76ee3d3fd 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -19295,9 +19295,9 @@ void skill_validate_damagetype(struct config_setting_t *conf, struct s_skill_db } } else if (strcmpi(type, "SplashArea") == 0) { if (on) { - sk->nk |= NK_SPLASH; + sk->nk |= NK_SPLASH_ONLY; } else { - sk->nk &= ~NK_SPLASH; + sk->nk &= ~NK_SPLASH_ONLY; } } else if (strcmpi(type, "SplitDamage") == 0) { if (on) { @@ -19564,9 +19564,9 @@ int skill_validate_weapontype_sub(const char *type, bool on, struct s_skill_db * } } else if (strcmpi(type, "DWDaggerSword") == 0) { if (on) { - sk->weapon |= 1<weapon |= 1<weapon &= ~(1<weapon &= ~(1<weapon = 0; } else { + ShowError("Item %d. Unknown weapon type %s\n", sk->nameid, type); return 1; // invalid type } @@ -19603,8 +19604,8 @@ void skill_validate_weapontype(struct config_setting_t *conf, struct s_skill_db if ((tt = libconfig->setting_get_member(conf, "WeaponTypes")) && config_setting_is_group(tt)) { int j = 0; - struct config_setting_t *wpt = { 0 }; - while ((wpt = libconfig->setting_get_elem(tt, j++)) && j < 30) { + struct config_setting_t *wpt = NULL; + while ((wpt = libconfig->setting_get_elem(tt, j++)) != NULL) { if (skill_validate_weapontype_sub(config_setting_name(wpt), libconfig->setting_get_bool_real(wpt), sk)) skilldb_invalid_error(config_setting_name(wpt), config_setting_name(tt), sk->nameid); } @@ -19749,7 +19750,7 @@ void skill_validate_state(struct config_setting_t *conf, struct s_skill_db *sk) else if (strcmpi(type,"PoisonWeapon") == 0 ) sk->state = ST_POISONINGWEAPON; else if (strcmpi(type,"RollingCutter") == 0 ) sk->state = ST_ROLLINGCUTTER; else if (strcmpi(type,"MH_Fighting") == 0 ) sk->state = ST_MH_FIGHTING; - else if (strcmpi(type,"MH_Grappling") == 0 ) sk->state = ST_MH_FIGHTING; + else if (strcmpi(type,"MH_Grappling") == 0 ) sk->state = ST_MH_GRAPPLING; else if (strcmpi(type,"Peco") == 0 ) sk->state = ST_PECO; else skilldb_invalid_error(type, "State", sk->nameid); @@ -19771,7 +19772,7 @@ void skill_validate_item_requirements(struct config_setting_t *conf, struct s_sk int itx=-1; struct config_setting_t *it; - while((it=libconfig->setting_get_elem(tt, itx++)) && itx < MAX_SKILL_ITEM_REQUIRE) { + while((it=libconfig->setting_get_elem(tt, ++itx)) && itx < MAX_SKILL_ITEM_REQUIRE) { const char *type = config_setting_name(it); if( type[0] == 'I' && type[1] == 'D' && itemdb->exists(atoi(type+2)) ) @@ -19781,7 +19782,13 @@ void skill_validate_item_requirements(struct config_setting_t *conf, struct s_sk continue; } - sk->amount[itx] = libconfig->setting_get_int(it); + if (config_setting_is_group(it)) { + // TODO: Per-level item requirements are not implemented yet! + // We just take the first level for the time being (old txt behavior) + sk->amount[itx] = libconfig->setting_get_int_elem(it, 0); + } else { + sk->amount[itx] = libconfig->setting_get_int(it); + } } } } @@ -19810,20 +19817,20 @@ void skill_validate_unit_target(struct config_setting_t *conf, struct s_skill_db else if(!strcmpi(type,"Enemy")) sk->unit_target = BCT_ENEMY; else if(!strcmpi(type,"Self")) sk->unit_target = BCT_SELF; else if(!strcmpi(type,"SameGuild")) sk->unit_target = BCT_GUILD|BCT_SAMEGUILD; + } - if (sk->unit_flag&UF_DEFNOTENEMY && battle_config.defnotenemy) - sk->unit_target = BCT_NOENEMY; + if (sk->unit_flag & UF_DEFNOTENEMY && battle_config.defnotenemy) + sk->unit_target = BCT_NOENEMY; - //By default, target just characters. - sk->unit_target |= BL_CHAR; + //By default, target just characters. + sk->unit_target |= BL_CHAR; - if (sk->unit_flag&UF_NOPC) - sk->unit_target &= ~BL_PC; - if (sk->unit_flag&UF_NOMOB) - sk->unit_target &= ~BL_MOB; - if (sk->unit_flag&UF_SKILL) - sk->unit_target |= BL_SKILL; - } + if (sk->unit_flag & UF_NOPC) + sk->unit_target &= ~BL_PC; + if (sk->unit_flag & UF_NOMOB) + sk->unit_target &= ~BL_MOB; + if (sk->unit_flag & UF_SKILL) + sk->unit_target |= BL_SKILL; } /** @@ -19969,7 +19976,7 @@ bool skill_validate_skilldb(struct s_skill_db *sk, const char *source) ShowWarning("skill_validate_skilldb: Invalid skill Id %d provided in '%s'! ... skipping\n", sk->nameid, source); ShowInfo("It is possible that the skill Id is 0 or unavailable (interferes with guild/homun/mercenary skill mapping).\n"); return false; - } else if (sk->max > MAX_SKILL_LEVEL || sk->max <= 0) { + } else if (sk->max <= 0) { ShowError("skill_validate_skilldb: Invalid Max Level %d specified for skill Id %d in '%s', skipping...\n", sk->max, sk->nameid, source); return false; } @@ -20088,8 +20095,8 @@ bool skill_read_skilldb(const char *filename) skill->level_set_value(tmp_db.num, 1); // Default 1 /* Interrupt Cast */ - if (libconfig->setting_lookup_bool(conf, "InterruptCast", &tmp_db.castcancel) == 0) - tmp_db.castcancel = 1; + if (libconfig->setting_lookup_bool(conf, "InterruptCast", &tmp_db.castcancel) == CONFIG_FALSE) + tmp_db.castcancel = 0; /* Cast Defense Rate */ libconfig->setting_lookup_int(conf, "CastDefRate", &tmp_db.cast_def_rate); @@ -20155,11 +20162,11 @@ bool skill_read_skilldb(const char *filename) skill->config_set_level(tt, tmp_db.sp); /* HP Rate */ - if ((tt = libconfig->setting_get_member(t, "HPRate"))) + if ((tt = libconfig->setting_get_member(t, "HPRateCost"))) skill->config_set_level(tt, tmp_db.hp_rate); /* SP Rate */ - if ((tt = libconfig->setting_get_member(t, "SPRate"))) + if ((tt = libconfig->setting_get_member(t, "SPRateCost"))) skill->config_set_level(tt, tmp_db.sp_rate); /* Zeny Cost */ @@ -20171,10 +20178,10 @@ bool skill_read_skilldb(const char *filename) skill->config_set_level(tt, tmp_db.spiritball); /* Weapon Types */ - skill->validate_weapontype(conf, &tmp_db); + skill->validate_weapontype(t, &tmp_db); /* Ammunition Types */ - skill->validate_ammotype(conf, &tmp_db); + skill->validate_ammotype(t, &tmp_db); /* Ammunition Amount */ if ((tt = libconfig->setting_get_member(t, "AmmoAmount"))) diff --git a/src/map/skill.h b/src/map/skill.h index 47cdee2d3..dfc2ecb3c 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -91,6 +91,7 @@ enum e_skill_inf { enum e_skill_nk { NK_NO_DAMAGE = 0x01, NK_SPLASH = 0x02|0x04, // 0x4 = splash & split + NK_SPLASH_ONLY = 0x02, NK_SPLASHSPLIT = 0x04, NK_NO_CARDFIX_ATK = 0x08, NK_NO_ELEFIX = 0x10, -- cgit v1.2.3-70-g09d2