ViewObjects.cpp 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407
  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. // ViewObjects.cpp: Implementierungsdatei
  17. //
  18. #include "stdafx.h"
  19. #include "FinalSun.h"
  20. #include "ViewObjects.h"
  21. #include "FinalSunDlg.h"
  22. #include "structs.h"
  23. #include "mapdata.h"
  24. #include "variables.h"
  25. #include "functions.h"
  26. #include "inlines.h"
  27. #include "rtpdlg.h"
  28. #include "TubeTool.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CViewObjects
  36. const int valadded=10000;
  37. IMPLEMENT_DYNCREATE(CViewObjects, CTreeView)
  38. CViewObjects::CViewObjects()
  39. {
  40. m_ready=FALSE;
  41. }
  42. CViewObjects::~CViewObjects()
  43. {
  44. }
  45. BEGIN_MESSAGE_MAP(CViewObjects, CTreeView)
  46. //{{AFX_MSG_MAP(CViewObjects)
  47. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  48. ON_WM_CREATE()
  49. ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
  50. ON_WM_KEYDOWN()
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. extern int overlay_number[];
  54. extern CString overlay_name[];
  55. extern BOOL overlay_visible[];
  56. extern BOOL overlay_trail[];
  57. extern int overlay_count;
  58. extern ACTIONDATA AD;
  59. /////////////////////////////////////////////////////////////////////////////
  60. // Zeichnung CViewObjects
  61. void CViewObjects::OnDraw(CDC* pDC)
  62. {
  63. CDocument* pDoc = GetDocument();
  64. // ZU ERLEDIGEN: Code zum Zeichnen hier einfügen
  65. }
  66. /////////////////////////////////////////////////////////////////////////////
  67. // Diagnose CViewObjects
  68. #ifdef _DEBUG
  69. void CViewObjects::AssertValid() const
  70. {
  71. CTreeView::AssertValid();
  72. }
  73. void CViewObjects::Dump(CDumpContext& dc) const
  74. {
  75. CTreeView::Dump(dc);
  76. }
  77. #endif //_DEBUG
  78. CString GetTheaterLanguageString(LPCSTR lpString)
  79. {
  80. CString s=lpString;
  81. CString t=lpString;
  82. if((tiledata)==&t_tiledata) t+="TEM";
  83. if((tiledata)==&s_tiledata) t+="SNO";
  84. if((tiledata)==&u_tiledata) t+="URB";
  85. if((tiledata)==&un_tiledata) t+="UBN";
  86. if((tiledata)==&l_tiledata) t+="LUN";
  87. if((tiledata)==&d_tiledata) t+="DES";
  88. CString res=GetLanguageStringACP(t);
  89. if(res.GetLength()==0) res=GetLanguageStringACP(s);
  90. return res;
  91. }
  92. /////////////////////////////////////////////////////////////////////////////
  93. // Behandlungsroutinen für Nachrichten CViewObjects
  94. void CViewObjects::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
  95. {
  96. CIniFile& ini=Map->GetIniFile();
  97. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  98. int val=pNMTreeView->itemNew.lParam;
  99. if(val<0){ // return;
  100. if(val==-2) {
  101. AD.reset();
  102. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
  103. }
  104. return;
  105. }
  106. if(val<valadded)
  107. {
  108. // standard selection (maybe erasing etc)
  109. switch(val)
  110. {
  111. case 10: // erase field
  112. {
  113. AD.mode=ACTIONMODE_ERASEFIELD;
  114. break;
  115. }
  116. case 20: // waypoint stuff now
  117. {
  118. AD.mode=ACTIONMODE_WAYPOINT;
  119. AD.type=0;
  120. break;
  121. }
  122. case 21:
  123. {
  124. AD.mode=3;
  125. AD.type=1;
  126. break;
  127. }
  128. case 22:
  129. {
  130. AD.mode=3;
  131. AD.type=2;
  132. break;
  133. }
  134. case 23:
  135. case 24:
  136. case 25:
  137. case 26:
  138. case 27:
  139. case 28:
  140. case 29:
  141. case 30:
  142. {
  143. AD.mode=3;
  144. AD.type=3+val-23;
  145. break;
  146. }
  147. case 36: // celltag stuff
  148. {
  149. AD.mode=4;
  150. AD.type=0;
  151. break;
  152. }
  153. case 37:
  154. {
  155. AD.mode=4;
  156. AD.type=1;
  157. break;
  158. }
  159. case 38:
  160. {
  161. AD.mode=4;
  162. AD.type=2;
  163. break;
  164. }
  165. case 40: // node stuff
  166. {
  167. AD.mode=5;
  168. AD.type=0;
  169. break;
  170. }
  171. case 41:
  172. {
  173. AD.mode=5;
  174. AD.type=1;
  175. break;
  176. }
  177. case 42:
  178. {
  179. AD.mode=5;
  180. AD.type=2;
  181. break;
  182. }
  183. case 50:
  184. {
  185. AD.mode=ACTIONMODE_MAPTOOL;
  186. AD.tool.reset(new AddTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview, true));
  187. break;
  188. }
  189. case 51:
  190. {
  191. AD.mode = ACTIONMODE_MAPTOOL;
  192. AD.tool.reset(new ModifyTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview, true));
  193. break;
  194. }
  195. case 52:
  196. {
  197. AD.mode = ACTIONMODE_MAPTOOL;
  198. AD.tool.reset(new AddTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview, false));
  199. break;
  200. }
  201. case 53:
  202. {
  203. AD.mode = ACTIONMODE_MAPTOOL;
  204. AD.tool.reset(new ModifyTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview, false));
  205. break;
  206. }
  207. case 54:
  208. {
  209. AD.mode=ACTIONMODE_MAPTOOL;
  210. AD.tool.reset(new RemoveTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview));
  211. break;
  212. }
  213. case 61:
  214. if(!tiledata_count) break;
  215. AD.type=0;
  216. AD.mode=ACTIONMODE_SETTILE;
  217. AD.data=0;
  218. AD.z_data=0;
  219. HandleBrushSize(0);
  220. break;
  221. case 62:
  222. int i;
  223. if(!tiledata_count) break;
  224. for(i=0;i<(*tiledata_count);i++)
  225. if((*tiledata)[i].wTileSet==atoi((*tiles).sections["General"].values["SandTile"])) break;
  226. AD.type=i;
  227. AD.mode=ACTIONMODE_SETTILE;
  228. AD.data=0;
  229. AD.z_data=0;
  230. HandleBrushSize(i);
  231. break;
  232. case 63:
  233. if(!tiledata_count) break;
  234. for(i=0;i<(*tiledata_count);i++)
  235. if((*tiledata)[i].wTileSet==atoi((*tiles).sections["General"].values["RoughTile"])) break;
  236. AD.type=i;
  237. AD.mode=ACTIONMODE_SETTILE;
  238. AD.data=0;
  239. AD.z_data=0;
  240. HandleBrushSize(i);
  241. break;
  242. case 64:
  243. if(!tiledata_count) break;
  244. for(i=0;i<(*tiledata_count);i++)
  245. if((*tiledata)[i].wTileSet==waterset) break;
  246. if(((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_x<2 ||
  247. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_y<2)
  248. {
  249. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_settingsbar.m_BrushSize=1;
  250. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_settingsbar.UpdateData(FALSE);
  251. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_x=2;
  252. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_y=2;
  253. }
  254. AD.type=i;
  255. AD.mode=ACTIONMODE_SETTILE;
  256. AD.data=1; // use water placement logic
  257. AD.z_data=0;
  258. break;
  259. case 65:
  260. if(!tiledata_count) break;
  261. for(i=0;i<(*tiledata_count);i++)
  262. if((*tiledata)[i].wTileSet==atoi((*tiles).sections["General"].values["GreenTile"])) break;
  263. AD.type=i;
  264. AD.mode=ACTIONMODE_SETTILE;
  265. AD.data=0;
  266. AD.z_data=0;
  267. HandleBrushSize(i);
  268. break;
  269. case 66:
  270. if(!tiledata_count) break;
  271. for(i=0;i<(*tiledata_count);i++)
  272. if((*tiledata)[i].wTileSet==atoi((*tiles).sections["General"].values["PaveTile"])) break;
  273. AD.type=i;
  274. AD.mode=ACTIONMODE_SETTILE;
  275. AD.data=0;
  276. AD.z_data=0;
  277. HandleBrushSize(i);
  278. break;
  279. case 67:
  280. if(!tiledata_count) break;
  281. for(i=0;i<(*tiledata_count);i++)
  282. if((*tiledata)[i].wTileSet==atoi(g_data.sections["NewUrbanInfo"].values["Morphable2"])) break;
  283. AD.type=i;
  284. AD.mode=ACTIONMODE_SETTILE;
  285. AD.data=0;
  286. AD.z_data=0;
  287. HandleBrushSize(i);
  288. break;
  289. }
  290. }
  291. else
  292. {
  293. int subpos=val%valadded;
  294. int pos=val/valadded;
  295. AD.mode=1;
  296. AD.type=pos;
  297. AD.data=subpos;
  298. if(pos==1)
  299. {
  300. CString sec="InfantryTypes";
  301. if(subpos<rules.sections[sec].values.size())
  302. {
  303. // standard unit!
  304. AD.data_s=*rules.sections[sec].GetValue(subpos);
  305. }
  306. else{
  307. AD.data_s=*ini.sections[sec].GetValue(subpos-rules.sections[sec].values.size());
  308. }
  309. }
  310. else if(pos==2)
  311. {
  312. CString sec="BuildingTypes";
  313. if(subpos<rules.sections[sec].values.size())
  314. {
  315. // standard unit!
  316. AD.data_s=*rules.sections[sec].GetValue(subpos);
  317. }
  318. else{
  319. AD.data_s=*ini.sections[sec].GetValue(subpos-rules.sections[sec].values.size());
  320. }
  321. }
  322. else if(pos==3)
  323. {
  324. CString sec="AircraftTypes";
  325. if(subpos<rules.sections[sec].values.size())
  326. {
  327. // standard unit!
  328. AD.data_s=*rules.sections[sec].GetValue(subpos);
  329. }
  330. else{
  331. AD.data_s=*ini.sections[sec].GetValue(subpos-rules.sections[sec].values.size());
  332. }
  333. }
  334. else if(pos==4)
  335. {
  336. CString sec="VehicleTypes";
  337. if(subpos<rules.sections[sec].values.size())
  338. {
  339. // standard unit!
  340. AD.data_s=*rules.sections[sec].GetValue(subpos);
  341. }
  342. else{
  343. AD.data_s=*ini.sections[sec].GetValue(subpos-rules.sections[sec].values.size());
  344. }
  345. }
  346. else if(pos==5)
  347. {
  348. CString sec="TerrainTypes";
  349. if(subpos==999)
  350. {
  351. CRTPDlg dlg;
  352. if(dlg.DoModal()==IDOK)
  353. {
  354. AD.mode=ACTIONMODE_RANDOMTERRAIN;
  355. }
  356. }
  357. else
  358. {
  359. if(subpos<rules.sections[sec].values.size())
  360. {
  361. // standard unit!
  362. AD.data_s=*rules.sections[sec].GetValue(subpos);
  363. }
  364. else{
  365. AD.data_s=*ini.sections[sec].GetValue(subpos-rules.sections[sec].values.size());
  366. }
  367. }
  368. }
  369. else if(pos==6)
  370. {
  371. if(subpos<100)
  372. {
  373. // general overlay functions!
  374. if(subpos==1)
  375. {
  376. AD.data=31;
  377. AD.data2=atoi(InputBox("Please enter the value (0-255) of the overlay. Don´t exceed this range.","Set overlay manually"));
  378. }
  379. else if(subpos==2)
  380. {
  381. AD.data=32;
  382. AD.data2=atoi(InputBox("Please enter the value (0-255) of the overlay-data. Don´t exceed this range.","Set overlay manually"));
  383. }
  384. }
  385. else
  386. {
  387. AD.data2=subpos%100;
  388. AD.data=subpos/100;
  389. if(AD.data>=30) {AD.data=30;AD.data2=subpos%1000;}
  390. }
  391. }
  392. else if(pos==7)
  393. {
  394. // set owner
  395. //if(ini.sections.find(MAPHOUSES)!=ini.sections.end() && ini.sections[MAPHOUSES].values.size()>0)
  396. if(ini.sections.find(MAPHOUSES)!=ini.sections.end() && ini.sections[MAPHOUSES].values.size()>0)
  397. {
  398. AD.data_s=*ini.sections[MAPHOUSES].GetValue(subpos);
  399. }
  400. else
  401. {
  402. AD.data_s=*rules.sections[HOUSES].GetValue(subpos);
  403. }
  404. currentOwner=AD.data_s;
  405. }
  406. #ifdef SMUDGE_SUPP
  407. else if(pos==8)
  408. {
  409. CString sec="SmudgeTypes";
  410. if(subpos<rules.sections[sec].values.size())
  411. {
  412. // standard unit!
  413. AD.data_s=*rules.sections[sec].GetValue(subpos);
  414. }
  415. else
  416. {
  417. AD.data_s=*ini.sections[sec].GetValue(subpos-rules.sections[sec].values.size());
  418. }
  419. }
  420. #endif
  421. }
  422. *pResult = 0;
  423. }
  424. __inline HTREEITEM TV_InsertItemW(HWND hWnd, WCHAR* lpString, int len, HTREEITEM hInsertAfter, HTREEITEM hParent, int param)
  425. {
  426. if(!lpString) return NULL;
  427. TVINSERTSTRUCTW tvis;
  428. tvis.hInsertAfter=hInsertAfter;
  429. tvis.hParent=hParent;
  430. tvis.itemex.mask=TVIF_PARAM | TVIF_TEXT;
  431. tvis.itemex.cchTextMax=len;
  432. tvis.itemex.pszText=lpString;
  433. tvis.itemex.lParam=param;
  434. // MW 07/17/2001: Updated to use Ascii if Unicode fails:
  435. HTREEITEM res=(HTREEITEM)::SendMessage(hWnd, TVM_INSERTITEMW, 0,((LPARAM)(&tvis)));
  436. if(!res)
  437. {
  438. // failed... Probably because of missing Unicode support
  439. // convert text to ascii, then add it
  440. BYTE* lpAscii=new(BYTE[len+1]);
  441. BOOL bUsedDefault;
  442. memset(lpAscii, 0, len+1);
  443. WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK,
  444. lpString, len+1, (LPSTR)lpAscii, len+1,NULL,&bUsedDefault);
  445. TVINSERTSTRUCT tvis;
  446. tvis.hInsertAfter=hInsertAfter;
  447. tvis.hParent=hParent;
  448. tvis.itemex.mask=TVIF_PARAM | TVIF_TEXT;
  449. tvis.itemex.cchTextMax=len;
  450. tvis.itemex.lParam=param;
  451. tvis.itemex.pszText=(char*)lpAscii;
  452. res=TreeView_InsertItem(hWnd, &tvis);
  453. delete[] lpAscii;
  454. }
  455. return res;
  456. }
  457. void CViewObjects::UpdateDialog()
  458. {
  459. OutputDebugString("Objectbrowser redrawn\n");
  460. CTreeCtrl& tree=GetTreeCtrl();
  461. CIniFile& ini=Map->GetIniFile();
  462. tree.Select(0,TVGN_CARET );
  463. tree.DeleteAllItems();
  464. CString sTreeRoots[15];
  465. sTreeRoots[0]=GetLanguageStringACP("InfantryObList");
  466. sTreeRoots[1]=GetLanguageStringACP("VehiclesObList");
  467. sTreeRoots[2]=GetLanguageStringACP("AircraftObList");
  468. sTreeRoots[3]=GetLanguageStringACP("StructuresObList");
  469. sTreeRoots[4]=GetLanguageStringACP("TerrainObList");
  470. sTreeRoots[5]=GetLanguageStringACP("OverlayObList");
  471. sTreeRoots[6]=GetLanguageStringACP("WaypointsObList");
  472. sTreeRoots[7]=GetLanguageStringACP("CelltagsObList");
  473. sTreeRoots[8]=GetLanguageStringACP("BaseNodesObList");
  474. sTreeRoots[9]=GetLanguageStringACP("TunnelObList");
  475. sTreeRoots[10]=GetLanguageStringACP("DelObjObList");
  476. sTreeRoots[11]=GetLanguageStringACP("ChangeOwnerObList");
  477. sTreeRoots[12]=GetLanguageStringACP("StartpointsObList");
  478. sTreeRoots[13]=GetLanguageStringACP("GroundObList");
  479. sTreeRoots[14]=GetLanguageStringACP("SmudgesObList");
  480. int i=0;
  481. //TV_InsertItemW(tree.m_hWnd, L"HELLO", 5, TVI_LAST, TVI_ROOT, -2);
  482. HTREEITEM first=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
  483. TranslateStringACP(GetLanguageStringACP("NothingObList")), i, i, 0, 0, -2, TVI_ROOT, TVI_LAST);
  484. HTREEITEM rootitems[15];
  485. // we want the change owner at the top
  486. if(!Map->IsMultiplayer() || !theApp.m_Options.bEasy)
  487. rootitems[11]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
  488. TranslateStringACP(sTreeRoots[11]), i, i, 0, 0, i, TVI_ROOT, TVI_LAST);
  489. for(i=0;i<10;i++)
  490. {
  491. BOOL bAllow=TRUE;
  492. if(theApp.m_Options.bEasy)
  493. {
  494. if(i>=6 && i<=9)
  495. bAllow=FALSE;
  496. }
  497. // no tunnels in ra2 mode
  498. if(editor_mode==ra2_mode && i==9 && !isTrue(g_data.sections["Debug"].values["AllowTunnels"])) bAllow=FALSE;
  499. if(bAllow)
  500. rootitems[i]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
  501. sTreeRoots[i], i, i, 0, 0, i, TVI_ROOT, TVI_LAST);
  502. }
  503. rootitems[13]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, TranslateStringACP(sTreeRoots[13]), 13, 13, 0, 0, 13, TVI_ROOT, first);
  504. rootitems[12]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
  505. TranslateStringACP(sTreeRoots[12]), 12,12, 0, 0, 12, TVI_ROOT, TVI_LAST);
  506. rootitems[10]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
  507. TranslateStringACP(sTreeRoots[10]), 10, 10, 0, 0, 10, TVI_ROOT, TVI_LAST);
  508. #ifdef SMUDGE_SUPP
  509. rootitems[14]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
  510. TranslateStringACP(sTreeRoots[14]), 14, 14, 0, 0, 10, TVI_ROOT, rootitems[4]);
  511. #endif
  512. HTREEITEM structhouses[64];
  513. #ifdef RA2_MODE
  514. HTREEITEM hAllied=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("Allied"), 0, 0,0,0,-1,rootitems[3], TVI_LAST);
  515. HTREEITEM hSoviet=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("Soviet"), 0, 0,0,0,-1,rootitems[3], TVI_LAST);
  516. HTREEITEM hYuri=NULL;
  517. if(yuri_mode)
  518. {
  519. hYuri=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("Yuri"), 0, 0, 0, 0, -1, rootitems[3], TVI_LAST);
  520. }
  521. for(i=0;i<sides.size();i++)
  522. {
  523. if(sides[i].orig_n==0)
  524. structhouses[i]=hAllied;
  525. else if(yuri_mode && sides[i].orig_n==2)
  526. structhouses[i]=hYuri;
  527. else
  528. structhouses[i]=hSoviet;
  529. }
  530. structhouses[sides.size()]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("Other"), 0, 0,0,0,-1,rootitems[3], TVI_LAST);
  531. #else
  532. for(i=0;i<sides.size();i++)
  533. {
  534. structhouses[i]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, sides[i].name, 0,0,0,0, -1, rootitems[3], TVI_LAST );
  535. }
  536. structhouses[sides.size()]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, "Other", 0,0,0,0, -1, rootitems[3], TVI_LAST );
  537. #endif
  538. if(!theApp.m_Options.bEasy)
  539. {
  540. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CreateWaypObList"), 0,0,0,0, 20, rootitems[6], TVI_LAST );
  541. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CreateSpecWaypObList"), 0,0,0,0, 22, rootitems[6], TVI_LAST );
  542. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelWaypObList"), 0,0,0,0, 21, rootitems[6], TVI_LAST );
  543. }
  544. int e;
  545. int max=8;
  546. //if(ini.sections.find(HOUSES)!=ini.sections.end() && ini.sections.find(MAPHOUSES)!=ini.sections.end())
  547. if(!Map->IsMultiplayer())
  548. max=1;
  549. else
  550. {
  551. }
  552. for(e=0;e<max;e++)
  553. {
  554. CString ins=GetLanguageStringACP("StartpointsPlayerObList");
  555. char c[50];
  556. itoa(e+1,c,10);
  557. ins=TranslateStringVariables(1, ins, c);
  558. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, ins, 0,0,0,0, 23+e, rootitems[12], TVI_LAST );
  559. }
  560. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("StartpointsDelete"), 0,0,0,0, 21, rootitems[12], TVI_LAST );
  561. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetTheaterLanguageString("GroundClearObList"),0,0,0,0,61,rootitems[13], TVI_LAST);
  562. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetTheaterLanguageString("GroundSandObList"),0,0,0,0,62,rootitems[13], TVI_LAST);
  563. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetTheaterLanguageString("GroundRoughObList"),0,0,0,0,63,rootitems[13], TVI_LAST);
  564. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetTheaterLanguageString("GroundGreenObList"),0,0,0,0,65,rootitems[13], TVI_LAST);
  565. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetTheaterLanguageString("GroundPaveObList"),0,0,0,0,66,rootitems[13], TVI_LAST);
  566. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetTheaterLanguageString("GroundWaterObList"),0,0,0,0,64,rootitems[13], TVI_LAST);
  567. #ifdef RA2_MODE
  568. if(Map->GetTheater()==THEATER3)
  569. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetTheaterLanguageString("GroundPave2ObList"),0,0,0,0,67,rootitems[13], TVI_LAST);
  570. #endif
  571. if(!theApp.m_Options.bEasy)
  572. {
  573. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CreateCelltagObList"), 0,0,0,0, 36, rootitems[7], TVI_LAST );
  574. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelCelltagObList"), 0,0,0,0, 37, rootitems[7], TVI_LAST );
  575. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CelltagPropObList"), 0,0,0,0, 38, rootitems[7], TVI_LAST );
  576. }
  577. if(!theApp.m_Options.bEasy)
  578. {
  579. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CreateNodeNoDelObList"), 0,0,0,0, 40, rootitems[8], TVI_LAST );
  580. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CreateNodeDelObList"), 0,0,0,0, 41, rootitems[8], TVI_LAST );
  581. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelNodeObList"), 0,0,0,0, 42, rootitems[8], TVI_LAST );
  582. }
  583. HTREEITEM deleteoverlay=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrlObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
  584. HTREEITEM tiberium=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("GrTibObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
  585. //HTREEITEM bluetiberium=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("BlTibObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
  586. #ifndef RA2_MODE
  587. HTREEITEM veinhole=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("VeinholeObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
  588. #endif
  589. HTREEITEM bridges=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("BridgesObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
  590. HTREEITEM alloverlay=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("OthObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
  591. HTREEITEM everyoverlay=NULL;
  592. if(!theApp.m_Options.bEasy)
  593. {
  594. everyoverlay=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("AllObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
  595. }
  596. if(!theApp.m_Options.bEasy)
  597. {
  598. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("OvrlManuallyObList"), 0,0,0,0, valadded*6+1, rootitems[5], TVI_LAST );
  599. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("OvrlDataManuallyObList"), 0,0,0,0, valadded*6+2, rootitems[5], TVI_LAST );
  600. }
  601. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrl0ObList"), 0,0,0,0, valadded*6+100+0, deleteoverlay, TVI_LAST );
  602. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrl1ObList"), 0,0,0,0, valadded*6+100+1, deleteoverlay, TVI_LAST );
  603. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrl2ObList"), 0,0,0,0, valadded*6+100+2, deleteoverlay, TVI_LAST );
  604. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrl3ObList"), 0,0,0,0, valadded*6+100+3, deleteoverlay, TVI_LAST );
  605. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DrawRanTibObList"), 0,0,0,0, valadded*6+200+0, tiberium, TVI_LAST );
  606. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DrawTibObList"), 0,0,0,0, valadded*6+200+10, tiberium, TVI_LAST );
  607. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("IncTibSizeObList"), 0,0,0,0, valadded*6+200+20, tiberium, TVI_LAST );
  608. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DecTibSizeObList"), 0,0,0,0, valadded*6+200+21, tiberium, TVI_LAST );
  609. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DrawRanTibObList"), 0,0,0,0, valadded*6+300+0, bluetiberium, TVI_LAST );
  610. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DrawTib2ObList"), 0,0,0,0, valadded*6+300+10, tiberium, TVI_LAST );
  611. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("IncTibSizeObList"), 0,0,0,0, valadded*6+300+20, bluetiberium, TVI_LAST );
  612. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DecTibSizeObList"), 0,0,0,0, valadded*6+300+21, bluetiberium, TVI_LAST );
  613. #ifndef RA2_MODE
  614. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("VeinholeObList"), 0,0,0,0, valadded*6+400+0, veinhole, TVI_LAST );
  615. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("VeinsObList"), 0,0,0,0, valadded*6+400+1, veinhole, TVI_LAST );
  616. #endif
  617. if(Map->GetTheater()!=THEATER4 && Map->GetTheater()!=THEATER5)
  618. {
  619. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("SmallBridgeObList"), 0,0,0,0, valadded*6+500+1, bridges, TVI_LAST );
  620. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("BigBridgeObList"), 0,0,0,0, valadded*6+500+0, bridges, TVI_LAST );
  621. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("BigTrackBridgeObList"), 0,0,0,0, valadded*6+500+2, bridges, TVI_LAST );
  622. #ifdef RA2_MODE
  623. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("SmallConcreteBridgeObList"), 0,0,0,0, valadded*6+500+3, bridges, TVI_LAST );
  624. #endif
  625. }
  626. else
  627. {
  628. if(Map->GetTheater()==THEATER5)
  629. {
  630. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("SmallBridgeObList"), 0,0,0,0, valadded*6+500+1, bridges, TVI_LAST );
  631. #ifdef RA2_MODE
  632. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("SmallConcreteBridgeObList"), 0,0,0,0, valadded*6+500+3, bridges, TVI_LAST );
  633. #endif
  634. }
  635. }
  636. #ifndef RA2_MODE
  637. if (!theApp.m_Options.bEasy && isTrue(g_data.sections["Debug"].values["AllowTunnels"]))
  638. {
  639. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("NewTunnelObList"), 0, 0, 0, 0, 50, rootitems[9], TVI_LAST);
  640. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("ModifyTunnelObList"), 0, 0, 0, 0, 51, rootitems[9], TVI_LAST);
  641. if (isTrue(g_data.sections["Debug"].values["AllowUnidirectionalTunnels"]))
  642. {
  643. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("NewTunnelSingleObList"), 0, 0, 0, 0, 52, rootitems[9], TVI_LAST);
  644. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("ModifyTunnelSingleObList"), 0, 0, 0, 0, 53, rootitems[9], TVI_LAST);
  645. }
  646. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelTunnelObList"), 0, 0, 0, 0, 54, rootitems[9], TVI_LAST);
  647. }
  648. #else
  649. if (!theApp.m_Options.bEasy && isTrue(g_data.sections["Debug"].values["AllowTunnels"]))
  650. {
  651. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("NewTunnelObList"), 0, 0, 0, 0, 50, rootitems[9], TVI_LAST);
  652. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("ModifyTunnelObList"), 0, 0, 0, 0, 51, rootitems[9], TVI_LAST);
  653. if (isTrue(g_data.sections["Debug"].values["AllowUnidirectionalTunnels"]))
  654. {
  655. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("NewTunnelSingleObList"), 0, 0, 0, 0, 52, rootitems[9], TVI_LAST);
  656. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("ModifyTunnelSingleObList"), 0, 0, 0, 0, 53, rootitems[9], TVI_LAST);
  657. }
  658. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelTunnelObList"), 0,0,0,0, 54, rootitems[9], TVI_LAST );
  659. }
  660. #endif
  661. int lv=1;
  662. if(!theApp.m_Options.bEasy || !Map->IsMultiplayer())
  663. {
  664. if(ini.sections.find(MAPHOUSES)!=ini.sections.end() && ini.sections[MAPHOUSES].values.size()>0)
  665. {
  666. for(i=0;i<ini.sections[MAPHOUSES].values.size();i++)
  667. {
  668. #ifdef RA2_MODE
  669. CString j=*ini.sections[MAPHOUSES].GetValue(i);
  670. j.MakeLower();
  671. if(j=="nod" || j=="gdi") continue;
  672. #endif
  673. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, TranslateHouse(*ini.sections[MAPHOUSES].GetValue(i), TRUE), 0,0,0,0, valadded*7+i, rootitems[11], TVI_LAST );
  674. }
  675. }
  676. else
  677. {
  678. for(i=0;i<rules.sections[HOUSES].values.size();i++)
  679. {
  680. if(rules.sections[HOUSES].GetValueOrigPos(i)<0) continue;
  681. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, CCStrings[*rules.sections[HOUSES].GetValue(i)].cString,
  682. //0,0,0,0, valadded*7+i, rootitems[11], TVI_LAST );
  683. #ifdef RA2_MODE
  684. CString j=*rules.sections[HOUSES].GetValue(i);
  685. j.MakeLower();
  686. if(j=="nod" || j=="gdi") continue;
  687. #endif
  688. TV_InsertItemW(tree.m_hWnd, CCStrings[*rules.sections[HOUSES].GetValue(i)].wString, CCStrings[*rules.sections[HOUSES].GetValue(i)].len, TVI_LAST, rootitems[11],valadded*7+i);
  689. }
  690. }
  691. }
  692. else
  693. {
  694. // change owner to neutral
  695. if(ini.sections.find(MAPHOUSES)!=ini.sections.end() && ini.sections[MAPHOUSES].values.size()>0)
  696. {
  697. if(ini.sections[MAPHOUSES].FindValue("Neutral")>=0)
  698. currentOwner="Neutral";
  699. else
  700. currentOwner=*ini.sections[MAPHOUSES].GetValue(0);
  701. }
  702. else
  703. currentOwner="Neutral";
  704. }
  705. for(i=0;i<overlay_count;i++)
  706. {
  707. if(overlay_visible[i] && (!yr_only[i] || yuri_mode))
  708. {
  709. if(!overlay_trdebug[i] || isTrue(g_data.sections["Debug"].values["EnableTrackLogic"]))
  710. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, TranslateStringACP(overlay_name[i]), 0,0,0,0, valadded*6+3000+overlay_number[i], alloverlay, TVI_LAST );
  711. }
  712. }
  713. e=0;
  714. if(!theApp.m_Options.bEasy)
  715. {
  716. for(i=0;i<rules.sections["OverlayTypes"].values.size();i++)
  717. {
  718. // it seems there is somewhere a bug that lists empty overlay ids... though they are not in the rules.ini
  719. // so this here is the workaround:
  720. CString id=*rules.sections["OverlayTypes"].GetValue(i);
  721. //if(strchr(id,' ')!=NULL){ id[strchr(id,' ')-id;};
  722. if(id.Find(' ')>=0) id = id.Left(id.Find(' '));
  723. if(id.GetLength()>0)
  724. {
  725. CString unitname=*rules.sections["OverlayTypes"].GetValue(i);
  726. #ifdef RA2_MODE
  727. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
  728. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
  729. if (Map->GetTheater()==THEATER2 && g_data.sections["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
  730. if (Map->GetTheater()==THEATER3 && g_data.sections["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
  731. if (Map->GetTheater()==THEATER4 && g_data.sections["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
  732. if (Map->GetTheater()==THEATER5 && g_data.sections["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
  733. #else
  734. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
  735. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
  736. #endif
  737. #ifdef RA2_MODE
  738. if((i>=39 && i<=60) || (i>=180 && i<=201) || i==239 || i==178 || i==167 || i==126
  739. || (i>=122 && i<=125) || i==1 || (i>=0x03 && i<=0x17) || (i>=0x3d && i<=0x43)
  740. || (i>=0x4a && i<=0x65) || (i>=0xcd && i<=0xec))
  741. {
  742. if(!isTrue(g_data.sections["Debug"].values["DisplayAllOverlay"]))
  743. {
  744. e++;
  745. continue;
  746. }
  747. }
  748. #endif
  749. CString val=*rules.sections["OverlayTypes"].GetValue(i);
  750. #ifdef RA2_MODE
  751. val.Replace("TIB", "ORE");
  752. #endif
  753. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, val , 0,0,0,0, valadded*6+3000+e, everyoverlay, TVI_LAST );
  754. e++;
  755. }
  756. }
  757. }
  758. for(i=0;i<rules.sections["InfantryTypes"].values.size();i++)
  759. {
  760. CString unitname=*rules.sections["InfantryTypes"].GetValue(i);
  761. if(unitname.GetLength()==0) continue;
  762. #ifdef RA2_MODE
  763. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
  764. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
  765. if (Map->GetTheater()==THEATER2 && g_data.sections["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
  766. if (Map->GetTheater()==THEATER3 && g_data.sections["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
  767. if (Map->GetTheater()==THEATER4 && g_data.sections["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
  768. if (Map->GetTheater()==THEATER5 && g_data.sections["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
  769. #else
  770. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
  771. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
  772. #endif
  773. #ifdef RA2_MODE
  774. if(g_data.sections["IgnoreRA2"].FindValue(unitname)>=0) continue;
  775. #else
  776. if(g_data.sections["IgnoreTS"].FindValue(unitname) >= 0) continue;
  777. #endif
  778. WCHAR* addedString=Map->GetUnitName(unitname);
  779. if(!addedString) continue;
  780. //addedString=TranslateStringACP(addedString);
  781. //addedString+=" (";
  782. //addedString+=unitname+")";
  783. TV_InsertItemW(tree.m_hWnd, addedString, wcslen(addedString), TVI_LAST, rootitems[0], valadded*1+i);
  784. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*1+i, rootitems[0], TVI_LAST );
  785. lv=i;
  786. }
  787. lv+=1;
  788. // okay, now the user-defined types:
  789. for(i=0;i<ini.sections["InfantryTypes"].values.size();i++)
  790. {
  791. if(ini.sections["InfantryTypes"].GetValue(i)->GetLength()==0) continue;
  792. if(strlen(ini.sections[*ini.sections["InfantryTypes"].GetValue(i)].values["Name"])>0)
  793. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, ini.sections[*ini.sections["InfantryTypes"].GetValue(i)].values["Name"], 0,0,0,0, valadded*1+rules.sections["InfantryTypes"].values.size()+i, rootitems[0], TVI_LAST );
  794. else
  795. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, (*ini.sections["InfantryTypes"].GetValue(i)+" NOTDEFINED"), 0,0,0,0, valadded*1+rules.sections["InfantryTypes"].values.size()+i, rootitems[0], TVI_LAST );
  796. }
  797. CString theater=Map->GetTheater();
  798. auto needed_terrain=TheaterChar::None;
  799. if(tiledata==&s_tiledata) needed_terrain=TheaterChar::A;
  800. else if(tiledata==&t_tiledata) needed_terrain=TheaterChar::T;
  801. for(i=0;i<rules.sections["BuildingTypes"].values.size();i++)
  802. {
  803. CString unitname=*rules.sections["BuildingTypes"].GetValue(i);
  804. if(unitname.GetLength()==0) continue;
  805. #ifdef RA2_MODE
  806. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
  807. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
  808. if (Map->GetTheater()==THEATER2 && g_data.sections["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
  809. if (Map->GetTheater()==THEATER3 && g_data.sections["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
  810. if (Map->GetTheater()==THEATER4 && g_data.sections["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
  811. if (Map->GetTheater()==THEATER5 && g_data.sections["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
  812. #else
  813. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
  814. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
  815. #endif
  816. #ifdef RA2_MODE
  817. if (g_data.sections["IgnoreRA2"].FindValue(unitname) >= 0) continue;
  818. #else
  819. if (g_data.sections["IgnoreTS"].FindValue(unitname) >= 0) continue;
  820. #endif
  821. if (!isTrue(g_data.sections["Debug"].GetValueByName("ShowBuildingsWithToTile", "0")) && !rules.sections[unitname].GetValueByName("ToTile").IsEmpty())
  822. continue;
  823. WCHAR* addedString=Map->GetUnitName(unitname);
  824. if(!addedString) continue;
  825. CString owner=rules.sections[unitname].values["Owner"];
  826. int baseplanningside=-1;
  827. #ifdef RA2_MODE
  828. baseplanningside=-1;
  829. #endif
  830. if(rules.sections[unitname].values.find("AIBasePlanningSide")!=rules.sections[unitname].values.end())
  831. {
  832. baseplanningside=atoi(rules.sections[unitname].values["AIBasePlanningSide"]);
  833. }
  834. if(g_data.sections.find(unitname)!=g_data.sections.end() && g_data.sections[unitname].values.find("AIBasePlanningSide")!=g_data.sections[unitname].values.end())
  835. {
  836. baseplanningside=atoi(g_data.sections[unitname].values["AIBasePlanningSide"]);
  837. }
  838. int id=Map->GetBuildingID(unitname);
  839. if(id<0 /*|| (buildinginfo[id].pic[0].bTerrain!=0 && buildinginfo[id].pic[0].bTerrain!=needed_terrain)*/)
  840. continue;
  841. if(theater==THEATER0 && !buildinginfo[id].bTemp) { /*MessageBox("Ignored", unitname,0);*/ continue;}
  842. if(theater==THEATER1 && !buildinginfo[id].bSnow) { /*MessageBox("Ignored", unitname,0);*/ continue;}
  843. if(theater==THEATER2 && !buildinginfo[id].bUrban) { /*MessageBox("Ignored", unitname,0);*/ continue;}
  844. // check if mapfile contains other value for owner
  845. if(ini.sections.find(unitname)!=ini.sections.end())
  846. {
  847. if(ini.sections[unitname].values.find("Owner")!=ini.sections[unitname].values.end())
  848. owner=ini.sections[unitname].values["Owner"];
  849. }
  850. //addedString=TranslateStringACP(addedString);
  851. //addedString+=" (";
  852. //addedString+=unitname+")";
  853. BOOL addedfor[3]={FALSE,FALSE,FALSE};
  854. // MW fixed below for YR... uhhh...
  855. int e;
  856. BOOL bAdded=FALSE;
  857. for(e=0;e<sides.size();e++)
  858. {
  859. //MessageBox(sides[e].name);
  860. if(isIncluded(owner,sides[e].name))
  861. {
  862. #ifdef RA2_MODE
  863. if(!addedfor[sides[e].orig_n])
  864. #endif
  865. if(baseplanningside==-1 || baseplanningside==sides[e].orig_n)
  866. {
  867. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*2+i, structhouses[e], TVI_LAST );
  868. TV_InsertItemW(tree.m_hWnd, addedString, wcslen(addedString), TVI_LAST, structhouses[e], valadded*2+i);
  869. bAdded=TRUE;
  870. addedfor[sides[e].orig_n]=TRUE;
  871. }
  872. }
  873. }
  874. if(bAdded==FALSE)
  875. {
  876. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*2+i, structhouses[e+1], TVI_LAST );
  877. TV_InsertItemW(tree.m_hWnd, addedString, wcslen(addedString), TVI_LAST, structhouses[sides.size()], valadded*2+i);
  878. }
  879. lv=i;
  880. }
  881. lv+=1;
  882. // okay, now the user-defined types:
  883. for(i=0;i<ini.sections["BuildingTypes"].values.size();i++)
  884. {
  885. if(ini.sections["BuildingTypes"].GetValue(i)->GetLength()==0) continue;
  886. int id=Map->GetBuildingID(*ini.sections["BuildingTypes"].GetValue(i));
  887. if(id<0 || (buildinginfo[id].pic[0].bTerrain!=TheaterChar::None && buildinginfo[id].pic[0].bTerrain!=needed_terrain))
  888. continue;
  889. int e=2;
  890. CString owner;
  891. BOOL bAdded=FALSE;
  892. owner=ini.sections[*ini.sections["BuildingTypes"].GetValue(i)].values["Owner"];
  893. owner.MakeUpper();
  894. if(strlen(ini.sections[*ini.sections["BuildingTypes"].GetValue(i)].values["Name"])>0)
  895. {
  896. CString addedString=ini.sections[*ini.sections["BuildingTypes"].GetValue(i)].values["Name"];
  897. int e;
  898. for(e=0;e<sides.size();e++)
  899. {
  900. if(isIncluded(owner, sides[e].name))
  901. {
  902. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*2+i, structhouses[e], TVI_LAST );
  903. bAdded=TRUE;
  904. }
  905. else if(e==sides.size()-1 && bAdded==FALSE)
  906. {
  907. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*2+i, structhouses[e+1], TVI_LAST );
  908. }
  909. }
  910. }
  911. else
  912. {
  913. CString addedString=(*ini.sections["BuildingTypes"].GetValue(i)+" UNDEFINED");
  914. BOOL addedfor[2]={FALSE,FALSE};
  915. int e;
  916. for(e=0;e<sides.size();e++)
  917. {
  918. #ifdef RA2_MODE
  919. if(!addedfor[sides[e].orig_n])
  920. #endif
  921. if(isIncluded(owner, sides[e].name) || (yuri_mode && e==2 && owner=="YuriCountry"))
  922. {
  923. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*2+i, structhouses[e], TVI_LAST );
  924. bAdded=TRUE;
  925. addedfor[sides[e].orig_n]=TRUE;
  926. }
  927. else if(e==sides.size()-1 && bAdded==FALSE)
  928. {
  929. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*2+i, structhouses[e+1], TVI_LAST );
  930. }
  931. }
  932. }
  933. }
  934. for(i=0;i<rules.sections["AircraftTypes"].values.size();i++)
  935. {
  936. CString unitname=*rules.sections["AircraftTypes"].GetValue(i);
  937. if(unitname.GetLength()==0) continue;
  938. #ifdef RA2_MODE
  939. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
  940. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
  941. if (Map->GetTheater()==THEATER2 && g_data.sections["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
  942. if (Map->GetTheater()==THEATER3 && g_data.sections["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
  943. if (Map->GetTheater()==THEATER4 && g_data.sections["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
  944. if (Map->GetTheater()==THEATER5 && g_data.sections["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
  945. #else
  946. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
  947. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
  948. #endif
  949. #ifdef RA2_MODE
  950. if (g_data.sections["IgnoreRA2"].FindValue(unitname) >= 0) continue;
  951. #else
  952. if (g_data.sections["IgnoreTS"].FindValue(unitname) >= 0) continue;
  953. #endif
  954. WCHAR* addedString=Map->GetUnitName(unitname);
  955. if(!addedString) continue;
  956. //addedString=TranslateStringACP(addedString);
  957. //addedString+=" (";
  958. //addedString+=unitname+")";
  959. TV_InsertItemW(tree.m_hWnd, addedString, wcslen(addedString), TVI_LAST, rootitems[2], valadded*3+i);
  960. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*3+i, rootitems[2], TVI_LAST );
  961. lv=i;
  962. }
  963. lv+=1;
  964. // okay, now the user-defined types:
  965. for(i=0;i<ini.sections["AircraftTypes"].values.size();i++)
  966. {
  967. if(ini.sections["AircraftTypes"].GetValue(i)->GetLength()==0) continue;
  968. if(strlen(ini.sections[*ini.sections["AircraftTypes"].GetValue(i)].values["Name"])>0)
  969. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, ini.sections[*ini.sections["AircraftTypes"].GetValue(i)].values["Name"], 0,0,0,0, valadded*3+i+rules.sections["AircraftTypes"].values.size(), rootitems[2], TVI_LAST );
  970. else
  971. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, (*ini.sections["AircraftTypes"].GetValue(i)+" NOTDEFINED"), 0,0,0,0, valadded*3+i+rules.sections["AircraftTypes"].values.size(), rootitems[2], TVI_LAST );
  972. }
  973. for(i=0;i<rules.sections["VehicleTypes"].values.size();i++)
  974. {
  975. CString unitname=*rules.sections["VehicleTypes"].GetValue(i);
  976. if(unitname.GetLength()==0) continue;
  977. #ifdef RA2_MODE
  978. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
  979. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
  980. if (Map->GetTheater()==THEATER2 && g_data.sections["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
  981. if (Map->GetTheater()==THEATER3 && g_data.sections["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
  982. if (Map->GetTheater()==THEATER4 && g_data.sections["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
  983. if (Map->GetTheater()==THEATER5 && g_data.sections["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
  984. #else
  985. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
  986. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
  987. #endif
  988. #ifdef RA2_MODE
  989. if (g_data.sections["IgnoreRA2"].FindValue(unitname) >= 0) continue;
  990. #else
  991. if (g_data.sections["IgnoreTS"].FindValue(unitname) >= 0) continue;
  992. #endif
  993. WCHAR* addedString=Map->GetUnitName(unitname);
  994. if(!addedString) continue;
  995. //addedString=TranslateStringACP(addedString);
  996. //addedString+=" (";
  997. //addedString+=unitname+")";
  998. TV_InsertItemW(tree.m_hWnd, addedString, wcslen(addedString), TVI_LAST, rootitems[1], valadded*4+i);
  999. //tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*4+i, rootitems[1], TVI_LAST );
  1000. lv=i;
  1001. }
  1002. lv+=1;
  1003. // okay, now the user-defined types:
  1004. for(i=0;i<ini.sections["VehicleTypes"].values.size();i++)
  1005. {
  1006. if(ini.sections["VehicleTypes"].GetValue(i)->GetLength()==0) continue;
  1007. if(strlen(ini.sections[*ini.sections["VehicleTypes"].GetValue(i)].values["Name"])>0)
  1008. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, ini.sections[*ini.sections["VehicleTypes"].GetValue(i)].values["Name"], 0,0,0,0, valadded*4+i+rules.sections["VehicleTypes"].values.size(), rootitems[1], TVI_LAST );
  1009. else
  1010. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, (*ini.sections["VehicleTypes"].GetValue(i)+" NOTDEFINED"), 0,0,0,0, valadded*4+i+rules.sections["VehicleTypes"].values.size(), rootitems[1], TVI_LAST );
  1011. }
  1012. #ifdef RA2_MODE
  1013. HTREEITEM hTrees=tree.InsertItem(GetLanguageStringACP("TreesObList"), rootitems[4], TVI_LAST);
  1014. HTREEITEM hTL=tree.InsertItem(GetLanguageStringACP("TrafficLightsObList"), rootitems[4], TVI_LAST);
  1015. HTREEITEM hSigns=tree.InsertItem(GetLanguageStringACP("SignsObList"), rootitems[4], TVI_LAST);
  1016. HTREEITEM hLightPosts=tree.InsertItem(GetLanguageStringACP("LightPostsObList"), rootitems[4], TVI_LAST);
  1017. #endif
  1018. // random tree placer
  1019. #ifdef RA2_MODE
  1020. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("RndTreeObList"), 0,0,0,0, valadded*5+999, hTrees, TVI_LAST);
  1021. #else
  1022. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("RndTreeObList"), 0,0,0,0, valadded*5+999, rootitems[4], TVI_LAST);
  1023. #endif
  1024. for(i=0;i<rules.sections["TerrainTypes"].values.size();i++)
  1025. {
  1026. CString unitname=*rules.sections["TerrainTypes"].GetValue(i);
  1027. CString addedString=Map->GetUnitName(unitname);
  1028. #ifdef RA2_MODE
  1029. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
  1030. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
  1031. if (Map->GetTheater()==THEATER2 && g_data.sections["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
  1032. if (Map->GetTheater()==THEATER3 && g_data.sections["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
  1033. if (Map->GetTheater()==THEATER4 && g_data.sections["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
  1034. if (Map->GetTheater()==THEATER5 && g_data.sections["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
  1035. #else
  1036. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
  1037. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
  1038. #endif
  1039. #ifdef RA2_MODE
  1040. if (g_data.sections["IgnoreRA2"].FindValue(unitname) >= 0) continue;
  1041. #else
  1042. if (g_data.sections["IgnoreTS"].FindValue(unitname) >= 0) continue;
  1043. #endif
  1044. #ifdef RA2_MODE
  1045. if (g_data.sections["IgnoreTerrainRA2"].FindValue(unitname) >= 0) continue;
  1046. #else
  1047. if (g_data.sections["IgnoreTerrainTS"].FindValue(unitname) >= 0) continue;
  1048. #endif
  1049. addedString=TranslateStringACP(addedString);
  1050. UINT flags=MF_STRING;
  1051. HTREEITEM howner=rootitems[4];
  1052. #ifdef RA2_MODE
  1053. if(unitname.Find("SIGN")>=0) howner=hSigns;
  1054. if(unitname.Find("TRFF")>=0) howner=hTL;
  1055. if(unitname.Find("TREE")>=0) howner=hTrees;
  1056. if(unitname.Find("LT")>=0) howner=hLightPosts;
  1057. #endif
  1058. #ifdef RA2_MODE
  1059. if(howner==hTrees)
  1060. {
  1061. int TreeMin=atoi(g_data.sections[Map->GetTheater()+"Limits"].values["TreeMin"]);
  1062. int TreeMax=atoi(g_data.sections[Map->GetTheater()+"Limits"].values["TreeMax"]);
  1063. CString id=unitname;
  1064. id.Delete(0, 4);
  1065. int n=atoi(id);
  1066. if(n<TreeMin || n>TreeMax) continue;
  1067. }
  1068. #endif
  1069. if(unitname.GetLength()>0 && unitname!="VEINTREE" && unitname.Find("ICE")<0 && unitname.Find("BOXES")<0 && unitname.Find("SPKR")<0) // out with it :-)
  1070. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, (addedString+ " (" + unitname +")"), 0,0,0,0, valadded*5+i, howner, TVI_LAST );
  1071. lv=i;
  1072. }
  1073. #ifdef SMUDGE_SUPP
  1074. for(i=0;i<rules.sections["SmudgeTypes"].values.size();i++)
  1075. {
  1076. CString unitname=*rules.sections["SmudgeTypes"].GetValue(i);
  1077. CString addedString=unitname;
  1078. #ifdef RA2_MODE
  1079. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
  1080. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
  1081. if (Map->GetTheater()==THEATER2 && g_data.sections["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
  1082. if (Map->GetTheater()==THEATER3 && g_data.sections["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
  1083. if (Map->GetTheater()==THEATER4 && g_data.sections["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
  1084. if (Map->GetTheater()==THEATER5 && g_data.sections["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
  1085. #else
  1086. if (Map->GetTheater()==THEATER0 && g_data.sections["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
  1087. if (Map->GetTheater()==THEATER1 && g_data.sections["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
  1088. #endif
  1089. #ifdef RA2_MODE
  1090. if (g_data.sections["IgnoreRA2"].FindValue(unitname) >= 0) continue;
  1091. #else
  1092. if (g_data.sections["IgnoreTS"].FindValue(unitname) >= 0) continue;
  1093. #endif
  1094. addedString=TranslateStringACP(addedString);
  1095. UINT flags=MF_STRING;
  1096. HTREEITEM howner=rootitems[14];
  1097. if(unitname.GetLength()>0)
  1098. tree.InsertItem(TVIF_PARAM | TVIF_TEXT, unitname, 0,0,0,0, valadded*8+i, howner, TVI_LAST );
  1099. lv=i;
  1100. }
  1101. #endif
  1102. OutputDebugString("Objectbrowser redraw finished\n");
  1103. }
  1104. int CViewObjects::OnCreate(LPCREATESTRUCT lpCreateStruct)
  1105. {
  1106. lpCreateStruct->style|=TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS;
  1107. if (CTreeView::OnCreate(lpCreateStruct) == -1)
  1108. return -1;
  1109. return 0;
  1110. }
  1111. void CViewObjects::OnInitialUpdate()
  1112. {
  1113. CTreeView::OnInitialUpdate();
  1114. m_ready=TRUE;
  1115. }
  1116. void CViewObjects::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
  1117. {
  1118. TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
  1119. // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
  1120. *pResult = 0;
  1121. }
  1122. void CViewObjects::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  1123. {
  1124. // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
  1125. // CTreeView::OnKeyDown(nChar, nRepCnt, nFlags);
  1126. }
  1127. void CViewObjects::HandleBrushSize(int iTile)
  1128. {
  1129. if(iTile>=*tiledata_count) return;
  1130. int i;
  1131. for(i=0;i<g_data.sections["StdBrushSize"].values.size();i++)
  1132. {
  1133. CString n=*g_data.sections["StdBrushSize"].GetValueName(i);
  1134. if((*tiles).sections["General"].FindName(n)>=0)
  1135. {
  1136. int tset=atoi((*tiles).sections["General"].values[n]);
  1137. if(tset==(*tiledata)[iTile].wTileSet)
  1138. {
  1139. int bs=atoi(*g_data.sections["StdBrushSize"].GetValue(i));
  1140. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_settingsbar.m_BrushSize=bs-1;
  1141. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_settingsbar.UpdateData(FALSE);
  1142. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_x=bs;
  1143. ((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_y=bs;
  1144. }
  1145. }
  1146. }
  1147. }