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, amount: usize,
}, },
// Map requests // Map requests
CreateScene {
title: String,
},
SceneSetGrid {
grid_cell_size: f32,
grid_offset: [f32; 2],
},
SceneSetVisible {
scene: usize,
visible: bool,
},
GetScene { GetScene {
id: usize, 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 /// the list of available scenes
fn scenes(&self) -> Vec<usize>; fn scenes(&self) -> Vec<usize>;
fn get_scene(&self, id: usize) -> Option<&Scene>; 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 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 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>; 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> { fn get_scene(&self, id: usize) -> Option<&Scene> {
self.scenes.get(&id) 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)] #[derive(Serialize, Deserialize, Default, Debug, Clone)]

View file

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