diff --git a/athena-start b/athena-start index b62fb95bdc..5221ef76a9 100755 --- a/athena-start +++ b/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 } diff --git a/src/map/battle.c b/src/map/battle.c index 45a9412b7e..de8319da29 100644 --- a/src/map/battle.c +++ b/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; diff --git a/src/map/pc.c b/src/map/pc.c index 99a034e13a..018eabcb19 100755 --- a/src/map/pc.c +++ b/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; diff --git a/src/map/skill.c b/src/map/skill.c index 2c53d5caca..a050c45277 100755 --- a/src/map/skill.c +++ b/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__); diff --git a/src/map/status.c b/src/map/status.c index f770439100..fc9c67a6e0 100644 --- a/src/map/status.c +++ b/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_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: