#include "../../Minecraft.World/Platform/stdafx.h" #include "UI.h" #include "UIScene_EndPoem.h" #include "UIBitmapFont.h" #include "../../Minecraft.Client/Minecraft.h" #include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" #include "../../Minecraft.World/Util/StringHelpers.h" UIScene_EndPoem::UIScene_EndPoem(int iPad, void* initData, UILayer* parentLayer) : UIScene(iPad, parentLayer) { // ui.setFontCachingCalculationBuffer(20000); // Setup all the Iggy references we need for this scene initialiseMovie(); m_bIgnoreInput = false; // 4J Stu - Don't need these, the AS handles the scrolling and makes it look // nice #if 0 std::wstring halfScreenLineBreaks; if(RenderManager.IsHiDef()) { // HD - 17 line page halfScreenLineBreaks = L"










"; } else { // 480 - 14 line page halfScreenLineBreaks = L"







"; } #endif // wchar_t startTags[64]; // swprintf(startTags,64,L"",app.GetHTMLFontSize(eHTMLSize_EndPoem)); // 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); // 4J Stu - Iggy seems to strip our trailing linebreaks, so added a space to // made sure it scrolls this far noNoiseString.append(L" "); noNoiseString = app.FormatHTMLString(m_iPad, noNoiseString, 0xff000000); Minecraft* pMinecraft = Minecraft::GetInstance(); std::wstring playerName = L""; if (pMinecraft->localplayers[ui.GetWinUserIndex()] != NULL) { playerName = escapeXML( pMinecraft->localplayers[ui.GetWinUserIndex()]->getDisplayName()); } else { playerName = escapeXML(pMinecraft->localplayers[ProfileManager.GetPrimaryPad()] ->getDisplayName()); } noNoiseString = replaceAll(noNoiseString, L"{*PLAYER*}", playerName); Random random(8124371); int found = (int)noNoiseString.find(L"{*NOISE*}"); int length; while (found != std::string::npos) { length = random.nextInt(4) + 3; m_noiseLengths.push_back(length); found = (int)noNoiseString.find(L"{*NOISE*}", found + 1); } updateNoise(); // 4J-JEV: Find paragraph start and end points. m_paragraphs = std::vector(); int lastIndex = 0; for (int index = 0; index != std::wstring::npos; index = noiseString.find(L"

", index + 12, 12)) { m_paragraphs.push_back( noiseString.substr(lastIndex, index - lastIndex)); lastIndex = index; } // lastIndex += 12; m_paragraphs.push_back( noiseString.substr(lastIndex, noiseString.length() - lastIndex)); // m_htmlPoem.init(noiseString.c_str()); // m_htmlPoem.startAutoScroll(); // std::wstring result = m_htmlControl.GetText(); // wcout << result.c_str(); #if TO_BE_IMPLEMENTED 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); #endif m_requestedLabel = 0; } std::wstring UIScene_EndPoem::getMoviePath() { return L"EndPoem"; } void UIScene_EndPoem::updateTooltips() { ui.SetTooltips(XUSER_INDEX_ANY, -1, m_bIgnoreInput ? -1 : IDS_TOOLTIPS_CONTINUE); } void UIScene_EndPoem::tick() { UIScene::tick(); if (m_requestedLabel >= 0 && m_requestedLabel < m_paragraphs.size()) { std::wstring label = m_paragraphs[m_requestedLabel]; IggyDataValue result; IggyDataValue value[3]; const std::u16string convLabel = wstring_to_u16string(label); IggyStringUTF16 stringVal; stringVal.string = convLabel.c_str(); stringVal.length = convLabel.length(); value[0].type = IGGY_DATATYPE_string_UTF16; value[0].string16 = stringVal; value[1].type = IGGY_DATATYPE_number; value[1].number = m_requestedLabel; value[2].type = IGGY_DATATYPE_boolean; value[2].boolval = (m_requestedLabel == (m_paragraphs.size() - 1)); IggyResult out = IggyPlayerCallMethodRS(getMovie(), &result, IggyPlayerRootPath(getMovie()), m_funcSetNextLabel, 3, value); m_requestedLabel = -1; } } void UIScene_EndPoem::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool& handled) { if (m_bIgnoreInput) return; if (pressed) ui.AnimateKeyPress(iPad, key, repeat, pressed, released); switch (key) { case ACTION_MENU_CANCEL: if (pressed) { m_bIgnoreInput = true; Minecraft* pMinecraft = Minecraft::GetInstance(); for (unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { if (pMinecraft->localplayers[i] != NULL) { app.SetAction(i, eAppAction_Respawn); } } // This just allows it to be shown if (pMinecraft ->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] ->getTutorial() ->showTutorialPopup(true); updateTooltips(); navigateBack(); handled = true; } break; case ACTION_MENU_DOWN: case ACTION_MENU_UP: case ACTION_MENU_OTHER_STICK_DOWN: case ACTION_MENU_OTHER_STICK_UP: sendInputToMovie(key, repeat, pressed, released); break; } } void UIScene_EndPoem::handleDestroy() { // ui.setFontCachingCalculationBuffer(-1); } void UIScene_EndPoem::handleRequestMoreData(F64 startIndex, bool up) { m_requestedLabel = (int)startIndex; } void UIScene_EndPoem::updateNoise() { Minecraft* pMinecraft = Minecraft::GetInstance(); noiseString = noNoiseString; int length = 0; wchar_t replacements[64]; std::wstring replaceString = L""; wchar_t randomChar = L'a'; Random* random = pMinecraft->font->random; bool darken = false; std::wstring tag = L"{*NOISE*}"; AUTO_VAR(it, m_noiseLengths.begin()); int found = (int)noiseString.find(tag); while (found != std::string::npos && it != m_noiseLengths.end()) { length = *it; ++it; replaceString = L""; for (int i = 0; i < length; ++i) { if (ui.UsingBitmapFont()) { randomChar = SharedConstants::acceptableLetters[random->nextInt( (int)SharedConstants::acceptableLetters.length())]; } else { // 4J-JEV: It'd be nice to avoid null characters when using // asian languages. static std::wstring acceptableLetters = L"!\"#$%&'()*+,-./0123456789:;<=>?@[\\]^_'|}~"; randomChar = acceptableLetters[random->nextInt( (int)acceptableLetters.length())]; } std::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"%ls", 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(tag, found + 1); } }