Full item banner AI

This commit is contained in:
YohannDR 2022-07-24 21:38:46 +02:00
parent dd513d7849
commit 7e6d1f6bdc
15 changed files with 865 additions and 44 deletions

View File

@ -1,6 +1,7 @@
# Metroid - Zero Mission Decomp # Metroid - Zero Mission Decomp
This is a work in progress decompilation of Metroid - Zero Mission. This is a work in progress decompilation of Metroid - Zero Mission.
Progress can be seen here : https://docs.google.com/spreadsheets/d/1X8XarD5evY8ZI7r_GQqh1pYmdVMbBcINYfRBUlogmKY/edit#gid=0
**It's very likely that the code of this repo doesn't build, and even if it does it probably won't match, this is normal** **It's very likely that the code of this repo doesn't build, and even if it does it probably won't match, this is normal**

View File

@ -3001,8 +3001,8 @@ lbl_0800407c:
lbl_08004084: lbl_08004084:
.byte 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00 .byte 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00
thumb_func_start sub_0800408c thumb_func_start backup_track_data2_sound_channels
sub_0800408c: @ 0x0800408c backup_track_data2_sound_channels: @ 0x0800408c
push {r4, r5, r6, r7, lr} push {r4, r5, r6, r7, lr}
mov r7, sb mov r7, sb
mov r6, r8 mov r6, r8
@ -3105,8 +3105,8 @@ lbl_0800413a:
.align 2, 0 .align 2, 0
lbl_0800414c: .4byte 0x030039bc lbl_0800414c: .4byte 0x030039bc
thumb_func_start sub_08004150 thumb_func_start retrieve_track_data2_sound_channels
sub_08004150: @ 0x08004150 retrieve_track_data2_sound_channels: @ 0x08004150
push {r4, r5, r6, r7, lr} push {r4, r5, r6, r7, lr}
mov r7, sb mov r7, sb
mov r6, r8 mov r6, r8

View File

@ -18738,7 +18738,7 @@ lbl_0801b7b0:
strh r0, [r1, #4] strh r0, [r1, #4]
ldrb r1, [r1, #0x1f] ldrb r1, [r1, #0x1f]
adds r0, r6, #0 adds r0, r6, #0
bl sub_0806f258 bl start_message
pop {r4, r5, r6} pop {r4, r5, r6}
pop {r0} pop {r0}
bx r0 bx r0
@ -18833,7 +18833,7 @@ lbl_0801b856:
adds r1, #0x2e adds r1, #0x2e
movs r0, #1 movs r0, #1
strb r0, [r1] strb r0, [r1]
bl sub_0800408c bl backup_track_data2_sound_channels
cmp r5, #0xc cmp r5, #0xc
beq lbl_0801b886 beq lbl_0801b886
cmp r5, #0xf cmp r5, #0xf
@ -18862,7 +18862,7 @@ lbl_0801b8a8:
adds r0, #0x2e adds r0, #0x2e
movs r1, #1 movs r1, #1
strb r1, [r0] strb r1, [r0]
bl sub_0800408c bl backup_track_data2_sound_channels
movs r0, #0x37 movs r0, #0x37
b lbl_0801b8ca b lbl_0801b8ca
.align 2, 0 .align 2, 0
@ -18891,7 +18891,7 @@ lbl_0801b8d2:
cmp r5, #6 cmp r5, #6
bne lbl_0801b8ec bne lbl_0801b8ec
lbl_0801b8e8: lbl_0801b8e8:
bl sub_0800408c bl backup_track_data2_sound_channels
lbl_0801b8ec: lbl_0801b8ec:
movs r0, #0x3a movs r0, #0x3a
bl play_sound1 bl play_sound1
@ -19148,7 +19148,7 @@ lbl_0801bad4:
cmp r5, #6 cmp r5, #6
bne lbl_0801baea bne lbl_0801baea
lbl_0801bae6: lbl_0801bae6:
bl sub_08004150 bl retrieve_track_data2_sound_channels
lbl_0801baea: lbl_0801baea:
ldr r1, lbl_0801bb08 @ =0x03001606 ldr r1, lbl_0801bb08 @ =0x03001606
movs r0, #0 movs r0, #0
@ -19438,7 +19438,7 @@ lbl_0801bd62:
lbl_0801bd6c: .4byte 0x00000209 lbl_0801bd6c: .4byte 0x00000209
lbl_0801bd70: .4byte 0x03000738 lbl_0801bd70: .4byte 0x03000738
lbl_0801bd74: lbl_0801bd74:
bl sub_08073ba4 bl save_file
cmp r0, #0 cmp r0, #0
beq lbl_0801bd80 beq lbl_0801bd80
mov r0, r8 mov r0, r8
@ -157558,7 +157558,7 @@ lbl_08060afc:
bl sub_08003f6c bl sub_08003f6c
b lbl_08060b10 b lbl_08060b10
lbl_08060b02: lbl_08060b02:
bl sub_08004150 bl retrieve_track_data2_sound_channels
b lbl_08060b10 b lbl_08060b10
lbl_08060b08: lbl_08060b08:
movs r0, #0xe movs r0, #0xe
@ -186649,8 +186649,8 @@ lbl_0806f24e:
bx r1 bx r1
.align 2, 0 .align 2, 0
thumb_func_start sub_0806f258 thumb_func_start start_message
sub_0806f258: @ 0x0806f258 start_message: @ 0x0806f258
push {r4, r5, r6, r7, lr} push {r4, r5, r6, r7, lr}
lsls r0, r0, #0x18 lsls r0, r0, #0x18
lsrs r0, r0, #0x18 lsrs r0, r0, #0x18
@ -196200,8 +196200,8 @@ lbl_08073b9a:
pop {r1} pop {r1}
bx r1 bx r1
thumb_func_start sub_08073ba4 thumb_func_start save_file
sub_08073ba4: @ 0x08073ba4 save_file: @ 0x08073ba4
push {lr} push {lr}
sub sp, #4 sub sp, #4
ldr r1, lbl_08073bd4 @ =0x03000043 ldr r1, lbl_08073bd4 @ =0x03000043

View File

@ -94,7 +94,6 @@
#include "../src/sprites_AI/black_space_pirate.h" #include "../src/sprites_AI/black_space_pirate.h"
#include "../src/sprites_AI/escape_ship_pirate.h" #include "../src/sprites_AI/escape_ship_pirate.h"
#include "../src/sprites_AI/chozo_ball.h" #include "../src/sprites_AI/chozo_ball.h"
#include "../src/sprites_AI/save_yes_no_cursor.h"
#include "../src/sprites_AI/chozo_statue_movement.h" #include "../src/sprites_AI/chozo_statue_movement.h"
/* generic_data.c */ /* generic_data.c */

View File

@ -26,6 +26,7 @@ SECTIONS {
. = 0x0000003D; gDisableScrolling = .; . = 0x0000003D; gDisableScrolling = .;
. = 0x00000042; gSkipDoorTransition = .; . = 0x00000042; gSkipDoorTransition = .;
. = 0x00000043; gDisableSoftreset = .; . = 0x00000043; gDisableSoftreset = .;
. = 0x00000044; gCollectingTank = .;
. = 0x00000049; gDisablePause = .; . = 0x00000049; gDisablePause = .;
. = 0x00000049; gHideHud = .; . = 0x00000049; gHideHud = .;
. = 0x00000054; gCurrentArea = .; . = 0x00000054; gCurrentArea = .;
@ -71,6 +72,7 @@ SECTIONS {
. = 0x000007F1; gPreviousCollisionCheck = .; . = 0x000007F1; gPreviousCollisionCheck = .;
. = 0x000007F1; gCollisionDebris = .; . = 0x000007F1; gCollisionDebris = .;
. = 0x000007F3; gSpriteDrawOrder = .; . = 0x000007F3; gSpriteDrawOrder = .;
. = 0x0000080C; gBossWork = .;
. = 0x0000083C; gSpriteRNG = .; . = 0x0000083C; gSpriteRNG = .;
. = 0x00000840; gParticleEffects = .; . = 0x00000840; gParticleEffects = .;
. = 0x00000918; gCurrentParticleEffectOAMFramePointer = .; . = 0x00000918; gCurrentParticleEffectOAMFramePointer = .;

View File

@ -9,7 +9,8 @@ u8 EscapeDetermineTimer(void)
if (EventFunction(EVENT_ACTION_CHECKING, EVENT_MOTHER_BRAIN_KILLED)) if (EventFunction(EVENT_ACTION_CHECKING, EVENT_MOTHER_BRAIN_KILLED))
return ESCAPE_MOTHER_BRAIN; return ESCAPE_MOTHER_BRAIN;
} }
else if (!EventFunction(EVENT_ACTION_CHECKING, EVENT_ESCAPED_CHOZODIA) && EventFunction(EVENT_ACTION_CHECKING, EVENT_MECHA_RIDLEY_KILLED)) else if (!EventFunction(EVENT_ACTION_CHECKING, EVENT_ESCAPED_CHOZODIA) &&
EventFunction(EVENT_ACTION_CHECKING, EVENT_MECHA_RIDLEY_KILLED))
return ESCAPE_MECHA_RIDLEY; return ESCAPE_MECHA_RIDLEY;
return ESCAPE_NONE; return ESCAPE_NONE;
} }
@ -64,7 +65,7 @@ void EscapeSetTimer(void)
gEscapeTimerCounter = 0xFF; gEscapeTimerCounter = 0xFF;
if (escape == ESCAPE_MOTHER_BRAIN) if (escape == ESCAPE_MOTHER_BRAIN)
{ {
if (gDifficulty == 0x0) if (gDifficulty == DIFF_EASY)
{ {
gEscapeTimerDigits.hundredths = 0x0; gEscapeTimerDigits.hundredths = 0x0;
gEscapeTimerDigits.tenths = 0x0; gEscapeTimerDigits.tenths = 0x0;
@ -73,7 +74,7 @@ void EscapeSetTimer(void)
gEscapeTimerDigits.minutesOnes = 0x3; gEscapeTimerDigits.minutesOnes = 0x3;
gEscapeTimerDigits.minutesTens = 0x0; gEscapeTimerDigits.minutesTens = 0x0;
} }
else if (gDifficulty == 0x2) else if (gDifficulty == DIFF_HARD)
{ {
gEscapeTimerDigits.hundredths = 0x0; gEscapeTimerDigits.hundredths = 0x0;
gEscapeTimerDigits.tenths = 0x0; gEscapeTimerDigits.tenths = 0x0;
@ -94,7 +95,7 @@ void EscapeSetTimer(void)
} }
else if (escape == ESCAPE_MECHA_RIDLEY) else if (escape == ESCAPE_MECHA_RIDLEY)
{ {
if (gDifficulty == 0x2) if (gDifficulty == DIFF_HARD)
{ {
gEscapeTimerDigits.hundredths = 0x0; gEscapeTimerDigits.hundredths = 0x0;
gEscapeTimerDigits.tenths = 0x0; gEscapeTimerDigits.tenths = 0x0;

View File

@ -80,6 +80,7 @@ extern u8 gResetGame;
extern u8 gDisableScrolling; extern u8 gDisableScrolling;
extern u8 gSkipDoorTransition; extern u8 gSkipDoorTransition;
extern u8 gDisableSoftreset; extern u8 gDisableSoftreset;
extern i8 gCollectingTank;
extern u8 gDisablePause; extern u8 gDisablePause;
extern u8 gCurrentArea; extern u8 gCurrentArea;
extern u8 gCurrentRoom; extern u8 gCurrentRoom;

View File

@ -101,7 +101,7 @@ u8 LocationTextGetNorfair(void)
u8 lt; u8 lt;
lt = LT_INVALID; lt = LT_INVALID;
switch(gCurrentRoom) switch (gCurrentRoom)
{ {
case 0x24: // Save room 1 case 0x24: // Save room 1
case 0x27: // Save room 2 case 0x27: // Save room 2
@ -132,7 +132,7 @@ u8 LocationTextGetRidley(void)
u8 lt; u8 lt;
lt = LT_INVALID; lt = LT_INVALID;
switch(gCurrentRoom) switch (gCurrentRoom)
{ {
case 0x1: // Save room 1 case 0x1: // Save room 1
case 0x14: // Save room 2 case 0x14: // Save room 2
@ -160,7 +160,7 @@ u8 LocationTextGetChozodia(void)
u8 lt; u8 lt;
lt = LT_INVALID; lt = LT_INVALID;
switch(gCurrentRoom) switch (gCurrentRoom)
{ {
case 0x0: // Suitless spawn room case 0x0: // Suitless spawn room
case 0x22: // Crateria passage with missile tank room case 0x22: // Crateria passage with missile tank room
@ -192,7 +192,7 @@ u8 LocationTextGetTourian(void)
u8 lt; u8 lt;
lt = LT_INVALID; lt = LT_INVALID;
switch(gCurrentRoom) switch (gCurrentRoom)
{ {
case 0x6: // Save room 1 case 0x6: // Save room 1
case 0xB: // Save room 2 case 0xB: // Save room 2

View File

@ -19,6 +19,7 @@ extern u8 gPreviousVerticalCollisionCheck;
extern u8 gPreviousCollisionCheck; extern u8 gPreviousCollisionCheck;
extern u8 gIgnoreSamusAndSpriteCollision; extern u8 gIgnoreSamusAndSpriteCollision;
extern u8 gSpriteDrawOrder[24]; extern u8 gSpriteDrawOrder[24];
extern struct BossWork gBossWork;
extern u8 gSpriteRNG; extern u8 gSpriteRNG;
// Defines // Defines
@ -449,6 +450,33 @@ struct SpriteData {
u8 absolutePaletteRow; u8 absolutePaletteRow;
}; };
struct BossWork {
u16 work1; // Usually spawn Y
u16 work2; // Usually spawn X
u16 work3;
u16 work4; // Usually health
u16 work5;
u16 work6;
u16 work7;
u16 work8;
u16 work9;
u16 work10;
u16 work11; // Completion percentage, only used by mecha ridley
u16 work12;
u16 work13;
u16 work14;
u16 work15;
u16 work16;
u16 work17;
u16 work18;
u16 work19;
u16 work20;
u16 work21;
u16 work22;
u16 work23;
u16 work24;
};
// Functions // Functions
void SpriteUpdate(void); void SpriteUpdate(void);

View File

@ -448,6 +448,10 @@ void AreaBannerCheckRemovingAnimEnded(void)
gCurrentSprite.status = 0x0; // Kill sprite gCurrentSprite.status = 0x0; // Kill sprite
} }
/**
* @brief 3c884 | e0 | Area banner AI
*
*/
void AreaBanner(void) void AreaBanner(void)
{ {
gCurrentSprite.ignoreSamusCollisionTimer = 0x1; gCurrentSprite.ignoreSamusCollisionTimer = 0x1;

View File

@ -55,7 +55,7 @@ void AtomicChaseSamus(void)
u8 AtomicElectricityCheckAtomicAlive(u8 slot) u8 AtomicElectricityCheckAtomicAlive(u8 slot)
{ {
return 0;
} }
void AtomicElectriciytInit(void) void AtomicElectriciytInit(void)

View File

@ -2,37 +2,780 @@
#include "../../data/data.h" #include "../../data/data.h"
#include "../globals.h" #include "../globals.h"
const u8 sItemBannerGFX[556];
const u16 sItemBannerPAL[32];
const u16 sSaveYesNoCursorOAM_Idle_Frame0[4] = {
0x1,
0xfc, 0x1fc, OBJ_SPRITE_OAM | 0x21e
};
const u16 sSaveYesNoCursorOAM_Idle_Frame1[4] = {
0x1,
0xfc, 0x1fd, OBJ_SPRITE_OAM | 0x21e
};
const u16 sSaveYesNoCursorOAM_Idle_Frame2[4] = {
0x1,
0xfc, 0x1fe, OBJ_SPRITE_OAM | 0x21e
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame0[4] = {
0x1,
OBJ_SHAPE_HORIZONTAL | 0xfc, 0x1f8, OBJ_SPRITE_OAM | 0x25c
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame1[7] = {
0x2,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1e8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, 0x8, OBJ_SPRITE_OAM | 0x25c
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame2[13] = {
0x4,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1c8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1e8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, 0x28, OBJ_SPRITE_OAM | 0x25c
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame3[19] = {
0x6,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1a8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1c8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1e8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x28, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, 0x48, OBJ_SPRITE_OAM | 0x25c
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame4[25] = {
0x8,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x188, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1a8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1c8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1e8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x8, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x28, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x48, OBJ_SPRITE_OAM | 0x25c,
OBJ_SHAPE_HORIZONTAL | 0xfc, 0x68, OBJ_SPRITE_OAM | 0x25c
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame5[49] = {
0x10,
OBJ_SHAPE_VERTICAL | 0xf8, 0x188, OBJ_SPRITE_OAM | 0x21f,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x204,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x20c,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x210,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x214,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x218,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x260,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x264,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x268,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x26c,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x270,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x274,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x278,
OBJ_SHAPE_VERTICAL | 0xf8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21f
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame6[49] = {
0x10,
OBJ_SHAPE_VERTICAL | 0xf8, 0x188, OBJ_SPRITE_OAM | 0x21c,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x204,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x20c,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x210,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x214,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x218,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x260,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x264,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x268,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x26c,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x270,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x274,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x278,
OBJ_SHAPE_VERTICAL | 0xf8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21c
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame7[64] = {
0x14,
0xf6, 0x188, OBJ_SPRITE_OAM | 0x21c,
0x2, 0x188, OBJ_SPRITE_OAM | 0x23c,
OBJ_SHAPE_VERTICAL | 0xf8, 0x188, OBJ_SPRITE_OAM | 0x21d,
OBJ_SHAPE_HORIZONTAL | 0xf6, OBJ_SIZE_32x16 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xf6, OBJ_SIZE_32x16 | 0x1b0, OBJ_SPRITE_OAM | 0x204,
OBJ_SHAPE_HORIZONTAL | 0xf6, OBJ_SIZE_32x16 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xf6, OBJ_SIZE_32x16 | 0x1f0, OBJ_SPRITE_OAM | 0x20c,
OBJ_SHAPE_HORIZONTAL | 0xf6, OBJ_SIZE_32x16 | 0x10, OBJ_SPRITE_OAM | 0x210,
OBJ_SHAPE_HORIZONTAL | 0xf6, OBJ_SIZE_32x16 | 0x30, OBJ_SPRITE_OAM | 0x214,
OBJ_SHAPE_HORIZONTAL | 0xf6, OBJ_SIZE_32x16 | 0x50, OBJ_SPRITE_OAM | 0x218,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x16 | 0x190, OBJ_SPRITE_OAM | 0x240,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x16 | 0x1b0, OBJ_SPRITE_OAM | 0x244,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x16 | 0x1d0, OBJ_SPRITE_OAM | 0x248,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x16 | 0x1f0, OBJ_SPRITE_OAM | 0x24c,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x16 | 0x10, OBJ_SPRITE_OAM | 0x250,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x16 | 0x30, OBJ_SPRITE_OAM | 0x254,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x16 | 0x50, OBJ_SPRITE_OAM | 0x258,
0xf6, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21c,
0x2, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x23c,
OBJ_SHAPE_VERTICAL | 0xf8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21d
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame8[61] = {
0x14,
0xf4, 0x188, OBJ_SPRITE_OAM | 0x21c,
0x4, 0x188, OBJ_SPRITE_OAM | 0x23c,
OBJ_SHAPE_VERTICAL | 0xf8, 0x188, OBJ_SPRITE_OAM | 0x21d,
OBJ_SHAPE_HORIZONTAL | 0xf4, OBJ_SIZE_32x16 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xf4, OBJ_SIZE_32x16 | 0x1b0, OBJ_SPRITE_OAM | 0x204,
OBJ_SHAPE_HORIZONTAL | 0xf4, OBJ_SIZE_32x16 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xf4, OBJ_SIZE_32x16 | 0x1f0, OBJ_SPRITE_OAM | 0x20c,
OBJ_SHAPE_HORIZONTAL | 0xf4, OBJ_SIZE_32x16 | 0x10, OBJ_SPRITE_OAM | 0x210,
OBJ_SHAPE_HORIZONTAL | 0xf4, OBJ_SIZE_32x16 | 0x30, OBJ_SPRITE_OAM | 0x214,
OBJ_SHAPE_HORIZONTAL | 0xf4, OBJ_SIZE_32x16 | 0x50, OBJ_SPRITE_OAM | 0x218,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x16 | 0x190, OBJ_SPRITE_OAM | 0x240,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x16 | 0x1b0, OBJ_SPRITE_OAM | 0x244,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x16 | 0x1d0, OBJ_SPRITE_OAM | 0x248,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x16 | 0x1f0, OBJ_SPRITE_OAM | 0x24c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x16 | 0x10, OBJ_SPRITE_OAM | 0x250,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x16 | 0x30, OBJ_SPRITE_OAM | 0x254,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x16 | 0x50, OBJ_SPRITE_OAM | 0x258,
0xf4, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21c,
0x4, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x23c,
OBJ_SHAPE_VERTICAL | 0xf8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21d
};
const u16 sItemBannerOAM_TwoLinesSpawn_Frame9[61] = {
0x14,
0xf2, 0x188, OBJ_SPRITE_OAM | 0x21c,
0x6, 0x188, OBJ_SPRITE_OAM | 0x23c,
OBJ_SHAPE_VERTICAL | 0xf8, 0x188, OBJ_SPRITE_OAM | 0x21d,
OBJ_SHAPE_HORIZONTAL | 0xf2, OBJ_SIZE_32x16 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xf2, OBJ_SIZE_32x16 | 0x1b0, OBJ_SPRITE_OAM | 0x204,
OBJ_SHAPE_HORIZONTAL | 0xf2, OBJ_SIZE_32x16 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xf2, OBJ_SIZE_32x16 | 0x1f0, OBJ_SPRITE_OAM | 0x20c,
OBJ_SHAPE_HORIZONTAL | 0xf2, OBJ_SIZE_32x16 | 0x10, OBJ_SPRITE_OAM | 0x210,
OBJ_SHAPE_HORIZONTAL | 0xf2, OBJ_SIZE_32x16 | 0x30, OBJ_SPRITE_OAM | 0x214,
OBJ_SHAPE_HORIZONTAL | 0xf2, OBJ_SIZE_32x16 | 0x50, OBJ_SPRITE_OAM | 0x218,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x16 | 0x190, OBJ_SPRITE_OAM | 0x240,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x16 | 0x1b0, OBJ_SPRITE_OAM | 0x244,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x16 | 0x1d0, OBJ_SPRITE_OAM | 0x248,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x16 | 0x1f0, OBJ_SPRITE_OAM | 0x24c,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x16 | 0x10, OBJ_SPRITE_OAM | 0x250,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x16 | 0x30, OBJ_SPRITE_OAM | 0x254,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x16 | 0x50, OBJ_SPRITE_OAM | 0x258,
0xf2, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21c,
0x6, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x23c,
OBJ_SHAPE_VERTICAL | 0xf8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21d
};
const u16 sItemBannerOAM_TwoLinesStatic_Frame0[31] = {
0xa,
0xf0, 0x188, OBJ_SPRITE_OAM | 0x21c,
0x8, 0x188, OBJ_SPRITE_OAM | 0x23c,
OBJ_SHAPE_VERTICAL | 0xf8, 0x188, OBJ_SPRITE_OAM | 0x21d,
OBJ_SHAPE_HORIZONTAL | 0xf0, OBJ_SIZE_64x32 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xf0, OBJ_SIZE_64x32 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xf0, OBJ_SIZE_64x32 | 0x10, OBJ_SPRITE_OAM | 0x210,
0xf0, OBJ_SIZE_32x32 | 0x50, OBJ_SPRITE_OAM | 0x218,
0xf0, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21c,
0x8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x23c,
OBJ_SHAPE_VERTICAL | 0xf8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21d
};
const u16 sItemBannerOAM_OneLineSpawn_Frame5[25] = {
0x8,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x188, OBJ_SPRITE_OAM | 0x27c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1a8, OBJ_SPRITE_OAM | 0x27c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1c8, OBJ_SPRITE_OAM | 0x27c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1e8, OBJ_SPRITE_OAM | 0x27c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x8, OBJ_SPRITE_OAM | 0x27c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x28, OBJ_SPRITE_OAM | 0x27c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x48, OBJ_SPRITE_OAM | 0x27c,
OBJ_SHAPE_HORIZONTAL | 0xfc, 0x68, OBJ_SPRITE_OAM | 0x27c
};
const u16 sItemBannerOAM_OneLineSpawn_Frame6[55] = {
0x12,
0xfa, 0x188, OBJ_SPRITE_OAM | 0x21f,
0xfa, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21f,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x204,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x20c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x210,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x214,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x218,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x260,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x264,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x268,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x26c,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x270,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x274,
OBJ_SHAPE_HORIZONTAL | 0xfc, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x278,
0xfe, 0x188, OBJ_SPRITE_OAM | 0x23f,
0xfe, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x23f
};
const u16 sItemBannerOAM_OneLineSpawn_Frame7[49] = {
0x10,
OBJ_SHAPE_VERTICAL | 0xf8, 0x188, OBJ_SPRITE_OAM | 0x21f,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x204,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x20c,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x210,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x214,
OBJ_SHAPE_HORIZONTAL | 0xfa, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x218,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x220,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x224,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x228,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x22c,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x230,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x234,
OBJ_SHAPE_HORIZONTAL | 0xfe, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x238,
OBJ_SHAPE_VERTICAL | 0xf8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21f
};
const u16 sItemBannerOAM_OneLineStatic_Frame0[49] = {
0x10,
OBJ_SHAPE_VERTICAL | 0xf8, 0x188, OBJ_SPRITE_OAM | 0x21c,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x200,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x204,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x208,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x20c,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x210,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x214,
OBJ_SHAPE_HORIZONTAL | 0xf8, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x218,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x190, OBJ_SPRITE_OAM | 0x220,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x1b0, OBJ_SPRITE_OAM | 0x224,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x1d0, OBJ_SPRITE_OAM | 0x228,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x1f0, OBJ_SPRITE_OAM | 0x22c,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x10, OBJ_SPRITE_OAM | 0x230,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x30, OBJ_SPRITE_OAM | 0x234,
OBJ_SHAPE_HORIZONTAL | 0x0, OBJ_SIZE_32x8 | 0x50, OBJ_SPRITE_OAM | 0x238,
OBJ_SHAPE_VERTICAL | 0xf8, OBJ_X_FLIP | 0x70, OBJ_SPRITE_OAM | 0x21c
};
const struct FrameData sSaveYesNoCursorOAM_Idle[5] = {
sSaveYesNoCursorOAM_Idle_Frame0,
0x8,
sSaveYesNoCursorOAM_Idle_Frame1,
0x4,
sSaveYesNoCursorOAM_Idle_Frame2,
0x8,
sSaveYesNoCursorOAM_Idle_Frame1,
0x8,
NULL,
0x0
};
const struct FrameData sItemBannerOAM_TwoLinesSpawn[11] = {
sItemBannerOAM_TwoLinesSpawn_Frame0,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame1,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame2,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame3,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame4,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame5,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame6,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame7,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame8,
0x3,
sItemBannerOAM_TwoLinesSpawn_Frame9,
0x3,
NULL,
0x0
};
const struct FrameData sItemBannerOAM_TwoLinesRemoving[11] = {
sItemBannerOAM_TwoLinesSpawn_Frame9,
0x3,
sItemBannerOAM_TwoLinesSpawn_Frame8,
0x3,
sItemBannerOAM_TwoLinesSpawn_Frame7,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame6,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame5,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame4,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame3,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame2,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame1,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame0,
0x1,
NULL,
0x0
};
const struct FrameData sItemBannerOAM_TwoLinesStatic[2] = {
sItemBannerOAM_TwoLinesStatic_Frame0,
0xFF,
NULL,
0x0
};
const struct FrameData sItemBannerOAM_OneLineSpawn[9] = {
sItemBannerOAM_TwoLinesSpawn_Frame0,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame1,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame2,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame3,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame4,
0x2,
sItemBannerOAM_OneLineSpawn_Frame5,
0x2,
sItemBannerOAM_OneLineSpawn_Frame6,
0x3,
sItemBannerOAM_OneLineSpawn_Frame7,
0x3,
NULL,
0x0
};
const struct FrameData sItemBannerOAM_OneLineRemoving[9] = {
sItemBannerOAM_OneLineSpawn_Frame7,
0x3,
sItemBannerOAM_OneLineSpawn_Frame6,
0x3,
sItemBannerOAM_OneLineSpawn_Frame5,
0x3,
sItemBannerOAM_TwoLinesSpawn_Frame4,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame3,
0x2,
sItemBannerOAM_TwoLinesSpawn_Frame2,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame1,
0x1,
sItemBannerOAM_TwoLinesSpawn_Frame0,
0x1,
NULL,
0x0
};
const struct FrameData sItemBannerOAM_OneLineStatic[2] = {
sItemBannerOAM_OneLineStatic_Frame0,
0xFF,
NULL,
0x0
};
/**
* @brief 1b6b8 | 110 | Initializes an item banner sprite
*
*/
void ItemBannerInit(void) void ItemBannerInit(void)
{ {
u8 message;
u8 gfxSlot;
u8 count;
gPreventMovementTimer = 0x3E8;
if (!(gCurrentSprite.status & SPRITE_STATUS_ONSCREEN))
{
gCurrentSprite.status |= SPRITE_STATUS_ONSCREEN;
gCurrentSprite.roomSlot = 0xFF;
}
message = gCurrentSprite.roomSlot;
gCurrentSprite.status |= SPRITE_STATUS_UNKNOWN;
gCurrentSprite.bgPriority = 0x0; // On top of everything
gCurrentSprite.samusCollision = SSC_NONE;
gCurrentSprite.properties |= (SP_ALWAYS_ACTIVE | SP_ABSOLUTE_POSITION);
gCurrentSprite.drawDistanceTopOffset = 0x10;
gCurrentSprite.drawDistanceBottomOffset = 0x10;
gCurrentSprite.drawDistanceHorizontalOffset = 0x80;
gCurrentSprite.hitboxTopOffset = -0x4;
gCurrentSprite.hitboxBottomOffset = 0x4;
gCurrentSprite.hitboxLeftOffset = -0x4;
gCurrentSprite.hitboxRightOffset = 0x4;
gCurrentSprite.pOam = sItemBannerOAM_TwoLinesSpawn;
gCurrentSprite.animationDurationCounter = 0x0;
gCurrentSprite.currentAnimationFrame = 0x0;
gCurrentSprite.yPositionSpawn = 0x9;
gCurrentSprite.timer = 0x1;
gCurrentSprite.workVariable2 = 0x0;
// Flag if the message is the save prompt
if (message == MESSAGE_SAVE_PROMPT)
gCurrentSprite.workVariable = TRUE;
else
gCurrentSprite.workVariable = FALSE;
gfxSlot = 0x80; // Default
// Loop through sprites to try and find if an item banner is in the spriteset
for (count = 0x0; count < 0xF; count++)
{
if (gSpritesetSpritesID[count] == PSPRITE_ITEM_BANNER)
{
// Found area banner, load the gfx slot
gfxSlot = gSpritesetGFXSlots[count];
break;
}
}
if (gfxSlot < 0x8)
{
// Found in the spriteset, skip gfx init
gCurrentSprite.pose = ITEM_BANNER_POSE_POP_UP;
gCurrentSprite.spritesetGFXSlot = gfxSlot;
}
else
gCurrentSprite.pose = ITEM_BANNER_POSE_GFX_INIT;
// Middle of the screen
gCurrentSprite.yPosition = 0x36;
gCurrentSprite.xPosition = 0x78;
start_message(message, gCurrentSprite.spritesetGFXSlot); // Undefined
} }
/**
* @brief 1b7c8 | 5c | Initializes the GFX for an item banner
*
*/
void ItemBannerGFXInit(void) void ItemBannerGFXInit(void)
{ {
gPreventMovementTimer = 0x3E8;
gCurrentSprite.yPositionSpawn--; // Timer (started at 0x9)
if (gCurrentSprite.yPositionSpawn == 0x7)
SpriteLoadGFX(PSPRITE_ITEM_BANNER, gCurrentSprite.spritesetGFXSlot); // Load GFX
else if (gCurrentSprite.yPositionSpawn == 0x8)
SpriteLoadPAL(PSPRITE_ITEM_BANNER, gCurrentSprite.spritesetGFXSlot, 0x1); // Load PAL
if (gCurrentSprite.yPositionSpawn == 0x0)
{
// Loading done, set pop up behavior
gCurrentSprite.pose = ITEM_BANNER_POSE_POP_UP;
gCurrentSprite.animationDurationCounter = 0x0;
gCurrentSprite.currentAnimationFrame = 0x0;
}
} }
/**
* @brief 1b824 | 184 | Handles the pop up animation and the custom behavior based on the current message
*
*/
void ItemBannerPopUp(void) void ItemBannerPopUp(void)
{ {
u16 music;
u8 message;
u8 timer;
// Work Variable 2 is used as a bool, 1 if getting new item (leading to status screen), 0 otherwise
gPreventMovementTimer = 0x3E8;
message = gCurrentSprite.roomSlot;
if (gCurrentSprite.timer != 0x0)
{
gCurrentSprite.animationDurationCounter--;
if (process_item_banner_text()) // Process text
{
// If done processing
gCurrentSprite.timer = 0x0;
gCurrentSprite.status &= ~SPRITE_STATUS_NOT_DRAWN;
if ((u8)(message - 0x8) < 0xe)
{
// New item
gCurrentSprite.workVariable2 = TRUE;
backup_track_data2_sound_channels(); // Undefined
if (message == MESSAGE_UKNOWN_ITEM_PLASMA || message == MESSAGE_UNKNOWN_ITEM_GRAVITY
|| message == MESSAGE_UNKNOWN_ITEM_SPACE_JUMP)
InsertMusicAndQueueCurrent(0x42, 0x0); // Unknown item
else
InsertMusicAndQueueCurrent(0x37, 0x0);
}
else if (message == MESSAGE_FIRST_MISSILE_TANK || message == MESSAGE_FIRST_SUPER_MISSILE_TANK
|| message == MESSAGE_FIRST_POWER_BOMB_TANK)
{
// New tank
gCurrentSprite.workVariable2 = TRUE;
backup_track_data2_sound_channels();
InsertMusicAndQueueCurrent(0x37, 0x0);
}
else if (message == MESSAGE_FULLY_POWERED_SUIT)
{
MusicPlay(0x19, 0x0);
InsertMusicAndQueueCurrent(0x4A, 0x0);
}
else if (message != MESSAGE_SAVE_PROMPT)
{
if ((u8)(message - 0x1) <= 0x1 || message == MESSAGE_SUPER_MISSILE_TANK_ACQUIRED
|| message == MESSAGE_POWER_BOMB_TANK_ACQUIRED)
backup_track_data2_sound_channels();
SoundPlay(0x3A);
}
// Check is one line message (new item/ability, save complete, map text)
if (gCurrentSprite.workVariable2 || message == MESSAGE_SAVE_COMPLETE
|| (u8)(message - 0x1B) < 0x6)
{
gCurrentSprite.pOam = sItemBannerOAM_OneLineSpawn;
gCurrentSprite.animationDurationCounter = 0x0;
gCurrentSprite.currentAnimationFrame = 0x0;
}
}
}
else
{
// Text not done
if (SpriteUtilCheckEndCurrentSpriteAnim())
{
// Spawning animation ended
gCurrentSprite.animationDurationCounter = 0x0;
gCurrentSprite.currentAnimationFrame = 0x0;
gCurrentSprite.pose = ITEM_BANNER_POSE_STATIC;
// Set static OAM and timer for how long the banner stays
if (gCurrentSprite.pOam == sItemBannerOAM_OneLineSpawn)
{
gCurrentSprite.pOam = sItemBannerOAM_OneLineStatic;
if (message == MESSAGE_FULLY_POWERED_SUIT)
gCurrentSprite.yPositionSpawn = 0x154; // Long because jingle is long
else
gCurrentSprite.yPositionSpawn = 0x64;
}
else
{
gCurrentSprite.pOam = sItemBannerOAM_TwoLinesStatic;
gCurrentSprite.yPositionSpawn = 0x64;
if (message == MESSAGE_SAVE_PROMPT)
{
SpriteSpawnSecondary(SSPRITE_SAVE_YES_NO_CURSOR, 0x0, gCurrentSprite.spritesetGFXSlot,
gCurrentSprite.primarySpriteRAMSlot, 0x3F, 0x96, 0x0); // Spawn cursor
}
else if (0x1 >= (u8)(message - 0x21)) // Escape message
EscapeStart();
}
}
}
} }
/**
* @brief 1b9a8 | 68 | Handles the item banner being static
*
*/
void ItemBannerStatic(void) void ItemBannerStatic(void)
{ {
u8 message;
message = gCurrentSprite.roomSlot;
if (message == MESSAGE_FULLY_POWERED_SUIT)
gPreventMovementTimer = 0x0;
else
gPreventMovementTimer = 0x3E8;
// Timer
if (gCurrentSprite.yPositionSpawn != 0x0)
gCurrentSprite.yPositionSpawn--;
// Check if should remove (input or demo active, ignore for save prompt)
else if (message != MESSAGE_SAVE_PROMPT &&
(gButtonInput & (KEY_A | KEY_B | KEY_RIGHT | KEY_LEFT | KEY_UP | KEY_DOWN) || gDemoState != 0x0))
gCurrentSprite.pose = ITEM_BANNER_POSE_REMOVAL_INIT;
} }
void ItemBannerRemoval(void) /**
* @brief 1ba10 | 50 | Initializes the item banner to be removing
*
*/
void ItemBannerRemovalInit(void)
{ {
if (gCollectingTank)
BGClipFinishCollectingTank();
if (gCurrentSprite.pOam == sItemBannerOAM_OneLineStatic)
gCurrentSprite.pOam = sItemBannerOAM_OneLineRemoving;
else
gCurrentSprite.pOam = sItemBannerOAM_TwoLinesRemoving;
gCurrentSprite.animationDurationCounter = 0x0;
gCurrentSprite.currentAnimationFrame = 0x0;
gCurrentSprite.pose = 0x25;
} }
/**
* @brief 1ba60 | b4 | Handles behavior during the removal animation
*
*/
void ItemBannerRemovalAnimation(void) void ItemBannerRemovalAnimation(void)
{ {
u8 message;
message = gCurrentSprite.roomSlot;
if (SpriteUtilCheckEndCurrentSpriteAnim())
{
gCurrentSprite.status = 0x0;
if (message == MESSAGE_SAVE_COMPLETE)
gDisablePause = FALSE; // Re-enable pause
else if (message == MESSAGE_FULLY_POWERED_SUIT)
{
gSubSpriteData1.workVariable1 = 0x7; // Start suit animation
// Spawn chozo pillar
SpriteLoadGFX(PSPRITE_FALLING_CHOZO_PILLAR, 0x7);
SpriteLoadPAL(PSPRITE_FALLING_CHOZO_PILLAR, 0x7, 0x1);
SpriteSpawnPrimary(PSPRITE_FALLING_CHOZO_PILLAR, 0x0, 0x7, gBossWork.work1 - 0x100, gBossWork.work2 + 0x300, 0x0);
}
// Check replay sounds
else if ((u8)(message - 0x1) < MESSAGE_MISSILE_TANK_ACQUIRED || message == MESSAGE_SUPER_MISSILE_TANK_ACQUIRED || message == MESSAGE_POWER_BOMB_TANK_ACQUIRED)
retrieve_track_data2_sound_channels(); // Undefined
gPreventMovementTimer = 0x0;
if (gCurrentSprite.workVariable2)
gPauseScreenFlag = PAUSE_SCREEN_ITEM_ACQUISITION;
}
} }
/**
* @brief 1bb14 | e8 | Item banner AI
*
*/
void ItemBanner(void) void ItemBanner(void)
{ {
gCurrentSprite.ignoreSamusCollisionTimer = 0x1;
switch (gCurrentSprite.pose)
{
case 0x0:
ItemBannerInit();
break;
case ITEM_BANNER_POSE_GFX_INIT:
ItemBannerGFXInit();
break;
case ITEM_BANNER_POSE_POP_UP:
ItemBannerPopUp();
break;
case ITEM_BANNER_POSE_STATIC:
ItemBannerStatic();
break;
case ITEM_BANNER_POSE_REMOVAL_INIT:
ItemBannerRemovalInit();
break;
case ITEM_BANNER_POSE_REMOVAL_ANIMATION:
ItemBannerRemovalAnimation();
break;
}
}
/**
* @brief 1bbfc | 190 | Save yes no cursor AI
*
*/
void SaveYesNoCursor(void)
{
u8 ramSlot;
gCurrentSprite.ignoreSamusCollisionTimer = 0x1;
ramSlot = gCurrentSprite.primarySpriteRAMSlot;
switch (gCurrentSprite.pose)
{
case 0x0:
gCurrentSprite.status |= SPRITE_STATUS_UNKNOWN;
gCurrentSprite.status &= ~SPRITE_STATUS_NOT_DRAWN;
gCurrentSprite.bgPriority = 0x0;
gCurrentSprite.drawOrder = 0x3;
gCurrentSprite.samusCollision = SSC_NONE;
gCurrentSprite.properties |= (SP_ALWAYS_ACTIVE | SP_ABSOLUTE_POSITION);
gCurrentSprite.drawDistanceTopOffset = 0x10;
gCurrentSprite.drawDistanceBottomOffset = 0x10;
gCurrentSprite.drawDistanceHorizontalOffset = 0x10;
gCurrentSprite.hitboxTopOffset = -0x4;
gCurrentSprite.hitboxBottomOffset = 0x4;
gCurrentSprite.hitboxLeftOffset = -0x4;
gCurrentSprite.hitboxRightOffset = 0x4;
gCurrentSprite.pOam = sSaveYesNoCursorOAM_Idle;
gCurrentSprite.animationDurationCounter = 0x0;
gCurrentSprite.currentAnimationFrame = 0x0;
gCurrentSprite.pose = 0x9;
gCurrentSprite.yPosition = 0x3F;
if (gSpriteData[ramSlot].roomSlot == MESSAGE_SAVE_PROMPT)
gCurrentSprite.xPosition = SAVE_YES_NO_CURSOR_LEFT_POSITION;
else
gCurrentSprite.xPosition = SAVE_YES_NO_CURSOR_RIGHT_POSITION;
break;
case SAVE_YES_NO_CURSOR_POSE_INPUT:
if (gChangedInput & KEY_LEFT)
{
// Check not already on left
if (gCurrentSprite.xPosition != SAVE_YES_NO_CURSOR_LEFT_POSITION)
{
SoundPlay(0x207);
gCurrentSprite.xPosition = SAVE_YES_NO_CURSOR_LEFT_POSITION;
}
}
else if (gChangedInput & KEY_RIGHT)
{
// Check not already on right
if (gCurrentSprite.xPosition != SAVE_YES_NO_CURSOR_RIGHT_POSITION)
{
SoundPlay(0x207);
gCurrentSprite.xPosition = SAVE_YES_NO_CURSOR_RIGHT_POSITION;
}
}
else if (gChangedInput & KEY_A)
{
gSpriteData[ramSlot].pose = ITEM_BANNER_POSE_REMOVAL_INIT;
if (gCurrentSprite.xPosition == SAVE_YES_NO_CURSOR_LEFT_POSITION)
{
// On left, "yes" option selected
SoundPlay(0x208);
gSpriteData[ramSlot].workVariable = 0x1;
if (gSpriteData[ramSlot].roomSlot == MESSAGE_SAVE_PROMPT)
{
gCurrentSprite.pose = SAVE_YES_NO_CURSOR_POSE_SAVING;
gCurrentSprite.status |= SPRITE_STATUS_NOT_DRAWN;
gDisablePause = TRUE;
break;
}
}
else
{
// On right, "no" option selected
SoundPlay(0x209);
gSpriteData[ramSlot].workVariable = 0x0;
}
gCurrentSprite.status = 0x0;
}
break;
case SAVE_YES_NO_CURSOR_POSE_SAVING:
if (save_file()) // Undefined
gCurrentSprite.status = 0x0;
break;
}
} }

View File

@ -3,12 +3,70 @@
#include "../types.h" #include "../types.h"
// Item banner
#define ITEM_BANNER_POSE_GFX_INIT 0x8
#define ITEM_BANNER_POSE_POP_UP 0x9
#define ITEM_BANNER_POSE_STATIC 0x23
#define ITEM_BANNER_POSE_REMOVAL_INIT 0x24
#define ITEM_BANNER_POSE_REMOVAL_ANIMATION 0x25
// Save yes no cursor
#define SAVE_YES_NO_CURSOR_POSE_INPUT 0x9
#define SAVE_YES_NO_CURSOR_POSE_SAVING 0x43
#define SAVE_YES_NO_CURSOR_LEFT_POSITION 0x36
#define SAVE_YES_NO_CURSOR_RIGHT_POSITION 0x96
// Temporary place
#define MESSAGE_DUMMY 0x0
#define MESSAGE_ENERGY_TANK_ACQUIRED 0x1
#define MESSAGE_MISSILE_TANK_ACQUIRED 0x2
#define MESSAGE_FIRST_MISSILE_TANK 0x3
#define MESSAGE_SUPER_MISSILE_TANK_ACQUIRED 0x4
#define MESSAGE_FIRST_SUPER_MISSILE_TANK 0x5
#define MESSAGE_POWER_BOMB_TANK_ACQUIRED 0x6
#define MESSAGE_FIRST_POWER_BOMB_TANK 0x7
#define MESSAGE_LONG_BEAM 0x8
#define MESSAGE_CHARGE_BEAM 0x9
#define MESSAGE_ICE_BEAM 0xA
#define MESSAGE_WAVE_BEAM 0xB
#define MESSAGE_UKNOWN_ITEM_PLASMA 0xC
#define MESSAGE_BOMB 0xD
#define MESSAGE_VARIA_SUIT 0xE
#define MESSAGE_UNKNOWN_ITEM_GRAVITY 0xF
#define MESSAGE_MORPH_BALL 0x10
#define MESSAGE_SPEED_BOOSTER 0x11
#define MESSAGE_HIGH_JUMP 0x12
#define MESSAGE_SCREW_ATTACK 0x13
#define MESSAGE_UNKNOWN_ITEM_SPACE_JUMP 0x14
#define MESSAGE_POWER_GRIP 0x15
#define MESSAGE_SAVE_PROMPT 0x16
#define MESSAGE_SAVE_COMPLETE 0x17
#define MESSAGE_WEAPON_RESUPPLY_COMPLETE 0x18
#define MESSAGE_ENERGY_TANK_RECHARGE_COMPLETE 0x19
#define MESSAGE_WEAPONS_AND_ENERGY_RESTORED 0x1A
#define MESSAGE_BRINSTAR_MAP_ACQUIRED 0x1B
#define MESSAGE_KRAID_MAP_ACQUIRED 0x1C
#define MESSAGE_NORFAIR_MAP_ACQUIRED 0x1D
#define MESSAGE_RIDLEY_MAP_ACQUIRED 0x1E
#define MESSAGE_MOTHER_SHIP_MAP_ACQUIRED 0x1F
#define MESSAGE_FULLY_POWERED_SUIT 0x20
#define MESSAGE_ZEBES_ESCAPE 0x21
#define MESSAGE_CHOZODIA_ESCAPE 0x22
#define MESSAGE_ENEMY_LOCATION_ABNORMAL 0x23
#define MESSAGE_ACTIVATE_EASY_SLEEP 0x24
#define MESSAGE_PRESS_SELECT_L_AND_R 0x25
#define MESSAGE_EASY_SLEEP_PROMPT 0x26
void ItemBannerInit(void); void ItemBannerInit(void);
void ItemBannerGFXInit(void); void ItemBannerGFXInit(void);
void ItemBannerPopUp(void); void ItemBannerPopUp(void);
void ItemBannerStatic(void); void ItemBannerStatic(void);
void ItemBannerRemoval(void); void ItemBannerRemovalInit(void);
void ItemBannerRemovalAnimation(void); void ItemBannerRemovalAnimation(void);
void ItemBanner(void); void ItemBanner(void);
void SaveYesNoCursor(void);
#endif /* ITEM_BANNER_AI_H* */ #endif /* ITEM_BANNER_AI_H* */

View File

@ -1,8 +0,0 @@
#include "primary_sprite_B3.h"
#include "../../data/data.h"
#include "../globals.h"
void SaveYesNoCursor(void)
{
}

View File

@ -1,8 +0,0 @@
#ifndef SAVE_YES_NO_CURSOR_AI_H
#define SAVE_YES_NO_CURSOR_AI_H
#include "../types.h"
void SaveYesNoCursor(void);
#endif /* SAVE_YES_NO_CURSOR_AI_H */