#include "stdafx.h" #include "XUI_TextEntry.h" #include "..\..\MultiplayerLocalPlayer.h" CScene_TextEntry::CommandParams CScene_TextEntry::CommandA[CScene_TextEntry::eCommand_MAX]= { { L"goto", L"%s%c%d%c%d" }, { L"give", L"%s%c%s" } }; HRESULT CScene_TextEntry::Init_Commands() { for(int i=0;ipvInitData; m_iPad=params->iPad; m_wchInitialChar=params->wch; delete params; WCHAR wchEditText[40]; Init_Commands(); ZeroMemory(wchEditText,sizeof(WCHAR)*40); wchEditText[0]=tolower(m_wchInitialChar); m_EditText.SetTextLimit(40); m_EditText.SetText(wchEditText); // set the caret to the end of the default text m_EditText.SetCaretPosition(1); m_EditText.SetTitleAndText(IDS_NAME_WORLD,IDS_NAME_WORLD_TEXT); ui.SetTooltips( m_iPad, IDS_TOOLTIPS_EXECUTE_COMMAND, IDS_TOOLTIPS_BACK); return S_OK; } HRESULT CScene_TextEntry::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled) { // If the user presses return, interpret the string, and exit if(pValueChangedData->nValue==10) { LPCWSTR pText = m_EditText.GetText(); if(pText) { wstring wText = pText; InterpretString(wText); } app.NavigateBack(m_iPad); rfHandled = TRUE; } return S_OK; } HRESULT CScene_TextEntry::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) { ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); // Explicitly handle B button presses switch(pInputData->dwKeyCode) { case VK_PAD_A: { LPCWSTR pText = m_EditText.GetText(); if(pText) { wstring wText = pText; InterpretString(wText); } app.NavigateBack(m_iPad); rfHandled = TRUE; } break; case VK_PAD_B: case VK_ESCAPE: app.NavigateBack(pInputData->UserIndex); rfHandled = TRUE; break; } return S_OK; } HRESULT CScene_TextEntry::InterpretString(wstring &wsText) { wstring wsFormat; WCHAR wchCommand[40]; int iCommand=-1; WCHAR wchSep[2]; #ifdef __PS3__ // 4J Stu - The Xbox version uses swscanf_s which isn't available in GCC. swscanf(wsText.c_str(), L"%40s", wchCommand); #else swscanf_s(wsText.c_str(), L"%s", wchCommand,40); #endif auto it = m_CommandSet.find(wchCommand); if(it != m_CommandSet.end()) { // found it iCommand=it->second; switch(iCommand) { case eCommand_Teleport: { int x,z; #ifdef __PS3__ // 4J Stu - The Xbox version uses swscanf_s which isn't available in GCC. swscanf(wsText.c_str(), L"%40s%c%d%c%d", wchCommand,wchSep,&x,wchSep,&z); #else swscanf_s(wsText.c_str(), L"%s%c%d%c%d", wchCommand,40,wchSep,2,&x,wchSep,2, &z); #endif app.DebugPrintf("eCommand_Teleport x=%d z=%d\n",x,z); // check the bounds int iBound=54*16; if( (x>-iBound) && (x-iBound) && (zlocalplayers[m_iPad]->teleportTo(x,pMinecraft->localplayers[m_iPad]->y,z); } } break; case eCommand_Give: { int iItem,iCount; #ifdef __PS3__ // 4J Stu - The Xbox version uses swscanf_s which isn't available in GCC. swscanf(wsText.c_str(), L"%40s%c%d%c%d", wchCommand,wchSep,&iItem,wchSep,&iCount); #else swscanf_s(wsText.c_str(), L"%s%c%d%c%d", wchCommand,40,wchSep,2,&iItem,wchSep,2, &iCount); #endif app.DebugPrintf("eCommand_Give, item=%d count=%d\n",iItem,iCount); Minecraft *pMinecraft=Minecraft::GetInstance(); for(int i=0;ilocalplayers[m_iPad]->drop(); // shared_ptr(new ItemInstance( iItem, 1, 0 )) ); } break; default: app.DebugPrintf("Unknown command\n"); break; } } return S_OK; }