TriggerEditorDlg.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /*
  2. FinalSun/FinalAlert 2 Mission Editor
  3. Copyright (C) 1999-2024 Electronic Arts, Inc.
  4. Authored by Matthias Wagner
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see <https://www.gnu.org/licenses/>.
  15. */
  16. // TriggerEditorDlg.cpp: Implementierungsdatei
  17. //
  18. #include "stdafx.h"
  19. #include "finalsun.h"
  20. #include "TriggerEditorDlg.h"
  21. #include "mapdata.h"
  22. #include "variables.h"
  23. #include "functions.h"
  24. #include "inlines.h"
  25. extern ACTIONDATA AD;
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. /////////////////////////////////////////////////////////////////////////////
  32. // Dialogfeld CTriggerEditorDlg
  33. CTriggerEditorDlg::CTriggerEditorDlg(CWnd* pParent /*=NULL*/)
  34. : CDialog(CTriggerEditorDlg::IDD, pParent)
  35. {
  36. //{{AFX_DATA_INIT(CTriggerEditorDlg)
  37. // HINWEIS: Der Klassen-Assistent fügt hier Elementinitialisierung ein
  38. //}}AFX_DATA_INIT
  39. }
  40. void CTriggerEditorDlg::DoDataExchange(CDataExchange* pDX)
  41. {
  42. CDialog::DoDataExchange(pDX);
  43. //{{AFX_DATA_MAP(CTriggerEditorDlg)
  44. DDX_Control(pDX, IDC_TRIGGER, m_Trigger);
  45. DDX_Control(pDX, IDC_TRIGGERTAB, m_tab);
  46. //}}AFX_DATA_MAP
  47. }
  48. BEGIN_MESSAGE_MAP(CTriggerEditorDlg, CDialog)
  49. //{{AFX_MSG_MAP(CTriggerEditorDlg)
  50. ON_BN_CLICKED(IDC_NEWTRIGGER, OnNewtrigger)
  51. ON_BN_CLICKED(IDC_DELETETRIGGER, OnDeletetrigger)
  52. ON_CBN_SELCHANGE(IDC_TRIGGER, OnSelchangeTrigger)
  53. ON_CBN_EDITCHANGE(IDC_TRIGGER, OnEditchangeTrigger)
  54. ON_NOTIFY(TCN_SELCHANGE, IDC_TRIGGERTAB, OnSelchangeTriggertab)
  55. ON_BN_CLICKED(IDC_PLACEONMAP, OnPlaceonmap)
  56. ON_BN_CLICKED(IDC_CLONE, OnClone)
  57. //}}AFX_MSG_MAP
  58. END_MESSAGE_MAP()
  59. /////////////////////////////////////////////////////////////////////////////
  60. // Behandlungsroutinen für Nachrichten CTriggerEditorDlg
  61. void CTriggerEditorDlg::OnOK()
  62. {
  63. }
  64. void CTriggerEditorDlg::OnCancel()
  65. {
  66. // TODO: Zusätzlichen Bereinigungscode hier einfügen
  67. CDialog::OnCancel();
  68. }
  69. BOOL CTriggerEditorDlg::OnInitDialog()
  70. {
  71. CDialog::OnInitDialog();
  72. m_tab.InsertItem(0, TranslateStringACP("Trigger options"));
  73. m_tab.InsertItem(1, TranslateStringACP("Events"));
  74. m_tab.InsertItem(2, TranslateStringACP("Actions"));
  75. m_TriggerOptions.Create(CTriggerOptionsDlg::IDD, &m_tab);
  76. RECT r;
  77. m_tab.GetItemRect(0, &r);
  78. int top=m_tab.GetRowCount()*r.bottom+5;
  79. m_tab.GetClientRect(&r);
  80. int bottom=r.bottom-top-3;
  81. m_TriggerOptions.SetWindowPos(NULL, 10, top, r.right-20, bottom, SWP_NOZORDER);
  82. m_TriggerOptions.ShowWindow(SW_SHOW);
  83. m_TriggerEvents.Create(CTriggerEventsDlg::IDD, &m_tab);
  84. m_TriggerEvents.SetWindowPos(NULL, 10, top, r.right-20, bottom, SWP_NOZORDER);
  85. m_TriggerActions.Create(CTriggerActionsDlg::IDD, &m_tab);
  86. m_TriggerActions.SetWindowPos(NULL, 10, top, r.right-20, bottom, SWP_NOZORDER);
  87. return TRUE; // return TRUE unless you set the focus to a control
  88. // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
  89. }
  90. void CTriggerEditorDlg::UpdateDialog()
  91. {
  92. int i;
  93. CIniFile& ini=Map->GetIniFile();
  94. int curSel=m_Trigger.GetCurSel();
  95. int curData=-1;
  96. if(curSel!=-1)
  97. curData=m_Trigger.GetItemData(curSel);
  98. while(m_Trigger.DeleteString(0)!=CB_ERR);
  99. m_Trigger.SetWindowText("");
  100. for(i=0;i<ini.sections["Triggers"].values.size();i++)
  101. {
  102. CString type;
  103. CString s;
  104. type=*ini.sections["Triggers"].GetValueName(i);
  105. s=GetParam(ini.sections["Triggers"].values[type], 2);
  106. if(ini.sections["Triggers"].values[type].GetLength()==0) continue;
  107. int id=m_Trigger.AddString(s);
  108. m_Trigger.SetItemData(id, i);
  109. }
  110. if(curData<0) curData=0;
  111. if(curData>=m_Trigger.GetCount()) curData=m_Trigger.GetCount()-1;
  112. if(ini.sections["Triggers"].values.size()) m_Trigger.SetCurSel(0);
  113. for(i=0;i<m_Trigger.GetCount();i++)
  114. if(m_Trigger.GetItemData(i)==curData)
  115. {
  116. m_Trigger.SetCurSel(i);
  117. break;
  118. }
  119. OnSelchangeTrigger();
  120. }
  121. void CTriggerEditorDlg::OnNewtrigger()
  122. {
  123. CIniFile& ini=Map->GetIniFile();
  124. CString ID_T=GetFreeID();
  125. ini.sections["Triggers"].values[ID_T]=Map->GetHouseID(0, TRUE)+",<none>,New trigger,0,1,1,1,0";
  126. ini.sections["Events"].values[ID_T]="0";
  127. ini.sections["Actions"].values[ID_T]="0";
  128. //if(MessageBox("Trigger created. If you want to create a simple tag now, press Yes. The tag will be called ""New tag"", you should name it like the trigger (after you have set up the trigger).","Trigger created",MB_YESNO))
  129. {
  130. CString ID_TAG=GetFreeID();
  131. ini.sections["Tags"].values[ID_TAG]="0,New tag,";
  132. ini.sections["Tags"].values[ID_TAG]+=ID_T;
  133. }
  134. ((CFinalSunDlg*)theApp.m_pMainWnd)->UpdateDialogs(TRUE);
  135. int i;
  136. for(i=0;i<m_Trigger.GetCount();i++)
  137. {
  138. if(m_Trigger.GetItemData(i)==ini.sections["Triggers"].FindName(ID_T))
  139. m_Trigger.SetCurSel(i);
  140. }
  141. OnSelchangeTrigger();
  142. }
  143. void CTriggerEditorDlg::OnDeletetrigger()
  144. {
  145. CIniFile& ini=Map->GetIniFile();
  146. int sel=m_Trigger.GetCurSel();
  147. if(sel<0) return;
  148. int curtrig=m_Trigger.GetItemData(sel);
  149. int res=MessageBox("If you want to delete all attached tags, too, press 'Yes'.\nIf you don´t want to delete these tags, press 'No'.\nIf you want to cancel deletion of the trigger, press 'Cancel'.\n\nNote: CellTags will never be deleted using this function","Delete trigger", MB_YESNOCANCEL);
  150. if(res==IDCANCEL) return;
  151. CString trigger=*ini.sections["Triggers"].GetValueName(curtrig);
  152. if(res==IDYES)
  153. {
  154. int i;
  155. for(i=0;i<ini.sections["Tags"].values.size();i++)
  156. {
  157. CString type=*ini.sections["Tags"].GetValueName(i);
  158. CString attTrigg=GetParam(ini.sections["Tags"].values[type], 2);
  159. if(trigger==attTrigg)
  160. {
  161. ini.sections["Tags"].values.erase(type);
  162. }
  163. }
  164. }
  165. ini.sections["Triggers"].values.erase((LPCTSTR)trigger);
  166. ini.sections["Events"].values.erase((LPCTSTR)trigger);
  167. ini.sections["Actions"].values.erase((LPCTSTR)trigger);
  168. ((CFinalSunDlg*)theApp.m_pMainWnd)->UpdateDialogs(TRUE);
  169. }
  170. void CTriggerEditorDlg::OnSelchangeTrigger()
  171. {
  172. OnEditchangeTrigger();
  173. }
  174. void CTriggerEditorDlg::OnEditchangeTrigger()
  175. {
  176. CIniFile& ini=Map->GetIniFile();
  177. int curSel=m_Trigger.GetCurSel();
  178. if(curSel<0)
  179. {
  180. m_TriggerOptions.m_currentTrigger="";
  181. if(m_TriggerOptions.m_hWnd) m_TriggerOptions.UpdateDialog();
  182. m_TriggerEvents.m_currentTrigger="";
  183. if(m_TriggerEvents.m_hWnd) m_TriggerEvents.UpdateDialog();
  184. m_TriggerActions.m_currentTrigger="";
  185. if(m_TriggerActions.m_hWnd) m_TriggerActions.UpdateDialog();
  186. return;
  187. }
  188. int curInd=m_Trigger.GetItemData(curSel);
  189. CString Trigger=*ini.sections["Triggers"].GetValueName(curInd);
  190. m_TriggerOptions.m_currentTrigger=Trigger;
  191. if(m_TriggerOptions.m_hWnd) m_TriggerOptions.UpdateDialog();
  192. m_TriggerEvents.m_currentTrigger=Trigger;
  193. if(m_TriggerEvents.m_hWnd) m_TriggerEvents.UpdateDialog();
  194. m_TriggerActions.m_currentTrigger=Trigger;
  195. if(m_TriggerActions.m_hWnd) m_TriggerActions.UpdateDialog();
  196. }
  197. void CTriggerEditorDlg::OnSelchangeTriggertab(NMHDR* pNMHDR, LRESULT* pResult)
  198. {
  199. m_TriggerEvents.ShowWindow(SW_HIDE);
  200. m_TriggerOptions.ShowWindow(SW_HIDE);
  201. m_TriggerActions.ShowWindow(SW_HIDE);
  202. switch(m_tab.GetCurSel())
  203. {
  204. case 0:
  205. m_TriggerOptions.ShowWindow(SW_SHOW);
  206. m_TriggerOptions.UpdateDialog();
  207. break;
  208. case 1:
  209. m_TriggerEvents.ShowWindow(SW_SHOW);
  210. m_TriggerEvents.UpdateDialog();
  211. break;
  212. case 2:
  213. m_TriggerActions.ShowWindow(SW_SHOW);
  214. m_TriggerActions.UpdateData();
  215. break;
  216. }
  217. *pResult = 0;
  218. }
  219. void CTriggerEditorDlg::OnPlaceonmap()
  220. {
  221. CIniFile& ini=Map->GetIniFile();
  222. int sel=m_Trigger.GetCurSel();
  223. if(sel<0) return;
  224. int curtrig=m_Trigger.GetItemData(sel);
  225. CString trigger=*ini.sections["Triggers"].GetValueName(curtrig);
  226. int i;
  227. CString tag;
  228. for(i=0;i<ini.sections["Tags"].values.size();i++)
  229. {
  230. CString type=*ini.sections["Tags"].GetValueName(i);
  231. CString attTrigg=GetParam(ini.sections["Tags"].values[type], 2);
  232. if(trigger==attTrigg)
  233. {
  234. tag=type;
  235. break;
  236. }
  237. }
  238. AD.mode=ACTIONMODE_CELLTAG;
  239. AD.type=4;
  240. AD.data_s=tag;
  241. }
  242. void CTriggerEditorDlg::OnClone()
  243. {
  244. CIniFile& ini=Map->GetIniFile();
  245. int sel=m_Trigger.GetCurSel();
  246. if(sel<0) return;
  247. int curtrig=m_Trigger.GetItemData(sel);
  248. CString trigger=*ini.sections["Triggers"].GetValueName(curtrig);
  249. CString ID_T=GetFreeID();
  250. ini.sections["Triggers"].values[ID_T]=ini.sections["Triggers"].values[trigger];
  251. ini.sections["Events"].values[ID_T]=ini.sections["Events"].values[trigger];
  252. ini.sections["Actions"].values[ID_T]=ini.sections["Actions"].values[trigger];
  253. ini.sections["Triggers"].values[ID_T]=SetParam(ini.sections["Triggers"].values[ID_T], 2, GetParam(ini.sections["Triggers"].values[ID_T], 2) + " Clone");
  254. {
  255. CString ID_TAG=GetFreeID();
  256. ini.sections["Tags"].values[ID_TAG]=(CString)"0,"+GetParam(ini.sections["Triggers"].values[ID_T], 2)+",";
  257. ini.sections["Tags"].values[ID_TAG]+=ID_T;
  258. }
  259. ((CFinalSunDlg*)theApp.m_pMainWnd)->UpdateDialogs(TRUE);
  260. int i;
  261. for(i=0;i<m_Trigger.GetCount();i++)
  262. {
  263. if(m_Trigger.GetItemData(i)==ini.sections["Triggers"].FindName(ID_T))
  264. m_Trigger.SetCurSel(i);
  265. }
  266. OnSelchangeTrigger();
  267. }
  268. void CTriggerEditorDlg::Clear()
  269. {
  270. }