This is more of a suggestion that could be a submission:
In exp.cpp
Code:
//get modifiers
if(RuleR(Character, ExpMultiplier) >= 0){
totalmod *= RuleR(Character, ExpMultiplier);
}
if(zone->newzone_data.zone_exp_multiplier >= 0){
zemmod *= zone->newzone_data.zone_exp_multiplier;
}
if(RuleB(Character,UseRaceClassExpBonuses))
{
if(GetBaseRace() == HALFLING){
totalmod *= 1.05;
}
if(GetClass() == ROGUE || GetClass() == WARRIOR){
totalmod *= 1.05;
}
}
if(zone->IsHotzone())
{
totalmod += RuleR(Zone, HotZoneBonus);
}
add_exp = int32(float(add_exp) * totalmod * zemmod);
The HotZoneBonus is added to the modifier, and it should be multiplied just like the other modifiers are. Granted the value in the rule_values table (default is 0.75 I think) may need to change to accommodate this, but multiplying make more sense.
Consider:
If you decided to make your ExpMultiplier really high, say 10 for arguments sake (not a likely value I know, but to help make the point) then adding a 0.75 to the modifier is relatively a very small increase, only 7.5%.
But if your ExpMultiplier was really low...I actually set it to 0.01 (along with some other changes mind you) and when I got to a hot zone I was getting 75 times as much exp as I should have (that's 7500%)...kinda throws things off a little when you kill one goblin in Runny Eye and gain 23 levels.
Changing the code to this:
Code:
if(zone->IsHotzone())
{
totalmod *= RuleR(Zone, HotZoneBonus);
}
...would keep the bonus consistent. Set the db value to 1.5 and you'd always have 150% exp bonus in hot zones regardless of what the base ExpMultiplier is; set it to 2 and you'll always get 200% exp etc.
One caution if this change is implemented, if the HotZoneBonus value in the rule_values table stays at 0.75 it is going to make hot zones only give 75% exp of a normal zone, making it more of a cold-zone-penalty. So the db value would have to change along with the cpp code.