Migrated skill.c to C++ (#2500)

* Migrated skill.c to C++
* Needed in preparation for future projects.
This commit is contained in:
Aleos
2017-10-14 13:03:27 -04:00
committed by GitHub
parent f42c2ff211
commit 2606cf977f
3 changed files with 51 additions and 50 deletions

View File

@@ -215,9 +215,7 @@
<ClCompile Include="chat.c" /> <ClCompile Include="chat.c" />
<ClCompile Include="chrif.c" /> <ClCompile Include="chrif.c" />
<ClCompile Include="clan.c" /> <ClCompile Include="clan.c" />
<ClCompile Include="clif.cpp"> <ClCompile Include="clif.cpp" />
<CompileAs>CompileAsCpp</CompileAs>
</ClCompile>
<ClCompile Include="date.c" /> <ClCompile Include="date.c" />
<ClCompile Include="duel.c" /> <ClCompile Include="duel.c" />
<ClCompile Include="elemental.c" /> <ClCompile Include="elemental.c" />
@@ -228,14 +226,10 @@
<ClCompile Include="itemdb.c" /> <ClCompile Include="itemdb.c" />
<ClCompile Include="log.c" /> <ClCompile Include="log.c" />
<ClCompile Include="mail.c" /> <ClCompile Include="mail.c" />
<ClCompile Include="map.cpp"> <ClCompile Include="map.cpp" />
<CompileAs>CompileAsCpp</CompileAs>
</ClCompile>
<ClCompile Include="mapreg.c" /> <ClCompile Include="mapreg.c" />
<ClCompile Include="mercenary.c" /> <ClCompile Include="mercenary.c" />
<ClCompile Include="mob.cpp"> <ClCompile Include="mob.cpp" />
<CompileAs>CompileAsCpp</CompileAs>
</ClCompile>
<ClCompile Include="npc.c" /> <ClCompile Include="npc.c" />
<ClCompile Include="npc_chat.c" /> <ClCompile Include="npc_chat.c" />
<ClCompile Include="party.c" /> <ClCompile Include="party.c" />
@@ -244,11 +238,9 @@
<ClCompile Include="pc_groups.c" /> <ClCompile Include="pc_groups.c" />
<ClCompile Include="pet.c" /> <ClCompile Include="pet.c" />
<ClCompile Include="quest.c" /> <ClCompile Include="quest.c" />
<ClCompile Include="script.cpp"> <ClCompile Include="script.cpp" />
<CompileAs>CompileAsCpp</CompileAs>
</ClCompile>
<ClCompile Include="searchstore.c" /> <ClCompile Include="searchstore.c" />
<ClCompile Include="skill.c" /> <ClCompile Include="skill.cpp" />
<ClCompile Include="status.c" /> <ClCompile Include="status.c" />
<ClCompile Include="storage.c" /> <ClCompile Include="storage.c" />
<ClCompile Include="trade.c" /> <ClCompile Include="trade.c" />

View File

@@ -250,7 +250,7 @@
<ClCompile Include="searchstore.c"> <ClCompile Include="searchstore.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="skill.c"> <ClCompile Include="skill.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="status.c"> <ClCompile Include="status.c">

View File

@@ -42,6 +42,10 @@
#include <time.h> #include <time.h>
#include <math.h> #include <math.h>
#ifdef __cplusplus
extern "C" {
#endif
#define SKILLUNITTIMER_INTERVAL 100 #define SKILLUNITTIMER_INTERVAL 100
#define TIMERSKILL_INTERVAL 150 #define TIMERSKILL_INTERVAL 150
@@ -240,7 +244,7 @@ static void skill_chk2(int *idx) {
#define skill_get3(id,x,var) { skill_chk(&id); if (!id) return 0; skill_chk2(&x); return var; } #define skill_get3(id,x,var) { skill_chk(&id); if (!id) return 0; skill_chk2(&x); return var; }
// Skill DB // Skill DB
enum e_damage_type skill_get_hit( uint16 skill_id ) { skill_get (skill_id, skill_db[skill_id]->hit); } enum e_damage_type skill_get_hit( uint16 skill_id ) { skill_chk(&skill_id); if (!skill_id) return DMG_NORMAL; return static_cast<e_damage_type>(skill_db[skill_id]->hit); }
int skill_get_inf( uint16 skill_id ) { skill_get (skill_id, skill_db[skill_id]->inf); } int skill_get_inf( uint16 skill_id ) { skill_get (skill_id, skill_db[skill_id]->inf); }
int skill_get_ele( uint16 skill_id , uint16 skill_lv ) { skill_get2 (skill_id, skill_lv, skill_db[skill_id]->element); } int skill_get_ele( uint16 skill_id , uint16 skill_lv ) { skill_get2 (skill_id, skill_lv, skill_db[skill_id]->element); }
int skill_get_nk( uint16 skill_id ) { skill_get (skill_id, skill_db[skill_id]->nk); } int skill_get_nk( uint16 skill_id ) { skill_get (skill_id, skill_db[skill_id]->nk); }
@@ -935,7 +939,7 @@ bool skill_isNotOk_npcRange(struct block_list *src, uint16 skill_id, uint16 skil
if (pos_x <= 0) pos_x = src->x; if (pos_x <= 0) pos_x = src->x;
if (pos_y <= 0) pos_y = src->y; if (pos_y <= 0) pos_y = src->y;
return skill_check_unit_range2(src,pos_x,pos_y,skill_id,skill_lv,true); return skill_check_unit_range2(src,pos_x,pos_y,skill_id,skill_lv,true) != 0;
} }
struct s_skill_unit_layout *skill_get_unit_layout(uint16 skill_id, uint16 skill_lv, struct block_list* src, int x, int y) struct s_skill_unit_layout *skill_get_unit_layout(uint16 skill_id, uint16 skill_lv, struct block_list* src, int x, int y)
@@ -3032,14 +3036,14 @@ void skill_attack_blow(struct block_list *src, struct block_list *dsrc, struct b
switch( skill_id ) { switch( skill_id ) {
case LG_OVERBRAND_BRANDISH: case LG_OVERBRAND_BRANDISH:
// Give knockback damage bonus only hits the wall. (bugreport:9096) // Give knockback damage bonus only hits the wall. (bugreport:9096)
if (skill_blown(dsrc,target,blewcount,dir,BLOWN_NO_KNOCKBACK_MAP|BLOWN_MD_KNOCKBACK_IMMUNE|BLOWN_TARGET_NO_KNOCKBACK|BLOWN_TARGET_BASILICA) < blewcount) if (skill_blown(dsrc,target,blewcount,dir,(enum e_skill_blown)(BLOWN_NO_KNOCKBACK_MAP|BLOWN_MD_KNOCKBACK_IMMUNE|BLOWN_TARGET_NO_KNOCKBACK|BLOWN_TARGET_BASILICA)) < blewcount)
skill_addtimerskill(src, tick + status_get_amotion(src), target->id, 0, 0, LG_OVERBRAND_PLUSATK, skill_lv, BF_WEAPON, flag|SD_ANIMATION); skill_addtimerskill(src, tick + status_get_amotion(src), target->id, 0, 0, LG_OVERBRAND_PLUSATK, skill_lv, BF_WEAPON, flag|SD_ANIMATION);
break; break;
case SR_KNUCKLEARROW: case SR_KNUCKLEARROW:
// Ignore knockback damage bonus if in WOE (player cannot be knocked in WOE) // Ignore knockback damage bonus if in WOE (player cannot be knocked in WOE)
// Boss & Immune Knockback stay in place and don't get bonus damage // Boss & Immune Knockback stay in place and don't get bonus damage
// Give knockback damage bonus only hits the wall. (bugreport:9096) // Give knockback damage bonus only hits the wall. (bugreport:9096)
if (skill_blown(dsrc, target, blewcount, dir_ka, BLOWN_IGNORE_NO_KNOCKBACK|BLOWN_NO_KNOCKBACK_MAP|BLOWN_MD_KNOCKBACK_IMMUNE|BLOWN_TARGET_NO_KNOCKBACK|BLOWN_TARGET_BASILICA) < blewcount) if (skill_blown(dsrc, target, blewcount, dir_ka, (enum e_skill_blown)(BLOWN_IGNORE_NO_KNOCKBACK|BLOWN_NO_KNOCKBACK_MAP|BLOWN_MD_KNOCKBACK_IMMUNE|BLOWN_TARGET_NO_KNOCKBACK|BLOWN_TARGET_BASILICA)) < blewcount)
skill_addtimerskill(src, tick + 300 * ((flag&2) ? 1 : 2), target->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag|4); skill_addtimerskill(src, tick + 300 * ((flag&2) ? 1 : 2), target->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag|4);
dir_ka = -1; dir_ka = -1;
break; break;
@@ -4114,7 +4118,7 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
} }
if (j) { if (j) {
i = applyeffects[rnd()%j]; i = applyeffects[rnd()%j];
status_change_start(src, target, i, 10000, skl->skill_lv, status_change_start(src, target, static_cast<sc_type>(i), 10000, skl->skill_lv,
(i == SC_BURNING ? 1000 : (i == SC_BLEEDING ? src->id : 0)), (i == SC_BURNING ? 1000 : (i == SC_BLEEDING ? src->id : 0)),
(i == SC_BURNING ? src->id : 0), 0, (i == SC_BURNING ? src->id : 0), 0,
(i == SC_BURNING ? 15000 : (i == SC_FREEZING ? 40000 : (i == SC_BURNING ? 15000 : (i == SC_FREEZING ? 40000 :
@@ -5458,7 +5462,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
} }
if(j == 5) { // If 5 spheres, remove last one and only do 4 actions (Official behavior) if(j == 5) { // If 5 spheres, remove last one and only do 4 actions (Official behavior)
status_change_end(src, spheres[4], INVALID_TIMER); status_change_end(src, static_cast<sc_type>(spheres[4]), INVALID_TIMER);
j = 4; j = 4;
} }
@@ -5472,7 +5476,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
} }
skill_addtimerskill(src, tick + i * 200, bl->id, k, 0, subskill, skill_lv, i, flag); skill_addtimerskill(src, tick + i * 200, bl->id, k, 0, subskill, skill_lv, i, flag);
clif_skill_nodamage(src, bl, subskill, skill_lv, 1); clif_skill_nodamage(src, bl, subskill, skill_lv, 1);
status_change_end(src, spheres[i], INVALID_TIMER); status_change_end(src, static_cast<sc_type>(spheres[i]), INVALID_TIMER);
} }
} }
break; break;
@@ -5501,7 +5505,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
pres_skill_id = sc->data[i]->val1; pres_skill_id = sc->data[i]->val1;
pres_skill_lv = sc->data[i]->val2; pres_skill_lv = sc->data[i]->val2;
point = sc->data[i]->val3; point = sc->data[i]->val3;
status_change_end(src, (sc_type)i, INVALID_TIMER); status_change_end(src, static_cast<sc_type>(i), INVALID_TIMER);
}else //something went wrong :( }else //something went wrong :(
break; break;
@@ -5574,7 +5578,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
int skele = WL_RELEASE - 5 + sc->data[spheres[i]]->val1 - WLS_FIRE; // Convert Ball Element into Skill ATK for balls int skele = WL_RELEASE - 5 + sc->data[spheres[i]]->val1 - WLS_FIRE; // Convert Ball Element into Skill ATK for balls
// WL_SUMMON_ATK_FIRE, WL_SUMMON_ATK_WIND, WL_SUMMON_ATK_WATER, WL_SUMMON_ATK_GROUND // WL_SUMMON_ATK_FIRE, WL_SUMMON_ATK_WIND, WL_SUMMON_ATK_WATER, WL_SUMMON_ATK_GROUND
skill_addtimerskill(src,tick+status_get_adelay(src)*i,bl->id,0,0,skele,sc->data[spheres[i]]->val3,BF_MAGIC,flag|SD_LEVEL); skill_addtimerskill(src,tick+status_get_adelay(src)*i,bl->id,0,0,skele,sc->data[spheres[i]]->val3,BF_MAGIC,flag|SD_LEVEL);
status_change_end(src, spheres[i], INVALID_TIMER); // Eliminate ball status_change_end(src, static_cast<sc_type>(spheres[i]), INVALID_TIMER); // Eliminate ball
} }
clif_skill_nodamage(src,bl,skill_id,0,1); clif_skill_nodamage(src,bl,skill_id,0,1);
} }
@@ -5848,7 +5852,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
struct elemental_data *ele = BL_CAST(BL_ELEM,src); struct elemental_data *ele = BL_CAST(BL_ELEM,src);
struct status_change *tsc_ele = status_get_sc(&ele->bl); struct status_change *tsc_ele = status_get_sc(&ele->bl);
sc_type type = status_skill2sc(skill_id), type2; sc_type type = status_skill2sc(skill_id), type2;
type2 = type-1;
type2 = static_cast<sc_type>(type - 1);
clif_skill_nodamage(src,battle_get_master(src),skill_id,skill_lv,1); clif_skill_nodamage(src,battle_get_master(src),skill_id,skill_lv,1);
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SKILL); clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SKILL);
@@ -7958,7 +7963,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
case TF_BACKSLIDING: //This is the correct implementation as per packet logging information. [Skotlex] case TF_BACKSLIDING: //This is the correct implementation as per packet logging information. [Skotlex]
skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),unit_getdir(bl),BLOWN_IGNORE_NO_KNOCKBACK|BLOWN_DONT_SEND_PACKET); skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),unit_getdir(bl),(enum e_skill_blown)(BLOWN_IGNORE_NO_KNOCKBACK|BLOWN_DONT_SEND_PACKET));
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
clif_blown(src); // Always blow, otherwise it shows a casting animation. [Lemongrass] clif_blown(src); // Always blow, otherwise it shows a casting animation. [Lemongrass]
break; break;
@@ -10253,8 +10258,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break; break;
} }
switch( skill_lv ) {// Select mode bassed on skill level used. switch( skill_lv ) {// Select mode bassed on skill level used.
case 2: mode = EL_MODE_ASSIST; break; case 2: mode = static_cast<e_mode>(EL_MODE_ASSIST); break;
case 3: mode = EL_MODE_AGGRESSIVE; break; case 3: mode = static_cast<e_mode>(EL_MODE_AGGRESSIVE); break;
} }
if( !elemental_change_mode(sd->ed,mode) ) { if( !elemental_change_mode(sd->ed,mode) ) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
@@ -11783,14 +11788,14 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
{ {
int summons[5] = { MOBID_G_MANDRAGORA, MOBID_G_HYDRA, MOBID_G_FLORA, MOBID_G_PARASITE, MOBID_G_GEOGRAPHER }; int summons[5] = { MOBID_G_MANDRAGORA, MOBID_G_HYDRA, MOBID_G_FLORA, MOBID_G_PARASITE, MOBID_G_GEOGRAPHER };
int class_ = skill_id==AM_SPHEREMINE?MOBID_MARINE_SPHERE:summons[skill_lv-1]; int class_ = skill_id==AM_SPHEREMINE?MOBID_MARINE_SPHERE:summons[skill_lv-1];
int ai = (skill_id == AM_SPHEREMINE) ? AI_SPHERE : AI_FLORA; enum mob_ai ai = (skill_id == AM_SPHEREMINE) ? AI_SPHERE : AI_FLORA;
struct mob_data *md; struct mob_data *md;
// Correct info, don't change any of this! [celest] // Correct info, don't change any of this! [celest]
md = mob_once_spawn_sub(src, src->m, x, y, status_get_name(src), class_, "", SZ_SMALL, ai); md = mob_once_spawn_sub(src, src->m, x, y, status_get_name(src), class_, "", SZ_SMALL, ai);
if (md) { if (md) {
md->master_id = src->id; md->master_id = src->id;
md->special_state.ai = (enum mob_ai)ai; md->special_state.ai = ai;
if( md->deletetimer != INVALID_TIMER ) if( md->deletetimer != INVALID_TIMER )
delete_timer(md->deletetimer, mob_timer_delete); delete_timer(md->deletetimer, mob_timer_delete);
md->deletetimer = add_timer (gettick() + skill_get_time(skill_id,skill_lv), mob_timer_delete, md->bl.id, 0); md->deletetimer = add_timer (gettick() + skill_get_time(skill_id,skill_lv), mob_timer_delete, md->bl.id, 0);
@@ -14568,7 +14573,7 @@ int skill_check_pc_partner(struct map_session_data *sd, uint16 skill_id, uint16
static int c=0; static int c=0;
static int p_sd[MAX_PARTY]; static int p_sd[MAX_PARTY];
int i; int i;
bool is_chorus = ( skill_get_inf2(skill_id)&INF2_CHORUS_SKILL ); bool is_chorus = ( skill_get_inf2(skill_id)&INF2_CHORUS_SKILL ) != 0;
if (!sd) if (!sd)
return 0; return 0;
@@ -16668,7 +16673,7 @@ void skill_weaponrefine(struct map_session_data *sd, int idx)
clif_upgrademessage(sd->fd, 3, material[ditem->wlv]); clif_upgrademessage(sd->fd, 3, material[ditem->wlv]);
return; return;
} }
per = status_get_refine_chance(ditem->wlv, (int)item->refine, false); per = status_get_refine_chance(static_cast<refine_type>(ditem->wlv), (int)item->refine, false);
if( sd->class_&JOBL_THIRD ) if( sd->class_&JOBL_THIRD )
per += 10; per += 10;
else else
@@ -20008,7 +20013,7 @@ void skill_usave_trigger(struct map_session_data *sd)
struct skill_usave *sus = NULL; struct skill_usave *sus = NULL;
struct skill_unit_group *group = NULL; struct skill_unit_group *group = NULL;
if (!(sus = idb_get(skillusave_db,sd->status.char_id))) if (!(sus = static_cast<skill_usave *>(idb_get(skillusave_db,sd->status.char_id))))
return; return;
if ((group = skill_unitsetting(&sd->bl, sus->skill_id, sus->skill_lv, sd->bl.x, sd->bl.y, 0))) if ((group = skill_unitsetting(&sd->bl, sus->skill_id, sus->skill_lv, sd->bl.x, sd->bl.y, 0)))
@@ -21407,7 +21412,7 @@ static void skill_readdb(void)
int i; int i;
const char* dbsubpath[] = { const char* dbsubpath[] = {
"", "",
"/"DBIMPORT, "/" DBIMPORT,
//add other path here //add other path here
}; };
@@ -21441,24 +21446,24 @@ static void skill_readdb(void)
safesnprintf(dbsubpath2,n1,"%s%s",db_path,dbsubpath[i]); safesnprintf(dbsubpath2,n1,"%s%s",db_path,dbsubpath[i]);
} }
sv_readdb(dbsubpath2, "skill_db.txt" , ',', 18, 18, -1, skill_parse_row_skilldb, i); sv_readdb(dbsubpath2, "skill_db.txt" , ',', 18, 18, -1, skill_parse_row_skilldb, i > 0);
sv_readdb(dbsubpath2, "skill_require_db.txt" , ',', 34, 34, -1, skill_parse_row_requiredb, i); sv_readdb(dbsubpath2, "skill_require_db.txt" , ',', 34, 34, -1, skill_parse_row_requiredb, i > 0);
sv_readdb(dbsubpath2, "skill_cast_db.txt" , ',', 7, 8, -1, skill_parse_row_castdb, i); sv_readdb(dbsubpath2, "skill_cast_db.txt" , ',', 7, 8, -1, skill_parse_row_castdb, i > 0);
sv_readdb(dbsubpath2, "skill_castnodex_db.txt", ',', 2, 3, -1, skill_parse_row_castnodexdb, i); sv_readdb(dbsubpath2, "skill_castnodex_db.txt", ',', 2, 3, -1, skill_parse_row_castnodexdb, i > 0);
sv_readdb(dbsubpath2, "skill_unit_db.txt" , ',', 8, 8, -1, skill_parse_row_unitdb, i); sv_readdb(dbsubpath2, "skill_unit_db.txt" , ',', 8, 8, -1, skill_parse_row_unitdb, i > 0);
sv_readdb(dbsubpath2, "skill_nocast_db.txt" , ',', 2, 2, -1, skill_parse_row_nocastdb, i); sv_readdb(dbsubpath2, "skill_nocast_db.txt" , ',', 2, 2, -1, skill_parse_row_nocastdb, i > 0);
sv_readdb(dbsubpath2, "produce_db.txt" , ',', 5, 5+2*MAX_PRODUCE_RESOURCE, MAX_SKILL_PRODUCE_DB, skill_parse_row_producedb, i); sv_readdb(dbsubpath2, "produce_db.txt" , ',', 5, 5+2*MAX_PRODUCE_RESOURCE, MAX_SKILL_PRODUCE_DB, skill_parse_row_producedb, i > 0);
sv_readdb(dbsubpath1, "create_arrow_db.txt" , ',', 1+2, 1+2*MAX_ARROW_RESULT, MAX_SKILL_ARROW_DB, skill_parse_row_createarrowdb, i); sv_readdb(dbsubpath1, "create_arrow_db.txt" , ',', 1+2, 1+2*MAX_ARROW_RESULT, MAX_SKILL_ARROW_DB, skill_parse_row_createarrowdb, i > 0);
sv_readdb(dbsubpath1, "abra_db.txt" , ',', 3, 3, MAX_SKILL_ABRA_DB, skill_parse_row_abradb, i); sv_readdb(dbsubpath1, "abra_db.txt" , ',', 3, 3, MAX_SKILL_ABRA_DB, skill_parse_row_abradb, i > 0);
sv_readdb(dbsubpath1, "spellbook_db.txt" , ',', 3, 3, MAX_SKILL_SPELLBOOK_DB, skill_parse_row_spellbookdb, i); sv_readdb(dbsubpath1, "spellbook_db.txt" , ',', 3, 3, MAX_SKILL_SPELLBOOK_DB, skill_parse_row_spellbookdb, i > 0);
sv_readdb(dbsubpath1, "magicmushroom_db.txt" , ',', 1, 2, MAX_SKILL_MAGICMUSHROOM_DB, skill_parse_row_magicmushroomdb, i); sv_readdb(dbsubpath1, "magicmushroom_db.txt" , ',', 1, 2, MAX_SKILL_MAGICMUSHROOM_DB, skill_parse_row_magicmushroomdb, i > 0);
sv_readdb(dbsubpath1, "skill_copyable_db.txt" , ',', 2, 4, -1, skill_parse_row_copyabledb, i); sv_readdb(dbsubpath1, "skill_copyable_db.txt" , ',', 2, 4, -1, skill_parse_row_copyabledb, i > 0);
sv_readdb(dbsubpath1, "skill_improvise_db.txt" , ',', 2, 2, MAX_SKILL_IMPROVISE_DB, skill_parse_row_improvisedb, i); sv_readdb(dbsubpath1, "skill_improvise_db.txt" , ',', 2, 2, MAX_SKILL_IMPROVISE_DB, skill_parse_row_improvisedb, i > 0);
sv_readdb(dbsubpath1, "skill_changematerial_db.txt" , ',', 5, 5+2*MAX_SKILL_CHANGEMATERIAL_SET, MAX_SKILL_CHANGEMATERIAL_DB, skill_parse_row_changematerialdb, i); sv_readdb(dbsubpath1, "skill_changematerial_db.txt" , ',', 5, 5+2*MAX_SKILL_CHANGEMATERIAL_SET, MAX_SKILL_CHANGEMATERIAL_DB, skill_parse_row_changematerialdb, i > 0);
sv_readdb(dbsubpath1, "skill_nonearnpc_db.txt" , ',', 2, 3, -1, skill_parse_row_nonearnpcrangedb, i); sv_readdb(dbsubpath1, "skill_nonearnpc_db.txt" , ',', 2, 3, -1, skill_parse_row_nonearnpcrangedb, i > 0);
#ifdef ADJUST_SKILL_DAMAGE #ifdef ADJUST_SKILL_DAMAGE
sv_readdb(dbsubpath1, "skill_damage_db.txt" , ',', 4, 7, -1, skill_parse_row_skilldamage, i); sv_readdb(dbsubpath1, "skill_damage_db.txt" , ',', 4, 7, -1, skill_parse_row_skilldamage, i > 0);
#endif #endif
aFree(dbsubpath1); aFree(dbsubpath1);
aFree(dbsubpath2); aFree(dbsubpath2);
@@ -21489,7 +21494,7 @@ void skill_reload (void) {
*------------------------------------------*/ *------------------------------------------*/
void do_init_skill(void) void do_init_skill(void)
{ {
skilldb_name2id = strdb_alloc(DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA, 0); skilldb_name2id = strdb_alloc((enum DBOptions)(DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA), 0);
skill_readdb(); skill_readdb();
@@ -21523,3 +21528,7 @@ void do_final_skill(void)
ers_destroy(skill_unit_ers); ers_destroy(skill_unit_ers);
ers_destroy(skill_timer_ers); ers_destroy(skill_timer_ers);
} }
#ifdef __cplusplus
}
#endif