From 0f1b1af9281ed9ed7d6ab5d359313bd64a1f94cf Mon Sep 17 00:00:00 2001 From: Jittapan Pluemsumran Date: Tue, 26 Apr 2016 00:31:24 +0700 Subject: [PATCH] Implemented additional item bonus bMagicAddRace2 and bIGnoreMdefRace2Rate --- src/map/battle.c | 9 +++++---- src/map/map.h | 3 ++- src/map/pc.c | 10 ++++++++++ src/map/pc.h | 2 ++ src/map/script_constants.h | 3 +++ 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/map/battle.c b/src/map/battle.c index a94fe34363..6a8de7dacd 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -570,6 +570,7 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li sstatus = status_get_status_data(src); tstatus = status_get_status_data(target); s_race2 = status_get_race2(src); + t_race2 = status_get_race2(target); s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE; //Official servers apply the cardfix value on a base of 1000 and round down the reduction/increase @@ -579,7 +580,7 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li case BF_MAGIC: // Affected by attacker ATK bonuses if( sd && !(nk&NK_NO_CARDFIX_ATK) ) { - cardfix = cardfix * (100 + sd->magic_addrace[tstatus->race] + sd->magic_addrace[RC_ALL]) / 100; + cardfix = cardfix * (100 + sd->magic_addrace[tstatus->race] + sd->magic_addrace[RC_ALL] + sd->magic_addrace2[t_race2]) / 100; if( !(nk&NK_NO_ELEFIX) ) { // Affected by Element modifier bonuses cardfix = cardfix * (100 + sd->magic_addele[tstatus->def_ele] + sd->magic_addele[ELE_ALL] + sd->magic_addele_script[tstatus->def_ele] + sd->magic_addele_script[ELE_ALL]) / 100; @@ -643,7 +644,6 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li break; case BF_WEAPON: - t_race2 = status_get_race2(target); // Affected by attacker ATK bonuses if( sd && !(nk&NK_NO_CARDFIX_ATK) && (left&2) ) { short cardfix_ = 1000; @@ -5525,6 +5525,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list int skill_damage = 0; #endif short s_ele = 0; + enum e_race2 t_race2; TBL_PC *sd; TBL_PC *tsd; @@ -5559,7 +5560,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list tsd = BL_CAST(BL_PC, target); sc = status_get_sc(src); tsc = status_get_sc(target); - + t_race2 = status_get_race2(target); //Initialize variables that will be used afterwards s_ele = skill_get_ele(skill_id, skill_lv); @@ -6123,7 +6124,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list mdef <<= 1; // only eMDEF is doubled #endif if(sd) { - i = sd->ignore_mdef_by_race[tstatus->race] + sd->ignore_mdef_by_race[RC_ALL]; + i = sd->ignore_mdef_by_race[tstatus->race] + sd->ignore_mdef_by_race2[t_race2] + sd->ignore_mdef_by_race[RC_ALL]; i += sd->ignore_mdef_by_class[tstatus->class_] + sd->ignore_mdef_by_class[CLASS_ALL]; if (i) { diff --git a/src/map/map.h b/src/map/map.h index 6bfa24d241..41a11da0a1 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -296,6 +296,7 @@ enum e_race2 { RC2_GVG, RC2_BATTLEFIELD, RC2_TREASURE, + RC2_BIOLAB, RC2_MAX }; @@ -464,7 +465,7 @@ enum _sp { SP_WEAPON_COMA_CLASS, SP_IGNORE_MDEF_CLASS_RATE, SP_EXP_ADDCLASS, SP_ADD_CLASS_DROP_ITEM, //2067-2070 SP_ADD_CLASS_DROP_ITEMGROUP, SP_ADDMAXWEIGHT, SP_ADD_ITEMGROUP_HEAL_RATE, // 2071-2073 SP_HP_VANISH_RACE_RATE, SP_SP_VANISH_RACE_RATE, SP_ABSORB_DMG_MAXHP, SP_SUB_SKILL, SP_SUBDEF_ELE, // 2074-2078 - SP_STATE_NORECOVER_RACE, SP_CRITICAL_RANGEATK, // 2079-2080 + SP_STATE_NORECOVER_RACE, SP_CRITICAL_RANGEATK, SP_MAGIC_ADDRACE2, SP_IGNORE_MDEF_RACE2_RATE // 2079-2082 }; enum _look { diff --git a/src/map/pc.c b/src/map/pc.c index d411e35eb7..6d8e7020d7 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -3673,6 +3673,16 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val) sd->coma_race[type2] += val; sd->special_state.bonus_coma = 1; break; + case SP_MAGIC_ADDRACE2: // bonus2 bMagicAddRace2,r,n; + PC_BONUS_CHK_RACE2(type2, SP_MAGIC_ADDRACE2); + if(sd->state.lr_flag != 2) + sd->magic_addrace2[type2] += val; + break; + case SP_IGNORE_MDEF_RACE2_RATE: //bonus2 bIgnoreMdefRace2Rate,r,n; + PC_BONUS_CHK_RACE2(type2, SP_IGNORE_MDEF_RACE2); + if (sd->state.lr_flag != 2) + sd->ignore_mdef_by_race2[type2] += val; + 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 8bed5a3718..b656afdf7a 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -366,6 +366,8 @@ struct map_session_data { int ignore_mdef_by_class[CLASS_MAX]; int ignore_def_by_race[RC_MAX]; short sp_gain_race[RC_MAX]; + int magic_addrace2[RC2_MAX]; + int ignore_mdef_by_race2[RC2_MAX]; // zeroed arrays end here. // zeroed structures start here diff --git a/src/map/script_constants.h b/src/map/script_constants.h index 254255493f..d01443db22 100644 --- a/src/map/script_constants.h +++ b/src/map/script_constants.h @@ -652,6 +652,8 @@ script_set_constant("bSubDefEle",SP_SUBDEF_ELE,false); script_set_constant("bStateNoRecoverRace",SP_STATE_NORECOVER_RACE,false); script_set_constant("bCriticalLong",SP_CRITICAL_RANGEATK,false); + script_set_constant("bMagicAddRace2", SP_MAGIC_ADDRACE2, false); + script_set_constant("bIgnoreMdefRace2Rate", SP_IGNORE_MDEF_RACE2_RATE, false); /* equip positions */ export_constant(EQI_HEAD_TOP); @@ -2414,6 +2416,7 @@ export_constant(RC2_GVG); export_constant(RC2_BATTLEFIELD); export_constant(RC2_TREASURE); + export_constant(RC2_BIOLAB); /* classes */ export_constant(CLASS_NORMAL);