diff --git a/Cargo.lock b/Cargo.lock
index 79734d2d..fd0f4065 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3231,6 +3231,7 @@ dependencies = [
"camino",
"egui",
"flate2",
+ "indextree",
"num_enum",
"paste",
"rand",
diff --git a/Cargo.toml b/Cargo.toml
index 83212893..a4680c5f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -183,6 +183,8 @@ rand = "0.8.5" # Random number generators and other randomness functionality
lexical-sort = "0.3.1" # Functions that compare and sort strings lexicographically
indexmap = "2.2.6" # A hash table with consistent order and fast iteration
+indextree = "4.7.2" # A general tree structure which stores nodes in an arena
+
# Fast and performant.
[profile.release]
opt-level = 3
diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs
index 848f9261..d8943ed3 100644
--- a/crates/config/src/lib.rs
+++ b/crates/config/src/lib.rs
@@ -15,7 +15,6 @@
// You should have received a copy of the GNU General Public License
// along with Luminol. If not, see .
-pub mod command_db;
pub mod global;
pub mod project;
#[cfg(not(target_arch = "wasm32"))]
diff --git a/crates/config/src/project.rs b/crates/config/src/project.rs
index ffe6f9b5..e7a69246 100644
--- a/crates/config/src/project.rs
+++ b/crates/config/src/project.rs
@@ -21,15 +21,15 @@
// it with Steamworks API by Valve Corporation, containing parts covered by
// terms of the Steamworks API by Valve Corporation, the licensors of this
// Program grant you additional permission to convey the resulting work.
+use super::{DataFormat, RGSSVer, RMVer, VolumeScale};
+use once_cell::sync::Lazy;
use serde::{Deserialize, Serialize};
-use super::{command_db, DataFormat, RGSSVer, RMVer, VolumeScale};
-
#[derive(Debug, Clone)]
#[allow(clippy::large_enum_variant)]
pub struct Config {
pub project: Project,
- pub command_db: command_db::CommandDB,
+ pub command_db: luminol_data::CommandDB,
pub game_ini: ini::Ini,
}
@@ -65,6 +65,21 @@ impl Default for Project {
}
}
+static XP_COMMANDS: Lazy = Lazy::new(|| {
+ let dir = luminol_macros::include_asset_dir_ids!("assets/commands/XP");
+ dir.into_iter()
+ .map(|(id, data)| {
+ let str = std::str::from_utf8(data).unwrap();
+ let cmd = ron::from_str(str).unwrap();
+ (id, cmd)
+ })
+ .collect()
+});
+
+static VX_COMMANDS: Lazy = Lazy::new(|| todo!());
+
+static ACE_COMMANDS: Lazy = Lazy::new(|| todo!());
+
impl Config {
pub fn from_project(project: Project) -> Self {
let mut game_ini = ini::Ini::new();
@@ -77,7 +92,12 @@ impl Config {
.set("RTP2", "")
.set("RTP3", "");
- let command_db = command_db::CommandDB::new(project.editor_ver);
+ let default = match project.editor_ver {
+ RMVer::XP => &*XP_COMMANDS,
+ RMVer::VX => &*VX_COMMANDS,
+ RMVer::Ace => &*ACE_COMMANDS,
+ };
+ let command_db = luminol_data::CommandDB::from_defaults(default.clone());
Self {
project,
diff --git a/crates/data/Cargo.toml b/crates/data/Cargo.toml
index 123737f4..7b505b03 100644
--- a/crates/data/Cargo.toml
+++ b/crates/data/Cargo.toml
@@ -43,3 +43,4 @@ egui.workspace = true
# * Misc * #
rand.workspace = true
flate2 = "1.0" # DEFLATE compression and decompression exposed as Read/BufRead/Write streams
+indextree.workspace = true
\ No newline at end of file
diff --git a/crates/config/src/command_db.rs b/crates/data/src/command_db.rs
similarity index 69%
rename from crates/config/src/command_db.rs
rename to crates/data/src/command_db.rs
index f35e64d0..e8bb162b 100644
--- a/crates/config/src/command_db.rs
+++ b/crates/data/src/command_db.rs
@@ -22,29 +22,10 @@
// terms of the Steamworks API by Valve Corporation, the licensors of this
// Program grant you additional permission to convey the resulting work.
-use luminol_data::commands::Command;
-use once_cell::sync::Lazy;
-use std::collections::HashMap;
-
+use crate::commands::Command;
use serde::{Deserialize, Serialize};
-use super::RMVer;
-
-type CommandSet = HashMap;
-static XP_DEFAULT: Lazy = Lazy::new(|| {
- let dir = luminol_macros::include_asset_dir_ids!("assets/commands/XP");
- dir.into_iter()
- .map(|(id, data)| {
- let str = std::str::from_utf8(data).unwrap();
- let cmd = ron::from_str(str).unwrap();
- (id, cmd)
- })
- .collect()
-});
-
-static VX_DEFAULT: Lazy = Lazy::new(|| todo!());
-
-static ACE_DEFAULT: Lazy = Lazy::new(|| todo!());
+pub type CommandSet = std::collections::HashMap;
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct CommandDB {
@@ -56,15 +37,10 @@ pub struct CommandDB {
}
impl CommandDB {
- pub fn new(ver: RMVer) -> Self {
+ pub fn from_defaults(default: CommandSet) -> Self {
Self {
- default: match ver {
- RMVer::XP => &*XP_DEFAULT,
- RMVer::VX => &*VX_DEFAULT,
- RMVer::Ace => &*ACE_DEFAULT,
- }
- .clone(),
- user: HashMap::new(),
+ default,
+ user: CommandSet::new(),
}
}
diff --git a/crates/data/src/lib.rs b/crates/data/src/lib.rs
index 408da518..a115c767 100644
--- a/crates/data/src/lib.rs
+++ b/crates/data/src/lib.rs
@@ -12,8 +12,10 @@ mod rgss_structs;
pub mod helpers;
+mod command_db;
pub mod commands;
+pub use command_db::{CommandDB, CommandSet};
pub use helpers::*;
pub use option_vec::OptionVec;
pub use rgss_structs::{Color, Table1, Table2, Table3, Tone};
diff --git a/crates/data/src/rmxp/map.rs b/crates/data/src/rmxp/map.rs
index d21ab4b6..1ceb9d6c 100644
--- a/crates/data/src/rmxp/map.rs
+++ b/crates/data/src/rmxp/map.rs
@@ -39,3 +39,7 @@ pub struct Map {
#[serde(skip)]
pub modified: bool,
}
+
+pub struct MapDeserializer<'de> {
+ command_db: &'de crate::CommandDB,
+}