private ZombieAgent CreateInactiveZombie(bool initial) { ZombieAgent zombie = new ZombieAgent(); zombie.id = _nextZombieId++; if (initial) { // The initial population is placed nearby pois more frequently. var poiChance = 0.8f; var poi = _prng.Chance(poiChance) ? _pois.GetRandom(_prng) : null; if (poi != null) { // To be not literally inside the POI we add a random radius. var spawnRadius = 256.0f; var randOffset = new Vector3( _prng.Get(-spawnRadius, spawnRadius), 0.0f, _prng.Get(-spawnRadius, spawnRadius)); zombie.pos = poi.GetRandomPos(_prng) + randOffset; zombie.pos = WrapPos(zombie.pos); } else { // Use a random world zone for the rest. var zone = _worldZones.GetRandom(_prng); if (zone != null) { zombie.pos = zone.GetRandomPos(_prng); } else { zombie.pos = GetRandomPos(); } } } else { // New zombies start at the border. zombie.pos = GetRandomBorderPoint(); } zombie.target = GetNextTarget(zombie); zombie.targetPos = GetTargetPos(zombie.target); _inactiveZombies.Add(zombie); return(zombie); }
ZombieAgent CreateInactiveZombie(bool initial) { ZombieAgent zombie = new ZombieAgent(); zombie.id = _nextZombieId++; if (initial) { var poiChance = Config.Instance.POITravellerChance; var poi = _prng.Chance(poiChance) ? _pois.GetRandom(_prng) : null; if (poi != null) { // To be not literally inside the POI we add a random radius. var spawnRadius = 256.0f; var randOffset = new Vector3( _prng.Get(-spawnRadius, spawnRadius), 0.0f, _prng.Get(-spawnRadius, spawnRadius)); zombie.pos = poi.GetRandomPos(_prng) + randOffset; zombie.pos = WrapPos(zombie.pos); } else { // Use a random world zone for the rest. var zone = _worldZones.GetRandom(_prng); if (zone != null) { zombie.pos = zone.GetRandomPos(_prng); } else { zombie.pos = GetRandomPos(); } } } else { // New zombies start at the border. zombie.pos = GetRandomBorderPoint(); } zombie.state = ZombieAgent.State.Idle; _inactiveZombies.Add(zombie); return(zombie); }