summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2016-12-30 16:10:47 -0500
committerYamaArashi <YamaArashi@users.noreply.github.com>2016-12-30 13:10:47 -0800
commit9e5c4ef564135e098d7d89c3a980e4077a03b9f8 (patch)
treea71b1ea8275520a8e0bbbc4bf98a3fd4e3c83ce2
parent8df03beee0bbc77f473804af26ed56b8551400e4 (diff)
finish decompiling script_menu.c (#142)
* begin decompiling script_menu.c * update MultichoiceStructs to use both structs * decompile 2 more functions * decompile more of script_menu.c * do a bit more of script_menu.c * whoops * decompile task_yes_no_maybe * finish decompiling script_menu.c * formatting
-rw-r--r--asm/rom6.s2
-rw-r--r--asm/script_menu.s364
-rw-r--r--data/event_scripts.s5
-rw-r--r--data/specials.inc2
-rw-r--r--ld_script.txt1
-rw-r--r--src/script_menu.c133
6 files changed, 136 insertions, 371 deletions
diff --git a/asm/rom6.s b/asm/rom6.s
index a4006ace5..f39e08dea 100644
--- a/asm/rom6.s
+++ b/asm/rom6.s
@@ -4534,7 +4534,7 @@ ReshowPCMenuAfterHallOfFamePC: @ 810D64C
movs r2, 0x10
movs r3, 0
bl BeginNormalPaletteFade
- bl sp109_CreatePCMenu
+ bl TryCreatePCMenu
bl sub_80B5838
ldr r0, _0810D680 @ =sub_810D684
movs r1, 0xA
diff --git a/asm/script_menu.s b/asm/script_menu.s
deleted file mode 100644
index 46ccadba4..000000000
--- a/asm/script_menu.s
+++ /dev/null
@@ -1,364 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sp109_CreatePCMenu
-sp109_CreatePCMenu: @ 80B5704
- push {lr}
- ldr r0, _080B5724 @ =sub_80B52B4
- bl FuncIsActiveTask
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _080B572C
- ldr r1, _080B5728 @ =gScriptResult
- movs r0, 0xFF
- strh r0, [r1]
- bl CreatePCMenu
- movs r0, 0x1
- b _080B572E
- .align 2, 0
-_080B5724: .4byte sub_80B52B4
-_080B5728: .4byte gScriptResult
-_080B572C:
- movs r0, 0
-_080B572E:
- pop {r1}
- bx r1
- thumb_func_end sp109_CreatePCMenu
-
- thumb_func_start CreatePCMenu
-CreatePCMenu: @ 80B5734
- push {r4-r7,lr}
- sub sp, 0x8
- ldr r0, _080B5758 @ =gPCText_PlayersPC
- bl GetStringWidthInTilesForScriptMenu
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r0, _080B575C @ =gPCText_SomeonesPC
- bl GetStringWidthInTilesForScriptMenu
- lsls r0, 16
- lsrs r0, 16
- cmp r4, r0
- bls _080B5760
- lsls r0, r4, 24
- lsrs r5, r0, 24
- b _080B5762
- .align 2, 0
-_080B5758: .4byte gPCText_PlayersPC
-_080B575C: .4byte gPCText_SomeonesPC
-_080B5760:
- movs r5, 0x8
-_080B5762:
- ldr r0, _080B5798 @ =0x00000804
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- beq _080B57A4
- movs r7, 0x4
- adds r4, r5, 0x2
- lsls r2, r4, 24
- lsrs r2, 24
- movs r0, 0
- movs r1, 0
- movs r3, 0x9
- bl MenuDrawTextWindow
- ldr r0, _080B579C @ =gPCText_HallOfFame
- movs r1, 0x1
- movs r2, 0x5
- bl MenuPrint
- ldr r0, _080B57A0 @ =gPCText_LogOff
- movs r1, 0x1
- movs r2, 0x7
- bl MenuPrint
- b _080B57C0
- .align 2, 0
-_080B5798: .4byte 0x00000804
-_080B579C: .4byte gPCText_HallOfFame
-_080B57A0: .4byte gPCText_LogOff
-_080B57A4:
- movs r7, 0x3
- adds r4, r5, 0x2
- lsls r2, r4, 24
- lsrs r2, 24
- movs r0, 0
- movs r1, 0
- movs r3, 0x7
- bl MenuDrawTextWindow
- ldr r0, _080B57DC @ =gPCText_LogOff
- movs r1, 0x1
- movs r2, 0x5
- bl MenuPrint
-_080B57C0:
- adds r6, r4, 0
- ldr r0, _080B57E0 @ =0x0000084b
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- beq _080B57E8
- ldr r0, _080B57E4 @ =gPCText_LanettesPC
- movs r1, 0x1
- movs r2, 0x1
- bl MenuPrint
- b _080B57F2
- .align 2, 0
-_080B57DC: .4byte gPCText_LogOff
-_080B57E0: .4byte 0x0000084b
-_080B57E4: .4byte gPCText_LanettesPC
-_080B57E8:
- ldr r0, _080B5830 @ =gPCText_SomeonesPC
- movs r1, 0x1
- movs r2, 0x1
- bl MenuPrint
-_080B57F2:
- ldr r0, _080B5834 @ =gPCText_PlayersPC
- movs r1, 0x1
- movs r2, 0x3
- bl MenuPrint
- movs r4, 0
- str r4, [sp]
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x4]
- movs r0, 0
- movs r1, 0x1
- movs r2, 0x1
- adds r3, r7, 0
- bl InitMenu
- lsls r2, r6, 24
- lsrs r2, 24
- lsls r3, r7, 1
- adds r3, 0x1
- str r4, [sp]
- str r7, [sp, 0x4]
- movs r0, 0
- movs r1, 0
- bl sub_80B5230
- add sp, 0x8
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080B5830: .4byte gPCText_SomeonesPC
-_080B5834: .4byte gPCText_PlayersPC
- thumb_func_end CreatePCMenu
-
- thumb_func_start sub_80B5838
-sub_80B5838: @ 80B5838
- push {lr}
- bl MenuDisplayMessageBox
- ldr r0, _080B584C @ =gUnknown_081A0A01
- movs r1, 0x2
- movs r2, 0xF
- bl MenuPrint
- pop {r0}
- bx r0
- .align 2, 0
-_080B584C: .4byte gUnknown_081A0A01
- thumb_func_end sub_80B5838
-
- thumb_func_start task_picbox
-task_picbox: @ 80B5850
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- ldr r1, _080B5874 @ =gTasks
- adds r4, r0, r1
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- cmp r0, 0x1
- beq _080B58BE
- cmp r0, 0x1
- bgt _080B5878
- cmp r0, 0
- beq _080B5894
- b _080B58BE
- .align 2, 0
-_080B5874: .4byte gTasks
-_080B5878:
- cmp r0, 0x2
- beq _080B5882
- cmp r0, 0x3
- beq _080B58A0
- b _080B58BE
-_080B5882:
- movs r0, 0xC
- ldrsh r1, [r4, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _080B589C @ =gSprites
- adds r0, r1
- bl FreeResourcesAndDestroySprite
-_080B5894:
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- b _080B58BE
- .align 2, 0
-_080B589C: .4byte gSprites
-_080B58A0:
- ldrb r2, [r4, 0xE]
- adds r0, r2, 0
- ldrb r3, [r4, 0x10]
- adds r1, r3, 0
- adds r2, 0x9
- lsls r2, 24
- lsrs r2, 24
- adds r3, 0xA
- lsls r3, 24
- lsrs r3, 24
- bl MenuZeroFillWindowRect
- adds r0, r5, 0
- bl DestroyTask
-_080B58BE:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end task_picbox
-
- thumb_func_start sub_80B58C4
-sub_80B58C4: @ 80B58C4
- push {r4-r7,lr}
- lsls r0, 16
- lsrs r7, r0, 16
- lsls r1, 24
- lsrs r6, r1, 24
- lsls r2, 24
- lsrs r5, r2, 24
- ldr r4, _080B595C @ =task_picbox
- adds r0, r4, 0
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xFF
- bne _080B596C
- adds r2, r6, 0
- adds r2, 0x9
- lsls r2, 24
- lsrs r2, 24
- adds r3, r5, 0
- adds r3, 0xA
- lsls r3, 24
- lsrs r3, 24
- adds r0, r6, 0
- adds r1, r5, 0
- bl MenuDrawTextWindow
- adds r0, r4, 0
- movs r1, 0x50
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _080B5960 @ =gTasks
- lsls r4, r0, 2
- adds r4, r0
- lsls r4, 3
- adds r4, r1
- movs r0, 0
- strh r0, [r4, 0x8]
- strh r7, [r4, 0xA]
- lsls r1, r6, 19
- movs r0, 0xA0
- lsls r0, 14
- adds r1, r0
- asrs r1, 16
- lsls r2, r5, 19
- adds r2, r0
- asrs r2, 16
- adds r0, r7, 0
- movs r3, 0
- bl CreateMonSprite_PicBox
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0xC]
- strh r6, [r4, 0xE]
- strh r5, [r4, 0x10]
- ldr r3, _080B5964 @ =gSprites
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r0, r3, 0
- adds r0, 0x1C
- adds r0, r1, r0
- ldr r2, _080B5968 @ =SpriteCallbackDummy
- str r2, [r0]
- adds r1, r3
- ldrb r2, [r1, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r2
- strb r0, [r1, 0x5]
- movs r0, 0x1
- b _080B596E
- .align 2, 0
-_080B595C: .4byte task_picbox
-_080B5960: .4byte gTasks
-_080B5964: .4byte gSprites
-_080B5968: .4byte SpriteCallbackDummy
-_080B596C:
- movs r0, 0
-_080B596E:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80B58C4
-
- thumb_func_start picbox_close
-picbox_close: @ 80B5974
- push {lr}
- ldr r0, _080B5998 @ =task_picbox
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xFF
- beq _080B59A4
- ldr r0, _080B599C @ =gTasks
- lsls r1, r2, 2
- adds r1, r2
- lsls r1, 3
- adds r1, r0
- ldrh r0, [r1, 0x8]
- adds r0, 0x1
- strh r0, [r1, 0x8]
- ldr r0, _080B59A0 @ =sub_80B59AC
- b _080B59A6
- .align 2, 0
-_080B5998: .4byte task_picbox
-_080B599C: .4byte gTasks
-_080B59A0: .4byte sub_80B59AC
-_080B59A4:
- movs r0, 0
-_080B59A6:
- pop {r1}
- bx r1
- thumb_func_end picbox_close
-
- thumb_func_start sub_80B59AC
-sub_80B59AC: @ 80B59AC
- push {lr}
- ldr r0, _080B59C0 @ =task_picbox
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xFF
- beq _080B59C4
- movs r0, 0
- b _080B59C6
- .align 2, 0
-_080B59C0: .4byte task_picbox
-_080B59C4:
- movs r0, 0x1
-_080B59C6:
- pop {r1}
- bx r1
- thumb_func_end sub_80B59AC
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/event_scripts.s b/data/event_scripts.s
index e76663f7f..41ac10d06 100644
--- a/data/event_scripts.s
+++ b/data/event_scripts.s
@@ -1686,7 +1686,7 @@ gUnknown_081A0009:: @ 81A0009
end
EventScript_1A0023:
- message UnknownString_81A0A01
+ message gPCText_WhichPCShouldBeAccessed
waittext
special 262
waitstate
@@ -2970,8 +2970,7 @@ UnusedMixRecordsSeeYouAgainText: @ 81A09D2
UnknownString_81A09EC: @ 81A09EC
.string "{PLAYER} booted up the PC.$"
-gUnknown_081A0A01:: @ 81A0A01
-UnknownString_81A0A01: @ 81A0A01
+gPCText_WhichPCShouldBeAccessed:: @ 81A0A01
.string "Which PC should be accessed?$"
UnknownString_81A0A1E: @ 81A0A1E
diff --git a/data/specials.inc b/data/specials.inc
index 5d5ed3f07..f365962db 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -262,7 +262,7 @@ gSpecials::
.4byte ShowBerryBlenderRecordWindow
.4byte ResetTrickHouseEndRoomFlag
.4byte SetTrickHouseEndRoomFlag
- .4byte sp109_CreatePCMenu
+ .4byte TryCreatePCMenu
.4byte AccessHallOfFamePC
.4byte sub_810D6A4
.4byte CheckLeadMonCool
diff --git a/ld_script.txt b/ld_script.txt
index 9cf1da63d..fbab390f3 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -127,7 +127,6 @@ SECTIONS {
asm/shop.o(.text);
src/berry.o(.text);
src/script_menu.o(.text);
- asm/script_menu.o(.text);
asm/naming_screen.o(.text);
src/money.o(.text);
asm/contest_effect.o(.text);
diff --git a/src/script_menu.c b/src/script_menu.c
index d351c3fa4..1010435cc 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -4,6 +4,8 @@
#include "palette.h"
#include "script.h"
#include "sound.h"
+#include "flag.h"
+#include "sprite.h"
struct MultichoiceListStruct
{
@@ -15,12 +17,24 @@ extern const struct MultichoiceListStruct gMultichoiceLists[];
extern u16 gScriptResult;
+extern void FreeResourcesAndDestroySprite(struct Sprite *sprite);
+extern u8 CreateMonSprite_PicBox(u16, s16, s16, u8);
+extern u8 sub_80B59AC(void);
+
+extern u8 gPCText_PlayersPC[];
+extern u8 gPCText_SomeonesPC[];
+extern u8 gPCText_HallOfFame[];
+extern u8 gPCText_LogOff[];
+extern u8 gPCText_LanettesPC[];
+extern u8 gPCText_WhichPCShouldBeAccessed[];
+
void DrawMultichoiceMenu(u8, u8, u8, struct MenuAction *list, u8, u8);
void sub_80B53B4(u8, u8, u8, struct MenuAction *list, u8);
void sub_80B52B4(u8);
void sub_80B5230(u8, u8, u8, u8, u8, u8);
void task_yes_no_maybe(u8);
void sub_80B5684(u8);
+void CreatePCMenu(void);
bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4)
{
@@ -244,7 +258,7 @@ bool8 sub_80B5578(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount)
u8 taskId;
u8 width;
- gScriptResult = 255;
+ gScriptResult = 0xFF;
sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0);
@@ -298,3 +312,120 @@ void sub_80B5684(u8 taskId)
EnableBothScriptContexts();
}
}
+
+bool8 TryCreatePCMenu(void)
+{
+ if(FuncIsActiveTask(sub_80B52B4) == 1)
+ return FALSE;
+ else
+ {
+ gScriptResult = 0xFF;
+ CreatePCMenu();
+ return TRUE;
+ }
+}
+
+void CreatePCMenu(void)
+{
+ u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC);
+ u8 width;
+ u8 numChoices;
+
+ if(playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC))
+ width = playersPCWidth;
+ else
+ width = 8;
+
+ if(FlagGet(0x804)) // player has cleared game?
+ {
+ numChoices = 4;
+ MenuDrawTextWindow(0, 0, width + 2, 9);
+ MenuPrint(gPCText_HallOfFame, 1, 5);
+ MenuPrint(gPCText_LogOff, 1, 7);
+ }
+ else
+ {
+ numChoices = 3;
+ MenuDrawTextWindow(0, 0, width + 2, 7);
+ MenuPrint(gPCText_LogOff, 1, 5);
+ }
+
+ if(FlagGet(0x84B)) // player met lanette?
+ MenuPrint(gPCText_LanettesPC, 1, 1);
+ else
+ MenuPrint(gPCText_SomeonesPC, 1, 1);
+
+ MenuPrint(gPCText_PlayersPC, 1, 3);
+ InitMenu(0, 1, 1, numChoices, 0, width + 1);
+ sub_80B5230(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices);
+}
+
+void sub_80B5838(void)
+{
+ MenuDisplayMessageBox();
+ MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15);
+}
+
+void task_picbox(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch(task->data[0])
+ {
+ case 0:
+ task->data[0]++;
+ break;
+ case 1:
+ break;
+ case 2:
+ FreeResourcesAndDestroySprite(&gSprites[task->data[2]]);
+ task->data[0]++;
+ break;
+ case 3:
+ MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+bool8 sub_80B58C4(u16 var1, u8 var2, u8 var3)
+{
+ u8 taskId;
+ u8 var;
+
+ if(FindTaskIdByFunc(task_picbox) != 0xFF)
+ return FALSE;
+ else
+ {
+ MenuDrawTextWindow(var2, var3, var2 + 9, var3 + 10);
+ taskId = CreateTask(task_picbox, 0x50);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = var1;
+ var = CreateMonSprite_PicBox(var1, var2 * 8 + 40, var3 * 8 + 40, 0);
+ gTasks[taskId].data[2] = var;
+ gTasks[taskId].data[3] = var2;
+ gTasks[taskId].data[4] = var3;
+ gSprites[var].callback = SpriteCallbackDummy;
+ gSprites[var].oam.priority = 0;
+ return TRUE;
+ }
+}
+
+void *picbox_close(void)
+{
+ u8 taskId = FindTaskIdByFunc(task_picbox);
+
+ if(taskId == 0xFF)
+ return NULL;
+
+ gTasks[taskId].data[0]++;
+ return (void *)sub_80B59AC;
+}
+
+bool8 sub_80B59AC(void)
+{
+ if(FindTaskIdByFunc(task_picbox) == 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}