Help File:Money type

From Cheat Engine
Revision as of 18:49, 19 September 2016 by Dark Byte (talk | contribs) (Created page with '<hr><div align="left"><font face="Arial" color="#010101" class="Arial2"> The following custom type script will handle values that need to be divided by 100 to get to the corre…')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

The following custom type script will handle values that need to be divided by 100 to get to the

correct value

This type is used by some games like civilization 5 where the money and research technology is

stored using this floating point type.

example:
100.35 gold would be stored in memory as 10013
103.89 gold would be stored in memory as 10389

with this script you'd be able to scan for 100 and 103 respectively, and if you wanted to change

the value to 700 you'd just change the value to 700 instead of 70000


alloc(TypeName,256)
alloc(ByteSize,4)
alloc(ConvertRoutine,1024)
alloc(ConvertBackRoutine,1024)

TypeName:
db 'Civ 5 Float',0

ByteSize:
dd 4

//The convert routine should hold a routine that converts the data to an

nteger (in eax)

//function declared as: stdcall int ConvertRoutine(unsigned char

  • input);

//Note: Keep in mind that this routine can be called by multiple threads

at the same time.

ConvertRoutine:
[32-bit]
push ebp
mov ebp,esp
push ecx
mov ecx,[ebp+8]
[/32-bit]

//at this point ecx contains the address where the bytes are stored
//save the used registers

push edx //fun fact about ce's assembler, because push ebx does not

exist in 64-bit it becomes the 64-bit push rdx automatically
push ebx

//put the bytes into the eax register

mov eax,[ecx] //second fun fact, addressing with 32-bit registers doesn't work in 64-bit, it becomes a 64-bit automatically (most of the

time)

xor edx,edx
mov ebx,#100

div ebx //divide eax by 100 and put the result in eax (and leftover in

edx)

pop ebx
pop edx
//and now exit the routine
[64-bit]
ret
[/64-bit]
[32-bit]
pop ecx
pop ebp
ret 4
[/32-bit]

//The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new

value)

//function declared as: stdcall void ConvertBackRoutine(int i, unsigned

char *output);
ConvertBackRoutine:
[32-bit]
push ebp
mov ebp,esp
push edx //save the registers
push ecx
mov edx,[ebp+0c]
mov ecx,[ebp+08]
[/32-bit]

//at this point edx contains the address to write the value to
//and ecx contains the value
push eax
push edx
push ecx

mov eax,ecx //eax gets the given value
xor edx,edx //clear edx
mov ecx,#100

mul ecx //multiply eax and put the results into edx:eax (edx is ignored

for this routine)

pop ecx
pop edx
mov [edx],eax
pop eax

[64-bit]
//everything is back to what it was, so exit
ret
[/64-bit]

[32-bit]
//cleanup first
pop ecx
pop edx
pop ebp
ret 8
[/32-bit]