Starshatter_Open
Open source Starshatter engine
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
MsnEditDlg.cpp
Go to the documentation of this file.
1 /* Project Starshatter 5.0
2  Destroyer Studios LLC
3  Copyright (C) 1997-2007. All Rights Reserved.
4 
5  SUBSYSTEM: Stars.exe
6  FILE: MsnEditDlg.cpp
7  AUTHOR: John DiCamillo
8 
9 
10  OVERVIEW
11  ========
12  Mission Editor Dialog Active Window class
13 */
14 
15 #include "MemDebug.h"
16 #include "MsnEditDlg.h"
17 #include "MsnElemDlg.h"
18 #include "MsnEventDlg.h"
19 #include "NavDlg.h"
20 #include "MenuScreen.h"
21 #include "Campaign.h"
22 #include "Mission.h"
23 #include "MissionEvent.h"
24 #include "Ship.h"
25 #include "ShipDesign.h"
26 #include "StarSystem.h"
27 #include "Galaxy.h"
28 
29 #include "Game.h"
30 #include "DataLoader.h"
31 #include "Button.h"
32 #include "ListBox.h"
33 #include "EditBox.h"
34 #include "Video.h"
35 #include "Keyboard.h"
36 #include "Mouse.h"
37 #include "ParseUtil.h"
38 #include "FormatUtil.h"
39 #include "Random.h"
40 
41 // +--------------------------------------------------------------------+
42 // DECLARE MAPPING FUNCTIONS:
43 
44 DEF_MAP_CLIENT(MsnEditDlg, OnAccept);
45 DEF_MAP_CLIENT(MsnEditDlg, OnCancel);
46 DEF_MAP_CLIENT(MsnEditDlg, OnTabButton);
47 DEF_MAP_CLIENT(MsnEditDlg, OnSystemSelect);
48 DEF_MAP_CLIENT(MsnEditDlg, OnElemAdd);
49 DEF_MAP_CLIENT(MsnEditDlg, OnElemEdit);
50 DEF_MAP_CLIENT(MsnEditDlg, OnElemDel);
51 DEF_MAP_CLIENT(MsnEditDlg, OnElemSelect);
52 DEF_MAP_CLIENT(MsnEditDlg, OnElemInc);
53 DEF_MAP_CLIENT(MsnEditDlg, OnElemDec);
54 DEF_MAP_CLIENT(MsnEditDlg, OnEventAdd);
55 DEF_MAP_CLIENT(MsnEditDlg, OnEventEdit);
56 DEF_MAP_CLIENT(MsnEditDlg, OnEventDel);
57 DEF_MAP_CLIENT(MsnEditDlg, OnEventSelect);
58 DEF_MAP_CLIENT(MsnEditDlg, OnEventInc);
59 DEF_MAP_CLIENT(MsnEditDlg, OnEventDec);
60 
61 // +--------------------------------------------------------------------+
62 
64 : FormWindow(s, 0, 0, s->Width(), s->Height()), manager(mgr),
65 btn_accept(0), btn_cancel(0),
66 btn_elem_add(0), btn_elem_edit(0), btn_elem_del(0), btn_elem_inc(0), btn_elem_dec(0),
67 btn_event_add(0), btn_event_edit(0), btn_event_del(0), btn_event_inc(0), btn_event_dec(0),
68 btn_sit(0), btn_pkg(0), btn_map(0),
69 txt_name(0), cmb_type(0), cmb_system(0), cmb_region(0),
70 txt_description(0), txt_situation(0), txt_objective(0),
71 lst_elem(0), lst_event(0), mission(0), mission_info(0), current_tab(0),
72 exit_latch(true)
73 {
74  Init(def);
75 }
76 
78 {
79 }
80 
81 // +--------------------------------------------------------------------+
82 
83 void
85 {
86  mission = m;
87  current_tab = 0;
88 }
89 
90 void
92 {
93  mission_info = m;
94  current_tab = 0;
95 }
96 
97 // +--------------------------------------------------------------------+
98 
99 void
101 {
102  btn_accept = (Button*) FindControl( 1);
103  btn_cancel = (Button*) FindControl( 2);
104  btn_sit = (Button*) FindControl(301);
105  btn_pkg = (Button*) FindControl(302);
106  btn_map = (Button*) FindControl(303);
107 
108  btn_elem_add = (Button*) FindControl(501);
109  btn_elem_edit = (Button*) FindControl(505);
110  btn_elem_del = (Button*) FindControl(502);
111  btn_elem_inc = (Button*) FindControl(503);
112  btn_elem_dec = (Button*) FindControl(504);
113 
114  btn_event_add = (Button*) FindControl(511);
116  btn_event_del = (Button*) FindControl(512);
117  btn_event_inc = (Button*) FindControl(513);
118  btn_event_dec = (Button*) FindControl(514);
119 
120  txt_name = (EditBox*) FindControl(201);
121  cmb_type = (ComboBox*) FindControl(202);
122  cmb_system = (ComboBox*) FindControl(203);
123  cmb_region = (ComboBox*) FindControl(204);
124 
128 
129  lst_elem = (ListBox*) FindControl(510);
130  lst_event = (ListBox*) FindControl(520);
131 
132  if (btn_accept)
134 
135  if (btn_cancel)
137 
138  if (btn_elem_add)
140 
141  if (btn_elem_edit)
143 
144  if (btn_elem_del)
146 
147  if (btn_elem_inc) {
148  char up_arrow[2];
149  up_arrow[0] = Font::ARROW_UP;
150  up_arrow[1] = 0;
151  btn_elem_inc->SetText(up_arrow);
152  btn_elem_inc->SetEnabled(false);
154  }
155 
156  if (btn_elem_dec) {
157  char dn_arrow[2];
158  dn_arrow[0] = Font::ARROW_DOWN;
159  dn_arrow[1] = 0;
160  btn_elem_dec->SetText(dn_arrow);
161  btn_elem_dec->SetEnabled(false);
163  }
164 
165  if (btn_event_add)
167 
168  if (btn_event_edit)
170 
171  if (btn_event_del)
173 
174  if (btn_event_inc) {
175  char up_arrow[2];
176  up_arrow[0] = Font::ARROW_UP;
177  up_arrow[1] = 0;
178  btn_event_inc->SetText(up_arrow);
179  btn_event_inc->SetEnabled(false);
181  }
182 
183  if (btn_event_dec) {
184  char dn_arrow[2];
185  dn_arrow[0] = Font::ARROW_DOWN;
186  dn_arrow[1] = 0;
187  btn_event_dec->SetText(dn_arrow);
188  btn_event_dec->SetEnabled(false);
190  }
191 
192  if (btn_sit)
194 
195  if (btn_pkg)
197 
198  if (btn_map)
200 
201  if (cmb_system)
203 
204  if (lst_elem)
206 
207  if (lst_event)
209 }
210 
211 // +--------------------------------------------------------------------+
212 
213 void
215 {
217 
218  if (!txt_name || !cmb_type) return;
219 
220  txt_name->SetText("");
221 
222  if (cmb_system) {
224 
225  Galaxy* galaxy = Galaxy::GetInstance();
226  ListIter<StarSystem> iter = galaxy->GetSystemList();
227  while (++iter) {
228  cmb_system->AddItem(iter->Name());
229  }
230  }
231 
232  if (mission) {
233  int i;
234 
237 
238  StarSystem* sys = mission->GetStarSystem();
239  if (sys && cmb_system && cmb_region) {
240  for (i = 0; i < cmb_system->NumItems(); i++) {
241  if (!strcmp(cmb_system->GetItem(i), sys->Name())) {
243  break;
244  }
245  }
246 
248  int sel_rgn = 0;
249 
250  List<OrbitalRegion> regions;
251  regions.append(sys->AllRegions());
252  regions.sort();
253 
254  i = 0;
255  ListIter<OrbitalRegion> iter = regions;
256  while (++iter) {
257  OrbitalRegion* region = iter.value();
258  cmb_region->AddItem(region->Name());
259 
260  if (!strcmp(mission->GetRegion(), region->Name())) {
261  sel_rgn = i;
262  }
263 
264  i++;
265  }
266 
267  cmb_region->SetSelection(sel_rgn);
268  }
269 
272 
273  if (txt_situation)
275 
276  if (txt_objective)
278 
279  DrawPackages();
280  }
281 
283 
284  exit_latch = true;
285 }
286 
287 // +--------------------------------------------------------------------+
288 
289 void
291 {
292  bool elem_del = false;
293  bool elem_edit = false;
294  bool elem_inc = false;
295  bool elem_dec = false;
296 
297  bool event_del = false;
298  bool event_edit = false;
299  bool event_inc = false;
300  bool event_dec = false;
301 
302  if (mission) {
303  if (lst_elem) {
304  bool cleared = false;
305  int index = lst_elem->GetSelection();
306 
307  if (lst_elem->NumItems() != mission->GetElements().size()) {
308  if (lst_elem->NumItems() < mission->GetElements().size())
309  index = lst_elem->NumItems();
310 
311  lst_elem->ClearItems();
312  cleared = true;
313  }
314 
315  int i = 0;
317  while (++elem) {
318  char txt[256];
319 
320  sprintf_s(txt, "%d", elem->Identity());
321 
322  if (cleared) {
323  lst_elem->AddItemWithData(txt, elem->ElementID());
324  }
325  else {
326  lst_elem->SetItemText(i, txt);
327  lst_elem->SetItemData(i, elem->ElementID());
328  }
329 
330  sprintf_s(txt, "%d", elem->GetIFF());
331  lst_elem->SetItemText(i, 1, txt);
332  lst_elem->SetItemText(i, 2, elem->Name());
333  lst_elem->SetItemText(i, 4, elem->RoleName());
334  lst_elem->SetItemText(i, 5, elem->Region());
335 
336  const ShipDesign* design = elem->GetDesign();
337 
338  if (design) {
339  if (elem->Count() > 1)
340  sprintf_s(txt, "%d %s", elem->Count(), design->abrv);
341  else
342  sprintf_s(txt, "%s %s", design->abrv, design->name);
343  }
344  else {
345  sprintf_s(txt, Game::GetText("MsnDlg.undefined").data());
346  }
347 
348  lst_elem->SetItemText(i, 3, txt);
349 
350  i++;
351  }
352 
353  int nitems = lst_elem->NumItems();
354  if (nitems) {
355  if (index >= nitems)
356  index = nitems - 1;
357 
358  if (index >= 0) {
359  lst_elem->SetSelected(index);
360  elem_del = true;
361  elem_edit = true;
362  elem_inc = index > 0;
363  elem_dec = index < nitems-1;
364  }
365  }
366  }
367 
368  if (lst_event) {
369  bool cleared = false;
370  int index = lst_event->GetSelection();
371 
372  if (lst_event->NumItems() != mission->GetEvents().size()) {
373  if (lst_event->NumItems() < mission->GetEvents().size())
374  index = lst_event->NumItems();
375 
377  cleared = true;
378  }
379 
380  int i = 0;
382  while (++event) {
383  char txt[256];
384 
385  sprintf_s(txt, "%d", event->EventID());
386  if (cleared) {
387  lst_event->AddItemWithData(txt, event->EventID());
388  }
389  else {
390  lst_event->SetItemText(i, txt);
391  lst_event->SetItemData(i, event->EventID());
392  }
393 
394  if (event->Time()) {
395  FormatTime(txt, event->Time());
396  }
397  else if (event->Delay()) {
398  txt[0] = '+';
399  txt[1] = ' ';
400  FormatTime(txt+2, event->Delay());
401  }
402  else {
403  strcpy_s(txt, " ");
404  }
405 
406  lst_event->SetItemText(i, 1, txt);
407  lst_event->SetItemText(i, 2, event->EventName());
408  lst_event->SetItemText(i, 3, event->EventShip());
409  lst_event->SetItemText(i, 4, event->EventMessage());
410 
411  i++;
412  }
413 
414  int nitems = lst_event->NumItems();
415  if (nitems) {
416  if (index >= nitems)
417  index = nitems - 1;
418 
419  if (index >= 0) {
420  lst_event->SetSelected(index);
421  event_del = true;
422  event_edit = true;
423  event_inc = index > 0;
424  event_dec = index < nitems-1;
425  }
426  }
427  }
428  }
429 
430  if (btn_elem_del) btn_elem_del->SetEnabled(elem_del);
431  if (btn_elem_edit) btn_elem_edit->SetEnabled(elem_edit);
432  if (btn_elem_inc) btn_elem_inc->SetEnabled(elem_inc);
433  if (btn_elem_dec) btn_elem_dec->SetEnabled(elem_del);
434 
435  if (btn_event_del) btn_event_del->SetEnabled(event_del);
436  if (btn_event_edit) btn_event_edit->SetEnabled(event_edit);
437  if (btn_event_inc) btn_event_inc->SetEnabled(event_inc);
438  if (btn_event_dec) btn_event_dec->SetEnabled(event_dec);
439 }
440 
441 // +--------------------------------------------------------------------+
442 
443 void
445 {
446  if (Keyboard::KeyDown(VK_RETURN)) {
448  OnAccept(0);
449  }
450 
451  else if (Keyboard::KeyDown(VK_ESCAPE)) {
452  if (!exit_latch)
453  OnCancel(0);
454  }
455 
456  else {
457  exit_latch = false;
458  }
459 }
460 
461 // +--------------------------------------------------------------------+
462 
463 void
465 {
466  if (mission) {
467  if (txt_name) {
469  }
470 
471  if (cmb_type) {
473 
474  if (mission_info)
476  }
477 
478  Galaxy* galaxy = Galaxy::GetInstance();
479  StarSystem* system = 0;
480 
481  if (galaxy && cmb_system)
482  system = galaxy->GetSystem(cmb_system->GetSelectedItem());
483 
484  if (system) {
486  mission->SetStarSystem(system);
487 
488  if (mission_info)
489  mission_info->system = system->Name();
490  }
491 
492  if (cmb_region) {
494 
495  if (mission_info)
497  }
498 
499  if (txt_description && mission_info) {
502  }
503 
504  if (txt_situation)
506 
507  if (txt_objective)
509  }
510 }
511 
512 // +--------------------------------------------------------------------+
513 
514 void
516 {
517  current_tab = tab;
518 
519  if (current_tab < 0 || current_tab > 2)
520  current_tab = 0;
521 
522  if (btn_sit) btn_sit->SetButtonState(tab == 0 ? 1 : 0);
523  if (btn_pkg) btn_pkg->SetButtonState(tab == 1 ? 1 : 0);
524  if (btn_map) btn_map->SetButtonState(tab == 2 ? 1 : 0);
525 
526  DWORD low = 400 + tab*100;
527  DWORD high = low + 100;
528 
530  while (++iter) {
531  ActiveWindow* a = iter.value();
532 
533  if (a->GetID() < 400)
534  a->Show();
535 
536  else if (a->GetID() >= low && a->GetID() < high)
537  a->Show();
538 
539  else
540  a->Hide();
541  }
542 
543  if (tab == 2) {
544  NavDlg* navdlg = manager->GetNavDlg();
545 
546  if (navdlg) {
547  navdlg->SetMission(mission);
548  navdlg->SetEditorMode(true);
549  }
550 
551  manager->ShowNavDlg();
552  }
553  else {
554  manager->HideNavDlg();
555  }
556 }
557 
558 // +--------------------------------------------------------------------+
559 
560 void
562 {
563  if (!event) return;
564 
565  if (event->window == btn_sit)
566  ShowTab(0);
567 
568  else if (event->window == btn_pkg)
569  ShowTab(1);
570 
571  else if (event->window == btn_map)
572  ShowTab(2);
573 }
574 
575 void
577 {
578  StarSystem* sys = 0;
579 
580  if (cmb_system) {
581  const char* name = cmb_system->GetSelectedItem();
582 
583  Galaxy* galaxy = Galaxy::GetInstance();
584  ListIter<StarSystem> iter = galaxy->GetSystemList();
585  while (++iter) {
586  StarSystem* s = iter.value();
587 
588  if (!strcmp(s->Name(), name)) {
589  sys = s;
590  break;
591  }
592  }
593  }
594 
595  if (sys && cmb_region) {
597 
598  List<OrbitalRegion> regions;
599  regions.append(sys->AllRegions());
600  regions.sort();
601 
602  ListIter<OrbitalRegion> iter = regions;
603  while (++iter) {
604  OrbitalRegion* region = iter.value();
605  cmb_region->AddItem(region->Name());
606  }
607  }
608 
609  ScrapeForm();
610 
611  NavDlg* navdlg = manager->GetNavDlg();
612 
613  if (navdlg)
614  navdlg->SetMission(mission);
615 }
616 
617 // +--------------------------------------------------------------------+
618 
619 void
621 {
622  static DWORD click_time = 0;
623 
624  if (lst_elem && mission) {
625  int selection = lst_elem->GetSelection();
626 
627  if (btn_elem_edit)
628  btn_elem_edit->SetEnabled(selection >= 0);
629 
630  if (btn_elem_del)
631  btn_elem_del->SetEnabled(selection >= 0);
632 
633  if (btn_elem_inc)
634  btn_elem_inc->SetEnabled(selection > 0);
635 
636  if (btn_elem_dec)
637  btn_elem_dec->SetEnabled(selection >= 0 && selection < lst_elem->NumItems() - 1);
638 
639  // double-click:
640  if (Game::RealTime() - click_time < 350) {
641  if (lst_elem->GetSelCount() == 1) {
642  int index = lst_elem->GetSelection();
643  MissionElement* elem = mission->GetElements().at(index);
644  MsnElemDlg* msn_elem_dlg = manager->GetMsnElemDlg();
645 
646  if (elem && msn_elem_dlg) {
647  ScrapeForm();
648  msn_elem_dlg->SetMission(mission);
649  msn_elem_dlg->SetMissionElement(elem);
651  }
652  }
653  }
654  }
655 
656  click_time = Game::RealTime();
657 }
658 
659 void
661 {
662  int index = lst_elem->GetSelection();
663  mission->IncreaseElemPriority(index--);
664 
665  DrawPackages();
666  lst_elem->SetSelected(index);
667  btn_elem_edit->SetEnabled(true);
668  btn_elem_del->SetEnabled(true);
669  btn_elem_inc->SetEnabled(index > 0);
670  btn_elem_dec->SetEnabled(index >= 0 && index < lst_elem->NumItems()-1);
671 }
672 
673 void
675 {
676  int index = lst_elem->GetSelection();
677  mission->DecreaseElemPriority(index++);
678 
679  DrawPackages();
680  lst_elem->SetSelected(index);
681  btn_elem_edit->SetEnabled(true);
682  btn_elem_del->SetEnabled(true);
683  btn_elem_inc->SetEnabled(index > 0);
684  btn_elem_dec->SetEnabled(index >= 0 && index < lst_elem->NumItems()-1);
685 }
686 
687 
688 // +--------------------------------------------------------------------+
689 
690 void
692 {
693  if (lst_elem && mission) {
695  MissionElement* elem = new(__FILE__,__LINE__) MissionElement;
696 
697  if (elements.size() > 0)
698  elem->SetLocation(RandomPoint());
699 
700  if (cmb_region)
702 
703  elements.append(elem);
704  DrawPackages();
705 
706  MsnElemDlg* msn_elem_dlg = manager->GetMsnElemDlg();
707 
708  if (msn_elem_dlg) {
709  ScrapeForm();
710  msn_elem_dlg->SetMission(mission);
711  msn_elem_dlg->SetMissionElement(elem);
713  }
714  }
715 }
716 
717 void
719 {
720  if (lst_elem && mission) {
722  delete elements.removeIndex(lst_elem->GetSelection());
723  DrawPackages();
724  }
725 }
726 
727 void
729 {
730  if (lst_elem && mission && lst_elem->GetSelCount() == 1) {
731  int index = lst_elem->GetSelection();
732  MissionElement* elem = mission->GetElements().at(index);
733  MsnElemDlg* msn_elem_dlg = manager->GetMsnElemDlg();
734 
735  if (elem && msn_elem_dlg) {
736  ScrapeForm();
737  msn_elem_dlg->SetMission(mission);
738  msn_elem_dlg->SetMissionElement(elem);
740  }
741  }
742 }
743 
744 
745 // +--------------------------------------------------------------------+
746 
747 void
749 {
750  static DWORD click_time = 0;
751 
752  if (lst_event && mission) {
753  int selection = lst_event->GetSelection();
754 
755  if (btn_event_edit)
756  btn_event_edit->SetEnabled(selection >= 0);
757 
758  if (btn_event_del)
759  btn_event_del->SetEnabled(selection >= 0);
760 
761  if (btn_event_inc)
762  btn_event_inc->SetEnabled(selection > 0);
763 
764  if (btn_event_dec)
765  btn_event_dec->SetEnabled(selection >= 0 && selection < lst_event->NumItems() - 1);
766 
767  // double-click:
768  if (Game::RealTime() - click_time < 350) {
769  if (lst_event->GetSelCount() == 1) {
770  int index = lst_event->GetSelection();
771  MissionEvent* event = mission->GetEvents().at(index);
772  MsnEventDlg* msn_event_dlg = manager->GetMsnEventDlg();
773 
774  if (event && msn_event_dlg) {
775  ScrapeForm();
776  msn_event_dlg->SetMission(mission);
777  msn_event_dlg->SetMissionEvent(event);
779  }
780  }
781  }
782  }
783 
784  click_time = Game::RealTime();
785 }
786 
787 void
789 {
790  int index = lst_event->GetSelection();
791  mission->IncreaseEventPriority(index--);
792 
793  DrawPackages();
794  lst_event->SetSelected(index);
795  btn_event_edit->SetEnabled(true);
796  btn_event_del->SetEnabled(true);
797  btn_event_inc->SetEnabled(index > 0);
798  btn_event_dec->SetEnabled(index >= 0 && index < lst_event->NumItems()-1);
799 }
800 
801 void
803 {
804  int index = lst_event->GetSelection();
805  mission->DecreaseEventPriority(index++);
806 
807  DrawPackages();
808  lst_event->SetSelected(index);
809  btn_event_edit->SetEnabled(true);
810  btn_event_del->SetEnabled(true);
811  btn_event_inc->SetEnabled(index > 0);
812  btn_event_dec->SetEnabled(index >= 0 && index < lst_event->NumItems()-1);
813 }
814 
815 
816 // +--------------------------------------------------------------------+
817 
818 void
820 {
821  if (lst_event && mission) {
822  List<MissionEvent>& events = mission->GetEvents();
823  MissionEvent* event = new(__FILE__,__LINE__) MissionEvent;
824 
825  int id = 1;
826  for (int i = 0; i < events.size(); i++) {
827  MissionEvent* e = events[i];
828  if (e->EventID() >= id)
829  id = e->EventID() + 1;
830  }
831 
832  event->id = id;
833 
834  events.append(event);
835  DrawPackages();
836 
837  MsnEventDlg* msn_event_dlg = manager->GetMsnEventDlg();
838 
839  if (msn_event_dlg) {
840  ScrapeForm();
841  msn_event_dlg->SetMission(mission);
842  msn_event_dlg->SetMissionEvent(event);
844  }
845  }
846 }
847 
848 void
850 {
851  if (lst_event && mission) {
852  List<MissionEvent>& events = mission->GetEvents();
853  delete events.removeIndex(lst_event->GetSelection());
854  DrawPackages();
855  }
856 }
857 
858 void
860 {
861  if (lst_event && mission && lst_event->GetSelCount() == 1) {
862  int index = lst_event->GetSelection();
863  MissionEvent* event = mission->GetEvents().at(index);
864  MsnEventDlg* msn_event_dlg = manager->GetMsnEventDlg();
865 
866  if (event && msn_event_dlg) {
867  ScrapeForm();
868  msn_event_dlg->SetMission(mission);
869  msn_event_dlg->SetMissionEvent(event);
871  }
872  }
873 }
874 
875 // +--------------------------------------------------------------------+
876 
877 void
879 {
880  if (mission) {
881  ScrapeForm();
883  mission->Save();
884  }
885 
887 }
888 
889 void
891 {
892  if (mission)
893  mission->Load();
894 
896 }