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
74
75
76
77
78
79
80
81
82
83
#[macro_use]
extern crate anyhow;
#[macro_use]
extern crate log;

use widgetry::Settings;

mod after_level;
mod animation;
mod before_level;
mod buildings;
mod controls;
mod game;
mod levels;
mod meters;
mod music;
mod player;
mod session;
mod title;
mod vehicles;

type App = map_gui::SimpleApp<session::Session>;
type Transition = widgetry::Transition<App>;

pub fn main() {
    let settings = Settings::new("15-minute Santa");
    run(settings);
}

fn run(mut settings: Settings) {
    let mut opts = map_gui::options::Options::load_or_default();
    opts.color_scheme = map_gui::colors::ColorSchemeChoice::NightMode;
    // Note we don't take any CLI arguments at all. Always start on the first level's map

    settings = settings
        .read_svg(Box::new(abstio::slurp_bytes))
        .window_icon(abstio::path("system/assets/pregame/icon.png"))
        .canvas_settings(opts.canvas_settings.clone());
    widgetry::run(settings, |ctx| {
        let session = session::Session::load();
        session.save();

        map_gui::SimpleApp::new(
            ctx,
            opts,
            abstio::MapName::seattle("qa"),
            None,
            session,
            |ctx, app| {
                if app.opts.dev {
                    app.session.unlock_all();
                }
                app.session.music =
                    music::Music::start(ctx, app.session.play_music, "jingle_bells");
                app.session.music.specify_volume(music::OUT_OF_GAME);

                vec![
                    map_gui::tools::TitleScreen::new_state(
                        ctx,
                        app,
                        map_gui::tools::Executable::Santa,
                        Box::new(|ctx, app, _| title::TitleScreen::new_state(ctx, app)),
                    ),
                    title::TitleScreen::new_state(ctx, app),
                ]
            },
        )
    });
}

#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;

#[cfg(target_arch = "wasm32")]
#[wasm_bindgen(js_name = "run")]
pub fn run_wasm(root_dom_id: String, assets_base_url: String, assets_are_gzipped: bool) {
    let settings = Settings::new("15-minute Santa")
        .root_dom_element_id(root_dom_id)
        .assets_base_url(assets_base_url)
        .assets_are_gzipped(assets_are_gzipped);

    run(settings);
}