mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-01-08 03:12:26 -08:00
work on nav command
this involves architectural shifts
This commit is contained in:
@@ -17,35 +17,63 @@ fn main() {
|
||||
}
|
||||
|
||||
fn wait_for_command(game_status: &GameStatus) -> Message {
|
||||
let stdin = stdin();
|
||||
let mut stdout = stdout();
|
||||
loop {
|
||||
match game_status {
|
||||
_ => {
|
||||
print!("Command? ");
|
||||
let _ = stdout.flush();
|
||||
|
||||
let mut buffer = String::new();
|
||||
if let Ok(_) = stdin.read_line(&mut buffer) {
|
||||
let text = buffer.trim_end();
|
||||
if let Some(msg) = as_message(text, game_status) {
|
||||
return msg
|
||||
}
|
||||
print_command_help();
|
||||
GameStatus::NeedDirectionForNav => {
|
||||
let text = prompt("Course (1-9)?");
|
||||
if let Some(msg) = as_message(&text, game_status) {
|
||||
return msg
|
||||
}
|
||||
},
|
||||
GameStatus::NeedSpeedForNav(_) => {
|
||||
let text = prompt("Warp Factor (0-8)?");
|
||||
if let Some(msg) = as_message(&text, game_status) {
|
||||
return msg
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
let text = prompt("Command?");
|
||||
if let Some(msg) = as_message(&text, game_status) {
|
||||
return msg
|
||||
}
|
||||
print_command_help();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn as_message(text: &str, game_status: &GameStatus) -> Option<Message> {
|
||||
if text == "" {
|
||||
return None
|
||||
fn prompt(prompt: &str) -> String {
|
||||
let stdin = stdin();
|
||||
let mut stdout = stdout();
|
||||
|
||||
print!("{prompt} ");
|
||||
let _ = stdout.flush();
|
||||
|
||||
let mut buffer = String::new();
|
||||
if let Ok(_) = stdin.read_line(&mut buffer) {
|
||||
return buffer.trim_end().into();
|
||||
}
|
||||
"".into()
|
||||
}
|
||||
|
||||
fn as_message(text: &str, game_status: &GameStatus) -> Option<Message> {
|
||||
match game_status {
|
||||
GameStatus::NeedDirectionForNav => {
|
||||
match text.parse::<u8>() {
|
||||
Ok(n) if (n >= 1 && n <= 8) => Some(Message::DirectionForNav(n)),
|
||||
_ => None
|
||||
}
|
||||
},
|
||||
GameStatus::NeedSpeedForNav(dir) => {
|
||||
match text.parse::<u8>() {
|
||||
Ok(n) if (n >= 1 && n <= 8) => Some(Message::DirectionAndSpeedForNav(*dir, n)),
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
match text {
|
||||
"SRS" => Some(Message::RequestShortRangeScan),
|
||||
"NAV" => Some(Message::RequestNavigation),
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
@@ -53,5 +81,5 @@ fn as_message(text: &str, game_status: &GameStatus) -> Option<Message> {
|
||||
}
|
||||
|
||||
fn print_command_help() {
|
||||
println!("valid commands are just SRS at the mo")
|
||||
println!("valid commands are just SRS and NAV at the mo")
|
||||
}
|
||||
@@ -36,7 +36,9 @@ pub struct Enterprise {
|
||||
}
|
||||
|
||||
pub enum GameStatus {
|
||||
ShortRangeScan
|
||||
ShortRangeScan,
|
||||
NeedDirectionForNav,
|
||||
NeedSpeedForNav(u8),
|
||||
}
|
||||
|
||||
impl Galaxy {
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
use crate::model::{Galaxy, GameStatus};
|
||||
|
||||
pub enum Message {
|
||||
RequestShortRangeScan
|
||||
RequestShortRangeScan,
|
||||
RequestNavigation,
|
||||
DirectionForNav (u8),
|
||||
DirectionAndSpeedForNav (u8, u8),
|
||||
}
|
||||
|
||||
pub fn update(message: Message, model: Galaxy) -> Galaxy {
|
||||
@@ -10,6 +13,24 @@ pub fn update(message: Message, model: Galaxy) -> Galaxy {
|
||||
Galaxy {
|
||||
game_status: GameStatus::ShortRangeScan,
|
||||
..model
|
||||
},
|
||||
Message::RequestNavigation => {
|
||||
Galaxy {
|
||||
game_status: GameStatus::NeedDirectionForNav,
|
||||
..model
|
||||
}
|
||||
},
|
||||
Message::DirectionForNav(dir) => {
|
||||
Galaxy {
|
||||
game_status: GameStatus::NeedSpeedForNav(dir),
|
||||
..model
|
||||
}
|
||||
},
|
||||
Message::DirectionAndSpeedForNav(dir, speed) => {
|
||||
Galaxy {
|
||||
game_status: GameStatus::ShortRangeScan,
|
||||
..model
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,9 @@ pub fn view(model: &Galaxy) {
|
||||
match model.game_status {
|
||||
GameStatus::ShortRangeScan => {
|
||||
let quadrant = &model.quadrants[model.enterprise.sector.as_index()];
|
||||
render_quadrant(&model.enterprise.sector, quadrant)
|
||||
}
|
||||
render_quadrant(&model.enterprise.sector, quadrant);
|
||||
},
|
||||
_ => ()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user