mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-18 20:47:40 +01:00
321 lines
7.3 KiB
C
321 lines
7.3 KiB
C
#include "global.h"
|
|
#include "event_data.h"
|
|
#include "event_object_movement.h"
|
|
#include "field_camera.h"
|
|
#include "alloc.h"
|
|
#include "random.h"
|
|
#include "roulette_util.h"
|
|
#include "script.h"
|
|
#include "sound.h"
|
|
#include "sprite.h"
|
|
#include "task.h"
|
|
#include "constants/flags.h"
|
|
#include "constants/songs.h"
|
|
|
|
// structures
|
|
struct Struct203CF18 {
|
|
u8 taskId;
|
|
struct InnerStruct203CF18 unk4;
|
|
}; //size = 0xC8
|
|
|
|
// extern data
|
|
extern const struct SpriteSheet gUnknown_08617D94[];
|
|
extern const s16 gUnknown_08617D64[][3];
|
|
|
|
// static functions
|
|
static void sub_81BE808(u8 taskId);
|
|
static void sub_81BE900(u8 taskId);
|
|
static void sub_81BE968(void);
|
|
static void sub_81BE9C0(u8 taskId);
|
|
static void sub_81BEA00(u8 taskId);
|
|
static void sub_81BEA20(void);
|
|
static void sub_81BEAD8(struct Sprite* sprite);
|
|
|
|
// rodata
|
|
const struct InnerStruct203CF18_3 gUnknown_08617E18 = {
|
|
.unk0 = 0x433b,
|
|
.unk2 = 0x61,
|
|
.unk4 = 0x0F,
|
|
.unk5 = 0x05,
|
|
.unk6 = 0xFF,
|
|
.unk7_0 = 0xB,
|
|
.unk7_4 = 0x1,
|
|
.unk7_6 = 0,
|
|
.unk7_7 = 1,
|
|
};
|
|
|
|
static const union AnimCmd gSpriteAnim_8617E20[] =
|
|
{
|
|
ANIMCMD_FRAME(0, 12),
|
|
ANIMCMD_JUMP(0),
|
|
};
|
|
|
|
static const union AnimCmd *const gSpriteAnimTable_8617E28[] =
|
|
{
|
|
gSpriteAnim_8617E20,
|
|
};
|
|
|
|
static const struct OamData gUnknown_08617E2C =
|
|
{
|
|
.y = 0,
|
|
.affineMode = 0,
|
|
.objMode = 0,
|
|
.mosaic = 0,
|
|
.bpp = 0,
|
|
.shape = 0,
|
|
.x = 0,
|
|
.matrixNum = 0,
|
|
.size = 0,
|
|
.tileNum = 0,
|
|
.priority = 0,
|
|
.paletteNum = 0,
|
|
.affineParam = 0,
|
|
};
|
|
|
|
static const struct SpriteTemplate gUnknown_08617E34 = {
|
|
.tileTag = 0x0FA0,
|
|
.paletteTag = 0xFFFF,
|
|
.oam = &gUnknown_08617E2C,
|
|
.anims = gSpriteAnimTable_8617E28,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = sub_81BEAD8
|
|
};
|
|
|
|
static const union AnimCmd gSpriteAnim_8617E4C[] =
|
|
{
|
|
ANIMCMD_FRAME(0, 12),
|
|
ANIMCMD_JUMP(0),
|
|
};
|
|
|
|
static const union AnimCmd *const gSpriteAnim_8617E54[] =
|
|
{
|
|
gSpriteAnim_8617E4C,
|
|
};
|
|
|
|
static const struct OamData gSpriteAnim_8617E58 =
|
|
{
|
|
.y = 0,
|
|
.affineMode = 0,
|
|
.objMode = 0,
|
|
.mosaic = 0,
|
|
.bpp = 0,
|
|
.shape = 0,
|
|
.x = 0,
|
|
.matrixNum = 0,
|
|
.size = 1,
|
|
.tileNum = 0,
|
|
.priority = 0,
|
|
.paletteNum = 0,
|
|
.affineParam = 0,
|
|
};
|
|
|
|
static const struct SpriteTemplate gUnknown_08617E60 = {
|
|
.tileTag = 0x0FA0,
|
|
.paletteTag = 0xFFFF,
|
|
.oam = &gSpriteAnim_8617E58,
|
|
.anims = gSpriteAnim_8617E54,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = sub_81BEAD8
|
|
};
|
|
|
|
// ewram
|
|
EWRAM_DATA struct Struct203CF18 *gUnknown_0203CF18 = NULL;
|
|
|
|
// text
|
|
bool8 sub_81BE66C(void)
|
|
{
|
|
if (!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A))
|
|
return 0;
|
|
return FlagGet(FLAG_0x14E);
|
|
}
|
|
|
|
void sub_81BE698(u8 taskId)
|
|
{
|
|
sub_8151E50(&(gUnknown_0203CF18->unk4));
|
|
}
|
|
|
|
void sub_81BE6AC(void)
|
|
{
|
|
gUnknown_0203CF18 = NULL;
|
|
}
|
|
|
|
void sub_81BE6B8(void)
|
|
{
|
|
if(gUnknown_0203CF18 != NULL)
|
|
{
|
|
gUnknown_0203CF18 = NULL;
|
|
return;
|
|
}
|
|
if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E))
|
|
return;
|
|
|
|
gUnknown_0203CF18 = (struct Struct203CF18 *)AllocZeroed(sizeof(struct Struct203CF18));
|
|
sub_8151B3C(&(gUnknown_0203CF18->unk4));
|
|
sub_8151B68(&(gUnknown_0203CF18->unk4), &gUnknown_08617E18);
|
|
sub_8151CA8(&(gUnknown_0203CF18->unk4), 1, 1);
|
|
gUnknown_0203CF18->taskId = CreateTask(sub_81BE698, 0xFF);
|
|
}
|
|
|
|
void sub_81BE72C(void)
|
|
{
|
|
if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E) || gUnknown_0203CF18 == NULL)
|
|
return;
|
|
if(FuncIsActiveTask(sub_81BE698))
|
|
DestroyTask(gUnknown_0203CF18->taskId);
|
|
sub_8151D28(&(gUnknown_0203CF18->unk4), 1, 1);
|
|
sub_8151C50(&(gUnknown_0203CF18->unk4), 1, 1);
|
|
Free(gUnknown_0203CF18);
|
|
gUnknown_0203CF18 = NULL;
|
|
}
|
|
|
|
void sub_81BE79C(void)
|
|
{
|
|
u16 rand;
|
|
bool8 chance;
|
|
|
|
if(VarGet(VAR_0x40CB) != 0)
|
|
{
|
|
FlagClear(FLAG_0x14E);
|
|
return;
|
|
}
|
|
rand = Random();
|
|
chance = rand & 1;
|
|
if(FlagGet(FLAG_0x09D) == TRUE)
|
|
chance = TRUE;
|
|
if(chance)
|
|
{
|
|
FlagSet(FLAG_0x14E);
|
|
sub_81BE6B8();
|
|
return;
|
|
}
|
|
FlagClear(FLAG_0x14E);
|
|
}
|
|
|
|
void sub_81BE7F4(void)
|
|
{
|
|
CreateTask(sub_81BE808, 0x8);
|
|
}
|
|
|
|
static void sub_81BE808(u8 taskId)
|
|
{
|
|
u8 eventObjectIdBuffer;
|
|
struct EventObject *fieldEventObject;
|
|
struct EventObject *playerAvatarEventObject;
|
|
|
|
TryGetEventObjectIdByLocalIdAndMap(0x2D, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectIdBuffer);
|
|
fieldEventObject = &(gEventObjects[eventObjectIdBuffer]);
|
|
gSprites[fieldEventObject->spriteId].pos2.y += 4;
|
|
playerAvatarEventObject = &(gEventObjects[gPlayerAvatar.eventObjectId]);
|
|
|
|
if((gSprites[fieldEventObject->spriteId].pos1.y + gSprites[fieldEventObject->spriteId].pos2.y) >=
|
|
(gSprites[playerAvatarEventObject->spriteId].pos1.y + gSprites[playerAvatarEventObject->spriteId].pos2.y))
|
|
{
|
|
DestroyTask(taskId);
|
|
EnableBothScriptContexts();
|
|
}
|
|
}
|
|
|
|
static void sp136_strengh_sound(u8 a, u8 b, u8 c, u8 d)
|
|
{
|
|
u8 taskId;
|
|
|
|
taskId = CreateTask(sub_81BE900, 0x9);
|
|
gTasks[taskId].data[0] = b;
|
|
gTasks[taskId].data[1] = 0;
|
|
gTasks[taskId].data[2] = c;
|
|
gTasks[taskId].data[3] = d;
|
|
gTasks[taskId].data[4] = a;
|
|
SetCameraPanningCallback(NULL);
|
|
PlaySE(SE_W070);
|
|
}
|
|
|
|
static void sub_81BE900(u8 taskId)
|
|
{
|
|
s16 *data;
|
|
|
|
data = gTasks[taskId].data;
|
|
data[1]++;
|
|
if((data[1] % data[3]) == 0)
|
|
{
|
|
data[1] = 0;
|
|
data[2]--;
|
|
data[0] = -data[0];
|
|
data[4] = -data[4];
|
|
SetCameraPanning(data[0], data[4]);
|
|
if(!data[2])
|
|
{
|
|
sub_81BE968();
|
|
DestroyTask(taskId);
|
|
InstallCameraPanAheadCallback();
|
|
}
|
|
}
|
|
}
|
|
|
|
static void sub_81BE968(void)
|
|
{
|
|
u8 taskId;
|
|
|
|
taskId = FindTaskIdByFunc(sub_81BE9C0);
|
|
if(taskId != 0xFF)
|
|
gTasks[taskId].data[0]++;
|
|
}
|
|
|
|
void sub_81BE994(void)
|
|
{
|
|
LoadSpriteSheets(gUnknown_08617D94);
|
|
sub_81BEA20();
|
|
CreateTask(sub_81BE9C0, 0x8);
|
|
sp136_strengh_sound(2, 1, 16, 3);
|
|
}
|
|
|
|
static void sub_81BE9C0(u8 taskId)
|
|
{
|
|
u16 *data;
|
|
|
|
data = gTasks[taskId].data;
|
|
data[1]++;
|
|
if(data[1] == 1000 || data[0] == 17)
|
|
gTasks[taskId].func = sub_81BEA00;
|
|
}
|
|
|
|
static void sub_81BEA00(u8 taskId)
|
|
{
|
|
FreeSpriteTilesByTag(4000);
|
|
DestroyTask(taskId);
|
|
EnableBothScriptContexts();
|
|
}
|
|
|
|
static void sub_81BEA20(void)
|
|
{
|
|
u8 i;
|
|
u8 spriteId;
|
|
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
spriteId = CreateSprite(&gUnknown_08617E60, gUnknown_08617D64[i][0] + 120, gUnknown_08617D64[i][1], 8);
|
|
gSprites[spriteId].oam.priority = 0;
|
|
gSprites[spriteId].oam.paletteNum = 0;
|
|
gSprites[spriteId].data[0] = i;
|
|
}
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
spriteId = CreateSprite(&gUnknown_08617E34, gUnknown_08617D64[i][0] + 115, gUnknown_08617D64[i][1] - 3, 8);
|
|
gSprites[spriteId].oam.priority = 0;
|
|
gSprites[spriteId].oam.paletteNum = 0;
|
|
gSprites[spriteId].data[0] = i;
|
|
}
|
|
}
|
|
|
|
static void sub_81BEAD8(struct Sprite* sprite)
|
|
{
|
|
sprite->data[1] += 2;
|
|
sprite->pos2.y = (sprite->data[1] / 2);
|
|
if(((sprite->pos1.y) + (sprite->pos2.y)) > gUnknown_08617D64[sprite->data[0]][2])
|
|
{
|
|
DestroySprite(sprite);
|
|
sub_81BE968();
|
|
}
|
|
}
|