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_MIN_DELAY = 2000;
|
||||||
const int ZOMBIE_GROAN_MAX_DELAY = 3000;
|
const int ZOMBIE_GROAN_MAX_DELAY = 3000;
|
||||||
const int ZOMBIE_FOOTSTEP_MAX_DISTANCE = 5;
|
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 float ZOMBIE_SOUND_VOLUME_STEP = 3.0;
|
||||||
const int ZOMBIE_ATTACK_MAX_HEIGHT = 6;
|
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_MIN_DELAY = 3000;
|
||||||
const int BANDIT_ALERT_MAX_DELAY = 5000;
|
const int BANDIT_ALERT_MAX_DELAY = 5000;
|
||||||
const int BANDIT_FOOTSTEP_MAX_DISTANCE = 7;
|
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 float BANDIT_SOUND_VOLUME_STEP = 3.0;
|
||||||
const int BANDIT_ATTACK_MAX_HEIGHT = 6;
|
const int BANDIT_ATTACK_MAX_HEIGHT = 6;
|
||||||
const int INVASION_DURATION_HOURS = 1;
|
const int INVASION_DURATION_HOURS = 1;
|
||||||
|
|||||||
@@ -155,6 +155,35 @@ int pick_bandit_spawn_position(int range_start, int range_end) {
|
|||||||
return -1;
|
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 count_bandits_in_range(int range_start, int range_end) {
|
||||||
int start = range_start;
|
int start = range_start;
|
||||||
int end = range_end;
|
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") {
|
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;
|
if (spawn_x == -1) return;
|
||||||
|
|
||||||
int home_start = expansion_start;
|
int home_start = expansion_start;
|
||||||
|
|||||||
@@ -182,8 +182,63 @@ int pick_undead_spawn_position(int range_start, int range_end) {
|
|||||||
return -1;
|
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") {
|
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;
|
if (spawn_x == -1) return;
|
||||||
|
|
||||||
Undead@ undead = Undead(spawn_x, undead_type);
|
Undead@ undead = Undead(spawn_x, undead_type);
|
||||||
|
|||||||
Reference in New Issue
Block a user