98 lines
3.9 KiB
Rust
98 lines
3.9 KiB
Rust
//! This file is the main entry point for the game logic.
|
|
//!
|
|
//! ## Overview
|
|
//!
|
|
//! The main function in this module is `entrypoint()`. This is called from `desktop_wrapper` to start the game.
|
|
//!
|
|
//! This module also includes all the other sub-modules of the game. If you are viewing this document from the web, click on the modules below to see more info.
|
|
//!
|
|
//! ## Programming Guide
|
|
//!
|
|
//! The game code is split into two parts: the core code, and the actual game logic.
|
|
//!
|
|
//! [@ewpratten](https://github.com/ewpratten) has written most of the core code to bootstrap the game, and provide convenience functions.
|
|
//! This stuff probably won't need to be touched.
|
|
//! Most of the game logic is expected to live in `src/scenes` and `src/model` (rendering and data).
|
|
//!
|
|
//! ## Important Functions and Files
|
|
//!
|
|
//! - If you are wanting to write rendering code, check out [`process_ingame_frame`](scenes/fn.process_ingame_frame.html).
|
|
//! - If you want to have something load at the start of the game and stay in memory, check out [`GlobalResources`](global_resource_package/struct.GlobalResources.html).
|
|
//! - If you want to add data to the save state file or settings file, check out the [`persistent`](persistent/index.html) module.
|
|
#![doc(issue_tracker_base_url = "https://github.com/Ewpratten/ludum-dare-50/issues/")]
|
|
|
|
use crate::{
|
|
asset_manager::load_json_structure,
|
|
discord::{DiscordRpcSignal, DiscordRpcThreadHandle},
|
|
project_constants::ProjectConstants,
|
|
};
|
|
|
|
#[macro_use]
|
|
extern crate approx; // For the macro `relative_eq!`
|
|
#[macro_use]
|
|
extern crate log; // For the `info!`, `warn!`, etc. macros
|
|
|
|
pub(crate) mod asset_manager;
|
|
pub(crate) mod discord;
|
|
pub(crate) mod global_resource_package;
|
|
pub(crate) mod persistent;
|
|
pub(crate) mod project_constants;
|
|
pub(crate) mod rendering;
|
|
pub(crate) mod scenes;
|
|
pub(crate) mod model;
|
|
pub(crate) mod coord_convert;
|
|
|
|
/// This is the game logic entrypoint. Despite being async,
|
|
/// this is expected to block the main thread for rendering and stuff.
|
|
///
|
|
/// Setting `force_recreate_savefiles` will cause the game to recreate its settings and savestate files.
|
|
pub async fn entrypoint(force_recreate_savefiles: bool) {
|
|
log::info!("Game main thread handed off to logic crate.");
|
|
|
|
// Load the project constants
|
|
let project_constants: ProjectConstants =
|
|
load_json_structure("project-constants.json").expect("Could not load project constants");
|
|
|
|
// Load the game settings
|
|
let mut settings =
|
|
persistent::settings::PersistentGameSettings::load_or_create(force_recreate_savefiles)
|
|
.expect("Failed to parse game settings from disk. Possibly corrupt file?");
|
|
|
|
// Load the game save state
|
|
let mut save_state =
|
|
persistent::save_state::GameSaveState::load_or_create(force_recreate_savefiles)
|
|
.expect("Failed to parse game save state from disk. Possibly corrupt file?");
|
|
|
|
// Connect to Discord
|
|
let discord = DiscordRpcThreadHandle::new(project_constants.discord.app_id)
|
|
.await
|
|
.expect("Failed to connect to Discord RPC");
|
|
let event_loop_discord_tx = discord.get_channel();
|
|
let discord_task_handle = discord.begin_thread_non_blocking();
|
|
|
|
// Blocking call to the graphics rendering loop.
|
|
rendering::event_loop::handle_graphics_blocking(
|
|
|builder| {
|
|
builder
|
|
.msaa_4x()
|
|
// .vsync()
|
|
.title(project_constants.game_name.as_str())
|
|
.height(project_constants.base_window_size.1 as i32)
|
|
.width(project_constants.base_window_size.0 as i32);
|
|
},
|
|
project_constants.target_fps,
|
|
&project_constants,
|
|
event_loop_discord_tx,
|
|
)
|
|
.await;
|
|
|
|
// Clean up any resources
|
|
settings
|
|
.save()
|
|
.expect("Could not save game settings to disk.");
|
|
save_state
|
|
.save()
|
|
.expect("Could not save game save state to disk.");
|
|
discord_task_handle.abort();
|
|
}
|