2024-07-06 20:23:25 +00:00
|
|
|
#![warn(rust_2018_idioms)]
|
|
|
|
#![deny(clippy::wildcard_imports)]
|
|
|
|
#![forbid(elided_lifetimes_in_paths, unsafe_code)]
|
|
|
|
|
|
|
|
mod assets {
|
|
|
|
include!(env!("ASSETS_RS"));
|
|
|
|
}
|
|
|
|
|
2024-07-06 13:33:58 +02:00
|
|
|
mod activities;
|
2024-07-05 23:10:25 +02:00
|
|
|
mod game;
|
2024-07-06 20:45:05 +00:00
|
|
|
mod ui;
|
2024-07-05 23:10:25 +02:00
|
|
|
|
2024-07-06 20:23:25 +00:00
|
|
|
use self::{
|
|
|
|
activities::{house::HouseState, overworld::worldgen::Overworld, Activity},
|
2024-07-06 20:45:05 +00:00
|
|
|
assets::Assets,
|
|
|
|
game::Ghost
|
2024-07-06 20:23:25 +00:00
|
|
|
};
|
|
|
|
use comfy::{
|
|
|
|
init_game_config, pollster, run_comfy_main_async, EngineContext, EngineState,
|
2024-07-07 11:21:08 +00:00
|
|
|
GameConfig, GameLoop, HashMap, IVec2
|
2024-07-06 20:23:25 +00:00
|
|
|
};
|
2024-07-05 23:10:25 +02:00
|
|
|
|
|
|
|
const GAME_NAME: &str = "Powercreep";
|
|
|
|
|
2024-07-06 17:59:56 +00:00
|
|
|
#[derive(Debug, Default)]
|
2024-07-06 13:33:58 +02:00
|
|
|
struct State {
|
2024-07-06 20:23:25 +00:00
|
|
|
setup_called: bool,
|
2024-07-06 17:59:56 +00:00
|
|
|
activity: Activity,
|
2024-07-06 20:45:05 +00:00
|
|
|
ghost: Ghost,
|
2024-07-06 20:23:25 +00:00
|
|
|
overworld: Overworld,
|
2024-07-07 11:21:08 +00:00
|
|
|
houses: HashMap<IVec2, HouseState>,
|
2024-07-07 12:02:48 +02:00
|
|
|
score: f32
|
2024-07-06 13:33:58 +02:00
|
|
|
}
|
2024-07-05 23:10:25 +02:00
|
|
|
|
2024-07-07 11:21:08 +00:00
|
|
|
impl State {
|
|
|
|
fn get_house_pos(&self) -> Option<IVec2> {
|
|
|
|
match self.activity {
|
|
|
|
Activity::House(pos) => Some(pos),
|
|
|
|
_ => None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn house(&self) -> Option<&HouseState> {
|
|
|
|
self.houses.get(&self.get_house_pos().unwrap())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn house_mut(&mut self) -> &mut HouseState {
|
|
|
|
self.houses
|
|
|
|
.entry(self.get_house_pos().unwrap())
|
|
|
|
.or_insert_with(HouseState::default)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-07-05 23:10:25 +02:00
|
|
|
impl GameLoop for State {
|
|
|
|
fn new(_c: &mut EngineState) -> Self {
|
2024-07-06 13:33:58 +02:00
|
|
|
Self::default()
|
2024-07-05 23:10:25 +02:00
|
|
|
}
|
|
|
|
|
2024-07-06 20:23:25 +00:00
|
|
|
fn update(&mut self, engine: &mut EngineContext<'_>) {
|
|
|
|
if !self.setup_called {
|
|
|
|
setup(engine);
|
|
|
|
self.setup_called = true;
|
|
|
|
}
|
|
|
|
|
2024-07-05 23:10:25 +02:00
|
|
|
game::update(self, engine);
|
|
|
|
game::draw(self, engine);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn config(config: GameConfig) -> GameConfig {
|
|
|
|
config
|
|
|
|
}
|
|
|
|
|
2024-07-06 20:23:25 +00:00
|
|
|
fn setup(ctx: &mut EngineContext<'_>) {
|
|
|
|
Assets::load(ctx);
|
|
|
|
}
|
|
|
|
|
2024-07-05 23:10:25 +02:00
|
|
|
async fn run() {
|
|
|
|
init_game_config(GAME_NAME.to_string(), env!("CARGO_PKG_VERSION"), config);
|
|
|
|
let mut engine = EngineState::new();
|
|
|
|
let game = State::new(&mut engine);
|
|
|
|
run_comfy_main_async(game, engine).await;
|
|
|
|
}
|
2024-07-05 19:01:09 +02:00
|
|
|
|
|
|
|
fn main() {
|
2024-07-05 23:10:25 +02:00
|
|
|
pollster::block_on(run());
|
|
|
|
}
|