summaryrefslogtreecommitdiff
path: root/src/bin/web.rs
blob: 166e3b23b5a5d58fc9de311dd64525a7eef4fe3b (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
71
72
73
#[macro_use]
extern crate stdweb;
extern crate darkcloud2_levelgen;

use rand::{Rng, SeedableRng};
use rand::rngs::SmallRng;

use darkcloud2_levelgen::canvas::render_level;
use darkcloud2_levelgen::{random_dungeon, create_templates};

use stdweb::traits::*;
use stdweb::unstable::TryInto;
use stdweb::web::{
    document,
    window,
    CanvasRenderingContext2d
};

use stdweb::web::event::{
    MouseMoveEvent,
    ResizeEvent,
    ClickEvent,
};

use stdweb::web::html_element::CanvasElement;

macro_rules! enclose {
    ( ($( $x:ident ),*) $y:expr ) => {
        {
            $(let $x = $x.clone();)*
            $y
        }
    };
}

static mut CANVAS: Option<CanvasRenderingContext2d> = None;
static mut RNG: Option<SmallRng> = None;

fn draw_new_level() {
    unsafe {
        let mut canvas = CANVAS.as_mut().unwrap();
        let mut rng = RNG.as_mut().unwrap();
        canvas.clear_rect(0.0, 0.0, 1000.0, 1000.0);
        let templates = create_templates();
        let mut l = random_dungeon(&templates, &mut rng);
        while l.is_err() {
            l = random_dungeon(&templates, &mut rng);

        }
        let level = l.unwrap();
        render_level(&mut canvas, &level);
    }
}

fn main() {
    stdweb::initialize();

    let mut rng = SmallRng::from_seed([14;16]);
    unsafe { RNG = Some(rng); }

    let canvas: CanvasElement = document().query_selector( "#canvas" ).unwrap().unwrap().try_into().unwrap();
    let mut context: CanvasRenderingContext2d = canvas.get_context().unwrap();
    unsafe { CANVAS = Some(context); }
    draw_new_level();

    let new = document().query_selector("#new").unwrap().unwrap();

    new.add_event_listener(|_: ClickEvent| {
        draw_new_level()
    });

    stdweb::event_loop();
}