summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
Diffstat (limited to 'src/map')
-rw-r--r--src/map/battle.c7
-rw-r--r--src/map/battle.h2
-rw-r--r--src/map/mob.c15
-rw-r--r--src/map/party.c52
-rw-r--r--src/map/skill.c2
5 files changed, 53 insertions, 25 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index bc9828764..6a4dbf98f 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -3709,6 +3709,8 @@ static const struct battle_data_short {
{ "motd_type", &battle_config.motd_type}, // [celest]
{ "finding_ore_rate", &battle_config.finding_ore_rate}, // [celest]
{ "exp_calc_type", &battle_config.exp_calc_type}, // [celest]
+ { "exp_bonus_attacker", &battle_config.exp_bonus_attacker}, // [Skotlex]
+ { "exp_bonus_max_attacker", &battle_config.exp_bonus_max_attacker}, // [Skotlex]
{ "min_skill_delay_limit", &battle_config.min_skill_delay_limit}, // [celest]
{ "default_skill_delay", &battle_config.default_skill_delay}, // [Skotlex]
{ "no_skill_delay", &battle_config.no_skill_delay}, // [Skotlex]
@@ -4143,6 +4145,8 @@ void battle_set_defaults() {
battle_config.castrate_dex_scale = 150;
battle_config.area_size = 14;
battle_config.exp_calc_type = 1;
+ battle_config.exp_bonus_attacker = 25;
+ battle_config.exp_bonus_max_attacker = 12;
battle_config.min_skill_delay_limit = 100;
battle_config.default_skill_delay = 300; //Default skill delay according to official servers.
battle_config.no_skill_delay = BL_MOB;
@@ -4351,6 +4355,9 @@ void battle_validate_conf() {
if (battle_config.min_skill_delay_limit < 10)
battle_config.min_skill_delay_limit = 10; // minimum delay of 10ms
+ if (battle_config.exp_bonus_max_attacker < 2)
+ battle_config.exp_bonus_max_attacker = 2;
+
if (battle_config.no_spawn_on_player > 100)
battle_config.no_spawn_on_player = 100;
if (battle_config.mob_remove_delay < 15000) //Min 15 sec
diff --git a/src/map/battle.h b/src/map/battle.h
index be3a67c90..b27a27878 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -359,6 +359,8 @@ extern struct Battle_Config {
unsigned short motd_type; // [celest]
unsigned short finding_ore_rate; // orn
unsigned short exp_calc_type;
+ unsigned short exp_bonus_attacker;
+ unsigned short exp_bonus_max_attacker;
unsigned short min_skill_delay_limit;
unsigned short default_skill_delay;
unsigned short no_skill_delay;
diff --git a/src/map/mob.c b/src/map/mob.c
index 6f73433c7..a9ae329d5 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -1807,8 +1807,13 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
//eAthena's exp formula based on max hp.
per = (double)md->dmglog[i].dmg/(double)status->max_hp;
- if (count>1)
- per *= (9.+(double)((count > 6)? 6:count))/10.; //attackers count bonus.
+ if (count>1 && battle_config.exp_bonus_attacker) {
+ //Exp bonus per additional attacker.
+ if (count > battle_config.exp_bonus_max_attacker)
+ count = battle_config.exp_bonus_max_attacker;
+ count--;
+ per += per*(count*battle_config.exp_bonus_attacker)/100.;
+ }
if(md->special_state.size==1) // change experience for different sized monsters [Valaris]
per /=2.;
@@ -2053,8 +2058,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
//mapflag: noexp check [Lorky]
if (map[md->bl.m].flag.nobaseexp)
exp =1;
- else
- exp = (double)md->db->mexp * (9+count)/10.; //[Gengar]
+ else {
+ exp = md->db->mexp;
+ exp += exp*(battle_config.exp_bonus_attacker*count)/100.; //[Gengar]
+ }
mexp = (exp > UINT_MAX)?UINT_MAX:(exp<1?1:(unsigned int)exp);
diff --git a/src/map/party.c b/src/map/party.c
index a119d5287..0799b5215 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -707,7 +707,7 @@ int party_exp_share(struct party_data *p,struct block_list *src,unsigned int bas
{
struct map_session_data* sd[MAX_PARTY];
int i;
- unsigned short c, bonus =100; // modified [Valaris]
+ unsigned short c;
nullpo_retr(0, p);
@@ -719,32 +719,44 @@ int party_exp_share(struct party_data *p,struct block_list *src,unsigned int bas
}
if (c < 1)
return 0;
- if (battle_config.party_even_share_bonus) //Valaris's even share exp bonus equation.
- bonus += (battle_config.party_even_share_bonus*c*(c-1)/10); //Changed Valaris's bonus switch to an equation [Skotlex]
- else //Official kRO/iRO sites state that the even share bonus is 10% per additional party member.
- bonus += (c-1)*10;
base_exp/=c;
job_exp/=c;
- if (base_exp/100 > UINT_MAX/bonus)
- base_exp= UINT_MAX; //Exp overflow
- else if (base_exp > 10000)
- base_exp = (base_exp/100)*bonus; //Calculation overflow protection
- else
- base_exp = base_exp*bonus/100;
-
- if (job_exp/100 > UINT_MAX/bonus)
- job_exp = UINT_MAX;
- else if (job_exp > 10000)
- job_exp = (job_exp/100)*bonus;
- else
- job_exp = job_exp*bonus/100;
+ zeny/=c;
+
+ if (battle_config.party_even_share_bonus && c > 1) {
+ unsigned short bonus =100 + battle_config.party_even_share_bonus*(c-1);
+ if (base_exp) {
+ if (base_exp/100 > UINT_MAX/bonus)
+ base_exp= UINT_MAX; //Exp overflow
+ else if (base_exp > 10000)
+ base_exp = (base_exp/100)*bonus; //Calculation overflow protection
+ else
+ base_exp = base_exp*bonus/100;
+ }
+ if (job_exp) {
+ if (job_exp/100 > UINT_MAX/bonus)
+ job_exp = UINT_MAX;
+ else if (job_exp > 10000)
+ job_exp = (job_exp/100)*bonus;
+ else
+ job_exp = job_exp*bonus/100;
+ }
+ if (zeny) {
+ if (zeny/100 > UINT_MAX/bonus)
+ zeny = UINT_MAX;
+ else if (zeny > 10000)
+ zeny = (zeny/100)*bonus;
+ else
+ zeny = zeny*bonus/100;
+ }
+ }
for (i = 0; i < c; i++)
{
pc_gainexp(sd[i], src, base_exp, job_exp);
- if (battle_config.zeny_from_mobs) // zeny from mobs [Valaris]
- pc_getzeny(sd[i],bonus*zeny/(c*100));
+ if (zeny) // zeny from mobs [Valaris]
+ pc_getzeny(sd[i],zeny);
}
return 0;
}
diff --git a/src/map/skill.c b/src/map/skill.c
index 2f337492b..685158283 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -7886,7 +7886,7 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
itemid[i] = skill_db[j].itemid[i];
amount[i] = skill_db[j].amount[i];
}
- if(mhp > 0 && 100 * status->hp / status->max_hp > mhp) {
+ if(mhp > 0 && 100 * status->hp / status->max_hp > (unsigned int) mhp) {
//mhp is the max-hp-requirement, that is,
//you must have this % or less of HP to cast it.
clif_skill_fail(sd,skill,2,0);