topical media & game development

talk show tell print

lib-game-delta3d-demos-fireFighter-hudcomponent.cpp / cpp



  /* -*-c++-*-
   * Delta3D Open Source Game and Simulation Engine
   * Copyright (C) 2006, Alion Science and Technology, BMH Operation
   *
   * This library is free software; you can redistribute it and/or modify it under
   * the terms of the GNU Lesser General Public License as published by the Free
   * Software Foundation; either version 2.1 of the License, or (at your option)
   * any later version.
   *
   * This library is distributed in the hope that it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
   * details.
   *
   * You should have received a copy of the GNU Lesser General Public License
   * along with this library; if not, write to the Free Software Foundation, Inc.,
   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
   *
   * William E. Johnson II
   */
  
  include <fireFighter/hudcomponent.h>
  include <fireFighter/messagetype.h>
  include <fireFighter/messages.h>
  include <fireFighter/gamestate.h>
  include <fireFighter/exception.h>
  include <fireFighter/firehoseactor.h>
  include <fireFighter/firesuitactor.h>
  include <fireFighter/scbaactor.h>
  include <fireFighter/fireactor.h>
  include <fireFighter/helpwindow.h>
  include <dtCore/globals.h>
  include <dtCore/deltawin.h>
  include <dtActors/taskactorgameevent.h>
  include <dtUtil/fileutils.h>
  include <dtUtil/exception.h>
  include <dtABC/application.h>
  include <dtGUI/ceuidrawable.h>
  include <dtGame/taskcomponent.h>
  include <dtGame/exceptionenum.h>
  include <dtDAL/gameevent.h>
  include <dtLMS/lmscomponent.h>
  
  ifdef None
  #undef None
  endif
  include <CEGUI.h>
  
  using dtCore::RefPtr;
  
  const std::string HUDComponent::NAME = "HUDComponent";
  
  HUDComponent::HUDComponent(dtCore::DeltaWin& win,
                             dtCore::Keyboard& keyboard,
                             dtCore::Mouse& mouse,
                             const std::string& name)
     : dtGame::GMComponent(name)
     , mStartWithObjectives(NULL)
     , mStart(NULL)
     , mQuit(NULL)
     , mReturnToMenu(NULL)
     , mMainWindow(NULL)
     , mWindowBackground(NULL)
     , mHUDBackground(NULL)
     , mDebriefBackground(NULL)
     , mIntroBackground(NULL)
     , mGameItemImage(NULL)
     , mFireSuitIcon(NULL)
     , mFireHoseIcon(NULL)
     , mSCBAIcon(NULL)
     , mInventoryUseFireSuitIcon(NULL)
     , mInventoryUseFireHoseIcon(NULL)
     , mInventoryUseSCBAIcon(NULL)
     , mInventorySelectIcon(NULL)
     , mTargetIcon(NULL)
     , mAppHeader(NULL)
     , mDebriefHeaderText(NULL)
     , mIntroText(NULL)
     , mShowObjectives(true)
     , mCurrentState(&GameState::STATE_UNKNOWN)
     , mFireSuitIconPos(cegui_reldim(0.525f), cegui_reldim(0.8f))
     , mFireHoseIconPos(cegui_reldim(0.688f), cegui_reldim(0.8f))
     , mSCBAIconPos(cegui_reldim(0.85f), cegui_reldim(0.8f))
     , mTasksHeaderText(NULL)
     , mNumTasks(11)
     , mMissionCompletedText(NULL)
     , mMissionFailedText(NULL)
     , mMissionComplete(false)
     , mMissionFailed(false)
     , mFailedProxy(NULL)
     , mCompleteOrFail(NULL)
     , mFailReason(NULL)
     , mHUDOverlay(NULL)
  {
     SetupGUI(win, keyboard, mouse);
  }
  
  HUDComponent::~HUDComponent()
  {
  
  }
  
  void HUDComponent::SetupGUI(dtCore::DeltaWin& win,
                              dtCore::Keyboard& keyboard,
                              dtCore::Mouse& mouse)
  {
     mGUI = new dtGUI::CEUIDrawable(&win, &keyboard, &mouse);
  
     try
     {
        std::string scheme = "CEGUI/schemes/WindowsLook.scheme";
        std::string path = dtCore::FindFileInPathList(scheme);
        if (path.empty())
        {
           throw dtUtil::Exception(ExceptionEnum::CEGUI_EXCEPTION,
              "Failed to find the scheme file.", __FILE__, __LINE__);
        }
  
        std::string dir = path.substr(0, path.length() - (scheme.length() - 5));
        dtUtil::FileUtils::GetInstance().PushDirectory(dir);
        CEGUI::SchemeManager::getSingleton().loadScheme(path);
        dtUtil::FileUtils::GetInstance().PopDirectory();
  
        CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr();
        CEGUI::System::getSingleton().setDefaultFont("DejaVuSans-10");
        mMainWindow = wm->createWindow("DefaultGUISheet", "root");
        CEGUI::System::getSingleton().setGUISheet(mMainWindow);
  
        BuildMainMenu();
        BuildIntroMenu();
        BuildHUD();
        BuildEndMenu();
     }
     catch(const CEGUI::Exception& e)
     {
        throw dtUtil::Exception(ExceptionEnum::CEGUI_EXCEPTION, e.getMessage().c_str(),
           __FILE__, __LINE__);
     }
  }
  
  void HUDComponent::OnAddedToGM()
  {
     GetGameManager()->GetApplication().AddDrawable(mGUI.get());
  }
  
  void HUDComponent::ProcessMessage(const dtGame::Message& msg)
  {
     if (msg.GetMessageType() == MessageType::GAME_STATE_CHANGED)
     {
        const GameStateChangedMessage& gscm = static_cast<const GameStateChangedMessage&>(msg);
        mCurrentState = &gscm.GetNewState();
        Refresh();
     }
     else if (msg.GetMessageType() == dtGame::MessageType::INFO_MAP_LOADED)
     {
        GetGameManager()->GetApplication().AddDrawable(mGUI.get());
     }
     else if (msg.GetMessageType() == MessageType::ITEM_INTERSECTED)
     {
        if (!msg.GetAboutActorId().ToString().empty())
        {
           dtGame::GameActorProxy* proxy = GetGameManager()->FindGameActorById(msg.GetAboutActorId());
           if (dynamic_cast<FireActor*>(proxy->GetActor()) == NULL)
           {
              ShowGameItemImage();
           }
           else
           {
              HideGameItemImage();
           }
        }
        else
        {
           HideGameItemImage();
        }
     }
     else if (msg.GetMessageType() == MessageType::ITEM_ACQUIRED)
     {
        dtGame::GameActorProxy* proxy = GetGameManager()->FindGameActorById(msg.GetAboutActorId());
        AddItemToHUD(dynamic_cast<GameItemActor*>(proxy->GetActor()));
     }
     else if (msg.GetMessageType() == MessageType::ITEM_SELECTED)
     {
        dtGame::GameActorProxy* proxy = GetGameManager()->FindGameActorById(msg.GetAboutActorId());
        SetSelectedItem(dynamic_cast<GameItemActor*>(proxy->GetActor()));
     }
     else if (msg.GetMessageType() == MessageType::ITEM_ACTIVATED)
     {
        dtGame::GameActorProxy* proxy = GetGameManager()->FindGameActorById(msg.GetAboutActorId());
        SetActivatedItem(dynamic_cast<GameItemActor*>(proxy->GetActor()));
        UpdateHUDBackground();
     }
     else if (msg.GetMessageType() == MessageType::ITEM_DEACTIVATED)
     {
        dtGame::GameActorProxy* proxy = GetGameManager()->FindGameActorById(msg.GetAboutActorId());
        SetDeactivatedItem(dynamic_cast<GameItemActor*>(proxy->GetActor()));
        UpdateHUDBackground();
     }
     else if (msg.GetMessageType() == dtGame::MessageType::TICK_LOCAL)
     {
        if (*mCurrentState == GameState::STATE_RUNNING)
        {
           UpdateMediumDetailData(mHUDBackground);
        }
        else if (*mCurrentState == GameState::STATE_DEBRIEF)
        {
           RefreshDebriefScreen();
        }
     }
     else if (msg.GetMessageType() == MessageType::MISSION_COMPLETE)
     {
        mMissionComplete = true;
        mMissionFailed = false;
        Refresh();
     }
     else if (msg.GetMessageType() == MessageType::MISSION_FAILED)
     {
        mMissionFailed = true;
        mMissionComplete = false;
        GetGameManager()->FindActorById(msg.GetAboutActorId(), mFailedProxy);
        Refresh();
     }
     else if (msg.GetMessageType() == MessageType::HELP_WINDOW_OPENED)
     {
        mHelpWindow->Enable(true);
        ShowMouse(true);
     }
     else if (msg.GetMessageType() == MessageType::HELP_WINDOW_CLOSED)
     {
        mHelpWindow->Enable(false);
        ShowMouse(false);
     }
  }
  
  void HUDComponent::ShowMainMenu()
  {
     HideMenus();
     ShowMouse(true);
     mWindowBackground->show();
  }
  
  void HUDComponent::ShowHUD()
  {
     HideMenus();
     ShowMouse(false);
  
     mHUDBackground->show();
     if (mMissionComplete)
     {
        mMissionCompletedText->show();
     }
     else if (mMissionFailed)
     {
        mMissionFailedText->show();
     }
  }
  
  void HUDComponent::ShowEndMenu()
  {
     HideMenus();
     ShowMouse(true);
  
     mDebriefBackground->show();
  }
  
  void HUDComponent::ShowIntroMenu()
  {
     HideMenus();
     mIntroBackground->show();
  }
  
  void HUDComponent::ShowGameItemImage()
  {
     mGameItemImage->show();
  }
  
  void HUDComponent::HideGameItemImage()
  {
     mGameItemImage->hide();
  }
  
  void HUDComponent::HideMenus()
  {
     mWindowBackground->hide();
     mHUDBackground->hide();
     mDebriefBackground->hide();
     mIntroBackground->hide();
  }
  
  void HUDComponent::BuildMainMenu()
  {
     CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr();
     //CEGUI::System::getSingleton().getDefaultFont()->setProperty("PointSize", "14");
  
     mWindowBackground = wm->createWindow("WindowsLook/StaticImage", "MenuBackgroundImage");
     mMainWindow->addChildWindow(mWindowBackground);
     mWindowBackground->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.0f)));
     mWindowBackground->setSize(CEGUI::UVector2(cegui_reldim(1.0f), cegui_reldim(1.0f)));
     mWindowBackground->setProperty("BackgroundEnabled", "false");
     mWindowBackground->setProperty("FrameEnabled", "false");
     mWindowBackground->setProperty("Image", "set:BackgroundImage image:BackgroundImage");
  
     mAppHeader = wm->createWindow("WindowsLook/StaticImage", "applicationHeaderText");
     mAppHeader->setProperty("Image", "set:TitleImage image:TitleImage");//setText("Fire Fighter");
     mAppHeader->setProperty("BackgroundEnabled", "false");
     mAppHeader->setProperty("FrameEnabled", "false");
     mAppHeader->setSize(CEGUI::UVector2(cegui_reldim(0.2f), cegui_reldim(0.1f)));
     mAppHeader->setPosition(CEGUI::UVector2(cegui_reldim(0.00f), cegui_reldim(0.1f)));
     mAppHeader->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mWindowBackground->addChildWindow(mAppHeader);
  
     mStartWithObjectives = static_cast<CEGUI::PushButton*>(wm->createWindow("WindowsLook/Button", "startWithObjectivesButton"));
     mStartWithObjectives->setText("Start With Objectives");
     mStartWithObjectives->setSize(CEGUI::UVector2(cegui_reldim(0.3f), cegui_reldim(0.1f)));
     mStartWithObjectives->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.4f)));
     mStartWithObjectives->setMouseCursor(NULL);
     mStartWithObjectives->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mWindowBackground->addChildWindow(mStartWithObjectives);
  
     mStart = static_cast<CEGUI::PushButton*>(wm->createWindow("WindowsLook/Button", "startButton"));
     mStart->setText("Start");
     mStart->setSize(CEGUI::UVector2(cegui_reldim(0.3f), cegui_reldim(0.1f)));
     mStart->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.3f)));
     mStart->setMouseCursor(NULL);
     mStart->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mWindowBackground->addChildWindow(mStart);
  
     mQuit = static_cast<CEGUI::PushButton*>(wm->createWindow("WindowsLook/Button", "quitButton"));
     mQuit->setText("Quit");
     mQuit->setSize(CEGUI::UVector2(cegui_reldim(0.3f), cegui_reldim(0.1f)));
     mQuit->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.8f)));
     mQuit->setMouseCursor(NULL);
     mQuit->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mWindowBackground->addChildWindow(mQuit);
  
     mStartWithObjectives->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&HUDComponent::OnStartWithObjectives, this));
     mStart->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&HUDComponent::OnStart, this));
     mQuit->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&HUDComponent::OnQuit, this));
  
     mWindowBackground->hide();
  }
  
  void HUDComponent::BuildHUD()
  {
     CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr();
  
     mHUDBackground = wm->createWindow("WindowsLook/StaticImage", "HUDBackgroundImage");
     mMainWindow->addChildWindow(mHUDBackground);
     mHUDBackground->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.0f)));
     mHUDBackground->setSize(CEGUI::UVector2(cegui_reldim(1.0f), cegui_reldim(1.0f)));
     mHUDBackground->setProperty("BackgroundEnabled", "false");
     mHUDBackground->setProperty("FrameEnabled", "false");
  
     mHUDOverlay = wm->createWindow("WindowsLook/StaticImage", "HUDOverlay");
     mHUDBackground->addChildWindow(mHUDOverlay);
     mHUDOverlay->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.0f)));
     mHUDOverlay->setSize(CEGUI::UVector2(cegui_reldim(1.0f), cegui_reldim(1.0f)));
     mHUDOverlay->setProperty("BackgroundEnabled", "false");
     mHUDOverlay->setProperty("FrameEnabled", "false");
  
     mGameItemImage = wm->createWindow("WindowsLook/StaticImage", "gameItemImage");
     mGameItemImage->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mGameItemImage->setPosition(CEGUI::UVector2(cegui_reldim(0.6f), cegui_reldim(0.4f)));
     mGameItemImage->setProperty("BackgroundEnabled", "false");
     mGameItemImage->setProperty("FrameEnabled", "false");
     mGameItemImage->setProperty("Image", "set:GameItemImage image:GameItemImage");
     mHUDOverlay->addChildWindow(mGameItemImage);
     mGameItemImage->hide();
  
     mFireSuitIcon = wm->createWindow("WindowsLook/StaticImage", "fireSuitIcon");
     mFireSuitIcon->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mFireSuitIcon->setPosition(mFireSuitIconPos);
     mFireSuitIcon->setProperty("BackgroundEnabled", "false");
     mFireSuitIcon->setProperty("FrameEnabled", "false");
     mFireSuitIcon->setProperty("Image", "set:FireSuitImage image:FireSuitImage");
     mHUDOverlay->addChildWindow(mFireSuitIcon);
     mFireSuitIcon->hide();
  
     mFireHoseIcon = wm->createWindow("WindowsLook/StaticImage", "fireHoseIcon");
     mFireHoseIcon->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mFireHoseIcon->setPosition(mFireHoseIconPos);
     mFireHoseIcon->setProperty("BackgroundEnabled", "false");
     mFireHoseIcon->setProperty("FrameEnabled", "false");
     mFireHoseIcon->setProperty("Image", "set:FireHoseImage image:FireHoseImage");
     mHUDOverlay->addChildWindow(mFireHoseIcon);
     mFireHoseIcon->hide();
  
     mSCBAIcon = wm->createWindow("WindowsLook/StaticImage", "SCBAIcon");
     mSCBAIcon->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mSCBAIcon->setPosition(mSCBAIconPos);
     mSCBAIcon->setProperty("BackgroundEnabled", "false");
     mSCBAIcon->setProperty("FrameEnabled", "false");
     mSCBAIcon->setProperty("Image", "set:SCBAImage image:SCBAImage");
     mHUDOverlay->addChildWindow(mSCBAIcon);
     mSCBAIcon->hide();
  
     mInventoryUseFireSuitIcon = wm->createWindow("WindowsLook/StaticImage", "InventoryUseFireSuitIcon");
     mInventoryUseFireSuitIcon->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mInventoryUseFireSuitIcon->setPosition(CEGUI::UVector2(mFireSuitIconPos.d_x, mFireSuitIconPos.d_y + cegui_reldim(.025f)));
     mInventoryUseFireSuitIcon->setProperty("BackgroundEnabled", "false");
     mInventoryUseFireSuitIcon->setProperty("FrameEnabled", "false");
     mInventoryUseFireSuitIcon->setProperty("Image", "set:InventoryUseImage image:InventoryUseImage");
     mHUDOverlay->addChildWindow(mInventoryUseFireSuitIcon);
     mInventoryUseFireSuitIcon->hide();
  
     mInventoryUseFireHoseIcon = wm->createWindow("WindowsLook/StaticImage", "InventoryUseFireHoseIcon");
     mInventoryUseFireHoseIcon->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mInventoryUseFireHoseIcon->setPosition(CEGUI::UVector2(mFireHoseIconPos.d_x, mFireHoseIconPos.d_y + cegui_reldim(.025f)));
     mInventoryUseFireHoseIcon->setProperty("BackgroundEnabled", "false");
     mInventoryUseFireHoseIcon->setProperty("FrameEnabled", "false");
     mInventoryUseFireHoseIcon->setProperty("Image", "set:InventoryUseImage image:InventoryUseImage");
     mHUDOverlay->addChildWindow(mInventoryUseFireHoseIcon);
     mInventoryUseFireHoseIcon->hide();
  
     mInventoryUseSCBAIcon = wm->createWindow("WindowsLook/StaticImage", "InventoryUseSCBAIcon");
     mInventoryUseSCBAIcon->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mInventoryUseSCBAIcon->setPosition(CEGUI::UVector2(mSCBAIconPos.d_x, mSCBAIconPos.d_y + cegui_reldim(.025f)));
     mInventoryUseSCBAIcon->setProperty("BackgroundEnabled", "false");
     mInventoryUseSCBAIcon->setProperty("FrameEnabled", "false");
     mInventoryUseSCBAIcon->setProperty("Image", "set:InventoryUseImage image:InventoryUseImage");
     mHUDOverlay->addChildWindow(mInventoryUseSCBAIcon);
     mInventoryUseSCBAIcon->hide();
  
     mInventorySelectIcon = wm->createWindow("WindowsLook/StaticImage", "InventorySelectIcon");
     mInventorySelectIcon->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mInventorySelectIcon->setProperty("BackgroundEnabled", "false");
     mInventorySelectIcon->setProperty("FrameEnabled", "false");
     mInventorySelectIcon->setProperty("Image", "set:InventorySelectImage image:InventorySelectImage");
     mHUDOverlay->addChildWindow(mInventorySelectIcon);
     mInventorySelectIcon->hide();
  
     mTargetIcon = wm->createWindow("WindowsLook/StaticImage", "TargetIcon");
     mTargetIcon->setSize(CEGUI::UVector2(cegui_reldim(0.15f), cegui_reldim(0.15f)));
     mTargetIcon->setPosition(CEGUI::UVector2(cegui_reldim(0.45f), cegui_reldim(0.45f)));
     mTargetIcon->setProperty("BackgroundEnabled", "false");
     mTargetIcon->setProperty("FrameEnabled", "false");
     mTargetIcon->setProperty("Image", "set:TargetImage image:TargetImage");
     mHUDOverlay->addChildWindow(mTargetIcon);
  
     mMissionCompletedText = wm->createWindow("WindowsLook/StaticText", "MissionCompleteText");
     mMissionCompletedText->setText("Mission Completed. Press M to debrief");
     mMissionCompletedText->setProperty("TextColours", CEGUI::PropertyHelper::colourToString(CEGUI::colour(0.0f, 1.0f, 0.0f)));
     mMissionCompletedText->setProperty("BackgroundEnabled", "false");
     mMissionCompletedText->setProperty("FrameEnabled", "false");
     mMissionCompletedText->setSize(CEGUI::UVector2(cegui_reldim(0.5f), cegui_reldim(0.1f)));
     mMissionCompletedText->setPosition(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));
     mMissionCompletedText->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mHUDOverlay->addChildWindow(mMissionCompletedText);
     mMissionCompletedText->hide();
  
     mMissionFailedText = wm->createWindow("WindowsLook/StaticText", "MissionFailedText");
     mMissionFailedText->setText("Mission Failed. Press M to debrief");
     mMissionFailedText->setProperty("TextColours", CEGUI::PropertyHelper::colourToString(CEGUI::colour(1.0f, 0.0f, 0.0f)));
     mMissionFailedText->setProperty("BackgroundEnabled", "false");
     mMissionFailedText->setProperty("FrameEnabled", "false");
     mMissionFailedText->setSize(CEGUI::UVector2(cegui_reldim(0.5f), cegui_reldim(0.1f)));
     mMissionFailedText->setPosition(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));
     mMissionFailedText->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mHUDOverlay->addChildWindow(mMissionFailedText);
     mMissionFailedText->hide();
  
     mHelpWindow = new HelpWindow(mHUDBackground);
     mHelpWindow->GetCloseButton()->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&HUDComponent::OnHelpWindowClosed, this));
  
     float curYPos       = 20.0f;
     float mTextHeight   = 25.0f;
     float taskTextWidth = 500.0f;
  
     mTasksHeaderText = CreateText("Task Header", mHUDOverlay, "Tasks:",
        4, curYPos, taskTextWidth - 2, mTextHeight + 2);
  
     curYPos += 2;
  
     for (unsigned int i = 0; i < mNumTasks; i++)
     {
        std::ostringstream oss;
        oss << "Task " << i;
        curYPos += mTextHeight + 2;
        CEGUI::Window *text = CreateText(oss.str(), mHUDOverlay, "",
           12, curYPos, taskTextWidth - 2, mTextHeight + 2);
  
        mTaskTextList.push_back(text);
        text->hide();
     }
  
     mHUDBackground->hide();
  }
  
  void HUDComponent::BuildEndMenu()
  {
     CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr();
  
     mDebriefBackground = wm->createWindow("WindowsLook/StaticImage", "DebriefBackgroundImage");
     mMainWindow->addChildWindow(mDebriefBackground);
     mDebriefBackground->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.0f)));
     mDebriefBackground->setSize(CEGUI::UVector2(cegui_reldim(1.0f), cegui_reldim(1.0f)));
     mDebriefBackground->setProperty("BackgroundEnabled", "false");
     mDebriefBackground->setProperty("FrameEnabled", "false");
     mDebriefBackground->setProperty("Image", "set:BackgroundImage image:BackgroundImage");
  
     mDebriefHeaderText = wm->createWindow("WindowsLook/StaticText", "DebriefHeaderText");
     mDebriefHeaderText->setText("Debriefing");
     mDebriefHeaderText->setProperty("BackgroundEnabled", "false");
     mDebriefHeaderText->setProperty("FrameEnabled", "false");
     mDebriefHeaderText->setSize(CEGUI::UVector2(cegui_reldim(0.5f), cegui_reldim(0.1f)));
     mDebriefHeaderText->setPosition(CEGUI::UVector2(cegui_reldim(0.18f), cegui_reldim(0.01f)));
     mDebriefHeaderText->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mDebriefBackground->addChildWindow(mDebriefHeaderText);
  
     mCompleteOrFail = wm->createWindow("WindowsLook/StaticText", "CompleteOrFailText");
     mCompleteOrFail->setProperty("BackgroundEnabled", "false");
     mCompleteOrFail->setProperty("FrameEnabled", "false");
     mCompleteOrFail->setSize(CEGUI::UVector2(cegui_reldim(0.5f), cegui_reldim(0.1f)));
     mCompleteOrFail->setPosition(CEGUI::UVector2(cegui_reldim(0.17f), cegui_reldim(0.1f)));
     mCompleteOrFail->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mDebriefBackground->addChildWindow(mCompleteOrFail);
  
     mFailReason = wm->createWindow("WindowsLook/StaticText", "reasonText");
     mFailReason->setProperty("BackgroundEnabled", "false");
     mFailReason->setProperty("FrameEnabled", "false");
     mFailReason->setSize(CEGUI::UVector2(cegui_reldim(0.5f), cegui_reldim(0.1f)));
     mFailReason->setPosition(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim(0.2f)));
     mFailReason->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mDebriefBackground->addChildWindow(mFailReason);
  
     mReturnToMenu = static_cast<CEGUI::PushButton*>(wm->createWindow("WindowsLook/Button", "ReturnToMenuButton"));
     mReturnToMenu->setText("Return to Menu");
     mReturnToMenu->setSize(CEGUI::UVector2(cegui_reldim(0.3f), cegui_reldim(0.1f)));
     mReturnToMenu->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.8f)));
     mReturnToMenu->setMouseCursor(NULL);
     mReturnToMenu->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mDebriefBackground->addChildWindow(mReturnToMenu);
  
     mReturnToMenu->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&HUDComponent::OnReturnToMenu, this));
  
     float curYPos       = 40.0f;
     float mTextHeight   = 25.0f;
     float taskTextWidth = 500.0f;
  
     curYPos += 2;
  
     for (unsigned int i = 0; i < mNumTasks; i++)
     {
        std::ostringstream oss;
        oss << "Debrief Task " << i;
        curYPos += mTextHeight + 2;
        CEGUI::Window *text = CreateText(oss.str(), mDebriefBackground, "",
           12, curYPos, taskTextWidth - 2, mTextHeight + 2);
  
        mDebriefList.push_back(text);
        text->hide();
     }
  
     mDebriefBackground->hide();
  }
  
  void HUDComponent::BuildIntroMenu()
  {
     CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr();
  
     mIntroBackground = wm->createWindow("WindowsLook/StaticImage", "IntroBackgroundImage");
     mMainWindow->addChildWindow(mIntroBackground);
     mIntroBackground->setPosition(CEGUI::UVector2(cegui_reldim(0.0f), cegui_reldim(0.0f)));
     mIntroBackground->setSize(CEGUI::UVector2(cegui_reldim(1.0f), cegui_reldim(1.0f)));
     mIntroBackground->setProperty("BackgroundEnabled", "false");
     mIntroBackground->setProperty("FrameEnabled", "false");
  
     mIntroText = wm->createWindow("WindowsLook/StaticText", "IntroText");
     mIntroText->setText("Press N to skip");
     mIntroText->setProperty("BackgroundEnabled", "false");
     mIntroText->setProperty("FrameEnabled", "false");
     mIntroText->setSize(CEGUI::UVector2(cegui_reldim(0.4f), cegui_reldim(0.1f)));
     mIntroText->setPosition(CEGUI::UVector2(cegui_reldim(0.125f), cegui_reldim(0.01f)));
     mIntroText->setHorizontalAlignment(CEGUI::HA_CENTRE);
     mIntroText->setProperty("TextColours", CEGUI::PropertyHelper::colourToString(CEGUI::colour(1.0f, 1.0f, 1.0f)));
     mIntroBackground->addChildWindow(mIntroText);
  
     mIntroBackground->hide();
  }
  
  bool HUDComponent::OnStartWithObjectives(const CEGUI::EventArgs& e)
  {
     mShowObjectives = true;
     SendGameStateChangedMessage(GameState::STATE_MENU, GameState::STATE_INTRO);
  
     return true;
  }
  
  bool HUDComponent::OnStart(const CEGUI::EventArgs& e)
  {
     mShowObjectives = false;
     SendGameStateChangedMessage(GameState::STATE_MENU, GameState::STATE_INTRO);
  
     return true;
  }
  
  bool HUDComponent::OnQuit(const CEGUI::EventArgs& e)
  {
     GetGameManager()->GetApplication().Quit();
     return true;
  }
  
  bool HUDComponent::OnReturnToMenu(const CEGUI::EventArgs& e)
  {
     SendGameStateChangedMessage(GameState::STATE_DEBRIEF, GameState::STATE_MENU);
     return true;
  }
  
  bool HUDComponent::OnHelpWindowClosed(const CEGUI::EventArgs& e)
  {
     RefPtr<dtGame::Message> msg = GetGameManager()->GetMessageFactory().CreateMessage(MessageType::HELP_WINDOW_CLOSED);
     GetGameManager()->SendMessage(*msg);
     return true;
  }
  
  void HUDComponent::SendGameStateChangedMessage(GameState& oldState, GameState& newState)
  {
     RefPtr<dtGame::Message> msg = GetGameManager()->GetMessageFactory().CreateMessage(MessageType::GAME_STATE_CHANGED);
     GameStateChangedMessage& gscm = static_cast<GameStateChangedMessage&>(*msg);
     gscm.SetOldState(oldState);
     gscm.SetNewState(newState);
     LOG_ALWAYS("Changing game state to: " + newState.GetName());
     GetGameManager()->SendMessage(gscm);
  }
  
  void HUDComponent::Refresh()
  {
     if (*mCurrentState == GameState::STATE_MENU)
     {
        ShowMainMenu();
     }
     else if (*mCurrentState == GameState::STATE_INTRO)
     {
        ShowIntroMenu();
     }
     else if (*mCurrentState == GameState::STATE_RUNNING)
     {
        ShowHUD();
     }
     else if (*mCurrentState == GameState::STATE_DEBRIEF)
     {
        ShowEndMenu();
     }
     else
     {
        LOG_ERROR("Cannot switch to invalid state:" + mCurrentState->GetName());
     }
  }
  
  void HUDComponent::ShowMouse(bool enable)
  {
     GetGameManager()->GetApplication().GetWindow()->ShowCursor(enable);
  }
  
  void HUDComponent::AddItemToHUD(GameItemActor* item)
  {
     if (dynamic_cast<FireSuitActor*>(item) != NULL)
     {
        mFireSuitIcon->show();
     }
     else if (dynamic_cast<FireHoseActor*>(item) != NULL)
     {
        mFireHoseIcon->show();
     }
     else if (dynamic_cast<SCBAActor*>(item) != NULL)
     {
        mSCBAIcon->show();
     }
  
     // Since we now have items in the HUD, show the select icon
     static bool hackIsFirstTime = true;
     if (hackIsFirstTime)
     {
        SetSelectedItem(item);
        hackIsFirstTime = false;
     }
     mInventorySelectIcon->show();
  }
  
  void HUDComponent::SetSelectedItem(GameItemActor* item)
  {
     if (dynamic_cast<FireSuitActor*>(item) != NULL)
     {
        mInventorySelectIcon->setPosition(CEGUI::UVector2(mFireSuitIconPos.d_x, mFireSuitIconPos.d_y - cegui_reldim(0.025f)));
     }
     else if (dynamic_cast<FireHoseActor*>(item) != NULL)
     {
        mInventorySelectIcon->setPosition(CEGUI::UVector2(mFireHoseIconPos.d_x, mFireHoseIconPos.d_y - cegui_reldim(0.025f)));
     }
     else if (dynamic_cast<SCBAActor*>(item) != NULL)
     {
        mInventorySelectIcon->setPosition(CEGUI::UVector2(mSCBAIconPos.d_x, mSCBAIconPos.d_y - cegui_reldim(0.025f)));
     }
     else
     {
        LOG_ERROR("Could not set the selected item. Unable to cast the parameter");
     }
  }
  
  void HUDComponent::SetActivatedItem(GameItemActor* item)
  {
     if (dynamic_cast<FireSuitActor*>(item) != NULL)
     {
        mInventoryUseFireSuitIcon->show();
     }
     else if (dynamic_cast<FireHoseActor*>(item) != NULL)
     {
        mInventoryUseFireHoseIcon->show();
     }
     else if (dynamic_cast<SCBAActor*>(item) != NULL)
     {
        mInventoryUseSCBAIcon->show();
     }
     else
     {
        LOG_ERROR("Could not set the activated item. Unable to cast the parameter");
     }
  }
  
  void HUDComponent::SetDeactivatedItem(GameItemActor* item)
  {
     if (dynamic_cast<FireSuitActor*>(item) != NULL)
     {
        mInventoryUseFireSuitIcon->hide();
     }
     else if (dynamic_cast<FireHoseActor*>(item) != NULL)
     {
        mInventoryUseFireHoseIcon->hide();
     }
     else if (dynamic_cast<SCBAActor*>(item) != NULL)
     {
        mInventoryUseSCBAIcon->hide();
     }
     else
     {
        LOG_ERROR("Could not set the deactivated item. Unable to cast the parameter");
     }
  }
  
  void HUDComponent::UpdateMediumDetailData(CEGUI::Window* parent)
  {
     if (parent->isVisible())
     {
        std::ostringstream oss;
        std::vector<dtCore::RefPtr<dtGame::GameActorProxy> > tasks;
        unsigned int numAdded = 0;
        unsigned int numComplete = 0;
  
        dtGame::GMComponent* comp = GetGameManager()->GetComponentByName("LMSComponent");
        dtGame::TaskComponent* mTaskComponent = static_cast<dtGame::TaskComponent*>(comp);
  
        if (mTaskComponent)
        {
           mTaskComponent->GetTopLevelTasks(tasks);
  
           // start our recursive method on each top level task
           for (unsigned int i = 0; i < tasks.size(); i++)
           {
              dtActors::TaskActorProxy* taskProxy = static_cast<dtActors::TaskActorProxy*>(tasks[i].get());
              numAdded += RecursivelyAddTasks("", numAdded, taskProxy, numComplete, parent);
           }
  
           // blank out any of our placeholder task text controls that were left over
           if (parent == mHUDBackground)
           {
              for (unsigned int i = numAdded; i < mTaskTextList.size(); i++)
              {
                 UpdateStaticText(mTaskTextList[i], "");
              }
           }
           else
           {
              for (unsigned int i = numAdded; i < mDebriefList.size(); i++)
              {
                 UpdateStaticText(mDebriefList[i], "");
              }
           }
  
           // update our task header
           oss << "Tasks (" << numComplete << " of " << numAdded << ")";
           if (numComplete < numAdded)
           {
              UpdateStaticText(mTasksHeaderText, oss.str(), 1.0f, 1.0f, 1.0f);
           }
           else
           {
              UpdateStaticText(mTasksHeaderText, oss.str(), 0.0f, 1.0f, 0.0f);
           }
        }
        else
        {
           throw dtUtil::Exception(dtGame::ExceptionEnum::INVALID_PARAMETER, "Unable to find LMSComponent", __FILE__, __LINE__);
        }
     }
  }
  
  unsigned int HUDComponent::RecursivelyAddTasks(const std::string& indent,
                                                 unsigned int curIndex,
                                                 const dtActors::TaskActorProxy* taskProxy,
                                                 unsigned int& numCompleted,
                                                 CEGUI::Window* parent)
  {
     std::ostringstream oss;
     oss.setf(std::ios_base::fixed, std::ios_base::floatfield);
     oss.precision(2);
  
     unsigned int totalNumAdded = 0;
     if (curIndex < mTaskTextList.size())
     {
        // update the text for this task
        const dtActors::TaskActor* task = static_cast<const dtActors::TaskActor*>(taskProxy->GetActor());
        if (task->IsComplete())
        {
           numCompleted++;
  
           const dtActors::TaskActorGameEvent* tage = dynamic_cast<const dtActors::TaskActorGameEvent*>(task);
           if (tage != NULL)
           {
              const dtDAL::GameEvent* event = tage->GetGameEvent();
              oss << indent << event->GetDescription();
           }
           else
              oss << indent << task->GetDescription();
  
           if (parent == mHUDBackground)
           {
              UpdateStaticText(mTaskTextList[curIndex + totalNumAdded], oss.str(), 0.0f, 1.0f, 0.0f);
           }
           else
           {
              UpdateStaticText(mDebriefList[curIndex + totalNumAdded], oss.str(), 0.0f, 1.0f, 0.0f);
           }
        }
        else
        {
           const dtActors::TaskActorGameEvent* tage = dynamic_cast<const dtActors::TaskActorGameEvent*>(task);
           if (tage != NULL)
           {
              const dtDAL::GameEvent* event = tage->GetGameEvent();
              oss << indent << event->GetDescription();
           }
           else
           {
              oss << indent << task->GetDescription();
           }
  
           if (parent == mHUDBackground)
           {
              if (&task->GetGameActorProxy() == mFailedProxy)
              {
                 UpdateStaticText(mTaskTextList[curIndex + totalNumAdded], oss.str(), 1.0f, 0.0f, 0.0f);
              }
              else
              {
                 UpdateStaticText(mTaskTextList[curIndex + totalNumAdded], oss.str(), 1.0f, 1.0f, 1.0f);
              }
           }
           else
           {
              if (&task->GetGameActorProxy() == mFailedProxy)
              {
                 UpdateStaticText(mDebriefList[curIndex + totalNumAdded], oss.str(), 1.0f, 0.0f, 0.0f);
              }
              else
              {
                 UpdateStaticText(mDebriefList[curIndex + totalNumAdded], oss.str(), 1.0f, 1.0f, 1.0f);
              }
           }
        }
  
        totalNumAdded++;
  
        // recurse for each child
        std::vector<const dtActors::TaskActorProxy*> children;
        taskProxy->GetAllSubTasks(children);
        if (!children.empty())
        {
           for (unsigned int i = 0; i < children.size(); i++)
           {
              const dtActors::TaskActorProxy* childProxy = children[i];
              totalNumAdded += RecursivelyAddTasks(indent + "     ", curIndex + totalNumAdded, childProxy, numCompleted, parent);
           }
        }
     }
  
     return totalNumAdded;
  }
  
  void HUDComponent::UpdateStaticText(CEGUI::Window* textControl, const std::string& newText,
                                      float red, float green, float blue, float x, float y)
  {
  
     if (textControl != NULL)
     {
        // text and color
        if (!newText.empty())
        {
           if (textControl->getText() != newText)
           {
              textControl->setText(newText);
           }
           if (red >= 0.0f && blue >= 0.0f && green >= 0.0f)
           {
              textControl->setProperty("TextColours", CEGUI::PropertyHelper::colourToString(CEGUI::colour(red, green, blue)));
           }
        }
        // position
        if (x > 0.0f && y > 0.0f)
        {
           CEGUI::UVector2 position = textControl->getPosition();
           CEGUI::UVector2 newPos(cegui_reldim(x), cegui_reldim(y));
           if (position != newPos)
           {
              textControl->setPosition(newPos);
           }
        }
        if (*mCurrentState == GameState::STATE_RUNNING)
        {
           if (mHUDBackground->isVisible())
           {
              if (mShowObjectives)
              {
                 textControl->show();
              }
              else
              {
                 textControl->hide();
              }
           }
        }
        else
        {
           if (mDebriefBackground->isVisible())
           {
              textControl->show();
           }
        }
     }
  }
  
  CEGUI::Window* HUDComponent::CreateText(const std::string& name,
                                          CEGUI::Window* parent,
                                          const std::string& text,
                                          float x, float y, float width, float height)
  {
     CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr();
  
     // create base window and set our default attribs
     CEGUI::Window* result = wm->createWindow("WindowsLook/StaticText", name);
     parent->addChildWindow(result);
     result->setText(text);
     result->setPosition(CEGUI::UVector2(cegui_absdim(x), cegui_absdim(y)));
     result->setSize(CEGUI::UVector2(cegui_absdim(width), cegui_absdim(height)));
     result->setProperty("FrameEnabled", "false");
     result->setProperty("BackgroundEnabled", "false");
     result->setHorizontalAlignment(CEGUI::HA_LEFT);
     result->setVerticalAlignment(CEGUI::VA_TOP);
  
     return result;
  }
  
  void HUDComponent::RefreshDebriefScreen()
  {
     mCompleteOrFail->setText(mMissionComplete ? "Mission Completed" : "Mission Failed");
     mCompleteOrFail->setProperty("TextColours", mMissionComplete ?
        CEGUI::PropertyHelper::colourToString(CEGUI::colour(0.0f, 1.0f, 0.0f)) :
        CEGUI::PropertyHelper::colourToString(CEGUI::colour(1.0f, 0.0f, 0.0f)));
  
     UpdateMediumDetailData(mDebriefBackground);
  }
  
  void HUDComponent::UpdateHUDBackground()
  {
     bool scbaActive = mInventoryUseSCBAIcon->isVisible(),
          hoseActive = mInventoryUseFireHoseIcon->isVisible();
  
     if (scbaActive && hoseActive)
     {
        mHUDBackground->setProperty("Image", "set:HUD_SCBA_FirehoseImage image:HUD_SCBA_FirehoseImage");
     }
     else if (scbaActive)
     {
        mHUDBackground->setProperty("Image", "set:HUD_SCBAImage image:HUD_SCBAImage");
     }
     else if (hoseActive)
     {
        mHUDBackground->setProperty("Image", "set:HUD_FirehoseImage image:HUD_FirehoseImage");
     }
     else
     {
        mHUDBackground->setProperty("Image", "set:AlphaImage image:AlphaImage");
     }
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.