1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
+
-
+
-
+
|
// monster.cpp: implements AI for single player monsters, currently client only
#include "cube.h"
dvector monsters;
int nextmonster, spawnremain, numkilled, monstertotal, mtimestart;
VARF(skill, 1, 3, 10, conoutf(@"skill is now %d", skill));
dvector &
getmonsters()
{
return monsters;
}
};
void
restoremonsterstate()
{
loopv(monsters) if (monsters[i]->state == CS_DEAD) numkilled++;
}; // for savegames
} // for savegames
#define TOTMFREQ 13
#define NUMMONSTERTYPES 8
struct monstertype // see docs for how these values modify behaviour
{
short gun, speed, health, freq, lag, rate, pain, loyalty, mscale,
|
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
|
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
|
-
+
-
+
|
player1->frags = numkilled;
playsound(monstertypes[m->mtype].diesound, &m->o);
int remain = monstertotal - numkilled;
if (remain > 0 && remain <= 5)
conoutf(@"only %d monster(s) remaining", remain);
} else {
playsound(monstertypes[m->mtype].painsound, &m->o);
};
}
};
void
endsp(bool allkilled)
{
conoutf(allkilled ? @"you have cleared the map!"
: @"you reached the exit!");
conoutf(@"score: %d kills in %d seconds", numkilled,
(lastmillis - mtimestart) / 1000);
monstertotal = 0;
startintermission();
};
}
void
monsterthink()
{
if (m_dmsp && spawnremain && lastmillis > nextmonster) {
if (spawnremain-- == monstertotal)
conoutf(@"The invasion has begun!");
|
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
|
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
|
-
+
|
if (dist < 4)
teleport((int)(&e - &ents[0]), monsters[i]);
};
};
loopv(monsters) if (monsters[i]->state == CS_ALIVE)
monsteraction(monsters[i]);
};
}
void
monsterrender()
{
loopv(monsters) renderclient(monsters[i], false,
monstertypes[monsters[i]->mtype].mdlname, monsters[i]->mtype == 5,
monstertypes[monsters[i]->mtype].mscale / 10.0f);
}
|