summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
Diffstat (limited to 'src/map')
-rw-r--r--src/map/battle.c46
-rw-r--r--src/map/skill.c51
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]