diff options
author | MadCamel <madcamel@gmail.com> | 2009-09-30 13:53:33 -0400 |
---|---|---|
committer | MadCamel <madcamel@gmail.com> | 2009-09-30 13:53:33 -0400 |
commit | 3fc3d83aa0be31e6d51afac54ff76b447f99f711 (patch) | |
tree | 2deac15b3e34382f11a27090e3f1a8ef3049618b /src/map/battle.c | |
parent | 5967577d8bf92a9912cd153b20597f0d13a19456 (diff) | |
parent | 48d96bc41a4791b6cb0bc2cf514a6cc1f06c4dd8 (diff) | |
download | tmwa-3fc3d83aa0be31e6d51afac54ff76b447f99f711.tar.gz tmwa-3fc3d83aa0be31e6d51afac54ff76b447f99f711.tar.bz2 tmwa-3fc3d83aa0be31e6d51afac54ff76b447f99f711.tar.xz tmwa-3fc3d83aa0be31e6d51afac54ff76b447f99f711.zip |
Merge branch 'master' of git://gitorious.org/tmw-eathena/mainline
Diffstat (limited to 'src/map/battle.c')
-rw-r--r-- | src/map/battle.c | 85 |
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) { |