AITriggerTypes.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  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. // AITriggerTypes.cpp: implementation file
  17. //
  18. #include "stdafx.h"
  19. #include "FinalSun.h"
  20. #include "AITriggerTypes.h"
  21. #include "Mapdata.h"
  22. #include "structs.h"
  23. #include "variables.h"
  24. #include "functions.h"
  25. #include "inlines.h"
  26. // AI trigger type enumeration
  27. enum AITriggerEnum {
  28. AIT_NONE = -1,
  29. AIT_ENEMY_OWNS_X_COND_N = 0,
  30. AIT_HOUSE_OWNS_X_COND_N,
  31. AIT_POWER_YELLOW,
  32. AIT_POWER_RED,
  33. AIT_ENEMY_MONEY_COND_N,
  34. AIT_CURTAIN_NEAR_READY,
  35. AIT_SPHERE_NEAR_READY,
  36. AIT_NEUTRAL_OWNS_X_COND_N,
  37. };
  38. #ifdef _DEBUG
  39. #define new DEBUG_NEW
  40. #undef THIS_FILE
  41. static char THIS_FILE[] = __FILE__;
  42. #endif
  43. /////////////////////////////////////////////////////////////////////////////
  44. // property page CAITriggerTypes
  45. IMPLEMENT_DYNCREATE(CAITriggerTypes, CDialog)
  46. CAITriggerTypes::CAITriggerTypes() : CDialog(CAITriggerTypes::IDD)
  47. {
  48. //{{AFX_DATA_INIT(CAITriggerTypes)
  49. m_Flag3 = _T("");
  50. m_Flag4 = _T("");
  51. m_Name = _T("");
  52. m_Flag6 = _T("");
  53. m_Flag7 = _T("");
  54. m_Flag8 = _T("");
  55. m_Flag9 = _T("");
  56. m_Enabled = FALSE;
  57. m_Condition = -1;
  58. m_Number = 0;
  59. m_Easy = FALSE;
  60. m_Medium = FALSE;
  61. m_Hard = FALSE;
  62. m_BaseDefense = FALSE;
  63. m_Skirmish = FALSE;
  64. m_Flag5 = _T("");
  65. m_MultiSide = _T("");
  66. //}}AFX_DATA_INIT
  67. }
  68. CAITriggerTypes::~CAITriggerTypes()
  69. {
  70. }
  71. void CAITriggerTypes::DoDataExchange(CDataExchange* pDX)
  72. {
  73. CDialog::DoDataExchange(pDX);
  74. //{{AFX_DATA_MAP(CAITriggerTypes)
  75. DDX_Control(pDX, IDC_TEAMTYPE1, m_TeamType1);
  76. DDX_Control(pDX, IDC_UNITTYPE, m_UnitType);
  77. DDX_Control(pDX, IDC_TEAMTYPE2, m_TeamType2);
  78. DDX_Control(pDX, IDC_FLAG2, m_Flag2);
  79. DDX_Control(pDX, IDC_FLAG1, m_Flag1);
  80. DDX_Control(pDX, IDC_DATA, m_Data);
  81. DDX_Control(pDX, IDC_OWNER, m_Owner);
  82. DDX_Control(pDX, IDC_FLOAT3, m_Float3);
  83. DDX_Control(pDX, IDC_FLOAT2, m_Float2);
  84. DDX_Control(pDX, IDC_FLOAT1, m_Float1);
  85. DDX_Control(pDX, IDC_AITRIGGERTYPE, m_AITriggerType);
  86. DDX_Text(pDX, IDC_FLAG4, m_Flag4);
  87. DDX_Text(pDX, IDC_NAME, m_Name);
  88. DDX_Check(pDX, IDC_ENABLED, m_Enabled);
  89. DDX_CBIndex(pDX, IDC_CONDITION, m_Condition);
  90. DDX_Text(pDX, IDC_NUMBER, m_Number);
  91. DDV_MinMaxInt(pDX, m_Number, 0, 256);
  92. DDX_Check(pDX, IDC_EASY, m_Easy);
  93. DDX_Check(pDX, IDC_MEDIUM, m_Medium);
  94. DDX_Check(pDX, IDC_HARD, m_Hard);
  95. DDX_Check(pDX, IDC_BASEDEFENSE, m_BaseDefense);
  96. DDX_Check(pDX, IDC_SKIRMISH, m_Skirmish);
  97. DDX_CBString(pDX, IDC_MULTISIDE, m_MultiSide);
  98. //}}AFX_DATA_MAP
  99. }
  100. BEGIN_MESSAGE_MAP(CAITriggerTypes, CDialog)
  101. //{{AFX_MSG_MAP(CAITriggerTypes)
  102. ON_CBN_SELCHANGE(IDC_AITRIGGERTYPE, OnSelchangeAitriggertype)
  103. ON_EN_CHANGE(IDC_NAME, OnChangeName)
  104. ON_CBN_EDITCHANGE(IDC_OWNER, OnEditchangeOwner)
  105. ON_CBN_EDITCHANGE(IDC_TEAMTYPE1, OnEditchangeTeamtype1)
  106. ON_CBN_EDITCHANGE(IDC_TEAMTYPE2, OnEditchangeTeamtype2)
  107. ON_CBN_EDITCHANGE(IDC_FLAG1, OnEditchangeFlag1)
  108. ON_CBN_EDITCHANGE(IDC_FLAG2, OnEditchangeFlag2)
  109. ON_CBN_EDITCHANGE(IDC_UNITTYPE, OnEditchangeUnittype)
  110. ON_CBN_EDITCHANGE(IDC_DATA, OnEditchangeData)
  111. ON_EN_CHANGE(IDC_FLOAT1, OnChangeFloat1)
  112. ON_EN_CHANGE(IDC_FLOAT2, OnChangeFloat2)
  113. ON_EN_CHANGE(IDC_FLOAT3, OnChangeFloat3)
  114. ON_EN_CHANGE(IDC_FLAG4, OnChangeFlag4)
  115. ON_BN_CLICKED(IDC_ENABLED, OnEnabled)
  116. ON_BN_CLICKED(IDC_ADD, OnAdd)
  117. ON_BN_CLICKED(IDC_DELETE, OnDelete)
  118. ON_CBN_EDITCHANGE(IDC_AITRIGGERTYPE, OnEditchangeAitriggertype)
  119. ON_CBN_SELCHANGE(IDC_CONDITION, OnSelchangeCondition)
  120. ON_EN_CHANGE(IDC_NUMBER, OnChangeNumber)
  121. ON_BN_CLICKED(IDC_EASY, OnEasy)
  122. ON_BN_CLICKED(IDC_MEDIUM, OnMedium)
  123. ON_BN_CLICKED(IDC_HARD, OnHard)
  124. ON_BN_CLICKED(IDC_BASEDEFENSE, OnBasedefense)
  125. ON_BN_CLICKED(IDC_SKIRMISH, OnSkirmish)
  126. ON_CBN_EDITCHANGE(IDC_MULTISIDE, OnEditchangeMultiside)
  127. ON_CBN_SELCHANGE(IDC_MULTISIDE, OnSelchangeMultiside)
  128. //}}AFX_MSG_MAP
  129. END_MESSAGE_MAP()
  130. /////////////////////////////////////////////////////////////////////////////
  131. // message handlers CAITriggerTypes
  132. void ListObjects(CComboBox& cb)
  133. {
  134. CComboBox& m_UnitType=cb;
  135. CIniFile& ini=Map->GetIniFile();
  136. int i;
  137. CString ss="InfantryTypes";
  138. for(i=0;i<rules.sections[ss].values.size();i++)
  139. {
  140. CString type;
  141. CString s;
  142. type=*rules.sections[ss].GetValue(i);
  143. s=type;
  144. s+=" (";
  145. s+=Map->GetUnitName((char*)(LPCTSTR)type);
  146. s+=")";
  147. m_UnitType.AddString(s);
  148. }
  149. for(i=0;i<ini.sections[ss].values.size();i++)
  150. {
  151. CString type;
  152. CString s;
  153. type=*ini.sections[ss].GetValue(i);
  154. s=type;
  155. s+=" (";
  156. s+=Map->GetUnitName((char*)(LPCTSTR)type);
  157. s+=")";
  158. m_UnitType.AddString(s);
  159. }
  160. ss="VehicleTypes";
  161. for(i=0;i<rules.sections[ss].values.size();i++)
  162. {
  163. CString type;
  164. CString s;
  165. type=*rules.sections[ss].GetValue(i);
  166. s=type;
  167. s+=" (";
  168. s+=Map->GetUnitName((char*)(LPCTSTR)type);
  169. s+=")";
  170. m_UnitType.AddString(s);
  171. }
  172. for(i=0;i<ini.sections[ss].values.size();i++)
  173. {
  174. CString type;
  175. CString s;
  176. type=*ini.sections[ss].GetValue(i);
  177. s=type;
  178. s+=" (";
  179. s+=Map->GetUnitName((char*)(LPCTSTR)type);
  180. s+=")";
  181. m_UnitType.AddString(s);
  182. }
  183. ss="AircraftTypes";
  184. for(i=0;i<rules.sections[ss].values.size();i++)
  185. {
  186. CString type;
  187. CString s;
  188. type=*rules.sections[ss].GetValue(i);
  189. s=type;
  190. s+=" (";
  191. s+=Map->GetUnitName((char*)(LPCTSTR)type);
  192. s+=")";
  193. m_UnitType.AddString(s);
  194. }
  195. for(i=0;i<ini.sections[ss].values.size();i++)
  196. {
  197. CString type;
  198. CString s;
  199. type=*ini.sections[ss].GetValue(i);
  200. s=type;
  201. s+=" (";
  202. s+=Map->GetUnitName((char*)(LPCTSTR)type);
  203. s+=")";
  204. m_UnitType.AddString(s);
  205. }
  206. ss="BuildingTypes";
  207. for(i=0;i<rules.sections[ss].values.size();i++)
  208. {
  209. CString type;
  210. CString s;
  211. type=*rules.sections[ss].GetValue(i);
  212. s=type;
  213. s+=" (";
  214. s+=Map->GetUnitName((char*)(LPCTSTR)type);
  215. s+=")";
  216. m_UnitType.AddString(s);
  217. }
  218. for(i=0;i<ini.sections[ss].values.size();i++)
  219. {
  220. CString type;
  221. CString s;
  222. type=*ini.sections[ss].GetValue(i);
  223. s=type;
  224. s+=" (";
  225. s+=Map->GetUnitName((char*)(LPCTSTR)type);
  226. s+=")";
  227. m_UnitType.AddString(s);
  228. }
  229. }
  230. void CAITriggerTypes::UpdateDialog()
  231. {
  232. int sel=m_AITriggerType.GetCurSel();
  233. m_AITriggerType.SetRedraw(FALSE);
  234. while(m_AITriggerType.DeleteString(0)!=CB_ERR);
  235. ListHouses(m_Owner,FALSE,TRUE);
  236. m_Owner.AddString("<all>");
  237. ListTeamTypes(m_TeamType1, TRUE);
  238. ListTeamTypes(m_TeamType2, TRUE);
  239. int i;
  240. for(i=0;i<Map->GetAITriggerTypeCount();i++)
  241. {
  242. AITRIGGERTYPE aitt;
  243. Map->GetAITriggerType(i, &aitt);
  244. CString s=aitt.ID;
  245. s+=" (";
  246. s+=aitt.name;
  247. s+=")";
  248. m_AITriggerType.AddString(s);
  249. }
  250. m_AITriggerType.SetCurSel(0);
  251. if(sel!=-1)
  252. m_AITriggerType.SetCurSel(sel);
  253. OnSelchangeAitriggertype();
  254. m_AITriggerType.SetRedraw(TRUE);
  255. m_AITriggerType.RedrawWindow();
  256. }
  257. void CAITriggerTypes::OnSelchangeAitriggertype()
  258. {
  259. int sel=m_AITriggerType.GetCurSel();
  260. if(sel<0) return;
  261. CString aitrigger;
  262. m_AITriggerType.GetLBText(sel,aitrigger);
  263. TruncSpace(aitrigger);
  264. AITRIGGERTYPE aitt;
  265. Map->GetAITriggerType(Map->GetAITriggerTypeIndex(aitrigger), &aitt);
  266. m_Name=aitt.name;
  267. m_TeamType1.SetWindowText(aitt.teamtype1);
  268. m_Owner.SetWindowText(TranslateHouse(aitt.owner, TRUE));
  269. m_Flag1.SetWindowText(aitt.techlevel);
  270. //m_Flag2.SetWindowText(aitt.type);
  271. int type=atoi(aitt.type)+1;
  272. m_Flag2.SetCurSel(type);
  273. m_UnitType.SetWindowText(aitt.unittype);
  274. m_Data.SetWindowText(aitt.data);
  275. m_Float1.SetWindowText(aitt.float1);
  276. m_Float2.SetWindowText(aitt.float2);
  277. m_Float3.SetWindowText(aitt.float3);
  278. //m_Flag3=aitt.skirmish;
  279. m_Skirmish=isTrue(aitt.skirmish);
  280. m_Flag4=aitt.flag4;
  281. //m_Flag5=aitt.multihouse;
  282. m_MultiSide=aitt.multihouse;
  283. m_BaseDefense=isTrue(aitt.basedefense);
  284. m_TeamType2.SetWindowText(aitt.teamtype2);
  285. m_Easy=isTrue(aitt.easy);
  286. m_Medium=isTrue(aitt.medium);
  287. m_Hard=isTrue(aitt.hard);
  288. m_Enabled=FALSE;
  289. CIniFile& ini=Map->GetIniFile();
  290. if(ini.sections["AITriggerTypesEnable"].values.find((LPCTSTR)aitrigger)!=ini.sections["AITriggerTypesEnable"].values.end())
  291. if(stricmp(ini.sections["AITriggerTypesEnable"].values[(LPCTSTR)aitrigger], "yes")==NULL)
  292. m_Enabled=TRUE;
  293. AITrigInfo info;
  294. info=ConvertToAITrigInfoFromHex((char*)(LPCSTR)aitt.data);
  295. m_Condition=info.Condition;
  296. m_Number=info.Number;
  297. ListObjects(m_UnitType);
  298. UpdateData(FALSE);
  299. }
  300. void CAITriggerTypes::OnChangeName()
  301. {
  302. UpdateData();
  303. CString value;
  304. value=m_Name;
  305. if(value.GetLength()==0) value=" ";
  306. SetAITriggerParam(value, 0);
  307. UpdateDialog();
  308. }
  309. void CAITriggerTypes::OnEditchangeOwner()
  310. {
  311. CString value;
  312. m_Owner.GetWindowText(value);
  313. value=TranslateHouse(value);
  314. SetAITriggerParam(value, 2);
  315. }
  316. void CAITriggerTypes::OnEditchangeTeamtype1()
  317. {
  318. CString value;
  319. m_TeamType1.GetWindowText(value);
  320. TruncSpace(value);
  321. SetAITriggerParam(value, 1);
  322. }
  323. void CAITriggerTypes::OnEditchangeTeamtype2()
  324. {
  325. CString value;
  326. m_TeamType2.GetWindowText(value);
  327. TruncSpace(value);
  328. SetAITriggerParam(value, 14);
  329. }
  330. void CAITriggerTypes::OnEditchangeFlag1()
  331. {
  332. CString value;
  333. m_Flag1.GetWindowText(value);
  334. SetAITriggerParam(value, 3);
  335. }
  336. void CAITriggerTypes::OnEditchangeFlag2()
  337. {
  338. CString value;
  339. m_Flag2.GetWindowText(value);
  340. TruncSpace(value);
  341. SetAITriggerParam(value, 4);
  342. }
  343. void CAITriggerTypes::OnEditchangeUnittype()
  344. {
  345. CString value;
  346. m_UnitType.GetWindowText(value);
  347. TruncSpace(value);
  348. SetAITriggerParam(value, 5);
  349. }
  350. void CAITriggerTypes::OnEditchangeData()
  351. {
  352. /*
  353. This function should also valid the data!
  354. */
  355. CString value;
  356. m_Data.GetWindowText(value);
  357. TruncSpace(value);
  358. // max 64 chars... min 64 chars too...
  359. ((char*)(LPCTSTR)value)[64]=0;
  360. int ToInsert=64-value.GetLength();
  361. CString nulls('0',ToInsert);
  362. value.Insert(value.GetLength()-ToInsert, nulls);
  363. SetAITriggerParam(value, 6);
  364. int editsel=m_Data.GetEditSel();
  365. UpdateDialog();
  366. m_Data.SetEditSel(editsel,editsel+1);
  367. }
  368. void CAITriggerTypes::OnChangeFloat1()
  369. {
  370. CString value;
  371. m_Float1.GetWindowText(value);
  372. SetAITriggerParam(value, 7);
  373. }
  374. void CAITriggerTypes::OnChangeFloat2()
  375. {
  376. CString value;
  377. m_Float2.GetWindowText(value);
  378. SetAITriggerParam(value, 8);
  379. }
  380. void CAITriggerTypes::OnChangeFloat3()
  381. {
  382. CString value;
  383. m_Float3.GetWindowText(value);
  384. SetAITriggerParam(value, 9);
  385. }
  386. void CAITriggerTypes::OnChangeFlag3()
  387. {
  388. }
  389. void CAITriggerTypes::OnChangeFlag4()
  390. {
  391. UpdateData();
  392. CString value;
  393. value=m_Flag4;
  394. SetAITriggerParam(value, 11);
  395. }
  396. void CAITriggerTypes::OnChangeFlag5()
  397. {
  398. }
  399. void CAITriggerTypes::OnChangeFlag6()
  400. {
  401. }
  402. void CAITriggerTypes::OnChangeFlag7()
  403. {
  404. }
  405. void CAITriggerTypes::OnChangeFlag8()
  406. {
  407. UpdateData();
  408. CString value;
  409. value=m_Flag8;
  410. SetAITriggerParam(value, 16);
  411. }
  412. void CAITriggerTypes::OnChangeFlag9()
  413. {
  414. UpdateData();
  415. CString value;
  416. value=m_Flag9;
  417. SetAITriggerParam(value, 17);
  418. }
  419. void CAITriggerTypes::OnEnabled()
  420. {
  421. // enable or disable trigger
  422. UpdateData();
  423. int sel=m_AITriggerType.GetCurSel();
  424. if(sel<0) return;
  425. CString aitrigger;
  426. m_AITriggerType.GetLBText(sel,aitrigger);
  427. TruncSpace(aitrigger);
  428. CIniFile& ini=Map->GetIniFile();
  429. if(m_Enabled)
  430. {
  431. // enable it
  432. ini.sections["AITriggerTypesEnable"].values[(LPCTSTR)aitrigger]="yes";
  433. }
  434. else
  435. ini.sections["AITriggerTypesEnable"].values.erase((LPCTSTR)aitrigger);
  436. }
  437. void CAITriggerTypes::SetAITriggerParam(const char *value, int param)
  438. {
  439. int sel=m_AITriggerType.GetCurSel();
  440. if(sel<0) return;
  441. CString aitrigger;
  442. m_AITriggerType.GetLBText(sel,aitrigger);
  443. TruncSpace(aitrigger);
  444. CIniFile& ini=Map->GetIniFile();
  445. ini.sections["AITriggerTypes"].values[aitrigger]=SetParam(ini.sections["AITriggerTypes"].values[aitrigger],param,value);
  446. }
  447. void CAITriggerTypes::OnAdd()
  448. {
  449. CString ID=GetFreeID();
  450. CIniFile& ini=Map->GetIniFile();
  451. CString data="New AI Trigger,";
  452. // now try to set a teamtype
  453. if(ini.sections["TeamTypes"].values.size()>0)
  454. {
  455. data+=*ini.sections["TeamTypes"].GetValue(0);
  456. }
  457. else
  458. {
  459. data+="<none>";
  460. }
  461. data+=",<all>,";
  462. // the flag here... i first thought it´s an ID, but it more seems to be an value specifying the importance of the trigger
  463. data+="1,";
  464. // the flag 2 seems to be the type of the trigger. -1 seems to be pool
  465. data+="0,";
  466. // now stuff
  467. data+="<none>,0000000000000000000000000000000000000000000000000000000000000000,50.000000,30.000000,50.000000,1,0,1,1,";
  468. // a pool seems to need both teamtypes the same
  469. if(ini.sections["TeamTypes"].values.size()>0)
  470. {
  471. data+="<none>";//*ini.sections["TeamTypes"].GetValue(0);
  472. }
  473. else
  474. {
  475. data+="<none>";
  476. }
  477. data+=",1,1,1";
  478. ini.sections["AITriggerTypes"].values[ID]=data;
  479. UpdateDialog();
  480. // now make current id visible
  481. int i;
  482. for(i=0;i<m_AITriggerType.GetCount();i++)
  483. {
  484. CString cuString;
  485. m_AITriggerType.GetLBText(i, cuString);
  486. TruncSpace(cuString);
  487. if(cuString==ID)
  488. {
  489. m_AITriggerType.SetCurSel(i);
  490. OnSelchangeAitriggertype();
  491. }
  492. }
  493. }
  494. void CAITriggerTypes::OnDelete()
  495. {
  496. int sel=m_AITriggerType.GetCurSel();
  497. if(sel<0) return;
  498. CString aitrigger;
  499. m_AITriggerType.GetLBText(sel,aitrigger);
  500. TruncSpace(aitrigger);
  501. CIniFile& ini=Map->GetIniFile();
  502. ini.sections["AITriggerTypes"].values.erase(aitrigger);
  503. ini.sections["AITriggerTypesEnable"].values.erase(aitrigger);
  504. UpdateDialog();
  505. }
  506. void CAITriggerTypes::OnEditchangeAitriggertype()
  507. {
  508. OnSelchangeAitriggertype();
  509. }
  510. AITrigInfo CAITriggerTypes::ConvertToAITrigInfoFromHex(char *aitinfo)
  511. {
  512. int index=0;
  513. AITrigInfo info;
  514. char* rawdata=(char*)&info;
  515. char hexbuff[3]="00";
  516. char* dummy=NULL;
  517. while(*aitinfo!='\0')
  518. {
  519. while(isspace((int)*aitinfo)) aitinfo++;
  520. hexbuff[0]=*aitinfo++;
  521. ASSERT(*aitinfo!='\0');
  522. if(*aitinfo!='\0'){
  523. hexbuff[1]=*aitinfo++;
  524. } else {
  525. hexbuff[1]='\0';
  526. }
  527. ASSERT(index<sizeof(AITrigInfo));
  528. if(index>=sizeof(AITrigInfo)) break;
  529. *rawdata++=strtol(hexbuff, &dummy, 16);
  530. index++;
  531. }
  532. return info;
  533. }
  534. char* CAITriggerTypes::ConvertToHexFromAITrigInfo(AITrigInfo info, char* buffer)
  535. {
  536. unsigned char* aitinfobuffer=(unsigned char*)buffer;
  537. /*
  538. ** Convert the AITrigInfo union data structure to ASCII format string
  539. */
  540. {
  541. int index = 0;
  542. unsigned char *rawdata = (unsigned char *)&info;
  543. unsigned char *aitinfobuffptr = &aitinfobuffer[0];
  544. for (; index < sizeof(AITrigInfo); index++, rawdata++, aitinfobuffptr += 2) {
  545. sprintf((char *)aitinfobuffptr, "%02x", *rawdata);
  546. }
  547. *aitinfobuffptr = '\0';
  548. }
  549. return (char*)aitinfobuffer;
  550. }
  551. void CAITriggerTypes::OnSelchangeCondition()
  552. {
  553. int sel=m_AITriggerType.GetCurSel();
  554. if(sel<0) return;
  555. UpdateData(TRUE);
  556. AITrigInfo info;
  557. info.Condition=(ConditionEnum)m_Condition;
  558. info.Number=m_Number;
  559. char buffer[65];
  560. ConvertToHexFromAITrigInfo(info, buffer);
  561. SetAITriggerParam(buffer, 6);
  562. UpdateDialog();
  563. }
  564. void CAITriggerTypes::OnChangeNumber()
  565. {
  566. int sel=m_AITriggerType.GetCurSel();
  567. if(sel<0) return;
  568. UpdateData(TRUE);
  569. AITrigInfo info;
  570. memset(&info, 0, sizeof(AITrigInfo));
  571. info.Condition=(ConditionEnum)m_Condition;
  572. info.Number=m_Number;
  573. char buffer[65];
  574. ConvertToHexFromAITrigInfo(info, buffer);
  575. //MessageBox(buffer);
  576. //m_Data.SetWindowText(buffer);
  577. SetAITriggerParam(buffer, 6);
  578. UpdateDialog();
  579. }
  580. void CAITriggerTypes::OnEasy()
  581. {
  582. UpdateData();
  583. CString value;
  584. value="1";
  585. if(!m_Easy) value="0";
  586. SetAITriggerParam(value, 15);
  587. }
  588. void CAITriggerTypes::OnMedium()
  589. {
  590. UpdateData();
  591. CString value;
  592. value="1";
  593. if(!m_Medium) value="0";
  594. SetAITriggerParam(value, 16);
  595. }
  596. void CAITriggerTypes::OnHard()
  597. {
  598. UpdateData();
  599. CString value;
  600. value="1";
  601. if(!m_Hard) value="0";
  602. SetAITriggerParam(value, 17);
  603. }
  604. void CAITriggerTypes::OnBasedefense()
  605. {
  606. UpdateData();
  607. CString value;
  608. value="1";
  609. if(!m_BaseDefense) value="0";
  610. SetAITriggerParam(value, 13);
  611. }
  612. void CAITriggerTypes::OnSkirmish()
  613. {
  614. UpdateData();
  615. CString value;
  616. value="1";
  617. if(!m_Skirmish) value="0";
  618. SetAITriggerParam(value, 10);
  619. }
  620. void CAITriggerTypes::OnEditchangeMultiside()
  621. {
  622. UpdateData();
  623. CString value;
  624. value=m_MultiSide;
  625. TruncSpace(value);
  626. SetAITriggerParam(value, 12);
  627. }
  628. void CAITriggerTypes::OnSelchangeMultiside()
  629. {
  630. CString s;
  631. CComboBox& box=*(CComboBox*)GetDlgItem(IDC_MULTISIDE);
  632. box.GetLBText(box.GetCurSel(), s);
  633. box.SetWindowText(s);
  634. OnEditchangeMultiside();
  635. }