FS2_Open
Open source remastering of the Freespace 2 engine
missiongoalsdlg.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 "FREDDoc.h"
15 #include "FREDView.h"
16 #include "globalincs/linklist.h"
17 #include "parse/sexp.h"
18 #include "MissionGoalsDlg.h"
19 #include "Management.h"
20 #include "OperatorArgTypeSelect.h"
21 
22 #define ID_ADD_SHIPS 9000
23 #define ID_REPLACE_SHIPS 11000
24 #define ID_ADD_WINGS 13000
25 #define ID_REPLACE_WINGS 15000
26 
27 #ifdef _DEBUG
28 #undef THIS_FILE
29 static char THIS_FILE[] = __FILE__;
30 #endif
31 
32 CMissionGoalsDlg *Goal_editor_dlg; // global reference needed by sexp_tree class
33 
35 // sexp_goal_tree class member functions
36 
38 // CMissionGoalsDlg dialog class member functions
39 
40 CMissionGoalsDlg::CMissionGoalsDlg(CWnd* pParent /*=NULL*/)
41  : CDialog(CMissionGoalsDlg::IDD, pParent)
42 {
43  //{{AFX_DATA_INIT(CMissionGoalsDlg)
44  m_goal_desc = _T("");
45  m_goal_type = -1;
47  m_name = _T("");
49  m_goal_score = 0;
50  m_no_music = FALSE;
51  m_team = -1;
52  //}}AFX_DATA_INIT
54  m_num_goals = 0;
56  modified = 0;
57  select_sexp_node = -1;
58 }
59 
61 {
62  int i, adjust = 0;
63 
64  CDialog::OnInitDialog(); // let the base class do the default work
65  if (!Show_sexp_help)
66  adjust = -SEXP_HELP_BOX_SIZE;
67 
69  m_goals_tree.setup((CEdit *) GetDlgItem(IDC_HELP_BOX));
70  load_tree();
71  create_tree();
72  if (m_num_goals >= MAX_GOALS)
73  GetDlgItem(IDC_BUTTON_NEW_GOAL)->EnableWindow(FALSE);
74 
75  Goal_editor_dlg = this;
77  if (i != -1) {
78  GetDlgItem(IDC_GOALS_TREE) -> SetFocus();
80  return FALSE;
81  }
82 
83  return TRUE;
84 }
85 
86 void CMissionGoalsDlg::DoDataExchange(CDataExchange* pDX)
87 {
88  CDialog::DoDataExchange(pDX);
89  //{{AFX_DATA_MAP(CMissionGoalsDlg)
90  DDX_Control(pDX, IDC_GOALS_TREE, m_goals_tree);
91  DDX_Text(pDX, IDC_GOAL_DESC, m_goal_desc);
92  DDX_CBIndex(pDX, IDC_GOAL_TYPE_DROP, m_goal_type);
94  DDX_Text(pDX, IDC_GOAL_NAME, m_name);
95  DDX_Check(pDX, IDC_GOAL_INVALID, m_goal_invalid);
96  DDX_Text(pDX, IDC_GOAL_SCORE, m_goal_score);
97  DDX_Check(pDX, IDC_NO_MUSIC, m_no_music);
98  DDX_CBIndex(pDX, IDC_OBJ_TEAM, m_team);
99  //}}AFX_DATA_MAP
100  DDV_MaxChars(pDX, m_goal_desc, MAX_GOAL_TEXT - 1);
101  DDV_MaxChars(pDX, m_name, NAME_LENGTH - 1);
102 }
103 
104 BEGIN_MESSAGE_MAP(CMissionGoalsDlg, CDialog)
105  //{{AFX_MSG_MAP(CMissionGoalsDlg)
106  ON_CBN_SELCHANGE(IDC_DISPLAY_GOAL_TYPES_DROP, OnSelchangeDisplayGoalTypesDrop)
107  ON_NOTIFY(TVN_SELCHANGED, IDC_GOALS_TREE, OnSelchangedGoalsTree)
108  ON_NOTIFY(NM_RCLICK, IDC_GOALS_TREE, OnRclickGoalsTree)
109  ON_NOTIFY(TVN_ENDLABELEDIT, IDC_GOALS_TREE, OnEndlabeleditGoalsTree)
110  ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_GOALS_TREE, OnBeginlabeleditGoalsTree)
111  ON_BN_CLICKED(IDC_BUTTON_NEW_GOAL, OnButtonNewGoal)
112  ON_EN_CHANGE(IDC_GOAL_DESC, OnChangeGoalDesc)
113  ON_EN_CHANGE(IDC_GOAL_RATING, OnChangeGoalRating)
114  ON_CBN_SELCHANGE(IDC_GOAL_TYPE_DROP, OnSelchangeGoalTypeDrop)
115  ON_EN_CHANGE(IDC_GOAL_NAME, OnChangeGoalName)
116  ON_BN_CLICKED(ID_OK, OnOk)
117  ON_WM_CLOSE()
118  ON_BN_CLICKED(IDC_GOAL_INVALID, OnGoalInvalid)
119  ON_EN_CHANGE(IDC_GOAL_SCORE, OnChangeGoalScore)
120  ON_BN_CLICKED(IDC_NO_MUSIC, OnNoMusic)
121  ON_CBN_SELCHANGE(IDC_OBJ_TEAM, OnSelchangeTeam)
122  //}}AFX_MSG_MAP
123 END_MESSAGE_MAP()
124 
126 // CMissionGoalsDlg message handlers
127 
128 // Initialization: sets up internal working copy of mission goals and goal trees.
129 void CMissionGoalsDlg::load_tree()
130 {
131  int i;
132 
133  m_goals_tree.select_sexp_node = select_sexp_node;
134  select_sexp_node = -1;
135 
136  m_goals_tree.clear_tree();
137  m_num_goals = Num_goals;
138  for (i=0; i<Num_goals; i++) {
139  m_goals[i] = Mission_goals[i];
140  m_sig[i] = i;
141  if (!(*m_goals[i].name))
142  strcpy_s(m_goals[i].name, "<unnamed>");
143 
144  m_goals[i].formula = m_goals_tree.load_sub_tree(Mission_goals[i].formula, true, "true");
145  }
146 
147  m_goals_tree.post_load();
148  cur_goal = -1;
149  update_cur_goal();
150 }
151 
152 // create the CTreeCtrl tree from the goal tree, filtering based on m_display_goal_types
154 {
155  int i;
156  HTREEITEM h;
157 
158  m_goals_tree.DeleteAllItems();
160  for (i=0; i<m_num_goals; i++) {
162  continue;
163 
165  m_goals_tree.SetItemData(h, m_goals[i].formula);
166  m_goals_tree.add_sub_tree(m_goals[i].formula, h);
167  }
168 
169  cur_goal = -1;
170  update_cur_goal();
171 }
172 
173 // Display goal types selection changed, so update the display
175 {
176  UpdateData(TRUE);
177  create_tree();
178 }
179 
180 // New tree item selected. Because goal info is displayed for the selected tree item,
181 // we need to update the display when this occurs.
182 void CMissionGoalsDlg::OnSelchangedGoalsTree(NMHDR* pNMHDR, LRESULT* pResult)
183 {
184  int i, z;
185  NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
186  HTREEITEM h, h2;
187 
188  h = pNMTreeView->itemNew.hItem;
189  if (!h)
190  return;
191 
193  while ((h2 = m_goals_tree.GetParentItem(h)) != 0)
194  h = h2;
195 
196  z = m_goals_tree.GetItemData(h);
197  for (i=0; i<m_num_goals; i++)
198  if (m_goals[i].formula == z)
199  break;
200 
201  Assert(i < m_num_goals);
202  cur_goal = i;
203  update_cur_goal();
204  *pResult = 0;
205 }
206 
207 // update display info to reflect the currently selected goal.
209 {
210  if (cur_goal < 0) {
211  m_name = _T("");
212  m_goal_desc = _T("");
213  m_goal_type = -1;
214  m_team = 0;
215  UpdateData(FALSE);
216  GetDlgItem(IDC_GOAL_TYPE_DROP) -> EnableWindow(FALSE);
217  GetDlgItem(IDC_GOAL_NAME) -> EnableWindow(FALSE);
218  GetDlgItem(IDC_GOAL_DESC) -> EnableWindow(FALSE);
219  GetDlgItem(IDC_GOAL_INVALID)->EnableWindow(FALSE);
220  GetDlgItem(IDC_GOAL_SCORE)->EnableWindow(FALSE);
221  GetDlgItem(IDC_NO_MUSIC)->EnableWindow(FALSE);
222  GetDlgItem(IDC_OBJ_TEAM)->EnableWindow(FALSE);
223 
224  UpdateData(FALSE);
225  return;
226  }
227 
228  m_name = _T(m_goals[cur_goal].name);
231  if ( m_goals[cur_goal].type & INVALID_GOAL ){
232  m_goal_invalid = 1;
233  } else {
234  m_goal_invalid = 0;
235  }
236 
238  m_no_music = 1;
239  } else {
240  m_no_music = 0;
241  }
242 
244 
246 
247  UpdateData(FALSE);
248  GetDlgItem(IDC_GOAL_TYPE_DROP) -> EnableWindow(TRUE);
249  GetDlgItem(IDC_GOAL_NAME) -> EnableWindow(TRUE);
250  GetDlgItem(IDC_GOAL_DESC) -> EnableWindow(TRUE);
251 // GetDlgItem(IDC_GOAL_RATING) -> EnableWindow(TRUE);
252  GetDlgItem(IDC_GOAL_INVALID)->EnableWindow(TRUE);
253  GetDlgItem(IDC_GOAL_SCORE)->EnableWindow(TRUE);
254  GetDlgItem(IDC_NO_MUSIC)->EnableWindow(TRUE);
255  GetDlgItem(IDC_OBJ_TEAM)->EnableWindow(FALSE);
257  GetDlgItem(IDC_OBJ_TEAM)->EnableWindow(TRUE);
258  }
259 
260  UpdateData(FALSE);
261 }
262 
263 // handler for context menu (i.e. a right mouse button click).
264 void CMissionGoalsDlg::OnRclickGoalsTree(NMHDR* pNMHDR, LRESULT* pResult)
265 {
267  *pResult = 0;
268 }
269 
270 // goal tree item label editing is requested. Determine if it should be allowed.
272 {
273  TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
274 
275  if (m_goals_tree.edit_label(pTVDispInfo->item.hItem) == 1) {
276  *pResult = 0;
277  modified = 1;
278  } else {
279  *pResult = 1;
280  }
281 }
282 
283 // Once we finish editing, we need to clean up, which we do here.
285 {
286  TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
287 
288  *pResult = m_goals_tree.end_label_edit(pTVDispInfo->item);
289 }
290 
292 {
293  HWND h;
294  CWnd *w;
295 
296  w = GetFocus();
297  if (w) {
298  h = w->m_hWnd;
299  GetDlgItem(IDC_GOALS_TREE)->SetFocus();
300  ::SetFocus(h);
301  }
302 }
303 
305 {
306  int i;
307 
308  if (modified)
309  return 1;
310 
311  if (Num_goals != m_num_goals)
312  return 1;
313 
314  for (i=0; i<Num_goals; i++) {
315  if (stricmp(Mission_goals[i].name, m_goals[i].name))
316  return 1;
317  if (stricmp(Mission_goals[i].message, m_goals[i].message))
318  return 1;
319  if (Mission_goals[i].type != m_goals[i].type)
320  return 1;
321  if ( Mission_goals[i].score != m_goals[i].score )
322  return 1;
323  if ( Mission_goals[i].team != m_goals[i].team )
324  return 1;
325  }
326 
327  return 0;
328 }
329 
331 {
332  char buf[256], names[2][MAX_GOALS][NAME_LENGTH];
333  int i, count;
334 
335  for (i=0; i<Num_goals; i++)
336  free_sexp2(Mission_goals[i].formula);
337 
338  UpdateData(TRUE);
339  if (query_modified())
340  set_modified();
341 
342  count = 0;
343  for (i=0; i<Num_goals; i++)
344  Mission_goals[i].satisfied = 0; // use this as a processed flag
345 
346  // rename all sexp references to old events
347  for (i=0; i<m_num_goals; i++)
348  if (m_sig[i] >= 0) {
349  strcpy_s(names[0][count], Mission_goals[m_sig[i]].name);
350  strcpy_s(names[1][count], m_goals[i].name);
351  count++;
353  }
354 
355  // invalidate all sexp references to deleted events.
356  for (i=0; i<Num_goals; i++)
357  if (!Mission_goals[i].satisfied) {
358  sprintf(buf, "<%s>", Mission_goals[i].name);
359  strcpy(buf + NAME_LENGTH - 2, ">"); // force it to be not too long
360  strcpy_s(names[0][count], Mission_goals[i].name);
361  strcpy_s(names[1][count], buf);
362  count++;
363  }
364 
365  Num_goals = m_num_goals;
366  for (i=0; i<Num_goals; i++) {
367  Mission_goals[i] = m_goals[i];
370  Assert( Mission_goals[i].team != -1 );
371  }
372  }
373 
374  // now update all sexp references
375  while (count--)
376  update_sexp_references(names[0][count], names[1][count], OPF_GOAL_NAME);
377 
379  CDialog::OnOK();
380 }
381 
383 {
384  int index;
385  HTREEITEM h;
386 
388  m_goals[m_num_goals].type = m_display_goal_types; // this also marks the goal as valid since bit not set
389  m_sig[m_num_goals] = -1;
390  strcpy_s(m_goals[m_num_goals].name, "Goal name");
391  strcpy_s(m_goals[m_num_goals].message, "Mission goal text");
393 
395  m_goals_tree.add_operator("true", h);
398  m_goals_tree.SetItemData(h, index);
399 
400  // team defaults to the first team.
401  m_goals[m_num_goals].team = 0;
402 
403  m_num_goals++;
404 
405  if (m_num_goals >= MAX_GOALS){
406  GetDlgItem(IDC_BUTTON_NEW_GOAL)->EnableWindow(FALSE);
407  }
408 
409  m_goals_tree.SelectItem(h);
410 }
411 
412 int CMissionGoalsDlg::handler(int code, int node)
413 {
414  int goal;
415 
416  switch (code) {
417  case ROOT_DELETED:
418  for (goal=0; goal<m_num_goals; goal++){
419  if (m_goals[goal].formula == node){
420  break;
421  }
422  }
423 
424  Assert(goal < m_num_goals);
425  while (goal < m_num_goals - 1) {
426  m_goals[goal] = m_goals[goal + 1];
427  m_sig[goal] = m_sig[goal + 1];
428  goal++;
429  }
430  m_num_goals--;
431  GetDlgItem(IDC_BUTTON_NEW_GOAL)->EnableWindow(TRUE);
432  return node;
433 
434  default:
435  Int3();
436  }
437 
438  return -1;
439 }
440 
442 {
443  if (cur_goal < 0){
444  return;
445  }
446 
447  UpdateData(TRUE);
449 }
450 
452 {
453  if (cur_goal < 0){
454  return;
455  }
456 
457  UpdateData(TRUE);
458 }
459 
461 {
462  HTREEITEM h, h2;
463  int otype;
464 
465  if (cur_goal < 0){
466  return;
467  }
468 
469  UpdateData(TRUE);
470  UpdateData(TRUE); // doesn't seem to update unless we do it twice..
471 
472  // change the type being sure to keep the invalid bit if set
473  otype = m_goals[cur_goal].type;
475  if ( otype & INVALID_GOAL ){
477  }
478 
479  h = m_goals_tree.GetSelectedItem();
480  Assert(h);
481  while ((h2 = m_goals_tree.GetParentItem(h)) != 0){
482  h = h2;
483  }
484 
485  m_goals_tree.DeleteItem(h);
486  cur_goal = -1;
487  update_cur_goal();
488 }
489 
491 {
492  HTREEITEM h, h2;
493 
494  if (cur_goal < 0){
495  return;
496  }
497 
498  UpdateData(TRUE);
499  h = m_goals_tree.GetSelectedItem();
500  if (!h){
501  return;
502  }
503 
504  while ((h2 = m_goals_tree.GetParentItem(h)) != 0){
505  h = h2;
506  }
507 
508  m_goals_tree.SetItemText(h, m_name);
510 }
511 
513 {
515  CDialog::OnCancel();
516 }
517 
519 {
520  int z;
521 
522  if (query_modified()) {
523  z = MessageBox("Do you want to keep your changes?", "Close", MB_ICONQUESTION | MB_YESNOCANCEL);
524  if (z == IDCANCEL)
525  return;
526 
527  if (z == IDYES) {
528  OnOk();
529  return;
530  }
531  }
532 
533  CDialog::OnClose();
534 }
535 
536 void CMissionGoalsDlg::insert_handler(int old, int node)
537 {
538  int i;
539 
540  for (i=0; i<m_num_goals; i++){
541  if (m_goals[i].formula == old){
542  break;
543  }
544  }
545 
546  Assert(i < m_num_goals);
547  m_goals[i].formula = node;
548  return;
549 }
550 
552 {
553  if ( cur_goal < 0 ){
554  return;
555  }
556 
559  UpdateData(TRUE);
560 }
561 
563 {
564  if (cur_goal < 0){
565  return;
566  }
567 
570  UpdateData(TRUE);
571 }
572 
573 void CMissionGoalsDlg::swap_handler(int node1, int node2)
574 {
575  int index1, index2;
576  mission_goal m;
577 
578  for (index1=0; index1<m_num_goals; index1++){
579  if (m_goals[index1].formula == node1){
580  break;
581  }
582  }
583 
584  Assert(index1 < m_num_goals);
585  for (index2=0; index2<m_num_goals; index2++){
586  if (m_goals[index2].formula == node2){
587  break;
588  }
589  }
590 
591  Assert(index2 < m_num_goals);
592  m = m_goals[index1];
593 // m_goals[index1] = m_goals[index2];
594  while (index1 < index2) {
595  m_goals[index1] = m_goals[index1 + 1];
596  m_sig[index1] = m_sig[index1 + 1];
597  index1++;
598  }
599 
600  while (index1 > index2 + 1) {
601  m_goals[index1] = m_goals[index1 - 1];
602  m_sig[index1] = m_sig[index1 - 1];
603  index1--;
604  }
605 
606  m_goals[index1] = m;
607 }
608 
610 {
611  if (cur_goal < 0){
612  return;
613  }
614 
615  UpdateData(TRUE);
617 }
618 
619 
620 // code when the "team" selection in the combo box changes
622 {
623  if ( cur_goal < 0 ){
624  return;
625  }
626 
627  UpdateData(TRUE);
629 }
void record_window_data(window_data *wndd, CWnd *wnd)
Definition: fred.cpp:670
#define IDC_NO_MUSIC
Definition: resource.h:920
int handler(int code, int goal)
#define IDC_GOAL_TYPE_DROP
Definition: resource.h:514
void * HWND
Definition: config.h:104
int i
Definition: multi_pxo.cpp:466
CFREDApp theApp
Definition: fred.cpp:115
#define IDC_GOAL_NAME
Definition: resource.h:765
GLfloat GLfloat GLfloat GLfloat h
Definition: Glext.h:7280
void add_sub_tree(int node, HTREEITEM root)
Definition: sexp_tree.cpp:476
int game_type
Definition: missionparse.h:138
void reset_handles()
Definition: sexp_tree.cpp:115
afx_msg void OnButtonNewGoal()
afx_msg void OnGoalInvalid()
GLuint index
Definition: Glext.h:5608
#define IDC_HELP_BOX
Definition: resource.h:872
afx_msg void OnOk()
void insert_handler(int old, int node)
#define IDC_GOAL_SCORE
Definition: resource.h:773
Assert(pm!=NULL)
int init_window(window_data *wndd, CWnd *wnd, int adjust=0, int pre=0)
Definition: fred.cpp:639
GLuint GLuint * names
Definition: Glext.h:11016
afx_msg void OnSelchangeDisplayGoalTypesDrop()
#define MB_ICONQUESTION
Definition: config.h:188
CButton * team
void link_modified(int *ptr)
Definition: sexp_tree.cpp:3156
void update_sexp_references(const char *old_name, const char *new_name, int format, int node)
Definition: sexp.cpp:28332
#define TRUE
Definition: pstypes.h:399
void setup(CEdit *ptr=NULL)
Definition: sexp_tree.cpp:3754
int edit_label(HTREEITEM h)
Definition: sexp_tree.cpp:1349
GLenum GLuint GLenum GLsizei const GLchar * message
Definition: Glext.h:5156
#define MB_YESNOCANCEL
Definition: config.h:183
#define Int3()
Definition: pstypes.h:292
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: Glext.h:7308
virtual void DoDataExchange(CDataExchange *pDX)
mission_goal Mission_goals[MAX_GOALS]
void right_clicked(int mode=0)
Definition: sexp_tree.cpp:570
GLenum type
Definition: Gl.h:1492
window_data Messages_wnd_data
Definition: fred.cpp:66
HWND DWORD code
Definition: vddraw.h:425
window_data Mission_goals_wnd_data
Definition: fred.cpp:65
#define INVALID_GOAL
Definition: missiongoals.h:33
void update_help(HTREEITEM h)
Definition: sexp_tree.cpp:3891
#define ID_OK
Definition: resource.h:833
#define MAX_GOALS
Definition: missiongoals.h:23
int end_label_edit(TVITEMA &item)
Definition: sexp_tree.cpp:1412
#define w(p)
Definition: modelsinc.h:68
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
GLdouble GLdouble z
Definition: Glext.h:5451
int free_sexp2(int num)
Definition: sexp.cpp:1321
afx_msg void OnBeginlabeleditGoalsTree(NMHDR *pNMHDR, LRESULT *pResult)
mission_goal m_goals[MAX_GOALS]
#define OPF_GOAL_NAME
Definition: sexp.h:47
goal_sexp_tree m_goals_tree
afx_msg void OnEndlabeleditGoalsTree(NMHDR *pNMHDR, LRESULT *pResult)
#define MGF_NO_MUSIC
Definition: missiongoals.h:52
HTREEITEM insert(LPCTSTR lpszItem, int image=BITMAP_ROOT, int sel_image=BITMAP_ROOT, HTREEITEM hParent=TVI_ROOT, HTREEITEM hInsertAfter=TVI_LAST)
Definition: sexp_tree.cpp:3832
#define GOAL_TYPE_MASK
Definition: missiongoals.h:34
void string_copy(char *dest, const CString &src, int max_len, int modify)
Definition: management.cpp:142
#define ROOT_DELETED
Definition: sexp_tree.h:71
#define IDC_DISPLAY_GOAL_TYPES_DROP
Definition: resource.h:511
int m_mode
Definition: sexp_tree.h:281
#define MAX_GOAL_TEXT
Definition: missiongoals.h:50
GLbitfield flags
Definition: Glext.h:6722
void set_modified(BOOL arg)
Definition: freddoc.cpp:676
GLuint const GLchar * name
Definition: Glext.h:5608
int BOOL
Definition: config.h:80
afx_msg void OnSelchangeGoalTypeDrop()
#define IDC_BUTTON_NEW_GOAL
Definition: resource.h:515
CMissionGoalsDlg * Goal_editor_dlg
afx_msg void OnChangeGoalDesc()
void swap_handler(int node1, int node2)
#define NAME_LENGTH
Definition: globals.h:15
void add_operator(const char *op, HTREEITEM h=TVI_ROOT)
Definition: sexp_tree.cpp:2906
afx_msg void OnChangeGoalName()
int m_sig[MAX_GOALS]
#define IDC_GOAL_RATING
Definition: resource.h:513
int save_tree(int node=-1)
Definition: sexp_tree.cpp:237
long LRESULT
Definition: config.h:100
CMissionGoalsDlg(CWnd *pParent=NULL)
afx_msg void OnClose()
int MessageBox(HWND h, const char *s1, const char *s2, int i)
afx_msg void OnChangeGoalRating()
afx_msg void OnRclickGoalsTree(NMHDR *pNMHDR, LRESULT *pResult)
afx_msg void OnNoMusic()
const GLfloat * m
Definition: Glext.h:10319
afx_msg void OnSelchangeTeam()
GLint GLsizei count
Definition: Gl.h:1491
void hilite_item(int node)
Definition: sexp_tree.cpp:3139
int select_sexp_node
Definition: sexp_tree.h:283
#define IDC_GOAL_DESC
Definition: resource.h:512
mission The_mission
#define IDC_GOAL_INVALID
Definition: resource.h:186
int Num_goals
#define SEXP_HELP_BOX_SIZE
Definition: fredview.h:18
#define FALSE
Definition: pstypes.h:400
afx_msg void OnChangeGoalScore()
int Show_sexp_help
Definition: fredview.cpp:87
#define stricmp(s1, s2)
Definition: config.h:271
int item_index
Definition: sexp_tree.h:282
#define MODE_GOALS
Definition: sexp_tree.h:66
#define IDC_GOALS_TREE
Definition: resource.h:510
#define strcpy_s(...)
Definition: safe_strings.h:67
#define IDC_OBJ_TEAM
Definition: resource.h:965
afx_msg void OnSelchangedGoalsTree(NMHDR *pNMHDR, LRESULT *pResult)
#define MISSION_TYPE_MULTI_TEAMS
Definition: missionparse.h:65