FS2_Open
Open source remastering of the Freespace 2 engine
messageeditordlg.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 "MessageEditorDlg.h"
15 #include "FREDDoc.h"
16 #include "Management.h"
17 #include "Sexp_tree.h"
18 #include "EventEditor.h"
19 #include "mission/missionmessage.h"
20 
21 #ifdef _DEBUG
22 #undef THIS_FILE
23 static char THIS_FILE[] = __FILE__;
24 #endif
25 
26 
27 // aww mumford
28 bool is_blank_argument_op(int op_const);
29 
30 
32 
34 // CMessageEditorDlg dialog
35 
36 CMessageEditorDlg::CMessageEditorDlg(CWnd* pParent /*=NULL*/)
37  : CDialog(CMessageEditorDlg::IDD, pParent)
38 {
39  //{{AFX_DATA_INIT(CMessageEditorDlg)
40  m_avi_filename = _T("");
41  m_wave_filename = _T("");
42  m_message_text = _T("");
43  m_message_name = _T("");
44  m_cur_msg = -1;
45  m_priority = -1;
46  m_sender = -1;
47  m_persona = -1;
48  //}}AFX_DATA_INIT
49 
51  modified = 0;
52  m_event_num = -1;
53 }
54 
55 void CMessageEditorDlg::DoDataExchange(CDataExchange* pDX)
56 {
57  CDialog::DoDataExchange(pDX);
58  //{{AFX_DATA_MAP(CMessageEditorDlg)
59  DDX_Control(pDX, IDC_TREE, m_tree);
60  DDX_CBString(pDX, IDC_AVI_FILENAME, m_avi_filename);
61  DDX_CBString(pDX, IDC_WAVE_FILENAME, m_wave_filename);
62  DDX_Text(pDX, IDC_MESSAGE_TEXT, m_message_text);
63  DDX_Text(pDX, IDC_NAME, m_message_name);
64  DDX_LBIndex(pDX, IDC_MESSAGE_LIST, m_cur_msg);
65  DDX_CBIndex(pDX, IDC_PRIORITY, m_priority);
66  DDX_CBIndex(pDX, IDC_SENDER, m_sender);
67  DDX_CBIndex(pDX, IDC_PERSONA_NAME, m_persona);
68  //}}AFX_DATA_MAP
69  DDV_MaxChars(pDX, m_message_name, NAME_LENGTH - 1);
70  DDV_MaxChars(pDX, m_message_text, MESSAGE_LENGTH - 1);
71  DDV_MaxChars(pDX, m_avi_filename, MAX_FILENAME_LEN - 1);
72  DDV_MaxChars(pDX, m_wave_filename, MAX_FILENAME_LEN - 1);
73 }
74 
75 BEGIN_MESSAGE_MAP(CMessageEditorDlg, CDialog)
76  //{{AFX_MSG_MAP(CMessageEditorDlg)
77  ON_LBN_SELCHANGE(IDC_MESSAGE_LIST, OnSelchangeMessageList)
78  ON_EN_UPDATE(IDC_NAME, OnUpdateName)
79  ON_BN_CLICKED(IDC_DELETE, OnDelete)
80  ON_BN_CLICKED(IDC_NEW, OnNew)
81  ON_WM_CLOSE()
82  ON_BN_CLICKED(IDC_BROWSE_AVI, OnBrowseAvi)
83  ON_BN_CLICKED(IDC_BROWSE_WAVE, OnBrowseWave)
84  ON_NOTIFY(NM_RCLICK, IDC_TREE, OnRclickTree)
85  ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE, OnBeginlabeleditTree)
86  ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE, OnEndlabeleditTree)
87  ON_BN_CLICKED(ID_OK, OnOk)
88  //}}AFX_MSG_MAP
89 END_MESSAGE_MAP()
90 
92 // CMessageEditorDlg message handlers
93 
94 BOOL CMessageEditorDlg::OnInitDialog()
95 {
96  int i;
97  CListBox *list;
98  CComboBox *box;
99 
100  CDialog::OnInitDialog();
102  m_tree.setup();
103 
104  ((CEdit *) GetDlgItem(IDC_NAME))->LimitText(NAME_LENGTH - 1);
105  ((CEdit *) GetDlgItem(IDC_MESSAGE_TEXT))->LimitText(MESSAGE_LENGTH - 1);
106  ((CComboBox *) GetDlgItem(IDC_AVI_FILENAME))->LimitText(MAX_FILENAME_LEN - 1);
107  ((CComboBox *) GetDlgItem(IDC_WAVE_FILENAME))->LimitText(MAX_FILENAME_LEN - 1);
108 
109  list = (CListBox *) GetDlgItem(IDC_MESSAGE_LIST);
110  list->ResetContent();
111  for (i=0; i<Num_messages; i++) {
112  //Assert(list->FindStringExact(-1, Messages[i].name) == CB_ERR);
113  // mwa we should probably not include builtin messages into this list!
114  list->AddString(Messages[i].name);
115  }
116 
117  box = (CComboBox *) GetDlgItem(IDC_AVI_FILENAME);
118  for (i=0; i<Num_messages; i++)
119  if (Messages[i].avi_info.name)
120  if (box->FindStringExact(-1, Messages[i].avi_info.name) == CB_ERR)
121  box->AddString(Messages[i].avi_info.name);
122 
123  box = (CComboBox *) GetDlgItem(IDC_WAVE_FILENAME);
124  for (i=0; i<Num_messages; i++)
125  if (Messages[i].wave_info.name)
126  if (box->FindStringExact(i, Messages[i].wave_info.name) == CB_ERR)
127  box->AddString(Messages[i].wave_info.name);
128 
129  // add the persona names into the combo box
130  box = (CComboBox *)GetDlgItem(IDC_PERSONA_NAME);
131  box->ResetContent();
132  box->AddString("<None>");
133  for (i = 0; i < Num_personas; i++ )
134  box->AddString( Personas[i].name );
135 
136  box = (CComboBox *) GetDlgItem(IDC_SENDER);
137  for (i=0; i<MAX_SHIPS; i++)
138  if ((Ships[i].objnum >= 0) && (Objects[Ships[i].objnum].type == OBJ_SHIP))
139  box->AddString(Ships[i].ship_name);
140 
141  for (i=0; i<MAX_WINGS; i++)
142  if (Wings[i].wave_count)
143  box->AddString(Wings[i].name);
144 
145  box->AddString("<Any wingman>");
146 
147  // MWA 4/7/98 -- removed any allied
148  //box->AddString("<Any allied>");
149 
150  // set the first message to be the first non-builtin message (if it exists)
151  if ( Num_messages > Num_builtin_messages )
152  m_cur_msg = Num_builtin_messages;
153  else if (Num_messages)
154  m_cur_msg = 0;
155  else
156  m_cur_msg = -1;
157 
158  update_cur_message();
159  return TRUE;
160 }
161 
163 {
164  char *ptr, buf[MESSAGE_LENGTH];
165  int i;
166 
167  UpdateData(TRUE);
168  if (modified)
169  return 1;
170 
171  if (m_cur_msg < 0)
172  return 0;
173 
174  ptr = (char *) (LPCTSTR) m_message_name;
175  for (i=0; i<Num_messages; i++)
176  if ((i != m_cur_msg) && (!stricmp(ptr, Messages[i].name)))
177  break;
178 
179  if (i < Num_messages)
180  if (stricmp(ptr, Messages[m_cur_msg].name))
181  return 1; // name is different and allowed to update
182 
184  if (stricmp(buf, Messages[m_cur_msg].message))
185  return 1;
186 
187  ptr = (char *) (LPCTSTR) m_avi_filename;
188  if (advanced_stricmp(ptr, Messages[m_cur_msg].avi_info.name))
189  return 1;
190 
191  ptr = (char *) (LPCTSTR) m_wave_filename;
192  if (advanced_stricmp(ptr, Messages[m_cur_msg].wave_info.name))
193  return 1;
194 
195  // check to see if persona changed. use -1 since we stuck a "None" for persona
196  // at the beginning of the list.
197  if ( (m_persona - 1 ) != Messages[m_cur_msg].persona_index )
198  return 1;
199 
200  if (m_tree.query_false()) {
201  if (m_event_num >= 0)
202  return 1;
203 
204  } else {
205  if (m_event_num < 0)
206  return 1;
207  }
208 
209  return 0;
210 }
211 
213 {
214 }
215 
217 {
218  update(m_cur_msg);
220  delete Message_editor_dlg;
221  Message_editor_dlg = NULL;
222 }
223 
225 {
227  delete Message_editor_dlg;
228  Message_editor_dlg = NULL;
229 }
230 
231 // load controls with structure data
233 {
234  int node, enable = TRUE, enable2 = TRUE;
235 
236  if (m_cur_msg < 0)
237  {
238  enable = enable2 = FALSE;
239  m_message_name = _T("");
240  m_message_text = _T("");
241  m_avi_filename = _T("");
242  m_wave_filename = _T("");
243  m_tree.clear_tree();
244  m_persona = 0;
245  m_sender = m_priority = -1;
246 
247  } else {
249  m_message_text = Messages[m_cur_msg].message;
250  if (Messages[m_cur_msg].avi_info.name)
251  m_avi_filename = _T(Messages[m_cur_msg].avi_info.name);
252  else
253  m_avi_filename = _T("");
254 
255  if (Messages[m_cur_msg].wave_info.name)
256  m_wave_filename = _T(Messages[m_cur_msg].wave_info.name);
257  else
258  m_wave_filename = _T("");
259 
260  // add persona id
261  if ( Messages[m_cur_msg].persona_index != -1 )
262  m_persona = Messages[m_cur_msg].persona_index + 1; // add one for the "none" at the beginning of the list
263  else
264  m_persona = 0;
265 
267  if (m_event_num < 0) {
268  node = -1;
269  m_sender = m_priority = 0;
270 
271  } else
272  node = CADR(Mission_events[m_event_num].formula);
273 
274  m_tree.load_tree(node, "false");
275  }
276 
278  enable = FALSE;
279 
280  GetDlgItem(IDC_NAME)->EnableWindow(enable);
281  GetDlgItem(IDC_MESSAGE_TEXT)->EnableWindow(enable);
282  GetDlgItem(IDC_AVI_FILENAME)->EnableWindow(enable);
283  GetDlgItem(IDC_WAVE_FILENAME)->EnableWindow(enable);
284  GetDlgItem(IDC_DELETE)->EnableWindow(enable);
285  GetDlgItem(IDC_TREE)->EnableWindow(enable2);
286  GetDlgItem(IDC_SENDER)->EnableWindow(enable2);
287  GetDlgItem(IDC_PRIORITY)->EnableWindow(enable2);
288  GetDlgItem(IDC_PERSONA_NAME)->EnableWindow(enable);
289  UpdateData(FALSE);
290 }
291 
293 {
294  char *str;
295  int i, formula, node;
296  CComboBox *box;
297 
298  for (i=0; i<Num_mission_events; i++) {
299  node = Mission_events[i].formula;
300  Assertion(node >= 0, "Can't have a formula point to sexp node -1!");
301 
305  {
306  // Goober5000 - the bool part of the *-argument conditional starts at the second, not first, argument
308  node = CDR(node);
309 
310  node = CDR(node);
311  formula = CAR(node); // bool conditional
312  if (CDR(CDR(node)) == -1) { // only 1 action
313  node = CADR(node);
314  if ((get_operator_const(CTEXT(node)) == OP_SEND_MESSAGE) && !stricmp(CTEXT(CDR(CDR(CDR(node)))), m_message_name)) {
315  box = (CComboBox *) GetDlgItem(IDC_SENDER);
316  str = CTEXT(CDR(node));
317  m_sender = box->FindStringExact(-1, str);
318  if (m_sender == CB_ERR)
319  m_sender = 0;
320 
321  box = (CComboBox *) GetDlgItem(IDC_PRIORITY);
322  str = CTEXT(CDR(CDR(node)));
323  m_priority = box->FindStringExact(-1, str);
324  if (m_priority == CB_ERR)
325  m_priority = 0;
326 
327  return i;
328  }
329  }
330  }
331  }
332 
333  m_sender = m_priority = 0;
334  return -1;
335 }
336 
338 {
339  int old = m_cur_msg;
340  static int flag = 0;
341 
342  if (flag)
343  return;
344 
345  if (update(m_cur_msg)) {
346  flag = 1;
347  ((CListBox *) GetDlgItem(IDC_MESSAGE_LIST)) -> SetCurSel(old);
348  m_cur_msg = old;
349  flag = 0;
350  return;
351  }
352 
354 }
355 
357 {
358 }
359 
361 {
362  char *ptr;
363  int i, node, fnode;
364  CString buf;
365  CListBox *list;
366 
367  UpdateData(TRUE);
368  if (num >= 0)
369  {
370  ptr = (char *) (LPCTSTR) m_message_name;
371  for (i=0; i<Num_messages; i++)
372  if ((i != num) && (!stricmp(m_message_name, Messages[i].name)))
373  break;
374 
375  if (i == Num_messages) { // update name if no conflicts, otherwise keep old name
379 
380  list = (CListBox *) GetDlgItem(IDC_MESSAGE_LIST);
381  list->DeleteString(num);
382  list->InsertString(num, m_message_name);
383  }
384 
386  if (Messages[num].avi_info.name)
387  free(Messages[num].avi_info.name);
388 
389  ptr = (char *) (LPCTSTR) m_avi_filename;
390  if (!ptr || !strlen(ptr))
391  Messages[num].avi_info.name = NULL;
392  else
393  Messages[num].avi_info.name = strdup(ptr);
394 
395  if (Messages[num].wave_info.name)
396  free(Messages[num].wave_info.name);
397 
398  ptr = (char *) (LPCTSTR) m_wave_filename;
399  if (!ptr || !strlen(ptr))
400  Messages[num].wave_info.name = NULL;
401  else
402  Messages[num].wave_info.name = strdup(ptr);
403 
404  // update the persona to the message. We subtract 1 for the "None" at the beginning of the combo
405  // box list.
406  Messages[num].persona_index = m_persona - 1;
407 
408  if (m_tree.query_false()) {
409  if (m_event_num >= 0) { // need to delete event
410  i = m_event_num;
411  free_sexp2(Mission_events[i].formula);
413  while (i < Num_mission_events - 1) {
414  Mission_events[i] = Mission_events[i + 1];
415  i++;
416  }
417 
419  m_event_num = -1;
420  }
421 
422  } else {
423  if (m_event_num >= 0)
425 
426  else {
428  MessageBox("You have reached the limit on mission events.\n"
429  "Can't add an event to send this message.");
430 
431  goto exit;
432  }
433 
443  }
444 
445  fnode = m_tree.save_tree();
446  ptr = (char *) (LPCTSTR) m_message_name;
447  node = alloc_sexp(ptr, SEXP_ATOM, SEXP_ATOM_STRING, -1, -1);
448  ((CComboBox *) GetDlgItem(IDC_PRIORITY))->GetLBText(m_priority, buf);
449  node = alloc_sexp((char *) (LPCTSTR) buf, SEXP_ATOM, SEXP_ATOM_STRING, -1, node);
450  ((CComboBox *) GetDlgItem(IDC_SENDER))->GetLBText(m_sender, buf);
451  node = alloc_sexp((char *) (LPCTSTR) buf, SEXP_ATOM, SEXP_ATOM_STRING, -1, node);
452  node = alloc_sexp("send-message", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, node);
453  node = alloc_sexp("", SEXP_LIST, SEXP_ATOM_LIST, node, -1);
454  node = alloc_sexp("", SEXP_LIST, SEXP_ATOM_LIST, fnode, node);
455  node = alloc_sexp("when", SEXP_ATOM, SEXP_ATOM_OPERATOR, -1, node);
457  }
458  }
459 
460 exit:
461  if (query_modified())
462  set_modified();
463 
464  modified = 0;
465  return 0;
466 }
467 
469 {
470  char buf[256];
471  int i;
472 
473  Assert((m_cur_msg >= 0) && (m_cur_msg < Num_messages));
474  if (Messages[m_cur_msg].avi_info.name)
475  free(Messages[m_cur_msg].avi_info.name);
476  if (Messages[m_cur_msg].wave_info.name)
477  free(Messages[m_cur_msg].wave_info.name);
478 
479  ((CListBox *) GetDlgItem(IDC_MESSAGE_LIST))->DeleteString(m_cur_msg);
480  sprintf(buf, "<%s>", Messages[m_cur_msg].name);
481  update_sexp_references(Messages[m_cur_msg].name, buf, OPF_MESSAGE);
483 
484  for (i=m_cur_msg; i<Num_messages-1; i++)
485  Messages[i] = Messages[i + 1];
486 
487  Num_messages--;
488  if (m_cur_msg >= Num_messages)
489  m_cur_msg = Num_messages - 1;
490 
491  GetDlgItem(IDC_NEW)->EnableWindow(TRUE);
492  modified = 1;
494 }
495 
497 {
498  if (update(m_cur_msg))
499  return;
500 
501  strcpy_s(Messages[Num_messages].name, "<new message>");
502  ((CListBox *) GetDlgItem(IDC_MESSAGE_LIST))->AddString("<new message>");
503 
504  strcpy_s(Messages[Num_messages].message, "<put description here>");
505  Messages[Num_messages].avi_info.name = NULL;
506  Messages[Num_messages].wave_info.name = NULL;
507  Messages[Num_messages].persona_index = -1;
509 
510  modified = 1;
512 }
513 
515 {
516  int z;
517 
519  if (modified) {
520  z = MessageBox("Do you want to keep your changes?", "Close", MB_ICONQUESTION | MB_YESNOCANCEL);
521  if (z == IDCANCEL)
522  return;
523 
524  if (z == IDYES) {
525  OnOK();
526  return;
527  }
528  }
529 
531  delete Message_editor_dlg;
532  Message_editor_dlg = NULL;
533 }
534 
536 {
537  CString name;
538 
539  UpdateData(TRUE);
540  CFileDialog dlg(TRUE, "ani", m_avi_filename, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,
541  "Ani Files (*.ani)|*.ani|Avi Files (*.avi)|*.avi|Both (*.ani, *.avi)|*.ani;*.avi||");
542 
543  if (dlg.DoModal() == IDOK)
544  {
545  m_avi_filename = dlg.GetFileName();
546  UpdateData(FALSE);
547  modified = 1;
548  }
549 }
550 
552 {
553  CString name;
554 
555  UpdateData(TRUE);
556  CFileDialog dlg(TRUE, "wav", m_wave_filename, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,
557  "Voice Files (*.ogg, *.wav)|*.ogg;*.wav|Ogg Vorbis Files (*.ogg)|*.ogg|Wave Files (*.wav)|*.wav||");
558 
559  if (dlg.DoModal() == IDOK)
560  {
561  m_wave_filename = dlg.GetFileName();
562  UpdateData(FALSE);
563  modified = 1;
564  }
565 }
566 
567 void CMessageEditorDlg::OnRclickTree(NMHDR* pNMHDR, LRESULT* pResult)
568 {
570  *pResult = 0;
571 }
572 
573 void CMessageEditorDlg::OnBeginlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult)
574 {
575  TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
576  CEdit *edit;
577 
578  if (m_tree.edit_label(pTVDispInfo->item.hItem) == 1) {
579  *pResult = 0;
580  modified = 1;
581  edit = m_tree.GetEditControl();
582  Assert(edit);
583  edit->SetLimitText(NAME_LENGTH - 1);
584 
585  } else
586  *pResult = 1;
587 }
588 
589 void CMessageEditorDlg::OnEndlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult)
590 {
591  TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
592 
593  *pResult = m_tree.end_label_edit(pTVDispInfo->item);
594 }
void record_window_data(window_data *wndd, CWnd *wnd)
Definition: fred.cpp:670
#define IDC_PRIORITY
Definition: resource.h:649
#define MAX_FILENAME_LEN
Definition: pstypes.h:324
wing Wings[MAX_WINGS]
Definition: ship.cpp:128
int i
Definition: multi_pxo.cpp:466
CFREDApp theApp
Definition: fred.cpp:115
CMessageEditorDlg * Message_editor_dlg
int Num_mission_events
#define SEXP_ATOM_OPERATOR
Definition: sexp.h:911
int objnum
Definition: ship.h:537
#define IDC_NAME
Definition: resource.h:735
#define OP_IF_THEN_ELSE
Definition: sexp.h:408
bool is_blank_argument_op(int op_const)
Definition: sexp.cpp:9167
#define CAR(n)
Definition: sexp.h:820
#define OP_EVERY_TIME
Definition: sexp.h:394
virtual void DoDataExchange(CDataExchange *pDX)
#define MAX_WINGS
Definition: globals.h:50
#define MAX_SHIPS
Definition: globals.h:37
#define IDC_MESSAGE_LIST
Definition: resource.h:703
Assert(pm!=NULL)
int init_window(window_data *wndd, CWnd *wnd, int adjust=0, int pre=0)
Definition: fred.cpp:639
#define IDC_DELETE
Definition: resource.h:560
char * CTEXT(int n)
Definition: sexp.cpp:28821
#define MB_ICONQUESTION
Definition: config.h:188
#define SEXP_LIST
Definition: sexp.h:863
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
#define OP_SEND_MESSAGE
Definition: sexp.h:418
#define Assertion(expr, msg,...)
Definition: clang.h:41
int alloc_sexp(char *text, int type, int subtype, int first, int rest)
Definition: sexp.cpp:1123
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 IDC_NEW
Definition: resource.h:710
afx_msg void OnClose()
#define CADR(n)
Definition: sexp.h:822
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: Glext.h:7308
afx_msg void OnBrowseAvi()
#define IDC_BROWSE_WAVE
Definition: resource.h:859
void right_clicked(int mode=0)
Definition: sexp_tree.cpp:570
#define IDC_AVI_FILENAME
Definition: resource.h:640
char * objective_text
Definition: missiongoals.h:112
window_data Messages_wnd_data
Definition: fred.cpp:66
#define IDC_PERSONA_NAME
Definition: resource.h:527
#define CDR(n)
Definition: sexp.h:821
SCP_vector< MMessage > Messages
afx_msg void OnBrowseWave()
#define IDC_TREE
Definition: resource.h:704
#define ID_OK
Definition: resource.h:833
#define OP_WHEN_ARGUMENT
Definition: sexp.h:393
CMessageEditorDlg(CWnd *pParent=NULL)
int end_label_edit(TVITEMA &item)
Definition: sexp_tree.cpp:1412
afx_msg void OnBeginlabeleditTree(NMHDR *pNMHDR, LRESULT *pResult)
mission_event Mission_events[MAX_MISSION_EVENTS]
Persona * Personas
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
#define IDC_SENDER
Definition: resource.h:578
#define OPF_MESSAGE_OR_STRING
Definition: sexp.h:105
#define OP_PERFORM_ACTIONS
Definition: sexp.h:257
afx_msg void OnRclickTree(NMHDR *pNMHDR, LRESULT *pResult)
afx_msg void OnUpdateName()
afx_msg void OnSelchangeMessageList()
#define IDC_WAVE_FILENAME
Definition: resource.h:585
object Objects[MAX_OBJECTS]
Definition: object.cpp:62
#define MESSAGE_LENGTH
Definition: globals.h:23
void string_copy(char *dest, const CString &src, int max_len, int modify)
Definition: management.cpp:142
#define OBJ_SHIP
Definition: object.h:32
char name[NAME_LENGTH]
void set_modified(BOOL arg)
Definition: freddoc.cpp:676
GLuint const GLchar * name
Definition: Glext.h:5608
int Num_builtin_messages
GLboolean enable
Definition: Glext.h:10591
int Num_personas
int BOOL
Definition: config.h:80
#define IDC_BROWSE_AVI
Definition: resource.h:858
ship Ships[MAX_SHIPS]
Definition: ship.cpp:122
afx_msg void OnNew()
GLuint GLuint num
Definition: Glext.h:9089
#define OP_EVERY_TIME_ARGUMENT
Definition: sexp.h:395
#define NAME_LENGTH
Definition: globals.h:15
#define IDC_MESSAGE_TEXT
Definition: resource.h:705
#define SEXP_ATOM
Definition: sexp.h:864
int save_tree(int node=-1)
Definition: sexp_tree.cpp:237
long LRESULT
Definition: config.h:100
int Num_messages
#define OP_WHEN
Definition: sexp.h:392
int MessageBox(HWND h, const char *s1, const char *s2, int i)
int get_operator_const(const char *token)
Definition: sexp.cpp:1595
#define SEXP_ATOM_LIST
Definition: sexp.h:910
char * objective_key_text
Definition: missiongoals.h:113
void load_tree(int index, const char *deflt="true")
Definition: sexp_tree.cpp:124
#define MAX_MISSION_EVENTS
Definition: missiongoals.h:71
#define OPF_MESSAGE
Definition: sexp.h:40
int query_false(int node=-1)
Definition: sexp_tree.cpp:221
char type
Definition: object.h:146
#define FALSE
Definition: pstypes.h:400
afx_msg void OnDelete()
#define stricmp(s1, s2)
Definition: config.h:271
#define SEXP_ATOM_STRING
Definition: sexp.h:913
afx_msg void OnEndlabeleditTree(NMHDR *pNMHDR, LRESULT *pResult)
void clear_tree(const char *op=NULL)
Definition: sexp_tree.cpp:99
int advanced_stricmp(char *one, char *two)
#define strcpy_s(...)
Definition: safe_strings.h:67