summaryrefslogtreecommitdiff
path: root/src/intro.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-07-04 21:16:08 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-07-04 21:16:08 -0400
commita1f10189b67e39a6ff1eac39686e83282e7c16d3 (patch)
tree05a505aacb31dfd49d138c7a8d91baf54d21e47e /src/intro.c
parentb3b439fd8ab05eed4be632e2f265b79f1ce2173e (diff)
Finish decomp of intro
Diffstat (limited to 'src/intro.c')
-rw-r--r--src/intro.c252
1 files changed, 250 insertions, 2 deletions
diff --git a/src/intro.c b/src/intro.c
index 3e0b9e498..f6ac0b8f0 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -124,9 +124,12 @@ void sub_80EE610(struct Sprite * sprite);
void sub_80EE6A4(struct IntroSequenceData * ptr);
void sub_80EE704(struct Sprite * sprite);
bool8 sub_80EE850(struct IntroSequenceData * ptr);
+void sub_80EE864(s16 a1, s16 a2, s16 a3);
void sub_80EE8E4(struct Sprite * sprite);
-void sub_80EE970(struct Sprite * sprite, s16 a1, u16 a2, u8 a3);
+void sub_80EE970(struct Sprite * sprite, u16 a1, s16 a2, u8 a3);
+void sub_80EE9D4(struct Sprite * sprite);
void sub_80EEA94(struct IntroSequenceData * ptr);
+void sub_80EEB08(struct Sprite * sprite);
void sub_80EEBE4(void);
extern const u32 gMultiBootProgram_PokemonColosseum_Start[];
@@ -1756,7 +1759,7 @@ void sub_80EE350(struct Sprite * sprite)
sprite->data[4]++;
sprite->data[5] += sprite->data[4];
sprite->data[7]++;
- sprite->pos1.x = *(u16 *)&sprite->data[0] >> gUnknown_203AB22;
+ sprite->pos1.x = (u16)sprite->data[0] >> gUnknown_203AB22;
sprite->pos1.y = sprite->data[1] >> gUnknown_203AB24;
if (gUnknown_203AB1C && sprite->data[3] < 0)
sprite->pos2.y = sprite->data[5] >> gUnknown_203AB1C;
@@ -1925,3 +1928,248 @@ void sub_80EE6A4(struct IntroSequenceData * ptr)
ptr->field_0018->data[7] = 40;
ptr->field_0018->callback = sub_80EE704;
}
+
+void sub_80EE704(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1]++;
+ if (sprite->data[1] > 4)
+ {
+ StartSpriteAnim(sprite, 3);
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ sprite->data[2] += sprite->data[7];
+ sprite->data[3] += 8;
+ sprite->pos2.x = sprite->data[2] >> 4;
+ sprite->pos2.y = -((gSineTable[sprite->data[3]] * gUnknown_203AB04) >> gUnknown_203AB08);
+ sprite->data[5]++;
+ if (sprite->data[5] > gUnknown_203AB06)
+ {
+ sprite->data[5] = 0;
+ sprite->data[7]--;
+ }
+ sprite->data[4]++;
+ if (sprite->data[4] > 15)
+ {
+ StartSpriteAnim(sprite, 2);
+ sprite->data[1] = 0;
+ sprite->data[6] = 0x4757;
+ sprite->data[7] = 28;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[2] += sprite->data[7];
+ sprite->pos2.x = sprite->data[2] >> 4;
+ sprite->data[1]++;
+ if (sprite->data[1] > 6)
+ {
+ sub_80EE864(sprite->pos1.x + sprite->pos2.x, sprite->pos1.y + sprite->pos2.y, sprite->data[6]);
+ sprite->data[6] *= 1103515245;
+ }
+ if (sprite->data[1] > 12)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->data[1]++;
+ if (sprite->data[1] > 16)
+ {
+ sub_80EE970(sprite, gUnknown_203AB0A, -sprite->pos2.x, 4);
+ }
+ break;
+ }
+}
+
+bool8 sub_80EE850(struct IntroSequenceData * ptr)
+{
+ return ptr->field_0018->callback == SpriteCallbackDummy ? FALSE : TRUE;
+}
+
+void sub_80EE864(s16 a1, s16 a2, s16 a3)
+{
+ int i;
+ u8 spriteId;
+
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_840BEC4, a1 - 22, a2 + 24, 10);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[3] = (a3 % 13) + 8;
+ gSprites[spriteId].data[4] = a3 % 3;
+ gSprites[spriteId].data[7] = i;
+ a3 *= 1103515245;
+ }
+ }
+}
+
+void sub_80EE8E4(struct Sprite * sprite)
+{
+ s16 * data = sprite->data;
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ data[1] = sprite->pos1.x << 4;
+ data[2] = sprite->pos1.y << 4;
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ data[1] -= data[3];
+ data[2] += data[4];
+ sprite->pos1.x = data[1] >> 4;
+ sprite->pos1.y = data[2] >> 4;
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+ break;
+ }
+ data[7]++;
+ if (data[7] > 1)
+ {
+ data[7] = 0;
+ sprite->invisible ^= TRUE;
+ }
+}
+
+void sub_80EE970(struct Sprite * sprite, u16 a1, s16 a2, u8 a3)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = a1;
+ sprite->data[2] = sprite->pos2.x << 4;
+ sprite->data[3] = (a2 << 4) / a1;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0x800 / a1;
+ sprite->data[6] = 0;
+ sprite->data[7] = a3;
+ StartSpriteAnim(sprite, 2);
+ sprite->callback = sub_80EE9D4;
+}
+
+void sub_80EE9D4(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[6]++;
+ if (sprite->data[6] > 4)
+ {
+ StartSpriteAnim(sprite, 3);
+ sprite->data[6] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ sprite->data[1]--;
+ if (sprite->data[1])
+ {
+ sprite->data[2] += sprite->data[3];
+ sprite->data[4] += sprite->data[5];
+ sprite->pos2.x = sprite->data[2] >> 4;
+ sprite->pos2.y = -(gSineTable[sprite->data[4] >> 4] >> sprite->data[7]);
+ }
+ else
+ {
+ sprite->pos2.x = (u16)sprite->data[2] >> 4;
+ sprite->pos2.y = 0;
+ StartSpriteAnim(sprite, 2);
+ if (sprite->data[7] == 5)
+ sprite->callback = SpriteCallbackDummy;
+ else
+ {
+ sprite->data[6] = 0;
+ sprite->data[0]++;
+ }
+ }
+ break;
+ case 2:
+ sprite->data[6]++;
+ if (sprite->data[6] > 4)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+void sub_80EEA94(struct IntroSequenceData * ptr)
+{
+ ptr->field_0018->data[0] = 0;
+ ptr->field_0018->data[1] = 0;
+ ptr->field_0018->data[2] = 0;
+ ptr->field_0018->data[3] = 0;
+ ptr->field_0018->data[4] = 0;
+ ptr->field_0018->data[5] = 0;
+ ptr->field_0018->pos1.x += ptr->field_0018->pos2.x;
+ ptr->field_0018->pos2.x = 0;
+ gUnknown_203AB0C = 0x24;
+ gUnknown_203AB06 = 0x28;
+ gUnknown_203AB04 = 0x03;
+ gUnknown_203AB08 = 0x04;
+ ptr->field_0018->data[7] = 36;
+ StartSpriteAnim(ptr->field_0018, 2);
+ ptr->field_0018->callback = sub_80EEB08;
+}
+
+void sub_80EEB08(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1]++;
+ if (sprite->data[1] & 1)
+ {
+ sprite->data[2]++;
+ if (sprite->data[2] & 1)
+ sprite->pos2.x++;
+ else
+ sprite->pos2.x--;
+ }
+ if (sprite->data[1] > 17)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] >= gUnknown_203AB06)
+ {
+ StartSpriteAnim(sprite, 4);
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[1] += sprite->data[7];
+ sprite->pos2.x = -(sprite->data[1] >> 4);
+ sprite->pos2.y = -((gSineTable[sprite->data[1] >> 4] * gUnknown_203AB04) >> gUnknown_203AB08);
+ sprite->data[2]++;
+ if (sprite->data[7] > 12)
+ sprite->data[7]--;
+ if ((sprite->data[1] >> 4) > 0x3F)
+ sprite->callback = SpriteCallbackDummy;
+ break;
+ }
+}
+
+void sub_80EEBE4(void)
+{
+ int i;
+
+ for (i = 0; i < NELEMS(gUnknown_840BEDC); i++)
+ {
+ LoadCompressedSpriteSheet(&gUnknown_840BEDC[i]);
+ }
+ // gUnknown_840BF14 is not properly terminated, so this
+ // call exhibits undefined behavior.
+ LoadSpritePalettes(gUnknown_840BF14);
+}