Log in

View Full Version : Skill rate slow doan near max skill


starblight
09-16-2015, 02:58 PM
I have increased exp gain on my server so to keep skills from lagging behind I updated the rate you learn them. the problem I am having is when you get close to your max it slows way down. So for example a level 55 SK equips a 2hs weapon for the first time. Up to around 100 is fast about a skill gain each hit. but past that it can take more then one fight to gain one skill point. Is there a way to change this? I could try setting Character:SkillUpModifier even higher then I did as it is almost a skill level per hit anyways it would have little effect in the beginning.

Shendare
09-16-2015, 03:33 PM
What have you set the Character::SkillUpModifier to? 100 means normal speed. 200 would mean skill-ups happen twice as often.

Regular non-modified skill-up rates as a percentage chance for each swing are:

0 - 17.6% (every 5.7 swings)
100 - 12.6% (every 7.9 swings)
150 - 10.1% (every 9.9 swings)
200 - 7.6% (every 13.2 swings)
252 - 5% (every 20 swings)
280 - 3.6% (every 27.8 swings)
300 - 2.6% (every 38.5 swings)

starblight
09-16-2015, 05:45 PM
I set it to 2400. Is it possible to set it to high?

Shendare
09-16-2015, 05:53 PM
2400 shouldn't do it. That should yield a ... 12.6 * 2400 = 302.4% chance to succeed. Every swing should give you a skill-up if the 2400 rule is in effect.

My suspicion at this point would be that the rule set that the 2400 rule is on (rule_values.ruleset_id -> rule_sets.ruleset_id) is not the one that the server is working with (variables "RuleSet" -> rule_sets.name).

If your rule_values table is using rulesetid 10, and rulesetid 10 is named "Default" in rule_sets, then you would need a variable in your Variables table called RuleSet with the value of Default.

Kingly_Krab
09-16-2015, 05:57 PM
Also, try changing the ruleset column to the same number for every zone, in case the zone you're testing it in isn't under that ruleset: UPDATE `zone` SET `ruleset` = '#' WHERE `ruleset` != '#'

Shendare
09-16-2015, 05:58 PM
Oh, right! Each zone can be on a different ruleset from the default. Thanks, KK.

starblight
09-16-2015, 09:58 PM
I made the changes suggested and I think I will like having all the zones on the same rule set.

That being said I feel I was not as clear as I should have been on the problem I am having. It seems like there is a soft cap for how fast a skill is learned. As you get closer to your levels cap the rate slows way down. But as soon as you level again the rate increases then slows again. Thanks for all the help so far.

AdrianD
09-16-2015, 10:08 PM
I have noticed for quite a while that skills like parry/dodge/rip/foraging? and some others skill up extremely fast. Even with mid/high skill values (say, max for a lvl 40) these skills balloon quickly. On the other hand, weapon skills/offense/defense increase much, much slower, maybe 10/20+ times slower. Changing the general modrate doesn't make sense. I'm fine with the slower skills as they are.

I would really like to change this but it's been low priority. I figure this is a source change.

* I suppose a question would help. Which source file(s) would I find the equation which governs skill-ups of various skills? If you know off-hand.

Shendare
09-16-2015, 10:57 PM
client.cpp - Client::CheckIncreaseSkill

Defensive skills get a chance to increase with every swing an enemy takes at you. Offensive skills get a chance to increase with every swing you take at an enemy.

If you have 2 enemies attacking, you, you'll get twice as many opportunities to skill up defensive skills as offensive skills.

I don't see anything in the skillup code that would affect chances of skillups as you get closer to max for a level. This is basically it:


// Make sure we're not already at skill cap
if (skillval < maxskill)
{
// the higher your current skill level, the harder it is
int32 Chance = 10 + chancemodi + ((252 - skillval) / 20);

Chance = (Chance * RuleI(Character, SkillUpModifier) / 100);

Chance = mod_increase_skill_chance(Chance, against_who);

if(Chance < 1)
Chance = 1; // Make it always possible

if(zone->random.Real(0, 99) < Chance)
{
SetSkill(skillid, GetRawSkill(skillid) + 1);
Log.Out(Logs::Detail, Logs::Skills, "Skill %d at value %d successfully gain with %d%%chance (mod %d)", skillid, skillval, Chance, chancemodi);
return true;
} else {
Log.Out(Logs::Detail, Logs::Skills, "Skill %d at value %d failed to gain with %d%%chance (mod %d)", skillid, skillval, Chance, chancemodi);
}
} else {
Log.Out(Logs::Detail, Logs::Skills, "Skill %d at value %d cannot increase due to maxmum %d", skillid, skillval, maxskill);
}

starblight
09-21-2015, 07:21 PM
So I quickly realized I had not done enough research on the exact problem I was having. I do want to thank people for the info they posted. The source code is definitely interesting.

So my goal was to make skills a lot less of a concern. So I set as I said above the Character::SkillUpModifier to 2400 and while testing it over the next few day I set it to a variety of setting ranging from 300-24000. After leveling a group to level 65 a lot of the skills level at the expected rate. but a few seem to not work as expected. here is a list of ones that level fast up to around 100 then slow down. It seem like a 1% chance is about how slow they get.

All weapon skills like 1hs 2hb and so on
Swimming
Archery
Disarm (Broken skill?)


Oddly throwing skill levels up fast.

Class specific skills have not been tested as well. There is a rouge and back stab and pick pocket has been reported as levels up fast.

For now what I am considering as a work around will be to modify the source to change the chance line from 1 to 20

if(Chance < 1)
Chance = 1; // Make it always possible


if(Chance < 60)
Chance = 60; // Make it always possible


(edit)
A quick test on archery and this change worked. You now gain a skill point about 60% of the time.

N0ctrnl
09-22-2015, 06:27 AM
Why not just max the skill on level? Seems like you basically want to ignore the skillup parts anyway. Could just grant the 5 points as soon as they level up and it's a non-issue. Any reason you're not looking at doing that instead?

Shendare
09-22-2015, 12:13 PM
Yeah, that was my thought, too. If skillups are too inconvenient for your server's philosophy, may as well max 'em at level up.

zone/exp.cpp - Client::SetLevel() - Line ~604


...
Log.Out(Logs::General, Logs::Normal, "Setting Level for %s to %i", GetName(), set_level);

CalcBonuses();

// Set all skills to max:
for (uint32 i = 0; i <= HIGHEST_SKILL; ++i) {
// Skip specialized, tradeskills (fishing excluded), Alcohol Tolerance, and Bind Wound
if (EQEmu::IsSpecializedSkill((SkillUseTypes)i) ||
(EQEmu::IsTradeskill((SkillUseTypes)i) && i != SkillFishing) ||
i == SkillAlcoholTolerance || i == SkillBindWound)
continue;

pp->skills[i] = database.GetSkillCap(pp->class_, (SkillUseTypes)i, 1);
}


if(!RuleB(Character, HealOnLevel)) {
int mhp = CalcMaxHP();
...


Note: Untested. Just found the appropriate places in the code to copy/paste from and to.

starblight
09-22-2015, 01:05 PM
I had seen a post about how to do this but it was using the old code not the lua. so sounds like I would have had to revert back to an old script or rewrite the code. setting it at level up also would have maxed out all skills. It is a thin line but still faster then I would like. While both fixes work I still would rather have the Character::SkillUpModifier work so I can fine tune the rate. As we play I am still figuring out the best rate. While the default settings was way to slow my new setting is a little fast. I most likely should have set it closer to 30%-40%. I am curious though are others having issues with the default skill rate being very slow? It is a lot slower then I recall on live.

AdrianD
09-22-2015, 03:16 PM
Thanks for posting that Shendare. Bookmarked for later use.

I think the perception of rate of skillup on or vs live will be varied across the board. I'm pretty sure they changed it several times during the life of EQ. I recall it being slower in earlier expansions I played in but, this is my perception.

My rule_value for this setting is at 100 with recent code. I will have the same rate as anyone else with the same code, et al. My perception is:

I have noticed for quite a while that skills like parry/dodge/rip/foraging? and some others skill up extremely fast. Even with mid/high skill values (say, max for a lvl 40) these skills balloon quickly. On the other hand, weapon skills/offense/defense increase much, much slower, maybe 10/20+ times slower.

I don't think most of them are slow at all. Weapon skills/offense/defense could use a tweak, but that's just me.

While both fixes work I still would rather have the Character::SkillUpModifier work so I can fine tune the rate.

I think you may need to alter the code if you want it to work how you want it to work.

Kingly_Krab
09-22-2015, 03:22 PM
As for Shendare's resolution, you can also do that in Perl (this would go in your global_player.pl): sub EVENT_LEVEL_UP {
foreach my $skill (0..55, 62, 66, 67, 70..74) {
if($client->CanHaveSkill($skill) && $client->MaxSkill($skill, $client->GetClass(), $ulevel) > $client->GetRawSkill($skill)) {
$client->SetSkill($skill, $client->MaxSkill($skill, $client->GetClass(), $ulevel));
}
}
}

Shendare
09-22-2015, 03:23 PM
Nice! There's hardly anything you can't do with scripting these days!

Kingly_Krab
09-22-2015, 04:02 PM
Exactly, haha, all it takes is some TLC and you can do whatever you want.

AdrianD
09-26-2015, 01:33 AM
I'm trying to find where in the code the different skills have different values for `chancemodi` (or is it `mod_increase_skill_chance`?).

I've searched the code and can't indentify where the different skill up mod rates are located.

Please point me in the right direction.

Snippet I'm referring to, client.cpp (~2292):
if (skillval < maxskill)
{
// the higher your current skill level, the harder it is
int32 Chance = 10 + chancemodi + ((252 - skillval) / 20);

Chance = (Chance * RuleI(Character, SkillUpModifier) / 100);

Chance = mod_increase_skill_chance(Chance, against_who);

if(Chance < 1)
Chance = 1; // Make it always possible

if(zone->random.Real(0, 99) < Chance)


The categories are somewhat apparent even without logging features enabled.

Initial observations - very low skill levels
- logs shows mod default level of 22% at low skill levels
- initial observations show defense/offense/weapon skills set to a default 22% - 15
- certain skills appear to be set at a default level (22%) - 10 (dodge12)
- certain skills appear to be set at a default level (22%) + 15 (tracking53)
- certain skills appear to be set at a default level (22%) + 10 (taunt73)
- certain skills appear to be set at a default level (22%) + 5 (sneak42, bind wound9, forage27)
- certain skills appear to be set at a default level (22%) + 0 (casting skills)
- certain skills appear to be set at a default level (22%) - 17 (swimming50) although I'm guessing this is set differently - false


EDIT: I searched `CheckIncreaseSkill` and I think I found what I was looking for.

AdrianD
09-26-2015, 03:48 AM
I went ahead and graphed the current skill up rates I am aware of. I graphed a few more equations I may add to the code

I was working within the confines of the graphing program so, the equations would normally be a little cleaner. (plus I haven't had to work with quadratics for 20+ years)

- http://prntscr.com/8klhn0 = current skill rates

- http://prntscr.com/8klhv3 = possible skill rates

* If you look at the graphs, x-axis is skill level and y-axis is % chance

My question is, do you foresee issues when x = 0 or, in this case the skill is 0.

EDIT: with the equation being <-sqrt((x^2)/2x) + 10> or <-sqrt(x/2) +10>

Thanks

EDIT: I tried a different equation which does a better job, imo.
Not as concerned about the equation unless someone can recommend a better one. (just tinkering with it)

<-root(3, 3.75x) +10> negative cube root of 3.75x + 10
* this may also solve any issues with skill = 0 since it intersects exactly at + 10

- http://prntscr.com/8km9zo = possible skill rates2

- http://prntscr.com/8km8lg = apples to apples
EDIT: above is something I would consider

Shendare
09-26-2015, 12:55 PM
I had totally forgotten about this... but I remember SOE explaining years ago -exactly- how skill ups work in EQ Live. I think it was a dev explaining it during an SOE Fanfaire or something.

Every skill in the game has a difficulty number associated with it. They start at 1 for combat skills, and climb up to (IIRC) 15 for things like Beg that are designed to skill up very slowly.

Every skill may or may not have an alternate stat associated with it in addition to the regular INT/WIS for skillup frequency. Archery and backstab had DEX as an alternate stat, for example. Defensive skills often had AGI. Begging I think had CHA. If it doesn't have an alternate stat, it's categorized as just a general skill and is slightly harder to skill up, being given a stat mod of -15.

Most skills also have a situation where the skill check either succeeds or fails. I can't think of how Swimming, for example, would have a succeed/fail check, though.

The factors above work together to end up with the following skillup logic:

StatEffect = AlternateStat ? Max(INT, WIS, ALT) : (Max(INT, WIS) - 15)
SucceedFail = SkillCheckSucceeded ? 1 : 2

Chance1 = StatEffect / Difficulty / SucceedFail

If Roll(100) < Chance1, there's then a second check to make skill increase faster at lower values (100% at 0 skill if you pass Roll 1) and slow down to a minimum of 5% chance as your skill increases up to 190, after which it's just the Skill Difficulty and your Stats that affect skillup rate.

Chance2 = 100 - Min(95, CurrentSkill / 2)

AdrianD
09-26-2015, 01:07 PM
Thanks for further explaining how it works, appreciate it.

I'm not sure what the rates are on live, now. What I have observed on the emu doesn't make a lot of sense to me, though.

If these are current live rates, from what I have observed, what I tested briefly with logsys, what my follow-up searches found and what the graphs verified, it's something I am definitely changing. Absurd to think some skills will never have a skill-up rate below 20%.

I have wanted to do this for quite a while. It's one of the first things I noticed when in game. It seems <client.cpp (~2292)> governs the rate in many circumstances. I will no doubt look into those areas you mentioned Shendare.

starblight
09-26-2015, 07:29 PM
So from what I can tell by the graphs weapon skills start at 10% chance decreasing to 1% chance at skill level 200. Then to get from skill level 200 to 295 you are looking at a 1% chance?

AdrianD
09-26-2015, 07:57 PM
I haven't parsed it and I haven't looked at the other influences that Shendare linked (which probably alter the slope and theoretical x/y intercepts) but, from observations (noticing more or less skillups) and confirming with logging features, what you state is true.

Using the rule_values mod for skilluprate won't have any effect on skills after they reach the x-axis, with the current equation (or any equation, might I add). This varies substantially, as you can see in the graph. Swimming, for example, will never be easy (as it should be?) without scrapping it's coeffcient. Other skills on the higher end will skill up 50+ X faster (with rules set for higher skillups). Doesn't make sense to me.

Rakkoraz05
07-20-2018, 11:25 PM
As for Shendare's resolution, you can also do that in Perl (this would go in your global_player.pl): sub EVENT_LEVEL_UP {
foreach my $skill (0..55, 62, 66, 67, 70..74) {
if($client->CanHaveSkill($skill) && $client->MaxSkill($skill, $client->GetClass(), $ulevel) > $client->GetRawSkill($skill)) {
$client->SetSkill($skill, $client->MaxSkill($skill, $client->GetClass(), $ulevel));
}
}
}

So i added the above to the global_player.pl and it doesn't seem to be working for me. Are there syntax that need to be updated?

Andvari
09-29-2018, 01:49 AM
So i added the above to the global_player.pl and it doesn't seem to be working for me. Are there syntax that need to be updated?

Unless I'm mistaken (I'm new here), EQEmu now prioritizes .lua files over .pl files. So if there is a .lua file of the same name, the .pl file will be ignored.

That being said, here's some lua for you! This is the first piece of lua I've ever written, so it could probably be optimized by somebody that knows what they're doing. But this works to, on each level up 1) maximize [I]all[I] skills, including tradeskills and lockpicking etc., 2) scribe all spells up to current level, and 3) train all disciplines up to current level.

This goes in your server/quests/global/global_player.lua file.

View it on GitHub for some syntax highlighting (https://gist.github.com/ttamnedlog/b5cab19816b9aa92dba875e5020583a5)


function event_level_up(e)

-- All skills except caster specializations
local skills = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
70, 71, 72, 73, 74, 75, 76 };

-- Determine max possible skill and assign it at each level up
for k,v in ipairs(skills) do
local max_skill = e.self:MaxSkill(v);
local raw_skill = e.self:GetRawSkill(v);
local can_have = e.self:CanHaveSkill(v);
if ( max_skill > 0 and raw_skill < max_skill and can_have ) then
e.self:SetSkill(v, max_skill);
end
end

-- Determine if client is a caster and can specialize
if ( e.self:CanHaveSkill(43) ) then

-- Specialization skills
local special = { 43, 44, 45, 46, 47 };
-- Create tables of raw skills and max skills
local raw_skills = {};
local max_skills = {};
for k,v in ipairs(special) do
raw_skills[k] = e.self:GetRawSkill(v);
max_skills[k] = e.self:MaxSkill(v);
end

-- Check each specialization and determine what to do
for k,v in ipairs(special) do
if ( raw_skills[k] == 50 ) then
-- do nothing
elseif ( raw_skills[k] > 50 and raw_skills[k] < max_skills[k] ) then
e.self:SetSkill(v, max_skills[k]);
elseif ( raw_skills[k] < 50 and raw_skills[k] < max_skills[k] ) then
if ( max_skills[k] <= 50 ) then
e.self:SetSkill(v, max_skills[k]);
else
e.self:SetSkill(v, 50);
end
end
end
end

-- Scribe all spells up to current level
eq.scribe_spells(e.self:GetLevel());

-- Train all disciplines up to current level
eq.train_discs(e.self:GetLevel());
end


The conditional checks for caster specialization skills seem to be necessary. At least on the RoF2 client, if you have multiple specializations above 50, all specializations then get reset to 1 as soon as you cast a spell that would trigger a specialization skill-up. Not sure if other clients behave the same way.

The basic idea for the specialization conditionals came from this post. (http://www.eqemulator.org/forums/showpost.php?p=257771&postcount=9) Sadly, I know even less about perl than lua. I did my best to translate c0ncrete's idea.

Uleat
09-29-2018, 06:27 PM
EQEmu [sic] now prioritizes .lua files over .pl files.

That is correct.