work on victory and retry conditions

This commit is contained in:
Christopher
2023-03-03 16:16:01 +13:00
parent a8c55988ad
commit f7afb36cc7
4 changed files with 57 additions and 18 deletions

View File

@@ -1,5 +1,6 @@
use std::process::exit;
use input::prompt;
use model::{Galaxy, systems};
mod input;
@@ -12,6 +13,8 @@ fn main() {
.expect("Error setting Ctrl-C handler");
let mut galaxy = Galaxy::generate_new();
let initial_klingons = galaxy.remaining_klingons();
let initial_stardate = galaxy.stardate;
view::enterprise();
view::intro(&galaxy);
@@ -36,12 +39,21 @@ fn main() {
_ => view::print_command_help()
}
if galaxy.enterprise.destroyed || galaxy.enterprise.check_stranded() {
if galaxy.enterprise.destroyed || galaxy.enterprise.check_stranded() || galaxy.stardate >= galaxy.final_stardate {
view::end_game_failure(&galaxy);
// todo check if can restart
if galaxy.remaining_klingons() > 0 && galaxy.remaining_starbases() > 0 && galaxy.stardate < galaxy.final_stardate {
view::replay();
let result = prompt("");
if result.len() > 0 && result[0].to_uppercase() == "AYE" {
galaxy.enterprise = Galaxy::new_captain(&galaxy.quadrants);
continue;
}
}
break;
} else if galaxy.remaining_klingons() == 0 {
let efficiency = 1000.0 * f32::powi(initial_klingons as f32 / (galaxy.stardate - initial_stardate), 2);
view::congratulations(efficiency);
break;
}
// todo check for victory
}
}

View File

@@ -101,7 +101,7 @@ impl Enterprise {
}
pub fn check_stranded(&self) -> bool {
if self.total_energy < 10 || (self.total_energy - self.shields < 10 && self.damaged.contains_key(systems::SHIELD_CONTROL)) {
if self.total_energy < 10 || (self.shields + 10 > self.total_energy && self.damaged.contains_key(systems::SHIELD_CONTROL)) {
view::stranded();
return true;
}
@@ -213,28 +213,35 @@ impl Galaxy {
let quadrants = Self::generate_quadrants();
let mut rng = rand::thread_rng();
let enterprise_quadrant = Pos(rng.gen_range(0..8), rng.gen_range(0..8));
let enterprise_sector = quadrants[enterprise_quadrant.as_index()].find_empty_sector();
let stardate = rng.gen_range(20..=40) as f32 * 100.0;
let enterprise = Self::new_captain(&quadrants);
let mut scanned = HashSet::new();
scanned.insert(enterprise_quadrant);
scanned.insert(enterprise.quadrant);
Galaxy {
stardate,
final_stardate: stardate + rng.gen_range(25..=35) as f32,
quadrants: quadrants,
scanned: scanned,
enterprise: Enterprise {
destroyed: false,
damaged: HashMap::new(),
quadrant: enterprise_quadrant,
sector: enterprise_sector,
photon_torpedoes: MAX_PHOTON_TORPEDOES,
total_energy: MAX_ENERGY,
shields: 0 }
enterprise: enterprise
}
}
}
pub fn new_captain(quadrants: &Vec<Quadrant>) -> Enterprise {
let mut rng = rand::thread_rng();
let enterprise_quadrant = Pos(rng.gen_range(0..8), rng.gen_range(0..8));
let enterprise_sector = quadrants[enterprise_quadrant.as_index()].find_empty_sector();
Enterprise {
destroyed: false,
damaged: HashMap::new(),
quadrant: enterprise_quadrant,
sector: enterprise_sector,
photon_torpedoes: MAX_PHOTON_TORPEDOES,
total_energy: MAX_ENERGY,
shields: 0 }
}
fn generate_quadrants() -> Vec<Quadrant> {
let mut rng = rand::thread_rng();

View File

@@ -417,7 +417,7 @@ pub fn galaxy_region_map() {
}
}
pub(crate) fn galaxy_scanned_map(galaxy: &Galaxy) {
pub fn galaxy_scanned_map(galaxy: &Galaxy) {
println!(
"Computer record of galaxy for quadrant {}
1 2 3 4 5 6 7 8
@@ -477,3 +477,20 @@ pub fn klingon_remaining_energy(energy: f32) {
pub fn klingon_destroyed() {
println!(" Target Destroyed!") // not standard for game but feedback is good. Sorry Mr. Roddenberry
}
pub fn congratulations(efficiency: f32) {
println!("
Congratulations, Captain! The last Klingon battle cruiser
menacing the Federation has been destroyed.
Your efficiency rating is {efficiency}.
")
}
pub fn replay() {
println!("
The Federation is in need of a new starship commander
for a similar mission -- if there is a volunteer
let him step forward and enter 'Aye'")
}

View File

@@ -37,7 +37,10 @@ Started after movement and display of stats was finished (no energy management o
- [x] 5 - galactic name map
- [ ] restarting the game
- after defeat
- and by resigning
- [ ] time progression
- check all areas where time should move, and adjust accordingly
- [ ] defeat due to time expired
- [ ] intro instructions
- [ ] victory