diff options
-rw-r--r-- | db/const.txt | 2 | ||||
-rw-r--r-- | doc/item_bonus.txt | 3 | ||||
-rw-r--r-- | src/map/battle.c | 8 | ||||
-rw-r--r-- | src/map/map.h | 2 | ||||
-rw-r--r-- | src/map/pc.c | 9 | ||||
-rw-r--r-- | src/map/pc.h | 2 | ||||
-rw-r--r-- | src/map/status.c | 2 |
7 files changed, 25 insertions, 3 deletions
diff --git a/db/const.txt b/db/const.txt index 1fee30019..2f4030130 100644 --- a/db/const.txt +++ b/db/const.txt @@ -559,6 +559,8 @@ bMagicHPGainValue 2044 bAddClassDropItem 2045 bWeaponMatk 2046 bMatk 2047 +bSPGainRaceAttack 2048 +bHPGainRaceAttack 2049 EQI_HEAD_TOP 1 EQI_ARMOR 2 diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index e0a9c3fbf..375f64175 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -422,3 +422,6 @@ bonus bMagicSPGainValue,n; Heals +n SP when killing an enemy with magic attack. bonus bMagicHPGainValue,n; Heals +n HP when killing an enemy with magic attack. bonus3 bAddClassDropItem,s,x,n; Adds an n/100% chance of dropping item s when killing monster class x. + +bonus2 bHPGainRaceAttack,x,n; Heals n HP when attacking x Race on every hit +bonus2 bSPGainRaceAttack,x,n; Heals n SP when attacking x Race on every hit
\ No newline at end of file diff --git a/src/map/battle.c b/src/map/battle.c index 3ca8480b4..1853b9cf1 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -3792,7 +3792,7 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int rdamage, int ldamage, sp = wd->sp_drain[type].value; if (wd->sp_drain[type].rate) sp += battle_calc_drain(*damage, wd->sp_drain[type].rate, wd->sp_drain[type].per); - + if (hp) { if (wd->hp_drain[type].type) rhp += hp; @@ -3807,6 +3807,12 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int rdamage, int ldamage, if (sd->sp_vanish_rate && rnd()%1000 < sd->sp_vanish_rate) status_percent_damage(&sd->bl, tbl, 0, (unsigned char)sd->sp_vanish_per, false); + + if( sd->sp_gain_race_attack[race] ) + tsp += sd->sp_gain_race_attack[race]; + if( sd->hp_gain_race_attack[race] ) + thp += sd->hp_gain_race_attack[race]; + if (!thp && !tsp) return; status_heal(&sd->bl, thp, tsp, battle_config.show_hp_sp_drain?3:1); diff --git a/src/map/map.h b/src/map/map.h index f55140847..d8d0b00ea 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -370,7 +370,7 @@ enum _sp { SP_UNSTRIPABLE_WEAPON,SP_UNSTRIPABLE_ARMOR,SP_UNSTRIPABLE_HELM,SP_UNSTRIPABLE_SHIELD, // 2034-2037 SP_INTRAVISION, SP_ADD_MONSTER_DROP_ITEMGROUP, SP_SP_LOSS_RATE, // 2038-2040 SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE, SP_MAGIC_SP_GAIN_VALUE, SP_MAGIC_HP_GAIN_VALUE, SP_ADD_CLASS_DROP_ITEM, //2041-2045 - SP_WEAPON_MATK, SP_BASE_MATK //2046-2047 + SP_WEAPON_MATK, SP_BASE_MATK, SP_SP_GAIN_RACE_ATTACK, SP_HP_GAIN_RACE_ATTACK //2046-2049 }; enum _look { diff --git a/src/map/pc.c b/src/map/pc.c index f20735167..9424c834b 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2971,7 +2971,14 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) if(sd->state.lr_flag != 2) sd->ignore_def[type2] += val; break; - + case SP_SP_GAIN_RACE_ATTACK: + if(sd->state.lr_flag != 2) + sd->sp_gain_race_attack[type2] = cap_value(sd->sp_gain_race_attack[type2] + val, 0, INT16_MAX); + break; + case SP_HP_GAIN_RACE_ATTACK: + if(sd->state.lr_flag != 2) + sd->hp_gain_race_attack[type2] = cap_value(sd->hp_gain_race_attack[type2] + val, 0, INT16_MAX); + break; default: ShowWarning("pc_bonus2: unknown type %d %d %d!\n",type,type2,val); break; diff --git a/src/map/pc.h b/src/map/pc.h index cb5a0ef77..a9b995115 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -249,6 +249,8 @@ struct map_session_data { int ignore_def[RC_MAX]; int itemgrouphealrate[MAX_ITEMGROUP]; short sp_gain_race[RC_MAX]; + short sp_gain_race_attack[RC_MAX]; + short hp_gain_race_attack[RC_MAX]; // zeroed arrays end here. // zeroed structures start here struct s_autospell autospell[15], autospell2[15], autospell3[15]; diff --git a/src/map/status.c b/src/map/status.c index dc0d8fdb2..3c3c8248f 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -2103,6 +2103,8 @@ int status_calc_pc_(struct map_session_data* sd, bool first) + sizeof(sd->ignore_def) + sizeof(sd->itemgrouphealrate) + sizeof(sd->sp_gain_race) + + sizeof(sd->sp_gain_race_attack) + + sizeof(sd->hp_gain_race_attack) ); memset (&sd->right_weapon.overrefine, 0, sizeof(sd->right_weapon) - sizeof(sd->right_weapon.atkmods)); |