summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs77
1 files changed, 75 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index 66044bc..0ebd6ae 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -264,7 +264,35 @@ impl Default for Bag {
}
}
+enum Parameter {
+ Bool(bool),
+ Int(i32),
+}
+
+enum MenuAction {
+ Run,
+ Quit,
+}
+
+enum MenuContent {
+ Menu(Vec<Menu>),
+ Action(MenuAction),
+ Parameter(Parameter),
+}
+
+struct Menu {
+ name: &'static str,
+ content: MenuContent,
+}
+
+enum GameState {
+ Menu,
+ InGame,
+}
+
struct Game {
+ state: GameState,
+ menu: Vec<Menu>,
field: Field,
figure: Figure,
x: isize,
@@ -279,6 +307,16 @@ struct Game {
impl Default for Game {
#[inline]
fn default() -> Self {
+ let menu = vec![
+ Menu{
+ name: "Play",
+ content: MenuContent::Action(MenuAction::Run),
+ },
+ Menu{
+ name: "Quit",
+ content: MenuContent::Action(MenuAction::Quit),
+ },
+ ];
let mut bag = Bag::default();
let figure_on_hold = Figure::from_kind(bag.next());
let figure = Figure::from_kind(bag.next());
@@ -289,6 +327,8 @@ impl Default for Game {
Figure::from_kind(bag.next()),
];
Self {
+ state: GameState::Menu,
+ menu,
field: Field::default(),
figure,
x: 3,
@@ -318,6 +358,7 @@ impl Game {
}
self.stop_place_timeout();
}
+
fn hold_figure(&mut self) {
(self.figure_on_hold, self.figure) = (
Figure::from_kind(self.figure.kind.clone()),
@@ -325,22 +366,27 @@ impl Game {
);
(self.x, self.y) = (3, 17);
}
+
fn reset_fall_timeout(&mut self) {
self.fall_timeout = Timeout::from_duration(std::time::Duration::from_millis(500));
}
+
fn start_place_timeout(&mut self) {
self.place_timeout = Some(Timeout::from_duration(std::time::Duration::from_millis(
500,
)));
}
+
fn stop_place_timeout(&mut self) {
self.place_timeout = None
}
+
fn reset_place_timeout(&mut self) {
if self.place_timeout.is_some() {
self.start_place_timeout();
}
}
+
fn handle_input(&mut self, c: char) -> Option<StepResult> {
match c {
'q' => return Some(StepResult::Quit),
@@ -386,6 +432,7 @@ impl Game {
self.reset_place_timeout();
Some(StepResult::StateChanged)
}
+
fn advance_figure(&mut self) {
if self.field.has_collision(&self.figure, self.x, self.y - 1) {
self.place_figure();
@@ -399,7 +446,8 @@ impl Game {
}
self.reset_fall_timeout();
}
- fn step(&mut self, c_optional: Option<char>) -> Option<StepResult> {
+
+ fn step_game(&mut self, c_optional: Option<char>) -> Option<StepResult> {
let handle_input_result = if let Some(c) = c_optional {
self.handle_input(c)
} else {
@@ -424,6 +472,19 @@ impl Game {
handle_input_result
}
}
+
+ fn step_menu(&mut self, c_optional: Option<char>) -> Option<StepResult> {
+ // TODO
+ self.state = GameState::InGame;
+ None
+ }
+
+ fn step(&mut self, c_optional: Option<char>) -> Option<StepResult> {
+ match self.state {
+ GameState::Menu => self.step_menu(c_optional),
+ GameState::InGame => self.step_game(c_optional),
+ }
+ }
}
struct Tui {
@@ -492,7 +553,7 @@ impl Tui {
print!("|");
}
- fn display_game(&self, game: &Game) {
+ fn display_game_ingame(&self, game: &Game) {
self.cursor_to_home();
let mut field = game.field.clone();
let mut ghost = game.figure.clone();
@@ -519,6 +580,17 @@ impl Tui {
}
}
+ fn display_game_menu(&self, game: &Game) {
+ // TODO
+ }
+
+ fn display_game(&self, game: &Game) {
+ match game.state {
+ GameState::Menu => self.display_game_menu(game),
+ GameState::InGame => self.display_game_ingame(game),
+ }
+ }
+
fn clear_screen(&self) {
print!("\x1B[2J");
}
@@ -560,6 +632,7 @@ impl Default for Tui {
impl Drop for Tui {
fn drop(&mut self) {
self.show_cursor();
+ self.cursor_to_home();
termios::tcsetattr(0, termios::TCSADRAIN, &self.state).unwrap();
}
}