#Skill Evolution
1955 messages · Page 2 of 2 (latest)
yeah
it's a pain as soon as you create an UI showing such values, because you have to round it the proper way, which changes depending on which stat or modifier you show

yeah
I might just be dumb or maybe I need to lower my GUI scaling from 1.5, but is there some way to stop larger skill scaling sections from running off my monitor when it's a big skill lower in the list?
Some of these windows are yuge and it'd be cool if I could pin them to my screen.
Very bigly indeed lmao
+1 for this request please 🙏
Regarding the tooltip height, with the mod settings, you can reduce the number of feat lines displayed (set 1 or 2).
Regarding the width, I don't know how to reduce it further, except with a rephrasing, but I already worked on it. Suggestions accepted.
If there is enough room on the screen but the tooltip is still cut, then it's a Stats Window Extender bug.
Regarding the width, I could add a setting to remove the feat details
Yeah. Scrolling it would probably be a dire feat of GUI engineering. Only thing that comes to mind is having it spawn at a fixed location in the opposite upper corner.
Skill Evolution 1.8.1 released!
- Fixed an error that occurred when manually triggering a mercantile skill uses outside of a merchant dialogue
- Slightly increased default gains for armor skills, armorer, and mercantile (requires a reset of the Skill Uses Gains setting section)
- New and more generous formula for weapon skill scaling
- Fixed Skill Uses Gains setting title and description
- Improved the settings doc
Skill Evolution 1.9 released!
- Fixed time bugs when passing time for specific skill uses (thx to @heady rock's approach in Time Flies mod)
- Minimum skill training duration is now 2 hours (vanilla) instead of 0, because rewinding time may cause bugs (we need a new training UI to allow shorter times)
- When the player tries to train a skill capped by a major or minor skill, he will now lose the 2 hours (no more rewind)
Hotfix 1.9.1
- Fixed the code that updates the settings to v1.9 for the training duration (please fix this setting if you ran v1.9)
Sorry 😅
Hello mym, a lot of people are reporting incompatibility with Skill Evolution which breaks Oblivion Style Spellcasting. Is the mistake on my end or you need to add some code to make them work together properly?
[20:32:49.340 I] L@0x1[scripts/ossc/ossc_player.lua]: OSSC: Casting burden (Chance: 100 Roll: 58)
[20:32:49.341 E] L@0x1[scripts/ossc/ossc_player.lua] onUpdate failed. Lua error: [string "scripts/skill-evolution/config/settings.lua"]:302: attempt to index a nil value
[20:32:49.341 E] stack traceback:
[20:32:49.341 E] [string "scripts/skill-evolution/config/settings.lua"]:302: in function 'getSkillUsesKey'
[20:32:49.341 E] [string "scripts/skill-evolution/config/settings.lua"]:367: in function 'getSkillUseGain'
[20:32:49.341 E] [string "scripts/skill-evolution/skills/handlers.lua"]:182: in function <[string "scripts/skill-evolution/skills/handlers.lua"]:180>
[20:32:49.341 E] [string "openmw_aux/util.lua"]:122: in function 'callEventHandlers'
[20:32:49.341 E] [string "scripts/omw/skillhandlers.lua"]:73: in function 'skillUsed'
[20:32:49.341 E] [string "scripts/ossc/ossc_player.lua"]:271: in function <[string "scripts/ossc/ossc_player.lua"]:135>
[20:32:49.341 E] [C]: in ?
Thx, I'll check that
BTW do your new spells should be scaled by SE?
I'd need a cast chance and spell cost
A lot of people are using SE so yeah, check my git if you need any docs help. I’ll expose the cost and chance in the new version of Magicka Expanded API if that’ll help
Very excited for all the new magic stuff we may get this year 
Maybe even today I’ll drop a new spell or two. Don’t want to do offtopic here though, thanks for fast reaction @boreal apex 🙌
The bug is caused by a non vanilla useType, when SE tries to override vanilla skill gains
I think I should just not try to override such gains when the use type is not vanilla
could you provide a link to your git page?
Magicka Expanded framework for OpenMW. Contribute to skrow-42/OpenMW_MagickaExpandedFramework development by creating an account on GitHub.
That should do the trick 😊 If I want to introduce new spell schools with Ralt Skill Extender, does it work with SE?
For OSSC I don’t have repo created yet, will do in a few hrs
I didn't try the new Skill Framework yet. Not sure whether it will be ignored or generate an error.
No problem, we'll see eventually how that'll work ^^
Yeah. I'm in a middle of a playthrough, I don't want to break things while installing new mods 😅
https://github.com/skrow-42/OpenMW_OblivionStyleSpellCasting
Here's git for you to snoop around
@sly rain you don't provide a useType for your new spells:
Would it be possible to have one, with a mapping to use type keys, so SE could track feat stats on these new skills?
I.SkillProgression.skillUsed('enchant', {
skillGain = xpGain,
useType = 'EnchantUse'
}
like this you want?
I.SkillProgression.skillUsed(mgef.school, {
skillGain = xpGain,
useType = 'SpellCast'
}
If yes I can implement it in a moment
useType are numbers
for spell cast success it's 0
I.SkillProgression.SKILL_USE_TYPES.Spellcast_Success
adding useType = 0 (or the full reference) may fix SE's compatibility issue
I'm still adding fail-safe checks to prevent such errors
in the doc, they say you have to provide either a skillGain or a useType, so your code is valid, but adding the useType will increase your mod's compatibility
Sure, adding that right now, thanks
For using an enchant, you can use:
I.SkillProgression.SKILL_USE_TYPES.Enchant_UseMagicItem
-- [SKILL PROGRESS] Reward XP for successful cast
local xpGain = storage.playerSection('SettingsOSSC_General'):get('SkillExperience')
if isItem then
-- Enchanted items grant Enchanting experience
I.SkillProgression.skillUsed('enchant', {
skillGain = xpGain,
useType = 1 -- EnchantUse
})
elseif spell.effects and spell.effects[1] then
-- Normal spells grant School-specific experience
local mgef = core.magic.effects.records[spell.effects[1].id]
if mgef and mgef.school then
I.SkillProgression.skillUsed(mgef.school, {
skillGain = xpGain,
useType = 0 -- SpellCast
})
end
end
else
ui.showMessage("Your spell failed to cast.")
core.sound.playSound3d("spell failure illusion", self)
end
this can be working or?
or it has to be explicitly I.SkillProgression.SKILL_USE_TYPES.Enchant_UseMagicItem and I.SkillProgression.SKILL_USE_TYPES.Spellcast_Success
you can use numbers
I prefer full references, as they are more explicit when reading the code
@boreal apex sorry for the ping.
Have a weird issue, which unfortunately is not the same one skrow was having.
in my #1482416741077356692 . I trigger block and weapon skill gain on parry.
function ParryController.parrySkillGain(self, skillGain)
I.SkillProgression.skillUsed(self.activeParryConfig.secondarySkillId, {
skillGain = skillGain,
useType = I.SkillProgression.SKILL_USE_TYPES.Block_Success,
})
I.SkillProgression.skillUsed(self.activeParryConfig.mainSkillId, {
skillGain = skillGain,
useType = I.SkillProgression.SKILL_USE_TYPES.Weapon_SuccessfulHit,
})
end```
skillGain is declared in advance as "10".
Problem being that with skill evolution installed the skill gain doesn't trigger consistently. Tested with SE disabled and it works properly
What's weirder is that it only triggers in perfect parry path. The only difference between the two being that I add +5 to skillGain in perfect parry path.
A bit stumped. Any idea what it might be?
[22:57:36.886 I] L@0x1[scripts/ngarde/player.lua]: [NGarde]:[STATUS]:skillGain:10
[22:57:36.886 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG: Scale handler: Skill "block", scale nil -> 1.00000, gain 10.000 / 1.000 -> 10.000
[22:57:36.886 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG: Scale handler: Skill "longblade", scale nil -> 1.00000, gain 10.000 / 1.000 -> 10.000
the only thing I see in logs, but the actual skill progression values don't change
And with the latest update it doesn't work on perfect parry either O_o
[23:09:38.780 I] L@0x1[scripts/ngarde/player.lua]: [NGarde]:[STATUS]:skillGain:15
[23:09:38.780 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG: Scale handler: Skill "block", scale nil -> 1.00000, gain 15.000 / 1.000 -> 15.000
[23:09:38.780 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG: Scale handler: Skill "longblade", scale nil -> 1.00000, gain 15.000 / 1.000 -> 15.000
the values are way out of pocket, and are only really that big cause I was testing to see what kind of order of magnitude the skillUsed expects
try:
function ParryController.parrySkillGain(self, skillGain)
I.SkillProgression.skillUsed(self.activeParryConfig.secondarySkillId, {
skillGain = skillGain,
useType = 0,
})
I.SkillProgression.skillUsed(self.activeParryConfig.mainSkillId, {
skillGain = skillGain,
useType = 0,
})
end
For me the whole namings never work, but integers always do the trick
scale nil -> 1.00000
looks like the scale is not reading correctly and fallbacks to 1.00 value
Oh okay then
docs say it's either skillGain or scale
And may contain the following optional parameter:
scale - A numeric value used to scale the skill gain. Ignored if the skillGain parameter is set.
so, way I read it - I don't need to set it
and it'll get ignored cause skillGain value is set anyway
welp, and the same result with scale set, but no skillGain
And that also works with SE disabled
We need mym help here 😄
I mean, I'm looking through SE code already. What trips me up is that originally (before i started screwing with it and updated to latest SE) - it worked with skillGain == 3, but not with 2. Which was the only difference between perfect and weak parry paths
I'm baffled
Maybe some edge case or even engine bug like with attack type 5 bug with Mercy earlier
Hey,
Indeed this is weird, because SE's logs stop at the scale handler.
As you set a custom gain, you should see the skill uses handler log:
log(string.format("Skill used handler: Custom base gain for skill \"%s\" is %.2f (instead of input %.2f and vanilla %.2f)", skillId, gainCustom, params.skillGain, useTypeCfg.vanilla))
then the skill-level-based handler log:
log(string.format("Gain factor handler: Skill \"%s\" level %d, range [%s, %s], scale %.5f x scale %.5f -> %.5f", skillId, level, range[1], range[2], scale, factor, params.scale))
then the final handler log:
log(string.format("Final handler: Skill \"%s\", gain %.5f x scale %.5f -> %.5f", skillId, params.skillGain, params.scale, params.skillGain * params.scale))
the handler chain should only stop on Lua errors or when one of them returns false, which my handlers don't
to know when it stops, maybe you can add logs at the beginning of each of the following handler, just after:
local function skillUsedHandlerCapper(_, skillId, params)local function skillUsedHandlerUses(_, skillId, params)local function skillUsedHandlerExternal(_, skillId, params)local function skillUsedHandlerMagic(_, skillId, params)local function skillUsedHandlerLevelBasedGainScaling(_, skillId, params)local function skillUsedHandlerFinal(state, skillId, params)
When no scale is defined, I set it to 1 (neutral), so my handlers can apply their scaling on it
Weirder than that even, it seems.
I've added a print statement at the beginning of each of those handlers "handlerName-enter:skillId" - for this we want longblade and block cause it was triggered off parry with a rapier.
I see that all handlers were entered, but only minimal messages related to the skill itself
It seems like longblade gets a bit further - it shows the "custom base gain" and "weapon speed" messages. But nothing beyond that, and nothing of the format you've specified above
you can see, at the same time I got unarmored gain, cause it was a weak parry and I took some damage, and that seems to have gone through properly, but that's not something I trigger
I may have something. I've printed off the params as well, and for block - skillGain switches from 2( base value that I set on invoke) to 0 at some point. Let me read through the logs carefully
So, this is weird. And I can't really find where and why it would set use to zero:
I've put in some debug logs, but no dice so far
[10:10:46.485 I] .../player.lua]: skillUsedHandlerCapper-enter:block
[10:10:46.485 I] .../player.lua]: skillGain:3
[10:10:46.486 I] .../player.lua]: scale:1
[10:10:46.486 I] .../player.lua]: useType:0
[10:10:46.486 I] .../player.lua]: skillUsedHandlerUses-enter:block
[10:10:46.486 I] .../player.lua]: skillGain:3
[10:10:46.486 I] .../player.lua]: scale:1
[10:10:46.486 I] .../player.lua]: useType:0
[10:10:46.486 I] .../player.lua]: useTypeCfg.settingKey:skillUse-block-Success
[10:10:46.486 I] .../player.lua]: useTypeCfg.vanilla:2.5
[10:10:46.486 I] .../player.lua]: gainCustom:2.5
[10:10:46.486 I] .../player.lua]: checking areFloatEqual:2.5 and 2.5:
[10:10:46.486 I] .../player.lua]: 2.5 and 2.5 are equal:true
[10:10:46.486 I] .../player.lua]: checking areFloatEqual:3 and 0.123:
[10:10:46.486 I] .../player.lua]: 3 and 0.123 are equal:false
[10:10:46.486 I] .../player.lua]: block is not a weapon
[10:10:46.486 I] .../player.lua]: skillUsedHandlerMagic-enter:block
[10:10:46.486 I] .../player.lua]: skillGain:0
[10:10:46.486 I] .../player.lua]: scale:1
[10:10:46.486 I] .../player.lua]: useType:0
[10:10:46.486 I] .../player.lua]: skillUsedHandlerLevelBasedGainScaling-enter:block
[10:10:46.486 I] .../player.lua]: skillGain:0
[10:10:46.486 I] .../player.lua]: scale:1
[10:10:46.486 I] .../player.lua]: useType:0
[10:10:46.486 I] .../player.lua]: skillUsedHandlerExternal-enter:block
[10:10:46.486 I] .../player.lua]: skillGain:0
[10:10:46.486 I] .../player.lua]: scale:1
[10:10:46.486 I] .../player.lua]: useType:0
[10:10:46.486 I] .../player.lua]: skillUsedHandlerFinal-enter:block
[10:10:46.486 I] .../player.lua]: skillGain:0
[10:10:46.486 I] .../player.lua]: scale:1
[10:10:46.486 I] .../player.lua]: useType:0```
for block^
@boreal apex , when you have time, any ideas?
Could you check whether you have external handlers?
Add a log in the loop of the skillUsedHandlerExternal function
did you set the skill-level-based scaling setting to "100 to 100"?
Otherwise the skillUsedHandlerLevelBasedGainScaling function should log something, except if the skillGain is already 0 at this point
Skill Level based Scaling is 125-25. Iirc that is the default
let me check for external handlers
no, it looks like for _, handler in ipairs(externalSkillUsedHandlers) do loop is never entered
Yeah, it looks like flips to 0 some time after skillUsedHandlerUses, and I can't tell where. Not inside it, it seems, as I peppered it with print statements, but I can't tell where and how
Oh
Yeah, I've found it
@boreal apex in scripts/skill-evolution/skills/scaling.lua in skillUsedHandler you set skillGain to 0 for block, armor and weapon skills:
elseif mCore.weaponSkills[skillId] then
if not mS.isSkillScalingEnabled("weaponSkillScaling") then return end
state.scaled.weapon = {
handlerParams = { skillGain = params.skillGain, scale = params.scale, useType = params.useType },
skillId = skillId,
}
-- will be handled on hit
params.skillGain = 0
return
elseif mCore.armorSkills[skillId] then
if not mS.isSkillScalingEnabled("armorSkillScaling") then return end
state.scaled.armor = {
handlerParams = { skillGain = params.skillGain, scale = params.scale, useType = params.useType },
skillId = skillId,
}
-- will be handle on hit
params.skillGain = 0
return
elseif skillId == Skills.block.id then
if not mS.isSkillScalingEnabled("blockSkillScaling") then return end
state.scaled.block = {
handlerParams = { skillGain = params.skillGain, scale = params.scale, useType = params.useType },
time = core.getSimulationTime(),
attacker = nil,
}
-- will be handle on hit
params.skillGain = 0
return
Problem is - I'm sending this from onHit, so "will be handled on hit" never happens
I see this in your docs:
Mods that alter the player physical damage dealt by enemies should be loaded after Skill Evolution so their handler is loaded before Skill Evolution's, and this mod get the final damage value.
Another way is to use Skill Evolution's AddOnHitHandler interface to add such handlers and be sure they will be called at the right time.
Add your handler in a player script, from both the onInit and onLoad engine handlers, not from the global scope, to be sure Skill Evolution's interface is ready.
But NGarde is loaded way after Skill Evolution. I'll try and add an SE on hit handler though
Ah! Nice catch. Why did I forget that....
Yeah, not sure it will still work right.
did
local onHitHandler = function (attack)
attack = parryController:onHitHandler(attack)
end
local addOnHitHandler = nil
if I.SkillEvolution and I.SkillEvolution.AddOnHitHandler then
I.SkillEvolution.AddOnHitHandler(onHitHandler)
else
I.Combat.addOnHitHandler(onHitHandler)
end
in my player script - still no skill gain
trying to retest now
And, do I understand right that it "should" have worked right even before that, if my mod is loaded significantly later than yours?
That's one thing I'm not 100% clear on - the order in which handlers resolved as they are added
I.SkillEvolution.AddOnHitHandler is only useful if you alter the damage, it's not related to the skill gain
I do alter the damage, set it to 0, or reduce it
it's a parry mod after all
but I trigger block use on weapon parry
however I.SkillProgression.addSkillLevelUpHandler may be the solution, because handlers added this way will be called properly once the onHit happens, with the proper gain values
then we need to use both SE functions
loading your mod after SE won't work for onHit handlers, because SE adds them when the player is active, not in onLoad, nor in the script body
except if you add your handler in onActive, and load your mod after SE
for the skill use handlers, there is no other way than using the SE function to add your handlers (when SE is detected), because of the delayed skill gain
for skill scaling, I could not find another way to handle compatibility
[12:37:33.999 I] L@0x1[scripts/ngarde/player.lua]: [NGarde]:[STATUS]:registering regular onHitHandler
It's not finding the interface.
weird
don't add your handlers from the script root
do it in onInit and onLoad
otherwise the compatibility will be load order dependent
For this one - I'm not sure I understand.
I don't really have a "skilUsed" handler, I just trigger a skill use - hoping that existing handlers will deal with it.
Do you mean i need to
a) trigger use,
b) also register a handler to get the info to SE ?
that actually makes sense. Let me change that
ah sorry. Then it should work without using I.SkillProgression.addSkillLevelUpHandler
yeah
I'll try manually
let me see if just properly registering SE onHit does it
L@0x1[scripts/ngarde/player.lua]: [NGarde]:[STATUS]:registering regular onHitHandler
this is from onLoad. Not sure why it doesn't see I.SkillEvolution
hmm
ok, now I understand the issue
for delayed scaled skill gains, SE expects to get a onHit event to process the gain, but it never happens
ok, nvm that
[12:46:39.553 I] L@0x1[scripts/ngarde/player.lua]: [NGarde]:[STATUS]:registering SE onHitHandler
just a typo in the readme, you hadAddOnHitHandlerinstead ofaddOnHitHandler.
damn, thx
Right, so looks like with my onHit registered as SE onHit it works
let me test both damage paths
interface functions used to use a capitalized first letter with NCGDMW, I missed that update
ah ffs
back to square one
works on perfect parry (damage reduced to 0)
doesn't work on weak parry - damage reduced but not to 0
lmao
And doesn't work on longblade, but only on block O_o
wat
I don't know how to handle this issue
both use onHit
scaling here depends on the actor you hit, but if nobody is hit, then nothing happens
oh I see, if health and fatigue are set to 0, SE thinks the player blocked the attack, but as no block info is provided, then nothing happens
I can fix it
but..
it's the opposite
I only gain skill on perfect parry
and only block.
I assume longblade gain doesn't trigger because actor didn't hit anyone, but instead used weapon to defend
(iirc I set it to public, let me know if it's not)
lines 981 down
I get a 404 error, not public 🙂
dammit
here
So top level - this is part of the onHit handler, if parry is "perfect" I set attack.damage.health and fatigue to 0. If not I set health to health * defenceMultiplier (0-1) and assign the rest to attack.damage.fatigue.
in perfect parry path I do skillGain+=1. in normal it remains unchanged from what is declared earlier
I don't know what other parts of attackInfo you may be relying on though
Right, so looking at debug logs.
It seems you prevent block skill gain if damage is not 0, which is expected vanilla behaviour.
And you prevent weapon skill gain if damage is 0 (or nil). Which again, sorta makes sense, but I don't think engine does that in either case
So how do I fake these values so that SE recognizes skill gains on parry, while still maintaining the mechainc. I wonder🤔
yeah good question
Also not sure - do you even need those checks?
Or were they added to fix something? Cause with SE disabled - it doesn't seem like OpenMW itself guards against these cases
I use the onHit handler on the player to handle both the armor and block skills. I rely on the damage to know whether it's a block or not.
But I could rely on the block skill use trigger only I suppose
the damage and fatigue checks may be optional
Right, cause on my end, at least for block, the only way I see is to set attack.damage.health = 0 always, and jut edit health/fatigue directly. But that'll break so much other stuff
for weapon I assume it's the same assumption but reversed - no damage, hence attack missed, hence no skill gain
I think your approach makes sense and SE has to be more permissive
Also, I'll need to test, but base game iirc - weapon skill gain still applies if player attack was blocked, doesn't it?
Let me know if you apply any updates, or have any ideas on what I can do on my end. Thank you for troubleshooting with me
I think so
Yeah, I need to understand your workflow first
I'm happy to answer any questions. But let me actually set that repo so it's visible
maybe can you summarize me the steps you do for action?
Right,
So on hit for player.
- We enter onHit handler,
- if player has something useable to defend with -and is in parry stance -> enter parry handler
- declare skillGain = 2
- check if perfectParry timer is active
- if true: set
attack.damage.healthandattack.damage.fatigueto 0 - if false: reduce
attack.damage.healthby skill defined ratio, set.attack.damage.fatigueto what remains ofattack.damage.health
- if true: set
- trigger block and weapon skill gain ( or block twice if it was a shield)
no return false or anything at any point, just return the modified attack back to top level handler itself
My main issue here is to know whether the skill used trigger comes from vanilla mechanics or is manually triggered by a mod
- vanilla
- a weapon used is supposed to hit an enemy, which gives me stats to scale the skill
- a block used is supposed to be hit by an enemy, wich also gives stats
- manual trigger: No stat, I'm waiting for an onHit trigger that never comes
I mean. You can add an event we can send to SE?
the params argument doesn't tell about the trigger source
I'm trying to support mods without explicit compatibility code
yeah, that's fair
but right now - any mod that will trigger that "use" manually - will just not work
well the skill gain won't
one way would be to add a field like "manual = true" to the params argument when you trigger the skill used, which would tell SE to skip the scaling part
yeah
yeah but I would prefer a way that works with any mod
I mean - registering onHits through SE interface is already kind of "explicit compatibility"
definitely doesn't feel implicit
maybe I could add a delay: After like 0.5 seconds, if there is no onHit trigger, then I just continue with the handler chain
that's only if you want to include the changed damage to the scaling formulas
I dunno actually. In my current version, with latest SE from nexus - the skill gain of perfect parry for block didn't trigger until I did that
Which it worked on previous version I had installed - so not 100% clear what changed between the two, or if it was my screw up.
But it was
- Only perfect parry gives skill
- Update SE - nothing does
- Add onHits - same behaviour as 1
"nothing" in the context of my parries, ofc
hmmm in the last changes I prevent errors when a skill used is triggered without providing the useType
I saw the conversation with Skrow yeah. But I was providing useType right away.
weird
maybe I'll need your code to test it locally
or maybe a manual trigger from the console will be enough?
feel free to pull a copy from gitlab, or grab the latest archive from the thread #1482416741077356692 message
Actually - also re-enabled more animations that prevent parry
gitlab is a bit ahead of that version, too, the zip doesn't have the special addOnHitHandlers yet
I also don't currently have debug log switch in settings too, but you can find instances of "setLogLevel" and change OFF in them to DEBUG
So when the player blocks an attack and the code enters the onHit handler, you'll trigger one or two more block gains, resulting in 2 or 3 gains?
also, when the player doesn't block the hit, and the parry is active, you reduce (or cancel) the damage, which will reduce (or cancel) the armor skill gain because of SE's scaling being based on incoming damage, but I suppose it's coherent as the player did the parry
another thing: When the player blocks the attack but also does a non-perfect parry, will he have health and/or fatigue damage?
yes
that I can answer
because I've been playtesting the mod
partial dmg
as there is no armor skill gain when the player blocks an attack, then SE currently won't convert such a damage into armor skill gain
maybe it's the parry mod's responsibility to add such a gain
for coherence, there should be some gain for something in case of a weak parry, that's for sure
when the player blocks, parry already provides 2 gains for the block skill, even with a weak parry
but no gain for armor
I definitely noticed the Block bug
with the non-gitlab version
my Block skill is not advancing with SE
well, that's for @ember cloud to decide. I guess that with Vanilla unscaled levelling, it could be too much to get armor gain (for randomly chosen equipment slot) and weapon skill/block skill gain at the same time in case of a weak parry. With SE it would be less of a problem because you would get less gain because of scaling (lower damage).
Native game block is fully disabled via GMST
I think I found a proper way to fix the issues, @ember cloud please try this version
So, far as I can tell armor gain still happens on a "weak" parry, at least with SE installed
looking at debug logs - I see "unarmored" handers entered and applied correctly
On parry I trigger either weapon+block skill, or block skill twice if shield was used for active block
Give me a few, will check now
yeah but I mean that vanilla already triggered a block gain before the onHit event, which adds to the gains you add
Since I've added ability to "active block" to NPCs, - I've just disabled native block all together in an omwaddon
perfect
now, when a weapon/armor/block skill used is triggered, if there is no player/actor onHit event withing 0.1 seconds, then I skip the scaling and continue with other handlers
Perfect. Both weak and perfect parry properly apply skill gain to both main and secondary skills
And you can see, medium armor, block, longblade and unarmored all triggered on a weak parry
Thank you so much!

SE is improving thx to such feedback
And the rest of us and our mods are better off for it
I may soon add Ngarde to my main save, then. Hard to go back to Vanilla!
^ that's what I want to hear 
Note that the skill-level-based and weapon speed scalings are still applied when you manually trigger skill uses
But that's expected as it determines global pacing
Nah, that's fine. I'm not rightly sure what it will grab as "weapon speed" when I use a weapon to parry, but it does grab something
So I'm fine with it just doing its thing
I'm not even sure whether weapon speed matters in modern SE or whether it's just hit chance
There were revisions along the way...
modern SE? Hit chance?
SE scales weapon gains based on there speed:
-- Examples with gain 0.75:
-- - speed 1.0 -> gain 0.75
-- - speed 1.5 -> gain 0.61
-- - speed 2.0 -> gain 0.53
-- - speed 2.5 -> gain 0.47
DEBUG: Skill uses handler: "longblade", weapon speed 1.55, scale 1.00000 x factor 0.80322 -> 0.80322
Does seem to do try and do something, not sure if it actually gets applied that 0.80322 -> 0.80322 is a bit odd for that log line
The handlers update the scale parameter, the last handler applies that scale on the gain.
Here your weapon is pretty fast, which reduces the scale
Got it
I'm definitely getting Block exp after the latest update. One thing I noticed, though, is that they blocks often aren't registered as feats when using Stat Window Extender.
Hmmm. That may be on my end - but I don't know what they need to be to get registered
they are getting registered sometimes
I'm wondering whether it's just perfect parries
as there is 0 dmg then
and maybe the game registers that as vanilla-like block
but I'm spitballing here
if that's the case, then it can be considered a feature 
Oh, that's possible yeah
SE though, not the game
SE doesn't scale n'guarde manual skill used triggers (block and weapon), because they are out of context, they happen after the hit, their gain is set by n'guarde. No feats in such a case
Makes sense
It could be possible if n'guarde would use a scale instead of an absolute gain value, and if it would inform SE to interpret that scale as a skill scaling (extra arbitrary param)
BTW I think a scale has advantages over an absolute gain, because it adapts to any custom base gain
But you don't listen to that param at the moment, right?
Yeah, I could/should change it to scale
There is no such param currently
roger that
I do use the incoming scale, because vanilla set it
But I don't interpret it as a skill scaling, in the sense of SE
It's confusing because there is a vanilla scaling (scale field), then SE has multiple scaling features
right
Well, for now, at least, I'm pretty happy the two just work alongside without either breaking
so anything more - is really not necessary
yeah
I'm not clear though on what to set it to
naive answer seems to be 1 for weak and e.g. 1.5 for perfect parry
but I have no context of what it means
A good parry could use a scale of 2 (twice the gain), while a weak parry could be proportional to the timing, between 1 and 2
or proportional to the parry defence factor... hmmm
that would give me an easy 2 - factor to go between 1 and 2
I'll think about it
will definitely change to it, but will ponder the values
I'm not familiar with the mod, what's the defence factor?
skill level based percentage of the damage that would be negated on "weak" parry
Indeed. However, I treat it all as elements of a larger whole. Ideally, everything works cleanly with each other. In fact, since I expect that it's impossible to combine changes to skill descriptions made in more than 1 mod without a patch, I'm already considering a mini submod for NCG and N'Garde which will keep all the info from NCG's changed descriptions (skill X contributes to growth of STR, END, AGI etc.) and also include all the relevant changes related to N'Garde, e.g. proper info about Block affecting both ranged and melee attacks and not always protecting from all damage 
Oh yeah, I didn't even think about skill descriptions being not true anymore lmao
So it doesn't depend on the player action. I like when the gain is dynamic, based on the the current performance
I can add another timer after perfect parry ends - and the further away from it we are when attack hits - the lower the gain
Yeah, but I think Mym means that scaling skill gain with skill level is silly
so timing is better
(which just means that my local timers class was a worthwhile time investment)
The damage reduction could also be partially based on the timing
Now I realize I already use the vanilla scale field with mercantile to make it a feat (SE does no scaling for this skill). It would then be easy to generalize the approach
That's an interesting idea
yeah
Not sure I want to mess with that formula more though
Welp, I did it. And scale instead of flat gain 😅 I can't not fiddle :P
Now I can adapt SE to add a feat. However feats are best with stats. Maybe you could add a stats field, with key metrics used to compute your scale
Like { scale = 1.5, stats = { timing= 0.75, skill= 43 }}
With readable stat keys as they will be displayed in skill tooltips
You can even have spaces in keys: ["Defence Factor"] = 0.75
Hmmmm. In an inverse (1-x) of defence factor probably? Or just total "damage negated"? The latter would make more sense and would cover both perfect parry and "weak" parry. Can't really think of anything else that is easily described with a number that would make sense
For the feats - what kind of number do you expect? Based on what you've posted above it seems like it would be between 1 and 0
Block feats ATM use raw damage avoided
yeah, not sure if damage as it shows up in onHit is before or after AR... Hmmm
I do not apply AR, but I also don't interrupt the handler chain, so it can be applied above or below
Mym, lemme know if this works:
skillUsed(self.activeParryConfig.mainSkillId, {
scale = scale,
useType = SKILL_USE_TYPES.Weapon_SuccessfulHit,
stats = {
damage_negated = damageNegated, -- raw damage number
skill = self.currentStats[self.activeParryConfig.mainSkillId].value, -- current skill level
timing = timing -- value between 1 and 0, depending on how close to perfect the parry was. 1 is best
}
})```
just values understandable by players. Internally, for percent, as I know they are percent I can add a % sign after the value. However, for contributed stats, I'm not sure how to handle it
Ah
How about
stats = {
damage_negated = { value = damageNegated, interpretation = "raw" }, -- raw damage number
skill = self.currentStats[self.activeParryConfig.secondarySkillId].value, -- current skill level
timing = { value = timing * 100, interpretation = "percent" } -- value between 1 and 0, depending on how close to perfect the parry was. 1 is best
}
Or annoying on your end?
I would use readable keys instead, and we may need a unit info:
skillUsed(self.activeParryConfig.mainSkillId, {
scale = scale,
useType = SKILL_USE_TYPES.Weapon_SuccessfulHit,
stats = {
["Damage Negated"] = { value = damageNegated, unit = "HP" }, -- raw damage number
Skill = [ value = self.currentStats[self.activeParryConfig.mainSkillId].value }, -- current skill level
Timing = { value = timing, unit = "%" } -- value between 100 and 0, depending on how close to perfect the parry was. 100 is best
}
})```
right, so unit instead of a vague "interpret this as" string. Yeah, can do that
oh, even better
but you'd need to parse it then, won't you?
to compare feat a to feat b
I compare using the scale
ah
not the stat info
then I should adjust the scale based on all the info
otherwise feat won't make sense
Right. So I'll then modify scale by both timing and percent of damage negated, and provide raw values with units in stats
Actually, maybe even raw negated damage /100 or something. So that a 100HP attack parried is worth more than a 3hp attack
And done. Love me some interop and compatibility
Mym, a question. I've been looking at the way NCG/SE does tooltip integration with Stats Window Extender - thinking of updating the skill description to block like Cybvep suggest.
Am I reading it right that it's not really possible without overriding the tooltip builder? Or am I missing something?
I did override the builder, but I don't know whether there is another way
we would need another way to not override our changes on the same tooltip
Yeah, I was looking at what's going on in StatsExtender API and don't see a way to just poke the description either
Well, it was just a "nice to have " anyway
Ralt's would certainly improve on that, IF he was available
He is somewhere - he did post that projection spell video to youtube a few days back. Not here though 
yeah I saw that impressive spell
could you replace this SE file and try your new feats?
what may be missing is a way to define a unique ID for the feat. I use such IDs to filter feats based on specific contexts, like when fighting with the same enemy, I don't want many feats weapon feats from this enemy, I only keep the best one
because with a very strong enemy, you may get all your long blade feats talking about him
I use:
- spell ID for magic scaling
- enemy record ID for weapons, armors and block
- merchant record ID for mercantile
- container record ID for security and locks
- container record ID and spell ID for security and traps
- ingredient record ID list for alchemy
in your case, there is an enemy, which record id could be used for that
maybe a convention could be to add an "id" field to the stats map, which I could use
also, you could add the enemy name as a stat
That would make sense yeah, since I'm parrying someone. Let me try this
hmmm, we may have an order issue: Curently the stats are a map (unordered) so the order will be random
Well, got something.
Bumped the enemie's strength so that it'c clearly visible what the attack was
Doesn't register on weak parry though, I don't think. Hmmm
these entries are from SE, right?
I tested locally with things like:
I.SkillProgression.skillUsed("lightarmor", {scale=3.5, useType=0, stats={Factor="350%", Heatlh="30"}})
yeah that's 100% SE
that works
hmm, let me see if I send it correctly
Ah, that was my bad
however - you just expect a string, I see
let me change it on my end
Beautiful
I may need to tune down the gain values a bit though
However, for that much damage it may be fair
but 200 for a 1hp perfect parry - not sold
and maybe a round on the values 😄
is the stats order constant for you?
it may change each time you open the tooltip
yeah, same order I've added them to the table I send
Doesn't change fror me at all, even if I close/reopen the menu
Doesn't chage on reload either
If it does change, I'll let you know. But so far yeah - same order I wrote it in. damage, skill, timing
Aren't they both tables in lua?
like:
{
{ name = "Damage Negated", value = "83 HP" },
{ name = "Skill", value = "53" },
}
lists can be enumerated in their original order
for maps, there is no guarantee
I had this issue many times in my mods
both answer "table" with type(myList)
but internally they are different
and they can be boths, like spell records in core.magic 🙂
Interesting - never ran into that
reading the lua docs told me that a table is a table is a table, except when it's a userdata
try to use pair or ipair for loops on the wrong table and you'll see
pair -> maps
ipair -> lists
ah
right, yeah. Got it. Can't do ipairs on an key:value table, can do pairs on both, but pairs doesn't guarantee the order
well, at least so far - order has been preserved, as I send it
One thing. Do I need to pass the skill level for you to do anything with?
Cause it doesn't make much sense the way it is displayed now. "Feats all time" display skill level anyway, and "recent" and "current level" probably don't need it
Excellent, I've only added it, cause it was in your example here. Looks great so far
My best suggestion to preserve the stats order and allow a unique identifier is:
scale = 1.5,
useType = 0,
statsId = "actor/spell/..._record_id", -- optional
stats = {
{ name = "Damage Negated", value = "83 HP" },
{ name = "Timing", value = "100%" },
}
#1482416741077356692 message @boreal apex why SE caps are not respected? Why 487%?
Does the version of scaling.lua that you sent me support this?
Because the caps are currently applied during the gain scale computation, but with n'guarde the scale is provided
nope
but if you agree on this new contract I can implement it
Then there should be a way to respect caps for consistency IMO
🤝 Yeah, that works
If max scaling is set to X% in mod options, they shouldn't be exceeded here. Basically, cap check unless the modder use sth to ignore it on purpose.
There will be more LUA mods which do things with skills. This is good testing ground 😄
I wasn't even aware there's a cap, we wouldn't even seen it if I didn't send it with 1000 strengh guard
Well, I got capped 400% Block skill gains with SE so it's possible 😉 . Good that you used inflated values, though. I do such things often as well to test whether sth works.
very much why
also was testing roundTo helper function that is conspicuosly absent from both base lua and opnemw.util
Now, imma get back to the bloody raycasting
Here is a new version supporting the new contract.
Previous feats recorded with the previous temp version may generate weird layouts.
doc details:
Mods that manually trigger a skill used can provide stats to record the gain as a feat (visible in skill tooltips).
To make it work, the options argument needs:
- A
scalevalue (vanilla param) that will define the feat percent - A
statslist, with items matching{ name = string, value = string } - Optionally, if a
statsIdis provided, then only one feat per ID value will be recorded
Example:
I.SkillProgression.skillUsed("spear", {
useType = 0,
scale = 1.5,
stats = {
{ name = "Damage Negated", value = "83 HP" },
{ name = "Timing", value = "100%" },
},
statsId = "arrille"
})
@mild lantern also, the gain caps are applied
Excellent, thank you. Give me a few to modify my code and test
Also, was meaning to ask? Why do you fomod-pack it?
(or at least do the 00-core thing, withot the actual fomod file)
right, it's bain, blanked on that
I'll probably off my laptop for 10 days, please tell me if the last version works for you so I can publish it
do you use a statsId?
the enemy name is missing
but be careful with the total line lengths!
I think that you don't have to type Parry two times. Once before Damage Negated and then with Parried With
Yeah, I didn't send a stats Id, or the enemy, and the stat names are placeholder
statsId is just to improve the feat diversity
So it doesn't show up the same thing 5 times yeah
probably better to display an enemy than the weapon/shield
enemy yes, But I want to display actual weapon name e.g. "silver saber" or "steel shield" so it's easier to understand where it came from
will play around with it
ok, so maybe skip "Parried With" and "Parry". That will save some room.
I mean, it's not that we don't know what's happening there. It's not dancing


Yeah, and with vanilla block disabled - makes sense
but on weapon skills - want to be able to tell it apart from attacks
I'll figure it out, for now - the main thing is htat it works and w can let Mym publish and do his thing
^me avoiding making UI
Btw. is it one feat per ID per skill, or one feat per ID globally?
Excellent, thank you
hmmm
[17:24:13.188 E] Unrecognized argument type for key "Parry Damage Negated" when formatting message "featWeapon"
[17:24:13.188 E] Unrecognized argument type for key "Skill" when formatting message "featWeapon"
[17:24:13.189 E] Unrecognized argument type for key "Timing" when formatting message "featWeapon"
[17:24:13.189 E] Unrecognized argument type for key "Skill" when formatting message "featWeapon"
[17:56:48.419 E] Unrecognized argument type for key "Parry Damage Negated" when formatting message "featWeapon"
[17:56:48.419 E] Unrecognized argument type for key "Skill" when formatting message "featWeapon"
[17:56:48.419 E] Unrecognized argument type for key "Timing" when formatting message "featWeapon"
[17:56:48.419 E] Unrecognized argument type for key "Skill" when formatting message "featWeapon"
Should've looked at logs
doesn't break, but spams a bit
Ah, that must be the feats recorded with the previous beta version
ah, makes sense
Mym! I've got a bone to pick. Devs told me that's the only correct way to add handlers. So that ordering is preserved (last scripts handler is resolved first). Why do you think otherwise?
I meant that if you need to access another mod's interface for some init code, you'd better do it in onInit and onLoad to be sure its interface is already loaded
Yeah, not for handlers though, I don't think. Just the load order should be enoguh for that.
But got it
Would be cool if we could set "dependencies" for omwscript files
Handlers can be added at different places, anf the location and load order both impact the application order
Right, am aware now :D
Load order will be impacted if both mods add the handler in the same part of the script, like root, onInit/onLoad, on player active....
If the mods add the handlers at different parts, then the load order may not have the expected result
Yeah, which is why I've been told:
If we could police this - we would
by the devs
Cause adding handlers every which place will invariably be weird
Police how?
Mads meant "if we could enforce only registering handlers in script body - we would"
Ah
First I did that, but then I had issues with compatibility, or things not yet ready
Yeah, I think their idea is that should only ever be managed by load order
Which would make sense if there was an easier way to enforce dependencies and ordering for pure lua mods
and does make sense anyway, but can be tricky sometimes
There are situations where you'd want some handlers loaded before a specific mod, and other handlers loaded after it.
Load order is too restrictive I think
Our mods is the perfect example: we want your skill handlers to be executed after mines, but the on hit handlers executed before....
Ah, right 😅
As I said - I can imagine that happening, but then imo one of the mods should be split because it's doing something it shouldn't
Anyway, thanks again for all the help :P. I think I need a tea and a break from the screen
You're welcome. I don't get many modders working on compatibility with my mods like you did. I'm eager to test your mod BTW, great concept
Recent versions are mostly stable, so feel free when you have time and inspiration. There are a couple things I need to work on still however
Question: everytime I start a new game I have to enable the settings in skill evolution to allow skill increases from books. Is there a way to change the data files to have this setting enabled automatically on my end?
This may be because of the MOMW gameplay mod, as this setting is disabled for the lists
Hey mym, I was wondering if you’d consider factoring the Base Modifier from abilities into the Skill Cap. So, I reduced the Skill Cap to 100 in the settings to replicate vanilla behaviour, and I made two separate characters. With the first character, I chose the Lover birthsign which, using Birthsigns RESPECted, fortifies Acrobatics 15pts and with the second, I chose the Shadow which shares the same fortify Agility 15pts as the Lover but has no fortify skill effect. I then proceeded to only raise the acrobatics skill of both characters to 100 and captured the resultant level and attributes of each:
As you can see, the first character has reduced level and attribute values compared to the second despite both achieving the Skill Cap of 100 for Acrobatics. Also, on https://en.uesp.net/wiki/Morrowind:Skills I saw that the formula for the required skill gain to raise a skill includes the current skill value. Do you know if the Base Modifier is factored into the Skill Requirement? If so, you have the double whammy of constant fortify skill effects not only hamstringing potential character growth, but also skill progress, making what should be a positive into a negative.
There are 27 skills in Morrowind, each of which determines how well you can perform various tasks. Each skill is governed by an attribute; there are three to five skills governed by each attribute (except Luck). Each class has five major skills, five minor skills, and seventeen miscellaneous skills. Each time your character increases any combina...
Hey, I think it's easy to do. I don't recall why I excluded base modifiers from the caps. Maybe because chargen choices matter: you select a permanent fortification, then you should benefit from it to the end.
But, well, a cap is a cap
Idk, considering that only skillups contribute to level and attribute progress, having a positive Base Modifier "eat up" some of those potential skillups without simultaneously raising the Skill Cap makes constant fortify skill effects seem like strictly a negative. It would be interesting if they had the side benefit of raising the maximum effective skill level, so in the aforementioned example the first character could achieve a mighty Acrobatics of 115 while the second would be bound to the measly 100.
Also, say you raised Sneak, Athletics, Acrobatics, Hand-to-hand, Unarmored, Mysticism, Illusion, and Destruction to 100 as part of your class skills and then became a vampire mid-playthrough, with NCG/SE and the way Skill Caps work, wouldn't you massively hemorrhage attributes and player level?
NCG and SE seem to work differently.
NCG allows attribute base modifiers to go above the caps while SE doesn't for the skills.
I'll allow it in SE
Yes, the skill progression requirement is based on the current base value, including base modifiers
Excluding base modifiers would ease skill progression in addition to the higher skill. Not sure it would be balanced
Skill Evolution 2.0 released!
- Support custom skills added through the Skill Framework mod
- Skill fortifications on base modifiers (abilities) are now excluded from cappers
- Optimized the setting management for better performances, stability and maintainability
- Multiple settings will be reset to their default value, check the setting page
- Fixed 0 mercantile gain set by the engine when the player's offer is too close to the merchant's
- Fixed best feats wrongly replaced by less good ones, for feats using unique ids (e.g. potions created with the same recipe)
- Fixed wrong health ratio (doubled) in acrobatic fall feats
- Can be installed or updated mid-game
Hey mym, I noticed on the mod page and in the docs that you write "I.SkillEvolution.AddSkillUsedHandler" when it should be "I.SkillEvolution.addSkillUsedHandler", just wanted to let you know
Thx, I'll fix that
[23:55:03.492 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Level-based handler: skill "restoration" level 179, range [125, 25], scale 20.20000 x factor 0.09047 -> 1.82754
[23:55:03.492 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Final handler: skill "restoration", gain 0.75000 x scale 1.82754 -> 1.37065
[23:55:03.492 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill restoration gain 1.371 (requirement 135.000), progress 0.99393 -> 1.00408, excess 0.551
[23:55:03.525 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill "restoration" has changed from 122 to 123
[23:55:03.525 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill restoration gain 0.551 (requirement 135.750), progress 0.00000 -> 0.00406, excess 0.000```
not sure what's going on but it looks like new versions (2.0.1 and 2.0) aren't communicating skill ups to newest version of ncg, downgrading skill evolution to version 1.9.9 fixed the issue
[00:02:51.126 E] [C]: in ?
[00:02:51.142 E] L@0x1[scripts/skill-evolution/player.lua] onUpdate failed. Lua error: [string "scripts/skill-evolution/util/helpers.lua"]:166: attempt to index local 'vector' (a nil value)
[00:02:51.142 E] stack traceback:
[00:02:51.142 E] [string "scripts/skill-evolution/util/helpers.lua"]:166: in function 'v3xy'
[00:02:51.142 E] [string "scripts/skill-evolution/util/helpers.lua"]:170: in function 'groundDist'```
white line only appears when the errors are going
though could be my own error knowing how ive been fkn up my installs as of late 🚬
Also mym, would you mind adding an interface function for setting the skill max value? Decay is probably the hardest feature to wrangle for compatibility.
or rather, ncg is communicating with skill evolution, for some reason it's not pushing the skill up notification, which eventually causes this:
it does however catch custom skill level ups and posts notifications for those
Since NCGDMW has been split into NCG and SE, there is no direct communication between the 2 mods. SE just trigger natural increases, which are caught by NCG.
Your log seems fine, I'm not sure to understand your issue.
That one is weird. The script which updates the saved data should handle it. It should be harmless though and not happen again. Could you confirm?
I'm not familiar with your UI, what should I see?
if you look in the top left corner, you'll see in parentheses the progress of the skill (-9.65)
or 9.6 skill levels negative
does this mean that the progression has been reduced by 9.6 or does it have a negative progression?
On a full reload? Happened again but when I’m up in a bit I’ll poke around with it
it's almost like it's an overflow, hang on ill send a video
it should be fixed after a save/load
maybe send me a game save?
Thx! Your restoration suddenly goes from 184 to 169 then 170 😯 , and also your athletics from 218 to 203!!
Do you have mods that dynamically alter your skills?
actually now that you mentioned that, it's probably character traits framework- hang on
I see multiple other skills going down at the same time!
Please enable Skill Evolution debug messages, do it again, and send me the full openmw.log
[03:21:14.634 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill used handler: custom base gain for skill "restoration" is 0.75 (instead of current 1.00 and original 1.00)
[03:21:14.634 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Magicka skills scaling: no spell cast detected, no scaling
[03:21:14.634 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Magic handler: no spell cast detected
[03:21:14.634 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Decay handler: "restoration" decay is reduced by (gain 0.750 x scale 1.000 x recover factor 0.50) / (time factor 336) = 0.1116%
[03:21:14.634 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Decay handler: related skills decay "restoration" is reduced by (gain 0.750 x scale 1.000 x recover factor 0.50 x synergy factor 0.050) / (time factor 336.000) = 0.0056%
[03:21:14.634 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Level-based handler: skill "restoration" level 146, range [125, 25], scale 1.00000 x factor 0.13121 -> 0.13121
[03:21:14.635 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Final handler: skill "restoration", gain 0.75000 x scale 0.13121 -> 0.09841
[03:21:14.635 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill restoration gain 0.098 (requirement 110.250), progress 0.28448 -> 0.28537, excess 0.000```
"scale nil"
turning off faction perks and ctf stopped the skill reduction issue, but the skill level up message never shows up
[03:28:00.674 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Decay handler: "incantation_skill" decay is reduced by (gain 0.250 x scale 1.000 x recover factor 0.50) / (time factor 336) = 0.0372% [03:28:00.674 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Decay handler: related skills decay "incantation_skill" is reduced by (gain 0.250 x scale 1.000 x recover factor 0.50 x synergy factor 0.050) / (time factor 336.000) = 0.0019% [03:28:00.674 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Level-based handler: skill "incantation_skill" level 26, range [125, 25], scale 1.00000 x factor 0.98394 -> 0.98394 [03:28:00.675 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Final handler: skill "incantation_skill", gain 0.25000 x scale 0.98394 -> 0.24599 [03:28:00.675 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill incantation_skill gain 0.246 (requirement 33.750), progress 0.99895 -> 1.00624, excess 0.211 [03:28:00.682 I] L@0x1[scripts/incantation/player.lua]: INCANTATION SKILL MOD: Cast custom spell 'Companion: Greater Restore Fatigue' (+10.1 XP, +27 magicka [13.5% refund]) [03:28:00.715 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill "incantation_skill" has changed from 26 to 27 [03:28:00.715 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill incantation_skill gain 0.211 (requirement 35.000), progress 0.00000 -> 0.00602, excess 0.000
incantation_skill does have a debug message o_O(for levelling)
the log is fine. Scale "nil" means no scale was provided (which is the common case) and SE set a scale of 1 (neutral)
this log is fine too
the notification doesn't show up, but does the skill actually increase? Does it contribute to the player level progression?
as shown in the video(i clipped that out) yes
then the only issue is the skill up notification not showing up?
yeah I don't see anything else, there's some weird math issue going on with the skill tracker in the corner but I don't think it's related to skill evolution o_O
Happens on that character still, even after a full computer reboot (just to make sure)
but at the moment the same lines are running on the debug, but no white flashing graphics error - genuinely no clue what ive managed there (New character)
Skill Evolution v2.0.1 and 2.0.2 released!
- Fixed skill gain errors with custom skill registering after the player becomes active (e.g. Sun's Dusk Cooking)
- The skill use gain settings have been reworked again and will be reset to their default values
- Fixed custom skill max level for uncapped skills
- Fixed NCG description tweaks overridden by this mod's additions to the skill tooltips
- Removed permanent debug logs
please try the new version
mym, is the interface function for resetting state.skills.max something you'd consider doing?
Sorry I forgot about your request. I had many bug reports to tackle first. I'll do it tomorrow
How should the rest work? Set the max to the current base value?
Yeah, that'd be great
Although, you'd have to call your updateSkills function first to set the base value, right?
Why do you need such an interface BTW?
I have settings to set skill start values. If I change the skill start values to be lower than they were previously, skill evolution counts the difference as decay
Then maybe the interface should rather set the max value to the provided value?
That could work as well, but I think it'd be easier if the skill base were recalculated first from NPC.stats.skills(self).base and the max value set to the skill base
Just resetting the decay essentially
should the reset also reset the decay progression?
maybe 2 interfaces, with an optional resetProgression param:
resetDecayedSkill = function(skillId, resetProgression)
state.skills.max[skillId] = state.skills.base[skillId]
if resetProgression then
state.skills.decay[skillId] = 0
end
end,
resetDecayedSkills = function(resetProgression)
for skillId, base in pairs(state.skills.base) do
state.skills.max[skillId] = base
if resetProgression then
state.skills.decay[skillId] = 0
end
end
end,
If you don't want the decay anymore, or something goes wrong with decay, you can:
- either set the `Skill Decay Rate` setting to `None` to restore all skills to their max value and remove the decay progressions
- or use one of the 2 interfaces to reset the decayed levels, while conserving the current skill values, and optionally reset the decay progress:
- `I.SkillEvolution.resetDecayedSkills(resetProgress)`, where `resetProgress` is a boolean
- `I.SkillEvolution.resetDecayedSkill(skillId, resetProgress)`, where `skillId` is a string identifying a skill
1. Press \` to bring down the console
2. Type `luap` and press enter to enter the Lua mode on the player
3. Depending on what you want to reset:
- Type `I.SkillEvolution.resetDecayedSkills()` and press enter to set all the decayed skill levels as the new base values
- Type `I.SkillEvolution.resetDecayedSkills(true)` and press enter to do as above, and also reset the decay progression of all skills
- Type `I.SkillEvolution.resetDecayedSkill(skillId)` and press enter to set the decayed level of the skill identified by the provided ID as the new base value
- Type `I.SkillEvolution.resetDecayedSkill(skillId, true)` and press enter to do as above, and also reset the decay progression of the skill identified by the provided ID
4. Optionally type `exit()` and press enter to quit the Lua mode
[04:41:21.004 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill "jewelcrafting" has changed from 19 to 0
[04:41:21.004 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill "hauling_skill" has changed from 64 to 0
[04:41:21.004 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill "incantation_skill" has changed from 26 to 0
[04:41:21.004 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill "evasion_evasion" has changed from 15 to 0
[04:41:21.004 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill "climbing_skill" has changed from 20 to 0
[04:41:21.004 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill "crafting_skill" has changed from 15 to 0
[04:41:21.820 I] L@0x1[scripts/hauling/player.lua]: HAULING v9: PICKUP +1.000 (accum 1.000)
[04:41:21.821 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Scale handler: skill "hauling_skill", scale nil -> 1.00000, gain 1.000 / 1.000 -> 1.000
[04:41:21.821 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Level-based handler: skill "hauling_skill" level 0, range [125, 25], scale 1.00000 x factor 1.25000 -> 1.25000
[04:41:21.821 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Final handler: skill "hauling_skill", gain 1.00000 x scale 1.25000 -> 1.25000
[04:41:21.821 I] L@0x1[scripts/skill-evolution/player.lua]: DEBUG (player): Skill hauling_skill gain 1.250 (requirement 1.000), progress 0.54615 -> 1.79615, excess 0.796```
turning off decay seems to reset all the custom skills to 0(except, oddly enough, incantation- ~~probably because it had data~~)
went to level up a different custom skill, like jewelcrafting, turned decay off and it reset every custom skill to 0 except that one o_O
which Skill Evolution 2.X versions did you installed for your game save?
I just found a bug where the skill max value (excluding decayed levels) for custom skill was initialized with 0, and it's not updated to the correct value until you raise the skill, which leads to 0 when disabling decay before any skill raise
in the mean time, you can fix it by manually setting the max value with the console, before disabling decay, for example:
luap
I.SkillEvolution.getState().skills.max["crafting_skill"] = 40
The recent one on Nexus, 2.05?
I'll publish a new update with a fix, and which should fix your game save too
just pushed it on Nexus, it should be available soon
Skill Evolution 2.0.{3,4,5,6} released!
- Fixed custom skill max value (excluding decayed levels) set to 0, leading to a skill level 0 when disabling decay before any skill raise
- Fixed Lua errors about "vector" on a new game
- Added 2 new interfaces to reset the decayed skill levels, and optionally reset the decay progressions
- Improved the Skill Use Gains setting by including custom skills into base skill categories
- Fixed the reset button not working for the Skill Use Gains setting
- Improved the Skill Uses Scaled setting descriptions (modifiers are excluded for success chance formulas)
- Fixed multi-school spell skill scaling error
- Fixed decay error with custom skills
- Fixed custom skill use gains not properly initialized
- Fixed custom skills not properly configured by previous released
Sorry for all the bugs and updates. The Skill Framework integration is trickier than I thought
All known bugs (from here and Nexus) are now fixed
Lol no worries, just thought I'd point them out before nexus did
Yeah, thx, it's very useful. I try to fix all issues before too many players encounter them
Version 2.0.6 now has the new interfaces
Hey, quick question re: you and Cybvep's magic mod: for the Area Effect Arrows patches, would Unofficial Morrowind Official Plugins Patched be considered modded?
Just wondering since you since specifically Expanded Vanilla and Total Overhaul lists, but Unofficial Morrowind Official Plugins Patched is only in the more vanilla modlists.
I doubt they change meshes to the ones EV/TO use, so you should use the Vanilla version. However, I will check this soonish to make sure.
#1488870426384924833 there is a thread for MRF here btw, so I will post there and ping you once I check this.
awesome, thanks cybvep
I'm not sure if it's just me, but it seems like every version from 2.0 onward introduces a noticeable lag upon initializing a new game or loading a saved game. Otherwise the mod works perfectly.
Wanted to bring this up in case it's not just a problem on my end. Love this mod, mym. Thank you for making it!
Thx for the feedback, I'll do some tests
I've been having that as well, but I haven't been able to isolate it to Skill Evolution. In my case it could simply be an oversized modlist.
Yeah, as soon as I downgraded Skill Evolution to 1.99, it got a lot better for me. But I imagine any lua script mod that does a lot of stuff will add to the load in some way.
I see, that's strange. You're right that scripting adds up, but I wonder what changed so much between versions.
From the changelogs, 2.0 was when handling for custom skills was added, so I assume that's the culprit
I was also having some stutter whenever NPCs would talk to me (not the menu, I mean in the world), which I wasn't able to isolate either.
that could be unrelated, but making a note of it
makes sense
It's weird too, because mym added custom skill handling to NCG as well lately, but I've noticed no problems from updating that one
With all likelihood it's just some happenstantial error. I'm sure it'll be fixed
Yeah probably, doesn't need to be rushed anyway
@quaint hound @sweet rampart I did many tests until I could understand from where the lag on game load was coming
it seems that declaring the Skill Evolution setting page takes almost one second to the engine!
I delayed the declaration to the first time the main menu is shown, and it seems to be good that way
please try v2.0.7
Working great on my end! Thanks so much
I think I put too much effort (and too many settings) in my setting pages....
still, this is weird, because I don't remember such a lag in previous OpenMW versions.
My settings did get a bit more complex, but not that much.
I counted the time required by my settings to build, and it's like 0.005s all included, but then I suppose OpenMW needs time to generate the rendering
I have no idea, but pushing it to the main menu sounds like a good idea. Probably just compounding factors or a runaway function or something makes it take longer than expected—but I'm no programmer, so idk
Thanks for the fix, great stuff
mym, I've noticed that skills lowered by Character Traits Framework are counted as decay by SE. I was wondering if you might add something like: lua return { eventHandlers = { CharacterTraits_traitSelected = function() I.SkillEvolution.resetDecayedSkills() end, } } unless you've already got a solution worked out. Also, could you call updateStats() in the resetDecayedSkills interface function like so: lua resetDecayedSkills = function(resetProgress) updateStats() for skillId, base in pairs(state.skills.base) do state.skills.max[skillId] = base if resetProgress then state.skills.decay[skillId] = 0 end end end, just to ensure that base is up to date before setting max?
Does this happen on chargen or mid-game?
Chargen
I didn't have the opportunity to test mid-game, but SE doesn't currently have any way of accounting for external modifications that decrease skills in determining state.skills.max, right?
Maybe I'll just change the legacy way of handling the decayed levels and replace it with a map of decayed level count per skill
max skills -> number of decayed levels
So I'm not yet sure if it's Skill Evolution or NCG causing it since I updated both at the same time and have been lazy about troubleshooting, but I've noticed that occasionally when I pause the game to bring up the main menu, there will be a short delay before it's able to be interacted with
When I get some time later I can do some more thorough testing if it will help, but I felt it worth mentioning for now
I recently fixed a lag on game loading, and the fix was to delay the setting page declaration to the first time you access the main menu.
I did not notice any lag with this new approach, but I suppose this could be felt depending on your system.
I don't know why the Skill Evolution setting page takes almost one second to be registered by the engine, and I don't know how to improve it currently
Yeah no worries! I understand that this is a huge undertaking and you've been working hard on this. It's a very minor thing anyway.
I appreciate you sharing your work with the community. I always felt like Morrowind's leveling system was busted by default, and in the past on the old engine I'd always use Galsiah's Character Development as a replacement. Your work with NCG and Skill Evolution feels like a successor to that.
I was also a GCD fan
when I have some time, I'll try to do more invsetigations on this topic
I'm another OG GCD fan. It always felt like the way things should work. NCG is like GCD next gen
.
Yeah for sure, I loved GCD so much back in the day. I was always upset it didn't work properly in OpenMW.
The decayed level issue should be fixed in 2.0.9. Also I added an updateStats in the reset decay interfaces
Skill Evolution 2.0.9 released!
- Fixed decayed levels increased when the base skill value is reduced by a mod, the console, or any other external source
- Fixed no skill up notifications above skill level 100
- Fixed residual decay applied when re-enabling decay
- Fixed skill gains broken after resetting the Skill Use Gains settings
Is there any chance we could get an option for a per-level training limit in the future? Something similar to how Oblivion and Skyrim only allow buying five sessions per level
mym, the new skill decay works great for compatibility. It's able to weather skill decreases from both Character Traits Framework and UL. My only problem at the moment though is this line in your skillLevelUpHandler: if state.skills.decayedLevels[skillId] > 0 then mCore.modSkill(skillId, 1, { recovered = true }) return false end You return false to prevent the normal skill levelup message, right? It's just that it makes it a nightmare to workaround as any mod that relies on detecting the skill levelup will fail to function including something like Reading is Good, unless its skillLevelupHandler is added after SE's
Oh. I return false because I considered decayed levels as an internal SE mechanism, and I wouldn't trigger other mod handlers for it
I'm not sure what we want when a player reads a skill book while having decayed levels
I think it should increase the level without reducing the number of decayed levels
For UL at least, I separately count decayedLevels as negative growth and use the skillLevelupHandler to add positive growth
Are there any mods that would be disadvantaged by not returning false?
And the other instances where you return false for example the skill cap, would it be preferable for compatibility to instead do params.skillIncreaseValue = 0
and just return
I thought I did not return false for the capper
state.skills.progress[skillId] = 0
skill.progress = 0
return false
end```
I'll fix all that tomorrow if I find time
No worries, take your time
@acoustic heath Could you test this version?
What am I looking out for?
- the skill level up handlers are no longer cancelled when a cap is reached
- skill level ups from books and training doesn't reduced the decayed levels
You're still returning false here: if source == I.SkillProgression.SKILL_INCREASE_SOURCES.Usage and state.skills.decayedLevels[skillId] > 0 then mCore.modSkill(skillId, 1, { recovered = true }) return false end
and wouldn't it be preferable to mod the skill by options.skillIncreaseValue?
especially here: if skill.base >= 100 then mCore.modSkill(skillId, 1) end
Also, mym, how is jail handled by SE?
oh! Here too! Sorry, will be fixed
the decay is paused
But doesn't jail with it's negative options.skillIncreaseValue still go through the same skillLevelupHandler?
Does jail affect skills that are over 100?
Because if this condition is met:if skill.base >= 100 then wouldn't it increase the skill value by 1 regardless whether the option.skillIncreaseValue is positive, negative, or 0?
I'll have to check that, thx for heads up
mym, just one more thing I've been meaning to ask you, I know that MOMW lists load SE fairly late, and SE waits until onActive to add its skill handlers. Is there a reason that SE wants to act first? Because I was thinking with the interface function that allows external handlers to insert before SE's final handler, surely SE would prefer to act last and have the final word? And surely it would be better from a compatibility standpoint as well? I'd be curious to hear your thoughts
what about this version?
This is a good question.
I think I did that because SE needs to be initialized before the handlers can be triggered.
Now specifically that SE waits for custom skills to be registered.
But I'll think about doing it the other way.
Also, as SE can alter skill base gains (setting page), if another mod's handler comes first and applies a percent on the gain (like double gain) before SE's handlers, then SE won't know how to properly apply the custom gain
It's also good that SE has the last word, specifically for the "carry over excess gain" feature
It's tricky and that's why I recommend other mods to use the dedicated interface to be called at the right time
I could also have split the omwscripts addon into one to put early in the load order, and another late. But I would make the code more complex I think
This way they can also benefit from the updated scale param
should I also set skillIncreaseValue to 0 and let the handler chain continue when increases from books is disabled, or when a skill training is capped?
I think I should do it too, to allow other mods to get the skill book and training events
Skill Evolution 2.1 released!
- Stop restoring decayed levels for skill increases coming from training or skill books
- Compatibility: Don't stop the skill level up handler chain when a skill raise is blocked by a cap, a disabled skill book, or a capped training (just set the increase to 0)
- Fixed jail decreased skill levels not properly handled, and added a notification and decrease sound
Fantastic work, thank you!
This looks great, mym, thanks!
This is definitely tricky, but could SE load as early as possible in your LO and split its handlers with the the ones wanting to act last adding onInit and the ones wanting to act first adding onActive or even later?
That way SE could have the first and the last word
It would only need to load after Skill Framework is all
I've also found that because SE loads so late in MOMW lists, I'm unable to call SE's interface onLoad to add my own skill handlers
Don't add handlers on load
I've had to use an eventHandler with an event sent onLoad just to catch it
Handlers is one thing that should always happen in the script body. Otherwise you're subsribing to resolution order nightmare
And yes, we've talked about it with Mym as well. Load your script after if you depend on the interface and register handlers in the body.
#lua-scripting message
It's never correct to add handlers anywhere besides the body. If it were reasonably possible to police this i think we should
Arrean, is my reasoning on the SE load order predicament sound or am I going mad?
engine handlers are handlers like onUpdate(), onFrame(), etc. They are run in load order because they are run independently of one another.
And also why Mads was so adamant about never registering handlers in onLoad, or anywhere beside script body.
But also, specifically for SE itself. - with "other mod came in and did somethin" - I'm not sure that's that big of an issue
I will say the only skillUsedHandler I've done that with is this: ```local function updateSkillHandlers()
local function getSkillUsedHandler()
return function(skillId, params)
local unmod = state.skills.unmod[skillId]
local maxValueUnmod = ulSet.getSkillMaxValue(skillId)
if unmod >= maxValueUnmod then
local skillStat = state.skills.stat[selfId][skillId]
skillStat.progress = 0
params.skillGain = 0
ulLog(string.format("Preventing skill "%s" progress from usage due to Max Value Unmod %d", skillId, maxValueUnmod))
return
--return false
end
end
end
if I.SkillEvolution and I.SkillEvolution.addSkillUsedHandler then
ulLog("Skill Evolution added skillUsedHandler")
I.SkillEvolution.addSkillUsedHandler(getSkillUsedHandler())
else
I.SkillProgression.addSkillUsedHandler(getSkillUsedHandler())
end
end```
Which is supposed to negate the skill increase if a condition is met
local function registerHandlers()
if I.SkillEvolution and I.SkillEvolution.addOnHitHandler then
logging:debug("registering SE onHitHandler")
I.SkillEvolution.addOnHitHandler(onHitHandler)
else
logging:debug("registering regular onHitHandler")
I.Combat.addOnHitHandler(onHitHandler)
end
I.SkillProgression.addSkillLevelUpHandler(skillLevelUpHandler)
end
registerHanlers()
same/similar on my end - in the script body. I mean, you can probably do the same. Zero out the gain/scale - and if you load after SE - you should be before it in handlerChain
it will get 0, and iirc Mym has added a "do nothing if you got a 0" several updates back
^ though that last one may need doublechecking, cause before it definitely broke with 0 at one point
--return false
I see it's commented out, but definitely don't do that though :O
I'm only threatening to do it 
But, Arrean, I was referring to the problem of SE wanting to act both first and last
#1440736359890419782 message
I'm not sure I agree with it
But also, specifically for SE itself. - with "other mod came in and did somethin" - I'm not sure that's that big of an issue
Could SE load early and add some of its handlers in its body acting first and add some of its handlers onActive acting last?
Is the reasoning correct at least?
It would definitely benefit SE to act last as it handles the skill gain and it carries over any excess
"last ish"
but yes, that may work
Or sorry I got it the wrong way round. This is a real mind-twister
Body last; onActive first
Hold up a second
Handlers registered in the script body - are registered first to last in the order scripts are loaded and resolved in the opposite order
onActive - will run fuck knows when, probably when the game is loaded and simulation starts ticking - meaning the handler registered there will be registered dead last, and resolved first
engineHandlers like onLoad/onActive - etc run in load order as they are not mutually dependent
Do go over my converstation with Mads that I've linked above too
Yeah precisely, I was reasoning that SE should load first allowing its interface to be called by any mod that follows and add it handlers first allowing them to act last
It's fucking confusing though, I agree
So, yeah, based on that - still up to Mym, but I think just having SE load early - and anything else that depends on it, or alters skill gains after - should be enough
I kinda fail to see the reason to split the handlers
mym said something about SE needing to act first otherwise it results in odd skill gains
Yeah, but I don't know why that is a problem
Also, as SE can alter skill base gains (setting page), if another mod's handler comes first and applies a percent on the gain (like double gain) before SE's handlers, then SE won't know how to properly apply the custom gain
Can't it just act on whatever value came in?
Odd gain then would still not be SE's fault
Idk, I'll leave that for mym to reason out
Yeah
Skill base gains are defined in GMSTs. SE's trick is to replace the incoming gain by the one defined in SE's settings.
However I don't want to override a gain altered by a mod or custom gains manually triggered.
My approach is to compare the incoming gain with the gain set by the GMST (vanilla or modded), and if it matches, then I can safely override the gain. If not, I choose safety and I ignore the SE's setting override.
Then, if SE's handler is called first, I'm sure I'll get either the GMST gain (override ok) or a manual trigger with custom gain (ignore ok).
If a mod doubles the gain before SE's handler, then I cannot know whether it was an absolute value (should not override), or a relative one (+100%), where I can apply SE's custom gain on top of it.
Example:
- SE gets a gain of 2 on a skill that's supposed to get 1 (GMST)
- the player sets a get of 1.5 in SE's settings
-> did a previous handler doubled the gain? Then I can apply the player's setting: 1.5 x 2 = 3
-> did the previous handler just wanted to set 2? Then I should not alter the gain
That I guess makes sense. If you want to consider other mods like that.
Guaranteeing that you go first avoids this situation, right?
You could also just always adopt the first approach and just do (1.5 / 1) * 2
Not completely. A mod could just want to set an absolute value of 1 which will be interpreted as vanilla gain by SE and will be changed to the player's custom gain
Yeah, and then explain in the doc that mods should always prefer a scaled value over an absolute gain. But which approach is best for compatibility?
What would you do?
Are there any mods that actually do this? It seems to me poor practice unless you're a complete skill overhaul which wouldn't be compatible with SE anyways. Most mods would surely either set the skill gain to 0 or apply a multiplier to the GMST value
I've seen that in the past. Particularly with manual skill use calls
Using SkillProgression.skillUsed(skillid, options)
Anyway, if you guys think my absolute value scenario is uncommon enough, then maybe I could just set the handlers at the script root and ask the MOMW team to move the mod up in the load order
It would also be good for the on hit handlers
Maybe a better skill use gain setting could be a simple percent, instead of an absolute gain, which would be more explicit regarding the new approach
@ember cloud @acoustic heath @mild lantern would a percent factor for skill use gains would work for you, instead of an absolute override value?
I send scale downstream from my use handlers, not gain valuie
so not sure if it applies
Scale works great. The Lua side engine applies the scale on the gain, and also forwards the scale. Then I do gain/scale to get the original gain.
I haven't followed the discussion. Do you mean the values which can be set for base skill gain in the mod settings? IIRC currently you can replace Vanilla rates with other ones set in the settings and SE also has some different ones than Vanilla by default (which fit intended default SE progression better).
Exactly
% would probably be less intuitive as I assume you would use Vanilla rates as base, so some stuff would seem to have much higher values, e.g. you greatly increased enchant skill gain and lowered recharge skill gain and it would show as high/low % by default. Gameplay-wise it wouldn't matter as long as the result is the same.
Agreed, but what should I do when:
- the player sets 1.5 for a successful spell cast
- a mod manually triggers a gain for a spell skill with a gain of 2.0?
Should I just preserve the gain 2.0?
Should I interpret it as +100% and convert it to 1.5x2=3.0?
I don't see how percentage would be less intuitive. To the average user who doesn't know the vanilla skill gains, and doesn't really understand what an enchant recharge gain of 1.5 translates to, I think its much easier to convey that SE increases the vanilla gain by 150% thus accelerating skill gain over vanilla
Yeah but the base value is not always the vanilla gain. Some mods alter these base gains (changing the GMSTs), for example to fix broken gains, and in such cases SE's defaults should not apply a percent on the "fixed" gain. A constant override would be best in such cases
The problem is I cannot tell whether the gain is a natural one, altered by a mod, or a manually triggered one, in which case I should just let it as is
But why would you use these mods with SE if they're essentially doing the same thing?
The override seems to me worse for compatbility. The percentage seems better for customisation
Players do many things
I know but you might as well say outright "these mods are incompatible" and the user is liable if things go tits up
True. But I'd have to track such mods 😅
You can just say that any mod that alters skill gain GMSTs are blanket incompatible and will result in odd skill gains. It doesn't seem worth accounting for
I can do that
There is a big issue though: there are 2 skills which have a vanilla gain of 0
0 x 200% = 0 😅
Like enchant for on strike use type
But should on strike enchant even grant xp - that's one area of vanilla that I kinda agree with
you're using a weapon someone else enchanted, and the use of it doesn't involve magical skill
What's the second one?
Not sure. Speechcraft fail maybe
Yeah I agree with you, but this is subjective, and settings are here to satisfy many visions
That's fair
I like that it's customizable in SE tbh. I personally added some minimal xp gain for "on strike" enchants, it's small but not nothing
Nah, that's fair. More settings for the god of settings :D
Speaking off, I've noticed a while ago that buying and selling stuff without negotiating the price increased mercantile skill. I'm pretty sure it didn't in the old NCGD I used to use (required modifying the trader's offer at least by 1 gold). I would appreciate (yet another) customisation option for that too huhu
Similar to enchant, to be able to set how much (if any) xp would be gained from successfully negotiating a price, and same with non-negociated transactions.
I don't think that it's Vanilla or SE at all. AFAIK you only get any skill gain when you haggle (at least 1 gold) in Vanilla and SE doesn't change this. You may have some other mod which does sth with this.
Strange
I have zero mod related to trading or mercantile
Only mods I installed recently were magic-related, or UI (time HUD, all the "-extended" collection..) and the perks and traits mods
And of course, switching from NCGD to SE+NGC
Which is why I thought it came from SE
NCGD is quite old. Were you on that old stuff before? 😄
Yes
Back from 0.49
Yes
I hadn't played since like, a year ago or so
Didn't want to make a new install yet
Just picked up my old one
ok
I think that SE doesn't change anything about Mercantile except standard modifiers (so global skill gain rate and the possibility to change the base skill gain in the mod settings)
so it seems like a different mod
maybe one of the UI ones you mentioned has some features related to that
@boreal apex Does SE do anything with Mercantile besides the usual stuff?
The UI stuff is just TimeHud and all the "window extended" collection (magic, inventory, stats..)
Magic Window Extender and Stat Window Extender don't change this, that's for sure
not sure about IE
Tbh, I've been playing with GCD then NCGD then SE+NCG for so many years, I have no idea what vanilla is like any more huhu
I'm GCD old guard as well 🫡 .
GCD was so good back in the day
The only thing I know is that I liked that mercantile leveling required actual negociation. Then thought about it, and figured if it was customizable, I'd probably set it like with enchanting : a minimal gain on non-negociated trades, just so that it's not nothing but significantly more on negotiated trades.
Now it seems more related to how much money is transferred, regardless of any haggling taking place or not
IE is just an inventory UI, why would it touch exp gain for mercantile skill? (I'm no expert on how those things work TBF)
It was game-changing
yep, it changed TES experience forever to me
just felt the "right" way for that system to work
and now I'm so used to this that I consider it Vanilla
Yeah, definitely. There's no way I can go back to the vanilla system.
It ruined vanilla leveling for me. Once I tried it, I could never play vanilla ever again
When I switched to OpenMW, I was very confused on my first level up. It had been so long I'd completely forgotten that was not vanilla behaviour 😅
That's when I looked up OMW leveling mods, and NCGD was a recent creation iirc, thank god
I usually doze off during discussions about levelling, modifier optimization and such, because it's been "solved" by GCD years and years ago. I consider NCG+SE to be modern version of GCD, pretty much.
Yeah. It's funny how Oblivion gets blasted a lot for the leveling system when it's almost exactly the same as Morrowind's. Folks just started to notice it more because of the poor world scaling, lol
in OB you get fucked for unoptimal levelling much more
in MW, it's not a big issue
Yeah, exactly
Oblivion's big problem wasn't the character leveling, it was the rest of the world's leveling huhu
and ironically, it's never been the rats
this is always the meme
but it's not rats
it's the fooking bandits
IMO playing OB without a mod that handles level scaling one way or another is pointless
Yeah. Certain enemy types in Oblivion have hard caps where they stop leveling. Bandits and marauders are awful though. And if I remember correctly, the world spawns start throwing more mountain lions and crap like that at you the higher you level.
I wonder what they were thinking when they gave daedric armor to bandits
When I first played the game, I realised something was wrong when I became champion of the arena at lvl 3. Then I joined the TG and Dark Brotherhood. I had a blast setting up "accidents" for my assassination targets, while sneaking around.
Then I had to enter the gates of Oblivion and realised my stealth character was fucked.
the last part can happen in MW as well. Depends on the area. There is no level scaling in MW. There are levelled lists, though. This was never a big issue. Pretty much nobody complained about it in the OG years tbh. When Oblivion came, it made everything so bad with its level scaling that it became a thing as (in)famous as horse armor.
Oh yeah for sure. I know in Morrowind, dungeons can start spawning crazy stuff at higher levels. The ancestral tomb outside of Caldera is a good place to see that, if you go back every so often as you level, there will be more dangerous daedra.
yep
but the weaker ones never stop spawning
the concept of levelled lists wasn't changed too much in TES3-5
but level scaling became a thing from TES4 onwards
bloodmoon onward
ok, they had one level scaled enemy in Tribunal. Gedna Relvel. The script was broken, though, so it didn't work 🙂
Skyrim does it too. It's just that TES IV was awfully balanced, when TES III and V nobody complained
I always thought level scaling wasn't the worst idea in the world, but the way Bethesda handled it was awful. The premise is to keep the game challenging, but in practice it all just ends up bullshit nonsense.
Right, TES III still had a problem with the DLCs
That's kind of true because it had "thresholds" so naked berserkers at lvl 5 were weaker than naked berserkers at lvl 50
oh, and Tribunal also had levelled DB assassins
everybody loves those
Tribunal is all over the place as far as balance goes. It's such a weirdly designed expansion. I like the city of Mournhold though.
They improved it even in Fallout 3. Then in Skyrim.
no daedric armor bandits in Skyrim
Skyrim still suffers from wet-noodle-itis
they reigned the system in
but not as bad
they increase stats
but keep equipment in check
and they have area-based level ranges
so not every area is the same
in OB everything is fucking same
no matter where you go, everything is level scaled
like wtf
Yeah. Skyrim is much better designed than Oblivion. It's just a shame it's not as feature-packed a game as Morrowind is.
My opinion about TES V is not that it lacks features, it's just the writting that's problematic
Yeah, that too
voice acting is also often pretty bad
it gets annoying fast because of how repetitive it is
those guard memes were fun the first few times, I think
but Skyrim Vanilla is like... a decent action adventure game. I don't think that Vanilla Oblivion is even playable.
ideally, you will use mods for both, but OB has more "essential" ones
I can't play Oblivion without most of Maskar's mods, personally. He does some really great work.
OB made me discover mods 
😄
curious about Skyblivion. Actually, what will they do with level scaling?
I don't know. IIRC the mod was supposed to be released already.
Can't be worse than OG
Yeah, definitely. I'm more excited about Project Cyrodiil these days. The work done on Anvil that's already playable is beautiful.
Oblivion needs "scaling unclusterfucked"
I actually tried to fix the 1 gold offer change that stopped giving XP since some times (SE 2.0), but maybe the bug was elsewhere (engine?) and I also gave XP when there is no haggling
I'm not crazy then huhu
That's a relief
So yeah, while Arrean and I were agreeing on the goodness of offering more settings to the god of settings, I remembered to make this suggestion I'd though about for a while
If possible, to add customisation to exp gain on haggle and no haggle trades, like, if they can be separated (kinda like the enchant exp on "on strike" and "on use" enchantments)
I don't know how to know what was the player's offer. No way to scale anything
(I personally see no-haggle trades kinda the same way as "on strike" enchants : while it makes sense it would bring familiarity over time, I don't see it as much of an experience in the field. I like the idea of it giving minimal exp, but not enough to be a viable way of training.
I noticed my non-mercantile character suddenly leveling mercantile ever since I switched from old NCGD to current NCG+SE, despite never haggling. I can deal, but if there is a way to tone down his mercantile growth without gimping actual trader behaviour, I would be happy to have it.
How did it work then, when no haggle brought no exp?
Oh, you mean it's like an on/off thing, but no way to give a different amount of exp depending on how successful the haggling was (i.e. if you lowered the price by 1% Vs by 20%)?
I just meant this :
Like if no haggle could have a different value from haggled trade
A year ago, or so, low haggling gave low XP, and no haggling gave 0 XP. Then, low haggling started to give no XP. I thought it was an engine bug, and I "fixed" it by giving the base gain. But apparently, as you reported, it seems that the bug was different and no XP was given for low AND no XP. Then my fix caused another bug
Ohhh I see
A year ago is about when I stopped playing, so it makes sense that I missed all this development
Oh well, it's not a huge deal, was just a suggestion
Thanks for the explanation
I'll do some tests to see whether there is something to do about it
Cheers
I've talked about this before, but my biggest issue with vanilla leveling (or very lightly modded vanilla leveling) isn't the actual mechanics--it's the leveling speed. On its own in something like Oblivion it works alright, similarly to how it works in Morrowind, but in light of other factors like world scaling or massive content mods like Tamriel Rebuilt, it starts to fall apart.
Which, notably, are things that NCG and SE address quite well
Oh yeah absolutely. You tend to level real quick, which is why I'm really thankful for SE in particular for slowing it down.
I've tried just simply reducing my leveling speed, but then the moment-to-moment gameplay can feel quite slow. Already sporadically used skill like a lot of the magic skills increase at a crawl--but if the speed is increased (but still slower than vanilla), you'll inherently level faster, and ultimately no universal modifier can address every skill evenly
Since spamming a sword is weighed nearly the same as casting a spell, even if the latter typically happens inherently less often
The dynamic scaling of faster increases at low skill levels and slower at high levels is definitely the best way to do it
that way you're not suffering in the early game and struggling for singular increases lol
I'm not sure I understand your message accurately, it looks like you're saying it's the size of the world/content that makes oblivion level scaling an issue?
'cause vanilla Oblivion didn't work at all huhu
Sorry, I was talking about both MW and Oblivion at once, since the point was made that their leveling systems are rather similar. And that the issue isn't their fundamental mechanics, but their surrounding mechanics that exacerbate them
Such as level scaling in Oblivion's case, or content mods in MW's case
How fast or slow the player character increases is irrelevant when the whole world increases at the same pace.
The issue of big content mods in TES III, making slowing down player leveling speed, occurs precisely because the world doesn't follow the player exactly (you feel you are OP because you have become stronger than some content).
That's why TES IV specifically was so criticized. It's not the player leveling system, it's the world level scaling.
That's kind of splitting hairs since leveling only exists in the context of the game it's in, but still
Yeah sorry, we are in agreement on that front huhu
No worries, I didn't articulate my point very well in the first place
Yeah, exactly
In isolation their leveling systems aren't bad, but other systems--the general game's context--cause a lot of friction.
But the fundamental premise isn't bad, and even has some fun quirks to it
A lot of issues people have with vanilla leveling in MW have to do with unoptimized levels, which isn't so much of an issue to me since I simply don't care about that--but in Oblivion, if you don't level well, you can easily end up weaker
again, my bigger problem is just how damned fast it is
Yeah, I found it funny for 5 minutes when my first TES IV became the champion of the arena at level 3, but I can't say anything positive about it past that huhu
Oblivion is funny, if nothing else lmao
I've had some fun with it but it's lacking in most things I want out of an RPG. But it has proper skills, unlike Skyrim, so I'll give it an edge
Indeed, you described it very well. I also use the "slower faction progression" with Tamriel Rebuilt, to not become faction leader after only a fraction of the faction content.
What mod is that? haven't heard of it
I forgot tbh, it might be a TR thing.
Maybe. I really don't remember
gotcha
That mod just places TR content in normal faction context
so like, no more rising through the ranks from just Vvardenfell
Once more Redoran content gets added I think it's firmly the best way to play
yeah, TR Factions is literally there in order to prevent being able to blaze through the faction questline just by doing Vvardenfell stuff
I think I'll stick to my current approach which handles mods like yours (set the scale param), and document that behavior in the doc.
I'll try to move my handlers to the script root.
I just checked, and I get no mercantile progress when I don't change the merchant's offer
Huhu okay, this is weird. I'll do some testing, 'cause I have never modded trade/mercantile, switching from old NCGD to SE+NCG was the only thing I could think of to have caused it.
I'll get back to you once I've investigated more.
....I just messed up my install by accident 😭
...I don't suppose there's a way to "undo" data deletion in the launcher?
check content lists
otherwise - no, I don't think there's an undo
Fuck me
I though I was on a test list I'd just created, and deleted a huge chunk of file paths in the data tab, then noticed it was actually my main list I was playing on
...guess that Wretched playthough I had started is going to wait. I guess it's finally time to do that new install I was putting off. Not going to be able to play again for a while 😢
Damn. Well, at least you have to excuse to look over your modlist.
I've screwed up my deploy scripts for indev mods just over a month ago. And instead of deleting just the mod directory on deploy - it wiped entire mods directory 
I was just getting over the tedious early start of my Wretched playthough 🥲
This is going to take days at best
Once a Wretch, always a Wretch
.
Maybe you can speed it up with console. Get back roughly to the point you were.
The lack of inventory space is the biggest hurdle of the Wretched start imo. I had just gotten my strength to a point where I could wear my full armour + weapon without being over encumbered
Just set some skills to higher lvl post chargen and let NCG recalculate?
Add gold amount which seems fair
And you will have faster start
Nah, not fun that way. I'll restart. What I'm most bummed about is that I just wanted to play, and now I'll have to spend days/weeks just figuring out a full modlist for myself and installing and testing it.
I could try to just repair what I just did, but at this point I might as well do the full reinstall I had been putting off for weeks
Not all. But a big chunk of them
Nothing in trashbin?
Is it a custom modlist?
Figuring out what I deleted exactly and need to reinstall will be a nightmare
Yes and no. It's my old hundreads-of-mods install, that I've been adding stuff on for the past months. I have a backup list, but it's still weeks-old, I've been updating/reordering/adding mods since then, figuring out what isn't something I'm looking forward to
Since I've been wanting to make a new list from scratch for a while, might as well do it now. It's just going to take a while, and a lot of work 🥲
Well, this is where umo MOMW is easier as you can -sync, apply customizations and you will be mostly done.
I guess I'll have a look at UMO. At a glance, the instructions from MOMW welbsite seemed to involve a number of programs in addition to UMO (since I won't be using one of the lists as-is), and modifying a list seemed to be quite convoluted, but I didn't actually dive into it.
My experience using a modpack with MO2 has also made me wary of mod managers in general. I hated that thing.
...and I realise we're flooding SE's channel with non-SE-related discussion, stopping now (sorry mym)
Skill Evolution 2.2 released!
- Improved the performances and reduced the memory usage of the script attached to actors (load less things)
- The Lua "skill used" and "on hit" handlers are now added at the script root
- This mod should be placed before mods using handlers to alter skill gains on the player, or alter damage on the player or actors
- Fixed the skill down notification message when not caused by a skill decay (e.g. jail)
- Fixed upgrade error from versions below 2.0
It’s worth noting that OSSC now has MBSP setting for quickcasting which you can pair with MBSP setting of SE. 🙌
nice! With what kind of formula?
.