* Made skill_tree.txt reading use sv_readdb. [Ai4rei]

- Added define for skill entry requirements.
- Reports duplicate skills within same job class.
- Updated comments for skill Berserk in skill_tree.txt, among others because they would cause errors the way they are read now.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14524 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
ai4rei 2010-11-30 08:55:22 +00:00
parent 6cb2c681c9
commit cbc43338bf
8 changed files with 72 additions and 60 deletions

View File

@ -1,6 +1,9 @@
Date Added Date Added
2010/11/30 2010/11/30
* Made skill_tree.txt reading use sv_readdb. [Ai4rei]
- Added define for skill entry requirements.
- Reports duplicate skills within same job class.
* Added a define for star gladiator feel/hate info array length (follow up to r8721 and r11840). [Ai4rei] * Added a define for star gladiator feel/hate info array length (follow up to r8721 and r11840). [Ai4rei]
* Fixed script command getusers causing 'player not attached' errors when asking for character count in entire server (bugreport:4591, since r14495). [Ai4rei] * Fixed script command getusers causing 'player not attached' errors when asking for character count in entire server (bugreport:4591, since r14495). [Ai4rei]
2010/11/29 2010/11/29

View File

@ -8,6 +8,8 @@
1475 Equestrian's Spear: NEED INFO. 1475 Equestrian's Spear: NEED INFO.
13005 Angelic Wing Dagger: NEED INFO. 13005 Angelic Wing Dagger: NEED INFO.
======================= =======================
2010/11/30
* Rev. 14524 Updated comments for skill Berserk in skill_tree.txt, among others because they would cause errors the way they are read now. [Ai4rei]
2010/11/26 2010/11/26
* Rev. 14507 Added killerrid and killedrid param constants to const.txt [ultramage] * Rev. 14507 Added killerrid and killedrid param constants to const.txt [ultramage]
2010/11/21 2010/11/21

View File

@ -1,4 +1,4 @@
//JobNo,Skill-ID,MaxLV,Prerequisite Skill-ID-1,Prerequisite Skill-ID-1-Lv,PrereqSkill-ID-2,PrereqSkill-ID-2-Lv,PrereqSkill-ID-3,PrereqSkill-ID-3-Lv,PrereqSkill-ID-4,PrereqSkill-ID-4-Lv,PrereqSkill-ID-5,PrereqSkill-ID-5-Lv//CLASS_SKILLNAME#Skill Name# //JobNo,Skill-ID,MaxLV{,JobLV},Prerequisite Skill-ID-1,Prerequisite Skill-ID-1-Lv,PrereqSkill-ID-2,PrereqSkill-ID-2-Lv,PrereqSkill-ID-3,PrereqSkill-ID-3-Lv,PrereqSkill-ID-4,PrereqSkill-ID-4-Lv,PrereqSkill-ID-5,PrereqSkill-ID-5-Lv//CLASS_SKILLNAME#Skill Name#
//Novice //Novice
0,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# 0,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
0,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid# 0,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
@ -853,7 +853,7 @@
4008,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying# 4008,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying#
4008,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration# 4008,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration#
4008,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax# 4008,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax#
4008,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //It has an extra collumn after "MaxLevel" for Job Level 50 requeriment 4008,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //It has an extra column after "MaxLevel" for Job Level 50 requirement
4008,397,5,55,10,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce# 4008,397,5,55,10,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce#
4008,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow# 4008,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow#
4008,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike# 4008,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike#
@ -1084,7 +1084,7 @@
4014,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying# 4014,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying#
4014,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration# 4014,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration#
4014,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax# 4014,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax#
4014,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //check this, the last ",0" shouldn't be needed I think 4014,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //It has an extra column after "MaxLevel" for Job Level 50 requirement
4014,397,5,55,10,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce# 4014,397,5,55,10,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce#
4014,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow# 4014,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow#
4014,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike# 4014,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike#

View File

@ -5786,7 +5786,7 @@ ACMD_FUNC(skilltree)
ent = &skill_tree[c][j]; ent = &skill_tree[c][j];
meets = 1; meets = 1;
for(j=0;j<5;j++) for(j=0;j<MAX_PC_SKILL_REQUIRE;j++)
{ {
if( ent->need[j].id && pc_checkskill(sd,ent->need[j].id) < ent->need[j].lv) if( ent->need[j].id && pc_checkskill(sd,ent->need[j].id) < ent->need[j].lv)
{ {

View File

@ -147,7 +147,7 @@ int merc_hom_calc_skilltree(struct homun_data *hd)
continue; //Skill already known. continue; //Skill already known.
if(!battle_config.skillfree) if(!battle_config.skillfree)
{ {
for(j=0;j<5;j++) for(j=0;j<MAX_PC_SKILL_REQUIRE;j++)
{ {
if( hskill_tree[c][i].need[j].id && if( hskill_tree[c][i].need[j].id &&
merc_hom_checkskill(hd,hskill_tree[c][i].need[j].id) < hskill_tree[c][i].need[j].lv) merc_hom_checkskill(hd,hskill_tree[c][i].need[j].id) < hskill_tree[c][i].need[j].lv)
@ -1088,7 +1088,7 @@ int read_homunculus_skilldb(void)
if (minJobLevelPresent) if (minJobLevelPresent)
hskill_tree[classid][j].joblv=atoi(split[3]); hskill_tree[classid][j].joblv=atoi(split[3]);
for(k=0;k<5;k++){ for(k=0;k<MAX_PC_SKILL_REQUIRE;k++){
hskill_tree[classid][j].need[k].id=atoi(split[3+k*2+minJobLevelPresent]); hskill_tree[classid][j].need[k].id=atoi(split[3+k*2+minJobLevelPresent]);
hskill_tree[classid][j].need[k].lv=atoi(split[3+k*2+minJobLevelPresent+1]); hskill_tree[classid][j].need[k].lv=atoi(split[3+k*2+minJobLevelPresent+1]);
} }

View File

@ -1199,7 +1199,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
f = 1; f = 1;
if(!battle_config.skillfree) { if(!battle_config.skillfree) {
for(j = 0; j < 5; j++) { for(j = 0; j < MAX_PC_SKILL_REQUIRE; j++) {
if((k=skill_tree[c][i].need[j].id)) if((k=skill_tree[c][i].need[j].id))
{ {
if (!sd->status.skill[k].id || sd->status.skill[k].flag == 13) if (!sd->status.skill[k].id || sd->status.skill[k].flag == 13)
@ -1296,7 +1296,7 @@ static void pc_check_skilltree(struct map_session_data *sd, int skill)
if( sd->status.skill[id].id ) //Already learned if( sd->status.skill[id].id ) //Already learned
continue; continue;
for( j = 0; j < 5; j++ ) for( j = 0; j < MAX_PC_SKILL_REQUIRE; j++ )
{ {
if( (k = skill_tree[c][i].need[j].id) ) if( (k = skill_tree[c][i].need[j].id) )
{ {
@ -7910,13 +7910,58 @@ int pc_split_atoui(char* str, unsigned int* val, char sep, int max)
/*========================================== /*==========================================
* DB reading. * DB reading.
* exp.txt - required experience values * exp.txt - required experience values
* job_db1.txt - weight, hp, sp, aspd
* job_db2.txt - job level stat bonuses
* skill_tree.txt - skill tree for every class * skill_tree.txt - skill tree for every class
* attr_fix.txt - elemental adjustment table * attr_fix.txt - elemental adjustment table
* size_fix.txt - size adjustment table for weapons * statpoint.txt - status points per base level
* refine_db.txt - refining data table
*------------------------------------------*/ *------------------------------------------*/
static bool pc_readdb_skilltree(char* fields[], int columns, int current)
{
unsigned char joblv = 0, skilllv;
unsigned short skillid;
int idx, class_;
unsigned int i, offset = 3, skillidx;
class_ = atoi(fields[0]);
skillid = (unsigned short)atoi(fields[1]);
skilllv = (unsigned char)atoi(fields[2]);
if(columns==4+MAX_PC_SKILL_REQUIRE*2)
{// job level requirement extra column
joblv = (unsigned char)atoi(fields[3]);
offset++;
}
if(!pcdb_checkid(class_))
{
ShowWarning("pc_readdb_skilltree: Invalid job class %d specified.\n", class_);
return false;
}
idx = pc_class2idx(class_);
//This is to avoid adding two lines for the same skill. [Skotlex]
ARR_FIND( 0, MAX_SKILL_TREE, skillidx, skill_tree[idx][skillidx].id == 0 || skill_tree[idx][skillidx].id == skillid );
if( skillidx == MAX_SKILL_TREE )
{
ShowWarning("pc_readdb_skilltree: Unable to load skill %hu into job %d's tree. Maximum number of skills per class has been reached.\n", skillid, class_);
return false;
}
else if(skill_tree[idx][skillidx].id)
{
ShowNotice("pc_readdb_skilltree: Overwriting skill %hu for job class %d.\n", skillid, class_);
}
skill_tree[idx][skillidx].id = skillid;
skill_tree[idx][skillidx].max = skilllv;
skill_tree[idx][skillidx].joblv = joblv;
for(i = 0; i < MAX_PC_SKILL_REQUIRE; i++)
{
skill_tree[idx][skillidx].need[i].id = atoi(fields[i*2+offset]);
skill_tree[idx][skillidx].need[i].lv = atoi(fields[i*2+offset+1]);
}
return true;
}
int pc_readdb(void) int pc_readdb(void)
{ {
int i,j,k; int i,j,k;
@ -8008,53 +8053,7 @@ int pc_readdb(void)
// スキルツリ? // スキルツリ?
memset(skill_tree,0,sizeof(skill_tree)); memset(skill_tree,0,sizeof(skill_tree));
sprintf(line, "%s/skill_tree.txt", db_path); sv_readdb(db_path, "skill_tree.txt", ',', 3+MAX_PC_SKILL_REQUIRE*2, 4+MAX_PC_SKILL_REQUIRE*2, -1, &pc_readdb_skilltree);
fp=fopen(line,"r");
if(fp==NULL){
ShowError("can't read %s\n", line);
return 1;
}
while(fgets(line, sizeof(line), fp))
{
char *split[50];
int f=0, m=3, idx;
if(line[0]=='/' && line[1]=='/')
continue;
for(j=0,p=line;j<14 && p;j++){
split[j]=p;
p=strchr(p,',');
if(p) *p++=0;
}
if(j<13)
continue;
if (j == 14) {
f=1; // MinJobLvl has been added
m++;
}
// check for bounds [celest]
idx = atoi(split[0]);
if(!pcdb_checkid(idx))
continue;
idx = pc_class2idx(idx);
k = atoi(split[1]); //This is to avoid adding two lines for the same skill. [Skotlex]
ARR_FIND( 0, MAX_SKILL_TREE, j, skill_tree[idx][j].id == 0 || skill_tree[idx][j].id == k );
if( j == MAX_SKILL_TREE )
{
ShowWarning("Unable to load skill %d into job %d's tree. Maximum number of skills per class has been reached.\n", k, atoi(split[0]));
continue;
}
skill_tree[idx][j].id=k;
skill_tree[idx][j].max=atoi(split[2]);
if (f) skill_tree[idx][j].joblv=atoi(split[3]);
for(k=0;k<5;k++){
skill_tree[idx][j].need[k].id=atoi(split[k*2+m]);
skill_tree[idx][j].need[k].lv=atoi(split[k*2+m+1]);
}
}
fclose(fp);
ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","skill_tree.txt");
// ?性修正テ?ブル // ?性修正テ?ブル
for(i=0;i<4;i++) for(i=0;i<4;i++)

View File

@ -17,6 +17,7 @@
#include "mob.h" #include "mob.h"
#define MAX_PC_BONUS 10 #define MAX_PC_BONUS 10
#define MAX_PC_SKILL_REQUIRE 5
#define MAX_PC_FEELHATE 3 #define MAX_PC_FEELHATE 3
struct weapon_data { struct weapon_data {
@ -722,7 +723,7 @@ struct skill_tree_entry {
struct { struct {
short id; short id;
unsigned char lv; unsigned char lv;
} need[5]; } need[MAX_PC_SKILL_REQUIRE];
}; // Celest }; // Celest
extern struct skill_tree_entry skill_tree[CLASS_COUNT][MAX_SKILL_TREE]; extern struct skill_tree_entry skill_tree[CLASS_COUNT][MAX_SKILL_TREE];

View File

@ -7676,6 +7676,13 @@ static int status_natural_heal_timer(int tid, unsigned int tick, int id, intptr
return 0; return 0;
} }
/*==========================================
* 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
*------------------------------------------*/
int status_readdb(void) int status_readdb(void)
{ {
int i,j,class_; int i,j,class_;