From 7aa55f2753cca1971c789569a4a1fe883ffddfcf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 24 Aug 2022 23:00:21 +0200 Subject: [PATCH] better interface 1 player mon in double --- include/battle_interface.h | 1 + src/battle_anim_mons.c | 11 +++++----- src/battle_gfx_sfx_util.c | 7 ++++++- src/battle_interface.c | 43 ++++++++++++++++++++++---------------- src/party_menu.c | 2 +- 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/include/battle_interface.h b/include/battle_interface.h index 29cb45b0f..90184d75a 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -72,6 +72,7 @@ enum HEALTHBOX_SAFARI_BALLS_TEXT }; +u32 WhichBattleCoords(u32 battlerId); u8 GetMegaIndicatorSpriteId(u32 healthboxSpriteId); u8 CreateBattlerHealthboxSprites(u8 battler); u8 CreateSafariPlayerHealthboxSprites(void); diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 21a3ed902..b0a073e46 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_anim.h" +#include "battle_interface.h" #include "bg.h" #include "contest.h" #include "data.h" @@ -134,10 +135,10 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) { case BATTLER_COORD_X: case BATTLER_COORD_X_2: - retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].x; + retVal = sBattlerCoords[WhichBattleCoords(battlerId)][GetBattlerPosition(battlerId)].x; break; case BATTLER_COORD_Y: - retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y; + retVal = sBattlerCoords[WhichBattleCoords(battlerId)][GetBattlerPosition(battlerId)].y; break; case BATTLER_COORD_Y_PIC_OFFSET: case BATTLER_COORD_Y_PIC_OFFSET_DEFAULT: @@ -278,7 +279,7 @@ u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3) offset = GetBattlerYDelta(battlerId, species); offset -= GetBattlerElevation(battlerId, species); } - y = offset + sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y; + y = offset + sBattlerCoords[WhichBattleCoords(battlerId)][GetBattlerPosition(battlerId)].y; if (a3) { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) @@ -493,7 +494,7 @@ static void TranslateSpriteInWavePattern(struct Sprite *sprite) sprite->y2 = Cos(sprite->sCirclePosY, sprite->sAmplitude); sprite->sCirclePosX += sprite->sCircleSpeedX; sprite->sCirclePosY += sprite->sCircleSpeedY; - + if (sprite->sCirclePosX >= 0x100) sprite->sCirclePosX -= 0x100; else if (sprite->sCirclePosX < 0) @@ -2445,7 +2446,7 @@ void AnimTask_AttackerPunchWithTrace(u8 taskId) dest = (task->tPaletteNum + 16) * 16; src = (gSprites[task->tBattlerSpriteId].oam.paletteNum + 0x10) * 0x10; - + // Set trace's priority based on battler's subpriority task->tPriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker); if (task->tPriority == 20 || task->tPriority == 40) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 8cd23098f..747d08737 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -715,7 +715,12 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) else { if (state == 2) - LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[0]); + { + if (WhichBattleCoords(0)) + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[0]); + else + LoadCompressedSpriteSheet(&sSpriteSheet_SinglesPlayerHealthbox); + } else if (state == 3) LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[1]); else if (state == 4) diff --git a/src/battle_interface.c b/src/battle_interface.c index a504cf1c0..cf935fdc6 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -764,6 +764,15 @@ static void InitLastUsedBallAssets(void) gBattleStruct->ballSpriteIds[1] = MAX_SPRITES; } +// This function is here to cover a specific case - one player's mon in a 2 vs 1 double battle. In this scenario - display singles layout. +u32 WhichBattleCoords(u32 battlerId) // 0 - singles, 1 - doubles +{ + if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_LEFT && gPlayerPartyCount == 1) + return 0; + else + return IsDoubleBattle(); +} + u8 CreateBattlerHealthboxSprites(u8 battlerId) { s16 data6 = 0; @@ -771,7 +780,7 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) u8 healthbarSpriteId, megaIndicatorSpriteId; struct Sprite *healthBarSpritePtr; - if (!IsDoubleBattle()) + if (WhichBattleCoords(battlerId) == 0) // Singles { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { @@ -1035,7 +1044,7 @@ void GetBattlerHealthboxCoords(u8 battler, s16 *x, s16 *y) { *x = 0, *y = 0; - if (!IsDoubleBattle()) + if (!WhichBattleCoords(battler)) { if (GetBattlerSide(battler) != B_SIDE_PLAYER) *x = 44, *y = 30; @@ -1102,7 +1111,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) if (GetBattlerSide(battler) == B_SIDE_PLAYER) { objVram = (void *)(OBJ_VRAM0); - if (!IsDoubleBattle()) + if (!WhichBattleCoords(battler)) objVram += spriteTileNum + 0x820; else objVram += spriteTileNum + 0x420; @@ -1118,12 +1127,13 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) { - u32 windowId, spriteTileNum; + u32 windowId, spriteTileNum, battler; u8 *windowTileData; u8 text[32]; void *objVram; - if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER && !IsDoubleBattle()) + battler = gSprites[healthboxSpriteId].hMain_Battler; + if (GetBattlerSide(battler) == B_SIDE_PLAYER && !WhichBattleCoords(battler)) { spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; if (maxOrCurrent != HP_CURRENT) // singles, max @@ -1152,10 +1162,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) } else { - u8 battler; - memcpy(text, sEmptyWhiteText_GrayHighlight, sizeof(sEmptyWhiteText_GrayHighlight)); - battler = gSprites[healthboxSpriteId].hMain_Battler; if (IsDoubleBattle() == TRUE) { UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent); @@ -1362,7 +1369,7 @@ void SwapHpBarsWithHpText(void) { if (gSprites[gHealthboxSpriteIds[i]].callback == SpriteCallbackDummy && GetBattlerSide(i) != B_SIDE_OPPONENT - && (IsDoubleBattle() || GetBattlerSide(i) != B_SIDE_PLAYER)) + && (WhichBattleCoords(i) || GetBattlerSide(i) != B_SIDE_PLAYER)) { bool8 noBars; @@ -1370,7 +1377,7 @@ void SwapHpBarsWithHpText(void) noBars = gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars; if (GetBattlerSide(i) == B_SIDE_PLAYER) { - if (!IsDoubleBattle()) + if (!WhichBattleCoords(i)) continue; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) continue; @@ -1666,7 +1673,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, { isOpponent = TRUE; - if (!skipPlayer || !IsDoubleBattle()) + if (!skipPlayer || !WhichBattleCoords(battlerId)) bar_X = 104, bar_Y = 40; else bar_X = 104, bar_Y = 16; @@ -2152,7 +2159,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) { TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x40 + spriteTileNum), windowTileData, 6); ptr = (void *)(OBJ_VRAM0); - if (!IsDoubleBattle()) + if (!WhichBattleCoords(gSprites[healthboxSpriteId].data[6])) ptr += spriteTileNum + 0x800; else ptr += spriteTileNum + 0x400; @@ -2203,7 +2210,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS); - if (!IsDoubleBattle()) + if (!WhichBattleCoords(battlerId)) tileNumAdder = 0x1A; else tileNumAdder = 0x12; @@ -2259,7 +2266,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) FillPalette(sStatusIconColors[statusPalId], pltAdder + 0x100, 2); CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void *)(OBJ_PLTT + pltAdder * 2), 2); CpuCopy32(statusGfxPtr, (void *)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * TILE_SIZE_4BPP), 96); - if (IsDoubleBattle() == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT) + if (WhichBattleCoords(battlerId) == 1 || GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) { @@ -2382,7 +2389,7 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0); MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0); } - isDoubles = IsDoubleBattle(); + isDoubles = WhichBattleCoords(battlerId); if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL)) { u16 species; @@ -3196,7 +3203,7 @@ void UpdateAbilityPopup(u8 battlerId) u8 spriteId1 = gBattleStruct->abilityPopUpSpriteIds[battlerId][0]; u8 spriteId2 = gBattleStruct->abilityPopUpSpriteIds[battlerId][1]; u16 ability = (gBattleScripting.abilityPopupOverwrite != 0) ? gBattleScripting.abilityPopupOverwrite : gBattleMons[battlerId].ability; - + ClearAbilityName(spriteId1, spriteId2); PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); @@ -3382,7 +3389,7 @@ static void DestroyLastUsedBallGfx(struct Sprite *sprite) } static void SpriteCB_LastUsedBallWin(struct Sprite *sprite) -{ +{ if (sprite->sHide) { if (sprite->x != LAST_BALL_WIN_X_0) @@ -3399,7 +3406,7 @@ static void SpriteCB_LastUsedBallWin(struct Sprite *sprite) } static void SpriteCB_LastUsedBall(struct Sprite *sprite) -{ +{ if (sprite->sHide) { if (sprite->x != LAST_USED_BALL_X_0) diff --git a/src/party_menu.c b/src/party_menu.c index db20e0932..b2e6ea68d 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -6115,7 +6115,7 @@ void ChooseMonForWirelessMinigame(void) static u8 GetPartyLayoutFromBattleType(void) { - if (IsDoubleBattle() == FALSE) + if (!IsDoubleBattle() || gPlayerPartyCount == 1) // Draw the single layout in a double battle where the player has only one pokemon. return PARTY_LAYOUT_SINGLE; if (IsMultiBattle() == TRUE) return PARTY_LAYOUT_MULTI;