From 6c520659aa9c1570a27e36979ca348976f20d1b6 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Mon, 29 Nov 2021 22:52:08 +0100 Subject: [PATCH 01/46] implemented a inital pokemon debug menu based on code from Gamer2020 and AsparagusEduardo --- include/pokemon_debug.h | 9 + include/reset_rtc_screen.h | 3 + ld_script.txt | 2 + src/field_control_avatar.c | 24 ++ src/pokemon_debug.c | 633 +++++++++++++++++++++++++++++++++++++ src/reset_rtc_screen.c | 4 +- 6 files changed, 673 insertions(+), 2 deletions(-) create mode 100644 include/pokemon_debug.h create mode 100644 src/pokemon_debug.c diff --git a/include/pokemon_debug.h b/include/pokemon_debug.h new file mode 100644 index 0000000000..a1aae5e153 --- /dev/null +++ b/include/pokemon_debug.h @@ -0,0 +1,9 @@ +#ifndef GUARD_POKEMON_DEBUG_H +#define GUARD_POKEMON_DEBUG_H + +#define POKEMON_DEBUG + +void CB2_Debug_Pokemon(void); + + +#endif // GUARD_POKEMON_DEBUG_H \ No newline at end of file diff --git a/include/reset_rtc_screen.h b/include/reset_rtc_screen.h index 5807dec992..f8904063b7 100644 --- a/include/reset_rtc_screen.h +++ b/include/reset_rtc_screen.h @@ -1,6 +1,9 @@ #ifndef GUARD_RESET_RTC_SCREEN_H #define GUARD_RESET_RTC_SCREEN_H +extern const struct SpritePalette sSpritePalette_Arrow; +extern const struct SpriteTemplate sSpriteTemplate_Arrow; + void CB2_InitResetRtcScreen(void); #endif // GUARD_RESET_RTC_SCREEN_H diff --git a/ld_script.txt b/ld_script.txt index 886bd8f0ff..bfba214eb4 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -327,6 +327,7 @@ SECTIONS { src/gym_leader_rematch.o(.text); src/battle_transition_frontier.o(.text); src/international_string_util.o(.text); + src/pokemon_debug.o(.text); } =0 script_data : @@ -685,6 +686,7 @@ SECTIONS { data/mystery_event.o(.rodata); src/m4a_tables.o(.rodata); data/sound_data.o(.rodata); + src/pokemon_debug.o(.rodata); } =0 song_data : diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 6ec280fd0d..66065681fc 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -20,6 +20,7 @@ #include "metatile_behavior.h" #include "overworld.h" #include "pokemon.h" +#include "pokemon_debug.h" #include "safari_zone.h" #include "script.h" #include "secret_base.h" @@ -130,6 +131,14 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) input->dpadDirection = DIR_WEST; else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; + + #ifdef POKEMON_DEBUG + if ((heldKeys & R_BUTTON) && input->pressedStartButton) + { + input->input_field_1_2 = TRUE; + input->pressedStartButton = FALSE; + } + #endif } int ProcessPlayerFieldInput(struct FieldInput *input) @@ -189,6 +198,21 @@ int ProcessPlayerFieldInput(struct FieldInput *input) if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE) return TRUE; + + #ifdef POKEMON_DEBUG + if (input->input_field_1_2) + { + //PlaySE(SE_WIN_OPEN); + //Debug_ShowMainMenu(); + + //PlayRainStoppingSoundEffect(); + CleanupOverworldWindowsAndTilemaps(); + SetMainCallback2(CB2_Debug_Pokemon); + + return TRUE; + } + #endif + return FALSE; } diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c new file mode 100644 index 0000000000..3d3213034a --- /dev/null +++ b/src/pokemon_debug.c @@ -0,0 +1,633 @@ +//Credits: Gamer2020, AsparagusEduardo +#include "global.h" +#include "battle.h" +#include "bg.h" +#include "constants/rgb.h" +#include "constants/songs.h" +#include "data.h" +#include "decompress.h" +#include "field_weather.h" +#include "gpu_regs.h" +#include "item.h" +#include "item_icon.h" +#include "list_menu.h" +#include "m4a.h" +#include "main.h" +#include "malloc.h" +#include "menu.h" +#include "overworld.h" +#include "palette.h" +#include "pokemon_animation.h" +#include "pokemon_debug.h" +#include "pokemon_icon.h" +#include "reset_rtc_screen.h" +#include "scanline_effect.h" +#include "script.h" +#include "script_pokemon_util.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "trainer_pokemon_sprites.h" + +#include "constants/items.h" + +//Defines +#define DEBUG_MON_X 140 +#define DEBUG_MON_Y 14 +#define DEBUG_MON_BACK_X 32 +#define DEBUG_MON_BACK_Y 50 +#define DEBUG_ICON_X 148 +#define DEBUG_ICON_Y 90 +#define DEBUG_MON_SHINY 0 +#define DEBUG_MON_NORMAL 9 + +#define MODIFY_DIGITS_MAX 4 +#define MODIFY_DIGITS_ARROW_X 22 +#define MODIFY_DIGITS_ARROW1_Y 12 +#define MODIFY_DIGITS_ARROW2_Y 36 + +static const u16 sBgColor[] = {RGB_WHITE}; + +//Structs +struct PokemonDebugModifyArrows +{ + u8 arrowSpriteId[2]; + u16 minValue; + u16 maxValue; + int currValue; + u8 currentDigit; + u8 maxDigits; + u8 charDigits[MODIFY_DIGITS_MAX]; + void *modifiedValPtr; + u8 typeOfVal; +}; + +struct PokemonDebugMenu +{ + u16 currentmonId; + u8 currentmonWindowId; + u8 InstructionsWindowId; + u8 frontspriteId; + u8 backspriteId; + u8 iconspriteId; + u8 isshiny; + struct PokemonDebugModifyArrows modifyArrows; + u8 modifyWindowId; +}; + +//WindowTemplates +static const struct WindowTemplate sCurrentTitleTemplate = +{ + .bg = 0, + .tilemapLeft =1, + .tilemapTop = 0, + .width = 14, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 0x200 +}; + +static const struct WindowTemplate sDebugPokemonInstructionsTemplate = +{ + .bg = 0, + .tilemapLeft =1, + .tilemapTop = 207, + .width = 14, + .height = 8, + .paletteNum = 0xF, + .baseBlock = 0x300 +}; + +static const struct WindowTemplate sModifyWindowTemplate = +{ + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 2, + .width = 14, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 0x200 +}; + +//Function declarations +static void PrintDigitChars(struct PokemonDebugMenu *data); +static void SetUpModifyArrows(struct PokemonDebugMenu *data); +static void UpdateBattlerValue(struct PokemonDebugMenu *data); +static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits); +static bool32 TryMoveDigit(struct PokemonDebugModifyArrows *modArrows, bool32 moveUp); +static void CB2_Debug_Runner(void); +static void ResetBGs_Debug_Menu(u16); +static void Handle_Input_Debug_Pokemon(u8); +static void ReloadPokemonSprites(struct PokemonDebugMenu *data); +static void Exit_Debug_Pokemon(u8); + +static struct PokemonDebugMenu *GetStructPtr(u8 taskId) +{ + u8 *taskDataPtr = (u8*)(&gTasks[taskId].data[0]); + + return (struct PokemonDebugMenu*)(T1_READ_PTR(taskDataPtr)); +} + +//Text handling functions +static void PadString(const u8 *src, u8 *dst) +{ + u32 i; + + for (i = 0; i < 17 && src[i] != EOS; i++) + dst[i] = src[i]; + + for (; i < 17; i++) + dst[i] = CHAR_SPACE; + + dst[i] = EOS; +} + +static void PrintOnCurrentMonWindow(u8 windowId, u16 monId) +{ + u8 text[POKEMON_NAME_LENGTH + 10]; + + text[0] = CHAR_0 + monId / 100; + text[1] = CHAR_0 + (monId % 100) / 10; + text[2] = CHAR_0 + (monId % 100) % 10; + text[3] = CHAR_SPACE; + text[4] = CHAR_HYPHEN; + text[5] = CHAR_SPACE; + + StringCopy(&text[6], gSpeciesNames[monId]); + + FillWindowPixelBuffer(windowId, 0x11); + AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); + CopyWindowToVram(windowId, 3); +} + +static void PrintInstructionsOnWindow(u8 windowId) +{ + u8 text[] = _("A - Shiny START - Cry\nL - Back R - Front$"); + + FillWindowPixelBuffer(windowId, 0x11); + AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); + CopyWindowToVram(windowId, 3); +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void SetStructPtr(u8 taskId, void *ptr) +{ + u32 structPtr = (u32)(ptr); + u8 *taskDataPtr = (u8*)(&gTasks[taskId].data[0]); + + taskDataPtr[0] = structPtr >> 0; + taskDataPtr[1] = structPtr >> 8; + taskDataPtr[2] = structPtr >> 16; + taskDataPtr[3] = structPtr >> 24; +} + +//Digit and arrow functions +#define VAL_U16 0 +static void PrintDigitChars(struct PokemonDebugMenu *data) +{ + s32 i; + u8 text[MODIFY_DIGITS_MAX + POKEMON_NAME_LENGTH + 4]; + + for (i = 0; i < data->modifyArrows.maxDigits; i++) + text[i] = data->modifyArrows.charDigits[i]; + + text[i] = CHAR_SPACE; + text[i + 1] = CHAR_HYPHEN; + text[i + 2] = CHAR_SPACE; + + StringCopy(&text[i + 3], gSpeciesNames[data->modifyArrows.currValue]); + + FillWindowPixelBuffer(data->modifyWindowId, 0x11); + AddTextPrinterParameterized(data->modifyWindowId, 1, text, 3, 0, 0, NULL); +} + +static u32 CharDigitsToValue(u8 *charDigits, u8 maxDigits) +{ + s32 i; + u8 id = 0; + u32 newValue = 0; + u8 valueDigits[MODIFY_DIGITS_MAX]; + + for (i = 0; i < MODIFY_DIGITS_MAX; i++) + valueDigits[i] = charDigits[i] - CHAR_0; + + if (maxDigits >= MODIFY_DIGITS_MAX) + newValue += valueDigits[id++] * 1000; + if (maxDigits >= MODIFY_DIGITS_MAX - 1) + newValue += valueDigits[id++] * 100; + if (maxDigits >= MODIFY_DIGITS_MAX - 2) + newValue += valueDigits[id++] * 10; + if (maxDigits >= MODIFY_DIGITS_MAX - 3) + newValue += valueDigits[id++]; + + return newValue; +} + +static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) +{ + s32 i; + u8 valueDigits[MODIFY_DIGITS_MAX]; + u8 id = 0; + + if (maxDigits >= MODIFY_DIGITS_MAX) + valueDigits[id++] = newValue / 1000; + if (maxDigits >= MODIFY_DIGITS_MAX - 1) + valueDigits[id++] = (newValue % 1000) / 100; + if (maxDigits >= MODIFY_DIGITS_MAX - 2) + valueDigits[id++] = (newValue % 100) / 10; + if (maxDigits >= MODIFY_DIGITS_MAX - 3) + valueDigits[id++] = newValue % 10; + + for (i = 0; i < MODIFY_DIGITS_MAX; i++) + charDigits[i] = valueDigits[i] + CHAR_0; +} + +static void SetUpModifyArrows(struct PokemonDebugMenu *data) +{ + LoadSpritePalette(&sSpritePalette_Arrow); + data->modifyArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, MODIFY_DIGITS_ARROW_X, MODIFY_DIGITS_ARROW1_Y, 0); + data->modifyArrows.arrowSpriteId[1] = CreateSprite(&sSpriteTemplate_Arrow, MODIFY_DIGITS_ARROW_X, MODIFY_DIGITS_ARROW2_Y, 0); + gSprites[data->modifyArrows.arrowSpriteId[1]].animNum = 1; + + data->modifyArrows.minValue = 1; + data->modifyArrows.maxValue = NUM_SPECIES - 1; + data->modifyArrows.maxDigits = 4; + data->modifyArrows.modifiedValPtr = &data->currentmonId; + data->modifyArrows.typeOfVal = VAL_U16; + data->modifyArrows.currValue = data->currentmonId; + + data->modifyArrows.currentDigit = 0; + ValueToCharDigits(data->modifyArrows.charDigits, data->modifyArrows.currValue, data->modifyArrows.maxDigits); +} + +static bool32 TryMoveDigit(struct PokemonDebugModifyArrows *modArrows, bool32 moveUp) +{ + s32 i; + u8 charDigits[MODIFY_DIGITS_MAX]; + u32 newValue; + + for (i = 0; i < MODIFY_DIGITS_MAX; i++) + charDigits[i] = modArrows->charDigits[i]; + + if (moveUp) + { + if (charDigits[modArrows->currentDigit] == CHAR_9) + { + charDigits[modArrows->currentDigit] = CHAR_0; + for (i = modArrows->currentDigit - 1; i >= 0; i--) + { + if (charDigits[i] == CHAR_9) + charDigits[i] = CHAR_0; + else + { + charDigits[i]++; + break; + } + } + } + else + charDigits[modArrows->currentDigit]++; + } + else + { + if (charDigits[modArrows->currentDigit] == CHAR_0) + { + charDigits[modArrows->currentDigit] = CHAR_9; + + for (i = modArrows->currentDigit - 1; i >= 0; i--) + { + if (charDigits[i] == CHAR_0) + charDigits[i] = CHAR_9; + else + { + charDigits[i]--; + break; + } + } + } + + else + charDigits[modArrows->currentDigit]--; + } + + newValue = CharDigitsToValue(charDigits, modArrows->maxDigits); + if (newValue > modArrows->maxValue || newValue < modArrows->minValue) + { + return FALSE; + } + else + { + modArrows->currValue = newValue; + for (i = 0; i < MODIFY_DIGITS_MAX; i++) + modArrows->charDigits[i] = charDigits[i]; + return TRUE; + } +} + +static void UpdateBattlerValue(struct PokemonDebugMenu *data) +{ + u32 i; + switch (data->modifyArrows.typeOfVal) + { + case VAL_U16: + *(u16*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; + break; + } +} + +// ******************************* +// Main functions +void CB2_Debug_Pokemon(void) +{ + u8 taskId; + const struct CompressedSpritePalette *palette; + struct PokemonDebugMenu *data; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + FreeMonSpritesGfx(); + ResetBGs_Debug_Menu(0); + DmaFillLarge16(3, 0, (u8 *)VRAM, VRAM_SIZE, 0x1000) + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state = 1; + break; + case 1: + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + ResetAllPicSprites(); + gMain.state++; + break; + case 2: + AllocateMonSpritesGfx(); + + LoadPalette(sBgColor, 0, 2); + LoadMonIconPalettes(); + //LoadPalette(GetOverworldTextboxPalettePtr(), 0xf0, 16); + + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(1); + + //input task handler + taskId = CreateTask(Handle_Input_Debug_Pokemon, 0); + + data = AllocZeroed(sizeof(struct PokemonDebugMenu)); + SetStructPtr(taskId, data); + + data->currentmonId = 1; + //data->currentmonWindowId = AddWindow(&sCurrentTitleTemplate); + PutWindowTilemap(data->currentmonWindowId); + PrintOnCurrentMonWindow(data->currentmonWindowId, data->currentmonId); + + data->InstructionsWindowId = AddWindow(&sDebugPokemonInstructionsTemplate); + PutWindowTilemap(data->InstructionsWindowId); + PrintInstructionsOnWindow(data->InstructionsWindowId); + + HandleLoadSpecialPokePic(&gMonFrontPicTable[data->currentmonId], gMonSpritesGfxPtr->sprites.ptr[1], data->currentmonId, 0); + data->isshiny = DEBUG_MON_NORMAL; + palette = GetMonSpritePalStructFromOtIdPersonality(data->currentmonId, 0, data->isshiny); + LoadCompressedSpritePalette(palette); + SetMultiuseSpriteTemplateToPokemon(data->currentmonId, 1); + gMultiuseSpriteTemplate.paletteTag = palette->tag; + data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X + 32, DEBUG_MON_Y + 40, 0); + gSprites[data->frontspriteId].callback = SpriteCallbackDummy; + gSprites[data->frontspriteId].oam.priority = 0; + + HandleLoadSpecialPokePic(&gMonBackPicTable[data->currentmonId], gMonSpritesGfxPtr->sprites.ptr[2], data->currentmonId, 0); + palette = GetMonSpritePalStructFromOtIdPersonality(data->currentmonId, 0, data->isshiny); + LoadCompressedSpritePalette(palette); + SetMultiuseSpriteTemplateToPokemon(data->currentmonId, 2); + gMultiuseSpriteTemplate.paletteTag = palette->tag; + data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 40, 0); + gSprites[data->backspriteId].callback = SpriteCallbackDummy; + gSprites[data->backspriteId].oam.priority = 0; + + //Icon Sprite + data->iconspriteId = CreateMonIcon(data->currentmonId, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isshiny); + gSprites[data->iconspriteId].oam.priority = 0; + + //Modify Arrows + data->modifyWindowId = AddWindow(&sModifyWindowTemplate); + PutWindowTilemap(data->modifyWindowId); + CopyWindowToVram(data->modifyWindowId, 3); + SetUpModifyArrows(data); + PrintDigitChars(data); + gMain.state++; + break; + case 3: + EnableInterrupts(1); + SetVBlankCallback(VBlankCB); + SetMainCallback2(CB2_Debug_Runner); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x80); + break; + } +} + +static void CB2_Debug_Runner(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void ResetBGs_Debug_Menu(u16 a) +{ + if (!(a & DISPCNT_BG0_ON)) + { + ClearGpuRegBits(0, DISPCNT_BG0_ON); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + } + if (!(a & DISPCNT_BG1_ON)) + { + ClearGpuRegBits(0, DISPCNT_BG1_ON); + SetGpuReg(REG_OFFSET_BG1CNT, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + } + if (!(a & DISPCNT_BG2_ON)) + { + ClearGpuRegBits(0, DISPCNT_BG2_ON); + SetGpuReg(REG_OFFSET_BG2CNT, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + } + if (!(a & DISPCNT_BG3_ON)) + { + ClearGpuRegBits(0, DISPCNT_BG3_ON); + SetGpuReg(REG_OFFSET_BG3CNT, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + } + if (!(a & DISPCNT_OBJ_ON)) + { + ClearGpuRegBits(0, DISPCNT_OBJ_ON); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + } +} + +static void Handle_Input_Debug_Pokemon(u8 taskId) +{ + struct PokemonDebugMenu *data = GetStructPtr(taskId); + struct Sprite *Frontsprite = &gSprites[data->frontspriteId]; + struct Sprite *Backsprite = &gSprites[data->backspriteId]; + + if (JOY_NEW(L_BUTTON)) + { + LaunchAnimationTaskForBackSprite(Backsprite, GetSpeciesBackAnimSet(data->currentmonId)); + } + else if (JOY_NEW(R_BUTTON)) + { + if (HasTwoFramesAnimation(data->currentmonId)) + StartSpriteAnim(Frontsprite, 1); + BattleAnimateFrontSprite(Frontsprite, data->currentmonId, TRUE, 1); + } + else if (JOY_NEW(A_BUTTON)) + { + if( data->isshiny == 9) + { + data->isshiny = DEBUG_MON_SHINY; + PlaySE(SE_SHINY); + } + else + { + data->isshiny = DEBUG_MON_NORMAL; + } + ReloadPokemonSprites(data); + + } + else if (JOY_NEW(B_BUTTON)) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = Exit_Debug_Pokemon; + PlaySE(SE_PC_OFF); + } + else if (JOY_NEW(START_BUTTON)) + { + PlayCryInternal(data->currentmonId, 0, 120, 10, 0); + } + else if (JOY_NEW(DPAD_DOWN)) // || gMain.heldKeys & DPAD_DOWN) + { + if (TryMoveDigit(&data->modifyArrows, FALSE)) + { + PrintDigitChars(data); + UpdateBattlerValue(data); + ReloadPokemonSprites(data); + } + + PlaySE(SE_DEX_SCROLL); + + while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); + } + else if (JOY_NEW(DPAD_UP)) // || gMain.heldKeys & DPAD_UP) + { + if (TryMoveDigit(&data->modifyArrows, TRUE)) + { + PrintDigitChars(data); + UpdateBattlerValue(data); + ReloadPokemonSprites(data); + } + + PlaySE(SE_DEX_SCROLL); + + } + else if (JOY_NEW(DPAD_LEFT)) // || gMain.heldKeys & DPAD_LEFT) + { + if (data->modifyArrows.currentDigit != 0) + { + data->modifyArrows.currentDigit--; + gSprites[data->modifyArrows.arrowSpriteId[0]].x2 -= 6; + gSprites[data->modifyArrows.arrowSpriteId[1]].x2 -= 6; + } + } + else if (JOY_NEW(DPAD_RIGHT)) // || gMain.heldKeys & DPAD_RIGHT) + { + if (data->modifyArrows.currentDigit != (data->modifyArrows.maxDigits - 1)) + { + data->modifyArrows.currentDigit++; + gSprites[data->modifyArrows.arrowSpriteId[0]].x2 += 6; + gSprites[data->modifyArrows.arrowSpriteId[1]].x2 += 6; + } + } +} + +static void ReloadPokemonSprites(struct PokemonDebugMenu *data) +{ + const struct CompressedSpritePalette *palette; + + DestroySprite(&gSprites[data->frontspriteId]); + DestroySprite(&gSprites[data->backspriteId]); + DestroySprite(&gSprites[data->iconspriteId]); + + FreeMonSpritesGfx(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + ResetAllPicSprites(); + AllocateMonSpritesGfx(); + + FreeAllSpritePalettes(); + FreeMonIconPalettes(); + + LoadMonIconPalettes(); + + HandleLoadSpecialPokePic(&gMonFrontPicTable[data->currentmonId], gMonSpritesGfxPtr->sprites.ptr[1], data->currentmonId, 0); + palette = GetMonSpritePalStructFromOtIdPersonality(data->currentmonId, 0, data->isshiny); + LoadCompressedSpritePalette(palette); + SetMultiuseSpriteTemplateToPokemon(data->currentmonId, 1); + gMultiuseSpriteTemplate.paletteTag = palette->tag; + data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X + 32, DEBUG_MON_Y + 40, 0); + gSprites[data->frontspriteId].callback = SpriteCallbackDummy; + gSprites[data->frontspriteId].oam.priority = 0; + + HandleLoadSpecialPokePic(&gMonBackPicTable[data->currentmonId], gMonSpritesGfxPtr->sprites.ptr[2], data->currentmonId, 0); + palette = GetMonSpritePalStructFromOtIdPersonality(data->currentmonId, 0, data->isshiny); + LoadCompressedSpritePalette(palette); + SetMultiuseSpriteTemplateToPokemon(data->currentmonId, 2); + gMultiuseSpriteTemplate.paletteTag = palette->tag; + data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 40, 0); + gSprites[data->backspriteId].callback = SpriteCallbackDummy; + gSprites[data->backspriteId].oam.priority = 0; + + //Icon Sprite + data->iconspriteId = CreateMonIcon(data->currentmonId, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isshiny); + gSprites[data->iconspriteId].oam.priority = 0; + + //Modify Arrows + LoadSpritePalette(&sSpritePalette_Arrow); + data->modifyArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, MODIFY_DIGITS_ARROW_X + (data->modifyArrows.currentDigit * 6), MODIFY_DIGITS_ARROW1_Y, 0); + data->modifyArrows.arrowSpriteId[1] = CreateSprite(&sSpriteTemplate_Arrow, MODIFY_DIGITS_ARROW_X + (data->modifyArrows.currentDigit * 6), MODIFY_DIGITS_ARROW2_Y, 0); + gSprites[data->modifyArrows.arrowSpriteId[1]].animNum = 1; +} + +static void Exit_Debug_Pokemon(u8 taskId) +{ + if (!gPaletteFade.active) + { + struct PokemonDebugMenu *data = GetStructPtr(taskId); + Free(data); + FreeMonSpritesGfx(); + DestroyTask(taskId); + SetMainCallback2(CB2_ReturnToField); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); + } +} diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c index 528a0e52d2..149e93091a 100644 --- a/src/reset_rtc_screen.c +++ b/src/reset_rtc_screen.c @@ -181,7 +181,7 @@ static const struct SpriteFrameImage sPicTable_Arrow[] = obj_frame_tiles(sArrowRight_Gfx) }; -static const struct SpritePalette sSpritePalette_Arrow = +const struct SpritePalette sSpritePalette_Arrow = { sArrow_Pal, PALTAG_ARROW }; @@ -217,7 +217,7 @@ static const union AnimCmd *const sAnims_Arrow[] = [ARROW_RIGHT] = sAnim_Arrow_Right, }; -static const struct SpriteTemplate sSpriteTemplate_Arrow = +const struct SpriteTemplate sSpriteTemplate_Arrow = { .tileTag = 0xFFFF, .paletteTag = PALTAG_ARROW, From b0f8408fb6b8689786e6045836232cc8fe63c55e Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 30 Nov 2021 02:29:33 +0100 Subject: [PATCH 02/46] added gender based sprites, added textbox line, adjusted sprite offset to match line --- include/decompress.h | 1 + src/decompress.c | 37 +++++ src/pokemon_debug.c | 333 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 340 insertions(+), 31 deletions(-) diff --git a/include/decompress.h b/include/decompress.h index 81f1425010..0d5cb3b3d3 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -21,6 +21,7 @@ void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void* buffe void DecompressPicFromTableGender(void* buffer, s32 species, u32 personality); void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality); +void HandleLoadSpecialPokePicCustom(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFemale); void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic); diff --git a/src/decompress.c b/src/decompress.c index 4d917e8d6a..f2a0884a6c 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -113,6 +113,43 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 DrawSpindaSpots(species, personality, dest, isFrontPic); } +static void LoadSpecialPokePicCustom(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic, bool8 isFemale) +{ + if (species == SPECIES_UNOWN) + { + u32 id = GetUnownSpeciesId(personality); + + if (!isFrontPic) + LZ77UnCompWram(gMonBackPicTable[id].data, dest); + else + LZ77UnCompWram(gMonFrontPicTable[id].data, dest); + } + else if (species > NUM_SPECIES) // is species unknown? draw the ? icon + LZ77UnCompWram(gMonFrontPicTable[0].data, dest); + else if (SpeciesHasGenderDifference[species] && isFemale) + { + if (isFrontPic) + LZ77UnCompWram(gMonFrontPicTableFemale[species].data, dest); + else + LZ77UnCompWram(gMonBackPicTableFemale[species].data, dest); + } + else + LZ77UnCompWram(src->data, dest); + + DrawSpindaSpots(species, personality, dest, isFrontPic); +} +void HandleLoadSpecialPokePicCustom(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFemale) +{ + bool8 isFrontPic; + + if (src == &gMonFrontPicTable[species]) + isFrontPic = TRUE; // frontPic + else + isFrontPic = FALSE; // backPic + + LoadSpecialPokePicCustom(src, dest, species, personality, isFrontPic, isFemale); +} + void Unused_LZDecompressWramIndirect(const void **src, void *dest) { LZ77UnCompWram(*src, dest); diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 3d3213034a..d6ca592645 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -1,6 +1,7 @@ //Credits: Gamer2020, AsparagusEduardo #include "global.h" #include "battle.h" +#include "battle_anim.h" #include "bg.h" #include "constants/rgb.h" #include "constants/songs.h" @@ -47,6 +48,11 @@ #define MODIFY_DIGITS_ARROW1_Y 12 #define MODIFY_DIGITS_ARROW2_Y 36 +#define GENDER_MALE 0 +#define GENDER_FEMALE 1 +#define MON_PIC_BACK 0 +#define MON_PIC_FRONT 1 + static const u16 sBgColor[] = {RGB_WHITE}; //Structs @@ -71,12 +77,15 @@ struct PokemonDebugMenu u8 frontspriteId; u8 backspriteId; u8 iconspriteId; - u8 isshiny; + bool8 isShiny; + u8 gender; struct PokemonDebugModifyArrows modifyArrows; u8 modifyWindowId; + u8 messageBoxWindowId; }; //WindowTemplates +/* static const struct WindowTemplate sCurrentTitleTemplate = { .bg = 0, @@ -87,6 +96,7 @@ static const struct WindowTemplate sCurrentTitleTemplate = .paletteNum = 0xF, .baseBlock = 0x200 }; +*/ static const struct WindowTemplate sDebugPokemonInstructionsTemplate = { @@ -110,6 +120,17 @@ static const struct WindowTemplate sModifyWindowTemplate = .baseBlock = 0x200 }; +static const struct WindowTemplate sPokemonDebugMsgBoxWindowTemplate = +{ + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 14, + .width = 11, + .height = 1, + .paletteNum = 0, + .baseBlock = 0x100 +}; + //Function declarations static void PrintDigitChars(struct PokemonDebugMenu *data); static void SetUpModifyArrows(struct PokemonDebugMenu *data); @@ -143,6 +164,7 @@ static void PadString(const u8 *src, u8 *dst) dst[i] = EOS; } +/* static void PrintOnCurrentMonWindow(u8 windowId, u16 monId) { u8 text[POKEMON_NAME_LENGTH + 10]; @@ -160,6 +182,7 @@ static void PrintOnCurrentMonWindow(u8 windowId, u16 monId) AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); CopyWindowToVram(windowId, 3); } +*/ static void PrintInstructionsOnWindow(u8 windowId) { @@ -193,16 +216,26 @@ static void SetStructPtr(u8 taskId, void *ptr) static void PrintDigitChars(struct PokemonDebugMenu *data) { s32 i; + u16 species = data->modifyArrows.currValue; u8 text[MODIFY_DIGITS_MAX + POKEMON_NAME_LENGTH + 4]; for (i = 0; i < data->modifyArrows.maxDigits; i++) text[i] = data->modifyArrows.charDigits[i]; - text[i] = CHAR_SPACE; - text[i + 1] = CHAR_HYPHEN; - text[i + 2] = CHAR_SPACE; + text[i++] = CHAR_SPACE; + text[i++] = CHAR_HYPHEN; - StringCopy(&text[i + 3], gSpeciesNames[data->modifyArrows.currValue]); + if (SpeciesHasGenderDifference[species]) + { + if (data->gender == GENDER_MALE) + text[i++] = CHAR_MALE; + else + text[i++] = CHAR_FEMALE; + text[i++] = CHAR_HYPHEN; + } + + text[i++] = CHAR_SPACE; + StringCopy(&text[i], gSpeciesNames[species]); FillWindowPixelBuffer(data->modifyWindowId, 0x11); AddTextPrinterParameterized(data->modifyWindowId, 1, text, 3, 0, 0, NULL); @@ -342,6 +375,215 @@ static void UpdateBattlerValue(struct PokemonDebugMenu *data) } } +//Sprite functions +static const struct CompressedSpritePalette *GetMonSpritePalStructCustom(u16 species, u8 gender, bool8 isShiny) +{ + if (isShiny) + { + if (SpeciesHasGenderDifference[species] && gender == GENDER_FEMALE) + return &gMonShinyPaletteTableFemale[species]; + else + return &gMonShinyPaletteTable[species]; + } + else + { + if (SpeciesHasGenderDifference[species] && gender == GENDER_FEMALE) + return &gMonPaletteTableFemale[species]; + else + return &gMonPaletteTable[species]; + } +} + +/* +// One entry for each of the four Castform forms. +extern const struct MonCoords gCastformFrontSpriteCoords[]; +static const u8 sCastformElevations[] = +{ + 13, // NORMAL + 14, // SUN + 13, // RAIN + 13, // HAIL +}; +// Const rom data +static const struct UCoords8 sBattlerCoords[][4] = +{ + { + { 72, 80 }, + { 176, 40 }, + { 48, 40 }, + { 112, 80 }, + }, + { + { 32, 80 }, + { 200, 40 }, + { 90, 88 }, + { 152, 32 }, + }, +}; +static u8 GetBattlerYDeltaCustom(u8 pic_type, u16 species) +{ + u32 personality; + u8 ret; + u16 coordSpecies; + + if (pic_type == MON_PIC_BACK) + { + if (species == SPECIES_UNOWN) + { + //coordSpecies = GetUnownSpeciesId(personality); + //ret = gMonBackPicCoords[coordSpecies].y_offset; + } + else if (species == SPECIES_CASTFORM) + ret = 0; //sCastformBackSpriteYCoords[0]]; //all of them are 0??? + else if (species > NUM_SPECIES) + ret = gMonBackPicCoords[0].y_offset; + else + ret = gMonBackPicCoords[species].y_offset; + } + else + { + if (species == SPECIES_UNOWN) + { + //coordSpecies = GetUnownSpeciesId(personality); + //ret = gMonFrontPicCoords[coordSpecies].y_offset; + } + else if (species == SPECIES_CASTFORM) + ret = gCastformFrontSpriteCoords[0].y_offset; + else if (species > NUM_SPECIES) + ret = gMonFrontPicCoords[0].y_offset; + else + ret = gMonFrontPicCoords[species].y_offset; + } + return ret; +} +static u8 GetBattlerElevationCustom(u8 pic_type, u16 species) +{ + u8 ret = 0; + if (pic_type == MON_PIC_FRONT) + { + if (species == SPECIES_CASTFORM) + ret = sCastformElevations[0]; + else if (species > NUM_SPECIES) + ret = gEnemyMonElevation[0]; + else + ret = gEnemyMonElevation[species]; + } + return ret; +} +u8 GetBattlerSpriteFinal_YCustom(u8 pic_type, u16 species, bool8 a3) +{ + u16 offset; + u8 y; + + if (pic_type == MON_PIC_BACK) + offset = GetBattlerYDeltaCustom(pic_type, species); + else + { + offset = GetBattlerYDeltaCustom(pic_type, species); + offset -= GetBattlerElevationCustom(pic_type, species); + } + y = offset + sBattlerCoords[0][pic_type].y; + if (a3) + { + if (pic_type == MON_PIC_BACK) + y += 8; + if (y > 104) + y = 104; + } + return y; +} +static u8 GetBattlerSpriteCoordCustom(u16 species, u8 pic_type, u8 coordType) +{ + u8 retVal; + + switch (coordType) + { + case BATTLER_COORD_X: + case BATTLER_COORD_X_2: + retVal = sBattlerCoords[0][pic_type].x; + break; + case BATTLER_COORD_Y: + retVal = sBattlerCoords[0][pic_type].y; + break; + case BATTLER_COORD_Y_PIC_OFFSET: + retVal = GetBattlerSpriteFinal_YCustom(pic_type, species, TRUE); + break; + case BATTLER_COORD_Y_PIC_OFFSET_DEFAULT: + retVal = GetBattlerSpriteFinal_YCustom(pic_type, species, FALSE); + break; + } + + return retVal; +} +static s16 GetBattlerSpriteCoordAttrCustom(u16 species, u8 pic_type, u8 attr, bool8 transformSpecies) +{ + u32 personality; + int ret = 0; + const struct MonCoords *coords; + + + if (pic_type == MON_PIC_BACK) + { + if (!transformSpecies) + //personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); + else + //personality = gTransformedPersonalities[battlerId]; + + if (species == SPECIES_UNOWN) + { + //species = GetUnownSpeciesId(personality); + coords = &gMonBackPicCoords[species]; + } + else if (species > NUM_SPECIES) + coords = &gMonBackPicCoords[0]; + else + coords = &gMonBackPicCoords[species]; + } + else + { + if (!transformSpecies) + //personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); + else + //personality = gTransformedPersonalities[battlerId]; + + if (species == SPECIES_UNOWN) + { + //species = GetUnownSpeciesId(personality); + coords = &gMonFrontPicCoords[species]; + } + else if (species == SPECIES_CASTFORM) + coords = &gCastformFrontSpriteCoords[0]; + else if (species > NUM_SPECIES) + coords = &gMonFrontPicCoords[0]; + else + coords = &gMonFrontPicCoords[species]; + } + + + switch (attr) + { + case BATTLER_COORD_ATTR_HEIGHT: + return (coords->size & 0xf) * 8; + case BATTLER_COORD_ATTR_WIDTH: + return (coords->size >> 4) * 8; + case BATTLER_COORD_ATTR_LEFT: + return GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_X_2) - ((coords->size >> 4) * 4); + case BATTLER_COORD_ATTR_RIGHT: + return GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_X_2) + ((coords->size >> 4) * 4); + case BATTLER_COORD_ATTR_TOP: + return GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_Y_PIC_OFFSET) - ((coords->size & 0xf) * 4); + case BATTLER_COORD_ATTR_BOTTOM: + return GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_Y_PIC_OFFSET) + ((coords->size & 0xf) * 4); + case BATTLER_COORD_ATTR_RAW_BOTTOM: + ret = GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_Y) + 31; + return ret - coords->y_offset; + default: + return 0; + } + +} +*/ + // ******************************* // Main functions void CB2_Debug_Pokemon(void) @@ -349,6 +591,8 @@ void CB2_Debug_Pokemon(void) u8 taskId; const struct CompressedSpritePalette *palette; struct PokemonDebugMenu *data; + s16 offset_x, offset_y; + u16 species; switch (gMain.state) { @@ -390,35 +634,41 @@ void CB2_Debug_Pokemon(void) SetStructPtr(taskId, data); data->currentmonId = 1; - //data->currentmonWindowId = AddWindow(&sCurrentTitleTemplate); + species = data->currentmonId; + /* + data->currentmonWindowId = AddWindow(&sCurrentTitleTemplate); PutWindowTilemap(data->currentmonWindowId); PrintOnCurrentMonWindow(data->currentmonWindowId, data->currentmonId); + */ data->InstructionsWindowId = AddWindow(&sDebugPokemonInstructionsTemplate); PutWindowTilemap(data->InstructionsWindowId); PrintInstructionsOnWindow(data->InstructionsWindowId); - HandleLoadSpecialPokePic(&gMonFrontPicTable[data->currentmonId], gMonSpritesGfxPtr->sprites.ptr[1], data->currentmonId, 0); - data->isshiny = DEBUG_MON_NORMAL; - palette = GetMonSpritePalStructFromOtIdPersonality(data->currentmonId, 0, data->isshiny); + HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->gender); + data->isShiny = FALSE; + data->gender = GENDER_MALE; + palette = GetMonSpritePalStructCustom(species, data->gender, data->isShiny); LoadCompressedSpritePalette(palette); - SetMultiuseSpriteTemplateToPokemon(data->currentmonId, 1); + SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X + 32, DEBUG_MON_Y + 40, 0); gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; - HandleLoadSpecialPokePic(&gMonBackPicTable[data->currentmonId], gMonSpritesGfxPtr->sprites.ptr[2], data->currentmonId, 0); - palette = GetMonSpritePalStructFromOtIdPersonality(data->currentmonId, 0, data->isshiny); + HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->gender); + palette = GetMonSpritePalStructCustom(species, data->gender, data->isShiny); LoadCompressedSpritePalette(palette); - SetMultiuseSpriteTemplateToPokemon(data->currentmonId, 2); + SetMultiuseSpriteTemplateToPokemon(species, 2); gMultiuseSpriteTemplate.paletteTag = palette->tag; - data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 40, 0); + //offset_y = GetBattlerSpriteCoordAttrCustom(species, MON_PIC_BACK, BATTLER_COORD_ATTR_BOTTOM, FALSE); + offset_y = gMonBackPicCoords[species].y_offset; + data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 30 + offset_y, 0); gSprites[data->backspriteId].callback = SpriteCallbackDummy; gSprites[data->backspriteId].oam.priority = 0; //Icon Sprite - data->iconspriteId = CreateMonIcon(data->currentmonId, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isshiny); + data->iconspriteId = CreateMonIcon(species, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isShiny); gSprites[data->iconspriteId].oam.priority = 0; //Modify Arrows @@ -427,6 +677,13 @@ void CB2_Debug_Pokemon(void) CopyWindowToVram(data->modifyWindowId, 3); SetUpModifyArrows(data); PrintDigitChars(data); + + //MessageBox line + data->messageBoxWindowId = AddWindow(&sPokemonDebugMsgBoxWindowTemplate); + PutWindowTilemap(data->messageBoxWindowId); + CopyWindowToVram(data->messageBoxWindowId, 3); + FillWindowPixelRect(data->messageBoxWindowId, PIXEL_FILL(0x1), 0, 0, 90, 4); + gMain.state++; break; case 3: @@ -503,15 +760,11 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) } else if (JOY_NEW(A_BUTTON)) { - if( data->isshiny == 9) - { - data->isshiny = DEBUG_MON_SHINY; + data->isShiny = !data->isShiny; + + if(data->isShiny) PlaySE(SE_SHINY); - } - else - { - data->isshiny = DEBUG_MON_NORMAL; - } + ReloadPokemonSprites(data); } @@ -525,10 +778,22 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) { PlayCryInternal(data->currentmonId, 0, 120, 10, 0); } + else if (JOY_NEW(SELECT_BUTTON) && SpeciesHasGenderDifference[data->currentmonId]) + { + if (data->gender == GENDER_MALE) + data->gender = GENDER_FEMALE; + else + data->gender = GENDER_MALE; + PrintDigitChars(data); + UpdateBattlerValue(data); + ReloadPokemonSprites(data); + while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); + } else if (JOY_NEW(DPAD_DOWN)) // || gMain.heldKeys & DPAD_DOWN) { if (TryMoveDigit(&data->modifyArrows, FALSE)) { + data->gender = GENDER_MALE; PrintDigitChars(data); UpdateBattlerValue(data); ReloadPokemonSprites(data); @@ -542,6 +807,7 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) { if (TryMoveDigit(&data->modifyArrows, TRUE)) { + data->gender = GENDER_MALE; PrintDigitChars(data); UpdateBattlerValue(data); ReloadPokemonSprites(data); @@ -572,6 +838,9 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) static void ReloadPokemonSprites(struct PokemonDebugMenu *data) { + s16 offset_x = 0; + s16 offset_y = 0; + u16 species = data->currentmonId; const struct CompressedSpritePalette *palette; DestroySprite(&gSprites[data->frontspriteId]); @@ -590,26 +859,28 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) LoadMonIconPalettes(); - HandleLoadSpecialPokePic(&gMonFrontPicTable[data->currentmonId], gMonSpritesGfxPtr->sprites.ptr[1], data->currentmonId, 0); - palette = GetMonSpritePalStructFromOtIdPersonality(data->currentmonId, 0, data->isshiny); + HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->gender); + palette = GetMonSpritePalStructCustom(species, data->gender, data->isShiny); LoadCompressedSpritePalette(palette); - SetMultiuseSpriteTemplateToPokemon(data->currentmonId, 1); + SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X + 32, DEBUG_MON_Y + 40, 0); gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; - HandleLoadSpecialPokePic(&gMonBackPicTable[data->currentmonId], gMonSpritesGfxPtr->sprites.ptr[2], data->currentmonId, 0); - palette = GetMonSpritePalStructFromOtIdPersonality(data->currentmonId, 0, data->isshiny); + HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->gender); + palette = GetMonSpritePalStructCustom(species, data->gender, data->isShiny); LoadCompressedSpritePalette(palette); - SetMultiuseSpriteTemplateToPokemon(data->currentmonId, 2); + SetMultiuseSpriteTemplateToPokemon(species, 2); gMultiuseSpriteTemplate.paletteTag = palette->tag; - data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 40, 0); + //offset_y = GetBattlerSpriteCoordAttrCustom(species, MON_PIC_BACK, BATTLER_COORD_ATTR_BOTTOM, FALSE); + offset_y = gMonBackPicCoords[species].y_offset; + data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 30 + offset_y, 0); gSprites[data->backspriteId].callback = SpriteCallbackDummy; gSprites[data->backspriteId].oam.priority = 0; //Icon Sprite - data->iconspriteId = CreateMonIcon(data->currentmonId, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isshiny); + data->iconspriteId = CreateMonIcon(species, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isShiny); gSprites[data->iconspriteId].oam.priority = 0; //Modify Arrows From 50e95878e9f580a92af571772f505196066e3d26 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 30 Nov 2021 11:16:30 +0100 Subject: [PATCH 03/46] added Select button text, added gender based icons, imrpoved code --- include/pokemon_icon.h | 1 + src/decompress.c | 3 ++ src/pokemon_debug.c | 67 +++++++++++++++++++++++------------------- src/pokemon_icon.c | 51 ++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 31 deletions(-) diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h index 3ca9b741f0..917d0545ff 100644 --- a/include/pokemon_icon.h +++ b/include/pokemon_icon.h @@ -19,6 +19,7 @@ u8 CreateMonIconNoPersonality(u16 species, void (*callback)(struct Sprite *), s1 void FreeMonIconPalette(u16 species); void FreeAndDestroyMonIconSprite(struct Sprite *sprite); u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality); +u8 CreateMonIconCustom(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool8 isFemale, bool8 isShiny); u8 UpdateMonIconFrame(struct Sprite *sprite); void LoadMonIconPalette(u16 species); void sub_80D328C(struct Sprite *sprite); diff --git a/src/decompress.c b/src/decompress.c index f2a0884a6c..722e6574a6 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -3,6 +3,7 @@ #include "data.h" #include "decompress.h" #include "pokemon.h" +#include "pokemon_debug.h" #include "text.h" EWRAM_DATA ALIGNED(4) u8 gDecompressionBuffer[0x4000] = {0}; @@ -113,6 +114,7 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 DrawSpindaSpots(species, personality, dest, isFrontPic); } +#ifdef POKEMON_DEBUG static void LoadSpecialPokePicCustom(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic, bool8 isFemale) { if (species == SPECIES_UNOWN) @@ -149,6 +151,7 @@ void HandleLoadSpecialPokePicCustom(const struct CompressedSpriteSheet *src, voi LoadSpecialPokePicCustom(src, dest, species, personality, isFrontPic, isFemale); } +#endif void Unused_LZDecompressWramIndirect(const void **src, void *dest) { diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index d6ca592645..32793b32f6 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -38,7 +38,7 @@ #define DEBUG_MON_Y 14 #define DEBUG_MON_BACK_X 32 #define DEBUG_MON_BACK_Y 50 -#define DEBUG_ICON_X 148 +#define DEBUG_ICON_X 158 #define DEBUG_ICON_Y 90 #define DEBUG_MON_SHINY 0 #define DEBUG_MON_NORMAL 9 @@ -78,7 +78,7 @@ struct PokemonDebugMenu u8 backspriteId; u8 iconspriteId; bool8 isShiny; - u8 gender; + bool8 isFemale; struct PokemonDebugModifyArrows modifyArrows; u8 modifyWindowId; u8 messageBoxWindowId; @@ -103,7 +103,7 @@ static const struct WindowTemplate sDebugPokemonInstructionsTemplate = .bg = 0, .tilemapLeft =1, .tilemapTop = 207, - .width = 14, + .width = 22, .height = 8, .paletteNum = 0xF, .baseBlock = 0x300 @@ -184,12 +184,18 @@ static void PrintOnCurrentMonWindow(u8 windowId, u16 monId) } */ -static void PrintInstructionsOnWindow(u8 windowId) +static void PrintInstructionsOnWindow(u8 windowId, struct PokemonDebugMenu *data) { - u8 text[] = _("A - Shiny START - Cry\nL - Back R - Front$"); + u8 text[] = _("A - Shiny START - Cry\nL - Back R - Front$"); + u8 textGender[] = _("A - Shiny START - Cry\nL - Back R - Front SEL - Gender$"); + u16 species = data->modifyArrows.currValue; + FillWindowPixelBuffer(windowId, 0x11); - AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); + if (SpeciesHasGenderDifference[species]) + AddTextPrinterParameterized(windowId, 1, textGender, 0, 0, 0, NULL); + else + AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); CopyWindowToVram(windowId, 3); } @@ -217,7 +223,7 @@ static void PrintDigitChars(struct PokemonDebugMenu *data) { s32 i; u16 species = data->modifyArrows.currValue; - u8 text[MODIFY_DIGITS_MAX + POKEMON_NAME_LENGTH + 4]; + u8 text[MODIFY_DIGITS_MAX + POKEMON_NAME_LENGTH + 8]; for (i = 0; i < data->modifyArrows.maxDigits; i++) text[i] = data->modifyArrows.charDigits[i]; @@ -227,10 +233,10 @@ static void PrintDigitChars(struct PokemonDebugMenu *data) if (SpeciesHasGenderDifference[species]) { - if (data->gender == GENDER_MALE) - text[i++] = CHAR_MALE; + if (data->isFemale) + text[i++] = CHAR_FEMALE; else - text[i++] = CHAR_FEMALE; + text[i++] = CHAR_MALE; text[i++] = CHAR_HYPHEN; } @@ -376,18 +382,18 @@ static void UpdateBattlerValue(struct PokemonDebugMenu *data) } //Sprite functions -static const struct CompressedSpritePalette *GetMonSpritePalStructCustom(u16 species, u8 gender, bool8 isShiny) +static const struct CompressedSpritePalette *GetMonSpritePalStructCustom(u16 species, bool8 isFemale, bool8 isShiny) { if (isShiny) { - if (SpeciesHasGenderDifference[species] && gender == GENDER_FEMALE) + if (SpeciesHasGenderDifference[species] && isFemale) return &gMonShinyPaletteTableFemale[species]; else return &gMonShinyPaletteTable[species]; } else { - if (SpeciesHasGenderDifference[species] && gender == GENDER_FEMALE) + if (SpeciesHasGenderDifference[species] && isFemale) return &gMonPaletteTableFemale[species]; else return &gMonPaletteTable[species]; @@ -643,12 +649,12 @@ void CB2_Debug_Pokemon(void) data->InstructionsWindowId = AddWindow(&sDebugPokemonInstructionsTemplate); PutWindowTilemap(data->InstructionsWindowId); - PrintInstructionsOnWindow(data->InstructionsWindowId); + PrintInstructionsOnWindow(data->InstructionsWindowId, data); - HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->gender); + HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->isFemale); data->isShiny = FALSE; - data->gender = GENDER_MALE; - palette = GetMonSpritePalStructCustom(species, data->gender, data->isShiny); + data->isFemale = FALSE; + palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); LoadCompressedSpritePalette(palette); SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; @@ -656,8 +662,8 @@ void CB2_Debug_Pokemon(void) gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; - HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->gender); - palette = GetMonSpritePalStructCustom(species, data->gender, data->isShiny); + HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); + palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); LoadCompressedSpritePalette(palette); SetMultiuseSpriteTemplateToPokemon(species, 2); gMultiuseSpriteTemplate.paletteTag = palette->tag; @@ -668,7 +674,7 @@ void CB2_Debug_Pokemon(void) gSprites[data->backspriteId].oam.priority = 0; //Icon Sprite - data->iconspriteId = CreateMonIcon(species, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isShiny); + data->iconspriteId = CreateMonIconCustom(species, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isShiny, data->isFemale, data->isShiny); gSprites[data->iconspriteId].oam.priority = 0; //Modify Arrows @@ -780,10 +786,7 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) } else if (JOY_NEW(SELECT_BUTTON) && SpeciesHasGenderDifference[data->currentmonId]) { - if (data->gender == GENDER_MALE) - data->gender = GENDER_FEMALE; - else - data->gender = GENDER_MALE; + data->isFemale = !data->isFemale; PrintDigitChars(data); UpdateBattlerValue(data); ReloadPokemonSprites(data); @@ -793,7 +796,7 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) { if (TryMoveDigit(&data->modifyArrows, FALSE)) { - data->gender = GENDER_MALE; + data->isFemale = FALSE; PrintDigitChars(data); UpdateBattlerValue(data); ReloadPokemonSprites(data); @@ -807,7 +810,7 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) { if (TryMoveDigit(&data->modifyArrows, TRUE)) { - data->gender = GENDER_MALE; + data->isFemale = FALSE; PrintDigitChars(data); UpdateBattlerValue(data); ReloadPokemonSprites(data); @@ -859,8 +862,10 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) LoadMonIconPalettes(); - HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->gender); - palette = GetMonSpritePalStructCustom(species, data->gender, data->isShiny); + PrintInstructionsOnWindow(data->InstructionsWindowId, data); + + HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->isFemale); + palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); LoadCompressedSpritePalette(palette); SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; @@ -868,8 +873,8 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; - HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->gender); - palette = GetMonSpritePalStructCustom(species, data->gender, data->isShiny); + HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); + palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); LoadCompressedSpritePalette(palette); SetMultiuseSpriteTemplateToPokemon(species, 2); gMultiuseSpriteTemplate.paletteTag = palette->tag; @@ -880,7 +885,7 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) gSprites[data->backspriteId].oam.priority = 0; //Icon Sprite - data->iconspriteId = CreateMonIcon(species, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isShiny); + data->iconspriteId = CreateMonIconCustom(species, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isShiny, data->isFemale, data->isShiny); gSprites[data->iconspriteId].oam.priority = 0; //Modify Arrows diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 2a872a9e45..ad5820ba13 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -2,6 +2,7 @@ #include "graphics.h" #include "mail.h" #include "palette.h" +#include "pokemon_debug.h" #include "pokemon_icon.h" #include "sprite.h" #include "data.h" @@ -22,6 +23,10 @@ struct MonIconSpriteTemplate // static functions static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); +#ifdef POKEMON_DEBUG +static const u8 *GetMonIconPtrCustom(u16 species, u32 personality, bool8 isFemale); +static const u8* GetMonIconTilesCustom(u16 species, bool8 isFemale); +#endif // .rodata @@ -2575,6 +2580,33 @@ u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u return spriteId; } +#ifdef POKEMON_DEBUG +u8 CreateMonIconCustom(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool8 isFemale, bool8 isShiny) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate = + { + .oam = &sMonIconOamData, + .image = GetMonIconPtrCustom(species, personality, isFemale), + .anims = sMonIconAnims, + .affineAnims = sMonIconAffineAnims, + .callback = callback, + .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], + }; + + if (species > NUM_SPECIES) + iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; + else if (SpeciesHasGenderDifference[species] && isFemale) + iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndicesFemale[species]; + + spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} +#endif + u8 CreateMonIconNoPersonality(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) { u8 spriteId; @@ -2646,6 +2678,13 @@ const u8 *GetMonIconPtr(u16 species, u32 personality) return GetMonIconTiles(GetIconSpecies(species, personality), personality); } +#ifdef POKEMON_DEBUG +static const u8 *GetMonIconPtrCustom(u16 species, u32 personality, bool8 isFemale) +{ + return GetMonIconTilesCustom(GetIconSpecies(species, personality), isFemale); +} +#endif + void FreeAndDestroyMonIconSprite(struct Sprite *sprite) { sub_80D328C(sprite); @@ -2715,6 +2754,18 @@ const u8* GetMonIconTiles(u16 species, u32 personality) return iconSprite; } +#ifdef POKEMON_DEBUG +static const u8* GetMonIconTilesCustom(u16 species, bool8 isFemale) +{ + const u8* iconSprite = gMonIconTable[species]; + if (SpeciesHasGenderDifference[species] && isFemale) + { + iconSprite = gMonIconTableFemale[species]; + } + return iconSprite; +} +#endif + void sub_80D304C(u16 offset) { s32 i; From c402a840b1f92e88a14bbdd14831eeb5441d30a6 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 30 Nov 2021 11:20:26 +0100 Subject: [PATCH 04/46] changed to P_ENABLE_DEBUG --- include/pokemon_debug.h | 2 +- src/decompress.c | 2 +- src/field_control_avatar.c | 4 ++-- src/pokemon_icon.c | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/pokemon_debug.h b/include/pokemon_debug.h index a1aae5e153..d70409a6b1 100644 --- a/include/pokemon_debug.h +++ b/include/pokemon_debug.h @@ -1,7 +1,7 @@ #ifndef GUARD_POKEMON_DEBUG_H #define GUARD_POKEMON_DEBUG_H -#define POKEMON_DEBUG +#define P_ENABLE_DEBUG void CB2_Debug_Pokemon(void); diff --git a/src/decompress.c b/src/decompress.c index 722e6574a6..ba5e4b8429 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -114,7 +114,7 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 DrawSpindaSpots(species, personality, dest, isFrontPic); } -#ifdef POKEMON_DEBUG +#ifdef P_ENABLE_DEBUG static void LoadSpecialPokePicCustom(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic, bool8 isFemale) { if (species == SPECIES_UNOWN) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 66065681fc..c3fb5edd9d 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -132,7 +132,7 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; - #ifdef POKEMON_DEBUG + #ifdef P_ENABLE_DEBUG if ((heldKeys & R_BUTTON) && input->pressedStartButton) { input->input_field_1_2 = TRUE; @@ -199,7 +199,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input) return TRUE; - #ifdef POKEMON_DEBUG + #ifdef P_ENABLE_DEBUG if (input->input_field_1_2) { //PlaySE(SE_WIN_OPEN); diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index ad5820ba13..0b7c3203cb 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -23,7 +23,7 @@ struct MonIconSpriteTemplate // static functions static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); -#ifdef POKEMON_DEBUG +#ifdef P_ENABLE_DEBUG static const u8 *GetMonIconPtrCustom(u16 species, u32 personality, bool8 isFemale); static const u8* GetMonIconTilesCustom(u16 species, bool8 isFemale); #endif @@ -2580,7 +2580,7 @@ u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u return spriteId; } -#ifdef POKEMON_DEBUG +#ifdef P_ENABLE_DEBUG u8 CreateMonIconCustom(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool8 isFemale, bool8 isShiny) { u8 spriteId; @@ -2678,7 +2678,7 @@ const u8 *GetMonIconPtr(u16 species, u32 personality) return GetMonIconTiles(GetIconSpecies(species, personality), personality); } -#ifdef POKEMON_DEBUG +#ifdef P_ENABLE_DEBUG static const u8 *GetMonIconPtrCustom(u16 species, u32 personality, bool8 isFemale) { return GetMonIconTilesCustom(GetIconSpecies(species, personality), isFemale); @@ -2754,7 +2754,7 @@ const u8* GetMonIconTiles(u16 species, u32 personality) return iconSprite; } -#ifdef POKEMON_DEBUG +#ifdef P_ENABLE_DEBUG static const u8* GetMonIconTilesCustom(u16 species, bool8 isFemale) { const u8* iconSprite = gMonIconTable[species]; From dcf7dd6ce6c393983465c5be1d9b7f31793fa501 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 30 Nov 2021 12:28:13 +0100 Subject: [PATCH 05/46] small fix --- src/pokemon_debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 32793b32f6..d99ba34cc1 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -127,7 +127,7 @@ static const struct WindowTemplate sPokemonDebugMsgBoxWindowTemplate = .tilemapTop = 14, .width = 11, .height = 1, - .paletteNum = 0, + .paletteNum = 0xF, .baseBlock = 0x100 }; @@ -688,7 +688,7 @@ void CB2_Debug_Pokemon(void) data->messageBoxWindowId = AddWindow(&sPokemonDebugMsgBoxWindowTemplate); PutWindowTilemap(data->messageBoxWindowId); CopyWindowToVram(data->messageBoxWindowId, 3); - FillWindowPixelRect(data->messageBoxWindowId, PIXEL_FILL(0x1), 0, 0, 90, 4); + FillWindowPixelRect(data->messageBoxWindowId, PIXEL_FILL(0x2), 0, 0, 90, 4); gMain.state++; break; From cb1c753b637b5cdfcd08ef24c7f8c9cb22bb9b2c Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 30 Nov 2021 13:48:11 +0100 Subject: [PATCH 06/46] removed unused code --- src/pokemon_debug.c | 231 -------------------------------------------- 1 file changed, 231 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index d99ba34cc1..5c632ed610 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -85,19 +85,6 @@ struct PokemonDebugMenu }; //WindowTemplates -/* -static const struct WindowTemplate sCurrentTitleTemplate = -{ - .bg = 0, - .tilemapLeft =1, - .tilemapTop = 0, - .width = 14, - .height = 2, - .paletteNum = 0xF, - .baseBlock = 0x200 -}; -*/ - static const struct WindowTemplate sDebugPokemonInstructionsTemplate = { .bg = 0, @@ -164,26 +151,6 @@ static void PadString(const u8 *src, u8 *dst) dst[i] = EOS; } -/* -static void PrintOnCurrentMonWindow(u8 windowId, u16 monId) -{ - u8 text[POKEMON_NAME_LENGTH + 10]; - - text[0] = CHAR_0 + monId / 100; - text[1] = CHAR_0 + (monId % 100) / 10; - text[2] = CHAR_0 + (monId % 100) % 10; - text[3] = CHAR_SPACE; - text[4] = CHAR_HYPHEN; - text[5] = CHAR_SPACE; - - StringCopy(&text[6], gSpeciesNames[monId]); - - FillWindowPixelBuffer(windowId, 0x11); - AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); - CopyWindowToVram(windowId, 3); -} -*/ - static void PrintInstructionsOnWindow(u8 windowId, struct PokemonDebugMenu *data) { u8 text[] = _("A - Shiny START - Cry\nL - Back R - Front$"); @@ -400,196 +367,6 @@ static const struct CompressedSpritePalette *GetMonSpritePalStructCustom(u16 spe } } -/* -// One entry for each of the four Castform forms. -extern const struct MonCoords gCastformFrontSpriteCoords[]; -static const u8 sCastformElevations[] = -{ - 13, // NORMAL - 14, // SUN - 13, // RAIN - 13, // HAIL -}; -// Const rom data -static const struct UCoords8 sBattlerCoords[][4] = -{ - { - { 72, 80 }, - { 176, 40 }, - { 48, 40 }, - { 112, 80 }, - }, - { - { 32, 80 }, - { 200, 40 }, - { 90, 88 }, - { 152, 32 }, - }, -}; -static u8 GetBattlerYDeltaCustom(u8 pic_type, u16 species) -{ - u32 personality; - u8 ret; - u16 coordSpecies; - - if (pic_type == MON_PIC_BACK) - { - if (species == SPECIES_UNOWN) - { - //coordSpecies = GetUnownSpeciesId(personality); - //ret = gMonBackPicCoords[coordSpecies].y_offset; - } - else if (species == SPECIES_CASTFORM) - ret = 0; //sCastformBackSpriteYCoords[0]]; //all of them are 0??? - else if (species > NUM_SPECIES) - ret = gMonBackPicCoords[0].y_offset; - else - ret = gMonBackPicCoords[species].y_offset; - } - else - { - if (species == SPECIES_UNOWN) - { - //coordSpecies = GetUnownSpeciesId(personality); - //ret = gMonFrontPicCoords[coordSpecies].y_offset; - } - else if (species == SPECIES_CASTFORM) - ret = gCastformFrontSpriteCoords[0].y_offset; - else if (species > NUM_SPECIES) - ret = gMonFrontPicCoords[0].y_offset; - else - ret = gMonFrontPicCoords[species].y_offset; - } - return ret; -} -static u8 GetBattlerElevationCustom(u8 pic_type, u16 species) -{ - u8 ret = 0; - if (pic_type == MON_PIC_FRONT) - { - if (species == SPECIES_CASTFORM) - ret = sCastformElevations[0]; - else if (species > NUM_SPECIES) - ret = gEnemyMonElevation[0]; - else - ret = gEnemyMonElevation[species]; - } - return ret; -} -u8 GetBattlerSpriteFinal_YCustom(u8 pic_type, u16 species, bool8 a3) -{ - u16 offset; - u8 y; - - if (pic_type == MON_PIC_BACK) - offset = GetBattlerYDeltaCustom(pic_type, species); - else - { - offset = GetBattlerYDeltaCustom(pic_type, species); - offset -= GetBattlerElevationCustom(pic_type, species); - } - y = offset + sBattlerCoords[0][pic_type].y; - if (a3) - { - if (pic_type == MON_PIC_BACK) - y += 8; - if (y > 104) - y = 104; - } - return y; -} -static u8 GetBattlerSpriteCoordCustom(u16 species, u8 pic_type, u8 coordType) -{ - u8 retVal; - - switch (coordType) - { - case BATTLER_COORD_X: - case BATTLER_COORD_X_2: - retVal = sBattlerCoords[0][pic_type].x; - break; - case BATTLER_COORD_Y: - retVal = sBattlerCoords[0][pic_type].y; - break; - case BATTLER_COORD_Y_PIC_OFFSET: - retVal = GetBattlerSpriteFinal_YCustom(pic_type, species, TRUE); - break; - case BATTLER_COORD_Y_PIC_OFFSET_DEFAULT: - retVal = GetBattlerSpriteFinal_YCustom(pic_type, species, FALSE); - break; - } - - return retVal; -} -static s16 GetBattlerSpriteCoordAttrCustom(u16 species, u8 pic_type, u8 attr, bool8 transformSpecies) -{ - u32 personality; - int ret = 0; - const struct MonCoords *coords; - - - if (pic_type == MON_PIC_BACK) - { - if (!transformSpecies) - //personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); - else - //personality = gTransformedPersonalities[battlerId]; - - if (species == SPECIES_UNOWN) - { - //species = GetUnownSpeciesId(personality); - coords = &gMonBackPicCoords[species]; - } - else if (species > NUM_SPECIES) - coords = &gMonBackPicCoords[0]; - else - coords = &gMonBackPicCoords[species]; - } - else - { - if (!transformSpecies) - //personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); - else - //personality = gTransformedPersonalities[battlerId]; - - if (species == SPECIES_UNOWN) - { - //species = GetUnownSpeciesId(personality); - coords = &gMonFrontPicCoords[species]; - } - else if (species == SPECIES_CASTFORM) - coords = &gCastformFrontSpriteCoords[0]; - else if (species > NUM_SPECIES) - coords = &gMonFrontPicCoords[0]; - else - coords = &gMonFrontPicCoords[species]; - } - - - switch (attr) - { - case BATTLER_COORD_ATTR_HEIGHT: - return (coords->size & 0xf) * 8; - case BATTLER_COORD_ATTR_WIDTH: - return (coords->size >> 4) * 8; - case BATTLER_COORD_ATTR_LEFT: - return GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_X_2) - ((coords->size >> 4) * 4); - case BATTLER_COORD_ATTR_RIGHT: - return GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_X_2) + ((coords->size >> 4) * 4); - case BATTLER_COORD_ATTR_TOP: - return GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_Y_PIC_OFFSET) - ((coords->size & 0xf) * 4); - case BATTLER_COORD_ATTR_BOTTOM: - return GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_Y_PIC_OFFSET) + ((coords->size & 0xf) * 4); - case BATTLER_COORD_ATTR_RAW_BOTTOM: - ret = GetBattlerSpriteCoordCustom(species, pic_type, BATTLER_COORD_Y) + 31; - return ret - coords->y_offset; - default: - return 0; - } - -} -*/ - // ******************************* // Main functions void CB2_Debug_Pokemon(void) @@ -627,7 +404,6 @@ void CB2_Debug_Pokemon(void) LoadPalette(sBgColor, 0, 2); LoadMonIconPalettes(); - //LoadPalette(GetOverworldTextboxPalettePtr(), 0xf0, 16); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); @@ -641,11 +417,6 @@ void CB2_Debug_Pokemon(void) data->currentmonId = 1; species = data->currentmonId; - /* - data->currentmonWindowId = AddWindow(&sCurrentTitleTemplate); - PutWindowTilemap(data->currentmonWindowId); - PrintOnCurrentMonWindow(data->currentmonWindowId, data->currentmonId); - */ data->InstructionsWindowId = AddWindow(&sDebugPokemonInstructionsTemplate); PutWindowTilemap(data->InstructionsWindowId); @@ -667,7 +438,6 @@ void CB2_Debug_Pokemon(void) LoadCompressedSpritePalette(palette); SetMultiuseSpriteTemplateToPokemon(species, 2); gMultiuseSpriteTemplate.paletteTag = palette->tag; - //offset_y = GetBattlerSpriteCoordAttrCustom(species, MON_PIC_BACK, BATTLER_COORD_ATTR_BOTTOM, FALSE); offset_y = gMonBackPicCoords[species].y_offset; data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 30 + offset_y, 0); gSprites[data->backspriteId].callback = SpriteCallbackDummy; @@ -878,7 +648,6 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) LoadCompressedSpritePalette(palette); SetMultiuseSpriteTemplateToPokemon(species, 2); gMultiuseSpriteTemplate.paletteTag = palette->tag; - //offset_y = GetBattlerSpriteCoordAttrCustom(species, MON_PIC_BACK, BATTLER_COORD_ATTR_BOTTOM, FALSE); offset_y = gMonBackPicCoords[species].y_offset; data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 30 + offset_y, 0); gSprites[data->backspriteId].callback = SpriteCallbackDummy; From a36445ea11cb889dba82fffe1f91699ac3a9e147 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Thu, 2 Dec 2021 18:16:41 +0100 Subject: [PATCH 07/46] Changed opening to summary screen SELECT --- src/field_control_avatar.c | 24 ------------------------ src/pokemon_summary_screen.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index c3fb5edd9d..6ec280fd0d 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -20,7 +20,6 @@ #include "metatile_behavior.h" #include "overworld.h" #include "pokemon.h" -#include "pokemon_debug.h" #include "safari_zone.h" #include "script.h" #include "secret_base.h" @@ -131,14 +130,6 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) input->dpadDirection = DIR_WEST; else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; - - #ifdef P_ENABLE_DEBUG - if ((heldKeys & R_BUTTON) && input->pressedStartButton) - { - input->input_field_1_2 = TRUE; - input->pressedStartButton = FALSE; - } - #endif } int ProcessPlayerFieldInput(struct FieldInput *input) @@ -198,21 +189,6 @@ int ProcessPlayerFieldInput(struct FieldInput *input) if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE) return TRUE; - - #ifdef P_ENABLE_DEBUG - if (input->input_field_1_2) - { - //PlaySE(SE_WIN_OPEN); - //Debug_ShowMainMenu(); - - //PlayRainStoppingSoundEffect(); - CleanupOverworldWindowsAndTilemaps(); - SetMainCallback2(CB2_Debug_Pokemon); - - return TRUE; - } - #endif - return FALSE; } diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 3ffd612ac0..5545feab96 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -28,6 +28,7 @@ #include "palette.h" #include "pokeball.h" #include "pokemon.h" +#include "pokemon_debug.h" #include "pokemon_storage_system.h" #include "pokemon_summary_screen.h" #include "region_map.h" @@ -1555,6 +1556,15 @@ static void Task_HandleInput(u8 taskId) PlaySE(SE_SELECT); BeginCloseSummaryScreen(taskId); } + #ifdef P_ENABLE_DEBUG + else if (JOY_NEW(SELECT_BUTTON)) + { + sMonSummaryScreen->callback = CB2_Debug_Pokemon; + StopPokemonAnimations(); + PlaySE(SE_SELECT); + CloseSummaryScreen(taskId); + } + #endif } } From bf0d2b83930d692c6320707a14c520c8b3f0bbef Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Thu, 2 Dec 2021 19:29:04 +0100 Subject: [PATCH 08/46] Changed definition of P_ENABLE_DEBUG to pokemon_config.h --- include/constants/pokemon_config.h | 2 ++ include/pokemon_debug.h | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/pokemon_config.h b/include/constants/pokemon_config.h index 6d45eb9be8..bca1d5fb75 100644 --- a/include/constants/pokemon_config.h +++ b/include/constants/pokemon_config.h @@ -18,6 +18,8 @@ #define P_UPDATED_EGG_GROUPS GEN_8 // Since Gen 8, certain Pokémon have gained new egg groups. #define P_SHEDINJA_BALL GEN_8 // Since Gen 4, Shedinja requires a Poké Ball for its evolution. In Gen 3, Shedinja inherits Nincada's Ball. +#define P_ENABLE_DEBUG // Enables a debug menu for pokemon sprites and icons, accessed by pressing SELECT in the summary screen. + #ifndef ITEM_EXPANSION //Item Definitions for gEvolutionTable diff --git a/include/pokemon_debug.h b/include/pokemon_debug.h index d70409a6b1..c9bfafc10c 100644 --- a/include/pokemon_debug.h +++ b/include/pokemon_debug.h @@ -1,8 +1,6 @@ #ifndef GUARD_POKEMON_DEBUG_H #define GUARD_POKEMON_DEBUG_H -#define P_ENABLE_DEBUG - void CB2_Debug_Pokemon(void); From 40f7247e119e8a2f7b78c004bdf2d46b27ca16aa Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:02:22 +0100 Subject: [PATCH 09/46] changed P_ENABLE_DEBUG to TRUE/FALSE --- include/constants/pokemon_config.h | 2 +- src/decompress.c | 2 +- src/pokemon_debug.c | 5 ++++- src/pokemon_icon.c | 8 ++++---- src/pokemon_summary_screen.c | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/include/constants/pokemon_config.h b/include/constants/pokemon_config.h index bca1d5fb75..597b96f8ec 100644 --- a/include/constants/pokemon_config.h +++ b/include/constants/pokemon_config.h @@ -18,7 +18,7 @@ #define P_UPDATED_EGG_GROUPS GEN_8 // Since Gen 8, certain Pokémon have gained new egg groups. #define P_SHEDINJA_BALL GEN_8 // Since Gen 4, Shedinja requires a Poké Ball for its evolution. In Gen 3, Shedinja inherits Nincada's Ball. -#define P_ENABLE_DEBUG // Enables a debug menu for pokemon sprites and icons, accessed by pressing SELECT in the summary screen. +#define P_ENABLE_DEBUG TRUE // Enables a debug menu for pokemon sprites and icons, accessed by pressing SELECT in the summary screen. #ifndef ITEM_EXPANSION //Item Definitions for gEvolutionTable diff --git a/src/decompress.c b/src/decompress.c index ba5e4b8429..e852561067 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -114,7 +114,7 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 DrawSpindaSpots(species, personality, dest, isFrontPic); } -#ifdef P_ENABLE_DEBUG +#if P_ENABLE_DEBUG static void LoadSpecialPokePicCustom(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic, bool8 isFemale) { if (species == SPECIES_UNOWN) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 5c632ed610..8543c1c4b9 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -1,4 +1,4 @@ -//Credits: Gamer2020, AsparagusEduardo +//Credits: Gamer2020, AsparagusEduardo, TheXaman #include "global.h" #include "battle.h" #include "battle_anim.h" @@ -118,6 +118,7 @@ static const struct WindowTemplate sPokemonDebugMsgBoxWindowTemplate = .baseBlock = 0x100 }; +#if P_ENABLE_DEBUG //Function declarations static void PrintDigitChars(struct PokemonDebugMenu *data); static void SetUpModifyArrows(struct PokemonDebugMenu *data); @@ -676,3 +677,5 @@ static void Exit_Debug_Pokemon(u8 taskId) m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); } } + +#endif diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 0b7c3203cb..678e193675 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -23,7 +23,7 @@ struct MonIconSpriteTemplate // static functions static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); -#ifdef P_ENABLE_DEBUG +#if P_ENABLE_DEBUG static const u8 *GetMonIconPtrCustom(u16 species, u32 personality, bool8 isFemale); static const u8* GetMonIconTilesCustom(u16 species, bool8 isFemale); #endif @@ -2580,7 +2580,7 @@ u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u return spriteId; } -#ifdef P_ENABLE_DEBUG +#if P_ENABLE_DEBUG u8 CreateMonIconCustom(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool8 isFemale, bool8 isShiny) { u8 spriteId; @@ -2678,7 +2678,7 @@ const u8 *GetMonIconPtr(u16 species, u32 personality) return GetMonIconTiles(GetIconSpecies(species, personality), personality); } -#ifdef P_ENABLE_DEBUG +#if P_ENABLE_DEBUG static const u8 *GetMonIconPtrCustom(u16 species, u32 personality, bool8 isFemale) { return GetMonIconTilesCustom(GetIconSpecies(species, personality), isFemale); @@ -2754,7 +2754,7 @@ const u8* GetMonIconTiles(u16 species, u32 personality) return iconSprite; } -#ifdef P_ENABLE_DEBUG +#if P_ENABLE_DEBUG static const u8* GetMonIconTilesCustom(u16 species, bool8 isFemale) { const u8* iconSprite = gMonIconTable[species]; diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 5545feab96..11da5ce171 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1556,7 +1556,7 @@ static void Task_HandleInput(u8 taskId) PlaySE(SE_SELECT); BeginCloseSummaryScreen(taskId); } - #ifdef P_ENABLE_DEBUG + #if P_ENABLE_DEBUG else if (JOY_NEW(SELECT_BUTTON)) { sMonSummaryScreen->callback = CB2_Debug_Pokemon; From 378152c1a3f5c67c3eb3288f367230158db3abc2 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:41:54 +0100 Subject: [PATCH 10/46] Update src/decompress.c Co-authored-by: LOuroboros --- src/decompress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decompress.c b/src/decompress.c index e852561067..d0ff81a9ed 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -114,7 +114,7 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 DrawSpindaSpots(species, personality, dest, isFrontPic); } -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE static void LoadSpecialPokePicCustom(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic, bool8 isFemale) { if (species == SPECIES_UNOWN) From 5a63cbd527bdeb9b4d312889f19a4541f5f64d0c Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:41:58 +0100 Subject: [PATCH 11/46] Update src/pokemon_icon.c Co-authored-by: LOuroboros --- src/pokemon_icon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 678e193675..49b93fd511 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -23,7 +23,7 @@ struct MonIconSpriteTemplate // static functions static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE static const u8 *GetMonIconPtrCustom(u16 species, u32 personality, bool8 isFemale); static const u8* GetMonIconTilesCustom(u16 species, bool8 isFemale); #endif From 99d03259ff4978eadda3fad2cd98901d1181a2a1 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:42:02 +0100 Subject: [PATCH 12/46] Update src/pokemon_icon.c Co-authored-by: LOuroboros --- src/pokemon_icon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 49b93fd511..4754dba512 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -2580,7 +2580,7 @@ u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u return spriteId; } -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE u8 CreateMonIconCustom(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool8 isFemale, bool8 isShiny) { u8 spriteId; From 44dab3cc9305521228829f9a8339b12439c0e298 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:42:07 +0100 Subject: [PATCH 13/46] Update src/pokemon_icon.c Co-authored-by: LOuroboros --- src/pokemon_icon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 4754dba512..14fe48f730 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -2678,7 +2678,7 @@ const u8 *GetMonIconPtr(u16 species, u32 personality) return GetMonIconTiles(GetIconSpecies(species, personality), personality); } -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE static const u8 *GetMonIconPtrCustom(u16 species, u32 personality, bool8 isFemale) { return GetMonIconTilesCustom(GetIconSpecies(species, personality), isFemale); From 7ff8c1c9ebb021f2b680b846d6af6ed7cff989fb Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:42:11 +0100 Subject: [PATCH 14/46] Update src/pokemon_icon.c Co-authored-by: LOuroboros --- src/pokemon_icon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 14fe48f730..c2d1d5043d 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -2754,7 +2754,7 @@ const u8* GetMonIconTiles(u16 species, u32 personality) return iconSprite; } -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE static const u8* GetMonIconTilesCustom(u16 species, bool8 isFemale) { const u8* iconSprite = gMonIconTable[species]; From 42ed047bc050d4eca97069048d44edbae120a77a Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:42:14 +0100 Subject: [PATCH 15/46] Update src/pokemon_summary_screen.c Co-authored-by: LOuroboros --- src/pokemon_summary_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 11da5ce171..ce1e280bdf 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1556,7 +1556,7 @@ static void Task_HandleInput(u8 taskId) PlaySE(SE_SELECT); BeginCloseSummaryScreen(taskId); } - #if P_ENABLE_DEBUG + #if P_ENABLE_DEBUG == TRUE else if (JOY_NEW(SELECT_BUTTON)) { sMonSummaryScreen->callback = CB2_Debug_Pokemon; From 96b8d21b7a9218723c92178980d45951fc903aba Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Fri, 3 Dec 2021 19:32:31 -0300 Subject: [PATCH 16/46] Added form switching + Button icons --- include/pokemon.h | 2 ++ src/data/pokemon/form_species_tables.h | 2 -- src/pokemon_debug.c | 48 +++++++++++++++++++++----- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index 6a13f7432d..725665b220 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -8,6 +8,7 @@ #include "constants/map_groups.h" #define GET_BASE_SPECIES_ID(speciesId) (GetFormSpeciesId(speciesId, 0)) +#define FORM_SPECIES_END (0xffff) struct PokemonSubstruct0 { @@ -279,6 +280,7 @@ extern const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2]; extern const u16 gLinkPlayerFacilityClasses[]; extern const struct SpriteTemplate gBattlerSpriteTemplates[]; extern const s8 gNatureStatTable[][5]; +extern const u16 *const gFormSpeciesIdTables[NUM_SPECIES]; void ZeroBoxMonData(struct BoxPokemon *boxMon); void ZeroMonData(struct Pokemon *mon); diff --git a/src/data/pokemon/form_species_tables.h b/src/data/pokemon/form_species_tables.h index 89b3f4eec1..810da64997 100644 --- a/src/data/pokemon/form_species_tables.h +++ b/src/data/pokemon/form_species_tables.h @@ -1,5 +1,3 @@ -#define FORM_SPECIES_END (0xffff) - static const u16 sVenusaurFormSpeciesIdTable[] = { SPECIES_VENUSAUR, SPECIES_VENUSAUR_MEGA, diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 8543c1c4b9..406fe239b2 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -1,4 +1,4 @@ -//Credits: Gamer2020, AsparagusEduardo, TheXaman +//Credits: Gamer2020, AsparagusEduardo, TheXaman, ShinyDragonHunter #include "global.h" #include "battle.h" #include "battle_anim.h" @@ -18,6 +18,7 @@ #include "menu.h" #include "overworld.h" #include "palette.h" +#include "pokemon.h" #include "pokemon_animation.h" #include "pokemon_debug.h" #include "pokemon_icon.h" @@ -154,16 +155,28 @@ static void PadString(const u8 *src, u8 *dst) static void PrintInstructionsOnWindow(u8 windowId, struct PokemonDebugMenu *data) { - u8 text[] = _("A - Shiny START - Cry\nL - Back R - Front$"); - u8 textGender[] = _("A - Shiny START - Cry\nL - Back R - Front SEL - Gender$"); + u8 text[] = _("{A_BUTTON} Shiny\n{L_BUTTON} Back {R_BUTTON} Front$"); + u8 textGender[] = _("{A_BUTTON} Shiny\n{L_BUTTON} Back {R_BUTTON} Front {SELECT_BUTTON} Gender$"); + u8 textForms[] = _("{A_BUTTON} Shiny {START_BUTTON} Forms\n{L_BUTTON} Back {R_BUTTON} Front$"); + u8 textGenderForms[] = _("{A_BUTTON} Shiny {START_BUTTON} Forms\n{L_BUTTON} Back {R_BUTTON} Front {SELECT_BUTTON} Gender$"); u16 species = data->modifyArrows.currValue; FillWindowPixelBuffer(windowId, 0x11); if (SpeciesHasGenderDifference[species]) - AddTextPrinterParameterized(windowId, 1, textGender, 0, 0, 0, NULL); + { + if (gFormSpeciesIdTables[data->currentmonId] != NULL) + AddTextPrinterParameterized(windowId, 1, textGenderForms, 0, 0, 0, NULL); + else + AddTextPrinterParameterized(windowId, 1, textGender, 0, 0, 0, NULL); + } else - AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); + { + if (gFormSpeciesIdTables[data->currentmonId] != NULL) + AddTextPrinterParameterized(windowId, 1, textForms, 0, 0, 0, NULL); + else + AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); + } CopyWindowToVram(windowId, 3); } @@ -416,7 +429,7 @@ void CB2_Debug_Pokemon(void) data = AllocZeroed(sizeof(struct PokemonDebugMenu)); SetStructPtr(taskId, data); - data->currentmonId = 1; + data->currentmonId = SPECIES_BULBASAUR; species = data->currentmonId; data->InstructionsWindowId = AddWindow(&sDebugPokemonInstructionsTemplate); @@ -527,10 +540,12 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) if (JOY_NEW(L_BUTTON)) { + PlayCryInternal(data->currentmonId, 0, 120, 10, 0); LaunchAnimationTaskForBackSprite(Backsprite, GetSpeciesBackAnimSet(data->currentmonId)); } else if (JOY_NEW(R_BUTTON)) { + PlayCryInternal(data->currentmonId, 0, 120, 10, 0); if (HasTwoFramesAnimation(data->currentmonId)) StartSpriteAnim(Frontsprite, 1); BattleAnimateFrontSprite(Frontsprite, data->currentmonId, TRUE, 1); @@ -547,13 +562,27 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) } else if (JOY_NEW(B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Exit_Debug_Pokemon; PlaySE(SE_PC_OFF); } else if (JOY_NEW(START_BUTTON)) { - PlayCryInternal(data->currentmonId, 0, 120, 10, 0); + if (gFormSpeciesIdTables[data->currentmonId] != NULL) + { + struct PokemonDebugModifyArrows *modArrows = &data->modifyArrows; + u8 formId = GetFormIdFromFormSpeciesId(data->currentmonId); + if (gFormSpeciesIdTables[data->currentmonId][formId + 1] != FORM_SPECIES_END) + modArrows->currValue = GetFormSpeciesId(data->currentmonId, formId + 1); + else + modArrows->currValue = gFormSpeciesIdTables[data->currentmonId][0]; + + PrintDigitChars(data); + UpdateBattlerValue(data); + ReloadPokemonSprites(data); + while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); + PlaySE(SE_DEX_SCROLL); + } } else if (JOY_NEW(SELECT_BUTTON) && SpeciesHasGenderDifference[data->currentmonId]) { @@ -562,6 +591,7 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) UpdateBattlerValue(data); ReloadPokemonSprites(data); while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); + PlaySE(SE_DEX_SCROLL); } else if (JOY_NEW(DPAD_DOWN)) // || gMain.heldKeys & DPAD_DOWN) { @@ -673,7 +703,7 @@ static void Exit_Debug_Pokemon(u8 taskId) Free(data); FreeMonSpritesGfx(); DestroyTask(taskId); - SetMainCallback2(CB2_ReturnToField); + SetMainCallback2(CB2_ReturnToFieldWithOpenMenu); m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); } } From faca2fbef623b99596c3a77d94cd89fcb5450146 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Fri, 3 Dec 2021 20:24:10 -0300 Subject: [PATCH 17/46] Adjusted Front pic coords so they align to single battle --- src/pokemon_debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 406fe239b2..1c5060f920 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -35,8 +35,8 @@ #include "constants/items.h" //Defines -#define DEBUG_MON_X 140 -#define DEBUG_MON_Y 14 +#define DEBUG_MON_X 137 +#define DEBUG_MON_Y 18 #define DEBUG_MON_BACK_X 32 #define DEBUG_MON_BACK_Y 50 #define DEBUG_ICON_X 158 From 1cf482457573789e806fbf749b5ad05138ebe611 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Sat, 4 Dec 2021 10:57:40 +0100 Subject: [PATCH 18/46] Prevents the debug menu beeing opened in battle and breaking the game --- src/pokemon_summary_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index ce1e280bdf..350bfa29cb 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1557,7 +1557,7 @@ static void Task_HandleInput(u8 taskId) BeginCloseSummaryScreen(taskId); } #if P_ENABLE_DEBUG == TRUE - else if (JOY_NEW(SELECT_BUTTON)) + else if (JOY_NEW(SELECT_BUTTON) && !gMain.inBattle) { sMonSummaryScreen->callback = CB2_Debug_Pokemon; StopPokemonAnimations(); From 6a15b938e982c1cd903e736b0e46ab3d07a9f5bb Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Sat, 4 Dec 2021 12:42:22 +0100 Subject: [PATCH 19/46] front and back sprites now used separate palettes --- src/pokemon_debug.c | 55 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 1c5060f920..7a35cad894 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -18,6 +18,7 @@ #include "menu.h" #include "overworld.h" #include "palette.h" +#include "palette_util.h" #include "pokemon.h" #include "pokemon_animation.h" #include "pokemon_debug.h" @@ -381,6 +382,50 @@ static const struct CompressedSpritePalette *GetMonSpritePalStructCustom(u16 spe } } +void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isShiny, u8 battlerId) +{ + u16 paletteOffset; + const void *lzPaletteData; + const struct CompressedSpritePalette *palette; + + paletteOffset = 0x100 + battlerId * 16; + + palette = GetMonSpritePalStructCustom(species, isFemale, isShiny); + + if (isShiny) + { + if (SpeciesHasGenderDifference[species] && isFemale) + lzPaletteData = gMonShinyPaletteTableFemale[species].data; + else + lzPaletteData = gMonShinyPaletteTable[species].data; + } + else + { + if (SpeciesHasGenderDifference[species] && isFemale) + lzPaletteData = gMonPaletteTableFemale[species].data; + else + lzPaletteData = gMonPaletteTable[species].data; + } + + LZDecompressWram(lzPaletteData, gDecompressionBuffer); + LoadPalette(gDecompressionBuffer, paletteOffset, 0x20); + LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20); + + //if (species == SPECIES_CASTFORM) + //{ + // paletteOffset = 0x100 + battlerId * 16; + // LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); + // LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, 0x20); + //} + + // transform's pink color + //if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) + //{ + // BlendPalette(paletteOffset, 16, 6, RGB_WHITE); + // CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + //} +} + // ******************************* // Main functions void CB2_Debug_Pokemon(void) @@ -439,11 +484,10 @@ void CB2_Debug_Pokemon(void) HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->isFemale); data->isShiny = FALSE; data->isFemale = FALSE; - palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); - LoadCompressedSpritePalette(palette); + BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); - gMultiuseSpriteTemplate.paletteTag = palette->tag; data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X + 32, DEBUG_MON_Y + 40, 0); + gSprites[data->frontspriteId].oam.paletteNum = 1; gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; @@ -666,11 +710,10 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) PrintInstructionsOnWindow(data->InstructionsWindowId, data); HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->isFemale); - palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); - LoadCompressedSpritePalette(palette); + BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); - gMultiuseSpriteTemplate.paletteTag = palette->tag; data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X + 32, DEBUG_MON_Y + 40, 0); + gSprites[data->frontspriteId].oam.paletteNum = 1; gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; From fa435b058c40c15247a5a146d5a23e2768f3b2ff Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Sat, 4 Dec 2021 12:51:36 +0100 Subject: [PATCH 20/46] fixed sprite animations overlapping --- src/pokemon_debug.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 7a35cad894..bb3be1ee87 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -410,20 +410,6 @@ void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isS LZDecompressWram(lzPaletteData, gDecompressionBuffer); LoadPalette(gDecompressionBuffer, paletteOffset, 0x20); LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20); - - //if (species == SPECIES_CASTFORM) - //{ - // paletteOffset = 0x100 + battlerId * 16; - // LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); - // LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, 0x20); - //} - - // transform's pink color - //if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) - //{ - // BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - // CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - //} } // ******************************* @@ -582,12 +568,12 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) struct Sprite *Frontsprite = &gSprites[data->frontspriteId]; struct Sprite *Backsprite = &gSprites[data->backspriteId]; - if (JOY_NEW(L_BUTTON)) + if (JOY_NEW(L_BUTTON) && (Backsprite->callback == SpriteCallbackDummy)) { PlayCryInternal(data->currentmonId, 0, 120, 10, 0); LaunchAnimationTaskForBackSprite(Backsprite, GetSpeciesBackAnimSet(data->currentmonId)); } - else if (JOY_NEW(R_BUTTON)) + else if (JOY_NEW(R_BUTTON) && (Frontsprite->callback == SpriteCallbackDummy)) { PlayCryInternal(data->currentmonId, 0, 120, 10, 0); if (HasTwoFramesAnimation(data->currentmonId)) From 9306b19cedb056451c251c01b58afb4e34dfb409 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Sat, 4 Dec 2021 19:36:51 +0100 Subject: [PATCH 21/46] fixed wrong icon palettes on some icons --- src/pokemon_debug.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index bb3be1ee87..e9a920104a 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -448,7 +448,7 @@ void CB2_Debug_Pokemon(void) AllocateMonSpritesGfx(); LoadPalette(sBgColor, 0, 2); - LoadMonIconPalettes(); + LoadMonIconPalette(SPECIES_BULBASAUR); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); @@ -686,12 +686,10 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) ResetPaletteFade(); FreeAllSpritePalettes(); ResetAllPicSprites(); - AllocateMonSpritesGfx(); - - FreeAllSpritePalettes(); FreeMonIconPalettes(); - LoadMonIconPalettes(); + AllocateMonSpritesGfx(); + LoadMonIconPalette(species); PrintInstructionsOnWindow(data->InstructionsWindowId, data); From f07f31f401e8d14ee2add8c5e1484f16bbe0578a Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Sat, 4 Dec 2021 19:37:35 +0100 Subject: [PATCH 22/46] Update src/pokemon_debug.c Co-authored-by: Eduardo Quezada D'Ottone --- src/pokemon_debug.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index e9a920104a..13971410db 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -36,9 +36,9 @@ #include "constants/items.h" //Defines -#define DEBUG_MON_X 137 -#define DEBUG_MON_Y 18 -#define DEBUG_MON_BACK_X 32 +#define DEBUG_MON_X 144 +#define DEBUG_MON_Y 11 +#define DEBUG_MON_BACK_X 40 #define DEBUG_MON_BACK_Y 50 #define DEBUG_ICON_X 158 #define DEBUG_ICON_Y 90 From 5bef2d0fb2443ae4449944ad89f7bfc387be7e25 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 10 Dec 2021 11:14:25 +0100 Subject: [PATCH 23/46] moved pokemon icon to the top left --- src/pokemon_debug.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 13971410db..a557f6d7c8 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -40,13 +40,13 @@ #define DEBUG_MON_Y 11 #define DEBUG_MON_BACK_X 40 #define DEBUG_MON_BACK_Y 50 -#define DEBUG_ICON_X 158 -#define DEBUG_ICON_Y 90 +#define DEBUG_ICON_X 19//158 + 32 +#define DEBUG_ICON_Y 19//90 + 40 #define DEBUG_MON_SHINY 0 #define DEBUG_MON_NORMAL 9 #define MODIFY_DIGITS_MAX 4 -#define MODIFY_DIGITS_ARROW_X 22 +#define MODIFY_DIGITS_ARROW_X 38 #define MODIFY_DIGITS_ARROW1_Y 12 #define MODIFY_DIGITS_ARROW2_Y 36 @@ -101,7 +101,7 @@ static const struct WindowTemplate sDebugPokemonInstructionsTemplate = static const struct WindowTemplate sModifyWindowTemplate = { .bg = 0, - .tilemapLeft = 2, + .tilemapLeft = 4, .tilemapTop = 2, .width = 14, .height = 2, @@ -488,7 +488,7 @@ void CB2_Debug_Pokemon(void) gSprites[data->backspriteId].oam.priority = 0; //Icon Sprite - data->iconspriteId = CreateMonIconCustom(species, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isShiny, data->isFemale, data->isShiny); + data->iconspriteId = CreateMonIconCustom(species, SpriteCB_MonIcon, DEBUG_ICON_X, DEBUG_ICON_Y, 4, data->isShiny, data->isFemale, data->isShiny); gSprites[data->iconspriteId].oam.priority = 0; //Modify Arrows @@ -712,7 +712,7 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) gSprites[data->backspriteId].oam.priority = 0; //Icon Sprite - data->iconspriteId = CreateMonIconCustom(species, SpriteCB_MonIcon, DEBUG_ICON_X + 32, DEBUG_ICON_Y + 40, 4, data->isShiny, data->isFemale, data->isShiny); + data->iconspriteId = CreateMonIconCustom(species, SpriteCB_MonIcon, DEBUG_ICON_X, DEBUG_ICON_Y, 4, data->isShiny, data->isFemale, data->isShiny); gSprites[data->iconspriteId].oam.priority = 0; //Modify Arrows From 31330bef96932d45b8e64602022a413118268f1d Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 10 Dec 2021 12:29:50 +0100 Subject: [PATCH 24/46] proper Window usage --- src/pokemon_debug.c | 120 +++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 46 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index a557f6d7c8..44a64afae1 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -82,42 +82,53 @@ struct PokemonDebugMenu bool8 isShiny; bool8 isFemale; struct PokemonDebugModifyArrows modifyArrows; - u8 modifyWindowId; - u8 messageBoxWindowId; }; //WindowTemplates -static const struct WindowTemplate sDebugPokemonInstructionsTemplate = +#define WIN_NAME_NUMBERS 0 +#define WIN_INSTRUCTIONS 1 +#define WIN_BACK_SPRITE_LINE 2 +#define WIN_ANIM_INFORMATION 3 +#define WIN_END 4 +static const struct WindowTemplate sPokemonDebugWindowTemplate[] = { - .bg = 0, - .tilemapLeft =1, - .tilemapTop = 207, - .width = 22, - .height = 8, - .paletteNum = 0xF, - .baseBlock = 0x300 -}; - -static const struct WindowTemplate sModifyWindowTemplate = -{ - .bg = 0, - .tilemapLeft = 4, - .tilemapTop = 2, - .width = 14, - .height = 2, - .paletteNum = 0xF, - .baseBlock = 0x200 -}; - -static const struct WindowTemplate sPokemonDebugMsgBoxWindowTemplate = -{ - .bg = 0, - .tilemapLeft = 3, - .tilemapTop = 14, - .width = 11, - .height = 1, - .paletteNum = 0xF, - .baseBlock = 0x100 + [WIN_NAME_NUMBERS] = { + .bg = 0, + .tilemapLeft = 4, + .tilemapTop = 2, + .width = 14, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 1 + 640 + }, + [WIN_INSTRUCTIONS] = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 15, + .width = 15, + .height = 5, + .paletteNum = 0xF, + .baseBlock = 1 + 640 + 28 + }, + [WIN_BACK_SPRITE_LINE] = { + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 14, + .width = 11, + .height = 1, + .paletteNum = 0xF, + .baseBlock = 1 + 640 + 28 + 75 + }, + [WIN_ANIM_INFORMATION] = { + .bg = 0, + .tilemapLeft = 16, + .tilemapTop = 14, + .width = 11, + .height = 1, + .paletteNum = 0xF, + .baseBlock = 1 + 640 + 28 + 75 + 11 + 30 + }, + DUMMY_WIN_TEMPLATE, }; #if P_ENABLE_DEBUG @@ -225,8 +236,8 @@ static void PrintDigitChars(struct PokemonDebugMenu *data) text[i++] = CHAR_SPACE; StringCopy(&text[i], gSpeciesNames[species]); - FillWindowPixelBuffer(data->modifyWindowId, 0x11); - AddTextPrinterParameterized(data->modifyWindowId, 1, text, 3, 0, 0, NULL); + FillWindowPixelBuffer(WIN_NAME_NUMBERS, 0x11); + AddTextPrinterParameterized(WIN_NAME_NUMBERS, 1, text, 3, 0, 0, NULL); } static u32 CharDigitsToValue(u8 *charDigits, u8 maxDigits) @@ -414,6 +425,20 @@ void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isS // ******************************* // Main functions +static void ResetPokemonDebugWindows(void) +{ + u8 i; + + FreeAllWindowBuffers(); + InitWindows(sPokemonDebugWindowTemplate); + + for (i = 0; i < WIN_END + 1; i++) + { + FillWindowPixelBuffer(i, PIXEL_FILL(0)); + PutWindowTilemap(i); + CopyWindowToVram(i, 2); + } +} void CB2_Debug_Pokemon(void) { u8 taskId; @@ -445,6 +470,11 @@ void CB2_Debug_Pokemon(void) gMain.state++; break; case 2: + FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 15); + ResetPokemonDebugWindows(); + gMain.state++; + break; + case 3: AllocateMonSpritesGfx(); LoadPalette(sBgColor, 0, 2); @@ -463,10 +493,10 @@ void CB2_Debug_Pokemon(void) data->currentmonId = SPECIES_BULBASAUR; species = data->currentmonId; - data->InstructionsWindowId = AddWindow(&sDebugPokemonInstructionsTemplate); - PutWindowTilemap(data->InstructionsWindowId); - PrintInstructionsOnWindow(data->InstructionsWindowId, data); + //Print instructions + PrintInstructionsOnWindow(WIN_INSTRUCTIONS, data); + //Front HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->isFemale); data->isShiny = FALSE; data->isFemale = FALSE; @@ -477,6 +507,7 @@ void CB2_Debug_Pokemon(void) gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; + //Back HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); LoadCompressedSpritePalette(palette); @@ -492,21 +523,15 @@ void CB2_Debug_Pokemon(void) gSprites[data->iconspriteId].oam.priority = 0; //Modify Arrows - data->modifyWindowId = AddWindow(&sModifyWindowTemplate); - PutWindowTilemap(data->modifyWindowId); - CopyWindowToVram(data->modifyWindowId, 3); SetUpModifyArrows(data); PrintDigitChars(data); //MessageBox line - data->messageBoxWindowId = AddWindow(&sPokemonDebugMsgBoxWindowTemplate); - PutWindowTilemap(data->messageBoxWindowId); - CopyWindowToVram(data->messageBoxWindowId, 3); - FillWindowPixelRect(data->messageBoxWindowId, PIXEL_FILL(0x2), 0, 0, 90, 4); + FillWindowPixelRect(WIN_BACK_SPRITE_LINE, PIXEL_FILL(0x2), 0, 0, 90, 4); gMain.state++; break; - case 3: + case 4: EnableInterrupts(1); SetVBlankCallback(VBlankCB); SetMainCallback2(CB2_Debug_Runner); @@ -691,8 +716,10 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) AllocateMonSpritesGfx(); LoadMonIconPalette(species); - PrintInstructionsOnWindow(data->InstructionsWindowId, data); + //Update instructions + PrintInstructionsOnWindow(WIN_INSTRUCTIONS, data); + //Front HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->isFemale); BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); @@ -701,6 +728,7 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; + //Back HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); LoadCompressedSpritePalette(palette); From 963642d3090bc2d0ba529aa5dbee844892f27487 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 10 Dec 2021 16:18:39 +0100 Subject: [PATCH 25/46] added the option to change a sprites animation to check which animation fits the best --- src/pokemon.c | 5 +- src/pokemon_debug.c | 340 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 310 insertions(+), 35 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 189fccdea5..9c26a8a196 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1854,8 +1854,11 @@ const s8 gNatureStatTable[NUM_NATURES][NUM_NATURE_STATS] = #include "data/pokemon/form_change_table_pointers.h" // SPECIES_NONE are ignored in the following two tables, so decrement before accessing these arrays to get the right result - +#if P_ENABLE_DEBUG +const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = +#else static const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = +#endif { [SPECIES_BULBASAUR - 1] = ANIM_V_JUMPS_H_JUMPS, [SPECIES_IVYSAUR - 1] = ANIM_V_STRETCH, diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 44a64afae1..4ff6b5dc4d 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -38,15 +38,15 @@ //Defines #define DEBUG_MON_X 144 #define DEBUG_MON_Y 11 -#define DEBUG_MON_BACK_X 40 -#define DEBUG_MON_BACK_Y 50 -#define DEBUG_ICON_X 19//158 + 32 -#define DEBUG_ICON_Y 19//90 + 40 +#define DEBUG_MON_BACK_X 62 +#define DEBUG_MON_BACK_Y 80 +#define DEBUG_ICON_X 19 +#define DEBUG_ICON_Y 19 #define DEBUG_MON_SHINY 0 #define DEBUG_MON_NORMAL 9 #define MODIFY_DIGITS_MAX 4 -#define MODIFY_DIGITS_ARROW_X 38 +#define MODIFY_DIGITS_ARROW_X 41 #define MODIFY_DIGITS_ARROW1_Y 12 #define MODIFY_DIGITS_ARROW2_Y 36 @@ -82,14 +82,17 @@ struct PokemonDebugMenu bool8 isShiny; bool8 isFemale; struct PokemonDebugModifyArrows modifyArrows; + u8 animIdBack; + u8 animIdFront; }; //WindowTemplates #define WIN_NAME_NUMBERS 0 #define WIN_INSTRUCTIONS 1 #define WIN_BACK_SPRITE_LINE 2 -#define WIN_ANIM_INFORMATION 3 -#define WIN_END 4 +#define WIN_ANIM_INFORMATION_FRONT 3 +#define WIN_ANIM_INFORMATION_BACK 4 +#define WIN_END 5 static const struct WindowTemplate sPokemonDebugWindowTemplate[] = { [WIN_NAME_NUMBERS] = { @@ -99,7 +102,7 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = .width = 14, .height = 2, .paletteNum = 0xF, - .baseBlock = 1 + 640 + .baseBlock = 1 }, [WIN_INSTRUCTIONS] = { .bg = 0, @@ -108,30 +111,227 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = .width = 15, .height = 5, .paletteNum = 0xF, - .baseBlock = 1 + 640 + 28 + .baseBlock = 1 + 28 }, [WIN_BACK_SPRITE_LINE] = { .bg = 0, - .tilemapLeft = 3, + .tilemapLeft = 2, .tilemapTop = 14, .width = 11, .height = 1, .paletteNum = 0xF, - .baseBlock = 1 + 640 + 28 + 75 + .baseBlock = 1 + 28 + 75 }, - [WIN_ANIM_INFORMATION] = { + [WIN_ANIM_INFORMATION_FRONT] = { .bg = 0, - .tilemapLeft = 16, - .tilemapTop = 14, - .width = 11, - .height = 1, + .tilemapLeft = 14, + .tilemapTop = 12, + .width = 16, + .height = 3, .paletteNum = 0xF, - .baseBlock = 1 + 640 + 28 + 75 + 11 + 30 + .baseBlock = 1 + 28 + 75 + 11 + }, + [WIN_ANIM_INFORMATION_BACK] = { + .bg = 0, + .tilemapLeft = 14, + .tilemapTop = 15, + .width = 16, + .height = 3, + .paletteNum = 0xF, + .baseBlock = 1 + 28 + 75 + 11 + 48 }, DUMMY_WIN_TEMPLATE, }; #if P_ENABLE_DEBUG +extern const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1]; +const u8 gBackAnimNames[][23 + 1] = +{ + [BACK_ANIM_NONE] = _("NONE"), + [BACK_ANIM_H_VIBRATE] = _("H VIBRATE"), + [BACK_ANIM_H_SLIDE] = _("H SLIDE"), + [BACK_ANIM_H_SPRING] = _("H SPRING"), + [BACK_ANIM_H_SPRING_REPEATED] = _("H SPRING REPEATED"), + [BACK_ANIM_SHRINK_GROW] = _("SHRINK GROW"), + [BACK_ANIM_GROW] = _("GROW"), + [BACK_ANIM_CIRCLE_COUNTERCLOCKWISE] = _("CIRCLE COUNTERCLOCKWISE"), + [BACK_ANIM_H_SHAKE] = _("H SHAKE"), + [BACK_ANIM_V_SHAKE] = _("V SHAKE"), + [BACK_ANIM_V_SHAKE_H_SLIDE] = _("V SHAKE H SLIDE"), + [BACK_ANIM_V_STRETCH] = _("V STRETCH"), + [BACK_ANIM_H_STRETCH] = _("H STRETCH"), + [BACK_ANIM_GROW_STUTTER] = _("GROW STUTTER"), + [BACK_ANIM_V_SHAKE_LOW] = _("V SHAKE LOW"), + [BACK_ANIM_TRIANGLE_DOWN] = _("TRIANGLE DOWN"), + [BACK_ANIM_CONCAVE_ARC_LARGE] = _("CONCAVE ARC LARGE"), + [BACK_ANIM_CONVEX_DOUBLE_ARC] = _("CONVEX DOUBLE ARC"), + [BACK_ANIM_CONCAVE_ARC_SMALL] = _("CONCAVE ARC SMALL"), + [BACK_ANIM_DIP_RIGHT_SIDE] = _("DIP RIGHT SIDE"), + [BACK_ANIM_SHRINK_GROW_VIBRATE] = _("SHRINK GROW VIBRATE"), + [BACK_ANIM_JOLT_RIGHT] = _("JOLT RIGHT"), + [BACK_ANIM_SHAKE_FLASH_YELLOW] = _("SHAKE FLASH YELLOW"), + [BACK_ANIM_SHAKE_GLOW_RED] = _("SHAKE GLOW RED"), + [BACK_ANIM_SHAKE_GLOW_GREEN] = _("SHAKE GLOW GREEN"), + [BACK_ANIM_SHAKE_GLOW_BLUE] = _("SHAKE GLOW BLUE"), +}; +const u8 gFrontAnimNames[][34] = +{ + [ANIM_V_SQUISH_AND_BOUNCE] = _("V SQUISH AND BOUNCE"), + [ANIM_CIRCULAR_STRETCH_TWICE] = _("CIRCULAR STRETCH TWICE"), + [ANIM_H_VIBRATE] = _("H VIBRATE"), + [ANIM_H_SLIDE] = _("H SLIDE"), + [ANIM_V_SLIDE] = _("V SLIDE"), + [ANIM_BOUNCE_ROTATE_TO_SIDES] = _("BOUNCE ROTATE TO SIDES"), + [ANIM_V_JUMPS_H_JUMPS] = _("V JUMPS H JUMPS"), + [ANIM_ROTATE_TO_SIDES] = _("ROTATE TO SIDES"), + [ANIM_ROTATE_TO_SIDES_TWICE] = _("ROTATE TO SIDES TWICE"), + [ANIM_GROW_VIBRATE] = _("GROW VIBRATE"), + [ANIM_ZIGZAG_FAST] = _("ZIGZAG FAST"), + [ANIM_SWING_CONCAVE] = _("SWING CONCAVE"), + [ANIM_SWING_CONCAVE_FAST] = _("SWING CONCAVE FAST"), + [ANIM_SWING_CONVEX] = _("SWING CONVEX"), + [ANIM_SWING_CONVEX_FAST] = _("SWING CONVEX FAST"), + [ANIM_H_SHAKE] = _("H SHAKE"), + [ANIM_V_SHAKE] = _("V SHAKE"), + [ANIM_CIRCULAR_VIBRATE] = _("CIRCULAR VIBRATE"), + [ANIM_TWIST] = _("TWIST"), + [ANIM_SHRINK_GROW] = _("SHRINK GROW"), + [ANIM_CIRCLE_C_CLOCKWISE] = _("CIRCLE C CLOCKWISE"), + [ANIM_GLOW_BLACK] = _("GLOW BLACK"), + [ANIM_H_STRETCH] = _("H STRETCH"), + [ANIM_V_STRETCH] = _("V STRETCH"), + [ANIM_RISING_WOBBLE] = _("RISING WOBBLE"), + [ANIM_V_SHAKE_TWICE] = _("V SHAKE TWICE"), + [ANIM_TIP_MOVE_FORWARD] = _("TIP MOVE FORWARD"), + [ANIM_H_PIVOT] = _("H PIVOT"), + [ANIM_V_SLIDE_WOBBLE] = _("V SLIDE WOBBLE"), + [ANIM_H_SLIDE_WOBBLE] = _("H SLIDE WOBBLE"), + [ANIM_V_JUMPS_BIG] = _("V JUMPS BIG"), + [ANIM_SPIN_LONG] = _("SPIN LONG"), + [ANIM_GLOW_ORANGE] = _("GLOW ORANGE"), + [ANIM_GLOW_RED] = _("GLOW RED"), + [ANIM_GLOW_BLUE] = _("GLOW BLUE"), + [ANIM_GLOW_YELLOW] = _("GLOW YELLOW"), + [ANIM_GLOW_PURPLE] = _("GLOW PURPLE"), + [ANIM_BACK_AND_LUNGE] = _("BACK AND LUNGE"), + [ANIM_BACK_FLIP] = _("BACK FLIP"), + [ANIM_FLICKER] = _("FLICKER"), + [ANIM_BACK_FLIP_BIG] = _("BACK FLIP BIG"), + [ANIM_FRONT_FLIP] = _("FRONT FLIP"), + [ANIM_TUMBLING_FRONT_FLIP] = _("TUMBLING FRONT FLIP"), + [ANIM_FIGURE_8] = _("FIGURE 8"), + [ANIM_FLASH_YELLOW] = _("FLASH YELLOW"), + [ANIM_SWING_CONCAVE_FAST_SHORT] = _("SWING CONCAVE FAST SHORT"), + [ANIM_SWING_CONVEX_FAST_SHORT] = _("SWING CONVEX FAST SHORT"), + [ANIM_ROTATE_UP_SLAM_DOWN] = _("ROTATE UP SLAM DOWN"), + [ANIM_DEEP_V_SQUISH_AND_BOUNCE] = _("DEEP V SQUISH AND BOUNCE"), + [ANIM_H_JUMPS] = _("H JUMPS"), + [ANIM_H_JUMPS_V_STRETCH] = _("H JUMPS V STRETCH"), + [ANIM_ROTATE_TO_SIDES_FAST] = _("ROTATE TO SIDES FAST"), + [ANIM_ROTATE_UP_TO_SIDES] = _("ROTATE UP TO SIDES"), + [ANIM_FLICKER_INCREASING] = _("FLICKER INCREASING"), + [ANIM_TIP_HOP_FORWARD] = _("TIP HOP FORWARD"), + [ANIM_PIVOT_SHAKE] = _("PIVOT SHAKE"), + [ANIM_TIP_AND_SHAKE] = _("TIP AND SHAKE"), + [ANIM_VIBRATE_TO_CORNERS] = _("VIBRATE TO CORNERS"), + [ANIM_GROW_IN_STAGES] = _("GROW IN STAGES"), + [ANIM_V_SPRING] = _("V SPRING"), + [ANIM_V_REPEATED_SPRING] = _("V REPEATED SPRING"), + [ANIM_SPRING_RISING] = _("SPRING RISING"), + [ANIM_H_SPRING] = _("H SPRING"), + [ANIM_H_REPEATED_SPRING_SLOW] = _("H REPEATED SPRING SLOW"), + [ANIM_H_SLIDE_SHRINK] = _("H SLIDE SHRINK"), + [ANIM_LUNGE_GROW] = _("LUNGE GROW"), + [ANIM_CIRCLE_INTO_BG] = _("CIRCLE INTO BG"), + [ANIM_RAPID_H_HOPS] = _("RAPID H HOPS"), + [ANIM_FOUR_PETAL] = _("FOUR PETAL"), + [ANIM_V_SQUISH_AND_BOUNCE_SLOW] = _("V SQUISH AND BOUNCE SLOW"), + [ANIM_H_SLIDE_SLOW] = _("H SLIDE SLOW"), + [ANIM_V_SLIDE_SLOW] = _("V SLIDE SLOW"), + [ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL] = _("BOUNCE ROTATE TO SIDES SMALL"), + [ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW] = _("BOUNCE ROTATE TO SIDES SLOW"), + [ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW] = _("BOUNCE ROTATE TO SIDES SMALL SLOW"), + [ANIM_ZIGZAG_SLOW] = _("ZIGZAG SLOW"), + [ANIM_H_SHAKE_SLOW] = _("H SHAKE SLOW"), + [ANIM_V_SHAKE_SLOW] = _("V SHAKE SLOW"), + [ANIM_TWIST_TWICE] = _("TWIST TWICE"), + [ANIM_CIRCLE_C_CLOCKWISE_SLOW] = _("CIRCLE C CLOCKWISE SLOW"), + [ANIM_V_SHAKE_TWICE_SLOW] = _("V SHAKE TWICE SLOW"), + [ANIM_V_SLIDE_WOBBLE_SMALL] = _("V SLIDE WOBBLE SMALL"), + [ANIM_V_JUMPS_SMALL] = _("V JUMPS SMALL"), + [ANIM_SPIN] = _("SPIN"), + [ANIM_TUMBLING_FRONT_FLIP_TWICE] = _("TUMBLING FRONT FLIP TWICE"), + [ANIM_DEEP_V_SQUISH_AND_BOUNCE_TWICE] = _("DEEP V SQUISH AND BOUNCE TWICE"), + [ANIM_H_JUMPS_V_STRETCH_TWICE] = _("H JUMPS V STRETCH TWICE"), + [ANIM_V_SHAKE_BACK] = _("V SHAKE BACK"), + [ANIM_V_SHAKE_BACK_SLOW] = _("V SHAKE BACK SLOW"), + [ANIM_V_SHAKE_H_SLIDE_SLOW] = _("V SHAKE H SLIDE SLOW"), + [ANIM_V_STRETCH_BOTH_ENDS_SLOW] = _("V STRETCH BOTH ENDS SLOW"), + [ANIM_H_STRETCH_FAR_SLOW] = _("H STRETCH FAR SLOW"), + [ANIM_V_SHAKE_LOW_TWICE] = _("V SHAKE LOW TWICE"), + [ANIM_H_SHAKE_FAST] = _("H SHAKE FAST"), + [ANIM_H_SLIDE_FAST] = _("H SLIDE FAST"), + [ANIM_H_VIBRATE_FAST] = _("H VIBRATE FAST"), + [ANIM_H_VIBRATE_FASTEST] = _("H VIBRATE FASTEST"), + [ANIM_V_SHAKE_BACK_FAST] = _("V SHAKE BACK FAST"), + [ANIM_V_SHAKE_LOW_TWICE_SLOW] = _("V SHAKE LOW TWICE SLOW"), + [ANIM_V_SHAKE_LOW_TWICE_FAST] = _("V SHAKE LOW TWICE FAST"), + [ANIM_CIRCLE_C_CLOCKWISE_LONG] = _("CIRCLE C CLOCKWISE LONG"), + [ANIM_GROW_STUTTER_SLOW] = _("GROW STUTTER SLOW"), + [ANIM_V_SHAKE_H_SLIDE] = _("V SHAKE H SLIDE"), + [ANIM_V_SHAKE_H_SLIDE_FAST] = _("V SHAKE H SLIDE FAST"), + [ANIM_TRIANGLE_DOWN_SLOW] = _("TRIANGLE DOWN SLOW"), + [ANIM_TRIANGLE_DOWN] = _("TRIANGLE DOWN"), + [ANIM_TRIANGLE_DOWN_TWICE] = _("TRIANGLE DOWN TWICE"), + [ANIM_GROW] = _("GROW"), + [ANIM_GROW_TWICE] = _("GROW TWICE"), + [ANIM_H_SPRING_FAST] = _("H SPRING FAST"), + [ANIM_H_SPRING_SLOW] = _("H SPRING SLOW"), + [ANIM_H_REPEATED_SPRING_FAST] = _("H REPEATED SPRING FAST"), + [ANIM_H_REPEATED_SPRING] = _("H REPEATED SPRING"), + [ANIM_SHRINK_GROW_FAST] = _("SHRINK GROW FAST"), + [ANIM_SHRINK_GROW_SLOW] = _("SHRINK GROW SLOW"), + [ANIM_V_STRETCH_BOTH_ENDS] = _("V STRETCH BOTH ENDS"), + [ANIM_V_STRETCH_BOTH_ENDS_TWICE] = _("V STRETCH BOTH ENDS TWICE"), + [ANIM_H_STRETCH_FAR_TWICE] = _("H STRETCH FAR TWICE"), + [ANIM_H_STRETCH_FAR] = _("H STRETCH FAR"), + [ANIM_GROW_STUTTER_TWICE] = _("GROW STUTTER TWICE"), + [ANIM_GROW_STUTTER] = _("GROW STUTTER"), + [ANIM_CONCAVE_ARC_LARGE_SLOW] = _("CONCAVE ARC LARGE SLOW"), + [ANIM_CONCAVE_ARC_LARGE] = _("CONCAVE ARC LARGE"), + [ANIM_CONCAVE_ARC_LARGE_TWICE] = _("CONCAVE ARC LARGE TWICE"), + [ANIM_CONVEX_DOUBLE_ARC_SLOW] = _("CONVEX DOUBLE ARC SLOW"), + [ANIM_CONVEX_DOUBLE_ARC] = _("CONVEX DOUBLE ARC"), + [ANIM_CONVEX_DOUBLE_ARC_TWICE] = _("CONVEX DOUBLE ARC TWICE"), + [ANIM_CONCAVE_ARC_SMALL_SLOW] = _("CONCAVE ARC SMALL SLOW"), + [ANIM_CONCAVE_ARC_SMALL] = _("CONCAVE ARC SMALL"), + [ANIM_CONCAVE_ARC_SMALL_TWICE] = _("CONCAVE ARC SMALL TWICE"), + [ANIM_H_DIP] = _("H DIP"), + [ANIM_H_DIP_FAST] = _("H DIP FAST"), + [ANIM_H_DIP_TWICE] = _("H DIP TWICE"), + [ANIM_SHRINK_GROW_VIBRATE_FAST] = _("SHRINK GROW VIBRATE FAST"), + [ANIM_SHRINK_GROW_VIBRATE] = _("SHRINK GROW VIBRATE"), + [ANIM_SHRINK_GROW_VIBRATE_SLOW] = _("SHRINK GROW VIBRATE SLOW"), + [ANIM_JOLT_RIGHT_FAST] = _("JOLT RIGHT FAST"), + [ANIM_JOLT_RIGHT] = _("JOLT RIGHT"), + [ANIM_JOLT_RIGHT_SLOW] = _("JOLT RIGHT SLOW"), + [ANIM_SHAKE_FLASH_YELLOW_FAST] = _("SHAKE FLASH YELLOW FAST"), + [ANIM_SHAKE_FLASH_YELLOW] = _("SHAKE FLASH YELLOW"), + [ANIM_SHAKE_FLASH_YELLOW_SLOW] = _("SHAKE FLASH YELLOW SLOW"), + [ANIM_SHAKE_GLOW_RED_FAST] = _("SHAKE GLOW RED FAST"), + [ANIM_SHAKE_GLOW_RED] = _("SHAKE GLOW RED"), + [ANIM_SHAKE_GLOW_RED_SLOW] = _("SHAKE GLOW RED SLOW"), + [ANIM_SHAKE_GLOW_GREEN_FAST] = _("SHAKE GLOW GREEN FAST"), + [ANIM_SHAKE_GLOW_GREEN] = _("SHAKE GLOW GREEN"), + [ANIM_SHAKE_GLOW_GREEN_SLOW] = _("SHAKE GLOW GREEN SLOW"), + [ANIM_SHAKE_GLOW_BLUE_FAST] = _("SHAKE GLOW BLUE FAST"), + [ANIM_SHAKE_GLOW_BLUE] = _("SHAKE GLOW BLUE"), + [ANIM_SHAKE_GLOW_BLUE_SLOW] = _("SHAKE GLOW BLUE SLOW"), + [ANIM_SHAKE_GLOW_BLACK_SLOW] = _("SHAKE GLOW BLACK SLOW"), + [ANIM_SHAKE_GLOW_WHITE_SLOW] = _("SHAKE GLOW WHITE SLOW"), + [ANIM_SHAKE_GLOW_PURPLE_SLOW] = _("SHAKE GLOW PURPLE SLOW"), +}; + //Function declarations static void PrintDigitChars(struct PokemonDebugMenu *data); static void SetUpModifyArrows(struct PokemonDebugMenu *data); @@ -167,10 +367,10 @@ static void PadString(const u8 *src, u8 *dst) static void PrintInstructionsOnWindow(u8 windowId, struct PokemonDebugMenu *data) { - u8 text[] = _("{A_BUTTON} Shiny\n{L_BUTTON} Back {R_BUTTON} Front$"); - u8 textGender[] = _("{A_BUTTON} Shiny\n{L_BUTTON} Back {R_BUTTON} Front {SELECT_BUTTON} Gender$"); - u8 textForms[] = _("{A_BUTTON} Shiny {START_BUTTON} Forms\n{L_BUTTON} Back {R_BUTTON} Front$"); - u8 textGenderForms[] = _("{A_BUTTON} Shiny {START_BUTTON} Forms\n{L_BUTTON} Back {R_BUTTON} Front {SELECT_BUTTON} Gender$"); + u8 text[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny$"); + u8 textGender[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny\n{SELECT_BUTTON} Gender$"); + u8 textForms[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny\n{START_BUTTON} Forms$"); + u8 textGenderForms[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny\n{START_BUTTON} Forms {SELECT_BUTTON} Gender$"); u16 species = data->modifyArrows.currValue; @@ -178,16 +378,16 @@ static void PrintInstructionsOnWindow(u8 windowId, struct PokemonDebugMenu *data if (SpeciesHasGenderDifference[species]) { if (gFormSpeciesIdTables[data->currentmonId] != NULL) - AddTextPrinterParameterized(windowId, 1, textGenderForms, 0, 0, 0, NULL); + AddTextPrinterParameterized(windowId, 0, textGenderForms, 0, 0, 0, NULL); else - AddTextPrinterParameterized(windowId, 1, textGender, 0, 0, 0, NULL); + AddTextPrinterParameterized(windowId, 0, textGender, 0, 0, 0, NULL); } else { if (gFormSpeciesIdTables[data->currentmonId] != NULL) - AddTextPrinterParameterized(windowId, 1, textForms, 0, 0, 0, NULL); + AddTextPrinterParameterized(windowId, 0, textForms, 0, 0, 0, NULL); else - AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); + AddTextPrinterParameterized(windowId, 0, text, 0, 0, 0, NULL); } CopyWindowToVram(windowId, 3); } @@ -237,7 +437,7 @@ static void PrintDigitChars(struct PokemonDebugMenu *data) StringCopy(&text[i], gSpeciesNames[species]); FillWindowPixelBuffer(WIN_NAME_NUMBERS, 0x11); - AddTextPrinterParameterized(WIN_NAME_NUMBERS, 1, text, 3, 0, 0, NULL); + AddTextPrinterParameterized(WIN_NAME_NUMBERS, 1, text, 6, 0, 0, NULL); } static u32 CharDigitsToValue(u8 *charDigits, u8 maxDigits) @@ -425,6 +625,29 @@ void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isS // ******************************* // Main functions +static void UpdateMonAnimNames(u8 taskId) +{ + struct PokemonDebugMenu *data = GetStructPtr(taskId); + u8 frontAnim = data->animIdFront; + u8 backAnim = data->animIdBack; + u8 textFront[] = _("FRONT {R_BUTTON} + {DPAD_LEFTRIGHT}$"); + u8 textBack[] = _("BACK {L_BUTTON} + {DPAD_LEFTRIGHT}$"); + u8 text[34]; + u8 fontId = 0; + + //Front + FillWindowPixelBuffer(WIN_ANIM_INFORMATION_FRONT, PIXEL_FILL(0)); + AddTextPrinterParameterized(WIN_ANIM_INFORMATION_FRONT, fontId, textFront, 0, 0, 0, NULL); + StringCopy(text, gFrontAnimNames[frontAnim]); + AddTextPrinterParameterized(WIN_ANIM_INFORMATION_FRONT, fontId, text, 4, 12, 0, NULL); + + //Back + FillWindowPixelBuffer(WIN_ANIM_INFORMATION_BACK, PIXEL_FILL(0)); + AddTextPrinterParameterized(WIN_ANIM_INFORMATION_BACK, fontId, textBack, 0, 0, 0, NULL); + StringCopy(text, gBackAnimNames[backAnim]); + AddTextPrinterParameterized(WIN_ANIM_INFORMATION_BACK, fontId, text, 4, 12, 0, NULL); +} + static void ResetPokemonDebugWindows(void) { u8 i; @@ -434,9 +657,11 @@ static void ResetPokemonDebugWindows(void) for (i = 0; i < WIN_END + 1; i++) { + if (i == WIN_BACK_SPRITE_LINE) + continue; FillWindowPixelBuffer(i, PIXEL_FILL(0)); PutWindowTilemap(i); - CopyWindowToVram(i, 2); + CopyWindowToVram(i, 3); } } void CB2_Debug_Pokemon(void) @@ -514,7 +739,7 @@ void CB2_Debug_Pokemon(void) SetMultiuseSpriteTemplateToPokemon(species, 2); gMultiuseSpriteTemplate.paletteTag = palette->tag; offset_y = gMonBackPicCoords[species].y_offset; - data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 30 + offset_y, 0); + data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X, DEBUG_MON_BACK_Y + offset_y, 0); gSprites[data->backspriteId].callback = SpriteCallbackDummy; gSprites[data->backspriteId].oam.priority = 0; @@ -527,7 +752,14 @@ void CB2_Debug_Pokemon(void) PrintDigitChars(data); //MessageBox line + PutWindowTilemap(WIN_BACK_SPRITE_LINE); FillWindowPixelRect(WIN_BACK_SPRITE_LINE, PIXEL_FILL(0x2), 0, 0, 90, 4); + CopyWindowToVram(WIN_BACK_SPRITE_LINE, 3); + + //Anim names + data->animIdBack = GetSpeciesBackAnimSet(species) + 1; + data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; + UpdateMonAnimNames(taskId); gMain.state++; break; @@ -592,19 +824,54 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) struct PokemonDebugMenu *data = GetStructPtr(taskId); struct Sprite *Frontsprite = &gSprites[data->frontspriteId]; struct Sprite *Backsprite = &gSprites[data->backspriteId]; - - if (JOY_NEW(L_BUTTON) && (Backsprite->callback == SpriteCallbackDummy)) + + //Back + if (JOY_HELD(L_BUTTON) && JOY_NEW(DPAD_LEFT)) + { + if (data->animIdBack <= 1) + data->animIdBack = BACK_ANIM_SHAKE_GLOW_BLUE; + else + data->animIdBack -= 1; + UpdateMonAnimNames(taskId); + } + else if (JOY_HELD(L_BUTTON) && JOY_NEW(DPAD_RIGHT)) + { + if (data->animIdBack >= BACK_ANIM_SHAKE_GLOW_BLUE) + data->animIdBack = 1; + else + data->animIdBack += 1; + UpdateMonAnimNames(taskId); + } + else if (JOY_NEW(L_BUTTON) && (Backsprite->callback == SpriteCallbackDummy)) { PlayCryInternal(data->currentmonId, 0, 120, 10, 0); - LaunchAnimationTaskForBackSprite(Backsprite, GetSpeciesBackAnimSet(data->currentmonId)); + LaunchAnimationTaskForBackSprite(Backsprite, data->animIdBack-1); + } + //Front + else if (JOY_HELD(R_BUTTON) && JOY_NEW(DPAD_LEFT)) + { + if (data->animIdFront <= 0) + data->animIdFront = ANIM_SHAKE_GLOW_PURPLE_SLOW; + else + data->animIdFront -= 1; + UpdateMonAnimNames(taskId); + } + else if (JOY_HELD(R_BUTTON) && JOY_NEW(DPAD_RIGHT)) + { + if (data->animIdFront >= ANIM_SHAKE_GLOW_PURPLE_SLOW) + data->animIdFront = 0; + else + data->animIdFront += 1; + UpdateMonAnimNames(taskId); } else if (JOY_NEW(R_BUTTON) && (Frontsprite->callback == SpriteCallbackDummy)) { PlayCryInternal(data->currentmonId, 0, 120, 10, 0); if (HasTwoFramesAnimation(data->currentmonId)) StartSpriteAnim(Frontsprite, 1); - BattleAnimateFrontSprite(Frontsprite, data->currentmonId, TRUE, 1); + LaunchAnimationTaskForFrontSprite(Frontsprite, data->animIdFront); } + //Rest else if (JOY_NEW(A_BUTTON)) { data->isShiny = !data->isShiny; @@ -656,6 +923,9 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) PrintDigitChars(data); UpdateBattlerValue(data); ReloadPokemonSprites(data); + data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1; + data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; + UpdateMonAnimNames(taskId); } PlaySE(SE_DEX_SCROLL); @@ -670,10 +940,12 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) PrintDigitChars(data); UpdateBattlerValue(data); ReloadPokemonSprites(data); + data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1; + data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; + UpdateMonAnimNames(taskId); } PlaySE(SE_DEX_SCROLL); - } else if (JOY_NEW(DPAD_LEFT)) // || gMain.heldKeys & DPAD_LEFT) { @@ -735,7 +1007,7 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) SetMultiuseSpriteTemplateToPokemon(species, 2); gMultiuseSpriteTemplate.paletteTag = palette->tag; offset_y = gMonBackPicCoords[species].y_offset; - data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X + 32, DEBUG_MON_BACK_Y + 30 + offset_y, 0); + data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X, DEBUG_MON_BACK_Y + offset_y, 0); gSprites[data->backspriteId].callback = SpriteCallbackDummy; gSprites[data->backspriteId].oam.priority = 0; From ef01c401f7abd17ba09c6e5926fdcdf61b2d7fc5 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 10 Dec 2021 17:50:55 +0100 Subject: [PATCH 26/46] another fix for the shared front and back palette --- src/pokemon_debug.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 4ff6b5dc4d..78ab4f8751 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -36,8 +36,8 @@ #include "constants/items.h" //Defines -#define DEBUG_MON_X 144 -#define DEBUG_MON_Y 11 +#define DEBUG_MON_X 144 + 32 +#define DEBUG_MON_Y 11 + 40 #define DEBUG_MON_BACK_X 62 #define DEBUG_MON_BACK_Y 80 #define DEBUG_ICON_X 19 @@ -369,8 +369,8 @@ static void PrintInstructionsOnWindow(u8 windowId, struct PokemonDebugMenu *data { u8 text[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny$"); u8 textGender[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny\n{SELECT_BUTTON} Gender$"); - u8 textForms[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny\n{START_BUTTON} Forms$"); - u8 textGenderForms[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny\n{START_BUTTON} Forms {SELECT_BUTTON} Gender$"); + u8 textForms[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny {START_BUTTON} Forms$"); + u8 textGenderForms[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny {START_BUTTON} Forms\n{SELECT_BUTTON} Gender$"); u16 species = data->modifyArrows.currValue; @@ -721,25 +721,28 @@ void CB2_Debug_Pokemon(void) //Print instructions PrintInstructionsOnWindow(WIN_INSTRUCTIONS, data); + //Palettes + palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); + LoadCompressedSpritePalette(palette); //Front HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->isFemale); data->isShiny = FALSE; data->isFemale = FALSE; BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); - data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X + 32, DEBUG_MON_Y + 40, 0); + gMultiuseSpriteTemplate.paletteTag = palette->tag; + data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X, DEBUG_MON_Y, 0); gSprites[data->frontspriteId].oam.paletteNum = 1; gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; //Back HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); - palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); - LoadCompressedSpritePalette(palette); + BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 4); SetMultiuseSpriteTemplateToPokemon(species, 2); - gMultiuseSpriteTemplate.paletteTag = palette->tag; offset_y = gMonBackPicCoords[species].y_offset; data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X, DEBUG_MON_BACK_Y + offset_y, 0); + gSprites[data->backspriteId].oam.paletteNum = 4; gSprites[data->backspriteId].callback = SpriteCallbackDummy; gSprites[data->backspriteId].oam.priority = 0; @@ -991,23 +994,26 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) //Update instructions PrintInstructionsOnWindow(WIN_INSTRUCTIONS, data); + //Palettes + palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); + LoadCompressedSpritePalette(palette); //Front HandleLoadSpecialPokePicCustom(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, 0, data->isFemale); BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); - data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X + 32, DEBUG_MON_Y + 40, 0); + gMultiuseSpriteTemplate.paletteTag = palette->tag; + data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X, DEBUG_MON_Y, 0); gSprites[data->frontspriteId].oam.paletteNum = 1; gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; //Back HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); - palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); - LoadCompressedSpritePalette(palette); + BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 4); SetMultiuseSpriteTemplateToPokemon(species, 2); - gMultiuseSpriteTemplate.paletteTag = palette->tag; offset_y = gMonBackPicCoords[species].y_offset; data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X, DEBUG_MON_BACK_Y + offset_y, 0); + gSprites[data->backspriteId].oam.paletteNum = 4; gSprites[data->backspriteId].callback = SpriteCallbackDummy; gSprites[data->backspriteId].oam.priority = 0; From 44121b041c51cf6892a73295dd0a6051b740b074 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 10 Dec 2021 20:40:34 +0100 Subject: [PATCH 27/46] added battle bg's and platforms and a function LoadBattleBg to change them --- src/battle_bg.c | 4 + src/pokemon_debug.c | 187 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 167 insertions(+), 24 deletions(-) diff --git a/src/battle_bg.c b/src/battle_bg.c index f739a002f6..65f30243e9 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -598,7 +598,11 @@ const struct WindowTemplate * const gBattleWindowTemplates[] = [B_WIN_TYPE_ARENA] = gBattleArenaWindowTemplates, }; +#if P_ENABLE_DEBUG +const struct BattleBackground sBattleTerrainTable[] = +#else static const struct BattleBackground sBattleTerrainTable[] = +#endif { [BATTLE_TERRAIN_GRASS] = { diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 78ab4f8751..7a9804a048 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -9,6 +9,7 @@ #include "decompress.h" #include "field_weather.h" #include "gpu_regs.h" +#include "graphics.h" #include "item.h" #include "item_icon.h" #include "list_menu.h" @@ -84,15 +85,56 @@ struct PokemonDebugMenu struct PokemonDebugModifyArrows modifyArrows; u8 animIdBack; u8 animIdFront; + u8 battleBgType; + u8 battleTerrain; +}; + +static const struct BgTemplate sBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 24, + .screenSize = 2, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 28, + .screenSize = 2, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 1, + .mapBaseIndex = 30, + .screenSize = 1, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 2, + .mapBaseIndex = 26, + .screenSize = 1, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + }, }; //WindowTemplates #define WIN_NAME_NUMBERS 0 #define WIN_INSTRUCTIONS 1 -#define WIN_BACK_SPRITE_LINE 2 -#define WIN_ANIM_INFORMATION_FRONT 3 -#define WIN_ANIM_INFORMATION_BACK 4 -#define WIN_END 5 +#define WIN_ANIM_INFORMATION_FRONT 2 +#define WIN_ANIM_INFORMATION_BACK 3 +#define WIN_END 4 static const struct WindowTemplate sPokemonDebugWindowTemplate[] = { [WIN_NAME_NUMBERS] = { @@ -113,15 +155,6 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = .paletteNum = 0xF, .baseBlock = 1 + 28 }, - [WIN_BACK_SPRITE_LINE] = { - .bg = 0, - .tilemapLeft = 2, - .tilemapTop = 14, - .width = 11, - .height = 1, - .paletteNum = 0xF, - .baseBlock = 1 + 28 + 75 - }, [WIN_ANIM_INFORMATION_FRONT] = { .bg = 0, .tilemapLeft = 14, @@ -129,7 +162,7 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = .width = 16, .height = 3, .paletteNum = 0xF, - .baseBlock = 1 + 28 + 75 + 11 + .baseBlock = 1 + 28 + 75 }, [WIN_ANIM_INFORMATION_BACK] = { .bg = 0, @@ -138,7 +171,7 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = .width = 16, .height = 3, .paletteNum = 0xF, - .baseBlock = 1 + 28 + 75 + 11 + 48 + .baseBlock = 1 + 28 + 75 + 48 }, DUMMY_WIN_TEMPLATE, }; @@ -623,6 +656,107 @@ void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isS LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20); } +//Battle background functions +struct BattleBackground +{ + const void *tileset; + const void *tilemap; + const void *entryTileset; + const void *entryTilemap; + const void *palette; +}; +extern const struct BattleBackground sBattleTerrainTable[]; +#define MAP_BATTLE_SCENE_NORMAL 0 +#define MAP_BATTLE_SCENE_GYM 1 +#define MAP_BATTLE_SCENE_MAGMA 2 +#define MAP_BATTLE_SCENE_AQUA 3 +#define MAP_BATTLE_SCENE_SIDNEY 4 +#define MAP_BATTLE_SCENE_PHOEBE 5 +#define MAP_BATTLE_SCENE_GLACIA 6 +#define MAP_BATTLE_SCENE_DRAKE 7 +#define MAP_BATTLE_SCENE_FRONTIER 8 +#define MAP_BATTLE_SCENE_LEADER 9 +#define MAP_BATTLE_SCENE_WALLACE 10 +#define MAP_BATTLE_SCENE_GROUDON 11 +#define MAP_BATTLE_SCENE_KYOGRE 12 +#define MAP_BATTLE_SCENE_RAYQUAZA 13 +static void LoadBattleBg(u8 battleBgType, u8 battleTerrain) +{ + switch (battleBgType) + { + default: + case MAP_BATTLE_SCENE_NORMAL: + LZDecompressVram(sBattleTerrainTable[battleTerrain].tileset, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(sBattleTerrainTable[battleTerrain].tilemap, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(sBattleTerrainTable[battleTerrain].palette, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_GYM: + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_MAGMA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_AQUA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_SIDNEY: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_PHOEBE: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_GLACIA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_DRAKE: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_FRONTIER: + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_LEADER: + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_WALLACE: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_StadiumWallace, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_GROUDON: + LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); + case MAP_BATTLE_SCENE_KYOGRE: + LZDecompressVram(gBattleTerrainTiles_Water, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_RAYQUAZA: + LZDecompressVram(gBattleTerrainTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); + LZDecompressVram(gBattleTerrainTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); + LoadCompressedPalette(gBattleTerrainPalette_Rayquaza, 0x20, 0x60); + break; + } +} + // ******************************* // Main functions static void UpdateMonAnimNames(u8 taskId) @@ -657,8 +791,6 @@ static void ResetPokemonDebugWindows(void) for (i = 0; i < WIN_END + 1; i++) { - if (i == WIN_BACK_SPRITE_LINE) - continue; FillWindowPixelBuffer(i, PIXEL_FILL(0)); PutWindowTilemap(i); CopyWindowToVram(i, 3); @@ -692,11 +824,18 @@ void CB2_Debug_Pokemon(void) FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; ResetAllPicSprites(); + //BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + + FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 15); gMain.state++; break; case 2: - FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 15); - ResetPokemonDebugWindows(); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + data->battleTerrain = 0; + data->battleBgType = 0; + LoadBattleBg(data->battleBgType, data->battleTerrain); + + ResetPokemonDebugWindows(); gMain.state++; break; case 3: @@ -708,6 +847,8 @@ void CB2_Debug_Pokemon(void) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); ShowBg(1); + ShowBg(2); + ShowBg(3); //input task handler taskId = CreateTask(Handle_Input_Debug_Pokemon, 0); @@ -754,11 +895,6 @@ void CB2_Debug_Pokemon(void) SetUpModifyArrows(data); PrintDigitChars(data); - //MessageBox line - PutWindowTilemap(WIN_BACK_SPRITE_LINE); - FillWindowPixelRect(WIN_BACK_SPRITE_LINE, PIXEL_FILL(0x2), 0, 0, 90, 4); - CopyWindowToVram(WIN_BACK_SPRITE_LINE, 3); - //Anim names data->animIdBack = GetSpeciesBackAnimSet(species) + 1; data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; @@ -991,6 +1127,9 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) AllocateMonSpritesGfx(); LoadMonIconPalette(species); + //Battle background + LoadBattleBg(data->battleBgType, data->battleTerrain); + //Update instructions PrintInstructionsOnWindow(WIN_INSTRUCTIONS, data); From 8c23ad34ee21993ff01520f5ac7c40adf5d7ddca Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Fri, 10 Dec 2021 20:59:34 +0100 Subject: [PATCH 28/46] fixed --- src/pokemon_debug.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 7a9804a048..b102b1d86f 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -827,14 +827,14 @@ void CB2_Debug_Pokemon(void) //BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 15); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + data->battleBgType = 0; + data->battleTerrain = 0; + LoadBattleBg(data->battleBgType , data->battleTerrain); + gMain.state++; break; case 2: - InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); - data->battleTerrain = 0; - data->battleBgType = 0; - LoadBattleBg(data->battleBgType, data->battleTerrain); - ResetPokemonDebugWindows(); gMain.state++; break; From bbe918941e2c2b367799c3b4d2afd3d8b9e2df0a Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Sat, 11 Dec 2021 12:13:14 +0100 Subject: [PATCH 29/46] added include/constants/pokemon_debug,h for defines, restructured code order --- include/battle_bg.h | 11 ++++ include/constants/pokemon_debug.h | 47 +++++++++++++++ include/pokemon_debug.h | 33 +++++++++++ src/battle_bg.c | 2 + src/pokemon_debug.c | 99 ++++--------------------------- 5 files changed, 106 insertions(+), 86 deletions(-) create mode 100644 include/constants/pokemon_debug.h diff --git a/include/battle_bg.h b/include/battle_bg.h index 167ea5cf74..cfa69a92ac 100644 --- a/include/battle_bg.h +++ b/include/battle_bg.h @@ -1,6 +1,17 @@ #ifndef GUARD_BATTLE_BG_H #define GUARD_BATTLE_BG_H +#if P_ENABLE_DEBUG +struct BattleBackground +{ + const void *tileset; + const void *tilemap; + const void *entryTileset; + const void *entryTilemap; + const void *palette; +}; +#endif + void BattleInitBgsAndWindows(void); void InitBattleBgsVideo(void); void LoadBattleMenuWindowGfx(void); diff --git a/include/constants/pokemon_debug.h b/include/constants/pokemon_debug.h new file mode 100644 index 0000000000..b8ea284bce --- /dev/null +++ b/include/constants/pokemon_debug.h @@ -0,0 +1,47 @@ +#ifndef GUARD_CONSTANTS_POKEMON_DEBUG_H +#define GUARD_CONSTANTS_POKEMON_DEBUG_H + +//Defines +#define DEBUG_MON_X 144 + 32 +#define DEBUG_MON_Y 11 + 40 +#define DEBUG_MON_BACK_X 62 +#define DEBUG_MON_BACK_Y 80 +#define DEBUG_ICON_X 19 +#define DEBUG_ICON_Y 19 +#define DEBUG_MON_SHINY 0 +#define DEBUG_MON_NORMAL 9 + +#define MODIFY_DIGITS_MAX 4 +#define MODIFY_DIGITS_ARROW_X 41 +#define MODIFY_DIGITS_ARROW1_Y 12 +#define MODIFY_DIGITS_ARROW2_Y 36 + +#define GENDER_MALE 0 +#define GENDER_FEMALE 1 +#define MON_PIC_BACK 0 +#define MON_PIC_FRONT 1 + +//Windows +#define WIN_NAME_NUMBERS 0 +#define WIN_INSTRUCTIONS 1 +#define WIN_ANIM_INFORMATION_FRONT 2 +#define WIN_ANIM_INFORMATION_BACK 3 +#define WIN_END 4 + +//Battle backgrounds +#define MAP_BATTLE_SCENE_NORMAL 0 +#define MAP_BATTLE_SCENE_GYM 1 +#define MAP_BATTLE_SCENE_MAGMA 2 +#define MAP_BATTLE_SCENE_AQUA 3 +#define MAP_BATTLE_SCENE_SIDNEY 4 +#define MAP_BATTLE_SCENE_PHOEBE 5 +#define MAP_BATTLE_SCENE_GLACIA 6 +#define MAP_BATTLE_SCENE_DRAKE 7 +#define MAP_BATTLE_SCENE_FRONTIER 8 +#define MAP_BATTLE_SCENE_LEADER 9 +#define MAP_BATTLE_SCENE_WALLACE 10 +#define MAP_BATTLE_SCENE_GROUDON 11 +#define MAP_BATTLE_SCENE_KYOGRE 12 +#define MAP_BATTLE_SCENE_RAYQUAZA 13 + +#endif // GUARD_CONSTANTS_POKEMON_DEBUG_H \ No newline at end of file diff --git a/include/pokemon_debug.h b/include/pokemon_debug.h index c9bfafc10c..7157ffbe19 100644 --- a/include/pokemon_debug.h +++ b/include/pokemon_debug.h @@ -1,6 +1,39 @@ #ifndef GUARD_POKEMON_DEBUG_H #define GUARD_POKEMON_DEBUG_H +#include "constants/pokemon_debug.h" + +//Structs +struct PokemonDebugModifyArrows +{ + u8 arrowSpriteId[2]; + u16 minValue; + u16 maxValue; + int currValue; + u8 currentDigit; + u8 maxDigits; + u8 charDigits[MODIFY_DIGITS_MAX]; + void *modifiedValPtr; + u8 typeOfVal; +}; + +struct PokemonDebugMenu +{ + u16 currentmonId; + u8 currentmonWindowId; + u8 InstructionsWindowId; + u8 frontspriteId; + u8 backspriteId; + u8 iconspriteId; + bool8 isShiny; + bool8 isFemale; + struct PokemonDebugModifyArrows modifyArrows; + u8 animIdBack; + u8 animIdFront; + u8 battleBgType; + u8 battleTerrain; +}; + void CB2_Debug_Pokemon(void); diff --git a/src/battle_bg.c b/src/battle_bg.c index 65f30243e9..298a3565a8 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -24,6 +24,7 @@ #include "constants/songs.h" #include "constants/trainers.h" +#if !P_ENABLE_DEBUG struct BattleBackground { const void *tileset; @@ -32,6 +33,7 @@ struct BattleBackground const void *entryTilemap; const void *palette; }; +#endif // .rodata static const u16 sUnrefArray[] = {0x0300, 0x0000}; //OamData? diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index b102b1d86f..4a391182e3 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -32,63 +32,24 @@ #include "string_util.h" #include "strings.h" #include "task.h" +#include "text_window.h" #include "trainer_pokemon_sprites.h" #include "constants/items.h" -//Defines -#define DEBUG_MON_X 144 + 32 -#define DEBUG_MON_Y 11 + 40 -#define DEBUG_MON_BACK_X 62 -#define DEBUG_MON_BACK_Y 80 -#define DEBUG_ICON_X 19 -#define DEBUG_ICON_Y 19 -#define DEBUG_MON_SHINY 0 -#define DEBUG_MON_NORMAL 9 - -#define MODIFY_DIGITS_MAX 4 -#define MODIFY_DIGITS_ARROW_X 41 -#define MODIFY_DIGITS_ARROW1_Y 12 -#define MODIFY_DIGITS_ARROW2_Y 36 - -#define GENDER_MALE 0 -#define GENDER_FEMALE 1 -#define MON_PIC_BACK 0 -#define MON_PIC_FRONT 1 - +#if P_ENABLE_DEBUG +extern const struct BattleBackground sBattleTerrainTable[]; +extern const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1]; static const u16 sBgColor[] = {RGB_WHITE}; -//Structs -struct PokemonDebugModifyArrows +static struct PokemonDebugMenu *GetStructPtr(u8 taskId) { - u8 arrowSpriteId[2]; - u16 minValue; - u16 maxValue; - int currValue; - u8 currentDigit; - u8 maxDigits; - u8 charDigits[MODIFY_DIGITS_MAX]; - void *modifiedValPtr; - u8 typeOfVal; -}; + u8 *taskDataPtr = (u8*)(&gTasks[taskId].data[0]); -struct PokemonDebugMenu -{ - u16 currentmonId; - u8 currentmonWindowId; - u8 InstructionsWindowId; - u8 frontspriteId; - u8 backspriteId; - u8 iconspriteId; - bool8 isShiny; - bool8 isFemale; - struct PokemonDebugModifyArrows modifyArrows; - u8 animIdBack; - u8 animIdFront; - u8 battleBgType; - u8 battleTerrain; -}; + return (struct PokemonDebugMenu*)(T1_READ_PTR(taskDataPtr)); +} +//BgTemplates static const struct BgTemplate sBgTemplates[] = { { @@ -130,11 +91,6 @@ static const struct BgTemplate sBgTemplates[] = }; //WindowTemplates -#define WIN_NAME_NUMBERS 0 -#define WIN_INSTRUCTIONS 1 -#define WIN_ANIM_INFORMATION_FRONT 2 -#define WIN_ANIM_INFORMATION_BACK 3 -#define WIN_END 4 static const struct WindowTemplate sPokemonDebugWindowTemplate[] = { [WIN_NAME_NUMBERS] = { @@ -176,8 +132,7 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = DUMMY_WIN_TEMPLATE, }; -#if P_ENABLE_DEBUG -extern const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1]; +//Lookup tables const u8 gBackAnimNames[][23 + 1] = { [BACK_ANIM_NONE] = _("NONE"), @@ -377,13 +332,6 @@ static void Handle_Input_Debug_Pokemon(u8); static void ReloadPokemonSprites(struct PokemonDebugMenu *data); static void Exit_Debug_Pokemon(u8); -static struct PokemonDebugMenu *GetStructPtr(u8 taskId) -{ - u8 *taskDataPtr = (u8*)(&gTasks[taskId].data[0]); - - return (struct PokemonDebugMenu*)(T1_READ_PTR(taskDataPtr)); -} - //Text handling functions static void PadString(const u8 *src, u8 *dst) { @@ -657,29 +605,6 @@ void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isS } //Battle background functions -struct BattleBackground -{ - const void *tileset; - const void *tilemap; - const void *entryTileset; - const void *entryTilemap; - const void *palette; -}; -extern const struct BattleBackground sBattleTerrainTable[]; -#define MAP_BATTLE_SCENE_NORMAL 0 -#define MAP_BATTLE_SCENE_GYM 1 -#define MAP_BATTLE_SCENE_MAGMA 2 -#define MAP_BATTLE_SCENE_AQUA 3 -#define MAP_BATTLE_SCENE_SIDNEY 4 -#define MAP_BATTLE_SCENE_PHOEBE 5 -#define MAP_BATTLE_SCENE_GLACIA 6 -#define MAP_BATTLE_SCENE_DRAKE 7 -#define MAP_BATTLE_SCENE_FRONTIER 8 -#define MAP_BATTLE_SCENE_LEADER 9 -#define MAP_BATTLE_SCENE_WALLACE 10 -#define MAP_BATTLE_SCENE_GROUDON 11 -#define MAP_BATTLE_SCENE_KYOGRE 12 -#define MAP_BATTLE_SCENE_RAYQUAZA 13 static void LoadBattleBg(u8 battleBgType, u8 battleTerrain) { switch (battleBgType) @@ -796,6 +721,7 @@ static void ResetPokemonDebugWindows(void) CopyWindowToVram(i, 3); } } + void CB2_Debug_Pokemon(void) { u8 taskId; @@ -824,7 +750,8 @@ void CB2_Debug_Pokemon(void) FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; ResetAllPicSprites(); - //BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + LoadPalette(GetTextWindowPalette(0), 15*16, 0x40); FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 15); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); From 51371661c2aa4bccdc75e436d54e9f8ae215825b Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Sat, 11 Dec 2021 15:03:56 +0100 Subject: [PATCH 30/46] Added new menu naviagtion, now all options can be changed --- include/constants/pokemon_debug.h | 18 +- include/pokemon_debug.h | 10 + src/pokemon_debug.c | 531 +++++++++++++++++++++--------- 3 files changed, 400 insertions(+), 159 deletions(-) diff --git a/include/constants/pokemon_debug.h b/include/constants/pokemon_debug.h index b8ea284bce..326c5d052b 100644 --- a/include/constants/pokemon_debug.h +++ b/include/constants/pokemon_debug.h @@ -6,15 +6,19 @@ #define DEBUG_MON_Y 11 + 40 #define DEBUG_MON_BACK_X 62 #define DEBUG_MON_BACK_Y 80 -#define DEBUG_ICON_X 19 -#define DEBUG_ICON_Y 19 +#define DEBUG_ICON_X 220 +#define DEBUG_ICON_Y 140 #define DEBUG_MON_SHINY 0 #define DEBUG_MON_NORMAL 9 #define MODIFY_DIGITS_MAX 4 -#define MODIFY_DIGITS_ARROW_X 41 -#define MODIFY_DIGITS_ARROW1_Y 12 -#define MODIFY_DIGITS_ARROW2_Y 36 +#define MODIFY_DIGITS_ARROW_X 129 +#define MODIFY_DIGITS_ARROW1_Y 94 +#define MODIFY_DIGITS_ARROW2_Y 113 + +#define OPTIONS_ARROW_1_X 4 +#define OPTIONS_ARROW_2_X 236 +#define OPTIONS_ARROW_Y 119 #define GENDER_MALE 0 #define GENDER_FEMALE 1 @@ -24,8 +28,8 @@ //Windows #define WIN_NAME_NUMBERS 0 #define WIN_INSTRUCTIONS 1 -#define WIN_ANIM_INFORMATION_FRONT 2 -#define WIN_ANIM_INFORMATION_BACK 3 +#define WIN_BOTTOM_LEFT 2 +#define WIN_BOTTOM_RIGHT 3 #define WIN_END 4 //Battle backgrounds diff --git a/include/pokemon_debug.h b/include/pokemon_debug.h index 7157ffbe19..0d550c79ff 100644 --- a/include/pokemon_debug.h +++ b/include/pokemon_debug.h @@ -17,6 +17,13 @@ struct PokemonDebugModifyArrows u8 typeOfVal; }; +struct PokemonDebugOptionArrows +{ + u8 arrowSpriteId[2]; + u8 currentDigit; + void *modifiedValPtr; +}; + struct PokemonDebugMenu { u16 currentmonId; @@ -28,10 +35,13 @@ struct PokemonDebugMenu bool8 isShiny; bool8 isFemale; struct PokemonDebugModifyArrows modifyArrows; + struct PokemonDebugOptionArrows optionArrows; u8 animIdBack; u8 animIdFront; u8 battleBgType; u8 battleTerrain; + bool8 inSubmenu; + u8 submenuYpos; }; void CB2_Debug_Pokemon(void); diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 4a391182e3..df9ebf4d6f 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -95,39 +95,39 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = { [WIN_NAME_NUMBERS] = { .bg = 0, - .tilemapLeft = 4, - .tilemapTop = 2, - .width = 14, + .tilemapLeft = 15, + .tilemapTop = 12, + .width = 15, .height = 2, .paletteNum = 0xF, .baseBlock = 1 }, [WIN_INSTRUCTIONS] = { .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 15, + .tilemapLeft = 0, + .tilemapTop = 0, .width = 15, - .height = 5, + .height = 4, .paletteNum = 0xF, - .baseBlock = 1 + 28 + .baseBlock = 1 + 30 }, - [WIN_ANIM_INFORMATION_FRONT] = { + [WIN_BOTTOM_LEFT] = { .bg = 0, - .tilemapLeft = 14, - .tilemapTop = 12, - .width = 16, - .height = 3, + .tilemapLeft = 1, + .tilemapTop = 14, + .width = 5, + .height = 6, .paletteNum = 0xF, - .baseBlock = 1 + 28 + 75 + .baseBlock = 1 + 30 + 60 }, - [WIN_ANIM_INFORMATION_BACK] = { + [WIN_BOTTOM_RIGHT] = { .bg = 0, - .tilemapLeft = 14, - .tilemapTop = 15, - .width = 16, - .height = 3, + .tilemapLeft = 6, + .tilemapTop = 14, + .width = 25, + .height = 6, .paletteNum = 0xF, - .baseBlock = 1 + 28 + 75 + 48 + .baseBlock = 1 + 30 + 60 + 30 }, DUMMY_WIN_TEMPLATE, }; @@ -319,7 +319,36 @@ const u8 gFrontAnimNames[][34] = [ANIM_SHAKE_GLOW_WHITE_SLOW] = _("SHAKE GLOW WHITE SLOW"), [ANIM_SHAKE_GLOW_PURPLE_SLOW] = _("SHAKE GLOW PURPLE SLOW"), }; - +const u8 gBattleBackgroundNames[][30] = +{ + [MAP_BATTLE_SCENE_NORMAL] = _("NORMAL "), + [MAP_BATTLE_SCENE_GYM] = _("GYM "), + [MAP_BATTLE_SCENE_MAGMA] = _("MAGMA "), + [MAP_BATTLE_SCENE_AQUA] = _("AQUA "), + [MAP_BATTLE_SCENE_SIDNEY] = _("SIDNEY "), + [MAP_BATTLE_SCENE_PHOEBE] = _("PHOEBE "), + [MAP_BATTLE_SCENE_GLACIA] = _("GLACIA "), + [MAP_BATTLE_SCENE_DRAKE] = _("DRAKE "), + [MAP_BATTLE_SCENE_FRONTIER] = _("FRONTIER "), + [MAP_BATTLE_SCENE_LEADER] = _("LEADER "), + [MAP_BATTLE_SCENE_WALLACE] = _("WALLACE "), + [MAP_BATTLE_SCENE_GROUDON] = _("GROUDON "), + [MAP_BATTLE_SCENE_KYOGRE] = _("KYOGRE "), + [MAP_BATTLE_SCENE_RAYQUAZA] = _("RAYQUAZA "), +}; +const u8 gBattleBackgroundTerrainNames[][26] = +{ + [BATTLE_TERRAIN_GRASS] = _("NORMAL - GRASS "), + [BATTLE_TERRAIN_LONG_GRASS] = _("NORMAL - LONG GRASS "), + [BATTLE_TERRAIN_SAND] = _("NORMAL - SAND "), + [BATTLE_TERRAIN_UNDERWATER] = _("NORMAL - UNDERWATER "), + [BATTLE_TERRAIN_WATER] = _("NORMAL - WATER "), + [BATTLE_TERRAIN_POND] = _("NORMAL - POND "), + [BATTLE_TERRAIN_MOUNTAIN] = _("NORMAL - MOUNTAIN "), + [BATTLE_TERRAIN_CAVE] = _("NORMAL - CAVE "), + [BATTLE_TERRAIN_BUILDING] = _("NORMAL - BUILDING "), + [BATTLE_TERRAIN_PLAIN] = _("NORMAL - PLAIN "), +}; //Function declarations static void PrintDigitChars(struct PokemonDebugMenu *data); static void SetUpModifyArrows(struct PokemonDebugMenu *data); @@ -346,31 +375,45 @@ static void PadString(const u8 *src, u8 *dst) dst[i] = EOS; } -static void PrintInstructionsOnWindow(u8 windowId, struct PokemonDebugMenu *data) +static void PrintInstructionsOnWindow(struct PokemonDebugMenu *data) { - u8 text[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny$"); - u8 textGender[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny\n{SELECT_BUTTON} Gender$"); - u8 textForms[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny {START_BUTTON} Forms$"); - u8 textGenderForms[] = _("{L_BUTTON} Back {R_BUTTON} Front\n{A_BUTTON} Shiny {START_BUTTON} Forms\n{SELECT_BUTTON} Gender$"); + u8 fontId = 0; + u8 x = 2; + u8 textInstructions[] = _("{START_BUTTON} Shiny\n{B_BUTTON} Exit {A_BUTTON} Submenu$"); + u8 textInstructionsGender[] = _("{START_BUTTON} Shiny {SELECT_BUTTON} Gender\n{B_BUTTON} Exit {A_BUTTON} Submenu$"); + u8 textInstructionsInSubmenu[] = _("{START_BUTTON} Shiny\n{B_BUTTON} Back$"); + u8 textInstructionsInSubmenuGender[] = _("{START_BUTTON} Shiny {SELECT_BUTTON} Gender\n{B_BUTTON} Back$"); + + u8 textBottom[] = _("BACK:\nFRONT:\nBG:$"); + u8 textBottomForms[] = _("BACK:\nFRONT:\nBG:\nFORMS:$"); u16 species = data->modifyArrows.currValue; - - FillWindowPixelBuffer(windowId, 0x11); - if (SpeciesHasGenderDifference[species]) + //Instruction window + FillWindowPixelBuffer(WIN_INSTRUCTIONS, 0x11); + if (data->inSubmenu) { - if (gFormSpeciesIdTables[data->currentmonId] != NULL) - AddTextPrinterParameterized(windowId, 0, textGenderForms, 0, 0, 0, NULL); + if (SpeciesHasGenderDifference[species]) + AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsInSubmenuGender, x, 0, 0, NULL); else - AddTextPrinterParameterized(windowId, 0, textGender, 0, 0, 0, NULL); + AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsInSubmenu, x, 0, 0, NULL); } else { - if (gFormSpeciesIdTables[data->currentmonId] != NULL) - AddTextPrinterParameterized(windowId, 0, textForms, 0, 0, 0, NULL); + if (SpeciesHasGenderDifference[species]) + AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsGender, x, 0, 0, NULL); else - AddTextPrinterParameterized(windowId, 0, text, 0, 0, 0, NULL); + AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructions, x, 0, 0, NULL); + } + CopyWindowToVram(WIN_INSTRUCTIONS, 3); + + //Bottom left text + if (gFormSpeciesIdTables[data->currentmonId] != NULL) + AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottomForms, 0, 0, 0, NULL); + else + { + FillWindowPixelBuffer(WIN_BOTTOM_LEFT, PIXEL_FILL(0)); + AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottom, 0, 0, 0, NULL); } - CopyWindowToVram(windowId, 3); } static void VBlankCB(void) @@ -462,6 +505,15 @@ static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) charDigits[i] = valueDigits[i] + CHAR_0; } +static void SetArrowInvisibility(struct PokemonDebugMenu *data) +{ + bool8 invisible = data->inSubmenu; + gSprites[data->modifyArrows.arrowSpriteId[0]].invisible = invisible; + gSprites[data->modifyArrows.arrowSpriteId[1]].invisible = invisible; + gSprites[data->optionArrows.arrowSpriteId[0]].invisible = !invisible; + //gSprites[data->optionArrows.arrowSpriteId[1]].invisible = !invisible; +} + static void SetUpModifyArrows(struct PokemonDebugMenu *data) { LoadSpritePalette(&sSpritePalette_Arrow); @@ -480,6 +532,19 @@ static void SetUpModifyArrows(struct PokemonDebugMenu *data) ValueToCharDigits(data->modifyArrows.charDigits, data->modifyArrows.currValue, data->modifyArrows.maxDigits); } +static void SetUpOptionArrows(struct PokemonDebugMenu *data) +{ + LoadSpritePalette(&sSpritePalette_Arrow); + data->optionArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_1_X, OPTIONS_ARROW_Y, 0); + //data->optionArrows.arrowSpriteId[1] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_2_X, OPTIONS_ARROW_Y, 0); + gSprites[data->optionArrows.arrowSpriteId[0]].animNum = 2; + + data->optionArrows.currentDigit = 0; + + gSprites[data->optionArrows.arrowSpriteId[0]].invisible = TRUE; + //gSprites[data->optionArrows.arrowSpriteId[1]].invisible = TRUE; +} + static bool32 TryMoveDigit(struct PokemonDebugModifyArrows *modArrows, bool32 moveUp) { s32 i; @@ -681,6 +746,71 @@ static void LoadBattleBg(u8 battleBgType, u8 battleTerrain) break; } } +static void PrintBattleBgName(u8 taskId) +{ + struct PokemonDebugMenu *data = GetStructPtr(taskId); + u8 fontId = 0; + u8 text[30+1]; + + if (data->battleBgType == 0) + StringCopy(text, gBattleBackgroundTerrainNames[data->battleTerrain]); + else + StringCopy(text, gBattleBackgroundNames[data->battleBgType]); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 0, 24, 0, NULL); +} +static void UpdateBattleBg(u8 taskId, bool8 increment) +{ + struct PokemonDebugMenu *data = GetStructPtr(taskId); + + if (data->battleBgType == 0) + { + if (increment) + { + if (data->battleTerrain == BATTLE_TERRAIN_PLAIN) + data->battleBgType += 1; + else + data->battleTerrain += 1; + } + else + { + if (data->battleTerrain == BATTLE_TERRAIN_GRASS) + data->battleBgType = MAP_BATTLE_SCENE_RAYQUAZA; + else + data->battleTerrain -= 1; + } + } + else if (data->battleBgType == MAP_BATTLE_SCENE_GYM) + { + if (increment) + data->battleBgType += 1; + else + { + data->battleBgType = MAP_BATTLE_SCENE_NORMAL; + data->battleTerrain = BATTLE_TERRAIN_PLAIN; + } + } + else if (data->battleBgType == MAP_BATTLE_SCENE_RAYQUAZA) + { + if (increment) + { + data->battleBgType = MAP_BATTLE_SCENE_NORMAL; + data->battleTerrain = BATTLE_TERRAIN_GRASS; + } + else + data->battleBgType -= 1; + } + else + { + if (increment) + data->battleBgType += 1; + else + data->battleBgType -= 1; + } + + PrintBattleBgName(taskId); + + LoadBattleBg(data->battleBgType, data->battleTerrain); +} // ******************************* // Main functions @@ -689,22 +819,23 @@ static void UpdateMonAnimNames(u8 taskId) struct PokemonDebugMenu *data = GetStructPtr(taskId); u8 frontAnim = data->animIdFront; u8 backAnim = data->animIdBack; - u8 textFront[] = _("FRONT {R_BUTTON} + {DPAD_LEFTRIGHT}$"); - u8 textBack[] = _("BACK {L_BUTTON} + {DPAD_LEFTRIGHT}$"); u8 text[34]; u8 fontId = 0; + u8 textL[] = _("{L_BUTTON}"); + u8 textR[] = _("{R_BUTTON}"); - //Front - FillWindowPixelBuffer(WIN_ANIM_INFORMATION_FRONT, PIXEL_FILL(0)); - AddTextPrinterParameterized(WIN_ANIM_INFORMATION_FRONT, fontId, textFront, 0, 0, 0, NULL); - StringCopy(text, gFrontAnimNames[frontAnim]); - AddTextPrinterParameterized(WIN_ANIM_INFORMATION_FRONT, fontId, text, 4, 12, 0, NULL); + FillWindowPixelBuffer(WIN_BOTTOM_RIGHT, PIXEL_FILL(0)); //Back - FillWindowPixelBuffer(WIN_ANIM_INFORMATION_BACK, PIXEL_FILL(0)); - AddTextPrinterParameterized(WIN_ANIM_INFORMATION_BACK, fontId, textBack, 0, 0, 0, NULL); StringCopy(text, gBackAnimNames[backAnim]); - AddTextPrinterParameterized(WIN_ANIM_INFORMATION_BACK, fontId, text, 4, 12, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textL, 0, 0, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 20, 0, 0, NULL); + //Front + StringCopy(text, gFrontAnimNames[frontAnim]); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textR, 0, 12, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 20, 12, 0, NULL); + + PrintBattleBgName(taskId); } static void ResetPokemonDebugWindows(void) @@ -762,7 +893,7 @@ void CB2_Debug_Pokemon(void) gMain.state++; break; case 2: - ResetPokemonDebugWindows(); + ResetPokemonDebugWindows(); gMain.state++; break; case 3: @@ -787,7 +918,7 @@ void CB2_Debug_Pokemon(void) species = data->currentmonId; //Print instructions - PrintInstructionsOnWindow(WIN_INSTRUCTIONS, data); + PrintInstructionsOnWindow(data); //Palettes palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); @@ -822,11 +953,17 @@ void CB2_Debug_Pokemon(void) SetUpModifyArrows(data); PrintDigitChars(data); + //Option Arrows + SetUpOptionArrows(data); + //Anim names data->animIdBack = GetSpeciesBackAnimSet(species) + 1; data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; UpdateMonAnimNames(taskId); + //BattleNg Name + PrintBattleBgName(taskId); + gMain.state++; break; case 4: @@ -885,60 +1022,102 @@ static void ResetBGs_Debug_Menu(u16 a) } } +static void UpdateSubmenuOptionValue(u8 taskId, bool8 increment) +{ + struct PokemonDebugMenu *data = GetStructPtr(taskId); + u8 option = data->submenuYpos; + + switch (option) + { + case 0: + if (increment) + { + if (data->animIdBack >= BACK_ANIM_SHAKE_GLOW_BLUE) + data->animIdBack = 1; + else + data->animIdBack += 1; + } + else + { + if (data->animIdBack <= 1) + data->animIdBack = BACK_ANIM_SHAKE_GLOW_BLUE; + else + data->animIdBack -= 1; + } + UpdateMonAnimNames(taskId); + break; + case 1: + if (increment) + { + if (data->animIdFront >= ANIM_SHAKE_GLOW_PURPLE_SLOW) + data->animIdFront = 0; + else + data->animIdFront += 1; + } + else + { + if (data->animIdFront <= 0) + data->animIdFront = ANIM_SHAKE_GLOW_PURPLE_SLOW; + else + data->animIdFront -= 1; + } + UpdateMonAnimNames(taskId); + break; + case 2: + UpdateBattleBg(taskId, increment); + break; + case 3: + if (gFormSpeciesIdTables[data->currentmonId] != NULL) + { + struct PokemonDebugModifyArrows *modArrows = &data->modifyArrows; + u8 formId = GetFormIdFromFormSpeciesId(data->currentmonId); + if (increment) + { + if (gFormSpeciesIdTables[data->currentmonId][formId + 1] != FORM_SPECIES_END) + modArrows->currValue = GetFormSpeciesId(data->currentmonId, formId + 1); + else + modArrows->currValue = gFormSpeciesIdTables[data->currentmonId][0]; + } + else + { + if (gFormSpeciesIdTables[data->currentmonId][formId] == gFormSpeciesIdTables[data->currentmonId][0]) + modArrows->currValue = gFormSpeciesIdTables[data->currentmonId][0]; + else + modArrows->currValue = GetFormSpeciesId(data->currentmonId, formId - 1); + } + + UpdateBattlerValue(data); + ReloadPokemonSprites(data); + while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); + PlaySE(SE_DEX_SCROLL); + } + break; + default: + break; + } +} + + static void Handle_Input_Debug_Pokemon(u8 taskId) { struct PokemonDebugMenu *data = GetStructPtr(taskId); struct Sprite *Frontsprite = &gSprites[data->frontspriteId]; struct Sprite *Backsprite = &gSprites[data->backspriteId]; - - //Back - if (JOY_HELD(L_BUTTON) && JOY_NEW(DPAD_LEFT)) - { - if (data->animIdBack <= 1) - data->animIdBack = BACK_ANIM_SHAKE_GLOW_BLUE; - else - data->animIdBack -= 1; - UpdateMonAnimNames(taskId); - } - else if (JOY_HELD(L_BUTTON) && JOY_NEW(DPAD_RIGHT)) - { - if (data->animIdBack >= BACK_ANIM_SHAKE_GLOW_BLUE) - data->animIdBack = 1; - else - data->animIdBack += 1; - UpdateMonAnimNames(taskId); - } - else if (JOY_NEW(L_BUTTON) && (Backsprite->callback == SpriteCallbackDummy)) + + if (JOY_NEW(L_BUTTON) && (Backsprite->callback == SpriteCallbackDummy)) { PlayCryInternal(data->currentmonId, 0, 120, 10, 0); LaunchAnimationTaskForBackSprite(Backsprite, data->animIdBack-1); } - //Front - else if (JOY_HELD(R_BUTTON) && JOY_NEW(DPAD_LEFT)) - { - if (data->animIdFront <= 0) - data->animIdFront = ANIM_SHAKE_GLOW_PURPLE_SLOW; - else - data->animIdFront -= 1; - UpdateMonAnimNames(taskId); - } - else if (JOY_HELD(R_BUTTON) && JOY_NEW(DPAD_RIGHT)) - { - if (data->animIdFront >= ANIM_SHAKE_GLOW_PURPLE_SLOW) - data->animIdFront = 0; - else - data->animIdFront += 1; - UpdateMonAnimNames(taskId); - } - else if (JOY_NEW(R_BUTTON) && (Frontsprite->callback == SpriteCallbackDummy)) + + if (JOY_NEW(R_BUTTON) && (Frontsprite->callback == SpriteCallbackDummy)) { PlayCryInternal(data->currentmonId, 0, 120, 10, 0); if (HasTwoFramesAnimation(data->currentmonId)) StartSpriteAnim(Frontsprite, 1); LaunchAnimationTaskForFrontSprite(Frontsprite, data->animIdFront); } - //Rest - else if (JOY_NEW(A_BUTTON)) + if (JOY_NEW(START_BUTTON)) { data->isShiny = !data->isShiny; @@ -948,31 +1127,7 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) ReloadPokemonSprites(data); } - else if (JOY_NEW(B_BUTTON)) - { - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); - gTasks[taskId].func = Exit_Debug_Pokemon; - PlaySE(SE_PC_OFF); - } - else if (JOY_NEW(START_BUTTON)) - { - if (gFormSpeciesIdTables[data->currentmonId] != NULL) - { - struct PokemonDebugModifyArrows *modArrows = &data->modifyArrows; - u8 formId = GetFormIdFromFormSpeciesId(data->currentmonId); - if (gFormSpeciesIdTables[data->currentmonId][formId + 1] != FORM_SPECIES_END) - modArrows->currValue = GetFormSpeciesId(data->currentmonId, formId + 1); - else - modArrows->currValue = gFormSpeciesIdTables[data->currentmonId][0]; - - PrintDigitChars(data); - UpdateBattlerValue(data); - ReloadPokemonSprites(data); - while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); - PlaySE(SE_DEX_SCROLL); - } - } - else if (JOY_NEW(SELECT_BUTTON) && SpeciesHasGenderDifference[data->currentmonId]) + if (JOY_NEW(SELECT_BUTTON) && SpeciesHasGenderDifference[data->currentmonId]) { data->isFemale = !data->isFemale; PrintDigitChars(data); @@ -981,54 +1136,120 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); PlaySE(SE_DEX_SCROLL); } - else if (JOY_NEW(DPAD_DOWN)) // || gMain.heldKeys & DPAD_DOWN) + + if (!data->inSubmenu) { - if (TryMoveDigit(&data->modifyArrows, FALSE)) + if (JOY_NEW(A_BUTTON)) { - data->isFemale = FALSE; - PrintDigitChars(data); - UpdateBattlerValue(data); - ReloadPokemonSprites(data); - data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1; - data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; - UpdateMonAnimNames(taskId); + data->inSubmenu = TRUE; + SetArrowInvisibility(data); + PrintInstructionsOnWindow(data); + } + else if (JOY_NEW(B_BUTTON)) + { + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = Exit_Debug_Pokemon; + PlaySE(SE_PC_OFF); + } + else if (JOY_NEW(DPAD_DOWN)) + { + if (TryMoveDigit(&data->modifyArrows, FALSE)) + { + data->isFemale = FALSE; + PrintDigitChars(data); + UpdateBattlerValue(data); + ReloadPokemonSprites(data); + data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1; + data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; + UpdateMonAnimNames(taskId); + } + PlaySE(SE_DEX_SCROLL); + while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); + } + else if (JOY_NEW(DPAD_UP)) + { + if (TryMoveDigit(&data->modifyArrows, TRUE)) + { + data->isFemale = FALSE; + PrintDigitChars(data); + UpdateBattlerValue(data); + ReloadPokemonSprites(data); + data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1; + data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; + UpdateMonAnimNames(taskId); + } + + PlaySE(SE_DEX_SCROLL); + } + else if (JOY_NEW(DPAD_LEFT)) + { + if (data->modifyArrows.currentDigit != 0) + { + data->modifyArrows.currentDigit--; + gSprites[data->modifyArrows.arrowSpriteId[0]].x2 -= 6; + gSprites[data->modifyArrows.arrowSpriteId[1]].x2 -= 6; + } + } + else if (JOY_NEW(DPAD_RIGHT)) + { + if (data->modifyArrows.currentDigit != (data->modifyArrows.maxDigits - 1)) + { + data->modifyArrows.currentDigit++; + gSprites[data->modifyArrows.arrowSpriteId[0]].x2 += 6; + gSprites[data->modifyArrows.arrowSpriteId[1]].x2 += 6; + } } - PlaySE(SE_DEX_SCROLL); - - while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); } - else if (JOY_NEW(DPAD_UP)) // || gMain.heldKeys & DPAD_UP) + else //Submenu { - if (TryMoveDigit(&data->modifyArrows, TRUE)) + if (JOY_NEW(B_BUTTON)) { - data->isFemale = FALSE; - PrintDigitChars(data); - UpdateBattlerValue(data); - ReloadPokemonSprites(data); - data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1; - data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; - UpdateMonAnimNames(taskId); + data->inSubmenu = FALSE; + if (data->submenuYpos == 3) + { + data->submenuYpos = 2; + data->optionArrows.currentDigit = data->submenuYpos; + gSprites[data->optionArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; + } + SetArrowInvisibility(data); + PrintInstructionsOnWindow(data); } - - PlaySE(SE_DEX_SCROLL); - } - else if (JOY_NEW(DPAD_LEFT)) // || gMain.heldKeys & DPAD_LEFT) - { - if (data->modifyArrows.currentDigit != 0) + else if (JOY_NEW(DPAD_DOWN)) { - data->modifyArrows.currentDigit--; - gSprites[data->modifyArrows.arrowSpriteId[0]].x2 -= 6; - gSprites[data->modifyArrows.arrowSpriteId[1]].x2 -= 6; + data->submenuYpos += 1; + if (data->submenuYpos >= 3) + { + if ((gFormSpeciesIdTables[data->currentmonId] == NULL) || (data->submenuYpos >= 4)) + data->submenuYpos = 0; + } + data->optionArrows.currentDigit = data->submenuYpos; + gSprites[data->optionArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; + //gSprites[data->optionArrows.arrowSpriteId[1]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; } - } - else if (JOY_NEW(DPAD_RIGHT)) // || gMain.heldKeys & DPAD_RIGHT) - { - if (data->modifyArrows.currentDigit != (data->modifyArrows.maxDigits - 1)) + else if (JOY_NEW(DPAD_UP)) { - data->modifyArrows.currentDigit++; - gSprites[data->modifyArrows.arrowSpriteId[0]].x2 += 6; - gSprites[data->modifyArrows.arrowSpriteId[1]].x2 += 6; + if (data->submenuYpos == 0) + { + if (gFormSpeciesIdTables[data->currentmonId] != NULL) + data->submenuYpos = 3; + else + data->submenuYpos = 2; + } + else + data->submenuYpos -= 1; + + data->optionArrows.currentDigit = data->submenuYpos; + gSprites[data->optionArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; + //gSprites[data->optionArrows.arrowSpriteId[1]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; + } + else if (JOY_NEW(DPAD_LEFT)) + { + UpdateSubmenuOptionValue(taskId, FALSE); + } + else if (JOY_NEW(DPAD_RIGHT)) + { + UpdateSubmenuOptionValue(taskId, TRUE); } } } @@ -1054,11 +1275,8 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) AllocateMonSpritesGfx(); LoadMonIconPalette(species); - //Battle background - LoadBattleBg(data->battleBgType, data->battleTerrain); - //Update instructions - PrintInstructionsOnWindow(WIN_INSTRUCTIONS, data); + PrintInstructionsOnWindow(data); //Palettes palette = GetMonSpritePalStructCustom(species, data->isFemale, data->isShiny); @@ -1092,6 +1310,15 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) data->modifyArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, MODIFY_DIGITS_ARROW_X + (data->modifyArrows.currentDigit * 6), MODIFY_DIGITS_ARROW1_Y, 0); data->modifyArrows.arrowSpriteId[1] = CreateSprite(&sSpriteTemplate_Arrow, MODIFY_DIGITS_ARROW_X + (data->modifyArrows.currentDigit * 6), MODIFY_DIGITS_ARROW2_Y, 0); gSprites[data->modifyArrows.arrowSpriteId[1]].animNum = 1; + + //Option Arrows + LoadSpritePalette(&sSpritePalette_Arrow); + data->optionArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_1_X, OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12, 0); + //data->optionArrows.arrowSpriteId[1] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_2_X, OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12, 0); + gSprites[data->optionArrows.arrowSpriteId[0]].animNum = 2; + + //Arrow invisibility + SetArrowInvisibility(data); } static void Exit_Debug_Pokemon(u8 taskId) From a249737e0ebd84107b5c40ba55a0fd10918e1f7a Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Sat, 11 Dec 2021 15:06:54 +0100 Subject: [PATCH 31/46] removed dead code (arrows dont have a left animation) --- src/pokemon_debug.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index df9ebf4d6f..6acd566dd1 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -511,7 +511,6 @@ static void SetArrowInvisibility(struct PokemonDebugMenu *data) gSprites[data->modifyArrows.arrowSpriteId[0]].invisible = invisible; gSprites[data->modifyArrows.arrowSpriteId[1]].invisible = invisible; gSprites[data->optionArrows.arrowSpriteId[0]].invisible = !invisible; - //gSprites[data->optionArrows.arrowSpriteId[1]].invisible = !invisible; } static void SetUpModifyArrows(struct PokemonDebugMenu *data) @@ -536,13 +535,11 @@ static void SetUpOptionArrows(struct PokemonDebugMenu *data) { LoadSpritePalette(&sSpritePalette_Arrow); data->optionArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_1_X, OPTIONS_ARROW_Y, 0); - //data->optionArrows.arrowSpriteId[1] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_2_X, OPTIONS_ARROW_Y, 0); gSprites[data->optionArrows.arrowSpriteId[0]].animNum = 2; data->optionArrows.currentDigit = 0; gSprites[data->optionArrows.arrowSpriteId[0]].invisible = TRUE; - //gSprites[data->optionArrows.arrowSpriteId[1]].invisible = TRUE; } static bool32 TryMoveDigit(struct PokemonDebugModifyArrows *modArrows, bool32 moveUp) @@ -1225,7 +1222,6 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) } data->optionArrows.currentDigit = data->submenuYpos; gSprites[data->optionArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; - //gSprites[data->optionArrows.arrowSpriteId[1]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; } else if (JOY_NEW(DPAD_UP)) { @@ -1241,7 +1237,6 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) data->optionArrows.currentDigit = data->submenuYpos; gSprites[data->optionArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; - //gSprites[data->optionArrows.arrowSpriteId[1]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; } else if (JOY_NEW(DPAD_LEFT)) { @@ -1314,7 +1309,6 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) //Option Arrows LoadSpritePalette(&sSpritePalette_Arrow); data->optionArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_1_X, OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12, 0); - //data->optionArrows.arrowSpriteId[1] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_2_X, OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12, 0); gSprites[data->optionArrows.arrowSpriteId[0]].animNum = 2; //Arrow invisibility From 123969f093907507207135ffc69e673ceac569af Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Mon, 13 Dec 2021 15:05:17 +0100 Subject: [PATCH 32/46] fixed front sprite position including elevation and shadow for flying mon's (shadow palette too dark atm) --- include/constants/pokemon_debug.h | 2 - include/pokemon_debug.h | 1 + src/battle_anim_mons.c | 8 +++ src/pokemon_debug.c | 109 +++++++++++++++++++++++++++--- 4 files changed, 110 insertions(+), 10 deletions(-) diff --git a/include/constants/pokemon_debug.h b/include/constants/pokemon_debug.h index 326c5d052b..e9e1a58a34 100644 --- a/include/constants/pokemon_debug.h +++ b/include/constants/pokemon_debug.h @@ -2,8 +2,6 @@ #define GUARD_CONSTANTS_POKEMON_DEBUG_H //Defines -#define DEBUG_MON_X 144 + 32 -#define DEBUG_MON_Y 11 + 40 #define DEBUG_MON_BACK_X 62 #define DEBUG_MON_BACK_Y 80 #define DEBUG_ICON_X 220 diff --git a/include/pokemon_debug.h b/include/pokemon_debug.h index 0d550c79ff..1b8db76c12 100644 --- a/include/pokemon_debug.h +++ b/include/pokemon_debug.h @@ -32,6 +32,7 @@ struct PokemonDebugMenu u8 frontspriteId; u8 backspriteId; u8 iconspriteId; + u8 frontShadowSpriteId; bool8 isShiny; bool8 isFemale; struct PokemonDebugModifyArrows modifyArrows; diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 3b6cc0e918..86479aac5a 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -35,7 +35,11 @@ static void CreateBattlerTrace(struct Task *task, u8 taskId); EWRAM_DATA static union AffineAnimCmd *sAnimTaskAffineAnim = NULL; +#if P_ENABLE_DEBUG +const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] = +#else static const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] = +#endif { { // Single battle { 72, 80 }, @@ -60,7 +64,11 @@ const struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS] = [CASTFORM_ICE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8 }, }; +#if P_ENABLE_DEBUG +const u8 sCastformElevations[NUM_CASTFORM_FORMS] = +#else static const u8 sCastformElevations[NUM_CASTFORM_FORMS] = +#endif { [CASTFORM_NORMAL] = 13, [CASTFORM_FIRE] = 14, diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 6acd566dd1..44e1124fc1 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -2,6 +2,7 @@ #include "global.h" #include "battle.h" #include "battle_anim.h" +#include "battle_gfx_sfx_util.h" #include "bg.h" #include "constants/rgb.h" #include "constants/songs.h" @@ -39,6 +40,11 @@ #if P_ENABLE_DEBUG extern const struct BattleBackground sBattleTerrainTable[]; +extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; +extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; +extern const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] ; +extern const struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS]; +extern const u8 sCastformElevations[NUM_CASTFORM_FORMS]; extern const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1]; static const u16 sBgColor[] = {RGB_WHITE}; @@ -666,6 +672,84 @@ void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isS LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20); } +static bool8 IsCastformForm(species) +{ + if (species == SPECIES_CASTFORM || species == SPECIES_CASTFORM_SUNNY || species == SPECIES_CASTFORM_RAINY || species == SPECIES_CASTFORM_SNOWY) + return TRUE; + + return FALSE; +} + +static u8 GetCastformYCustom(species) +{ + u8 ret; + switch (species) + { + case SPECIES_CASTFORM: + ret = gCastformFrontSpriteCoords[CASTFORM_NORMAL].y_offset; + break; + case SPECIES_CASTFORM_SUNNY: + ret = gCastformFrontSpriteCoords[CASTFORM_FIRE].y_offset; + break; + case SPECIES_CASTFORM_RAINY: + ret = gCastformFrontSpriteCoords[CASTFORM_WATER].y_offset; + break; + case SPECIES_CASTFORM_SNOWY: + ret = gCastformFrontSpriteCoords[CASTFORM_ICE].y_offset; + break; + } + return ret; +} + +u8 GetBattlerSpriteFinal_YCustom(u16 species) +{ + u16 offset; + u8 y; + + if (IsCastformForm(species)) + offset = GetCastformYCustom(species); + else + offset = gMonFrontPicCoords[species].y_offset; + + + if (IsCastformForm(species)) + offset -= sCastformElevations[species]; + else + offset -= gEnemyMonElevation[species]; + + + y = offset + sBattlerCoords[0][1].y; + + if (y > DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8) + y = DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8; + + return y; +} + +void SpriteCB_EnemyShadowCustom(struct Sprite *shadowSprite) +{ + bool8 invisible = FALSE; + u8 frontSpriteId = shadowSprite->data[0]; + struct Sprite *battlerSprite = &gSprites[frontSpriteId]; + + shadowSprite->x = battlerSprite->x; + shadowSprite->x2 = battlerSprite->x2; + shadowSprite->invisible = invisible; +} +static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonDebugMenu *data, u8 x, u8 y, u16 species) +{ + if (gEnemyMonElevation[species] == 0) + return; + LoadCompressedSpriteSheet(&gSpriteSheet_EnemyShadow); + + data->frontShadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, x, y + 29, 0xC8); + gSprites[data->frontShadowSpriteId].data[0] = data->frontspriteId; + + gSprites[data->frontShadowSpriteId].callback = SpriteCB_EnemyShadowCustom; + gSprites[data->frontShadowSpriteId].oam.priority = 0; + gSprites[data->frontShadowSpriteId].invisible = FALSE; +} + //Battle background functions static void LoadBattleBg(u8 battleBgType, u8 battleTerrain) { @@ -855,8 +939,10 @@ void CB2_Debug_Pokemon(void) u8 taskId; const struct CompressedSpritePalette *palette; struct PokemonDebugMenu *data; - s16 offset_x, offset_y; u16 species; + s16 offset_y; + u8 front_x = sBattlerCoords[0][1].x; + u8 front_y; switch (gMain.state) { @@ -927,10 +1013,13 @@ void CB2_Debug_Pokemon(void) BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; - data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X, DEBUG_MON_Y, 0); + front_y = GetBattlerSpriteFinal_YCustom(species); + data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, front_x, front_y, 0); gSprites[data->frontspriteId].oam.paletteNum = 1; gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; + //Front Shadow + LoadAndCreateEnemyShadowSpriteCustom(data, front_x, front_y, species); //Back HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); @@ -1251,10 +1340,11 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) static void ReloadPokemonSprites(struct PokemonDebugMenu *data) { - s16 offset_x = 0; - s16 offset_y = 0; - u16 species = data->currentmonId; const struct CompressedSpritePalette *palette; + u16 species = data->currentmonId; + s16 offset_y; + u8 front_x = sBattlerCoords[0][1].x; + u8 front_y; DestroySprite(&gSprites[data->frontspriteId]); DestroySprite(&gSprites[data->backspriteId]); @@ -1281,18 +1371,21 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; - data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_X, DEBUG_MON_Y, 0); + front_y = GetBattlerSpriteFinal_YCustom(species); + data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, front_x, front_y, 0); gSprites[data->frontspriteId].oam.paletteNum = 1; gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; + //Front Shadow + LoadAndCreateEnemyShadowSpriteCustom(data, front_x, front_y, species); //Back HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); - BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 4); + BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 5); SetMultiuseSpriteTemplateToPokemon(species, 2); offset_y = gMonBackPicCoords[species].y_offset; data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, DEBUG_MON_BACK_X, DEBUG_MON_BACK_Y + offset_y, 0); - gSprites[data->backspriteId].oam.paletteNum = 4; + gSprites[data->backspriteId].oam.paletteNum = 5; gSprites[data->backspriteId].callback = SpriteCallbackDummy; gSprites[data->backspriteId].oam.priority = 0; From e33abe6213678fca7c60fc2c8865110e9c6651c0 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Mon, 13 Dec 2021 15:13:51 +0100 Subject: [PATCH 33/46] fixed castform elevation calculation --- src/pokemon_debug.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 44e1124fc1..ec493a4a54 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -674,7 +674,7 @@ void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isS static bool8 IsCastformForm(species) { - if (species == SPECIES_CASTFORM || species == SPECIES_CASTFORM_SUNNY || species == SPECIES_CASTFORM_RAINY || species == SPECIES_CASTFORM_SNOWY) + if (species == SPECIES_CASTFORM_SUNNY || species == SPECIES_CASTFORM_RAINY || species == SPECIES_CASTFORM_SNOWY) return TRUE; return FALSE; @@ -706,14 +706,12 @@ u8 GetBattlerSpriteFinal_YCustom(u16 species) u16 offset; u8 y; - if (IsCastformForm(species)) - offset = GetCastformYCustom(species); - else - offset = gMonFrontPicCoords[species].y_offset; + offset = gMonFrontPicCoords[species].y_offset; - - if (IsCastformForm(species)) - offset -= sCastformElevations[species]; + if (species == SPECIES_CASTFORM) + offset -= sCastformElevations[0]; + else if (IsCastformForm(species)) + offset -= sCastformElevations[species - SPECIES_CASTFORM_SUNNY + 1]; else offset -= gEnemyMonElevation[species]; @@ -738,7 +736,7 @@ void SpriteCB_EnemyShadowCustom(struct Sprite *shadowSprite) } static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonDebugMenu *data, u8 x, u8 y, u16 species) { - if (gEnemyMonElevation[species] == 0) + if (gEnemyMonElevation[species] == 0 && !IsCastformForm(species)) return; LoadCompressedSpriteSheet(&gSpriteSheet_EnemyShadow); From d300b8f56c63e9ae7796362bc7278e35925a56a7 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Mon, 13 Dec 2021 15:37:06 +0100 Subject: [PATCH 34/46] fixed front sprite shadow palette --- src/battle_gfx_sfx_util.c | 4 ++++ src/pokemon_debug.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 5667731e9e..508e250c15 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -77,7 +77,11 @@ static const struct CompressedSpriteSheet sSpriteSheets_HealthBar[MAX_BATTLERS_C {gBlankGfxCompressed, 0x0120, TAG_HEALTHBAR_OPPONENT2_TILE} }; +#if P_ENABLE_DEBUG +const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2] = +#else static const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2] = +#endif { {gBattleInterface_BallStatusBarPal, TAG_HEALTHBOX_PAL}, {gBattleInterface_BallDisplayPal, TAG_HEALTHBAR_PAL} diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index ec493a4a54..fd442386b4 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -42,6 +42,7 @@ extern const struct BattleBackground sBattleTerrainTable[]; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; +extern const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2]; extern const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] ; extern const struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS]; extern const u8 sCastformElevations[NUM_CASTFORM_FORMS]; @@ -739,6 +740,7 @@ static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonDebugMenu *data, if (gEnemyMonElevation[species] == 0 && !IsCastformForm(species)) return; LoadCompressedSpriteSheet(&gSpriteSheet_EnemyShadow); + LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); data->frontShadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, x, y + 29, 0xC8); gSprites[data->frontShadowSpriteId].data[0] = data->frontspriteId; From d113d5efd94867c2aec1cdd5197cfa29ccbad230 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Mon, 13 Dec 2021 18:56:50 +0100 Subject: [PATCH 35/46] Update include/battle_bg.h Co-authored-by: LOuroboros --- include/battle_bg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/battle_bg.h b/include/battle_bg.h index cfa69a92ac..075159148d 100644 --- a/include/battle_bg.h +++ b/include/battle_bg.h @@ -1,7 +1,7 @@ #ifndef GUARD_BATTLE_BG_H #define GUARD_BATTLE_BG_H -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE struct BattleBackground { const void *tileset; From a334f7f5e07ccb785e32eaa7b722b709ca093f2a Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Mon, 13 Dec 2021 18:58:13 +0100 Subject: [PATCH 36/46] changed all missed ones to `#if P_ENABLE_DEBUG == TRUE` @LOuroboros --- src/battle_anim_mons.c | 4 ++-- src/battle_bg.c | 2 +- src/battle_gfx_sfx_util.c | 2 +- src/pokemon.c | 2 +- src/pokemon_debug.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 86479aac5a..adc664c3a3 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -35,7 +35,7 @@ static void CreateBattlerTrace(struct Task *task, u8 taskId); EWRAM_DATA static union AffineAnimCmd *sAnimTaskAffineAnim = NULL; -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] = #else static const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] = @@ -64,7 +64,7 @@ const struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS] = [CASTFORM_ICE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8 }, }; -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE const u8 sCastformElevations[NUM_CASTFORM_FORMS] = #else static const u8 sCastformElevations[NUM_CASTFORM_FORMS] = diff --git a/src/battle_bg.c b/src/battle_bg.c index 298a3565a8..9d9b26627d 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -600,7 +600,7 @@ const struct WindowTemplate * const gBattleWindowTemplates[] = [B_WIN_TYPE_ARENA] = gBattleArenaWindowTemplates, }; -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE const struct BattleBackground sBattleTerrainTable[] = #else static const struct BattleBackground sBattleTerrainTable[] = diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 508e250c15..57e5d87630 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -77,7 +77,7 @@ static const struct CompressedSpriteSheet sSpriteSheets_HealthBar[MAX_BATTLERS_C {gBlankGfxCompressed, 0x0120, TAG_HEALTHBAR_OPPONENT2_TILE} }; -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2] = #else static const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2] = diff --git a/src/pokemon.c b/src/pokemon.c index 59b918f073..3e497cf351 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1856,7 +1856,7 @@ const s8 gNatureStatTable[NUM_NATURES][NUM_NATURE_STATS] = #include "data/pokemon/form_change_table_pointers.h" // SPECIES_NONE are ignored in the following two tables, so decrement before accessing these arrays to get the right result -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = #else static const u8 sMonFrontAnimIdsTable[NUM_SPECIES - 1] = diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index fd442386b4..9f0135be19 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -38,7 +38,7 @@ #include "constants/items.h" -#if P_ENABLE_DEBUG +#if P_ENABLE_DEBUG == TRUE extern const struct BattleBackground sBattleTerrainTable[]; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; From f1f4082f62c53196ac1cdb512fe1dafdbf8946a0 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Mon, 13 Dec 2021 19:24:19 +0100 Subject: [PATCH 37/46] added footprints --- include/constants/pokemon_debug.h | 3 ++- include/pokedex.h | 4 +++ src/pokemon_debug.c | 44 +++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/include/constants/pokemon_debug.h b/include/constants/pokemon_debug.h index e9e1a58a34..26d757fe39 100644 --- a/include/constants/pokemon_debug.h +++ b/include/constants/pokemon_debug.h @@ -28,7 +28,8 @@ #define WIN_INSTRUCTIONS 1 #define WIN_BOTTOM_LEFT 2 #define WIN_BOTTOM_RIGHT 3 -#define WIN_END 4 +#define WIN_FOOTPRINT 4 +#define WIN_END 5 //Battle backgrounds #define MAP_BATTLE_SCENE_NORMAL 0 diff --git a/include/pokedex.h b/include/pokedex.h index 49063f6b13..703b9ab8df 100644 --- a/include/pokedex.h +++ b/include/pokedex.h @@ -4,6 +4,10 @@ extern u8 gUnusedPokedexU8; extern void (*gPokedexVBlankCB)(void); +#if P_ENABLE_DEBUG == TRUE +extern const u8 *const gMonFootprintTable[]; +#endif + enum { DEX_MODE_HOENN, diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 9f0135be19..a2438453fa 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -21,6 +21,7 @@ #include "overworld.h" #include "palette.h" #include "palette_util.h" +#include "pokedex.h" #include "pokemon.h" #include "pokemon_animation.h" #include "pokemon_debug.h" @@ -136,6 +137,16 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = .paletteNum = 0xF, .baseBlock = 1 + 30 + 60 + 30 }, + [WIN_FOOTPRINT] = + { + .bg = 0, + .tilemapLeft = 27, + .tilemapTop = 14, + .width = 2, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 1 + 30 + 60 + 30 + 150, + }, DUMMY_WIN_TEMPLATE, }; @@ -750,6 +761,31 @@ static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonDebugMenu *data, gSprites[data->frontShadowSpriteId].invisible = FALSE; } +//Tile functions (footprints) +static void DrawFootprintCustom(u8 windowId, u16 species) +{ + u8 footprint[32 * 4] = {0}; + const u8 * footprintGfx = gMonFootprintTable[species]; + u32 i, j, tileIdx = 0; + + if (footprintGfx != NULL) + { + for (i = 0; i < 32; i++) + { + u8 tile = footprintGfx[i]; + for (j = 0; j < 4; j++) + { + u8 value = ((tile >> (2 * j)) & 1 ? 2 : 0); + if (tile & (2 << (2 * j))) + value |= 0x20; + footprint[tileIdx] = value; + tileIdx++; + } + } + } + CopyToWindowPixelBuffer(windowId, footprint, sizeof(footprint), 0); +} + //Battle background functions static void LoadBattleBg(u8 battleBgType, u8 battleTerrain) { @@ -1050,6 +1086,10 @@ void CB2_Debug_Pokemon(void) //BattleNg Name PrintBattleBgName(taskId); + //Footprint + DrawFootprintCustom(WIN_FOOTPRINT, species); + CopyWindowToVram(WIN_FOOTPRINT, COPYWIN_GFX); + gMain.state++; break; case 4: @@ -1406,6 +1446,10 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) //Arrow invisibility SetArrowInvisibility(data); + + //Footprint + DrawFootprintCustom(WIN_FOOTPRINT, species); + CopyWindowToVram(WIN_FOOTPRINT, COPYWIN_GFX); } static void Exit_Debug_Pokemon(u8 taskId) From fe95e88938158cc579d3cba1c64adf9b8fcc09a6 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Mon, 13 Dec 2021 22:31:37 +0100 Subject: [PATCH 38/46] added option to view changes for front/back sprite picCoords and elevation live --- include/constants/pokemon_debug.h | 3 + include/pokemon_debug.h | 30 ++- src/pokemon_debug.c | 383 ++++++++++++++++++++++++------ 3 files changed, 345 insertions(+), 71 deletions(-) diff --git a/include/constants/pokemon_debug.h b/include/constants/pokemon_debug.h index 26d757fe39..c75392bf22 100644 --- a/include/constants/pokemon_debug.h +++ b/include/constants/pokemon_debug.h @@ -23,6 +23,9 @@ #define MON_PIC_BACK 0 #define MON_PIC_FRONT 1 +//Sprite offset +#define MAX_Y_OFFSET 20 + //Windows #define WIN_NAME_NUMBERS 0 #define WIN_INSTRUCTIONS 1 diff --git a/include/pokemon_debug.h b/include/pokemon_debug.h index 1b8db76c12..e69b4a7c6b 100644 --- a/include/pokemon_debug.h +++ b/include/pokemon_debug.h @@ -19,9 +19,28 @@ struct PokemonDebugModifyArrows struct PokemonDebugOptionArrows { - u8 arrowSpriteId[2]; + u8 arrowSpriteId[1]; u8 currentDigit; - void *modifiedValPtr; +}; + +struct PokemonDebugYPosModifiyArrows +{ + u8 arrowSpriteId[1]; + u8 currentDigit; +}; + +struct PokemonSpriteConstValues +{ + u8 backPicCoords; + u8 frontPicCoords; + u8 frontElevation; +}; + +struct PokemonSpriteOffsets +{ + s8 offset_back_picCoords; + s8 offset_front_picCoords; + s8 offset_front_elevation; }; struct PokemonDebugMenu @@ -37,12 +56,15 @@ struct PokemonDebugMenu bool8 isFemale; struct PokemonDebugModifyArrows modifyArrows; struct PokemonDebugOptionArrows optionArrows; + struct PokemonDebugYPosModifiyArrows yPosModifyArrows; + struct PokemonSpriteConstValues constSpriteValues; + struct PokemonSpriteOffsets offsetsSpriteValues; u8 animIdBack; u8 animIdFront; u8 battleBgType; u8 battleTerrain; - bool8 inSubmenu; - u8 submenuYpos; + u8 currentSubmenu; + u8 submenuYpos[3]; }; void CB2_Debug_Pokemon(void); diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index a2438453fa..5090a5db59 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -123,19 +123,19 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = .bg = 0, .tilemapLeft = 1, .tilemapTop = 14, - .width = 5, + .width = 6, .height = 6, .paletteNum = 0xF, .baseBlock = 1 + 30 + 60 }, [WIN_BOTTOM_RIGHT] = { .bg = 0, - .tilemapLeft = 6, + .tilemapLeft = 7, .tilemapTop = 14, - .width = 25, + .width = 24, .height = 6, .paletteNum = 0xF, - .baseBlock = 1 + 30 + 60 + 30 + .baseBlock = 1 + 30 + 60 + 36 }, [WIN_FOOTPRINT] = { @@ -145,7 +145,7 @@ static const struct WindowTemplate sPokemonDebugWindowTemplate[] = .width = 2, .height = 2, .paletteNum = 0xF, - .baseBlock = 1 + 30 + 60 + 30 + 150, + .baseBlock = 1 + 30 + 60 + 36 + 144, }, DUMMY_WIN_TEMPLATE, }; @@ -397,41 +397,55 @@ static void PrintInstructionsOnWindow(struct PokemonDebugMenu *data) { u8 fontId = 0; u8 x = 2; - u8 textInstructions[] = _("{START_BUTTON} Shiny\n{B_BUTTON} Exit {A_BUTTON} Submenu$"); - u8 textInstructionsGender[] = _("{START_BUTTON} Shiny {SELECT_BUTTON} Gender\n{B_BUTTON} Exit {A_BUTTON} Submenu$"); - u8 textInstructionsInSubmenu[] = _("{START_BUTTON} Shiny\n{B_BUTTON} Back$"); - u8 textInstructionsInSubmenuGender[] = _("{START_BUTTON} Shiny {SELECT_BUTTON} Gender\n{B_BUTTON} Back$"); + u8 textInstructions[] = _("{START_BUTTON} Shiny\n{B_BUTTON} Exit {A_BUTTON} Submenu 1$"); + u8 textInstructionsGender[] = _("{START_BUTTON} Shiny {SELECT_BUTTON} Gender\n{B_BUTTON} Exit {A_BUTTON} Submenu 1$"); + u8 textInstructionsSubmenuOne[] = _("{START_BUTTON} Shiny\n{B_BUTTON} Back {A_BUTTON} Submenu 2$"); + u8 textInstructionsSubmenuOneGender[] = _("{START_BUTTON} Shiny {SELECT_BUTTON} Gender\n{B_BUTTON} Back {A_BUTTON} Submenu 2$"); + u8 textInstructionsSubmenuTwo[] = _("{START_BUTTON} Shiny\n{B_BUTTON} Back$"); + u8 textInstructionsSubmenuTwoGender[] = _("{START_BUTTON} Shiny {SELECT_BUTTON} Gender\n{B_BUTTON} Back$"); + u8 textBottom[] = _("BACK:\nFRONT:\nBG:$"); u8 textBottomForms[] = _("BACK:\nFRONT:\nBG:\nFORMS:$"); + u8 textBottomSubmenuTwo[] = _("B coords:\nF coords:\nF elev:"); u16 species = data->modifyArrows.currValue; //Instruction window FillWindowPixelBuffer(WIN_INSTRUCTIONS, 0x11); - if (data->inSubmenu) - { - if (SpeciesHasGenderDifference[species]) - AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsInSubmenuGender, x, 0, 0, NULL); - else - AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsInSubmenu, x, 0, 0, NULL); - } - else + if (data->currentSubmenu == 0) { if (SpeciesHasGenderDifference[species]) AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsGender, x, 0, 0, NULL); else AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructions, x, 0, 0, NULL); } + else if (data->currentSubmenu == 1) + { + if (SpeciesHasGenderDifference[species]) + AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuOneGender, x, 0, 0, NULL); + else + AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuOne, x, 0, 0, NULL); + } + else if (data->currentSubmenu == 2) + { + if (SpeciesHasGenderDifference[species]) + AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuTwoGender, x, 0, 0, NULL); + else + AddTextPrinterParameterized(WIN_INSTRUCTIONS, fontId, textInstructionsSubmenuTwo, x, 0, 0, NULL); + } CopyWindowToVram(WIN_INSTRUCTIONS, 3); //Bottom left text - if (gFormSpeciesIdTables[data->currentmonId] != NULL) - AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottomForms, 0, 0, 0, NULL); - else + FillWindowPixelBuffer(WIN_BOTTOM_LEFT, PIXEL_FILL(0)); + if (data->currentSubmenu != 2) { - FillWindowPixelBuffer(WIN_BOTTOM_LEFT, PIXEL_FILL(0)); - AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottom, 0, 0, 0, NULL); + if (gFormSpeciesIdTables[data->currentmonId] != NULL) + AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottomForms, 0, 0, 0, NULL); + else + AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottom, 0, 0, 0, NULL); } + else + AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottomSubmenuTwo, 0, 0, 0, NULL); } static void VBlankCB(void) @@ -525,10 +539,28 @@ static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) static void SetArrowInvisibility(struct PokemonDebugMenu *data) { - bool8 invisible = data->inSubmenu; - gSprites[data->modifyArrows.arrowSpriteId[0]].invisible = invisible; - gSprites[data->modifyArrows.arrowSpriteId[1]].invisible = invisible; - gSprites[data->optionArrows.arrowSpriteId[0]].invisible = !invisible; + bool8 invisible = data->currentSubmenu; + switch (data->currentSubmenu) + { + case 0: + gSprites[data->modifyArrows.arrowSpriteId[0]].invisible = FALSE; + gSprites[data->modifyArrows.arrowSpriteId[1]].invisible = FALSE; + gSprites[data->optionArrows.arrowSpriteId[0]].invisible = TRUE; + gSprites[data->yPosModifyArrows.arrowSpriteId[0]].invisible = TRUE; + break; + case 1: + gSprites[data->modifyArrows.arrowSpriteId[0]].invisible = TRUE; + gSprites[data->modifyArrows.arrowSpriteId[1]].invisible = TRUE; + gSprites[data->optionArrows.arrowSpriteId[0]].invisible = FALSE; + gSprites[data->yPosModifyArrows.arrowSpriteId[0]].invisible = TRUE; + break; + case 2: + gSprites[data->modifyArrows.arrowSpriteId[0]].invisible = TRUE; + gSprites[data->modifyArrows.arrowSpriteId[1]].invisible = TRUE; + gSprites[data->optionArrows.arrowSpriteId[0]].invisible = TRUE; + gSprites[data->yPosModifyArrows.arrowSpriteId[0]].invisible = FALSE; + break; + } } static void SetUpModifyArrows(struct PokemonDebugMenu *data) @@ -560,6 +592,17 @@ static void SetUpOptionArrows(struct PokemonDebugMenu *data) gSprites[data->optionArrows.arrowSpriteId[0]].invisible = TRUE; } +static void SetUpYPosModifyArrows(struct PokemonDebugMenu *data) +{ + LoadSpritePalette(&sSpritePalette_Arrow); + data->yPosModifyArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_1_X, OPTIONS_ARROW_Y, 0); + gSprites[data->yPosModifyArrows.arrowSpriteId[0]].animNum = 2; + + data->yPosModifyArrows.currentDigit = 0; + + gSprites[data->yPosModifyArrows.arrowSpriteId[0]].invisible = TRUE; +} + static bool32 TryMoveDigit(struct PokemonDebugModifyArrows *modArrows, bool32 moveUp) { s32 i; @@ -654,7 +697,7 @@ static const struct CompressedSpritePalette *GetMonSpritePalStructCustom(u16 spe } } -void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isShiny, u8 battlerId) +static void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bool8 isShiny, u8 battlerId) { u16 paletteOffset; const void *lzPaletteData; @@ -713,21 +756,39 @@ static u8 GetCastformYCustom(species) return ret; } -u8 GetBattlerSpriteFinal_YCustom(u16 species) +static u8 GetElevationValue(u16 species) +{ + u8 val; + if (species == SPECIES_CASTFORM) + val = sCastformElevations[0]; + else if (IsCastformForm(species)) + val = sCastformElevations[species - SPECIES_CASTFORM_SUNNY + 1]; + else + val = gEnemyMonElevation[species]; + + return val; +} + +static void SetConstSpriteValues(struct PokemonDebugMenu *data) +{ + u16 species = data->currentmonId; + data->constSpriteValues.frontPicCoords = gMonFrontPicCoords[species].y_offset; + data->constSpriteValues.frontElevation = GetElevationValue(species); + data->constSpriteValues.backPicCoords = gMonBackPicCoords[species].y_offset; +} + +static u8 GetBattlerSpriteFinal_YCustom(u16 species, s8 offset_picCoords, s8 offset_elevation) { u16 offset; u8 y; - offset = gMonFrontPicCoords[species].y_offset; - - if (species == SPECIES_CASTFORM) - offset -= sCastformElevations[0]; - else if (IsCastformForm(species)) - offset -= sCastformElevations[species - SPECIES_CASTFORM_SUNNY + 1]; - else - offset -= gEnemyMonElevation[species]; - + //FrontPicCoords + offset = gMonFrontPicCoords[species].y_offset + offset_picCoords; + + //Elevation + offset -= GetElevationValue(species) + offset_elevation; + //Main position y = offset + sBattlerCoords[0][1].y; if (y > DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8) @@ -736,7 +797,7 @@ u8 GetBattlerSpriteFinal_YCustom(u16 species) return y; } -void SpriteCB_EnemyShadowCustom(struct Sprite *shadowSprite) +static void SpriteCB_EnemyShadowCustom(struct Sprite *shadowSprite) { bool8 invisible = FALSE; u8 frontSpriteId = shadowSprite->data[0]; @@ -746,12 +807,15 @@ void SpriteCB_EnemyShadowCustom(struct Sprite *shadowSprite) shadowSprite->x2 = battlerSprite->x2; shadowSprite->invisible = invisible; } -static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonDebugMenu *data, u8 x, u8 y, u16 species) +static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonDebugMenu *data, u16 species) { + u8 x, y; if (gEnemyMonElevation[species] == 0 && !IsCastformForm(species)) return; LoadCompressedSpriteSheet(&gSpriteSheet_EnemyShadow); LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); + x = sBattlerCoords[0][1].x; + y = sBattlerCoords[0][1].y; data->frontShadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, x, y + 29, 0xC8); gSprites[data->frontShadowSpriteId].data[0] = data->frontspriteId; @@ -955,6 +1019,57 @@ static void UpdateMonAnimNames(u8 taskId) PrintBattleBgName(taskId); } +static void UpdateYPosOffsetText(struct PokemonDebugMenu *data) +{ + u8 text[34]; + u8 fontId = 0; + u8 textConst[] = _("const val:"); + u8 textNew[] = _("new val:"); + u8 x_const_val = 50; + u8 x_new_text = 70; + u8 x_new_val = 110; + u8 y = 0; + + u8 backPicCoords = data->constSpriteValues.backPicCoords; + u8 frontPicCoords = data->constSpriteValues.frontPicCoords; + u8 frontElevation = data->constSpriteValues.frontElevation; + + s8 offset_back_picCoords = data->offsetsSpriteValues.offset_back_picCoords; + s8 offset_front_picCoords = data->offsetsSpriteValues.offset_front_picCoords; + s8 offset_front_elevation = data->offsetsSpriteValues.offset_front_elevation; + + u8 newBackPicCoords = backPicCoords + offset_back_picCoords; + u8 newFrontPicCoords = frontPicCoords + offset_front_picCoords; + u8 newFrontElevation = frontElevation + offset_front_elevation; + + FillWindowPixelBuffer(WIN_BOTTOM_RIGHT, PIXEL_FILL(0)); + + //Back + y = 0; + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textConst, 0, y, 0, NULL); + ConvertIntToDecimalStringN(text, backPicCoords , STR_CONV_MODE_LEFT_ALIGN, 2); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, x_const_val, y, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNew, x_new_text, y, 0, NULL); + ConvertIntToDecimalStringN(text, newBackPicCoords , STR_CONV_MODE_LEFT_ALIGN, 2); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, x_new_val, y, 0, NULL); + //Front picCoords + y = 12; + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textConst, 0, y, 0, NULL); + ConvertIntToDecimalStringN(text, frontPicCoords , STR_CONV_MODE_LEFT_ALIGN, 2); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, x_const_val, y, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNew, x_new_text, y, 0, NULL); + ConvertIntToDecimalStringN(text, newFrontPicCoords , STR_CONV_MODE_LEFT_ALIGN, 2); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, x_new_val, y, 0, NULL); + //Front elevation + y = 24; + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textConst, 0, y, 0, NULL); + ConvertIntToDecimalStringN(text, frontElevation , STR_CONV_MODE_LEFT_ALIGN, 2); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, x_const_val, y, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNew, x_new_text, y, 0, NULL); + ConvertIntToDecimalStringN(text, newFrontElevation , STR_CONV_MODE_LEFT_ALIGN, 2); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, x_new_val, y, 0, NULL); +} + static void ResetPokemonDebugWindows(void) { u8 i; @@ -1049,13 +1164,13 @@ void CB2_Debug_Pokemon(void) BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; - front_y = GetBattlerSpriteFinal_YCustom(species); + front_y = GetBattlerSpriteFinal_YCustom(species, 0, 0); data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, front_x, front_y, 0); gSprites[data->frontspriteId].oam.paletteNum = 1; gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; //Front Shadow - LoadAndCreateEnemyShadowSpriteCustom(data, front_x, front_y, species); + LoadAndCreateEnemyShadowSpriteCustom(data, species); //Back HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); @@ -1075,9 +1190,12 @@ void CB2_Debug_Pokemon(void) SetUpModifyArrows(data); PrintDigitChars(data); - //Option Arrows + //Option Arrow SetUpOptionArrows(data); + //Modify Y Pos Arrow + SetUpYPosModifyArrows(data); + //Anim names data->animIdBack = GetSpeciesBackAnimSet(species) + 1; data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; @@ -1148,10 +1266,10 @@ static void ResetBGs_Debug_Menu(u16 a) } } -static void UpdateSubmenuOptionValue(u8 taskId, bool8 increment) +static void UpdateSubmenuOneOptionValue(u8 taskId, bool8 increment) { struct PokemonDebugMenu *data = GetStructPtr(taskId); - u8 option = data->submenuYpos; + u8 option = data->submenuYpos[1]; switch (option) { @@ -1223,6 +1341,80 @@ static void UpdateSubmenuOptionValue(u8 taskId, bool8 increment) } } +static void UpdateSubmenuTwoOptionValue(u8 taskId, bool8 increment) +{ + struct PokemonDebugMenu *data = GetStructPtr(taskId); + u16 species = data->currentmonId; + u8 option = data->submenuYpos[2]; + s8 offset; + u8 y; + + switch (option) + { + case 0: //Back picCoords + offset = data->offsetsSpriteValues.offset_back_picCoords; + if (increment) + { + if (offset == MAX_Y_OFFSET) + offset = -data->constSpriteValues.backPicCoords; + else + offset += 1; + } + else + { + if (offset == -data->constSpriteValues.backPicCoords) + offset = MAX_Y_OFFSET; + else + offset -= 1; + } + data->offsetsSpriteValues.offset_back_picCoords = offset; + gSprites[data->backspriteId].y = DEBUG_MON_BACK_Y + gMonBackPicCoords[species].y_offset + offset; + break; + case 1: //Front picCoords + offset = data->offsetsSpriteValues.offset_front_picCoords; + if (increment) + { + if (offset == MAX_Y_OFFSET) + offset = -data->constSpriteValues.frontPicCoords; + else + offset += 1; + } + else + { + if (offset == -data->constSpriteValues.frontPicCoords) + offset = MAX_Y_OFFSET; + else + offset -= 1; + } + data->offsetsSpriteValues.offset_front_picCoords = offset; + y = GetBattlerSpriteFinal_YCustom(species, offset, data->offsetsSpriteValues.offset_front_elevation); + gSprites[data->frontspriteId].y = y; + break; + case 2: //Front elevation + offset = data->offsetsSpriteValues.offset_front_elevation; + if (increment) + { + if (offset == MAX_Y_OFFSET) + offset = -data->constSpriteValues.frontElevation; + else + offset += 1; + } + else + { + if (offset == -data->constSpriteValues.frontElevation) + offset = MAX_Y_OFFSET; + else + offset -= 1; + } + data->offsetsSpriteValues.offset_front_elevation = offset; + y = GetBattlerSpriteFinal_YCustom(species, data->offsetsSpriteValues.offset_front_picCoords, offset); + gSprites[data->frontspriteId].y = y; + break; + } + + UpdateYPosOffsetText(data); +} + static void Handle_Input_Debug_Pokemon(u8 taskId) { @@ -1263,11 +1455,11 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) PlaySE(SE_DEX_SCROLL); } - if (!data->inSubmenu) + if (data->currentSubmenu == 0) { if (JOY_NEW(A_BUTTON)) { - data->inSubmenu = TRUE; + data->currentSubmenu = 1; SetArrowInvisibility(data); PrintInstructionsOnWindow(data); } @@ -1288,6 +1480,9 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1; data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; UpdateMonAnimNames(taskId); + data->offsetsSpriteValues.offset_back_picCoords = 0; + data->offsetsSpriteValues.offset_front_picCoords = 0; + data->offsetsSpriteValues.offset_front_elevation = 0; } PlaySE(SE_DEX_SCROLL); while (!(gMain.intrCheck & INTR_FLAG_VBLANK)); @@ -1303,6 +1498,9 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1; data->animIdFront = sMonFrontAnimIdsTable[data->currentmonId - 1]; UpdateMonAnimNames(taskId); + data->offsetsSpriteValues.offset_back_picCoords = 0; + data->offsetsSpriteValues.offset_front_picCoords = 0; + data->offsetsSpriteValues.offset_front_elevation = 0; } PlaySE(SE_DEX_SCROLL); @@ -1327,15 +1525,23 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) } } - else //Submenu + else if (data->currentSubmenu == 1) //Submenu 1 { - if (JOY_NEW(B_BUTTON)) + if (JOY_NEW(A_BUTTON)) { - data->inSubmenu = FALSE; - if (data->submenuYpos == 3) + data->currentSubmenu = 2; + SetConstSpriteValues(data); + PrintInstructionsOnWindow(data); + SetArrowInvisibility(data); + UpdateYPosOffsetText(data); + } + else if (JOY_NEW(B_BUTTON)) + { + data->currentSubmenu = 0; + if (data->submenuYpos[1] == 3) { - data->submenuYpos = 2; - data->optionArrows.currentDigit = data->submenuYpos; + data->submenuYpos[1] = 2; + data->optionArrows.currentDigit = data->submenuYpos[1]; gSprites[data->optionArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; } SetArrowInvisibility(data); @@ -1343,37 +1549,75 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) } else if (JOY_NEW(DPAD_DOWN)) { - data->submenuYpos += 1; - if (data->submenuYpos >= 3) + data->submenuYpos[1] += 1; + if (data->submenuYpos[1] >= 3) { - if ((gFormSpeciesIdTables[data->currentmonId] == NULL) || (data->submenuYpos >= 4)) - data->submenuYpos = 0; + if ((gFormSpeciesIdTables[data->currentmonId] == NULL) || (data->submenuYpos[1] >= 4)) + data->submenuYpos[1] = 0; } - data->optionArrows.currentDigit = data->submenuYpos; + data->optionArrows.currentDigit = data->submenuYpos[1]; gSprites[data->optionArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; } else if (JOY_NEW(DPAD_UP)) { - if (data->submenuYpos == 0) + if (data->submenuYpos[1] == 0) { if (gFormSpeciesIdTables[data->currentmonId] != NULL) - data->submenuYpos = 3; + data->submenuYpos[1] = 3; else - data->submenuYpos = 2; + data->submenuYpos[1] = 2; } else - data->submenuYpos -= 1; + data->submenuYpos[1] -= 1; - data->optionArrows.currentDigit = data->submenuYpos; + data->optionArrows.currentDigit = data->submenuYpos[1]; gSprites[data->optionArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12; } else if (JOY_NEW(DPAD_LEFT)) { - UpdateSubmenuOptionValue(taskId, FALSE); + UpdateSubmenuOneOptionValue(taskId, FALSE); } else if (JOY_NEW(DPAD_RIGHT)) { - UpdateSubmenuOptionValue(taskId, TRUE); + UpdateSubmenuOneOptionValue(taskId, TRUE); + } + } + else if (data->currentSubmenu == 2) //Submenu 2 + { + if (JOY_NEW(B_BUTTON)) + { + data->currentSubmenu = 1; + + SetArrowInvisibility(data); + PrintInstructionsOnWindow(data); + UpdateMonAnimNames(taskId); + } + else if (JOY_NEW(DPAD_DOWN)) + { + data->submenuYpos[2] += 1; + if (data->submenuYpos[2] >= 3) + data->submenuYpos[2] = 0; + + data->yPosModifyArrows.currentDigit = data->submenuYpos[2]; + gSprites[data->yPosModifyArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->yPosModifyArrows.currentDigit * 12; + } + else if (JOY_NEW(DPAD_UP)) + { + if (data->submenuYpos[2] == 0) + data->submenuYpos[2] = 2; + else + data->submenuYpos[2] -= 1; + + data->yPosModifyArrows.currentDigit = data->submenuYpos[2]; + gSprites[data->yPosModifyArrows.arrowSpriteId[0]].y = OPTIONS_ARROW_Y + data->yPosModifyArrows.currentDigit * 12; + } + else if (JOY_NEW(DPAD_LEFT)) + { + UpdateSubmenuTwoOptionValue(taskId, FALSE); + } + else if (JOY_NEW(DPAD_RIGHT)) + { + UpdateSubmenuTwoOptionValue(taskId, TRUE); } } } @@ -1411,13 +1655,13 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1); SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; - front_y = GetBattlerSpriteFinal_YCustom(species); + front_y = GetBattlerSpriteFinal_YCustom(species, 0, 0); data->frontspriteId = CreateSprite(&gMultiuseSpriteTemplate, front_x, front_y, 0); gSprites[data->frontspriteId].oam.paletteNum = 1; gSprites[data->frontspriteId].callback = SpriteCallbackDummy; gSprites[data->frontspriteId].oam.priority = 0; //Front Shadow - LoadAndCreateEnemyShadowSpriteCustom(data, front_x, front_y, species); + LoadAndCreateEnemyShadowSpriteCustom(data, species); //Back HandleLoadSpecialPokePicCustom(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[2], species, 0, data->isFemale); @@ -1439,11 +1683,16 @@ static void ReloadPokemonSprites(struct PokemonDebugMenu *data) data->modifyArrows.arrowSpriteId[1] = CreateSprite(&sSpriteTemplate_Arrow, MODIFY_DIGITS_ARROW_X + (data->modifyArrows.currentDigit * 6), MODIFY_DIGITS_ARROW2_Y, 0); gSprites[data->modifyArrows.arrowSpriteId[1]].animNum = 1; - //Option Arrows + //Option Arrow LoadSpritePalette(&sSpritePalette_Arrow); data->optionArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_1_X, OPTIONS_ARROW_Y + data->optionArrows.currentDigit * 12, 0); gSprites[data->optionArrows.arrowSpriteId[0]].animNum = 2; + //Y Pos Modify Arrow + LoadSpritePalette(&sSpritePalette_Arrow); + data->yPosModifyArrows.arrowSpriteId[0] = CreateSprite(&sSpriteTemplate_Arrow, OPTIONS_ARROW_1_X, OPTIONS_ARROW_Y + data->yPosModifyArrows.currentDigit * 12, 0); + gSprites[data->yPosModifyArrows.arrowSpriteId[0]].animNum = 2; + //Arrow invisibility SetArrowInvisibility(data); From e95020c59afaf55a62a81b7e3aaa2995bdfe981c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 13 Dec 2021 22:01:31 -0300 Subject: [PATCH 39/46] Fixed form wrapping to the left. --- src/pokemon_debug.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 5090a5db59..01d9c1253f 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -1325,7 +1325,15 @@ static void UpdateSubmenuOneOptionValue(u8 taskId, bool8 increment) else { if (gFormSpeciesIdTables[data->currentmonId][formId] == gFormSpeciesIdTables[data->currentmonId][0]) - modArrows->currValue = gFormSpeciesIdTables[data->currentmonId][0]; + { + u8 lastForm; + for (lastForm = 0; gFormSpeciesIdTables[data->currentmonId][lastForm] != FORM_SPECIES_END; lastForm++) + { + if (gFormSpeciesIdTables[data->currentmonId][lastForm + 1] == FORM_SPECIES_END) + break; + } + modArrows->currValue = gFormSpeciesIdTables[data->currentmonId][lastForm]; + } else modArrows->currValue = GetFormSpeciesId(data->currentmonId, formId - 1); } From 5d7ac2171fde4b7e0dad398e09a817b8e9145349 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 13 Dec 2021 22:57:39 -0300 Subject: [PATCH 40/46] Animations reload when switching Forms --- src/pokemon_debug.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 01d9c1253f..35db799a99 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -943,7 +943,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) { struct PokemonDebugMenu *data = GetStructPtr(taskId); - if (data->battleBgType == 0) + if (data->battleBgType == MAP_BATTLE_SCENE_NORMAL) { if (increment) { @@ -1337,6 +1337,9 @@ static void UpdateSubmenuOneOptionValue(u8 taskId, bool8 increment) else modArrows->currValue = GetFormSpeciesId(data->currentmonId, formId - 1); } + data->animIdBack = GetSpeciesBackAnimSet(modArrows->currValue) + 1; + data->animIdFront = sMonFrontAnimIdsTable[modArrows->currValue - 1]; + UpdateMonAnimNames(taskId); UpdateBattlerValue(data); ReloadPokemonSprites(data); From 037370fe19f5d84069ee47072ae898806a8f1d52 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 13 Dec 2021 23:33:25 -0300 Subject: [PATCH 41/46] Showing animation number --- src/pokemon_debug.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 35db799a99..00fbe1297c 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -1004,17 +1004,22 @@ static void UpdateMonAnimNames(u8 taskId) u8 fontId = 0; u8 textL[] = _("{L_BUTTON}"); u8 textR[] = _("{R_BUTTON}"); + u8 textNum[4]; FillWindowPixelBuffer(WIN_BOTTOM_RIGHT, PIXEL_FILL(0)); //Back StringCopy(text, gBackAnimNames[backAnim]); AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textL, 0, 0, 0, NULL); - AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 20, 0, 0, NULL); + ConvertIntToDecimalStringN(textNum, backAnim, STR_CONV_MODE_LEADING_ZEROS, 3); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNum, 18, 0, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 36, 0, 0, NULL); //Front StringCopy(text, gFrontAnimNames[frontAnim]); AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textR, 0, 12, 0, NULL); - AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 20, 12, 0, NULL); + ConvertIntToDecimalStringN(textNum, frontAnim, STR_CONV_MODE_LEADING_ZEROS, 3); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNum, 18, 12, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 36, 12, 0, NULL); PrintBattleBgName(taskId); } From 7738d67314035ee724c2c010d858c7ff1f4c4f4e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Mon, 13 Dec 2021 23:52:16 -0300 Subject: [PATCH 42/46] Slight documentation --- src/pokemon_debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 00fbe1297c..3b843ccda2 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -1726,7 +1726,7 @@ static void Exit_Debug_Pokemon(u8 taskId) FreeMonSpritesGfx(); DestroyTask(taskId); SetMainCallback2(CB2_ReturnToFieldWithOpenMenu); - m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); } } From c4fea6a18957175f7328141a5336ee7b718b0eb1 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 14 Dec 2021 09:46:26 +0100 Subject: [PATCH 43/46] fixed Groudon terrain (dont forget your breaks...) --- src/pokemon_debug.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 3b843ccda2..c9df999e60 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -915,6 +915,7 @@ static void LoadBattleBg(u8 battleBgType, u8 battleTerrain) LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(BG_CHAR_ADDR(2))); LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); + break; case MAP_BATTLE_SCENE_KYOGRE: LZDecompressVram(gBattleTerrainTiles_Water, (void*)(BG_CHAR_ADDR(2))); LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); From 9ce83b559e06afbb2655bf842269629cbc742911 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 14 Dec 2021 10:01:04 +0100 Subject: [PATCH 44/46] if elevation is changed to != 0 the shadow is shown --- src/pokemon_debug.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index c9df999e60..029ee1447c 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -797,21 +797,29 @@ static u8 GetBattlerSpriteFinal_YCustom(u16 species, s8 offset_picCoords, s8 off return y; } +static void UpdateShadowSpriteInvisible(struct PokemonDebugMenu *data) +{ + if (data->constSpriteValues.frontElevation + data->offsetsSpriteValues.offset_front_elevation == 0) + gSprites[data->frontShadowSpriteId].invisible = TRUE; + else + gSprites[data->frontShadowSpriteId].invisible = FALSE; +} + static void SpriteCB_EnemyShadowCustom(struct Sprite *shadowSprite) { - bool8 invisible = FALSE; u8 frontSpriteId = shadowSprite->data[0]; struct Sprite *battlerSprite = &gSprites[frontSpriteId]; shadowSprite->x = battlerSprite->x; shadowSprite->x2 = battlerSprite->x2; - shadowSprite->invisible = invisible; } + static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonDebugMenu *data, u16 species) { u8 x, y; + bool8 invisible = FALSE; if (gEnemyMonElevation[species] == 0 && !IsCastformForm(species)) - return; + invisible = TRUE; LoadCompressedSpriteSheet(&gSpriteSheet_EnemyShadow); LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); x = sBattlerCoords[0][1].x; @@ -822,7 +830,7 @@ static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonDebugMenu *data, gSprites[data->frontShadowSpriteId].callback = SpriteCB_EnemyShadowCustom; gSprites[data->frontShadowSpriteId].oam.priority = 0; - gSprites[data->frontShadowSpriteId].invisible = FALSE; + gSprites[data->frontShadowSpriteId].invisible = invisible; } //Tile functions (footprints) @@ -1426,6 +1434,7 @@ static void UpdateSubmenuTwoOptionValue(u8 taskId, bool8 increment) data->offsetsSpriteValues.offset_front_elevation = offset; y = GetBattlerSpriteFinal_YCustom(species, data->offsetsSpriteValues.offset_front_picCoords, offset); gSprites[data->frontspriteId].y = y; + UpdateShadowSpriteInvisible(data); break; } @@ -1478,9 +1487,10 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) { data->currentSubmenu = 1; SetArrowInvisibility(data); + SetConstSpriteValues(data); PrintInstructionsOnWindow(data); } - else if (JOY_NEW(B_BUTTON)) + else if (JOY_HELD(B_BUTTON)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Exit_Debug_Pokemon; @@ -1547,7 +1557,6 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) if (JOY_NEW(A_BUTTON)) { data->currentSubmenu = 2; - SetConstSpriteValues(data); PrintInstructionsOnWindow(data); SetArrowInvisibility(data); UpdateYPosOffsetText(data); From 7a669565ccfed309f515ee6253fe582d19ccb1f1 Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 14 Dec 2021 10:04:57 +0100 Subject: [PATCH 45/46] fixed the back button, didnt work as intended --- src/pokemon_debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 029ee1447c..8fdf7003e1 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -1490,7 +1490,7 @@ static void Handle_Input_Debug_Pokemon(u8 taskId) SetConstSpriteValues(data); PrintInstructionsOnWindow(data); } - else if (JOY_HELD(B_BUTTON)) + else if (JOY_NEW(B_BUTTON)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Exit_Debug_Pokemon; From cbd6553c43245929b5f21c21261d9f7e919ba70f Mon Sep 17 00:00:00 2001 From: TheXaman <48356183+TheXaman@users.noreply.github.com> Date: Tue, 14 Dec 2021 10:15:13 +0100 Subject: [PATCH 46/46] changed L/R Button position to account for numbered animations --- src/pokemon_debug.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/pokemon_debug.c b/src/pokemon_debug.c index 8fdf7003e1..ef440611c7 100644 --- a/src/pokemon_debug.c +++ b/src/pokemon_debug.c @@ -410,6 +410,9 @@ static void PrintInstructionsOnWindow(struct PokemonDebugMenu *data) u8 textBottomSubmenuTwo[] = _("B coords:\nF coords:\nF elev:"); u16 species = data->modifyArrows.currValue; + u8 textL[] = _("{L_BUTTON}"); + u8 textR[] = _("{R_BUTTON}"); + //Instruction window FillWindowPixelBuffer(WIN_INSTRUCTIONS, 0x11); if (data->currentSubmenu == 0) @@ -439,6 +442,8 @@ static void PrintInstructionsOnWindow(struct PokemonDebugMenu *data) FillWindowPixelBuffer(WIN_BOTTOM_LEFT, PIXEL_FILL(0)); if (data->currentSubmenu != 2) { + AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textL, 30, 0, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textR, 30, 12, 0, NULL); if (gFormSpeciesIdTables[data->currentmonId] != NULL) AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottomForms, 0, 0, 0, NULL); else @@ -1011,24 +1016,20 @@ static void UpdateMonAnimNames(u8 taskId) u8 backAnim = data->animIdBack; u8 text[34]; u8 fontId = 0; - u8 textL[] = _("{L_BUTTON}"); - u8 textR[] = _("{R_BUTTON}"); u8 textNum[4]; FillWindowPixelBuffer(WIN_BOTTOM_RIGHT, PIXEL_FILL(0)); //Back StringCopy(text, gBackAnimNames[backAnim]); - AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textL, 0, 0, 0, NULL); ConvertIntToDecimalStringN(textNum, backAnim, STR_CONV_MODE_LEADING_ZEROS, 3); - AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNum, 18, 0, 0, NULL); - AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 36, 0, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNum, 0, 0, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 18, 0, 0, NULL); //Front StringCopy(text, gFrontAnimNames[frontAnim]); - AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textR, 0, 12, 0, NULL); ConvertIntToDecimalStringN(textNum, frontAnim, STR_CONV_MODE_LEADING_ZEROS, 3); - AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNum, 18, 12, 0, NULL); - AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 36, 12, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, textNum, 0, 12, 0, NULL); + AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 18, 12, 0, NULL); PrintBattleBgName(taskId); }