diff options
| -rw-r--r-- | asm/teachy_tv.s | 271 | ||||
| -rw-r--r-- | src/teachy_tv.c | 134 | 
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(); +} + | 
