From 0b0a39e39623321141c51115214a1b5233fd7b1d Mon Sep 17 00:00:00 2001 From: skotlex Date: Tue, 28 Nov 2006 19:07:38 +0000 Subject: - Moved the blocking of casting supportive skills on homunculus from battle_check_target to status_check_skilluse as bct is not invoked unless the skill is offensive (or party/guild only) - Cleaned up status_calc_bl_sub_hom, fixed recasting dex/str/vit/int bonuses skills making their atk/def/mdef stack with itself over and over. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9350 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/status.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) (limited to 'src/map/status.c') diff --git a/src/map/status.c b/src/map/status.c index 306273087..0abff57a9 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -1100,7 +1100,12 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int //TODO: Would be nice if this could be used to judge whether the player can or not pick up the item it targets. [Skotlex] if (status->mode&MD_LOOTER) return 1; - else + return 0; + case BL_HOM: + //Can't use support skills on homun + //Placed here instead of battle_check_target because support skill + //invocations don't call that function. + if (skill_num && skill_get_inf(skill_num)&INF_SUPPORT_SKILL) return 0; default: //Check for chase-walk/hiding/cloaking opponents. @@ -2792,6 +2797,7 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag) void status_calc_bl_sub_hom(struct homun_data *hd, unsigned long flag) //[orn] { struct status_data *status = &hd->battle_status, *b_status = &hd->base_status; + struct status_change *sc = &hd->sc; int skill = 0; @@ -2806,11 +2812,6 @@ void status_calc_bl_sub_hom(struct homun_data *hd, unsigned long flag) //[orn] if(status->hp > status->max_hp) status->hp = status->max_hp; } - if(flag&SCB_VIT) - { - flag|=SCB_DEF; - status->def += (status->vit/5 - b_status->vit/5); - } if(flag&(SCB_MAXSP|SCB_INT)) { flag|=SCB_MAXSP; @@ -2821,24 +2822,27 @@ void status_calc_bl_sub_hom(struct homun_data *hd, unsigned long flag) //[orn] if(status->sp > status->max_sp) status->sp = status->max_sp; } - if(flag&SCB_SPEED) - { - if (battle_config.slaves_inherit_speed && hd->master) - status->speed = status_get_speed(&hd->master->bl); - else - status->speed = DEFAULT_WALK_SPEED; + if(flag&SCB_VIT) + { //Since vit affects def, recalculate def. + flag|=SCB_DEF; + status->def = status_calc_def(&hd->bl, sc, b_status->def); + status->def+= (status->vit/5 - b_status->vit/5); } - if(flag&SCB_INT) { + if(flag&SCB_INT) + { flag|=SCB_MDEF; - status->mdef += (status->int_/5 - b_status->int_/5); + status->mdef = status_calc_mdef(&hd->bl, sc, b_status->mdef); + status->mdef+= (status->int_/5 - b_status->int_/5); } if(flag&SCB_DEX) { flag |=SCB_WATK; - status->rhw.atk += (status->dex - b_status->dex); + status->rhw.atk = status_calc_watk(&hd->bl, sc, b_status->rhw.atk); + status->rhw.atk+= (status->dex - b_status->dex); } if(flag&SCB_STR) { flag |=SCB_WATK; - status->rhw.atk += (status->str - b_status->str); + status->rhw.atk2 = status_calc_watk(&hd->bl, sc, b_status->rhw.atk2); + status->rhw.atk2+= (status->str - b_status->str); } if(flag|SCB_WATK && status->rhw.atk2 < status->rhw.atk) status->rhw.atk2 = status->rhw.atk; @@ -2852,7 +2856,7 @@ void status_calc_bl_sub_hom(struct homun_data *hd, unsigned long flag) //[orn] skill = (1000 -4*status->agi -status->dex) *hd->homunculusDB->baseASPD/1000; - status->aspd_rate = status_calc_aspd_rate(&hd->bl, &hd->sc , b_status->aspd_rate); + status->aspd_rate = status_calc_aspd_rate(&hd->bl, sc , b_status->aspd_rate); if(status->aspd_rate != 1000) skill = skill*status->aspd_rate/1000; @@ -2863,14 +2867,14 @@ void status_calc_bl_sub_hom(struct homun_data *hd, unsigned long flag) //[orn] if(flag&(SCB_AGI|SCB_DSPD)) { skill = 800-status->agi*4; status->dmotion = cap_value(skill, 400, 800); - status->dmotion = status_calc_dmotion(&hd->bl, &hd->sc, b_status->dmotion); + status->dmotion = status_calc_dmotion(&hd->bl, sc, b_status->dmotion); } if(flag&(SCB_INT|SCB_MAXSP|SCB_VIT|SCB_MAXHP) && flag != SCB_ALL) status_calc_regen(&hd->bl, status, &hd->regen); if(flag&SCB_REGEN) - status_calc_regen_rate(&hd->bl, &hd->regen, &hd->sc); + status_calc_regen_rate(&hd->bl, &hd->regen, sc); if (flag == SCB_ALL) return; //Refresh is done on invoking function (status_calc_hom) -- cgit v1.2.3-60-g2f50