It worked fine the first time I used it, but there was no response the second time I used it. I saw an error report. I have verified the integrity of the file on Steam. My native language is not English, so I use Google Translate, sorry.
// Warning!
// This script uses a little assembly hack.
// Saving this script will always give an error on the same line:
// aob_debug+(DWORD)[aob_debug+0B]+10:
// Don't pay it any heed
//=========================================
[ENABLE]
//=========================================
{$LUA}
memrec.Color = 0x00008000
{$ASM}
// Checksum1: Affects ck3.exe+29B1BF0 +F8
// ==============================================
AobScanModule(aob_checksum1, $process, 80 B9 F8 00 00 00 00 74 29) // Checksum1 read in menu
// Checksum2: Affects ck3.exe+29B1BF0 +F9
// ==============================================
AobScanModule(aob_checksum2_a, $process, 80 B9 F9 00 00 00 00 74 20) // Checksum2 read in menu
AobScanModule(aob_checksum2_b, $process, 80 B9 F9 00 00 00 00 48 8B) // Checksum2 on save load
AobScanModule(aob_checksum2_c, $process, 80 B8 F9 00 00 00 00 74 04) // Checksum2 - not sure when this triggers
// Included for good measure
![Razz :P](./images/smilies/icon_razz.gif)
AobScanModule(aob_checksum2_d, $process, 0F 94 C0 20 83 F9 00 00 00) // Checksum2 read in achievement screen
// Ironman: Affects ck3.exe+29B1BF0 +FA
// ==============================================
AobScanModule(aob_ironman, $process, 80 B9 FA 00 00 00 00 74 3B) // Ironman being read from menu
// Unknown: Affects ck3.exe+29B1BF0 +FB
// ==============================================
AobScanModule(aob_savegame, $process, 80 B9 FB 00 00 00 00 74 32) // Savegame/Steam check (not sure)?
// Trigger: Affects ck3.exe+29B1BF0 +F8,+F9,+FB
// ==============================================
AobScanModule(aob_trigger, $process, 40 88 B8 FA 00 00 00 40 88) // Trigger for Checksum2
// Fires on ironman-button change
// Timer: Reads the debug_mode static pointer
// ==============================================
AobScanModule(aob_debug, $process, 4C 8B AD C8 00 00 00 33 F6) // Timer reading debug_mode
alloc(achievement_script,8192,$process))
label(set_checksum1)
label(return_checksum1)
label(set_checksum2_a)
label(return_checksum2_a)
label(set_checksum2_b)
label(return_checksum2_b)
label(set_checksum2_c)
label(return_checksum2_c)
label(set_checksum2_d)
label(return_checksum2_d)
label(set_ironman)
label(return_ironman)
label(set_savegame)
label(return_savegame)
label(set_trigger)
label(return_trigger)
label(pDebug)
label(base_achievement_pointer)
registersymbol(set_checksum1)
registersymbol(return_checksum1)
registersymbol(set_checksum2_a)
registersymbol(return_checksum2_a)
registersymbol(set_checksum2_b)
registersymbol(return_checksum2_b)
registersymbol(set_checksum2_c)
registersymbol(return_checksum2_c)
registersymbol(set_checksum2_d)
registersymbol(return_checksum2_d)
registersymbol(set_ironman)
registersymbol(return_ironman)
registersymbol(set_savegame)
registersymbol(return_savegame)
registersymbol(set_trigger)
registersymbol(return_trigger)
registersymbol(pDebug)
registersymbol(base_achievement_pointer)
registersymbol(aob_checksum1)
registersymbol(aob_checksum2_a)
registersymbol(aob_checksum2_b)
registersymbol(aob_checksum2_c)
registersymbol(aob_checksum2_d)
registersymbol(aob_ironman)
registersymbol(aob_savegame)
registersymbol(aob_trigger)
registersymbol(aob_debug)
//=========================================
// Actual script
//=========================================
achievement_script:
set_checksum1:
mov [base_achievement_pointer], rcx // Save achievement pointer
mov byte ptr [rcx+F8],01 // Set Checksum1 = 1
cmp byte ptr [rcx+000000F8],00 // Original code
jmp return_checksum1
// Following 2 are the same code, but in different locations.
// I split them up because the code might change in the future.
set_checksum2_a:
mov [base_achievement_pointer], rcx // Save achievement pointer
mov byte ptr [rcx+F9],01 // Set Checksum2 = 1
cmp byte ptr [rcx+000000F9],00 // Original code
jmp return_checksum2_a
set_checksum2_b:
mov [base_achievement_pointer], rcx // Save achievement pointer
mov byte ptr [rcx+F9],01 // Set Checksum2 = 1
cmp byte ptr [rcx+000000F9],00 // Original code
jmp return_checksum2_b
set_checksum2_c:
mov [base_achievement_pointer], rax // Save achievement pointer
mov byte ptr [rax+F9],01 // Set Checksum2 = 1
cmp byte ptr [rax+000000F9],00 // Original code
jmp return_checksum2_c
set_checksum2_d:
mov [base_achievement_pointer], rbx // Save achievement pointer
mov byte ptr [rbx+F9],01 // Set Checksum2 = 1
jmp return_checksum2_d
set_ironman:
mov [base_achievement_pointer], rcx // Save achievement pointer
mov byte ptr [rcx+FA],01 // Set Ironman = 1
cmp byte ptr [rcx+000000FA],00 // Original code
jmp return_ironman
set_savegame:
mov [base_achievement_pointer], rcx // Save achievement pointer
mov byte ptr [rcx+FB],01 // Set ...Something? = 1
cmp byte ptr [rcx+000000FB],00 // Original code
jmp return_savegame
set_trigger:
mov [base_achievement_pointer], rax // Save achievement pointer
mov byte ptr [rax+F8],01 // Set Checksum1 = 1
mov byte ptr [rax+F9],01 // Set Checksum2 = 1
mov byte ptr [rax+FB],01 // Set ...Something? = 1
mov [rax+000000FA],dil // Original code
jmp return_trigger
//=========================================
// Variables
//=========================================
base_achievement_pointer:
dq 0
aob_debug+(DWORD)[aob_debug+0B]+10:
pDebug:
//=========================================
// Hack points
//=========================================
aob_checksum1:
jmp set_checksum1
nop 2
return_checksum1:
aob_checksum2_a:
jmp set_checksum2_a
nop 2
return_checksum2_a:
aob_checksum2_b:
jmp set_checksum2_b
nop 2
return_checksum2_b:
aob_checksum2_c:
jmp set_checksum2_c
nop 2
return_checksum2_c:
aob_checksum2_d:
jmp set_checksum2_d
nop 4
return_checksum2_d:
aob_ironman:
jmp set_ironman
nop 2
return_ironman:
aob_savegame:
jmp set_savegame
nop 2
return_savegame:
aob_trigger:
jmp set_trigger
nop 2
return_trigger:
//=========================================
[DISABLE]
//=========================================
//=========================================
// Put back the original code
//=========================================
aob_checksum1:
// cmp byte ptr [rcx+000000F8],00
db 80 B9 F8 00 00 00 00
aob_checksum2_a:
// cmp byte ptr [rcx+000000F9],00
db 80 B9 F9 00 00 00 00
aob_checksum2_b:
// cmp byte ptr [rcx+000000F9],00
db 80 B9 F9 00 00 00 00
aob_checksum2_c:
// cmp byte ptr [rax+000000F9],00
db 80 B8 F9 00 00 00 00
aob_checksum2_d:
// sete al
// and [rbx+000000F9],al
db 0F 94 C0 20 83 F9 00 00 00
aob_ironman:
// cmp byte ptr [rcx+000000FA],00
db 80 B9 FA 00 00 00 00
aob_savegame:
// cmp byte ptr [rcx+000000FB],00
db 80 B9 FB 00 00 00 00
aob_trigger:
// mov [rax+000000FA],dil
db 40 88 B8 FA 00 00 00
//=========================================
// Clear symbols and memory
//=========================================
unregistersymbol(set_checksum1)
unregistersymbol(return_checksum1)
unregistersymbol(set_checksum2_a)
unregistersymbol(return_checksum2_a)
unregistersymbol(set_checksum2_b)
unregistersymbol(return_checksum2_b)
unregistersymbol(set_checksum2_c)
unregistersymbol(return_checksum2_c)
unregistersymbol(set_checksum2_d)
unregistersymbol(return_checksum2_d)
unregistersymbol(set_ironman)
unregistersymbol(return_ironman)
unregistersymbol(set_savegame)
unregistersymbol(return_savegame)
unregistersymbol(set_trigger)
unregistersymbol(return_trigger)
unregistersymbol(pDebug)
unregistersymbol(base_achievement_pointer)
unregistersymbol(aob_checksum1)
unregistersymbol(aob_checksum2_a)
unregistersymbol(aob_checksum2_b)
unregistersymbol(aob_checksum2_c)
unregistersymbol(aob_checksum2_d)
unregistersymbol(aob_ironman)
unregistersymbol(aob_savegame)
unregistersymbol(aob_trigger)
unregistersymbol(aob_debug)
dealloc(achievement_script)
//=========================================
// Fancy colors!
//=========================================
{$LUA}
memrec.Color = 0x00c08000
{$ASM}