OpenBarnyard
 
Loading...
Searching...
No Matches
AFrontEndMainMenuState2.cpp
Go to the documentation of this file.
1#include "pch.h"
7#include "GUI/AGUI2.h"
8#include "GUI/AFadeManager.h"
9#include "SoundBank/ui.h"
10#include "SoundBank/music.h"
11#include "Sound/AMusicManager.h"
12#include "Input/AInputHandler.h"
14#include "AOptionsState.h"
18
21
22//-----------------------------------------------------------------------------
23// Enables memory debugging.
24// Note: Should be the last include!
25//-----------------------------------------------------------------------------
26#include <Core/TMemoryDebugOn.h>
27
29
31
33{
34 m_iActivatedButtonID = -1;
35 m_pWindmillHelper = a_pWindmillHelper;
36 m_bFlag = a_bFlag;
37 m_fAFKTime = 0.0f;
38
46}
47
51
53{
55 AMovieState* pMovieState = new AMovieState( "Attract", TTRUE, pFrontEndState, TFALSE );
56
57 // Disconnect event listener and fade out screen
58 m_oFadeOverListener.Disconnect();
59 AFade* pFade = AFadeManager::GetSingleton()->StartFade( AFade::Color( 255, 0, 0, 0 ), AFade::Color( 0, 0, 0, 0 ), 1.0f );
60 AGameStateController::GetSingleton()->ReplaceState( pMovieState );
61
62 return TTRUE;
63}
64
65// $Barnyard: FUNCTION 004245f0
67{
68 ACameraManager* pCamMngr = ACameraManager::GetSingleton();
69
73 );
74
75 if ( pCamMngr->GetCurrentCameraHelper() != pBoneCamera )
76 {
77 // Setup the camera helper
78 pBoneCamera->SetModel( TPS8D( "data\\models\\envfrontend_cam" ), "camera" );
79 pCamMngr->SetCameraHelper( pBoneCamera );
80
81 pBoneCamera->SetAnimation( "camera_loop" );
82 }
83}
84
85TBOOL AFrontEndMainMenuState2::ProcessInput( const Toshi::TInputInterface::InputEvent* a_pInputEvent )
86{
87 if ( !AFadeManager::GetSingleton()->HasAnyFadesInProgress( TTRUE ) && !m_oFadeOverListener.IsLinked() )
88 {
89 return ABYardMenuState::ProcessInput( a_pInputEvent );
90 }
91
92 return TFALSE;
93}
94
96{
97 if ( !AFadeManager::GetSingleton()->HasAnyFadesInProgress( TTRUE ) && !m_oFadeOverListener.IsLinked() )
98 {
100 {
101 if ( ( !a_pInputEvent->GetSource()->IsA( &TGetClass( TInputDeviceKeyboard ) ) || a_pInputEvent->GetDoodad() != TInputDeviceKeyboard::KEY_ESCAPE ) &&
102 ( !a_pInputEvent->GetSource()->IsA( &TGetClass( TInputDeviceController ) ) || a_eInputCommand != AInputCommand_Cancel ) )
103 {
104 return ABYardMenuState::ProcessCommand( a_eInputCommand, a_pInputEvent, a_rStopEvents );
105 }
106 else
107 {
108 // Cancel command was sent
109 m_iActivatedButtonID = FRONTENDBUTTON_QUIT;
111 return TTRUE;
112 }
113 }
114 }
115
116 return TFALSE;
117}
118
120{
121 // Reset AFK time
122 if ( AInputHandler::GetSingleton()->HadInputLastFrame() )
123 m_fAFKTime = 0.0f;
124
125 m_fAFKTime += a_fDeltaTime;
126
127 if ( ms_fPlayIntroAFKTime <= m_fAFKTime )
128 {
129 if ( !AFadeManager::GetSingleton()->HasAnyFadesInProgress( TTRUE ) )
130 {
131 // Fade in screen and start intro video after that
132 AFade* pFade = AFadeManager::GetSingleton()->StartFade( AFade::Color( 0, 0, 0, 0 ), AFade::Color( 255, 0, 0, 0 ), 0.5f );
133 m_oFadeOverListener.Connect(
134 pFade->GetFadeOverEmitter(), this, []( AFrontEndMainMenuState2* a_pFrontEndState, AFade* a_pFade, TBOOL* ) { return a_pFrontEndState->StartIntroVideo(); }, 0
135 );
136 }
137 }
138
139 UpdateMenuButtons( a_fDeltaTime );
140
142 {
143 UpdateFocusedButton( a_fDeltaTime );
144 }
145
146 return BaseClass::OnUpdate( a_fDeltaTime );
147}
148
149// $Barnyard: FUNCTION 00409070
151{
152 // Note: commented out because it gives black screen atm
153 //if ( !m_bFlag )
154 // AGameStateController::GetSingleton()->SetFlags( 4 );
155
157
158 if ( !m_pWindmillHelper )
159 // Create windmill helper and a barn sign
160 {
161 m_pWindmillHelper = new AWindmillHelper();
162 ASimAnimModelHelperManager::GetSingleton()->AddModelHelper( m_pWindmillHelper );
163
164 m_pWindmillHelper->CreateBarnSign();
165 }
166
168
169 for ( TINT i = 0; i < FRONTENDBUTTON_NUMOF; i++ )
170 {
171 const TWCHAR* wszText = ALocaleManager::GetSingleton()->GetString( FRONTENDBUTTON_TEXTS[ i ] );
172
173 m_aButtons[ i ].Create( pFont, pFont->GetTextWidth( wszText ), wszText, 5.0f );
174 m_aButtons[ i ].SetFocusedColour( AGUI2STYLE_COLOR_FOCUSED );
175 m_aButtons[ i ].SetEnabledColour( AGUI2STYLE_COLOR_PRIMARY );
176 m_aButtons[ i ].SetDisabledColour( AGUI2STYLE_COLOR_DISABLED );
177 m_aButtons[ i ].SetFocusedScale( 1.0f );
178 m_aButtons[ i ].OnFocusLost();
179 m_aButtons[ i ].SetId( i );
180 m_aButtons[ i ].SetScaleOnFocus( TFALSE );
181 m_aButtons[ i ].GetTransform().Rotate( m_pButtonRotations[ i ] );
182 m_aButtons[ i ].SetImage( "Panel_01", 1.25f, 1.5f );
183 m_aButtons[ i ].SetTextShadow( TTRUE, 0xa0000000, 0.6f );
184 m_aButtons[ i ].SetTextShadowOffset( 5.0f, 5.0f );
185 m_oMenu.AddMenuItem( m_aButtons[ i ] );
186 }
187
188 m_oMenu.SetFocusAt( m_aButtons[ 0 ] );
189 m_oMenu.SetItemFocusCallback( []( void* a_pUserData, AGUI2MenuItem* a_pOldFocus, AGUI2MenuItem* a_pNewFocus ) {
190 TSTATICCAST( AFrontEndMainMenuState2, a_pUserData )->OnMenuItemFocused( *a_pOldFocus, *a_pNewFocus );
191 } );
192
194 m_Rectangle1.SetAttachment( AGUI2ATTACHMENT_TOPCENTER, AGUI2ATTACHMENT_TOPCENTER );
195 m_Rectangle1.SetTransform( 0.0f, 10.0f );
196 m_Rectangle1.Hide();
197
198 m_Rectangle2.SetAttachment( AGUI2ATTACHMENT_TOPCENTER, AGUI2ATTACHMENT_TOPCENTER );
199 m_Rectangle2.SetTransform( 5.0f, 10.0f );
200 m_Rectangle2.SetColour( 0x64000000 );
201 m_Rectangle2.Hide();
202
203 AGUI2::GetRootElement()->AddChildTail( m_Rectangle2 );
204 AGUI2::GetRootElement()->AddChildTail( m_Rectangle1 );
205
206 AMusicManager::GetSingleton()->PlayBackgroundMusic( soundbank::MUSIC_START_SCREEN );
208
209 m_oMenu.SetFocusSound( soundbank::UI_FE_MOVE );
210 m_oMenu.SetSelectSound( soundbank::UI_FE_SELECT );
211 m_oMenu.SetBackSound( soundbank::UI_MENUBACK );
212 m_oMenu.SetNegativeSound( soundbank::UI_NEGATIVE );
213
214 m_oDialog.SetTransform( 0.0f, 50.0f );
215 m_oMenu.SetTransform( 0.0f, 50.0f );
216
217 m_oDialog.Hide();
219}
220
222{
224
225
226 AMusicManager::GetSingleton()->StopBackgroundMusic();
227 TTODO( "FUN_0054b390" );
228
229 for ( TINT i = 0; i < FRONTENDBUTTON_NUMOF; i++ )
230 {
231 m_aButtons[ i ].RemoveSelf();
232 }
233
234 m_Rectangle1.RemoveSelf();
235 m_Rectangle2.RemoveSelf();
236
238}
239
241{
242 TIMPLEMENT();
243
244 m_fAFKTime = 0.0f;
245 m_iActivatedButtonID = -1;
246
247 m_Rectangle1.Show();
248 m_Rectangle2.Show();
249
252
254}
255
257{
258 m_Rectangle1.Hide();
259 m_Rectangle2.Hide();
260
262}
263
265{
266 AGUI2Button* pButton = TSTATICCAST( AGUI2Button, &a_rMenuItem );
267
268 m_iActivatedButtonID = pButton->GetId();
269 OnButtonActivated( pButton );
270
272}
273
275{
276 TIMPLEMENT();
277
278 if ( m_iActivatedButtonID == -1 )
279 return;
280
281 AGameState* pPushGameState = TNULL;
282
283 switch ( m_iActivatedButtonID )
284 {
286 pPushGameState = new AOptionsState();
287 break;
288 }
289
290 if ( pPushGameState )
291 AGameStateController::GetSingleton()->PushState( pPushGameState );
292}
293
294void AFrontEndMainMenuState2::UpdateMenuButtons( TFLOAT a_fDeltaTime )
295{
296 AGUI2MenuItem* pLastMenuItem = m_oMenu.GetLastMenuItem();
298
299 if ( pLastMenuItem != TNULL )
300 {
302
303 while ( TTRUE )
304 {
305 TFLOAT fBackgroundScaleX, fBackgroundScaleY;
306 TFLOAT fTextScaleX, fTextScaleY;
307
308 if ( pItem == pFocused )
309 {
310 TFLOAT fSpeed = a_fDeltaTime * 10.0f;
311 fBackgroundScaleX = TMath::LERPClamped( pItem->GetBackground().GetTransform().m_aMatrixRows[ 0 ].x, ms_fFocusedButtonMaxScale, fSpeed );
312 fBackgroundScaleY = TMath::LERPClamped( pItem->GetBackground().GetTransform().m_aMatrixRows[ 1 ].y, ms_fFocusedButtonMaxScale, fSpeed );
315 }
316 else
317 {
318 TFLOAT fSpeed = a_fDeltaTime * 20.0f;
319 fBackgroundScaleX = TMath::LERPClamped( pItem->GetBackground().GetTransform().m_aMatrixRows[ 0 ].x, 1.0f, fSpeed );
320 fBackgroundScaleY = TMath::LERPClamped( pItem->GetBackground().GetTransform().m_aMatrixRows[ 1 ].y, 1.0f, fSpeed );
321 fTextScaleX = TMath::LERPClamped( pItem->GetTextBox().GetTransform().m_aMatrixRows[ 0 ].x, 1.0f, fSpeed );
322 fTextScaleY = TMath::LERPClamped( pItem->GetTextBox().GetTransform().m_aMatrixRows[ 1 ].y, 1.0f, fSpeed );
323 }
324
325 pItem->GetBackground().GetTransform().SetScale( fBackgroundScaleX, fBackgroundScaleX );
326 pItem->GetTextBox().GetTransform().SetScale( fTextScaleX, fTextScaleY );
327
328 pItem = TSTATICCAST( AGUI2Button, pItem->GetPrevMenuItem() );
329 if ( pItem == pLastMenuItem ) break;
330 }
331 }
332}
333
334void AFrontEndMainMenuState2::UpdateFocusedButton( TFLOAT a_fDeltaTime )
335{
336 AGUI2Button* pFocusedButton = TSTATICCAST( AGUI2Button, m_oMenu.GetFocusedMenuItem() );
337
338 ms_fAnimationTime += a_fDeltaTime;
340
342 {
343 TFLOAT fOffset = ms_fFocusedButtonMaxOffset * fProgress;
345
346 TFLOAT fOneMinusProgress = 1.0f - fProgress;
347 pFocusedButton->SetShadowAlpha( fOneMinusProgress );
348 pFocusedButton->SetTextShadowOffset( ms_vecActivatedButtonShadow.x * fOneMinusProgress, ms_vecActivatedButtonShadow.y * fOneMinusProgress );
349 }
350 else
351 {
354
357 }
358}
Controller input device interface for the Toshi engine.
Keyboard input device for the Toshi engine.
#define TIMPLEMENT()
Definition Defines.h:136
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TTODO(DESC)
Definition Defines.h:134
#define TGetClass(CLASS)
Definition TObject.h:13
#define TDEFINE_CLASS(...)
Definition TObject.h:120
#define TPS8D(STR)
Definition TPString8.h:17
wchar_t TWCHAR
Definition Typedefs.h:21
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
@ AGUI2ATTACHMENT_TOPCENTER
#define AGUI2STYLE_COLOR_FOCUSED
Definition AGUI2Style.h:10
#define AGUI2STYLE_FONT_PRIMARY
Definition AGUI2Style.h:4
#define AGUI2STYLE_COLOR_DISABLED
Definition AGUI2Style.h:11
#define AGUI2STYLE_COLOR_PRIMARY
Definition AGUI2Style.h:8
AInputCommand
Definition AInputMap.h:12
@ AInputCommand_Cancel
Definition AInputMap.h:16
TFORCEINLINE constexpr TFLOAT DegToRad(TFLOAT fDeg)
Definition TMathInline.h:64
constexpr TFLOAT PI
Definition TMathInline.h:35
TFORCEINLINE TFLOAT Sin(TFLOAT fVal)
Definition TMathInline.h:42
TFORCEINLINE TFLOAT LERPClamped(TFLOAT a, TFLOAT b, TFLOAT t)
@ UI_FE_SELECT
Definition ui.h:55
@ UI_MENUBACK
Definition ui.h:31
@ UI_FE_MOVE
Definition ui.h:52
@ UI_NEGATIVE
Definition ui.h:19
@ MUSIC_START_SCREEN
Definition music.h:91
TInputDevice * GetSource() const
TBOOL IsA(TClass *a_pClass)
Definition TObject.h:192
void SetAnimation(const TCHAR *a_szSeqName)
void SetModel(const Toshi::TPString8 &a_strModelName, const TCHAR *a_szBoneName)
void SetCameraHelper(ACameraHelper *a_pHelper)
ACameraHelper * GetCurrentCameraHelper() const
ACameraHelper * GetCameraHelper(CAMERAHELPER a_eCameraHelper) const
static Toshi::TVector2 ms_vecActivatedButtonTranslation
virtual void OnActivate() override
TBOOL m_bFocusedElementBloated
virtual TBOOL OnUpdate(TFLOAT a_fDeltaTime) override
virtual void OnRemoval() override
static TFLOAT ms_fAnimationTime
virtual TBOOL ProcessCommand(AInputCommand a_eInputCommand, const Toshi::TInputInterface::InputEvent *a_pInputEvent, TBOOL &a_rStopEvents) override
static Toshi::TVector2 ms_vecActivatedButtonShadow
void OnButtonActivated(AGUI2Button *a_pButton)
MENUSTATE m_eMenuState
AGUI2Dialog m_oDialog
TFLOAT * m_pButtonRotations
virtual TBOOL ProcessInput(const Toshi::TInputInterface::InputEvent *a_pInputEvent) override
AGUI2Rectangle m_oDialogTitleBackground
virtual void OnDeactivate() override
virtual void OnInsertion() override
virtual void OnInsertion() override
virtual void OnMenuItemActivated(AGUI2MenuItem &a_rMenuItem) override
virtual void OnDeactivate() override
virtual void OnMenuClose() override
AFrontEndMainMenuState2(AWindmillHelper *a_pWindmillHelper=nullptr, TBOOL a_bFlag=false)
virtual TBOOL OnUpdate(TFLOAT a_fDeltaTime) override
virtual TBOOL ProcessInput(const Toshi::TInputInterface::InputEvent *a_pInputEvent) override
virtual TBOOL ProcessCommand(AInputCommand a_eInputCommand, const Toshi::TInputInterface::InputEvent *a_pInputEvent, TBOOL &a_rStopEvents) override
static constexpr TINT FRONTENDBUTTON_TEXTS[FRONTENDBUTTON_NUMOF]
virtual void OnRemoval() override
virtual void OnActivate() override
Definition AFade.h:9
Toshi::TEmitter< AFade, TBOOL > & GetFadeOverEmitter()
Definition AFade.h:59
static AGUI2Element * GetRootElement()
Definition AGUI2.h:31
AGUI2Rectangle & GetBackground()
Definition AGUI2Button.h:35
virtual void SetShadowAlpha(TFLOAT a_fAlpha) override
AGUI2TextBox & GetTextBox()
Definition AGUI2Button.h:36
TINT GetId() const
Definition AGUI2Button.h:18
void SetTextShadowOffset(TFLOAT a_fOffset)
Definition AGUI2Button.h:32
AGUI2Transform & GetTransform()
void SetTranslation(TFLOAT a_fX, TFLOAT a_fY)
void AddChildTail(AGUI2Element &a_rElement)
TFLOAT GetTextWidth(const TWCHAR *a_wszText, TFLOAT a_fScale=1.0f)
static AGUI2Font * FindFont(const TCHAR *a_szFontName)
AGUI2MenuItem * GetFocusedMenuItem() const
Definition AGUI2Menu.h:46
AGUI2MenuItem * GetLastMenuItem() const
Definition AGUI2Menu.h:48
AGUI2MenuItem * GetPrevMenuItem() const
Definition AGUI2Menu.h:109
Toshi::TVector2 m_aMatrixRows[2]
void SetScale(TFLOAT a_fScaleX, TFLOAT a_fScaleY)