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,
oscar: 120,
knifefish: 110,
clownfish: 90,
};
/** 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 },
oscar: { common: 55, uncommon: 25, rare: 12, epic: 6, legendary: 2 },
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 */
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 */
export const SPECIES_NAMES: Record<FishSpecies, string> = {
@@ -105,5 +103,4 @@ export const SPECIES_NAMES: Record<FishSpecies, string> = {
neon_tetra: "Neon Tetra",
oscar: "Oscar Cichlid",
knifefish: "Ghost Knifefish",
clownfish: "Clownfish",
};
+1 -1
View File
@@ -15,7 +15,7 @@ export function createDefaultState(): GameState {
makeFish("neon_tetra", 0.28),
makeFish("oscar", 0.60),
makeFish("knifefish", 0.50),
makeFish("clownfish", 0.40),
makeFish("blue_tang", 0.45),
makeFish("betta", 0.45),
makeFish("blue_tang", 0.50),
makeFish("flower_horn", 0.55),
+1 -1
View File
@@ -1,7 +1,7 @@
export type Rarity = "common" | "uncommon" | "rare" | "epic" | "legendary";
export type Pattern = "solid" | "striped" | "spotted" | "gradient";
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 {
hueShift: number; // -30 to +30
-11
View File
@@ -56,7 +56,6 @@ function getSpeciesUrl(sp: FishSpecies): string {
neon_tetra: "models/blendswap/neon_tetra.glb",
oscar: "models/blendswap/oscar_cichlid.glb",
knifefish: "models/blendswap/ghost_knifefish.glb",
clownfish: "models/blendswap/clownfish.glb",
};
return urls[sp];
}
@@ -65,8 +64,6 @@ function getSpeciesUrl(sp: FishSpecies): string {
// swim-clip evaluation of the actual GLB data). Fish are scaled by
// targetLength / modelLength. This replaces the old
// 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> = {
angelfish: 4.2139,
goldfish: 1.7386,
@@ -77,14 +74,7 @@ const SPECIES_LENGTH: Record<FishSpecies, number> = {
neon_tetra: 3.6548,
oscar: 8.8411,
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 {
return {
url: getSpeciesUrl(f.species),
@@ -93,7 +83,6 @@ function fishToSpec(f: FishData): FishSpec {
speed: [0.3 * f.genetics.speedMult, 0.7 * f.genetics.speedMult],
orient: isQuaternius(f.species) ? { y: Math.PI / 2 } : undefined,
genetics: f.genetics,
hideNodes: f.species === "clownfish" ? HIDDEN_CLOWNFISH_NODES : undefined,
};
}