Skip to content

Instantly share code, notes, and snippets.

@riicchhaarrd
Created April 26, 2015 20:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save riicchhaarrd/2770cd9ae3b075bd4234 to your computer and use it in GitHub Desktop.
Save riicchhaarrd/2770cd9ae3b075bd4234 to your computer and use it in GitHub Desktop.
GSC GetArrayKeys/Scr_GetArray/Array contents [CoD2 1.2/1.3 - libcod]
#if COD2_VERSION == COD2_VERSION_1_2
unsigned short (*GetVariableName)(unsigned short) = (unsigned short(*)(unsigned short))0x807CFF6;
unsigned short (*GetNextVariable)(unsigned short) = (unsigned short(*)(unsigned short))0x807CF52; //idk original funcname
#elif COD2_VERSION == COD2_VERSION_1_3
unsigned short (*GetVariableName)(unsigned short) = (unsigned short(*)(unsigned short))0x807D0C2;
unsigned short (*GetNextVariable)(unsigned short) = (unsigned short(*)(unsigned short))0x807D01E; //idk original funcname
#else
unsigned short (*GetVariableName);
unsigned short (*GetNextVariable);
#endif
unsigned short get_var_by_idx(unsigned short index) {
#if COD2_VERSION == COD2_VERSION_1_2
unsigned short *words = (unsigned short*)0x817C902;
#elif COD2_VERSION == COD2_VERSION_1_3
unsigned short *words = (unsigned short*)0x817D922;
#else
unsigned short *words = (unsigned short*)0xdeadbeef;
#endif
return words[6 * index];
}
//thanks to riicchhaarrd/php
unsigned short Scr_GetArray(int index) {
#if COD2_VERSION == COD2_VERSION_1_2
int stack = 0x83D7A10;
#elif COD2_VERSION == COD2_VERSION_1_3
int stack = 0x83D8A90;
#else
int stack = 0xbadc0de;
#endif
int base = *(int*)(stack - 8 * index); //in cod1 its without dereferencing the ptr
int vartype = *(int*)(base + 4);
//parm count check here
//if(vartype == 7) //VT_OBJECT
return *(unsigned short*)base;
//error param doesn't exist.
//Scr_Error("error parameter does not exist!\n");
printf("scr_error\n");
return 0;
}
#if COD2_VERSION == COD2_VERSION_1_2
char *(*SL_ConvertToString)(unsigned short) = (char*(*)(unsigned short))0x8078E1A;
#elif COD2_VERSION == COD2_VERSION_1_3
char *(*SL_ConvertToString)(unsigned short) = (char*(*)(unsigned short))0x8078EE6;
#else
char *SL_ConvertToString() { return NULL; }//error_wrong_patch
#endif
void Scr_GetArrayKeys(int a) {
unsigned short arrIndex = Scr_GetArray(0);
alloc_object_and_push_to_array();
unsigned short i, var;
for(i = GetNextVariable(arrIndex); i != 0;) {
//printf("%d: %s = %s\n", i, SL_ConvertToString(GetVariableName(i)), SL_ConvertToString(var));
stackPushString(SL_ConvertToString(GetVariableName(i)));
push_previous_var_in_array_sub();
i = GetNextVariable(i);
var = get_var_by_idx(i);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment