Cube  Diff

Differences From Artifact [8854cf5de9]:

To Artifact [f5fe70f5b3]:


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void
gzputi(int i)
{
	gzwrite(f, &i, sizeof(int));
}

void
gzputv(vec &v)
{
	gzwrite(f, &v, sizeof(vec));
}

void
gzcheck(int a, int b)
{
	if (a != b)
		fatal("savegame file corrupt (short)");







|

|







27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void
gzputi(int i)
{
	gzwrite(f, &i, sizeof(int));
}

void
gzputv(OFVector3D &v)
{
	gzwrite(f, &v, sizeof(OFVector3D));
}

void
gzcheck(int a, int b)
{
	if (a != b)
		fatal("savegame file corrupt (short)");
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
{
	int i;
	gzcheck(gzread(f, &i, sizeof(int)), sizeof(int));
	return i;
}

void
gzgetv(vec &v)
{
	gzcheck(gzread(f, &v, sizeof(vec)), sizeof(vec));
}

void
stop()
{
	if (f) {
		if (demorecording)







|

|







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
{
	int i;
	gzcheck(gzread(f, &i, sizeof(int)), sizeof(int));
	return i;
}

void
gzgetv(OFVector3D &v)
{
	gzcheck(gzread(f, &v, sizeof(OFVector3D)), sizeof(OFVector3D));
}

void
stop()
{
	if (f) {
		if (demorecording)
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
};

// demo functions

int starttime = 0;
int playbacktime = 0;
int ddamage, bdamage;
vec dorig;

void
record(OFString *name)
{
	@autoreleasepool {
		if (m_sp) {
			conoutf(@"cannot record singleplayer games");







|







240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
};

// demo functions

int starttime = 0;
int playbacktime = 0;
int ddamage, bdamage;
OFVector3D dorig;

void
record(OFString *name)
{
	@autoreleasepool {
		if (m_sp) {
			conoutf(@"cannot record singleplayer games");
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
		starttime = lastmillis;
		ddamage = bdamage = 0;
	}
}
COMMAND(record, ARG_1STR)

void
demodamage(int damage, vec &o)
{
	ddamage = damage;
	dorig = o;
};
void
demoblend(int damage)
{







|







265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
		starttime = lastmillis;
		ddamage = bdamage = 0;
	}
}
COMMAND(record, ARG_1STR)

void
demodamage(int damage, OFVector3D &o)
{
	ddamage = damage;
	dorig = o;
};
void
demoblend(int damage)
{
359
360
361
362
363
364
365

366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
	assert(d);
	*d = *player1;
	readdemotime();
}

VAR(demodelaymsec, 0, 120, 500);


void
catmulrom(
    vec &z, vec &a, vec &b, vec &c, float s, vec &dest) // spline interpolation
{
	vec t1 = b, t2 = c;

	vsub(t1, z);
	vmul(t1, 0.5f) vsub(t2, a);
	vmul(t2, 0.5f);

	float s2 = s * s;
	float s3 = s * s2;

	dest = a;
	vec t = b;

	vmul(dest, 2 * s3 - 3 * s2 + 1);
	vmul(t, -2 * s3 + 3 * s2);
	vadd(dest, t);
	vmul(t1, s3 - 2 * s2 + s);
	vadd(dest, t1);
	vmul(t2, s3 - s2);







>

|
|

|









|







359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
	assert(d);
	*d = *player1;
	readdemotime();
}

VAR(demodelaymsec, 0, 120, 500);

// spline interpolation
void
catmulrom(OFVector3D &z, OFVector3D &a, OFVector3D &b, OFVector3D &c, float s,
    OFVector3D &dest)
{
	OFVector3D t1 = b, t2 = c;

	vsub(t1, z);
	vmul(t1, 0.5f) vsub(t2, a);
	vmul(t2, 0.5f);

	float s2 = s * s;
	float s3 = s * s2;

	dest = a;
	OFVector3D t = b;

	vmul(dest, 2 * s3 - 3 * s2 + 1);
	vmul(t, -2 * s3 + 3 * s2);
	vadd(dest, t);
	vmul(t1, s3 - 2 * s2 + s);
	vadd(dest, t1);
	vmul(t2, s3 - s2);
403
404
405
406
407
408
409
410

411
412
413
414
415
416
417
	while (demoplayback && lastmillis >= playbacktime) {
		int len = gzgeti();
		if (len < 1 || len > MAXTRANS) {
			conoutf(
			    @"error: huge packet during demo play (%d)", len);
			stopreset();
			return;
		};

		uchar buf[MAXTRANS];
		gzread(f, buf, len);
		localservertoclient(buf, len); // update game state

		dynent *target = players[democlientnum];
		assert(target);








<
>







404
405
406
407
408
409
410

411
412
413
414
415
416
417
418
	while (demoplayback && lastmillis >= playbacktime) {
		int len = gzgeti();
		if (len < 1 || len > MAXTRANS) {
			conoutf(
			    @"error: huge packet during demo play (%d)", len);
			stopreset();
			return;

		}
		uchar buf[MAXTRANS];
		gzread(f, buf, len);
		localservertoclient(buf, len); // update game state

		dynent *target = players[democlientnum];
		assert(target);

430
431
432
433
434
435
436
437

438
439

440
441
442
443
444
445
446
447
448
449
450
451
452
453
454


455
456

457
458
459
460
461
462
463
			target->state = gzget();
			target->lastmove = playbacktime;
			if (bdamage = gzgeti())
				damageblend(bdamage);
			if (ddamage = gzgeti()) {
				gzgetv(dorig);
				particle_splash(3, ddamage, 1000, dorig);
			};

			// FIXME: set more client state here
		};


		// insert latest copy of player into history
		if (extras &&
		    (playerhistory.empty() ||
		        playerhistory.last()->lastupdate != playbacktime)) {
			dynent *d = newdynent();
			*d = *target;
			d->lastupdate = playbacktime;
			playerhistory.add(d);
			if (playerhistory.length() > 20) {
				zapdynent(playerhistory[0]);
				playerhistory.remove(0);
			};
		};



		readdemotime();
	};


	if (demoplayback) {
		int itime = lastmillis - demodelaymsec;
		loopvrev(playerhistory) if (playerhistory[i]->lastupdate <
		                            itime) // find 2 positions in
		                                   // history that surround
		                                   // interpolation time point







<
>

<
>












<
<
|
>
>

<
>







431
432
433
434
435
436
437

438
439

440
441
442
443
444
445
446
447
448
449
450
451
452


453
454
455
456

457
458
459
460
461
462
463
464
			target->state = gzget();
			target->lastmove = playbacktime;
			if (bdamage = gzgeti())
				damageblend(bdamage);
			if (ddamage = gzgeti()) {
				gzgetv(dorig);
				particle_splash(3, ddamage, 1000, dorig);

			}
			// FIXME: set more client state here

		}

		// insert latest copy of player into history
		if (extras &&
		    (playerhistory.empty() ||
		        playerhistory.last()->lastupdate != playbacktime)) {
			dynent *d = newdynent();
			*d = *target;
			d->lastupdate = playbacktime;
			playerhistory.add(d);
			if (playerhistory.length() > 20) {
				zapdynent(playerhistory[0]);
				playerhistory.remove(0);


			}
		}

		readdemotime();

	}

	if (demoplayback) {
		int itime = lastmillis - demodelaymsec;
		loopvrev(playerhistory) if (playerhistory[i]->lastupdate <
		                            itime) // find 2 positions in
		                                   // history that surround
		                                   // interpolation time point
485
486
487
488
489
490
491
492
493

494
495
496

497
498

499
500

501
502
503


504
505
506
507
508
509
510
511
512
513
514
				fixwrap(z, player1);
				vdist(dist, v, z->o, c->o);
				if (dist < 16) // if teleport or spawn, dont't
				               // interpolate
				{
					catmulrom(z->o, a->o, b->o, c->o, bf,
					    player1->o);
					catmulrom(*(vec *)&z->yaw,
					    *(vec *)&a->yaw, *(vec *)&b->yaw,

					    *(vec *)&c->yaw, bf,
					    *(vec *)&player1->yaw);
				};

				fixplayer1range();
			};

			break;
		};

		// if(player1->state!=CS_DEAD) showscores(false);
	};
};



void
stopn()
{
	if (demoplayback)
		stopreset();
	else
		stop();
	conoutf(@"demo stopped");
}
COMMANDN(stop, stopn, ARG_NONE)







|
|
>
|
|
<
>

<
>

<
>

<
<
>
>











486
487
488
489
490
491
492
493
494
495
496
497

498
499

500
501

502
503


504
505
506
507
508
509
510
511
512
513
514
515
516
				fixwrap(z, player1);
				vdist(dist, v, z->o, c->o);
				if (dist < 16) // if teleport or spawn, dont't
				               // interpolate
				{
					catmulrom(z->o, a->o, b->o, c->o, bf,
					    player1->o);
					catmulrom(*(OFVector3D *)&z->yaw,
					    *(OFVector3D *)&a->yaw,
					    *(OFVector3D *)&b->yaw,
					    *(OFVector3D *)&c->yaw, bf,
					    *(OFVector3D *)&player1->yaw);

				}
				fixplayer1range();

			}
			break;

		}
		// if(player1->state!=CS_DEAD) showscores(false);


	}
}

void
stopn()
{
	if (demoplayback)
		stopreset();
	else
		stop();
	conoutf(@"demo stopped");
}
COMMANDN(stop, stopn, ARG_NONE)