diff options
Diffstat (limited to 'src/GameTick.cpp')
-rw-r--r-- | src/GameTick.cpp | 27 |
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; |