Advertisement
Guest User

Untitled

a guest
Nov 20th, 2016
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. #include "global.h"
  2.  
  3. #define WRITEU8(addr, data) *(vu8*)(addr) = data
  4. #define WRITEU16(addr, data) *(vu16*)(addr) = data
  5. #define WRITEU32(addr, data) *(vu32*)(addr) = data
  6.  
  7. u32 threadStack[0x1000];
  8. Handle fsUserHandle;
  9. FS_archive sdmcArchive;
  10.  
  11.  
  12. #define IO_BASE_PAD 1
  13. #define IO_BASE_LCD 2
  14. #define IO_BASE_PDC 3
  15. #define IO_BASE_GSPHEAP 4
  16.  
  17. u32 IoBasePad = 0xFFFD4000;
  18.  
  19. u32 getKey() {
  20. return (*(vu32*)(IoBasePad) ^ 0xFFF) & 0xFFF;
  21. }
  22.  
  23. void waitKeyUp() {
  24. while (getKey() != 0) {
  25. svc_sleepThread(100000000);
  26. }
  27. }
  28.  
  29. u8 cheatEnabled[64];
  30. int isNewNtr = 0;
  31.  
  32.  
  33. u32 plgGetIoBase(u32 IoType);
  34. GAME_PLUGIN_MENU gamePluginMenu;
  35.  
  36. void initMenu() {
  37. memset(&gamePluginMenu, 0, sizeof(GAME_PLUGIN_MENU));
  38. }
  39.  
  40. void addMenuEntry(u8* str) {
  41. if (gamePluginMenu.count > 64) {
  42. return;
  43. }
  44. u32 pos = gamePluginMenu.count;
  45. u32 len = strlen(str) + 1;
  46. gamePluginMenu.offsetInBuffer[pos] = gamePluginMenu.bufOffset;
  47. strcpy(&(gamePluginMenu.buf[gamePluginMenu.bufOffset]), str);
  48.  
  49. gamePluginMenu.count += 1;
  50. gamePluginMenu.bufOffset += len;
  51. }
  52.  
  53. u32 updateMenu() {
  54. PLGLOADER_INFO *plgLoaderInfo = (void*)0x07000000;
  55. plgLoaderInfo->gamePluginPid = getCurrentProcessId();
  56. plgLoaderInfo->gamePluginMenuAddr = (u32)&gamePluginMenu;
  57.  
  58. u32 ret = 0;
  59. u32 hProcess;
  60. u32 homeMenuPid = plgGetIoBase(5);
  61. if (homeMenuPid == 0) {
  62. return 1;
  63. }
  64. ret = svc_openProcess(&hProcess, homeMenuPid);
  65. if (ret != 0) {
  66. return ret;
  67. }
  68. copyRemoteMemory( hProcess, &(plgLoaderInfo->gamePluginPid), CURRENT_PROCESS_HANDLE, &(plgLoaderInfo->gamePluginPid), 8);
  69. final:
  70. svc_closeHandle(hProcess);
  71. return ret;
  72. }
  73.  
  74. int scanMenu() {
  75. u32 i;
  76. for (i = 0; i < gamePluginMenu.count; i++) {
  77. if (gamePluginMenu.state[i]) {
  78. gamePluginMenu.state[i] = 0;
  79. return i;
  80. }
  81. }
  82. return -1;
  83. }
  84.  
  85. // detect language (0: english)
  86. int detectLanguage() {
  87. // unimplemented
  88. return 0;
  89. }
  90.  
  91. // add one cheat menu entry
  92. void addCheatMenuEntry(u8* str) {
  93. u8 buf[100];
  94. xsprintf(buf, "[ ] %s", str);
  95. addMenuEntry(buf);
  96. }
  97.  
  98. // this function will be called when the state of cheat item changed
  99. void onCheatItemChanged(int id, int enable) {
  100. // TODO: handle on cheat item is select or unselected
  101.  
  102.  
  103. }
  104.  
  105. // freeze the value
  106. void freezeCheatValue() {
  107. if (cheatEnabled[0]) {
  108. WRITEU16(0x0057ECDC, 0x00000259);
  109. }
  110. if (cheatEnabled[1]) {
  111. WRITEU16(0x0057ECDC, 0x00000255);
  112. }
  113. if (cheatEnabled[2]) {
  114. WRITEU16(0x0057ECDC, 0x00000256);
  115. }
  116. if (cheatEnabled[3]) {
  117. WRITEU16(0x0057ECDC, 0x00000257);
  118. }
  119. if (cheatEnabled[4]) {
  120. WRITEU16(0x0057ECDC, 0x00000258);
  121. }
  122. if (cheatEnabled[5]) {
  123. WRITEU16(0x0057ECDC, 0x0000025A);
  124. }
  125. if (cheatEnabled[6]) {
  126. WRITEU16(0x0057ECDC, 0x0000025B);
  127. }
  128. if (cheatEnabled[7]) {
  129. WRITEU16(0x0057ECDC, 0x0000025C);
  130. }
  131. if (cheatEnabled[8]) {
  132. WRITEU16(0x0057ECDC, 0x0000025D);
  133. }
  134. // TODO: handle your own cheat items
  135. }
  136.  
  137. // update the menu status
  138. void updateCheatEnableDisplay(id) {
  139. gamePluginMenu.buf[gamePluginMenu.offsetInBuffer[id] + 1] = cheatEnabled[id] ? 'X' : ' ';
  140. }
  141.  
  142. // scan and handle events
  143. void scanCheatMenu() {
  144. int ret = scanMenu();
  145. if (ret != -1) {
  146. cheatEnabled[ret] = !cheatEnabled[ret];
  147. updateCheatEnableDisplay(ret);
  148. onCheatItemChanged(ret, cheatEnabled[ret]);
  149. }
  150. }
  151.  
  152. // init
  153. void initCheatMenu() {
  154. initMenu();
  155. addCheatMenuEntry("Fight Ninja Purple Slime");
  156. addCheatMenuEntry("Fight Ninja Yellow Slime");
  157. addCheatMenuEntry("Fight Ninja Red Slime");
  158. addCheatMenuEntry("Fight Ninja Brown Slime");
  159. addCheatMenuEntry("Fight Ninja Green Slime");
  160. addCheatMenuEntry("Fight Ninja Blue Slime");
  161. addCheatMenuEntry("Fight Ninja Black Slime");
  162. addCheatMenuEntry("Fight Ninja Orange Slime");
  163. addCheatMenuEntry("Fight Ninja Pink Slime");
  164. // TODO: Add your own menu entries
  165. updateMenu();
  166. }
  167.  
  168. void gamePluginEntry() {
  169. u32 ret, key;
  170. INIT_SHARED_FUNC(plgGetIoBase, 8);
  171. INIT_SHARED_FUNC(copyRemoteMemory, 9);
  172. // wait for game starts up (5 seconds)
  173. svc_sleepThread(5000000000);
  174.  
  175. if (((NS_CONFIG*)(NS_CONFIGURE_ADDR))->sharedFunc[8]) {
  176. isNewNtr = 1;
  177. } else {
  178. isNewNtr = 0;
  179. }
  180.  
  181. if (isNewNtr) {
  182. IoBasePad = plgGetIoBase(IO_BASE_PAD);
  183. }
  184. initCheatMenu();
  185. while (1) {
  186. svc_sleepThread(100000000);
  187. scanCheatMenu();
  188. freezeCheatValue();
  189. }
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement