From 65e088085154018e9f0742979a152ab4d9e09743 Mon Sep 17 00:00:00 2001 From: Wynd Date: Sat, 28 Jun 2025 00:47:43 +0300 Subject: [PATCH] Added mythril and generic icons + better texture pathing for materials --- public/assets/materials/generic.webp | Bin 0 -> 3076 bytes public/assets/materials/mythril/crystal.webp | Bin 0 -> 6132 bytes public/assets/materials/mythril/gem.webp | Bin 0 -> 6732 bytes public/assets/materials/mythril/shard.webp | Bin 0 -> 6878 bytes public/assets/materials/mythril/stone.webp | Bin 0 -> 6276 bytes src/common.rs | 11 ++ src/common/materials.rs | 145 ++++++++++++++++++- src/kh1.rs | 10 +- src/kh2.rs | 7 +- src/main.rs | 1 + templates/macros/common/macros.html | 7 +- 11 files changed, 167 insertions(+), 14 deletions(-) create mode 100644 public/assets/materials/generic.webp create mode 100644 public/assets/materials/mythril/crystal.webp create mode 100644 public/assets/materials/mythril/gem.webp create mode 100644 public/assets/materials/mythril/shard.webp create mode 100644 public/assets/materials/mythril/stone.webp diff --git a/public/assets/materials/generic.webp b/public/assets/materials/generic.webp new file mode 100644 index 0000000000000000000000000000000000000000..77afca4a17f7ccbe9002f0613601050f02d2ddb6 GIT binary patch literal 3076 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 literal 0 HcmV?d00001 diff --git a/public/assets/materials/mythril/shard.webp b/public/assets/materials/mythril/shard.webp new file mode 100644 index 0000000000000000000000000000000000000000..e0b97c2229ff7c130c891ee413d62a82980b4a43 GIT binary patch literal 6878 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 literal 0 HcmV?d00001 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 }}