From 1ebd828ccf9087007c103e4874c7e17eea5f4a87 Mon Sep 17 00:00:00 2001 From: Dastgir Date: Sun, 8 Nov 2015 20:09:04 +0530 Subject: Fixes missing new RC_ constants in some bonuses. Fixes #815 --- src/map/pc.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 102 insertions(+), 25 deletions(-) (limited to 'src/map/pc.c') diff --git a/src/map/pc.c b/src/map/pc.c index 4d4f41521..351d77b26 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2186,6 +2186,7 @@ int pc_bonus_subele(struct map_session_data* sd, unsigned char ele, short rate, int pc_bonus(struct map_session_data *sd,int type,int val) { struct status_data *bst; int bonus; + int i; nullpo_ret(sd); bst = &sd->base_status; @@ -2436,20 +2437,48 @@ int pc_bonus(struct map_session_data *sd,int type,int val) { sd->matk_rate += val; break; case SP_IGNORE_DEF_ELE: - if(val >= ELE_MAX) { + if( (val >= ELE_MAX && val != ELE_ALL) || (val < ELE_NEUTRAL) ) { ShowError("pc_bonus: SP_IGNORE_DEF_ELE: Invalid element %d\n", val); break; } - if(!sd->state.lr_flag) - sd->right_weapon.ignore_def_ele |= 1<state.lr_flag == 1) - sd->left_weapon.ignore_def_ele |= 1<state.lr_flag) + sd->right_weapon.ignore_def_ele |= 1<state.lr_flag == 1) + sd->left_weapon.ignore_def_ele |= 1<state.lr_flag) + sd->right_weapon.ignore_def_ele |= 1<state.lr_flag == 1) + sd->left_weapon.ignore_def_ele |= 1<state.lr_flag) - sd->right_weapon.ignore_def_race |= 1<state.lr_flag == 1) - sd->left_weapon.ignore_def_race |= 1< RC_NONDEMIPLAYER && val != RC_ALL) || val < RC_FORMLESS ) { + ShowWarning("pc_bonus: SP_IGNORE_DEF_RACE: Invalid Race(%d)\n",val); + break; + } + if ( val >= RC_MAX ) { + for ( i = RC_FORMLESS; i < RC_BOSS; i++ ) { + if ( (val == RC_NONPLAYER && i == RC_PLAYER) || + (val == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) || + (val == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) || + (val == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN)) + ) + continue; + if(!sd->state.lr_flag) + sd->right_weapon.ignore_def_race |= 1<state.lr_flag == 1) + sd->left_weapon.ignore_def_race |= 1<state.lr_flag) + sd->right_weapon.ignore_def_race |= 1<state.lr_flag == 1) + sd->left_weapon.ignore_def_race |= 1<state.lr_flag != 2) @@ -2470,16 +2499,40 @@ int pc_bonus(struct map_session_data *sd,int type,int val) { } break; case SP_IGNORE_MDEF_ELE: - if(val >= ELE_MAX) { + if( (val >= ELE_MAX && val != ELE_ALL) || (val < ELE_NEUTRAL) ) { ShowError("pc_bonus: SP_IGNORE_MDEF_ELE: Invalid element %d\n", val); break; } - if(sd->state.lr_flag != 2) - sd->bonus.ignore_mdef_ele |= 1<state.lr_flag != 2) { + if ( val == ELE_ALL ) { + for ( i = ELE_NEUTRAL; i < ELE_MAX; i++ ) { + sd->bonus.ignore_mdef_ele |= 1<bonus.ignore_mdef_ele |= 1<state.lr_flag != 2) - sd->bonus.ignore_mdef_race |= 1< RC_NONDEMIPLAYER && val != RC_ALL) || val < RC_FORMLESS ) { + ShowWarning("pc_bonus: SP_IGNORE_MDEF_RACE: Invalid Race(%d)\n",val); + break; + } + if(sd->state.lr_flag != 2) { + if ( val >= RC_MAX ) { + for ( i = RC_FORMLESS; i < RC_BOSS; i++ ) { + if ( (val == RC_NONPLAYER && i == RC_PLAYER) || + (val == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) || + (val == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) || + (val == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN)) + ) + continue; + sd->bonus.ignore_mdef_race |= 1<bonus.ignore_mdef_race |= 1<state.lr_flag != 2 && sd->bonus.perfect_hit < val) @@ -2494,24 +2547,48 @@ int pc_bonus(struct map_session_data *sd,int type,int val) { sd->critical_rate+=val; break; case SP_DEF_RATIO_ATK_ELE: - if(val >= ELE_MAX) { + if( (val >= ELE_MAX && val != ELE_ALL) || (val < ELE_NEUTRAL) ) { ShowError("pc_bonus: SP_DEF_RATIO_ATK_ELE: Invalid element %d\n", val); break; } - if(!sd->state.lr_flag) - sd->right_weapon.def_ratio_atk_ele |= 1<state.lr_flag == 1) - sd->left_weapon.def_ratio_atk_ele |= 1<state.lr_flag) + sd->right_weapon.def_ratio_atk_ele |= 1<state.lr_flag == 1) + sd->left_weapon.def_ratio_atk_ele |= 1<state.lr_flag) + sd->right_weapon.def_ratio_atk_ele |= 1<state.lr_flag == 1) + sd->left_weapon.def_ratio_atk_ele |= 1<= RC_MAX) { - ShowError("pc_bonus: SP_DEF_RATIO_ATK_RACE: Invalid race %d\n", val); + if (val == RC_MAX || (val > RC_NONDEMIPLAYER && val != RC_ALL) || val < RC_FORMLESS ) { + ShowWarning("pc_bonus: SP_DEF_RATIO_ATK_RACE: Invalid Race(%d)\n",val); break; } - if(!sd->state.lr_flag) - sd->right_weapon.def_ratio_atk_race |= 1<state.lr_flag == 1) - sd->left_weapon.def_ratio_atk_race |= 1<= RC_MAX ) { + for ( i = RC_FORMLESS; i < RC_BOSS; i++ ) { + if ( (val == RC_NONPLAYER && i == RC_PLAYER) || + (val == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) || + (val == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) || + (val == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN)) + ) + continue; + if(!sd->state.lr_flag) + sd->right_weapon.def_ratio_atk_race |= 1<state.lr_flag == 1) + sd->left_weapon.def_ratio_atk_race |= 1<state.lr_flag) + sd->right_weapon.def_ratio_atk_race |= 1<state.lr_flag == 1) + sd->left_weapon.def_ratio_atk_race |= 1<state.lr_flag != 2) -- cgit v1.2.3-60-g2f50