From 3c487c5cd69c53d6fea948643c0a76df03516605 Mon Sep 17 00:00:00 2001 From: Aki Date: Fri, 1 Apr 2022 21:23:39 +0200 Subject: Moved Stars45 to StarsEx --- StarsEx/QuantumView.cpp | 317 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 StarsEx/QuantumView.cpp (limited to 'StarsEx/QuantumView.cpp') diff --git a/StarsEx/QuantumView.cpp b/StarsEx/QuantumView.cpp new file mode 100644 index 0000000..c3ab4f4 --- /dev/null +++ b/StarsEx/QuantumView.cpp @@ -0,0 +1,317 @@ +/* Starshatter: The Open Source Project + Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors + Copyright (c) 1997-2006, Destroyer Studios LLC. + + AUTHOR: John DiCamillo + + + OVERVIEW + ======== + View class for Quantum Destination HUD Overlay +*/ + +#include "QuantumView.h" +#include "QuantumDrive.h" +#include "HUDView.h" +#include "Ship.h" +#include "Element.h" +#include "Sim.h" +#include "StarSystem.h" +#include "FormatUtil.h" + +#include "Color.h" +#include "Window.h" +#include "Video.h" +#include "Screen.h" +#include "DataLoader.h" +#include "Scene.h" +#include "Font.h" +#include "FontMgr.h" +#include "Keyboard.h" +#include "Mouse.h" +#include "Clock.h" +#include "ContentBundle.h" +#include "Menu.h" + +static Color hud_color = Color::Black; + +// +====================================================================+ +// +// QUANTUM DRIVE DESTINATION MENU: +// + +static Menu* quantum_menu = 0; +static bool show_menu = false; + +void +QuantumView::Initialize() +{ + static int initialized = 0; + if (initialized) return; + + quantum_menu = new Menu(ContentBundle::GetInstance()->GetText("QuantumView.menu")); + + initialized = 1; +} + +void +QuantumView::Close() +{ + delete quantum_menu; +} + +// +====================================================================+ + +QuantumView* QuantumView::quantum_view = 0; + +QuantumView::QuantumView(Window* c) +: View(c), sim(0), ship(0), font(0) +{ + quantum_view = this; + sim = Sim::GetSim(); + + width = window->Width(); + height = window->Height(); + xcenter = (width / 2.0) - 0.5; + ycenter = (height / 2.0) + 0.5; + font = FontMgr::Find("HUD"); + + HUDView* hud = HUDView::GetInstance(); + if (hud) + SetColor(hud->GetTextColor()); +} + +QuantumView::~QuantumView() +{ + quantum_view = 0; +} + +void +QuantumView::OnWindowMove() +{ + width = window->Width(); + height = window->Height(); + xcenter = (width / 2.0) - 0.5; + ycenter = (height / 2.0) + 0.5; +} + +// +--------------------------------------------------------------------+ + +bool +QuantumView::Update(SimObject* obj) +{ + if (obj == ship) + ship = 0; + + return SimObserver::Update(obj); +} + +const char* +QuantumView::GetObserverName() const +{ + return "QuantumView"; +} + +// +--------------------------------------------------------------------+ + +void +QuantumView::Refresh() +{ + sim = Sim::GetSim(); + + if (sim && ship != sim->GetPlayerShip()) { + ship = sim->GetPlayerShip(); + + if (ship) { + if (ship->Life() == 0 || ship->IsDying() || ship->IsDead()) { + ship = 0; + } + else { + Observe(ship); + } + } + } + + if (IsMenuShown()) { + Rect menu_rect(width-115, 10, 115, 12); + + font->SetColor(hud_color); + font->SetAlpha(1); + font->DrawText(quantum_menu->GetTitle(), 0, menu_rect, DT_CENTER); + + menu_rect.y += 15; + + ListIter item = quantum_menu->GetItems(); + while (++item) { + item->SetEnabled(true); + + font->DrawText(item->GetText(), 0, menu_rect, DT_LEFT); + menu_rect.y += 10; + } + } +} + +// +--------------------------------------------------------------------+ + +void +QuantumView::ExecFrame() +{ + HUDView* hud = HUDView::GetInstance(); + if (hud) { + if (hud_color != hud->GetTextColor()) { + hud_color = hud->GetTextColor(); + SetColor(hud_color); + } + } + + static double time_til_change = 0; + + if (time_til_change > 0) + time_til_change -= Clock::GetInstance()->GuiDelta(); + + if (time_til_change <= 0) { + time_til_change = 0; + + if (show_menu) { + QuantumDrive* quantum_drive = 0; + + if (ship) + quantum_drive = ship->GetQuantumDrive(); + + if (quantum_drive && quantum_drive->ActiveState() != QuantumDrive::ACTIVE_READY) { + show_menu = false; + return; + } + + int max_items = quantum_menu->NumItems(); + + for (int i = 0; i < max_items; i++) { + if (Keyboard::KeyDown('1' + i)) { + MenuItem* item = quantum_menu->GetItem(i); + if (item && item->GetEnabled()) { + + SimRegion* rgn = (SimRegion*) item->GetData(); + + if (rgn) { + quantum_drive->SetDestination(rgn, Point(0,0,0)); + quantum_drive->Engage(); + } + + show_menu = false; + time_til_change = 0.3; + break; + } + } + } + } + } +} + +// +--------------------------------------------------------------------+ + +void +QuantumView::SetColor(Color c) +{ + hud_color = c; +} + +// +--------------------------------------------------------------------+ + +bool +QuantumView::IsMenuShown() +{ + return show_menu; +} + +void +QuantumView::ShowMenu() +{ + if (!ship) return; + + if (!show_menu) { + if (ship->IsStarship() && ship->GetQuantumDrive()) { + GetQuantumMenu(ship); + 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... + } + } + } +} + +void +QuantumView::CloseMenu() +{ + show_menu = false; +} + +// +--------------------------------------------------------------------+ + +Menu* +QuantumView::GetQuantumMenu(Ship* s) +{ + if (s && sim) { + if (s->IsStarship()) { + quantum_menu->ClearItems(); + + SimRegion* current_region = ship->GetRegion(); + + if (!current_region) return 0; + + StarSystem* current_system = current_region->System(); + + List rgn_list; + + ListIter iter = sim->GetRegions(); + while (++iter) { + SimRegion* rgn = iter.value(); + StarSystem* rgn_system = rgn->System(); + + if (rgn != ship->GetRegion() && !rgn->IsAirSpace() && + rgn_system == current_system) { + rgn_list.append(rgn); + } + } + + // sort local regions by distance from star: + rgn_list.sort(); + + // now add regions in other star systems: + iter.reset(); + while (++iter) { + SimRegion* rgn = iter.value(); + StarSystem* rgn_system = rgn->System(); + + if (rgn != ship->GetRegion() && rgn->Type() != SimRegion::AIR_SPACE && + rgn_system != current_system && current_region->Links().contains(rgn)) { + rgn_list.append(rgn); + } + } + + int n = 1; + iter.attach(rgn_list); + while (++iter) { + SimRegion* rgn = iter.value(); + StarSystem* rgn_system = rgn->System(); + char text[64]; + + if (rgn_system != current_system) + sprintf_s(text, "%d. %s/%s", n++, rgn_system->Name(), rgn->Name()); + else + sprintf_s(text, "%d. %s", n++, rgn->Name()); + + quantum_menu->AddItem(text, (DWORD) rgn); + } + + return quantum_menu; + } + } + + return 0; +} -- cgit v1.1