allow creating scenes and setting scene visibility to players

This commit is contained in:
Rusty Striker 2025-07-15 20:40:41 +03:00
parent fb5f69850c
commit 668bef6a88
Signed by: RustyStriker
GPG key ID: 87E4D691632DFF15
3 changed files with 58 additions and 5 deletions

View file

@ -48,6 +48,17 @@ pub enum Request {
amount: usize,
},
// Map requests
CreateScene {
title: String,
},
SceneSetGrid {
grid_cell_size: f32,
grid_offset: [f32; 2],
},
SceneSetVisible {
scene: usize,
visible: bool,
},
GetScene {
id: usize,
},

View file

@ -25,6 +25,8 @@ pub trait GameImpl<'a, C: Character<A> + Serialize + Deserialize<'a>, A: entry::
/// the list of available scenes
fn scenes(&self) -> Vec<usize>;
fn get_scene(&self, id: usize) -> Option<&Scene>;
fn create_scene(&mut self, title: String);
fn scene_visible(&mut self, scene: usize, visible: bool);
fn create_token(&mut self, scene_id: usize, character: String, img_source: String, x: f32, y: f32) -> usize;
fn move_token(&mut self, scene_id: usize, token_id: usize, x: f32, y: f32) -> bool;
fn token_info(&self, scene: usize, token_id: usize) -> Option<&TokenInfo>;
@ -187,6 +189,25 @@ impl<'a, C: Character<A> + Serialize + Deserialize<'a>, A: entry::GameEntry + Se
fn get_scene(&self, id: usize) -> Option<&Scene> {
self.scenes.get(&id)
}
fn create_scene(&mut self, title: String) {
let id = self.scenes.keys().max().map(|k| k + 1).unwrap_or(0);
self.scenes.insert(
id,
Scene {
title,
visible_to_users: false,
map: None,
characters: Vec::new(),
},
);
}
fn scene_visible(&mut self, scene: usize, visible: bool) {
if let Some(scene) = self.scenes.get_mut(&scene) {
scene.visible_to_users = visible;
}
}
}
#[derive(Serialize, Deserialize, Default, Debug, Clone)]

View file

@ -85,7 +85,6 @@ impl GameServer {
println!("Got message from {}: {:?}", &id, &req);
match req {
// ignore errors, should probably be blocked before they are sent here
api::Request::Error => {}
api::Request::Login(login) => {
println!("login req from {}: {:?}", &id, &login);
@ -105,7 +104,8 @@ impl GameServer {
}),
));
// Send the list of scenes and chat history and such
_ = broadcast.send((Some(login.username.clone()), self.get_scene_list(&id)));
let admin = *self.users.get(&id).unwrap_or(&false);
_ = broadcast.send((Some(login.username.clone()), self.get_scene_list(admin)));
_ = broadcast.send((Some(login.username.clone()), self.get_last_messages(50)));
} else {
_ = broadcast.send((
@ -161,7 +161,29 @@ impl GameServer {
_ = broadcast.send((Some(id), response));
}
}
api::Request::GetSceneList => _ = broadcast.send((Some(id.clone()), self.get_scene_list(&id))),
api::Request::CreateScene { title } => {
if *self.users.get(&id).unwrap_or(&false) {
self.game.create_scene(title);
let admin = *self.users.get(&id).unwrap_or(&false);
let scenes = self.get_scene_list(admin);
_ = broadcast.send((Some(id), scenes));
}
}
api::Request::SceneSetGrid {
grid_cell_size,
grid_offset,
} => todo!(),
api::Request::SceneSetVisible { scene, visible } => {
if *self.users.get(&id).unwrap_or(&false) {
self.game.scene_visible(scene, visible);
_ = broadcast.send((None, self.get_scene_list(false)));
_ = broadcast.send((Some(id), self.get_scene_list(true)));
}
}
api::Request::GetSceneList => {
let admin = *self.users.get(&id).unwrap_or(&false);
_ = broadcast.send((Some(id.clone()), self.get_scene_list(admin)));
}
api::Request::SpawnToken {
map_id,
character,
@ -250,8 +272,7 @@ impl GameServer {
self.save().await; // Save the game one last time :)
}
fn get_scene_list(&self, id: &str) -> api::Response {
let admin = *self.users.get(id).unwrap_or(&false);
fn get_scene_list(&self, admin: bool) -> api::Response {
let scenes = self
.game
.scenes()