︙ | | | ︙ | |
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)
|