feat: integrate BlendSwap fish models (neon tetra, oscar, knifefish, clownfish, blueface angelfish)

- Added 4 new species to shop and genetics system
- Replaced maya's angelfish with higher-quality BlendSwap blueface angelfish
- New starter lineup: 12 fish (angelfish x2, goldfish, guppy x2, neon tetra x2, oscar, knifefish, clownfish, quaternius x2)
- Models: CC0 (angelfish, clownfish), CC-BY (neon tetra, oscar, knifefish by aeroplankton)
This commit is contained in:
2026-10-07 13:18:13 +00:00
parent 6a4614e276
commit fe024a9874
9 changed files with 26 additions and 4 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+13 -1
View File
@@ -9,6 +9,10 @@ export const FISH_PRICES: Record<FishSpecies, number> = {
fish1: 50, fish1: 50,
fish2: 70, fish2: 70,
fish3: 65, fish3: 65,
neon_tetra: 75,
oscar: 120,
knifefish: 110,
clownfish: 90,
}; };
/** Cost to upgrade TO tank tier (index = target tier) */ /** Cost to upgrade TO tank tier (index = target tier) */
@@ -81,10 +85,14 @@ export const SPECIES_RARITY_DIST: Record<FishSpecies, Record<Rarity, number>> =
fish1: { common: 75, uncommon: 15, rare: 6, epic: 3, legendary: 1 }, fish1: { common: 75, uncommon: 15, rare: 6, epic: 3, legendary: 1 },
fish2: { common: 65, uncommon: 20, rare: 10, epic: 4, legendary: 1 }, fish2: { common: 65, uncommon: 20, rare: 10, epic: 4, legendary: 1 },
fish3: { common: 68, uncommon: 18, rare: 9, epic: 4, legendary: 1 }, fish3: { common: 68, uncommon: 18, rare: 9, epic: 4, legendary: 1 },
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 */ /** Available species in shop */
export const SHOP_SPECIES: FishSpecies[] = ["angelfish", "goldfish", "guppy", "fish1", "fish2", "fish3"]; export const SHOP_SPECIES: FishSpecies[] = ["angelfish", "goldfish", "guppy", "neon_tetra", "oscar", "knifefish", "clownfish", "fish1", "fish2", "fish3"];
/** Species display names */ /** Species display names */
export const SPECIES_NAMES: Record<FishSpecies, string> = { export const SPECIES_NAMES: Record<FishSpecies, string> = {
@@ -94,4 +102,8 @@ export const SPECIES_NAMES: Record<FishSpecies, string> = {
fish1: "Cute Fish I", fish1: "Cute Fish I",
fish2: "Cute Fish II", fish2: "Cute Fish II",
fish3: "Cute Fish III", fish3: "Cute Fish III",
neon_tetra: "Neon Tetra",
oscar: "Oscar Cichlid",
knifefish: "Ghost Knifefish",
clownfish: "Clownfish",
}; };
+7 -1
View File
@@ -10,9 +10,15 @@ export function createDefaultState(): GameState {
makeFish("angelfish", 0.55), makeFish("angelfish", 0.55),
makeFish("angelfish", 0.50), makeFish("angelfish", 0.50),
makeFish("goldfish", 0.45), makeFish("goldfish", 0.45),
makeFish("goldfish", 0.40),
makeFish("guppy", 0.40), makeFish("guppy", 0.40),
makeFish("guppy", 0.35), makeFish("guppy", 0.35),
makeFish("neon_tetra", 0.30),
makeFish("neon_tetra", 0.28),
makeFish("oscar", 0.60),
makeFish("knifefish", 0.50),
makeFish("clownfish", 0.40),
makeFish("fish1", 0.45),
makeFish("fish2", 0.50),
]; ];
return { return {
version: VERSION, version: VERSION,
+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" | "fish1" | "fish2" | "fish3"; export type FishSpecies = "angelfish" | "goldfish" | "guppy" | "fish1" | "fish2" | "fish3" | "neon_tetra" | "oscar" | "knifefish" | "clownfish";
export interface Genetics { export interface Genetics {
hueShift: number; // -30 to +30 hueShift: number; // -30 to +30
+5 -1
View File
@@ -47,12 +47,16 @@ function isQuaternius(sp: FishSpecies): boolean {
} }
function getSpeciesUrl(sp: FishSpecies): string { function getSpeciesUrl(sp: FishSpecies): string {
const urls: Record<FishSpecies, string> = { const urls: Record<FishSpecies, string> = {
angelfish: "models/angelfish.glb", angelfish: "models/blendswap/blueface_angelfish.glb",
goldfish: "models/goldfish.glb", goldfish: "models/goldfish.glb",
guppy: "models/guppy.glb", guppy: "models/guppy.glb",
fish1: "models/quaternius/glb/Fish1.glb", fish1: "models/quaternius/glb/Fish1.glb",
fish2: "models/quaternius/glb/Fish2.glb", fish2: "models/quaternius/glb/Fish2.glb",
fish3: "models/quaternius/glb/Fish3.glb", fish3: "models/quaternius/glb/Fish3.glb",
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]; return urls[sp];
} }