gokuta Posted December 31, 2014 Share Posted December 31, 2014 (edited) Let's visualize such an opcode: 7FFE: [email protected] is_the_sum_of 2 5 // [email protected] stores a value of 7 after executing this opcode 7FFE=3,%3d% is_the_sum_of %1d% %2d% Not let's extend this to accept variable number of arguments: 7FFF: [email protected] is_the_sum_of 2 5 4 5 6 2 7 8 7FFF=-1,%1d% is_the_sum_of %2d% %3d% The argument for storing the sum has to be the first one in this case. But is there a way to skip the first argument, sum up all the rest arguments and only then set the first argument to some value?Similarly to this opcode: 0AD3: [email protected] = format "%d + %d = %d" 2 2 4 0AD3=-1,%1d% = format %2s% Edited January 1, 2015 by gokuta Link to comment Share on other sites More sharing options...
DK22Pac Posted January 1, 2015 Share Posted January 1, 2015 #include "CLEO.h" // 7FFF: [email protected] = 1 + 2 + 3 // 7FFF=-1,%1d% = %2d% + %3d% + %4d% OpcodeResult WINAPI Sum(CScriptThread* thread) { // save current script position BYTE *firstParam = thread->ip; CLEO_SkipOpcodeParams(thread, 1); // skip %1d% int result = CLEO_GetIntOpcodeParam(thread); // it must have at least one addendum, right? // now read all additional parameters while(CLEO_GetOperandType(thread)) result += CLEO_GetIntOpcodeParam(thread); // save current script position BYTE *lastParam = thread->ip + 1; // we add '1' so we skip terminating '0' // 'jump' to the first parameter thread->ip = firstParam; CLEO_SetIntOpcodeParam(thread, result); // 'jump' after the last parameter thread->ip = lastParam; return OR_CONTINUE; } BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) { if(reason == DLL_PROCESS_ATTACH) CLEO_RegisterOpcode(0x7FFF, Sum); return TRUE; } {$CLEO} 0000: while true wait 0 7FFF: [email protected] = 52 + 3416 + 322347 + -124124 + 7 + -95233 0AD1: show_formatted_text_highpriority "(106465) : %d" time 100 [email protected] end goodidea82 1 Link to comment Share on other sites More sharing options...
gokuta Posted January 1, 2015 Author Share Posted January 1, 2015 (edited) What about this variable? BYTE *baseIp; //pointer to begin of script in memory Maybe it also stores the first thread->ip? If no, what is it? Edited January 1, 2015 by gokuta Link to comment Share on other sites More sharing options...
fastman92 Posted January 1, 2015 Share Posted January 1, 2015 That's a constant base address for script bytes. For CLEO scripts it points to the beginning of .cs file loaded into memory. Link to comment Share on other sites More sharing options...
gokuta Posted January 1, 2015 Author Share Posted January 1, 2015 That's a constant base address for script bytes. For CLEO scripts it points to the beginning of .cs file loaded into memory. Someone should consider writing a tutorial on CScriptThread structure. That's so many variables and I've got no clue what I can possibly achieve with all that Link to comment Share on other sites More sharing options...
fastman92 Posted January 1, 2015 Share Posted January 1, 2015 Moreover, there's no CScriptThread in real GTA game source code. There's a class CRunningScript instead. CScriptThread is the name invented by the CLEO creators, because the real name was not known until GTA games for Android were released. A simple C++ statement to make both names valid may look like this: typedef CScriptThread CRunningScript; Link to comment Share on other sites More sharing options...
NTAuthority Posted January 2, 2015 Share Posted January 2, 2015 because the real name was not known until GTA games for Android were releasedfalse, it was known ever since GTA3 was released on PS2 Inactive in GTA/R* title modification indefinitely pursuant to a court order obtained by TTWO. Good job acting against modding! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now