mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-29 14:15:08 -08:00
71 lines
2.8 KiB
Rust
71 lines
2.8 KiB
Rust
use std::process::exit;
|
|
|
|
use input::{prompt, prompt_yes_no};
|
|
use model::{Galaxy, systems};
|
|
|
|
mod input;
|
|
mod model;
|
|
mod commands;
|
|
mod view;
|
|
|
|
fn main() {
|
|
ctrlc::set_handler(move || { exit(0) })
|
|
.expect("Error setting Ctrl-C handler");
|
|
|
|
view::title();
|
|
if prompt_yes_no(view::prompts::INSTRUCTIONS) {
|
|
view::full_instructions();
|
|
let _ = input::prompt(view::prompts::WHEN_READY);
|
|
}
|
|
|
|
let mut galaxy = Galaxy::generate_new();
|
|
let initial_klingons = galaxy.remaining_klingons();
|
|
let initial_stardate = galaxy.stardate;
|
|
|
|
view::enterprise();
|
|
view::intro(&galaxy);
|
|
let _ = input::prompt(view::prompts::WHEN_READY);
|
|
|
|
view::starting_quadrant(galaxy.enterprise.quadrant);
|
|
view::short_range_scan(&galaxy);
|
|
|
|
loop {
|
|
let command = input::prompt(view::prompts::COMMAND);
|
|
if command.len() == 0 {
|
|
continue;
|
|
}
|
|
match command[0].to_uppercase().as_str() { // order is weird because i built it in this order :)
|
|
systems::SHORT_RANGE_SCAN => commands::perform_short_range_scan(&galaxy),
|
|
systems::WARP_ENGINES => commands::gather_dir_and_speed_then_move(&mut galaxy, command[1..].into()),
|
|
systems::SHIELD_CONTROL => commands::get_amount_and_set_shields(&mut galaxy, command[1..].into()),
|
|
systems::DAMAGE_CONTROL => {
|
|
commands::run_damage_control(&galaxy);
|
|
commands::try_starbase_ship_repair(&mut galaxy);
|
|
}
|
|
systems::LONG_RANGE_SCAN => commands::perform_long_range_scan(&mut galaxy),
|
|
systems::COMPUTER => commands::access_computer(&galaxy, command[1..].into()),
|
|
systems::PHASERS => commands::get_power_and_fire_phasers(&mut galaxy, command[1..].into()),
|
|
systems::TORPEDOES => commands::gather_dir_and_launch_torpedo(&mut galaxy, command[1..].into()),
|
|
systems::RESIGN => galaxy.enterprise.destroyed = true,
|
|
_ => view::print_command_help()
|
|
}
|
|
|
|
if galaxy.enterprise.destroyed || galaxy.enterprise.is_stranded() || galaxy.stardate >= galaxy.final_stardate {
|
|
view::end_game_failure(&galaxy);
|
|
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;
|
|
}
|
|
}
|
|
}
|