TSFuncs.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #include <stdarg.h>
  2. #include <stdio.h>
  3. #include "TSFuncs.hpp"
  4. ADDR tsf_mCacheSequence;
  5. ADDR tsf_mCacheAllocator;
  6. ADDR tsf_gIdDictionary;
  7. ADDR tsf_gEvalState_globalVars;
  8. BlFunctionDefIntern(tsf_BlStringTable__insert);
  9. BlFunctionDefIntern(tsf_BlNamespace__find);
  10. BlFunctionDefIntern(tsf_BlNamespace__createLocalEntry);
  11. BlFunctionDefIntern(tsf_BlDataChunker__freeBlocks);
  12. BlFunctionDefIntern(tsf_BlCon__evaluate);
  13. BlFunctionDefIntern(tsf_BlCon__executef);
  14. BlFunctionDefIntern(tsf_BlCon__executefSimObj);
  15. BlFunctionDefIntern(tsf_BlCon__getVariable);
  16. BlFunctionDefIntern(tsf_BlDictionary__addVariable);
  17. BlFunctionDefIntern(tsf_BlSim__findObject_name);
  18. BlFunctionDefIntern(tsf_BlStringStack__getArgBuffer);
  19. BlFunctionDefIntern(tsf_BlSimObject__getDataField);
  20. BlFunctionDefIntern(tsf_BlSimObject__setDataField);
  21. char *tsf_GetIntArg(signed int value)
  22. {
  23. char *ret = tsf_BlStringStack__getArgBuffer(16);
  24. snprintf(ret, 16, "%d", value);
  25. return ret;
  26. }
  27. char *tsf_GetFloatArg(float value)
  28. {
  29. char *ret = tsf_BlStringStack__getArgBuffer(32);
  30. snprintf(ret, 32, "%g", value);
  31. return ret;
  32. }
  33. char *tsf_ScriptThis(ADDR obj)
  34. {
  35. return tsf_GetIntArg(*(signed int *)(obj + 32));
  36. }
  37. const char *tsf_Eval(const char *code)
  38. {
  39. const char *argv[] = {nullptr, code};
  40. return tsf_BlCon__evaluate(0, 2, argv);
  41. }
  42. const char *tsf_Evalf(const char *fmt, ...)
  43. {
  44. va_list args;
  45. char code[4096];
  46. va_start(args, fmt);
  47. vsnprintf(code, 4096, fmt, args);
  48. va_end(args);
  49. return tsf_Eval((const char *)code);
  50. }
  51. ADDR tsf_FindObject(unsigned int id)
  52. {
  53. ADDR obj = *(ADDR *)(*(ADDR *)(tsf_gIdDictionary) + 4*(id & 0xFFF));
  54. if(!obj)
  55. return 0;
  56. while(obj && *(unsigned int *)(obj + 32) != id)
  57. {
  58. obj = *(ADDR *)(obj + 16);
  59. if(!obj)
  60. return 0;
  61. }
  62. return obj;
  63. }
  64. ADDR tsf_FindObject(const char *name)
  65. {
  66. return (ADDR)tsf_BlSim__findObject_name(name);
  67. }
  68. ADDR tsf_LookupNamespace(const char *ns, const char *package)
  69. {
  70. const char *ste_package;
  71. if(package)
  72. ste_package = tsf_BlStringTable__insert(package, 0);
  73. else
  74. ste_package = nullptr;
  75. if(ns)
  76. {
  77. const char *ste_namespace = tsf_BlStringTable__insert(ns, 0);
  78. return tsf_BlNamespace__find(ste_namespace, ste_package);
  79. }
  80. else
  81. return tsf_BlNamespace__find(nullptr, ste_package);
  82. }
  83. const char *tsf_GetDataField(ADDR simObject, const char *slotName, const char *array)
  84. {
  85. const char *ste_slotName;
  86. if(slotName)
  87. ste_slotName = tsf_BlStringTable__insert(slotName, 0);
  88. else
  89. ste_slotName = nullptr;
  90. return tsf_BlSimObject__getDataField(simObject, ste_slotName, array);
  91. }
  92. void tsf_SetDataField(ADDR simObject, const char *slotName, const char *array, const char *value)
  93. {
  94. const char *ste_slotName;
  95. if(slotName)
  96. ste_slotName = tsf_BlStringTable__insert(slotName, 0);
  97. else
  98. ste_slotName = nullptr;
  99. tsf_BlSimObject__setDataField(simObject, ste_slotName, array, value);
  100. }
  101. const char *tsf_GetVar(const char *name)
  102. {
  103. return tsf_BlCon__getVariable(name);
  104. }
  105. void tsf_AddVarInternal(const char *name, signed int varType, void *data)
  106. {
  107. tsf_BlDictionary__addVariable((ADDR *)tsf_gEvalState_globalVars, name, varType, data);
  108. }
  109. void tsf_AddVar(const char *name, const char **data)
  110. {
  111. tsf_AddVarInternal(name, 10, data);
  112. }
  113. void tsf_AddVar(const char *name, signed int *data)
  114. {
  115. tsf_AddVarInternal(name, 4, data);
  116. }
  117. void tsf_AddVar(const char *name, float *data)
  118. {
  119. tsf_AddVarInternal(name, 8, data);
  120. }
  121. void tsf_AddVar(const char *name, bool *data)
  122. {
  123. tsf_AddVarInternal(name, 6, data);
  124. }
  125. ADDR tsf_AddConsoleFuncInternal(const char *pname, const char *cname, const char *fname, signed int cbtype, const char *usage, signed int mina, signed int maxa)
  126. {
  127. const char *ste_fname = tsf_BlStringTable__insert(fname, 0);
  128. ADDR ns = tsf_LookupNamespace(cname, pname);
  129. ADDR ent = tsf_BlNamespace__createLocalEntry(ns, ste_fname);
  130. *(signed int *)tsf_mCacheSequence += 1;
  131. tsf_BlDataChunker__freeBlocks(*(ADDR *)tsf_mCacheAllocator);
  132. *(const char **)(ent + 24) = usage;
  133. *(signed int *)(ent + 16) = mina;
  134. *(signed int *)(ent + 20) = maxa;
  135. *(signed int *)(ent + 12) = cbtype;
  136. return ent;
  137. }
  138. void tsf_AddConsoleFunc(const char *pname, const char *cname, const char *fname, tsf_StringCallback sc, const char *usage, signed int mina, signed int maxa)
  139. {
  140. ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 1, usage, mina, maxa);
  141. *(tsf_StringCallback *)(ent + 40) = sc;
  142. }
  143. void tsf_AddConsoleFunc(const char *pname, const char *cname, const char *fname, tsf_IntCallback ic, const char * usage, signed int mina, signed int maxa)
  144. {
  145. ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 2, usage, mina, maxa);
  146. *(tsf_IntCallback *)(ent + 40) = ic;
  147. }
  148. void tsf_AddConsoleFunc(const char *pname, const char *cname, const char *fname, tsf_FloatCallback fc, const char * usage, signed int mina, signed int maxa)
  149. {
  150. ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 3, usage, mina, maxa);
  151. *(tsf_FloatCallback *)(ent + 40) = fc;
  152. }
  153. void tsf_AddConsoleFunc(const char *pname, const char *cname, const char *fname, tsf_VoidCallback vc, const char * usage, signed int mina, signed int maxa)
  154. {
  155. ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 4, usage, mina, maxa);
  156. *(tsf_VoidCallback *)(ent + 40) = vc;
  157. }
  158. void tsf_AddConsoleFunc(const char *pname, const char *cname, const char *fname, tsf_BoolCallback bc, const char * usage, signed int mina, signed int maxa)
  159. {
  160. ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 5, usage, mina, maxa);
  161. *(tsf_BoolCallback *)(ent + 40) = bc;
  162. }
  163. bool tsf_InitInternal()
  164. {
  165. BlScanFunctionHex(tsf_BlStringTable__insert, "83 EC 0C 80 3D ? ? ? ? ?");
  166. BlScanFunctionHex(tsf_BlNamespace__find, "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 83 EC 0C 53 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 8B DA 8B D1");
  167. BlScanFunctionHex(tsf_BlNamespace__createLocalEntry, "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 83 EC 08 53 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 89 4D F0");
  168. BlScanFunctionHex(tsf_BlDataChunker__freeBlocks, "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 51 53 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 8B D9 8B 33");
  169. BlScanFunctionHex(tsf_BlCon__evaluate, "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 8B 75 10");
  170. BlScanFunctionHex(tsf_BlCon__executef, "81 EC ? ? ? ? A1 ? ? ? ? 33 C4 89 84 24 ? ? ? ? 53 55 56 8B B4 24 ? ? ? ? 33 C9");
  171. BlScanFunctionHex(tsf_BlCon__executefSimObj, "81 EC ? ? ? ? A1 ? ? ? ? 33 C4 89 84 24 ? ? ? ? 53 56 8B B4 24 ? ? ? ? 33 C9");
  172. BlScanFunctionHex(tsf_BlCon__getVariable, "53 56 8B F1 57 85 F6 0F 84 ? ? ? ?");
  173. BlScanFunctionHex(tsf_BlDictionary__addVariable, "8B 44 24 04 56 57 8B F9");
  174. BlScanFunctionHex(tsf_BlSim__findObject_name, "57 8B F9 8A 17");
  175. BlScanFunctionHex(tsf_BlStringStack__getArgBuffer, "55 8B EC 83 E4 F8 8B 0D ? ? ? ? A1 ? ? ? ? 56 57 8B 7D 08 8D 14 01 03 D7 3B 15 ? ? ? ? 72 2C 8B 0D");
  176. BlScanFunctionHex(tsf_BlSimObject__getDataField, "51 53 8B D9 55 56 8B 74 24 14");
  177. BlScanFunctionHex(tsf_BlSimObject__setDataField, "81 EC ? ? ? ? A1 ? ? ? ? 33 C4 89 84 24 ? ? ? ? 8B 84 24 ? ? ? ? 53 8B D9 89 44 24 04");
  178. ADDR BlScanHex(tsf_mCacheSequenceLoc, "FF 05 ? ? ? ? B9 ? ? ? ? 8B F8 E8 ? ? ? ? 8B 44 24 1C 89 47 18 8B 44 24 14");
  179. ADDR BlScanHex(tsf_mCacheAllocatorLoc, "89 35 ? ? ? ? C7 06 ? ? ? ? A1 ? ? ? ? 68 ? ? ? ? C7 40 ? ? ? ? ? E8 ? ? ? ? 83 C4 04 8B 4D F4 64 89 0D ? ? ? ? 59 5E 8B E5 5D C3");
  180. ADDR BlScanHex(tsf_gIdDictionaryLoc, "89 15 ? ? ? ? E8 ? ? ? ? 8B F0 89 75 F0");
  181. ADDR BlScanHex(tsf_gEvalState_globalVarsLoc, "B9 ? ? ? ? E8 ? ? ? ? 68 ? ? ? ? 6A 0A 68 ? ? ? ? B9 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ?");
  182. tsf_mCacheSequence = *(ADDR *)(tsf_mCacheSequenceLoc + 2);
  183. tsf_mCacheAllocator = *(ADDR *)(tsf_mCacheAllocatorLoc + 2);
  184. tsf_gIdDictionary = *(ADDR *)(tsf_gIdDictionaryLoc + 2);
  185. tsf_gEvalState_globalVars = *(ADDR *)(tsf_gEvalState_globalVarsLoc + 1);
  186. return true;
  187. }