summaryrefslogtreecommitdiff
path: root/src/map/battle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/battle.c')
-rw-r--r--src/map/battle.c85
1 files changed, 72 insertions, 13 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index ebc395d..177c63e 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -381,6 +381,10 @@ int battle_get_flee(struct block_list *bl)
flee += flee*(sc_data[SC_WINDWALK].val2)/100;
if(sc_data[SC_SPIDERWEB].timer!=-1 && bl->type != BL_PC) //スパイダーウェブ
flee -= flee*50/100;
+
+ if (battle_is_unarmed(bl))
+ flee += (skill_power_bl(bl, TMW_BRAWLING) >> 3); // +25 for 200
+ flee += skill_power_bl(bl, TMW_SPEED) >> 3;
}
if(flee < 1) flee = 1;
return flee;
@@ -412,6 +416,9 @@ int battle_get_hit(struct block_list *bl)
hit += 3*(sc_data[SC_TRUESIGHT].val1);
if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //コンセントレーション
hit += (hit*(10*(sc_data[SC_CONCENTRATION].val1)))/100;
+
+ if (battle_is_unarmed(bl))
+ hit += (skill_power_bl(bl, TMW_BRAWLING) >> 4); // +12 for 200
}
if(hit < 1) hit = 1;
return hit;
@@ -439,6 +446,10 @@ int battle_get_flee2(struct block_list *bl)
if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC)
flee2 += (sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
+(sc_data[SC_WHISTLE].val3&0xffff))*10;
+
+ if (battle_is_unarmed(bl))
+ flee2 += (skill_power_bl(bl, TMW_BRAWLING) >> 3); // +25 for 200
+ flee2 += skill_power_bl(bl, TMW_SPEED) >> 3;
}
if(flee2 < 1) flee2 = 1;
return flee2;
@@ -582,6 +593,7 @@ int battle_get_atk2(struct block_list *bl)
if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション
atk2 += atk2*(5*sc_data[SC_CONCENTRATION].val1)/100;
}
+
if(atk2 < 0) atk2 = 0;
return atk2;
}
@@ -595,8 +607,8 @@ int battle_get_atk2(struct block_list *bl)
int battle_get_atk_2(struct block_list *bl)
{
nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data*)bl)->watk_2;
+ if(bl->type==BL_PC)
+ return ((struct map_session_data*)bl)->watk_2;
else
return 0;
}
@@ -1134,6 +1146,21 @@ int battle_get_mexp(struct block_list *bl)
return 0;
}
+int battle_get_stat(int stat_id /* SP_VIT or similar */, struct block_list *bl)
+{
+ switch (stat_id) {
+ case SP_STR: return battle_get_str(bl);
+ case SP_AGI: return battle_get_agi(bl);
+ case SP_DEX: return battle_get_dex(bl);
+ case SP_VIT: return battle_get_vit(bl);
+ case SP_INT: return battle_get_int(bl);
+ case SP_LUK: return battle_get_luk(bl);
+ default:
+ return 0;
+ }
+}
+
+
// StatusChange系の所得
struct status_change *battle_get_sc_data(struct block_list *bl)
{
@@ -2213,6 +2240,23 @@ static struct Damage battle_calc_mob_weapon_attack(
wd.dmg_lv=dmg_lv;
return wd;
}
+
+
+int
+battle_is_unarmed(struct block_list *bl)
+{
+ if (!bl)
+ return 0;
+ if (bl->type == BL_PC) {
+ struct map_session_data *sd = (struct map_session_data *) bl;
+
+ return (sd->equip_index[EQUIP_SHIELD] == -1
+ && sd->equip_index[EQUIP_WEAPON] == -1);
+ } else
+ return 0;
+}
+
+
/*
* =========================================================================
* PCの武器による攻撃
@@ -2239,6 +2283,7 @@ static struct Damage battle_calc_pc_weapon_attack(
int watk,watk_,cardfix,t_ele;
int da=0,i,t_class,ac_flag = 0;
int idef_flag=0,idef_flag_=0;
+ int target_distance;
//return前の処理があるので情報出力部のみ変更
if( src == NULL || target == NULL || sd == NULL ){
@@ -2310,26 +2355,36 @@ static struct Damage battle_calc_pc_weapon_attack(
}
}
hitrate=battle_get_hit(src) - flee + 80; //命中率計算
- { // [Fate] Reduce hit chance by distance
+
+ { // [fate] Reduce hit chance by distance
int dx = abs(src->x - target->x);
int dy = abs(src->y - target->y);
- int dist = MAX(dx, dy);
- hitrate -= (dist * (dist + 1));
- }
+ int malus_dist;
- type=0; // normal
- div_ = 1; // single attack
+ target_distance = MAX(dx, dy);
+ malus_dist = MAX(0, target_distance - (skill_power(sd, AC_OWL) / 75));
+ hitrate -= (malus_dist * (malus_dist + 1));
+ }
dex=battle_get_dex(src); //DEX
luk=battle_get_luk(src); //LUK
watk = battle_get_atk(src); //ATK
watk_ = battle_get_atk_(src); //ATK左手
+ type=0; // normal
+ div_ = 1; // single attack
+
if(skill_num==HW_MAGICCRASHER){ /* マジッククラッシャーはMATKで殴る */
damage = damage2 = battle_get_matk1(src); //damega,damega2初登場、base_atkの取得
}else{
damage = damage2 = battle_get_baseatk(&sd->bl); //damega,damega2初登場、base_atkの取得
}
+ if (sd->attackrange > 2) { // [fate] ranged weapon?
+ const int range_damage_bonus = 80; // up to 31.25% bonus for long-range hit
+ damage = damage * (256 + ((range_damage_bonus * target_distance) / sd->attackrange)) >> 8;
+ damage2 = damage2 * (256 + ((range_damage_bonus * target_distance) / sd->attackrange)) >> 8;
+ }
+
atkmin = atkmin_ = dex; //最低ATKはDEXで初期化?
sd->state.arrow_atk = 0; //arrow_atk初期化
if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]])
@@ -3875,13 +3930,17 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
// significantly increase injuries for hasted characters
if (wd.damage > 0
&& (t_sc_data[SC_HASTE].timer != -1)) {
- wd.damage = (wd.damage * (16 + t_sc_data[SC_HASTE].val1)) >> 4;
+ wd.damage = (wd.damage * (16 + t_sc_data[SC_HASTE].val1)) >> 4;
}
- if (t_sc_data[SC_PHYS_SHIELD].timer != -1 && target->type == BL_PC) {
- wd.damage -= t_sc_data[SC_PHYS_SHIELD].val1;
- if (wd.damage < 0)
- wd.damage = 0;
+ if (wd.damage > 0
+ && t_sc_data[SC_PHYS_SHIELD].timer != -1 && target->type == BL_PC) {
+ int reduction = t_sc_data[SC_PHYS_SHIELD].val1;
+ if (reduction > wd.damage)
+ reduction = wd.damage;
+
+ wd.damage -= reduction;
+ MAP_LOG_PC(((struct map_session_data *)target), "MAGIC-ABSORB-DMG %d", reduction);
}
if((damage = wd.damage + wd.damage2) > 0 && src != target) {