summaryrefslogtreecommitdiffhomepage
path: root/Stars45/QuitView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Stars45/QuitView.cpp')
-rw-r--r--Stars45/QuitView.cpp628
1 files changed, 326 insertions, 302 deletions
diff --git a/Stars45/QuitView.cpp b/Stars45/QuitView.cpp
index ea66faa..a553727 100644
--- a/Stars45/QuitView.cpp
+++ b/Stars45/QuitView.cpp
@@ -1,302 +1,326 @@
-/* Project Starshatter 5.0
- Destroyer Studios LLC
- Copyright © 1997-2007. All Rights Reserved.
-
- SUBSYSTEM: Stars.exe
- FILE: QuitView.cpp
- AUTHOR: John DiCamillo
-
-
- OVERVIEW
- ========
- View class for End Mission menu
-*/
-
-#include "MemDebug.h"
-#include "QuitView.h"
-#include "HUDView.h"
-#include "RadioView.h"
-#include "Ship.h"
-#include "Contact.h"
-#include "Sim.h"
-#include "SimEvent.h"
-#include "Campaign.h"
-#include "Starshatter.h"
-#include "GameScreen.h"
-
-#include "CameraView.h"
-#include "Color.h"
-#include "Window.h"
-#include "Video.h"
-#include "Screen.h"
-#include "DataLoader.h"
-#include "Scene.h"
-#include "FontMgr.h"
-#include "Button.h"
-#include "Keyboard.h"
-#include "Mouse.h"
-#include "MouseController.h"
-#include "Game.h"
-#include "Menu.h"
-
-// +====================================================================+
-
-static bool show_menu = false;
-static Bitmap* menu_bmp = 0;
-static MouseController* mouse_con = 0;
-static bool mouse_active = false;
-static const int w2 = 200;
-static const int h2 = 128;
-
-void
-QuitView::Initialize()
-{
- if (!menu_bmp) {
- menu_bmp = new(__FILE__,__LINE__) Bitmap;
-
- DataLoader* loader = DataLoader::GetLoader();
- loader->SetDataPath("Screens/");
- loader->LoadBitmap("QuitWin.pcx", *menu_bmp, Bitmap::BMP_TRANSPARENT);
- loader->SetDataPath(0);
- }
-}
-
-void
-QuitView::Close()
-{
- delete menu_bmp;
-}
-
-// +====================================================================+
-
-QuitView* QuitView::quit_view = 0;
-
-QuitView::QuitView(Window* c)
-: View(c), mouse_latch(false)
-{
- quit_view = this;
- sim = Sim::GetSim();
-
- width = window->Width();
- height = window->Height();
- xcenter = width / 2;
- ycenter = height / 2;
-
- mouse_con = MouseController::GetInstance();
-}
-
-QuitView::~QuitView()
-{
- quit_view = 0;
-}
-
-void
-QuitView::OnWindowMove()
-{
- width = window->Width();
- height = window->Height();
- xcenter = width / 2;
- ycenter = height / 2;
-}
-
-// +--------------------------------------------------------------------+
-
-void
-QuitView::Refresh()
-{
- if (show_menu && menu_bmp) {
- Rect clip_rect;
-
- clip_rect.x = xcenter - w2;
- clip_rect.y = ycenter - h2;
- clip_rect.w = w2 * 2;
- clip_rect.h = h2 * 2;
-
- window->ClipBitmap(xcenter - w2,
- ycenter - h2,
- xcenter - w2 + menu_bmp->Width(),
- ycenter - h2 + menu_bmp->Height(),
- menu_bmp,
- Color::White,
- Video::BLEND_SOLID,
- clip_rect);
- }
-}
-
-// +--------------------------------------------------------------------+
-
-void
-QuitView::ExecFrame()
-{
- sim = Sim::GetSim();
-
- if (show_menu) {
- Color::SetFade(1, Color::Black, 0);
- int action = 0;
-
- if (Mouse::LButton()) {
- mouse_latch = true;
- }
- else if (mouse_latch) {
- mouse_latch = false;
-
- if (Mouse::X() > xcenter - w2 && Mouse::X() < xcenter + w2) {
- int y0 = ycenter - h2;
-
- for (int i = 0; i < 4; i++)
- if (Mouse::Y() >= y0 + 75 + i * 30 && Mouse::Y() <= y0 + 105 + i * 30)
- action = i+1;
- }
- }
-
- for (int i = 1; i <= 4; i++) {
- if (Keyboard::KeyDown('0' + i))
- action = i;
- }
-
- // was mission long enough to accept?
- if (action == 1 && !CanAccept()) {
- Button::PlaySound(Button::SND_REJECT);
- action = 3;
- }
-
- // exit and accept:
- if (action == 1) {
- CloseMenu();
- Game::SetTimeCompression(1);
-
- Starshatter* stars = Starshatter::GetInstance();
- stars->SetGameMode(Starshatter::PLAN_MODE);
- }
-
- // quit and discard results:
- else if (action == 2) {
- CloseMenu();
- Game::SetTimeCompression(1);
-
- Starshatter* stars = Starshatter::GetInstance();
- Campaign* campaign = Campaign::GetCampaign();
-
- // discard mission and events:
- if (sim) sim->UnloadMission();
- else ShipStats::Initialize();
-
- if (campaign && campaign->GetCampaignId() < Campaign::SINGLE_MISSIONS) {
- campaign->RollbackMission();
- stars->SetGameMode(Starshatter::CMPN_MODE);
- }
-
- else {
- stars->SetGameMode(Starshatter::MENU_MODE);
- }
- }
-
- // resume:
- else if (action == 3) {
- CloseMenu();
- }
-
- // controls:
- else if (action == 4) {
- GameScreen* game_screen = GameScreen::GetInstance();
-
- if (game_screen)
- game_screen->ShowCtlDlg();
- else
- CloseMenu();
- }
- }
-}
-
-// +--------------------------------------------------------------------+
-
-bool
-QuitView::IsMenuShown()
-{
- return show_menu;
-}
-
-// +--------------------------------------------------------------------+
-
-bool
-QuitView::CanAccept()
-{
- sim = Sim::GetSim();
-
- if (!sim || sim->IsNetGame())
- return true;
-
- Ship* player_ship = sim->GetPlayerShip();
-
- if (player_ship->MissionClock() < 60000) {
- RadioView::Message(Game::GetText("QuitView.too-soon"));
- RadioView::Message(Game::GetText("QuitView.abort"));
- return false;
- }
-
- ListIter<Contact> iter = player_ship->ContactList();
- while (++iter) {
- Contact* c = iter.value();
- Ship* cship = c->GetShip();
- int ciff = c->GetIFF(player_ship);
-
- if (c->Threat(player_ship)) {
- RadioView::Message(Game::GetText("QuitView.threats-present"));
- RadioView::Message(Game::GetText("QuitView.abort"));
- return false;
- }
-
- else if (cship && ciff > 0 && ciff != player_ship->GetIFF()) {
- Point delta = c->Location() - player_ship->Location();
- double dist = delta.length();
-
- if (cship->IsDropship() && dist < 50e3) {
- RadioView::Message(Game::GetText("QuitView.threats-present"));
- RadioView::Message(Game::GetText("QuitView.abort"));
- return false;
- }
-
- else if (cship->IsStarship() && dist < 100e3) {
- RadioView::Message(Game::GetText("QuitView.threats-present"));
- RadioView::Message(Game::GetText("QuitView.abort"));
- return false;
- }
- }
- }
-
- return true;
-}
-
-void
-QuitView::ShowMenu()
-{
- if (!show_menu) {
- show_menu = true;
-
- for (int i = 0; i < 10; i++) {
- if (Keyboard::KeyDown('1' + i)) {
- // just need to clear the key down flag
- // so we don't process old keystrokes
- // as valid menu picks...
- }
- }
-
- Button::PlaySound(Button::SND_CONFIRM);
- Starshatter::GetInstance()->Pause(true);
-
- if (mouse_con) {
- mouse_active = mouse_con->Active();
- mouse_con->SetActive(false);
- }
- }
-}
-
-void
-QuitView::CloseMenu()
-{
- show_menu = false;
- Starshatter::GetInstance()->Pause(false);
-
- if (mouse_con)
- mouse_con->SetActive(mouse_active);
-}
+/* Starshatter OpenSource Distribution
+ Copyright (c) 1997-2004, Destroyer Studios LLC.
+ All Rights Reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name "Destroyer Studios" nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ SUBSYSTEM: Stars.exe
+ FILE: QuitView.cpp
+ AUTHOR: John DiCamillo
+
+
+ OVERVIEW
+ ========
+ View class for End Mission menu
+*/
+
+#include "MemDebug.h"
+#include "QuitView.h"
+#include "HUDView.h"
+#include "RadioView.h"
+#include "Ship.h"
+#include "Contact.h"
+#include "Sim.h"
+#include "SimEvent.h"
+#include "Campaign.h"
+#include "Starshatter.h"
+#include "GameScreen.h"
+
+#include "CameraView.h"
+#include "Color.h"
+#include "Window.h"
+#include "Video.h"
+#include "Screen.h"
+#include "DataLoader.h"
+#include "Scene.h"
+#include "FontMgr.h"
+#include "Button.h"
+#include "Keyboard.h"
+#include "Mouse.h"
+#include "MouseController.h"
+#include "Game.h"
+#include "Menu.h"
+
+// +====================================================================+
+
+static bool show_menu = false;
+static Bitmap* menu_bmp = 0;
+static MouseController* mouse_con = 0;
+static bool mouse_active = false;
+static const int w2 = 200;
+static const int h2 = 128;
+
+void
+QuitView::Initialize()
+{
+ if (!menu_bmp) {
+ menu_bmp = new(__FILE__,__LINE__) Bitmap;
+
+ DataLoader* loader = DataLoader::GetLoader();
+ loader->SetDataPath("Screens/");
+ loader->LoadBitmap("QuitWin.pcx", *menu_bmp, Bitmap::BMP_TRANSPARENT);
+ loader->SetDataPath(0);
+ }
+}
+
+void
+QuitView::Close()
+{
+ delete menu_bmp;
+}
+
+// +====================================================================+
+
+QuitView* QuitView::quit_view = 0;
+
+QuitView::QuitView(Window* c)
+: View(c), mouse_latch(false)
+{
+ quit_view = this;
+ sim = Sim::GetSim();
+
+ width = window->Width();
+ height = window->Height();
+ xcenter = width / 2;
+ ycenter = height / 2;
+
+ mouse_con = MouseController::GetInstance();
+}
+
+QuitView::~QuitView()
+{
+ quit_view = 0;
+}
+
+void
+QuitView::OnWindowMove()
+{
+ width = window->Width();
+ height = window->Height();
+ xcenter = width / 2;
+ ycenter = height / 2;
+}
+
+// +--------------------------------------------------------------------+
+
+void
+QuitView::Refresh()
+{
+ if (show_menu && menu_bmp) {
+ Rect clip_rect;
+
+ clip_rect.x = xcenter - w2;
+ clip_rect.y = ycenter - h2;
+ clip_rect.w = w2 * 2;
+ clip_rect.h = h2 * 2;
+
+ window->ClipBitmap(xcenter - w2,
+ ycenter - h2,
+ xcenter - w2 + menu_bmp->Width(),
+ ycenter - h2 + menu_bmp->Height(),
+ menu_bmp,
+ Color::White,
+ Video::BLEND_SOLID,
+ clip_rect);
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+void
+QuitView::ExecFrame()
+{
+ sim = Sim::GetSim();
+
+ if (show_menu) {
+ Color::SetFade(1, Color::Black, 0);
+ int action = 0;
+
+ if (Mouse::LButton()) {
+ mouse_latch = true;
+ }
+ else if (mouse_latch) {
+ mouse_latch = false;
+
+ if (Mouse::X() > xcenter - w2 && Mouse::X() < xcenter + w2) {
+ int y0 = ycenter - h2;
+
+ for (int i = 0; i < 4; i++)
+ if (Mouse::Y() >= y0 + 75 + i * 30 && Mouse::Y() <= y0 + 105 + i * 30)
+ action = i+1;
+ }
+ }
+
+ for (int i = 1; i <= 4; i++) {
+ if (Keyboard::KeyDown('0' + i))
+ action = i;
+ }
+
+ // was mission long enough to accept?
+ if (action == 1 && !CanAccept()) {
+ Button::PlaySound(Button::SND_REJECT);
+ action = 3;
+ }
+
+ // exit and accept:
+ if (action == 1) {
+ CloseMenu();
+ Game::SetTimeCompression(1);
+
+ Starshatter* stars = Starshatter::GetInstance();
+ stars->SetGameMode(Starshatter::PLAN_MODE);
+ }
+
+ // quit and discard results:
+ else if (action == 2) {
+ CloseMenu();
+ Game::SetTimeCompression(1);
+
+ Starshatter* stars = Starshatter::GetInstance();
+ Campaign* campaign = Campaign::GetCampaign();
+
+ // discard mission and events:
+ if (sim) sim->UnloadMission();
+ else ShipStats::Initialize();
+
+ if (campaign && campaign->GetCampaignId() < Campaign::SINGLE_MISSIONS) {
+ campaign->RollbackMission();
+ stars->SetGameMode(Starshatter::CMPN_MODE);
+ }
+
+ else {
+ stars->SetGameMode(Starshatter::MENU_MODE);
+ }
+ }
+
+ // resume:
+ else if (action == 3) {
+ CloseMenu();
+ }
+
+ // controls:
+ else if (action == 4) {
+ GameScreen* game_screen = GameScreen::GetInstance();
+
+ if (game_screen)
+ game_screen->ShowCtlDlg();
+ else
+ CloseMenu();
+ }
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+bool
+QuitView::IsMenuShown()
+{
+ return show_menu;
+}
+
+// +--------------------------------------------------------------------+
+
+bool
+QuitView::CanAccept()
+{
+ sim = Sim::GetSim();
+
+ if (!sim || sim->IsNetGame())
+ return true;
+
+ Ship* player_ship = sim->GetPlayerShip();
+
+ if (player_ship->MissionClock() < 60000) {
+ RadioView::Message(Game::GetText("QuitView.too-soon"));
+ RadioView::Message(Game::GetText("QuitView.abort"));
+ return false;
+ }
+
+ ListIter<Contact> iter = player_ship->ContactList();
+ while (++iter) {
+ Contact* c = iter.value();
+ Ship* cship = c->GetShip();
+ int ciff = c->GetIFF(player_ship);
+
+ if (c->Threat(player_ship)) {
+ RadioView::Message(Game::GetText("QuitView.threats-present"));
+ RadioView::Message(Game::GetText("QuitView.abort"));
+ return false;
+ }
+
+ else if (cship && ciff > 0 && ciff != player_ship->GetIFF()) {
+ Point delta = c->Location() - player_ship->Location();
+ double dist = delta.length();
+
+ if (cship->IsDropship() && dist < 50e3) {
+ RadioView::Message(Game::GetText("QuitView.threats-present"));
+ RadioView::Message(Game::GetText("QuitView.abort"));
+ return false;
+ }
+
+ else if (cship->IsStarship() && dist < 100e3) {
+ RadioView::Message(Game::GetText("QuitView.threats-present"));
+ RadioView::Message(Game::GetText("QuitView.abort"));
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+void
+QuitView::ShowMenu()
+{
+ if (!show_menu) {
+ show_menu = true;
+
+ for (int i = 0; i < 10; i++) {
+ if (Keyboard::KeyDown('1' + i)) {
+ // just need to clear the key down flag
+ // so we don't process old keystrokes
+ // as valid menu picks...
+ }
+ }
+
+ Button::PlaySound(Button::SND_CONFIRM);
+ Starshatter::GetInstance()->Pause(true);
+
+ if (mouse_con) {
+ mouse_active = mouse_con->Active();
+ mouse_con->SetActive(false);
+ }
+ }
+}
+
+void
+QuitView::CloseMenu()
+{
+ show_menu = false;
+ Starshatter::GetInstance()->Pause(false);
+
+ if (mouse_con)
+ mouse_con->SetActive(mouse_active);
+}