Subversion Repositories spk

Rev

Rev 1 | Rev 31 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1 Rev 14
Line 166... Line 166...
166
		return false;
166
		return false;
167
 
167
 
168
	return true;
168
	return true;
169
}
169
}
170
 
170
 
171
CyString CXspFile::CreateValuesLine()
171
Utils::String CXspFile::CreateValuesLine() const
172
{
172
{
173
	CyString values = CBaseFile::CreateValuesLine ();
173
	Utils::String values = CBaseFile::CreateValuesLine ();
174
 
174
 
175
	values += CyString("Data: ") + m_sData + "\n";
175
	values += "Data: " + m_sData + "\n";
176
	values += CyString("ID: ") + m_sID + "\n";
176
	values += "ID: " + m_sID + "\n";
177
 
177
 
178
	if ( m_bLanguageText )
178
	if ( m_bLanguageText )
179
		values += "LanguageText\n";
179
		values += "LanguageText\n";
180
	if ( m_bExistingShip )
180
	if ( m_bExistingShip )
181
		values += "ExistingShip\n";
181
		values += "ExistingShip\n";
182
	values += CyString("OrgDesc: ") + (long)m_iOrgDesc + "\n";
182
	values += Utils::String("OrgDesc: ") + (long)m_iOrgDesc + "\n";
183
	values += CyString("Shipyard: ") + (long)m_iShipyard + "\n";
183
	values += Utils::String("Shipyard: ") + (long)m_iShipyard + "\n";
184
 
184
 
185
	for ( SCockpit *cockpit = m_lCockpit.First(); cockpit; cockpit = m_lCockpit.Next() )
185
	for ( CListNode<SCockpit> *node = m_lCockpit.Front(); node; node = node->next() ) {
186
	{
-
 
-
 
186
		SCockpit *cockpit = node->Data();
187
		values += CyString("CockpitNew: ") + (long)cockpit->lWeaponMask.size();
187
		values += Utils::String("CockpitNew: ") + (long)cockpit->lWeaponMask.size();
188
		for ( SWeaponMask *wm = cockpit-&gt;lWeaponMask.First(); wm; wm = cockpit->lWeaponMask.Next() )
188
		for ( CListNode<SWeaponMask> *wNode = cockpit-&gt;lWeaponMask.Front(); wNode; wNode = wNode->next() ) {
189
		{
189
			values += ":";
-
 
190
			values += (long)wNode->Data()->iGame;
190
			values += ":";
191
			values += ":";
191
			values += (long)wm->iGame;
-
 
192
			values += ":";
-
 
193
			values += (long)wm->iMask;
192
			values += (long)wNode->Data()->iMask;
194
		}
193
		}
195
		values += " ";
194
		values += " ";
196
		values += cockpit->sCockpit + "\n";
195
		values += cockpit->sCockpit.ToString() + "\n";
197
	}
196
	}
198
 
197
 
199
	for ( SText *text = m_lText.First(); text; text = m_lText.Next() )
198
	for ( CListNode<SText> *tNode = m_lText.Front(); tNode; tNode = tNode->next() )
200
		values += CyString("Text: ") + (long)text->iId + "|" + text->sName.FindReplace("|", "<::PiPe::>") + "|" + text->sDesc + "\n";
199
		values += Utils::String("Text: ") + (long)tNode->Data()->iId + "|" + tNode->Data()->sName.FindReplace("|", "<::PiPe::>").ToString() + "|" + tNode->Data()->sDesc.ToString() + "\n";
201
 
200
 
202
	for ( SComponent *comp = m_lComponent.First(); comp; comp = m_lComponent.Next() )
201
	for ( CListNode<SComponent> *cNode = m_lComponent.Front(); cNode; cNode = cNode->next() )
203
		values += CyString("Component: ") + comp->sData.FindReplace("|", "<::PiPe::>") + "|" + comp->sSection.FindReplace("|", "<::PiPe::&gt;") + "|&quot; + comp->sSection2 + "\n";
202
		values += Utils::String("Component: ") + cNode->Data()->sData.FindReplace("|", "<::PiPe::>").ToString() + "|" + cNode->Data()->sSection.FindReplace("|", "<::PiPe::&gt;").ToString() + "|&quot; + cNode->Data()->sSection2.ToString() + "\n";
204
 
203
 
205
	for ( SDummy *dummy = m_lDummy.First(); dummy; dummy = m_lDummy.Next() )
204
	for ( CListNode<SDummy> *dNode = m_lDummy.Front(); dNode; dNode = dNode->next() )
206
		values += CyString(";Dummy: ") + dummy->;sData.FindReplace("|", "<::PiPe::&gt;") + &quot;|"; + dummy->sSection + "\n";
205
		values += Utils::String(";Dummy: ") + dNode->Data()->;sData.FindReplace("|", "<::PiPe::&gt;").ToString() + "|" + dNode-&gt;Data()->sSection.ToString() + "\n";
207
 
206
 
208
	for ( SWeaponMask *mask = m_lWeaponMasks.First(); mask; mask = m_lWeaponMasks.Next() )
207
	for ( CListNode<SWeaponMask> *wNode = m_lWeaponMasks.Front(); wNode; wNode = wNode->next() )
209
		values += CyString("WeaponMask: ") + (long)mask->iGame + " " + (long)mask->iMask + "\n";
208
		values += Utils::String("WeaponMask: ") + (long)wNode->Data()->iGame + " " + (long)wNode->Data()->iMask + "\n";
210
	for ( SWeaponMask *mask = m_lMissileMasks.First(); mask; mask = m_lMissileMasks.Next() )
209
	for ( CListNode<SWeaponMask> *mNode = m_lMissileMasks.Front(); mNode; mNode = mNode->next() )
211
		values += CyString("MissileMask: ") + (long)mask->iGame + " " + (long)mask->iMask + "\n";
210
		values += Utils::String("MissileMask: ") + (long)mNode->Data()->iGame + " " + (long)mNode->Data()->iMask + "\n";
212
	for ( SStringList *cut = m_lCutData.Head(); cut; cut = cut->next )
211
	for ( SStringList *cut = m_lCutData.Head(); cut; cut = cut->next )
213
		values += CyString(";CutData: &quot;) + cut->str + "\n";
212
		values += Utils::String(";CutData: &quot;) + cut->str.ToString() + "\n";
214
	for ( SStringList *body = m_lBodies.Head(); body; body = body->next )
213
	for ( SStringList *body = m_lBodies.Head(); body; body = body->next )
215
		values += CyString(";Bodies: &quot;) + body->str + "\n";
214
		values += Utils::String(";Bodies: &quot;) + body->str.ToString() + "\n";
216
	for ( SStringList *ani = m_lAnimations.Head(); ani; ani = ani->next )
215
	for ( SStringList *ani = m_lAnimations.Head(); ani; ani = ani->next )
217
		values += CyString(";Animations: &quot;) + ani->str + "\n";
216
		values += Utils::String(";Animations: &quot;) + ani->str.ToString() + "\n";
218
 
217
 
219
	return values;
218
	return values;
220
}
219
}
221
 
220
 
222
bool CXspFile::ParseValueLine ( CyString line )
221
bool CXspFile::ParseValueLine(const Utils::String &sLine)
223
{
222
{
224
	CyString first = line.GetToken ( ":", 1, 1 );
223
	Utils::String first = sLine.token(":", 1);
225
	CyString rest  = line.GetToken ( &quot;:", 2 );
224
	Utils::String rest  = sLine.tokens(&quot;:", 2).removeFirstSpace();
226
	rest = rest.RemoveFirstSpace();
-
 
227
 
225
 
228
	if ( first == "Data" )
226
	if ( first.Compare("Data") )
229
		m_sData = rest;
227
		m_sData = rest;
230
	else if ( first == "ID" )
228
	else if ( first.Compare("ID") )
231
		m_sID = rest;
229
		m_sID = rest;
232
	else if ( line == "LanguageText" )
230
	else if ( sLine.Compare("LanguageText") )
233
		m_bLanguageText = true;
231
		m_bLanguageText = true;
234
	else if ( line == "ExistingShip" )
232
	else if ( sLine.Compare("ExistingShip") )
235
		m_bExistingShip = true;
233
		m_bExistingShip = true;
236
	else if ( first == "OrgDesc" || first == "OriginalDesc" )
234
	else if ( first.Compare("OrgDesc") || first.Compare("OriginalDesc") )
237
		m_iOrgDesc = rest.ToInt();
235
		m_iOrgDesc = rest;
238
	else if ( first == "Shipyard" )
236
	else if ( first.Compare("Shipyard") )
239
		m_iShipyard = rest.ToInt();
237
		m_iShipyard = rest;
240
	else if ( first == "CutData" )
238
	else if ( first.Compare("CutData") )
241
		this->AddCutData(rest);
239
		this->AddCutData(rest);
242
	else if ( first == "Bodies" )
240
	else if ( first.Compare("Bodies") )
243
		this->AddBodies(rest);
241
		this->AddBodies(rest);
244
	else if ( first == "Animations" )
242
	else if ( first.Compare("Animations") )
245
		this->AddAnimation(rest);
243
		this->AddAnimation(rest);
246
	else if ( first == "Cockpit" )
244
	else if ( first.Compare("Cockpit") )
247
		this->AddCockpit(rest, 0);
245
		this->AddCockpit(rest, 0);
248
	else if ( first == "CockpitNew" )
246
	else if ( first.Compare("CockpitNew") )
249
	{
247
	{
250
		CyString cockpit = rest.GetToken(" ", 2);
248
		Utils::String cockpit = rest.tokens(" ", 2);
251
		CyString sMasks = rest.GetToken(" ", 1, 1);
249
		Utils::String sMasks = rest.token(" ", 1);
252
		this->AddCockpit(cockpit, 0, -1);
250
		this->AddCockpit(cockpit, 0, -1);
253
		int num = sMasks.GetToken(":", 1, 1).ToInt();
251
		int num = sMasks.token(":", 1);
254
		for ( int i = 0; i < num; i++ )
252
		for ( int i = 0; i < num; i++ )
255
		{
253
		{
256
			int mask = sMasks.GetToken(":", ((i + 1) * 2) + 1, ((i + 1) * 2) + 1).ToInt();
254
			int mask = sMasks.token(":", ((i + 1) * 2) + 1);
257
			int game = sMasks.GetToken(":", ((i + 1) * 2), ((i + 1) * 2)).ToInt();
255
			int game = sMasks.token(":", ((i + 1) * 2));
258
			this->AddCockpit(cockpit, game, mask);
256
			this->AddCockpit(cockpit, game, mask);
259
		}
257
		}
260
	}
258
	}
261
	else if ( first == "Web" )
259
	else if ( first == "Web" )
262
		m_sWebSite = rest;
260
		m_sWebSite = rest;
263
	else if ( first.Compare("WeaponMask") )
261
	else if ( first.Compare("WeaponMask") )
264
		this->AddWeaponMask(rest.GetToken(" ", 1, 1).ToInt(), rest.GetToken(" ", 2, 2).ToInt());
262
		this->AddWeaponMask(rest.token(" ", 1), rest.token(" ", 2));
265
	else if ( first.Compare("MissileMask") )
263
	else if ( first.Compare("MissileMask") )
266
		this->AddMissileMask(rest.GetToken(" ", 1, 1).ToInt(), rest.GetToken(" ", 2, 2).ToInt());
264
		this->AddMissileMask(rest.token(" ", 1), rest.token(" ", 2));
267
	else if ( first == "Text" )
265
	else if ( first == "Text" )
268
	{
266
	{
269
		SText *text = new SText;
267
		SText *text = new SText;
270
		text->iId = rest.GetToken ( ";|", 1, 1 ).ToInt();
268
		text->iId = rest.token(";|", 1);
271
		text->sName = rest.GetToken ( ";|", 2, 2 );
269
		text->sName = rest.token(";|", 2);
272
		text->sName = text->sName.FindReplace ("<::PiPe::>", "|");
270
		text->sName = text->sName.FindReplace("<::PiPe::>", "|");
273
		text->sDesc = rest.GetToken ( "|", 3 );
271
		text->sDesc = rest.tokens( "|", 3);
274
		m_lText.push_back ( text );
272
		m_lText.push_back ( text );
275
	}
273
	}
276
	else if ( first == "Component" )
274
	else if ( first == "Component" )
277
	{
275
	{
278
		SComponent *c = new SComponent;
276
		SComponent *c = new SComponent;
279
		c->sData = rest.GetToken ( ";|", 1, 1 );
277
		c->sData = rest.token(";|", 1);
280
		c->sData = c->sData.FindReplace ("<::PiPe::>", "|");
278
		c->sData = c->sData.FindReplace ("<::PiPe::>", "|");
281
		c->sSection = rest.GetToken ( ";|", 2, 2 );
279
		c->sSection = rest.token(";|", 2);
282
		c->sSection = c->sSection.FindReplace ("<::PiPe::>", "|");
280
		c->sSection = c->sSection.FindReplace ("<::PiPe::>", "|");
283
		c->sSection2 = rest.GetToken ( ";|", 3 );
281
		c->sSection2 = rest.tokens(";|", 3);
284
		m_lComponent.push_back ( c );
282
		m_lComponent.push_back ( c );
285
	}
283
	}
286
	else if ( first == "Dummy" )
284
	else if ( first == "Dummy" )
287
	{
285
	{
288
		SDummy *d = new SDummy;
286
		SDummy *d = new SDummy;
289
		d->sData = rest.GetToken ( ";|", 1, 1 );
287
		d->sData = rest.token(";|", 1);
290
		d->sData = d->sData.FindReplace ("<::PiPe::>", "|");
288
		d->sData = d->sData.FindReplace ("<::PiPe::>", "|");
291
		d->sSection = rest.GetToken ( "|", 2 );
289
		d->sSection = rest.tokens( "|", 2);
292
		m_lDummy.push_back ( d );
290
		m_lDummy.push_back ( d );
293
	}
291
	}
294
	else if ( first == "Comment" )
292
	else if ( first == "Comment" )
295
		m_sDescription = rest.FindReplace("<newline>", "<br>");
293
		m_sDescription = rest.findReplace("<newline>", "<br>");
296
	else
294
	else
297
		return CBaseFile::ParseValueLine ( line );
295
		return CBaseFile::ParseValueLine(sLine);
298
 
296
 
299
	return true;
297
	return true;
300
}
298
}
301
 
299
 
302
CyString CXspFile::GetShipName(int lang)
300
CyString CXspFile::GetShipName(int lang)
Line 307... Line 305...
307
		for ( SText *text = m_lText.First(); text; text = m_lText.Next() )
305
		for ( SText *text = m_lText.First(); text; text = m_lText.Next() )
308
		{
306
		{
309
			if ( text->iId == lang )
307
			if ( text->iId == lang )
310
			{
308
			{
311
				name = text->sName;
309
				name = text->sName;
312
				break;
310
				break;
313
			}
311
			}
314
		}
312
		}
315
	}
313
	}
316
 
314
 
317
	if ( name.Empty() )
315
	if ( name.Empty() )
318
		name = GetLanguageName(lang);
316
		name = GetLanguageName(lang);
319
 
317
 
320
	return name;
318
	return name;
321
}
319
}
322
 
320
 
323
bool CXspFile::ConvertOld(CyString file)
321
bool CXspFile::ConvertOld(CyString file)
324
{
322
{
325
	// open the file
323
	// open the file
326
	FILE *id = fopen(file.c_str(), "rb");
324
	FILE *id = fopen(file.c_str(), "rb");
327
	if ( !id )
325
	if ( !id )
Line 353... Line 351...
353
	size_t start = 0;
351
	size_t start = 0;
354
	int packageVersion = 0;
352
	int packageVersion = 0;
355
	while ( pos < len )
353
	while ( pos < len )
356
	{
354
	{
357
		while ( compr[pos++] != '\n' && pos < len );
355
		while ( compr[pos++] != '\n' && pos < len );
358
 
356
 
359
		compr[pos - 1] = '\0';
357
		compr[pos - 1] = '\0';
360
		CyString line = (char *)(compr + start);
358
		CyString line = (char *)(compr + start);
361
		start = pos;
359
		start = pos;
362
		if ( line.Empty() )
360
		if ( line.Empty() )
363
			continue;
361
			continue;
Line 380... Line 378...
380
					if ( strs[i] == "1" )
378
					if ( strs[i] == "1" )
381
						this->AddShipyard(cur);
379
						this->AddShipyard(cur);
382
				}
380
				}
383
			}
381
			}
384
			CLEANSPLIT(strs, max)
382
			CLEANSPLIT(strs, max)
385
		}
383
		}
386
		else if ( first.Compare("ScreenShot") )
384
		else if ( first.Compare("ScreenShot") )
387
		{
385
		{
388
			int size = rest.GetToken(" ", 1, 1).ToInt();
386
			int size = rest.GetToken(" ", 1, 1).ToInt();
389
			CyString ext = rest.GetToken(" ", 2, 2);
387
			CyString ext = rest.GetToken(" ", 2, 2);
390
 
388
 
391
			C_File *newFile = this->AddFile(m_sID + "_" + CyString::Number(this->CountFiles(FILETYPE_SCREEN) + 1) + "." + ext, "", FILETYPE_SCREEN);
389
			C_File *newFile = this->AddFile(CyString(m_sID) + "_" + CyString::Number(this->CountFiles(FILETYPE_SCREEN) + 1) + "." + ext, "", FILETYPE_SCREEN);
392
			newFile->ReadFromData((char *)(compr + pos), size); 
390
			newFile->ReadFromData((char *)(compr + pos), size); 
393
 
391
 
394
			start += (size + 1);
392
			start += (size + 1);
395
		}
393
		}
396
		else if ( first.Compare("SceneFile") )
394
		else if ( first.Compare("SceneFile") )
Line 624... Line 622...
624
			SDummy *d = new SDummy;
622
			SDummy *d = new SDummy;
625
			d->sData = rest.GetToken ( ";", 2 );
623
			d->sData = rest.GetToken ( ";", 2 );
626
			d->sSection = rest.GetToken ( ";", 1, 1 );
624
			d->sSection = rest.GetToken ( ";", 1, 1 );
627
			m_lDummy.push_back ( d );
625
			m_lDummy.push_back ( d );
628
		}
626
		}
629
		else if ( !this->ParseValueLine(line) )
627
		else if ( !this->ParseValueLine(line.ToString()) )
630
		{
628
		{
631
		//	printf ( "Command: %s, Rest: %s\n", first.c_str(), rest.c_str());
629
		//	printf ( "Command: %s, Rest: %s\n", first.c_str(), rest.c_str());
632
		}
630
		}
633
 
631
 
634
		pos = start;
632
		pos = start;
635
	}
633
	}
636
 
634
 
637
	// assume all old ones are for X3
635
	// assume all old ones are for X3
638
	if ( !m_sData.Empty() )
636
	if ( !m_sData.empty() )
639
	{
637
	{
640
		this->AddWeaponMask(GAME_X3 - 1, m_sData.GetToken(";", 19, 19).ToInt());
638
		this->AddWeaponMask(GAME_X3 - 1, m_sData.token(";", 19));
641
		this->AddMissileMask(GAME_X3 - 1, m_sData.GetToken(";", 25, 25).ToInt());
639
		this->AddMissileMask(GAME_X3 - 1, m_sData.token(";", 25));
642
	}
640
	}
643
 
641
 
644
	return true;
642
	return true;
645
}
643
}
646
 
644
 
Line 673... Line 671...
673
 
671
 
674
	return "Unknown";
672
	return "Unknown";
675
}
673
}
676
 
674
 
677
bool CXspFile::WriteHeader(FILE *id, int valueheader, int valueComprLen)
675
bool CXspFile::WriteHeader(FILE *id, int valueheader, int valueComprLen)
678
{
676
{
679
	fprintf ( id, "XSPCycrow;%.2f;%d;%d\n", FILEVERSION, valueheader, valueComprLen );
677
	fprintf ( id, "XSPCycrow;%.2f;%d;%d\n", FILEVERSION, valueheader, valueComprLen );
680
	if ( ferror(id) )
678
	if ( ferror(id) )
681
		return false;
679
		return false;
682
	return true;
680
	return true;
683
}
681
}
684
 
682
 
685
bool CXspFile::CheckHeader ( CyString header )
683
bool CXspFile::CheckHeader(const Utils::String header) const
686
{
684
{
687
	if ( header.Compare("XSPCycrow") )
685
	if ( header.Compare("XSPCycrow") )
688
		return true;
686
		return true;
689
	return false;
687
	return false;
690
}
688
}
691
 
689
 
692
void CXspFile::SetLaserMask(int game, int mask)
690
void CXspFile::SetLaserMask(int game, int mask)
693
{
691
{
694
	for ( CListNode<SWeaponMask> *node = m_lWeaponMasks.Front(); node; node = node->next() )
692
	for ( CListNode<SWeaponMask> *node = m_lWeaponMasks.Front(); node; node = node->next() )
695
	{
693
	{
696
		SWeaponMask *m = node->Data();
694
		SWeaponMask *m = node->Data();
697
		if ( m->iGame == game )
695
		if ( m->iGame == game )
698
		{
696
		{
699
			m->iMask = mask;
697
			m->iMask = mask;
700
			return;
698
			return;
701
		}
699
		}
Line 722... Line 720...
722
}
720
}
723
int CXspFile::GetLaserMask(int game, bool getOnly)
721
int CXspFile::GetLaserMask(int game, bool getOnly)
724
{
722
{
725
	int mask = -1;
723
	int mask = -1;
726
	for ( CListNode<SWeaponMask> *node = m_lWeaponMasks.Front(); node; node = node->next() )
724
	for ( CListNode<SWeaponMask> *node = m_lWeaponMasks.Front(); node; node = node->next() )
727
	{
725
	{
728
		SWeaponMask *m = node->Data();
726
		SWeaponMask *m = node->Data();
729
		if ( m->iGame == game )
727
		if ( m->iGame == game )
730
			return m->iMask;
728
			return m->iMask;
731
 
729
 
732
		if ( !mask && !getOnly )
730
		if ( !mask && !getOnly )
733
			mask = m->iMask;
731
			mask = m->iMask;
734
	}
732
	}
735
 
733
 
736
	return mask;
734
	return mask;
737
}
735
}
Line 745... Line 743...
745
		if ( m->iGame == game )
743
		if ( m->iGame == game )
746
			return m->iMask;
744
			return m->iMask;
747
 
745
 
748
		if ( !mask && !getOnly )
746
		if ( !mask && !getOnly )
749
			mask = m->iMask;
747
			mask = m->iMask;
750
	}
748
	}
751
 
749
 
752
	return mask;
750
	return mask;
753
}
751
}
754
 
752
 
755
CyString CXspFile::GetShipClass()
753
CyString CXspFile::GetShipClass()
756
{
754
{
757
	if ( !m_sData.Empty() )
755
	if ( !m_sData.empty() )
758
		return m_sData.GetToken(";", TSHIPPOS_CLASS, TSHIPPOS_CLASS);
756
		return m_sData.token(";", TSHIPPOS_CLASS);
759
	return "OBJ_SHIP_M5";
757
	return "OBJ_SHIP_M5";
760
}
758
}
761
 
759
 
762
bool CXspFile::GeneratePackagerScript(bool wildcard, CyStringList *list, bool datafile)
760
bool CXspFile::GeneratePackagerScript(bool wildcard, CyStringList *list, bool datafile)
763
{
761
{
Line 765... Line 763...
765
		return false;
763
		return false;
766
 
764
 
767
	if ( m_iShipyard )
765
	if ( m_iShipyard )
768
	{
766
	{
769
		list->PushBack("# Shipyards, Set which shipyards to add ships for sale to");
767
		list->PushBack("# Shipyards, Set which shipyards to add ships for sale to");
770
		for ( int i = SHIPYARD_ARGON; i <= SHIPYARD_MAX; i *= 2 )
768
		for ( int i = SHIPYARD_ARGON; i <= SHIPYARD_MAX; i *= 2 )
771
		{
769
		{
772
			if ( this->IsShipyard(i) )
770
			if ( this->IsShipyard(i) )
773
				list->PushBack(CyString("Shipyard: ") + GetShipyardName(i));
771
				list->PushBack(CyString("Shipyard: ") + GetShipyardName(i));
774
		}
772
		}
775
		list->PushBack("");
773
		list->PushBack("");
776
	}
774
	}
Line 780... Line 778...
780
		list->PushBack("# Use Original Description, overrides text entrys to use one of the built in text");
778
		list->PushBack("# Use Original Description, overrides text entrys to use one of the built in text");
781
		list->PushBack(CyString("OriginalDescription: ") + (long)m_iOrgDesc);
779
		list->PushBack(CyString("OriginalDescription: ") + (long)m_iOrgDesc);
782
		list->PushBack("");
780
		list->PushBack("");
783
	}
781
	}
784
 
782
 
785
	if ( !m_sID.Empty() )
783
	if ( !m_sID.empty() )
786
	{
784
	{
787
		list->PushBack("# Ship ID, the ship id to identify the ship as");
785
		list->PushBack("# Ship ID, the ship id to identify the ship as");
788
		list->PushBack(CyString("ShipID: ") + m_sID);
786
		list->PushBack(CyString("ShipID: ") + m_sID);
789
	}
787
	}
790
 
788
 
791
	if ( !m_sData.Empty() )
789
	if ( !m_sData.empty() )
792
	{
790
	{
793
		list->PushBack("# Ship Data, the TShip data entry to add to the game (parts of this are adjusted and auto generated by the installer)");
791
		list->PushBack("# Ship Data, the TShip data entry to add to the game (parts of this are adjusted and auto generated by the installer)");
794
		list->PushBack(CyString("ShipData: ") + m_sData);
792
		list->PushBack(CyString("ShipData: ") + m_sData);
795
		list->PushBack("");
793
		list->PushBack("");
796
	}
794
	}
Line 804... Line 802...
804
 
802
 
805
	if ( !datafile )
803
	if ( !datafile )
806
	{
804
	{
807
		if ( !CBaseFile::GeneratePackagerScriptFile(wildcard, list) )
805
		if ( !CBaseFile::GeneratePackagerScriptFile(wildcard, list) )
808
			return false;
806
			return false;
809
	}
807
	}
810
 
808
 
811
	return true;
809
	return true;
812
}
810
}
813
 
811
 
814
bool CXspFile::LoadPackageData(CyString first, CyString rest)
812
bool CXspFile::LoadPackageData(const Utils::String &sFirst, const Utils::String &sRest)
815
{
813
{
816
	if ( first.Compare("Shipyard") )
814
	if ( sFirst.Compare("Shipyard") )
817
	{
815
	{
818
		for ( int i = SHIPYARD_ARGON; i <= SHIPYARD_MAX; i *= 2 )
816
		for ( int i = SHIPYARD_ARGON; i <= SHIPYARD_MAX; i *= 2 )
819
		{
817
		{
820
			if ( rest.Compare(GetShipyardName(i)) )
818
			if ( sRest.Compare(GetShipyardName(i).ToString()) )
821
			{
819
			{
822
				this->AddShipyard(i);
820
				this->AddShipyard(i);
823
				break;
821
				break;
824
			}
822
			}
825
		}
823
		}
826
	}
824
	}
827
	else if ( first.Compare("OriginalDescription") )
825
	else if ( sFirst.Compare("OriginalDescription") )
828
		m_iOrgDesc = rest.ToInt();
826
		m_iOrgDesc = sRest;
829
	else if ( first.Compare("ShipData") )
827
	else if ( sFirst.Compare("ShipData") )
830
		m_sData = rest;
828
		m_sData = sRest;
831
	else if ( first.Compare("ReadData") ) // read data from a tships file
829
	else if ( sFirst.Compare("ReadData") ) // read data from a tships file
832
	{
830
	{
833
		CPackages p;
831
		CPackages p;
834
		m_sData = p.ReadShipData(rest.GetToken(" ", 2), rest.GetToken(" ", 1, 1));
832
		m_sData = p.ReadShipData(sRest.tokens(" ", 2), sRest.token(" ", 1)).ToString();
835
	}
833
	}
836
	else if ( first.Compare("ExistingShip") )
834
	else if ( sFirst.Compare("ExistingShip") )
837
		m_bExistingShip = true;
835
		m_bExistingShip = true;
838
	else if ( first.Compare("ShipID") )
836
	else if ( sFirst.Compare("ShipID") )
839
		m_sID = rest;
837
		m_sID = sRest;
840
	else if ( !CBaseFile::LoadPackageData(first, rest) )
838
	else if ( !CBaseFile::LoadPackageData(sFirst, sRest) )
841
	{
839
	{
842
		return false;
840
		return false;
843
	}
841
	}
844
 
842
 
845
	return true;
843
	return true;
Line 1374... Line 1372...
1374
bool CXspFile::StartExtractShip(CCatFile *catFile, CyString id, CProgressInfo *progress)
1372
bool CXspFile::StartExtractShip(CCatFile *catFile, CyString id, CProgressInfo *progress)
1375
{
1373
{
1376
	id.RemoveChar('\r');
1374
	id.RemoveChar('\r');
1377
	while ( id.Right(1) == ";" )
1375
	while ( id.Right(1) == ";" )
1378
		id.Truncate((int)id.Length() - 1);
1376
		id.Truncate((int)id.Length() - 1);
1379
	m_sID = id;
1377
	m_sID = id.ToString();
1380
	m_sData = catFile->GetTShipsEntry(id);
1378
	m_sData = catFile->GetTShipsEntry(id).ToString();
1381
 
1379
 
1382
	// get scene files
1380
	// get scene files
1383
	if ( progress ) progress->UpdateStatus(IMPORTSHIP_SCENE);
1381
	if ( progress ) progress->UpdateStatus(IMPORTSHIP_SCENE);
1384
	if ( !this->ExtractSceneFiles(catFile) )
1382
	if ( !this->ExtractSceneFiles(catFile) )
1385
		return false;
1383
		return false;
Line 1441... Line 1439...
1441
	return NULL;
1439
	return NULL;
1442
}
1440
}
1443
 
1441
 
1444
bool CXspFile::ExtractSceneFiles(CCatFile *catFile)
1442
bool CXspFile::ExtractSceneFiles(CCatFile *catFile)
1445
{
1443
{
1446
	m_pSceneFile = this->ExtractFileToPackage(catFile, CyString("objects\\") + m_sData.GetToken(";", 17, 17) + &quot;.pbd";, FILETYPE_SHIPSCENE, CyString("objects\\") + m_sData.GetToken(";", 17, 17) + ".bod");
1444
	m_pSceneFile = this->ExtractFileToPackage(catFile, CyString("objects\\") + m_sData.token(";", 17) + &quot;.pbd";, FILETYPE_SHIPSCENE, CyString("objects\\") + m_sData.token(";", 17) + ".bod");
1447
	if ( !m_pSceneFile )
1445
	if ( !m_pSceneFile )
1448
	{
1446
	{
1449
		m_pSceneFile = this->ExtractFileToPackage(catFile, CyString("objects\\") + m_sData.GetToken(";", 17, 17) + ".bod", FILETYPE_SHIPSCENE);
1447
		m_pSceneFile = this->ExtractFileToPackage(catFile, CyString("objects\\") + m_sData.token(";", 17) + ".bod", FILETYPE_SHIPSCENE);
1450
		if ( !m_pSceneFile )
1448
		if ( !m_pSceneFile )
1451
			return false;
1449
			return false;
1452
	}
1450
	}
1453
 
1451
 
1454
	m_pCockpitFile = this->ExtractFileToPackage(catFile, CyString("objects\\") + m_sData.GetToken(";", 18, 18) + &quot;.pbd";, FILETYPE_COCKPITSCENE, CyString("objects\\") + m_sData.GetToken(";", 18, 18) + ".bod");
1452
	m_pCockpitFile = this->ExtractFileToPackage(catFile, CyString("objects\\") + m_sData.token(";", 18) + &quot;.pbd";, FILETYPE_COCKPITSCENE, CyString("objects\\") + m_sData.token(";", 18) + ".bod");
1455
	if ( !m_pCockpitFile )
1453
	if ( !m_pCockpitFile )
1456
		m_pCockpitFile = this->ExtractFileToPackage(catFile, CyString("objects\\") + m_sData.GetToken(";", 18, 18) + ".bod", FILETYPE_COCKPITSCENE);
1454
		m_pCockpitFile = this->ExtractFileToPackage(catFile, CyString("objects\\") + m_sData.token(";", 18) + ".bod", FILETYPE_COCKPITSCENE);
1457
	return true;
1455
	return true;
1458
}
1456
}
1459
 
1457
 
1460
bool CXspFile::ExtractSceneFiles(CyString catFile)
1458
bool CXspFile::ExtractSceneFiles(CyString catFile)
1461
{
1459
{
Line 1868... Line 1866...
1868
		lines->RemoveMarked();
1866
		lines->RemoveMarked();
1869
 
1867
 
1870
		// now get all the entries from TShips
1868
		// now get all the entries from TShips
1871
		for ( int i = 0; i < 6; i++ )
1869
		for ( int i = 0; i < 6; i++ )
1872
		{
1870
		{
1873
			int idx = m_sData.GetToken(";", 32 + (i * 2), 32 + (i * 2)).ToInt();
1871
			int idx = m_sData.token(";", 32 + (i * 2));
1874
			if ( idx < lines->Count() && idx )
1872
			if ( idx < lines->Count() && idx )
1875
			{
1873
			{
1876
				CyString turret = lines->GetAt(idx)->str;
1874
				CyString turret = lines->GetAt(idx)->str;
1877
				int pos = -1;
1875
				int pos = -1;
1878
				CyString id;
1876
				Utils::String id;
1879
				while ( id.Empty() && pos > -100 ) id = turret.GetToken(";", pos, pos--);
1877
				while ( id.empty() && pos > -100 ) id = turret.GetToken(";", pos, pos--).ToString();
1880
				m_sData = m_sData.RepToken(";", 32 + (i * 2), id + "(" + CyString::Number(idx) + ")");
1878
				m_sData = m_sData.replaceToken(";", 32 + (i * 2), id + "(" + (long)idx + ")");
1881
 
1879
 
1882
				this->AddCockpit(turret, 0);
1880
				this->AddCockpit(turret, 0);
1883
			}
1881
			}
1884
		}
1882
		}
1885
 
1883
 
Line 1916... Line 1914...
1916
	return false;
1914
	return false;
1917
}
1915
}
1918
 
1916
 
1919
bool CXspFile::AddTextFromFile(FILE *id, int textId)
1917
bool CXspFile::AddTextFromFile(FILE *id, int textId)
1920
{
1918
{
1921
	if ( textId == -1 && !m_sData.Empty() )
1919
	if ( textId == -1 && !m_sData.empty() )
1922
		textId = m_sData.GetToken(";", 7, 7).ToInt();
1920
		textId = m_sData.token(";", 7);
1923
 
1921
 
1924
	if ( textId <= 0 )
1922
	if ( textId <= 0 )
1925
		return false;
1923
		return false;
1926
 
1924
 
1927
	CyString line;
1925
	CyString line;
Line 2088... Line 2086...
2088
			this->ExtractTextures(catFile);
2086
			this->ExtractTextures(catFile);
2089
			break;
2087
			break;
2090
 
2088
 
2091
		case IMPORTSHIP_TEXTS:
2089
		case IMPORTSHIP_TEXTS:
2092
			// extract the text file entries
2090
			// extract the text file entries
2093
			this->ExtractTexts(catFile, m_sData.GetToken(";", 7, 7).ToInt());
2091
			this->ExtractTexts(catFile, m_sData.token(";", 7));
2094
			break;
2092
			break;
2095
 
2093
 
2096
		case IMPORTSHIP_BODIES:
2094
		case IMPORTSHIP_BODIES:
2097
			// extract the bodies entries
2095
			// extract the bodies entries
2098
			if ( !lModels ) return false;
2096
			if ( !lModels ) return false;
Line 2189... Line 2187...
2189
 
2187
 
2190
		CyString id = c->sCockpit.GetToken(";", 19, 19);
2188
		CyString id = c->sCockpit.GetToken(";", 19, 19);
2191
 
2189
 
2192
		for ( int i = 0; i < 6; i++ )
2190
		for ( int i = 0; i < 6; i++ )
2193
		{
2191
		{
2194
			CyString tId = m_sData.GetToken(";", 32 + (i * 2), 32 + (i * 2));
2192
			CyString tId = m_sData.token(";", 32 + (i * 2));
2195
			if ( tId.IsNumber() && tId.ToInt() == c->iIndex )
2193
			if ( tId.IsNumber() && tId.ToInt() == c->iIndex )
2196
				m_sData = m_sData.RepToken(";", 32 + (i * 2), id + "(" + CyString::Number(c->iIndex) + ")");
2194
				m_sData = m_sData.replaceToken(";", 32 + (i * 2), (id + "(" + CyString::Number(c->iIndex) + ")").c_str());
2197
		}
2195
		}
2198
	}
2196
	}
2199
}
2197
}
2200
 
2198
 
2201
CyString CXspFile::FormatShipData(CyStringList *cockpits, int *text, int game)
2199
CyString CXspFile::FormatShipData(CyStringList *cockpits, int *text, int game)