#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);
}
}