#51
|
|||
|
It's funny you mentioned MW2 and Dragon Age, cause they've actually helped me break my addiction to this server, and my masochistic melee ways [You must be logged in to view images. Log in or Register.]
In all seriousness I appreciate all the dev's work, and will keep lurking here till I here some new news on this subject. | ||
|
#52
|
|||
|
I have been looking at the AC interval tables for mitigation. The tables do not seem all that unreasonable. I tweaked on a few things, and found it takes very few changes to make huge swings in the effect of AC at different levels.
I am looking into the mitigation range, as that looks like where some changes could be made. I have to do some calculations and see how best to make changes and run a few more parses after. This really only covers melee mitigation what I have been testing. If there are issues with avoidance, the first place I would check are in the rules set for the server. The melee attack rate was increased previously on the server. My big question was how this was done, so I can see if this affected other things. It looks like the easy answer to increase melee hit rates is to increase Combat:BaseHitChance. The default setting is 69. The NPC's get Combat:NPCBonusHitChance at 26. 69 + 26 = 95, so I assume that is why they normally have a 95% chance of hitting. I havent tested results of raising one, without properly offsetting other, but I imaging it will make avoidance be a rare occurance. So this needs looked at more. I will do some tweaks on the rates of mitigation, with how changes to the interval tables for AC and post what I find when I get finished. I do not imagine any major tweaks are necessary here, but I want to see if the interval is a fixed differential or if it varies with level. But that is where I am currently investigating mitigation. Will post more as I figure more out. Haynar | ||
|
#53
|
||||
|
Quote:
I don't think the lower levels should be changed too much. I like the toughness of everything so far. If it was any easier, it would be too much like live where everyone has this mindset where they gotta be max level. I hate that attitude so much. They'll never be happy. For example... my warrior and monk are killing dark blues, evens and yellows. I'd say that the evens are doable at level 6 for the monk, but hard. The yellows are getting too difficult for the monk to kill. However, I haven't upgraded his armor, yet. I see a lot of people who don't even have armor at level 6 (one guy just had a couple peices of cloth armor). The warrior can kill evens at level 4 without too much trouble. His benefit is he has a lot of hitpoints and can wield 2 handers. Ofcourse, when I go into groups we're routinely killing evens/yellows/reds. Keep that in mind! It would be weird/wrong to be killing all reds in a group. I know some peple may disagree with me on this, but it just wouldn't seem right to me. | |||
Last edited by stormlord; 11-20-2009 at 12:54 AM..
|
|
#54
|
||||
|
Quote:
| |||
|
#55
|
|||
|
I have some new equations for the mitigation to test, plus a few other little tweaks to them to be more like I remember live. I will run a few tests on my little server here at home tomorrow, and post some possible mitigation solutions tomorrow. I left the interval values for AC alone, but changed the slopes of the mitigation vs AC basically.
Haynar | ||
|
#57
|
|||
|
Here are the changes I made to attack.cpp
I changed the combat rating slightly, lowering just a tad. Changed the scaling on d1_chance and d2_d19_chance. I added a d20_chance which basically says any mob can hit for max, 5% of time, no matter how high your AC. It scales pretty well I think. Hope this helps in coming up with a solution for melee. Haynar Code:
void Mob::MeleeMitigation(Mob *attacker, sint32 &damage, sint32 minhit) { if(damage <= 0) return; Mob* defender = this; int totalMit = 0; switch(GetAA(aaCombatStability)){ case 1: totalMit += 2; break; case 2: totalMit += 5; break; case 3: totalMit += 10; break; } totalMit += GetAA(aaPhysicalEnhancement)*2; totalMit += GetAA(aaInnateDefense); totalMit += GetAA(aaDefensiveInstincts)*0.5; if(RuleB(Combat, UseIntervalAC)){ //AC Mitigation sint32 attackRating = 0; uint16 ac_eq100 = 125; if(defender->GetLevel() < 20) { ac_eq100 += 15 * defender->GetLevel(); } else if(defender->GetLevel() < 50) { ac_eq100 += (285 + ((defender->GetLevel()-19)*30)); } else if(defender->GetLevel() < 60) { ac_eq100 += (1185 + ((defender->GetLevel()-49)*60)); } else if(defender->GetLevel() < 70) { ac_eq100 += (1785 + ((defender->GetLevel()-59)*90)); } else { ac_eq100 += (2325 + ((defender->GetLevel()-69)*125)); } attackRating = 10 + attacker->GetATK(); sint32 defenseRating = defender->GetAC(); defenseRating += 125; defenseRating += (totalMit * defenseRating / 100); double d1_chance; double d2_d19_chance; double d20_chance; double combat_rating = (defenseRating - attackRating); combat_rating = 100 * combat_rating / (double)ac_eq100; combat_rating -= 20; d1_chance = ((combat_rating) * 0.3); d2_d19_chance = 48.0 + ((combat_rating) * 0.42); if(d1_chance < 1.0) d1_chance = 1.0; if(d2_d19_chance < 4.0) d2_d19_chance = 4.0; d20_chance = d1_chance + d2_d19_chance; if (d20_chance > 95.0) d20_chance = 95.0; double roll = MakeRandomFloat(0, 100); int interval_used = 0; if(roll <= d1_chance) { interval_used = 1; } else if(roll <= (d20_chance)) { interval_used = 1 + (int)((((roll-d1_chance) / d2_d19_chance) * 18) + 1); } else { interval_used = 20; } //PS: this looks WRONG but there's a method to the madness int db = minhit; double di = ((double)(damage-minhit)/19); damage = db + (di * (interval_used - 1)); } else{ //////////////////////////////////////////////////////// // Scorpious2k: Include AC in the calculation // use serverop variables to set values int myac = GetAC(); if (damage > 0 && myac > 0) { int acfail=1000; char tmp[10]; if (database.GetVariable("ACfail", tmp, 9)) { acfail = (int) (atof(tmp) * 100); if (acfail>100) acfail=100; } if (acfail<=0 || rand()%101>acfail) { float acreduction=1; int acrandom=300; if (database.GetVariable("ACreduction", tmp, 9)) { acreduction=atof(tmp); if (acreduction>100) acreduction=100; } if (database.GetVariable("ACrandom", tmp, 9)) { acrandom = (int) ((atof(tmp)+1) * 100); if (acrandom>10100) acrandom=10100; } if (acreduction>0) { damage -= (int) (GetAC() * acreduction/100.0f); } if (acrandom>0) { damage -= (myac * MakeRandomInt(0, acrandom) / 10000); } if (damage<1) damage=1; mlog(COMBAT__DAMAGE, "AC Damage Reduction: fail chance %d%%. Failed. Reduction %.3f%%, random %d. Resulting damage %d.", acfail, acreduction, acrandom, damage); } else { mlog(COMBAT__DAMAGE, "AC Damage Reduction: fail chance %d%%. Did not fail.", acfail); } } damage -= (totalMit * damage / 100); if(damage != 0 && damage < minhit) damage = minhit; } //reduce the damage from shielding item and aa based on the min dmg //spells offer pure mitigation damage -= (minhit * defender->itembonuses.MeleeMitigation / 100); damage -= (damage * defender->spellbonuses.MeleeMitigation / 100); if(damage < 0) damage = 0; mlog(COMBAT__DAMAGE, "Applied %d percent mitigation, remaining damage %d", totalMit, damage); } | ||
|
#59
|
|||
|
thanks for the work, I am not melee class atm, but as a cleric, I can appreciate the concern, and hope this gets "tweeked".
I think productive posts like this is what is needed, the whining needs to stop and lets find a solution to help. I love this game, and am having fun again playing MMO, so keep up the good work! Wildir | ||
|
#60
|
|||
|
Nice code Haynar, going to submit it to KLS and see what she thinks about it. If not ready for prime time Emu as a rule value but would work for us we'll get it implemented here exclusively.
| ||
|
|
|