- Corrected atcommand @homstats so it shows the correct minimum/maximum possible values.

- Simplified the hom level up function, now decimal stats are no longer stored. This should correct eA's homunculus on average being much stronger than Aegis's.
- Modified the homun db read code so it forces the "max" value to be higher than the "min".
- Cleaned up pc_allskillup, @allskills should work correctly now.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9664 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2007-01-17 14:16:11 +00:00
parent 07b63243a3
commit ed5678ed7d
4 changed files with 119 additions and 104 deletions

View File

@ -3,6 +3,13 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/01/17
* Corrected atcommand @homstats so it shows the correct minimum/maximum
possible values.
* Simplified the hom level up function, now decimal stats are no longer
stored. This should correct eA's homunculus on average being much stronger
than Aegis's.
* Cleaned up pc_allskillup, @allskills should work correctly now.
2007/01/16
* Added atcommand @homstats so you can check your homunculus stats and
compare them to the minimum/maximum values that you could have at your

View File

@ -9968,37 +9968,38 @@ int atcommand_homstats(
snprintf(atcmd_output, sizeof(atcmd_output) ,
"Homunculus growth stats (Lv %d %s):", lv, db->name);
clif_displaymessage(fd, atcmd_output);
lv--; //Since the first increase is at level 2.
snprintf(atcmd_output, sizeof(atcmd_output) ,"Max HP: %d (%d~%d)",
hom->max_hp, lv*db->gminHP, lv*db->gmaxHP);
hom->max_hp, db->basemaxHP +lv*db->gminHP, db->basemaxHP +lv*db->gmaxHP);
clif_displaymessage(fd, atcmd_output);
snprintf(atcmd_output, sizeof(atcmd_output) ,"Max SP: %d (%d~%d)",
hom->max_sp, lv*db->gminSP, lv*db->gmaxSP);
hom->max_sp, db->basemaxSP +lv*db->gminSP, db->basemaxSP +lv*db->gmaxSP);
clif_displaymessage(fd, atcmd_output);
snprintf(atcmd_output, sizeof(atcmd_output) ,"Str: %d (%d~%d)",
hom->str/10, lv*db->gminSTR/10, lv*db->gmaxSTR/10);
hom->str/10, db->baseSTR +lv*db->gminSTR/10, db->baseSTR +lv*db->gmaxSTR/10);
clif_displaymessage(fd, atcmd_output);
snprintf(atcmd_output, sizeof(atcmd_output) ,"Agi: %d (%d~%d)",
hom->agi/10, lv*db->gminAGI/10, lv*db->gmaxAGI/10);
hom->agi/10, db->baseAGI +lv*db->gminAGI/10, db->baseAGI +lv*db->gmaxAGI/10);
clif_displaymessage(fd, atcmd_output);
snprintf(atcmd_output, sizeof(atcmd_output) ,"Vit: %d (%d~%d)",
hom->vit/10, lv*db->gminVIT/10, lv*db->gmaxVIT/10);
hom->vit/10, db->baseVIT +lv*db->gminVIT/10, db->baseVIT +lv*db->gmaxVIT/10);
clif_displaymessage(fd, atcmd_output);
snprintf(atcmd_output, sizeof(atcmd_output) ,"Int: %d (%d~%d)",
hom->int_/10, lv*db->gminINT/10, lv*db->gmaxINT/10);
hom->int_/10, db->baseINT +lv*db->gminINT/10, db->baseINT +lv*db->gmaxINT/10);
clif_displaymessage(fd, atcmd_output);
snprintf(atcmd_output, sizeof(atcmd_output) ,"Dex: %d (%d~%d)",
hom->dex/10, lv*db->gminDEX/10, lv*db->gmaxDEX/10);
hom->dex/10, db->baseDEX +lv*db->gminDEX/10, db->baseDEX +lv*db->gmaxDEX/10);
clif_displaymessage(fd, atcmd_output);
snprintf(atcmd_output, sizeof(atcmd_output) ,"Luk: %d (%d~%d)",
hom->luk/10, lv*db->gminLUK/10, lv*db->gmaxLUK/10);
hom->luk/10, db->baseLUK +lv*db->gminLUK/10, db->baseLUK +lv*db->gmaxLUK/10);
clif_displaymessage(fd, atcmd_output);
return 0;

View File

@ -211,51 +211,38 @@ int merc_hom_levelup(struct homun_data *hd)
hd->homunculus.exp -= hd->exp_next ;
hd->exp_next = hexptbl[hd->homunculus.level - 1] ;
if ( hd->homunculusDB->gmaxHP <= hd->homunculusDB->gminHP )
growth_max_hp = hd->homunculusDB->gminHP ;
else
growth_max_hp = rand(hd->homunculusDB->gminHP, hd->homunculusDB->gmaxHP) ;
if ( hd->homunculusDB->gmaxSP <= hd->homunculusDB->gminSP )
growth_max_sp = hd->homunculusDB->gminSP ;
else
growth_max_sp = rand(hd->homunculusDB->gminSP, hd->homunculusDB->gmaxSP) ;
if ( hd->homunculusDB->gmaxSTR <= hd->homunculusDB->gminSTR )
growth_str = hd->homunculusDB->gminSTR ;
else
growth_str = rand(hd->homunculusDB->gminSTR, hd->homunculusDB->gmaxSTR) ;
if ( hd->homunculusDB->gmaxAGI <= hd->homunculusDB->gminAGI )
growth_agi = hd->homunculusDB->gminAGI ;
else
growth_agi = rand(hd->homunculusDB->gminAGI, hd->homunculusDB->gmaxAGI) ;
if ( hd->homunculusDB->gmaxVIT <= hd->homunculusDB->gminVIT )
growth_vit = hd->homunculusDB->gminVIT ;
else
growth_vit = rand(hd->homunculusDB->gminVIT, hd->homunculusDB->gmaxVIT) ;
if ( hd->homunculusDB->gmaxDEX <= hd->homunculusDB->gminDEX )
growth_dex = hd->homunculusDB->gminDEX ;
else
growth_dex = rand(hd->homunculusDB->gminDEX, hd->homunculusDB->gmaxDEX) ;
if ( hd->homunculusDB->gmaxINT <= hd->homunculusDB->gminINT )
growth_int = hd->homunculusDB->gminINT ;
else
growth_int = rand(hd->homunculusDB->gminINT, hd->homunculusDB->gmaxINT) ;
if ( hd->homunculusDB->gmaxLUK <= hd->homunculusDB->gminLUK )
growth_luk = hd->homunculusDB->gminLUK ;
else
growth_luk = rand(hd->homunculusDB->gminLUK, hd->homunculusDB->gmaxLUK) ;
//Aegis discards the decimals in the stat growth values!
growth_str-=growth_str%10;
growth_agi-=growth_agi%10;
growth_vit-=growth_vit%10;
growth_dex-=growth_dex%10;
growth_int-=growth_int%10;
growth_luk-=growth_luk%10;
hd->homunculus.max_hp += growth_max_hp;
hd->homunculus.max_sp += growth_max_sp;
hd->homunculus.str += growth_str ;
hd->homunculus.agi += growth_agi ;
hd->homunculus.vit += growth_vit ;
hd->homunculus.dex += growth_dex ;
hd->homunculus.int_ += growth_int ;
hd->homunculus.luk += growth_luk ;
hd->homunculus.str += growth_str;
hd->homunculus.agi += growth_agi;
hd->homunculus.vit += growth_vit;
hd->homunculus.dex += growth_dex;
hd->homunculus.int_+= growth_int;
hd->homunculus.luk += growth_luk;
if ( battle_config.homunculus_show_growth ) {
sprintf(output,
"Growth : hp:%d sp:%d str(%.2f) agi(%.2f) vit(%.2f) int(%.2f) dex(%.2f) luk(%.2f) ", growth_max_hp, growth_max_sp, growth_str/(float)10, growth_agi/(float)10, growth_vit/(float)10, growth_int/(float)10, growth_dex/(float)10, growth_luk/(float)10 ) ;
"Growth: hp:%d sp:%d str(%.2f) agi(%.2f) vit(%.2f) int(%.2f) dex(%.2f) luk(%.2f) ",
growth_max_hp, growth_max_sp,
growth_str/10.0, growth_agi/10.0, growth_vit/10.0,
growth_int/10.0, growth_dex/10.0, growth_luk/10.0);
clif_disp_onlyself(hd->master,output,strlen(output));
}
return 1 ;
@ -751,6 +738,7 @@ int read_homunculusdb(void)
int j = 0;
char *filename[]={"homunculus_db.txt","homunculus_db2.txt"};
char *str[36];
struct homunculus_db *db;
memset(homunculus_db,0,sizeof(homunculus_db));
for(i = 0; i<2; i++)
@ -785,42 +773,60 @@ int read_homunculusdb(void)
}
//Class,Homunculus,HP,SP,ATK,MATK,HIT,CRI,DEF,MDEF,FLEE,ASPD,STR,AGI,VIT,INT,DEX,LUK
homunculus_db[j].class_ = classid;
strncpy(homunculus_db[j].name,str[1],NAME_LENGTH-1);
homunculus_db[j].basemaxHP = atoi(str[2]);
homunculus_db[j].basemaxSP = atoi(str[3]);
homunculus_db[j].baseSTR = atoi(str[4]);
homunculus_db[j].baseAGI = atoi(str[5]);
homunculus_db[j].baseVIT = atoi(str[6]);
homunculus_db[j].baseINT = atoi(str[7]);
homunculus_db[j].baseDEX = atoi(str[8]);
homunculus_db[j].baseLUK = atoi(str[9]);
homunculus_db[j].baseIntimacy = atoi(str[10]);
homunculus_db[j].baseHungry = atoi(str[11]);
homunculus_db[j].hungryDelay = atoi(str[12]);
homunculus_db[j].foodID = atoi(str[13]);
homunculus_db[j].gminHP = atoi(str[14]);
homunculus_db[j].gmaxHP = atoi(str[15]);
homunculus_db[j].gminSP = atoi(str[16]);
homunculus_db[j].gmaxSP = atoi(str[17]);
homunculus_db[j].gminSTR = atoi(str[18]);
homunculus_db[j].gmaxSTR = atoi(str[19]);
homunculus_db[j].gminAGI = atoi(str[20]);
homunculus_db[j].gmaxAGI = atoi(str[21]);
homunculus_db[j].gminVIT = atoi(str[22]);
homunculus_db[j].gmaxVIT = atoi(str[23]);
homunculus_db[j].gminINT = atoi(str[24]);
homunculus_db[j].gmaxINT = atoi(str[25]);
homunculus_db[j].gminDEX = atoi(str[26]);
homunculus_db[j].gmaxDEX = atoi(str[27]);
homunculus_db[j].gminLUK = atoi(str[28]);
homunculus_db[j].gmaxLUK = atoi(str[29]);
homunculus_db[j].evo_class = atoi(str[30]);
homunculus_db[j].baseASPD = atoi(str[31]);
homunculus_db[j].size = atoi(str[32]);
homunculus_db[j].race = atoi(str[33]);
homunculus_db[j].element = atoi(str[34]);
homunculus_db[j].accessID = atoi(str[35]);
db = &homunculus_db[j];
db->class_ = classid;
strncpy(db->name,str[1],NAME_LENGTH-1);
db->basemaxHP = atoi(str[2]);
db->basemaxSP = atoi(str[3]);
db->baseSTR = atoi(str[4]);
db->baseAGI = atoi(str[5]);
db->baseVIT = atoi(str[6]);
db->baseINT = atoi(str[7]);
db->baseDEX = atoi(str[8]);
db->baseLUK = atoi(str[9]);
db->baseIntimacy = atoi(str[10]);
db->baseHungry = atoi(str[11]);
db->hungryDelay = atoi(str[12]);
db->foodID = atoi(str[13]);
db->gminHP = atoi(str[14]);
db->gmaxHP = atoi(str[15]);
db->gminSP = atoi(str[16]);
db->gmaxSP = atoi(str[17]);
db->gminSTR = atoi(str[18]);
db->gmaxSTR = atoi(str[19]);
db->gminAGI = atoi(str[20]);
db->gmaxAGI = atoi(str[21]);
db->gminVIT = atoi(str[22]);
db->gmaxVIT = atoi(str[23]);
db->gminINT = atoi(str[24]);
db->gmaxINT = atoi(str[25]);
db->gminDEX = atoi(str[26]);
db->gmaxDEX = atoi(str[27]);
db->gminLUK = atoi(str[28]);
db->gmaxLUK = atoi(str[29]);
db->evo_class = atoi(str[30]);
db->baseASPD = atoi(str[31]);
db->size = atoi(str[32]);
db->race = atoi(str[33]);
db->element = atoi(str[34]);
db->accessID = atoi(str[35]);
//Check that the min/max values really are below the other one.
if (db->gmaxHP <= db->gminHP)
db->gmaxHP = db->gminHP+1;
if (db->gmaxSP <= db->gminSP)
db->gmaxSP = db->gminSP+1;
if (db->gmaxSTR <= db->gminSTR)
db->gmaxSTR = db->gminSTR+1;
if (db->gmaxAGI <= db->gminAGI)
db->gmaxAGI = db->gminAGI+1;
if (db->gmaxVIT <= db->gminVIT)
db->gmaxVIT = db->gminVIT+1;
if (db->gmaxINT <= db->gminINT)
db->gmaxINT = db->gminINT+1;
if (db->gmaxDEX <= db->gminDEX)
db->gmaxDEX = db->gminDEX+1;
if (db->gmaxLUK <= db->gminLUK)
db->gmaxLUK = db->gminLUK+1;
j++;
}
if (j > MAX_HOMUNCULUS_CLASS)

View File

@ -4528,37 +4528,38 @@ int pc_allskillup(struct map_session_data *sd)
nullpo_retr(0, sd);
for(i=0;i<MAX_SKILL;i++){
if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){
sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2;
sd->status.skill[i].flag=0;
if (!sd->status.skill[i].lv)
sd->status.skill[i].id=0;
if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardスキルなら、
sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // 本?のlvに
sd->status.skill[i].flag=0; // flagは0にしておく
}
}
if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
// 全てのスキル
//pc_calc_skilltree takes care of setting the ID to valid skills. [Skotlex]
if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill)
{ //Get ALL skills except npc/guild ones. [Skotlex]
//and except SG_DEVIL [Komurka]
for(i=0;i<MAX_SKILL;i++){
if(!(skill_get_inf2(i)&(INF2_NPC_SKILL|INF2_GUILD_SKILL))) //Get ALL skills except npc/guild ones. [Skotlex]
if (i!=SG_DEVIL) //and except SG_DEVIL [Komurka]
if(!(skill_get_inf2(i)&(INF2_NPC_SKILL|INF2_GUILD_SKILL)) && i!=SG_DEVIL)
sd->status.skill[i].lv=skill_get_max(i); //Nonexistant skills should return a max of 0 anyway.
}
}
else {
else
{
int inf2;
for(i=0;i < MAX_SKILL_TREE && (id=skill_tree[sd->status.class_][i].id)>0;i++){
inf2 = skill_get_inf2(id);
if(sd->status.skill[id].id==0 &&
(!(inf2&INF2_QUEST_SKILL) || battle_config.quest_skill_learn) &&
!(inf2&(INF2_WEDDING_SKILL|INF2_SPIRIT_SKILL)) &&
(id!=SG_DEVIL))
{
sd->status.skill[id].id = id; // celest
if (
(inf2&INF2_QUEST_SKILL && !battle_config.quest_skill_learn) ||
(inf2&(INF2_WEDDING_SKILL|INF2_SPIRIT_SKILL)) ||
id==SG_DEVIL
)
continue; //Cannot be learned normally.
sd->status.skill[id].lv = skill_tree_get_max(id, sd->status.class_); // celest
}
}
}
status_calc_pc(sd,0);
return 0;
}