diff --git a/assets/web/app.js b/assets/web/app.js
index f3a7c77..539c63c 100644
--- a/assets/web/app.js
+++ b/assets/web/app.js
@@ -230,9 +230,21 @@ tavern.onscenelist = (list) => {
if (tavern.admin) {
row.innerHTML += ``;
row.innerHTML += ``;
+ // TODO: Add a confirmation dialog
+ row.innerHTML += ``;
}
div.appendChild(row);
}
+ // Add create scene button at the end
+ if (tavern.admin) {
+ let b = document.createElement('button');
+ b.innerText = 'Create scene';
+ b.onclick = () => {
+ document.getElementById('create-scene-title').value = '';
+ document.getElementById('create-scene-popup').style.display = 'flex';
+ }
+ div.appendChild(b);
+ }
}
tavern.onconnectedplayers = (connected) => {
console.log(connected);
@@ -380,4 +392,9 @@ function onMoveableDivMouseUp(e, id) {
function showHideDiv(id) {
let div = document.getElementById(id);
div.style.display = div.style.display == 'none' ? 'flex' : 'none';
+}
+function createSceneAndHidePopup() {
+ document.getElementById('create-scene-popup').style.display = 'none'
+ let title = document.getElementById('create-scene-title').value;
+ tavern.create_scene(title.value);
}
\ No newline at end of file
diff --git a/assets/web/index.html b/assets/web/index.html
index 51c0474..c2f9e67 100644
--- a/assets/web/index.html
+++ b/assets/web/index.html
@@ -69,6 +69,24 @@
+
diff --git a/assets/web/tavern.js b/assets/web/tavern.js
index 84cd3d1..8e5132f 100644
--- a/assets/web/tavern.js
+++ b/assets/web/tavern.js
@@ -136,6 +136,10 @@ class Tavern {
if (!this.connected || this.loggedIn) { return; }
this.socket.send(JSON.stringify({ create_scene: { title: title } }));
}
+ delete_scene = (scene) => {
+ if (!this.connected || this.loggedIn) { return; }
+ this.socket.send(JSON.stringify({ delete_scene: { scene: scene } }));
+ }
shutdown = () => {
if (!this.connected || this.loggedIn || !this.admin) { return; }
this.socket.send(JSON.stringify('shutdown'));
diff --git a/src/api/mod.rs b/src/api/mod.rs
index 92cd4b6..e8e541c 100644
--- a/src/api/mod.rs
+++ b/src/api/mod.rs
@@ -53,6 +53,9 @@ pub enum Request {
CreateScene {
title: String,
},
+ DeleteScene {
+ scene: usize,
+ },
SetSceneGrid {
scene: usize,
grid_cell_size: f32,
diff --git a/src/game/mod.rs b/src/game/mod.rs
index 7860a2c..301a677 100644
--- a/src/game/mod.rs
+++ b/src/game/mod.rs
@@ -189,6 +189,10 @@ impl<'a, C: Character
+ Serialize + Deserialize<'a>, A: entry::GameEntry + Se
},
);
}
+ /// Deletes a scene and returns true if the scene existed
+ pub fn delete_scene(&mut self, scene: usize) -> Option {
+ self.scenes.remove(&scene)
+ }
pub fn scene_visible(&mut self, scene: usize, visible: bool) {
if let Some(scene) = self.scenes.get_mut(&scene) {
diff --git a/src/lib.rs b/src/lib.rs
index 8ab90dd..ed41961 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -193,6 +193,18 @@ impl GameServer {
_ = broadcast.send((SendTo::User(id), scenes));
}
}
+ api::Request::DeleteScene { scene } => {
+ if self.is_admin(&id) {
+ if let Some(scene) = self.game.delete_scene(scene) {
+ if scene.visible_to_users {
+ // Only update the players if they knew the scene existed
+ _ = broadcast.send((SendTo::AllBut(id.clone()), self.get_scene_list(false)));
+ }
+ // but always update the admin
+ _ = broadcast.send((SendTo::User(id), self.get_scene_list(true)));
+ }
+ }
+ }
api::Request::SetSceneGrid {
grid_cell_size,
grid_offset,