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.
This commit is contained in:
aleos89 2015-03-11 10:10:05 -04:00
parent ad8e22139f
commit 1b6be4e0df
5 changed files with 69 additions and 51 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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_min = status_calc_ematk(bl, sc, status->matk_min);
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: