diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/battle.c | 46 | ||||
-rw-r--r-- | src/map/skill.c | 51 |
2 files changed, 59 insertions, 38 deletions
diff --git a/src/map/battle.c b/src/map/battle.c index e29e9d86a..f1679024e 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -118,7 +118,8 @@ static int battle_getenemy_sub(struct block_list *bl, va_list ap) return 0; if (*c >= 24) return 0; - + if (status_isdead(bl)) + return 0; if (battle_check_target(target, bl, BCT_ENEMY) > 0) { bl_list[(*c)++] = bl; return 1; @@ -1207,36 +1208,37 @@ static struct Damage battle_calc_weapon_attack( sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON) wd.damage = sd->inventory_data[index]->weight*8/100; //80% of weight - - ATK_ADDRATE(50*skill_lv); //Skill modifier applies to weight only. - index = sstatus->str/10; - index = index*index; - ATK_ADD(index); //Add str bonus. - - switch (tstatus->size) { //Size-fix. Is this modified by weapon perfection? - case 0: //Small: 125% - ATK_RATE(125); - break; - //case 1: //Medium: 100% - case 2: //Large: 75% - ATK_RATE(75); - break; - } - break; + } else + wd.damage = sstatus->rhw.atk2*8/10; //Else use Atk2 + + ATK_ADDRATE(50*skill_lv); //Skill modifier applies to weight only. + i = sstatus->str/10; + i*=i; + ATK_ADD(i); //Add str bonus. + switch (tstatus->size) { //Size-fix. Is this modified by weapon perfection? + case 0: //Small: 125% + ATK_RATE(125); + break; + //case 1: //Medium: 100% + case 2: //Large: 75% + ATK_RATE(75); + break; } + break; case CR_SHIELDBOOMERANG: case PA_SHIELDCHAIN: + wd.damage = sstatus->batk; if (sd) { short index = sd->equip_index[EQI_HAND_L]; - wd.damage = sstatus->batk; - if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) ATK_ADD(sd->inventory_data[index]->weight/10); break; - } + } else + ATK_ADD(sstatus->rhw.atk2); //Else use Atk2 + break; case HFLI_SBR44: //[orn] if(src->type == BL_HOM) { wd.damage = ((TBL_HOM*)src)->homunculus.intimacy ; @@ -3106,9 +3108,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f return 0; } } else if (su->group->skill_id==WZ_ICEWALL) - { //Icewall can be hit by anything except skills. - if (src->type == BL_SKILL) - return 0; + { state |= BCT_ENEMY; strip_enemy = 0; } else //Excepting traps and icewall, you should not be able to target skills. diff --git a/src/map/skill.c b/src/map/skill.c index 72a100e5d..74e254333 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -2761,12 +2761,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int case NPC_COMBOATTACK: case NPC_GUIDEDATTACK: case NPC_POISON: - case NPC_BLINDATTACK: - case NPC_SILENCEATTACK: - case NPC_STUNATTACK: - case NPC_PETRIFYATTACK: - case NPC_CURSEATTACK: - case NPC_SLEEPATTACK: case NPC_RANDOMATTACK: case NPC_WATERATTACK: case NPC_GROUNDATTACK: @@ -2814,6 +2808,20 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int case HFLI_SBR44: //[orn] skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); break; + case NPC_BLINDATTACK: + case NPC_SILENCEATTACK: + case NPC_STUNATTACK: + case NPC_PETRIFYATTACK: + case NPC_CURSEATTACK: + case NPC_SLEEPATTACK: + if (flag&1 || skill_get_splash(skillid, skilllv) < 1) + skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); + else + map_foreachinrange(skill_area_sub, bl, + skill_get_splash(skillid, skilllv),BL_CHAR, + src,skillid,skilllv,tick, flag|BCT_ENEMY|1, + skill_castend_damage_id); + break; case LK_JOINTBEAT: // decide the ailment first (affects attack damage and effect) switch( rand()%6 ){ @@ -3502,14 +3510,21 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in break; case PR_LEXDIVINA: - if (tsc && tsc->count && tsc->data[type].timer != -1) { - status_change_end(bl,type, -1); - clif_skill_nodamage (src, bl, skillid, skilllv, 1); - } else - clif_skill_nodamage (src, bl, skillid, skilllv, - sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); + if (flag&1 || (i = skill_get_splash(skillid, skilllv)) < 1) + { + if (tsc && tsc->count && tsc->data[type].timer != -1) { + status_change_end(bl,type, -1); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + } else + clif_skill_nodamage (src, bl, skillid, skilllv, + sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); + break; + } + //Affect all targets on splash area. + map_foreachinrange(skill_area_sub, bl, i, BL_CHAR, + src, skillid, skilllv, tick, flag|1, + skill_castend_damage_id); break; - case SA_ABRACADABRA: { int abra_skillid = 0, abra_skilllv; @@ -4069,8 +4084,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in case GS_SPREADATTACK: clif_skill_nodamage(src,bl,skillid,skilllv,1); skill_area_temp[1] = bl->id; + //Mob casted skills should also hit skills. map_foreachinrange(skill_area_sub, bl, - skill_get_splash(skillid, skilllv), BL_CHAR, + skill_get_splash(skillid, skilllv), md?BL_CHAR|BL_SKILL:BL_CHAR, src,skillid,skilllv,tick, flag|BCT_ENEMY|1, skill_castend_damage_id); break; @@ -4661,8 +4677,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in } break; case SA_DISPELL: + if (flag&1 || (i = skill_get_splash(skillid, skilllv)) < 1) { - int i; clif_skill_nodamage(src,bl,skillid,skilllv,1); i = tstatus->mdef; if (i >= 100 || @@ -4698,7 +4714,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in if(i==SC_BERSERK) tsc->data[i].val2=0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0. status_change_end(bl,i,-1); } + break; } + //Affect all targets on splash area. + map_foreachinrange(skill_area_sub, bl, i, BL_CHAR, + src, skillid, skilllv, tick, flag|1, + skill_castend_damage_id); break; case TF_BACKSLIDING: //This is the correct implementation as per packet logging information. [Skotlex] |