From d17521c8b9085a91d08fecfd0b51bbbf7b1dccac Mon Sep 17 00:00:00 2001 From: "milo24x7@gmail.com" Date: Sun, 7 Jul 2013 22:08:49 +0000 Subject: Updated open source license declaration and fixed some formatting issues. --- Stars45/MsnElemDlg.cpp | 1632 ++++++++++++++++++++++++------------------------ 1 file changed, 828 insertions(+), 804 deletions(-) (limited to 'Stars45/MsnElemDlg.cpp') diff --git a/Stars45/MsnElemDlg.cpp b/Stars45/MsnElemDlg.cpp index a792b74..2ad13b6 100644 --- a/Stars45/MsnElemDlg.cpp +++ b/Stars45/MsnElemDlg.cpp @@ -1,805 +1,829 @@ -/* Project Starshatter 5.0 - Destroyer Studios LLC - Copyright © 1997-2007. All Rights Reserved. - - SUBSYSTEM: Stars.exe - FILE: MsnElemDlg.cpp - AUTHOR: John DiCamillo - - - OVERVIEW - ======== - Mod Config Dialog Active Window class -*/ - -#include "MemDebug.h" -#include "MsnElemDlg.h" -#include "MsnEditDlg.h" -#include "MenuScreen.h" -#include "Campaign.h" -#include "Mission.h" -#include "Instruction.h" -#include "Ship.h" -#include "ShipDesign.h" -#include "StarSystem.h" -#include "Galaxy.h" - -#include "Game.h" -#include "DataLoader.h" -#include "Button.h" -#include "ListBox.h" -#include "EditBox.h" -#include "Video.h" -#include "Keyboard.h" -#include "Mouse.h" -#include "ParseUtil.h" -#include "Skin.h" - -// +--------------------------------------------------------------------+ -// DECLARE MAPPING FUNCTIONS: - -DEF_MAP_CLIENT(MsnElemDlg, OnAccept); -DEF_MAP_CLIENT(MsnElemDlg, OnCancel); -DEF_MAP_CLIENT(MsnElemDlg, OnClassSelect); -DEF_MAP_CLIENT(MsnElemDlg, OnDesignSelect); -DEF_MAP_CLIENT(MsnElemDlg, OnObjectiveSelect); -DEF_MAP_CLIENT(MsnElemDlg, OnIFFChange); - -// +--------------------------------------------------------------------+ - -MsnElemDlg::MsnElemDlg(Screen* s, FormDef& def, MenuScreen* mgr) -: FormWindow(s, 0, 0, s->Width(), s->Height()), manager(mgr), -btn_accept(0), btn_cancel(0), edt_name(0), cmb_class(0), cmb_design(0), -edt_size(0), edt_iff(0), cmb_role(0), cmb_region(0), cmb_skin(0), -edt_loc_x(0), edt_loc_y(0), edt_loc_z(0), cmb_heading(0), edt_hold_time(0), -btn_player(0), btn_playable(0), btn_alert(0), btn_command_ai(0), -edt_respawns(0), cmb_commander(0), cmb_carrier(0), cmb_squadron(0), -cmb_intel(0), cmb_loadout(0), cmb_objective(0), cmb_target(0), -mission(0), elem(0), exit_latch(true) -{ - Init(def); -} - -MsnElemDlg::~MsnElemDlg() -{ -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::RegisterControls() -{ - btn_accept = (Button*) FindControl( 1); - if (btn_accept) - REGISTER_CLIENT(EID_CLICK, btn_accept, MsnElemDlg, OnAccept); - - btn_cancel = (Button*) FindControl( 2); - if (btn_accept) - REGISTER_CLIENT(EID_CLICK, btn_cancel, MsnElemDlg, OnCancel); - - edt_name = (EditBox*) FindControl(201); - cmb_class = (ComboBox*) FindControl(202); - cmb_design = (ComboBox*) FindControl(203); - cmb_skin = (ComboBox*) FindControl(213); - edt_size = (EditBox*) FindControl(204); - edt_iff = (EditBox*) FindControl(205); - cmb_role = (ComboBox*) FindControl(206); - cmb_region = (ComboBox*) FindControl(207); - edt_loc_x = (EditBox*) FindControl(208); - edt_loc_y = (EditBox*) FindControl(209); - edt_loc_z = (EditBox*) FindControl(210); - cmb_heading = (ComboBox*) FindControl(211); - edt_hold_time = (EditBox*) FindControl(212); - - btn_player = (Button*) FindControl(221); - btn_alert = (Button*) FindControl(222); - btn_playable = (Button*) FindControl(223); - btn_command_ai = (Button*) FindControl(224); - edt_respawns = (EditBox*) FindControl(225); - cmb_commander = (ComboBox*) FindControl(226); - cmb_carrier = (ComboBox*) FindControl(227); - cmb_squadron = (ComboBox*) FindControl(228); - cmb_intel = (ComboBox*) FindControl(229); - cmb_loadout = (ComboBox*) FindControl(230); - cmb_objective = (ComboBox*) FindControl(231); - cmb_target = (ComboBox*) FindControl(232); - - if (cmb_class) - REGISTER_CLIENT(EID_SELECT, cmb_class, MsnElemDlg, OnClassSelect); - - if (cmb_design) - REGISTER_CLIENT(EID_SELECT, cmb_design, MsnElemDlg, OnDesignSelect); - - if (cmb_objective) - REGISTER_CLIENT(EID_SELECT, cmb_objective, MsnElemDlg, OnObjectiveSelect); - - if (edt_iff) - REGISTER_CLIENT(EID_KILL_FOCUS, edt_iff, MsnElemDlg, OnIFFChange); -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::Show() -{ - FormWindow::Show(); - - if (!elem) return; - - int current_class = 0; - - if (cmb_class) { - cmb_class->ClearItems(); - - cmb_class->AddItem(Ship::ClassName(Ship::DRONE)); - cmb_class->AddItem(Ship::ClassName(Ship::FIGHTER)); - cmb_class->AddItem(Ship::ClassName(Ship::ATTACK)); - - cmb_class->AddItem(Ship::ClassName(Ship::LCA)); - cmb_class->AddItem(Ship::ClassName(Ship::COURIER)); - cmb_class->AddItem(Ship::ClassName(Ship::CARGO)); - cmb_class->AddItem(Ship::ClassName(Ship::CORVETTE)); - cmb_class->AddItem(Ship::ClassName(Ship::FREIGHTER)); - cmb_class->AddItem(Ship::ClassName(Ship::FRIGATE)); - cmb_class->AddItem(Ship::ClassName(Ship::DESTROYER)); - cmb_class->AddItem(Ship::ClassName(Ship::CRUISER)); - cmb_class->AddItem(Ship::ClassName(Ship::BATTLESHIP)); - cmb_class->AddItem(Ship::ClassName(Ship::CARRIER)); - cmb_class->AddItem(Ship::ClassName(Ship::SWACS)); - cmb_class->AddItem(Ship::ClassName(Ship::DREADNAUGHT)); - cmb_class->AddItem(Ship::ClassName(Ship::STATION)); - cmb_class->AddItem(Ship::ClassName(Ship::FARCASTER)); - - cmb_class->AddItem(Ship::ClassName(Ship::MINE)); - cmb_class->AddItem(Ship::ClassName(Ship::COMSAT)); - cmb_class->AddItem(Ship::ClassName(Ship::DEFSAT)); - - cmb_class->AddItem(Ship::ClassName(Ship::BUILDING)); - cmb_class->AddItem(Ship::ClassName(Ship::FACTORY)); - cmb_class->AddItem(Ship::ClassName(Ship::SAM)); - cmb_class->AddItem(Ship::ClassName(Ship::EWR)); - cmb_class->AddItem(Ship::ClassName(Ship::C3I)); - cmb_class->AddItem(Ship::ClassName(Ship::STARBASE)); - - const ShipDesign* design = elem->GetDesign(); - - for (int i = 0; i < cmb_class->NumItems(); i++) { - const char* cname = cmb_class->GetItem(i); - int classid = Ship::ClassForName(cname); - - if (design && classid == design->type) { - cmb_class->SetSelection(i); - current_class = classid; - break; - } - } - } - - if (cmb_design) { - OnClassSelect(0); - OnDesignSelect(0); - } - - if (cmb_role) { - cmb_role->ClearItems(); - - for (int i = Mission::PATROL; i <= Mission::OTHER; i++) { - cmb_role->AddItem(Mission::RoleName(i)); - - if (i == 0) - cmb_role->SetSelection(0); - - else if (elem->MissionRole() == i) - cmb_role->SetSelection(cmb_role->NumItems()-1); - } - } - - if (cmb_region) { - cmb_region->ClearItems(); - - if (mission) { - StarSystem* sys = mission->GetStarSystem(); - if (sys) { - List regions; - regions.append(sys->AllRegions()); - regions.sort(); - - ListIter iter = regions; - while (++iter) { - OrbitalRegion* region = iter.value(); - cmb_region->AddItem(region->Name()); - - if (!strcmp(elem->Region(), region->Name())) - cmb_region->SetSelection(cmb_region->NumItems()-1); - } - } - } - } - - char buf[64]; - - if (edt_name) edt_name->SetText(elem->Name()); - - sprintf_s(buf, "%d", elem->Count()); - if (edt_size) edt_size->SetText(buf); - - sprintf_s(buf, "%d", elem->GetIFF()); - if (edt_iff) edt_iff->SetText(buf); - - sprintf_s(buf, "%d", (int) elem->Location().x / 1000); - if (edt_loc_x) edt_loc_x->SetText(buf); - - sprintf_s(buf, "%d", (int) elem->Location().y / 1000); - if (edt_loc_y) edt_loc_y->SetText(buf); - - sprintf_s(buf, "%d", (int) elem->Location().z / 1000); - if (edt_loc_z) edt_loc_z->SetText(buf); - - sprintf_s(buf, "%d", elem->RespawnCount()); - if (edt_respawns) edt_respawns->SetText(buf); - - sprintf_s(buf, "%d", elem->HoldTime()); - if (edt_hold_time) edt_hold_time->SetText(buf); - - if (btn_player) btn_player->SetButtonState(elem->Player() > 0 ? 1 : 0); - if (btn_playable) btn_playable->SetButtonState(elem->IsPlayable() ? 1 : 0); - if (btn_alert) btn_alert->SetButtonState(elem->IsAlert() ? 1 : 0); - if (btn_command_ai) btn_command_ai->SetButtonState(elem->CommandAI()); - - UpdateTeamInfo(); - - if (cmb_intel) { - cmb_intel->ClearItems(); - - for (int i = Intel::RESERVE; i < Intel::TRACKED; i++) { - cmb_intel->AddItem(Intel::NameFromIntel(i)); - - if (i == 0) - cmb_intel->SetSelection(0); - - else if (elem->IntelLevel() == i) - cmb_intel->SetSelection(cmb_intel->NumItems()-1); - } - } - - Instruction* instr = 0; - if (elem->Objectives().size() > 0) - instr = elem->Objectives().at(0); - - if (cmb_objective) { - cmb_objective->ClearItems(); - cmb_objective->AddItem(""); - cmb_objective->SetSelection(0); - - for (int i = 0; i < Instruction::NUM_ACTIONS; i++) { - cmb_objective->AddItem(Instruction::ActionName(i)); - - if (instr && instr->Action() == i) - cmb_objective->SetSelection(i+1); - } - } - - if (cmb_target) { - OnObjectiveSelect(0); - } - - if (cmb_heading) { - double heading = elem->Heading(); - - while (heading > 2*PI) - heading -= 2*PI; - - while (heading < 0) - heading += 2*PI; - - if (heading >= PI/4 && heading < 3*PI/4) - cmb_heading->SetSelection(1); - - else if (heading >= 3*PI/4 && heading < 5*PI/4) - cmb_heading->SetSelection(2); - - else if (heading >= 5*PI/4 && heading < 7*PI/4) - cmb_heading->SetSelection(3); - - else - cmb_heading->SetSelection(0); - } - - exit_latch = true; -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::ExecFrame() -{ - if (Keyboard::KeyDown(VK_RETURN)) { - if (!exit_latch && btn_accept && btn_accept->IsEnabled()) - OnAccept(0); - } - - else if (Keyboard::KeyDown(VK_ESCAPE)) { - if (!exit_latch) - OnCancel(0); - } - - else { - exit_latch = false; - } -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::SetMission(Mission* m) -{ - mission = m; -} - -void -MsnElemDlg::SetMissionElement(MissionElement* e) -{ - elem = e; -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::UpdateTeamInfo() -{ - if (cmb_commander) { - cmb_commander->ClearItems(); - cmb_commander->AddItem(""); - cmb_commander->SetSelection(0); - - if (mission && elem) { - ListIter iter = mission->GetElements(); - while (++iter) { - MissionElement* e = iter.value(); - - if (CanCommand(e, elem)) { - cmb_commander->AddItem(e->Name()); - - if (elem->Commander() == e->Name()) - cmb_commander->SetSelection(cmb_commander->NumItems()-1); - } - } - } - } - - if (cmb_squadron) { - cmb_squadron->ClearItems(); - cmb_squadron->AddItem(""); - cmb_squadron->SetSelection(0); - - if (mission && elem) { - ListIter iter = mission->GetElements(); - while (++iter) { - MissionElement* e = iter.value(); - - if (e->GetIFF() == elem->GetIFF() && e != elem && e->IsSquadron()) { - cmb_squadron->AddItem(e->Name()); - - if (elem->Squadron() == e->Name()) - cmb_squadron->SetSelection(cmb_squadron->NumItems()-1); - } - } - } - } - - if (cmb_carrier) { - cmb_carrier->ClearItems(); - cmb_carrier->AddItem(""); - cmb_carrier->SetSelection(0); - - if (mission && elem) { - ListIter iter = mission->GetElements(); - while (++iter) { - MissionElement* e = iter.value(); - - if (e->GetIFF() == elem->GetIFF() && e != elem && e->GetDesign() && e->GetDesign()->flight_decks.size()) { - cmb_carrier->AddItem(e->Name()); - - if (elem->Carrier() == e->Name()) - cmb_carrier->SetSelection(cmb_carrier->NumItems()-1); - } - } - } - } -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::OnClassSelect(AWEvent* event) -{ - if (!cmb_class || !cmb_design) return; - - const char* cname = cmb_class->GetSelectedItem(); - int classid = Ship::ClassForName(cname); - - cmb_design->ClearItems(); - - List designs; - ShipDesign::GetDesignList(classid, designs); - - if (designs.size() > 0) { - const ShipDesign* design = elem->GetDesign(); - bool found = false; - - for (int i = 0; i < designs.size(); i++) { - const char* dsn = designs[i]->data(); - cmb_design->AddItem(dsn); - - if (design && !_stricmp(dsn, design->name)) { - cmb_design->SetSelection(i); - found = true; - } - } - - if (!found) - cmb_design->SetSelection(0); - } - else { - cmb_design->AddItem(""); - cmb_design->SetSelection(0); - } - - OnDesignSelect(0); -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::OnDesignSelect(AWEvent* event) -{ - if (!cmb_design) return; - - ShipDesign* design = 0; - - const char* dname = cmb_design->GetSelectedItem(); - int load_index = 0; - - if (dname) - design = ShipDesign::Get(dname); - - if (cmb_loadout) { - cmb_loadout->ClearItems(); - - if (design) { - MissionLoad* mload = 0; - - if (elem && elem->Loadouts().size() > 0) - mload = elem->Loadouts().at(0); - - const List& loadouts = design->loadouts; - - if (loadouts.size() > 0) { - for (int i = 0; i < loadouts.size(); i++) { - const ShipLoad* load = loadouts[i]; - if (load->name[0]) { - cmb_loadout->AddItem(load->name); - - if (mload && mload->GetName() == load->name) { - load_index = cmb_loadout->NumItems()-1; - } - } - } - } - } - - if (cmb_loadout->NumItems() < 1) - cmb_loadout->AddItem(""); - - cmb_loadout->SetSelection(load_index); - } - - if (cmb_skin) { - cmb_skin->ClearItems(); - - if (design) { - cmb_skin->AddItem(Game::GetText("MsnDlg.default")); - cmb_skin->SetSelection(0); - - ListIter iter = design->skins; - - while (++iter) { - Skin* s = iter.value(); - cmb_skin->AddItem(s->Name()); - - if (elem && elem->GetSkin() && !strcmp(s->Name(), elem->GetSkin()->Name())) { - cmb_skin->SetSelection(cmb_skin->NumItems()-1); - } - } - } - } -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::OnObjectiveSelect(AWEvent* event) -{ - if (!cmb_objective || !cmb_target) return; - - Instruction* instr = 0; - if (elem->Objectives().size() > 0) - instr = elem->Objectives().at(0); - - int objid = cmb_objective->GetSelectedIndex() - 1; - - cmb_target->ClearItems(); - cmb_target->AddItem(""); - - if (mission) { - ListIter iter = mission->GetElements(); - while (++iter) { - MissionElement* e = iter.value(); - - if (e != elem) { - bool add = false; - - if (objid < Instruction::PATROL) - add = e->GetIFF() == 0 || e->GetIFF() == elem->GetIFF(); - else - add = e->GetIFF() != elem->GetIFF(); - - if (add) { - cmb_target->AddItem(e->Name()); - - if (instr && !_stricmp(instr->TargetName(), e->Name())) - cmb_target->SetSelection(cmb_target->NumItems()-1); - } - } - } - } -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::OnIFFChange(AWEvent* event) -{ - if (edt_iff && elem) { - int elem_iff = 0; - sscanf_s(edt_iff->GetText().data(), "%d", &elem_iff); - - if (elem->GetIFF() == elem_iff) - return; - - elem->SetIFF(elem_iff); - } - - UpdateTeamInfo(); - - if (cmb_target) - OnObjectiveSelect(0); -} - -// +--------------------------------------------------------------------+ - -void -MsnElemDlg::OnAccept(AWEvent* event) -{ - if (mission && elem) { - char buf[64]; - int val; - - if (edt_name) { - elem->SetName(edt_name->GetText()); - } - - if (edt_size) { - strcpy_s(buf, edt_size->GetText()); - - if (isdigit(*buf)) - sscanf_s(buf, "%d", &val); - else - val = 1; - - elem->SetCount(val); - } - - if (edt_iff) { - strcpy_s(buf, edt_iff->GetText()); - - if (isdigit(*buf)) - sscanf_s(buf, "%d", &val); - else - val = 1; - - elem->SetIFF(val); - } - - if (edt_loc_x && edt_loc_y && edt_loc_z) { - Point loc; - - strcpy_s(buf, edt_loc_x->GetText()); - - if (isdigit(*buf) || *buf == '-') - sscanf_s(buf, "%d", &val); - else - val = 0; - - loc.x = val * 1000; - - strcpy_s(buf, edt_loc_y->GetText()); - - if (isdigit(*buf) || *buf == '-') - sscanf_s(buf, "%d", &val); - else - val = 0; - - loc.y = val * 1000; - - strcpy_s(buf, edt_loc_z->GetText()); - - if (isdigit(*buf) || *buf == '-') - sscanf_s(buf, "%d", &val); - else - val = 0; - - loc.z = val * 1000; - - elem->SetLocation(loc); - } - - if (edt_respawns) { - strcpy_s(buf, edt_respawns->GetText()); - - if (isdigit(*buf)) - sscanf_s(buf, "%d", &val); - else - val = 0; - - elem->SetRespawnCount(val); - } - - if (edt_hold_time) { - strcpy_s(buf, edt_hold_time->GetText()); - - if (isdigit(*buf)) - sscanf_s(buf, "%d", &val); - else - val = 0; - - elem->SetHoldTime(val); - } - - if (btn_player) { - if (btn_player->GetButtonState() > 0) { - mission->SetPlayer(elem); - } - else { - elem->SetPlayer(0); - } - } - - if (btn_playable) - elem->SetPlayable(btn_playable->GetButtonState() ? true : false); - - if (btn_alert) - elem->SetAlert(btn_alert->GetButtonState() ? true : false); - - if (btn_command_ai) - elem->SetCommandAI(btn_command_ai->GetButtonState() ? 1 : 0); - - if (cmb_design) { - ShipDesign* d = ShipDesign::Get(cmb_design->GetSelectedItem()); - - if (d) { - elem->SetDesign(d); - - if (cmb_skin) { - const char* skin_name = cmb_skin->GetSelectedItem(); - - if (strcmp(skin_name, Game::GetText("MsnDlg.default").data())) { - elem->SetSkin(d->FindSkin(skin_name)); - } - else { - elem->SetSkin(0); - } - } - } - } - - if (cmb_role) { - elem->SetMissionRole(cmb_role->GetSelectedIndex()); - } - - if (cmb_region) { - elem->SetRegion(cmb_region->GetSelectedItem()); - - if (elem->Player() > 0) { - mission->SetRegion(cmb_region->GetSelectedItem()); - } - } - - if (cmb_heading) { - switch (cmb_heading->GetSelectedIndex()) { - default: - case 0: elem->SetHeading(0); break; - case 1: elem->SetHeading(PI/2); break; - case 2: elem->SetHeading(PI); break; - case 3: elem->SetHeading(3*PI/2); break; - } - } - - if (cmb_commander) { - elem->SetCommander(cmb_commander->GetSelectedItem()); - } - - if (cmb_squadron) { - elem->SetSquadron(cmb_squadron->GetSelectedItem()); - } - - if (cmb_carrier) { - elem->SetCarrier(cmb_carrier->GetSelectedItem()); - } - - if (cmb_intel) { - elem->SetIntelLevel(Intel::IntelFromName(cmb_intel->GetSelectedItem())); - } - - if (cmb_loadout && cmb_loadout->NumItems()) { - elem->Loadouts().destroy(); - - const char* loadname = cmb_loadout->GetSelectedItem(); - if (loadname && *loadname) { - MissionLoad* mload = new(__FILE__,__LINE__) MissionLoad(-1, cmb_loadout->GetSelectedItem()); - elem->Loadouts().append(mload); - } - } - - if (cmb_objective && cmb_target) { - List& objectives = elem->Objectives(); - objectives.destroy(); - - int action = cmb_objective->GetSelectedIndex() - 1; - const char* target = cmb_target->GetSelectedItem(); - - if (action >= Instruction::VECTOR) { - Instruction* obj = new(__FILE__,__LINE__) Instruction(action, target); - objectives.append(obj); - } - } - - if (elem->Player()) { - mission->SetTeam(elem->GetIFF()); - } - } - - manager->ShowMsnEditDlg(); -} - -void -MsnElemDlg::OnCancel(AWEvent* event) -{ - manager->ShowMsnEditDlg(); -} - -bool -MsnElemDlg::CanCommand(const MissionElement* commander, -const MissionElement* subordinate) const -{ - if (mission && commander && subordinate && commander != subordinate) { - if (commander->GetIFF() != subordinate->GetIFF()) - return false; - - if (commander->IsSquadron()) - return false; - - if (commander->Commander().length() == 0) - return true; - - if (subordinate->Name() == commander->Commander()) - return false; - - MissionElement* elem = mission->FindElement(commander->Commander()); - - if (elem) - return CanCommand(elem, subordinate); - } - - return false; +/* 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: MsnElemDlg.cpp + AUTHOR: John DiCamillo + + + OVERVIEW + ======== + Mod Config Dialog Active Window class +*/ + +#include "MemDebug.h" +#include "MsnElemDlg.h" +#include "MsnEditDlg.h" +#include "MenuScreen.h" +#include "Campaign.h" +#include "Mission.h" +#include "Instruction.h" +#include "Ship.h" +#include "ShipDesign.h" +#include "StarSystem.h" +#include "Galaxy.h" + +#include "Game.h" +#include "DataLoader.h" +#include "Button.h" +#include "ListBox.h" +#include "EditBox.h" +#include "Video.h" +#include "Keyboard.h" +#include "Mouse.h" +#include "ParseUtil.h" +#include "Skin.h" + +// +--------------------------------------------------------------------+ +// DECLARE MAPPING FUNCTIONS: + +DEF_MAP_CLIENT(MsnElemDlg, OnAccept); +DEF_MAP_CLIENT(MsnElemDlg, OnCancel); +DEF_MAP_CLIENT(MsnElemDlg, OnClassSelect); +DEF_MAP_CLIENT(MsnElemDlg, OnDesignSelect); +DEF_MAP_CLIENT(MsnElemDlg, OnObjectiveSelect); +DEF_MAP_CLIENT(MsnElemDlg, OnIFFChange); + +// +--------------------------------------------------------------------+ + +MsnElemDlg::MsnElemDlg(Screen* s, FormDef& def, MenuScreen* mgr) +: FormWindow(s, 0, 0, s->Width(), s->Height()), manager(mgr), +btn_accept(0), btn_cancel(0), edt_name(0), cmb_class(0), cmb_design(0), +edt_size(0), edt_iff(0), cmb_role(0), cmb_region(0), cmb_skin(0), +edt_loc_x(0), edt_loc_y(0), edt_loc_z(0), cmb_heading(0), edt_hold_time(0), +btn_player(0), btn_playable(0), btn_alert(0), btn_command_ai(0), +edt_respawns(0), cmb_commander(0), cmb_carrier(0), cmb_squadron(0), +cmb_intel(0), cmb_loadout(0), cmb_objective(0), cmb_target(0), +mission(0), elem(0), exit_latch(true) +{ + Init(def); +} + +MsnElemDlg::~MsnElemDlg() +{ +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::RegisterControls() +{ + btn_accept = (Button*) FindControl( 1); + if (btn_accept) + REGISTER_CLIENT(EID_CLICK, btn_accept, MsnElemDlg, OnAccept); + + btn_cancel = (Button*) FindControl( 2); + if (btn_accept) + REGISTER_CLIENT(EID_CLICK, btn_cancel, MsnElemDlg, OnCancel); + + edt_name = (EditBox*) FindControl(201); + cmb_class = (ComboBox*) FindControl(202); + cmb_design = (ComboBox*) FindControl(203); + cmb_skin = (ComboBox*) FindControl(213); + edt_size = (EditBox*) FindControl(204); + edt_iff = (EditBox*) FindControl(205); + cmb_role = (ComboBox*) FindControl(206); + cmb_region = (ComboBox*) FindControl(207); + edt_loc_x = (EditBox*) FindControl(208); + edt_loc_y = (EditBox*) FindControl(209); + edt_loc_z = (EditBox*) FindControl(210); + cmb_heading = (ComboBox*) FindControl(211); + edt_hold_time = (EditBox*) FindControl(212); + + btn_player = (Button*) FindControl(221); + btn_alert = (Button*) FindControl(222); + btn_playable = (Button*) FindControl(223); + btn_command_ai = (Button*) FindControl(224); + edt_respawns = (EditBox*) FindControl(225); + cmb_commander = (ComboBox*) FindControl(226); + cmb_carrier = (ComboBox*) FindControl(227); + cmb_squadron = (ComboBox*) FindControl(228); + cmb_intel = (ComboBox*) FindControl(229); + cmb_loadout = (ComboBox*) FindControl(230); + cmb_objective = (ComboBox*) FindControl(231); + cmb_target = (ComboBox*) FindControl(232); + + if (cmb_class) + REGISTER_CLIENT(EID_SELECT, cmb_class, MsnElemDlg, OnClassSelect); + + if (cmb_design) + REGISTER_CLIENT(EID_SELECT, cmb_design, MsnElemDlg, OnDesignSelect); + + if (cmb_objective) + REGISTER_CLIENT(EID_SELECT, cmb_objective, MsnElemDlg, OnObjectiveSelect); + + if (edt_iff) + REGISTER_CLIENT(EID_KILL_FOCUS, edt_iff, MsnElemDlg, OnIFFChange); +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::Show() +{ + FormWindow::Show(); + + if (!elem) return; + + int current_class = 0; + + if (cmb_class) { + cmb_class->ClearItems(); + + cmb_class->AddItem(Ship::ClassName(Ship::DRONE)); + cmb_class->AddItem(Ship::ClassName(Ship::FIGHTER)); + cmb_class->AddItem(Ship::ClassName(Ship::ATTACK)); + + cmb_class->AddItem(Ship::ClassName(Ship::LCA)); + cmb_class->AddItem(Ship::ClassName(Ship::COURIER)); + cmb_class->AddItem(Ship::ClassName(Ship::CARGO)); + cmb_class->AddItem(Ship::ClassName(Ship::CORVETTE)); + cmb_class->AddItem(Ship::ClassName(Ship::FREIGHTER)); + cmb_class->AddItem(Ship::ClassName(Ship::FRIGATE)); + cmb_class->AddItem(Ship::ClassName(Ship::DESTROYER)); + cmb_class->AddItem(Ship::ClassName(Ship::CRUISER)); + cmb_class->AddItem(Ship::ClassName(Ship::BATTLESHIP)); + cmb_class->AddItem(Ship::ClassName(Ship::CARRIER)); + cmb_class->AddItem(Ship::ClassName(Ship::SWACS)); + cmb_class->AddItem(Ship::ClassName(Ship::DREADNAUGHT)); + cmb_class->AddItem(Ship::ClassName(Ship::STATION)); + cmb_class->AddItem(Ship::ClassName(Ship::FARCASTER)); + + cmb_class->AddItem(Ship::ClassName(Ship::MINE)); + cmb_class->AddItem(Ship::ClassName(Ship::COMSAT)); + cmb_class->AddItem(Ship::ClassName(Ship::DEFSAT)); + + cmb_class->AddItem(Ship::ClassName(Ship::BUILDING)); + cmb_class->AddItem(Ship::ClassName(Ship::FACTORY)); + cmb_class->AddItem(Ship::ClassName(Ship::SAM)); + cmb_class->AddItem(Ship::ClassName(Ship::EWR)); + cmb_class->AddItem(Ship::ClassName(Ship::C3I)); + cmb_class->AddItem(Ship::ClassName(Ship::STARBASE)); + + const ShipDesign* design = elem->GetDesign(); + + for (int i = 0; i < cmb_class->NumItems(); i++) { + const char* cname = cmb_class->GetItem(i); + int classid = Ship::ClassForName(cname); + + if (design && classid == design->type) { + cmb_class->SetSelection(i); + current_class = classid; + break; + } + } + } + + if (cmb_design) { + OnClassSelect(0); + OnDesignSelect(0); + } + + if (cmb_role) { + cmb_role->ClearItems(); + + for (int i = Mission::PATROL; i <= Mission::OTHER; i++) { + cmb_role->AddItem(Mission::RoleName(i)); + + if (i == 0) + cmb_role->SetSelection(0); + + else if (elem->MissionRole() == i) + cmb_role->SetSelection(cmb_role->NumItems()-1); + } + } + + if (cmb_region) { + cmb_region->ClearItems(); + + if (mission) { + StarSystem* sys = mission->GetStarSystem(); + if (sys) { + List regions; + regions.append(sys->AllRegions()); + regions.sort(); + + ListIter iter = regions; + while (++iter) { + OrbitalRegion* region = iter.value(); + cmb_region->AddItem(region->Name()); + + if (!strcmp(elem->Region(), region->Name())) + cmb_region->SetSelection(cmb_region->NumItems()-1); + } + } + } + } + + char buf[64]; + + if (edt_name) edt_name->SetText(elem->Name()); + + sprintf_s(buf, "%d", elem->Count()); + if (edt_size) edt_size->SetText(buf); + + sprintf_s(buf, "%d", elem->GetIFF()); + if (edt_iff) edt_iff->SetText(buf); + + sprintf_s(buf, "%d", (int) elem->Location().x / 1000); + if (edt_loc_x) edt_loc_x->SetText(buf); + + sprintf_s(buf, "%d", (int) elem->Location().y / 1000); + if (edt_loc_y) edt_loc_y->SetText(buf); + + sprintf_s(buf, "%d", (int) elem->Location().z / 1000); + if (edt_loc_z) edt_loc_z->SetText(buf); + + sprintf_s(buf, "%d", elem->RespawnCount()); + if (edt_respawns) edt_respawns->SetText(buf); + + sprintf_s(buf, "%d", elem->HoldTime()); + if (edt_hold_time) edt_hold_time->SetText(buf); + + if (btn_player) btn_player->SetButtonState(elem->Player() > 0 ? 1 : 0); + if (btn_playable) btn_playable->SetButtonState(elem->IsPlayable() ? 1 : 0); + if (btn_alert) btn_alert->SetButtonState(elem->IsAlert() ? 1 : 0); + if (btn_command_ai) btn_command_ai->SetButtonState(elem->CommandAI()); + + UpdateTeamInfo(); + + if (cmb_intel) { + cmb_intel->ClearItems(); + + for (int i = Intel::RESERVE; i < Intel::TRACKED; i++) { + cmb_intel->AddItem(Intel::NameFromIntel(i)); + + if (i == 0) + cmb_intel->SetSelection(0); + + else if (elem->IntelLevel() == i) + cmb_intel->SetSelection(cmb_intel->NumItems()-1); + } + } + + Instruction* instr = 0; + if (elem->Objectives().size() > 0) + instr = elem->Objectives().at(0); + + if (cmb_objective) { + cmb_objective->ClearItems(); + cmb_objective->AddItem(""); + cmb_objective->SetSelection(0); + + for (int i = 0; i < Instruction::NUM_ACTIONS; i++) { + cmb_objective->AddItem(Instruction::ActionName(i)); + + if (instr && instr->Action() == i) + cmb_objective->SetSelection(i+1); + } + } + + if (cmb_target) { + OnObjectiveSelect(0); + } + + if (cmb_heading) { + double heading = elem->Heading(); + + while (heading > 2*PI) + heading -= 2*PI; + + while (heading < 0) + heading += 2*PI; + + if (heading >= PI/4 && heading < 3*PI/4) + cmb_heading->SetSelection(1); + + else if (heading >= 3*PI/4 && heading < 5*PI/4) + cmb_heading->SetSelection(2); + + else if (heading >= 5*PI/4 && heading < 7*PI/4) + cmb_heading->SetSelection(3); + + else + cmb_heading->SetSelection(0); + } + + exit_latch = true; +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::ExecFrame() +{ + if (Keyboard::KeyDown(VK_RETURN)) { + if (!exit_latch && btn_accept && btn_accept->IsEnabled()) + OnAccept(0); + } + + else if (Keyboard::KeyDown(VK_ESCAPE)) { + if (!exit_latch) + OnCancel(0); + } + + else { + exit_latch = false; + } +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::SetMission(Mission* m) +{ + mission = m; +} + +void +MsnElemDlg::SetMissionElement(MissionElement* e) +{ + elem = e; +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::UpdateTeamInfo() +{ + if (cmb_commander) { + cmb_commander->ClearItems(); + cmb_commander->AddItem(""); + cmb_commander->SetSelection(0); + + if (mission && elem) { + ListIter iter = mission->GetElements(); + while (++iter) { + MissionElement* e = iter.value(); + + if (CanCommand(e, elem)) { + cmb_commander->AddItem(e->Name()); + + if (elem->Commander() == e->Name()) + cmb_commander->SetSelection(cmb_commander->NumItems()-1); + } + } + } + } + + if (cmb_squadron) { + cmb_squadron->ClearItems(); + cmb_squadron->AddItem(""); + cmb_squadron->SetSelection(0); + + if (mission && elem) { + ListIter iter = mission->GetElements(); + while (++iter) { + MissionElement* e = iter.value(); + + if (e->GetIFF() == elem->GetIFF() && e != elem && e->IsSquadron()) { + cmb_squadron->AddItem(e->Name()); + + if (elem->Squadron() == e->Name()) + cmb_squadron->SetSelection(cmb_squadron->NumItems()-1); + } + } + } + } + + if (cmb_carrier) { + cmb_carrier->ClearItems(); + cmb_carrier->AddItem(""); + cmb_carrier->SetSelection(0); + + if (mission && elem) { + ListIter iter = mission->GetElements(); + while (++iter) { + MissionElement* e = iter.value(); + + if (e->GetIFF() == elem->GetIFF() && e != elem && e->GetDesign() && e->GetDesign()->flight_decks.size()) { + cmb_carrier->AddItem(e->Name()); + + if (elem->Carrier() == e->Name()) + cmb_carrier->SetSelection(cmb_carrier->NumItems()-1); + } + } + } + } +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::OnClassSelect(AWEvent* event) +{ + if (!cmb_class || !cmb_design) return; + + const char* cname = cmb_class->GetSelectedItem(); + int classid = Ship::ClassForName(cname); + + cmb_design->ClearItems(); + + List designs; + ShipDesign::GetDesignList(classid, designs); + + if (designs.size() > 0) { + const ShipDesign* design = elem->GetDesign(); + bool found = false; + + for (int i = 0; i < designs.size(); i++) { + const char* dsn = designs[i]->data(); + cmb_design->AddItem(dsn); + + if (design && !_stricmp(dsn, design->name)) { + cmb_design->SetSelection(i); + found = true; + } + } + + if (!found) + cmb_design->SetSelection(0); + } + else { + cmb_design->AddItem(""); + cmb_design->SetSelection(0); + } + + OnDesignSelect(0); +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::OnDesignSelect(AWEvent* event) +{ + if (!cmb_design) return; + + ShipDesign* design = 0; + + const char* dname = cmb_design->GetSelectedItem(); + int load_index = 0; + + if (dname) + design = ShipDesign::Get(dname); + + if (cmb_loadout) { + cmb_loadout->ClearItems(); + + if (design) { + MissionLoad* mload = 0; + + if (elem && elem->Loadouts().size() > 0) + mload = elem->Loadouts().at(0); + + const List& loadouts = design->loadouts; + + if (loadouts.size() > 0) { + for (int i = 0; i < loadouts.size(); i++) { + const ShipLoad* load = loadouts[i]; + if (load->name[0]) { + cmb_loadout->AddItem(load->name); + + if (mload && mload->GetName() == load->name) { + load_index = cmb_loadout->NumItems()-1; + } + } + } + } + } + + if (cmb_loadout->NumItems() < 1) + cmb_loadout->AddItem(""); + + cmb_loadout->SetSelection(load_index); + } + + if (cmb_skin) { + cmb_skin->ClearItems(); + + if (design) { + cmb_skin->AddItem(Game::GetText("MsnDlg.default")); + cmb_skin->SetSelection(0); + + ListIter iter = design->skins; + + while (++iter) { + Skin* s = iter.value(); + cmb_skin->AddItem(s->Name()); + + if (elem && elem->GetSkin() && !strcmp(s->Name(), elem->GetSkin()->Name())) { + cmb_skin->SetSelection(cmb_skin->NumItems()-1); + } + } + } + } +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::OnObjectiveSelect(AWEvent* event) +{ + if (!cmb_objective || !cmb_target) return; + + Instruction* instr = 0; + if (elem->Objectives().size() > 0) + instr = elem->Objectives().at(0); + + int objid = cmb_objective->GetSelectedIndex() - 1; + + cmb_target->ClearItems(); + cmb_target->AddItem(""); + + if (mission) { + ListIter iter = mission->GetElements(); + while (++iter) { + MissionElement* e = iter.value(); + + if (e != elem) { + bool add = false; + + if (objid < Instruction::PATROL) + add = e->GetIFF() == 0 || e->GetIFF() == elem->GetIFF(); + else + add = e->GetIFF() != elem->GetIFF(); + + if (add) { + cmb_target->AddItem(e->Name()); + + if (instr && !_stricmp(instr->TargetName(), e->Name())) + cmb_target->SetSelection(cmb_target->NumItems()-1); + } + } + } + } +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::OnIFFChange(AWEvent* event) +{ + if (edt_iff && elem) { + int elem_iff = 0; + sscanf_s(edt_iff->GetText().data(), "%d", &elem_iff); + + if (elem->GetIFF() == elem_iff) + return; + + elem->SetIFF(elem_iff); + } + + UpdateTeamInfo(); + + if (cmb_target) + OnObjectiveSelect(0); +} + +// +--------------------------------------------------------------------+ + +void +MsnElemDlg::OnAccept(AWEvent* event) +{ + if (mission && elem) { + char buf[64]; + int val; + + if (edt_name) { + elem->SetName(edt_name->GetText()); + } + + if (edt_size) { + strcpy_s(buf, edt_size->GetText()); + + if (isdigit(*buf)) + sscanf_s(buf, "%d", &val); + else + val = 1; + + elem->SetCount(val); + } + + if (edt_iff) { + strcpy_s(buf, edt_iff->GetText()); + + if (isdigit(*buf)) + sscanf_s(buf, "%d", &val); + else + val = 1; + + elem->SetIFF(val); + } + + if (edt_loc_x && edt_loc_y && edt_loc_z) { + Point loc; + + strcpy_s(buf, edt_loc_x->GetText()); + + if (isdigit(*buf) || *buf == '-') + sscanf_s(buf, "%d", &val); + else + val = 0; + + loc.x = val * 1000; + + strcpy_s(buf, edt_loc_y->GetText()); + + if (isdigit(*buf) || *buf == '-') + sscanf_s(buf, "%d", &val); + else + val = 0; + + loc.y = val * 1000; + + strcpy_s(buf, edt_loc_z->GetText()); + + if (isdigit(*buf) || *buf == '-') + sscanf_s(buf, "%d", &val); + else + val = 0; + + loc.z = val * 1000; + + elem->SetLocation(loc); + } + + if (edt_respawns) { + strcpy_s(buf, edt_respawns->GetText()); + + if (isdigit(*buf)) + sscanf_s(buf, "%d", &val); + else + val = 0; + + elem->SetRespawnCount(val); + } + + if (edt_hold_time) { + strcpy_s(buf, edt_hold_time->GetText()); + + if (isdigit(*buf)) + sscanf_s(buf, "%d", &val); + else + val = 0; + + elem->SetHoldTime(val); + } + + if (btn_player) { + if (btn_player->GetButtonState() > 0) { + mission->SetPlayer(elem); + } + else { + elem->SetPlayer(0); + } + } + + if (btn_playable) + elem->SetPlayable(btn_playable->GetButtonState() ? true : false); + + if (btn_alert) + elem->SetAlert(btn_alert->GetButtonState() ? true : false); + + if (btn_command_ai) + elem->SetCommandAI(btn_command_ai->GetButtonState() ? 1 : 0); + + if (cmb_design) { + ShipDesign* d = ShipDesign::Get(cmb_design->GetSelectedItem()); + + if (d) { + elem->SetDesign(d); + + if (cmb_skin) { + const char* skin_name = cmb_skin->GetSelectedItem(); + + if (strcmp(skin_name, Game::GetText("MsnDlg.default").data())) { + elem->SetSkin(d->FindSkin(skin_name)); + } + else { + elem->SetSkin(0); + } + } + } + } + + if (cmb_role) { + elem->SetMissionRole(cmb_role->GetSelectedIndex()); + } + + if (cmb_region) { + elem->SetRegion(cmb_region->GetSelectedItem()); + + if (elem->Player() > 0) { + mission->SetRegion(cmb_region->GetSelectedItem()); + } + } + + if (cmb_heading) { + switch (cmb_heading->GetSelectedIndex()) { + default: + case 0: elem->SetHeading(0); break; + case 1: elem->SetHeading(PI/2); break; + case 2: elem->SetHeading(PI); break; + case 3: elem->SetHeading(3*PI/2); break; + } + } + + if (cmb_commander) { + elem->SetCommander(cmb_commander->GetSelectedItem()); + } + + if (cmb_squadron) { + elem->SetSquadron(cmb_squadron->GetSelectedItem()); + } + + if (cmb_carrier) { + elem->SetCarrier(cmb_carrier->GetSelectedItem()); + } + + if (cmb_intel) { + elem->SetIntelLevel(Intel::IntelFromName(cmb_intel->GetSelectedItem())); + } + + if (cmb_loadout && cmb_loadout->NumItems()) { + elem->Loadouts().destroy(); + + const char* loadname = cmb_loadout->GetSelectedItem(); + if (loadname && *loadname) { + MissionLoad* mload = new(__FILE__,__LINE__) MissionLoad(-1, cmb_loadout->GetSelectedItem()); + elem->Loadouts().append(mload); + } + } + + if (cmb_objective && cmb_target) { + List& objectives = elem->Objectives(); + objectives.destroy(); + + int action = cmb_objective->GetSelectedIndex() - 1; + const char* target = cmb_target->GetSelectedItem(); + + if (action >= Instruction::VECTOR) { + Instruction* obj = new(__FILE__,__LINE__) Instruction(action, target); + objectives.append(obj); + } + } + + if (elem->Player()) { + mission->SetTeam(elem->GetIFF()); + } + } + + manager->ShowMsnEditDlg(); +} + +void +MsnElemDlg::OnCancel(AWEvent* event) +{ + manager->ShowMsnEditDlg(); +} + +bool +MsnElemDlg::CanCommand(const MissionElement* commander, +const MissionElement* subordinate) const +{ + if (mission && commander && subordinate && commander != subordinate) { + if (commander->GetIFF() != subordinate->GetIFF()) + return false; + + if (commander->IsSquadron()) + return false; + + if (commander->Commander().length() == 0) + return true; + + if (subordinate->Name() == commander->Commander()) + return false; + + MissionElement* elem = mission->FindElement(commander->Commander()); + + if (elem) + return CanCommand(elem, subordinate); + } + + return false; } \ No newline at end of file -- cgit v1.1