Skip to content

Commit 23d7753

Browse files
committed
Work on item/berserk
Add support to record/replay inputs
1 parent 9cc5c88 commit 23d7753

16 files changed

+471
-58
lines changed

AzelLib/PDS.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "PDS.h"
22
#include "kernel/fileBundle.h"
3+
#include "kernel/debug/trace.h"
34

45
#ifdef _WIN32
56
#pragma comment(lib, "Winmm.lib")
@@ -374,9 +375,21 @@ void initVDP1()
374375
}
375376
}
376377

378+
void initVBlankData()
379+
{
380+
vblankData.m0 = 0;
381+
vblankData.m4 = 0;
382+
vblankData.m8 = 0;
383+
vblankData.mC = 0;
384+
vblankData.m10 = 0;
385+
vblankData.m14 = 2;
386+
vblankData.m18 = 0;
387+
vblankData.m1C = 0;
388+
}
389+
377390
void resetEngine()
378391
{
379-
//initVBlankData();
392+
initVBlankData();
380393
//initDmaChain();
381394
//initFileSystem();
382395
//resetInputs();
@@ -1027,6 +1040,8 @@ void interruptVDP1Update()
10271040

10281041
u32 frameIndex = 0;
10291042

1043+
bool delayTrace = true;
1044+
10301045
bool bContinue = true;
10311046
void loopIteration()
10321047
{
@@ -1073,6 +1088,26 @@ void loopIteration()
10731088

10741089
//updateInputDebug();
10751090

1091+
if (isTraceEnabled())
1092+
{
1093+
if(!delayTrace)
1094+
{
1095+
readTraceLogU8(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m0_inputType, "input_m0");
1096+
readTraceLogS8(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m2_analogX, "input_m2");
1097+
readTraceLogS8(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m3_analogY, "input_m3");
1098+
readTraceLogS8(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m4, "input_m4");
1099+
readTraceLogS8(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m5, "input_m5");
1100+
readTraceLogU16(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m6_buttonDown, "input_m6");
1101+
readTraceLogU16(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m8_newButtonDown, "input_m8");
1102+
readTraceLogU16(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.mA, "input_mA");
1103+
readTraceLogU16(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.mC_newButtonDown2, "input_mC");
1104+
readTraceLogU16(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.mE, "input_mE");
1105+
readTraceLogU16(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m10, "input_m10");
1106+
readTraceLogU16(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m12, "input_m12");
1107+
readTraceLogU16(graphicEngineStatus.m4514.m0_inputDevices[0].m0_current.m14, "input_m14");
1108+
}
1109+
}
1110+
10761111
runTasks();
10771112

10781113
//waitForSh2Completion();

AzelLib/VDP2.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,7 +1598,7 @@ void clearBlueBox(s32 x, s32 y, s32 width, s32 height)
15981598
}
15991599
}
16001600

1601-
void drawBlueBox(s32 x, s32 y, s32 width, s32 hight)
1601+
void drawBlueBox(s32 x, s32 y, s32 width, s32 hight, u32)
16021602
{
16031603
PDS_unimplemented("drawBlueBox");
16041604
}
@@ -1615,7 +1615,7 @@ void displayObjectIcon(s32 r4, s32 r5_x, s32 r6_y, s32 r7_iconId)
16151615

16161616
void s_vdp2StringTask::UpdateSub1()
16171617
{
1618-
drawBlueBox(m14_x, m16_y, m1A_width, m1C_height);
1618+
drawBlueBox(m14_x, m16_y, m1A_width, m1C_height, 0x1000);
16191619

16201620
setupVDP2StringRendering(m14_x + 4, m16_y + 1, m1A_width - 8, m1C_height - 2);
16211621

AzelLib/VDP2.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ void printVdp2String(s_stringStatusQuery* vars);
316316
void VDP2DrawString(const char*);
317317
s32 computeStringLength(sSaturnPtr pString, s32 r5);
318318

319-
void drawBlueBox(s32 x, s32 y, s32 width, s32 height);
319+
void drawBlueBox(s32 x, s32 y, s32 width, s32 height, u32);
320320
void clearBlueBox(s32 x, s32 y, s32 width, s32 height);
321321
void displayObjectIcon(s32 r4, s32 r5_x, s32 r6_y, s32 r7_iconId);
322322

AzelLib/battle/battleCommandMenu.cpp

Lines changed: 123 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,25 +99,62 @@ s32 createBattleCommandMenuSub2(s32 param1)
9999
return iVar1;
100100
}
101101

102+
bool isFlashChipDisabledInBattle()
103+
{
104+
FunctionUnimplemented();
105+
106+
return true;
107+
}
108+
102109
void addObjectToList(sBattleCommandMenu::sSubMenuEntry* pEntry, eItems index)
103110
{
104-
bool bVar1 = false;
111+
bool itemDisabled = false;
105112
switch (index)
106113
{
107114
case eItems::m1_blastChip:
108115
case eItems::m2_dualBlastChip:
109116
case eItems::m3_triBlastChip:
110117
if (gBattleManager->m10_battleOverlay->mC_targetSystem->m20A_numSelectableEnemies < 1)
111118
{
112-
bVar1 = true;
119+
itemDisabled = true;
113120
}
114121
break;
122+
case eItems::m4_flashChip:
123+
if (isFlashChipDisabledInBattle())
124+
{
125+
itemDisabled = true;
126+
}
127+
break;
128+
case eItems::m5_elixirMinor:
129+
if (mainGameState.gameStats.m10_currentHP == mainGameState.gameStats.maxHP)
130+
{
131+
itemDisabled = true;
132+
}
133+
break;
134+
case eItems::m6_berserkMicro:
135+
if (mainGameState.gameStats.m14_currentBP == mainGameState.gameStats.maxBP)
136+
{
137+
itemDisabled = true;
138+
}
139+
break;
115140
default:
116141
assert(0);
117142
}
118143

119144
pEntry->m0_itemIndex = index;
120-
if (!bVar1)
145+
if (!itemDisabled)
146+
{
147+
pEntry->m2 = 0;
148+
}
149+
}
150+
151+
void addBerserkToActiveList(sBattleCommandMenu::sSubMenuEntry* pEntry, eItems index)
152+
{
153+
FunctionUnimplemented();
154+
155+
bool itemDisabled = false;
156+
pEntry->m0_itemIndex = index;
157+
if (!itemDisabled)
121158
{
122159
pEntry->m2 = 0;
123160
}
@@ -131,7 +168,7 @@ s32 BattleCommandMenu_PopulateSubMenu(sBattleCommandMenu* pThis)
131168
case 2: // items
132169
for (int i=0; i<0x38; i++)
133170
{
134-
pThis->m34_itemList[i].m0_itemIndex = 0;
171+
pThis->m34_itemList[i].m0_itemIndex = eItems::m0_dummy;
135172
pThis->m34_itemList[i].m2 = 1;
136173
}
137174
for (int i = 0; i < 0x38; i++)
@@ -151,6 +188,36 @@ s32 BattleCommandMenu_PopulateSubMenu(sBattleCommandMenu* pThis)
151188
}
152189
}
153190
break;
191+
case 3: // berserks
192+
for (int i=0; i<0x22; i++)
193+
{
194+
pThis->m114_berserkList[i].m0_itemIndex = eItems::m0_dummy;
195+
pThis->m114_berserkList[i].m2 = 0;
196+
}
197+
// for each class types
198+
for (int classType = 0; classType < 6; classType++)
199+
{
200+
sSaturnPtr classBerserksTable = readSaturnEA(gCurrentBattleOverlay->getSaturnPtr(0x60ac094) + classType * 4);
201+
202+
for (int classBerserkIndex = 0; classBerserkIndex < 5; classBerserkIndex++)
203+
{
204+
eItems berserkId = (eItems)readSaturnS16(classBerserksTable + classBerserkIndex * 8 + 6);
205+
if (berserkId)
206+
{
207+
if (mainGameState.getItemCount(berserkId) == 0)
208+
{
209+
pThis->m114_berserkList[classType * 5 + classBerserkIndex].m0_itemIndex = eItems::mA6_unlearned;
210+
pThis->m114_berserkList[classType * 5 + classBerserkIndex].m2 = 1;
211+
}
212+
else
213+
{
214+
addBerserkToActiveList(&pThis->m114_berserkList[classType * 5 + classBerserkIndex], berserkId);
215+
}
216+
}
217+
totalEntryCount++;
218+
}
219+
}
220+
break;
154221
default:
155222
assert(0);
156223
}
@@ -164,7 +231,12 @@ int isBattleCommandEnabled(sBattleCommandMenu* pThis, int buttonIndex)
164231
return 1;
165232
}
166233

167-
void drawBattleItemMenuSelectedItem(sBattleCommandMenu* pThis, std::array<sBattleCommandMenu::sSubMenuEntry, 0x38>& p2, sBattleItemSelectionTask* pMenu)
234+
void drawBattleItemMenuSelectedItem(sBattleCommandMenu* pThis, std::vector<sBattleCommandMenu::sSubMenuEntry>& p2, sBattleItemSelectionTask* pMenu)
235+
{
236+
FunctionUnimplemented();
237+
}
238+
239+
void printBerserkAttackClass(int pageIndex)
168240
{
169241
FunctionUnimplemented();
170242
}
@@ -358,7 +430,7 @@ void BattleCommandMenu_Update(sBattleCommandMenu* pThis)
358430
if (pThis->m3_itemMenuOpen == 0)
359431
{
360432
setBattleFont(0);
361-
createBattleItemSelectionTask(pThis, &pThis->m1DC_itemSelectionMenuHead, &pThis->m28, pThis->m24, pThis->m34_itemList);
433+
createBattleItemSelectionTask(pThis, &pThis->m1DC_itemSelectionMenuHead, &pThis->m28_selectedItem, pThis->m24, pThis->m34_itemList);
362434
pThis->m20 &= ~0x20;
363435
pThis->m3_itemMenuOpen = 1;
364436
}
@@ -370,14 +442,14 @@ void BattleCommandMenu_Update(sBattleCommandMenu* pThis)
370442
}
371443
else
372444
{
373-
if (pThis->m28 < 0)
445+
if (pThis->m28_selectedItem < 0)
374446
{
375447
createBattleCommandMenuSub0(pThis, 0);
376448
pThis->m2_mode = 1;
377449
}
378450
else
379451
{
380-
gBattleManager->m10_battleOverlay->m4_battleEngine->m39E_selectedItem = pThis->m34_itemList[pThis->m28].m0_itemIndex;
452+
gBattleManager->m10_battleOverlay->m4_battleEngine->m39E_selectedItem = pThis->m34_itemList[pThis->m28_selectedItem].m0_itemIndex;
381453
battleEngine_SetBattleMode(m1_useItem);
382454
fieldPaletteTaskInitSub0Sub0();
383455
pThis->getTask()->markFinished();
@@ -390,7 +462,43 @@ void BattleCommandMenu_Update(sBattleCommandMenu* pThis)
390462
}
391463
break;
392464
case 4: // berserk selection
393-
assert(0);
465+
FPInterpolator_Step(&pThis->m1C0_scrollInterpolator);
466+
pThis->m14 = fixedPoint::toInteger(pThis->m1C0_scrollInterpolator.m0_currentValue + 0x8000);
467+
if (pThis->m3_itemMenuOpen == 0)
468+
{
469+
setBattleFont(0);
470+
createBattleItemSelectionTask(pThis, &pThis->m1E0_berserkSelectionMenuHead, &pThis->m2C_selectedBerserk, pThis->m24, pThis->m114_berserkList);
471+
pThis->m20 &= ~0x20;
472+
pThis->m3_itemMenuOpen = 1;
473+
}
474+
else if (pThis->m3_itemMenuOpen)
475+
{
476+
if (pThis->m1E0_berserkSelectionMenuHead)
477+
{
478+
drawBattleItemMenuSelectedItem(pThis, pThis->m114_berserkList, pThis->m1E0_berserkSelectionMenuHead);
479+
printBerserkAttackClass(pThis->m1E0_berserkSelectionMenuHead->m3_currentPageIndex);
480+
}
481+
else
482+
{
483+
if (pThis->m2C_selectedBerserk < 0)
484+
{
485+
createBattleCommandMenuSub0(pThis, 0);
486+
pThis->m2_mode = 1;
487+
}
488+
else
489+
{
490+
gBattleManager->m10_battleOverlay->m4_battleEngine->m3A2_selectedBerserk = pThis->m114_berserkList[pThis->m2C_selectedBerserk].m0_itemIndex;
491+
battleEngine_SetBattleMode(m4_useBerserk);
492+
fieldPaletteTaskInitSub0Sub0();
493+
pThis->getTask()->markFinished();
494+
}
495+
496+
pThis->m20 &= ~0x8;
497+
pThis->m20 &= ~0x20;
498+
drawUsedItemName(-1, 0);
499+
printBerserkAttackClass(6);
500+
}
501+
}
394502
break;
395503
case 5: // weapon change
396504
assert(0);
@@ -704,6 +812,12 @@ void createBattleCommandMenu(p_workArea parent)
704812
};
705813

706814
sBattleCommandMenu* pThis = createSubTask<sBattleCommandMenu>(parent, &definition);
815+
816+
// allocate those as they used to be static
817+
pThis->m34_itemList.resize(0x38);
818+
pThis->m114_berserkList.resize(0x22);
819+
pThis->m19C_weaponList.resize(0x9);
820+
707821
gBattleManager->m10_battleOverlay->m20_battleHud->m28_battleCommandMenu = pThis;
708822
pThis->mC = 0x19;
709823
pThis->mE = 0xC;

AzelLib/battle/battleCommandMenu.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@ struct sBattleCommandMenu : public s_workAreaTemplate<sBattleCommandMenu>
1818
s32 m1C;
1919
u32 m20;
2020
s32 m24;
21-
s32 m28;
21+
s32 m28_selectedItem;
22+
s32 m2C_selectedBerserk;
2223
struct sSubMenuEntry
2324
{
24-
s16 m0_itemIndex;
25+
eItems m0_itemIndex;
2526
s16 m2;
2627
};
27-
std::array<sSubMenuEntry, 0x38> m34_itemList;
28-
std::array<sSubMenuEntry, 0x22> m114_berserkList;
29-
std::array<sSubMenuEntry, 0x9> m19C_weaponList;
28+
std::vector<sSubMenuEntry> m34_itemList; // 0x38 entries
29+
std::vector<sSubMenuEntry> m114_berserkList; // 0x22 entries
30+
std::vector<sSubMenuEntry> m19C_weaponList; // 0x9 entries
3031
sFPInterpolator m1C0_scrollInterpolator;
3132
struct sBattleItemSelectionTask* m1DC_itemSelectionMenuHead;
3233
struct sBattleItemSelectionTask* m1E0_berserkSelectionMenuHead;

0 commit comments

Comments
 (0)