work on nav command

this involves architectural shifts
This commit is contained in:
Christopher
2023-02-28 13:53:38 +13:00
parent c35736c5c8
commit 31b9834a7c
4 changed files with 73 additions and 21 deletions

View File

@@ -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")
}

View File

@@ -36,7 +36,9 @@ pub struct Enterprise {
}
pub enum GameStatus {
ShortRangeScan
ShortRangeScan,
NeedDirectionForNav,
NeedSpeedForNav(u8),
}
impl Galaxy {

View File

@@ -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
}
}
}
}

View File

@@ -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);
},
_ => ()
}
}