1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-
+
|
// monster.cpp: implements AI for single player monsters, currently client only
#import "Monster.h"
#include "cube.h"
#import "DynamicEntity.h"
#import "Entity.h"
#import "Player.h"
static OFMutableArray<Monster *> *monsters;
static int nextmonster, spawnremain, numkilled, monstertotal, mtimestart;
@implementation Monster
+ (void)initialize
{
|
︙ | | |
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
-
+
|
if (state != M_SLEEP)
spawnplayer(self);
self.trigger = lastmillis + trigger;
self.targetYaw = self.yaw = (float)yaw;
self.move = move;
self.enemy = player1;
self.enemy = Player.player1;
self.gunSelect = t->gun;
self.maxSpeed = (float)t->speed;
self.health = t->health;
self.armour = 0;
for (size_t i = 0; i < NUMGUNS; i++)
self.ammo[i] = 10000;
|
︙ | | |
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
|
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
|
-
+
|
self.yaw -= 360.0f;
}
// main AI thinking routine, called every frame for every monster
- (void)performAction
{
if (self.enemy.state == CS_DEAD) {
self.enemy = player1;
self.enemy = Player.player1;
self.anger = 0;
}
[self normalizeWithAngle:self.targetYaw];
// slowly turn monster towards his target
if (self.targetYaw > self.yaw) {
self.yaw += curtime * 0.5f;
if (self.targetYaw < self.yaw)
|
︙ | | |
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
|
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
|
-
+
|
n:monstertypes[self.monsterType].pain
r:200];
if ((self.health -= damage) <= 0) {
self.state = CS_DEAD;
self.lastAction = lastmillis;
numkilled++;
player1.frags = numkilled;
Player.player1.frags = numkilled;
OFVector3D loc = self.origin;
playsound(monstertypes[self.monsterType].diesound, &loc);
int remain = monstertotal - numkilled;
if (remain > 0 && remain <= 5)
conoutf(@"only %d monster(s) remaining", remain);
} else {
OFVector3D loc = self.origin;
|
︙ | | |