feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
//! Authoritative game simulation.
|
|
|
|
|
//!
|
|
|
|
|
//! Used by the dedicated server binary and embedded in the client for
|
|
|
|
|
//! singleplayer and hosting. Clients only send intents (see
|
|
|
|
|
//! [`game_core::protocol`]); all game rules run here.
|
|
|
|
|
|
|
|
|
|
pub mod actions;
|
2026-10-18 19:41:58 +00:00
|
|
|
pub mod commands;
|
|
|
|
|
pub mod config;
|
|
|
|
|
pub mod console;
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
pub mod crafting;
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
pub mod embedded;
|
2026-10-18 18:28:16 +00:00
|
|
|
pub mod machines;
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
pub mod movement;
|
|
|
|
|
pub mod network;
|
|
|
|
|
pub mod persistence;
|
|
|
|
|
pub mod players;
|
|
|
|
|
pub mod scripting;
|
|
|
|
|
pub mod survival;
|
|
|
|
|
pub mod world;
|
|
|
|
|
|
2026-10-18 18:47:43 +00:00
|
|
|
use std::{sync::Arc, time::Duration};
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
|
|
|
|
|
use bevy::prelude::*;
|
|
|
|
|
use game_core::GameData;
|
|
|
|
|
|
|
|
|
|
pub use network::NetworkServerPlugin;
|
|
|
|
|
|
|
|
|
|
/// Configuration of the simulation.
|
|
|
|
|
#[derive(Resource, Clone, Debug)]
|
|
|
|
|
pub struct ServerSettings {
|
|
|
|
|
/// Tiled map, relative to the assets directory.
|
|
|
|
|
pub map: String,
|
2026-10-18 18:47:43 +00:00
|
|
|
/// Database and world to persist to. `None` disables saving.
|
|
|
|
|
pub storage: Option<persistence::StorageSettings>,
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
pub autosave_interval: Duration,
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
/// Player id that always has admin rights and bypasses access restrictions
|
|
|
|
|
/// (the host of an embedded server).
|
|
|
|
|
pub owner: Option<String>,
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Default for ServerSettings {
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
map: game_core::DEFAULT_MAP.to_owned(),
|
2026-10-18 18:47:43 +00:00
|
|
|
storage: None,
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
autosave_interval: Duration::from_secs(60),
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
owner: None,
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Runs the game world. Requires [`game_core::CorePlugin`] and the replicon plugins.
|
|
|
|
|
pub struct GameServerPlugin {
|
|
|
|
|
pub settings: ServerSettings,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Plugin for GameServerPlugin {
|
|
|
|
|
fn build(&self, app: &mut App) {
|
|
|
|
|
app.insert_resource(self.settings.clone())
|
|
|
|
|
.insert_resource(persistence::AutosaveTimer(Timer::new(
|
|
|
|
|
self.settings.autosave_interval,
|
|
|
|
|
TimerMode::Repeating,
|
|
|
|
|
)))
|
2026-10-18 19:41:58 +00:00
|
|
|
.init_resource::<config::ServerConfig>()
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
.init_resource::<players::Players>()
|
|
|
|
|
.init_resource::<players::CharacterStore>()
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
.init_resource::<players::RejectedLogins>()
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
.init_resource::<survival::SurvivalTimer>()
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
.add_systems(
|
|
|
|
|
Startup,
|
|
|
|
|
(
|
|
|
|
|
load_scripts,
|
|
|
|
|
world::setup_world.run_if(not(resource_exists::<ServerError>)),
|
|
|
|
|
)
|
|
|
|
|
.chain(),
|
|
|
|
|
)
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
.add_systems(
|
|
|
|
|
FixedUpdate,
|
2026-10-18 18:28:16 +00:00
|
|
|
(
|
|
|
|
|
movement::move_characters,
|
|
|
|
|
survival::tick_survival,
|
|
|
|
|
machines::tick_machines,
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
)
|
|
|
|
|
.run_if(resource_exists::<world::WorldLayout>),
|
|
|
|
|
)
|
|
|
|
|
.add_systems(
|
|
|
|
|
Update,
|
|
|
|
|
(
|
|
|
|
|
persistence::autosave,
|
|
|
|
|
players::enforce_access.run_if(resource_changed::<config::ServerConfig>),
|
2026-10-18 18:28:16 +00:00
|
|
|
),
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
)
|
|
|
|
|
.add_systems(Last, persistence::save_on_exit)
|
|
|
|
|
.add_observer(players::on_login)
|
|
|
|
|
.add_observer(players::on_disconnect)
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
.add_observer(players::on_chat)
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
.add_observer(movement::on_set_move_dir)
|
|
|
|
|
.add_observer(actions::on_pick_up)
|
|
|
|
|
.add_observer(actions::on_drop_item)
|
|
|
|
|
.add_observer(actions::on_use_item)
|
|
|
|
|
.add_observer(actions::on_interact)
|
|
|
|
|
.add_observer(actions::on_craft)
|
|
|
|
|
.add_observer(actions::on_construct)
|
2026-10-18 18:28:16 +00:00
|
|
|
.add_observer(actions::on_deconstruct)
|
|
|
|
|
.add_observer(machines::on_machine_insert)
|
|
|
|
|
.add_observer(machines::on_machine_take);
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
/// Why the server failed to start. Inserted together with an error [`AppExit`].
|
|
|
|
|
#[derive(Resource, Clone, Debug)]
|
|
|
|
|
pub struct ServerError(pub String);
|
|
|
|
|
|
|
|
|
|
/// Reports a fatal startup error and requests exit.
|
|
|
|
|
pub fn fail(commands: &mut Commands, message: String) {
|
|
|
|
|
error!("{message}");
|
|
|
|
|
commands.insert_resource(ServerError(message));
|
|
|
|
|
commands.write_message(AppExit::error());
|
|
|
|
|
}
|
|
|
|
|
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
fn load_scripts(mut commands: Commands, data: Res<GameData>) {
|
|
|
|
|
let dir = game_core::asset_path("scripts");
|
feat!: start menu, file-based UI, machine windows and server access control
- Start menu with new game (optionally hosted), load/delete saves and join
server screens; CLI options skip it.
- Menus and HUD are built from rsn layouts in assets/ui with a shared theme,
bindings, conditional visibility and tooltips.
- Machine windows place slots and backgrounds from the machine's ui
definition; slots are filled from and emptied into the inventory.
- Chat with / commands, pause menu, clickable inventory, craft and build
menus.
- Server passwords, admins, whitelist, bans, kicks and admin commands from
the terminal or chat; changes are written to the config file. The hosting
player is always admin.
- Clients keep a player id in client.toml; characters belong to it.
BREAKING CHANGE: protocol version 3 adds the player id and password to
Login, and characters are keyed by player id instead of name, so characters
in existing worlds are not restored.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 20:29:05 +00:00
|
|
|
let engine = match scripting::ScriptEngine::load(&dir, &data) {
|
|
|
|
|
Ok(engine) => engine,
|
|
|
|
|
Err(e) => return fail(&mut commands, e.to_string()),
|
|
|
|
|
};
|
feat: add persistent-world station game
Bevy ECS workspace with three crates:
- game_core: rsn data definitions, components, Tiled map loader, protocol
- game_server: authoritative simulation, Rune scripting, persistence,
dedicated server binary
- game_client: rendering, UI and input; embeds the server for
singleplayer and hosting
Items, recipes, buildings and skills are defined in assets/data, behavior
in Rune scripts under assets/scripts, and maps are made in Tiled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-18 17:44:13 +00:00
|
|
|
info!("compiled scripts from `{}`", dir.display());
|
|
|
|
|
commands.insert_resource(engine);
|
|
|
|
|
commands.insert_resource(actions::SharedData(Arc::new(data.clone())));
|
|
|
|
|
}
|