Click here to Skip to main content
15,894,460 members
Articles / Programming Languages / C

Another Star Trek Game (The Retro One)

Rate me:
Please Sign up or sign in to vote.
5.00/5 (14 votes)
27 Aug 2008CPOL6 min read 54.6K   2.2K   32  
The Star Trek game reworked, using a 2D retro look
#include "StdAfx.h"
#include "CommandManager.h"

#include "Game.h"
#include "GameData.h"
#include "Galaxy.h"
#include "ShipMonitor.h"
#include "Phaser.h"
#include "Torpedo.h"
#include "KlingonShip.h"
#include "Console.h"
#include "Controller.h"
#include "ShipDisplay.h"
#include "HelpScreen.h"

CommandManager::CommandManager()
{
  m_curValidationMode = WaitForCommand;
}

CommandManager::~CommandManager(void)
{
}

bool CommandManager::onEnter(EKEY_CODE keyCode)
{
	if (keyCode == KEY_RETURN && m_curValidationMode != WaitForAnimation)
	{
		validateCommand();
	}
	else
	{
		if (keyCode == KEY_UP)
		{
			m_pHelpScreen->lineUp();
		}
		else if(keyCode == KEY_DOWN)
		{
			m_pHelpScreen->lineDown();
		}
		else
		{
			if(m_pHelpScreen->isVisible())
			{
				m_pMonitor->setMode(ShipMonitor::SectorView);	
				m_pHelpScreen->goTop();
			}

			setReady();
		}
	}
	
	return true;
}

void CommandManager::setReady()
{
	m_curValidationMode = WaitForCommand;
	
	m_pConsole->resetConsole();
  m_pController->runEnemyAI();

	m_pDisplay->show();
	m_pHelpScreen->hide();
}

void CommandManager::setEnterprise(Enterprise* pEnterprise)
{
	m_pEnterprise = pEnterprise;
}

void CommandManager::setShipMonitor(ShipMonitor* pMonitor)
{
	m_pMonitor = pMonitor;
}

void CommandManager::setConsole(Console* pConsole)
{
	m_pConsole = pConsole;

	m_pConsole->addOnKeyPress(new KeyPressed<CommandManager>(this, &CommandManager::onEnter));

	m_pConsole->resetConsole();
}

void CommandManager::setController(Controller* pController)
{
	m_pController = pController;
}

void CommandManager::setShipDisplay(ShipDisplay* pDisplay)
{
	m_pDisplay = pDisplay;
}

void CommandManager::validateCommand()
{
	switch(m_curValidationMode)
	{
	case WaitForCommand:
		executeCommand();
		break;

	case NavigateWaitForCourse:
		storeNavigationCourse();
		break;

	case NavigateWaitForDistance:
		storeNavigationDistance();
		break;

	case LaunchWaitForEnergy:
		launchPhaserWaitForEnergy();
		break;

  case LaunchWaitForCourse:
    launchTorpedoWaitForCourse();
    break;

  case LaunchWaitForCoordinates:
    launchTorpedoWaitForCoordinates();
    break;

	case TransferWaitForEnergy:
		transferWaitForEnergy();
		break;

	default:
		//	unknown command reset
		m_pMonitor->setMode(ShipMonitor::SectorView);
		setReady();
		
    break;
	}
}


void CommandManager::storeNavigationCourse()
{
	m_dblCourse = m_pConsole->getDoubleValue();
	commandWaitForDistance();
}

void CommandManager::storeNavigationDistance()
{
	m_dblDistance = m_pConsole->getDoubleValue();

  m_pEnterprise->moveShip(m_dblCourse, m_dblDistance);
  m_pMonitor->setMode(ShipMonitor::SectorView);

	Game::getInstance()->getGameData()->timePased(0.5 * m_dblDistance);
  
  turnOver();
}

void CommandManager::executeCommand()
{
	switch(m_pConsole->getIntegerValue())
	{
	case Navigate:
		commandWaitForCourse();
		break;

	case ShortRangeScan:
		m_pMonitor->setMode(ShipMonitor::SectorView);		
    setReady();
		break;

	case LongRangeScan:
		m_pEnterprise->doLongRangeScan();
		m_pMonitor->setScanInfo(m_pEnterprise->getLongRangeScanData());
		m_pMonitor->setMode(ShipMonitor::QuadrantView);
		setReady();
		break;

	case LaunchPhaser:
		launchPhaser();
		break;

	case LaunchTorpedo:
    launchTorpedo();
		break;

	case TransferEnergy:
		transferEnergy();
		break;

	case ShowDamageReport:
		loadDamageReport();
		break;

  case UseComputer:
    useComputer();
    break;

	case ShowHelp:
		loadHelp();
		break;

	default:
		setReady();
		break;
	}
}

void CommandManager::commandWaitForCourse()
{
	m_curValidationMode = NavigateWaitForCourse;
	
	m_pConsole->addLine(L"ENTER THE COURSE (1-9):");
}

void CommandManager::commandWaitForDistance()
{
	m_curValidationMode = NavigateWaitForDistance;

	stringw wText = L"ENTER THE WARPSPEED (0-";
	wText += m_pEnterprise->getMaxWarpSpeed();
	wText += "):";

	m_pConsole->addLine(wText.c_str());
}

void CommandManager::launchPhaser()
{
	//	Check for target
	m_pConsole->addLine(L"LAUNCH PHASER");

	stringw wText = L"AMOUNT OF ENERGY AVAILABLE (";

	wText += m_pEnterprise->m_iEnergyLevel;

	wText += L")";

	m_pConsole->addLine(wText);
	m_pConsole->addLine(L"ENTER THE ENERGY TO USE:");

	m_curValidationMode = LaunchWaitForEnergy;

	Game::getInstance()->getGameData()->timePased(0.10);
}

void CommandManager::launchPhaserWaitForEnergy()
{
	m_pController->launchPhaserAtKlingon(m_pConsole->getIntegerValue());
	
	turnOver();
}

void CommandManager::animationDone()
{
}

void CommandManager::launchTorpedo()
{
  m_curValidationMode = LaunchWaitForCourse;

  m_pConsole->addLine(L"ENTER THE COURSE OF THE TORPEDO (1-9, 0 TO USE COMPUTER):");
}

void CommandManager::launchTorpedoWaitForCourse()
{
  if(m_pConsole->getIntegerValue() == 0)
  {
    //  get computer aid
    //
    m_curValidationMode = LaunchWaitForCoordinates;
		m_pConsole->addLine(L"ENTER THE COORDINATES OF KLINGON SHIP (X,Y):");
  }
  else
  {
		m_pController->launchTorpedo(m_pConsole->getDoubleValue());

		Game::getInstance()->getGameData()->timePased(0.10);

		turnOver();
  }
}

void CommandManager::launchTorpedoWaitForCoordinates()
{
  m_curValidationMode = LaunchWaitForCourse;

  double dblCourse = m_pEnterprise->getTorpedoCourse(m_pConsole->getCoordinateValue());

  stringw wText = L"CALCULATED COURSE IS: ";
  wText += dblCourse;

  m_pConsole->addLine(wText);
  m_pConsole->addLine(L"ENTER THE COURSE OF THE TORPEDO (1-9, 0 TO USE COMPUTER):");
}

void CommandManager::transferEnergy()
{
	stringw wText = L"AMOUNT OF ENERGY AVAILABLE (";

	wText += m_pEnterprise->m_iEnergyLevel;

	wText += L")";

	m_pConsole->addLine(wText);
	m_pConsole->addLine(L"ENTER THE ENERGY TO TRANSFER:");
	
	m_curValidationMode = TransferWaitForEnergy;
}

void CommandManager::transferWaitForEnergy()
{
	m_pEnterprise->transferEnergy(m_pConsole->getIntegerValue());

	m_pMonitor->setMode(ShipMonitor::SectorView);
	
  setReady();
}

void CommandManager::loadDamageReport()
{
	m_pMonitor->setMode(ShipMonitor::DamageReport);	
	setReady();
}

void CommandManager::useComputer()
{
	m_pMonitor->setMode(ShipMonitor::ComputerLog);
	setReady();
}

void CommandManager::turnOver()
{
  m_pEnterprise->updateEnterprise();

  Sector* pSector = Game::getInstance()->getGameData()->getGalaxy().getCurrentSector();

  if(pSector->getNumberofKlingons() > 0)
  {
    m_pController->allowEnemyAI();
    
    m_curValidationMode = WaitForAnimation;
  }
  else
  {
    m_curValidationMode = WaitForCommand;
  }

	m_pMonitor->setMode(ShipMonitor::SectorView);

  setReady();
}

void CommandManager::loadHelp()
{
	m_pMonitor->setMode(ShipMonitor::Help);	
	
	setReady();
	
	//	override default display setting
	m_pDisplay->hide();
	m_pHelpScreen->show();
}

void CommandManager::setHelpScreen(HelpScreen* pHelp)
{
	m_pHelpScreen = pHelp;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
Belgium Belgium
I'm from Belgium, happily (should my wife ever read this) married and have two boys.

After a first attempt on the Atari during college in
an old foreign dialect of basic, via Pascal I am now
developing mostly in VC++ / VB / C#.

Comments and Discussions