diff --git a/public/assets/materials/generic.webp b/public/assets/materials/generic.webp new file mode 100644 index 0000000..77afca4 Binary files /dev/null and b/public/assets/materials/generic.webp differ diff --git a/public/assets/materials/mythril/crystal.webp b/public/assets/materials/mythril/crystal.webp new file mode 100644 index 0000000..27f0217 Binary files /dev/null and b/public/assets/materials/mythril/crystal.webp differ diff --git a/public/assets/materials/mythril/gem.webp b/public/assets/materials/mythril/gem.webp new file mode 100644 index 0000000..80d0c52 Binary files /dev/null and b/public/assets/materials/mythril/gem.webp differ diff --git a/public/assets/materials/mythril/shard.webp b/public/assets/materials/mythril/shard.webp new file mode 100644 index 0000000..e0b97c2 Binary files /dev/null and b/public/assets/materials/mythril/shard.webp differ diff --git a/public/assets/materials/mythril/stone.webp b/public/assets/materials/mythril/stone.webp new file mode 100644 index 0000000..634921a Binary files /dev/null and b/public/assets/materials/mythril/stone.webp differ diff --git a/src/common.rs b/src/common.rs index 8d03643..4ab86cf 100644 --- a/src/common.rs +++ b/src/common.rs @@ -1,3 +1,14 @@ +use serde::Deserialize; + pub mod direction; pub mod enemy; pub mod materials; + +#[derive(Debug, Clone, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Game { + Kh1, + Kh2, + Kh3, + Bbs, + Ddd, +} diff --git a/src/common/materials.rs b/src/common/materials.rs index 7d3baf6..d94a1a6 100644 --- a/src/common/materials.rs +++ b/src/common/materials.rs @@ -1,16 +1,130 @@ -use std::{collections::HashMap, fmt::Display}; +use std::{collections::HashMap, fmt::Display, fs, path}; use serde::Deserialize; -use super::enemy::{Enemy, EnemyDrop}; +use crate::ASSETS_FOLDER_PATH; + +use super::{ + Game, + enemy::{Enemy, EnemyDrop}, +}; + +pub const GENERIC_MATERIAL_ICON: &str = "generic"; #[derive(Debug, Clone, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct MaterialDetails { - pub category: String, + pub category: MaterialCategory, pub kind: MaterialKind, } -#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[serde(rename_all = "lowercase")] +pub enum MaterialCategory { + // Common + #[serde(alias = "blaze")] + Blazing, + #[serde(alias = "soothing")] + Bright, + #[serde(alias = "betwixt")] + Dense, + #[serde(alias = "writhing")] + Dark, + #[serde(alias = "wellspring")] + Energy, + Frost, + #[serde(alias = "thunder")] + Lightning, + Lucid, + Mythril, + Power, + #[serde(alias = "shiny")] + Shimmering, + #[serde(alias = "mystery", alias = "hungry")] + Serenity, + Twilight, + + // KH1 Only + Spirit, + Stormy, + + // KH2 Only + Remembrance, +} + +impl MaterialCategory { + pub fn get_texture_group(&self) -> String { + match self { + MaterialCategory::Blazing => "blazing".to_string(), + MaterialCategory::Bright => "bright".to_string(), + MaterialCategory::Dense => "dense".to_string(), + MaterialCategory::Dark => "dark".to_string(), + MaterialCategory::Energy => "energy".to_string(), + MaterialCategory::Frost => "frost".to_string(), + MaterialCategory::Lightning => "lightning".to_string(), + MaterialCategory::Lucid => "lucid".to_string(), + MaterialCategory::Mythril => "mythril".to_string(), + MaterialCategory::Power => "power".to_string(), + MaterialCategory::Shimmering => "shimmering".to_string(), + MaterialCategory::Serenity => "serenity".to_string(), + MaterialCategory::Twilight => "twilight".to_string(), + + MaterialCategory::Spirit => "spirit".to_string(), + MaterialCategory::Stormy => "stormy".to_string(), + + MaterialCategory::Remembrance => "remembrance".to_string(), + } + } + + pub fn get_category(&self, game: &Game) -> String { + match self { + MaterialCategory::Blazing => match game { + Game::Kh1 => "blaze".to_string(), + _ => "blazing".to_string(), + }, + MaterialCategory::Bright => match game { + Game::Kh1 | Game::Kh2 => "bright".to_string(), + _ => "soothing".to_string(), + }, + MaterialCategory::Dense => match game { + Game::Kh2 => "dense".to_string(), + _ => "betwixt".to_string(), + }, + MaterialCategory::Dark => match game { + Game::Kh2 => "dark".to_string(), + _ => "writhing".to_string(), + }, + MaterialCategory::Energy => match game { + Game::Kh1 | Game::Kh2 => "energy".to_string(), + _ => "wellspring".to_string(), + }, + MaterialCategory::Frost => "frost".to_string(), + MaterialCategory::Lightning => match game { + Game::Kh1 => "thunder".to_string(), + _ => "lightning".to_string(), + }, + MaterialCategory::Lucid => "lucid".to_string(), + MaterialCategory::Mythril => "mythril".to_string(), + MaterialCategory::Power => "power".to_string(), + MaterialCategory::Shimmering => match game { + Game::Kh1 => "shiny".to_string(), + _ => "shimmering".to_string(), + }, + MaterialCategory::Serenity => match game { + Game::Kh1 => "mystery".to_string(), + Game::Bbs => "hungry".to_string(), + _ => "serenity".to_string(), + }, + MaterialCategory::Twilight => "twilight".to_string(), + + MaterialCategory::Spirit => "spirit".to_string(), + MaterialCategory::Stormy => "stormy".to_string(), + + MaterialCategory::Remembrance => "remembrance".to_string(), + } + } +} + +#[derive(Debug, Clone, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)] #[serde(rename_all = "lowercase")] pub enum MaterialKind { Shard, @@ -34,7 +148,7 @@ impl Display for MaterialKind { pub struct MaterialDrops { pub name: String, pub icon: String, - pub category: String, + pub category: MaterialCategory, pub kind: MaterialKind, pub drops: Vec, } @@ -51,7 +165,7 @@ impl PartialOrd for MaterialDrops { impl MaterialDrops { pub fn new(enemies: Vec) -> Vec { - let mut mat_map = HashMap::<(String, MaterialKind), MaterialDrops>::new(); + let mut mat_map = HashMap::<(MaterialCategory, MaterialKind), MaterialDrops>::new(); for enemy in enemies { for drop in &enemy.drops { @@ -97,4 +211,23 @@ impl MaterialDrops { .filter(|d| d.material.as_ref().map(|m| m.kind == kind).unwrap_or(false)) .collect::>() } + + pub fn texture(&self, game: &Game) -> String { + if *game == Game::Kh1 { + return GENERIC_MATERIAL_ICON.to_string(); + } + + let category = self.category.get_category(game); + let kind = self.kind.to_string(); + let path = format!( + "{}/materials/{}/{}.webp", + ASSETS_FOLDER_PATH, category, kind + ); + let path = path::Path::new(&path); + if path.exists() { + format!("{}/{}", self.category.get_category(game), self.kind) + } else { + GENERIC_MATERIAL_ICON.to_string() + } + } } diff --git a/src/kh1.rs b/src/kh1.rs index 9d5ea5b..5dbc39e 100644 --- a/src/kh1.rs +++ b/src/kh1.rs @@ -6,7 +6,7 @@ use itertools::Itertools; use crate::{ RuntimeModule, - common::{enemy::Enemy, materials::MaterialDrops}, + common::{Game, enemy::Enemy, materials::MaterialDrops}, create_file, create_hashes, }; @@ -16,6 +16,7 @@ static JS_HASH: OnceLock = OnceLock::new(); #[derive(Template)] #[template(path = "pages/kh1/drops.html")] struct DropsTemplate { + pub game: Game, pub drops: Vec, pub material_kinds: Vec, } @@ -28,10 +29,15 @@ impl RuntimeModule for Module { let enemies = Enemy::import(ENEMIES_PATH); let drops = MaterialDrops::new(enemies); - let material_kinds = drops.iter().map(|d| d.category.clone()).dedup().collect(); + let material_kinds = drops + .iter() + .map(|d| d.category.get_category(&Game::Kh1)) + .dedup() + .collect(); tracing::info!("Generating the KH1 drops template"); let drops_template = DropsTemplate { + game: Game::Kh1, drops, material_kinds, }; diff --git a/src/kh2.rs b/src/kh2.rs index 83df266..23daac2 100644 --- a/src/kh2.rs +++ b/src/kh2.rs @@ -3,7 +3,11 @@ use std::sync::OnceLock; use askama::Template; use blake3::Hash; -use crate::{RuntimeModule, common::materials::MaterialDrops, create_file, create_hashes}; +use crate::{ + RuntimeModule, + common::{Game, materials::MaterialDrops}, + create_file, create_hashes, +}; const MATERIAL_KINDS: &[&str] = &[ "blazing", @@ -25,6 +29,7 @@ static JS_HASH: OnceLock = OnceLock::new(); #[derive(Template)] #[template(path = "pages/kh2/drops.html")] struct DropsTemplate { + pub game: Game, pub drops: Vec, pub material_kinds: Vec, } diff --git a/src/main.rs b/src/main.rs index 391e8d0..58daabb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,7 @@ mod kh2; mod kh3; pub const VERSION: &str = env!("CARGO_PKG_VERSION"); +pub const ASSETS_FOLDER_PATH: &str = "./public/assets"; pub trait RuntimeModule { fn start_module(); diff --git a/templates/macros/common/macros.html b/templates/macros/common/macros.html index dcb0315..4b287ad 100644 --- a/templates/macros/common/macros.html +++ b/templates/macros/common/macros.html @@ -3,18 +3,15 @@ {% if drops.len() > 0 %}
- - -

{{ drop.name }}