Explorar el Código

Bug Fixes
* Fixed #145 - Corrected the duration of Frigg's Song ending too quickly.
* Fixed #202 - Added damage bonus for Rifle when using Piercing Shot (renewal).
* Fixed #257 - Adjusted get_status() in athena-start to return the correct string.
* Fixed #272 - Blood Lust not leeching HP from target.
* Fixed #298 - Corrected the renewal calculation of ATK and ASPD for Homunculus.
* Fixed #309 and #313 - Cleaned up warnings during compile.
* Fixed #321 - Monsters not calculating MATK at spawn (renewal).
* Added missing renewal calculations for Mercenary.

aleos89 hace 10 años
padre
commit
1b6be4e0df
Se han modificado 5 ficheros con 68 adiciones y 50 borrados
  1. 1 1
      athena-start
  2. 10 7
      src/map/battle.c
  3. 4 4
      src/map/pc.c
  4. 4 8
      src/map/skill.c
  5. 49 30
      src/map/status.c

+ 1 - 1
athena-start

@@ -21,7 +21,7 @@ get_status(){
 	PIDFILE=.$1.pid
 	if [ -e ${PIDFILE} ]; then
 		ISRUN=$(ps ax | grep $(cat ${PIDFILE}) | grep $1)
-		PSRUN=$(echo "$ISRUN" | awk '{ print substr( $0, 0, 7) }')
+		PSRUN=$(echo "$ISRUN" | awk '{ print $1 }')
 	fi
 	#return ${PSRUN} #seem to cause issue for some os
 }

+ 10 - 7
src/map/battle.c

@@ -1227,12 +1227,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
 			return 0;
 		}
 
-		//Probably not the most correct place, but it'll do here
-		//(since battle_drain is strictly for players currently)
-		if ((sce=sc->data[SC_BLOODLUST]) && flag&BF_WEAPON && damage > 0 &&
-			rnd()%100 < sce->val3)
-			status_heal(src, (int64)damage*sce->val4/100, 0, 3);
-
 		if( sd && (sce = sc->data[SC_FORCEOFVANGUARD]) && flag&BF_WEAPON && rnd()%100 < sce->val2 )
 			pc_addspiritball(sd,skill_get_time(LG_FORCEOFVANGUARD,sce->val1),sce->val3);
 
@@ -1263,6 +1257,10 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
 	if (sc && sc->count) {
 		if( sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] )
 			DAMAGE_ADDRATE(75)
+
+		if ((sce = sc->data[SC_BLOODLUST]) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3)
+			status_heal(src, damage * sce->val4 / 100, 0, 3);
+
 		// [Epoque]
 		if (bl->type == BL_MOB) {
 			uint8 i;
@@ -3460,7 +3458,12 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
 			skillratio += 100 *(skill_lv+1);
 			break;
 		case GS_PIERCINGSHOT:
-			skillratio += 20*skill_lv;
+#ifdef RENEWAL
+			if (sd && sd->weapontype1 == W_RIFLE)
+				skillratio += 50 + 30 * skill_lv;
+			else
+#endif
+				skillratio += 20*skill_lv;
 			break;
 		case GS_RAPIDSHOWER:
 			skillratio += 400+50*skill_lv;

+ 4 - 4
src/map/pc.c

@@ -2247,7 +2247,7 @@ void pc_exeautobonus(struct map_session_data *sd,struct s_autobonus *autobonus)
 
 	autobonus->active = add_timer(gettick()+autobonus->duration, pc_endautobonus, sd->bl.id, (intptr_t)autobonus);
 	sd->state.autobonus |= autobonus->pos;
-	status_calc_pc(sd,SCO_NONE);
+	status_calc_pc(sd,SCO_FORCE);
 }
 
 int pc_endautobonus(int tid, unsigned int tick, int id, intptr_t data)
@@ -2260,7 +2260,7 @@ int pc_endautobonus(int tid, unsigned int tick, int id, intptr_t data)
 
 	autobonus->active = INVALID_TIMER;
 	sd->state.autobonus &= ~autobonus->pos;
-	status_calc_pc(sd,SCO_NONE);
+	status_calc_pc(sd,SCO_FORCE);
 	return 0;
 }
 
@@ -7755,7 +7755,7 @@ bool pc_setparam(struct map_session_data *sd,int type,int val)
 		clif_updatestatus(sd, SP_NEXTBASEEXP);
 		clif_updatestatus(sd, SP_STATUSPOINT);
 		clif_updatestatus(sd, SP_BASEEXP);
-		status_calc_pc(sd, SCO_NONE);
+		status_calc_pc(sd, SCO_FORCE);
 		if(sd->status.party_id)
 			party_send_levelup(sd);
 		break;
@@ -7770,7 +7770,7 @@ bool pc_setparam(struct map_session_data *sd,int type,int val)
 		// clif_updatestatus(sd, SP_JOBLEVEL);  // Gets updated at the bottom
 		clif_updatestatus(sd, SP_NEXTJOBEXP);
 		clif_updatestatus(sd, SP_JOBEXP);
-		status_calc_pc(sd, 0);
+		status_calc_pc(sd, SCO_FORCE);
 		break;
 	case SP_SKILLPOINT:
 		sd->status.skill_point = val;

+ 4 - 8
src/map/skill.c

@@ -218,12 +218,8 @@ const char* skill_get_desc( uint16 skill_id ) {
 static void skill_chk(uint16 *skill_id) {
 	*skill_id = skill_get_index(*skill_id); // checks/adjusts id
 }
-// checks/adjusts level
-static void skill_chk2(uint16 *skill_lv) {
-	*skill_lv = cap_value(*skill_lv, 1, MAX_SKILL_LEVEL);
-}
-// checks/adjusts index. make sure we don't use negative index
-static void skill_chk3(int *idx) {
+/// checks/adjusts index. make sure we don't use negative index
+static void skill_chk2(int *idx) {
 	if (*idx < 0) *idx = 0;
 }
 
@@ -241,7 +237,7 @@ static void skill_chk3(int *idx) {
 	}\
 	return ((arrvar)[idx]);\
 } while(0)
-#define skill_get3(id,x,var)  { skill_chk(&id); if (!id) return 0; skill_chk3(&x);  return var; }
+#define skill_get3(id,x,var)  { skill_chk(&id); if (!id) return 0; skill_chk2(&x);  return var; }
 
 // Skill DB
 int skill_get_hit( uint16 skill_id )                               { skill_get  (skill_id, skill_db[skill_id]->hit); }
@@ -19986,7 +19982,7 @@ static void skill_destroy_requirement(uint16 idx) {
 static bool skill_parse_row_requiredb(char* split[], int columns, int current)
 {
 	char* p;
-	uint16 skill_id = atoi(split[0]), idx, i;
+	uint16 idx, i;
 
 	idx = skill_db_isset(atoi(split[0]), __FUNCTION__);
 

+ 49 - 30
src/map/status.c

@@ -2087,11 +2087,7 @@ int status_base_amotion_pc(struct map_session_data* sd, struct status_data* stat
  */
 unsigned short status_base_atk(const struct block_list *bl, const struct status_data *status)
 {
-	int flag = 0, str, dex,
-#ifdef RENEWAL
-		rstr,
-#endif
-		dstr;
+	int flag = 0, str, dex, dstr;
 
 	if(!(bl->type&battle_config.enable_baseatk))
 		return 0;
@@ -2110,13 +2106,13 @@ unsigned short status_base_atk(const struct block_list *bl, const struct status_
 	}
 	if (flag) {
 #ifdef RENEWAL
-		rstr =
+		dstr =
 #endif
 		str = status->dex;
 		dex = status->str;
 	} else {
 #ifdef RENEWAL
-		rstr =
+		dstr =
 #endif
 		str = status->str;
 		dex = status->dex;
@@ -2128,16 +2124,18 @@ unsigned short status_base_atk(const struct block_list *bl, const struct status_
 #ifdef RENEWAL
 	if (bl->type == BL_HOM)
 		str = 2 * ((((TBL_HOM*)bl)->homunculus.level) + status_get_homstr(bl));
-#endif
+#else
 	dstr = str/10;
 	str += dstr*dstr;
-	if (bl->type == BL_PC) {
+#endif
+	if (bl->type == BL_PC)
 #ifdef RENEWAL
-		str = (rstr*10 + dex*10/5 + status->luk*10/3 + ((TBL_PC*)bl)->status.base_level*10/4)/10;
+		str = (dstr*10 + dex*10/5 + status->luk*10/3 + ((TBL_PC*)bl)->status.base_level*10/4)/10;
+	else if (bl->type == BL_MOB || bl->type == BL_MER)
+		str = dstr + ((TBL_MOB*)bl)->level;
 #else
 		str+= dex/5 + status->luk/5;
 #endif
-	}
 	return cap_value(str, 0, USHRT_MAX);
 }
 
@@ -2171,6 +2169,8 @@ unsigned short status_base_matk(struct block_list *bl, const struct status_data*
 		return status->int_ + level;
 	case BL_HOM:
 		return status_get_homint(bl) + level;
+	case BL_MER:
+		return status->int_ + status->int_ / 5 * status->int_ / 5;
 	case BL_PC:
 	default:
 		return status->int_ + (status->int_ / 2) + (status->dex / 5) + (status->luk / 3) + (level / 4);
@@ -2227,18 +2227,30 @@ void status_calc_misc(struct block_list *bl, struct status_data *status, int lev
 		status->hit = cap_value(stat, 1, SHRT_MAX);
 		// Flee
 		stat = status->flee;
-		stat += level + status->agi + (bl->type == BL_PC ? status->luk / 5 : 0) + 100; //base level + ( every 1 agi = +1 flee ) + (every 5 luk = +1 flee) + 100
+		stat += level + status->agi + (bl->type == BL_MER ? 0 : bl->type == BL_PC ? status->luk / 5 : 0) + 100; //base level + ( every 1 agi = +1 flee ) + (every 5 luk = +1 flee) + 100
 		status->flee = cap_value(stat, 1, SHRT_MAX);
 		// Def2
-		stat = status->def2;
-		stat += (int)(((float)level + status->vit) / 2 + (bl->type == BL_PC ? ((float)status->agi / 5) : 0)); //base level + (every 2 vit = +1 def) + (every 5 agi = +1 def)
+		if (bl->type == BL_MER)
+			stat = (int)(status->vit + ((float)level / 10) + ((float)status->vit / 5));
+		else {
+			stat = status->def2;
+			stat += (int)(((float)level + status->vit) / 2 + (bl->type == BL_PC ? ((float)status->agi / 5) : 0)); //base level + (every 2 vit = +1 def) + (every 5 agi = +1 def)
+		}
 		status->def2 = cap_value(stat, 0, SHRT_MAX);
 		// Mdef2
-		stat = status->mdef2;
-		stat += (int)(bl->type == BL_PC ? (status->int_ + ((float)level / 4) + ((float)(status->dex + status->vit) / 5)) : ((float)(status->int_ + level) / 4)); //(every 4 base level = +1 mdef) + (every 1 int = +1 mdef) + (every 5 dex = +1 mdef) + (every 5 vit = +1 mdef)
+		if (bl->type == BL_MER)
+			stat = (int)(((float)level / 10) + ((float)status->int_ / 5));
+		else {
+			stat = status->mdef2;
+			stat += (int)(bl->type == BL_PC ? (status->int_ + ((float)level / 4) + ((float)(status->dex + status->vit) / 5)) : ((float)(status->int_ + level) / 4)); //(every 4 base level = +1 mdef) + (every 1 int = +1 mdef) + (every 5 dex = +1 mdef) + (every 5 vit = +1 mdef)
+		}
 		status->mdef2 = cap_value(stat, 0, SHRT_MAX);
+		// Special Matk case for Mercenary
+		if (bl->type == BL_MER)
+			status->matk_min = status->matk_max = status_base_matk(bl, status, level);
 	}
 #else
+	// Matk
 	status->matk_min = status_base_matk_min(status);
 	status->matk_max = status_base_matk_max(status);
 	// Hit
@@ -4434,20 +4446,20 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 		 * MATK = (sMATK + wMATK + eMATK) * Multiplicative Modifiers
 		 **/
 		status->matk_min = status->matk_max = status_base_matk(bl, status, status_get_lv(bl));
+
 		switch( bl->type ) {
 		case BL_PC: {
 			int wMatk = 0;
 			int variance = 0;
 
 			// Any +MATK you get from skills and cards, including cards in weapon, is added here.
-			if (sd->bonus.ematk > 0) {
-				status->matk_max += sd->bonus.ematk;
+			if (sd->bonus.ematk > 0)
 				status->matk_min += sd->bonus.ematk;
-			}
+
 			status->matk_min = status_calc_ematk(bl, sc, status->matk_min);
-			status->matk_max = status_calc_ematk(bl, sc, status->matk_max);
-			// This is the only portion in MATK that varies depending on the weapon level and refinement rate.
+			status->matk_max = status->matk_min;
 
+			// This is the only portion in MATK that varies depending on the weapon level and refinement rate.
 			if (b_status->lhw.matk) {
 				if (sd) {
 					//sd->state.lr_flag = 1; //?? why was that set here
@@ -4476,18 +4488,21 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 			status->matk_max += wMatk + variance;
 			}
 			break;
-
 		case BL_HOM:
 			status->matk_min += (status_get_homint(bl) + status_get_homdex(bl)) / 5;
 			status->matk_max += (status_get_homluk(bl) + status_get_homint(bl) + status_get_homdex(bl)) / 3;
 			break;
-
 		case BL_MOB:
 			status->matk_min += 70 * ((TBL_MOB*)bl)->status.rhw.atk2 / 100;
 			status->matk_max += 130 * ((TBL_MOB*)bl)->status.rhw.atk2 / 100;
 			break;
+		case BL_MER:
+			status->matk_min += 70 * ((TBL_MER*)bl)->battle_status.rhw.atk2 / 100;
+			status->matk_max += 130 * ((TBL_MER*)bl)->battle_status.rhw.atk2 / 100;
+			break;
 		}
 #endif
+
 		if (bl->type&BL_PC && sd->matk_rate != 100) {
 			status->matk_max = status->matk_max * sd->matk_rate/100;
 			status->matk_min = status->matk_min * sd->matk_rate/100;
@@ -4510,6 +4525,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 
 	if(flag&SCB_ASPD) {
 		int amotion;
+
 		if ( bl->type&BL_HOM ) {
 #ifdef RENEWAL_ASPD
 			amotion = ((TBL_HOM*)bl)->homunculusDB->baseASPD;
@@ -4518,7 +4534,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 #else
 			amotion = (1000 - 4 * status->agi - status->dex) * ((TBL_HOM*)bl)->homunculusDB->baseASPD / 1000;
 
-			amotion = status_calc_aspd_rate(bl, sc, b_status->aspd_rate);
+			amotion = status_calc_aspd_rate(bl, sc, amotion);
 
 			if (status->aspd_rate != 1000)
 				amotion = amotion * status->aspd_rate / 1000;
@@ -4540,8 +4556,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
 			amotion -= (int)(sqrt( (pow(status->agi, 2) / 2) + (pow(status->dex, 2) / 5) ) / 4 + (status_calc_aspd(bl, sc, 1) * status->agi / 200)) * 10;
 
 			if( (status_calc_aspd(bl, sc, 2) + status->aspd_rate2) != 0 ) // RE ASPD percertage modifier
-				amotion -= ( amotion - pc_maxaspd(sd) )
-							* (status_calc_aspd(bl, sc, 2) + status->aspd_rate2) / 100;
+				amotion -= ( amotion - pc_maxaspd(sd) ) * (status_calc_aspd(bl, sc, 2) + status->aspd_rate2) / 100;
 
 			if(status->aspd_rate != 1000) // Absolute percentage modifier
 				amotion = ( 200 - (200-amotion/10) * status->aspd_rate / 1000 ) * 10;
@@ -4632,12 +4647,16 @@ void status_calc_bl_(struct block_list* bl, enum scb_flag flag, enum e_status_ca
 		}
 	}
 
-	if (opt&SCO_FIRST && bl->type == BL_MOB)
-		return; // Assume there will be no statuses active
-
 	if( bl->type == BL_PET )
 		return; // Pets are not affected by statuses
 
+	if (opt&SCO_FIRST && bl->type == BL_MOB) {
+#ifdef RENEWAL
+		status_calc_bl_main(bl, SCB_MATK); // Otherwise, the mob will spawn with lower MATK values
+#endif
+		return; // Assume there will be no statuses active
+	}
+
 	status_calc_bl_main(bl, flag);
 
 	if (opt&SCO_FIRST && bl->type == BL_HOM)
@@ -9884,7 +9903,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		case SC_FRIGG_SONG:
 			val2 = 5 * val1; // maxhp bonus
 			val3 = 80 + 20 * val1; // healing
-			tick_time = 10000;
+			tick_time = 1000;
 			val4 = tick / tick_time;
 			break;
 		case SC_FLASHCOMBO: