mirror of
https://github.com/electronicarts/CNC_TS_and_RA2_Mission_Editor.git
synced 2025-03-15 08:51:21 +00:00
286 lines
6.6 KiB
C++
286 lines
6.6 KiB
C++
|
/*
|
|||
|
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 <https://www.gnu.org/licenses/>.
|
|||
|
*/
|
|||
|
|
|||
|
// All1.cpp: Implementierungsdatei
|
|||
|
//
|
|||
|
|
|||
|
#include "stdafx.h"
|
|||
|
#include "FinalSun.h"
|
|||
|
#include "All.h"
|
|||
|
#include "mapdata.h"
|
|||
|
#include "variables.h"
|
|||
|
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
#define new DEBUG_NEW
|
|||
|
#undef THIS_FILE
|
|||
|
static char THIS_FILE[] = __FILE__;
|
|||
|
#endif
|
|||
|
|
|||
|
extern CFinalSunApp theApp;
|
|||
|
#include "ImportIni.h"
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
// Dialogfeld CAll
|
|||
|
|
|||
|
|
|||
|
CAll::CAll(CWnd* pParent /*=NULL*/)
|
|||
|
: CDialog(CAll::IDD, pParent)
|
|||
|
{
|
|||
|
//{{AFX_DATA_INIT(CAll)
|
|||
|
// HINWEIS: Der Klassen-Assistent fügt hier Elementinitialisierung ein
|
|||
|
//}}AFX_DATA_INIT
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void CAll::DoDataExchange(CDataExchange* pDX)
|
|||
|
{
|
|||
|
CDialog::DoDataExchange(pDX);
|
|||
|
//{{AFX_DATA_MAP(CAll)
|
|||
|
DDX_Control(pDX, IDC_VALUE, m_Value);
|
|||
|
DDX_Control(pDX, IDC_KEYS, m_Keys);
|
|||
|
DDX_Control(pDX, IDC_INISECTION, m_IniSection);
|
|||
|
DDX_Control(pDX, IDC_DELETESECTION, m_DeleteSection);
|
|||
|
DDX_Control(pDX, IDC_DELETEKEY, m_DeleteKey);
|
|||
|
DDX_Control(pDX, IDC_ADDSECTION, m_AddSection);
|
|||
|
DDX_Control(pDX, IDC_ADDKEY, m_AddKey);
|
|||
|
DDX_Control(pDX, IDC_SECTIONS, m_Sections);
|
|||
|
//}}AFX_DATA_MAP
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BEGIN_MESSAGE_MAP(CAll, CDialog)
|
|||
|
//{{AFX_MSG_MAP(CAll)
|
|||
|
ON_CBN_SELCHANGE(IDC_SECTIONS, OnSelchangeSections)
|
|||
|
ON_EN_CHANGE(IDC_VALUE, OnChangeValue)
|
|||
|
ON_LBN_SELCHANGE(IDC_KEYS, OnSelchangeKeys)
|
|||
|
ON_EN_UPDATE(IDC_VALUE, OnUpdateValue)
|
|||
|
ON_BN_CLICKED(IDC_ADDSECTION, OnAddsection)
|
|||
|
ON_BN_CLICKED(IDC_DELETESECTION, OnDeletesection)
|
|||
|
ON_BN_CLICKED(IDC_DELETEKEY, OnDeletekey)
|
|||
|
ON_BN_CLICKED(IDC_ADDKEY, OnAddkey)
|
|||
|
ON_BN_CLICKED(IDC_INISECTION, OnInisection)
|
|||
|
//}}AFX_MSG_MAP
|
|||
|
END_MESSAGE_MAP()
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
// Behandlungsroutinen für Nachrichten CAll
|
|||
|
|
|||
|
void CAll::UpdateDialog()
|
|||
|
{
|
|||
|
//m_Sections.Clear();
|
|||
|
|
|||
|
while(m_Sections.DeleteString(0)!=-1);
|
|||
|
while(m_Keys.DeleteString(0)!=-1);
|
|||
|
CIniFile& ini=Map->GetIniFile();
|
|||
|
|
|||
|
|
|||
|
m_Value.SetWindowText("");
|
|||
|
|
|||
|
int i;
|
|||
|
for(i=ini.sections.size()-1;i>=0;i--)
|
|||
|
{
|
|||
|
const CString* name=ini.GetSectionName(i);
|
|||
|
if(!Map->IsMapSection(*name))
|
|||
|
m_Sections.InsertString(0, *name);
|
|||
|
}
|
|||
|
|
|||
|
m_Sections.SetCurSel(1);
|
|||
|
OnSelchangeSections();
|
|||
|
}
|
|||
|
|
|||
|
void CAll::OnSelchangeSections()
|
|||
|
{
|
|||
|
while(m_Keys.DeleteString(0)!=CB_ERR);
|
|||
|
CIniFile& ini=Map->GetIniFile();
|
|||
|
|
|||
|
CString cuSection;
|
|||
|
m_Sections.GetWindowText(cuSection);
|
|||
|
|
|||
|
if(cuSection.GetLength())
|
|||
|
{
|
|||
|
int i;
|
|||
|
m_Keys.SetRedraw(FALSE);
|
|||
|
SetCursor(LoadCursor(0,IDC_WAIT));
|
|||
|
for(i=0;i<ini.sections[cuSection].values.size();i++)
|
|||
|
{
|
|||
|
const CString* name=ini.sections[cuSection].GetValueName(i);
|
|||
|
m_Keys.InsertString(-1, *name);
|
|||
|
|
|||
|
}
|
|||
|
SetCursor(m_hArrowCursor);
|
|||
|
m_Keys.SetRedraw(TRUE);
|
|||
|
m_Keys.RedrawWindow();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void CAll::OnChangeValue()
|
|||
|
{
|
|||
|
CIniFile& ini=Map->GetIniFile();
|
|||
|
|
|||
|
CString t;
|
|||
|
m_Value.GetWindowText(t);
|
|||
|
|
|||
|
CString cuSection;
|
|||
|
m_Sections.GetWindowText(cuSection);
|
|||
|
|
|||
|
|
|||
|
CString cuKey;
|
|||
|
if(m_Keys.GetCurSel()>=0)m_Keys.GetText(m_Keys.GetCurSel(), cuKey) ;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
ini.sections[cuSection].values[cuKey]=t;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void CAll::OnSelchangeKeys()
|
|||
|
{
|
|||
|
CIniFile& ini=Map->GetIniFile();
|
|||
|
|
|||
|
CString cuSection;
|
|||
|
m_Sections.GetWindowText(cuSection);
|
|||
|
|
|||
|
CString cuKey;
|
|||
|
m_Keys.GetText(m_Keys.GetCurSel(), cuKey) ;
|
|||
|
|
|||
|
m_Value.SetWindowText(ini.sections[cuSection].values[cuKey]);
|
|||
|
}
|
|||
|
|
|||
|
void CAll::OnUpdateValue()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void CAll::OnAddsection()
|
|||
|
{
|
|||
|
CString name=InputBox("Please set the name of the new section (the section may already exist)", "Insert Section");
|
|||
|
|
|||
|
CIniFile& ini=Map->GetIniFile();
|
|||
|
|
|||
|
CIniFileSection stub=ini.sections[(LPCTSTR)name];
|
|||
|
|
|||
|
UpdateDialog();
|
|||
|
}
|
|||
|
|
|||
|
void CAll::OnDeletesection()
|
|||
|
{
|
|||
|
CIniFile& ini=Map->GetIniFile();
|
|||
|
|
|||
|
int cusection;
|
|||
|
cusection=m_Sections.GetCurSel();
|
|||
|
if(cusection==-1) {
|
|||
|
MessageBox("You cannot delete a section without choosing one.");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
CString str;
|
|||
|
m_Sections.GetLBText(cusection, str);
|
|||
|
|
|||
|
if(MessageBox(CString((CString)"Are you sure you want to delete " + str + "? You should be really careful, you may not be able to use the map afterwards."), "Delete section", MB_YESNO)==IDNO) return;
|
|||
|
|
|||
|
ini.sections.erase(str);
|
|||
|
|
|||
|
UpdateDialog();
|
|||
|
}
|
|||
|
|
|||
|
void CAll::OnDeletekey()
|
|||
|
{
|
|||
|
CIniFile& ini=Map->GetIniFile();
|
|||
|
|
|||
|
int cukey;
|
|||
|
if(m_Sections.GetCurSel()<0) return;
|
|||
|
cukey=m_Keys.GetCurSel();
|
|||
|
if(cukey==-1) {
|
|||
|
MessageBox("You cannot delete a key without choosing one.");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
CString str;
|
|||
|
CString sec;
|
|||
|
int cuSection=m_Sections.GetCurSel();
|
|||
|
m_Sections.GetLBText(cuSection, sec);
|
|||
|
m_Keys.GetText(cukey, str);
|
|||
|
|
|||
|
if(MessageBox(CString((CString)"Are you sure you want to delete " + str + "? You should be really careful, you may not be able to use the map afterwards."), "Delete key", MB_YESNO)==IDNO) return;
|
|||
|
|
|||
|
ini.sections[sec].values.erase(str);
|
|||
|
|
|||
|
UpdateDialog();
|
|||
|
|
|||
|
m_Sections.SetCurSel(cuSection);
|
|||
|
OnSelchangeSections();
|
|||
|
}
|
|||
|
|
|||
|
void CAll::OnAddkey()
|
|||
|
{
|
|||
|
CIniFile& ini=Map->GetIniFile();
|
|||
|
int cusection;
|
|||
|
cusection=m_Sections.GetCurSel();
|
|||
|
if(cusection==-1) {
|
|||
|
MessageBox("You need to specify a section first.");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
CString sec;
|
|||
|
m_Sections.GetLBText(cusection, sec);
|
|||
|
|
|||
|
CString key, value;
|
|||
|
key=InputBox("Please set the name and value for the current key here: (for example, setting a new key ""Strength"" with the value 200 can be written as ""Strength=200"". You don´t need to specify a value.)", "Create key");
|
|||
|
|
|||
|
if(key.Find("=")!=-1)
|
|||
|
{
|
|||
|
// value specified
|
|||
|
// MW BUGFIX
|
|||
|
value=key.Right(key.GetLength()-key.Find("=")-1);
|
|||
|
key=key.Left(key.Find("="));
|
|||
|
}
|
|||
|
|
|||
|
ini.sections[sec].values[key]=value;
|
|||
|
|
|||
|
UpdateDialog();
|
|||
|
m_Sections.SetCurSel(cusection);
|
|||
|
OnSelchangeSections();
|
|||
|
}
|
|||
|
|
|||
|
void CAll::OnInisection()
|
|||
|
{
|
|||
|
CFileDialog dlg(FALSE, ".ini", "*.ini", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "INI files|*.ini|");
|
|||
|
|
|||
|
char cuPath[MAX_PATH];
|
|||
|
BOOL hidePreview=FALSE;
|
|||
|
BOOL previewPrinted=FALSE;
|
|||
|
GetCurrentDirectory(MAX_PATH, cuPath);
|
|||
|
dlg.m_ofn.lpstrInitialDir=cuPath;
|
|||
|
|
|||
|
if(theApp.m_Options.TSExe.GetLength()) dlg.m_ofn.lpstrInitialDir=(char*)(LPCTSTR)theApp.m_Options.TSExe;
|
|||
|
|
|||
|
if(dlg.DoModal()!=IDCANCEL)
|
|||
|
{
|
|||
|
CImportINI impini;
|
|||
|
impini.m_FileName=dlg.GetPathName();
|
|||
|
if(impini.DoModal()!=IDCANCEL)
|
|||
|
{
|
|||
|
UpdateDialog();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|