@@ -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+
102109void 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 ;
0 commit comments