FS2_Open
Open source remastering of the Freespace 2 engine
shipgoalsdlg.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 
11 
12 #include "stdafx.h"
13 #include "FRED.h"
14 #include "ShipGoalsDlg.h"
15 #include "object/object.h"
16 #include "globalincs/linklist.h"
17 #include "Management.h"
18 #include "ai/aigoals.h"
19 #include "FREDDoc.h"
20 #include "FREDView.h"
21 
22 #define TYPE_PATH 0x1000
23 #define TYPE_SHIP 0x2000
24 #define TYPE_PLAYER 0x3000
25 #define TYPE_WING 0x4000
26 #define TYPE_WAYPOINT 0x5000
27 #define TYPE_MASK 0xf000
28 #define DATA_MASK 0x0fff
29 
30 #ifdef _DEBUG
31 #undef THIS_FILE
32 static char THIS_FILE[] = __FILE__;
33 #endif
34 
36 // ShipGoalsDlg dialog
37 
38 ShipGoalsDlg::ShipGoalsDlg(CWnd* pParent /*=NULL*/)
39  : CDialog(ShipGoalsDlg::IDD, pParent)
40 {
41  int i;
42 
43  for (i=0; i<ED_MAX_GOALS; i++) {
44  m_behavior[i] = -1;
45  m_object[i] = -1;
46  m_priority[i] = 0;
47  m_subsys[i] = -1;
48  m_dock2[i] = -1;
49  m_data[i] = 0;
50  }
51 
52  //{{AFX_DATA_INIT(ShipGoalsDlg)
53  //}}AFX_DATA_INIT
54  goalp = NULL;
55  self_ship = self_wing = -1;
56 }
57 
58 void ShipGoalsDlg::DoDataExchange(CDataExchange* pDX)
59 {
60  CDialog::DoDataExchange(pDX);
61  //{{AFX_DATA_MAP(ShipGoalsDlg)
62  //}}AFX_DATA_MAP
63 
64  DDX_CBIndex(pDX, IDC_BEHAVIOR1, m_behavior[0]);
65  DDX_CBIndex(pDX, IDC_BEHAVIOR2, m_behavior[1]);
66  DDX_CBIndex(pDX, IDC_BEHAVIOR3, m_behavior[2]);
67  DDX_CBIndex(pDX, IDC_BEHAVIOR4, m_behavior[3]);
68  DDX_CBIndex(pDX, IDC_BEHAVIOR5, m_behavior[4]);
69  DDX_CBIndex(pDX, IDC_BEHAVIOR6, m_behavior[5]);
70  DDX_CBIndex(pDX, IDC_BEHAVIOR7, m_behavior[6]);
71  DDX_CBIndex(pDX, IDC_BEHAVIOR8, m_behavior[7]);
72  DDX_CBIndex(pDX, IDC_BEHAVIOR9, m_behavior[8]);
73  DDX_CBIndex(pDX, IDC_BEHAVIOR10, m_behavior[9]);
74 
75  DDX_CBIndex(pDX, IDC_OBJECT1, m_object[0]);
76  DDX_CBIndex(pDX, IDC_OBJECT2, m_object[1]);
77  DDX_CBIndex(pDX, IDC_OBJECT3, m_object[2]);
78  DDX_CBIndex(pDX, IDC_OBJECT4, m_object[3]);
79  DDX_CBIndex(pDX, IDC_OBJECT5, m_object[4]);
80  DDX_CBIndex(pDX, IDC_OBJECT6, m_object[5]);
81  DDX_CBIndex(pDX, IDC_OBJECT7, m_object[6]);
82  DDX_CBIndex(pDX, IDC_OBJECT8, m_object[7]);
83  DDX_CBIndex(pDX, IDC_OBJECT9, m_object[8]);
84  DDX_CBIndex(pDX, IDC_OBJECT10, m_object[9]);
85 
86  DDX_Text(pDX, IDC_PRIORITY1, m_priority[0]);
87  DDV_MinMaxInt(pDX, m_priority[0], 0, MAX_EDITOR_GOAL_PRIORITY);
88  DDX_Text(pDX, IDC_PRIORITY2, m_priority[1]);
89  DDV_MinMaxInt(pDX, m_priority[1], 0, MAX_EDITOR_GOAL_PRIORITY);
90  DDX_Text(pDX, IDC_PRIORITY3, m_priority[2]);
91  DDV_MinMaxInt(pDX, m_priority[2], 0, MAX_EDITOR_GOAL_PRIORITY);
92  DDX_Text(pDX, IDC_PRIORITY4, m_priority[3]);
93  DDV_MinMaxInt(pDX, m_priority[3], 0, MAX_EDITOR_GOAL_PRIORITY);
94  DDX_Text(pDX, IDC_PRIORITY5, m_priority[4]);
95  DDV_MinMaxInt(pDX, m_priority[4], 0, MAX_EDITOR_GOAL_PRIORITY);
96  DDX_Text(pDX, IDC_PRIORITY6, m_priority[5]);
97  DDV_MinMaxInt(pDX, m_priority[5], 0, MAX_EDITOR_GOAL_PRIORITY);
98  DDX_Text(pDX, IDC_PRIORITY7, m_priority[6]);
99  DDV_MinMaxInt(pDX, m_priority[6], 0, MAX_EDITOR_GOAL_PRIORITY);
100  DDX_Text(pDX, IDC_PRIORITY8, m_priority[7]);
101  DDV_MinMaxInt(pDX, m_priority[7], 0, MAX_EDITOR_GOAL_PRIORITY);
102  DDX_Text(pDX, IDC_PRIORITY9, m_priority[8]);
103  DDV_MinMaxInt(pDX, m_priority[8], 0, MAX_EDITOR_GOAL_PRIORITY);
104  DDX_Text(pDX, IDC_PRIORITY10, m_priority[9]);
105  DDV_MinMaxInt(pDX, m_priority[9], 0, MAX_EDITOR_GOAL_PRIORITY);
106 
107  DDX_CBIndex(pDX, IDC_SUBSYSTEM1, m_subsys[0]);
108  DDX_CBIndex(pDX, IDC_SUBSYSTEM2, m_subsys[1]);
109  DDX_CBIndex(pDX, IDC_SUBSYSTEM3, m_subsys[2]);
110  DDX_CBIndex(pDX, IDC_SUBSYSTEM4, m_subsys[3]);
111  DDX_CBIndex(pDX, IDC_SUBSYSTEM5, m_subsys[4]);
112  DDX_CBIndex(pDX, IDC_SUBSYSTEM6, m_subsys[5]);
113  DDX_CBIndex(pDX, IDC_SUBSYSTEM7, m_subsys[6]);
114  DDX_CBIndex(pDX, IDC_SUBSYSTEM8, m_subsys[7]);
115  DDX_CBIndex(pDX, IDC_SUBSYSTEM9, m_subsys[8]);
116  DDX_CBIndex(pDX, IDC_SUBSYSTEM10, m_subsys[9]);
117 
118  DDX_CBIndex(pDX, IDC_DOCK1, m_dock2[0]);
119  DDX_CBIndex(pDX, IDC_DOCK2, m_dock2[1]);
120  DDX_CBIndex(pDX, IDC_DOCK3, m_dock2[2]);
121  DDX_CBIndex(pDX, IDC_DOCK4, m_dock2[3]);
122  DDX_CBIndex(pDX, IDC_DOCK5, m_dock2[4]);
123  DDX_CBIndex(pDX, IDC_DOCK6, m_dock2[5]);
124  DDX_CBIndex(pDX, IDC_DOCK7, m_dock2[6]);
125  DDX_CBIndex(pDX, IDC_DOCK8, m_dock2[7]);
126  DDX_CBIndex(pDX, IDC_DOCK9, m_dock2[8]);
127  DDX_CBIndex(pDX, IDC_DOCK10, m_dock2[9]);
128 }
129 
130 BEGIN_MESSAGE_MAP(ShipGoalsDlg, CDialog)
131  //{{AFX_MSG_MAP(ShipGoalsDlg)
132  ON_CBN_SELCHANGE(IDC_BEHAVIOR1, OnSelchangeBehavior1)
133  ON_CBN_SELCHANGE(IDC_BEHAVIOR2, OnSelchangeBehavior2)
134  ON_CBN_SELCHANGE(IDC_BEHAVIOR3, OnSelchangeBehavior3)
135  ON_CBN_SELCHANGE(IDC_BEHAVIOR4, OnSelchangeBehavior4)
136  ON_CBN_SELCHANGE(IDC_BEHAVIOR5, OnSelchangeBehavior5)
137  ON_CBN_SELCHANGE(IDC_BEHAVIOR6, OnSelchangeBehavior6)
138  ON_CBN_SELCHANGE(IDC_BEHAVIOR7, OnSelchangeBehavior7)
139  ON_CBN_SELCHANGE(IDC_BEHAVIOR8, OnSelchangeBehavior8)
140  ON_CBN_SELCHANGE(IDC_BEHAVIOR9, OnSelchangeBehavior9)
141  ON_CBN_SELCHANGE(IDC_BEHAVIOR10, OnSelchangeBehavior10)
142  ON_CBN_SELCHANGE(IDC_OBJECT1, OnSelchangeObject1)
143  ON_CBN_SELCHANGE(IDC_OBJECT2, OnSelchangeObject2)
144  ON_CBN_SELCHANGE(IDC_OBJECT3, OnSelchangeObject3)
145  ON_CBN_SELCHANGE(IDC_OBJECT4, OnSelchangeObject4)
146  ON_CBN_SELCHANGE(IDC_OBJECT5, OnSelchangeObject5)
147  ON_CBN_SELCHANGE(IDC_OBJECT6, OnSelchangeObject6)
148  ON_CBN_SELCHANGE(IDC_OBJECT7, OnSelchangeObject7)
149  ON_CBN_SELCHANGE(IDC_OBJECT8, OnSelchangeObject8)
150  ON_CBN_SELCHANGE(IDC_OBJECT9, OnSelchangeObject9)
151  ON_CBN_SELCHANGE(IDC_OBJECT10, OnSelchangeObject10)
152  //}}AFX_MSG_MAP
153 END_MESSAGE_MAP()
154 
156 // ShipGoalsDlg message handlers
157 
158 BOOL ShipGoalsDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
159 {
160  return CDialog::Create(IDD, &Ship_editor_dialog);
161 }
162 
164 {
165  int i, j, z, valid[99];
166  object *ptr;
167 
168  // set up pointers to all the combo boxes to simplify things a lot
169  m_behavior_box[0] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR1);
170  m_behavior_box[1] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR2);
171  m_behavior_box[2] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR3);
172  m_behavior_box[3] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR4);
173  m_behavior_box[4] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR5);
174  m_behavior_box[5] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR6);
175  m_behavior_box[6] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR7);
176  m_behavior_box[7] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR8);
177  m_behavior_box[8] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR9);
178  m_behavior_box[9] = (CComboBox *) GetDlgItem(IDC_BEHAVIOR10);
179 
180  m_object_box[0] = (CComboBox *) GetDlgItem(IDC_OBJECT1);
181  m_object_box[1] = (CComboBox *) GetDlgItem(IDC_OBJECT2);
182  m_object_box[2] = (CComboBox *) GetDlgItem(IDC_OBJECT3);
183  m_object_box[3] = (CComboBox *) GetDlgItem(IDC_OBJECT4);
184  m_object_box[4] = (CComboBox *) GetDlgItem(IDC_OBJECT5);
185  m_object_box[5] = (CComboBox *) GetDlgItem(IDC_OBJECT6);
186  m_object_box[6] = (CComboBox *) GetDlgItem(IDC_OBJECT7);
187  m_object_box[7] = (CComboBox *) GetDlgItem(IDC_OBJECT8);
188  m_object_box[8] = (CComboBox *) GetDlgItem(IDC_OBJECT9);
189  m_object_box[9] = (CComboBox *) GetDlgItem(IDC_OBJECT10);
190 
191  m_subsys_box[0] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM1);
192  m_subsys_box[1] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM2);
193  m_subsys_box[2] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM3);
194  m_subsys_box[3] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM4);
195  m_subsys_box[4] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM5);
196  m_subsys_box[5] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM6);
197  m_subsys_box[6] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM7);
198  m_subsys_box[7] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM8);
199  m_subsys_box[8] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM9);
200  m_subsys_box[9] = (CComboBox *) GetDlgItem(IDC_SUBSYSTEM10);
201 
202  m_dock2_box[0] = (CComboBox *) GetDlgItem(IDC_DOCK1);
203  m_dock2_box[1] = (CComboBox *) GetDlgItem(IDC_DOCK2);
204  m_dock2_box[2] = (CComboBox *) GetDlgItem(IDC_DOCK3);
205  m_dock2_box[3] = (CComboBox *) GetDlgItem(IDC_DOCK4);
206  m_dock2_box[4] = (CComboBox *) GetDlgItem(IDC_DOCK5);
207  m_dock2_box[5] = (CComboBox *) GetDlgItem(IDC_DOCK6);
208  m_dock2_box[6] = (CComboBox *) GetDlgItem(IDC_DOCK7);
209  m_dock2_box[7] = (CComboBox *) GetDlgItem(IDC_DOCK8);
210  m_dock2_box[8] = (CComboBox *) GetDlgItem(IDC_DOCK9);
211  m_dock2_box[9] = (CComboBox *) GetDlgItem(IDC_DOCK10);
212 
213  m_priority_box[0] = (CComboBox *) GetDlgItem(IDC_PRIORITY1);
214  m_priority_box[1] = (CComboBox *) GetDlgItem(IDC_PRIORITY2);
215  m_priority_box[2] = (CComboBox *) GetDlgItem(IDC_PRIORITY3);
216  m_priority_box[3] = (CComboBox *) GetDlgItem(IDC_PRIORITY4);
217  m_priority_box[4] = (CComboBox *) GetDlgItem(IDC_PRIORITY5);
218  m_priority_box[5] = (CComboBox *) GetDlgItem(IDC_PRIORITY6);
219  m_priority_box[6] = (CComboBox *) GetDlgItem(IDC_PRIORITY7);
220  m_priority_box[7] = (CComboBox *) GetDlgItem(IDC_PRIORITY8);
221  m_priority_box[8] = (CComboBox *) GetDlgItem(IDC_PRIORITY9);
222  m_priority_box[9] = (CComboBox *) GetDlgItem(IDC_PRIORITY10);
223 
224  // start off with all goals available
225  for (i=0; i<Ai_goal_list_size; i++)
226  valid[i] = 1;
227 
228  // disallow orders if they aren't allowed because of ship type
229  if (self_ship >= 0) { // editing orders for just one ship
230  for (i=0; i<Ai_goal_list_size; i++){
231  if (!(ai_query_goal_valid(self_ship, Ai_goal_list[i].def))){
232  valid[i] = 0;
233  }
234  }
235  } else if (self_wing >= 0) { // editing orders for just one wing
236  for (i=0; i<Wings[self_wing].wave_count; i++){
237  for (j=0; j<Ai_goal_list_size; j++){
238  if (!ai_query_goal_valid(Wings[self_wing].ship_index[i], Ai_goal_list[j].def)){
239  valid[j] = 0;
240  }
241  }
242  }
243 
244  for (i=0; i<Ai_goal_list_size; i++){
245  if (Ai_goal_list[i].def == AI_GOAL_DOCK){ // a whole wing can't dock with one object..
246  valid[i] = 0;
247  }
248  }
249  } else { // editing orders for all marked ships
250  ptr = GET_FIRST(&obj_used_list);
251  while (ptr != END_OF_LIST(&obj_used_list)) {
252  if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)){
253  for (i=0; i<Ai_goal_list_size; i++){
255  valid[i] = 0;
256  }
257  }
258  }
259 
260  ptr = GET_NEXT(ptr);
261  }
262  }
263 
264  if (Waypoint_lists.empty()) {
265  for (i=0; i<Ai_goal_list_size; i++){
266  switch (Ai_goal_list[i].def) {
267  case AI_GOAL_WAYPOINTS:
269  //case AI_GOAL_WARP:
270  valid[i] = 0;
271  }
272  }
273  }
274 
275  z = 0;
276  ptr = GET_FIRST(&obj_used_list);
277  while (ptr != END_OF_LIST(&obj_used_list)) {
278  if ((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) {
279  i = ptr->instance;
280 
281  if ((self_ship > 0) && (self_ship != i) && ship_docking_valid(self_ship, i)){
282  z = 1;
283  }
284  }
285  ptr = GET_NEXT(ptr);
286  }
287 
288  if (!z){
289  for (i=0; i<Ai_goal_list_size; i++){
290  if (Ai_goal_list[i].def == AI_GOAL_DOCK){
291  valid[i] = 0;
292  }
293  }
294  }
295 
296  // initialize the behavior boxes (they remain constant) and initialize each goal's data
297  for (i=0; i<ED_MAX_GOALS; i++) {
298  m_behavior_box[i] -> ResetContent();
299  z = m_behavior_box[i] -> AddString("None");
300  m_behavior_box[i] -> SetItemData(z, (DWORD) AI_GOAL_NONE);
301  for (j=0; j<Ai_goal_list_size; j++){
302  if (valid[j]) {
303  z = m_behavior_box[i] -> AddString(Ai_goal_list[j].name);
304  m_behavior_box[i] -> SetItemData(z, (DWORD) Ai_goal_list[j].def);
305  }
306  }
307  }
308 
309  if (self_ship >= 0){
310  initialize(Ai_info[Ships[self_ship].ai_index].goals, self_ship);
311  } else if (self_wing >= 0){
312  initialize(Wings[self_wing].ai_goals);
313  } else {
315  }
316 
317  for (i=0; i<ED_MAX_GOALS; i++){
318  set_item(i, 1);
319  }
320 
321  CDialog::OnInitDialog();
322 
323  // restrict spin controls to a range of 0 - MAX_EDITOR_GOAL_PRIORITY
324  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN1)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
325  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN2)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
326  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN3)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
327  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN4)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
328  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN5)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
329  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN6)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
330  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN7)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
331  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN8)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
332  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN9)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
333  ((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN10)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
334 
335  return TRUE;
336 }
337 
339 {
340  int i, flag = 0;
341  object *ptr;
342  int behavior[ED_MAX_GOALS];
343  int priority[ED_MAX_GOALS];
344  int subsys[ED_MAX_GOALS];
345  int dock2[ED_MAX_GOALS];
346  int data[ED_MAX_GOALS];
347 
348  ptr = GET_FIRST(&obj_used_list);
349  while (ptr != END_OF_LIST(&obj_used_list)) {
350  if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) {
352  if (!flag) {
353  flag = 1;
354  for (i=0; i<ED_MAX_GOALS; i++) {
355  behavior[i] = m_behavior[i];
356  priority[i] = m_priority[i];
357  subsys[i] = m_subsys[i];
358  dock2[i] = m_dock2[i];
359  data[i] = m_data[i];
360  }
361 
362  } else {
363  for (i=0; i<ED_MAX_GOALS; i++) {
364  if (behavior[i] != m_behavior[i]) {
365  behavior[i] = -1;
366  data[i] = -1;
367  }
368 
369  if (data[i] != m_data[i]) {
370  data[i] = -1;
371  subsys[i] = -1;
372  dock2[i] = -1;
373  }
374 
375  if (priority[i] != m_priority[i]){
376  priority[i] = -1;
377  }
378  if (subsys[i] != m_subsys[i]){
379  subsys[i] = -1;
380  }
381  if (dock2[i] != m_dock2[i]){
382  dock2[i] = -1;
383  }
384  }
385  }
386  }
387 
388  ptr = GET_NEXT(ptr);
389  }
390 
391  goalp = NULL;
392  for (i=0; i<ED_MAX_GOALS; i++) {
393  m_behavior[i] = behavior[i];
394  m_priority[i] = priority[i];
395  m_subsys[i] = subsys[i];
396  m_dock2[i] = dock2[i];
397  m_data[i] = data[i];
398  }
399 }
400 
401 // perform one-time initialization of data from the goals struct.
403 {
404  int i, item, num, inst, flag, mode;
405  object *ptr;
406 
407  goalp = goals;
408  for (item=0; item<ED_MAX_GOALS; item++) {
409  flag = 1;
410  m_data[item] = 0;
411  m_priority[item] = 0;
412  mode = AI_GOAL_NONE;
413 
414  if (item < MAX_AI_GOALS) {
415  m_priority[item] = goalp[item].priority;
416  mode = goalp[item].ai_mode;
417  }
418 
419  if (m_priority[item] < 0 || m_priority[item] > MAX_EDITOR_GOAL_PRIORITY){
420  m_priority[item] = 50;
421  }
422 
423  m_behavior[item] = 0;
424  if (mode != AI_GOAL_NONE) {
425  i = m_behavior_box[item] -> GetCount();
426  while (i-- > 0){
427  if (mode & (m_behavior_box[item]->GetItemData(i))) {
428  m_behavior[item] = i;
429  break;
430  }
431  }
432  }
433 
434  switch (mode) {
435  case AI_GOAL_NONE:
436  case AI_GOAL_CHASE_ANY:
437  case AI_GOAL_UNDOCK:
439  case AI_GOAL_PLAY_DEAD:
440  case AI_GOAL_WARP:
441  continue;
442 
443  case AI_GOAL_STAY_STILL:
444  flag = 9; // target is a ship or a waypoint
445  break;
446 
447  case AI_GOAL_CHASE:
448  case AI_GOAL_GUARD:
450  case AI_GOAL_DISARM_SHIP:
451  case AI_GOAL_IGNORE:
452  case AI_GOAL_IGNORE_NEW:
453  case AI_GOAL_EVADE_SHIP:
455  break;
456 
457  case AI_GOAL_WAYPOINTS:
459  flag = 4; // target is a waypoint
460  break;
461 
463  num = ship_name_lookup(goalp[item].target_name, 1);
464  if (num != -1)
465  m_subsys[item] = ship_get_subsys_index(&Ships[num], goalp[item].docker.name, 1);
466 
467  break;
468 
469  case AI_GOAL_DOCK:
470  m_subsys[item] = -1;
471  num = get_docking_list(Ship_info[Ships[ship].ship_info_index].model_num);
472  for (i=0; i<num; i++) {
474  if (!stricmp(goalp[item].docker.name, Docking_bay_list[i])) {
475  m_subsys[item] = i;
476  break;
477  }
478  }
479 
480  break;
481 
482  case AI_GOAL_CHASE_WING:
483  case AI_GOAL_GUARD_WING:
484  flag = 2; // target is a wing
485  break;
486 
487  default:
488  Assert(0);
489  }
490 
491  if (flag & 0x1) {
492  ptr = GET_FIRST(&obj_used_list);
493  while (ptr != END_OF_LIST(&obj_used_list)) {
494  if ((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) {
495  inst = ptr->instance;
496  if (ptr->type == OBJ_SHIP) {
497  Assert(inst >= 0 && inst < MAX_SHIPS);
498  if (!stricmp(goalp[item].target_name, Ships[inst].ship_name)) {
499  m_data[item] = inst | TYPE_SHIP;
500  break;
501  }
502 
503  } else {
504  Assert(inst >= 0 && inst < MAX_SHIPS);
505  if (!stricmp(goalp[item].target_name, Ships[inst].ship_name)) {
506  m_data[item] = inst | TYPE_PLAYER;
507  break;
508  }
509  }
510  }
511 
512  ptr = GET_NEXT(ptr);
513  }
514  }
515 
516  if (flag & 0x2) {
517  for (i=0; i<MAX_WINGS; i++)
518  if (Wings[i].wave_count) {
519  if (!stricmp(goalp[item].target_name, Wings[i].name)) {
520  m_data[item] = i | TYPE_WING;
521  break;
522  }
523  }
524  }
525 
526  if (flag & 0x4) { // data is a waypoint path name
528  for (i = 0, ii = Waypoint_lists.begin(); ii != Waypoint_lists.end(); ++i, ++ii) {
529  if (!stricmp(goalp[item].target_name, ii->get_name())) {
530  m_data[item] = i | TYPE_PATH;
531  break;
532  }
533  }
534  }
535 
536  if (flag & 0x8) { // data is a waypoint name
537  waypoint *wpt = find_matching_waypoint(goalp[item].target_name);
538  if (wpt != NULL)
539  m_data[item] = wpt->get_objnum() | TYPE_WAYPOINT;
540  }
541 
542  switch (mode) {
543  case AI_GOAL_DOCK:
544  m_dock2[item] = -1;
545  if (m_data[item]) {
546  num = get_docking_list(Ship_info[Ships[m_data[item] & DATA_MASK].ship_info_index].model_num);
547  for (i=0; i<num; i++) {
549  Assert(goalp[item].dockee.name);
550  Assert(goalp[item].dockee.index != -1);
551  if (!stricmp(goalp[item].dockee.name, Docking_bay_list[i])) {
552  m_dock2[item] = i;
553  break;
554  }
555  }
556  }
557 
558  break;
559  }
560 
561 // Assert(m_data[item]);
562  }
563 }
564 
565 void ShipGoalsDlg::set_item(int item, int init)
566 {
568  int i, t, z, num, inst, mode;
569  object *ptr;
570 
571  if (init)
572  m_object[item] = -1;
573 
574  if (item >= MAX_AI_GOALS)
575  m_behavior_box[item] -> EnableWindow(FALSE);
576 
577  Assert(item >= 0 && item < ED_MAX_GOALS);
578  m_object_box[item] -> ResetContent();
579  if (m_behavior[item] < 1) {
580  m_object_box[item] -> EnableWindow(FALSE);
581  m_subsys_box[item] -> EnableWindow(FALSE);
582  m_dock2_box[item] -> EnableWindow(FALSE);
583  m_priority_box[item] -> EnableWindow(FALSE);
584  m_subsys[item] = -1;
585  m_dock2[item] = -1;
586  return;
587  }
588 
589  mode = m_behavior_box[item] -> GetItemData(m_behavior[item]);
590  m_priority_box[item] -> EnableWindow(TRUE);
591  if ((mode == AI_GOAL_CHASE_ANY) || (mode == AI_GOAL_UNDOCK) || (mode == AI_GOAL_KEEP_SAFE_DISTANCE) || (mode == AI_GOAL_PLAY_DEAD) || (mode == AI_GOAL_WARP) ) {
592  m_object_box[item] -> EnableWindow(FALSE);
593  m_subsys_box[item] -> EnableWindow(FALSE);
594  m_dock2_box[item] -> EnableWindow(FALSE);
595  m_subsys[item] = -1;
596  m_dock2[item] = -1;
597  return;
598  }
599 
600  m_object_box[item] -> EnableWindow(TRUE);
601 
602  switch (mode) {
603  case AI_GOAL_WAYPOINTS:
605  //case AI_GOAL_WARP:
606  for (i = 0, ii = Waypoint_lists.begin(); ii != Waypoint_lists.end(); ++i, ++ii) {
607  z = m_object_box[item] -> AddString(ii->get_name());
608  m_object_box[item] -> SetItemData(z, i | TYPE_PATH);
609  if (init && (m_data[item] == (i | TYPE_PATH)))
610  m_object[item] = z;
611  }
612 
613  break;
614 
615  case AI_GOAL_STAY_STILL:
616  ptr = GET_FIRST(&obj_used_list);
617  while (ptr != END_OF_LIST(&obj_used_list)) {
618  if (ptr->type == OBJ_WAYPOINT) {
619  t = TYPE_SHIP;
620  z = m_object_box[item] -> AddString(object_name(OBJ_INDEX(ptr)));
621  m_object_box[item] -> SetItemData(z, OBJ_INDEX(ptr) | TYPE_WAYPOINT);
622  if (init && (m_data[item] == (OBJ_INDEX(ptr) | TYPE_WAYPOINT)))
623  m_object[item] = z;
624  }
625 
626  ptr = GET_NEXT(ptr);
627  }
628 
629  break;
630  }
631 
632  switch (mode) {
635  case AI_GOAL_DOCK:
638  case AI_GOAL_DISARM_SHIP:
639  case AI_GOAL_EVADE_SHIP:
640  case AI_GOAL_IGNORE:
641  case AI_GOAL_IGNORE_NEW:
643  case AI_GOAL_STAY_STILL:
644  ptr = GET_FIRST(&obj_used_list);
645  while (ptr != END_OF_LIST(&obj_used_list)) {
646  if ((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) {
647  inst = ptr->instance;
648  if (ptr->type == OBJ_SHIP)
649  t = TYPE_SHIP;
650  else
651  t = TYPE_PLAYER;
652 
653  Assert(inst >= 0 && inst < MAX_SHIPS);
654  // remove all marked ships from list
655  if (!goalp && (ptr->flags & OF_MARKED))
656  inst = -1;
657 
658  // when docking, remove invalid dock targets
659  else if (mode == AI_GOAL_DOCK) {
660  if (self_ship < 0 || !ship_docking_valid(self_ship, inst))
661  inst = -1;
662  }
663 
664  // disallow ship being its own target
665  if (inst >= 0 && inst != self_ship) {
666  z = m_object_box[item] -> AddString(Ships[inst].ship_name);
667  m_object_box[item] -> SetItemData(z, inst | t);
668  if (init && (m_data[item] == (inst | t)))
669  m_object[item] = z;
670  }
671  }
672 
673  ptr = GET_NEXT(ptr);
674  }
675 
676  break;
677  }
678 
679  switch (mode) {
682  for (i=0; i<MAX_WINGS; i++)
683  if (Wings[i].wave_count && i != self_wing) {
684  z = m_object_box[item] -> AddString(Wings[i].name);
685  m_object_box[item] -> SetItemData(z, i | TYPE_WING);
686  if (init && (m_data[item] == (i | TYPE_WING)))
687  m_object[item] = z;
688  }
689 
690  break;
691  }
692 
693  if (mode == AI_GOAL_DESTROY_SUBSYSTEM) {
694  m_subsys_box[item] -> EnableWindow(TRUE);
695  m_dock2_box[item] -> EnableWindow(FALSE);
696  m_dock2[item] = -1;
697  set_object(item);
698  if (!m_behavior[item])
699  set_item(item, init);
700 
701  } else if (mode == AI_GOAL_DOCK) {
702  num = get_docking_list(Ship_info[Ships[cur_ship].ship_info_index].model_num);
703  m_subsys_box[item] -> EnableWindow(TRUE);
704  m_subsys_box[item] -> ResetContent();
705  for (i=0; i<num; i++) {
707  z = m_subsys_box[item] -> AddString(Docking_bay_list[i]);
708  m_subsys_box[item] -> SetItemDataPtr(z, Docking_bay_list[i]);
709  }
710 
711  set_object(item);
712  if (!m_behavior[item])
713  set_item(item, init);
714 
715  } else {
716  m_subsys_box[item] -> EnableWindow(FALSE);
717  m_dock2_box[item] -> EnableWindow(FALSE);
718  m_subsys[item] = -1;
719  m_dock2[item] = -1;
720  }
721 }
722 
724 {
725  UpdateData(TRUE);
726  m_object[0] = 0;
727  m_subsys[0] = m_dock2[0] = 0;
728  set_item(0);
729  UpdateData(FALSE);
730 }
731 
733 {
734  UpdateData(TRUE);
735  m_object[1] = 0;
736  set_item(1);
737  m_subsys[1] = m_dock2[1] = 0;
738  UpdateData(FALSE);
739 }
740 
742 {
743  UpdateData(TRUE);
744  m_object[2] = 0;
745  set_item(2);
746  m_subsys[2] = m_dock2[2] = 0;
747  UpdateData(FALSE);
748 }
749 
751 {
752  UpdateData(TRUE);
753  m_object[3] = 0;
754  set_item(3);
755  m_subsys[3] = m_dock2[3] = 0;
756  UpdateData(FALSE);
757 }
758 
760 {
761  UpdateData(TRUE);
762  m_object[4] = 0;
763  set_item(4);
764  m_subsys[4] = m_dock2[4] = 0;
765  UpdateData(FALSE);
766 }
767 
769 {
770  UpdateData(TRUE);
771  m_object[5] = 0;
772  set_item(5);
773  m_subsys[5] = m_dock2[5] = 0;
774  UpdateData(FALSE);
775 }
776 
778 {
779  UpdateData(TRUE);
780  m_object[6] = 0;
781  set_item(6);
782  m_subsys[6] = m_dock2[6] = 0;
783  UpdateData(FALSE);
784 }
785 
787 {
788  UpdateData(TRUE);
789  m_object[7] = 0;
790  set_item(7);
791  m_subsys[7] = m_dock2[7] = 0;
792  UpdateData(FALSE);
793 }
794 
796 {
797  UpdateData(TRUE);
798  m_object[8] = 0;
799  set_item(8);
800  m_subsys[8] = m_dock2[8] = 0;
801  UpdateData(FALSE);
802 }
803 
805 {
806  UpdateData(TRUE);
807  m_object[9] = 0;
808  set_item(9);
809  m_subsys[9] = m_dock2[9] = 0;
810  UpdateData(FALSE);
811 }
812 
814 {
815  int i;
816 
817  if (goalp) {
818  for (i=0; i<ED_MAX_GOALS; i++)
819  update_item(i);
820 
821  verify_orders();
822 
823  } else {
824  object *ptr;
825 
826  ptr = GET_FIRST(&obj_used_list);
827  while (ptr != END_OF_LIST(&obj_used_list)) {
828  if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) {
829  goalp = Ai_info[Ships[ptr->instance].ai_index].goals;
830  for (i=0; i<ED_MAX_GOALS; i++)
831  update_item(i, 1);
832  }
833 
834  ptr = GET_NEXT(ptr);
835  }
836 
837  ptr = GET_FIRST(&obj_used_list);
838  while (ptr != END_OF_LIST(&obj_used_list)) {
839  if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) {
840  self_ship = ptr->instance;
843  }
844 
845  ptr = GET_NEXT(ptr);
846  }
847  }
848 }
849 
851 {
852  char *str, buf[2048];
853 
854  if ((str = error_check_initial_orders(goalp, self_ship, self_wing))!=NULL) {
855  if (*str == '!')
856  return 1;
857  else if (*str == '*')
858  str++;
859 
860  if (ship >= 0)
861  sprintf(buf, "Initial orders error for ship \"%s\"\n\n%s", Ships[ship].ship_name, str);
862  else
863  strcpy_s(buf, str);
864 
865  if (MessageBox(buf, "Error", MB_OKCANCEL | MB_ICONEXCLAMATION) != IDOK)
866  return 1;
867  }
868 
869  return 0;
870 }
871 
872 void ShipGoalsDlg::update_item(int item, int multi)
873 {
874  char *docker, *dockee, *subsys;
875  int mode;
876  char buf[512], save[80];
877  waypoint_list *wp_list;
878 
879  if (item >= MAX_AI_GOALS)
880  return;
881 
882  if (!multi || m_priority[item] >= 0)
883  goalp[item].priority = m_priority[item];
884 
885  if (m_behavior[item] < 0) {
886  if (multi)
887  return;
888  else
889  m_behavior[item] = 0;
890  }
891 
892  mode = m_behavior_box[item] -> GetItemData(m_behavior[item]);
893  switch (mode) {
894  case AI_GOAL_NONE:
895  case AI_GOAL_CHASE_ANY:
896  case AI_GOAL_UNDOCK:
898  case AI_GOAL_PLAY_DEAD:
899  case AI_GOAL_WARP:
900  MODIFY(goalp[item].ai_mode, mode);
901  return;
902 
903  case AI_GOAL_WAYPOINTS:
906  case AI_GOAL_DISARM_SHIP:
907  case AI_GOAL_IGNORE:
908  case AI_GOAL_IGNORE_NEW:
909  case AI_GOAL_EVADE_SHIP:
911  case AI_GOAL_STAY_STILL:
912  break;
913 
915  subsys = NULL;
916  if (!multi || (m_data[item] && (m_subsys[item] >= 0)))
917  subsys = (char *) m_subsys_box[item]->GetItemDataPtr(m_subsys[item]);
918  //MODIFY(goalp[item].ai_submode, m_subsys[item] + 1);
919 
920  if (!subsys) {
921  sprintf(buf, "Order #%d doesn't have valid subsystem name. Order will be removed", item + 1);
922  MessageBox(buf, "Notice");
923  MODIFY(goalp[item].ai_mode, AI_GOAL_NONE);
924  return;
925 
926  } else {
927  if (!goalp[item].docker.name || (goalp[item].docker.name && !stricmp(goalp[item].docker.name, subsys)))
928  set_modified();
929 
930  goalp[item].docker.name = subsys;
931  }
932 
933  break;
934 
936  switch (m_data[item] & TYPE_MASK) {
937  case TYPE_SHIP:
938  case TYPE_PLAYER:
939  mode = AI_GOAL_CHASE;
940  break;
941 
942  case TYPE_WING:
943  mode = AI_GOAL_CHASE_WING;
944  break;
945  }
946 
947  break;
948 
949  case AI_GOAL_DOCK:
950  docker = NULL;
951  if (!multi || (m_data[item] && (m_subsys[item] >= 0)))
952  docker = (char *) m_subsys_box[item] -> GetItemDataPtr(m_subsys[item]);
953 
954  dockee = NULL;
955  if (!multi || (m_data[item] && (m_dock2[item] >= 0)))
956  dockee = (char *) m_dock2_box[item] -> GetItemDataPtr(m_dock2[item]);
957 
958  if (docker == (char *) 0xffffffff)
959  docker = NULL;
960  if (dockee == (char *) 0xffffffff)
961  dockee = NULL;
962 
963  if (!docker || !dockee) {
964  sprintf(buf, "Order #%d doesn't have valid docking points. Order will be removed", item + 1);
965  MessageBox(buf, "Notice");
966  MODIFY(goalp[item].ai_mode, AI_GOAL_NONE);
967  return;
968 
969  } else {
970  if (!goalp[item].docker.name)
971  set_modified();
972  else if (!stricmp(goalp[item].docker.name, docker))
973  set_modified();
974 
975  if (!goalp[item].dockee.name)
976  set_modified();
977  else if (!stricmp(goalp[item].dockee.name, dockee))
978  set_modified();
979 
980  goalp[item].docker.name = docker;
981  goalp[item].dockee.name = dockee;
982  }
983 
984  break;
985 
987  switch (m_data[item] & TYPE_MASK) {
988  case TYPE_SHIP:
989  case TYPE_PLAYER:
990  mode = AI_GOAL_GUARD;
991  break;
992 
993  case TYPE_WING:
994  mode = AI_GOAL_GUARD_WING;
995  break;
996  }
997 
998  break;
999 
1000  default:
1001  Warning(LOCATION, "Unknown AI_GOAL type 0x%x", mode);
1002  MODIFY(goalp[item].ai_mode, AI_GOAL_NONE);
1003  return;
1004  }
1005 
1006  MODIFY(goalp[item].ai_mode, mode);
1007 
1008  *save = 0;
1009  if (goalp[item].target_name)
1010  strcpy_s(save, goalp[item].target_name);
1011 
1012  switch (m_data[item] & TYPE_MASK) {
1013  int not_used;
1014 
1015  case TYPE_SHIP:
1016  case TYPE_PLAYER:
1017  goalp[item].target_name = ai_get_goal_target_name(Ships[m_data[item] & DATA_MASK].ship_name, &not_used);
1018  break;
1019 
1020  case TYPE_WING:
1021  goalp[item].target_name = ai_get_goal_target_name(Wings[m_data[item] & DATA_MASK].name, &not_used);
1022  break;
1023 
1024  case TYPE_PATH:
1025  wp_list = find_waypoint_list_at_index(m_data[item] & DATA_MASK);
1026  Assert(wp_list != NULL);
1027  goalp[item].target_name = ai_get_goal_target_name(wp_list->get_name(), &not_used);
1028  break;
1029 
1030  case TYPE_WAYPOINT:
1031  goalp[item].target_name = ai_get_goal_target_name(object_name(m_data[item] & DATA_MASK), &not_used);
1032  break;
1033 
1034  case 0:
1035  case -1:
1036  case (-1 & TYPE_MASK):
1037  if (multi)
1038  return;
1039 
1040  sprintf(buf, "Order #%d doesn't have a valid target. Order will be removed", item + 1);
1041  MessageBox(buf, "Notice");
1042  MODIFY(goalp[item].ai_mode, AI_GOAL_NONE);
1043  return;
1044 
1045  default:
1046  Assert(0);
1047  }
1048 
1049  if (stricmp(save, goalp[item].target_name))
1050  set_modified();
1051 }
1052 
1054 {
1055  int i, mode;
1056 
1057  UpdateData(TRUE);
1058 
1059  for (i=0; i<ED_MAX_GOALS; i++) {
1060  mode = m_behavior_box[i] -> GetItemData(m_behavior[i]);
1061  if ((mode != AI_GOAL_NONE) && (mode != AI_GOAL_CHASE_ANY) && (mode != AI_GOAL_UNDOCK) && (mode != AI_GOAL_KEEP_SAFE_DISTANCE) && (mode != AI_GOAL_PLAY_DEAD) && (mode != AI_GOAL_WARP) ) {
1062  if (!m_object_box[i] -> GetCount()) // no valid objects?
1063  m_behavior[i] = 0;
1064  else
1065  m_data[i] = m_object_box[i] -> GetItemData(m_object[i]);
1066  }
1067  }
1068 
1069  update();
1070  CDialog::OnOK();
1071 }
1072 
1074 {
1075  UpdateData(TRUE);
1076  set_object(0);
1077  m_subsys[0] = m_dock2[0] = 0;
1078  UpdateData(FALSE);
1079 }
1080 
1082 {
1083  UpdateData(TRUE);
1084  set_object(1);
1085  m_subsys[1] = m_dock2[1] = 0;
1086  UpdateData(FALSE);
1087 }
1088 
1090 {
1091  UpdateData(TRUE);
1092  set_object(2);
1093  m_subsys[2] = m_dock2[2] = 0;
1094  UpdateData(FALSE);
1095 }
1096 
1098 {
1099  UpdateData(TRUE);
1100  set_object(3);
1101  m_subsys[3] = m_dock2[3] = 0;
1102  UpdateData(FALSE);
1103 }
1104 
1106 {
1107  UpdateData(TRUE);
1108  set_object(4);
1109  m_subsys[4] = m_dock2[4] = 0;
1110  UpdateData(FALSE);
1111 }
1112 
1114 {
1115  UpdateData(TRUE);
1116  set_object(5);
1117  m_subsys[5] = m_dock2[5] = 0;
1118  UpdateData(FALSE);
1119 }
1120 
1122 {
1123  UpdateData(TRUE);
1124  set_object(6);
1125  m_subsys[6] = m_dock2[6] = 0;
1126  UpdateData(FALSE);
1127 }
1128 
1130 {
1131  UpdateData(TRUE);
1132  set_object(7);
1133  m_subsys[7] = m_dock2[7] = 0;
1134  UpdateData(FALSE);
1135 }
1136 
1138 {
1139  UpdateData(TRUE);
1140  set_object(8);
1141  m_subsys[8] = m_dock2[8] = 0;
1142  UpdateData(FALSE);
1143 }
1144 
1146 {
1147  UpdateData(TRUE);
1148  set_object(9);
1149  m_subsys[9] = m_dock2[9] = 0;
1150  UpdateData(FALSE);
1151 }
1152 
1153 void ShipGoalsDlg::set_object(int item)
1154 {
1155  char *str;
1156  int i = 0, z, num, not_used, mode;
1157  ship_subsys *subsys;
1158 
1159  if (m_behavior[item] > 0) {
1160  mode = m_behavior_box[item] -> GetItemData(m_behavior[item]);
1161  if (!m_object_box[item] -> GetCount())
1162  m_behavior[item] = m_data[item] = 0;
1163  else
1164  m_data[item] = m_object_box[item] -> GetItemData(m_object[item]);
1165 
1166  if ((mode == AI_GOAL_DOCK) && (m_data[item] >= 0)) {
1167  num = get_docking_list(Ship_info[Ships[m_data[item] & DATA_MASK].ship_info_index].model_num);
1168  m_dock2_box[item] -> EnableWindow(TRUE);
1169  m_dock2_box[item] -> ResetContent();
1170  for (i=0; i<num; i++) {
1172  z = m_dock2_box[item] -> AddString(Docking_bay_list[i]);
1173  str = ai_get_goal_target_name(Docking_bay_list[i], &not_used);
1174  m_dock2_box[item] -> SetItemDataPtr(z, str);
1175  }
1176 
1177  } else if ((mode == AI_GOAL_DESTROY_SUBSYSTEM) && (m_data[item] >= 0)) {
1178  if (((m_data[item] & TYPE_MASK) == TYPE_SHIP) || ((m_data[item] & TYPE_MASK) == TYPE_PLAYER)) {
1179  i = m_data[item] & DATA_MASK;
1180 
1181  } else
1182  Int3();
1183 
1184  m_subsys_box[item] -> ResetContent();
1185  subsys = GET_FIRST(&Ships[i].subsys_list);
1186  z = 0;
1187  while (subsys != END_OF_LIST(&Ships[i].subsys_list)) {
1188  m_subsys_box[item]->AddString(subsys->system_info->subobj_name);
1189  m_subsys_box[item]->SetItemDataPtr(z, subsys->system_info->subobj_name);
1190  z++;
1191  subsys = GET_NEXT(subsys);
1192  }
1193  }
1194  }
1195 }
afx_msg void OnSelchangeObject10()
#define MB_OKCANCEL
Definition: config.h:180
#define IDC_PRIORITY3
Definition: resource.h:293
#define IDC_DOCK5
Definition: resource.h:747
wing Wings[MAX_WINGS]
Definition: ship.cpp:128
int i
Definition: multi_pxo.cpp:466
int m_subsys[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:38
#define AI_GOAL_UNDOCK
Definition: aigoals.h:36
#define IDC_DOCK4
Definition: resource.h:745
#define IDC_PRIORITY5
Definition: resource.h:324
model_subsystem * system_info
Definition: ship.h:314
#define IDC_OBJECT5
Definition: resource.h:668
union ai_goal::@1 dockee
char * get_name()
Definition: waypoint.cpp:84
waypoint * find_matching_waypoint(const char *name)
Definition: waypoint.cpp:179
#define IDC_SUBSYSTEM3
Definition: resource.h:695
CShipEditorDlg Ship_editor_dialog
Definition: fred.cpp:55
#define IDC_OBJECT3
Definition: resource.h:654
char * name
Definition: ai.h:153
CComboBox * m_subsys_box[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:44
CComboBox * m_dock2_box[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:45
int m_priority[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:37
#define AI_GOAL_CHASE_WING
Definition: aigoals.h:37
#define IDC_OBJECT10
Definition: resource.h:688
#define AI_GOAL_DOCK
Definition: aigoals.h:30
#define MAX_WINGS
Definition: globals.h:50
#define AI_GOAL_WAYPOINTS
Definition: aigoals.h:31
#define MAX_SHIPS
Definition: globals.h:37
int m_data[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:40
char * object_name(int obj)
#define AI_GOAL_GUARD
Definition: aigoals.h:38
#define IDC_OBJECT2
Definition: resource.h:639
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define TYPE_SHIP
Assert(pm!=NULL)
int ai_index
Definition: ship.h:538
#define AI_GOAL_STAY_NEAR_SHIP
Definition: aigoals.h:47
#define AI_GOAL_CHASE_ANY
Definition: aigoals.h:41
afx_msg void OnSelchangeObject2()
CComboBox * m_object_box[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:43
afx_msg void OnSelchangeBehavior8()
#define AI_GOAL_WARP
Definition: aigoals.h:33
#define TRUE
Definition: pstypes.h:399
#define IDC_BEHAVIOR9
Definition: resource.h:686
afx_msg void OnSelchangeObject3()
#define AI_GOAL_IGNORE
Definition: aigoals.h:42
ai_info Ai_info[MAX_AI_INFO]
Definition: ai.cpp:23
afx_msg void OnSelchangeBehavior10()
object obj_used_list
Definition: object.cpp:53
#define IDC_SUBSYSTEM7
Definition: resource.h:699
#define AI_GOAL_DISARM_SHIP
Definition: aigoals.h:40
#define IDC_OBJECT1
Definition: resource.h:577
ShipGoalsDlg(CWnd *pParent=NULL)
GLenum mode
Definition: Glext.h:5794
afx_msg void OnSelchangeBehavior6()
#define IDC_BEHAVIOR10
Definition: resource.h:690
unsigned int UINT
Definition: config.h:82
#define Int3()
Definition: pstypes.h:292
#define ED_MAX_GOALS
Definition: shipgoalsdlg.h:17
#define AI_GOAL_NONE
Definition: ai.h:194
#define MODIFY(a, b)
Definition: fred.h:26
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: Glext.h:7308
afx_msg void OnSelchangeBehavior5()
int get_docking_list(int model_index)
SCP_list< waypoint_list > Waypoint_lists
Definition: waypoint.cpp:9
#define IDC_BEHAVIOR1
Definition: resource.h:584
#define IDC_PRIORITY1
Definition: resource.h:401
#define TYPE_WAYPOINT
#define IDC_BEHAVIOR6
Definition: resource.h:674
#define OBJ_WAYPOINT
Definition: object.h:36
int instance
Definition: object.h:150
afx_msg void OnSelchangeBehavior4()
#define IDC_SPIN1
Definition: resource.h:404
int m_dock2[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:39
#define OBJ_START
Definition: object.h:35
#define IDC_SUBSYSTEM10
Definition: resource.h:702
afx_msg void OnSelchangeObject5()
char dockee[NAME_LENGTH]
#define IDC_DOCK7
Definition: resource.h:751
#define IDC_OBJECT9
Definition: resource.h:684
#define IDC_DOCK1
Definition: resource.h:739
afx_msg void OnSelchangeBehavior2()
#define IDC_SUBSYSTEM5
Definition: resource.h:697
afx_msg void OnSelchangeObject1()
afx_msg void OnSelchangeObject7()
ai_goal goals[MAX_AI_GOALS]
Definition: ai.h:412
#define IDC_OBJECT8
Definition: resource.h:680
#define IDC_SUBSYSTEM6
Definition: resource.h:698
afx_msg void OnSelchangeBehavior7()
#define TYPE_PLAYER
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
int ai_mode
Definition: ai.h:136
#define MAX_AI_GOALS
Definition: ai.h:91
GLdouble GLdouble z
Definition: Glext.h:5451
#define IDC_SUBSYSTEM1
Definition: resource.h:693
int priority
Definition: ai.h:141
#define IDC_PRIORITY7
Definition: resource.h:358
afx_msg void OnSelchangeObject4()
#define IDC_BEHAVIOR2
Definition: resource.h:648
#define AI_GOAL_STAY_STILL
Definition: aigoals.h:52
#define IDC_OBJECT7
Definition: resource.h:676
char * target_name
Definition: ai.h:143
int ai_query_goal_valid(int ship, int ai_goal_type)
Definition: aigoals.cpp:208
#define IDC_BEHAVIOR3
Definition: resource.h:659
Definition: ship.h:534
CComboBox * m_behavior_box[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:42
#define IDC_SPIN10
Definition: resource.h:418
#define IDC_SPIN3
Definition: resource.h:297
#define AI_GOAL_EVADE_SHIP
Definition: aigoals.h:44
unsigned long DWORD
Definition: config.h:90
CComboBox * m_priority_box[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:46
#define IDC_PRIORITY6
Definition: resource.h:348
GLdouble GLdouble t
Definition: Glext.h:5329
afx_msg void OnSelchangeObject8()
int wave_count
Definition: ship.h:1527
#define AI_GOAL_IGNORE_NEW
Definition: aigoals.h:57
#define IDC_SUBSYSTEM8
Definition: resource.h:700
ai_goal_list Ai_goal_list[]
Definition: management.cpp:106
#define AI_GOAL_PLAY_DEAD
Definition: aigoals.h:53
#define AI_GOAL_WAYPOINTS_ONCE
Definition: aigoals.h:32
#define OBJ_INDEX(objp)
Definition: object.h:235
#define OF_MARKED
Definition: object.h:125
#define IDC_SUBSYSTEM4
Definition: resource.h:696
char * ai_get_goal_target_name(const char *name, int *index)
Definition: ai.cpp:85
#define OBJ_SHIP
Definition: object.h:32
#define AI_GOAL_GUARD_WING
Definition: aigoals.h:43
void set_modified(BOOL arg)
Definition: freddoc.cpp:676
#define IDC_SPIN2
Definition: resource.h:270
#define IDC_SPIN5
Definition: resource.h:326
GLuint const GLchar * name
Definition: Glext.h:5608
#define IDC_BEHAVIOR7
Definition: resource.h:678
#define IDC_PRIORITY10
Definition: resource.h:415
#define TYPE_MASK
int BOOL
Definition: config.h:80
ship Ships[MAX_SHIPS]
Definition: ship.cpp:122
#define IDC_OBJECT6
Definition: resource.h:672
#define IDC_SUBSYSTEM9
Definition: resource.h:701
GLuint GLuint num
Definition: Glext.h:9089
#define IDC_BEHAVIOR5
Definition: resource.h:670
#define MB_ICONEXCLAMATION
Definition: config.h:184
virtual void DoDataExchange(CDataExchange *pDX)
virtual BOOL OnInitDialog()
void initialize_multi()
#define AI_GOAL_KEEP_SAFE_DISTANCE
Definition: aigoals.h:48
#define TYPE_WING
#define AI_GOAL_DISABLE_SHIP
Definition: aigoals.h:39
#define IDC_SPIN6
Definition: resource.h:351
int ship_docking_valid(int docker, int dockee)
Definition: ship.cpp:14494
waypoint_list * find_waypoint_list_at_index(int index)
Definition: waypoint.cpp:291
#define IDC_DOCK2
Definition: resource.h:741
#define IDC_PRIORITY9
Definition: resource.h:387
#define IDC_SPIN9
Definition: resource.h:390
#define IDC_PRIORITY8
Definition: resource.h:372
afx_msg void OnSelchangeBehavior9()
int Ai_goal_list_size
Definition: management.cpp:127
#define IDC_DOCK3
Definition: resource.h:743
afx_msg void OnSelchangeBehavior1()
int cur_ship
Definition: management.cpp:80
char subobj_name[MAX_NAME_LEN]
Definition: model.h:172
char * Docking_bay_list[MAX_DOCKS]
Definition: management.cpp:99
#define IDC_BEHAVIOR8
Definition: resource.h:682
SCP_vector< ship_info > Ship_info
Definition: ship.cpp:164
#define LOCATION
Definition: pstypes.h:245
int MessageBox(HWND h, const char *s1, const char *s2, int i)
GLenum GLsizei GLenum GLenum const GLvoid * data
Definition: Gl.h:1509
union ai_goal::@0 docker
#define IDC_OBJECT4
Definition: resource.h:662
int m_behavior[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:35
char docker[NAME_LENGTH]
#define AI_GOAL_CHASE
Definition: aigoals.h:29
#define IDC_BEHAVIOR4
Definition: resource.h:665
#define MAX_EDITOR_GOAL_PRIORITY
Definition: shipgoalsdlg.h:18
afx_msg void OnSelchangeBehavior3()
#define IDC_DOCK8
Definition: resource.h:752
#define DATA_MASK
#define IDC_SPIN7
Definition: resource.h:361
#define IDC_PRIORITY2
Definition: resource.h:264
Definition: ai.h:134
int get_objnum()
Definition: waypoint.cpp:51
#define IDC_SPIN8
Definition: resource.h:375
int ship_get_subsys_index(ship *sp, char *ss_name, int error_bypass)
Definition: ship.cpp:13421
#define IDC_SUBSYSTEM2
Definition: resource.h:694
int m_object[ED_MAX_GOALS]
Definition: shipgoalsdlg.h:36
int ship_name_lookup(const char *name, int inc_players)
Definition: ship.cpp:12900
#define TYPE_PATH
uint flags
Definition: object.h:151
#define AI_GOAL_DESTROY_SUBSYSTEM
Definition: aigoals.h:34
int model_num
Definition: lua.cpp:4996
char type
Definition: object.h:146
#define IDC_PRIORITY4
Definition: resource.h:314
#define FALSE
Definition: pstypes.h:400
#define IDC_SPIN4
Definition: resource.h:317
afx_msg void OnSelchangeObject9()
#define stricmp(s1, s2)
Definition: config.h:271
#define IDC_DOCK10
Definition: resource.h:754
#define IDC_DOCK9
Definition: resource.h:753
#define IDC_DOCK6
Definition: resource.h:749
afx_msg void OnSelchangeObject6()
int verify_orders(int ship=-1)
void initialize(ai_goal *goals, int ship=cur_ship)
#define strcpy_s(...)
Definition: safe_strings.h:67
char * error_check_initial_orders(ai_goal *goals, int ship, int wing)
Definition: fredview.cpp:3397