Subversion Repositories spk

Rev

Rev 1 | Rev 59 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
 
2
#include "ShipData.h"
3
#include "spkdef.h"
4
 
5
CShipData::CShipData(void)
6
{
7
	this->CreateDefault();
8
}
9
 
10
CShipData::~CShipData(void)
11
{
12
	this->ClearLists();
13
}
14
 
15
 
16
CyString CShipData::CreateData()
17
{
18
	CyString data = this->sModel;
19
	data.AddToken(";", CyString::Number(this->iPictureID));
20
	data.AddToken(";", CyString::CreateFromFloat(this->fRotX, -1));
21
	data.AddToken(";", CyString::CreateFromFloat(this->fRotY, -1));
22
	data.AddToken(";", CyString::CreateFromFloat(this->fRotZ, -1));
23
	data.AddToken(";", CShipData::ConvertShipSubType(this->iSubType));
24
	data.AddToken(";", CyString::Number(this->iDesc));
25
	data.AddToken(";", CyString::Number(this->iSpeed));
26
	data.AddToken(";", CyString::Number(this->iAccel));
27
	data.AddToken(";", CyString::Number(this->iEngineSound));
28
	data.AddToken(";", CyString::Number(this->iReactionDelay));
29
	data.AddToken(";", CyString::Number(this->iEngineEffect));
30
	data.AddToken(";", CyString::Number(this->iEngineGlow));
31
	data.AddToken(";", CyString::Number(this->iPower));
32
	data.AddToken(";", CyString::Number(this->iSoundMin));
33
	data.AddToken(";", CyString::Number(this->iSoundMax));
34
	data.AddToken(";", this->sModelScene);
35
	data.AddToken(";", this->sCockpitScene);
36
	data.AddToken(";", CyString::Number(this->iLaserMask));
37
	data.AddToken(";", CyString::Number(this->iGunCount));
38
	data.AddToken(";", CyString::Number(this->iLaserEnergy));
39
	data.AddToken(";", CyString::CreateFromFloat(this->fLaserRecharge, -1));
40
	data.AddToken(";", CyString::Number(this->iShieldType));
41
	data.AddToken(";", CyString::Number(this->iMaxShields));
42
	data.AddToken(";", CyString::Number(this->iMissileMask));
43
	data.AddToken(";", CyString::Number(this->iMissileCount));
44
	data.AddToken(";", CyString::Number(this->iSpeedExtension));
45
	data.AddToken(";", CyString::Number(this->iSteeringExtension));
46
	data.AddToken(";", CyString::Number(this->iCargoMin));
47
	data.AddToken(";", CyString::Number(this->iCargoMax));
48
	data.AddToken(";", CyString::Number(this->iWareListID));
49
 
50
	// 6 turrets next
51
	for ( int i = 0; i < 6; i++ )
52
	{
53
		if ( this->cockpits[i].sCockpit.Empty() )
54
			data.AddToken(";", CyString::Number(this->cockpits[i].iCockpit));
55
		else
56
		{
57
			if ( this->cockpits[i].iCockpit > -1 )
58
				data.AddToken(";", this->cockpits[i].sCockpit + "(" + (long)this->cockpits[i].iCockpit + ")");
59
			else
60
				data.AddToken(";", this->cockpits[i].sCockpit);
61
		}
62
		data.AddToken(";", CyString::Number(this->cockpits[i].iPos));
63
	}
64
 
65
	data.AddToken(";", CyString::Number(this->iDocking));
66
	data.AddToken(";", CyString::Number(this->iCargoClass));
67
	data.AddToken(";", CyString::Number(this->iRace));
68
	data.AddToken(";", CyString::Number(this->iHull));
69
	data.AddToken(";", CyString::Number(this->iExplosionDef));
70
	data.AddToken(";", CyString::Number(this->iExplosionBody));
71
	data.AddToken(";", CyString::Number(this->iParticle));
72
	data.AddToken(";", CyString::Number(this->iVariation));
73
	data.AddToken(";", CyString::Number(this->iRotationAccel));
74
	data.AddToken(";", CyString::Number(this->iClass));
75
	data.AddToken(";", CyString::Number(this->iTurretCount));
76
 
77
	// now do the turrets
78
	for ( int i = 0; i < this->iTurretCount; i++ )
79
	{
80
		STurretEntry *t = this->lTurrets[i];
81
		data.AddToken(";", CyString::Number(t->iIndex));
82
		data.AddToken(";", CyString::Number(t->iTurret));
83
		data.AddToken(";", t->sModel);
84
		data.AddToken(";", CyString::Number(t->iSceneNode));
85
	}
86
 
87
	// the gun entries next
88
	data.AddToken(";", CyString::Number(this->iGunsCount));
89
	for ( int i = 0; i < this->iGunsCount; i++ )
90
	{
91
		SGunGroup *g = this->lGuns[i];
92
		data.AddToken(";", CyString::Number(g->iGunIndex));
93
		data.AddToken(";", CyString::Number(g->iLaserCount));
94
		data.AddToken(";", CyString::Number(g->iIndex));
95
		data.AddToken(";", CyString::Number(g->iWeaponCount));
96
		for ( int j = 0; j < g->iWeaponCount; j++ )
97
		{
98
			SWeaponGroup *w = g->lWeapons[j];
99
			data.AddToken(";", CyString::Number(w->iGunIndex));
100
			data.AddToken(";", CyString::Number(w->iLaser));
101
			data.AddToken(";", w->sModel1);
102
			data.AddToken(";", CyString::Number(w->iNode1));
103
			data.AddToken(";", w->sModel2);
104
			data.AddToken(";", CyString::Number(w->iNode2));
105
		}
106
	}
107
 
108
	// now the rest of the data
109
	data.AddToken(";", CyString::Number(this->iVolumn));
110
	data.AddToken(";", CyString::Number(this->iRelVal));
111
	data.AddToken(";", CyString::Number(this->iPriceMod1));
112
	data.AddToken(";", CyString::Number(this->iPriceMod2));
113
	data.AddToken(";", CyString::Number(this->iSize));
114
	data.AddToken(";", CyString::Number(this->iRelValPlayer));
115
	data.AddToken(";", CyString::Number(this->iMinNoto));
116
	data.AddToken(";", CyString::Number(this->iVideoID));
117
	data.AddToken(";", CyString::Number(this->iSkin));
118
	data.AddToken(";", this->sID);
119
	data += ";"; // add the end ;
120
 
121
	return data;
122
}
123
 
124
void CShipData::CreateDefault()
125
{
126
	this->sModel = "0";
127
	this->iPictureID = 0;
128
	this->fRotX = 0.00f;
129
	this->fRotY = 0.00f;
130
	this->fRotZ = 0.00f;
131
	this->iSubType = 0;
132
	this->iDesc = 0;
133
	this->iSpeed = 0;
134
	this->iAccel = 0;
135
	this->iEngineSound = 106;
136
	this->iReactionDelay = 1;
137
	this->iEngineEffect = 5;
138
	this->iEngineGlow = 37;
139
	this->iPower = 0;
140
	this->iSoundMin = 112;
141
	this->iSoundMax = 202;
142
	this->sModelScene = "";
143
	this->sCockpitScene = "";
144
	this->iLaserMask = 0;
145
	this->iGunCount = 0;
146
	this->iLaserEnergy = 0;
147
	this->fLaserRecharge = 0.00f;
148
	this->iShieldType = 0;
149
	this->iMaxShields = 0;
150
	this->iMissileMask = 0;
151
	this->iMissileCount = 0;
152
	this->iSpeedExtension = 0;
153
	this->iSteeringExtension = 0;
154
	this->iCargoMin = 0;
155
	this->iCargoMax = 0;
156
	this->iWareListID = 0;
157
	this->iDocking = 0;
158
	this->iCargoClass = 0;
159
	this->iRace = 1;
160
	this->iHull = 0;
161
	this->iExplosionDef = 35;
162
	this->iExplosionBody = 36;
163
	this->iParticle = 1;
164
	this->iVariation = 0;
165
	this->iRotationAccel = 0;
166
	this->iClass = 0;
167
	this->iTurretCount = 0;
168
	this->iGunsCount = 0;
169
	this->iVolumn = 1;
170
	this->iRelVal = 0;
171
	this->iPriceMod1 = 25;
172
	this->iPriceMod2 = 1;
173
	this->iSize = 0;
174
	this->iRelValPlayer = 0;
175
	this->iMinNoto = 0;
176
	this->iVideoID = 0;
177
	this->iSkin = 0;
178
	this->sID = "SC_NEW_SHIP";
179
 
180
	// make sure the lists are clear
181
	this->ClearLists();
182
}
183
 
184
void CShipData::ClearLists() 
185
{
186
	this->lTurrets.MemoryClear();
187
	for ( SGunGroup *g = this->lGuns.First(); g; g = this->lGuns.Next() )
188
		g->lWeapons.MemoryClear();
189
	this->lGuns.MemoryClear();
190
}
191
 
192
bool CShipData::ReadShipData(CyString a_data)
193
{
194
	int max;
195
	CyString *entries = a_data.SplitToken(";", &max);
196
	if ( max >= 60 && entries )
197
	{
198
		this->sModel = entries[0];
199
		this->iPictureID = entries[1].ToInt();
200
		this->fRotX = entries[2].ToFloat();
201
		this->fRotY = entries[3].ToFloat();
202
		this->fRotZ = entries[4].ToFloat();
203
		if ( entries[5].IsNumber() )
204
			this->iSubType = entries[5].ToInt();
205
		else
206
			this->iSubType = CShipData::ConvertShipSubType(entries[5]);
207
		this->iDesc = entries[6].ToInt();
208
		this->iSpeed = entries[7].ToInt();
209
		this->iAccel = entries[8].ToInt();
210
		this->iEngineSound = entries[9].ToInt();
211
		this->iReactionDelay = entries[10].ToInt();
212
		this->iEngineEffect = entries[11].ToInt();
213
		this->iEngineGlow = entries[12].ToInt();
214
		this->iPower = entries[13].ToInt();
215
		this->iSoundMin = entries[14].ToInt();
216
		this->iSoundMax = entries[15].ToInt();
217
		this->sModelScene = entries[16];
218
		this->sCockpitScene = entries[17];
219
		this->iLaserMask = entries[18].ToInt();
220
		this->iGunCount = entries[19].ToInt();
221
		this->iLaserEnergy = entries[20].ToInt();
222
		this->fLaserRecharge = entries[21].ToFloat();
223
		this->iShieldType = entries[22].ToInt();
224
		this->iMaxShields = entries[23].ToInt();
225
		this->iMissileMask = entries[24].ToInt();
226
		this->iMissileCount = entries[25].ToInt();
227
		this->iSpeedExtension = entries[26].ToInt();
228
		this->iSteeringExtension = entries[27].ToInt();
229
		this->iCargoMin = entries[28].ToInt();
230
		this->iCargoMax = entries[29].ToInt();
231
		this->iWareListID = entries[30].ToInt();
232
 
233
		for ( int i = 0; i < 6; i++ )
234
		{
235
			this->cockpits[i].iPos = entries[(i * 2) + 32].ToInt();
236
			if ( entries[(i * 2) + 31].IsNumber() )
237
				this->cockpits[i].iCockpit = entries[(i * 2) + 31].ToInt();
238
			else
239
			{
240
				this->cockpits[i].sCockpit = entries[(i * 2) + 31];
241
				this->cockpits[i].iCockpit = -1; // custom cockpit
39 cycrow 242
				if ( this->cockpits[i].sCockpit.IsIn("(") ) {
243
					this->cockpits[i].iCockpit = this->cockpits[i].sCockpit.GetToken("(", 2).GetToken(")", 1, 1).ToInt();
244
					this->cockpits[i].sCockpit = this->cockpits[i].sCockpit.GetToken("(", 1, 1);
245
				}
1 cycrow 246
			}
247
		}
248
 
249
		this->iDocking = entries[43].ToInt();
250
		this->iCargoClass = entries[44].ToInt();
251
		this->iRace = entries[45].ToInt();
252
		this->iHull = entries[46].ToInt();
253
		this->iExplosionDef = entries[47].ToInt();
254
		this->iExplosionBody = entries[48].ToInt();
255
		this->iParticle = entries[49].ToInt();
256
		this->iVariation = entries[50].ToInt();
257
		this->iRotationAccel = entries[51].ToInt();
258
		if ( entries[52].IsNumber() )
259
			this->iClass = entries[52].ToInt();
260
		else
261
			this->iClass = CShipData::ConvertShipClass(entries[52]);
262
		this->iTurretCount = entries[53].ToInt();
263
 
264
		// now read in the turret data
265
		int pos = 54;
266
		for ( int i = 0; i < this->iTurretCount; i++ )
267
		{
268
			STurretEntry *t = new STurretEntry;
269
			t->iIndex = entries[pos].ToInt();
270
			t->iTurret = entries[pos + 1].ToInt();
271
			t->sModel = entries[pos + 2];
272
			t->iSceneNode = entries[pos + 3].ToInt();
273
			this->lTurrets.push_back(t);
274
			pos += 4;
275
		}
276
 
277
		if ( this->iTurretCount == 0 )
278
		{
279
			this->iTurretCount = 1;
280
			STurretEntry *t = this->lTurrets.push_back(new STurretEntry);
281
			t->iIndex = 0;
282
			t->iTurret = 1;
283
			t->iSceneNode = 0;
284
			t->sModel = "0";
285
		}
286
 
287
		// next pos should be gun count
288
		this->iGunsCount = entries[pos].ToInt();
289
		++pos;
290
		for ( int i = 0; i < this->iGunsCount; i++ )
291
		{
292
			SGunGroup *gun = new SGunGroup;
293
			gun->iGunIndex = entries[pos].ToInt();
294
			gun->iLaserCount = entries[pos + 1].ToInt();
295
			gun->iIndex = entries[pos + 2].ToInt();
296
			gun->iWeaponCount = entries[pos + 3].ToInt();
297
			pos += 4;
298
 
299
			for ( int j = 0; j < gun->iWeaponCount; j++ )
300
			{
301
				SWeaponGroup *weapon = new SWeaponGroup;
302
				weapon->iGunIndex = entries[pos].ToInt();
303
				weapon->iLaser = entries[pos + 1].ToInt();
304
				weapon->sModel1 = entries[pos + 2];
305
				weapon->iNode1 = entries[pos + 3].ToInt();
306
				weapon->sModel2 = entries[pos + 4];
307
				weapon->iNode2 = entries[pos + 5].ToInt();
308
 
309
				pos += 6;
310
				gun->lWeapons.push_back(weapon);
311
			}
312
 
313
			this->lGuns.push_back(gun);
314
		}
315
 
316
		if ( !this->iGunsCount )
317
		{
318
			this->iGunCount = 1;
319
			SGunGroup *gun = this->lGuns.push_back(new SGunGroup);
320
			gun->iGunIndex = 0;
321
			gun->iIndex = 0;
322
			gun->iLaserCount = 0;
323
			gun->iWeaponCount = 0;
324
		}
325
 
326
		this->iVolumn = entries[pos].ToInt();
327
		this->iRelVal = entries[pos + 1].ToInt();
328
		this->iPriceMod1 = entries[pos + 2].ToInt();
329
		this->iPriceMod2 = entries[pos + 3].ToInt();
330
		this->iSize = entries[pos + 4].ToInt();
331
		this->iRelValPlayer = entries[pos + 5].ToInt();
332
		this->iMinNoto = entries[pos + 6].ToInt();
333
		this->iVideoID = entries[pos + 7].ToInt();
334
		this->iSkin = entries[pos + 8].ToInt();
335
		this->sID = entries[pos + 9];
336
 
337
		this->UpdateGunEntries();
338
 
339
		CLEANSPLIT(entries, max);
340
 
341
		return true;
342
	}
343
 
344
	CLEANSPLIT(entries, max);
345
 
346
	return false;
347
}
348
 
349
int CShipData::GetShipClassFromNum(int shipclass)
350
{
351
	int classes[OBJ_SHIP_MAX];
352
	classes[0] = OBJ_SHIP_TL;
353
	classes[1] = OBJ_SHIP_TS;
354
	classes[2] = OBJ_SHIP_TP;
355
	classes[3] = OBJ_SHIP_TM;
356
	classes[4] = OBJ_SHIP_TL_PIRATE;
357
	classes[5] = OBJ_SHIP_TS_PIRATE;
358
	classes[6] = OBJ_SHIP_GONER;
359
	classes[7] = OBJ_SHIP_M0;
360
	classes[8] = OBJ_SHIP_M1;
361
	classes[9] = OBJ_SHIP_M2;
362
	classes[10] = OBJ_SHIP_M3;
363
	classes[11] = OBJ_SHIP_M4;
364
	classes[12] = OBJ_SHIP_M5;
365
	classes[13] = OBJ_SHIP_M6;
366
	classes[14] = OBJ_SHIP_M7;
367
	classes[15] = OBJ_SHIP_M8;
368
 
369
	return classes[shipclass];
370
}
371
 
372
int CShipData::ConvertShipClassToNum(int shipclass)
373
{
374
	int classes[OBJ_SHIP_MAX];
375
	classes[0] = OBJ_SHIP_TL;
376
	classes[1] = OBJ_SHIP_TS;
377
	classes[2] = OBJ_SHIP_TP;
378
	classes[3] = OBJ_SHIP_TM;
379
	classes[4] = OBJ_SHIP_TL_PIRATE;
380
	classes[5] = OBJ_SHIP_TS_PIRATE;
381
	classes[6] = OBJ_SHIP_GONER;
382
	classes[7] = OBJ_SHIP_M0;
383
	classes[8] = OBJ_SHIP_M1;
384
	classes[9] = OBJ_SHIP_M2;
385
	classes[10] = OBJ_SHIP_M3;
386
	classes[11] = OBJ_SHIP_M4;
387
	classes[12] = OBJ_SHIP_M5;
388
	classes[13] = OBJ_SHIP_M6;
389
	classes[14] = OBJ_SHIP_M7;
390
	classes[15] = OBJ_SHIP_M8;
391
 
392
	for ( int i = 0; i < OBJ_SHIP_MAX; i++ )
393
	{
394
		if ( classes[i] == shipclass )
395
			return i;
396
	}
397
 
398
	return 0;
399
}
400
 
401
int CShipData::ConvertShipClass(CyString shipclass)
402
{
403
	for ( int i = 0; i < OBJ_SHIP_MAX; i++ )
404
	{
405
		int c = CShipData::GetShipClassFromNum(i);
406
		if ( CShipData::ConvertShipClass(c).Compare(shipclass) )
407
			return c;
408
	}
409
 
410
	return OBJ_SHIP_TL;
411
}
412
 
413
CyString CShipData::ConvertShipClass(int shipclass)
414
{
415
	switch ( shipclass )
416
	{
417
		case OBJ_SHIP_TL:
418
			return "OBJ_SHIP_TL";
419
		case OBJ_SHIP_TS:
420
			return "OBJ_SHIP_TS";
421
		case OBJ_SHIP_TP:
422
			return "OBJ_SHIP_TP";
423
		case OBJ_SHIP_TM:
424
			return "OBJ_SHIP_TS";
425
		case OBJ_SHIP_TL_PIRATE:
426
			return "OBJ_SHIP_TL_PIRATE";
427
		case OBJ_SHIP_TS_PIRATE:
428
			return "OBJ_SHIP_TS_PIRATE";
429
		case OBJ_SHIP_GONER:
430
			return "OBJ_SHIP_GONER";
431
		case OBJ_SHIP_M0:
432
			return "OBJ_SHIP_M0";
433
		case OBJ_SHIP_M1:
434
			return "OBJ_SHIP_M1";
435
		case OBJ_SHIP_M2:
436
			return "OBJ_SHIP_M2";
437
		case OBJ_SHIP_M3:
438
			return "OBJ_SHIP_M3";
439
		case OBJ_SHIP_M4:
440
			return "OBJ_SHIP_M4";
441
		case OBJ_SHIP_M5:
442
			return "OBJ_SHIP_M5";
443
		case OBJ_SHIP_M6:
444
			return "OBJ_SHIP_M6";
445
		case OBJ_SHIP_M7:
446
			return "OBJ_SHIP_M7";
447
		case OBJ_SHIP_M8:
448
			return "OBJ_SHIP_M8";
449
	}
450
 
451
	return "OBJ_SHIP_TL";
452
}
453
 
454
CyString CShipData::ConvertShipSubType(int subtype)
455
{
456
	switch ( subtype )
457
	{
458
		case SG_SH_TL:
459
			return "SG_SH_TL";
460
		case SG_SH_TS:
461
			return "SG_SH_TS";
462
		case SG_SH_M0:
463
			return "SG_SH_M0";
464
		case SG_SH_M1:
465
			return "SG_SH_M1";
466
		case SG_SH_M2:
467
			return "SG_SH_M2";
468
		case SG_SH_M3:
469
			return "SG_SH_M3";
470
		case SG_SH_M4:
471
			return "SG_SH_M4";
472
		case SG_SH_M5:
473
			return "SG_SH_M5";
474
		case SG_SH_TL_P:
475
			return "SG_SH_TL_P";
476
		case SG_SH_TS_P:
477
			return "SG_SH_TS_P";
478
		case SG_SH_GO:
479
			return "SG_SH_GO";
480
		case SG_SH_M6:
481
			return "SG_SH_M6";
482
		case SG_SH_TP:
483
			return "SG_SH_TP";
484
		case SG_SH_M7:
485
			return "SG_SH_M7";
486
		case SG_SH_TM:
487
			return "SG_SH_TM";
488
		case SG_SH_M8:
489
			return "SG_SH_M8";
490
	}
491
 
492
	return "SG_SH_TL";
493
}
494
 
495
int CShipData::ConvertShipSubType(CyString subtype)
496
{
497
	int num = 0;
498
	for ( int i = 0; i < SG_SH_MAX; i++ )
499
	{
500
		if ( subtype.Compare(CShipData::ConvertShipSubType(i)) )
501
			return i;
502
	}
503
 
504
	return 0;
505
}
506
 
507
void CShipData::RemoveTurret(int t)
508
{
509
	if ( t >= 1 && t <= 6 )
510
	{
511
		if ( t >= this->lTurrets.size() )
512
			return;
513
 
514
		// remove the turret entry
515
		this->lTurrets.erase(t, true);
516
		int index = 0;
517
		for ( CListNode<STurretEntry> *node = this->lTurrets.Front(); node; node = node->next() )
518
		{
519
			node->Data()->iTurret = index;
520
			++index;
521
			node->Data()->iIndex = index;
522
		}
523
		--this->iTurretCount;
524
 
525
		// shuffle the other entries
526
		for ( int i = (t - 1); i < 5; i++ )
527
		{
528
			this->cockpits[i].iCockpit = this->cockpits[i + 1].iCockpit;
529
			this->cockpits[i].iPos  = this->cockpits[i + 1].iPos;
530
			this->cockpits[i].sCockpit = this->cockpits[i + 1].sCockpit;
531
		}
532
 
533
		// zero out the remaining
534
		this->cockpits[5].iCockpit = 0;
535
		this->cockpits[5].iPos = 0;
536
		this->cockpits[5].sCockpit = "";
537
 
538
		// now remove the gun entries connected to the turret
539
		SGunGroup *g = this->lGuns.Get(t);
540
		if ( g )
541
		{
542
			g->lWeapons.MemoryClear();
543
			this->lGuns.remove(g, true);
544
			--this->iGunsCount;
545
		}
546
 
547
		// now we need to readjust the gun entrys
548
		this->UpdateGunEntries();
549
	}
550
}
551
 
552
void CShipData::UpdateGunEntries()
553
{
554
	int index = 1;
555
	int count = 1;
556
	int gunindex = 1;
557
	this->iGunCount = 0;
558
	for ( CListNode<SGunGroup> *node = this->lGuns.Front(); node; node = node->next() )
559
	{
560
		SGunGroup *g = node->Data();
561
 
562
		g->iLaserCount = 0;
563
		for ( CListNode<SWeaponGroup> *wNode = g->lWeapons.Front(); wNode; wNode = wNode->next() )
564
		{
565
			SWeaponGroup *w = wNode->Data();
566
 
567
			if ( (w->iNode1 > 0 || (w->iNode1 == 0 && w->sModel1 != "0")) && !w->sModel1.Empty() )
568
			{
569
				w->iLaser = 1;
570
				if ( (w->iNode2 > 0 || (w->iNode2 == 0 && w->sModel2 != "0")) && !w->sModel2.Empty() )
571
					w->iLaser = 2;
572
			}
573
			else
574
			{
575
				w->iLaser = 0;
576
				w->iNode2 = -1;
577
				w->sModel2 = "";
578
			}
579
 
580
			w->iGunIndex = gunindex;
581
			gunindex += w->iLaser;
582
			g->iLaserCount += w->iLaser;
583
		}
584
 
585
		g->iWeaponCount = g->lWeapons.size();
586
 
587
		g->iGunIndex = index;
588
		index += g->iLaserCount;
589
		this->iGunCount += g->iLaserCount;
590
		g->iIndex = count;
591
		++count;
592
	}
593
 
594
	this->iTurretCount = this->lTurrets.size();
595
	this->iGunsCount = this->lGuns.size();
596
}
597
 
598
void CShipData::ClearTurrets()
599
{
600
	for ( int i = 0; i < 6; i++ )
601
	{
602
		this->cockpits[i].iCockpit = 0;
603
		this->cockpits[i].iPos = 0;
604
		this->cockpits[i].sCockpit = "";
605
	}
606
 
607
	while ( this->lTurrets.size() > 1 )
608
		this->lTurrets.erase(1, true);
609
	while ( this->lGuns.size() > 1 )
610
		this->lGuns.erase(1, true);
611
	this->iTurretCount = 1;
612
	this->iGunsCount = 1;
613
}
614
 
615
void CShipData::AddNewTurret(int dir)
616
{
617
	if ( this->iTurretCount >= 7 )
618
		return;
619
 
620
	STurretEntry *t = new STurretEntry;
621
	SGunGroup *g = new SGunGroup;
622
 
623
	t->iSceneNode = 0;
624
	t->iIndex = this->iTurretCount + 1;
625
	t->iTurret = this->iTurretCount;
626
 
627
	this->cockpits[(this->iTurretCount - 1)].iCockpit = 0;
628
	this->cockpits[(this->iTurretCount - 1)].iPos = dir;
629
 
630
	g->iWeaponCount = 1;
631
	g->iLaserCount = 0;
632
	SWeaponGroup *w = new SWeaponGroup;
633
	w->iLaser = 0;
634
	w->iNode1 = 0;
635
	w->iNode2 = -1;
636
	w->sModel1 = "0";
637
	g->lWeapons.push_back(w);
638
 
639
	this->lTurrets.push_back(t);
640
	this->lGuns.push_back(g);
641
 
642
	++this->iTurretCount;
643
	++this->iGunsCount;
644
 
645
	this->UpdateGunEntries();
646
}
647
 
648
CyString CShipData::ConvertMissileGroup(int type)
649
{
650
	switch ( type )
651
	{
652
		case SG_MISSILE_LIGHT:
653
			return "SG_MISSILE_LIGHT";
654
		case SG_MISSILE_MEDIUM:
655
			return "SG_MISSILE_MEDIUM";
656
		case SG_MISSILE_HEAVY:
657
			return "SG_MISSILE_HEAVY";
658
		case SG_MISSILE_TR_LIGHT:
659
			return "SG_MISSILE_TR_LIGHT";
660
		case SG_MISSILE_TR_MEDIUM:
661
			return "SG_MISSILE_TR_MEDIUM";
662
		case SG_MISSILE_TR_HEAVY:
663
			return "SG_MISSILE_TR_HEAVY";
664
		case SG_MISSILE_KHAAK:
665
			return "SG_MISSILE_KHAAK";
666
		case SG_MISSILE_BOMBER:
667
			return "SG_MISSILE_BOMBOER";
668
		case SG_MISSILE_TORP_CAPTIAL:
669
			return "SG_MISSILE_TORP_CAPTIAL";
670
		case SG_MISSILE_AF_CAPTIAL:
671
			return "SG_MISSILE_AF_CAPTIAL";
672
		case SG_MISSILE_TR_BOMBER:
673
			return "SG_MISSILE_TR_BOMBER";
674
		case SG_MISSILE_TR_TORP_CAPTIAL:
675
			return "SG_MISSILE_TR_TORP_CAPTIAL";
676
		case SG_MISSILE_TR_AF_CAPTIAL:
677
			return "SG_MISSILE_TR_AF_CAPTIAL";
678
		case SG_MISSILE_BOARDINGPOD:
679
			return "SG_MISSILE_BOARDINGPOD";
680
		case SG_MISSILE_DMBF:
681
			return "SG_MISSILE_DMBF";
682
	}
683
 
684
	return "";
685
}
686
 
687
int CShipData::ConvertMissileGroupToID(int type)
688
{
689
	int arr[] = {SG_MISSILE_LIGHT, SG_MISSILE_MEDIUM, SG_MISSILE_HEAVY, SG_MISSILE_TR_LIGHT, SG_MISSILE_TR_MEDIUM, SG_MISSILE_TR_HEAVY, SG_MISSILE_KHAAK, SG_MISSILE_BOMBER, SG_MISSILE_TORP_CAPTIAL, 
690
		SG_MISSILE_AF_CAPTIAL, SG_MISSILE_TR_BOMBER, SG_MISSILE_TR_TORP_CAPTIAL, SG_MISSILE_AF_CAPTIAL, SG_MISSILE_BOARDINGPOD, SG_MISSILE_DMBF};
691
	for ( int i = 0; i < SG_MISSILE_MAX; i++ )
692
	{
693
		if ( arr[i] == type )
694
			return i;
695
	}
696
 
697
	return 0; 
698
}
699
 
700
int CShipData::ConvertMissileGroupToID(CyString type)
701
{
702
	return CShipData::ConvertMissileGroupToID(CShipData::ConvertMissileGroup(type));
703
}
704
 
705
int CShipData::ConvertMissileGroup(CyString type)
706
{
707
	if ( type.Compare("SG_MISSILE_LIGHT") )
708
		return SG_MISSILE_LIGHT;
709
	if ( type.Compare("SG_MISSILE_MEDIUM") )
710
		return SG_MISSILE_MEDIUM;
711
	if ( type.Compare("SG_MISSILE_HEAVY") )
712
		return SG_MISSILE_HEAVY;
713
	if ( type.Compare("SG_MISSILE_TR_LIGHT") )
714
		return SG_MISSILE_TR_LIGHT;
715
	if ( type.Compare("SG_MISSILE_TR_MEDIUM") )
716
		return SG_MISSILE_TR_MEDIUM;
717
	if ( type.Compare("SG_MISSILE_TR_HEAVY") )
718
		return SG_MISSILE_TR_HEAVY;
719
	if ( type.Compare("SG_MISSILE_KHAAK") )
720
		return SG_MISSILE_KHAAK;
721
	if ( type.Compare("SG_MISSILE_BOMBER") )
722
		return SG_MISSILE_BOMBER;
723
	if ( type.Compare("SG_MISSILE_TORP_CAPTIAL") )
724
		return SG_MISSILE_TORP_CAPTIAL;
725
	if ( type.Compare("SG_MISSILE_AF_CAPTIAL") )
726
		return SG_MISSILE_AF_CAPTIAL;
727
	if ( type.Compare("SG_MISSILE_TR_BOMBER") )
728
		return SG_MISSILE_TR_BOMBER;
729
	if ( type.Compare("SG_MISSILE_TR_TORP_CAPTIAL") )
730
		return SG_MISSILE_TR_TORP_CAPTIAL;
731
	if ( type.Compare("SG_MISSILE_TR_AF_CAPTIAL") )
732
		return SG_MISSILE_TR_AF_CAPTIAL;
733
	if ( type.Compare("SG_MISSILE_BOARDINGPOD") )
734
		return SG_MISSILE_BOARDINGPOD;
735
	if ( type.Compare("SG_MISSILE_DMBF") )
736
		return SG_MISSILE_DMBF;
737
 
738
	return 0;
739
}