[Q] Skill Editing

Post » Mon Jun 18, 2012 2:08 pm

So the questions:
How can one change what action levels the skills?
And how could I change the damage bonus of e.g. Marksman per level?
Thanks in advance.
User avatar
Haley Cooper
 
Posts: 3490
Joined: Wed Jun 14, 2006 11:30 am

Post » Mon Jun 18, 2012 11:54 am

So the questions:
How can one change what action levels the skills?

That really depends upon what skills you're trying to change, I think... what effect you're going for. Supposing that you intend to change a katana to use the One Handed skill, you'd need to change its associated skill by editing the weapon itself. Not sure if that's what you meant, though.

And how could I change the damage bonus of e.g. Marksman per level?
Thanks in advance.

Hmm... not sure on that one. Could be within the Marksman Actor Value itself? Perhaps "Skill Improve Mult" ?
User avatar
Siobhan Thompson
 
Posts: 3443
Joined: Sun Nov 12, 2006 10:40 am

Post » Mon Jun 18, 2012 5:21 am

That really depends upon what skills you're trying to change, I think... what effect you're going for. Supposing that you intend to change a katana to use the One Handed skill, you'd need to change its associated skill by editing the weapon itself. Not sure if that's what you meant, though.
No I am not going for anything like that.
One example could be changing the pickpocket or lockpicking tree into a blade or blunt tree.
And making it properly level.
User avatar
Markie Mark
 
Posts: 3420
Joined: Tue Dec 04, 2007 7:24 am

Post » Mon Jun 18, 2012 9:04 am

One example could be changing the pickpocket or lockpicking tree into a blade or blunt tree.

One step would be what your preposter described. You simply rename pickpocket into blade. Then make blade the associated skill for any blade weapon. This weapons damage then will be calculated based on the blade skilllevel (the the formula is unclear to me, just tested it with an iron sword and it has a different resulting damage when it is associated to one-handed which is at 100 on my char than when associated with blade [which was pickpocket before]) and also using any "blade weapon" will level the blade skill.

The second step would be to somehow stop pickpocketing from leveling that skill aswell (if we're lucky that's done in a changeable script attached to actors that can be pickpocketed). Also I have not yet figured out how to do the same with magic or for instance how you would add an unarmed skill and have that leveled by succesful unarmed attacks. I guess in the end there's no way around using "hacks" like SKSE. Sadly I have no idea how SKSE works nor do I seem able to find any documentation on it that would explain how to even start manipulating skills and such. Allthough similar things are done already in Elys Uncapper for instance but he did not pack the sources of his plugin so there's know way of actually finding out what he did.
User avatar
Niisha
 
Posts: 3393
Joined: Fri Sep 15, 2006 2:54 am

Post » Mon Jun 18, 2012 4:30 am

he did not pack the sources of his plugin so there's know way of actually finding out what he did.
Here is the source code of Elys Uncapper
Spoiler

library SKSE_Elys_Uncapper;
{$R *.res}
uses
Windows, SysUtils, IniFiles, Classes;

type
PluginHandle = Longword;

SKSEInterface = packed record
skseVersion
: Longword;
runtimeVersion: Longword;
editorVersion: Longword;
isEditor: Longword;
QueryInterface: procedure(id: Longword); cdecl;
GetPluginHandle: function: PluginHandle; cdecl;
end;

PluginInfo = packed record
const
kInfoVersion: Longword = 1;
var
infoVersion: Longword;
name: PAnsiChar;
version: Longword;
end;

TPerkByLevel = record
Level: Word;
Perks: Byte;
end;

const
kPluginHandle_Invalid = $FFFFFFFF;

SKYRIM_VER = $030A0000;
SKSE_VER = $01040020;
PLUGIN_VER = $01050040;

oPLAYER = Pointer($01570334);

AlterationID = 18;
ArcheryID = 8;
AlchemyID = 16;
ConjurationID = 19;
BlockID = 9;
LightArmorID = 12;
DestructionID = 20;
HeavyArmorID = 11;
LockpickingID = 14;
EnchantingID = 23;
OneHandedID = 6;
PickpocketID = 13;
IllusionID = 21;
SmithingID = 10;
SneakID = 15;
RestorationID = 22;
TwoHandedID = 7;
SpeechID = 17;

var
Enabled: Boolean = False;

SkillEffectFormulasCap: Single;
FixSneakOver100CheckCode: packed Array [0 .. 5] of Byte = (
$9E, // sahf
$9B, // wait
$DF, $E0, // fstsw ax
$90, // nop
$73 // jae
);

SkillCaps: packed Array [6 .. 23] of Single;
SkillMults: Array [6 .. 23] of Single;
PerksPerLevel: Array of TPerkByLevel;

LastValidedSkill: Longword;
CurrentSkillCap : Single;
CurrentSkillLevel : Single;

pSkillCapPatch: Pointer;
pSkillCapPatch2: Pointer;

SLParam1, SLParam2 : Single;

GetActorLevel: function(a1, a2: Integer; This: Pointer): Word; cdecl;
CalculateExpForNextLevel: function( SkillLevel, SLParam1, SLParam2 : Single ): Single; cdecl;
sub_650A70: function(a1, a2, a3 : Longint; a4, a5: PSingle): Byte; cdecl;

function Overwrite(Address[color=#666600]:[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600];[/color][color=#000000] [/color][color=#660066]Data[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600];[/color][color=#000000] [/color][color=#660066]Size[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Longword[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Boolean[/color][color=#666600];[/color]
[color=#000088]var[/color]
[color=#000000] [/color][color=#660066]OldFlag[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Longword[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]False[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#660066]VirtualProtect[/color][color=#666600]([/color][color=#660066]Address[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]Size[/color][color=#666600],[/color][color=#000000] PAGE_EXECUTE_READWRITE[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]@OldFlag[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#660066]Move[/color][color=#666600]([/color][color=#660066]Data[/color][color=#666600]^,[/color][color=#000000] [/color][color=#660066]Address[/color][color=#666600]^,[/color][color=#000000] [/color][color=#660066]Size[/color][color=#666600])[/color]
[color=#000000] [/color][color=#000088]else[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]'SKSE [/color][color=red][color=#008800]Elys[/color][/color][color=#008800] Uncapper could not modify Skyrim in memory. PLEASE CLOSE THE GAME NOW TO AVOID POTENTIAL GAME INCONSISTANCIES OR CORRUPTION'[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]'Error'[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]True[/color][color=#666600];[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000088]function[/color][color=#000000] [/color][color=#660066]SetFF15Call[/color][color=#666600]([/color][color=#660066]Address[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600];[/color][color=#000000] [/color][color=#660066]Target[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Boolean[/color][color=#666600];[/color]
[color=#000088]var[/color]
[color=#000000] [/color][color=#660066]Jmp[/color][color=#666600]:[/color][color=#000000] packed record
[/color][color=#660066]Code[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Word[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Target[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Jmp[/color][color=#666600].[/color][color=#660066]Code[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] $15FF[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Jmp[/color][color=#666600].[/color][color=#660066]Target[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Target[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Overwrite[/color][color=#666600]([/color][color=#660066]Address[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]@Jmp[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]6[/color][color=#666600]);[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#660066]Function[/color][color=#000000] [/color][color=#660066]ReplaceE8CallTarget[/color][color=#666600]([/color][color=#660066]Caller[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]PByte[/color][color=#666600];[/color][color=#000000] [/color][color=#660066]Target[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Boolean[/color][color=#666600];[/color]
[color=#000088]var[/color]
[color=#000000] [/color][color=#660066]Address[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Longword[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Address[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Longword[/color][color=#666600]([/color][color=#660066]Target[/color][color=#666600])[/color][color=#000000] [/color][color=#666600]-[/color][color=#000000] [/color][color=#660066]Longword[/color][color=#666600]([/color][color=#660066]Caller[/color][color=#666600])[/color][color=#000000] [/color][color=#666600]-[/color][color=#000000] [/color][color=#006666]5[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Overwrite[/color][color=#666600]([/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#660066]Caller[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@Address[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]4[/color][color=#666600]);[/color]
[color=#000088]end[/color][color=#666600];[/color]
[color=#000088]function[/color][color=#000000] hook_650A70[/color][color=#666600]([/color][color=#000000]a1[/color][color=#666600],[/color][color=#000000] a2[/color][color=#666600],[/color][color=#000000] a3 [/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Longint[/color][color=#666600];[/color][color=#000000] a4[/color][color=#666600],[/color][color=#000000] a5[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]PSingle[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Byte[/color][color=#666600];[/color][color=#000000] cdecl[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] sub_650A70[/color][color=#666600]([/color][color=#000000]a1[/color][color=#666600],[/color][color=#000000] a2[/color][color=#666600],[/color][color=#000000] a3[/color][color=#666600],[/color][color=#000000] a4[/color][color=#666600],[/color][color=#000000] a5[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SLParam1[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] a4[/color][color=#666600]^;[/color]
[color=#000000] [/color][color=#660066]SLParam2[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] a5[/color][color=#666600]^[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000088]function[/color][color=#000000] [/color][color=#660066]IncreasePerkPool[/color][color=#666600]([/color][color=#660066]NewValue[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Byte[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600];[/color][color=#000000] stdcall[/color][color=#666600];[/color][color=#000000] [/color][color=#880000]// thiscall[/color]
[color=#000088]const[/color]
[color=#000000] [/color][color=#660066]PerkOffset[/color][color=#000000] [/color][color=#666600]=[/color][color=#000000] $6C9[/color][color=#666600];[/color][color=#000000] [/color][color=#880000]// offset to update with each new Skyrim version[/color]
[color=#000088]var[/color]
[color=#000000] [/color][color=#660066]This[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]PByte[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Level[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Word[/color][color=#666600];[/color]
[color=#000000] i[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000000] b[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#000088]asm[/color]
[color=#000000] push ecx [/color][color=#880000]// Thiscall fix (Useless in this case but better safe than sorry)[/color]
[color=#000000] mov [/color][color=#660066]This[/color][color=#666600],[/color][color=#000000] ecx
[/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]GetActorLevel[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#000000]oPLAYER[/color][color=#666600]^));[/color][color=#000000] [/color][color=#880000]// Pointer to Player[/color]

[color=#000000] b[/color][color=#666600]:=[/color][color=#000000] [/color][color=#666600]-[/color][color=#006666]1[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]for[/color][color=#000000] i [/color][color=#666600]:=[/color][color=#000000] [/color][color=#006666]0[/color][color=#000000] to [/color][color=#660066]High[/color][color=#666600]([/color][color=#660066]PerksPerLevel[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]do[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]<[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]break[/color]
[color=#000000] [/color][color=#000088]else[/color][color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]=[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] b [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Perks[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]break[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color]
[color=#000000] [/color][color=#000088]else[/color]
[color=#000000] b [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Perks[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] b [/color][color=#666600]>=[/color][color=#000000] [/color][color=#006666]0[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] b [/color][color=#666600]:=[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#660066]PerkOffset[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] b
[/color][color=#000088]else[/color]
[color=#000000] b [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]NewValue[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#660066]PerkOffset[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]<[/color][color=#000000] b [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#660066]PerkOffset[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] b[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]This[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]asm[/color]
[color=#000000] pop ecx [/color][color=#880000]// Thiscall fix (Useless in this case but better safe than sorry)[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000088]function[/color][color=#000000] [/color][color=#660066]IncreaseSkillExp[/color][color=#666600]([/color][color=#000000]f[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Single[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600];[/color][color=#000000] stdcall[/color][color=#666600];[/color][color=#000000] [/color][color=#880000]// thiscall[/color]
[color=#000088]var[/color]
[color=#000000] [/color][color=#660066]This[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]PByte[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#000088]asm[/color]
[color=#000000] push ecx [/color][color=#880000]// Thiscall fix (Useless in this case but better safe than sorry)[/color]
[color=#000000] mov [/color][color=#660066]This[/color][color=#666600],[/color][color=#000000] ecx
[/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]PSingle[/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]8[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]=[/color][color=#000000] [/color][color=#006666]0[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]CurrentSkillLevel[/color][color=#000000] [/color][color=#666600]<[/color][color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]LastValidedSkill[/color][color=#666600]])[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]PSingle[/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]4[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#006666]0[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]PSingle[/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]8[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PSingle[/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]4[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#660066]CalculateExpForNextLevel[/color][color=#666600]([/color][color=#660066]CurrentSkillLevel[/color][color=#666600]+[/color][color=#006666]1[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]SLParam1[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]SLParam2[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]PSingle[/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]4[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PSingle[/color][color=#666600]([/color][color=#660066]This[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]4[/color][color=#666600])^[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] f [/color][color=#666600]*[/color][color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]LastValidedSkill[/color][color=#666600]];[/color]

[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]This[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]asm[/color]
[color=#000000] pop ecx [/color][color=#880000]// Thiscall fix (Useless in this case but better safe than sorry)[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000088]function[/color][color=#000000] [/color][color=#660066]GetSkill[/color][color=#666600]([/color][color=#000000]i[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Longword[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Longword[/color][color=#666600];[/color][color=#000000] cdecl[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] i [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]6[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]LastValidedSkill[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Result[/color][color=#666600];[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000088]function[/color][color=#000000] [/color][color=#660066]IsValidSkill[/color][color=#666600]([/color][color=#660066]Skill[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Longword[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Longbool[/color][color=#666600];[/color][color=#000000] cdecl[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Skill[/color][color=#000000] [/color][color=#666600]>=[/color][color=#000000] [/color][color=#006666]6[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Skill[/color][color=#000000] [/color][color=#666600]<[/color][color=#000000] [/color][color=#006666]24[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]LastValidedSkill[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Skill[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000000]procedure [/color][color=#660066]SkillCapPatch[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]CurrentSkillCap[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]LastValidedSkill[/color][color=#666600]];[/color]
[color=#000000] [/color][color=#000088]asm[/color]
[color=#000000] fld [/color][color=#660066]CurrentSkillCap[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000000]procedure [/color][color=#660066]SkillCapPatch2[/color][color=#666600];[/color]
[color=#000088]asm[/color]
[color=#000000] mov eax[/color][color=#666600],[/color][color=#000000] [/color][color=#666600][[/color][color=#000000]ebp[/color][color=#666600]-[/color][color=#006666]4[/color][color=#666600]][/color]
[color=#000000] mov [/color][color=#660066]CurrentSkillLevel[/color][color=#666600],[/color][color=#000000] eax
jmp [/color][color=#660066]SkillCapPatch[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000088]function[/color][color=#000000] [/color][color=#660066]InitOptions[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Boolean[/color][color=#666600];[/color]
[color=#000088]const[/color]
[color=#000000] INI_ERROR [/color][color=#666600]=[/color][color=#000000] [/color][color=#008800]'Error: Skyrim_[/color][color=red][color=#008800]Elys[/color][/color][color=#008800]_Uncapper.ini'[/color][color=#666600];[/color]
[color=#000000] IS_INVALID_VALUE [/color][color=#666600]=[/color][color=#000000] [/color][color=#008800]' is not a valid value for '[/color][color=#666600];[/color]
[color=#000000] MAX_LEVEL [/color][color=#666600]=[/color][color=#000000] [/color][color=#006666]10000[/color][color=#666600];[/color]

[color=#000088]var[/color]
[color=#000000] [/color][color=#660066]Filename[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]String[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]IniFile[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]TMemIniFile[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Strings[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]TStringList[/color][color=#666600];[/color]
[color=#000000] i[/color][color=#666600],[/color][color=#000000] j[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Level[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Perks[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]PerksPerLevelIndex[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]function[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#000088]const[/color][color=#000000] name[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]String[/color][color=#666600];[/color][color=#000000] [/color][color=#660066]Default[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]var[/color]
[color=#000000] idx[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] idx [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]IndexOfName[/color][color=#666600]([/color][color=#660066]Name[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] idx [/color][color=#666600]<[/color][color=#000000] [/color][color=#006666]0[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Default[/color]
[color=#000000] [/color][color=#000088]else[/color][color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#660066]TryStrToInt[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]ValueFromIndex[/color][color=#666600][[/color][color=#000000]idx[/color][color=#666600]],[/color][color=#000000] [/color][color=#660066]Result[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]>=[/color][color=#000000] [/color][color=#006666]0[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]<=[/color][color=#000000] MAX_LEVEL[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Default[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]PChar[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]ValueFromIndex[/color][color=#666600][[/color][color=#000000]idx[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] IS_INVALID_VALUE [/color][color=#666600]+[/color][color=#000000] [/color][color=#660066]Name[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#008800]'.'[/color][color=#666600]),[/color][color=#000000] INI_ERROR[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]function[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#000088]const[/color][color=#000000] name[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]String[/color][color=#666600];[/color][color=#000000] [/color][color=#660066]Default[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Single[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Single[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]var[/color]
[color=#000000] idx[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] idx [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]IndexOfName[/color][color=#666600]([/color][color=#660066]Name[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] idx [/color][color=#666600]<[/color][color=#000000] [/color][color=#006666]0[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Default[/color]
[color=#000000] [/color][color=#000088]else[/color][color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#660066]TryStrToFloat[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]ValueFromIndex[/color][color=#666600][[/color][color=#000000]idx[/color][color=#666600]],[/color][color=#000000] [/color][color=#660066]Result[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]>=[/color][color=#000000] [/color][color=#006666]0[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]<=[/color][color=#000000] MAX_LEVEL[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Default[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]PChar[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]ValueFromIndex[/color][color=#666600][[/color][color=#000000]idx[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] IS_INVALID_VALUE [/color][color=#666600]+[/color][color=#000000] [/color][color=#660066]Name[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#008800]'.'[/color][color=#666600]),[/color][color=#000000] INI_ERROR[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]function[/color][color=#000000] [/color][color=#660066]SafeReadBool[/color][color=#666600]([/color][color=#000088]const[/color][color=#000000] name[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]String[/color][color=#666600];[/color][color=#000000] [/color][color=#660066]Default[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Boolean[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Boolean[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]var[/color]
[color=#000000] idx[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]Integer[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] idx [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]IndexOfName[/color][color=#666600]([/color][color=#660066]Name[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] idx [/color][color=#666600]<[/color][color=#000000] [/color][color=#006666]0[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Default[/color]
[color=#000000] [/color][color=#000088]else[/color][color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]TryStrToBool[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]ValueFromIndex[/color][color=#666600][[/color][color=#000000]idx[/color][color=#666600]],[/color][color=#000000] [/color][color=#660066]Result[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Default[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]PChar[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]ValueFromIndex[/color][color=#666600][[/color][color=#000000]idx[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] IS_INVALID_VALUE [/color][color=#666600]+[/color][color=#000000] [/color][color=#660066]Name[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#008800]'.'[/color][color=#666600]),[/color][color=#000000] INI_ERROR[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]True[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]SetLength[/color][color=#666600]([/color][color=#660066]Filename[/color][color=#666600],[/color][color=#000000] MAX_PATH [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]GetModuleFileNameW[/color][color=#666600]([/color][color=#660066]HInstance[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]@Filename[/color][color=#666600][[/color][color=#006666]1[/color][color=#666600]],[/color][color=#000000] MAX_PATH [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]IniFile[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]TMemIniFile[/color][color=#666600].[/color][color=#660066]Create[/color][color=#666600]([/color][color=#660066]ExtractFilePath[/color][color=#666600]([/color][color=#660066]Filename[/color][color=#666600])[/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#008800]'SKSE_[/color][color=red][color=#008800]Elys[/color][/color][color=#008800]_Uncapper.ini'[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]PerksPerLevelIndex[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#006666]0[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]try[/color]
[color=#000000] [/color][color=#660066]Strings[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]TStringList[/color][color=#666600].[/color][color=#660066]Create[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]try[/color]
[color=#000000] [/color][color=#660066]FormatSettings[/color][color=#666600].[/color][color=#660066]DecimalSeparator[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#008800]'.'[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]SetLength[/color][color=#666600]([/color][color=#660066]TrueBoolStrs[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]2[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]TrueBoolStrs[/color][color=#666600][[/color][color=#006666]0[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#008800]'True'[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]TrueBoolStrs[/color][color=#666600][[/color][color=#006666]1[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#008800]'1'[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]SetLength[/color][color=#666600]([/color][color=#660066]FalseBoolStrs[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]2[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]FalseBoolStrs[/color][color=#666600][[/color][color=#006666]0[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#008800]'False'[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]FalseBoolStrs[/color][color=#666600][[/color][color=#006666]1[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#008800]'0'[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]IniFile[/color][color=#666600].[/color][color=#660066]ReadSectionValues[/color][color=#666600]([/color][color=#008800]'General'[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]Strings[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]Enabled[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadBool[/color][color=#666600]([/color][color=#008800]'bEnabled'[/color][color=#666600],[/color][color=#000000] [/color][color=#000088]False[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillEffectFormulasCap[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iSkillEffectFormulasCap'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]

[color=#000000] [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]Clear[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]IniFile[/color][color=#666600].[/color][color=#660066]ReadSectionValues[/color][color=#666600]([/color][color=#008800]'SkillCaps'[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]Strings[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]AlterationID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iAlteration'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]ArcheryID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iArchery'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]AlchemyID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iAlchemy'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]ConjurationID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iConjuration'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]BlockID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iBlock'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]LightArmorID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iLightArmor'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]DestructionID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iDestruction'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]HeavyArmorID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iHeavyArmor'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]LockpickingID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iLockpicking'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]EnchantingID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iEnchanting'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]OneHandedID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iOneHanded'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]PickpocketID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iPickpocket'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]IllusionID[/color][color=#666600]]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iIllusion'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]SmithingID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iSmithing'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]SneakID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iSneak'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]RestorationID[/color][color=#666600]]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iRestoration'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]TwoHandedID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iTwoHanded'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillCaps[/color][color=#666600][[/color][color=#660066]SpeechID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadInteger[/color][color=#666600]([/color][color=#008800]'iSpeech'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]100[/color][color=#666600]);[/color]


[color=#000000] [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]Clear[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]IniFile[/color][color=#666600].[/color][color=#660066]ReadSectionValues[/color][color=#666600]([/color][color=#008800]'SkillExpGainMults'[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]Strings[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]AlterationID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fAlteration'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]ArcheryID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fArchery'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]AlchemyID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fAlchemy'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]ConjurationID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fConjuration'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]BlockID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fBlock'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]LightArmorID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fLightArmor'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]DestructionID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fDestruction'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]HeavyArmorID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fHeavyArmor'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]LockpickingID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fLockpicking'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]EnchantingID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fEnchanting'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]OneHandedID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fOneHanded'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]PickpocketID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fPickpocket'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]IllusionID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fIllusion'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]SmithingID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fSmithing'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]SneakID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fSneak'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]RestorationID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fRestoration'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]TwoHandedID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fTwoHanded'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SkillMults[/color][color=#666600][[/color][color=#660066]SpeechID[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]SafeReadFloat[/color][color=#666600]([/color][color=#008800]'fSpeech'[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]);[/color]

[color=#000000] [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]Clear[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]IniFile[/color][color=#666600].[/color][color=#660066]ReadSectionValues[/color][color=#666600]([/color][color=#008800]'PerksPerLevelAndAbove'[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]Strings[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]SetLength[/color][color=#666600]([/color][color=#660066]PerksPerLevel[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]Count[/color][color=#666600]);[/color]

[color=#000000] [/color][color=#660066]For[/color][color=#000000] i [/color][color=#666600]:=[/color][color=#000000] [/color][color=#006666]0[/color][color=#000000] to [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]Count[/color][color=#000000] [/color][color=#666600]-[/color][color=#000000] [/color][color=#006666]1[/color][color=#000000] [/color][color=#000088]do[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#660066]TryStrToInt[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]Names[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]],[/color][color=#000000] [/color][color=#660066]Level[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]>[/color][color=#000000] [/color][color=#006666]0[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]<=[/color][color=#000000] MAX_LEVEL[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#660066]TryStrToInt[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]ValueFromIndex[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]],[/color][color=#000000] [/color][color=#660066]Perks[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Perks[/color][color=#000000] [/color][color=#666600]>=[/color][color=#000000] [/color][color=#006666]0[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]and[/color][color=#000000] [/color][color=#666600]([/color][color=#660066]Perks[/color][color=#000000] [/color][color=#666600]<=[/color][color=#000000] [/color][color=#006666]255[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#660066]PerksPerLevelIndex[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Level[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#660066]PerksPerLevelIndex[/color][color=#666600]].[/color][color=#660066]Perks[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Perks[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Inc[/color][color=#666600]([/color][color=#660066]PerksPerLevelIndex[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#000088]end[/color]
[color=#000000] [/color][color=#000088]else[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]PChar[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#008800]' is not a correct Perks value for [PerksPerLevelAndAbove].'[/color][color=#666600]),[/color][color=#000000] INI_ERROR[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600])[/color]
[color=#000000] [/color][color=#000088]else[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]PChar[/color][color=#666600]([/color][color=#660066]Strings[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]][/color][color=#000000] [/color][color=#666600]+[/color][color=#000000] [/color][color=#008800]' is not a correct Level value for [PerksPerLevelAndAbove].'[/color][color=#666600]),[/color][color=#000000] INI_ERROR[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600]);[/color]

[color=#000000] [/color][color=#000088]finally[/color]
[color=#000000] [/color][color=#660066]Strings[/color][color=#666600].[/color][color=#660066]Free[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]SetLength[/color][color=#666600]([/color][color=#660066]PerksPerLevel[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]PerksPerLevelIndex[/color][color=#666600]);[/color]

[color=#000000] [/color][color=#000088]for[/color][color=#000000] j [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]High[/color][color=#666600]([/color][color=#660066]PerksPerLevel[/color][color=#666600])[/color][color=#000000] [/color][color=#666600]-[/color][color=#000000] [/color][color=#006666]1[/color][color=#000000] downto [/color][color=#006666]1[/color][color=#000000] [/color][color=#000088]do[/color]
[color=#000000] [/color][color=#000088]for[/color][color=#000000] i [/color][color=#666600]:=[/color][color=#000000] [/color][color=#006666]0[/color][color=#000000] to j [/color][color=#000088]do[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]>[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Perks[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Perks[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i[/color][color=#666600]].[/color][color=#660066]Perks[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]].[/color][color=#660066]Perks[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]].[/color][color=#660066]Level[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Level[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]PerksPerLevel[/color][color=#666600][[/color][color=#000000]i [/color][color=#666600]+[/color][color=#000000] [/color][color=#006666]1[/color][color=#666600]].[/color][color=#660066]Perks[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Perks[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]except[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]'SKSE [/color][color=red][color=#008800]Elys[/color][/color][color=#008800] Uncapper encountered an error while attempting to read SKSE_[/color][color=red][color=#008800]Elys[/color][/color][color=#008800]_Uncapper.ini. The plugin is not enabled'[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]'Error'[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]False[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]IniFile[/color][color=#666600].[/color][color=#660066]Free[/color][color=#666600];[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#660066]Function[/color][color=#000000] [/color][color=#660066]SKSEPlugin_Query[/color][color=#666600]([/color][color=#000088]const[/color][color=#000000] skse[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]SKSEInterface[/color][color=#666600];[/color][color=#000000] [/color][color=#000088]var[/color][color=#000000] [/color][color=#660066]Info[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]PluginInfo[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Boolean[/color][color=#666600];[/color][color=#000000] cdecl[/color][color=#666600];[/color]
[color=#000088]begin[/color]

[color=#000000] [/color][color=#660066]Info[/color][color=#666600].[/color][color=#000000]infoVersion [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]PluginInfo[/color][color=#666600].[/color][color=#000000]kInfoVersion[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Info[/color][color=#666600].[/color][color=#000000]name [/color][color=#666600]:=[/color][color=#000000] [/color][color=#008800]'SKSE_[/color][color=red][color=#008800]Elys[/color][/color][color=#008800]_Uncapper'[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Info[/color][color=#666600].[/color][color=#000000]version [/color][color=#666600]:=[/color][color=#000000] PLUGIN_VER[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]False[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] skse[/color][color=#666600].[/color][color=#000000]isEditor [/color][color=#666600]<>[/color][color=#000000] [/color][color=#006666]0[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] skse[/color][color=#666600].[/color][color=#000000]skseVersion [/color][color=#666600]<[/color][color=#000000] SKSE_VER [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]'SKSE [/color][color=red][color=#008800]Elys[/color][/color][color=#008800] Uncapper requires SKSE Version 1.4.2 or higher.'[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]'Error: Plugin not enabled'[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] skse[/color][color=#666600].[/color][color=#000000]runtimeVersion [/color][color=#666600]<>[/color][color=#000000] SKYRIM_VER [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]MessageBox[/color][color=#666600]([/color][color=#006666]0[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]'SKSE [/color][color=red][color=#008800]Elys[/color][/color][color=#008800] Uncapper only supports Skyrim Version 1.3.10.'[/color][color=#666600],[/color][color=#000000] [/color][color=#008800]'Error: Plugin not enabled'[/color][color=#666600],[/color][color=#000000] MB_ICONERROR[/color][color=#666600]);[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]True[/color][color=#666600];[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#660066]Function[/color][color=#000000] [/color][color=#660066]SKSEPlugin_Load[/color][color=#666600]([/color][color=#000088]const[/color][color=#000000] skse[/color][color=#666600]:[/color][color=#000000] [/color][color=#660066]SKSEInterface[/color][color=#666600]):[/color][color=#000000] [/color][color=#660066]Boolean[/color][color=#666600];[/color][color=#000000] cdecl[/color][color=#666600];[/color]
[color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]False[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]If[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]InitOptions[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]Enabled[/color][color=#000000] [/color][color=#000088]then[/color]
[color=#000000] [/color][color=#000088]begin[/color]
[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]True[/color][color=#666600];[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]end[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]GetActorLevel[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#000000]$00A512D0[/color][color=#666600]);[/color][color=#000000] [/color][color=#880000]// Don't forget to update the call used with new Player pointer[/color]
[color=#000000] [/color][color=#660066]CalculateExpForNextLevel[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#000000]$0088DB20[/color][color=#666600]);[/color]
[color=#000000] sub_650A70 [/color][color=#666600]:=[/color][color=#000000] [/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#000000]$00650A70[/color][color=#666600]);[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]ReplaceE8CallTarget[/color][color=#666600]([/color][color=#660066]PByte[/color][color=#666600]([/color][color=#000000]$0088DCE3[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@IsValidSkill[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// IsValidSkill[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]ReplaceE8CallTarget[/color][color=#666600]([/color][color=#660066]PByte[/color][color=#666600]([/color][color=#000000]$0088DA62[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@GetSkill[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// GetSKill[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] pSkillCapPatch [/color][color=#666600]:=[/color][color=#000000] [/color][color=#006666]@SkillCapPatch[/color][color=#666600];[/color]
[color=#000000] pSkillCapPatch2 [/color][color=#666600]:=[/color][color=#000000] [/color][color=#006666]@SkillCapPatch2[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]SetFF15Call[/color][color=#666600]([/color][color=#660066]PByte[/color][color=#666600]([/color][color=#006666]@CalculateExpForNextLevel[/color][color=#666600])+[/color][color=#006666]9[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]@pSkillCapPatch[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// Skill Exp Curve Cap[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]SetFF15Call[/color][color=#666600]([/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#000000]$0088DE80[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@pSkillCapPatch[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// Skill Cap[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]
[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]SetFF15Call[/color][color=#666600]([/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#000000]$0088DD27[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@pSkillCapPatch2[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// Skill Cap 2[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]ReplaceE8CallTarget[/color][color=#666600]([/color][color=#660066]PByte[/color][color=#666600]([/color][color=#000000]$0088DD6A[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@hook_650A70[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// sub_650A70 hook;[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]ReplaceE8CallTarget[/color][color=#666600]([/color][color=#660066]PByte[/color][color=#666600]([/color][color=#000000]$009EA32D[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@IncreasePerkPool[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// Perk Management. Dont forget update offset inside function[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]ReplaceE8CallTarget[/color][color=#666600]([/color][color=#660066]PByte[/color][color=#666600]([/color][color=#000000]$0088DE74[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@IncreaseSkillExp[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// Skill Exp Mult[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]Overwrite[/color][color=#666600]([/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#000000]$006537A8[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@SkillEffectFormulasCap[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]4[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// Uncap formulas[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#000088]if[/color][color=#000000] [/color][color=#000088]not[/color][color=#000000] [/color][color=#660066]Overwrite[/color][color=#666600]([/color][color=#660066]Pointer[/color][color=#666600]([/color][color=#000000]$007D2024[/color][color=#666600]),[/color][color=#000000] [/color][color=#006666]@FixSneakOver100CheckCode[/color][color=#666600],[/color][color=#000000] [/color][color=#006666]6[/color][color=#666600])[/color][color=#000000] [/color][color=#000088]then[/color][color=#000000] [/color][color=#880000]// Sneak Formula Cap Fix[/color]
[color=#000000] [/color][color=#660066]Exit[/color][color=#666600];[/color]

[color=#000000] [/color][color=#660066]Result[/color][color=#000000] [/color][color=#666600]:=[/color][color=#000000] [/color][color=#000088]True[/color][color=#666600];[/color]
[color=#000088]end[/color][color=#666600];[/color]

[color=#000000]exports
[/color][color=#660066]SKSEPlugin_Query[/color][color=#666600],[/color][color=#000000] [/color][color=#660066]SKSEPlugin_Load[/color][color=#666600];[/color]

[color=#000088]begin [/color]

[color=#000088]end[/color][color=#666600].[/color]
User avatar
Anna S
 
Posts: 3408
Joined: Thu Apr 19, 2007 2:13 am

Post » Mon Jun 18, 2012 1:39 pm

Thanks for that. Sadly this goes beyond my level of understanding. I never had much interest in assembler level programming thus I surely can make educated guesses on what is going on there but I couldn't do anything in a targeted fashion. Looks like one has to take look at Skyrims Exe and Memory footprints and manipulate those to create any effect via SKSE or wait until the super nice guys behind SKSE did it for us and provide nice APIs to do stuff using high level functions.
User avatar
jason worrell
 
Posts: 3345
Joined: Sat May 19, 2007 12:26 am


Return to V - Skyrim