Difference between revisions of "Help File:Money type"
Jump to navigation
Jump to search
(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…') |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | [[Category:Help]] | |
− | The following custom type script will handle values that need to be divided by 100 to get to the | + | == Money type (divided by 100) == |
− | correct value | + | |
− | This type is used by some games like civilization 5 where the money and research technology is | + | The following custom type script will handle values that need to be divided by 100 to get to the correct value |
− | stored using this floating point type. | + | This type is used by some games like civilization 5 where the money and research technology is stored using this floating point type. |
− | + | ||
− | 100.35 gold would be stored in memory as 10013 | + | |
− | 103.89 gold would be stored in memory as 10389 | + | Example: |
− | 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 | + | 100.35 gold would be stored in memory as 10013 |
− | alloc(TypeName,256) | + | |
− | alloc(ByteSize,4) | + | 103.89 gold would be stored in memory as 10389 |
− | alloc(ConvertRoutine,1024) | + | |
− | alloc(ConvertBackRoutine,1024) | + | |
− | TypeName: | + | 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 |
− | db 'Civ 5 Float',0 | + | |
− | ByteSize: | + | |
− | dd 4 | + | alloc(TypeName,256) |
− | //The convert routine should hold a routine that converts the data to an | + | alloc(ByteSize,4) |
− | nteger (in eax) | + | alloc(ConvertRoutine,1024) |
− | //function declared as: stdcall int ConvertRoutine(unsigned char | + | alloc(ConvertBackRoutine,1024) |
− | *input); | + | |
− | //Note: Keep in mind that this routine can be called by multiple threads | + | TypeName: |
− | at the same time. | + | db 'Civ 5 Float',0 |
− | ConvertRoutine: | + | |
− | [32-bit] | + | ByteSize: |
− | push ebp | + | dd 4 |
− | mov ebp,esp | + | |
− | push ecx | + | // The convert routine should hold a routine that converts the data to an nteger (in eax) |
− | mov ecx,[ebp+8] | + | // function declared as: stdcall int ConvertRoutine(unsigned char *input); |
− | [/32-bit] | + | |
− | //at this point ecx contains the address where the bytes are stored | + | // Note: Keep in mind that this routine can be called by multiple threads at the same time. |
− | //save the used registers | + | |
− | push edx //fun fact about ce's assembler, because push ebx does not | + | ConvertRoutine: |
− | exist in 64-bit it becomes the 64-bit push rdx automatically | + | [32-bit] |
− | push ebx | + | push ebp |
− | //put the bytes into the eax register | + | mov ebp,esp |
− | mov eax,[ecx] //second fun fact, addressing with 32-bit registers | + | push ecx |
− | doesn't work in 64-bit, it becomes a 64-bit automatically (most of the | + | mov ecx,[ebp+8] |
− | time) | + | [/32-bit] |
− | xor edx,edx | + | |
− | mov ebx,#100 | + | // at this point ecx contains the address where the bytes are stored |
− | div ebx //divide eax by 100 and put the result in eax (and leftover in | + | // save the used registers |
− | edx) | + | 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 |
− | pop ebx | + | push ebx |
− | pop edx | + | |
− | //and now exit the routine | + | // put the bytes into the eax register |
− | [64-bit] | + | 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) |
− | ret | + | |
− | [/64-bit] | + | xor edx,edx |
− | [32-bit] | + | mov ebx,#100 |
− | pop ecx | + | div ebx // divide eax by 100 and put the result in eax (and leftover in edx) |
− | pop ebp | + | |
− | ret 4 | + | pop ebx |
− | [/32-bit] | + | pop edx |
− | //The convert back routine should hold a routine that converts the given | + | // and now exit the routine |
− | integer back to a row of bytes (e.g when the user wats to write a new | + | [64-bit] |
− | value) | + | ret |
− | //function declared as: stdcall void ConvertBackRoutine(int i, unsigned | + | [/64-bit] |
− | char *output); | + | [32-bit] |
− | ConvertBackRoutine: | + | pop ecx |
− | [32-bit] | + | pop ebp |
− | push ebp | + | ret 4 |
− | mov ebp,esp | + | [/32-bit] |
− | push edx //save the registers | + | |
− | push ecx | + | // 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) |
− | mov edx,[ebp+0c] | + | // function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output); |
− | mov ecx,[ebp+08] | + | ConvertBackRoutine: |
− | [/32-bit] | + | [32-bit] |
− | //at this point edx contains the address to write the value to | + | push ebp |
− | //and ecx contains the value | + | mov ebp,esp |
− | push eax | + | push edx // save the registers |
− | push edx | + | push ecx |
− | push ecx | + | mov edx,[ebp+0c] |
− | mov eax,ecx //eax gets the given value | + | mov ecx,[ebp+08] |
− | xor edx,edx //clear edx | + | [/32-bit] |
− | mov ecx,#100 | + | |
− | mul ecx //multiply eax and put the results into edx:eax (edx is ignored | + | // at this point edx contains the address to write the value to |
− | for this routine) | + | // and ecx contains the value |
− | pop ecx | + | push eax |
− | pop edx | + | push edx |
− | mov [edx],eax | + | push ecx |
− | pop eax | + | |
− | [64-bit] | + | mov eax,ecx // eax gets the given value |
− | //everything is back to what it was, so exit | + | xor edx,edx // clear edx |
− | ret | + | mov ecx,#100 |
− | [/64-bit] | + | mul ecx // multiply eax and put the results into edx:eax (edx is ignored for this routine) |
− | [32-bit] | + | |
− | //cleanup first | + | pop ecx |
− | pop ecx | + | pop edx |
− | pop edx | + | mov [edx],eax |
− | pop ebp | + | pop eax |
− | ret 8 | + | |
− | [ | + | [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] | ||
+ | |||
+ | == Links == | ||
+ | * [[Cheat Engine:Help File|Help File]] | ||
+ | |||
+ | * [[Help_File:Value_types|Back]] | ||
+ | |||
+ | * [[Help_File:old_flash_(div_8)|Next]] |
Latest revision as of 12:08, 19 March 2017
Money type (divided by 100)[edit]
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]