diff options
-rw-r--r-- | asm/ss_anne.s | 400 | ||||
-rw-r--r-- | data/data_8468C98.s | 8 | ||||
-rw-r--r-- | data/data_8471F00.s | 15 | ||||
-rw-r--r-- | data/maps/SSAnne_Exterior/scripts.inc | 2 | ||||
-rw-r--r-- | data/specials.inc | 2 | ||||
-rw-r--r-- | graphics_file_rules.mk | 4 | ||||
-rw-r--r-- | include/constants/songs.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 3 | ||||
-rw-r--r-- | src/ss_anne.c | 200 |
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); +} |