diff options
-rw-r--r-- | asm/field_effect.s | 413 | ||||
-rw-r--r-- | asm/field_weather.s | 6 | ||||
-rw-r--r-- | data/field_effect.s | 79 | ||||
-rw-r--r-- | include/data.h | 2 | ||||
-rw-r--r-- | include/field_weather.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/data/pokemon_graphics/palette_table.h | 3 | ||||
-rw-r--r-- | src/field_effect.c | 212 |
8 files changed, 220 insertions, 498 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s index 957d70a93..a484b28ac 100644 --- a/asm/field_effect.s +++ b/asm/field_effect.s @@ -5,419 +5,6 @@ .text - thumb_func_start CreateTrainerSprite -CreateTrainerSprite: @ 8083858 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x18 - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - mov r9, r3 - ldr r7, [sp, 0x34] - lsls r4, 24 - lsls r5, 16 - lsrs r5, 16 - lsls r6, 16 - lsrs r6, 16 - mov r0, r9 - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - lsrs r4, 21 - ldr r3, _080838E0 @ =gTrainerFrontPicPaletteTable - mov r8, r3 - add r8, r4 - mov r0, r8 - adds r1, r7, 0 - bl LoadCompressedSpritePaletteOverrideBuffer - ldr r0, _080838E4 @ =gTrainerFrontPicTable - adds r4, r0 - adds r0, r4, 0 - adds r1, r7, 0 - bl LoadCompressedSpriteSheetOverrideBuffer - mov r1, sp - ldrh r0, [r4, 0x6] - movs r2, 0 - strh r0, [r1] - mov r3, r8 - ldrh r0, [r3, 0x4] - strh r0, [r1, 0x2] - ldr r0, _080838E8 @ =gNewGameBirchOamAttributes - str r0, [sp, 0x4] - ldr r0, _080838EC @ =gDummySpriteAnimTable - str r0, [sp, 0x8] - str r2, [sp, 0xC] - ldr r0, _080838F0 @ =gDummySpriteAffineAnimTable - str r0, [sp, 0x10] - ldr r0, _080838F4 @ =SpriteCallbackDummy - str r0, [sp, 0x14] - lsls r5, 16 - asrs r5, 16 - lsls r6, 16 - asrs r6, 16 - mov r0, sp - adds r1, r5, 0 - adds r2, r6, 0 - mov r3, r9 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - add sp, 0x18 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080838E0: .4byte gTrainerFrontPicPaletteTable -_080838E4: .4byte gTrainerFrontPicTable -_080838E8: .4byte gNewGameBirchOamAttributes -_080838EC: .4byte gDummySpriteAnimTable -_080838F0: .4byte gDummySpriteAffineAnimTable -_080838F4: .4byte SpriteCallbackDummy - thumb_func_end CreateTrainerSprite - - thumb_func_start LoadTrainerGfx_TrainerCard -LoadTrainerGfx_TrainerCard: @ 80838F8 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r1, r2, 0 - lsls r4, 24 - lsls r5, 16 - lsrs r5, 16 - ldr r0, _08083928 @ =gTrainerFrontPicTable - lsrs r4, 21 - adds r0, r4, r0 - ldr r0, [r0] - bl LZDecompressVram - ldr r0, _0808392C @ =gTrainerFrontPicPaletteTable - adds r4, r0 - ldr r0, [r4] - adds r1, r5, 0 - movs r2, 0x20 - bl LoadCompressedPalette - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08083928: .4byte gTrainerFrontPicTable -_0808392C: .4byte gTrainerFrontPicPaletteTable - thumb_func_end LoadTrainerGfx_TrainerCard - - thumb_func_start AddNewGameBirchObject -AddNewGameBirchObject: @ 8083930 - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - lsls r4, 16 - lsrs r4, 16 - lsls r5, 16 - lsrs r5, 16 - lsls r6, 24 - lsrs r6, 24 - ldr r0, _08083968 @ =gNewGameBirchObjectPaletteInfo - bl LoadSpritePalette - ldr r0, _0808396C @ =gNewGameBirchObjectTemplate - lsls r4, 16 - asrs r4, 16 - lsls r5, 16 - asrs r5, 16 - adds r1, r4, 0 - adds r2, r5, 0 - adds r3, r6, 0 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08083968: .4byte gNewGameBirchObjectPaletteInfo -_0808396C: .4byte gNewGameBirchObjectTemplate - thumb_func_end AddNewGameBirchObject - - thumb_func_start CreateMonSprite_PicBox -CreateMonSprite_PicBox: @ 8083970 - push {r4,r5,lr} - sub sp, 0x10 - lsls r0, 16 - lsrs r0, 16 - movs r3, 0x80 - lsls r3, 8 - lsls r1, 16 - asrs r1, 16 - str r1, [sp] - lsls r2, 16 - asrs r2, 16 - str r2, [sp, 0x4] - movs r1, 0 - str r1, [sp, 0x8] - ldr r1, _080839C0 @ =gMonPaletteTable - lsls r4, r0, 3 - adds r4, r1 - ldrh r1, [r4, 0x4] - str r1, [sp, 0xC] - movs r1, 0 - adds r2, r3, 0 - movs r3, 0x1 - bl CreateMonPicSprite_HandleDeoxys - lsls r0, 16 - lsrs r5, r0, 16 - ldrh r0, [r4, 0x4] - bl IndexOfSpritePaletteTag - adds r0, 0x10 - lsls r0, 24 - lsrs r0, 24 - bl sub_807B084 - ldr r0, _080839C4 @ =0x0000ffff - cmp r5, r0 - beq _080839C8 - lsls r0, r5, 24 - lsrs r0, 24 - b _080839CA - .align 2, 0 -_080839C0: .4byte gMonPaletteTable -_080839C4: .4byte 0x0000ffff -_080839C8: - movs r0, 0x40 -_080839CA: - add sp, 0x10 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end CreateMonSprite_PicBox - - thumb_func_start CreateMonSprite_FieldMove -CreateMonSprite_FieldMove: @ 80839D4 - push {r4-r6,lr} - mov r6, r10 - mov r5, r9 - mov r4, r8 - push {r4-r6} - sub sp, 0x10 - adds r6, r0, 0 - mov r9, r1 - mov r10, r2 - adds r4, r3, 0 - ldr r5, [sp, 0x2C] - lsls r6, 16 - lsrs r6, 16 - lsls r4, 16 - lsrs r4, 16 - lsls r5, 16 - lsrs r5, 16 - adds r0, r6, 0 - bl GetMonSpritePalStructFromOtIdPersonality - mov r8, r0 - lsls r4, 16 - asrs r4, 16 - str r4, [sp] - lsls r5, 16 - asrs r5, 16 - str r5, [sp, 0x4] - movs r0, 0 - str r0, [sp, 0x8] - mov r1, r8 - ldrh r0, [r1, 0x4] - str r0, [sp, 0xC] - adds r0, r6, 0 - mov r1, r9 - mov r2, r10 - movs r3, 0x1 - bl CreateMonPicSprite_HandleDeoxys - lsls r0, 16 - lsrs r4, r0, 16 - mov r1, r8 - ldrh r0, [r1, 0x4] - bl IndexOfSpritePaletteTag - adds r0, 0x10 - lsls r0, 24 - lsrs r0, 24 - bl sub_807B084 - ldr r0, _08083A44 @ =0x0000ffff - cmp r4, r0 - beq _08083A48 - lsls r0, r4, 24 - lsrs r0, 24 - b _08083A4A - .align 2, 0 -_08083A44: .4byte 0x0000ffff -_08083A48: - movs r0, 0x40 -_08083A4A: - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end CreateMonSprite_FieldMove - - thumb_func_start FreeResourcesAndDestroySprite -FreeResourcesAndDestroySprite: @ 8083A5C - push {r4,r5,lr} - adds r4, r0, 0 - lsls r1, 24 - lsrs r5, r1, 24 - bl ResetPreservedPalettesInWeather - ldrb r0, [r4, 0x1] - lsls r0, 30 - cmp r0, 0 - beq _08083A7A - ldrb r0, [r4, 0x3] - lsls r0, 26 - lsrs r0, 27 - bl FreeOamMatrix -_08083A7A: - adds r0, r5, 0 - bl FreeAndDestroyMonPicSprite - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end FreeResourcesAndDestroySprite - - thumb_func_start MultiplyInvertedPaletteRGBComponents -MultiplyInvertedPaletteRGBComponents: @ 8083A88 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - lsls r0, 16 - lsls r1, 24 - lsrs r1, 24 - lsls r2, 24 - lsrs r2, 24 - lsls r3, 24 - lsrs r3, 24 - ldr r4, _08083B0C @ =gPlttBufferUnfaded - lsrs r0, 15 - adds r4, r0, r4 - ldrh r4, [r4] - movs r5, 0x1F - mov r9, r5 - mov r8, r4 - mov r6, r8 - ands r6, r5 - mov r8, r6 - movs r6, 0xF8 - lsls r6, 2 - ands r6, r4 - lsrs r6, 5 - movs r5, 0xF8 - lsls r5, 7 - ands r4, r5 - lsrs r4, 10 - mov r7, r9 - mov r5, r8 - subs r7, r5 - mov r12, r7 - mov r7, r12 - muls r7, r1 - adds r1, r7, 0 - asrs r1, 4 - add r8, r1 - mov r5, r9 - subs r1, r5, r6 - muls r1, r2 - asrs r1, 4 - adds r6, r1 - subs r5, r4 - mov r9, r5 - mov r1, r9 - muls r1, r3 - asrs r1, 4 - adds r4, r1 - mov r7, r8 - lsls r7, 16 - lsls r6, 21 - orrs r6, r7 - lsls r4, 26 - orrs r4, r6 - lsrs r4, 16 - ldr r1, _08083B10 @ =gPlttBufferFaded - adds r0, r1 - strh r4, [r0] - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08083B0C: .4byte gPlttBufferUnfaded -_08083B10: .4byte gPlttBufferFaded - thumb_func_end MultiplyInvertedPaletteRGBComponents - - thumb_func_start MultiplyPaletteRGBComponents -MultiplyPaletteRGBComponents: @ 8083B14 - push {r4-r6,lr} - mov r6, r8 - push {r6} - lsls r0, 16 - lsls r1, 24 - lsrs r1, 24 - lsls r2, 24 - lsrs r2, 24 - lsls r3, 24 - lsrs r3, 24 - ldr r4, _08083B84 @ =gPlttBufferUnfaded - lsrs r0, 15 - adds r4, r0, r4 - ldrh r4, [r4] - movs r5, 0x1F - mov r8, r5 - mov r6, r8 - ands r6, r4 - mov r8, r6 - movs r5, 0xF8 - lsls r5, 2 - ands r5, r4 - lsrs r5, 5 - movs r6, 0xF8 - lsls r6, 7 - ands r4, r6 - lsrs r4, 10 - mov r6, r8 - muls r6, r1 - adds r1, r6, 0 - asrs r1, 4 - mov r6, r8 - subs r6, r1 - adds r1, r5, 0 - muls r1, r2 - asrs r1, 4 - subs r5, r1 - adds r1, r4, 0 - muls r1, r3 - asrs r1, 4 - subs r4, r1 - lsls r6, 16 - lsls r5, 21 - orrs r5, r6 - lsls r4, 26 - orrs r4, r5 - lsrs r4, 16 - ldr r1, _08083B88 @ =gPlttBufferFaded - adds r0, r1 - strh r4, [r0] - pop {r3} - mov r8, r3 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08083B84: .4byte gPlttBufferUnfaded -_08083B88: .4byte gPlttBufferFaded - thumb_func_end MultiplyPaletteRGBComponents - thumb_func_start FldEff_PokecenterHeal FldEff_PokecenterHeal: @ 8083B8C push {r4,lr} diff --git a/asm/field_weather.s b/asm/field_weather.s index 4462fec77..2c7ef2128 100644 --- a/asm/field_weather.s +++ b/asm/field_weather.s @@ -2698,8 +2698,8 @@ _0807B07C: .4byte gUnknown_2037F34 _0807B080: .4byte 0x000006c6 thumb_func_end sub_807B070 - thumb_func_start sub_807B084 -sub_807B084: @ 807B084 + thumb_func_start PreservePaletteInWeather +PreservePaletteInWeather: @ 807B084 push {r4,r5,lr} adds r4, r0, 0 lsls r4, 24 @@ -2721,7 +2721,7 @@ sub_807B084: @ 807B084 _0807B0A8: .4byte gUnknown_83C2CC0 _0807B0AC: .4byte gUnknown_2038684 _0807B0B0: .4byte gUnknown_20386A4 - thumb_func_end sub_807B084 + thumb_func_end PreservePaletteInWeather thumb_func_start ResetPreservedPalettesInWeather ResetPreservedPalettesInWeather: @ 807B0B4 diff --git a/data/field_effect.s b/data/field_effect.s index 607ae6142..d79644860 100644 --- a/data/field_effect.s +++ b/data/field_effect.s @@ -6,85 +6,6 @@ .section .rodata .align 2 -gUnknown_83CA770:: @ 3CA770 4bpp - .incbin "graphics/field_effects/unk_83CA770.4bpp" - -gUnknown_83CAF70:: @ 83CAF70 gbapal - .incbin "graphics/field_effects/unk_83CAF70.gbapal" - -gUnknown_83CAF90:: @ 83CAF90 4bpp - .incbin "graphics/field_effects/unk_83CAF90.4bpp" - -gUnknown_83CAFB0:: @ 83CAFB0 gbapal - .incbin "graphics/field_effects/unk_83CAFB0.gbapal" - -gUnknown_83CAFD0:: @ 83CAFD0 4bpp - .incbin "graphics/field_effects/unk_83CAFD0.4bpp" - -gUnknown_83CB3D0:: @ 83CB3D0 gbapal - .incbin "graphics/field_effects/unk_83CB3D0.gbapal" - -gUnknown_83CB3F0:: @ 83CB3F0 4bpp - .incbin "graphics/field_effects/unk_83CB3F0.4bpp" - -gUnknown_83CB5F0:: @ 83CB5F0 4bpp - .incbin "graphics/field_effects/unk_83CB5F0.4bpp" - -gUnknown_83CB7F0:: @ 83CB7F0 gbapal gUnknown_83CB5F0 - .incbin "graphics/field_effects/unk_83CB7F0.gbapal" - -gUnknown_83CB810:: @ 83CB810 4bpp - .incbin "graphics/field_effects/unk_83CB810.bin" - -gUnknown_83CBA90:: @ 83CBA90 4bpp - .incbin "graphics/field_effects/unk_83CBA90.4bpp" - -gUnknown_83CBB10:: @ 83CBB10 gbapal gUnknown_83CBA90 - .incbin "graphics/field_effects/unk_83CBB10.gbapal" - -gUnknown_83CBB30:: @ 83CBB30 4bpp - .incbin "graphics/field_effects/unk_83CBB30.bin" - -gUnknown_83CBDB0:: - .incbin "graphics/field_effects/unk_83CBDB0.4bpp" - - .align 2 -sFldEffScrcmdTable:: @ 83CBE30 dataptr - .4byte FieldEffectCmd_loadtiles - .4byte FieldEffectCmd_loadfadedpal - .4byte FieldEffectCmd_loadpal - .4byte FieldEffectCmd_callnative - .4byte FieldEffectCmd_end - .4byte FieldEffectCmd_loadgfx_callnative - .4byte FieldEffectCmd_loadtiles_callnative - .4byte FieldEffectCmd_loadfadedpal_callnative - -gNewGameBirchOamAttributes:: @ 83CBE50 oamdata - .4byte 0xc0000000, 0x00000000 - -gOamData_83CBE58:: @ 83CBE58 oamdata - .4byte 0x00000000, 0x00000000 - -gOamData_83CBE60:: @ 83CBE60 oamdata - .4byte 0x40000000, 0x00000000 - -gUnknown_83CBE68:: @ 83CBE68 sprite_frames - obj_frame_tiles gUnknown_83CA770, 0x0800 - -gNewGameBirchObjectPaletteInfo:: @ 83CBE70 sprite_palette - obj_pal gUnknown_83CAF70, 4102 - -gUnknown_83CBE78:: @ 83CBE78 - obj_image_anim_frame 0x0000, 1 - obj_image_anim_end - - .align 2 -gUnknown_83CBE80:: @ 83CBE80 dataptr - .4byte gUnknown_83CBE78 - -gNewGameBirchObjectTemplate:: @ 83CBE84 spr_template - spr_template 65535, 4102, gNewGameBirchOamAttributes, gUnknown_83CBE80, gUnknown_83CBE68, gDummySpriteAffineAnimTable, SpriteCallbackDummy - gUnknown_83CBE9C:: @ 83CBE9C sprite_palette obj_pal gUnknown_83CAFB0, 4103 diff --git a/include/data.h b/include/data.h index f308b044c..90c8e0ace 100644 --- a/include/data.h +++ b/include/data.h @@ -28,7 +28,7 @@ extern const struct MonCoords gMonFrontPicCoords[]; extern const struct CompressedSpriteSheet gMonFrontPicTable[]; extern const struct MonCoords gMonBackPicCoords[]; extern const struct CompressedSpriteSheet gMonBackPicTable[]; -extern const struct CompressedSpritePalette gMonPaletteTable[]; +extern struct CompressedSpritePalette gMonPaletteTable[]; extern const struct CompressedSpritePalette gMonShinyPaletteTable[]; extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[]; extern const struct MonCoords gTrainerFrontPicCoords[]; diff --git a/include/field_weather.h b/include/field_weather.h index 3cb17f9e2..7488c8c5a 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -19,5 +19,7 @@ void sub_807B070(void); u8 GetCurrentWeather(void); void FieldWeather_StartFadingOutCreditsMap(u8, u8, u32); void sub_807AA8C(u8 palIdx); +void ResetPreservedPalettesInWeather(void); +void PreservePaletteInWeather(u8 palIdx); #endif // GUARD_WEATHER_H diff --git a/ld_script.txt b/ld_script.txt index 4e4953097..bf1c0a26a 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -445,6 +445,7 @@ SECTIONS { data/cable_club.o(.rodata); src/trainer_see.o(.rodata); src/wild_encounter.o(.rodata); + src/field_effect.o(.rodata); data/field_effect.o(.rodata); src/option_menu.o(.rodata); src/trainer_card.o(.rodata); diff --git a/src/data/pokemon_graphics/palette_table.h b/src/data/pokemon_graphics/palette_table.h index 35edcc76c..bb4f64a07 100644 --- a/src/data/pokemon_graphics/palette_table.h +++ b/src/data/pokemon_graphics/palette_table.h @@ -1,4 +1,5 @@ -const struct CompressedSpritePalette gMonPaletteTable[] = +// A dirty hack because field_effect.c requires this not be const +__attribute__((section(".rodata"))) struct CompressedSpritePalette gMonPaletteTable[] = { SPECIES_PAL(NONE, gMonPalette_CircledQuestionMark), SPECIES_PAL(BULBASAUR, gMonPalette_Bulbasaur), diff --git a/src/field_effect.c b/src/field_effect.c index c9c388966..35a56389a 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1,16 +1,27 @@ #include "global.h" #include "gflib.h" +#include "data.h" +#include "decompress.h" #include "field_effect.h" #include "field_effect_scripts.h" #include "field_weather.h" #include "overworld.h" #include "quest_log.h" +#include "trainer_pokemon_sprites.h" #define FIELD_EFFECT_COUNT 32 static u8 sFieldEffectActiveList[FIELD_EFFECT_COUNT]; void FieldEffectActiveListAdd(u8 fldeff); +bool8 FieldEffectCmd_loadtiles(const u8 **script, u32 *result); +bool8 FieldEffectCmd_loadfadedpal(const u8 **script, u32 *result); +bool8 FieldEffectCmd_loadpal(const u8 **script, u32 *result); +bool8 FieldEffectCmd_callnative(const u8 **script, u32 *result); +bool8 FieldEffectCmd_end(const u8 **script, u32 *result); +bool8 FieldEffectCmd_loadgfx_callnative(const u8 **script, u32 *result); +bool8 FieldEffectCmd_loadtiles_callnative(const u8 **script, u32 *result); +bool8 FieldEffectCmd_loadfadedpal_callnative(const u8 **script, u32 *result); void FieldEffectScript_LoadTiles(const u8 **script); void FieldEffectScript_LoadFadedPal(const u8 **script); void FieldEffectScript_LoadPal(const u8 **script); @@ -18,7 +29,106 @@ void FieldEffectScript_CallNative(const u8 **script, u32 *result); void FieldEffectFreeTilesIfUnused(u16 tilesTag); void FieldEffectFreePaletteIfUnused(u8 paletteNum); -extern bool8 (*const sFldEffScrcmdTable[])(const u8 **script, u32 *result); +const u16 sNewGameOakObjectSpriteTiles[] = INCBIN_U16("graphics/field_effects/unk_83CA770.4bpp"); +const u16 sNewGameOakObjectPals[] = INCBIN_U16("graphics/field_effects/unk_83CAF70.gbapal"); +const u16 gUnknown_83CAF90[] = INCBIN_U16("graphics/field_effects/unk_83CAF90.4bpp"); +const u16 gUnknown_83CAFB0[] = INCBIN_U16("graphics/field_effects/unk_83CAFB0.gbapal"); +const u16 gUnknown_83CAFD0[] = INCBIN_U16("graphics/field_effects/unk_83CAFD0.4bpp"); +const u16 gUnknown_83CB3D0[] = INCBIN_U16("graphics/field_effects/unk_83CB3D0.gbapal"); +const u16 gUnknown_83CB3F0[] = INCBIN_U16("graphics/field_effects/unk_83CB3F0.4bpp"); +const u16 gUnknown_83CB5F0[] = INCBIN_U16("graphics/field_effects/unk_83CB5F0.4bpp"); +const u16 gUnknown_83CB7F0[] = INCBIN_U16("graphics/field_effects/unk_83CB7F0.gbapal"); +const u16 gUnknown_83CB810[] = INCBIN_U16("graphics/field_effects/unk_83CB810.bin"); +const u16 gUnknown_83CBA90[] = INCBIN_U16("graphics/field_effects/unk_83CBA90.4bpp"); +const u16 gUnknown_83CBB10[] = INCBIN_U16("graphics/field_effects/unk_83CBB10.gbapal"); +const u16 gUnknown_83CBB30[] = INCBIN_U16("graphics/field_effects/unk_83CBB30.bin"); +const u16 gUnknown_83CBDB0[] = INCBIN_U16("graphics/field_effects/unk_83CBDB0.4bpp"); + +bool8 (*const sFldEffScrcmdTable[])(const u8 **script, u32 *result) = { + FieldEffectCmd_loadtiles, + FieldEffectCmd_loadfadedpal, + FieldEffectCmd_loadpal, + FieldEffectCmd_callnative, + FieldEffectCmd_end, + FieldEffectCmd_loadgfx_callnative, + FieldEffectCmd_loadtiles_callnative, + FieldEffectCmd_loadfadedpal_callnative +}; + +const struct OamData gNewGameOakOamAttributes = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x64), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x64), + .tileNum = 0x000, + .priority = 0, + .paletteNum = 0x0, + .affineParam = 0 +}; + +const struct OamData gOamData_83CBE58 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x8), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x8), + .tileNum = 0x000, + .priority = 0, + .paletteNum = 0x0, + .affineParam = 0 +}; + +const struct OamData gOamData_83CBE60 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0x000, + .priority = 0, + .paletteNum = 0x0, + .affineParam = 0 +}; + +const struct SpriteFrameImage gNewGameOakObjectSpriteFrames[] = { + {sNewGameOakObjectSpriteTiles, 0x800} +}; + +const struct SpritePalette gNewGameOakObjectPaletteInfo = { + sNewGameOakObjectPals, 4102 +}; + +const union AnimCmd gNewGameOakAnim[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +const union AnimCmd *const gNewGameOakAnimTable[] = { + gNewGameOakAnim +}; + +const struct SpriteTemplate gNewGameOakObjectTemplate = { + .tileTag = 0xFFFF, + .paletteTag = 4102, + .oam = &gNewGameOakOamAttributes, + .anims = gNewGameOakAnimTable, + .images = gNewGameOakObjectSpriteFrames, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; u32 FieldEffectStart(u8 fldeff) { @@ -241,3 +351,103 @@ bool8 FieldEffectActiveListContains(u8 fldeff) } return FALSE; } + +u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer) +{ + struct SpriteTemplate spriteTemplate; + LoadCompressedSpritePaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer); + LoadCompressedSpriteSheetOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer); + spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag; + spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag; + spriteTemplate.oam = &gNewGameOakOamAttributes; + spriteTemplate.anims = gDummySpriteAnimTable; + spriteTemplate.images = NULL; + spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + spriteTemplate.callback = SpriteCallbackDummy; + return CreateSprite(&spriteTemplate, x, y, subpriority); +} + +void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) +{ + LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); + LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20); +} + +u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority) +{ + LoadSpritePalette(&gNewGameOakObjectPaletteInfo); + return CreateSprite(&gNewGameOakObjectTemplate, x, y, subpriority); +} + +u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) +{ + u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, 0, 0x8000, TRUE, x, y, 0, gMonPaletteTable[species].tag); + PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[species].tag) + 0x10); + if (spriteId == 0xFFFF) + return MAX_SPRITES; + else + return spriteId; +} + +u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) +{ + const struct CompressedSpritePalette *spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g); + u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, d, g, 1, x, y, 0, spritePalette->tag); + PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + if (spriteId == 0xFFFF) + return MAX_SPRITES; + else + return spriteId; +} + +void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId) +{ + ResetPreservedPalettesInWeather(); + if (sprite->oam.affineMode != ST_OAM_AFFINE_OFF) + { + FreeOamMatrix(sprite->oam.matrixNum); + } + FreeAndDestroyMonPicSprite(spriteId); +} + +// r, g, b are between 0 and 16 +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + u16 outPal; + + outPal = gPlttBufferUnfaded[i]; + curRed = outPal & 0x1f; + curGreen = (outPal & (0x1f << 5)) >> 5; + curBlue = (outPal & (0x1f << 10)) >> 10; + curRed += (((0x1f - curRed) * r) >> 4); + curGreen += (((0x1f - curGreen) * g) >> 4); + curBlue += (((0x1f - curBlue) * b) >> 4); + outPal = curRed; + outPal |= curGreen << 5; + outPal |= curBlue << 10; + gPlttBufferFaded[i] = outPal; +} + +// r, g, b are between 0 and 16 +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + u16 outPal; + + outPal = gPlttBufferUnfaded[i]; + curRed = outPal & 0x1f; + curGreen = (outPal & (0x1f << 5)) >> 5; + curBlue = (outPal & (0x1f << 10)) >> 10; + curRed -= ((curRed * r) >> 4); + curGreen -= ((curGreen * g) >> 4); + curBlue -= ((curBlue * b) >> 4); + outPal = curRed; + outPal |= curGreen << 5; + outPal |= curBlue << 10; + gPlttBufferFaded[i] = outPal; +} |