|
@@ -1308,7 +1308,7 @@ static int pc_bonus_addeff(struct s_addeffect* effect, int max, short id, short
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-static int pc_bonus_item_drop(struct s_add_drop *drop, short *count, short id, short group, int race, int rate)
|
|
|
+static int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id, short group, int race, int rate)
|
|
|
{
|
|
|
int i;
|
|
|
//Apply config rate adjustment settings.
|
|
@@ -1325,7 +1325,7 @@ static int pc_bonus_item_drop(struct s_add_drop *drop, short *count, short id, s
|
|
|
if (rate > -1)
|
|
|
rate = -1;
|
|
|
}
|
|
|
- for(i = 0; i < *count; i++) {
|
|
|
+ for(i = 0; i < max && (drop[i].id || drop[i].group); i++) {
|
|
|
if(
|
|
|
(id && drop[i].id == id) ||
|
|
|
(group && drop[i].group == group)
|
|
@@ -1345,16 +1345,15 @@ static int pc_bonus_item_drop(struct s_add_drop *drop, short *count, short id, s
|
|
|
return 1;
|
|
|
}
|
|
|
}
|
|
|
- if(*count >= MAX_PC_BONUS) {
|
|
|
+ if(i == max) {
|
|
|
if (battle_config.error_log)
|
|
|
- ShowWarning("pc_bonus: Reached max (%d) number of added drops per character!\n", MAX_PC_BONUS);
|
|
|
+ ShowWarning("pc_bonus: Reached max (%d) number of added drops per character!\n", max);
|
|
|
return 0;
|
|
|
}
|
|
|
- drop[*count].id = id;
|
|
|
- drop[*count].group = group;
|
|
|
- drop[*count].race |= race;
|
|
|
- drop[*count].rate = rate;
|
|
|
- (*count)++;
|
|
|
+ drop[i].id = id;
|
|
|
+ drop[i].group = group;
|
|
|
+ drop[i].race |= race;
|
|
|
+ drop[i].rate = rate;
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -1970,7 +1969,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
ShowWarning("pc_bonus2 (Add Effect): %d is not supported.\n", type2);
|
|
|
break;
|
|
|
}
|
|
|
- pc_bonus_addeff(sd->addeff, MAX_PC_BONUS, type2,
|
|
|
+ pc_bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), type2,
|
|
|
sd->state.lr_flag!=2?val:0, sd->state.lr_flag==2?val:0,
|
|
|
ATF_SHORT|ATF_LONG|ATF_TARGET);
|
|
|
break;
|
|
@@ -1979,7 +1978,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
ShowWarning("pc_bonus2 (Add Effect2): %d is not supported.\n", type2);
|
|
|
break;
|
|
|
}
|
|
|
- pc_bonus_addeff(sd->addeff, MAX_PC_BONUS, type2,
|
|
|
+ pc_bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), type2,
|
|
|
sd->state.lr_flag!=2?val:0, sd->state.lr_flag==2?val:0,
|
|
|
ATF_SHORT|ATF_LONG|ATF_SELF);
|
|
|
break;
|
|
@@ -2011,77 +2010,74 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
sd->magic_addsize[type2]+=val;
|
|
|
break;
|
|
|
case SP_ADD_DAMAGE_CLASS:
|
|
|
- if(!sd->state.lr_flag) {
|
|
|
- for(i=0;i<sd->right_weapon.add_damage_class_count;i++) {
|
|
|
- if(sd->right_weapon.add_damage_classid[i] == type2) {
|
|
|
- sd->right_weapon.add_damage_classrate[i] += val;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if(i >= sd->right_weapon.add_damage_class_count && sd->right_weapon.add_damage_class_count < 10) {
|
|
|
- sd->right_weapon.add_damage_classid[sd->right_weapon.add_damage_class_count] = type2;
|
|
|
- sd->right_weapon.add_damage_classrate[sd->right_weapon.add_damage_class_count] += val;
|
|
|
- sd->right_weapon.add_damage_class_count++;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(sd->state.lr_flag == 1) {
|
|
|
- for(i=0;i<sd->left_weapon.add_damage_class_count;i++) {
|
|
|
- if(sd->left_weapon.add_damage_classid[i] == type2) {
|
|
|
- sd->left_weapon.add_damage_classrate[i] += val;
|
|
|
- break;
|
|
|
- }
|
|
|
+ switch (sd->state.lr_flag) {
|
|
|
+ case 0: //Right hand
|
|
|
+ ARR_FIND(0, ARRAYLENGTH(sd->right_weapon.add_dmg), i, sd->right_weapon.add_dmg[i].rate == 0 || sd->right_weapon.add_dmg[i].class_ == type2);
|
|
|
+ if (i == ARRAYLENGTH(sd->right_weapon.add_dmg))
|
|
|
+ {
|
|
|
+ ShowWarning("pc_bonus2: Reached max (%d) number of add Class dmg bonuses per character!\n", ARRAYLENGTH(sd->right_weapon.add_dmg));
|
|
|
+ break;
|
|
|
}
|
|
|
- if(i >= sd->left_weapon.add_damage_class_count && sd->left_weapon.add_damage_class_count < 10) {
|
|
|
- sd->left_weapon.add_damage_classid[sd->left_weapon.add_damage_class_count] = type2;
|
|
|
- sd->left_weapon.add_damage_classrate[sd->left_weapon.add_damage_class_count] += val;
|
|
|
- sd->left_weapon.add_damage_class_count++;
|
|
|
+ sd->right_weapon.add_dmg[i].class_ = type2;
|
|
|
+ sd->right_weapon.add_dmg[i].rate += val;
|
|
|
+ if (!sd->right_weapon.add_dmg[i].rate) //Shift the rest of elements up.
|
|
|
+ memmove(&sd->right_weapon.add_dmg[i], &sd->right_weapon.add_dmg[i+1], sizeof(sd->right_weapon.add_dmg) - (i+1)*sizeof(sd->right_weapon.add_dmg[0]));
|
|
|
+ break;
|
|
|
+ case 1: //Left hand
|
|
|
+ ARR_FIND(0, ARRAYLENGTH(sd->left_weapon.add_dmg), i, sd->left_weapon.add_dmg[i].rate == 0 || sd->left_weapon.add_dmg[i].class_ == type2);
|
|
|
+ if (i == ARRAYLENGTH(sd->left_weapon.add_dmg))
|
|
|
+ {
|
|
|
+ ShowWarning("pc_bonus2: Reached max (%d) number of add Class dmg bonuses per character!\n", ARRAYLENGTH(sd->left_weapon.add_dmg));
|
|
|
+ break;
|
|
|
}
|
|
|
+ sd->left_weapon.add_dmg[i].class_ = type2;
|
|
|
+ sd->left_weapon.add_dmg[i].rate += val;
|
|
|
+ if (!sd->left_weapon.add_dmg[i].rate) //Shift the rest of elements up.
|
|
|
+ memmove(&sd->left_weapon.add_dmg[i], &sd->left_weapon.add_dmg[i+1], sizeof(sd->left_weapon.add_dmg) - (i+1)*sizeof(sd->left_weapon.add_dmg[0]));
|
|
|
+ break;
|
|
|
}
|
|
|
break;
|
|
|
case SP_ADD_MAGIC_DAMAGE_CLASS:
|
|
|
- if(sd->state.lr_flag != 2) {
|
|
|
- for(i=0;i<sd->add_mdmg_count;i++) {
|
|
|
- if(sd->add_mdmg[i].class_ == type2) {
|
|
|
- sd->add_mdmg[i].rate += val;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if(i >= sd->add_mdmg_count && sd->add_mdmg_count < MAX_PC_BONUS) {
|
|
|
- sd->add_mdmg[sd->add_mdmg_count].class_ = type2;
|
|
|
- sd->add_mdmg[sd->add_mdmg_count].rate += val;
|
|
|
- sd->add_mdmg_count++;
|
|
|
- }
|
|
|
+ if(sd->state.lr_flag == 2)
|
|
|
+ break;
|
|
|
+ ARR_FIND(0, ARRAYLENGTH(sd->add_mdmg), i, sd->add_mdmg[i].rate == 0 || sd->add_mdmg[i].class_ == type2);
|
|
|
+ if (i == ARRAYLENGTH(sd->add_mdmg))
|
|
|
+ {
|
|
|
+ ShowWarning("pc_bonus2: Reached max (%d) number of add Class magic dmg bonuses per character!\n", ARRAYLENGTH(sd->add_mdmg));
|
|
|
+ break;
|
|
|
}
|
|
|
+ sd->add_mdmg[i].class_ = type2;
|
|
|
+ sd->add_mdmg[i].rate += val;
|
|
|
+ if (!sd->add_mdmg[i].rate) //Shift the rest of elements up.
|
|
|
+ memmove(&sd->add_mdmg[i], &sd->add_mdmg[i+1], sizeof(sd->add_mdmg) - (i+1)*sizeof(sd->add_mdmg[0]));
|
|
|
break;
|
|
|
case SP_ADD_DEF_CLASS:
|
|
|
- if(sd->state.lr_flag != 2) {
|
|
|
- for(i=0;i<sd->add_def_count;i++) {
|
|
|
- if(sd->add_def[i].class_ == type2) {
|
|
|
- sd->add_def[i].rate += val;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if(i >= sd->add_def_count && sd->add_def_count < MAX_PC_BONUS) {
|
|
|
- sd->add_def[sd->add_def_count].class_ = type2;
|
|
|
- sd->add_def[sd->add_def_count].rate += val;
|
|
|
- sd->add_def_count++;
|
|
|
- }
|
|
|
+ if(sd->state.lr_flag == 2)
|
|
|
+ break;
|
|
|
+ ARR_FIND(0, ARRAYLENGTH(sd->add_def), i, sd->add_def[i].rate == 0 || sd->add_def[i].class_ == type2);
|
|
|
+ if (i == ARRAYLENGTH(sd->add_def))
|
|
|
+ {
|
|
|
+ ShowWarning("pc_bonus2: Reached max (%d) number of add Class def bonuses per character!\n", ARRAYLENGTH(sd->add_def));
|
|
|
+ break;
|
|
|
}
|
|
|
+ sd->add_def[i].class_ = type2;
|
|
|
+ sd->add_def[i].rate += val;
|
|
|
+ if (!sd->add_def[i].rate) //Shift the rest of elements up.
|
|
|
+ memmove(&sd->add_def[i], &sd->add_def[i+1], sizeof(sd->add_def) - (i+1)*sizeof(sd->add_def[0]));
|
|
|
break;
|
|
|
case SP_ADD_MDEF_CLASS:
|
|
|
- if(sd->state.lr_flag != 2) {
|
|
|
- for(i=0;i<sd->add_mdef_count;i++) {
|
|
|
- if(sd->add_mdef[i].class_ == type2) {
|
|
|
- sd->add_mdef[i].rate += val;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if(i >= sd->add_mdef_count && sd->add_mdef_count < MAX_PC_BONUS) {
|
|
|
- sd->add_mdef[sd->add_mdef_count].class_ = type2;
|
|
|
- sd->add_mdef[sd->add_mdef_count].rate += val;
|
|
|
- sd->add_mdef_count++;
|
|
|
- }
|
|
|
+ if(sd->state.lr_flag == 2)
|
|
|
+ break;
|
|
|
+ ARR_FIND(0, ARRAYLENGTH(sd->add_mdef), i, sd->add_mdef[i].rate == 0 || sd->add_mdef[i].class_ == type2);
|
|
|
+ if (i == ARRAYLENGTH(sd->add_mdef))
|
|
|
+ {
|
|
|
+ ShowWarning("pc_bonus2: Reached max (%d) number of add Class mdef bonuses per character!\n", ARRAYLENGTH(sd->add_mdef));
|
|
|
+ break;
|
|
|
}
|
|
|
+ sd->add_mdef[i].class_ = type2;
|
|
|
+ sd->add_mdef[i].rate += val;
|
|
|
+ if (!sd->add_mdef[i].rate) //Shift the rest of elements up.
|
|
|
+ memmove(&sd->add_mdef[i], &sd->add_mdef[i+1], sizeof(sd->add_mdef) - (i+1)*sizeof(sd->add_mdef[0]));
|
|
|
break;
|
|
|
case SP_HP_DRAIN_RATE:
|
|
|
if(!sd->state.lr_flag) {
|
|
@@ -2200,7 +2196,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
break;
|
|
|
}
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_addeff(sd->addeff2, MAX_PC_BONUS, type2, val, 0,
|
|
|
+ pc_bonus_addeff(sd->addeff2, ARRAYLENGTH(sd->addeff2), type2, val, 0,
|
|
|
ATF_SHORT|ATF_LONG|ATF_TARGET);
|
|
|
break;
|
|
|
case SP_ADDEFF_WHENHIT_SHORT:
|
|
@@ -2278,21 +2274,6 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
- case SP_ADD_DAMAGE_BY_CLASS:
|
|
|
- if(sd->state.lr_flag != 2) {
|
|
|
- for(i=0;i<sd->add_dmg_count;i++) {
|
|
|
- if(sd->add_dmg[i].class_ == type2) {
|
|
|
- sd->add_dmg[i].rate += val;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if(i >= sd->add_dmg_count && sd->add_dmg_count < MAX_PC_BONUS) {
|
|
|
- sd->add_dmg[sd->add_dmg_count].class_ = type2;
|
|
|
- sd->add_dmg[sd->add_dmg_count].rate += val;
|
|
|
- sd->add_dmg_count++;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
case SP_HP_LOSS_RATE:
|
|
|
if(sd->state.lr_flag != 2) {
|
|
|
sd->hp_loss.value = type2;
|
|
@@ -2329,9 +2310,9 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
break;
|
|
|
}
|
|
|
//Standard item bonus.
|
|
|
- for(i=0; i < MAX_PC_BONUS && sd->itemhealrate[i].nameid && sd->itemhealrate[i].nameid != type2; i++);
|
|
|
- if(i == MAX_PC_BONUS) {
|
|
|
- ShowWarning("pc_bonus2: Reached max (%d) number of item heal bonuses per character!\n", MAX_PC_BONUS);
|
|
|
+ for(i=0; i < ARRAYLENGTH(sd->itemhealrate) && sd->itemhealrate[i].nameid && sd->itemhealrate[i].nameid != type2; i++);
|
|
|
+ if(i == ARRAYLENGTH(sd->itemhealrate)) {
|
|
|
+ ShowWarning("pc_bonus2: Reached max (%d) number of item heal bonuses per character!\n", ARRAYLENGTH(sd->itemhealrate));
|
|
|
break;
|
|
|
}
|
|
|
sd->itemhealrate[i].nameid = type2;
|
|
@@ -2347,11 +2328,11 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
break;
|
|
|
case SP_ADD_MONSTER_DROP_ITEM:
|
|
|
if (sd->state.lr_flag != 2)
|
|
|
- pc_bonus_item_drop(sd->add_drop, &sd->add_drop_count, type2, 0, (1<<RC_BOSS)|(1<<RC_NONBOSS), val);
|
|
|
+ pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, (1<<RC_BOSS)|(1<<RC_NONBOSS), val);
|
|
|
break;
|
|
|
case SP_ADD_MONSTER_DROP_ITEMGROUP:
|
|
|
if (sd->state.lr_flag != 2)
|
|
|
- pc_bonus_item_drop(sd->add_drop, &sd->add_drop_count, 0, type2, (1<<RC_BOSS)|(1<<RC_NONBOSS), val);
|
|
|
+ pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, type2, (1<<RC_BOSS)|(1<<RC_NONBOSS), val);
|
|
|
break;
|
|
|
case SP_SP_LOSS_RATE:
|
|
|
if(sd->state.lr_flag != 2) {
|
|
@@ -2401,15 +2382,15 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
|
|
|
switch(type){
|
|
|
case SP_ADD_MONSTER_DROP_ITEM:
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_item_drop(sd->add_drop, &sd->add_drop_count, type2, 0, 1<<type3, val);
|
|
|
+ pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, 1<<type3, val);
|
|
|
break;
|
|
|
case SP_AUTOSPELL:
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_autospell(sd->autospell, MAX_PC_BONUS, skill_get_inf(type2)&INF_SELF_SKILL?-type2:type2, type3, val, 0, current_equip_card_id);
|
|
|
+ pc_bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), skill_get_inf(type2)&INF_SELF_SKILL?-type2:type2, type3, val, 0, current_equip_card_id);
|
|
|
break;
|
|
|
case SP_AUTOSPELL_WHENHIT:
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_autospell(sd->autospell2, MAX_PC_BONUS, skill_get_inf(type2)&INF_SELF_SKILL?-type2:type2, type3, val, 0, current_equip_card_id);
|
|
|
+ pc_bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), skill_get_inf(type2)&INF_SELF_SKILL?-type2:type2, type3, val, 0, current_equip_card_id);
|
|
|
break;
|
|
|
case SP_SP_DRAIN_RATE:
|
|
|
if(!sd->state.lr_flag) {
|
|
@@ -2452,7 +2433,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
|
|
|
break;
|
|
|
case SP_ADD_MONSTER_DROP_ITEMGROUP:
|
|
|
if (sd->state.lr_flag != 2)
|
|
|
- pc_bonus_item_drop(sd->add_drop, &sd->add_drop_count, 0, type2, 1<<type3, val);
|
|
|
+ pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, type2, 1<<type3, val);
|
|
|
break;
|
|
|
|
|
|
case SP_ADDEFF:
|
|
@@ -2460,7 +2441,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
|
|
|
ShowWarning("pc_bonus3 (Add Effect): %d is not supported.\n", type2);
|
|
|
break;
|
|
|
}
|
|
|
- pc_bonus_addeff(sd->addeff, MAX_PC_BONUS, type2,
|
|
|
+ pc_bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), type2,
|
|
|
sd->state.lr_flag!=2?type3:0, sd->state.lr_flag==2?type3:0,
|
|
|
ATF_SHORT|ATF_LONG|(val?ATF_TARGET:ATF_SELF)|(val==2?ATF_SELF:0));
|
|
|
break;
|
|
@@ -2471,7 +2452,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
|
|
|
break;
|
|
|
}
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_addeff(sd->addeff2, MAX_PC_BONUS, type2, type3, 0,
|
|
|
+ pc_bonus_addeff(sd->addeff2, ARRAYLENGTH(sd->addeff2), type2, type3, 0,
|
|
|
ATF_SHORT|ATF_LONG|(val?ATF_TARGET:ATF_SELF)|(val==2?ATF_SELF:0));
|
|
|
break;
|
|
|
|
|
@@ -2491,12 +2472,12 @@ int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4
|
|
|
switch(type){
|
|
|
case SP_AUTOSPELL:
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_autospell(sd->autospell, MAX_PC_BONUS, (val&1?type2:-type2), (val&2?-type3:type3), type4, 0, current_equip_card_id);
|
|
|
+ pc_bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), (val&1?type2:-type2), (val&2?-type3:type3), type4, 0, current_equip_card_id);
|
|
|
break;
|
|
|
|
|
|
case SP_AUTOSPELL_WHENHIT:
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_autospell(sd->autospell2, MAX_PC_BONUS, (val&1?type2:-type2), (val&2?-type3:type3), type4, 0, current_equip_card_id);
|
|
|
+ pc_bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), (val&1?type2:-type2), (val&2?-type3:type3), type4, 0, current_equip_card_id);
|
|
|
break;
|
|
|
default:
|
|
|
if(battle_config.error_log)
|
|
@@ -2514,12 +2495,12 @@ int pc_bonus5(struct map_session_data *sd,int type,int type2,int type3,int type4
|
|
|
switch(type){
|
|
|
case SP_AUTOSPELL:
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_autospell(sd->autospell, MAX_PC_BONUS, (val&1?type2:-type2), (val&2?-type3:type3), type4, type5, current_equip_card_id);
|
|
|
+ pc_bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), (val&1?type2:-type2), (val&2?-type3:type3), type4, type5, current_equip_card_id);
|
|
|
break;
|
|
|
|
|
|
case SP_AUTOSPELL_WHENHIT:
|
|
|
if(sd->state.lr_flag != 2)
|
|
|
- pc_bonus_autospell(sd->autospell2, MAX_PC_BONUS, (val&1?type2:-type2), (val&2?-type3:type3), type4, type5, current_equip_card_id);
|
|
|
+ pc_bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), (val&1?type2:-type2), (val&2?-type3:type3), type4, type5, current_equip_card_id);
|
|
|
break;
|
|
|
default:
|
|
|
if(battle_config.error_log)
|
|
@@ -5453,7 +5434,7 @@ int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp)
|
|
|
//Item Group bonuses
|
|
|
bonus += bonus*itemdb_group_bonus(sd, itemid)/100;
|
|
|
//Individual item bonuses.
|
|
|
- for(i = 0; i < MAX_PC_BONUS && sd->itemhealrate[i].nameid; i++)
|
|
|
+ for(i = 0; i < ARRAYLENGTH(sd->itemhealrate) && sd->itemhealrate[i].nameid; i++)
|
|
|
{
|
|
|
if (sd->itemhealrate[i].nameid == itemid) {
|
|
|
bonus += bonus*sd->itemhealrate[i].rate/100;
|