Compare commits

..

No commits in common. "65e088085154018e9f0742979a152ab4d9e09743" and "d8fd3d71115b3676be2078a91b1ae12283c73285" have entirely different histories.

45 changed files with 304 additions and 697 deletions

View File

@ -0,0 +1,29 @@
kind = "blaze"
aliases = ["blazing"]
[[shard]]
from = "Red Nocturne"
chance = 6
[[shard]]
from = "White Mushroom"
chance = 100
info = "When Fire is the last spell used"
[[gem]]
from = "Bandit"
chance = 4
[[gem]]
from = "Fat Bandit"
chance = 8
[[gem]]
from = "White Mushroom"
chance = 10
info = "When Fire is used three times"
[[stone]]
from = "Chimera"
chance = 35
info = "Additional drops based on how many heads are reflected without getting hit"

View File

@ -0,0 +1,23 @@
kind = "bright"
[[shard]]
from = "Green Requiem"
chance = 10
[[shard]]
from = "White Mushroom"
chance = 100
info = "When Cure is the last spell used"
[[gem]]
from = "Search Ghost"
chance = 4
[[gem]]
from = "White Mushroom"
chance = 10
info = "When Cure is used three times"
[[crystal]]
from = "Defender"
chance = 2

View File

@ -0,0 +1,5 @@
kind = "energy"
[[stone]]
from = "Stealth Soldier"
chance = 35

View File

@ -0,0 +1,28 @@
kind = "frost"
[[shard]]
from = "Blue Rhapsody"
chance = 12
[[shard]]
from = "White Mushroom"
chance = 100
info = "When Blizzard is the last spell used"
[[gem]]
from = "Sea Neon"
chance = 2
[[gem]]
from = "Sheltering Zone"
chance = 8
[[gem]]
from = "White Mushroom"
chance = 10
info = "When Blizzard is used three times"
[[stone]]
from = "Grand Ghost"
chance = 100
info = "Additional drops based on what items are used to defeat it with Megalixirs having an additional 100% drop"

View File

@ -0,0 +1,32 @@
kind = "lucid"
[[shard]]
from = "Shadow"
chance = 3
[[shard]]
from = "White Mushroom"
chance = 100
info = "When Gravity is the last spell used"
[[shard]]
from = "Gigas Shadow"
chance = "?"
info = "% is based on how many Gigas Shadows are defeated"
[[gem]]
from = "Gargoyle"
chance = 2
[[gem]]
from = "Wight Knight"
chance = 2
[[gem]]
from = "White Mushroom"
chance = 10
info = "When Gravity is used three times"
[[crystal]]
from = "Darkball"
chance = 1

View File

@ -0,0 +1,23 @@
kind = "mythril"
[[shard]]
from = "Pot Spider"
chance = 1
[[shard]]
from = "Barrel Spider"
chance = 1
[[shard]]
from = "Pot Scorpion"
chance = 20
info = "Only if all 11 pots are broken before engaging"
[[shard]]
from = "Arch Behemoth"
chance = 20
[[stone]]
from = "Pot Scorpion"
chance = "10-35"
info = "20% when less than 11 pots got destroyed\n35% when all 11 pots were destroyed\nadditional 10% chance when breaking the 11th pot"

View File

@ -0,0 +1,40 @@
kind = "power"
[[shard]]
from = "Powerwild"
chance = 4
[[shard]]
from = "Bouncywild"
chance = 8
[[shard]]
from = "White Mushroom"
chance = 100
info = "When Stop is the last spell used"
[[gem]]
from = "Pirate"
chance = 4
[[gem]]
from = "Air Pirate"
chance = 4
[[gem]]
from = "Battleeship"
chance = 4
[[gem]]
from = "White Mushroom"
chance = 10
info = "When Stop is used three times"
[[stone]]
from = "Sniperwild"
chance = "?"
info = "% based on how many sets of 6 are defeated"
[[crystal]]
from = "Wyvern"
chance = 2

View File

@ -0,0 +1,21 @@
kind = "serenity"
aliases = ["hungry", "mystery"]
[[crystal]]
from = "White Mushroom"
chance = "10-20"
info = "10% when defeated and 20% when the same spell is used three times"
[[crystal]]
from = "Black Fungus"
chance = 6
[[crystal]]
from = "Rare Truffle"
chance = "20-100"
info = "% depends on how many times it got juggles ranging from 10 to 100"
[[stone]]
from = "Pink Agaricus"
chance = "10-100"
info = "% depends on how many times it got hit ranging from 40 to 100"

View File

@ -0,0 +1,11 @@
kind = "shiny"
aliases = ["shimmering"]
[[crystal]]
from = "Wizard"
chance = 2
[[stone]]
from = "Jet Balloon"
chance = 100
info = "Additional 20% drop chance"

View File

@ -0,0 +1,28 @@
kind = "spirit"
[[shard]]
from = "Large Body"
chance = 10
[[shard]]
from = "Soldier"
chance = 6
[[shard]]
from = "White Mushroom"
chance = 100
info = "When Aero is the last spell used"
[[gem]]
from = "Air Soldier"
chance = 4
[[gem]]
from = "White Mushroom"
chance = 10
info = "When Aero is used three times"
[[stone]]
from = "Gigas Shadow"
chance = "?"
info = "% is based on how many Gigas Shadows are defeated"

View File

@ -0,0 +1,14 @@
kind = "stormy"
aliases = ["gale"]
[[crystal]]
from = "Angel Star"
chance = 4
[[crystal]]
from = "Invisible"
chance = 4
[[stone]]
from = "Neoshadow"
chance = 35

View File

@ -0,0 +1,29 @@
kind = "thunder"
aliases = ["lightning"]
[[shard]]
from = "Yellow Opera"
chance = 8
[[shard]]
from = "White Mushroom"
chance = 100
info = "When Thunder is the last spell used"
[[gem]]
from = "Aquatank"
chance = 8
[[gem]]
from = "Screwdiver"
chance = 4
[[gem]]
from = "White Mushroom"
chance = 10
info = "When Thunder is used three times"
[[stone]]
from = "Black Ballade"
chance = 100
info = "With additional 10% drops each time the correct target is hit"

View File

@ -1,24 +0,0 @@
name = "Black Ballade"
[[world]]
name = "Deep Jungle"
[[drops]]
name = "Lightning Stone"
kind = "material"
chance = 100
info = "After correctly hitting the enemy 4 times"
[drops.material]
category = "lightning"
kind = "stone"
[[drops]]
name = "Lightning Stone"
kind = "material"
chance = 10
info = "Additional chance when hitting the enemy"
[drops.material]
category = "lightning"
kind = "stone"

View File

@ -1,23 +0,0 @@
name = "Chimera"
[[world]]
name = "Halloween Town"
[[drops]]
name = "Blazing Stone"
kind = "material"
chance = 35
[drops.material]
category = "blaze"
kind = "stone"
[[drops]]
name = "Blazing Stone"
kind = "material"
chance = "?"
info = "Additional chance based on how many times the heads get reflected"
[drops.material]
category = "blaze"
kind = "stone"

View File

@ -1,24 +0,0 @@
name = "Gigas Shadow"
[[world]]
name = "Wonderland"
[[drops]]
name = "Lucid Shard"
kind = "material"
chance = "10-100"
info = "Chance based on how many Gigas Shadows get defeated"
[drops.material]
category = "lucid"
kind = "shard"
[[drops]]
name = "Fury Stone"
kind = "material"
chance = "10-100"
info = "Chance based on how many Gigas Shadows get defeated\nif 2 or less get defeated then no fury stone will drop"
[drops.material]
category = "spirit"
kind = "stone"

View File

@ -1,23 +0,0 @@
name = "Grand Ghost"
[[world]]
name = "Monstro"
[[drops]]
name = "Frost Stone"
kind = "material"
chance = 100
[drops.material]
category = "frost"
kind = "stone"
[[drops]]
name = "Frost Stone"
kind = "material"
chance = "?"
info = "Additional chances based on what item was used to defeat it\nMega-Potion 5%\nMega-Ether 10%\nElixirs 35%\nMegalixir 100% and 20%"
[drops.material]
category = "frost"
kind = "stone"

View File

@ -1,22 +0,0 @@
name = "Jet Balloon"
[[world]]
name = "Neverland"
[[drops]]
name = "Dazzling Stone"
kind = "material"
chance = 100
[drops.material]
category = "shiny"
kind = "stone"
[[drops]]
name = "Dazzling Stone"
kind = "material"
chance = 20
[drops.material]
category = "shiny"
kind = "stone"

View File

@ -1,14 +0,0 @@
name = "Neoshadow"
[[world]]
name = "End of the World"
[[drops]]
name = "Stormy Stone"
kind = "material"
chance = 35
info = "Only when all 7 Neoshadows get defeated"
[drops.material]
category = "stormy"
kind = "stone"

View File

@ -1,17 +0,0 @@
name = "Pink Agaricus"
[[world]]
name = "Deep Jungle"
[[world]]
name = "Atlantica"
[[drops]]
name = "Serenity Power"
kind = "material"
chance = "?"
info = "% based on the number of hits dealt from 40 hits being 10% and 100 hits being 100%"
[drops.material]
category = "mystery"
kind = "stone"

View File

@ -1,13 +0,0 @@
name = "Pot Scorpion"
[[world]]
name = "Agrabah"
[[drops]]
name = "Mythril Stone"
kind = "material"
chance = 20
[drops.material]
category = "mythril"
kind = "stone"

View File

@ -1,26 +0,0 @@
name = "Pot Spider"
[[world]]
name = "Agrabah"
[[world]]
name = "Monstro"
[[drops]]
name = "Tent"
kind = "item"
chance = 1
[[drops]]
name = "Camping Set"
kind = "item"
chance = 0.5
[[drops]]
name = "Mythril Shard"
kind = "material"
chance = 1
[drops.material]
category = "mythril"
kind = "shard"

View File

@ -1,46 +0,0 @@
name = "Powerwild"
[[world]]
name = "Deep Jungle"
[[world]]
name = "Monstro"
[[world]]
name = "End of the World"
[[drops]]
name = "Potion"
kind = "item"
chance = 2
[[drops]]
name = "Power Shard"
kind = "material"
chance = 4
[drops.material]
category = "power"
kind = "shard"
[[drops]]
name = "Ether"
kind = "item"
chance = 20
info = "When it slips on the banana peel"
[[drops]]
name = "Mega-Ether"
kind = "item"
chance = 4
info = "When it slips on the banana peel"
[[drops]]
name = "Power Shard"
kind = "material"
chance = 4
info = "When it slips on the banana peel"
[drops.material]
category = "power"
kind = "shard"

View File

@ -1,33 +0,0 @@
name = "Red Nocturne"
[[world]]
name = "Traverse Town"
[[world]]
name = "Wonderland"
[[world]]
name = "Agrabah"
[[world]]
name = "Hollow Bastion"
[[world]]
name = "Monstro"
[[world]]
name = "End of the World"
[[drops]]
name = "Ether"
kind = "item"
chance = 1
[[drops]]
name = "Blaze Shard"
kind = "material"
chance = 6
[drops.material]
category = "blaze"
kind = "shard"

View File

@ -1,21 +0,0 @@
name = "Screwdiver"
[[world]]
name = "Atlantica"
[[world]]
name = "End of the World"
[[drops]]
name = "Hi-Potion"
kind = "item"
chance = 2
[[drops]]
name = "Thunder Gem"
kind = "material"
chance = 4
[drops.material]
category = "thunder"
kind = "gem"

View File

@ -1,21 +0,0 @@
name = "Sea Neon"
[[world]]
name = "Atlantica"
[[world]]
name = "End of the World"
[[drops]]
name = "Ether"
kind = "item"
chance = 0.5
[[drops]]
name = "Frost Gem"
kind = "material"
chance = 2
[drops.material]
category = "frost"
kind = "gem"

View File

@ -1,35 +0,0 @@
name = "Search Ghost"
[[world]]
name = "Halloween Town"
[[world]]
name = "Monstro"
[[world]]
name = "Traverse Town"
[[world]]
name = "Atlantica"
[[world]]
name = "End of the World"
[[drops]]
name = "Hi-Potion"
kind = "item"
chance = 2
[[drops]]
name = "Mega-Potion"
kind = "item"
chance = 1
[[drops]]
name = "Bright Gem"
kind = "material"
chance = 4
[drops.material]
category = "bright"
kind = "gem"

View File

@ -1,21 +0,0 @@
name = "Sheltering Zone"
[[world]]
name = "Atlantica"
[[world]]
name = "End of the World"
[[drops]]
name = "Ether"
kind = "item"
chance = 4
[[drops]]
name = "Frost Gem"
kind = "material"
chance = 8
[drops.material]
category = "frost"
kind = "gem"

View File

@ -1,14 +0,0 @@
name = "Sniperwild"
[[world]]
name = "Traverse Town"
[[drops]]
name = "Power Stone"
kind = "material"
chance = "?"
info = "% based on how many sets of 6 enemies are defeated"
[drops.material]
category = "power"
kind = "stone"

View File

@ -1,13 +0,0 @@
name = "Stealth Soldier"
[[world]]
name = "Hollow Bastion"
[[drops]]
name = "Energy Stone"
kind = "material"
chance = 35
[drops.material]
category = "energy"
kind = "stone"

View File

@ -1,26 +0,0 @@
name = "Wight Knight"
[[world]]
name = "Holloween Town"
[[world]]
name = "End of the World"
[[drops]]
name = "Hi-Potion"
kind = "item"
chance = 1
[[drops]]
name = "Mega-Potion"
kind = "item"
chance = 0.5
[[drops]]
name = "Lucid Gem"
kind = "material"
chance = 2
[drops.material]
category = "lucid"
kind = "gem"

View File

@ -1,38 +0,0 @@
name = "Wizard"
[[world]]
name = "Holloween Town"
[[world]]
name = "Traverse Town"
[[world]]
name = "Wonderland"
[[world]]
name = "Deep Jungle"
[[world]]
name = "Agrabah"
[[world]]
name = "End of the World"
[[drops]]
name = "Ether"
kind = "item"
chance = 2
[[drops]]
name = "Shiny Crystal"
kind = "material"
chance = 2
[drops.material]
category = "shiny"
kind = "crystal"
[[drops]]
name = "Wizard Relic"
kind = "equipment"
chance = 0.2

View File

@ -1,35 +0,0 @@
name = "Wyvern"
[[world]]
name = "Hollow Bastion"
[[world]]
name = "Traverse Town"
[[world]]
name = "Deep Jungle"
[[world]]
name = "Agrabah"
[[world]]
name = "End of the World"
[[drops]]
name = "Hi-Potion"
kind = "item"
chance = 2
[[drops]]
name = "Elixir"
kind = "item"
chance = 0.5
[[drops]]
name = "Power Crystal"
kind = "material"
chance = 2
[drops.material]
category = "power"
kind = "crystal"

View File

@ -1,33 +0,0 @@
name = "Yellow Opera"
[[world]]
name = "Traverse Town"
[[world]]
name = "Neverland"
[[world]]
name = "Agrabah"
[[world]]
name = "Hollow Bastion"
[[world]]
name = "Monstro"
[[world]]
name = "End of the World"
[[drops]]
name = "Ether"
kind = "item"
chance = 1
[[drops]]
name = "Thunder Shard"
kind = "material"
chance = 6
[drops.material]
category = "thunder"
kind = "shard"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -1,14 +1,3 @@
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,
}

View File

@ -1,130 +1,16 @@
use std::{collections::HashMap, fmt::Display, fs, path};
use std::{collections::HashMap, fmt::Display};
use serde::Deserialize;
use crate::ASSETS_FOLDER_PATH;
use super::{
Game,
enemy::{Enemy, EnemyDrop},
};
pub const GENERIC_MATERIAL_ICON: &str = "generic";
use super::enemy::{Enemy, EnemyDrop};
#[derive(Debug, Clone, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub struct MaterialDetails {
pub category: MaterialCategory,
pub category: String,
pub kind: MaterialKind,
}
#[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)]
#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[serde(rename_all = "lowercase")]
pub enum MaterialKind {
Shard,
@ -148,7 +34,7 @@ impl Display for MaterialKind {
pub struct MaterialDrops {
pub name: String,
pub icon: String,
pub category: MaterialCategory,
pub category: String,
pub kind: MaterialKind,
pub drops: Vec<EnemyDrop>,
}
@ -165,7 +51,7 @@ impl PartialOrd for MaterialDrops {
impl MaterialDrops {
pub fn new(enemies: Vec<Enemy>) -> Vec<MaterialDrops> {
let mut mat_map = HashMap::<(MaterialCategory, MaterialKind), MaterialDrops>::new();
let mut mat_map = HashMap::<(String, MaterialKind), MaterialDrops>::new();
for enemy in enemies {
for drop in &enemy.drops {
@ -211,23 +97,4 @@ impl MaterialDrops {
.filter(|d| d.material.as_ref().map(|m| m.kind == kind).unwrap_or(false))
.collect::<Vec<&EnemyDrop>>()
}
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()
}
}
}

View File

@ -2,23 +2,25 @@ use std::sync::OnceLock;
use askama::Template;
use blake3::Hash;
use itertools::Itertools;
use crate::{
RuntimeModule,
common::{Game, enemy::Enemy, materials::MaterialDrops},
common::{enemy::Enemy, materials::MaterialDrops},
create_file, create_hashes,
};
const MATERIAL_KINDS: &[&str] = &[
"lucid", "spirit", "power", "blaze", "frost", "thunder", "shiny", "bright", "mystery", "gale",
"mythril",
];
const DROPS_PATH: &str = "./input/kh1/drops";
const ENEMIES_PATH: &str = "./input/kh1/enemies";
static JS_HASH: OnceLock<Hash> = OnceLock::new();
#[derive(Template)]
#[template(path = "pages/kh1/drops.html")]
struct DropsTemplate {
pub game: Game,
pub drops: Vec<MaterialDrops>,
pub material_kinds: Vec<String>,
}
pub struct Module;
@ -28,19 +30,11 @@ impl RuntimeModule for Module {
tracing::info!("Loading enemy data from {}", ENEMIES_PATH);
let enemies = Enemy::import(ENEMIES_PATH);
tracing::info!("Loading enemy drops data from {}", DROPS_PATH);
let drops = MaterialDrops::new(enemies);
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,
};
let drops_template = DropsTemplate { drops };
create_file("./out/kh1", "drops", drops_template.render().unwrap()).unwrap();
}

View File

@ -3,11 +3,7 @@ use std::sync::OnceLock;
use askama::Template;
use blake3::Hash;
use crate::{
RuntimeModule,
common::{Game, materials::MaterialDrops},
create_file, create_hashes,
};
use crate::{RuntimeModule, common::materials::MaterialDrops, create_file, create_hashes};
const MATERIAL_KINDS: &[&str] = &[
"blazing",
@ -29,9 +25,7 @@ static JS_HASH: OnceLock<Hash> = OnceLock::new();
#[derive(Template)]
#[template(path = "pages/kh2/drops.html")]
struct DropsTemplate {
pub game: Game,
pub drops: Vec<MaterialDrops>,
pub material_kinds: Vec<String>,
}
pub struct Module;

View File

@ -24,7 +24,6 @@ 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();

View File

@ -1,4 +1,4 @@
{% for kind in material_kinds %}
{% for kind in MATERIAL_KINDS %}
<input
type="checkbox"
id="{{ kind }}Filter"

View File

@ -3,15 +3,18 @@
{% if drops.len() > 0 %}
<div
class="category-wrapper"
data-mat-kind="{{ drop.category.get_category(game) }}"
data-mat-kind="{{ drop.category }}"
data-mat-type="{{ label }}"
>
<div class="category">
<img
src="../public/assets/materials/{{ drop.texture(game) }}.webp"
src="../public/assets/materials/{{ drop.category }}/{{ label }}.webp"
width="64"
height="64"
/>
<!-- <h1> -->
<!-- {{ drop.category|capitalize +}} {{+ label|capitalize }} -->
<!-- </h1> -->
<h1>{{ drop.name }}</h1>
<button onclick="track(this)">Start tracking</button>
</div>