Subversion Repositories spk

Rev

Rev 242 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
// X3Data.cpp: implementation of the CX3Data class.
2
//
3
//////////////////////////////////////////////////////////////////////
4
 
5
#include "stdafx.h"
6
#include "X3Data.h"
7
 
8
//#include "Common\CUtils.h"
9
#include <math.h>
10
 
11
//////////////////////////////////////////////////////////////////////
12
// Construction/Destruction
13
//////////////////////////////////////////////////////////////////////
14
 
15
CX3Data::CX3Data(CyString &progDir)
16
{
17
	m_sProgDir = progDir;
18
	m_iLastUpdate = 0;
19
	m_bLocked = false;
20
 
21
	Reset();
22
}
23
 
24
CX3Data::~CX3Data()
25
{
26
 
27
}
28
 
29
void CX3Data::Reset ()
30
{
31
	m_sPilot = "No Pilot Found";
32
	m_sGametime = "0";
33
 
34
	m_iShips = m_iAccount = m_iStations = m_iInsurance = 0;
35
	m_iHull = m_iShields = m_iLaser = m_iMaxLaser = m_iLaserProgress = 0;
36
	m_iMissiles = m_iEnemies = m_iEnemies2 = 0;
37
 
38
	m_sAccount = "0";
39
	m_iVersion = 1;
40
 
41
	m_shipData.Reset();
42
	m_targetData.Reset();
43
 
44
	m_lCustomList.Clear();
45
 
46
	m_bLoaded = false;
47
 
48
	int i;
49
	for ( i = 0; i < MAXSHIPCLASS; i++ )
50
		m_iShipClass[i] = 0;
51
	for ( i = 0; i < MAXRACEREP; i++ )
52
		m_Rep[i].Reset();
53
}
54
 
55
bool CX3Data::ReadFile ( CyString logfile, CyString lognumber )
56
{
57
	if ( !logfile.Empty() )
58
		logfile += "/";
59
	logfile += "log";
60
	logfile += lognumber.PadNumber(5);
61
	logfile += ".txt";
62
 
63
	logfile = logfile.FindReplace("//", "/");
64
	logfile = logfile.FindReplace("/", "\\");
65
 
66
	FILE *id = fopen ( logfile.c_str(), "r" );
67
	if ( !id )
68
		return false;
69
 
70
	bool ret = false;
71
 
72
	m_lCustomList.Clear();
73
 
74
	bool noUpdate = false;
75
	bool resetCustom = false;
76
 
77
	CyStringList custom;
78
 
79
	while ( !feof(id) )
80
	{
81
		CyString line;
82
		line = line.GetEndOfLine ( id, NULL, false );
83
		CyString arg = line.GetToken ( ":", 1, 1 );
84
		CyString rest = line.GetToken ( ":", 2 );
85
		rest.RemoveFirstSpace();
86
		if ( arg.Compare("PILOT") )
87
		{
88
			m_bLoaded = true;
89
			m_sPilot = rest;
90
			m_iMissiles = 0;
91
			m_iEnemies = 0;
92
		}
93
		else if ( arg.Compare("Version") )
94
			m_iVersion = rest.ToInt();
95
		else if ( arg.Compare("SHIPS") )
96
			m_iShips = rest.ToInt();
97
		else if ( arg.Compare("STATIONS") )
98
			m_iStations = rest.ToInt();
99
		else if ( arg.Compare("ACCOUNT") )
100
		{
101
			m_sAccount = rest;
102
			m_iAccount = m_sAccount.Remove(",;'").ToInt();
103
		}
104
		else if ( arg.Compare("TIME") )
105
		{
106
			int time = rest.ToInt();
107
			if ( m_iLastUpdate != time )
108
			{
109
				ret = true;
110
				m_iLastUpdate = time;
111
				resetCustom = true;
112
			}
113
			else
114
				noUpdate = true;
115
			m_sGametime.ConvertTime(rest.ToLong(), true);
116
		}
117
		else if ( arg.Compare("ARGON") )
118
			SetRaceRep(REP_ARGON, arg, rest, true);
119
		else if ( arg.Compare("BORON") )
120
			SetRaceRep(REP_BORON, arg, rest, true);
121
		else if ( arg.Compare("SPLIT") )
122
			SetRaceRep(REP_SPLIT, arg, rest, true);
123
		else if ( arg.Compare("PARANID") )
124
			SetRaceRep(REP_PARANID, arg, rest, true);
125
		else if ( arg.Compare("TELADI") )
126
			SetRaceRep(REP_TELADI, arg, rest, true);
127
		else if ( arg.Compare("GONER") )
128
			SetRaceRep(REP_GONER, arg, rest, true);
129
		else if ( arg.Compare("TERRAN") )
130
			SetRaceRep(REP_TERRAN, arg, rest, true);
131
		else if ( arg.Compare("ATF") )
132
			SetRaceRep(REP_ATF, arg, rest, true);
133
		else if ( arg.Compare("RACEREP") ) // new race rep
134
			SetRaceRep(rest.GetToken(":", 1, 1).ToInt() + 2, rest.GetToken(":", 2, 2), rest.GetToken(":", 3));
135
		else if ( arg.Compare("COMBAT") )
136
			SetRaceRep(REP_FIGHT, "Combat", rest);
137
		else if ( arg.Compare("TRADE") )
138
			SetRaceRep(REP_TRADE, "Trade", rest);
139
		else if ( arg.Compare("SHIPCLASS") )
140
		{
141
			int max = 12;
142
			CyString *str = rest.SplitToken ( ':', &max );
143
			if ( max > 12 ) max = 12;
144
			for ( int i = 0; i < max; i++ )
145
				m_iShipClass[i] = str[i].ToInt();
146
		}
147
		else if ( arg.Compare("SHIPNAME") )
148
		{
149
			m_shipData.sName = rest.GetToken(":", 1, 1);
150
			m_shipData.sClass = rest.GetToken(":", 2, 2);
151
			m_shipData.sID = rest.GetToken(":", 3, 3);
152
			m_shipData.iSpeed = rest.GetToken(":", 4, 4).ToInt();
153
		}
154
		else if ( arg.Compare("SHIPENV") )
155
			m_shipData.sEnv = rest;
156
		else if ( arg.Compare("BARS") )
157
		{
158
			m_iHull = rest.GetToken ( 1, ':' ).ToInt();
159
			m_iShields = rest.GetToken ( 2, ':' ).ToInt();
160
			m_iLaser = rest.GetToken ( 3, ':' ).ToInt();
161
			m_iMaxLaser = rest.GetToken ( 4, ':' ).ToInt();
162
			m_iLaserProgress = (int)(((float)m_iLaser / (float)m_iMaxLaser) * 100.0f);
163
		}
164
		else if ( arg.Compare("TARGET") )
165
		{
166
			m_targetData.sName		= rest.GetToken( ":", 1, 1);
167
			m_targetData.iHull		= rest.GetToken( ":", 2, 2).ToInt();
168
			m_targetData.iShields	= rest.GetToken( ":", 3, 3).ToInt();
169
			m_targetData.iSpeed		= rest.GetToken( ":", 4, 4).ToInt();
170
			m_targetData.sClass		= rest.GetToken( ":", 5, 5);
171
			m_targetData.sID		= rest.GetToken( ":", 6, 6);
172
			m_targetData.iDist		= rest.GetToken( ":", 7, 7).ToInt();
173
			m_targetData.sRelation	= rest.GetToken( ":", 8, 8);
174
		}
175
		else if ( arg.Compare("MISSILES") )
176
			m_iMissiles = rest.ToInt();
177
		else if ( arg.Compare("ENEMIES") )
178
			m_iEnemies = rest.ToInt();
179
		else if ( arg.Compare("COMBAT") )
180
			m_iEnemies2 = rest.GetToken ( 1, ':' ).ToInt();
181
		else if ( arg.Compare("CUSTOM") )
182
			custom.PushBack ( rest.GetToken(":", 1, 1), rest.GetToken(":", 2), true );
183
		else if ( arg.Compare("CUSTOMDISPLAY") )
184
		{
185
			if ( !noUpdate )
186
				m_lCustomFile.PushBack ( rest.GetToken("|", 1, 1), rest.GetToken("|", 2), false );
187
		}
188
		else if ( arg.Compare("INSURANCE") )
189
			m_iInsurance = rest.ToInt();
190
 
191
	}
192
	fclose ( id );
193
 
194
	DATA_LOCKED
195
	if ( resetCustom || custom.Count() )
196
		m_lCustomList.Clear();
197
	for ( SStringList *node = custom.Head(); node; node = node->next )
198
		m_lCustomList.PushBack(node->str, node->data, false);
199
	DATA_UNLOCKED
200
 
201
	if ( noUpdate ) return false;
202
 
203
	return ret;
204
}
205
 
206
void CX3Data::SetRaceRep(int rep, CyString race, CyString &rest, bool old)
207
{
208
	m_Rep[rep].bIncludeRace = true;
209
	m_Rep[rep].sRace = race;
210
	if ( old )
211
		m_Rep[rep].sRank = rest;
212
	else
213
	{
214
		m_Rep[rep].iRep = rest.GetToken(":", 1, 1).ToInt();
215
		m_Rep[rep].iRepPct = rest.GetToken(":", 2, 2).ToInt();
216
	}
217
}
218
 
219
CyString CX3Data::GetRepPercentage ( CyString &rank )
220
{
221
	return rank.GetToken ( 1, ':' );
222
 
223
	long amt = rank.GetToken ( 2, ':' ).ToLong();
224
	long upper = 0, lower = -1000000, r = 0;
225
	long checkamt = 0;
226
	bool breakout= false;
227
	while (1)
228
	{
229
		switch ( r )
230
		{
231
			case 0:
232
				checkamt = -10000;
233
				break;
234
			case 1:
235
				checkamt = -10000;
236
				break;
237
			case 2:
238
				checkamt = -1000;
239
				break;
240
			case 3:
241
				checkamt = -100;
242
				break;
243
			case 4:
244
				checkamt = -10;
245
				break;
246
			case 5:
247
				checkamt = 10;
248
				break;
249
			case 6:
250
				checkamt = 33;
251
				break;
252
			case 7:
253
				checkamt = 100;
254
				break;
255
			case 8:
256
				checkamt = 333;
257
				break;
258
			case 9:
259
				checkamt = 1000;
260
				break;
261
			case 10:
262
				checkamt = 3333;
263
				break;
264
			case 11:
265
				checkamt = 10000;
266
				break;
267
			case 12:
268
				checkamt = 33333;
269
				break;
270
			case 13:
271
				checkamt = 100000;
272
				break;
273
			case 14:
274
				checkamt = 333333;
275
				break;
276
			case 15:
277
				breakout = true;
278
				break;
279
		}
280
		lower = upper;
281
		upper = checkamt;
282
		if ( (amt < checkamt) || (breakout) )
283
			break;
284
		++r;
285
	}
286
 
287
	float a = (float)upper - lower;
288
	float b = (float)amt - lower;
289
 
290
	float p = ((b / a) * 100);
291
	int iP = (int)p;
292
	CyString fullRank = rank.GetToken ( 1, ':' );
293
	if ( !breakout )
294
	{
295
		fullRank += " (";
296
		fullRank += CyString((long)iP);
297
		fullRank += "%)";
298
	}
299
	return fullRank;
300
}
301
 
302
CyString CX3Data::GetRankPercentage ( CyString &rank )
303
{
304
	long amt = rank.GetToken ( 2, ':' ).ToLong();
305
	long upper = 0, lower = 0, r = 0;
306
 
307
	long checkamt = 0;
308
	while (1)
309
	{
310
		switch ( r )
311
		{
312
			case 0:
313
				checkamt = 2;
314
				break;
315
			case 1:
316
				checkamt = 5;
317
				break;
318
			case 2:
319
				checkamt = 10;
320
				break;
321
			case 3:
322
				checkamt = 20;
323
				break;
324
			case 4:
325
				checkamt = 50;
326
				break;
327
			case 5:
328
				checkamt = 70;
329
				break;
330
			case 6:
331
				checkamt = 90;
332
				break;
333
			case 7:
334
				checkamt = 130;
335
				break;
336
			case 8:
337
				checkamt = 150;
338
				break;
339
			case 9:
340
				checkamt = 250;
341
				break;
342
			case 10:
343
				checkamt = 450;
344
				break;
345
			case 11:
346
				checkamt = 700;
347
				break;
348
			case 12:
349
				checkamt = 900;
350
				break;
351
			case 13:
352
				checkamt = 1000;
353
				break;
354
			case 14:
355
				checkamt = 1400;
356
				break;
357
			case 15:
358
				checkamt = 2000;
359
				break;
360
			case 16:
361
				checkamt = 2500;
362
				break;
363
			case 17:
364
				checkamt = 6000;
365
				break;
366
			case 18:
367
				checkamt = 9000;
368
				break;
369
			case 19:
370
				checkamt = 16000;
371
				break;
372
			case 20:
373
				checkamt = 25000;
374
				break;
375
			case 21:
376
				checkamt = 44000;
377
				break;
378
			case 22:
379
				checkamt = 60000;
380
				break;
381
			case 23:
382
				checkamt = 86000;
383
				break;
384
			case 24:
385
				checkamt = 140000;
386
				break;
387
			case 25:
388
				checkamt = 280000;
389
				break;
390
			case 26:
391
				checkamt = 420000;
392
				break;
393
			case 27:
394
				checkamt = 500000;
395
				break;
396
			case 28:
397
				checkamt = 700000;
398
				break;
399
			case 29:
400
				checkamt = 1000000;
401
				break;
402
			case 30:
403
				checkamt = -1;
404
				break;
405
		}
406
		lower = upper;
407
		upper = checkamt;
408
		if ( (amt < checkamt) || (r >= 30) )
409
			break;
410
		++r;
411
	}
412
 
413
//	--upper;
414
	float a = (float)upper - lower;
415
	float b = (float)amt - lower;
416
 
417
	float p = ((b / a) * 100);
418
	int iP = (int)p;
419
 
420
	CyString fullRank = rank.GetToken ( 1, ':' );
421
	if ( checkamt >= 0 )
422
	{
423
		fullRank += " (";
424
		fullRank += CyString((long)iP);
425
		fullRank += "%)";
426
	}
427
	return fullRank;
428
}