Code:
; Civilization V game trainer by cocodrilo.
; this file not modify or redirect any piece of code.
; Compile with fasm, inject and play :).
; md5 for a tested game dll: 0079e9cc9abbca3678a5d6fa36b46bca CvGameCoreDLLFinal Release.dll
; update offsets for other version if need.
format PE GUI 4.0 DLL
entry main
include 'win32a.inc'
section 'import' import data readable writeable
library u32,'user32.dll',\
k32,'kernel32.dll'
import u32,\
SetWindowLong,'SetWindowLongA',\
MessageBox,'MessageBoxA',\
FindWindow,'FindWindowA',\
CallWindowProc,'CallWindowProcA'
import k32,\
GetModuleHandle,'GetModuleHandleA'
section 'rel' fixups data discardable
section 'data' data readable writeable
class db 'WinClass_FXS',0 ;Game windows class
sDll db 'CvGameCoreDLLFinal Release.dll',0 ;dll of the game
Dll dd 0 ;Dll base
oProc dd 0 ;Old windowProc
Players dd 0 ;Players pointer
offsetToptr equ 28A700h ;offset to Players pointer.
tSize equ 0F400h ;To iterate in players, ex: PlayerBase+(index*tSize), index 0 is your player to MAX_PLAYERS.
fUnitOfsset equ 0F1FD0h ;offset to firstUnit method in cvunit class.
nUnitOffset equ 0EF950h ;offset to nextUnit method int cvunit class.
unitIndex dd 0 ;ptr to unit index required in first/nextUnit.
FirstUnit dd 0 ;address of this method
NextUnit dd 0 ;address of this method
TrainerError db 'Error in trainer',0
section 'code' code readable executable
proc main hInst,reason,reserved
cmp [reason],DLL_PROCESS_ATTACH
jne .none
push wndProc
push class
call setGameWindow ;setup my own windowproc for game window.
mov [oProc],eax
push sDll
call [GetModuleHandle]
dec eax
jns .exit
push 0
push TrainerError
push TrainerError
push 0
call [MessageBox]
xor eax,eax
ret
.exit:
inc eax ;adjust eax (dll base address) after verification.
mov [Dll],eax
mov ecx,dword [eax+offsetToptr]
mov [Players],ecx
mov [FirstUnit],eax
mov [NextUnit],eax
add [FirstUnit],fUnitOfsset
add [NextUnit],nUnitOffset
.none:
mov eax,1
ret
endp
;set my windowproc to game window.
proc setGameWindow wCls,wProc
push 0
push [wCls]
call [FindWindow]
dec eax
js .exit
inc eax
push [wProc]
push GWL_WNDPROC
push eax
call [SetWindowLong]
.exit:
ret
endp
;only to handle options.
proc wndProc h,msg,wParam,lParam
cmp [msg],WM_KEYDOWN
jne .exit
cmp [wParam],VK_F1
je .F1
cmp [wParam],VK_F2
je .F2
jmp .exit
.F1:
;F1: Add 5000 gold to your player (remember index 0).
push 0
call getPlayer
or eax,eax
jz .exit
mov eax,dword [eax+0F3D0h] ; get treasury from player
push 1388h ;5000
push eax ;player base
call addGold
jmp .exit
.F2:
;F2: Add 9 moves to all militar units from player 0 (you).
push 0
call getPlayer
push 21Ch ;9 moves * 60
push eax
call addMoves
.exit:
push [lParam]
push [wParam]
push [msg]
push [h]
push [oProc]
call [CallWindowProc]
ret
endp
;index is a index of player
proc getPlayer index
mov eax,[index]
mov ebx,tSize
mul ebx
mov ebx,[Players]
add eax,ebx
ret
endp
;tBase is treasury base for player to set gold.
;nGold is value to add
proc addGold tBase, nGold
push edx
xor eax,eax
xor ebx,ebx
mov edx,dword [tBase]
push edx
add ebx, [nGold]
mov eax,64h
mul ebx
pop edx
add dword [edx+8],eax ;save new gold in [treasury+8]
pop edx
ret
endp
;this function add extra moves to all militar units of player
;pBase is player base.
;moves is number of moves to set (number of moves * 60) ex: 9 * 60 to set 9 moves.
proc addMoves pBase,moves
push 0
push unitIndex
mov ecx,dword [pBase] ;is a thiscall calling convention
call dword [FirstUnit]
.iterate:
test eax,eax
jz .finish
cmp dword [eax+45Ch],0
jne .combat_unit
inc dword [unitIndex]
push 0
push unitIndex
mov ecx,dword [pBase]
call dword [NextUnit]
jmp .iterate
.combat_unit:
push dword [moves]
pop dword [eax+130h] ;set new moves
jmp $-22h ;get next unit
.finish:
ret
endp
So it is only example, this way you can remove the enemies movements, gold etc. need not wait for turns, or turn on or off option, only affected the player you want when you want.
feel free to use this code, adapt it, burn it or do with what you want. no one is perfect, for any errors you can fix yourself. next example, paint on the game screen without modification of code (OpenGL). for example to make menus or display any information on the screen.