/*
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 .
*/
// Triggers.cpp: Implementierungsdatei
//
#include "stdafx.h"
#include "FinalSun.h"
#include "Triggers.h"
#include "FinalSunDlg.h"
#include "mapdata.h"
#include "variables.h"
#include "functions.h"
#include "inlines.h"
CString GetWaypoint(int n);
int GetWaypoint(const char* c);
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Eigenschaftenseite CTriggers
IMPLEMENT_DYNCREATE(CTriggers, CDialog)
CTriggers::CTriggers() : CDialog(CTriggers::IDD)
{
//{{AFX_DATA_INIT(CTriggers)
m_F1 = _T("");
m_F2 = _T("");
m_F3 = _T("");
m_F4 = _T("");
m_F5 = _T("");
m_LA1 = _T("");
m_LA2 = _T("");
m_LA3 = _T("");
m_LA4 = _T("");
m_LA5 = _T("");
m_LA6 = _T("");
m_LE1 = _T("");
m_LE2 = _T("");
m_Name = _T("");
m_LAW = _T("");
//}}AFX_DATA_INIT
}
CTriggers::~CTriggers()
{
}
void CTriggers::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTriggers)
DDX_Control(pDX, IDC_EVENTPARAM2, m_E2);
DDX_Control(pDX, IDC_EVENTPARAM1, m_E1);
DDX_Control(pDX, IDC_ACTIONPARAM6, m_A6);
DDX_Control(pDX, IDC_ACTIONPARAM5, m_A5);
DDX_Control(pDX, IDC_ACTIONPARAM4, m_A4);
DDX_Control(pDX, IDC_ACTIONPARAM3, m_A3);
DDX_Control(pDX, IDC_ACTIONPARAM2, m_A2);
DDX_Control(pDX, IDC_ACTIONPARAM1, m_A1);
DDX_Control(pDX, IDC_HOUSE, m_House);
DDX_Control(pDX, IDC_TRIGGER2, m_Trigger2);
DDX_Control(pDX, IDC_TRIGGER, m_Trigger);
DDX_Control(pDX, IDC_EVENTTYPE, m_EventType);
DDX_Control(pDX, IDC_EVENT, m_Event);
DDX_Control(pDX, IDC_ACTIONWAYPOINT, m_ActionWaypoint);
DDX_Control(pDX, IDC_ACTIONTYPE, m_ActionType);
DDX_Control(pDX, IDC_ACTION, m_Action);
DDX_Text(pDX, IDC_FLAG1, m_F1);
DDX_Text(pDX, IDC_FLAG2, m_F2);
DDX_Text(pDX, IDC_FLAG3, m_F3);
DDX_Text(pDX, IDC_FLAG4, m_F4);
DDX_Text(pDX, IDC_FLAG5, m_F5);
DDX_Text(pDX, IDC_LABEL_A1, m_LA1);
DDX_Text(pDX, IDC_LABEL_A2, m_LA2);
DDX_Text(pDX, IDC_LABEL_A3, m_LA3);
DDX_Text(pDX, IDC_LABEL_A4, m_LA4);
DDX_Text(pDX, IDC_LABEL_A5, m_LA5);
DDX_Text(pDX, IDC_LABEL_A6, m_LA6);
DDX_Text(pDX, IDC_LABEL_E1, m_LE1);
DDX_Text(pDX, IDC_LABEL_E2, m_LE2);
DDX_Text(pDX, IDC_NAME, m_Name);
DDX_Text(pDX, IDC_WAYPOINT, m_LAW);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTriggers, CDialog)
//{{AFX_MSG_MAP(CTriggers)
ON_CBN_SELCHANGE(IDC_TRIGGER, OnSelchangeTrigger)
ON_CBN_SELCHANGE(IDC_EVENT, OnSelchangeEvent)
ON_CBN_SELCHANGE(IDC_ACTION, OnSelchangeAction)
ON_CBN_KILLFOCUS(IDC_HOUSE, OnEditchangeHouse)
ON_CBN_SELCHANGE(IDC_HOUSE, OnSelchangeHouse)
ON_EN_KILLFOCUS(IDC_NAME, OnChangeName)
ON_EN_KILLFOCUS(IDC_FLAG1, OnChangeFlag1)
ON_EN_KILLFOCUS(IDC_FLAG2, OnChangeFlag2)
ON_EN_KILLFOCUS(IDC_FLAG3, OnChangeFlag3)
ON_EN_KILLFOCUS(IDC_FLAG4, OnChangeFlag4)
ON_EN_KILLFOCUS(IDC_FLAG5, OnChangeFlag5)
ON_CBN_KILLFOCUS(IDC_TRIGGER2, OnEditchangeTrigger2)
ON_CBN_SELCHANGE(IDC_TRIGGER2, OnSelchangeTrigger2)
ON_CBN_KILLFOCUS(IDC_EVENTTYPE, OnEditchangeEventtype)
ON_CBN_SELCHANGE(IDC_EVENTTYPE, OnSelchangeEventtype)
ON_CBN_KILLFOCUS(IDC_EVENTPARAM1, OnEditchangeEventparam1)
ON_CBN_SELCHANGE(IDC_EVENTPARAM1, OnSelchangeEventparam1)
ON_CBN_KILLFOCUS(IDC_EVENTPARAM2, OnEditchangeEventparam2)
ON_CBN_SELCHANGE(IDC_EVENTPARAM2, OnSelchangeEventparam2)
ON_CBN_KILLFOCUS(IDC_ACTIONTYPE, OnEditchangeActiontype)
ON_CBN_SELCHANGE(IDC_ACTIONTYPE, OnSelchangeActiontype)
ON_CBN_KILLFOCUS(IDC_ACTIONWAYPOINT, OnEditchangeActionwaypoint)
ON_CBN_SELCHANGE(IDC_ACTIONWAYPOINT, OnSelchangeActionwaypoint)
ON_CBN_KILLFOCUS(IDC_ACTIONPARAM1, OnEditchangeActionparam1)
ON_CBN_SELCHANGE(IDC_ACTIONPARAM1, OnSelchangeActionparam1)
ON_CBN_KILLFOCUS(IDC_ACTIONPARAM2, OnEditchangeActionparam2)
ON_CBN_SELCHANGE(IDC_ACTIONPARAM2, OnSelchangeActionparam2)
ON_CBN_KILLFOCUS(IDC_ACTIONPARAM3, OnEditchangeActionparam3)
ON_CBN_SELCHANGE(IDC_ACTIONPARAM3, OnSelchangeActionparam3)
ON_CBN_KILLFOCUS(IDC_ACTIONPARAM4, OnEditchangeActionparam4)
ON_CBN_SELCHANGE(IDC_ACTIONPARAM4, OnSelchangeActionparam4)
ON_CBN_KILLFOCUS(IDC_ACTIONPARAM5, OnEditchangeActionparam5)
ON_CBN_SELCHANGE(IDC_ACTIONPARAM5, OnSelchangeActionparam5)
ON_CBN_KILLFOCUS(IDC_ACTIONPARAM6, OnEditchangeActionparam6)
ON_CBN_SELCHANGE(IDC_ACTIONPARAM6, OnSelchangeActionparam6)
ON_BN_CLICKED(IDC_ADDEVENT, OnAddevent)
ON_BN_CLICKED(IDC_DELETEEVENT, OnDeleteevent)
ON_BN_CLICKED(IDC_ADDACTION, OnAddaction)
ON_BN_CLICKED(IDC_DELETEACTION, OnDeleteaction)
ON_BN_CLICKED(IDC_DELETETRIGGER, OnDeletetrigger)
ON_BN_CLICKED(IDC_ADDTRIGGER, OnAddtrigger)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten CTriggers
void CTriggers::UpdateDialog()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
int selat=m_Action.GetCurSel();
int selev=m_Event.GetCurSel();
while(m_Trigger.DeleteString(0)!=CB_ERR);
while(m_Trigger2.DeleteString(0)!=CB_ERR);
while(m_Action.DeleteString(0)!=CB_ERR);
while(m_Event.DeleteString(0)!=CB_ERR);
while(m_ActionWaypoint.DeleteString(0)!=CB_ERR);
while(m_House.DeleteString(0)!=CB_ERR);
while(m_ActionType.DeleteString(0)!=CB_ERR);
while(m_EventType.DeleteString(0)!=CB_ERR);
m_LE1="Parameter 1";
m_LE2="Parameter 2";
m_LA1="Param1";
m_LA2="Param2";
m_LA3="Param3";
m_LA4="Param4";
m_LA5="Param5";
m_LA6="Param6";
int i;
m_Trigger2.AddString("");
for (auto const& [type, def] : ini["Triggers"]) {
auto s = type;
s += " (";
s += GetParam(def, 2);
s += ")";
m_Trigger.AddString(s);
m_Trigger2.AddString(s);
}
for (auto const& [eventid, eventdata] : g_data["Events"]) {
CString text = eventid + " " + GetParam(eventdata, 0);
m_EventType.AddString(text);
}
for (auto const& [actionid, actiondata] : g_data["Actions"]) {
CString text = actionid + " " + GetParam(actiondata, 0);
m_ActionType.AddString(text);
}
ListHouses(m_House, FALSE);
CComboBox* wayp;
wayp=(CComboBox*)GetDlgItem(IDC_ACTIONWAYPOINT);
while(wayp->DeleteString(0)!=CB_ERR);
for (auto const& [num, coord] : ini["Waypoints"]) {
wayp->AddString(num);
}
if(sel==-1 || m_Trigger.SetCurSel(sel)==FALSE) {
m_Trigger.SetCurSel(0);
}
if(selat==-1 || m_Trigger.SetCurSel(selat)==FALSE) {
m_Action.SetCurSel(0);
}
if(selev==-1 || m_Trigger.SetCurSel(selev)==FALSE) {
m_Event.SetCurSel(0);
}
OnSelchangeTrigger();
}
void CTriggers::OnSelchangeTrigger()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
while(m_Action.DeleteString(0)!=CB_ERR);
while(m_Event.DeleteString(0)!=CB_ERR);
CString TriggerData, EventData, ActionData;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
TriggerData = ini.GetString("Triggers", CurrentTrigger);
EventData = ini.GetString("Events", CurrentTrigger);
ActionData = ini.GetString("Actions", CurrentTrigger);
m_Name=GetParam(TriggerData, 2);
m_House.SetWindowText(TranslateHouse(GetParam(TriggerData,0), TRUE));
CString trig2=GetParam(TriggerData,1);
if (ini["Triggers"].Exists(trig2)) {
trig2 += " (";
trig2 += GetParam(ini["Triggers"][GetParam(TriggerData, 1)], 2);
trig2 += ")";
}
m_Trigger2.SetWindowText(trig2);
m_F1=GetParam(TriggerData,3);
m_F2=GetParam(TriggerData,4);
m_F3=GetParam(TriggerData,5);
m_F4=GetParam(TriggerData,6);
m_F5=GetParam(TriggerData,7);
// okay, now list all events and actions
// -------------------------------------
int i;
// events
for(i=0;iGetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int selev=m_Event.GetCurSel();
if(selev<0) return;
int i;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
auto const& eventData = ini["Events"][CurrentTrigger];
int startpos=1+selev*3;
CString EventType=GetParam(eventData,startpos);
m_EventType.SetWindowText(EventType);
for(i=0;iGetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int selac=m_Action.GetCurSel();
if(selac<0) return;
int i;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
auto const& ActionData=ini["Actions"][CurrentTrigger];
int startpos=1+selac*8;
CString ActionType=GetParam(ActionData,startpos);
m_ActionType.SetWindowText(ActionType);
for(i=0;iGetIniFile();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString house;
m_House.GetWindowText(house);
house=TranslateHouse(house);
ini.SetString("Triggers", CurrentTrigger, SetParam(ini["Triggers"][CurrentTrigger], 0, house));
}
void CTriggers::OnSelchangeHouse()
{
CIniFile& ini=Map->GetIniFile();
int csel=m_House.GetCurSel();
CString house;
m_House.GetLBText(csel,house);
m_House.SetWindowText(house);
OnEditchangeHouse();
}
void CTriggers::OnChangeName()
{
CIniFile& ini=Map->GetIniFile();
UpdateData();
CEdit& name=*(CEdit*)GetDlgItem(IDC_NAME);
int esel=name.GetSel();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
ini.SetString("Triggers", CurrentTrigger, SetParam(ini["Triggers"][CurrentTrigger], 2, m_Name));
UpdateDialog();
m_Trigger.SetCurSel(sel);
OnSelchangeTrigger();
name.SetSel(esel);
}
void CTriggers::OnChangeFlag1()
{
CIniFile& ini=Map->GetIniFile();
UpdateData();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
ini.SetString("Triggers", CurrentTrigger, SetParam(ini["Triggers"][CurrentTrigger], 3, m_F1));
}
void CTriggers::OnChangeFlag2()
{
CIniFile& ini=Map->GetIniFile();
UpdateData();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
ini.SetString("Triggers", CurrentTrigger, SetParam(ini["Triggers"][CurrentTrigger], 4, m_F2));
}
void CTriggers::OnChangeFlag3()
{
CIniFile& ini=Map->GetIniFile();
UpdateData();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
ini.SetString("Triggers", CurrentTrigger, SetParam(ini["Triggers"][CurrentTrigger], 5, m_F3));
}
void CTriggers::OnChangeFlag4()
{
CIniFile& ini=Map->GetIniFile();
UpdateData();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
ini.SetString("Triggers",CurrentTrigger,SetParam(ini["Triggers"][CurrentTrigger], 6, m_F4));
}
void CTriggers::OnChangeFlag5()
{
CIniFile& ini=Map->GetIniFile();
UpdateData();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
ini.SetString("Triggers", CurrentTrigger, SetParam(ini["Triggers"][CurrentTrigger], 7, m_F5));
}
void CTriggers::OnEditchangeTrigger2()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString trg;
m_Trigger2.GetWindowText(trg);
TruncSpace(trg);
ini.SetString("Triggers", CurrentTrigger, SetParam(ini["Triggers"][CurrentTrigger], 1, trg));
}
void CTriggers::OnSelchangeTrigger2()
{
CIniFile& ini=Map->GetIniFile();
int csel=m_Trigger2.GetCurSel();
CString trg;
m_Trigger2.GetLBText(csel,trg);
m_Trigger2.SetWindowText(trg);
OnEditchangeTrigger2();
}
void CTriggers::OnEditchangeEventtype()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Event.GetCurSel();
if(sel2<0) return;
CString e1,e2;
m_E1.GetWindowText(e1);
m_E2.GetWindowText(e2);
while(m_E2.DeleteString(0)!=CB_ERR);
while(m_E1.DeleteString(0)!=CB_ERR);
m_E1.SetWindowText(e1);
m_E2.SetWindowText(e2);
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString eventtype;
m_EventType.GetWindowText(eventtype);
TruncSpace(eventtype);
int pos=1+3*sel2;
ini.SetString("Events", CurrentTrigger, SetParam(ini["Events"][CurrentTrigger], pos, eventtype));
if (g_data["Events"].FindIndex(eventtype) < 0) {
return;
}
CString ptype[2];
ptype[0]=GetParam(g_data["Events"][eventtype],1);
ptype[1]=GetParam(g_data["Events"][eventtype],2);
int pListType[2];
pListType[0]=atoi(GetParam(g_data["ParamTypes"][ptype[0]], 1));
pListType[1]=atoi(GetParam(g_data["ParamTypes"][ptype[1]], 1));
int i;
for(i=0;i<2;i++)
{
CString* label;
if(i==0) label=&m_LE1;
if(i==1) label=&m_LE2;
CComboBox* cb;
if(i==0) cb=&m_E1;
if(i==1) cb=&m_E2;
CString old_sel;
cb->GetWindowText(old_sel);
TruncSpace(old_sel);
if(atoi(ptype[i])<0)
{
char c[50];
itoa(abs(atoi(ptype[i])), c, 10);
cb->SetWindowText(c);
*label="Static";
continue;
}
*label=GetParam(g_data["ParamTypes"][ptype[i]], 0);
HandleParamList(*cb, pListType[i]);
cb->SetWindowText(old_sel);
int e;
for(e=0;eGetCount();e++)
{
CString tmp;
cb->GetLBText(e,tmp);
TruncSpace(tmp);
if(tmp==old_sel)
cb->SetCurSel(e);
}
}
UpdateData(FALSE);
}
void CTriggers::OnSelchangeEventtype()
{
int csel=m_EventType.GetCurSel();
CString trg;
m_EventType.GetLBText(csel,trg);
m_EventType.SetWindowText(trg);
OnEditchangeEventtype();
}
void CTriggers::OnEditchangeEventparam1()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Event.GetCurSel();
if(sel2<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString param1;
m_E1.GetWindowText(param1);
TruncSpace(param1);
int pos=1+3*sel2+1;
ini.SetString("Events", CurrentTrigger, SetParam(ini["Events"][CurrentTrigger], pos, param1));
}
void CTriggers::OnSelchangeEventparam1()
{
int csel=m_E1.GetCurSel();
CString trg;
m_E1.GetLBText(csel,trg);
m_E1.SetWindowText(trg);
OnEditchangeEventparam1();
}
void CTriggers::OnEditchangeEventparam2()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Event.GetCurSel();
if(sel2<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString param2;
m_E2.GetWindowText(param2);
TruncSpace(param2);
int pos=1+3*sel2+2;
ini.SetString("Events", CurrentTrigger, SetParam(ini["Events"][CurrentTrigger], pos, param2));
}
void CTriggers::OnSelchangeEventparam2()
{
int csel=m_E2.GetCurSel();
CString trg;
m_E2.GetLBText(csel,trg);
m_E2.SetWindowText(trg);
OnEditchangeEventparam2();
}
void CTriggers::OnEditchangeActiontype()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Action.GetCurSel();
if(sel2<0) return;
CString a;
m_A1.GetWindowText(a);
while(m_A1.DeleteString(0)!=CB_ERR);
m_A1.SetWindowText(a);
m_A2.GetWindowText(a);
while(m_A2.DeleteString(0)!=CB_ERR);
m_A2.SetWindowText(a);
m_A3.GetWindowText(a);
while(m_A3.DeleteString(0)!=CB_ERR);
m_A3.SetWindowText(a);
m_A4.GetWindowText(a);
while(m_A4.DeleteString(0)!=CB_ERR);
m_A4.SetWindowText(a);
m_A5.GetWindowText(a);
while(m_A5.DeleteString(0)!=CB_ERR);
m_A5.SetWindowText(a);
m_A6.GetWindowText(a);
while(m_A6.DeleteString(0)!=CB_ERR);
m_A6.SetWindowText(a);
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString actiontype;
m_ActionType.GetWindowText(actiontype);
TruncSpace(actiontype);
int pos=1+8*sel2;
ini.SetString("Actions", CurrentTrigger, SetParam(ini["Actions"][CurrentTrigger], pos, actiontype));
if (g_data["Actions"].FindIndex(actiontype) < 0) {
return;
}
CString ptype[6];
ptype[0]=GetParam(g_data["Actions"][actiontype],1);
ptype[1]=GetParam(g_data["Actions"][actiontype],2);
ptype[2]=GetParam(g_data["Actions"][actiontype],3);
ptype[3]=GetParam(g_data["Actions"][actiontype],4);
ptype[4]=GetParam(g_data["Actions"][actiontype],5);
ptype[5]=GetParam(g_data["Actions"][actiontype],6);
if (GetParam(g_data["Actions"][actiontype], 7) == "0") {
m_LAW="Unused";
} else {
m_LAW = "Waypoint:";
}
int pListType[6];
pListType[0]=atoi(GetParam(g_data["ParamTypes"][ptype[0]], 1));
pListType[1]=atoi(GetParam(g_data["ParamTypes"][ptype[1]], 1));
int i;
for(i=0;i<6;i++)
{
CString* label;
if(i==0) label=&m_LA1;
if(i==1) label=&m_LA2;
if(i==2) label=&m_LA3;
if(i==3) label=&m_LA4;
if(i==4) label=&m_LA5;
if(i==5) label=&m_LA6;
CComboBox* cb;
if(i==0) cb=&m_A1;
if(i==1) cb=&m_A2;
if(i==2) cb=&m_A3;
if(i==3) cb=&m_A4;
if(i==4) cb=&m_A5;
if(i==5) cb=&m_A6;
CString old_sel;
cb->GetWindowText(old_sel);
TruncSpace(old_sel);
if(atoi(ptype[i])<0)
{
char c[50];
itoa(abs(atoi(ptype[i])), c, 10);
cb->SetWindowText(c);
*label="Static";
continue;
}
*label = GetParam(g_data["ParamTypes"][ptype[i]], 0);
HandleParamList(*cb, pListType[i]);
cb->SetWindowText(old_sel);
int e;
for(e=0;eGetCount();e++)
{
CString tmp;
cb->GetLBText(e,tmp);
TruncSpace(tmp);
if(tmp==old_sel)
cb->SetCurSel(e);
}
}
/*
switch(atoi(actiontype))
{
case 0:
case 23:
case 24:
case 46:
case 47:
m_LA1="Unused:";
m_LA2="Unused:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
break;
case 1:
case 2:
case 3:
case 6:
case 36:
case 74:
m_LA1="Unused:";
m_LA2="House:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
ListHouses(m_A2);
break;
case 4:
m_LA1="Unknown =1:";
m_LA2="TeamType:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
m_A1.SetWindowText("1");
OnEditchangeActionparam1();
ListTeamTypes(m_A2);
break;
case 5:
m_LA1="Unused?:";
m_LA2="TeamType:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
ListTeamTypes(m_A2);
break;
case 7:
m_LA1="Unknown =1:";
m_LA2="TeamType:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
m_A1.SetWindowText("1");
OnEditchangeActionparam1();
ListTeamTypes(m_A2);
break;
case 8:
case 17:
case 18:
m_LA1="Unused:";
m_LA2="Waypoint:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
ListWaypoints(m_A2);
break;
case 27:
m_LA1="Unused:";
m_LA2="Duration:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
break;
case 43:
m_LA1="Unused:";
m_LA2="Unknown:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
m_A2.SetWindowText("7");
OnEditchangeActionparam2();
break;
case 44:
m_LA1="Unused:";
m_LA2="Duration:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
break;
case 48:
m_LA1="Unused:";
m_LA2="Speed:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
break;
case 55:
m_LA1="Unused:";
m_LA2="Unknown:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
m_A2.SetWindowText("1");
OnEditchangeActionparam2();
break;
case 56:
m_LA1="Unused:";
m_LA2="Global:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
break;
case 58:
m_LA1="Unused:";
m_LA2="Size:";
m_LA3="Unused:";
m_LA4="Unused:";
m_LA5="Unused:";
m_LA6="Unused:";
break;
default:
m_LA1="Param1:";
m_LA2="Param2:";
m_LA3="Param3:";
m_LA4="Param4:";
m_LA5="Param5:";
m_LA6="Param6:";
}
*/
UpdateData(FALSE);
}
void CTriggers::OnSelchangeActiontype()
{
int csel=m_ActionType.GetCurSel();
CString trg;
m_ActionType.GetLBText(csel,trg);
m_ActionType.SetWindowText(trg);
OnEditchangeActiontype();
}
void CTriggers::OnEditchangeActionwaypoint()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Action.GetCurSel();
if(sel2<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString waypoint;
m_ActionWaypoint.GetWindowText(waypoint);
TruncSpace(waypoint);
waypoint=GetWaypoint(atoi(waypoint));
int pos=1+8*sel2+7;
ini.SetString("Actions", CurrentTrigger, SetParam(ini["Actions"][CurrentTrigger], pos, waypoint));
}
void CTriggers::OnSelchangeActionwaypoint()
{
int csel=m_ActionWaypoint.GetCurSel();
CString trg;
m_ActionWaypoint.GetLBText(csel,trg);
m_ActionWaypoint.SetWindowText(trg);
OnEditchangeActionwaypoint();
}
void CTriggers::OnEditchangeActionparam1()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
int sel2=m_Action.GetCurSel();
if (sel2 < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString p1;
m_A1.GetWindowText(p1);
TruncSpace(p1);
int pos=1+8*sel2+1;
ini.SetString("Actions", CurrentTrigger, SetParam(ini["Actions"][CurrentTrigger], pos, p1));
}
void CTriggers::OnSelchangeActionparam1()
{
int csel=m_A1.GetCurSel();
CString trg;
m_A1.GetLBText(csel,trg);
m_A1.SetWindowText(trg);
OnEditchangeActionparam1();
}
void CTriggers::OnEditchangeActionparam2()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Action.GetCurSel();
if(sel2<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString p2;
m_A2.GetWindowText(p2);
TruncSpace(p2);
int pos=1+8*sel2+2;
ini.SetString("Actions", CurrentTrigger, SetParam(ini["Actions"][CurrentTrigger], pos, p2));
}
void CTriggers::OnSelchangeActionparam2()
{
int csel=m_A2.GetCurSel();
CString trg;
m_A2.GetLBText(csel,trg);
m_A2.SetWindowText(trg);
OnEditchangeActionparam2();
}
void CTriggers::OnEditchangeActionparam3()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Action.GetCurSel();
if(sel2<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString p3;
m_A3.GetWindowText(p3);
TruncSpace(p3);
int pos=1+8*sel2+3;
ini.SetString("Actions", CurrentTrigger, SetParam(ini["Actions"][CurrentTrigger], pos, p3));
}
void CTriggers::OnSelchangeActionparam3()
{
int csel=m_A3.GetCurSel();
CString trg;
m_A3.GetLBText(csel,trg);
m_A3.SetWindowText(trg);
OnEditchangeActionparam3();
}
void CTriggers::OnEditchangeActionparam4()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Action.GetCurSel();
if(sel2<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString p4;
m_A4.GetWindowText(p4);
TruncSpace(p4);
int pos=1+8*sel2+4;
ini.SetString("Actions", CurrentTrigger, SetParam(ini["Actions"][CurrentTrigger], pos, p4));
}
void CTriggers::OnSelchangeActionparam4()
{
int csel=m_A4.GetCurSel();
CString trg;
m_A4.GetLBText(csel,trg);
m_A4.SetWindowText(trg);
OnEditchangeActionparam4();
}
void CTriggers::OnEditchangeActionparam5()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Action.GetCurSel();
if(sel2<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString p5;
m_A5.GetWindowText(p5);
TruncSpace(p5);
int pos=1+8*sel2+5;
ini.SetString("Actions", CurrentTrigger, SetParam(ini["Actions"][CurrentTrigger], pos, p5));
}
void CTriggers::OnSelchangeActionparam5()
{
int csel=m_A5.GetCurSel();
CString trg;
m_A5.GetLBText(csel,trg);
m_A5.SetWindowText(trg);
OnEditchangeActionparam5();
}
void CTriggers::OnEditchangeActionparam6()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Action.GetCurSel();
if(sel2<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CString p6;
m_A6.GetWindowText(p6);
TruncSpace(p6);
int pos=1+8*sel2+6;
ini.SetString("Actions", CurrentTrigger, SetParam(ini["Actions"][CurrentTrigger], pos, p6));
}
void CTriggers::OnSelchangeActionparam6()
{
int csel=m_A6.GetCurSel();
CString trg;
m_A6.GetLBText(csel,trg);
m_A6.SetWindowText(trg);
OnEditchangeActionparam6();
}
void CTriggers::OnAddevent()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CIniFileSection& sec=ini.AddSection("Events");
int cval=atoi(GetParam(sec[CurrentTrigger],0));
cval++;
char c[50];
itoa(cval,c,10);
sec.SetString(CurrentTrigger, SetParam(sec[CurrentTrigger], 0, c) + ",13,0,0");
UpdateDialog();
m_Trigger.SetCurSel(sel);
OnSelchangeTrigger();
m_Event.SetCurSel(cval-1);
OnSelchangeEvent();
}
void CTriggers::OnDeleteevent()
{
CIniFile& ini = Map->GetIniFile();
int sel = m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
int sel2 = m_Event.GetCurSel();
if (sel2 < 0) {
return;
}
if (MessageBox("Do you really want to delete this event?", "Delete event", MB_YESNO) == IDNO) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
auto const& sec = ini["Events"];
auto data = sec[CurrentTrigger];
int v = atoi(GetParam(data, 0));
char c[50];
v--;
itoa(v, c, 10);
data = SetParam(data, 0, c);
int pos = 1 + sel2 * 3;
int posc = 1 + v * 3;
for (auto i = 0; i < 3; i++) {
data = SetParam(data, pos + i, GetParam(data, posc + i));
}
LPCSTR cupos = data.operator LPCSTR();
for (auto i = 0; i < posc; i++) {
cupos = strchr(cupos + 1, ',');
if (i == posc - 1) {
data.SetAt(cupos - data.operator LPCSTR(), '\0');
break;
}
}
ini.SetString("Events", CurrentTrigger, data);
UpdateDialog();
m_Trigger.SetCurSel(sel);
OnSelchangeTrigger();
}
void CTriggers::OnAddaction()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
CIniFileSection& sec=ini.AddSection("Actions");
int cval=atoi(GetParam(sec[CurrentTrigger],0));
cval++;
char c[50];
itoa(cval,c,10);
sec.SetString(CurrentTrigger, SetParam(sec[CurrentTrigger], 0, c) + ",0,0,0,0,0,0,0,A");
UpdateDialog();
m_Trigger.SetCurSel(sel);
OnSelchangeTrigger();
m_Action.SetCurSel(cval-1);
OnSelchangeAction();
}
void CTriggers::OnDeleteaction()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if(sel<0) return;
int sel2=m_Action.GetCurSel();
if(sel2<0) return;
if (MessageBox("Do you really want to delete this action?", "Delete action", MB_YESNO) == IDNO) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
auto const& sec = ini["Actions"];
auto data = sec[CurrentTrigger];
int v=atoi(GetParam(data,0));
char c[50];
v--;
itoa(v,c,10);
data=SetParam(data,0, c);
int pos=1+sel2*8;
int posc=1+v*8;
int i;
for(i=0;i<3;i++)
data=SetParam(data,pos+i, GetParam(data,posc+i));
LPCSTR cupos = data.operator LPCSTR();
for (auto i = 0; i < posc; i++) {
cupos = strchr(cupos + 1, ',');
if (i == posc - 1) {
data.SetAt(cupos - data.operator LPCSTR(), '\0');
break;
}
}
ini.SetString("Actions", CurrentTrigger, data);
UpdateDialog();
m_Trigger.SetCurSel(sel);
OnSelchangeTrigger();
}
void CTriggers::OnDeletetrigger()
{
CIniFile& ini=Map->GetIniFile();
int sel=m_Trigger.GetCurSel();
if (sel < 0) {
return;
}
if (MessageBox("Do you really want to delete this trigger? Don´t forget to delete the attached tag (important!)", "Delete trigger", MB_YESNO) == IDNO) {
return;
}
CString CurrentTrigger;
m_Trigger.GetLBText(sel, CurrentTrigger);
TruncSpace(CurrentTrigger);
ini.RemoveValueByKey( "Triggers",CurrentTrigger);
ini.RemoveValueByKey( "Events",CurrentTrigger);
ini.RemoveValueByKey( "Actions",CurrentTrigger);
//UpdateDialog();
((CFinalSunDlg*)theApp.m_pMainWnd)->UpdateDialogs(TRUE);
}
void CTriggers::OnAddtrigger()
{
CIniFile& ini = Map->GetIniFile();
CString newId = GetFreeID();
ini.SetString("Triggers", newId, "GDI,,New trigger,0,1,1,1,0");
ini.SetString("Events", newId, "0");
ini.SetString("Actions", newId, "0");
if (MessageBox("Trigger created. If you want to create a simple tag now, press Yes. The tag will be called ""New tag"", you should name it like the trigger (after you have set up the trigger).", "Trigger created", MB_YESNO)) {
CString newTagId = GetFreeID();
ini.SetString("Tags", newTagId, "0,New tag," + newId);
}
//UpdateDialog();
((CFinalSunDlg*)theApp.m_pMainWnd)->UpdateDialogs(TRUE);
}