Please have patience guys, unfortunately I made major changes to the Flawless Widescreen engine and it requires that all game fixes be re-written (altho 80% can be copy/pasted), this will hopefully add all the functionality I will ever want or need without having to rip the entire architecture to pieces again - I've spent a probably a solid 2 days rewriting the plugins (most time consuming is revisiting some of the issues with some plugins), probably needs another day or two to complete them all.
Here's the change log for v1.0.10
- Configuration Menu
: Fixed order of the Horizontal and Vertical settings under Surround Assumption
: Fixed a bug where 3x2 for example may cause it to crash during iteration due to missing grid informtion during display building.
: Fixed Bezel Compensation Checkbox not enabling/disabling configuration based on its state.
: Start with Windows option now actually adds a entry to the registry facilitating auto startup.
- Plugin XML Definition
: Added several definitions that can be used as tokens, eg. $MNS = modules namespace, $PNS = plugins namespace. etc.
: Added FixRating for defining how complete a fix is. (0-100)
- Main Window
: Added donation button (suggested by several members of the community)
- Plugin Virtual Machine
: Now powered by LUAJit instead of LUA - this enables JIT compilation of LUA increasing its performance
: Require() can now be used, meaning scripts can be split across several files.
- HackTool Module
: Huge changes to the modularity of the various different objects used for memory manipulation, alot more object oreintated
: Added a decompiler engine, this is based on the open source project BeaEngine - this allows automatic code injection and enables alot of automatic calculations.
: Added a assembly compiler engine, this is based on the open source project FlatASM - again enabling automatic code injection, assembly strings can now be used instead of byte arrays.
: Assembly/Dissassembly interpreter and variable extractor and seemless intergration with Address/Codecave and Pointer objects created in LUA.
- Existing Plugins
: Just about all plugins have been rewritten to take advantage of the new features, all using signature scanning where possible meaning that it should work on Steam/Origin versions seamlessly.
- Plugin specific (due to revisit/re-engineering)
: Mass Effect 2 is now 100% perfectly supporting surround and eyefinity, previously the HUD and menu's were screwed.
: I Am Alive, the issue with objects popping in and out has now been resolved.
: SkyDrift, the water no longer disappears under high FOV conditions.
Several people have donated games to be fixed, but as you are aware I'm running behind, these are:
- Resident Evil 6 donated by Pelzention (actually really want to play this game, so will be targeting 100% perfection, so you might want to hold off playing it)
- Jet Set Radio donate by Lolotov
The change list probably means nothing to most people, but the auto decompiling/assembly based on raw-readable text, as well as being able to pull variables from the original code and inject them at compile time JIT styles is pretty freaking cool
I can do this:
Code:
local AspectFix = HackTool:AddAddress("AspectFix")
HackTool:SignatureScan("D980????????8B??????????D9??????????C3",AspectFix,PAGE_EXECUTE_READ,0x0,Process_EXEName)
local ASM = [[
(codecave:jmp)AspectFix,AspectFix_cc:
%originalcode%
fstp dword ptr [(allocation)Variables->Aspect_In]
fld dword ptr [(allocation)Variables->Aspect_Out]
fst dword ptr [$$2] $context=1
jmp %returnaddress%
%end%
]]
HackTool:CompileAssembly(asm,"AllocationName")
Write_CodeCave("AspectFix_cc")
eg. this line - "fst dword ptr [$$2] $context=1" Pulls the 2nd Mnemonic from Line 1 of the decompiled code at the code cave injection point.
If it was "fld dword ptr [eax+84h]" the injected instruction would be come "fst dword ptr [eax+84h]"
instead of this:
Code:
local ARCodeCave = HackTool:AddCodeCave("AspectFix1",6)
ARCodeCave:SetAddress(0x1093A7)
ARCodeCave:AddSubOffset("JmpOut",1)
ARCodeCave:AddSubOffset("JmpIn",2)
local Data = {0xE9,0,0,0,0,0x90}
for k,v in pairs(Data) do
ARCodeCave:SetByte(k-1,v)
end
local ARAllocation = HackTool:AllocateMemory("AspectFix1",64)
ARAllocation:Allocate()
ARAllocation:AddSubOffset("AddrJmpIn",0)
ARAllocation:AddSubOffset("AddrJmpOut",0x19)
ARAllocation:AddSubOffset("AddrOriginalAspect",0x8)
ARAllocation:AddSubOffset("AddrNewAspect",0xE)
ARAllocation:AddSubOffset("ValueOriginalAspect",0x1D)
ARAllocation:AddSubOffset("ValueNewAspect",0x21)
local Data = {0xD9,0x80,0x00,0x02,0x00,0x00,0xD9,0x1D,0x00,0x00,0x00,0x00,0xD9,0x05,0x00,0x00,0x00,0x00,0xD9,0x90,0x00,0x02,0x00,0x00,0xE9,0x00,0x00,0x00,0x00}
for k,v in pairs(Data) do
ARAllocation:SetByte(k-1,v)
end
ARAllocation:GetSubOffset("AddrOriginalAspect"):SetInt( ARAllocation:GetSubOffset("ValueOriginalAspect"):GetOffset() )
ARAllocation:GetSubOffset("AddrNewAspect"):SetInt( ARAllocation:GetSubOffset("ValueNewAspect"):GetOffset() )
ARCodeCave:GetSubOffset("JmpOut"):SetInt( ARAllocation:GetSubOffset("AddrJmpIn"):GetOffset() - ARCodeCave:GetSubOffset("JmpOut"):GetOffset() - HackTool:GetBaseAddress() -4 )
ARAllocation:GetSubOffset("AddrJmpOut"):SetInt( ARCodeCave:GetSubOffset("JmpIn"):GetOffset() - ARAllocation:GetSubOffset("AddrJmpOut"):GetOffset() + HackTool:GetBaseAddress() )
ARAllocation:WriteData(0,ARAllocation:GetLength())
ARCodeCave:WriteData(0,ARCodeCave:GetLength())