Something went wrong. Try again.
the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
Something went wrong. Try again.
18 kB · 603 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603#include "stdafx.h"#include "..\..\Common\Tutorial\Tutorial.h"#include "..\..\MultiplayerLocalPlayer.h"#include "..\..\..\Minecraft.World\StringHelpers.h"#include "..\..\..\Minecraft.World\Tile.h"#include "..\..\..\Minecraft.World\Item.h"#include "XUI_Ctrl_CraftIngredientSlot.h"#include "XUI_XZP_Icons.h"
//----------------------------------------------------------------------------------// Performs initialization tasks - retrieves controls.//----------------------------------------------------------------------------------HRESULT CScene_TutorialPopup::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ){ HRESULT hr = S_OK;
tutorial = (Tutorial *)pInitData->pvInitData; m_iPad = tutorial->getPad();
MapChildControls();
// splitscreen? // if we are in splitscreen, then we need to figure out if we want to move this scene if(app.GetLocalPlayerCount()>1) { app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); }
m_textFontSize = _fromString<int>( m_fontSizeControl.GetText() ); m_fontSizeControl.SetShow(false);
m_interactScene = NULL; m_lastSceneMovedLeft = false; m_bAllowFade = false;
SetShow(false); XuiSetTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME);
return hr;}
HRESULT CScene_TutorialPopup::OnDestroy(){ return S_OK;}
HRESULT CScene_TutorialPopup::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled){ if( pData->nId == TUTORIAL_POPUP_FADE_TIMER_ID ) { XuiKillTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID); SetShow( false ); XuiSetTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); } else if( pData->nId == TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID ) { UpdateInteractScenePosition(IsShown() == TRUE); XuiKillTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID); }
return S_OK;}
void CScene_TutorialPopup::UpdateInteractScenePosition(bool visible){ if( m_interactScene == NULL ) return;
// 4J-PB - check this players screen section to see if we should allow the animation bool bAllowAnim=false; HXUICLASS sceneClass = XuiGetObjectClass( m_interactScene->m_hObj );
HXUICLASS inventoryClass = XuiFindClass( L"CXuiSceneInventory" ); HXUICLASS furnaceClass = XuiFindClass( L"CXuiSceneFurnace" ); HXUICLASS craftingClass = XuiFindClass( L"CXuiSceneCraftingPanel" ); HXUICLASS trapClass = XuiFindClass( L"CXuiSceneTrap" ); HXUICLASS containerClass = XuiFindClass( L"CXuiSceneContainer" ); HXUICLASS creativeInventoryClass = XuiFindClass( L"CXuiSceneInventoryCreative" ); HXUICLASS enchantingClass = XuiFindClass( L"CXuiSceneEnchant" ); HXUICLASS brewingClass = XuiFindClass( L"CXuiSceneBrewingStand" ); HXUICLASS anvilClass = XuiFindClass( L"CXuiSceneAnvil" ); HXUICLASS tradingClass = XuiFindClass( L"CXuiSceneTrading" ); BOOL isCraftingScene = XuiClassDerivesFrom( sceneClass, craftingClass ); BOOL isCreativeScene = XuiClassDerivesFrom( sceneClass, creativeInventoryClass );
switch(Minecraft::GetInstance()->localplayers[m_iPad]->m_iScreenSection) { case C4JRender::VIEWPORT_TYPE_FULLSCREEN: case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: bAllowAnim=true; break; default: // anim allowed for everything except the crafting 2x2 and 3x3, and the creative menu if(!isCraftingScene && !isCreativeScene) { bAllowAnim=true; } break; }
if(bAllowAnim) {
XUITimeline *timeline; XUINamedFrame *startFrame; XUINamedFrame *endFrame; bool movingLeft = false; // Also returns TRUE if they are the same (which is what we want) if( XuiClassDerivesFrom( sceneClass, inventoryClass ) || XuiClassDerivesFrom( sceneClass, furnaceClass ) || XuiClassDerivesFrom( sceneClass, trapClass ) || XuiClassDerivesFrom( sceneClass, containerClass ) || XuiClassDerivesFrom( sceneClass, enchantingClass ) || XuiClassDerivesFrom( sceneClass, brewingClass ) || XuiClassDerivesFrom( sceneClass, anvilClass ) || XuiClassDerivesFrom( sceneClass, tradingClass ) || isCreativeScene || isCraftingScene == TRUE ) { XuiElementGetTimeline( m_interactScene->m_hObj, &timeline); if(visible) { startFrame = timeline->FindNamedFrame( L"MoveLeft" ); endFrame = timeline->FindNamedFrame( L"EndMoveLeft" ); movingLeft = true; } else { startFrame = timeline->FindNamedFrame( L"MoveRight" ); endFrame = timeline->FindNamedFrame( L"EndMoveRight" ); }
if( (m_lastInteractSceneMoved != m_interactScene && movingLeft) || ( m_lastInteractSceneMoved == m_interactScene && m_lastSceneMovedLeft != movingLeft ) ) { timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, endFrame->m_dwFrame, FALSE, FALSE );
m_lastInteractSceneMoved = m_interactScene; m_lastSceneMovedLeft = movingLeft; } } }
}
HRESULT CScene_TutorialPopup::_SetDescription(CXuiScene *interactScene, LPCWSTR desc, LPCWSTR title, bool allowFade, bool isReminder){ HRESULT hr = S_OK; m_interactScene = interactScene; if( interactScene != m_lastInteractSceneMoved ) m_lastInteractSceneMoved = NULL; if(desc == NULL) { SetShow( false ); XuiSetTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); XuiKillTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID); } else { SetShow( true ); XuiSetTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME);
if( allowFade ) { //Initialise a timer to fade us out again XuiSetTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID,tutorial->GetTutorialDisplayMessageTime()); } else { XuiKillTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID); } m_bAllowFade = allowFade;
if(isReminder) { wstring text(app.GetString( IDS_TUTORIAL_REMINDER )); text.append( desc ); // set the text colour wchar_t formatting[40]; swprintf(formatting, 40, L"<font color=\"#%08x\" size=\"%d\">",app.GetHTMLColour(eHTMLColor_White),m_textFontSize); text = formatting + text;
hr = m_description.SetText( text.c_str() ); } else { wstring text(desc); // set the text colour wchar_t formatting[40]; swprintf(formatting, 40, L"<font color=\"#%08x\" size=\"%d\">",app.GetHTMLColour(eHTMLColor_White),m_textFontSize); text = formatting + text;
hr = m_description.SetText( text.c_str() ); }
D3DXVECTOR3 titlePos; hr = XuiElementGetPosition( m_title, &titlePos );
BOOL titleShowAtStart = m_title.IsShown(); if( title != NULL && title[0] != 0 ) { m_title.SetText( title ); m_title.SetShow(TRUE); } else { m_title.SetText( L"" ); m_title.SetShow(FALSE); } BOOL titleShowAtEnd = m_title.IsShown(); if(titleShowAtStart != titleShowAtEnd) { float fHeight, fWidth, fTitleHeight, fDescHeight, fDescWidth; m_title.GetBounds(&fWidth,&fTitleHeight); GetBounds(&fWidth,&fHeight);
// 4J Stu - For some reason when we resize the scene it resets the size of the HTML control // We don't want that to happen, so get it's size before and set it back after m_description.GetBounds(&fDescWidth,&fDescHeight); if(titleShowAtEnd) { titlePos.y += fTitleHeight;
SetBounds(fWidth, fHeight + fTitleHeight); } else { SetBounds(fWidth, fHeight - fTitleHeight); } XuiElementSetPosition( m_description, &titlePos ); m_description.SetBounds(fDescWidth, fDescHeight); }
// Check if we need to resize the box XUIContentDims contentDims; m_description.GetContentDims(&contentDims);
int heightDiff = contentDims.nContentHeight - contentDims.nPageHeight;
float fHeight, fWidth; GetBounds(&fWidth,&fHeight); SetBounds(fWidth, fHeight + heightDiff);
m_description.GetBounds(&fWidth,&fHeight); m_description.SetBounds(fWidth, (float)(contentDims.nPageHeight + heightDiff)); } return hr;}
HRESULT CScene_TutorialPopup::SetDescription(int iPad, TutorialPopupInfo *info){ HRESULT hr = S_OK;
#ifdef _XBOX HXUIOBJ hObj = app.GetCurrentTutorialScene(iPad); HXUICLASS thisClass = XuiFindClass( L"CScene_TutorialPopup" ); HXUICLASS objClass = XuiGetObjectClass( hObj );
// Also returns TRUE if they are the same (which is what we want) if( XuiClassDerivesFrom( objClass, thisClass ) ) {
CScene_TutorialPopup *pThis; hr = XuiObjectFromHandle(hObj, (void **) &pThis); if (FAILED(hr)) return hr;
wstring parsed = pThis->_SetIcon(info->icon, info->iAuxVal, info->isFoil, info->desc); parsed = pThis->_SetImage( parsed ); parsed = CScene_TutorialPopup::ParseDescription(iPad, parsed); if(parsed.empty()) { hr = pThis->_SetDescription( info->interactScene, NULL, NULL, info->allowFade, info->isReminder ); } else { hr = pThis->_SetDescription( info->interactScene, parsed.c_str(), info->title, info->allowFade, info->isReminder ); } }#endif return hr;}
wstring CScene_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWSTR desc){ wstring temp(desc);
BOOL iconShowAtStart = m_pCraftingPic->IsShown();
if( icon != TUTORIAL_NO_ICON ) { bool itemIsFoil = false; itemIsFoil = (shared_ptr<ItemInstance>(new ItemInstance(icon,1,iAuxVal)))->isFoil(); if(!itemIsFoil) itemIsFoil = isFoil;
m_pCraftingPic->SetIcon(m_iPad, icon,iAuxVal,1,10,31,false,itemIsFoil); } else { wstring openTag(L"{*ICON*}"); wstring closeTag(L"{*/ICON*}"); int iconTagStartPos = (int)temp.find(openTag); int iconStartPos = iconTagStartPos + (int)openTag.length(); if( iconTagStartPos > 0 && iconStartPos < (int)temp.length() ) { int iconEndPos = (int)temp.find( closeTag, iconStartPos );
if(iconEndPos > iconStartPos && iconEndPos < (int)temp.length() ) { wstring id = temp.substr(iconStartPos, iconEndPos - iconStartPos);
vector<wstring> idAndAux = stringSplit(id,L':');
int iconId = _fromString<int>(idAndAux[0]);
if(idAndAux.size() > 1) { iAuxVal = _fromString<int>(idAndAux[1]); } else { iAuxVal = 0; }
bool itemIsFoil = false; itemIsFoil = (shared_ptr<ItemInstance>(new ItemInstance(iconId,1,iAuxVal)))->isFoil(); if(!itemIsFoil) itemIsFoil = isFoil;
m_pCraftingPic->SetIcon(m_iPad, iconId,iAuxVal,1,10,31,false,itemIsFoil);
temp.replace(iconTagStartPos, iconEndPos - iconTagStartPos + closeTag.length(), L""); } } // remove any icon text else if(temp.find(L"{*CraftingTableIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Tile::workBench->id,0,1,10,31,false); } else if(temp.find(L"{*SticksIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::stick->id,0,1,10,31,false); } else if(temp.find(L"{*PlanksIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Tile::wood->id,0,1,10,31,false); } else if(temp.find(L"{*WoodenShovelIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::shovel_wood->id,0,1,10,31,false); } else if(temp.find(L"{*WoodenHatchetIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::hatchet_wood->id,0,1,10,31,false); } else if(temp.find(L"{*WoodenPickaxeIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::pickAxe_wood->id,0,1,10,31,false); } else if(temp.find(L"{*FurnaceIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Tile::furnace_Id,0,1,10,31,false); } else if(temp.find(L"{*WoodenDoorIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::door_wood->id,0,1,10,31,false); } else if(temp.find(L"{*TorchIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Tile::torch_Id,0,1,10,31,false); } else if(temp.find(L"{*BoatIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::boat_Id,0,1,10,31,false); } else if(temp.find(L"{*FishingRodIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::fishingRod_Id,0,1,10,31,false); } else if(temp.find(L"{*FishIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::fish_raw_Id,0,1,10,31,false); } else if(temp.find(L"{*MinecartIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Item::minecart_Id,0,1,10,31,false); } else if(temp.find(L"{*RailIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Tile::rail_Id,0,1,10,31,false); } else if(temp.find(L"{*PoweredRailIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Tile::goldenRail_Id,0,1,10,31,false); } else if(temp.find(L"{*StructuresIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, XZP_ICON_STRUCTURES,0,1,10,31,false); } else if(temp.find(L"{*ToolsIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, XZP_ICON_TOOLS,0,1,10,31,false); } else if(temp.find(L"{*StoneIcon*}")!=wstring::npos) { m_pCraftingPic->SetIcon(m_iPad, Tile::rock_Id,0,1,10,31,false); } else { // hide the icon slot m_pCraftingPic->SetIcon(m_iPad, 0,0,0,0,0,false,false,FALSE); } } BOOL iconShowAtEnd = m_pCraftingPic->IsShown(); if(iconShowAtStart != iconShowAtEnd) { float fHeight, fWidth, fIconHeight, fDescHeight, fDescWidth; m_pCraftingPic->GetBounds(&fWidth,&fIconHeight); GetBounds(&fWidth,&fHeight);
// 4J Stu - For some reason when we resize the scene it resets the size of the HTML control // We don't want that to happen, so get it's size before and set it back after m_description.GetBounds(&fDescWidth,&fDescHeight); if(iconShowAtEnd) { SetBounds(fWidth, fHeight + fIconHeight); } else { SetBounds(fWidth, fHeight - fIconHeight); } m_description.SetBounds(fDescWidth, fDescHeight); } return temp;}
wstring CScene_TutorialPopup::_SetImage(wstring &desc){
BOOL imageShowAtStart = m_image.IsShown();
wstring openTag(L"{*IMAGE*}"); wstring closeTag(L"{*/IMAGE*}"); int imageTagStartPos = (int)desc.find(openTag); int imageStartPos = imageTagStartPos + (int)openTag.length(); if( imageTagStartPos > 0 && imageStartPos < (int)desc.length() ) { int imageEndPos = (int)desc.find( closeTag, imageStartPos );
if(imageEndPos > imageStartPos && imageEndPos < (int)desc.length() ) { wstring id = desc.substr(imageStartPos, imageEndPos - imageStartPos); m_image.SetImagePath( id.c_str() ); m_image.SetShow( TRUE );
desc.replace(imageTagStartPos, imageEndPos - imageTagStartPos + closeTag.length(), L""); } } else { // hide the icon slot m_image.SetShow( FALSE ); } BOOL imageShowAtEnd = m_image.IsShown(); if(imageShowAtStart != imageShowAtEnd) { float fHeight, fWidth, fIconHeight, fDescHeight, fDescWidth; m_image.GetBounds(&fWidth,&fIconHeight); GetBounds(&fWidth,&fHeight);
// 4J Stu - For some reason when we resize the scene it resets the size of the HTML control // We don't want that to happen, so get it's size before and set it back after m_description.GetBounds(&fDescWidth,&fDescHeight); if(imageShowAtEnd) { SetBounds(fWidth, fHeight + fIconHeight); } else { SetBounds(fWidth, fHeight - fIconHeight); } m_description.SetBounds(fDescWidth, fDescHeight); } return desc;}
wstring CScene_TutorialPopup::ParseDescription(int iPad, wstring &text){ text = replaceAll(text, L"{*CraftingTableIcon*}", L""); text = replaceAll(text, L"{*SticksIcon*}", L""); text = replaceAll(text, L"{*PlanksIcon*}", L""); text = replaceAll(text, L"{*WoodenShovelIcon*}", L""); text = replaceAll(text, L"{*WoodenHatchetIcon*}", L""); text = replaceAll(text, L"{*WoodenPickaxeIcon*}", L""); text = replaceAll(text, L"{*FurnaceIcon*}", L""); text = replaceAll(text, L"{*WoodenDoorIcon*}", L""); text = replaceAll(text, L"{*TorchIcon*}", L""); text = replaceAll(text, L"{*MinecartIcon*}", L""); text = replaceAll(text, L"{*BoatIcon*}", L""); text = replaceAll(text, L"{*FishingRodIcon*}", L""); text = replaceAll(text, L"{*FishIcon*}", L""); text = replaceAll(text, L"{*RailIcon*}", L""); text = replaceAll(text, L"{*PoweredRailIcon*}", L""); text = replaceAll(text, L"{*StructuresIcon*}", L""); text = replaceAll(text, L"{*ToolsIcon*}", L""); text = replaceAll(text, L"{*StoneIcon*}", L"");
if( app.GetLocalPlayerCount() > 1 ) { // TODO TU-1 - This should really be a string as well rather than hardcoded here text = replaceAll(text, L"{*EXIT_PICTURE*}", L"<div align=\"center\"><img height=\"90\" width=\"160\" src=\"TutorialExitScreenshot.png\"/></div>" );
// TODO TU-1 - This should also be separate strings, or move these things out of a localisable file so we can add/change them at will text = replaceAll(text, L"height=\"30\" width=\"30\"", L"height=\"20\" width=\"20\""); } else { text = replaceAll(text, L"{*EXIT_PICTURE*}", app.GetString( IDS_TUTORIAL_HTML_EXIT_PICTURE ) ); } /*#define MINECRAFT_ACTION_RENDER_DEBUG ACTION_INGAME_13#define MINECRAFT_ACTION_PAUSEMENU ACTION_INGAME_15#define MINECRAFT_ACTION_SNEAK_TOGGLE ACTION_INGAME_17 */
return app.FormatHTMLString(iPad,text);}
HRESULT CScene_TutorialPopup::_SetVisible(bool show){ HRESULT hr = this->SetShow( show );
if( show && m_bAllowFade ) { //Initialise a timer to fade us out again XuiSetTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID,tutorial->GetTutorialDisplayMessageTime()); }
return hr;}
bool CScene_TutorialPopup::_IsSceneVisible(){ bool isVisible = this->IsShown()==TRUE?true:false;
return isVisible;}
HRESULT CScene_TutorialPopup::SetSceneVisible(int iPad, bool show){ HRESULT hr = S_OK;
HXUIOBJ hObj = app.GetCurrentTutorialScene(iPad); HXUICLASS thisClass = XuiFindClass( L"CScene_TutorialPopup" ); HXUICLASS objClass = XuiGetObjectClass( hObj );
// Also returns TRUE if they are the same (which is what we want) if( XuiClassDerivesFrom( objClass, thisClass ) ) { CScene_TutorialPopup *pThis; hr = XuiObjectFromHandle(hObj, (void **) &pThis); if (FAILED(hr)) return hr;
hr = pThis->_SetVisible( show ); } return hr;}
HRESULT CScene_TutorialPopup::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled){ bHandled=true; return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining);}
bool CScene_TutorialPopup::IsSceneVisible(int iPad){ bool isVisible = false; HRESULT hr;
HXUIOBJ hObj = app.GetCurrentTutorialScene(iPad); HXUICLASS thisClass = XuiFindClass( L"CScene_TutorialPopup" ); HXUICLASS objClass = XuiGetObjectClass( hObj );
// Also returns TRUE if they are the same (which is what we want) if( XuiClassDerivesFrom( objClass, thisClass ) ) { CScene_TutorialPopup *pThis; hr = XuiObjectFromHandle(hObj, (void **) &pThis); if (FAILED(hr)) return false;
isVisible = pThis->_IsSceneVisible(); } return isVisible;}