summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/Game.h1
-rw-r--r--src/GameTick.cpp290
-rw-r--r--src/Person.cpp1
3 files changed, 81 insertions, 211 deletions
diff --git a/src/Game.h b/src/Game.h
index 7e663ab..88683d9 100644
--- a/src/Game.h
+++ b/src/Game.h
@@ -71,7 +71,6 @@ struct Game {
 	float flashr,flashg,flashb;
 
 	int enemystate;
-	int cycle;
 	bool whacked;
 	float losedelay;
 	struct XYZ bodycoords;
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index 071993b..3c2a1d8 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -547,6 +547,86 @@ void checkPersonCollisions(Game* game, int k)
 	}
 }
 
+void spawnNpc(Game* game)
+{
+	if ((game->spawndelay -= multiplier) > 0)
+		return;
+	game->spawndelay = 0.1f;
+	if (game->numpeople >= max_people)
+		return;
+	auto& npc = game->person[game->numpeople++];
+
+	// Pick a random unfull block close to the player
+	int blockspawnx, blockspawny;
+	auto& player = game->person[0];
+	auto block = player.playercoords / block_spacing;
+	for (auto cyclenum = 0; cyclenum < 10; ++cyclenum) {
+		blockspawnx = block.x + 0.5f + randInt(-1, 1);
+		blockspawny = block.z + 0.5f + randInt(-1, 1);
+		if (game->citypeoplenum[blockspawnx][blockspawny]
+		    < max_people_block)
+			break;
+	}
+	if (game->citypeoplenum[blockspawnx][blockspawny] >= max_people_block)
+		return;
+	game->citypeoplenum[blockspawnx][blockspawny]++;
+
+	npc.whichblockx = blockspawnx;
+	npc.whichblocky = blockspawny;
+	npc.whichcostume = casualcostumes + randUint(numcasual);
+	if (npc.type == viptype) {
+		npc.existing = true;
+		npc.pathsize = 0.98f + 0.04f * randFloat();
+		npc.speedmult = 0.8f + 0.4f * randFloat();
+		npc.targetanimation = walkanim;
+	} else if (game->type == zombie_type) {
+		npc.type = zombietype;
+		npc.aiming = false;
+		npc.existing = true;
+		npc.pathsize = 1.04;
+		npc.speedmult = 0.7f + 0.2f * game->difficulty;
+		npc.targetanimation = zombiewalkanim;
+	} else if (randUint(game->evilprobability)) {
+		npc.type = civiliantype;
+		npc.aiming = false;
+		npc.existing = false;
+		npc.pathsize = 0.98f + 0.04f * randFloat();
+		npc.speedmult = 0.8f + 0.4f * randFloat();
+		npc.targetanimation = walkanim;
+	} else {
+		npc.type = eviltype;
+		npc.aiming = true;
+		npc.existing = true;
+		npc.pathsize = 1.04;
+		npc.speedmult = 1.0f + 0.3f * game->difficulty;
+		npc.targetanimation = walkanim;
+	}
+
+	npc.pathnum = -1;
+	while (npc.pathnum < 0
+	       || npc.pathnum == 1
+	       || npc.pathnum >= game->path.vertexNum)
+		npc.pathnum = randUint(game->path.vertexNum);
+	npc.oldoldoldpathnum = npc.oldoldpathnum = npc.oldpathnum = -1;
+
+	npc.pathtarget.x = game->path.vertex[npc.pathnum].x;
+	npc.pathtarget.z = game->path.vertex[npc.pathnum].z;
+	npc.pathtarget *= npc.pathsize;
+	npc.pathtarget.x += npc.whichblockx * block_spacing;
+	npc.pathtarget.z += npc.whichblocky * block_spacing;
+	npc.oldplayercoords =  npc.playercoords = npc.pathtarget;
+
+	npc.skeleton.free = false;
+	npc.speed = 1;
+	npc.health = npc.maxhealth = 100;
+	npc.playerrotation = 0;
+	npc.playerrotation2 = 0;
+	npc.lastdistancevictim = 200000;
+	npc.whichgun = nogun;
+	npc.killtarget = (game->enemystate == 2
+		&& (npc.type == zombietype || npc.type == eviltype)) ? 1 : -1;
+}
+
 void Game::Tick()
 {
 	if (person[1].health <= 0 || person[0].health <= 0 || killedinnocent)
@@ -568,6 +648,7 @@ void Game::Tick()
 		initGame(this);
 	}
 
+	spawnNpc(this);
 	sprites.DoStuff();
 	decals.DoStuff();
 
@@ -593,215 +674,6 @@ void Game::Tick()
 	camera.oldposition = camera.position;
 	camera.targetoffset = {0.0f, 0.0f, -5.0f};
 
-	// Spawn people
-	int cyclenum = 0;
-	int blockspawnx = 0, blockspawny = 0;
-	do {
-		auto block = person[0].playercoords / block_spacing;
-		blockspawnx = block.x + 0.5f + randInt(-1, 1);
-		blockspawny = block.z + 0.5f + randInt(-1, 1);
-
-		auto& people = citypeoplenum[blockspawnx][blockspawny];
-		if (people < max_people_block)
-			break;
-	} while (++cyclenum < 10);
-
-	spawndelay -= multiplier;
-	if(cyclenum<10){
-
-	if (spawndelay < 0 && numpeople < max_people) {
-		if (type == zombie_type)
-			person[numpeople].type = zombietype;
-		else if (randUint(evilprobability))
-			person[numpeople].type = civiliantype;
-		else
-			person[numpeople].type = eviltype;
-
-		if(person[numpeople].type!=civiliantype&&blockspawnx==person[1].whichblockx&&blockspawny==person[1].whichblocky){
-			while((citypeoplenum[blockspawnx][blockspawny]>=max_people_block&&cyclenum<10)||blockspawnx==0||(blockspawnx==person[1].whichblockx&&blockspawny==person[1].whichblocky)){
-				blockspawnx = (person[0].playercoords.x + block_spacing / 2) / block_spacing + randInt(-1, 1);
-				blockspawny = (person[0].playercoords.z + block_spacing / 2) / block_spacing + randInt(-1, 1);
-				cyclenum++;
-			}
-		}
-
-		person[numpeople].playerrotation=0;
-		person[numpeople].whichcostume = casualcostumes + randUint(numcasual);
-		person[numpeople].whichblockx=blockspawnx;
-		person[numpeople].whichblocky=blockspawny;
-		person[numpeople].pathnum=-1;
-		person[numpeople].oldpathnum=-1;
-		person[numpeople].oldoldpathnum=-1;
-		person[numpeople].oldoldoldpathnum=-1;
-
-		while(person[numpeople].pathnum<0||person[numpeople].pathnum>=path.vertexNum||person[numpeople].pathnum==1){
-
-			person[numpeople].pathnum = randUint(path.vertexNum);
-
-		}
-
-		person[numpeople].pathtarget.x=path.vertex[person[numpeople].pathnum].x;
-
-		person[numpeople].pathtarget.z=path.vertex[person[numpeople].pathnum].z;
-
-		person[numpeople].pathsize = 0.98f + 0.04f * randFloat();
-
-		person[numpeople].pathtarget*=person[numpeople].pathsize;
-
-		person[numpeople].pathtarget.x+=person[numpeople].whichblockx*block_spacing;
-
-		person[numpeople].pathtarget.z+=person[numpeople].whichblocky*block_spacing;
-
-		person[numpeople].playercoords=person[numpeople].pathtarget;
-
-		person[numpeople].oldplayercoords=person[numpeople].playercoords;
-
-		person[numpeople].skeleton.free=0;
-
-		person[numpeople].targetanimation=walkanim;
-
-		if(person[numpeople].type==zombietype)person[numpeople].targetanimation=zombiewalkanim;
-
-		person[numpeople].speed=1;
-
-		person[numpeople].existing=0;
-
-		person[numpeople].speedmult = 0.8f + 0.4f * randFloat();
-
-		person[numpeople].health=100;
-
-		person[numpeople].maxhealth=100;
-
-		person[numpeople].playerrotation2=0;
-
-		person[numpeople].lastdistancevictim=200000;
-
-		if(numpeople==1)person[numpeople].type=viptype;
-
-		person[numpeople].killtarget=-1;
-
-		if(person[numpeople].type==eviltype){person[numpeople].existing=1; person[numpeople].pathsize=1.04; person[numpeople].whichgun=nogun; person[numpeople].aiming=1; person[numpeople].killtarget=-1; person[numpeople].speedmult=1+.3*difficulty;}
-
-		if(person[numpeople].type==zombietype){person[numpeople].existing=1; person[numpeople].pathsize=1.04; person[numpeople].whichgun=nogun; person[numpeople].aiming=0; person[numpeople].killtarget=-1; person[numpeople].speedmult=0.7+.2*difficulty;}
-
-		else {person[numpeople].whichgun=nogun; person[numpeople].aiming=0; person[numpeople].killtarget=-1;}
-
-		if(person[numpeople].type==viptype){person[numpeople].existing=1;}
-
-		if(enemystate==2)person[numpeople].killtarget=1;
-
-		numpeople++;
-
-		citypeoplenum[blockspawnx][blockspawny]++;
-
-		spawndelay=.1;
-
-	}
-
-	if(spawndelay<0&&numpeople>=max_people){
-
-		if(cycle>=max_people)cycle=0;
-
-		cyclenum=0;
-
-		while(cyclenum<max_people&&(person[cycle].type==playertype||person[cycle].type==viptype||(abs(person[cycle].whichblockx-((person[0].playercoords.x+block_spacing/2)/block_spacing))<2&&abs(person[cycle].whichblocky-((person[0].playercoords.z+block_spacing/2)/block_spacing))<2))){
-
-			cycle++;
-
-			cyclenum++;
-
-			if(cycle>=max_people)cycle=0;
-
-		}
-
-		if(cycle<max_people&&cyclenum<max_people){
-			if (type == zombie_type)
-				person[cycle].type = zombietype;
-			else if (randUint(evilprobability))
-				person[cycle].type = civiliantype;
-			else
-				person[cycle].type = eviltype;
-
-			if(person[cycle].type!=civiliantype&&blockspawnx==person[1].whichblockx&&blockspawny==person[1].whichblocky){
-				while((citypeoplenum[blockspawnx][blockspawny]>=max_people_block&&cyclenum<10)||blockspawnx==0||(blockspawnx==person[1].whichblockx&&blockspawny==person[1].whichblocky)){
-					blockspawnx = (person[0].playercoords.x + block_spacing / 2) / block_spacing + randInt(-1, 1);
-					blockspawny = (person[0].playercoords.z + block_spacing / 2) / block_spacing + randInt(-1, 1);
-					cyclenum++;
-				}
-			}
-
-			person[cycle].playerrotation=0;
-			person[cycle].whichcostume = casualcostumes + randUint(numcasual);
-			citypeoplenum[person[cycle].whichblockx][person[cycle].whichblocky]--;
-			person[cycle].whichblockx=blockspawnx;
-			person[cycle].whichblocky=blockspawny;
-			person[cycle].pathnum=-1;
-			person[cycle].oldpathnum=-1;
-			person[cycle].oldoldpathnum=-1;
-			person[cycle].oldoldoldpathnum=-1;
-
-			while(person[cycle].pathnum<0||person[cycle].pathnum>=path.vertexNum||person[cycle].pathnum==1){
-				person[cycle].pathnum = randUint(path.vertexNum);
-			}
-
-			person[cycle].pathtarget.x=path.vertex[person[cycle].pathnum].x;
-
-			person[cycle].pathtarget.z=path.vertex[person[cycle].pathnum].z;
-
-			person[cycle].pathsize= 0.98f + 0.04f * randFloat();
-
-			person[cycle].pathtarget*=person[cycle].pathsize;
-
-			person[cycle].pathtarget.x+=person[cycle].whichblockx*block_spacing;
-
-			person[cycle].pathtarget.z+=person[cycle].whichblocky*block_spacing;
-
-			person[cycle].playercoords=person[cycle].pathtarget;
-
-			person[cycle].oldplayercoords=person[cycle].playercoords;
-
-			person[cycle].skeleton.free=0;
-
-			person[cycle].targetanimation=walkanim;
-
-			if(person[cycle].type==zombietype)person[cycle].targetanimation=zombiewalkanim;
-
-			person[cycle].speed=1;
-
-			person[cycle].existing=0;
-
-			person[cycle].speedmult = 0.8f + 0.4f * randFloat();
-
-			person[cycle].health=100;
-
-			person[cycle].maxhealth=100;
-
-			person[cycle].playerrotation2=0;
-
-			if(enemystate==1)person[cycle].killtarget=-1;
-
-			if(person[cycle].type==eviltype){person[cycle].existing=1;  person[cycle].pathsize=1.04; person[cycle].whichgun=nogun; person[cycle].aiming=1; person[cycle].killtarget=-1; person[cycle].speedmult=1+.3*difficulty;}
-
-			if(person[cycle].type==zombietype){person[cycle].existing=1; person[cycle].pathsize=1.04; person[cycle].whichgun=nogun; person[cycle].aiming=0; person[cycle].killtarget=-1; person[cycle].speedmult=.7+.2*difficulty;}
-
-			else {person[cycle].whichgun=nogun; person[cycle].aiming=0; person[cycle].killtarget=-1;}
-
-			person[cycle].lastdistancevictim=200000;
-
-			if(enemystate==2)person[cycle].killtarget=1;
-
-			if(numpeople<max_people)numpeople++;
-
-			citypeoplenum[blockspawnx][blockspawny]++;
-
-			cycle++;
-
-			spawndelay=.1;
-
-		}
-
-	}}
-
 	XYZ towards;
 	XYZ finaltarget;
 	XYZ blah;
diff --git a/src/Person.cpp b/src/Person.cpp
index 4097aa5..2007857 100644
--- a/src/Person.cpp
+++ b/src/Person.cpp
@@ -201,7 +201,6 @@ HitStruct 	Person::BulletCollideWithPlayer(int who, XYZ start, XYZ end){
 }
 
 extern float camerashake;
-extern int cycle;
 void Person::DoAnimations(int who)
 {
 	if (target > 1 && !skeleton.free) {