Advertisement
Guest User

Untitled

a guest
Sep 3rd, 2021
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.47 KB | None | 0 0
  1. #include "global.h"
  2. #include "option_menu.h"
  3. #include "main.h"
  4. #include "menu.h"
  5. #include "scanline_effect.h"
  6. #include "palette.h"
  7. #include "sprite.h"
  8. #include "task.h"
  9. #include "bg.h"
  10. #include "gpu_regs.h"
  11. #include "window.h"
  12. #include "text.h"
  13. #include "text_window.h"
  14. #include "international_string_util.h"
  15. #include "strings.h"
  16. #include "gba/m4a_internal.h"
  17. #include "constants/rgb.h"
  18. #include "field_effect.h"
  19. #include "decompress.h"
  20. #include "constants/trainers.h"
  21. #include "trainer_pokemon_sprites.h"
  22.  
  23. // Task data
  24. enum
  25. {
  26. TD_MENUSELECTION,
  27. TD_TEXTSPEED,
  28. TD_BATTLESCENE,
  29. TD_BATTLESTYLE,
  30. TD_SOUND,
  31. TD_BUTTONMODE,
  32. TD_FRAMETYPE,
  33. };
  34.  
  35. // Menu items
  36. enum
  37. {
  38. MENUITEM_TEXTSPEED,
  39. MENUITEM_BATTLESCENE,
  40. MENUITEM_BATTLESTYLE,
  41. MENUITEM_SOUND,
  42. MENUITEM_BUTTONMODE,
  43. MENUITEM_FRAMETYPE,
  44. MENUITEM_CANCEL,
  45. MENUITEM_COUNT,
  46. };
  47.  
  48. // Window Ids
  49. enum
  50. {
  51. WIN_TEXT_OPTION,
  52. WIN_OPTIONS
  53. };
  54.  
  55. #define YPOS_TEXTSPEED (MENUITEM_TEXTSPEED * 16)
  56. #define YPOS_BATTLESCENE (MENUITEM_BATTLESCENE * 16)
  57. #define YPOS_BATTLESTYLE (MENUITEM_BATTLESTYLE * 16)
  58. #define YPOS_SOUND (MENUITEM_SOUND * 16)
  59. #define YPOS_BUTTONMODE (MENUITEM_BUTTONMODE * 16)
  60. #define YPOS_FRAMETYPE (MENUITEM_FRAMETYPE * 16)
  61.  
  62. // this file's functions
  63. static void Task_OptionMenuFadeIn(u8 taskId);
  64. static void Task_OptionMenuProcessInput(u8 taskId);
  65. static void Task_OptionMenuSave(u8 taskId);
  66. static void Task_OptionMenuFadeOut(u8 taskId);
  67. static void HighlightOptionMenuItem(u8 selection);
  68. static u8 TextSpeed_ProcessInput(u8 selection);
  69. static void TextSpeed_DrawChoices(u8 selection);
  70. static u8 BattleScene_ProcessInput(u8 selection);
  71. static void BattleScene_DrawChoices(u8 selection);
  72. static u8 BattleStyle_ProcessInput(u8 selection);
  73. static void BattleStyle_DrawChoices(u8 selection);
  74. static u8 Sound_ProcessInput(u8 selection);
  75. static void Sound_DrawChoices(u8 selection);
  76. static u8 FrameType_ProcessInput(u8 selection);
  77. static void FrameType_DrawChoices(u8 selection);
  78. static u8 ButtonMode_ProcessInput(u8 selection);
  79. static void ButtonMode_DrawChoices(u8 selection);
  80. static void DrawTextOption(void);
  81. static void DrawOptionMenuTexts(void);
  82. static void DrawBgWindowFrames(void);
  83.  
  84. EWRAM_DATA static bool8 sArrowPressed = FALSE;
  85.  
  86. static const u16 sOptionMenuText_Pal[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal");
  87. // note: this is only used in the Japanese release
  88. static const u8 sEqualSignGfx[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp");
  89.  
  90. static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] =
  91. {
  92. [MENUITEM_TEXTSPEED] = gText_TextSpeed,
  93. [MENUITEM_BATTLESCENE] = gText_BattleScene,
  94. [MENUITEM_BATTLESTYLE] = gText_BattleStyle,
  95. [MENUITEM_SOUND] = gText_Sound,
  96. [MENUITEM_BUTTONMODE] = gText_ButtonMode,
  97. [MENUITEM_FRAMETYPE] = gText_Frame,
  98. [MENUITEM_CANCEL] = gText_OptionMenuCancel,
  99. };
  100.  
  101. static const struct WindowTemplate sOptionMenuWinTemplates[] =
  102. {
  103. {
  104. .bg = 1,
  105. .tilemapLeft = 2,
  106. .tilemapTop = 1,
  107. .width = 26,
  108. .height = 2,
  109. .paletteNum = 1,
  110. .baseBlock = 2
  111. },
  112. {
  113. .bg = 0,
  114. .tilemapLeft = 2,
  115. .tilemapTop = 5,
  116. .width = 26,
  117. .height = 14,
  118. .paletteNum = 1,
  119. .baseBlock = 0x36
  120. },
  121. DUMMY_WIN_TEMPLATE
  122. };
  123.  
  124. static const struct BgTemplate sOptionMenuBgTemplates[] =
  125. {
  126. {
  127. .bg = 1,
  128. .charBaseIndex = 1,
  129. .mapBaseIndex = 30,
  130. .screenSize = 0,
  131. .paletteMode = 0,
  132. .priority = 0,
  133. .baseTile = 0
  134. },
  135. {
  136. .bg = 0,
  137. .charBaseIndex = 1,
  138. .mapBaseIndex = 31,
  139. .screenSize = 0,
  140. .paletteMode = 0,
  141. .priority = 1,
  142. .baseTile = 0
  143. }
  144. };
  145.  
  146. static const u16 sOptionMenuBg_Pal[] = {RGB(17, 18, 31)};
  147.  
  148. // code
  149. static void MainCB2(void)
  150. {
  151. RunTasks();
  152. AnimateSprites();
  153. BuildOamBuffer();
  154. UpdatePaletteFade();
  155. }
  156.  
  157. static void VBlankCB(void)
  158. {
  159. LoadOam();
  160. ProcessSpriteCopyRequests();
  161. TransferPlttBuffer();
  162. }
  163.  
  164. void CB2_InitOptionMenu(void)
  165. {
  166. switch (gMain.state)
  167. {
  168. default:
  169. case 0:
  170. SetVBlankCallback(NULL);
  171. gMain.state++;
  172. break;
  173. case 1:
  174. DmaClearLarge16(3, (void*)(VRAM), VRAM_SIZE, 0x1000);
  175. DmaClear32(3, OAM, OAM_SIZE);
  176. DmaClear16(3, PLTT, PLTT_SIZE);
  177. SetGpuReg(REG_OFFSET_DISPCNT, 0);
  178. ResetBgsAndClearDma3BusyFlags(0);
  179. InitBgsFromTemplates(0, sOptionMenuBgTemplates, ARRAY_COUNT(sOptionMenuBgTemplates));
  180. ChangeBgX(0, 0, 0);
  181. ChangeBgY(0, 0, 0);
  182. ChangeBgX(1, 0, 0);
  183. ChangeBgY(1, 0, 0);
  184. ChangeBgX(2, 0, 0);
  185. ChangeBgY(2, 0, 0);
  186. ChangeBgX(3, 0, 0);
  187. ChangeBgY(3, 0, 0);
  188. InitWindows(sOptionMenuWinTemplates);
  189. DeactivateAllTextPrinters();
  190. SetGpuReg(REG_OFFSET_WIN0H, 0);
  191. SetGpuReg(REG_OFFSET_WIN0V, 0);
  192. SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0);
  193. SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_CLR);
  194. SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_DARKEN);
  195. SetGpuReg(REG_OFFSET_BLDALPHA, 0);
  196. SetGpuReg(REG_OFFSET_BLDY, 4);
  197. SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
  198. ShowBg(0);
  199. ShowBg(1);
  200. gMain.state++;
  201. break;
  202. case 2:
  203. ResetPaletteFade();
  204. ScanlineEffect_Stop();
  205. ResetTasks();
  206. ResetSpriteData();
  207. gMain.state++;
  208. break;
  209. case 3:
  210. LoadBgTiles(1, GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1A2);
  211. gMain.state++;
  212. break;
  213. case 4:
  214. LoadPalette(sOptionMenuBg_Pal, 0, sizeof(sOptionMenuBg_Pal));
  215. LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, 0x70, 0x20);
  216. gMain.state++;
  217. break;
  218. case 5:
  219. LoadPalette(sOptionMenuText_Pal, 16, sizeof(sOptionMenuText_Pal));
  220. gMain.state++;
  221. break;
  222. case 6:
  223. PutWindowTilemap(0);
  224. DrawTextOption();
  225. gMain.state++;
  226. break;
  227. case 7:
  228. gMain.state++;
  229. break;
  230. case 8:
  231. PutWindowTilemap(1);
  232. DrawOptionMenuTexts();
  233. gMain.state++;
  234. case 9:
  235. DrawBgWindowFrames();
  236. gMain.state++;
  237. break;
  238. case 10:
  239. {
  240. u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0);
  241.  
  242. gTasks[taskId].data[TD_MENUSELECTION] = 0;
  243. gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed;
  244. gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2Ptr->optionsBattleSceneOff;
  245. gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle;
  246. gTasks[taskId].data[TD_SOUND] = gSaveBlock2Ptr->optionsSound;
  247. gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode;
  248. gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType;
  249.  
  250. TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
  251. BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
  252. BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
  253. Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
  254. ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
  255. FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
  256. HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
  257.  
  258. CopyWindowToVram(WIN_OPTIONS, 3);
  259. gMain.state++;
  260. break;
  261. }
  262. case 11:
  263. BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
  264. SetVBlankCallback(VBlankCB);
  265. SetMainCallback2(MainCB2);
  266. return;
  267. }
  268. }
  269.  
  270. static void Task_OptionMenuFadeIn(u8 taskId)
  271. {
  272. if (!gPaletteFade.active)
  273. gTasks[taskId].func = Task_OptionMenuProcessInput;
  274. }
  275.  
  276. static void Task_OptionMenuProcessInput(u8 taskId)
  277. {
  278. if (JOY_NEW(A_BUTTON))
  279. {
  280. if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL)
  281. gTasks[taskId].func = Task_OptionMenuSave;
  282. }
  283. else if (JOY_NEW(B_BUTTON))
  284. {
  285. gTasks[taskId].func = Task_OptionMenuSave;
  286. }
  287. else if (JOY_NEW(DPAD_UP))
  288. {
  289. if (gTasks[taskId].data[TD_MENUSELECTION] > 0)
  290. gTasks[taskId].data[TD_MENUSELECTION]--;
  291. else
  292. gTasks[taskId].data[TD_MENUSELECTION] = MENUITEM_CANCEL;
  293. CreateTrainerSprite(FacilityClassToPicIndex(FACILITY_CLASS_MAY), 140, 64, 0, &gDecompressionBuffer[0x800]);
  294. HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
  295. }
  296. else if (JOY_NEW(DPAD_DOWN))
  297. {
  298. if (gTasks[taskId].data[TD_MENUSELECTION] < MENUITEM_CANCEL)
  299. gTasks[taskId].data[TD_MENUSELECTION]++;
  300. else
  301. gTasks[taskId].data[TD_MENUSELECTION] = 0;
  302. HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
  303. }
  304. else
  305. {
  306. u8 previousOption;
  307.  
  308. switch (gTasks[taskId].data[TD_MENUSELECTION])
  309. {
  310. case MENUITEM_TEXTSPEED:
  311. previousOption = gTasks[taskId].data[TD_TEXTSPEED];
  312. gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]);
  313.  
  314. if (previousOption != gTasks[taskId].data[TD_TEXTSPEED])
  315. TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
  316. break;
  317. case MENUITEM_BATTLESCENE:
  318. previousOption = gTasks[taskId].data[TD_BATTLESCENE];
  319. gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]);
  320.  
  321. if (previousOption != gTasks[taskId].data[TD_BATTLESCENE])
  322. BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
  323. break;
  324. case MENUITEM_BATTLESTYLE:
  325. previousOption = gTasks[taskId].data[TD_BATTLESTYLE];
  326. gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]);
  327.  
  328. if (previousOption != gTasks[taskId].data[TD_BATTLESTYLE])
  329. BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
  330. break;
  331. case MENUITEM_SOUND:
  332. previousOption = gTasks[taskId].data[TD_SOUND];
  333. gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]);
  334.  
  335. if (previousOption != gTasks[taskId].data[TD_SOUND])
  336. Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
  337. break;
  338. case MENUITEM_BUTTONMODE:
  339. previousOption = gTasks[taskId].data[TD_BUTTONMODE];
  340. gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]);
  341.  
  342. if (previousOption != gTasks[taskId].data[TD_BUTTONMODE])
  343. ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
  344. break;
  345. case MENUITEM_FRAMETYPE:
  346. previousOption = gTasks[taskId].data[TD_FRAMETYPE];
  347. gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]);
  348.  
  349. if (previousOption != gTasks[taskId].data[TD_FRAMETYPE])
  350. FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
  351. break;
  352. default:
  353. return;
  354. }
  355.  
  356. if (sArrowPressed)
  357. {
  358. sArrowPressed = FALSE;
  359. CopyWindowToVram(WIN_OPTIONS, 2);
  360. }
  361. }
  362. }
  363.  
  364. static void Task_OptionMenuSave(u8 taskId)
  365. {
  366. gSaveBlock2Ptr->optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED];
  367. gSaveBlock2Ptr->optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE];
  368. gSaveBlock2Ptr->optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE];
  369. gSaveBlock2Ptr->optionsSound = gTasks[taskId].data[TD_SOUND];
  370. gSaveBlock2Ptr->optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE];
  371. gSaveBlock2Ptr->optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE];
  372.  
  373. BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
  374. gTasks[taskId].func = Task_OptionMenuFadeOut;
  375. }
  376.  
  377. static void Task_OptionMenuFadeOut(u8 taskId)
  378. {
  379. if (!gPaletteFade.active)
  380. {
  381. DestroyTask(taskId);
  382. FreeAllWindowBuffers();
  383. SetMainCallback2(gMain.savedCallback);
  384. }
  385. }
  386.  
  387. static void HighlightOptionMenuItem(u8 index)
  388. {
  389. SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(16, DISPLAY_WIDTH - 16));
  390. SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(index * 16 + 40, index * 16 + 56));
  391. }
  392.  
  393. static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style)
  394. {
  395. u8 dst[16];
  396. u16 i;
  397.  
  398. for (i = 0; *text != EOS && i <= 14; i++)
  399. dst[i] = *(text++);
  400.  
  401. if (style != 0)
  402. {
  403. dst[2] = 4;
  404. dst[5] = 5;
  405. }
  406.  
  407. dst[i] = EOS;
  408. AddTextPrinterParameterized(WIN_OPTIONS, 1, dst, x, y + 1, TEXT_SPEED_FF, NULL);
  409. }
  410.  
  411. static u8 TextSpeed_ProcessInput(u8 selection)
  412. {
  413. if (JOY_NEW(DPAD_RIGHT))
  414. {
  415. if (selection <= 1)
  416. selection++;
  417. else
  418. selection = 0;
  419.  
  420. sArrowPressed = TRUE;
  421. }
  422. if (JOY_NEW(DPAD_LEFT))
  423. {
  424. if (selection != 0)
  425. selection--;
  426. else
  427. selection = 2;
  428.  
  429. sArrowPressed = TRUE;
  430. }
  431. return selection;
  432. }
  433.  
  434. static void TextSpeed_DrawChoices(u8 selection)
  435. {
  436. u8 styles[3];
  437. s32 widthSlow, widthMid, widthFast, xMid;
  438.  
  439. styles[0] = 0;
  440. styles[1] = 0;
  441. styles[2] = 0;
  442. styles[selection] = 1;
  443.  
  444. DrawOptionMenuChoice(gText_TextSpeedSlow, 104, YPOS_TEXTSPEED, styles[0]);
  445.  
  446. widthSlow = GetStringWidth(1, gText_TextSpeedSlow, 0);
  447. widthMid = GetStringWidth(1, gText_TextSpeedMid, 0);
  448. widthFast = GetStringWidth(1, gText_TextSpeedFast, 0);
  449.  
  450. widthMid -= 94;
  451. xMid = (widthSlow - widthMid - widthFast) / 2 + 104;
  452. DrawOptionMenuChoice(gText_TextSpeedMid, xMid, YPOS_TEXTSPEED, styles[1]);
  453.  
  454. DrawOptionMenuChoice(gText_TextSpeedFast, GetStringRightAlignXOffset(1, gText_TextSpeedFast, 198), YPOS_TEXTSPEED, styles[2]);
  455. }
  456.  
  457. static u8 BattleScene_ProcessInput(u8 selection)
  458. {
  459. if (JOY_NEW(DPAD_LEFT | DPAD_RIGHT))
  460. {
  461. selection ^= 1;
  462. sArrowPressed = TRUE;
  463. }
  464.  
  465. return selection;
  466. }
  467.  
  468. static void BattleScene_DrawChoices(u8 selection)
  469. {
  470. u8 styles[2];
  471.  
  472. styles[0] = 0;
  473. styles[1] = 0;
  474. styles[selection] = 1;
  475.  
  476. DrawOptionMenuChoice(gText_BattleSceneOn, 104, YPOS_BATTLESCENE, styles[0]);
  477. DrawOptionMenuChoice(gText_BattleSceneOff, GetStringRightAlignXOffset(1, gText_BattleSceneOff, 198), YPOS_BATTLESCENE, styles[1]);
  478. }
  479.  
  480. static u8 BattleStyle_ProcessInput(u8 selection)
  481. {
  482. if (JOY_NEW(DPAD_LEFT | DPAD_RIGHT))
  483. {
  484. selection ^= 1;
  485. sArrowPressed = TRUE;
  486. }
  487.  
  488. return selection;
  489. }
  490.  
  491. static void BattleStyle_DrawChoices(u8 selection)
  492. {
  493. u8 styles[2];
  494.  
  495. styles[0] = 0;
  496. styles[1] = 0;
  497. styles[selection] = 1;
  498.  
  499. DrawOptionMenuChoice(gText_BattleStyleShift, 104, YPOS_BATTLESTYLE, styles[0]);
  500. DrawOptionMenuChoice(gText_BattleStyleSet, GetStringRightAlignXOffset(1, gText_BattleStyleSet, 198), YPOS_BATTLESTYLE, styles[1]);
  501. }
  502.  
  503. static u8 Sound_ProcessInput(u8 selection)
  504. {
  505. if (JOY_NEW(DPAD_LEFT | DPAD_RIGHT))
  506. {
  507. selection ^= 1;
  508. SetPokemonCryStereo(selection);
  509. sArrowPressed = TRUE;
  510. }
  511.  
  512. return selection;
  513. }
  514.  
  515. static void Sound_DrawChoices(u8 selection)
  516. {
  517. u8 styles[2];
  518.  
  519. styles[0] = 0;
  520. styles[1] = 0;
  521. styles[selection] = 1;
  522.  
  523. DrawOptionMenuChoice(gText_SoundMono, 104, YPOS_SOUND, styles[0]);
  524. DrawOptionMenuChoice(gText_SoundStereo, GetStringRightAlignXOffset(1, gText_SoundStereo, 198), YPOS_SOUND, styles[1]);
  525. }
  526.  
  527. static u8 FrameType_ProcessInput(u8 selection)
  528. {
  529. if (JOY_NEW(DPAD_RIGHT))
  530. {
  531. if (selection < WINDOW_FRAMES_COUNT - 1)
  532. selection++;
  533. else
  534. selection = 0;
  535.  
  536. LoadBgTiles(1, GetWindowFrameTilesPal(selection)->tiles, 0x120, 0x1A2);
  537. LoadPalette(GetWindowFrameTilesPal(selection)->pal, 0x70, 0x20);
  538. sArrowPressed = TRUE;
  539. }
  540. if (JOY_NEW(DPAD_LEFT))
  541. {
  542. if (selection != 0)
  543. selection--;
  544. else
  545. selection = WINDOW_FRAMES_COUNT - 1;
  546.  
  547. LoadBgTiles(1, GetWindowFrameTilesPal(selection)->tiles, 0x120, 0x1A2);
  548. LoadPalette(GetWindowFrameTilesPal(selection)->pal, 0x70, 0x20);
  549. sArrowPressed = TRUE;
  550. }
  551. return selection;
  552. }
  553.  
  554. static void FrameType_DrawChoices(u8 selection)
  555. {
  556. u8 text[16];
  557. u8 n = selection + 1;
  558. u16 i;
  559.  
  560. for (i = 0; gText_FrameTypeNumber[i] != EOS && i <= 5; i++)
  561. text[i] = gText_FrameTypeNumber[i];
  562.  
  563. // Convert a number to decimal string
  564. if (n / 10 != 0)
  565. {
  566. text[i] = n / 10 + CHAR_0;
  567. i++;
  568. text[i] = n % 10 + CHAR_0;
  569. i++;
  570. }
  571. else
  572. {
  573. text[i] = n % 10 + CHAR_0;
  574. i++;
  575. text[i] = 0x77;
  576. i++;
  577. }
  578.  
  579. text[i] = EOS;
  580.  
  581. DrawOptionMenuChoice(gText_FrameType, 104, YPOS_FRAMETYPE, 0);
  582. DrawOptionMenuChoice(text, 128, YPOS_FRAMETYPE, 1);
  583. }
  584.  
  585. static u8 ButtonMode_ProcessInput(u8 selection)
  586. {
  587. if (JOY_NEW(DPAD_RIGHT))
  588. {
  589. if (selection <= 1)
  590. selection++;
  591. else
  592. selection = 0;
  593.  
  594. sArrowPressed = TRUE;
  595. }
  596. if (JOY_NEW(DPAD_LEFT))
  597. {
  598. if (selection != 0)
  599. selection--;
  600. else
  601. selection = 2;
  602.  
  603. sArrowPressed = TRUE;
  604. }
  605. return selection;
  606. }
  607.  
  608. static void ButtonMode_DrawChoices(u8 selection)
  609. {
  610. s32 widthNormal, widthLR, widthLA, xLR;
  611. u8 styles[3];
  612.  
  613. styles[0] = 0;
  614. styles[1] = 0;
  615. styles[2] = 0;
  616. styles[selection] = 1;
  617.  
  618. DrawOptionMenuChoice(gText_ButtonTypeNormal, 104, YPOS_BUTTONMODE, styles[0]);
  619.  
  620. widthNormal = GetStringWidth(1, gText_ButtonTypeNormal, 0);
  621. widthLR = GetStringWidth(1, gText_ButtonTypeLR, 0);
  622. widthLA = GetStringWidth(1, gText_ButtonTypeLEqualsA, 0);
  623.  
  624. widthLR -= 94;
  625. xLR = (widthNormal - widthLR - widthLA) / 2 + 104;
  626. DrawOptionMenuChoice(gText_ButtonTypeLR, xLR, YPOS_BUTTONMODE, styles[1]);
  627.  
  628. DrawOptionMenuChoice(gText_ButtonTypeLEqualsA, GetStringRightAlignXOffset(1, gText_ButtonTypeLEqualsA, 198), YPOS_BUTTONMODE, styles[2]);
  629. }
  630.  
  631. static void DrawTextOption(void)
  632. {
  633. FillWindowPixelBuffer(WIN_TEXT_OPTION, PIXEL_FILL(1));
  634. AddTextPrinterParameterized(WIN_TEXT_OPTION, 1, gText_Option, 8, 1, TEXT_SPEED_FF, NULL);
  635. CopyWindowToVram(WIN_TEXT_OPTION, 3);
  636. }
  637.  
  638. static void DrawOptionMenuTexts(void)
  639. {
  640. u8 i;
  641.  
  642. FillWindowPixelBuffer(WIN_OPTIONS, PIXEL_FILL(1));
  643. for (i = 0; i < MENUITEM_COUNT; i++)
  644. {
  645. AddTextPrinterParameterized(WIN_OPTIONS, 1, sOptionMenuItemsNames[i], 8, (i * 16) + 1, TEXT_SPEED_FF, NULL);
  646. }
  647. CopyWindowToVram(WIN_OPTIONS, 3);
  648. }
  649.  
  650. #define TILE_TOP_CORNER_L 0x1A2
  651. #define TILE_TOP_EDGE 0x1A3
  652. #define TILE_TOP_CORNER_R 0x1A4
  653. #define TILE_LEFT_EDGE 0x1A5
  654. #define TILE_RIGHT_EDGE 0x1A7
  655. #define TILE_BOT_CORNER_L 0x1A8
  656. #define TILE_BOT_EDGE 0x1A9
  657. #define TILE_BOT_CORNER_R 0x1AA
  658.  
  659. static void DrawBgWindowFrames(void)
  660. {
  661. // bg, tile, x, y, width, height, palNum
  662. // Draw title window frame
  663. FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 1, 0, 1, 1, 7);
  664. FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 2, 0, 27, 1, 7);
  665. FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 28, 0, 1, 1, 7);
  666. FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 1, 1, 1, 2, 7);
  667. FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 28, 1, 1, 2, 7);
  668. FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 1, 3, 1, 1, 7);
  669. FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 2, 3, 27, 1, 7);
  670. FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 28, 3, 1, 1, 7);
  671.  
  672. // Draw options list window frame
  673. FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 1, 4, 1, 1, 7);
  674. FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 2, 4, 26, 1, 7);
  675. FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 28, 4, 1, 1, 7);
  676. FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 1, 5, 1, 18, 7);
  677. FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 28, 5, 1, 18, 7);
  678. FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 1, 19, 1, 1, 7);
  679. FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 2, 19, 26, 1, 7);
  680. FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 28, 19, 1, 1, 7);
  681.  
  682. CopyBgTilemapBufferToVram(1);
  683. }
  684.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement