the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "..\XUI\XUI_SettingsAudio.h"
3
4//----------------------------------------------------------------------------------
5// Performs initialization tasks - retrieves controls.
6//----------------------------------------------------------------------------------
7HRESULT CScene_SettingsAudio::OnInit( XUIMessageInit* pInitData, BOOL& bHandled )
8{
9 WCHAR TempString[256];
10 m_iPad=*(int *)pInitData->pvInitData;
11 // if we're not in the game, we need to use basescene 0
12 bool bNotInGame=(Minecraft::GetInstance()->level==NULL);
13
14 MapChildControls();
15
16 // Display the tooltips
17 HRESULT hr = S_OK;
18 HXUIOBJ hSlider;
19
20 m_SliderA[SLIDER_SETTINGS_MUSIC].SetValue(app.GetGameSettings(m_iPad,eGameSetting_MusicVolume));
21 swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),app.GetGameSettings(m_iPad,eGameSetting_MusicVolume));
22 m_SliderA[SLIDER_SETTINGS_MUSIC].SetText(TempString);
23
24 m_SliderA[SLIDER_SETTINGS_SOUND].SetValue(app.GetGameSettings(m_iPad,eGameSetting_SoundFXVolume));
25 swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),app.GetGameSettings(m_iPad,eGameSetting_SoundFXVolume));
26 m_SliderA[SLIDER_SETTINGS_SOUND].SetText(TempString);
27
28 // only the primary player gets to change the music and sound settings
29 // only the primary player gets to change the gamma and splitscreen settings
30 // only the primary player gets to change the difficulty settings
31 if(ProfileManager.GetPrimaryPad()!=m_iPad)
32 {
33 D3DXVECTOR3 vec;
34
35 m_SliderA[SLIDER_SETTINGS_MUSIC].GetPosition(&vec);
36 m_SliderA[SLIDER_SETTINGS_MUSIC].SetEnable(FALSE);
37 m_SliderA[SLIDER_SETTINGS_MUSIC].SetShow(FALSE);
38 hr=XuiElementGetChildById(m_SliderA[SLIDER_SETTINGS_MUSIC].m_hObj,L"XuiSlider",&hSlider);
39 XuiElementSetShow(hSlider,FALSE);
40 XuiControlSetEnable(hSlider,FALSE);
41 m_SliderA[SLIDER_SETTINGS_SOUND].SetEnable(FALSE);
42 m_SliderA[SLIDER_SETTINGS_SOUND].SetShow(FALSE);
43 hr=XuiElementGetChildById(m_SliderA[SLIDER_SETTINGS_SOUND].m_hObj,L"XuiSlider",&hSlider);
44 XuiElementSetShow(hSlider,FALSE);
45 XuiControlSetEnable(hSlider,FALSE);
46 }
47
48
49 // if we're not in the game, we need to use basescene 0
50 if(bNotInGame)
51 {
52 ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK);
53 CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE );
54 }
55 else
56 {
57 ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK);
58 CXuiSceneBase::ShowBackground( m_iPad, FALSE );
59 }
60
61
62 if(app.GetLocalPlayerCount()>1)
63 {
64 app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad);
65 CXuiSceneBase::ShowLogo( m_iPad, FALSE );
66 }
67 else
68 {
69 if(bNotInGame)
70 {
71 CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE );
72 }
73 else
74 {
75 CXuiSceneBase::ShowLogo( m_iPad, TRUE );
76 }
77 }
78
79 return S_OK;
80}
81
82HRESULT CScene_SettingsAudio::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled )
83{
84 WCHAR TempString[256];
85
86 if(hObjSource==m_SliderA[SLIDER_SETTINGS_MUSIC].GetSlider() )
87 {
88 app.SetGameSettings(m_iPad,eGameSetting_MusicVolume,pNotifyValueChanged->nValue);
89 swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),pNotifyValueChanged->nValue);
90 m_SliderA[SLIDER_SETTINGS_MUSIC].SetText(TempString);
91 }
92 else if(hObjSource==m_SliderA[SLIDER_SETTINGS_SOUND].GetSlider() )
93 {
94 app.SetGameSettings(m_iPad,eGameSetting_SoundFXVolume,pNotifyValueChanged->nValue);
95 swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),pNotifyValueChanged->nValue);
96 m_SliderA[SLIDER_SETTINGS_SOUND].SetText(TempString);
97 }
98
99
100 return S_OK;
101}
102
103
104HRESULT CScene_SettingsAudio::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled)
105{
106 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
107
108 HRESULT hr=S_OK;
109
110 // Explicitly handle B button presses
111 switch(pInputData->dwKeyCode)
112 {
113 case VK_PAD_B:
114 case VK_ESCAPE:
115 // if the profile data has been changed, then force a profile write
116 // It seems we're allowed to break the 5 minute rule if it's the result of a user action
117
118 // Not in this scene - app.CheckGameSettingsChanged(true,pInputData->UserIndex);
119
120 app.NavigateBack(pInputData->UserIndex);
121 rfHandled = TRUE;
122 break;
123 }
124
125 return hr;
126}
127
128//----------------------------------------------------------------------------------
129// Handler for the button press message.
130//----------------------------------------------------------------------------------
131HRESULT CScene_SettingsAudio::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled)
132{
133 // This assumes all buttons can only be pressed with the A button
134 ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A);
135
136 return S_OK;
137}
138
139HRESULT CScene_SettingsAudio::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled)
140{
141 // added so we can skip greyed out items
142 pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE);
143
144 if(pControlNavigateData->hObjDest!=NULL)
145 {
146 bHandled=TRUE;
147 }
148
149 return S_OK;
150}
151
152HRESULT CScene_SettingsAudio::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled )
153{
154 HRESULT hr;
155 WCHAR TempString[256];
156 if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK;
157
158 if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO)
159 {
160 // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game)
161
162 float fMaxTextLen=0.0f;
163 float fMaxLen=0.0f;
164
165 // sliders first
166 HXUIOBJ hSlider,hVisual,hText;//,hCheckboxText;
167 XUIRect xuiRect;
168 float fWidth,fHeight,fTemp;
169 D3DXVECTOR3 vec,vecCheckboxText,vSlider,vecCheckbox;
170
171 // don't display values on these - we handle that
172 for(int i=0;i<SLIDER_SETTINGS_AUDIO_MAX;i++)
173 {
174 m_SliderA[i].SetValueDisplay(FALSE);
175 }
176
177 hr=XuiElementGetChildById(m_SliderA[SLIDER_SETTINGS_MUSIC].m_hObj,L"XuiSlider",&hSlider);
178 hr=XuiControlGetVisual(hSlider,&hVisual);
179 hr=XuiElementGetChildById(hVisual,L"text_Label",&hText);
180 hr=XuiElementGetPosition(m_SliderA[SLIDER_SETTINGS_MUSIC].m_hObj,&vSlider);
181
182 for(int i=0;i<SLIDER_SETTINGS_AUDIO_MAX;i++)
183 {
184 switch(i)
185 {
186 case SLIDER_SETTINGS_MUSIC: // 3 digits
187 swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),999);
188 break;
189 case SLIDER_SETTINGS_SOUND: // 3 digits
190 swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),999);
191 break;
192 }
193
194 hr=XuiTextPresenterMeasureText(hText, TempString, &xuiRect);
195 // 4J-PB - the text measuring doesn't seem to be long enough - add a fudge
196 xuiRect.right+=25.0f;
197 m_SliderA[i].GetBounds(&fWidth,&fHeight);
198 if(xuiRect.right>fMaxTextLen) fMaxTextLen=xuiRect.right;
199 if(fWidth>fMaxLen) fMaxLen=fWidth;
200 }
201
202 if(fMaxLen<fMaxTextLen)
203 {
204 float fWidth;
205 XuiElementGetPosition(m_hObj,&vec);
206 XuiElementGetBounds(m_hObj,&fWidth,&fHeight);
207
208 // need to centre the scene now the size has changed
209 if((!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) || app.GetLocalPlayerCount()>1)
210 {
211 // scene width needs to be more that the text width on buttons
212 fWidth=vSlider.x;
213 vec.x=floorf((640.0f-(fMaxTextLen+fWidth))/2.0f);
214 XuiElementSetPosition(m_hObj,&vec);
215 XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight);
216 }
217 else
218 {
219 fWidth=vSlider.x;
220 vec.x=floorf((1280.0f-(fMaxTextLen+fWidth))/2.0f);
221 XuiElementSetPosition(m_hObj,&vec);
222 XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight);
223 }
224 // Need to refresh the scenes visual since the object size has now changed
225 XuiControlAttachVisual(m_hObj);
226
227 // centre is vec.x+(fWidth/2)
228 for(int i=0;i<SLIDER_SETTINGS_AUDIO_MAX;i++)
229 {
230 hr=XuiElementGetChildById(m_SliderA[i].m_hObj,L"XuiSlider",&hSlider);
231 XuiElementGetPosition(hSlider,&vec);
232 XuiElementGetBounds(hSlider,&fTemp,&fHeight);
233 XuiElementSetBounds(hSlider,fMaxTextLen,fHeight);
234 }
235 }
236 }
237
238 return S_OK;
239}
240
241HRESULT CScene_SettingsAudio::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled)
242{
243 bool bNotInGame=(Minecraft::GetInstance()->level==NULL);
244
245 // if we're not in the game, we need to use basescene 0
246 if(bNotInGame)
247 {
248 ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK);
249 }
250 else
251 {
252 ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK);
253 }
254
255 return S_OK;
256}
257
258HRESULT CScene_SettingsAudio::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled)
259{
260 bHandled=true;
261 return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining);
262}
263