summary refs log tree commit diff
path: root/src/GameTick.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GameTick.cpp')
-rw-r--r--src/GameTick.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index 3c2a1d8..f97d3c9 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -549,27 +549,36 @@ 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) {
+	for (auto i = 0; i < 10; ++i) {
 		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)
+
+	size_t k = 0;
+	if (game->numpeople < max_people)
+		k = game->numpeople++;
+	else
+		for (auto i = 0; i < game->numpeople; ++i) {
+			auto p = game->person + randInt(2, game->numpeople - 1);
+			if (abs(p->whichblockx - block.x) > 2
+			    && abs(p->whichblocky - block.z) > 2) {
+				k = p - game->person;
+				break;
+			}
+		}
+	if (game->citypeoplenum[blockspawnx][blockspawny] >= max_people_block
+	    || (game->spawndelay -= multiplier) > 0 || k == 0)
 		return;
 	game->citypeoplenum[blockspawnx][blockspawny]++;
+	game->spawndelay = 0.1f;
+	auto& npc = game->person[k];
 
 	npc.whichblockx = blockspawnx;
 	npc.whichblocky = blockspawny;