mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-28 21:54:17 -08:00
work on phaser control
everything but destruction of klingons
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
use rand::Rng;
|
||||
|
||||
use crate::{model::{Galaxy, Pos, COURSES, EndPosition, self, Enterprise, systems}, view, input};
|
||||
use crate::{model::{Galaxy, Pos, COURSES, EndPosition, self, Enterprise, systems}, view, input::{self, prompt_value, param_or_prompt_value}};
|
||||
|
||||
pub fn perform_short_range_scan(galaxy: &Galaxy) {
|
||||
if galaxy.enterprise.damaged.contains_key(model::systems::SHORT_RANGE_SCAN) {
|
||||
if galaxy.enterprise.damaged.contains_key(systems::SHORT_RANGE_SCAN) {
|
||||
view::scanners_out();
|
||||
return;
|
||||
}
|
||||
@@ -13,7 +13,7 @@ pub fn perform_short_range_scan(galaxy: &Galaxy) {
|
||||
|
||||
pub fn get_amount_and_set_shields(galaxy: &mut Galaxy, provided: Vec<String>) {
|
||||
|
||||
if galaxy.enterprise.damaged.contains_key(model::systems::SHIELD_CONTROL) {
|
||||
if galaxy.enterprise.damaged.contains_key(systems::SHIELD_CONTROL) {
|
||||
view::inoperable(&systems::name_for(systems::SHIELD_CONTROL));
|
||||
return;
|
||||
}
|
||||
@@ -47,7 +47,7 @@ pub fn gather_dir_and_speed_then_move(galaxy: &mut Galaxy, provided: Vec<String>
|
||||
let course = course.unwrap();
|
||||
|
||||
let mut max_warp = 8.0;
|
||||
if galaxy.enterprise.damaged.contains_key(model::systems::WARP_ENGINES) {
|
||||
if galaxy.enterprise.damaged.contains_key(systems::WARP_ENGINES) {
|
||||
max_warp = 0.2;
|
||||
}
|
||||
|
||||
@@ -204,7 +204,7 @@ fn move_klingons_and_fire(galaxy: &mut Galaxy) {
|
||||
}
|
||||
|
||||
pub fn display_damage_control(enterprise: &Enterprise) {
|
||||
if enterprise.damaged.contains_key(model::systems::DAMAGE_CONTROL) {
|
||||
if enterprise.damaged.contains_key(systems::DAMAGE_CONTROL) {
|
||||
view::inoperable(&systems::name_for(systems::DAMAGE_CONTROL));
|
||||
return;
|
||||
}
|
||||
@@ -218,7 +218,7 @@ pub fn display_damage_control(enterprise: &Enterprise) {
|
||||
}
|
||||
|
||||
pub fn perform_long_range_scan(galaxy: &mut Galaxy) {
|
||||
if galaxy.enterprise.damaged.contains_key(model::systems::LONG_RANGE_SCAN) {
|
||||
if galaxy.enterprise.damaged.contains_key(systems::LONG_RANGE_SCAN) {
|
||||
view::inoperable(&systems::name_for(systems::LONG_RANGE_SCAN));
|
||||
return;
|
||||
}
|
||||
@@ -230,7 +230,7 @@ pub fn perform_long_range_scan(galaxy: &mut Galaxy) {
|
||||
}
|
||||
|
||||
pub fn access_computer(galaxy: &Galaxy, provided: Vec<String>) {
|
||||
if galaxy.enterprise.damaged.contains_key(model::systems::COMPUTER) {
|
||||
if galaxy.enterprise.damaged.contains_key(systems::COMPUTER) {
|
||||
view::inoperable(&systems::name_for(systems::COMPUTER));
|
||||
return;
|
||||
}
|
||||
@@ -251,4 +251,52 @@ pub fn access_computer(galaxy: &Galaxy, provided: Vec<String>) {
|
||||
5 => view::galaxy_region_map(),
|
||||
_ => todo!() // todo implement others
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_power_and_fire_phasers(galaxy: &mut Galaxy, provided: Vec<String>) {
|
||||
if galaxy.enterprise.damaged.contains_key(systems::PHASERS) {
|
||||
view::inoperable(&systems::name_for(systems::PHASERS));
|
||||
return;
|
||||
}
|
||||
|
||||
let quadrant = &mut galaxy.quadrants[galaxy.enterprise.quadrant.as_index()];
|
||||
if quadrant.klingons.len() == 0 {
|
||||
view::no_local_enemies();
|
||||
return;
|
||||
}
|
||||
|
||||
let computer_damaged = galaxy.enterprise.damaged.contains_key(systems::COMPUTER);
|
||||
if computer_damaged {
|
||||
view::computer_accuracy_issue();
|
||||
}
|
||||
|
||||
let available_energy = galaxy.enterprise.total_energy - galaxy.enterprise.shields;
|
||||
view::phasers_locked(available_energy);
|
||||
let mut power: f32;
|
||||
loop {
|
||||
let setting = param_or_prompt_value(&provided, 0, "Number of units to fire", 0, available_energy);
|
||||
if setting.is_some() {
|
||||
power = setting.unwrap() as f32;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if power == 0.0 {
|
||||
return;
|
||||
}
|
||||
|
||||
galaxy.enterprise.total_energy -= power as u16;
|
||||
|
||||
let mut rng = rand::thread_rng();
|
||||
if computer_damaged {
|
||||
power *= rng.gen::<f32>();
|
||||
}
|
||||
|
||||
let per_enemy = power / quadrant.klingons.len() as f32;
|
||||
|
||||
// fire on each klingon
|
||||
|
||||
for klingon in &mut quadrant.klingons {
|
||||
klingon.fire_on(&mut galaxy.enterprise)
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
use std::process::exit;
|
||||
|
||||
use model::Galaxy;
|
||||
use model::{Galaxy, systems};
|
||||
|
||||
mod input;
|
||||
mod model;
|
||||
@@ -26,12 +26,13 @@ fn main() {
|
||||
continue;
|
||||
}
|
||||
match command[0].to_uppercase().as_str() { // order is weird because i built it in this order :)
|
||||
model::systems::SHORT_RANGE_SCAN => commands::perform_short_range_scan(&galaxy),
|
||||
model::systems::WARP_ENGINES => commands::gather_dir_and_speed_then_move(&mut galaxy, command[1..].into()),
|
||||
model::systems::SHIELD_CONTROL => commands::get_amount_and_set_shields(&mut galaxy, command[1..].into()),
|
||||
model::systems::DAMAGE_CONTROL => commands::display_damage_control(&galaxy.enterprise),
|
||||
model::systems::LONG_RANGE_SCAN => commands::perform_long_range_scan(&mut galaxy),
|
||||
model::systems::COMPUTER => commands::access_computer(&galaxy, command[1..].into()),
|
||||
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::display_damage_control(&galaxy.enterprise),
|
||||
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()),
|
||||
_ => view::print_command_help()
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@ pub struct Klingon {
|
||||
|
||||
impl Klingon {
|
||||
pub fn fire_on(&mut self, enterprise: &mut Enterprise) {
|
||||
// todo check if enterprise is protected
|
||||
|
||||
let mut rng = rand::thread_rng();
|
||||
let attack_strength = rng.gen::<f32>();
|
||||
let dist_to_enterprise = self.sector.abs_diff(enterprise.sector) as f32;
|
||||
@@ -112,9 +114,10 @@ pub mod systems {
|
||||
pub const DAMAGE_CONTROL: &str = "DAM";
|
||||
pub const LONG_RANGE_SCAN: &str = "LRS";
|
||||
pub const COMPUTER: &str = "COM";
|
||||
pub const PHASERS: &str = "PHA";
|
||||
|
||||
pub const KEYS: [&str; 6] = [
|
||||
SHORT_RANGE_SCAN, WARP_ENGINES, SHIELD_CONTROL, DAMAGE_CONTROL, LONG_RANGE_SCAN, COMPUTER
|
||||
pub const KEYS: [&str; 7] = [
|
||||
SHORT_RANGE_SCAN, WARP_ENGINES, SHIELD_CONTROL, DAMAGE_CONTROL, LONG_RANGE_SCAN, COMPUTER, PHASERS
|
||||
];
|
||||
|
||||
pub fn name_for(key: &str) -> String {
|
||||
@@ -125,6 +128,7 @@ pub mod systems {
|
||||
DAMAGE_CONTROL => "Damage Control".into(),
|
||||
LONG_RANGE_SCAN => "Long Range Scanners".into(),
|
||||
COMPUTER => "Library-Computer".into(),
|
||||
PHASERS => "Phaser Control".into(),
|
||||
_ => "Unknown".into()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,3 +425,17 @@ pub(crate) fn galaxy_scanned_map(galaxy: &Galaxy) {
|
||||
"\n ----- ----- ----- ----- ----- ----- ----- -----")
|
||||
}
|
||||
}
|
||||
|
||||
pub fn no_local_enemies() {
|
||||
println!(
|
||||
"Science Officer Spock reports, 'Sensors show no enemy ships
|
||||
in this quadrant'")
|
||||
}
|
||||
|
||||
pub fn computer_accuracy_issue() {
|
||||
println!("Computer failure hampers accuracy")
|
||||
}
|
||||
|
||||
pub fn phasers_locked(available_energy: u16) {
|
||||
println!("Phasers locked on target; Energy available = {available_energy} units")
|
||||
}
|
||||
|
||||
@@ -22,12 +22,14 @@ Started after movement and display of stats was finished (no energy management o
|
||||
- also, movement courses could be floats, according to the instructions, allowing for more precise movement and aiming
|
||||
- [x] better command reading - support entering multiple values on a line (e.g. nav 3 0.1)
|
||||
- [ ] starbases
|
||||
- [ ] repair
|
||||
- [ ] proximity detection for docking
|
||||
- [ ] repair on damage control
|
||||
- [ ] protection from shots
|
||||
- [ ] weapons
|
||||
- [ ] phasers
|
||||
- [ ] torpedoes
|
||||
- [ ] computer
|
||||
- [ ] 0 - output of all short and long range scans (requires tracking if a system has been scanned)
|
||||
- [x] 0 - output of all short and long range scans (requires tracking if a system has been scanned)
|
||||
- [ ] 1 - klingons, starbases, stardate and damage control
|
||||
- [ ] 2 - photon torpedo data: direction and distance to all local klingons
|
||||
- [ ] 3 - starbase distance and dir locally
|
||||
|
||||
Reference in New Issue
Block a user