diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp')
| -rw-r--r-- | Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp new file mode 100644 index 00000000..0f0c678b --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp @@ -0,0 +1,302 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Font.h" +#include "..\..\..\Minecraft.World\Random.h" +#include "..\..\..\Minecraft.World\SharedConstants.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "XUI_Scene_Win.h" + +BYTE CScene_Win::s_winUserIndex = 0; + +const float CScene_Win::AUTO_SCROLL_SPEED = 1.0f; +const float CScene_Win::PLAYER_SCROLL_SPEED = 3.0f; + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Win::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + m_bIgnoreInput = false; + + MapChildControls(); + + // Display the tooltips + ui.SetTooltips( m_iPad, -1, IDS_TOOLTIPS_CONTINUE); + + wstring halfScreenLineBreaks; + + if(RenderManager.IsHiDef()) + { + // HD - 17 line page + halfScreenLineBreaks = L"<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>"; + } + else + { + // 480 - 14 line page + halfScreenLineBreaks = L"<br/><br/><br/><br/><br/><br/><br/><br/>"; + } + + noNoiseString = L"<font size=\"24\"><ds>"; + noNoiseString.append(halfScreenLineBreaks); + noNoiseString.append(halfScreenLineBreaks); + noNoiseString.append( app.GetString(IDS_WIN_TEXT) ); + noNoiseString.append( app.GetString(IDS_WIN_TEXT_PART_2) ); + noNoiseString.append( app.GetString(IDS_WIN_TEXT_PART_3) ); + + noNoiseString.append(halfScreenLineBreaks); + + noNoiseString.append( L"</ds></font>" ); + + noNoiseString = app.FormatHTMLString(m_iPad, noNoiseString, 0xff000000); + + Random random(8124371); + int found=(int)noNoiseString.find_first_of(L"{"); + int length; + while (found!=string::npos) + { + length = random.nextInt(4) + 3; + m_noiseLengths.push_back(length); + found=(int)noNoiseString.find_first_of(L"{",found+1); + } + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if(pMinecraft->localplayers[s_winUserIndex] != NULL) + { + noNoiseString = replaceAll(noNoiseString,L"{*PLAYER*}",pMinecraft->localplayers[s_winUserIndex]->name); + } + else + { + noNoiseString = replaceAll(noNoiseString,L"{*PLAYER*}",pMinecraft->localplayers[ProfileManager.GetPrimaryPad()]->name); + } + + updateNoise(); + + m_htmlControl.SetText(noiseString.c_str()); + + //wstring result = m_htmlControl.GetText(); + + //wcout << result.c_str(); + + m_scrollDir = 1; + HRESULT hr = XuiHtmlControlSetSmoothScroll(m_htmlControl.m_hObj, XUI_SMOOTHSCROLL_VERTICAL,TRUE,AUTO_SCROLL_SPEED,1.0f,AUTO_SCROLL_SPEED); + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,m_scrollDir * 1000); + + SetTimer(0,200); + + return S_OK; +} + +HRESULT CScene_Win::OnTimer( XUIMessageTimer *pXUIMessageTimer, BOOL &bHandled) +{ + if(!TreeHasFocus()) return S_OK; + + // This is required to animate the "noise" strings in the text, however this makes scrolling really jumpy + // as well as causing line lengths to change as we do not have a monspaced font. Disabling for now. +#if 0 + updateNoise(); + + XUIHtmlScrollInfo scrollInfo; + HRESULT hr = m_htmlControl.GetVScrollInfo(&scrollInfo); + m_htmlControl.SetText(noiseString.c_str()); + //wcout << noiseString.c_str(); + //hr = m_htmlControl.SetVScrollPos(scrollInfo.nPos+2); + hr = m_htmlControl.SetVScrollPos(scrollInfo.nPos); +#endif + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,m_scrollDir * 1000); + + return S_OK; +} + +HRESULT CScene_Win::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_START: + case VK_ESCAPE: + { + KillTimer(0); + m_bIgnoreInput = true; + Minecraft *pMinecraft = Minecraft::GetInstance(); + app.CloseAllPlayersXuiScenes(); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(pMinecraft->localplayers[i] != NULL) + { + app.SetAction(i,eAppAction_Respawn); + } + } + + // Show the other players scenes + CXuiSceneBase::ShowOtherPlayersBaseScene(pInputData->UserIndex, true); + // This just allows it to be shown + if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(true); + ui.UpdatePlayerBasePositions(); + + rfHandled = TRUE; + } + break; + case VK_PAD_RTHUMB_UP: + case VK_PAD_LTHUMB_UP: + m_scrollDir = -1; + // Fall through + case VK_PAD_RTHUMB_DOWN: + case VK_PAD_LTHUMB_DOWN: + { + HRESULT hr = XuiHtmlControlSetSmoothScroll(m_htmlControl.m_hObj, XUI_SMOOTHSCROLL_VERTICAL,TRUE,AUTO_SCROLL_SPEED,1.0f,PLAYER_SCROLL_SPEED); + } + break; + } + + return S_OK; +} + +HRESULT CScene_Win::OnKeyUp(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + switch(pInputData->dwKeyCode) + { + case VK_PAD_RTHUMB_UP: + case VK_PAD_LTHUMB_UP: + case VK_PAD_RTHUMB_DOWN: + case VK_PAD_LTHUMB_DOWN: + { + m_scrollDir = 1; + HRESULT hr = XuiHtmlControlSetSmoothScroll(m_htmlControl.m_hObj, XUI_SMOOTHSCROLL_VERTICAL,TRUE,AUTO_SCROLL_SPEED,1.0f,AUTO_SCROLL_SPEED); + } + break; + } + + return S_OK; +} + +HRESULT CScene_Win::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + +void CScene_Win::updateNoise() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + noiseString = noNoiseString; + + int length = 0; + wchar_t replacements[64]; + wstring replaceString = L""; + wchar_t randomChar = L'a'; + Random *random = pMinecraft->font->random; + + bool darken = false; + + wstring tag = L"{*NOISE*}"; + + AUTO_VAR(it, m_noiseLengths.begin()); + int found=(int)noiseString.find_first_of(L"{"); + while (found!=string::npos && it != m_noiseLengths.end() ) + { + length = *it; + ++it; + + replaceString = L""; + for(int i = 0; i < length; ++i) + { + randomChar = SharedConstants::acceptableLetters[random->nextInt((int)SharedConstants::acceptableLetters.length())]; + + wstring randomCharStr = L""; + randomCharStr.push_back(randomChar); + if(randomChar == L'<') + { + randomCharStr = L"<"; + } + else if (randomChar == L'>' ) + { + randomCharStr = L">"; + } + else if(randomChar == L'"') + { + randomCharStr = L"""; + } + else if(randomChar == L'&') + { + randomCharStr = L"&"; + } + else if(randomChar == L'\\') + { + randomCharStr = L"\\\\"; + } + else if(randomChar == L'{') + { + randomCharStr = L"}"; + } + + int randomVal = random->nextInt(2); + eMinecraftColour colour = eHTMLColor_8; + if(randomVal == 1) colour = eHTMLColor_9; + else if(randomVal == 2) colour = eHTMLColor_a; + ZeroMemory(replacements,64*sizeof(wchar_t)); + swprintf(replacements,64,L"<font color=\"#%08x\" shadowcolor=\"#80000000\">%ls</font>",app.GetHTMLColour(colour),randomCharStr.c_str()); + replaceString.append(replacements); + } + + noiseString.replace( found, tag.length(), replaceString ); + + //int pos = 0; + //do { + // pos = random->nextInt(SharedConstants::acceptableLetters.length()); + //} while (pMinecraft->font->charWidths[ch + 32] != pMinecraft->font->charWidths[pos + 32]); + //ib.put(listPos + 256 + random->nextInt(2) + 8 + (darken ? 16 : 0)); + //ib.put(listPos + pos + 32); + + found=(int)noiseString.find_first_of(L"{",found+1); + } +} + +HRESULT CScene_Win::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + SetTimer(0,200); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + CXuiSceneBase::HideAllGameUIElements(); + + // Hide the other players scenes + CXuiSceneBase::ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), false); + + // This just allows it to be shown + if(Minecraft::GetInstance()->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) Minecraft::GetInstance()->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(false); + + // Temporarily make this scene fullscreen + CXuiSceneBase::SetPlayerBaseScenePosition( ProfileManager.GetPrimaryPad(), CXuiSceneBase::e_BaseScene_Fullscreen ); + + // Display the tooltips + ui.SetTooltips( m_iPad, -1, IDS_TOOLTIPS_CONTINUE); + + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,m_scrollDir * 1000); + + return S_OK; +} + +HRESULT CScene_Win::OnNavForward(XUIMessageNavForward *pNavForwardData, BOOL& bHandled) +{ + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,0); + XUIHtmlScrollInfo scrollInfo; + HRESULT hr = m_htmlControl.GetVScrollInfo(&scrollInfo); + hr = m_htmlControl.SetVScrollPos(scrollInfo.nPos); + KillTimer(0); + + return S_OK; +}
\ No newline at end of file |
