aboutsummaryrefslogtreecommitdiff
path: root/src/gameloop.rs
blob: d573868a9e7bb94a6a54f4f5c3844dc94de76d77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use crate::generation::*;

use colored::Colorize;
use crossterm::{
    cursor::{Hide, MoveTo, Show},
    event,
    event::{poll, Event, KeyCode, KeyEvent},
    style::Stylize,
    terminal,
    terminal::{EnterAlternateScreen, LeaveAlternateScreen},
    ExecutableCommand, QueueableCommand,
};
use rand::{thread_rng, Rng};
use std::{
    io::{self, Write},
    thread::sleep,
    time::Duration,
};


pub fn run() {
    let mut stdout = io::stdout();
    let mut frame: Gen = new_gen();
    let mut nxt;

    terminal::enable_raw_mode().unwrap();
    stdout.execute(EnterAlternateScreen).unwrap();
    stdout.execute(Hide).unwrap();

    'gameloop: loop {
        while event::poll(Duration::default()).unwrap() {
            if let Event::Key(key_event) = event::read().unwrap() {
                match key_event.code {
                    KeyCode::Esc | KeyCode::Char('q') => {
                        break 'gameloop;
                    }
                    KeyCode::Char('s') => {
                        frame = new_gen();
                        render_gen(&mut stdout, &frame)
                    }

                    KeyCode::Char('n') => {
                        nxt = next_gen(&mut frame);
                        render_gen(&mut stdout, &nxt)
                    }
                    KeyCode::Char('a') => 'animate: loop {
                        nxt = next_gen(&mut frame);
                        render_gen(&mut stdout, &nxt);
                        sleep(Duration::from_millis(16));
                        if (poll(Duration::from_millis(1))).unwrap() {
                            if let Event::Key(k) = event::read().unwrap() {
                                match k.code {
                                    KeyCode::Char('q') => break 'animate,
                                    _ => {}
                                }
                            }
                        } else {
                        }
                    },
                    _ => {}
                }
            }
        }
    }

    stdout.execute(Show).unwrap();
    stdout.execute(LeaveAlternateScreen).unwrap();
    terminal::disable_raw_mode().unwrap();

}