fix: remove clownfish (broken untextured scene model)

The clownfish GLB is a full aquarium scene (water plane, light, bubbles,
mirrored body) with no textures. It renders as a giant gray/white object
that obscures the tank. Replaced with a second blue_tang in the starter
lineup. 9 species remain.
This commit is contained in:
2026-10-07 22:50:08 +00:00
parent df4fb24822
commit 88fb870dbb
4 changed files with 3 additions and 17 deletions
+1 -4
View File
@@ -12,7 +12,6 @@ export const FISH_PRICES: Record<FishSpecies, number> = {
neon_tetra: 75, neon_tetra: 75,
oscar: 120, oscar: 120,
knifefish: 110, knifefish: 110,
clownfish: 90,
}; };
/** Cost to upgrade TO tank tier (index = target tier) */ /** Cost to upgrade TO tank tier (index = target tier) */
@@ -88,11 +87,10 @@ export const SPECIES_RARITY_DIST: Record<FishSpecies, Record<Rarity, number>> =
neon_tetra: { common: 65, uncommon: 20, rare: 8, epic: 5, legendary: 2 }, neon_tetra: { common: 65, uncommon: 20, rare: 8, epic: 5, legendary: 2 },
oscar: { common: 55, uncommon: 25, rare: 12, epic: 6, legendary: 2 }, oscar: { common: 55, uncommon: 25, rare: 12, epic: 6, legendary: 2 },
knifefish: { common: 50, uncommon: 25, rare: 13, epic: 8, legendary: 4 }, knifefish: { common: 50, uncommon: 25, rare: 13, epic: 8, legendary: 4 },
clownfish: { common: 60, uncommon: 22, rare: 10, epic: 6, legendary: 2 },
}; };
/** Available species in shop */ /** Available species in shop */
export const SHOP_SPECIES: FishSpecies[] = ["angelfish", "goldfish", "guppy", "neon_tetra", "oscar", "knifefish", "clownfish", "betta", "blue_tang", "flower_horn"]; export const SHOP_SPECIES: FishSpecies[] = ["angelfish", "goldfish", "guppy", "neon_tetra", "oscar", "knifefish", "betta", "blue_tang", "flower_horn"];
/** Species display names */ /** Species display names */
export const SPECIES_NAMES: Record<FishSpecies, string> = { export const SPECIES_NAMES: Record<FishSpecies, string> = {
@@ -105,5 +103,4 @@ export const SPECIES_NAMES: Record<FishSpecies, string> = {
neon_tetra: "Neon Tetra", neon_tetra: "Neon Tetra",
oscar: "Oscar Cichlid", oscar: "Oscar Cichlid",
knifefish: "Ghost Knifefish", knifefish: "Ghost Knifefish",
clownfish: "Clownfish",
}; };
+1 -1
View File
@@ -15,7 +15,7 @@ export function createDefaultState(): GameState {
makeFish("neon_tetra", 0.28), makeFish("neon_tetra", 0.28),
makeFish("oscar", 0.60), makeFish("oscar", 0.60),
makeFish("knifefish", 0.50), makeFish("knifefish", 0.50),
makeFish("clownfish", 0.40), makeFish("blue_tang", 0.45),
makeFish("betta", 0.45), makeFish("betta", 0.45),
makeFish("blue_tang", 0.50), makeFish("blue_tang", 0.50),
makeFish("flower_horn", 0.55), makeFish("flower_horn", 0.55),
+1 -1
View File
@@ -1,7 +1,7 @@
export type Rarity = "common" | "uncommon" | "rare" | "epic" | "legendary"; export type Rarity = "common" | "uncommon" | "rare" | "epic" | "legendary";
export type Pattern = "solid" | "striped" | "spotted" | "gradient"; export type Pattern = "solid" | "striped" | "spotted" | "gradient";
export type Gender = "male" | "female"; export type Gender = "male" | "female";
export type FishSpecies = "angelfish" | "goldfish" | "guppy" | "betta" | "blue_tang" | "flower_horn" | "neon_tetra" | "oscar" | "knifefish" | "clownfish"; export type FishSpecies = "angelfish" | "goldfish" | "guppy" | "betta" | "blue_tang" | "flower_horn" | "neon_tetra" | "oscar" | "knifefish";
export interface Genetics { export interface Genetics {
hueShift: number; // -30 to +30 hueShift: number; // -30 to +30
-11
View File
@@ -56,7 +56,6 @@ function getSpeciesUrl(sp: FishSpecies): string {
neon_tetra: "models/blendswap/neon_tetra.glb", neon_tetra: "models/blendswap/neon_tetra.glb",
oscar: "models/blendswap/oscar_cichlid.glb", oscar: "models/blendswap/oscar_cichlid.glb",
knifefish: "models/blendswap/ghost_knifefish.glb", knifefish: "models/blendswap/ghost_knifefish.glb",
clownfish: "models/blendswap/clownfish.glb",
}; };
return urls[sp]; return urls[sp];
} }
@@ -65,8 +64,6 @@ function getSpeciesUrl(sp: FishSpecies): string {
// swim-clip evaluation of the actual GLB data). Fish are scaled by // swim-clip evaluation of the actual GLB data). Fish are scaled by
// targetLength / modelLength. This replaces the old // targetLength / modelLength. This replaces the old
// Box3.setFromObject auto-measure, which under-reports armature-scaled // Box3.setFromObject auto-measure, which under-reports armature-scaled
// models (oscar, knifefish) and for the clownfish is dominated by its
// 45.3-unit water plane (see FishSpec.modelLength).
const SPECIES_LENGTH: Record<FishSpecies, number> = { const SPECIES_LENGTH: Record<FishSpecies, number> = {
angelfish: 4.2139, angelfish: 4.2139,
goldfish: 1.7386, goldfish: 1.7386,
@@ -77,14 +74,7 @@ const SPECIES_LENGTH: Record<FishSpecies, number> = {
neon_tetra: 3.6548, neon_tetra: 3.6548,
oscar: 8.8411, oscar: 8.8411,
knifefish: 23.0140, knifefish: 23.0140,
clownfish: 8.2773,
}; };
// The clownfish GLB bundles a whole aquarium scene: an untextured white
// "Surface" water plane (45.3 units — the "white box"), a "TopLight"
// emissive slab, a "Bubbles" prop, and "Original-Mirrored", a mirrored
// duplicate of the body that overlaps the real "ClownFish" node. Hide
// everything except the fish itself.
const HIDDEN_CLOWNFISH_NODES = ["Surface", "TopLight", "Bubbles", "Original-Mirrored"];
function fishToSpec(f: FishData): FishSpec { function fishToSpec(f: FishData): FishSpec {
return { return {
url: getSpeciesUrl(f.species), url: getSpeciesUrl(f.species),
@@ -93,7 +83,6 @@ function fishToSpec(f: FishData): FishSpec {
speed: [0.3 * f.genetics.speedMult, 0.7 * f.genetics.speedMult], speed: [0.3 * f.genetics.speedMult, 0.7 * f.genetics.speedMult],
orient: isQuaternius(f.species) ? { y: Math.PI / 2 } : undefined, orient: isQuaternius(f.species) ? { y: Math.PI / 2 } : undefined,
genetics: f.genetics, genetics: f.genetics,
hideNodes: f.species === "clownfish" ? HIDDEN_CLOWNFISH_NODES : undefined,
}; };
} }