map functions are coming

This commit is contained in:
jiangzhengwenjz
2019-06-06 01:40:11 +08:00
parent 39e7cab368
commit a827ac6c8f
2 changed files with 119 additions and 286 deletions
+119 -15
View File
@@ -23,17 +23,20 @@
#include "text.h"
#include "constants/songs.h"
#include "constants/items.h"
#include "event_data.h"
#include "load_save.h"
#include "battle_transition.h"
#include "battle_2.h"
#include "battle.h"
typedef struct Task Task;
typedef struct {
void (*callback)();
u8 mode;
u8 optionChosen;
u16 scrollOffset;
u16 selectedRow;
u8 param4;
u8 filler;
u16 filler;
} TeachyTv_s;
extern TeachyTv_s gTeachyTV_StaticResources;
@@ -57,10 +60,11 @@ extern u8 gUnknown_8479590;
extern u8 gUnknown_8479390;
extern struct SubspriteTable gUnknown_84795B8;
extern struct SpriteTemplate *gUnknown_83A0010;
extern u8 gUnknown_84795C8;
void C2TeachyTv();
void C2TeachyTvMainCallback();
void VblankHandlerTeachyTv();
void TeachyTvCallback();
void TeachyTvMainCallback();
void TeachyTvVblankHandler();
void sub_815ABC4(u8 mode, void (*cb)());
void sub_815ABFC();
void sub_815AC20();
@@ -86,6 +90,8 @@ void TeachyTvGrassAnimationMain(u8 taskId, s16 x, s16 y, u8 subpriority, bool8 m
void TeachyTvLoadBg3Map(void *);
u8 TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(s16 x, s16 y);
void TeachyTvGrassAnimationObjCallback(struct Sprite *sprite);
void TeachyTvRestorePlayerPartyCallback();
void TeachyTvPreBattleAnimAndSetBattleCallback(u8 taskId);
extern void VblankHblankHandlerSetZero();
extern void sub_812B1E0(u16);
@@ -94,9 +100,9 @@ extern void sub_8055DC4();
extern bool16 sub_80BF518(u8 textPrinterId);
extern void _call_via_r1(s32 arg, void *func);
extern void sub_810B108(u8);
extern void sub_8159F40();
void C2TeachyTv()
void TeachyTvCallback()
{
RunTasks();
AnimateSprites();
@@ -105,7 +111,7 @@ void C2TeachyTv()
UpdatePaletteFade();
}
void VblankHandlerTeachyTv()
void TeachyTvVblankHandler()
{
LoadOam();
ProcessSpriteCopyRequests();
@@ -126,7 +132,7 @@ void sub_815ABC4(u8 mode, void (*cb)())
}
if(mode == 1)
v3->mode = 0;
SetMainCallback2(C2TeachyTvMainCallback);
SetMainCallback2(TeachyTvMainCallback);
}
void sub_815ABFC()
@@ -142,7 +148,7 @@ void sub_815AC20()
gTeachyTV_StaticResources.mode = 1;
}
void C2TeachyTvMainCallback()
void TeachyTvMainCallback()
{
int state;
int taskId;
@@ -151,7 +157,6 @@ void C2TeachyTvMainCallback()
u32 x;
state = gMain.state;
// tried several ways to reproduce the control flow, but all failed. Now using goto
if ( state == 0 )
goto RESETANDLOAD;
else if ( state == 1 )
@@ -203,8 +208,8 @@ SETDMATOVRAM:
sub_812B1E0(9); // help system something
BlendPalettes(0xFFFFFFFF, 0x10u, 0);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10u, 0, 0);
SetVBlankCallback(VblankHandlerTeachyTv);
SetMainCallback2(C2TeachyTv);
SetVBlankCallback(TeachyTvVblankHandler);
SetMainCallback2(TeachyTvCallback);
}
void TeachyTvSetupBg()
@@ -921,4 +926,103 @@ void TeachyTvGrassAnimationMain(u8 taskId, s16 x, s16 y, u8 subpriority, bool8 m
}
}
}
}
}
void TeachyTvGrassAnimationObjCallback(struct Sprite *sprite)
{
u32 diff1, diff2;
s16 *data = gTasks[sprite->data[0]].data;
struct Sprite *objAddr = &gSprites[data[1]];
if(((u8*)gUnknown_203F450)[0x4006] == 1)
DestroySprite(sprite);
else {
if(sprite->animCmdIndex == 0)
sprite->subspriteTableNum = 1;
else
sprite->subspriteTableNum = 0;
sprite->pos2.x += (u16)data[4];
sprite->pos2.y += (u16)data[5];
if(sprite->animEnded == 0)
return;
sprite->subpriority = 0;
diff1 = (u16)(sprite->pos2.x - objAddr->pos2.x);
diff2 = (u16)(sprite->pos2.y - objAddr->pos2.y);
diff1 = ((diff1 << 0x10)+0xF0000) >> 0x10;
if(diff1 <= 0x1E)
{
if((s16)diff2 > -0x10)
{
if((s16)diff2 <= 0x17)
return;
}
}
DestroySprite(sprite);
}
}
u8 TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(s16 x, s16 y)
{
u8 * arr, *ptr;
int a, b;
if( (x < 0) || (y < 0) )
return 0;
arr = &gUnknown_84795C8;
ptr = gUnknown_203F450;
a = ((y >> 4) + ptr[0x4005]) << 4;
b = ((x >> 4) + ptr[0x4004]);
return arr[a+b];
}
void TeachyTvPrepBattle(u8 taskId)
{
s16 *data;
taskId = taskId;
data = gTasks[taskId].data;
TeachyTvFree();
gSpecialVar_0x8004 = gTeachyTV_StaticResources.optionChosen;
gMain.savedCallback = TeachyTvRestorePlayerPartyCallback;
SavePlayerParty();
sub_8159F40();
PlayMapChosenOrBattleBGM(MUS_DUMMY);
if ( !gTeachyTV_StaticResources.optionChosen )
data[6] = 9;
else
data[6] = 8;
data[7] = 0;
gTasks[taskId].func = TeachyTvPreBattleAnimAndSetBattleCallback;
}
void TeachyTvPreBattleAnimAndSetBattleCallback(u8 taskId)
{
s16 *data;
int temp;
data = gTasks[taskId].data;
switch(data[7])
{
case 0:
sub_80D08B8(*((u8*)data + 12));
++data[7];
break;
case 1:
temp = sub_80D08F8();
if ( temp << 24 )
{
SetMainCallback2(sub_800FD9C);
DestroyTask(taskId);
}
break;
}
}
void TeachyTvRestorePlayerPartyCallback()
{
LoadPlayerParty();
if ( gUnknown_2023E8A == 3 )
sub_815AC20();
else
PlayNewMapMusic(BGM_FRLG_FOLLOW_ME);
sub_815ABFC();
}