summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-06-06 01:40:11 +0800
committerjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-06-06 01:40:11 +0800
commita827ac6c8f37fd7a8a5f8850ab54f386dcafcc88 (patch)
treec111aa6d162c2666dbf0e06987420eceeefe6dfa
parent39e7cab3680376153b094c390e96f62ba9ec0539 (diff)
map functions are coming
-rw-r--r--asm/teachy_tv.s271
-rw-r--r--src/teachy_tv.c134
2 files changed, 119 insertions, 286 deletions
diff --git a/asm/teachy_tv.s b/asm/teachy_tv.s
index 4150dfd0f..06d27a3da 100644
--- a/asm/teachy_tv.s
+++ b/asm/teachy_tv.s
@@ -5,277 +5,6 @@
.text
- thumb_func_start TeachyTvGrassAnimationObjCallback
-TeachyTvGrassAnimationObjCallback: @ 815BB6C
- push {r4,r5,lr}
- adds r3, r0, 0
- movs r0, 0x2E
- ldrsh r1, [r3, r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- ldr r1, _0815BBA4 @ =gTasks+0x8
- adds r4, r0, r1
- movs r2, 0x2
- ldrsh r1, [r4, r2]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _0815BBA8 @ =gSprites
- adds r5, r0, r1
- ldr r0, _0815BBAC @ =gUnknown_203F450
- ldr r0, [r0]
- ldr r1, _0815BBB0 @ =0x00004006
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0815BBB4
- adds r0, r3, 0
- bl DestroySprite
- b _0815BC3A
- .align 2, 0
-_0815BBA4: .4byte gTasks+0x8
-_0815BBA8: .4byte gSprites
-_0815BBAC: .4byte gUnknown_203F450
-_0815BBB0: .4byte 0x00004006
-_0815BBB4:
- adds r0, r3, 0
- adds r0, 0x2B
- ldrb r0, [r0]
- cmp r0, 0
- bne _0815BBD2
- adds r2, r3, 0
- adds r2, 0x42
- ldrb r0, [r2]
- movs r1, 0x40
- negs r1, r1
- ands r1, r0
- movs r0, 0x1
- orrs r1, r0
- strb r1, [r2]
- b _0815BBE0
-_0815BBD2:
- adds r2, r3, 0
- adds r2, 0x42
- ldrb r1, [r2]
- movs r0, 0x40
- negs r0, r0
- ands r0, r1
- strb r0, [r2]
-_0815BBE0:
- ldrh r0, [r4, 0x8]
- ldrh r2, [r3, 0x24]
- adds r0, r2
- strh r0, [r3, 0x24]
- ldrh r0, [r4, 0xA]
- ldrh r1, [r3, 0x26]
- adds r0, r1
- strh r0, [r3, 0x26]
- adds r0, r3, 0
- adds r0, 0x3F
- ldrb r1, [r0]
- movs r0, 0x10
- ands r0, r1
- cmp r0, 0
- beq _0815BC3A
- adds r1, r3, 0
- adds r1, 0x43
- movs r0, 0
- strb r0, [r1]
- ldrh r1, [r3, 0x24]
- ldrh r0, [r5, 0x24]
- subs r1, r0
- ldrh r0, [r3, 0x26]
- ldrh r2, [r5, 0x26]
- subs r0, r2
- lsls r0, 16
- lsrs r0, 16
- lsls r1, 16
- movs r2, 0xF0
- lsls r2, 12
- adds r1, r2
- lsrs r1, 16
- cmp r1, 0x1E
- bhi _0815BC34
- lsls r0, 16
- asrs r1, r0, 16
- movs r0, 0x10
- negs r0, r0
- cmp r1, r0
- ble _0815BC34
- cmp r1, 0x17
- ble _0815BC3A
-_0815BC34:
- adds r0, r3, 0
- bl DestroySprite
-_0815BC3A:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end TeachyTvGrassAnimationObjCallback
-
- thumb_func_start TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj
-TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj: @ 815BC40
- push {r4,r5,lr}
- lsls r1, 16
- lsrs r1, 16
- lsls r4, r0, 16
- cmp r4, 0
- blt _0815BC52
- lsls r1, 16
- cmp r1, 0
- bge _0815BC56
-_0815BC52:
- movs r0, 0
- b _0815BC78
-_0815BC56:
- ldr r3, _0815BC80 @ =gUnknown_84795C8
- ldr r0, _0815BC84 @ =gUnknown_203F450
- ldr r2, [r0]
- ldr r5, _0815BC88 @ =0x00004005
- adds r0, r2, r5
- asrs r1, 20
- ldrb r0, [r0]
- adds r1, r0
- lsls r1, 4
- ldr r0, _0815BC8C @ =0x00004004
- adds r2, r0
- asrs r0, r4, 20
- ldrb r2, [r2]
- adds r0, r2
- adds r1, r0
- adds r1, r3
- ldrb r0, [r1]
-_0815BC78:
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_0815BC80: .4byte gUnknown_84795C8
-_0815BC84: .4byte gUnknown_203F450
-_0815BC88: .4byte 0x00004005
-_0815BC8C: .4byte 0x00004004
- thumb_func_end TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj
-
- thumb_func_start TeachyTvPrepBattle
-TeachyTvPrepBattle: @ 815BC90
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r0, r6, 2
- adds r0, r6
- lsls r0, 3
- ldr r1, _0815BCCC @ =gTasks+0x8
- adds r5, r0, r1
- bl TeachyTvFree
- ldr r1, _0815BCD0 @ =gSpecialVar_0x8004
- ldr r4, _0815BCD4 @ =gTeachyTV_StaticResources
- ldrb r0, [r4, 0x5]
- strh r0, [r1]
- ldr r1, _0815BCD8 @ =gMain
- ldr r0, _0815BCDC @ =sub_815BD58
- str r0, [r1, 0x8]
- bl SavePlayerParty
- bl sub_8159F40
- movs r0, 0
- bl PlayMapChosenOrBattleBGM
- ldrb r0, [r4, 0x5]
- cmp r0, 0
- bne _0815BCE0
- movs r0, 0x9
- b _0815BCE2
- .align 2, 0
-_0815BCCC: .4byte gTasks+0x8
-_0815BCD0: .4byte gSpecialVar_0x8004
-_0815BCD4: .4byte gTeachyTV_StaticResources
-_0815BCD8: .4byte gMain
-_0815BCDC: .4byte sub_815BD58
-_0815BCE0:
- movs r0, 0x8
-_0815BCE2:
- strh r0, [r5, 0xC]
- movs r0, 0
- strh r0, [r5, 0xE]
- ldr r1, _0815BCFC @ =gTasks
- lsls r0, r6, 2
- adds r0, r6
- lsls r0, 3
- adds r0, r1
- ldr r1, _0815BD00 @ =sub_815BD04
- str r1, [r0]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0815BCFC: .4byte gTasks
-_0815BD00: .4byte sub_815BD04
- thumb_func_end TeachyTvPrepBattle
-
- thumb_func_start sub_815BD04
-sub_815BD04: @ 815BD04
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- ldr r1, _0815BD24 @ =gTasks+0x8
- adds r4, r0, r1
- movs r1, 0xE
- ldrsh r0, [r4, r1]
- cmp r0, 0
- beq _0815BD28
- cmp r0, 0x1
- beq _0815BD36
- b _0815BD4C
- .align 2, 0
-_0815BD24: .4byte gTasks+0x8
-_0815BD28:
- ldrb r0, [r4, 0xC]
- bl sub_80D08B8
- ldrh r0, [r4, 0xE]
- adds r0, 0x1
- strh r0, [r4, 0xE]
- b _0815BD4C
-_0815BD36:
- bl sub_80D08F8
- lsls r0, 24
- cmp r0, 0
- beq _0815BD4C
- ldr r0, _0815BD54 @ =sub_800FD9C
- bl SetMainCallback2
- adds r0, r5, 0
- bl DestroyTask
-_0815BD4C:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0815BD54: .4byte sub_800FD9C
- thumb_func_end sub_815BD04
-
- thumb_func_start sub_815BD58
-sub_815BD58: @ 815BD58
- push {lr}
- bl LoadPlayerParty
- ldr r0, _0815BD6C @ =gUnknown_2023E8A
- ldrb r0, [r0]
- cmp r0, 0x3
- bne _0815BD70
- bl sub_815AC20
- b _0815BD78
- .align 2, 0
-_0815BD6C: .4byte gUnknown_2023E8A
-_0815BD70:
- movs r0, 0x88
- lsls r0, 1
- bl PlayNewMapMusic
-_0815BD78:
- bl sub_815ABFC
- pop {r0}
- bx r0
- thumb_func_end sub_815BD58
-
thumb_func_start TeachyTvLoadBg3Map
TeachyTvLoadBg3Map: @ 815BD80
push {r4-r7,lr}
diff --git a/src/teachy_tv.c b/src/teachy_tv.c
index 56c9e25cf..00df2807e 100644
--- a/src/teachy_tv.c
+++ b/src/teachy_tv.c
@@ -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
}
}
}
-} \ No newline at end of file
+}
+
+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();
+}
+