/* Starshatter: The Open Source Project Copyright (c) 2021-2024, 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 ======== Mod Config Dialog Active Window class */ #include "MsnEventDlg.h" #include "MsnEditDlg.h" #include "MenuScreen.h" #include "Campaign.h" #include "Mission.h" #include "MissionEvent.h" #include "Instruction.h" #include "Ship.h" #include "ShipDesign.h" #include "StarSystem.h" #include "Galaxy.h" #include "Game.h" #include "Button.h" #include "ListBox.h" #include "EditBox.h" #include "Video.h" #include "Keyboard.h" #include "Mouse.h" #include "ParseUtil.h" // +--------------------------------------------------------------------+ // DECLARE MAPPING FUNCTIONS: DEF_MAP_CLIENT(MsnEventDlg, OnEventSelect); DEF_MAP_CLIENT(MsnEventDlg, OnAccept); DEF_MAP_CLIENT(MsnEventDlg, OnCancel); // +--------------------------------------------------------------------+ MsnEventDlg::MsnEventDlg(Screen* s, FormDef& def, MenuScreen* mgr) : FormWindow(s, 0, 0, s->Width(), s->Height()), manager(mgr), btn_accept(0), btn_cancel(0), mission(0), event(0) { Init(def); } MsnEventDlg::~MsnEventDlg() { } // +--------------------------------------------------------------------+ void MsnEventDlg::RegisterControls() { btn_accept = (Button*) FindControl( 1); if (btn_accept) REGISTER_CLIENT(EID_CLICK, btn_accept, MsnEventDlg, OnAccept); btn_cancel = (Button*) FindControl( 2); if (btn_accept) REGISTER_CLIENT(EID_CLICK, btn_cancel, MsnEventDlg, OnCancel); lbl_id = FindControl(201); edt_time = (EditBox*) FindControl(202); edt_delay = (EditBox*) FindControl(203); cmb_event = (ComboBox*) FindControl(204); cmb_event_ship = (ComboBox*) FindControl(205); cmb_event_source = (ComboBox*) FindControl(206); cmb_event_target = (ComboBox*) FindControl(207); edt_event_param = (EditBox*) FindControl(208); edt_event_chance = (EditBox*) FindControl(220); edt_event_sound = (EditBox*) FindControl(209); edt_event_message = (EditBox*) FindControl(210); cmb_trigger = (ComboBox*) FindControl(221); cmb_trigger_ship = (ComboBox*) FindControl(222); cmb_trigger_target = (ComboBox*) FindControl(223); edt_trigger_param = (EditBox*) FindControl(224); if (cmb_event) REGISTER_CLIENT(EID_SELECT, cmb_event, MsnEventDlg, OnEventSelect); } // +--------------------------------------------------------------------+ void MsnEventDlg::Show() { FormWindow::Show(); if (!event) return; FillShipList(cmb_event_ship, event->EventShip()); FillShipList(cmb_event_source, event->EventSource()); if (event->Event() == MissionEvent::JUMP) FillRgnList(cmb_event_target, event->EventTarget()); else FillShipList(cmb_event_target,event->EventTarget()); FillShipList(cmb_trigger_ship, event->TriggerShip()); FillShipList(cmb_trigger_target, event->TriggerTarget()); char buf[64]; sprintf_s(buf, "%d", event->EventID()); if (lbl_id) lbl_id->SetText(buf); if (edt_time) { sprintf_s(buf, "%.1f", event->Time()); edt_time->SetText(buf); } if (edt_delay) { sprintf_s(buf, "%.1f", event->Delay()); edt_delay->SetText(buf); } if (edt_event_chance) { sprintf_s(buf, "%d", event->EventChance()); edt_event_chance->SetText(buf); } sprintf_s(buf, "%d", event->EventParam()); if (edt_event_param) edt_event_param->SetText(buf); if (edt_trigger_param) edt_trigger_param->SetText(event->TriggerParamStr()); if (edt_event_message) edt_event_message->SetText(event->EventMessage()); if (edt_event_sound) edt_event_sound->SetText(event->EventSound()); if (cmb_event) { cmb_event->ClearItems(); for (int i = 0; i < MissionEvent::NUM_EVENTS; i++) { cmb_event->AddItem(MissionEvent::EventName(i)); } cmb_event->SetSelection(event->Event()); } if (cmb_trigger) { cmb_trigger->ClearItems(); for (int i = 0; i < MissionEvent::NUM_TRIGGERS; i++) { cmb_trigger->AddItem(MissionEvent::TriggerName(i)); } cmb_trigger->SetSelection(event->Trigger()); } } // +--------------------------------------------------------------------+ void MsnEventDlg::FillShipList(ComboBox* cmb, const char* seln) { if (!cmb) return; cmb->ClearItems(); if (!mission) return; int index = 1; int selected_index = 0; cmb->AddItem(""); List& list = mission->GetElements(); for (int i = 0; i < list.size(); i++) { MissionElement* elem = list[i]; if (elem->IsSquadron()) continue; if (elem->Count() == 1) { cmb->AddItem(elem->Name()); if (elem->Name() == seln) selected_index = index; index++; } else { char ship_name[256]; for (int n = 0; n < elem->Count(); n++) { sprintf_s(ship_name, "%s %d", elem->Name().data(), n+1); cmb->AddItem(ship_name); if (!_stricmp(ship_name, seln)) selected_index = index; index++; } } } cmb->SetSelection(selected_index); } void MsnEventDlg::FillRgnList(ComboBox* cmb, const char* seln) { if (!cmb) return; cmb->ClearItems(); if (!mission) return; int selected_index = 0; int i = 0; ListIter iter = mission->GetSystemList(); while (++iter) { StarSystem* sys = iter.value(); ListIter iter2 = sys->AllRegions(); while (++iter2) { OrbitalRegion* region = iter2.value(); if (!strcmp(region->Name(), seln)) selected_index = i; cmb->AddItem(region->Name()); i++; } } cmb->SetSelection(selected_index); } // +--------------------------------------------------------------------+ void MsnEventDlg::ExecFrame() { if (Keyboard::KeyDown(VK_RETURN)) { if (btn_accept && btn_accept->IsEnabled()) OnAccept(0); } } // +--------------------------------------------------------------------+ void MsnEventDlg::SetMission(Mission* m) { mission = m; } void MsnEventDlg::SetMissionEvent(MissionEvent* e) { event = e; } // +--------------------------------------------------------------------+ void MsnEventDlg::OnEventSelect(AWEvent* e) { if (cmb_event->GetSelectedIndex() == MissionEvent::JUMP) FillRgnList(cmb_event_target, event->EventTarget()); else FillShipList(cmb_event_target, event->EventTarget()); } // +--------------------------------------------------------------------+ void MsnEventDlg::OnAccept(AWEvent* e) { if (mission && event) { char buf[64]; int val; if (edt_time) { strcpy_s(buf, edt_time->GetText()); float t = 0; sscanf_s(buf, "%f", &t); event->time = t; } if (edt_delay) { strcpy_s(buf, edt_delay->GetText()); float t = 0; sscanf_s(buf, "%f", &t); event->delay = t; } if (edt_event_param) { strcpy_s(buf, edt_event_param->GetText()); if (isdigit(*buf)) { sscanf_s(buf, "%d", &val); event->event_param[0] = val; event->event_nparams = 1; } else if (*buf == '(') { Parser parser(starshatter::foundation::Reader{buf}); Term* term = parser.ParseTerm(); if (term && term->isArray()) { TermArray* val = term->isArray(); if (val) { int nelem = val->elements()->size(); if (nelem > 10) nelem = 10; for (int i = 0; i < nelem; i++) event->event_param[i] = (int) (val->elements()->at(i)->isNumber()->value()); event->event_nparams = nelem; } } } } if (edt_event_chance) { strcpy_s(buf, edt_event_chance->GetText()); if (isdigit(*buf)) { sscanf_s(buf, "%d", &val); } else { val = 0; } event->event_chance = val; } if (edt_event_message) event->event_message = edt_event_message->GetText(); if (edt_event_sound) event->event_sound = edt_event_sound->GetText(); if (edt_trigger_param) { strcpy_s(buf, edt_trigger_param->GetText()); ZeroMemory(event->trigger_param, sizeof(event->trigger_param)); if (isdigit(*buf)) { sscanf_s(buf, "%d", &val); event->trigger_param[0] = val; event->trigger_nparams = 1; } else if (*buf == '(') { Parser parser(starshatter::foundation::Reader{buf}); Term* term = parser.ParseTerm(); if (term && term->isArray()) { TermArray* val = term->isArray(); if (val) { int nelem = val->elements()->size(); if (nelem > 10) nelem = 10; for (int i = 0; i < nelem; i++) event->trigger_param[i] = (int) (val->elements()->at(i)->isNumber()->value()); event->trigger_nparams = nelem; } } } } if (cmb_event) event->event = cmb_event->GetSelectedIndex(); if (cmb_event_ship) event->event_ship = cmb_event_ship->GetSelectedItem(); if (cmb_event_source) event->event_source = cmb_event_source->GetSelectedItem(); if (cmb_event_target) event->event_target = cmb_event_target->GetSelectedItem(); if (cmb_trigger) event->trigger = cmb_trigger->GetSelectedIndex(); if (cmb_trigger_ship) event->trigger_ship = cmb_trigger_ship->GetSelectedItem(); if (cmb_trigger_target) event->trigger_target = cmb_trigger_target->GetSelectedItem(); } manager->ShowMsnEditDlg(); } void MsnEventDlg::OnCancel(AWEvent* event) { manager->ShowMsnEditDlg(); }