Subversion Repositories spk

Rev

Rev 1 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
#include "../StdAfx.h"
2
#include "CustomiseTurret.h"
3
 
4
#include "CustomiseShip.h"
5
 
6
namespace Creator {
7
	String ^CustomiseTurret::GetPosition(int dir)
8
	{
9
		return ((CustomiseShip ^)m_pParent)->GetPosition(dir);
10
	}
11
 
12
	void CustomiseTurret::SetupControlsEnd()
13
	{
14
		this->ComboGameCockpit->SelectedIndex = 0;
15
	}
16
 
17
	void CustomiseTurret::SetupControls()
18
	{
19
		// fill to tab
20
		this->PanelCockpit->Enabled = false;
21
		this->Dock = System::Windows::Forms::DockStyle::Fill;
22
 
23
		// adjust the game list
24
		this->ComboGameCockpit->Items->Clear();
25
		this->ComboGameCockpit->Items->Add("- Default -");
26
 
27
		// cockpit combo selection
28
		this->ComboCockpit->Items->Clear();
29
		if ( !m_pModels || m_pModels->Empty() )
30
		{
31
			// if no scene file
32
			if ( m_pShipData->lTurrets.size() )
33
			{
34
				STurretEntry *t = m_pShipData->lTurrets[0];
35
				this->ComboCockpit->Items->Add("No Scene File Loaded!! (" + SystemStringFromCyString(t->sModel) + ":" + Convert::ToString(t->iTurret) + ")");
36
			}
37
			else
38
				this->ComboCockpit->Items->Add("No Scene File Loaded!!");
39
			this->ComboCockpit->Enabled = false;
40
			this->ComboCockpit->SelectedIndex = 0;
41
		}
42
		// otherwise, fill in the data
43
		else
44
		{
45
			this->ComboCockpit->Enabled = true;
46
			int i = 0;
47
			for ( SStringList *str = m_pModels->Head(); str; str = str->next )
48
			{
49
				String ^entry = SystemStringFromCyString(str->str) + ":" + Convert::ToString(i);
50
				this->ComboCockpit->Items->Add(entry);
51
				++i;
52
			}
53
		}
54
 
55
		this->UpdateTurrets();
56
	}
57
 
58
	void CustomiseTurret::UpdateDisplay()
59
	{
60
		if ( m_pModels && !m_pModels->Empty() )
61
			this->ComboCockpit->SelectedIndex = m_pShipData->lTurrets.Get(0)->iSceneNode;
62
	}
63
 
64
	void CustomiseTurret::UpdateCockpits()
65
	{
66
		this->ComboCockpitStd->Items->Clear();
67
 
68
		CyStringList *list = ((CustomiseShip ^)m_pParent)->GetCockpits();
69
		if ( list || !list->Empty() )
70
		{
71
			for ( SStringList *str = list->Head(); str; str = str->next )
72
				this->ComboCockpitStd->Items->Add(SystemStringFromCyString(str->data));
73
		}
74
 
75
		this->ComboCockpitCustom->Items->Clear();
76
		for ( SCockpit *c = m_pShipFile->GetCockpits()->First(); c; c = m_pShipFile->GetCockpits()->Next() )
77
			this->ComboCockpitCustom->Items->Add(SystemStringFromCyString(c->sCockpit.GetToken(";", 19, 19)));
78
	}
79
 
80
	void CustomiseTurret::UpdateTurrets()
81
	{
82
		this->ListTurret->Items->Clear();
83
		int i = 0;
84
		for ( STurretEntry *t = m_pShipData->lTurrets.First(); t; t = m_pShipData->lTurrets.Next() )
85
		{
86
			if ( t == m_pShipData->lTurrets.Front()->Data() ) continue; // skip the first entry (its the cockpit not a turret
87
			ListViewItem ^item = this->ListTurret->Items->Add(gcnew ListViewItem(Convert::ToString(t->iIndex - 1)));
88
			if ( m_pShipData->cockpits[t->iTurret - 1].sCockpit.Empty() )
89
				item->SubItems->Add(Convert::ToString(m_pShipData->cockpits[t->iTurret - 1].iCockpit));
90
			else
91
				item->SubItems->Add(SystemStringFromCyString(m_pShipData->cockpits[t->iTurret - 1].sCockpit));
92
			item->SubItems->Add(this->GetPosition(m_pShipData->cockpits[t->iTurret - 1].iPos));
93
			item->SubItems->Add(SystemStringFromCyString(t->sModel) + ":" + Convert::ToString(t->iSceneNode));
94
			item->ImageKey = "turret";
95
			++i;
96
			item->Tag = i;
97
		}
98
		this->ListTurret->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
99
 
100
		this->UpdateCockpitDisplay();
101
		((CustomiseShip ^)m_pParent)->UpdateGunTurrets();
102
	}
103
 
104
	void CustomiseTurret::UpdateCockpitDisplay()
105
	{
106
		this->RadioCockpitCustom->Enabled = (this->ComboCockpitCustom->Items->Count) ? true : false;
107
		this->GroupCockpit->Enabled = (this->ListTurret->SelectedItems->Count) ? true : false;
108
		if ( this->ListTurret->SelectedItems->Count )
109
		{
110
			ListViewItem ^item = this->ListTurret->SelectedItems[0];
111
			if ( CyStringFromSystemString(item->SubItems[1]->Text).IsNumber() && Convert::ToInt32(item->SubItems[1]->Text) < this->ComboCockpitStd->Items->Count )
112
			{
113
				this->RadioCockpitStd->Checked = true;
114
				this->ComboCockpitStd->SelectedIndex = Convert::ToInt32(item->SubItems[1]->Text);
115
 
116
			}
117
			else
118
			{
119
				this->RadioCockpitCustom->Checked = true;
120
				this->ComboCockpitCustom->Text = item->SubItems[1]->Text;
121
				this->UpdateCockpitDisplay2();
122
			}
123
		}
124
		else
125
		{
126
			this->ComboCockpitStd->SelectedIndex = -1;
127
		}
128
	}
129
 
130
	void CustomiseTurret::UpdateCockpitDisplay2()
131
	{
132
		m_pCurrentCockpit = m_pShipFile->FindCockpit(CyStringFromSystemString(ComboCockpitCustom->Text));
133
		if ( m_pCurrentCockpit )
134
		{
135
			this->TextCockpitScene->Text = SystemStringFromCyString(m_pCurrentCockpit->sCockpit.GetToken(";", 8, 8));
136
			this->UpdateCockpitWeaponsList();
137
		}
138
	}
139
 
140
	void CustomiseTurret::UpdateCockpitWeaponsList()
141
	{
142
		this->ListWeaponCockpit->Items->Clear();
143
 
144
		if ( !m_pCurrentCockpit )
145
			return;
146
 
147
		bool oldUpdate = m_bUpdateing;
148
		m_bUpdateing = true;
149
 
150
		bool added = false;
151
 
152
		CyStringList List;
153
		CyStringList *list = NULL;
154
		int mask = -1;
155
		if ( this->ComboGameCockpit->SelectedIndex > 0 )
156
		{
157
			this->CheckWeaponDefaultCockpit->Visible = true;
158
			list = ((CustomiseShip ^)m_pParent)->GetLasers(this->ComboGameCockpit->SelectedIndex);
159
			for ( SWeaponMask *m = m_pCurrentCockpit->lWeaponMask.First(); m; m = m_pCurrentCockpit->lWeaponMask.Next() )
160
			{
161
				if ( m->iGame == this->ComboGameCockpit->SelectedIndex )
162
				{
163
					mask = m->iMask;
164
					break;
165
				}
166
			}
167
			this->CheckWeaponDefaultCockpit->Checked = (mask == -1) ? true : false;
168
		}
169
		else
170
		{
171
			mask = m_pCurrentCockpit->sCockpit.GetToken(";", 9, 9).ToInt();
172
			this->CheckWeaponDefaultCockpit->Visible = false;
173
			this->CheckWeaponDefaultCockpit->Checked = false;
174
		}
175
		if ( mask == -1 ) mask = 0;
176
		if ( list )
177
		{
178
			for ( SStringList *strNode = list->Head(); strNode; strNode = strNode->next )
179
			{
180
				CyString id = strNode->str.GetToken(";", 6, 6);
181
				SStringList *found = List.FindString(id);
182
				CyString str = (strNode->data.Empty()) ? strNode->str.GetToken(";", 23, 23) : strNode->data;
183
				if ( found )
184
				{
185
					found->data += ", ";
186
					found->data += str;
187
				}
188
				else
189
					List.PushBack(id, str);
190
			}
191
		}
192
 
193
		for ( int i = 0; i < 32; i++ )
194
		{
195
			if ( List.Count() > i )
196
			{
197
				ListViewItem ^item = gcnew ListViewItem(SystemStringFromCyString(List.GetAt(i)->str));
198
				item->SubItems->Add(SystemStringFromCyString(List.GetAt(i)->data));
199
				this->ListWeaponCockpit->Items->Add(item);
200
				item->Tag = i;
201
				if ( mask & (1 << i) )
202
					item->Checked = true;
203
				added = true;
204
			}
205
 
206
			if ( !added )
207
			{
208
				ListViewItem ^added;
209
				added = this->ListWeaponCockpit->Items->Add("LASERGROUP_" + Convert::ToString(i + 1));
210
				added->Tag = i;
211
				if ( mask & (1 << i) )
212
					added->Checked = true;
213
			}
214
		}
215
 
216
		this->ListWeaponCockpit->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
217
 
218
		m_bUpdateing = oldUpdate;
219
	}
220
 
221
	void CustomiseTurret::EditTurret(ListViewItem ^item)
222
	{
223
		String ^str = this->EditTurret(Convert::ToInt32(item->Tag));
224
		if ( str )
225
			item->SubItems[3]->Text = str;
226
	}
227
 
228
	String ^CustomiseTurret::EditTurret(int id)
229
	{
230
		if ( !m_pModels ) return nullptr;
231
		 InputBox ^input = gcnew InputBox("Select the model entry to use for the cockpit (Turret: " + Convert::ToString(id) + ")");
232
		 int i = 0;
233
		 for ( SStringList *str = m_pModels->Head(); str; str = str->next )
234
		 {
235
			 input->AddItem(SystemStringFromCyString(str->str) + ":" + Convert::ToString(i));
236
			 ++i;
237
		 }
238
		 input->SetSelectedOption(m_pShipData->lTurrets.Get(id)->iSceneNode);
239
 
240
		 if ( input->ShowDialog(this) == Windows::Forms::DialogResult::OK )
241
		 {
242
			 String ^str = input->GetInput();
243
			 i = input->GetInputSelected();
244
			 m_pShipData->lTurrets.Get(id)->iSceneNode = i;
245
			 m_pShipData->lTurrets.Get(id)->sModel = CyStringFromSystemString(str).GetToken(":", 1, 1);
246
 
247
			 return str;
248
		 }
249
 
250
		 return nullptr;
251
	}
252
 
253
	void CustomiseTurret::SaveCockpitWeaponsList()
254
	{
255
		if ( m_bUpdateing )
256
			return;
257
 
258
		if ( !m_pCurrentCockpit )
259
			return;
260
 
261
		// compute the mask
262
		int mask = 0;
263
		for ( int i = 0; i < this->ListWeaponCockpit->Items->Count; i++ )
264
		{
265
			ListViewItem ^item = this->ListWeaponCockpit->Items[i];
266
			if ( !item->Checked )
267
				continue;
268
			mask += (1 << Convert::ToInt32(item->Tag));
269
		}
270
 
271
		// edit the default lasers
272
		if ( !this->ComboGameCockpit->SelectedIndex )
273
			m_pCurrentCockpit->sCockpit = m_pCurrentCockpit->sCockpit.RepToken(";", 9, CyString::Number(mask));
274
		// otherwise adjust for the game
275
		else
276
		{
277
			bool found = false;
278
			for ( SWeaponMask *m = m_pCurrentCockpit->lWeaponMask.First(); m; m = m_pCurrentCockpit->lWeaponMask.Next() )
279
			{
280
				if ( m->iGame == this->ComboGameCockpit->SelectedIndex )
281
				{
282
					m->iMask = mask;
283
					found = true;
284
					break;
285
				}
286
			}
287
 
288
			if ( !found )
289
			{
290
				SWeaponMask *m = new SWeaponMask;
291
				m->iGame = this->ComboGameCockpit->SelectedIndex;
292
				m->iMask = mask;
293
				m_pCurrentCockpit->lWeaponMask.push_back(m);
294
			}
295
		}
296
	}
297
 
298
};