Decompile SS Anne
This commit is contained in:
-400
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user