mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-24 20:10:15 -08:00
work on victory and retry conditions
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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'")
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user