From 98cf96b927434dbd36fad2c45182846f9c109bc3 Mon Sep 17 00:00:00 2001 From: Zero Fanker Date: Thu, 4 Jul 2024 06:52:41 +0800 Subject: [PATCH] Feature/house dialog (#75) --- MissionEditor/Houses.cpp | 168 +++++++++++++++--- MissionEditor/Houses.h | 42 ++++- MissionEditor/IniHelper.h | 11 ++ MissionEditor/MissionEditor.rc | 64 +++++-- MissionEditor/data/FinalAlert2/FALanguage.ini | 7 +- MissionEditor/resource.h | 15 +- 6 files changed, 257 insertions(+), 50 deletions(-) diff --git a/MissionEditor/Houses.cpp b/MissionEditor/Houses.cpp index 20c3b1c..678744f 100644 --- a/MissionEditor/Houses.cpp +++ b/MissionEditor/Houses.cpp @@ -85,7 +85,6 @@ BEGIN_MESSAGE_MAP(CHouses, CDialog) ON_CBN_KILLFOCUS(IDC_EDGE, OnKillfocusEdge) ON_CBN_KILLFOCUS(IDC_SIDE, OnKillfocusSide) ON_CBN_KILLFOCUS(IDC_COLOR, OnKillfocusColor) - ON_EN_KILLFOCUS(IDC_ALLIES, OnKillfocusAllies) ON_EN_KILLFOCUS(IDC_CREDITS, OnKillfocusCredits) ON_CBN_EDITCHANGE(IDC_ACTSLIKE, OnEditchangeActslike) ON_CBN_KILLFOCUS(IDC_NODECOUNT, OnKillfocusNodecount) @@ -94,8 +93,8 @@ BEGIN_MESSAGE_MAP(CHouses, CDialog) ON_CBN_KILLFOCUS(IDC_PLAYERCONTROL, OnKillfocusPlayercontrol) ON_CBN_SELCHANGE(IDC_HUMANPLAYER, OnSelchangeHumanplayer) ON_CBN_SELCHANGE(IDC_ACTSLIKE, OnSelchangeActslike) - ON_EN_SETFOCUS(IDC_ALLIES, OnSetfocusAllies) //}}AFX_MSG_MAP + ON_BN_CLICKED(IDC_HOUSES_CHANGE_ALLIES, &CHouses::OnBnClickedHousesChangeAllies) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// @@ -191,6 +190,7 @@ BOOL CHouses::OnInitDialog() UpdateDialog(); #ifdef RA2_MODE + ::ShowWindow(GetDlgItem(IDC_LACTSLIKE)->m_hWnd, SW_HIDE); m_ActsLike.ShowWindow(SW_HIDE); //m_Edge.ShowWindow(SW_HIDE); #endif @@ -424,7 +424,6 @@ void CHouses::OnShowWindow(BOOL bShow, UINT nStatus) // call all KillFocus ! OnKillfocusIq(); OnEditchangeActslike(); - OnKillfocusAllies(); OnKillfocusColor(); OnKillfocusCredits(); OnKillfocusEdge(); @@ -571,26 +570,6 @@ void CHouses::OnKillfocusColor() ((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_minimap.RedrawWindow(); } -void CHouses::OnKillfocusAllies() -{ - CIniFile& ini = Map->GetIniFile(); - - SetMainStatusBarReady(); - - int cusel; - cusel = m_houses.GetCurSel(); - if (cusel == -1) return; - - CString name; - m_houses.GetLBText(cusel, name); - name = TranslateHouse(name); - - CString t; - m_Allies.GetWindowText(t); - t = TranslateHouse(t); - ini.SetString(name, "Allies", t); -} - void CHouses::OnKillfocusCredits() { CIniFile& ini = Map->GetIniFile(); @@ -742,6 +721,41 @@ void CHouses::OnSelchangeActslike() ini.SetString(name, "ActsLike", t); } +void CHouses::OnBnClickedHousesChangeAllies() +{ + auto const curSel = m_houses.GetCurSel(); + if (curSel == -1) { + return; + } + + CString name; + m_houses.GetLBText(curSel, name); + name = TranslateHouse(name); + + CIniFile& ini = Map->GetIniFile(); + + std::vector allHouses; + for (auto idx = 0; idx < m_houses.GetCount(); ++idx) { + CString item; + m_houses.GetLBText(idx, item); + allHouses.emplace_back(std::move(item)); + } + + CHouseAllies dlg(std::move(allHouses), ini.GetString(name, "Allies")); + + if (dlg.DoModal() == IDCANCEL) { + return; + } + auto&& allies = dlg.GetAllies(); + ini.SetString(name, "Allies", INIHelper::Join(allies)); + + for (auto& house : allies) { + house = TranslateHouse(house, true); + } + m_Allies.SetWindowText(INIHelper::Join(allies)); + SetMainStatusBarReady(); +} + void CHouses::UpdateStrings() { SetDlgItemText(IDC_DESC, GetLanguageStringACP("HousesDesc")); @@ -768,12 +782,110 @@ void CHouses::UpdateStrings() SetWindowText(TranslateStringACP(HOUSES)); } -void CHouses::OnSetfocusAllies() -{ - SetMainStatusBar(GetLanguageStringACP("HousesAlliesHelp")); -} - void CHouses::PostNcDestroy() { CDialog::PostNcDestroy(); } + +// CHouseAllies + +CHouseAllies::CHouseAllies(std::vector&& houses, const CString& allies, CWnd* pParent) : + CDialog(CHouseAllies::IDD, pParent), + m_allHouses(std::move(houses)) +{ + auto const allyStrings = INIHelper::Split(allies); + for (auto& str : allyStrings) { + m_allies.insert(TranslateHouse(str, true)); + } + +} + +CHouseAllies::~CHouseAllies() +{ +} + +std::vector CHouseAllies::GetAllies() const +{ + std::vector ret; + for (auto const& str : m_allies) { + ret.emplace_back(TranslateHouse(str)); + } + return ret; +} + +BOOL CHouseAllies::OnInitDialog() +{ + auto const ret = CDialog::OnInitDialog(); + translateUI(); + + for (auto const& str : m_allies) { + m_allyList.AddString(str); + } + for (auto const& house : m_allHouses) { + if (m_allies.find(house) == m_allies.end()) { + m_enemyList.AddString(house); + } + } + updateAllyTexts(); + return ret; +} + +void CHouseAllies::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + + DDX_Control(pDX, IDC_HOUSE_LIST_ALLIES, m_allyList); + DDX_Control(pDX, IDC_HOUSE_LIST_ENEMIES, m_enemyList); + DDX_Control(pDX, IDC_HOUSE_ALLIES_VALUES, m_allianceText); +} + +BEGIN_MESSAGE_MAP(CHouseAllies, CDialog) + ON_BN_CLICKED(IDC_HOUSE_ALLIES_ADD, &CHouseAllies::OnBnClickedHouseAlliesAdd) + ON_BN_CLICKED(IDC_HOUSE_ALLIES_REMOVE, &CHouseAllies::OnBnClickedHouseAlliesRemove) +END_MESSAGE_MAP() + + +void CHouseAllies::translateUI() +{ + TranslateWindowCaption(*this, "HouseAlliesCaption"); + + TranslateDlgItem(*this, IDC_HOUSE_ALLIES_T_ENEMIES, "HouseAlliesEnemies"); + TranslateDlgItem(*this, IDC_HOUSE_ALLIES_T_ALLIES, "HouseAlliesAllies"); + + SetDlgItemText(IDOK, GetLanguageStringACP("OK")); + SetDlgItemText(IDCANCEL, GetLanguageStringACP("Cancel")); +} + +void CHouseAllies::updateAllyTexts() +{ + m_allianceText.SetWindowText(INIHelper::Join(m_allies)); +} + +void CHouseAllies::OnBnClickedHouseAlliesAdd() +{ + auto const selected = m_enemyList.GetCurSel(); + if (selected < 0) { + return; + } + CString house; + m_enemyList.GetText(selected, house); + m_enemyList.DeleteString(selected); + m_allies.insert(house); + m_allyList.AddString(house); + updateAllyTexts(); +} + + +void CHouseAllies::OnBnClickedHouseAlliesRemove() +{ + auto const selected = m_allyList.GetCurSel(); + if (selected < 0) { + return; + } + CString house; + m_allyList.GetText(selected, house); + m_allyList.DeleteString(selected); + m_allies.erase(house); + m_enemyList.AddString(house); + updateAllyTexts(); +} diff --git a/MissionEditor/Houses.h b/MissionEditor/Houses.h index d360b27..d37931f 100644 --- a/MissionEditor/Houses.h +++ b/MissionEditor/Houses.h @@ -27,6 +27,37 @@ // Houses.h : Header-Datei // +#include + +class CHouseAllies : public CDialog +{ +public: + enum { IDD = IDD_HOUSES_ALLIES }; + + CHouseAllies(std::vector&& houses, const CString& allies, CWnd* pParent = NULL); + ~CHouseAllies(); + std::vector GetAllies() const; + +private: + virtual BOOL OnInitDialog() override; + virtual void DoDataExchange(CDataExchange* pDX) override; + + DECLARE_MESSAGE_MAP() + + void translateUI(); + void updateAllyTexts(); + + afx_msg void OnBnClickedHouseAlliesAdd(); + afx_msg void OnBnClickedHouseAlliesRemove(); + + CListBox m_enemyList; + CListBox m_allyList; + CEdit m_allianceText; + + std::vector m_allHouses; + std::set m_allies; +}; + ///////////////////////////////////////////////////////////////////////////// // Dialogfeld CHouses @@ -65,12 +96,12 @@ public: // Der Klassen-Assistent generiert virtuelle Funktionsüberschreibungen //{{AFX_VIRTUAL(CHouses) protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung - virtual void PostNcDestroy(); + virtual void DoDataExchange(CDataExchange* pDX) override; // DDX/DDV-Unterstützung + virtual void PostNcDestroy() override; //}}AFX_VIRTUAL // Implementierung -protected: + DECLARE_MESSAGE_MAP() // Generierte Nachrichtenzuordnungsfunktionen //{{AFX_MSG(CHouses) virtual BOOL OnInitDialog(); @@ -83,7 +114,6 @@ protected: afx_msg void OnKillfocusEdge(); afx_msg void OnKillfocusSide(); afx_msg void OnKillfocusColor(); - afx_msg void OnKillfocusAllies(); afx_msg void OnKillfocusCredits(); afx_msg void OnEditchangeActslike(); afx_msg void OnKillfocusNodecount(); @@ -92,12 +122,12 @@ protected: afx_msg void OnKillfocusPlayercontrol(); afx_msg void OnSelchangeHumanplayer(); afx_msg void OnSelchangeActslike(); - afx_msg void OnSetfocusAllies(); + afx_msg void OnBnClickedHousesChangeAllies(); //}}AFX_MSG - DECLARE_MESSAGE_MAP() }; + //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein. diff --git a/MissionEditor/IniHelper.h b/MissionEditor/IniHelper.h index f3828c0..a4827b7 100644 --- a/MissionEditor/IniHelper.h +++ b/MissionEditor/IniHelper.h @@ -80,4 +80,15 @@ public: return ret; } + + template + static inline CString Join(const TContainer& strings, char ch = ',') { + CString ret; + for (auto const& item : strings) { + ret += item; + ret += ch; + } + ret.Delete(ret.GetLength() - 1, 1); + return ret; + } }; \ No newline at end of file diff --git a/MissionEditor/MissionEditor.rc b/MissionEditor/MissionEditor.rc index 2a2ee99..b84fb31 100644 --- a/MissionEditor/MissionEditor.rc +++ b/MissionEditor/MissionEditor.rc @@ -550,10 +550,10 @@ BEGIN EDITTEXT IDC_P5,155,78,65,12,ES_AUTOHSCROLL END -IDD_HOUSES DIALOG 0, 0, 303, 207 +IDD_HOUSES DIALOGEX 0, 0, 303, 207 STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Houses" -FONT 8, "Tahoma" +FONT 8, "Tahoma", 0, 0, 0x0 BEGIN LTEXT "DESC [quite long]",IDC_DESC,7,5,290,43 COMBOBOX IDC_HOUSES,77,65,220,125,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -562,17 +562,17 @@ BEGIN PUSHBUTTON "Standard houses",IDC_PREPAREHOUSES,75,82,70,15 PUSHBUTTON "Delete house",IDC_DELETEHOUSE,150,82,70,15 LTEXT "IQ:",IDC_LIQ,10,105,40,10 - COMBOBOX IDC_IQ,55,105,70,70,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_IQ,64,105,70,70,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Edge:",IDC_LEDGE,10,120,40,10 - COMBOBOX IDC_EDGE,55,120,70,65,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_EDGE,64,120,70,65,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Side",IDC_LSIDE,10,135,40,10 - COMBOBOX IDC_SIDE,55,135,70,65,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SIDE,64,134,70,65,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Color",IDC_LCOLOR,10,150,40,10 - COMBOBOX IDC_COLOR,55,150,70,150,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Allies:",IDC_LALLIES,10,165,40,10 - EDITTEXT IDC_ALLIES,55,165,70,12,ES_AUTOHSCROLL - LTEXT "Credits (x100):",IDC_LCREDITS,10,181,40,17 - EDITTEXT IDC_CREDITS,55,179,70,12,ES_AUTOHSCROLL + COMBOBOX IDC_COLOR,64,149,70,150,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Allies:",IDC_LALLIES,7,179,40,10 + EDITTEXT IDC_ALLIES,64,179,205,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "Credits (x100):",IDC_LCREDITS,7,164,60,15 + EDITTEXT IDC_CREDITS,64,164,70,12,ES_AUTOHSCROLL LTEXT "Acts like:",IDC_LACTSLIKE,150,105,69,14 COMBOBOX IDC_ACTSLIKE,227,105,70,50,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Nodecount:",IDC_LNODECOUNT,150,119,68,15 @@ -581,11 +581,28 @@ BEGIN COMBOBOX IDC_TECHLEVEL,227,135,70,135,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP LTEXT "Build activity (%):",IDC_LBUILDACTIVITY,150,150,66,17 COMBOBOX IDC_PERCENTBUILT,227,150,70,50,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Player control:",IDC_LPLAYERCONTROL,150,166,70,20 - COMBOBOX IDC_PLAYERCONTROL,227,166,70,50,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Player control:",IDC_LPLAYERCONTROL,150,164,70,15 + COMBOBOX IDC_PLAYERCONTROL,227,164,70,50,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "Human Player:",IDC_LPLAYER,7,48,65,16 COMBOBOX IDC_HUMANPLAYER,77,49,220,70,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP GROUPBOX "",IDC_STATIC,6,98,293,102 + PUSHBUTTON "...",IDC_HOUSES_CHANGE_ALLIES,271,179,26,14 +END + +IDD_HOUSES_ALLIES DIALOGEX 0, 0, 309, 176 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Alliance Editor" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,7,155,50,14 + PUSHBUTTON "Cancel",IDCANCEL,252,155,50,14 + LTEXT "Enemies",IDC_HOUSE_ALLIES_T_ENEMIES,7,7,28,13,SS_SUNKEN + LTEXT "Allies",IDC_HOUSE_ALLIES_T_ALLIES,281,7,21,11,SS_SUNKEN + LISTBOX IDC_HOUSE_LIST_ENEMIES,7,19,125,129,LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_HOUSE_LIST_ALLIES,177,19,125,129,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "->",IDC_HOUSE_ALLIES_ADD,137,57,36,14 + PUSHBUTTON "<-",IDC_HOUSE_ALLIES_REMOVE,137,78,36,14 + EDITTEXT IDC_HOUSE_ALLIES_VALUES,69,155,167,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP,WS_EX_STATICEDGE END IDD_AIRCRAFT DIALOG 0, 0, 232, 130 @@ -1789,6 +1806,19 @@ BEGIN END IDD_HOUSES, DIALOG + BEGIN + VERTGUIDE, 7 + VERTGUIDE, 64 + VERTGUIDE, 297 + HORZGUIDE, 105 + HORZGUIDE, 120 + HORZGUIDE, 134 + HORZGUIDE, 149 + HORZGUIDE, 164 + HORZGUIDE, 179 + END + + IDD_HOUSES_ALLIES, DIALOG BEGIN END @@ -3597,6 +3627,16 @@ BEGIN 0 END +IDD_HOUSES AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_HOUSES_ALLIES AFX_DIALOG_LAYOUT +BEGIN + 0 +END + ///////////////////////////////////////////////////////////////////////////// // diff --git a/MissionEditor/data/FinalAlert2/FALanguage.ini b/MissionEditor/data/FinalAlert2/FALanguage.ini index 27062f8..fd06e79 100644 --- a/MissionEditor/data/FinalAlert2/FALanguage.ini +++ b/MissionEditor/data/FinalAlert2/FALanguage.ini @@ -1300,8 +1300,8 @@ HousesIQ=IQ: HousesEdge=地图边界: HousesSide=所属: HousesColor=颜色: -HousesAllies=同盟国: -HousesAlliesHelp=列出所有联盟国,如:GDI, Nod, Neutral +HousesAllies=盟友: +HousesAlliesHelp=列出所有联盟国,如:盟军,苏军,平民 HousesCredits=金钱(x100): HousesActsLike=Acts like HousesNodeCount=节点总计: @@ -1311,6 +1311,9 @@ HousesPlayerControl=游戏者控制: HousesPrepareHouses=标准参战方 HousesAddHouse=新建参战方 HousesDeleteHouse=删除参战方 +HouseAlliesCaption=敌我关系编辑器 +HouseAlliesEnemies=敌对方 +HouseAlliesAllies=友方 ; loading dialog LoadLoadRules=正在载入 rules ... diff --git a/MissionEditor/resource.h b/MissionEditor/resource.h index 5b90274..81bd9aa 100644 --- a/MissionEditor/resource.h +++ b/MissionEditor/resource.h @@ -37,6 +37,7 @@ #define IDD_BUILDING 175 #define IDD_UNIT 176 #define IDD_HOUSES 177 +#define IDD_HOUSES_ALLIES 178 #define IDD_AIRCRAFT 179 #define IDI_AIR 180 #define IDD_LOADING 181 @@ -560,6 +561,16 @@ #define IDC_TASKFORCE_T_MEMBERS 1486 #define IDC_TASKFORCE_T_U_NUM 1487 #define IDC_TASKFORCE_T_U_TYPE 1488 +#define IDC_HOUSES_CHANGE_ALLIES 1489 +#define IDC_HOUSE_LIST_ENEMIES 1490 +#define IDC_HOUSE_LIST_ALLIES 1491 +#define IDC_HOUSE_ALLIES_ADD 1492 +#define IDC_HOUSE_ALLIES_REMOVE 1493 +#define IDC_EDIT2 1494 +#define IDC_HOUSE_ALLIES_VALUES 1494 +#define IDC_EDIT3 1495 +#define IDC_HOUSE_ALLIES_T_ENEMIES 1496 +#define IDC_HOUSE_ALLIES_T_ALLIES 1497 #define ID_FILE_OPENMAP 40001 #define ID_FILE_SAVEAS 40002 #define ID_FILE_QUIT 40003 @@ -654,9 +665,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 302 +#define _APS_NEXT_RESOURCE_VALUE 312 #define _APS_NEXT_COMMAND_VALUE 40144 -#define _APS_NEXT_CONTROL_VALUE 1489 +#define _APS_NEXT_CONTROL_VALUE 1498 #define _APS_NEXT_SYMED_VALUE 111 #endif #endif