view LightClone/Source/World.cpp @ 37:58a16d529d95

Refactoring code and adding events for drag and drop
author koryspansel <koryspansel@bendbroadband.com>
date Wed, 21 Sep 2011 20:30:29 -0700
parents b60cbf3fa894
children 2caa7c7e2cb5
line wrap: on
line source

/*
 * World
 */

#include "World.h"
#include "VertexTypes.h"
#include "GuiLabel.h"
#include "GuiImage.h"
#include "GuiButton.h"

/*
 * World
 */
World::World()
{
	nGameState			= GameState_Active;
	nSimulationState	= SimulationState_Idle;
	nCurrentLevel		= 0;
}

/*
 * Initialize
 */
ErrorCode World::Initialize(EventSystem* pSystem, ResourceManager* pResourceManager, InputManager* pInput)
{
	ErrorCode eCode = Error_Fail;

	if(pResourceManager && pInput)
	{
		pEventSystem = pSystem;
		pInputManager = pInput;

		eCode = kEnvironment.Initialize(pResourceManager);
		if(eCode == Error_Success)
		{
			eCode = kBot.Initialize(pResourceManager);
			if(eCode == Error_Success)
			{
				eCode = kProgram.Initialize();
				if(eCode == Error_Success)
				{
					eCode = InitializeInterface(pResourceManager);				
					if(eCode == Error_Success)
					{
						nCurrentLevel	= 2;
						nGameState		= GameState_LoadMap;
					}
				}
			}
		}
	}

	return eCode;
}

/*
 * Terminate
 */
void World::Terminate()
{
	kInterface.Terminate();
	kProgram.Terminate();
	kBot.Terminate();
	kEnvironment.Terminate();
}

/*
 * Activate
 */
void World::Activate()
{
	nGameState = GameState_LoadMap;
}

/*
 * Deactivate
 */
void World::Deactivate()
{
	nGameState = GameState_Exit;
}

/*
 * IsActive
 */
bool World::IsActive()
{
	return nGameState != GameState_Exit;
}

/*
 * Load
 */
bool World::Load(const char* pName)
{
	ErrorCode eCode = kLoader.Load(pName);
	if(eCode == Error_Success)
	{
		const Size& kSize = kLoader.GetSize();

		eCode = kEnvironment.Setup(kSize.X, kSize.Y);
		if(eCode == Error_Success)
		{
			for(uint32 nY = 0; nY < kSize.Y; ++nY)
			{
				for(uint32 nX = 0; nX < kSize.X; ++nX)
				{
					kEnvironment.SetType(nX, nY, kLoader.GetTowerType(nX, nY));
					kEnvironment.SetAltitude(nX, nY, kLoader.GetTowerHeight(nX, nY));
				}
			}

			kBot.Setup(&kEnvironment);
			kBot.SetPosition(kLoader.GetInitialPosition());
			kBot.SetDirection(kLoader.GetInitialDirection());
		}
	}

	return eCode == Error_Success;
}

/*
 * Update
 */
void World::Update(float fElapsed)
{
	ProcessInput(fElapsed);

	if(nGameState == GameState_LoadMap)
	{
		char kBuffer[256];
		sprintf_s(kBuffer, "Data\\Maps\\Map%02d.map", nCurrentLevel++);

		nGameState = Load(kBuffer) ? GameState_Active : GameState_Over;
	}
	else

	if(nGameState == GameState_Active)
	{
		if(nSimulationState == SimulationState_Active)
		{
			if(kBot.Update(fElapsed))
			{
				if(kEnvironment.RequirementsMet())
				{
					//kDialog.Reset("Some message");
					//kDialog.AddButton(DialogButton_Ok, "Ok", 0.0f, 0.0f, 0.0f, 0.0f);

					nGameState = GameState_Complete;
				}
			}
		}

		kInterface.Update(fElapsed);
	}
}

/*
 * Render
 */
void World::Render(RenderContext& kContext)
{
	const uint32 nColor = D3DCOLOR_XRGB(32, 32, 32);

	kContext.Begin(nColor);

	//TODO: Remove
	if(nGameState >= GameState_Active)
	{
		D3DVIEWPORT9 kOriginal;
		kContext.GetViewport(&kOriginal);

		D3DVIEWPORT9 kViewport;
		kViewport.X			= 0;
		kViewport.Y			= 0;
		kViewport.Width		= ScreenSizeX - 280;
		kViewport.Height	= ScreenSizeY;
		kViewport.MinZ		= kOriginal.MinZ;
		kViewport.MaxZ		= kOriginal.MaxZ;

		kContext.SetViewport(kViewport);

		kCameraController.SetMode(CameraMode_3D);
		Render3D(kContext);

		kContext.SetViewport(kOriginal);

		kCameraController.SetMode(CameraMode_2D);
		Render2D(kContext);
	}

	kContext.End();
}

/*
 * InitializeInterface
 */
ErrorCode World::InitializeInterface(ResourceManager* pResourceManager)
{
	ErrorCode eCode = kInterface.Initialize(pResourceManager, pInputManager);
	if(eCode == Error_Success)
	{
		pBackground = new GuiImage();
		pBackground->Initialize(pResourceManager);
		pBackground->SetTexture("Data\\Textures\\Background03.tga", true);
		pBackground->SetPosition(ScreenSizeX - pBackground->GetWidth(), 0.0f);

		pToolbar = new CodePanel(4, 2);
		pToolbar->Initialize(pResourceManager);
		pToolbar->SetTexture("Data\\Textures\\PanelA.png");
		pToolbar->SetPosition(16, 16.0f);
		pToolbar->SetSlot(0, Action_Forward);
		pToolbar->SetSlot(1, Action_RotateCW);
		pToolbar->SetSlot(2, Action_RotateCCW);
		pToolbar->SetSlot(3, Action_Jump);
		pToolbar->SetSlot(4, Action_Light);
		pToolbar->SetSlot(5, Action_FunctionA);
		pToolbar->SetSlot(6, Action_FunctionB);
		pToolbar->SetPermanent(true);

		GuiLabel* pMainLabel = new GuiLabel();
		pMainLabel->Initialize(pResourceManager);
		pMainLabel->SetFont("Courier New", 16);
		pMainLabel->SetText("Main:");
		pMainLabel->SetColor(D3DCOLOR_XRGB(0, 0, 0));
		pMainLabel->SetPosition(26.0f, 149.0f);

		pMain = new CodePanel(4, 3);
		pMain->Initialize(pResourceManager);
		pMain->SetTexture("Data\\Textures\\PanelB.png");
		pMain->SetPosition(16.0f, 160.0f);

		GuiLabel* pFunctionALabel = new GuiLabel();
		pFunctionALabel->Initialize(pResourceManager);
		pFunctionALabel->SetFont("Courier New", 16);
		pFunctionALabel->SetText("Function 1:");
		pFunctionALabel->SetColor(D3DCOLOR_XRGB(0, 0, 0));
		pFunctionALabel->SetPosition(26.0f, 349.0f);

		pFunctionA = new CodePanel(4, 2);
		pFunctionA->Initialize(pResourceManager);
		pFunctionA->SetTexture("Data\\Textures\\PanelA.png");
		pFunctionA->SetPosition(16.0f, 360.0f);
		//pFunctionA->Upload(

		GuiLabel* pFunctionBLabel = new GuiLabel();
		pFunctionBLabel->Initialize(pResourceManager);
		pFunctionBLabel->SetFont("Courier New", 16);
		pFunctionBLabel->SetText("Function 2:");
		pFunctionBLabel->SetColor(D3DCOLOR_XRGB(0, 0, 0));
		pFunctionBLabel->SetPosition(26.0f, 493.0f);

		pFunctionB = new CodePanel(4, 2);
		pFunctionB->Initialize(pResourceManager);
		pFunctionB->SetTexture("Data\\Textures\\PanelA.png");
		pFunctionB->SetPosition(16.0f, 504.0f);

		const float fButtonPadding	= 32.0f;
		const float fButtonSpacing	= 8.0f;
		const float fButtonSize		= 48.0f;

		pButtonPlay = new GuiButton();
		pButtonPlay->Initialize(pResourceManager);
		pButtonPlay->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Button1N.png", true);
		pButtonPlay->SetTexture(GuiButtonState_Hover, "Data\\Textures\\Button1H.png", true);
		pButtonPlay->SetTexture(GuiButtonState_Down, "Data\\Textures\\Button1D.png", true);
		pButtonPlay->SetFont("Courier New", 16, FW_BOLD);
		pButtonPlay->SetText("Play");
		pButtonPlay->SetColor(D3DCOLOR_XRGB(0, 0, 0));
		pButtonPlay->SetPosition(fButtonPadding + 0.0f * (fButtonSize + fButtonSpacing), 652.0f);
		pButtonPlay->Subscribe(GuiButton::EventClick, &World::OnPlay, this);

		pButtonStop = new GuiButton();
		pButtonStop->Initialize(pResourceManager);
		pButtonStop->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Button1N.png", true);
		pButtonStop->SetTexture(GuiButtonState_Hover, "Data\\Textures\\Button1H.png", true);
		pButtonStop->SetTexture(GuiButtonState_Down, "Data\\Textures\\Button1D.png", true);
		pButtonStop->SetFont("Courier New", 16, FW_BOLD);
		pButtonStop->SetText("Stop");
		pButtonStop->SetColor(D3DCOLOR_XRGB(0, 0, 0));
		pButtonStop->SetPosition(fButtonPadding + 1.0f * (fButtonSize + fButtonSpacing), 652.0f);
		pButtonStop->Subscribe(GuiButton::EventClick, &World::OnStop, this);

		pButtonReset = new GuiButton();
		pButtonReset->Initialize(pResourceManager);
		pButtonReset->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Button1N.png", true);
		pButtonReset->SetTexture(GuiButtonState_Hover, "Data\\Textures\\Button1H.png", true);
		pButtonReset->SetTexture(GuiButtonState_Down, "Data\\Textures\\Button1D.png", true);
		pButtonReset->SetFont("Courier New", 16, FW_BOLD);
		pButtonReset->SetText("Reset");
		pButtonReset->SetColor(D3DCOLOR_XRGB(0, 0, 0));
		pButtonReset->SetPosition(fButtonPadding + 2.0f * (fButtonSize + fButtonSpacing), 652.0f);
		pButtonReset->Subscribe(GuiButton::EventClick, &World::OnReset, this);

		pButtonExit = new GuiButton();
		pButtonExit->Initialize(pResourceManager);
		pButtonExit->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Button1N.png", true);
		pButtonExit->SetTexture(GuiButtonState_Hover, "Data\\Textures\\Button1H.png", true);
		pButtonExit->SetTexture(GuiButtonState_Down, "Data\\Textures\\Button1D.png", true);
		pButtonExit->SetFont("Courier New", 16, FW_BOLD);
		pButtonExit->SetText("Exit");
		pButtonExit->SetColor(D3DCOLOR_XRGB(0, 0, 0));
		pButtonExit->SetPosition(fButtonPadding + 3.0f * (fButtonSize + fButtonSpacing), 652.0f);
		pButtonExit->Subscribe(GuiButton::EventClick, &World::OnExit, this);

		pBackground->Add(pToolbar);
		pBackground->Add(pMainLabel);
		pBackground->Add(pMain);
		pBackground->Add(pFunctionALabel);
		pBackground->Add(pFunctionA);
		pBackground->Add(pFunctionBLabel);
		pBackground->Add(pFunctionB);
		pBackground->Add(pButtonPlay);
		pBackground->Add(pButtonStop);
		pBackground->Add(pButtonReset);
		pBackground->Add(pButtonExit);

		pLevelDialog = new GuiImage();
		pLevelDialog->Initialize(pResourceManager);
		pLevelDialog->ClearFlag(GuiElementFlag_Visible);
		pLevelDialog->SetTexture("Data\\Textures\\Dialog0.tga", true);
		pLevelDialog->SetPosition(0.5f * (ScreenSizeX - pLevelDialog->GetWidth()), 0.5f * (ScreenSizeY - pLevelDialog->GetHeight()));

		pLevelDialogOk = new GuiButton();
		pLevelDialogOk->Initialize(pResourceManager);
		pLevelDialogOk->SetTexture(GuiButtonState_Normal, "Data\\Textures\\ButtonN.tga");
		pLevelDialogOk->SetTexture(GuiButtonState_Hover, "Data\\Textures\\ButtonH.tga");
		pLevelDialogOk->SetTexture(GuiButtonState_Down, "Data\\Textures\\ButtonD.tga");
		pLevelDialogOk->SetFont("Courier New", 24);
		pLevelDialogOk->SetText("Ok");
		pLevelDialogOk->SetDimensions(150.0f, 52.0f);
		pLevelDialogOk->SetPosition(0.5f * (pLevelDialog->GetWidth() - pLevelDialogOk->GetWidth()), 171.0f);
		pLevelDialogOk->Subscribe(GuiButton::EventClick, &World::OnExit, this);

		pLevelDialog->Add(pLevelDialogOk);

		pGameDialog = new GuiImage();
		pGameDialog->Initialize(pResourceManager);
		pGameDialog->ClearFlag(GuiElementFlag_Visible);
		pGameDialog->SetTexture("Data\\Textures\\Dialog0.tga", true);
		pGameDialog->SetPosition(0.5f * (ScreenSizeX - pGameDialog->GetWidth()), 0.5f * (ScreenSizeY - pGameDialog->GetHeight()));

		pGameDialogOk = new GuiButton();
		pGameDialogOk->Initialize(pResourceManager);
		pGameDialogOk->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Button.tga", true);
		pGameDialogOk->SetText("Ok");
		pGameDialogOk->SetPosition(0.5f * (pGameDialog->GetWidth() - pGameDialogOk->GetWidth()), 171.0f);
		pGameDialogOk->Subscribe(GuiButton::EventClick, &World::OnExit, this);

		pGameDialog->Add(pGameDialogOk);

		kInterface.Add(pBackground);
		kInterface.Add(pLevelDialog);
		kInterface.Add(pGameDialog);
	}

	return eCode;
}

/*
 * Render3D
 */
void World::Render3D(RenderContext& kContext)
{
	kEnvironment.Render(kContext, kCameraController);
	kBot.Render(kContext, kCameraController);
}

/* 
 * Render2D
 */
void World::Render2D(RenderContext& kContext)
{
	kInterface.Render(kContext, kCameraController);
}

/*
 * ProcessInput
 */
void World::ProcessInput(float fElapsed)
{
	#if defined(_DEBUG)
	if(pInputManager->IsKeyDown(DIK_LEFT))
	{
		kCameraController.Yaw(0.01f);
	}
	else

	if(pInputManager->IsKeyDown(DIK_RIGHT))
	{
		kCameraController.Yaw(-0.01f);
	}

	if(pInputManager->IsKeyDown(DIK_UP))
	{
		kCameraController.Pitch(0.01f);
	}
	else

	if(pInputManager->IsKeyDown(DIK_DOWN))
	{
		kCameraController.Pitch(-0.01f);
	}

	if(pInputManager->IsKeyDown(DIK_NEXT))
	{
		kCameraController.Move(0.1f);
	}
	else

	if(pInputManager->IsKeyDown(DIK_PRIOR))
	{
		kCameraController.Move(-0.1f);
	}
	#endif
}

/*
 * OnPlay
 */
void World::OnPlay(GuiEventArguments& kArguments)
{
	if(nSimulationState == SimulationState_Idle)
	{
		kEnvironment.Reset();

		kBot.Reset();
		kBot.SetPosition(kLoader.GetInitialPosition());
		kBot.SetDirection(kLoader.GetInitialDirection());

		kProgram.Upload(kBot.GetVirtualMachine());

		nSimulationState = SimulationState_Active;
	}
}

/*
 * OnStop
 */
void World::OnStop(GuiEventArguments& kArguments)
{
	if(nSimulationState == SimulationState_Active)
	{
		kEnvironment.Reset();

		kBot.Reset();
		kBot.SetPosition(kLoader.GetInitialPosition());
		kBot.SetDirection(kLoader.GetInitialDirection());

		nSimulationState = SimulationState_Idle;
	}
}

/*
 * OnReset
 */
void World::OnReset(GuiEventArguments& kArguments)
{
	kProgram.Clear();

	pMain->Clear();
	pFunctionA->Clear();
	pFunctionB->Clear();
}

/*
 * OnExit
 */
void World::OnExit(GuiEventArguments& kArguments)
{
	nGameState = GameState_Exit;
}