Update where invaders and undead spawn.
This commit is contained in:
@@ -69,6 +69,8 @@ const int ZOMBIE_DAMAGE_MAX = 6;
|
||||
const int ZOMBIE_GROAN_MIN_DELAY = 2000;
|
||||
const int ZOMBIE_GROAN_MAX_DELAY = 3000;
|
||||
const int ZOMBIE_FOOTSTEP_MAX_DISTANCE = 5;
|
||||
const int ZOMBIE_SPAWN_MIN_DISTANCE = 30;
|
||||
const int ZOMBIE_SPAWN_MAX_DISTANCE = 50;
|
||||
const float ZOMBIE_SOUND_VOLUME_STEP = 3.0;
|
||||
const int ZOMBIE_ATTACK_MAX_HEIGHT = 6;
|
||||
|
||||
@@ -158,6 +160,8 @@ const int BANDIT_DAMAGE_MAX = 2;
|
||||
const int BANDIT_ALERT_MIN_DELAY = 3000;
|
||||
const int BANDIT_ALERT_MAX_DELAY = 5000;
|
||||
const int BANDIT_FOOTSTEP_MAX_DISTANCE = 7;
|
||||
const int BANDIT_SPAWN_MIN_DISTANCE = 30;
|
||||
const int BANDIT_SPAWN_MAX_DISTANCE = 50;
|
||||
const float BANDIT_SOUND_VOLUME_STEP = 3.0;
|
||||
const int BANDIT_ATTACK_MAX_HEIGHT = 6;
|
||||
const int INVASION_DURATION_HOURS = 1;
|
||||
|
||||
@@ -155,6 +155,35 @@ int pick_bandit_spawn_position(int range_start, int range_end) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int pick_bandit_spawn_east_of_player(int min_distance, int max_distance, int range_start, int range_end) {
|
||||
int min_dist = min_distance;
|
||||
int max_dist = max_distance;
|
||||
if (min_dist < 0) min_dist = 0;
|
||||
if (max_dist < min_dist) {
|
||||
int temp = min_dist;
|
||||
min_dist = max_dist;
|
||||
max_dist = temp;
|
||||
}
|
||||
|
||||
int start = x + min_dist;
|
||||
int end = x + max_dist;
|
||||
|
||||
int range_start_norm = range_start;
|
||||
int range_end_norm = range_end;
|
||||
if (range_start_norm > range_end_norm) {
|
||||
int temp = range_start_norm;
|
||||
range_start_norm = range_end_norm;
|
||||
range_end_norm = temp;
|
||||
}
|
||||
|
||||
if (start < range_start_norm) start = range_start_norm;
|
||||
if (end > range_end_norm) end = range_end_norm;
|
||||
|
||||
if (start > end) return -1;
|
||||
|
||||
return pick_bandit_spawn_position(start, end);
|
||||
}
|
||||
|
||||
int count_bandits_in_range(int range_start, int range_end) {
|
||||
int start = range_start;
|
||||
int end = range_end;
|
||||
@@ -174,7 +203,13 @@ int count_bandits_in_range(int range_start, int range_end) {
|
||||
}
|
||||
|
||||
void spawn_bandit(int expansion_start, int expansion_end, const string&in invader_type = "bandit") {
|
||||
int spawn_x = pick_bandit_spawn_position(expansion_start, expansion_end);
|
||||
int spawn_x = -1;
|
||||
if (invasion_active) {
|
||||
spawn_x = pick_bandit_spawn_east_of_player(BANDIT_SPAWN_MIN_DISTANCE, BANDIT_SPAWN_MAX_DISTANCE, expansion_start, expansion_end);
|
||||
}
|
||||
if (spawn_x == -1) {
|
||||
spawn_x = pick_bandit_spawn_position(expansion_start, expansion_end);
|
||||
}
|
||||
if (spawn_x == -1) return;
|
||||
|
||||
int home_start = expansion_start;
|
||||
|
||||
@@ -182,8 +182,63 @@ int pick_undead_spawn_position(int range_start, int range_end) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int pick_undead_spawn_near_player(int min_distance, int max_distance) {
|
||||
int min_dist = min_distance;
|
||||
int max_dist = max_distance;
|
||||
if (min_dist < 0) min_dist = 0;
|
||||
if (max_dist < min_dist) {
|
||||
int temp = min_dist;
|
||||
min_dist = max_dist;
|
||||
max_dist = temp;
|
||||
}
|
||||
|
||||
for (int attempts = 0; attempts < 20; attempts++) {
|
||||
int distance = random(min_dist, max_dist);
|
||||
int direction = (random(0, 1) == 0) ? -1 : 1;
|
||||
int candidate = x + (distance * direction);
|
||||
if (candidate <= BASE_END || candidate < 0 || candidate >= MAP_SIZE) continue;
|
||||
if (candidate == x) continue;
|
||||
if (get_undead_at(candidate) != null) continue;
|
||||
return candidate;
|
||||
}
|
||||
|
||||
int left_start = x - max_dist;
|
||||
int left_end = x - min_dist;
|
||||
int right_start = x + min_dist;
|
||||
int right_end = x + max_dist;
|
||||
|
||||
if (left_start < BASE_END + 1) left_start = BASE_END + 1;
|
||||
if (left_end < BASE_END + 1) left_end = BASE_END;
|
||||
if (right_start < BASE_END + 1) right_start = BASE_END + 1;
|
||||
|
||||
if (left_end >= MAP_SIZE) left_end = MAP_SIZE - 1;
|
||||
if (right_start >= MAP_SIZE) right_start = MAP_SIZE;
|
||||
if (right_end >= MAP_SIZE) right_end = MAP_SIZE - 1;
|
||||
|
||||
int candidate = -1;
|
||||
if (random(0, 1) == 0) {
|
||||
if (left_start <= left_end) candidate = pick_undead_spawn_position(left_start, left_end);
|
||||
if (candidate == -1 && right_start <= right_end) {
|
||||
candidate = pick_undead_spawn_position(right_start, right_end);
|
||||
}
|
||||
} else {
|
||||
if (right_start <= right_end) candidate = pick_undead_spawn_position(right_start, right_end);
|
||||
if (candidate == -1 && left_start <= left_end) {
|
||||
candidate = pick_undead_spawn_position(left_start, left_end);
|
||||
}
|
||||
}
|
||||
|
||||
return candidate;
|
||||
}
|
||||
|
||||
void spawn_undead(const string &in undead_type = "zombie") {
|
||||
int spawn_x = pick_undead_spawn_position(BASE_END + 1, MAP_SIZE - 1);
|
||||
int spawn_x = -1;
|
||||
if (undead_type == "zombie" || undead_type == "undead_resident") {
|
||||
spawn_x = pick_undead_spawn_near_player(ZOMBIE_SPAWN_MIN_DISTANCE, ZOMBIE_SPAWN_MAX_DISTANCE);
|
||||
}
|
||||
if (spawn_x == -1) {
|
||||
spawn_x = pick_undead_spawn_position(BASE_END + 1, MAP_SIZE - 1);
|
||||
}
|
||||
if (spawn_x == -1) return;
|
||||
|
||||
Undead@ undead = Undead(spawn_x, undead_type);
|
||||
|
||||
Reference in New Issue
Block a user