I don't know if this has been posted here, but I was trying to find built in debug or dev cheats since the strings are still attached, and I found something related to the Game Time itself. Also, my assumption might be wrong, but the way the Liquid Engine (the game engine for Frostpunk) sets up the game time is a bit weird, since it divides by the byte size limit itself.
1 minute = 64 seconds
4 minutes = 256 seconds = 1 quadminute (I don't know what to call it...)
15 quadminutes or 60 minutes = 1 hour
Here's the Game Time Modifier script should anyone understand more about it, by yours truly:
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>51</ID>
<Description>"Game Time Modifier (pause once to update)"</Description>
<LastState Activated="1"/>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>{$LUA}
if not syntaxcheck then
if not GameTimeScript then
GameTimeScript = 1
showMessage("Unpause game once to update.\n(This will only show once)")
end
end
--GameTimeScript = nil
{$ASM}
[ENABLE]
aobscanmodule(aob_GameTimers,$process,48xxxxxxxxxxxx48xxxxxxxxxxxx48xxxxxxxxxxxxxxxxxx48xxxxxxxxxxxxxxxxxxxxxx48xxxxxxxxC3xxCCxxCCxxCCxxCCxxCCxxCCxx48xxxxxxxxE9xxxxxxxxxxCCCC)
registersymbol(aob_GameTimers)
alloc(newmem_GameTimers,$100,aob_GameTimers)
label(return_GameTimers)
alloc(bkp_GameTimers,7,aob_GameTimers)
registersymbol(bkp_GameTimers)
bkp_GameTimers:
readmem(aob_GameTimers,7)
registersymbol(GameTime)
newmem_GameTimers:
@@:
push rdx
push rbx
push rdi
@@:
mov rdx,[bkp_GameTimers+3]
mov rbx,rdx
sub rdx,D8
mov rdi,[rax+rdx]
mov rdi,[rdi]
mov rdi,[rdi+90]
cmp [rdi],'Game'
jne @f
xor rdi,rdi
lea rdi,[rax+rbx]
mov [GameTime],rdi
@@:
pop rdi
pop rbx
pop rdx
cave_GameTimers:
readmem(aob_GameTimers,7)
{
mov rax,[rax+000000E0]
}
jmp return_GameTimers
GameTime:
dd 0
aob_GameTimers:
jmp newmem_GameTimers
nop 2
return_GameTimers:
[DISABLE]
aob_GameTimers:
readmem(bkp_GameTimers,7)
unregistersymbol(GameTime)
unregistersymbol(aob_GameTimers)
dealloc(newmem_GameTimers)
dealloc(bkp_GameTimers)
unregistersymbol(bkp_GameTimers)
{
// ORIGINAL CODE - INJECTION POINT: Frostpunk.exe+1081639
}
</AssemblerScript>
<CheatEntries>
<CheatEntry>
<ID>52</ID>
<Description>"Frostpunk WeirdDays"</Description>
<LastState Value="0" RealAddress="29B4D9ECFD4"/>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Byte</VariableType>
<Address>GameTime</Address>
<Offsets>
<Offset>4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>53</ID>
<Description>"Frostpunk Quadminutes (1 == 4 minutes)"</Description>
<LastState Value="0" RealAddress="29B4D9ECFD3"/>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Byte</VariableType>
<Address>GameTime</Address>
<Offsets>
<Offset>3</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>54</ID>
<Description>"Frostpunk Seconds (64 = 1 Minute)"</Description>
<LastState Value="0" RealAddress="29B4D9ECFD2"/>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Byte</VariableType>
<Address>GameTime</Address>
<Offsets>
<Offset>2</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatTable>
I included the WeirdDays pointer because I didn't understand how it works, but it's somehow related to the time itself.
Also, the count begins from the moment you start the entire gameplay, so by setting everything to 0, the time might be Day 1, 7:30 AM (depending on what time the game sets the initial time).