Decompile SS Anne

This commit is contained in:
PikalaxALT
2019-06-14 11:33:13 -04:00
parent 117c3fb8cc
commit 601d2feeac
9 changed files with 224 additions and 412 deletions
-400
View File
@@ -5,404 +5,4 @@
.text
thumb_func_start sub_815D334
sub_815D334: @ 815D334
push {lr}
movs r0, 0xF9
bl PlaySE
ldr r0, _0815D35C @ =sub_815D364
movs r1, 0x8
bl CreateTask
lsls r0, 24
lsrs r0, 24
ldr r2, _0815D360 @ =gTasks
lsls r1, r0, 2
adds r1, r0
lsls r1, 3
adds r1, r2
movs r0, 0x32
strh r0, [r1, 0x8]
pop {r0}
bx r0
.align 2, 0
_0815D35C: .4byte sub_815D364
_0815D360: .4byte gTasks
thumb_func_end sub_815D334
thumb_func_start sub_815D364
sub_815D364: @ 815D364
push {r4,r5,lr}
lsls r0, 24
lsrs r0, 24
lsls r1, r0, 2
adds r1, r0
lsls r4, r1, 3
ldr r5, _0815D39C @ =gTasks+0x8
adds r1, r4, r5
ldrh r0, [r1]
subs r0, 0x1
strh r0, [r1]
lsls r0, 16
cmp r0, 0
bne _0815D394
ldr r0, _0815D3A0 @ =gUnknown_8479C58
bl LoadSpriteSheets
bl sub_815D498
adds r0, r5, 0
subs r0, 0x8
adds r0, r4, r0
ldr r1, _0815D3A4 @ =sub_815D3A8
str r1, [r0]
_0815D394:
pop {r4,r5}
pop {r0}
bx r0
.align 2, 0
_0815D39C: .4byte gTasks+0x8
_0815D3A0: .4byte gUnknown_8479C58
_0815D3A4: .4byte sub_815D3A8
thumb_func_end sub_815D364
thumb_func_start sub_815D3A8
sub_815D3A8: @ 815D3A8
push {r4-r7,lr}
sub sp, 0x4
lsls r0, 24
lsrs r0, 24
lsls r1, r0, 2
adds r1, r0
lsls r6, r1, 3
ldr r7, _0815D424 @ =gTasks+0x8
adds r5, r6, r7
ldrh r1, [r5, 0x2]
adds r1, 0x1
strh r1, [r5, 0x2]
ldrh r0, [r5, 0x4]
adds r0, 0x1
strh r0, [r5, 0x4]
lsls r1, 16
asrs r1, 16
cmp r1, 0x46
bne _0815D3D6
movs r0, 0
strh r0, [r5, 0x2]
bl sub_815D5A4
_0815D3D6:
ldr r0, _0815D428 @ =gSaveBlock1Ptr
ldr r0, [r0]
ldrb r1, [r0, 0x5]
ldrb r2, [r0, 0x4]
movs r0, 0x1
mov r3, sp
bl TryGetFieldObjectIdByLocalIdAndMap
mov r0, sp
ldrb r1, [r0]
lsls r0, r1, 3
adds r0, r1
lsls r0, 2
ldr r1, _0815D42C @ =gMapObjects
adds r0, r1
ldr r2, _0815D430 @ =gSprites
ldrb r1, [r0, 0x4]
lsls r0, r1, 4
adds r0, r1
lsls r0, 2
adds r4, r0, r2
movs r1, 0x20
ldrsh r0, [r4, r1]
movs r2, 0x24
ldrsh r1, [r4, r2]
adds r0, r1
movs r1, 0x78
negs r1, r1
cmp r0, r1
bge _0815D438
movs r0, 0xF9
bl PlaySE
adds r0, r7, 0
subs r0, 0x8
adds r0, r6, r0
ldr r1, _0815D434 @ =sub_815D454
str r1, [r0]
b _0815D44A
.align 2, 0
_0815D424: .4byte gTasks+0x8
_0815D428: .4byte gSaveBlock1Ptr
_0815D42C: .4byte gMapObjects
_0815D430: .4byte gSprites
_0815D434: .4byte sub_815D454
_0815D438:
movs r1, 0x4
ldrsh r0, [r5, r1]
movs r1, 0x5
bl __divsi3
lsls r0, 16
asrs r0, 16
negs r0, r0
strh r0, [r4, 0x24]
_0815D44A:
add sp, 0x4
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_815D3A8
thumb_func_start sub_815D454
sub_815D454: @ 815D454
push {r4,lr}
lsls r0, 24
lsrs r4, r0, 24
lsls r1, r4, 2
adds r1, r4
lsls r1, 3
ldr r0, _0815D490 @ =gTasks+0x8
adds r1, r0
ldrh r0, [r1, 0x6]
adds r0, 0x1
strh r0, [r1, 0x6]
lsls r0, 16
asrs r0, 16
cmp r0, 0x28
bne _0815D48A
movs r0, 0xFA
lsls r0, 4
bl FreeSpriteTilesByTag
ldr r0, _0815D494 @ =0x00000fa1
bl FreeSpriteTilesByTag
adds r0, r4, 0
bl DestroyTask
bl EnableBothScriptContexts
_0815D48A:
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0815D490: .4byte gTasks+0x8
_0815D494: .4byte 0x00000fa1
thumb_func_end sub_815D454
thumb_func_start sub_815D498
sub_815D498: @ 815D498
push {r4,lr}
sub sp, 0x4
ldr r0, _0815D508 @ =gSaveBlock1Ptr
ldr r0, [r0]
ldrb r1, [r0, 0x5]
ldrb r2, [r0, 0x4]
movs r0, 0x1
mov r3, sp
bl TryGetFieldObjectIdByLocalIdAndMap
mov r0, sp
ldrb r1, [r0]
lsls r0, r1, 3
adds r0, r1
lsls r0, 2
ldr r1, _0815D50C @ =gMapObjects
adds r0, r1
ldr r4, _0815D510 @ =gSprites
ldrb r1, [r0, 0x4]
lsls r0, r1, 4
adds r0, r1
lsls r0, 2
adds r0, r4
ldrh r1, [r0, 0x24]
ldrh r0, [r0, 0x20]
adds r1, r0
adds r1, 0x50
ldr r0, _0815D514 @ =gUnknown_8479C88
lsls r1, 16
asrs r1, 16
movs r2, 0x6D
movs r3, 0xFF
bl CreateSprite
lsls r0, 24
lsrs r0, 24
lsls r1, r0, 4
adds r1, r0
lsls r1, 2
adds r1, r4
ldrb r2, [r1, 0x5]
movs r0, 0xD
negs r0, r0
ands r0, r2
movs r2, 0x8
orrs r0, r2
movs r2, 0xF
ands r0, r2
movs r2, 0xA0
orrs r0, r2
strb r0, [r1, 0x5]
add sp, 0x4
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0815D508: .4byte gSaveBlock1Ptr
_0815D50C: .4byte gMapObjects
_0815D510: .4byte gSprites
_0815D514: .4byte gUnknown_8479C88
thumb_func_end sub_815D498
thumb_func_start sub_815D518
sub_815D518: @ 815D518
push {r4,lr}
sub sp, 0x4
adds r4, r0, 0
ldr r0, _0815D598 @ =gSaveBlock1Ptr
ldr r0, [r0]
ldrb r1, [r0, 0x5]
ldrb r2, [r0, 0x4]
movs r0, 0x1
mov r3, sp
bl TryGetFieldObjectIdByLocalIdAndMap
mov r0, sp
ldrb r1, [r0]
lsls r0, r1, 3
adds r0, r1
lsls r0, 2
ldr r1, _0815D59C @ =gMapObjects
adds r0, r1
ldr r2, _0815D5A0 @ =gSprites
ldrb r1, [r0, 0x4]
lsls r0, r1, 4
adds r0, r1
lsls r0, 2
adds r0, r2
ldrh r1, [r0, 0x24]
ldrh r0, [r0, 0x20]
adds r1, r0
adds r1, 0x50
strh r1, [r4, 0x20]
movs r1, 0x2E
ldrsh r0, [r4, r1]
movs r1, 0x6
bl __divsi3
lsls r0, 16
asrs r0, 16
cmp r0, 0x15
bgt _0815D56A
ldrh r0, [r4, 0x2E]
adds r0, 0x1
strh r0, [r4, 0x2E]
_0815D56A:
movs r2, 0x2E
ldrsh r0, [r4, r2]
movs r1, 0x6
bl __divsi3
strh r0, [r4, 0x24]
movs r1, 0x20
ldrsh r0, [r4, r1]
movs r2, 0x24
ldrsh r1, [r4, r2]
adds r0, r1
movs r1, 0x12
negs r1, r1
cmp r0, r1
bge _0815D58E
adds r0, r4, 0
bl DestroySprite
_0815D58E:
add sp, 0x4
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0815D598: .4byte gSaveBlock1Ptr
_0815D59C: .4byte gMapObjects
_0815D5A0: .4byte gSprites
thumb_func_end sub_815D518
thumb_func_start sub_815D5A4
sub_815D5A4: @ 815D5A4
push {r4,lr}
sub sp, 0x4
ldr r0, _0815D614 @ =gSaveBlock1Ptr
ldr r0, [r0]
ldrb r1, [r0, 0x5]
ldrb r2, [r0, 0x4]
movs r0, 0x1
mov r3, sp
bl TryGetFieldObjectIdByLocalIdAndMap
mov r0, sp
ldrb r1, [r0]
lsls r0, r1, 3
adds r0, r1
lsls r0, 2
ldr r1, _0815D618 @ =gMapObjects
adds r0, r1
ldr r4, _0815D61C @ =gSprites
ldrb r0, [r0, 0x4]
lsls r1, r0, 4
adds r1, r0
lsls r1, 2
adds r1, r4
ldrh r0, [r1, 0x24]
ldrh r1, [r1, 0x20]
adds r0, r1
adds r0, 0x31
lsls r0, 16
asrs r1, r0, 16
movs r0, 0x20
negs r0, r0
cmp r1, r0
blt _0815D60C
ldr r0, _0815D620 @ =gUnknown_8479CC0
movs r2, 0x4E
movs r3, 0x8
bl CreateSprite
lsls r0, 24
lsrs r1, r0, 24
cmp r1, 0x40
beq _0815D60C
lsls r0, r1, 4
adds r0, r1
lsls r0, 2
adds r0, r4
ldrb r2, [r0, 0x5]
movs r1, 0xF
ands r1, r2
movs r2, 0xA0
orrs r1, r2
strb r1, [r0, 0x5]
_0815D60C:
add sp, 0x4
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0815D614: .4byte gSaveBlock1Ptr
_0815D618: .4byte gMapObjects
_0815D61C: .4byte gSprites
_0815D620: .4byte gUnknown_8479CC0
thumb_func_end sub_815D5A4
thumb_func_start sub_815D624
sub_815D624: @ 815D624
push {lr}
adds r2, r0, 0
ldrh r0, [r2, 0x2E]
adds r0, 0x1
strh r0, [r2, 0x2E]
movs r1, 0x2E
ldrsh r0, [r2, r1]
cmp r0, 0
bge _0815D638
adds r0, 0x3
_0815D638:
asrs r0, 2
strh r0, [r2, 0x24]
adds r0, r2, 0
adds r0, 0x3F
ldrb r1, [r0]
movs r0, 0x10
ands r0, r1
cmp r0, 0
beq _0815D650
adds r0, r2, 0
bl DestroySprite
_0815D650:
pop {r0}
bx r0
thumb_func_end sub_815D624
.align 2, 0 @ Don't pad with nop.
+6 -2
View File
@@ -138,10 +138,14 @@ gUnknown_846D953:: @ 846D953
.incbin "baserom.gba", 0x46D953, 0xD
gUnknown_846D960:: @ 846D960
.incbin "baserom.gba", 0x46D960, 0x8
obj_tiles gUnknown_8479688, 0, 800
gUnknown_846D968:: @ 846D968
.incbin "baserom.gba", 0x46D968, 0x40
obj_pal gUnknown_8479668, 800
gUnknown_846D970::
.2byte 0x0006, 0x0008, 0x0010, 0x0008, 0x0006, 0x0008, 0x000b, 0x0006, 0x0010, 0x0008, 0x0002, 0x0006
.2byte 0x0006, 0x0008, 0x0010, 0x0008, 0x0014, 0x0006, 0x0002, 0x0006, 0x0006, 0x0008, 0x000b, 0x0006, 0x0010, 0x0008, 0x0014, 0x0006
gUnknown_846D9A8:: @ 846D9A8
.incbin "baserom.gba", 0x46D9A8, 0x2C
+8 -7
View File
@@ -219,16 +219,17 @@ gUnknown_84792D0:: @ 84792D0
.align 2
gUnknown_8479668:: @ 8479668
.incbin "baserom.gba", 0x479668, 0x5F0
.incbin "graphics/misc/unk_8479688.gbapal"
gUnknown_8479C58:: @ 8479C58
.incbin "baserom.gba", 0x479C58, 0x30
gUnknown_8479688::
.incbin "graphics/misc/unk_8479688.4bpp.lz"
gUnknown_8479C88:: @ 8479C88
.incbin "baserom.gba", 0x479C88, 0x38
gUnknown_8479748::
.incbin "baserom.gba", 0x479748, 0xF0
gUnknown_8479CC0:: @ 8479CC0
.incbin "baserom.gba", 0x479CC0, 0x18
.section .rodata.cereader_tool
// cereader_tool
.align 2
gUnknown_8479CD8:: @ 8479CD8
+1 -1
View File
@@ -20,7 +20,7 @@ SSAnne_Exterior_160859:: @ 8160859
call_if 4, EventScript_1608AC
fadenewbgm BGM_FRLG_SURF
delay 50
special sub_815D334
special Special_SSAnneDepartureCutscene
waitstate
removeobject 1
applymovement 255, Movement_1608B7
+1 -1
View File
@@ -410,7 +410,7 @@ gSpecials:: @ 815FD60
def_special sub_8127888
def_special sub_80803FC
def_special sub_812B35C
def_special sub_815D334
def_special Special_SSAnneDepartureCutscene
def_special sub_8149A18
def_special sub_806E25C
def_special sub_815D9E8
+4
View File
@@ -20,6 +20,7 @@ EVENTOBJGFXDIR := graphics/event_objects
MISCGFXDIR := graphics/misc
TEXTWINDOWGFXDIR := graphics/text_window
TEACHYTVGFXDIR := graphics/teachy_tv
SSANNEGFXDIR := graphics/ss_anne
types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark
contest_types := cool beauty cute smart tough
@@ -478,3 +479,6 @@ $(TEXTWINDOWGFXDIR)/unk_8470B0C.4bpp: %.4bpp: %.png
$(TEACHYTVGFXDIR)/tiles.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 233
$(SSANNEGFXDIR)/unk_8479A38.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 17
+1 -1
View File
@@ -251,7 +251,7 @@
#define SE_W114 246
#define SE_W063B 247
#define SE_CASHIER 248
#define SE_SHIP_HORN 249
#define SE_HELP_OPEN 250
#define SE_HELP_CLOSE 251
#define SE_HELP_PAGE 252
+3
View File
@@ -280,6 +280,7 @@ SECTIONS {
src/teachy_tv.o(.text);
asm/ereader_helpers.o(.text);
src/unk_815C980.o(.text);
src/ss_anne.o(.text);
asm/ss_anne.o(.text);
asm/cereader_tool.o(.text);
src/trainer_tower.o(.text);
@@ -454,6 +455,8 @@ SECTIONS {
src/teachy_tv.o(.rodata);
src/unk_815C980.o(.rodata);
data/data_8471F00.o(.rodata.8479668);
src/ss_anne.o(.rodata);
data/data_8471F00.o(.rodata.cereader_tool);
src/trainer_tower.o(.rodata);
data/data_8471F00.o(.rodata.after_trainer_tower);
src/mystery_event_msg.o(.rodata);
+200
View File
@@ -0,0 +1,200 @@
#include "global.h"
#include "task.h"
#include "sound.h"
#include "field_map_obj.h"
#include "script.h"
#include "constants/songs.h"
// Tasks governing the ship's departure after you've gotten HM01 CUT
#define SPRITE_TAG_WAKE 4000
#define SPRITE_TAG_SMOKE 4001
static void Task_SSAnneInit(u8 taskId);
static void Task_SSAnneRun(u8 taskId);
static void Task_SSAnneFinish(u8 taskId);
static void CreateWakeBehindBoat(void);
static void WakeSpriteCallback(struct Sprite * sprite);
static void CreateSmokeSprite(void);
static void SmokeSpriteCallback(struct Sprite * sprite);
static const u16 sWakeTiles[] = INCBIN_U16("graphics/ss_anne/unk_8479838.4bpp");
static const u16 sSmokeTiles[] = INCBIN_U16("graphics/ss_anne/unk_8479A38.4bpp");
static const struct SpriteSheet sSpriteSheets[] = {
{(const void *)sWakeTiles, sizeof(sWakeTiles), SPRITE_TAG_WAKE},
{(const void *)sSmokeTiles, sizeof(sSmokeTiles), SPRITE_TAG_SMOKE},
{0}
};
static const union AnimCmd sWakeAnim[] = {
ANIMCMD_FRAME(0, 12),
ANIMCMD_FRAME(8, 12),
ANIMCMD_JUMP(0)
};
static const union AnimCmd *const sWakeAnimTable[] = {
sWakeAnim
};
static const struct OamData sWakeOamData = {
.shape = ST_OAM_V_RECTANGLE,
.size = 2
};
static const struct SpriteTemplate sWakeSpriteTemplate = {
SPRITE_TAG_WAKE,
0xFFFF,
&sWakeOamData,
sWakeAnimTable,
NULL,
gDummySpriteAffineAnimTable,
WakeSpriteCallback
};
static const union AnimCmd sSmokeAnim[] = {
ANIMCMD_FRAME( 0, 10),
ANIMCMD_FRAME( 4, 20),
ANIMCMD_FRAME( 8, 20),
ANIMCMD_FRAME(12, 30),
ANIMCMD_END
};
static const union AnimCmd *const sSmokeAnimTable[] = {
sSmokeAnim
};
static const struct OamData sSmokeOamData = {
.shape = ST_OAM_SQUARE,
.size = 1
};
static const struct SpriteTemplate sSmokeSpriteTemplate = {
SPRITE_TAG_SMOKE,
0xFFFF,
&sSmokeOamData,
sSmokeAnimTable,
NULL,
gDummySpriteAffineAnimTable,
SmokeSpriteCallback
};
void Special_SSAnneDepartureCutscene(void)
{
u8 taskId;
PlaySE(SE_SHIP_HORN);
taskId = CreateTask(Task_SSAnneInit, 8);
gTasks[taskId].data[0] = 50;
}
static void Task_SSAnneInit(u8 taskId)
{
s16 * data = gTasks[taskId].data;
if (--data[0] == 0)
{
LoadSpriteSheets(sSpriteSheets);
CreateWakeBehindBoat();
gTasks[taskId].func = Task_SSAnneRun;
}
}
static void Task_SSAnneRun(u8 taskId)
{
s16 * data = gTasks[taskId].data;
u8 mapObjectId;
struct MapObject * boatObject;
s16 x;
data[1]++;
data[2]++;
if (data[1] == 70)
{
data[1] = 0;
CreateSmokeSprite();
}
TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
boatObject = &gMapObjects[mapObjectId];
if (gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x < -120)
{
PlaySE(SE_SHIP_HORN);
gTasks[taskId].func = Task_SSAnneFinish;
}
else
{
x = data[2] / 5;
gSprites[boatObject->spriteId].pos2.x = -x;
}
}
static void Task_SSAnneFinish(u8 taskId)
{
s16 * data = gTasks[taskId].data;
if (++data[3] == 40)
{
FreeSpriteTilesByTag(SPRITE_TAG_WAKE);
FreeSpriteTilesByTag(SPRITE_TAG_SMOKE);
DestroyTask(taskId);
EnableBothScriptContexts();
}
}
static void CreateWakeBehindBoat(void)
{
u8 mapObjectId;
struct MapObject * boatObject;
u16 x;
u8 spriteId;
TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
boatObject = &gMapObjects[mapObjectId];
x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 80;
spriteId = CreateSprite(&sWakeSpriteTemplate, x, 109, 0xFF);
gSprites[spriteId].oam.priority = 2;
gSprites[spriteId].oam.paletteNum = 10;
}
static void WakeSpriteCallback(struct Sprite * sprite)
{
u8 mapObjectId;
struct MapObject * boatObject;
u16 x;
TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
boatObject = &gMapObjects[mapObjectId];
x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 80;
sprite->pos1.x = x;
if (sprite->data[0] / 6 < 22)
sprite->data[0]++;
sprite->pos2.x = sprite->data[0] / 6;
if (sprite->pos1.x + sprite->pos2.x < -18)
DestroySprite(sprite);
}
static void CreateSmokeSprite(void)
{
u8 mapObjectId;
struct MapObject * boatObject;
u16 x;
u8 spriteId;
TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
boatObject = &gMapObjects[mapObjectId];
x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 49;
if ((s16)x >= -32)
{
spriteId = CreateSprite(&sSmokeSpriteTemplate, x, 78, 8);
if (spriteId != MAX_SPRITES)
gSprites[spriteId].oam.paletteNum = 10;
}
}
static void SmokeSpriteCallback(struct Sprite * sprite)
{
sprite->data[0]++;
sprite->pos2.x = sprite->data[0] / 4;
if (sprite->animEnded)
DestroySprite(sprite);
}