瀏覽代碼

- Updated attr_fix_table reading code to account for ELE_MAX (will correctly read bigger elemental tables if ELE_MAX is changed)
- Aggressive mobs will now use battle_check_range rather than mob_can_reach to decide whether to lock-on or not to a target within sight-range.
- Added warnings in mob_readdb when the mob's element is invalid.
- Updated the corresponding entries in map.h to use ELE_MAX
- Added error messages in pc_bonus* functions when an invalid element is passed to the relevant bonuses.


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

skotlex 19 年之前
父節點
當前提交
a2f222eb46
共有 5 個文件被更改,包括 94 次插入50 次删除
  1. 7 0
      Changelog-Trunk.txt
  2. 1 34
      src/map/battle.c
  3. 5 5
      src/map/map.h
  4. 24 4
      src/map/mob.c
  5. 57 7
      src/map/pc.c

+ 7 - 0
Changelog-Trunk.txt

@@ -4,6 +4,13 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 
 2006/05/30
 2006/05/30
+	* Updated attr_fix_table reading code to account for ELE_MAX (will
+	  correctly read bigger elemental tables if ELE_MAX is changed) [Skotlex]
+	* Aggressive mobs will now use battle_check_range rather than mob_can_reach
+	  to decide whether to lock-on or not to a target within sight-range. [Skotlex]
+	* Added warnings in mob_readdb when the mob's element is invalid. [Skotlex]
+	* Added error messages in pc_bonus* functions when an invalid element is
+	  passed to the relevant bonuses. [Skotlex]
 	* [Optimized]:
 	* [Optimized]:
 	  - clif_specialeffect to use the enums.
 	  - clif_specialeffect to use the enums.
 	  [Improved]:
 	  [Improved]:

+ 1 - 34
src/map/battle.c

@@ -27,7 +27,7 @@
 
 
 #define	is_boss(bl)	status_get_mexp(bl)	// Can refine later [Aru]
 #define	is_boss(bl)	status_get_mexp(bl)	// Can refine later [Aru]
 
 
-int attr_fix_table[4][10][10];
+int attr_fix_table[4][ELE_MAX][ELE_MAX];
 
 
 struct Battle_Config battle_config;
 struct Battle_Config battle_config;
 static struct eri *delay_damage_ers; //For battle delay damage structures.
 static struct eri *delay_damage_ers; //For battle delay damage structures.
@@ -189,39 +189,6 @@ int battle_attr_fix(struct block_list *src, struct block_list *target, int damag
 		def_lv < 1 || def_lv > 4) {
 		def_lv < 1 || def_lv > 4) {
 		if (battle_config.error_log)
 		if (battle_config.error_log)
 			ShowError("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",atk_elem,def_type,def_lv);
 			ShowError("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",atk_elem,def_type,def_lv);
-		//TODO: Remove this debug case once the cause is resolved. [Skotlex]
-		if (src) switch (src->type) {
-			case BL_MOB:
-				ShowDebug("src: Mob %s-%d\n",  ((struct mob_data*)src)->name, ((struct mob_data*)src)->class_);
-				break;
-			case BL_PC:
-				ShowDebug("src: Player %s-%d\n",  ((struct map_session_data*)src)->status.name, ((struct map_session_data*)src)->bl.id);
-				break;
-			case BL_PET:
-				ShowDebug("src: Pet %s-%d\n", ((struct pet_data*)src)->name, ((struct pet_data*)src)->bl.id);
-				break;
-			case BL_SKILL:
-				ShowDebug("src: Ground Skill id: %d\n", ((struct skill_unit*)src)->group->skill_id);
-				break;
-			default:
-				ShowDebug("unknown source type %d.\n", src->type);
-		}
-		if (target) switch (target->type) {
-			case BL_MOB:
-				ShowDebug("target: Mob %s-%d\n",  ((struct mob_data*)target)->name, ((struct mob_data*)target)->class_);
-				break;
-			case BL_PC:
-				ShowDebug("target: Player %s-%d\n",  ((struct map_session_data*)target)->status.name, ((struct map_session_data*)target)->bl.id);
-				break;
-			case BL_PET:
-				ShowDebug("target: Pet %s-%d\n", ((struct pet_data*)target)->name, ((struct pet_data*)target)->bl.id);
-				break;
-			case BL_SKILL:
-				ShowDebug("target: Ground Skill id: %d\n", ((struct skill_unit*)target)->group->skill_id);
-				break;
-			default:
-				ShowDebug("unknown target type %d.\n", target->type);
-		}
 		return damage;
 		return damage;
 	}
 	}
 
 

+ 5 - 5
src/map/map.h

@@ -463,7 +463,7 @@ struct weapon_data {
 	int ignore_def_race;
 	int ignore_def_race;
 	int def_ratio_atk_ele;
 	int def_ratio_atk_ele;
 	int def_ratio_atk_race;
 	int def_ratio_atk_race;
-	int addele[10];
+	int addele[ELE_MAX];
 	int addrace[RC_MAX];
 	int addrace[RC_MAX];
 	int addrace2[RC_MAX];
 	int addrace2[RC_MAX];
 	int addsize[3];
 	int addsize[3];
@@ -622,23 +622,23 @@ struct map_session_data {
 	
 	
 	// here start arrays to be globally zeroed at the beginning of status_calc_pc()
 	// here start arrays to be globally zeroed at the beginning of status_calc_pc()
 	int param_bonus[6],param_equip[6]; //Stores card/equipment bonuses.
 	int param_bonus[6],param_equip[6]; //Stores card/equipment bonuses.
-	int subele[10];
+	int subele[ELE_MAX];
 	int subrace[RC_MAX];
 	int subrace[RC_MAX];
 	int subrace2[RC_MAX];
 	int subrace2[RC_MAX];
 	int subsize[3];
 	int subsize[3];
 	int addeff[SC_COMMON_MAX-SC_COMMON_MIN+1];
 	int addeff[SC_COMMON_MAX-SC_COMMON_MIN+1];
 	int addeff2[SC_COMMON_MAX-SC_COMMON_MIN+1];
 	int addeff2[SC_COMMON_MAX-SC_COMMON_MIN+1];
 	int reseff[SC_COMMON_MAX-SC_COMMON_MIN+1];
 	int reseff[SC_COMMON_MAX-SC_COMMON_MIN+1];
-	int weapon_coma_ele[10];
+	int weapon_coma_ele[ELE_MAX];
 	int weapon_coma_race[RC_MAX];
 	int weapon_coma_race[RC_MAX];
 	int weapon_atk[16];
 	int weapon_atk[16];
 	int weapon_atk_rate[16];
 	int weapon_atk_rate[16];
-	int arrow_addele[10];
+	int arrow_addele[ELE_MAX];
 	int arrow_addrace[RC_MAX];
 	int arrow_addrace[RC_MAX];
 	int arrow_addsize[3];
 	int arrow_addsize[3];
 	int arrow_addeff[SC_COMMON_MAX-SC_COMMON_MIN+1];
 	int arrow_addeff[SC_COMMON_MAX-SC_COMMON_MIN+1];
 	int arrow_addeff2[SC_COMMON_MAX-SC_COMMON_MIN+1];
 	int arrow_addeff2[SC_COMMON_MAX-SC_COMMON_MIN+1];
-	int magic_addele[10];
+	int magic_addele[ELE_MAX];
 	int magic_addrace[RC_MAX];
 	int magic_addrace[RC_MAX];
 	int magic_addsize[3];
 	int magic_addsize[3];
 	int critaddrace[RC_MAX];
 	int critaddrace[RC_MAX];

+ 24 - 4
src/map/mob.c

@@ -793,10 +793,10 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
 			!(status_get_mode(&md->bl)&MD_BOSS))
 			!(status_get_mode(&md->bl)&MD_BOSS))
 			return 0; //Gangster paradise protection.
 			return 0; //Gangster paradise protection.
 	case BL_MOB:
 	case BL_MOB:
-		if((dist=distance_bl(&md->bl, bl)) < md->db->range2
-			&& (md->status.rhw.range > 6 || mob_can_reach(md,bl,dist+1, MSS_FOLLOW))
-			&& ((*target) == NULL || !check_distance_bl(&md->bl, *target, dist)) //New target closer than previous one.
-		) {
+		if((dist=distance_bl(&md->bl, bl)) < md->db->range2 &&
+			((*target) == NULL || !check_distance_bl(&md->bl, *target, dist)) &&
+			battle_check_range(&md->bl,bl,md->db->range2)
+		) { //Pick closest target?
 			(*target) = bl;
 			(*target) = bl;
 			md->target_id=bl->id;
 			md->target_id=bl->id;
 			md->min_chase= dist + md->db->range3;
 			md->min_chase= dist + md->db->range3;
@@ -3157,6 +3157,16 @@ static int mob_readdb(void)
 			i = atoi(str[24]); //Element
 			i = atoi(str[24]); //Element
 			status->def_ele = i%10;
 			status->def_ele = i%10;
 			status->ele_lv = i/20;
 			status->ele_lv = i/20;
+			if (status->def_ele >= ELE_MAX)
+			{
+				ShowWarning("Mob with ID: %d has invalid element type %d (max element is %d)\n", class_, status->def_ele, ELE_MAX-1);
+				status->def_ele = ELE_NEUTRAL;
+			}
+			if (status->ele_lv < 1 || status->ele_lv > 4)
+			{
+				ShowWarning("Mob with ID: %d has invalid element level %d (max is 4)\n", class_, status->ele_lv);
+				status->ele_lv = 1;
+			}
 			status->mode=atoi(str[25]);
 			status->mode=atoi(str[25]);
 			status->speed=atoi(str[26]);
 			status->speed=atoi(str[26]);
 			status->aspd_rate = 100;
 			status->aspd_rate = 100;
@@ -3826,6 +3836,16 @@ static int mob_read_sqldb(void)
 				i = TO_INT(24); //Element
 				i = TO_INT(24); //Element
 				status->def_ele = i%10;
 				status->def_ele = i%10;
 				status->ele_lv = i/20;
 				status->ele_lv = i/20;
+				if (status->def_ele >= ELE_MAX)
+				{
+					ShowWarning("Mob with ID: %d has invalid element type %d (max element is %d)\n", status->def_ele, ELE_MAX-1);
+					status->def_ele = ELE_NEUTRAL;
+				}
+				if (status->ele_lv < 1 || status->ele_lv > 4)
+				{
+					ShowWarning("Mob with ID: %d has invalid elemnt level %d (max is 4)\n", status->ele_lv);
+					status->ele_lv = 1;
+				}
 				status->mode = TO_INT(25);
 				status->mode = TO_INT(25);
 				status->speed = TO_INT(26);
 				status->speed = TO_INT(26);
 				status->aspd_rate = 100;
 				status->aspd_rate = 100;

+ 57 - 7
src/map/pc.c

@@ -1233,6 +1233,11 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			sd->arrow_cri += val*10;
 			sd->arrow_cri += val*10;
 		break;
 		break;
 	case SP_ATKELE:
 	case SP_ATKELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus: SP_ATKELE: Invalid element %d\n", val);
+			break;
+		}
 		if(!sd->state.lr_flag)
 		if(!sd->state.lr_flag)
 			status->rhw.ele=val;
 			status->rhw.ele=val;
 		else if(sd->state.lr_flag == 1)
 		else if(sd->state.lr_flag == 1)
@@ -1241,6 +1246,11 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			sd->arrow_ele=val;
 			sd->arrow_ele=val;
 		break;
 		break;
 	case SP_DEFELE:
 	case SP_DEFELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus: SP_DEFELE: Invalid element %d\n", val);
+			break;
+		}
 		if(sd->state.lr_flag != 2)
 		if(sd->state.lr_flag != 2)
 			status->def_ele=val;
 			status->def_ele=val;
 		break;
 		break;
@@ -1342,6 +1352,11 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			sd->matk_rate += val;
 			sd->matk_rate += val;
 		break;
 		break;
 	case SP_IGNORE_DEF_ELE:
 	case SP_IGNORE_DEF_ELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus: SP_IGNORE_DEF_ELE: Invalid element %d\n", val);
+			break;
+		}
 		if(!sd->state.lr_flag)
 		if(!sd->state.lr_flag)
 			sd->right_weapon.ignore_def_ele |= 1<<val;
 			sd->right_weapon.ignore_def_ele |= 1<<val;
 		else if(sd->state.lr_flag == 1)
 		else if(sd->state.lr_flag == 1)
@@ -1366,6 +1381,11 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			sd->misc_def_rate += val;
 			sd->misc_def_rate += val;
 		break;
 		break;
 	case SP_IGNORE_MDEF_ELE:
 	case SP_IGNORE_MDEF_ELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus: SP_IGNORE_MDEF_ELE: Invalid element %d\n", val);
+			break;
+		}
 		if(sd->state.lr_flag != 2)
 		if(sd->state.lr_flag != 2)
 			sd->ignore_mdef_ele |= 1<<val;
 			sd->ignore_mdef_ele |= 1<<val;
 		break;
 		break;
@@ -1386,12 +1406,22 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			sd->critical_rate+=val;
 			sd->critical_rate+=val;
 		break;
 		break;
 	case SP_DEF_RATIO_ATK_ELE:
 	case SP_DEF_RATIO_ATK_ELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus: SP_DEF_RATIO_ATK_ELE: Invalid element %d\n", val);
+			break;
+		}
 		if(!sd->state.lr_flag)
 		if(!sd->state.lr_flag)
 			sd->right_weapon.def_ratio_atk_ele |= 1<<val;
 			sd->right_weapon.def_ratio_atk_ele |= 1<<val;
 		else if(sd->state.lr_flag == 1)
 		else if(sd->state.lr_flag == 1)
 			sd->left_weapon.def_ratio_atk_ele |= 1<<val;
 			sd->left_weapon.def_ratio_atk_ele |= 1<<val;
 		break;
 		break;
 	case SP_DEF_RATIO_ATK_RACE:
 	case SP_DEF_RATIO_ATK_RACE:
+		if(val >= RC_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus: SP_DEF_RATIO_ATK_RACE: Invalid race %d\n", val);
+			break;
+		}
 		if(!sd->state.lr_flag)
 		if(!sd->state.lr_flag)
 			sd->right_weapon.def_ratio_atk_race |= 1<<val;
 			sd->right_weapon.def_ratio_atk_race |= 1<<val;
 		else if(sd->state.lr_flag == 1)
 		else if(sd->state.lr_flag == 1)
@@ -1629,6 +1659,11 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 
 
 	switch(type){
 	switch(type){
 	case SP_ADDELE:
 	case SP_ADDELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus2: SP_ADDELE: Invalid element %d\n", val);
+			break;
+		}
 		if(!sd->state.lr_flag)
 		if(!sd->state.lr_flag)
 			sd->right_weapon.addele[type2]+=val;
 			sd->right_weapon.addele[type2]+=val;
 		else if(sd->state.lr_flag == 1)
 		else if(sd->state.lr_flag == 1)
@@ -1653,6 +1688,11 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 			sd->arrow_addsize[type2]+=val;
 			sd->arrow_addsize[type2]+=val;
 		break;
 		break;
 	case SP_SUBELE:
 	case SP_SUBELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus2: SP_SUBELE: Invalid element %d\n", val);
+			break;
+		}
 		if(sd->state.lr_flag != 2)
 		if(sd->state.lr_flag != 2)
 			sd->subele[type2]+=val;
 			sd->subele[type2]+=val;
 		break;
 		break;
@@ -1689,6 +1729,11 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 			sd->reseff[type2-SC_COMMON_MIN]+=val;
 			sd->reseff[type2-SC_COMMON_MIN]+=val;
 		break;
 		break;
 	case SP_MAGIC_ADDELE:
 	case SP_MAGIC_ADDELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus2: SP_MAGIC_ADDELE: Invalid element %d\n", val);
+			break;
+		}
 		if(sd->state.lr_flag != 2)
 		if(sd->state.lr_flag != 2)
 			sd->magic_addele[type2]+=val;
 			sd->magic_addele[type2]+=val;
 		break;
 		break;
@@ -1850,6 +1895,11 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 		}
 		}
 		break;
 		break;
 	case SP_WEAPON_COMA_ELE:
 	case SP_WEAPON_COMA_ELE:
+		if(val >= ELE_MAX) {
+			if(battle_config.error_log)
+				ShowError("pc_bonus2: SP_WEAPON_COMA_ELE: Invalid element %d\n", val);
+			break;
+		}
 		if(sd->state.lr_flag != 2)
 		if(sd->state.lr_flag != 2)
 			sd->weapon_coma_ele[type2] += val;
 			sd->weapon_coma_ele[type2] += val;
 		break;
 		break;
@@ -1978,11 +2028,11 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 		break;
 		break;
 	case SP_ADD_MONSTER_DROP_ITEM:
 	case SP_ADD_MONSTER_DROP_ITEM:
 		if (sd->state.lr_flag != 2)
 		if (sd->state.lr_flag != 2)
-			pc_bonus_item_drop(sd->add_drop, &sd->add_drop_count, type2, 0, (1<<10)|(1<<11), val);
+			pc_bonus_item_drop(sd->add_drop, &sd->add_drop_count, type2, 0, (1<<RC_BOSS)|(1<<RC_NONBOSS), val);
 		break;
 		break;
 	case SP_ADD_MONSTER_DROP_ITEMGROUP:
 	case SP_ADD_MONSTER_DROP_ITEMGROUP:
 		if (sd->state.lr_flag != 2)
 		if (sd->state.lr_flag != 2)
-			pc_bonus_item_drop(sd->add_drop, &sd->add_drop_count, 0, type2, (1<<10)|(1<<11), val);
+			pc_bonus_item_drop(sd->add_drop, &sd->add_drop_count, 0, type2, (1<<RC_BOSS)|(1<<RC_NONBOSS), val);
 		break;
 		break;
 	case SP_SP_LOSS_RATE:
 	case SP_SP_LOSS_RATE:
 		if(sd->state.lr_flag != 2) {
 		if(sd->state.lr_flag != 2) {
@@ -2125,7 +2175,7 @@ int pc_skill(struct map_session_data *sd,int id,int level,int flag)
 
 
 	if(level>MAX_SKILL_LEVEL){
 	if(level>MAX_SKILL_LEVEL){
 		if(battle_config.error_log)
 		if(battle_config.error_log)
-			ShowError("support card skill only!\n");
+			ShowError("pc_skill: Skill level %d too high. Max lv supported is MAX_SKILL_LEVEL (%d)\n", level, MAX_SKILL_LEVEL);
 		return 0;
 		return 0;
 	}
 	}
 	if(!flag && (sd->status.skill[id].id == id || level == 0)){	// クエスト所得ならここで?件を確認して送信する
 	if(!flag && (sd->status.skill[id].id == id || level == 0)){	// クエスト所得ならここで?件を確認して送信する
@@ -7118,8 +7168,8 @@ int pc_readdb(void)
 
 
 	// ?性修正テ?ブル
 	// ?性修正テ?ブル
 	for(i=0;i<4;i++)
 	for(i=0;i<4;i++)
-		for(j=0;j<10;j++)
-			for(k=0;k<10;k++)
+		for(j=0;j<ELE_MAX;j++)
+			for(k=0;k<ELE_MAX;k++)
 				attr_fix_table[i][j][k]=100;
 				attr_fix_table[i][j][k]=100;
 
 
 	sprintf(line, "%s/attr_fix.txt", db_path);
 	sprintf(line, "%s/attr_fix.txt", db_path);
@@ -7141,13 +7191,13 @@ int pc_readdb(void)
 		lv=atoi(split[0]);
 		lv=atoi(split[0]);
 		n=atoi(split[1]);
 		n=atoi(split[1]);
 
 
-		for(i=0;i<n;){
+		for(i=0;i<n && i<ELE_MAX;){
 			if( !fgets(line, sizeof(line)-1, fp) )
 			if( !fgets(line, sizeof(line)-1, fp) )
 				break;
 				break;
 			if(line[0]=='/' && line[1]=='/')
 			if(line[0]=='/' && line[1]=='/')
 				continue;
 				continue;
 
 
-			for(j=0,p=line;j<n && p;j++){
+			for(j=0,p=line;j<n && j<ELE_MAX && p;j++){
 				while(*p==32 && *p>0)
 				while(*p==32 && *p>0)
 					p++;
 					p++;
 				attr_fix_table[lv-1][i][j]=atoi(p);
 				attr_fix_table[lv-1][i][j]=atoi(p);