/*
FinalSun/FinalAlert 2 Mission Editor
Copyright (C) 1999-2024 Electronic Arts, Inc.
Authored by Matthias Wagner
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
// ViewObjects.cpp: Implementierungsdatei
//
#include "stdafx.h"
#include "FinalSun.h"
#include "ViewObjects.h"
#include "FinalSunDlg.h"
#include "structs.h"
#include "mapdata.h"
#include "variables.h"
#include "functions.h"
#include "inlines.h"
#include "rtpdlg.h"
#include "TubeTool.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CViewObjects
const int valadded=10000;
IMPLEMENT_DYNCREATE(CViewObjects, CTreeView)
CViewObjects::CViewObjects()
{
m_ready=FALSE;
}
CViewObjects::~CViewObjects()
{
}
BEGIN_MESSAGE_MAP(CViewObjects, CTreeView)
//{{AFX_MSG_MAP(CViewObjects)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_WM_CREATE()
ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
extern int overlay_number[];
extern CString overlay_name[];
extern BOOL overlay_visible[];
extern BOOL overlay_trail[];
extern int overlay_count;
extern ACTIONDATA AD;
/////////////////////////////////////////////////////////////////////////////
// Zeichnung CViewObjects
void CViewObjects::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// ZU ERLEDIGEN: Code zum Zeichnen hier einfügen
}
/////////////////////////////////////////////////////////////////////////////
// Diagnose CViewObjects
#ifdef _DEBUG
void CViewObjects::AssertValid() const
{
CTreeView::AssertValid();
}
void CViewObjects::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
CString GetTheaterLanguageString(LPCSTR lpString)
{
CString s=lpString;
CString t=lpString;
if((tiledata)==&t_tiledata) t+="TEM";
if((tiledata)==&s_tiledata) t+="SNO";
if((tiledata)==&u_tiledata) t+="URB";
if((tiledata)==&un_tiledata) t+="UBN";
if((tiledata)==&l_tiledata) t+="LUN";
if((tiledata)==&d_tiledata) t+="DES";
CString res=GetLanguageStringACP(t);
if(res.GetLength()==0) res=GetLanguageStringACP(s);
return res;
}
/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten CViewObjects
void CViewObjects::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
CIniFile& ini=Map->GetIniFile();
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
int val=pNMTreeView->itemNew.lParam;
if(val<0){ // return;
if(val==-2) {
AD.reset();
((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
}
return;
}
if(valm_view.m_isoview, true));
break;
}
case 51:
{
AD.mode = ACTIONMODE_MAPTOOL;
AD.tool.reset(new ModifyTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview, true));
break;
}
case 52:
{
AD.mode = ACTIONMODE_MAPTOOL;
AD.tool.reset(new AddTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview, false));
break;
}
case 53:
{
AD.mode = ACTIONMODE_MAPTOOL;
AD.tool.reset(new ModifyTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview, false));
break;
}
case 54:
{
AD.mode=ACTIONMODE_MAPTOOL;
AD.tool.reset(new RemoveTubeTool(*Map, *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview));
break;
}
case 61:
if(!tiledata_count) break;
AD.type=0;
AD.mode=ACTIONMODE_SETTILE;
AD.data=0;
AD.z_data=0;
HandleBrushSize(0);
break;
case 62:
int i;
if (!tiledata_count) {
break;
}
for (i = 0; i < (*tiledata_count); i++) {
if ((*tiledata)[i].wTileSet == tiles->GetInteger("General", "SandTile")) {
break;
}
}
AD.type=i;
AD.mode=ACTIONMODE_SETTILE;
AD.data=0;
AD.z_data=0;
HandleBrushSize(i);
break;
case 63:
if (!tiledata_count) {
break;
}
for (i = 0; i < (*tiledata_count); i++) {
if ((*tiledata)[i].wTileSet == tiles->GetInteger("General", "RoughTile")) {
break;
}
}
AD.type=i;
AD.mode=ACTIONMODE_SETTILE;
AD.data=0;
AD.z_data=0;
HandleBrushSize(i);
break;
case 64:
if(!tiledata_count) break;
for(i=0;i<(*tiledata_count);i++)
if((*tiledata)[i].wTileSet==waterset) break;
if(((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_x<2 ||
((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_y<2)
{
((CFinalSunDlg*)theApp.m_pMainWnd)->m_settingsbar.m_BrushSize=1;
((CFinalSunDlg*)theApp.m_pMainWnd)->m_settingsbar.UpdateData(FALSE);
((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_x=2;
((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_y=2;
}
AD.type=i;
AD.mode=ACTIONMODE_SETTILE;
AD.data=1; // use water placement logic
AD.z_data=0;
break;
case 65:
if (!tiledata_count) {
break;
}
for (i = 0; i < (*tiledata_count); i++) {
if ((*tiledata)[i].wTileSet == tiles->GetInteger("General", "GreenTile")) {
break;
}
}
AD.type=i;
AD.mode=ACTIONMODE_SETTILE;
AD.data=0;
AD.z_data=0;
HandleBrushSize(i);
break;
case 66:
if (!tiledata_count) {
break;
}
for (i = 0; i < (*tiledata_count); i++) {
if ((*tiledata)[i].wTileSet == tiles->GetInteger("General", "PaveTile")) {
break;
}
}
AD.type=i;
AD.mode=ACTIONMODE_SETTILE;
AD.data=0;
AD.z_data=0;
HandleBrushSize(i);
break;
case 67:
if (!tiledata_count) {
break;
}
for (i = 0; i < (*tiledata_count); i++) {
if ((*tiledata)[i].wTileSet == g_data.GetInteger("NewUrbanInfo", "Morphable2")) {
break;
}
}
AD.type=i;
AD.mode=ACTIONMODE_SETTILE;
AD.data=0;
AD.z_data=0;
HandleBrushSize(i);
break;
}
}
else
{
int subpos=val%valadded;
int pos=val/valadded;
AD.mode=1;
AD.type=pos;
AD.data=subpos;
if (pos == 1)
{
CString sec = "InfantryTypes";
if (subpos < rules[sec].Size())
{
// standard unit!
AD.data_s = rules[sec].Nth(subpos).second;
} else {
AD.data_s = ini[sec].Nth(subpos - rules[sec].Size()).second;
}
} else if (pos == 2) {
CString sec = "BuildingTypes";
if (subpos < rules[sec].Size()) {
// standard unit!
AD.data_s = rules[sec].Nth(subpos).second;
} else {
AD.data_s = ini[sec].Nth(subpos - rules[sec].Size()).second;
}
} else if (pos == 3) {
CString sec = "AircraftTypes";
if (subpos < rules[sec].Size()) {
// standard unit!
AD.data_s = rules[sec].Nth(subpos).second;
} else {
AD.data_s = ini[sec].Nth(subpos - rules[sec].Size()).second;
}
} else if (pos == 4) {
CString sec = "VehicleTypes";
if (subpos < rules[sec].Size()) {
// standard unit!
AD.data_s = rules[sec].Nth(subpos).second;
} else {
AD.data_s = ini[sec].Nth(subpos - rules[sec].Size()).second;
}
}
else if(pos==5) {
CString sec="TerrainTypes";
if(subpos==999)
{
CRTPDlg dlg;
if(dlg.DoModal()==IDOK)
{
AD.mode=ACTIONMODE_RANDOMTERRAIN;
}
}
else
{
if (subpos < rules[sec].Size()) {
// standard unit!
AD.data_s = rules[sec].Nth(subpos).second;
} else {
AD.data_s = ini[sec].Nth(subpos - rules[sec].Size()).second;
}
}
}
else if(pos==6)
{
if(subpos<100)
{
// general overlay functions!
if(subpos==1)
{
AD.data=31;
AD.data2=atoi(InputBox("Please enter the value (0-255) of the overlay. Don´t exceed this range.","Set overlay manually"));
}
else if(subpos==2)
{
AD.data=32;
AD.data2=atoi(InputBox("Please enter the value (0-255) of the overlay-data. Don´t exceed this range.","Set overlay manually"));
}
}
else
{
AD.data2=subpos%100;
AD.data=subpos/100;
if (AD.data >= 30) {
AD.data = 30;
AD.data2 = subpos % 1000;
}
}
}
else if(pos==7)
{
// set owner
//if(ini.find(MAPHOUSES)!=ini.end() && ini[MAPHOUSES].Size()>0)
if (ini[MAPHOUSES].Size() > 0) {
AD.data_s = ini[MAPHOUSES].Nth(subpos).second;
} else {
AD.data_s = rules[HOUSES].Nth(subpos).second;
}
currentOwner=AD.data_s;
}
#ifdef SMUDGE_SUPP
else if(pos==8)
{
CString sec="SmudgeTypes";
if(subpos>;
vecSideNodeInfo collectSides()
{
vecSideNodeInfo ret;
auto toType = [](const CString& str) -> TechnoTypeMask {
return TechnoTypeMask(atoi(str));
};
CString typeStr;
for (auto& [seq, def] : g_data["Sides"]) {
auto const commaPos = def.Find(',');
//now parse real type
if (commaPos >= 0) {
typeStr = def.Mid(commaPos + 1);
ret.push_back({ def.Mid(0, commaPos), toType(typeStr) });
}
}
return ret;
}
void CViewObjects::UpdateDialog()
{
OutputDebugString("Objectbrowser redrawn\n");
CTreeCtrl& tree=GetTreeCtrl();
CIniFile& ini=Map->GetIniFile();
tree.Select(0,TVGN_CARET );
tree.DeleteAllItems();
CString sTreeRoots[15];
sTreeRoots[0]=GetLanguageStringACP("InfantryObList");
sTreeRoots[1]=GetLanguageStringACP("VehiclesObList");
sTreeRoots[2]=GetLanguageStringACP("AircraftObList");
sTreeRoots[3]=GetLanguageStringACP("StructuresObList");
sTreeRoots[4]=GetLanguageStringACP("TerrainObList");
sTreeRoots[5]=GetLanguageStringACP("OverlayObList");
sTreeRoots[6]=GetLanguageStringACP("WaypointsObList");
sTreeRoots[7]=GetLanguageStringACP("CelltagsObList");
sTreeRoots[8]=GetLanguageStringACP("BaseNodesObList");
sTreeRoots[9]=GetLanguageStringACP("TunnelObList");
sTreeRoots[10]=GetLanguageStringACP("DelObjObList");
sTreeRoots[11]=GetLanguageStringACP("ChangeOwnerObList");
sTreeRoots[12]=GetLanguageStringACP("StartpointsObList");
sTreeRoots[13]=GetLanguageStringACP("GroundObList");
sTreeRoots[14]=GetLanguageStringACP("SmudgesObList");
int i=0;
//TV_InsertItemW(tree.m_hWnd, L"HELLO", 5, TVI_LAST, TVI_ROOT, -2);
HTREEITEM first=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
TranslateStringACP(GetLanguageStringACP("NothingObList")), i, i, 0, 0, -2, TVI_ROOT, TVI_LAST);
HTREEITEM rootitems[15];
// we want the change owner at the top
if(!Map->IsMultiplayer() || !theApp.m_Options.bEasy)
rootitems[11]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
TranslateStringACP(sTreeRoots[11]), i, i, 0, 0, i, TVI_ROOT, TVI_LAST);
for(i=0;i<10;i++)
{
BOOL bAllow=TRUE;
if(theApp.m_Options.bEasy)
{
if(i>=6 && i<=9)
bAllow=FALSE;
}
// no tunnels in ra2 mode
if (editor_mode == ra2_mode && i == 9 && !g_data.GetBool("Debug","AllowTunnels")) {
bAllow = FALSE;
}
if (bAllow) {
rootitems[i] = tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
sTreeRoots[i], i, i, 0, 0, i, TVI_ROOT, TVI_LAST);
}
}
rootitems[13]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, TranslateStringACP(sTreeRoots[13]), 13, 13, 0, 0, 13, TVI_ROOT, first);
rootitems[12]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
TranslateStringACP(sTreeRoots[12]), 12,12, 0, 0, 12, TVI_ROOT, TVI_LAST);
rootitems[10]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
TranslateStringACP(sTreeRoots[10]), 10, 10, 0, 0, 10, TVI_ROOT, TVI_LAST);
#ifdef SMUDGE_SUPP
rootitems[14]=tree.InsertItem(TVIF_PARAM | TVIF_TEXT,
TranslateStringACP(sTreeRoots[14]), 14, 14, 0, 0, 10, TVI_ROOT, rootitems[4]);
#endif
HTREEITEM structhouses[64];
#ifdef RA2_MODE
HTREEITEM hAllied=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("Allied"), 0, 0,0,0,-1,rootitems[3], TVI_LAST);
HTREEITEM hSoviet=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("Soviet"), 0, 0,0,0,-1,rootitems[3], TVI_LAST);
HTREEITEM hYuri=NULL;
if(yuri_mode)
{
hYuri=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("Yuri"), 0, 0, 0, 0, -1, rootitems[3], TVI_LAST);
}
for(i=0;iIsMultiplayer())
max=1;
else
{
}
for(e=0;eGetTheater()==THEATER3)
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetTheaterLanguageString("GroundPave2ObList"),0,0,0,0,67,rootitems[13], TVI_LAST);
#endif
if(!theApp.m_Options.bEasy)
{
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CreateCelltagObList"), 0,0,0,0, 36, rootitems[7], TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelCelltagObList"), 0,0,0,0, 37, rootitems[7], TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CelltagPropObList"), 0,0,0,0, 38, rootitems[7], TVI_LAST );
}
if(!theApp.m_Options.bEasy)
{
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CreateNodeNoDelObList"), 0,0,0,0, 40, rootitems[8], TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("CreateNodeDelObList"), 0,0,0,0, 41, rootitems[8], TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelNodeObList"), 0,0,0,0, 42, rootitems[8], TVI_LAST );
}
HTREEITEM deleteoverlay=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrlObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
HTREEITEM tiberium=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("GrTibObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
//HTREEITEM bluetiberium=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("BlTibObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
#ifndef RA2_MODE
HTREEITEM veinhole=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("VeinholeObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
#endif
HTREEITEM bridges=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("BridgesObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
HTREEITEM alloverlay=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("OthObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
HTREEITEM everyoverlay=NULL;
if(!theApp.m_Options.bEasy)
{
everyoverlay=tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("AllObList"), 0,0,0,0, -1, rootitems[5], TVI_LAST );
}
if(!theApp.m_Options.bEasy)
{
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("OvrlManuallyObList"), 0,0,0,0, valadded*6+1, rootitems[5], TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("OvrlDataManuallyObList"), 0,0,0,0, valadded*6+2, rootitems[5], TVI_LAST );
}
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrl0ObList"), 0,0,0,0, valadded*6+100+0, deleteoverlay, TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrl1ObList"), 0,0,0,0, valadded*6+100+1, deleteoverlay, TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrl2ObList"), 0,0,0,0, valadded*6+100+2, deleteoverlay, TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelOvrl3ObList"), 0,0,0,0, valadded*6+100+3, deleteoverlay, TVI_LAST );
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DrawRanTibObList"), 0,0,0,0, valadded*6+200+0, tiberium, TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DrawTibObList"), 0,0,0,0, valadded*6+200+10, tiberium, TVI_LAST );
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("IncTibSizeObList"), 0,0,0,0, valadded*6+200+20, tiberium, TVI_LAST );
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DecTibSizeObList"), 0,0,0,0, valadded*6+200+21, tiberium, TVI_LAST );
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DrawRanTibObList"), 0,0,0,0, valadded*6+300+0, bluetiberium, TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DrawTib2ObList"), 0,0,0,0, valadded*6+300+10, tiberium, TVI_LAST );
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("IncTibSizeObList"), 0,0,0,0, valadded*6+300+20, bluetiberium, TVI_LAST );
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DecTibSizeObList"), 0,0,0,0, valadded*6+300+21, bluetiberium, TVI_LAST );
#ifndef RA2_MODE
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("VeinholeObList"), 0,0,0,0, valadded*6+400+0, veinhole, TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("VeinsObList"), 0,0,0,0, valadded*6+400+1, veinhole, TVI_LAST );
#endif
if(Map->GetTheater()!=THEATER4 && Map->GetTheater()!=THEATER5)
{
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("SmallBridgeObList"), 0,0,0,0, valadded*6+500+1, bridges, TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("BigBridgeObList"), 0,0,0,0, valadded*6+500+0, bridges, TVI_LAST );
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("BigTrackBridgeObList"), 0,0,0,0, valadded*6+500+2, bridges, TVI_LAST );
#ifdef RA2_MODE
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("SmallConcreteBridgeObList"), 0,0,0,0, valadded*6+500+3, bridges, TVI_LAST );
#endif
}
else
{
if(Map->GetTheater()==THEATER5)
{
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("SmallBridgeObList"), 0,0,0,0, valadded*6+500+1, bridges, TVI_LAST );
#ifdef RA2_MODE
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("SmallConcreteBridgeObList"), 0,0,0,0, valadded*6+500+3, bridges, TVI_LAST );
#endif
}
}
#ifndef RA2_MODE
if (!theApp.m_Options.bEasy && isTrue(g_data["Debug"]["AllowTunnels"]))
{
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("NewTunnelObList"), 0, 0, 0, 0, 50, rootitems[9], TVI_LAST);
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("ModifyTunnelObList"), 0, 0, 0, 0, 51, rootitems[9], TVI_LAST);
if (isTrue(g_data["Debug"]["AllowUnidirectionalTunnels"]))
{
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("NewTunnelSingleObList"), 0, 0, 0, 0, 52, rootitems[9], TVI_LAST);
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("ModifyTunnelSingleObList"), 0, 0, 0, 0, 53, rootitems[9], TVI_LAST);
}
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelTunnelObList"), 0, 0, 0, 0, 54, rootitems[9], TVI_LAST);
}
#else
if (!theApp.m_Options.bEasy && g_data.GetBool( "Debug","AllowTunnels")) {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("NewTunnelObList"), 0, 0, 0, 0, 50, rootitems[9], TVI_LAST);
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("ModifyTunnelObList"), 0, 0, 0, 0, 51, rootitems[9], TVI_LAST);
if (g_data.GetBool("Debug", "AllowUnidirectionalTunnels")) {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("NewTunnelSingleObList"), 0, 0, 0, 0, 52, rootitems[9], TVI_LAST);
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("ModifyTunnelSingleObList"), 0, 0, 0, 0, 53, rootitems[9], TVI_LAST);
}
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("DelTunnelObList"), 0,0,0,0, 54, rootitems[9], TVI_LAST );
}
#endif
if(!theApp.m_Options.bEasy || !Map->IsMultiplayer())
{
if(ini[MAPHOUSES].Size()>0) {
for(i=0;i0)
{
if(ini[MAPHOUSES].FindValue("Neutral")>=0)
currentOwner="Neutral";
else
currentOwner=ini[MAPHOUSES].Nth(0).second;
}
else
currentOwner="Neutral";
}
for(i=0;i= 0) {
id = id.Left(id.Find(' '));
}
if (id.GetLength() > 0) {
#ifdef RA2_MODE
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER2 && g_data["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER3 && g_data["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER4 && g_data["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER5 && g_data["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
#else
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
#endif
#ifdef RA2_MODE
if((i>=39 && i<=60) || (i>=180 && i<=201) || i==239 || i==178 || i==167 || i==126
|| (i>=122 && i<=125) || i==1 || (i>=0x03 && i<=0x17) || (i>=0x3d && i<=0x43)
|| (i>=0x4a && i<=0x65) || (i>=0xcd && i<=0xec))
{
if(!g_data.GetBool("Debug", "DisplayAllOverlay")) {
e++;
continue;
}
}
#endif
CString val = unitname;
#ifdef RA2_MODE
val.Replace("TIB", "ORE");
#endif
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, val , 0,0,0,0, valadded*6+3000+e, everyoverlay, TVI_LAST );
e++;
}
}
}
for(i=0;iGetTheater()==THEATER0 && g_data["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER2 && g_data["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER3 && g_data["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER4 && g_data["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER5 && g_data["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
#else
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
#endif
#ifdef RA2_MODE
if(g_data["IgnoreRA2"].FindValue(unitname)>=0) continue;
#else
if(g_data["IgnoreTS"].FindValue(unitname) >= 0) continue;
#endif
WCHAR* addedString=Map->GetUnitName(unitname);
if(!addedString) continue;
//addedString=TranslateStringACP(addedString);
//addedString+=" (";
//addedString+=unitname+")";
TV_InsertItemW(tree.m_hWnd, addedString, wcslen(addedString), TVI_LAST, rootitems[0], valadded*1+i);
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*1+i, rootitems[0], TVI_LAST );
}
// okay, now the user-defined types:
auto const& infTypeSec = ini["InfantryTypes"];
for (i = 0; i < infTypeSec.Size(); i++) {
auto const& id = infTypeSec.Nth(i).second;
if (id.IsEmpty()) {
continue;
}
if (strlen(ini[id]["Name"]) > 0) {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, ini[id]["Name"], 0, 0, 0, 0, valadded * 1 + rules["InfantryTypes"].Size() + i, rootitems[0], TVI_LAST);
} else {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, (id + " NOTDEFINED"), 0, 0, 0, 0, valadded * 1 + rules["InfantryTypes"].Size() + i, rootitems[0], TVI_LAST);
}
}
CString theater=Map->GetTheater();
auto needed_terrain=TheaterChar::None;
if (tiledata == &s_tiledata) {
needed_terrain = TheaterChar::A;
} else if (tiledata == &t_tiledata) {
needed_terrain = TheaterChar::T;
}
auto const& bldTypeSec = rules["BuildingTypes"];
for(i=0;i< bldTypeSec.Size();i++)
{
auto const& unitname = bldTypeSec.Nth(i).second;
if (unitname.IsEmpty()) {
continue;
}
#ifdef RA2_MODE
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER2 && g_data["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER3 && g_data["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER4 && g_data["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER5 && g_data["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
#else
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
#endif
#ifdef RA2_MODE
if (g_data["IgnoreRA2"].FindValue(unitname) >= 0) continue;
#else
if (g_data["IgnoreTS"].FindValue(unitname) >= 0) continue;
#endif
if (!g_data.GetBool("Debug", "ShowBuildingsWithToTile") && !rules[unitname]["ToTile"].IsEmpty()) {
continue;
}
WCHAR* addedString=Map->GetUnitName(unitname);
if (!addedString) {
continue;
}
CString owner=rules[unitname]["Owner"];
int baseplanningside=-1;
#ifdef RA2_MODE
baseplanningside=-1;
#endif
baseplanningside = rules.GetInteger(unitname, "AIBasePlanningSide", baseplanningside);
baseplanningside = g_data.GetInteger(unitname, "AIBasePlanningSide", baseplanningside);
int id=Map->GetBuildingID(unitname);
if(id<0 /*|| (buildinginfo[id].pic[0].bTerrain!=0 && buildinginfo[id].pic[0].bTerrain!=needed_terrain)*/)
continue;
if(theater==THEATER0 && !buildinginfo[id].bTemp) { /*MessageBox("Ignored", unitname,0);*/ continue;}
if(theater==THEATER1 && !buildinginfo[id].bSnow) { /*MessageBox("Ignored", unitname,0);*/ continue;}
if(theater==THEATER2 && !buildinginfo[id].bUrban) { /*MessageBox("Ignored", unitname,0);*/ continue;}
// check if mapfile contains other value for owner
owner = ini.GetStringOr(unitname, "Owner", owner);
//addedString=TranslateStringACP(addedString);
//addedString+=" (";
//addedString+=unitname+")";
BOOL addedfor[3]={FALSE,FALSE,FALSE};
// MW fixed below for YR... uhhh...
int e;
BOOL bAdded=FALSE;
for(e=0;eGetBuildingID(typeId);
if (id < 0 || (buildinginfo[id].pic[0].bTerrain != TheaterChar::None && buildinginfo[id].pic[0].bTerrain != needed_terrain)) {
continue;
}
int e=2;
BOOL bAdded=FALSE;
auto owner=ini[typeId]["Owner"];
owner.MakeUpper();
auto const& name = ini[typeId]["Name"];
if(!name.IsEmpty()) {
auto const& addedString = name;
int e;
for(e=0;eGetTheater()==THEATER0 && g_data["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER2 && g_data["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER3 && g_data["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER4 && g_data["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER5 && g_data["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
#else
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
#endif
#ifdef RA2_MODE
if (g_data["IgnoreRA2"].FindValue(unitname) >= 0) continue;
#else
if (g_data["IgnoreTS"].FindValue(unitname) >= 0) continue;
#endif
WCHAR* addedString=Map->GetUnitName(unitname);
if(!addedString) continue;
//addedString=TranslateStringACP(addedString);
//addedString+=" (";
//addedString+=unitname+")";
TV_InsertItemW(tree.m_hWnd, addedString, wcslen(addedString), TVI_LAST, rootitems[2], valadded*3+i);
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*3+i, rootitems[2], TVI_LAST );
}
// okay, now the user-defined types:
auto const localAircraftTypeSec = ini["AircraftTypes"];
for (i = 0; i < localAircraftTypeSec.Size(); i++) {
auto const& typeId = localAircraftTypeSec.Nth(i).second;
if (typeId.IsEmpty()) {
continue;
}
auto const& name = ini[typeId]["Name"];
if (!name.IsEmpty()) {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, name, 0, 0, 0, 0, valadded * 3 + i + rules["AircraftTypes"].Size(), rootitems[2], TVI_LAST);
} else {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, (typeId + " NOTDEFINED"), 0, 0, 0, 0, valadded * 3 + i + rules["AircraftTypes"].Size(), rootitems[2], TVI_LAST);
}
}
auto const& vehTypeSec = rules["VehicleTypes"];
for(i=0;i< vehTypeSec.Size();i++) {
auto const& unitname = vehTypeSec.Nth(i).second;
if (unitname.GetLength() == 0) {
continue;
}
#ifdef RA2_MODE
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER2 && g_data["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER3 && g_data["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER4 && g_data["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER5 && g_data["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
#else
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
#endif
#ifdef RA2_MODE
if (g_data["IgnoreRA2"].FindValue(unitname) >= 0) continue;
#else
if (g_data["IgnoreTS"].FindValue(unitname) >= 0) continue;
#endif
WCHAR* addedString=Map->GetUnitName(unitname);
if(!addedString) continue;
//addedString=TranslateStringACP(addedString);
//addedString+=" (";
//addedString+=unitname+")";
TV_InsertItemW(tree.m_hWnd, addedString, wcslen(addedString), TVI_LAST, rootitems[1], valadded*4+i);
//tree.InsertItem(TVIF_PARAM | TVIF_TEXT, addedString, 0,0,0,0, valadded*4+i, rootitems[1], TVI_LAST );
}
// okay, now the user-defined types:
auto const localVehTypeSec = ini["VehicleTypes"];
for (i = 0; i < localVehTypeSec.Size(); i++) {
auto const& typeId = localVehTypeSec.Nth(i).second;
if (typeId.IsEmpty()) {
continue;
}
auto const& name = ini[typeId]["Name"];
if (!name.IsEmpty()) {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, name, 0, 0, 0, 0, valadded * 4 + i + rules["VehicleTypes"].Size(), rootitems[1], TVI_LAST);
} else {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, (typeId + " NOTDEFINED"), 0, 0, 0, 0, valadded * 4 + i + rules["VehicleTypes"].Size(), rootitems[1], TVI_LAST);
}
}
#ifdef RA2_MODE
HTREEITEM hTrees=tree.InsertItem(GetLanguageStringACP("TreesObList"), rootitems[4], TVI_LAST);
HTREEITEM hTL=tree.InsertItem(GetLanguageStringACP("TrafficLightsObList"), rootitems[4], TVI_LAST);
HTREEITEM hSigns=tree.InsertItem(GetLanguageStringACP("SignsObList"), rootitems[4], TVI_LAST);
HTREEITEM hLightPosts=tree.InsertItem(GetLanguageStringACP("LightPostsObList"), rootitems[4], TVI_LAST);
#endif
// random tree placer
#ifdef RA2_MODE
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("RndTreeObList"), 0,0,0,0, valadded*5+999, hTrees, TVI_LAST);
#else
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, GetLanguageStringACP("RndTreeObList"), 0,0,0,0, valadded*5+999, rootitems[4], TVI_LAST);
#endif
auto const& terrainTypeSec = rules["TerrainTypes"];
for (i = 0; i < terrainTypeSec.Size(); i++) {
auto const& unitname = terrainTypeSec.Nth(i).second;
CString addedString=Map->GetUnitName(unitname);
#ifdef RA2_MODE
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER2 && g_data["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER3 && g_data["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER4 && g_data["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER5 && g_data["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
#else
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
#endif
#ifdef RA2_MODE
if (g_data["IgnoreRA2"].FindValue(unitname) >= 0) continue;
#else
if (g_data["IgnoreTS"].FindValue(unitname) >= 0) continue;
#endif
#ifdef RA2_MODE
if (g_data["IgnoreTerrainRA2"].FindValue(unitname) >= 0) continue;
#else
if (g_data["IgnoreTerrainTS"].FindValue(unitname) >= 0) continue;
#endif
addedString=TranslateStringACP(addedString);
UINT flags=MF_STRING;
HTREEITEM howner=rootitems[4];
#ifdef RA2_MODE
if(unitname.Find("SIGN")>=0) howner=hSigns;
if(unitname.Find("TRFF")>=0) howner=hTL;
if(unitname.Find("TREE")>=0) howner=hTrees;
if(unitname.Find("LT")>=0) howner=hLightPosts;
#endif
#ifdef RA2_MODE
if(howner==hTrees)
{
int TreeMin=atoi(g_data[Map->GetTheater()+"Limits"]["TreeMin"]);
int TreeMax=atoi(g_data[Map->GetTheater()+"Limits"]["TreeMax"]);
CString id=unitname;
id.Delete(0, 4);
int n=atoi(id);
if(nTreeMax) continue;
}
#endif
if(unitname.GetLength()>0 && unitname!="VEINTREE" && unitname.Find("ICE")<0 && unitname.Find("BOXES")<0 && unitname.Find("SPKR")<0) // out with it :-)
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, (addedString+ " (" + unitname +")"), 0,0,0,0, valadded*5+i, howner, TVI_LAST );
}
#ifdef SMUDGE_SUPP
auto const& smudgeTypeSec = rules["TerrainTypes"];
for (i = 0; i < smudgeTypeSec.Size(); i++) {
auto const& unitname = smudgeTypeSec.Nth(i).second;
CString addedString=unitname;
#ifdef RA2_MODE
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER2 && g_data["IgnoreUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER3 && g_data["IgnoreNewUrbanRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER4 && g_data["IgnoreLunarRA2"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER5 && g_data["IgnoreDesertRA2"].FindValue(unitname) >= 0) continue;
#else
if (Map->GetTheater()==THEATER0 && g_data["IgnoreTemperateTS"].FindValue(unitname) >= 0) continue;
if (Map->GetTheater()==THEATER1 && g_data["IgnoreSnowTS"].FindValue(unitname) >= 0) continue;
#endif
#ifdef RA2_MODE
if (g_data["IgnoreRA2"].FindValue(unitname) >= 0) continue;
#else
if (g_data["IgnoreTS"].FindValue(unitname) >= 0) continue;
#endif
addedString=TranslateStringACP(addedString);
UINT flags=MF_STRING;
HTREEITEM howner=rootitems[14];
if (unitname.GetLength() > 0) {
tree.InsertItem(TVIF_PARAM | TVIF_TEXT, unitname, 0, 0, 0, 0, valadded * 8 + i, howner, TVI_LAST);
}
}
#endif
OutputDebugString("Objectbrowser redraw finished\n");
}
int CViewObjects::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
lpCreateStruct->style|=TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS;
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void CViewObjects::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
m_ready=TRUE;
}
void CViewObjects::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
*pResult = 0;
}
void CViewObjects::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
// CTreeView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CViewObjects::HandleBrushSize(int iTile)
{
if (iTile >= *tiledata_count) {
return;
}
for (auto const& [n, val] : g_data["StdBrushSize"]) {
if ((*tiles)["General"].FindIndex(n) >= 0) {
int tset = tiles->GetInteger("General", n);
if (tset == (*tiledata)[iTile].wTileSet) {
int bs = atoi(val);
((CFinalSunDlg*)theApp.m_pMainWnd)->m_settingsbar.m_BrushSize = bs - 1;
((CFinalSunDlg*)theApp.m_pMainWnd)->m_settingsbar.UpdateData(FALSE);
((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_x = bs;
((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview->m_BrushSize_y = bs;
}
}
}
}