소스 검색

- 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

skotlex 18 년 전
부모
커밋
ed5678ed7d
4개의 변경된 파일119개의 추가작업 그리고 104개의 파일을 삭제
  1. 7 0
      Changelog-Trunk.txt
  2. 10 9
      src/map/atcommand.c
  3. 82 76
      src/map/mercenary.c
  4. 20 19
      src/map/pc.c

+ 7 - 0
Changelog-Trunk.txt

@@ -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

+ 10 - 9
src/map/atcommand.c

@@ -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;

+ 82 - 76
src/map/mercenary.c

@@ -211,52 +211,39 @@ 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) ;
+	growth_max_hp = rand(hd->homunculusDB->gminHP, hd->homunculusDB->gmaxHP) ;
+	growth_max_sp = rand(hd->homunculusDB->gminSP, hd->homunculusDB->gmaxSP) ;
+	growth_str = rand(hd->homunculusDB->gminSTR, hd->homunculusDB->gmaxSTR) ;
+	growth_agi = rand(hd->homunculusDB->gminAGI, hd->homunculusDB->gmaxAGI) ;
+	growth_vit = rand(hd->homunculusDB->gminVIT, hd->homunculusDB->gmaxVIT) ;
+	growth_dex = rand(hd->homunculusDB->gminDEX, hd->homunculusDB->gmaxDEX) ;
+	growth_int = rand(hd->homunculusDB->gminINT, hd->homunculusDB->gmaxINT) ;
+	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 ) ;
-			clif_disp_onlyself(hd->master,output,strlen(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/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)

+ 20 - 19
src/map/pc.c

@@ -4528,37 +4528,38 @@ int pc_allskillup(struct map_session_data *sd)
 	nullpo_retr(0, sd);
 
 	for(i=0;i<MAX_SKILL;i++){
-		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 (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 (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]
-					sd->status.skill[i].lv=skill_get_max(i); //Nonexistant skills should return a max of 0 anyway.
+			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
-				sd->status.skill[id].lv = skill_tree_get_max(id, sd->status.class_);	// 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;
 }