Преглед на файлове

Follow-up r17391, bugreport:7780
- Missing Novice's HP table
- Fixing memcpy to copy exp table that causing map crash
- (temporary change) hide the warning msg because previous hp/sp is higher or equal, we can change about the calculation later

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@17392 54d463be-8e91-2dee-dedb-b68131a5f0ec

cydh преди 12 години
родител
ревизия
a865992347
променени са 2 файла, в които са добавени 29 реда и са изтрити 22 реда
  1. 1 1
      db/re/job_maxhpsp_db.txt
  2. 28 21
      src/map/pc.c

+ 1 - 1
db/re/job_maxhpsp_db.txt

@@ -7,7 +7,7 @@
 //===============================
 
 //MaxHP - Novice/Super Novice/Novice High/Baby Novice/Baby Super Novice
-1,99,23:4001:4023:4045,0,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505,510,515,520,525,530
+1,99,0:23:4001:4023:4045,0,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505,510,515,520,525,530
 
 //MaxHP - Swordman/Swordman High/Baby Swordman
 1,99,1:4002:4024,0,40,46,53,61,70,79,89,100,111,123,136,149,163,178,194,210,227,245,263,282,302,322,343,365,388,411,435,460,485,511,538,565,593,622,652,682,713,745,777,810,844,878,913,949,986,1023,1061,1100,1139,1179,1220,1261,1303,1346,1390,1434,1479,1525,1571,1618,1666,1714,1763,1813,1864,1915,1967,2020,2073,2127,2182,2237,2293,2350,2408,2466,2525,2585,2645,2706,2768,2830,2893,2957,3022,3087,3153,3220,3287,3355,3424,3493,3563,3634,3706,3778,3851,3925,3999

+ 28 - 21
src/map/pc.c

@@ -9738,34 +9738,43 @@ static bool pc_readdb_job_maxhpsp(char* fields[], int columns, int current)
 			return false;
 		}
 		idx = pc_class2idx(job_id);
-		if(type == 0){ //hp type
+		if(type == 0) {	//hp type
 			unsigned int k = 0;
 			unsigned int val, oldval=0;
 			for(i = 1; i <= MAX_LEVEL; i++) {
 				val = 0;
 				k += (job_info[idx].hp_factor*(i+1) + 50) / 100;
-				if(i>=startlvl && i <=maxlvl) val = atoi(fields[i+4]);
-				if(val==0) val = 35 + ((i+1)*job_info[idx].hp_multiplicator)/100 + k;
-				if(oldval >= val)
-					ShowWarning("Warn, HP value is lower or equal then previous one for (job=%d,oldval=%d,val=%d,lvl=%d hp_factor=%d,hp_multiplicator=%d,k=%d)\n",
-						job_id,oldval,val,i+1,job_info[idx].hp_factor,job_info[idx].hp_multiplicator,k);
+				if(i>=startlvl && i<=maxlvl)
+					val = atoi(fields[i+4]);
+				if(val==0 || oldval>=0)	//if oldval>=val, assume the default calculation always be higher
+					val = 35 + ((i+1)*job_info[idx].hp_multiplicator)/100 + k;
+				if(oldval >= val) {
+					ShowInfo("pc_readdb_job_maxhpsp: HP value is lower or equal then previous one. Using temporary... (job=%d,oldval=%d,val=%d,lvl=%d,hp_factor=%d,hp_multiplicator=%d,k=%d)\n"
+						,job_id,oldval,val,i+1,job_info[idx].hp_factor,job_info[idx].hp_multiplicator,k);
+					//val = oldval+job_info[idx].hp_multiplicator;	//if oldval still >= val, maybe we can use this?
+				}
 				val = min(INT_MAX,val);
 				job_info[idx].hp_table[i-1] = val;
 				oldval = val;
 			}
-	//		ShowInfo("Have readen hp table for job=%d\n{",job_id);
-	//		for(i=0; i<MAX_LEVEL; i++ )
-	//			printf("%d,",job_info[idx].hp_table[i]);
-	//		printf("\n}\n");
+//			ShowInfo("Have readen hp table for job=%d\n{",job_id);
+//			for(i=0; i<MAX_LEVEL; i++ )
+//				printf("%d,",job_info[idx].hp_table[i]);
+//			printf("\n}\n");
 		}
 		else if(type == 1){ //sp type
 			unsigned int val, oldval=0;
 			for(i = 1; i <= MAX_LEVEL; i++) {
 				val = 0;
-				if(i>=startlvl && i <=maxlvl) val = atoi(fields[i+4]);
-				if(val==0) val = 10 + ((i+1)*job_info[idx].sp_factor)/100;
-				if(oldval >= val) ShowWarning("Warn, SP value is lower or equal then previous one for (job=%d,oldval=%d,val=%d,lvl=%d,sp_factor=%d)\n",
-					job_id,oldval,val,i,job_info[idx].sp_factor);
+				if(i>=startlvl && i <=maxlvl)
+					val = atoi(fields[i+4]);
+				if(val==0 || oldval>=0)	//if oldval>=val, assume the default calculation always be higher
+					val = 10 + ((i+1)*job_info[idx].sp_factor)/100;
+				if(oldval >= val) {
+					ShowInfo("pc_readdb_job_maxhpsp: SP value is lower or equal then previous one. Using temporary... (job=%d,oldval=%d,val=%d,lvl=%d,sp_factor=%d)\n"
+						,job_id,oldval,val,i,job_info[idx].sp_factor);
+					//val = oldval+job_info[idx].sp_factor;	//if oldval still >= val, maybe we can use this?
+				}
 				val = min(INT_MAX,val);
 				job_info[idx].sp_table[i-1] = val;
 				oldval = val;
@@ -9822,7 +9831,7 @@ static bool pc_readdb_job_exp(char* fields[], int columns, int current)
 	while ((ui = job_info[idx].max_level[type]) >= 2 && job_info[idx].exp_table[type][ui-2] <= 0)
 		job_info[idx].max_level[type]--;
 	if (job_info[idx].max_level[type] < maxlvl) {
-		ShowWarning("pc_readdb: Specified max %u for job %d, but that job's exp table only goes up to level %u.\n", maxlvl, job_id, job_info[idx].max_level[type]);
+		ShowWarning("pc_readdb_job_exp: Specified max %u for job %d, but that job's exp table only goes up to level %u.\n", maxlvl, job_id, job_info[idx].max_level[type]);
 		ShowInfo("Filling the missing values with the last exp entry.\n");
 		//Fill the requested values with the last entry.
 		ui = (job_info[idx].max_level[type] <= 2? 0: job_info[idx].max_level[type]-2);
@@ -9838,7 +9847,7 @@ static bool pc_readdb_job_exp(char* fields[], int columns, int current)
 			continue;
 		}
 		idx = pc_class2idx(job_id);
-		memcpy(job_info[idx].exp_table[type], job_info[jobs[0]].exp_table[type], sizeof(job_info[0].exp_table[0]));
+		memcpy(job_info[idx].exp_table[type], job_info[pc_class2idx(jobs[0])].exp_table[type], sizeof(job_info[pc_class2idx(jobs[0])].exp_table[type]));
 		job_info[idx].max_level[type] = maxlvl;
 //		ShowInfo("%s - Class %d: %u\n", type?"Job":"Base", job_id, job_info[idx].max_level[type]);
 	}
@@ -9928,8 +9937,7 @@ int pc_readdb(void)
 	sv_readdb(db_path, "job_db2.txt",',',1,1+MAX_LEVEL,CLASS_COUNT,&pc_readdb_job2);
 	sv_readdb(db_path, DBPATH"job_maxhpsp_db.txt", ',', 4, 4+MAX_LEVEL, CLASS_COUNT*2, &pc_readdb_job_maxhpsp);
 	sv_readdb(db_path, DBPATH"job_exp.txt",',',4,1000+3,CLASS_COUNT*2,&pc_readdb_job_exp); //support till 1000lvl
-
-
+	
 	//Checking if all class have their data
 	for (i = 0; i < JOB_MAX; i++) {
 		int j;
@@ -9939,11 +9947,10 @@ int pc_readdb(void)
 		j = pc_class2idx(i);
 		if (!job_info[j].max_level[0])
 			ShowWarning("Class %s (%d) does not have a base exp table.\n", job_name(i), i);
-		if (!job_info[j].max_level[0])
+		if (!job_info[j].max_level[1])
 			ShowWarning("Class %s (%d) does not have a job exp table.\n", job_name(i), i);
 	}
-
-	return 0;
+ 	return 0;
 }
 
 // Read MOTD on startup. [Valaris]