summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/ss_anne.s400
-rw-r--r--data/data_8468C98.s8
-rw-r--r--data/data_8471F00.s15
-rw-r--r--data/maps/SSAnne_Exterior/scripts.inc2
-rw-r--r--data/specials.inc2
-rw-r--r--graphics_file_rules.mk4
-rw-r--r--include/constants/songs.h2
-rw-r--r--ld_script.txt3
-rw-r--r--src/ss_anne.c200
9 files changed, 224 insertions, 412 deletions
diff --git a/asm/ss_anne.s b/asm/ss_anne.s
index 429645f3e..2428f2984 100644
--- a/asm/ss_anne.s
+++ b/asm/ss_anne.s
@@ -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.
diff --git a/data/data_8468C98.s b/data/data_8468C98.s
index 5b59683b2..7ce7c3a02 100644
--- a/data/data_8468C98.s
+++ b/data/data_8468C98.s
@@ -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
diff --git a/data/data_8471F00.s b/data/data_8471F00.s
index 672a9178e..044a94e7d 100644
--- a/data/data_8471F00.s
+++ b/data/data_8471F00.s
@@ -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
diff --git a/data/maps/SSAnne_Exterior/scripts.inc b/data/maps/SSAnne_Exterior/scripts.inc
index 0d08a0152..d0e530489 100644
--- a/data/maps/SSAnne_Exterior/scripts.inc
+++ b/data/maps/SSAnne_Exterior/scripts.inc
@@ -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
diff --git a/data/specials.inc b/data/specials.inc
index f40c3d3be..0b00645de 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -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
diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk
index a1a00ad28..64d9d5c34 100644
--- a/graphics_file_rules.mk
+++ b/graphics_file_rules.mk
@@ -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
diff --git a/include/constants/songs.h b/include/constants/songs.h
index 66d239ad8..193a57756 100644
--- a/include/constants/songs.h
+++ b/include/constants/songs.h
@@ -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
diff --git a/ld_script.txt b/ld_script.txt
index bde424fc9..ad553a79b 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -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);
diff --git a/src/ss_anne.c b/src/ss_anne.c
new file mode 100644
index 000000000..f59f17a76
--- /dev/null
+++ b/src/ss_anne.c
@@ -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);
+}