nav: 统一 NavNode schema + runtime/roadmap 分离 + 城市补父级

- navigation/nav-schema.js: 统一 NavNode schema 定义
- navigation/runtime-nav.js: MVP runtime(仅 6 城市 active)
- navigation/future-catalog.js: 路线图数据(不进 runtime)
- 旧索引文件标注 @deprecated,重定向到新路径
- 6 城市补 countryId/regionId
- game-design 明确 MVP vs V1.1+ 导航边界

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
manpengan
2026-03-28 23:31:52 +08:00
parent 18cd4d8409
commit 212b12ab6b
15 changed files with 470 additions and 439 deletions

View File

@@ -1,9 +1,13 @@
module.exports = {
import { createLevelPresets } from '../shared/level-presets.js'
export const bangkok = {
id: 'bangkok',
contentVersion: 1,
continentId: 'asia',
countryId: 'thailand',
regionId: null,
sortOrder: 3,
unlockAfterCityId: 'tokyo',
unlockAfterCityId: 'seoul',
bundle: {
packId: 'asia-rest',
preload: 'on-city-page',
@@ -11,54 +15,45 @@ module.exports = {
display: {
name: '曼谷',
nameEn: 'Bangkok',
bgColor: '#FFB347',
tagline: '湄南河畔追猫猫',
funFact: '曼谷的全名有168个字母是世界最长城市',
bgColor: '#F9A826',
tagline: '热带夜市看猫猫',
funFact: '曼谷是东南亚热门旅行城市',
},
cover: {
catImage: 'images/cats/cat_bangkok.png',
catThumb: 'images/cats/cat_bangkok_thumb.png',
shareAccent: '#C9A96E',
shareAccent: '#FFD166',
},
cat: {
id: 'cat_bangkok',
name: '暹暹',
intro: '戴泰式花环的暹罗猫,最爱在水上市场闲逛',
baseColor: '#FAF0E6',
name: '泰泰',
baseColor: '#D9C2A7',
pattern: 'siamese',
patternColor: '#6B4226',
accessory: '泰式花环',
expression: 'curious',
accessory: '花环',
},
passport: {
stampId: 'stamp_bangkok',
stampLabel: '曼谷',
},
elements: [
{ id: 'bangkok_01', name: '冬阴功', category: 'food', rarity: 'core', image: 'images/elements/bangkok/bangkok_01.png', tags: ['soup', 'spicy', 'shrimp'] },
{ id: 'bangkok_02', name: '嘟嘟车', category: 'item', rarity: 'core', image: 'images/elements/bangkok/bangkok_02.png', tags: ['vehicle', 'colorful', 'street'] },
{ id: 'bangkok_03', name: '大象', category: 'nature', rarity: 'core', image: 'images/elements/bangkok/bangkok_03.png', tags: ['animal', 'grey', 'gentle'] },
{ id: 'bangkok_04', name: '泰拳手套', category: 'item', rarity: 'core', image: 'images/elements/bangkok/bangkok_04.png', tags: ['sport', 'red', 'fighting'] },
{ id: 'bangkok_05', name: '芒果糯米饭', category: 'food', rarity: 'core', image: 'images/elements/bangkok/bangkok_05.png', tags: ['sweet', 'mango', 'sticky'] },
{ id: 'bangkok_06', name: '金佛', category: 'landmark', rarity: 'core', image: 'images/elements/bangkok/bangkok_06.png', tags: ['buddha', 'golden', 'temple'] },
{ id: 'bangkok_07', name: '莲花', category: 'nature', rarity: 'core', image: 'images/elements/bangkok/bangkok_07.png', tags: ['flower', 'pink', 'water'] },
{ id: 'bangkok_08', name: '榴莲', category: 'food', rarity: 'core', image: 'images/elements/bangkok/bangkok_08.png', tags: ['fruit', 'spiky', 'yellow'] },
{ id: 'bangkok_09', name: '泰丝', category: 'culture', rarity: 'core', image: 'images/elements/bangkok/bangkok_09.png', tags: ['fabric', 'shimmer', 'craft'] },
{ id: 'bangkok_10', name: '船面', category: 'food', rarity: 'core', image: 'images/elements/bangkok/bangkok_10.png', tags: ['noodle', 'boat', 'dark'] },
{ id: 'bangkok_11', name: '佛塔', category: 'landmark', rarity: 'core', image: 'images/elements/bangkok/bangkok_11.png', tags: ['stupa', 'golden', 'tall'] },
{ id: 'bangkok_12', name: '椰子', category: 'nature', rarity: 'accent', image: 'images/elements/bangkok/bangkok_12.png', tags: ['fruit', 'tropical', 'green'] },
{ id: 'bangkok_13', name: '夜市灯笼', category: 'culture', rarity: 'accent', image: 'images/elements/bangkok/bangkok_13.png', tags: ['lantern', 'glow', 'night'] },
],
levelPresets: [
{ id: 1, difficultyTier: 'intro', seedBase: 13001, elementCount: 6, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.95, targetDurationSec: [60, 120] },
{ id: 2, difficultyTier: 'easy', seedBase: 13002, elementCount: 7, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.90, targetDurationSec: [60, 120] },
{ id: 3, difficultyTier: 'normal', seedBase: 13003, elementCount: 8, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.80, targetDurationSec: [90, 150] },
{ id: 4, difficultyTier: 'normal', seedBase: 13004, elementCount: 9, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.70, targetDurationSec: [90, 150] },
{ id: 5, difficultyTier: 'hard', seedBase: 13005, elementCount: 10, piecesPerElement: 3, layers: 4, density: 'medium_high', targetPassRate: 0.60, targetDurationSec: [120, 180] },
{ id: 6, difficultyTier: 'boss', seedBase: 13006, elementCount: 10, piecesPerElement: [3,3,3,3,3,6,3,3,3,3], layers: 4, density: 'high', targetPassRate: 0.55, targetDurationSec: [120, 240] },
{ id: 'bangkok_01', name: '玉佛寺', category: 'landmark', rarity: 'core', image: 'images/elements/bangkok/bangkok_01.png', tags: ['temple'] },
{ id: 'bangkok_02', name: '佛塔', category: 'landmark', rarity: 'core', image: 'images/elements/bangkok/bangkok_02.png', tags: ['tower'] },
{ id: 'bangkok_03', name: '冬阴功', category: 'food', rarity: 'core', image: 'images/elements/bangkok/bangkok_03.png', tags: ['soup'] },
{ id: 'bangkok_04', name: '芒果糯米饭', category: 'food', rarity: 'core', image: 'images/elements/bangkok/bangkok_04.png', tags: ['dessert'] },
{ id: 'bangkok_05', name: '船面', category: 'food', rarity: 'core', image: 'images/elements/bangkok/bangkok_05.png', tags: ['noodle'] },
{ id: 'bangkok_06', name: '泰丝', category: 'culture', rarity: 'core', image: 'images/elements/bangkok/bangkok_06.png', tags: ['fabric'] },
{ id: 'bangkok_07', name: '泰拳手套', category: 'culture', rarity: 'core', image: 'images/elements/bangkok/bangkok_07.png', tags: ['sport'] },
{ id: 'bangkok_08', name: '嘟嘟车', category: 'item', rarity: 'core', image: 'images/elements/bangkok/bangkok_08.png', tags: ['vehicle'] },
{ id: 'bangkok_09', name: '椰子杯', category: 'item', rarity: 'core', image: 'images/elements/bangkok/bangkok_09.png', tags: ['drink'] },
{ id: 'bangkok_10', name: '莲花', category: 'nature', rarity: 'core', image: 'images/elements/bangkok/bangkok_10.png', tags: ['flower'] },
{ id: 'bangkok_11', name: '大象', category: 'nature', rarity: 'core', image: 'images/elements/bangkok/bangkok_11.png', tags: ['animal'] },
{ id: 'bangkok_12', name: '榴莲', category: 'nature', rarity: 'core', image: 'images/elements/bangkok/bangkok_12.png', tags: ['fruit'] },
],
levelPresets: createLevelPresets(13000),
shareCard: {
titleUnlocked: '我解锁了曼谷猫!',
titlePassport: '曼谷护照盖章完成',
},
}
export default bangkok

View File

@@ -1,9 +1,13 @@
module.exports = {
import { createLevelPresets } from '../shared/level-presets.js'
export const beijing = {
id: 'beijing',
contentVersion: 1,
continentId: 'asia',
countryId: 'china',
regionId: 'north_china',
sortOrder: 1,
unlockAfterCityId: null,
unlockAfterCityId: 'tokyo',
bundle: {
packId: 'main',
preload: 'startup',
@@ -13,7 +17,7 @@ module.exports = {
nameEn: 'Beijing',
bgColor: '#CC2936',
tagline: '天安门前看猫猫',
funFact: '北京是世界上拥有最多宫殿的城市',
funFact: '北京是中国的历史文化名城',
},
cover: {
catImage: 'images/cats/cat_beijing.png',
@@ -23,43 +27,33 @@ module.exports = {
cat: {
id: 'cat_beijing',
name: '京京',
intro: '戴虎头帽的橘猫,最爱在胡同里晒太阳',
baseColor: '#F28C28',
pattern: 'tabby',
patternColor: '#D4761A',
accessory: '虎头帽',
expression: 'smile',
},
passport: {
stampId: 'stamp_beijing',
stampLabel: '北京',
},
elements: [
{ id: 'beijing_01', name: '糖葫芦', category: 'food', rarity: 'core', image: 'images/elements/beijing/beijing_01.png', tags: ['sweet', 'street-food', 'red'] },
{ id: 'beijing_02', name: '京剧脸谱', category: 'culture', rarity: 'core', image: 'images/elements/beijing/beijing_02.png', tags: ['opera', 'mask', 'colorful'] },
{ id: 'beijing_03', name: '天安门', category: 'landmark', rarity: 'core', image: 'images/elements/beijing/beijing_03.png', tags: ['building', 'red', 'iconic'] },
{ id: 'beijing_04', name: '烤鸭', category: 'food', rarity: 'core', image: 'images/elements/beijing/beijing_04.png', tags: ['meat', 'famous', 'golden'] },
{ id: 'beijing_05', name: '兔儿爷', category: 'culture', rarity: 'core', image: 'images/elements/beijing/beijing_05.png', tags: ['toy', 'festival', 'rabbit'] },
{ id: 'beijing_06', name: '长城砖', category: 'landmark', rarity: 'core', image: 'images/elements/beijing/beijing_06.png', tags: ['wall', 'historic', 'grey'] },
{ id: 'beijing_07', name: '故宫角楼', category: 'landmark', rarity: 'core', image: 'images/elements/beijing/beijing_07.png', tags: ['palace', 'golden', 'ancient'] },
{ id: 'beijing_08', name: '豆汁', category: 'food', rarity: 'core', image: 'images/elements/beijing/beijing_08.png', tags: ['drink', 'green', 'local'] },
{ id: 'beijing_09', name: '铜锣', category: 'item', rarity: 'core', image: 'images/elements/beijing/beijing_09.png', tags: ['instrument', 'golden', 'round'] },
{ id: 'beijing_10', name: '毛笔', category: 'item', rarity: 'core', image: 'images/elements/beijing/beijing_10.png', tags: ['writing', 'black', 'thin'] },
{ id: 'beijing_11', name: '鸟巢', category: 'landmark', rarity: 'core', image: 'images/elements/beijing/beijing_11.png', tags: ['stadium', 'modern', 'steel'] },
{ id: 'beijing_12', name: '冰糖葫芦', category: 'food', rarity: 'core', image: 'images/elements/beijing/beijing_12.png', tags: ['candy', 'stick', 'red'] },
{ id: 'beijing_13', name: '四合院门', category: 'culture', rarity: 'accent', image: 'images/elements/beijing/beijing_13.png', tags: ['door', 'red', 'traditional'] },
{ id: 'beijing_14', name: '景泰蓝', category: 'item', rarity: 'accent', image: 'images/elements/beijing/beijing_14.png', tags: ['craft', 'blue', 'enamel'] },
],
levelPresets: [
{ id: 1, difficultyTier: 'intro', seedBase: 11001, elementCount: 6, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.95, targetDurationSec: [60, 120] },
{ id: 2, difficultyTier: 'easy', seedBase: 11002, elementCount: 7, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.90, targetDurationSec: [60, 120] },
{ id: 3, difficultyTier: 'normal', seedBase: 11003, elementCount: 8, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.80, targetDurationSec: [90, 150] },
{ id: 4, difficultyTier: 'normal', seedBase: 11004, elementCount: 9, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.70, targetDurationSec: [90, 150] },
{ id: 5, difficultyTier: 'hard', seedBase: 11005, elementCount: 10, piecesPerElement: 3, layers: 4, density: 'medium_high', targetPassRate: 0.60, targetDurationSec: [120, 180] },
{ id: 6, difficultyTier: 'boss', seedBase: 11006, elementCount: 10, piecesPerElement: [3,3,3,3,3,6,3,3,3,3], layers: 4, density: 'high', targetPassRate: 0.55, targetDurationSec: [120, 240] },
{ id: 'beijing_01', name: '天安门', category: 'landmark', rarity: 'core', image: 'images/elements/beijing/beijing_01.png', tags: ['gate', 'red'] },
{ id: 'beijing_02', name: '鸟巢', category: 'landmark', rarity: 'core', image: 'images/elements/beijing/beijing_02.png', tags: ['stadium'] },
{ id: 'beijing_03', name: '糖葫芦', category: 'food', rarity: 'core', image: 'images/elements/beijing/beijing_03.png', tags: ['sweet'] },
{ id: 'beijing_04', name: '烤鸭', category: 'food', rarity: 'core', image: 'images/elements/beijing/beijing_04.png', tags: ['duck'] },
{ id: 'beijing_05', name: '豆汁', category: 'food', rarity: 'core', image: 'images/elements/beijing/beijing_05.png', tags: ['drink'] },
{ id: 'beijing_06', name: '京剧脸谱', category: 'culture', rarity: 'core', image: 'images/elements/beijing/beijing_06.png', tags: ['opera'] },
{ id: 'beijing_07', name: '兔儿爷', category: 'culture', rarity: 'core', image: 'images/elements/beijing/beijing_07.png', tags: ['folk'] },
{ id: 'beijing_08', name: '毛笔', category: 'item', rarity: 'core', image: 'images/elements/beijing/beijing_08.png', tags: ['brush'] },
{ id: 'beijing_09', name: '铜锣', category: 'item', rarity: 'core', image: 'images/elements/beijing/beijing_09.png', tags: ['instrument'] },
{ id: 'beijing_10', name: '银杏叶', category: 'nature', rarity: 'core', image: 'images/elements/beijing/beijing_10.png', tags: ['leaf'] },
{ id: 'beijing_11', name: '玉兰花', category: 'nature', rarity: 'core', image: 'images/elements/beijing/beijing_11.png', tags: ['flower'] },
{ id: 'beijing_12', name: '白鸽', category: 'nature', rarity: 'core', image: 'images/elements/beijing/beijing_12.png', tags: ['bird'] },
],
levelPresets: createLevelPresets(11000),
shareCard: {
titleUnlocked: '我解锁了北京猫!',
titlePassport: '北京护照盖章完成',
},
}
export default beijing

View File

@@ -0,0 +1,10 @@
import bangkok from './bangkok.js'
import beijing from './beijing.js'
import istanbul from './istanbul.js'
import seoul from './seoul.js'
import singapore from './singapore.js'
import tokyo from './tokyo.js'
export const cities = [beijing, tokyo, bangkok, seoul, singapore, istanbul]
export default cities

View File

@@ -1,9 +1,13 @@
module.exports = {
import { createLevelPresets } from '../shared/level-presets.js'
export const istanbul = {
id: 'istanbul',
contentVersion: 1,
continentId: 'asia',
countryId: 'turkey',
regionId: null,
sortOrder: 6,
unlockAfterCityId: 'singapore',
unlockAfterCityId: null,
bundle: {
packId: 'asia-rest',
preload: 'on-city-page',
@@ -11,55 +15,45 @@ module.exports = {
display: {
name: '伊斯坦布尔',
nameEn: 'Istanbul',
bgColor: '#1A5276',
tagline: '博斯普鲁斯的猫',
funFact: '伊斯坦布尔是唯一横跨两大洲的城市',
bgColor: '#7B2CBF',
tagline: '海峡两岸看猫猫',
funFact: '伊斯坦布尔横跨欧亚两洲',
},
cover: {
catImage: 'images/cats/cat_istanbul.png',
catThumb: 'images/cats/cat_istanbul_thumb.png',
shareAccent: '#E8D5B7',
shareAccent: '#9D4EDD',
},
cat: {
id: 'cat_istanbul',
name: '安安',
intro: '佩戴恶魔之眼项圈的安哥拉猫,神秘优雅',
baseColor: '#F5F5F5',
pattern: 'solid',
patternColor: '#E8E8E8',
name: '蓝眸',
baseColor: '#F5E6CC',
pattern: 'angora',
accessory: '恶魔之眼项圈',
expression: 'mysterious',
},
passport: {
stampId: 'stamp_istanbul',
stampLabel: '伊斯坦布尔',
},
elements: [
{ id: 'istanbul_01', name: '蓝色清真寺', category: 'landmark', rarity: 'core', image: 'images/elements/istanbul/istanbul_01.png', tags: ['mosque', 'blue', 'dome'] },
{ id: 'istanbul_02', name: '土耳其红茶', category: 'food', rarity: 'core', image: 'images/elements/istanbul/istanbul_02.png', tags: ['tea', 'glass', 'red'] },
{ id: 'istanbul_03', name: '热气球', category: 'item', rarity: 'core', image: 'images/elements/istanbul/istanbul_03.png', tags: ['balloon', 'sky', 'colorful'] },
{ id: 'istanbul_04', name: '烤肉串', category: 'food', rarity: 'core', image: 'images/elements/istanbul/istanbul_04.png', tags: ['kebab', 'grill', 'meat'] },
{ id: 'istanbul_05', name: '郁金香', category: 'nature', rarity: 'core', image: 'images/elements/istanbul/istanbul_05.png', tags: ['flower', 'red', 'spring'] },
{ id: 'istanbul_06', name: '恶魔之眼', category: 'culture', rarity: 'core', image: 'images/elements/istanbul/istanbul_06.png', tags: ['amulet', 'blue', 'protection'] },
{ id: 'istanbul_07', name: '土耳其冰淇淋', category: 'food', rarity: 'core', image: 'images/elements/istanbul/istanbul_07.png', tags: ['dessert', 'stretchy', 'fun'] },
{ id: 'istanbul_08', name: '地毯', category: 'item', rarity: 'core', image: 'images/elements/istanbul/istanbul_08.png', tags: ['textile', 'pattern', 'woven'] },
{ id: 'istanbul_09', name: '石榴', category: 'nature', rarity: 'core', image: 'images/elements/istanbul/istanbul_09.png', tags: ['fruit', 'red', 'juicy'] },
{ id: 'istanbul_10', name: '旋转舞裙', category: 'culture', rarity: 'core', image: 'images/elements/istanbul/istanbul_10.png', tags: ['dance', 'whirl', 'white'] },
{ id: 'istanbul_11', name: '圣索菲亚', category: 'landmark', rarity: 'core', image: 'images/elements/istanbul/istanbul_11.png', tags: ['cathedral', 'dome', 'historic'] },
{ id: 'istanbul_12', name: '土耳其软糖', category: 'food', rarity: 'core', image: 'images/elements/istanbul/istanbul_12.png', tags: ['candy', 'sweet', 'colorful'] },
{ id: 'istanbul_13', name: '波斯猫雕像', category: 'culture', rarity: 'core', image: 'images/elements/istanbul/istanbul_13.png', tags: ['statue', 'cat', 'elegant'] },
{ id: 'istanbul_14', name: '香料', category: 'item', rarity: 'core', image: 'images/elements/istanbul/istanbul_14.png', tags: ['spice', 'bazaar', 'aromatic'] },
],
levelPresets: [
{ id: 1, difficultyTier: 'intro', seedBase: 16001, elementCount: 6, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.95, targetDurationSec: [60, 120] },
{ id: 2, difficultyTier: 'easy', seedBase: 16002, elementCount: 7, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.90, targetDurationSec: [60, 120] },
{ id: 3, difficultyTier: 'normal', seedBase: 16003, elementCount: 8, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.80, targetDurationSec: [90, 150] },
{ id: 4, difficultyTier: 'normal', seedBase: 16004, elementCount: 9, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.70, targetDurationSec: [90, 150] },
{ id: 5, difficultyTier: 'hard', seedBase: 16005, elementCount: 10, piecesPerElement: 3, layers: 4, density: 'medium_high', targetPassRate: 0.60, targetDurationSec: [120, 180] },
{ id: 6, difficultyTier: 'boss', seedBase: 16006, elementCount: 10, piecesPerElement: [3,3,3,3,3,6,3,3,3,3], layers: 4, density: 'high', targetPassRate: 0.55, targetDurationSec: [120, 240] },
{ id: 'istanbul_01', name: '蓝色清真寺', category: 'landmark', rarity: 'core', image: 'images/elements/istanbul/istanbul_01.png', tags: ['mosque'] },
{ id: 'istanbul_02', name: '加拉塔塔', category: 'landmark', rarity: 'core', image: 'images/elements/istanbul/istanbul_02.png', tags: ['tower'] },
{ id: 'istanbul_03', name: '土耳其红茶', category: 'food', rarity: 'core', image: 'images/elements/istanbul/istanbul_03.png', tags: ['tea'] },
{ id: 'istanbul_04', name: '烤肉串', category: 'food', rarity: 'core', image: 'images/elements/istanbul/istanbul_04.png', tags: ['meat'] },
{ id: 'istanbul_05', name: '土耳其冰淇淋', category: 'food', rarity: 'core', image: 'images/elements/istanbul/istanbul_05.png', tags: ['dessert'] },
{ id: 'istanbul_06', name: '旋转舞裙', category: 'culture', rarity: 'core', image: 'images/elements/istanbul/istanbul_06.png', tags: ['dance'] },
{ id: 'istanbul_07', name: '地毯纹样', category: 'culture', rarity: 'core', image: 'images/elements/istanbul/istanbul_07.png', tags: ['pattern'] },
{ id: 'istanbul_08', name: '恶魔之眼', category: 'item', rarity: 'core', image: 'images/elements/istanbul/istanbul_08.png', tags: ['amulet'] },
{ id: 'istanbul_09', name: '铜咖啡壶', category: 'item', rarity: 'core', image: 'images/elements/istanbul/istanbul_09.png', tags: ['pot'] },
{ id: 'istanbul_10', name: '郁金香', category: 'nature', rarity: 'core', image: 'images/elements/istanbul/istanbul_10.png', tags: ['flower'] },
{ id: 'istanbul_11', name: '石榴', category: 'nature', rarity: 'core', image: 'images/elements/istanbul/istanbul_11.png', tags: ['fruit'] },
{ id: 'istanbul_12', name: '海鸥', category: 'nature', rarity: 'core', image: 'images/elements/istanbul/istanbul_12.png', tags: ['bird'] },
],
levelPresets: createLevelPresets(16000),
shareCard: {
titleUnlocked: '我解锁了伊斯坦布尔猫!',
titlePassport: '伊斯坦布尔护照盖章完成',
},
}
export default istanbul

View File

@@ -1,9 +1,13 @@
module.exports = {
import { createLevelPresets } from '../shared/level-presets.js'
export const seoul = {
id: 'seoul',
contentVersion: 1,
continentId: 'asia',
countryId: 'korea',
regionId: null,
sortOrder: 4,
unlockAfterCityId: 'bangkok',
unlockAfterCityId: 'singapore',
bundle: {
packId: 'asia-rest',
preload: 'on-city-page',
@@ -11,54 +15,45 @@ module.exports = {
display: {
name: '首尔',
nameEn: 'Seoul',
bgColor: '#4A90D9',
tagline: '景福宫前遇猫猫',
funFact: '首尔的地铁系统覆盖率全球第一',
bgColor: '#5C7AEA',
tagline: '首尔夜景看猫猫',
funFact: '首尔是东亚流行文化重镇',
},
cover: {
catImage: 'images/cats/cat_seoul.png',
catThumb: 'images/cats/cat_seoul_thumb.png',
shareAccent: '#F5E6CA',
shareAccent: '#86A8E7',
},
cat: {
id: 'cat_seoul',
name: '韩韩',
intro: '戴韩服小帽的韩国短尾猫,爱在景福宫前眨眼卖萌',
baseColor: '#F5E6CA',
pattern: 'bicolor',
patternColor: '#D4A574',
baseColor: '#B0B7C3',
pattern: 'short-tail',
accessory: '韩服小帽',
expression: 'wink',
},
passport: {
stampId: 'stamp_seoul',
stampLabel: '首尔',
},
elements: [
{ id: 'seoul_01', name: '泡菜坛', category: 'food', rarity: 'core', image: 'images/elements/seoul/seoul_01.png', tags: ['fermented', 'jar', 'red'] },
{ id: 'seoul_02', name: '石锅拌饭', category: 'food', rarity: 'core', image: 'images/elements/seoul/seoul_02.png', tags: ['rice', 'hot', 'colorful'] },
{ id: 'seoul_03', name: '韩服', category: 'culture', rarity: 'core', image: 'images/elements/seoul/seoul_03.png', tags: ['clothing', 'traditional', 'colorful'] },
{ id: 'seoul_04', name: '景福宫', category: 'landmark', rarity: 'core', image: 'images/elements/seoul/seoul_04.png', tags: ['palace', 'historic', 'grand'] },
{ id: 'seoul_05', name: '烧酒瓶', category: 'item', rarity: 'core', image: 'images/elements/seoul/seoul_05.png', tags: ['drink', 'green', 'bottle'] },
{ id: 'seoul_06', name: '年糕', category: 'food', rarity: 'core', image: 'images/elements/seoul/seoul_06.png', tags: ['sweet', 'chewy', 'white'] },
{ id: 'seoul_07', name: 'K-pop话筒', category: 'item', rarity: 'core', image: 'images/elements/seoul/seoul_07.png', tags: ['music', 'pop', 'shiny'] },
{ id: 'seoul_08', name: '太极旗扇', category: 'culture', rarity: 'core', image: 'images/elements/seoul/seoul_08.png', tags: ['flag', 'fan', 'national'] },
{ id: 'seoul_09', name: '韩式炸鸡', category: 'food', rarity: 'core', image: 'images/elements/seoul/seoul_09.png', tags: ['fried', 'crispy', 'golden'] },
{ id: 'seoul_10', name: '柿子', category: 'nature', rarity: 'core', image: 'images/elements/seoul/seoul_10.png', tags: ['fruit', 'orange', 'autumn'] },
{ id: 'seoul_11', name: '海苔卷', category: 'food', rarity: 'core', image: 'images/elements/seoul/seoul_11.png', tags: ['seaweed', 'roll', 'green'] },
{ id: 'seoul_12', name: '南山塔', category: 'landmark', rarity: 'core', image: 'images/elements/seoul/seoul_12.png', tags: ['tower', 'romantic', 'iconic'] },
{ id: 'seoul_13', name: '木槿花', category: 'nature', rarity: 'core', image: 'images/elements/seoul/seoul_13.png', tags: ['flower', 'pink', 'national'] },
],
levelPresets: [
{ id: 1, difficultyTier: 'intro', seedBase: 14001, elementCount: 6, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.95, targetDurationSec: [60, 120] },
{ id: 2, difficultyTier: 'easy', seedBase: 14002, elementCount: 7, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.90, targetDurationSec: [60, 120] },
{ id: 3, difficultyTier: 'normal', seedBase: 14003, elementCount: 8, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.80, targetDurationSec: [90, 150] },
{ id: 4, difficultyTier: 'normal', seedBase: 14004, elementCount: 9, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.70, targetDurationSec: [90, 150] },
{ id: 5, difficultyTier: 'hard', seedBase: 14005, elementCount: 10, piecesPerElement: 3, layers: 4, density: 'medium_high', targetPassRate: 0.60, targetDurationSec: [120, 180] },
{ id: 6, difficultyTier: 'boss', seedBase: 14006, elementCount: 10, piecesPerElement: [3,3,3,3,3,6,3,3,3,3], layers: 4, density: 'high', targetPassRate: 0.55, targetDurationSec: [120, 240] },
{ id: 'seoul_01', name: '景福宫', category: 'landmark', rarity: 'core', image: 'images/elements/seoul/seoul_01.png', tags: ['palace'] },
{ id: 'seoul_02', name: '南山塔', category: 'landmark', rarity: 'core', image: 'images/elements/seoul/seoul_02.png', tags: ['tower'] },
{ id: 'seoul_03', name: '石锅拌饭', category: 'food', rarity: 'core', image: 'images/elements/seoul/seoul_03.png', tags: ['rice'] },
{ id: 'seoul_04', name: '韩式炸鸡', category: 'food', rarity: 'core', image: 'images/elements/seoul/seoul_04.png', tags: ['snack'] },
{ id: 'seoul_05', name: '海苔卷', category: 'food', rarity: 'core', image: 'images/elements/seoul/seoul_05.png', tags: ['roll'] },
{ id: 'seoul_06', name: '韩服', category: 'culture', rarity: 'core', image: 'images/elements/seoul/seoul_06.png', tags: ['dress'] },
{ id: 'seoul_07', name: 'K-pop话筒', category: 'culture', rarity: 'core', image: 'images/elements/seoul/seoul_07.png', tags: ['music'] },
{ id: 'seoul_08', name: '烧酒瓶', category: 'item', rarity: 'core', image: 'images/elements/seoul/seoul_08.png', tags: ['drink'] },
{ id: 'seoul_09', name: '太极旗扇', category: 'item', rarity: 'core', image: 'images/elements/seoul/seoul_09.png', tags: ['fan'] },
{ id: 'seoul_10', name: '银杏', category: 'nature', rarity: 'core', image: 'images/elements/seoul/seoul_10.png', tags: ['leaf'] },
{ id: 'seoul_11', name: '柿子', category: 'nature', rarity: 'core', image: 'images/elements/seoul/seoul_11.png', tags: ['fruit'] },
{ id: 'seoul_12', name: '松树', category: 'nature', rarity: 'core', image: 'images/elements/seoul/seoul_12.png', tags: ['tree'] },
],
levelPresets: createLevelPresets(14000),
shareCard: {
titleUnlocked: '我解锁了首尔猫!',
titlePassport: '首尔护照盖章完成',
},
}
export default seoul

View File

@@ -1,9 +1,13 @@
module.exports = {
import { createLevelPresets } from '../shared/level-presets.js'
export const singapore = {
id: 'singapore',
contentVersion: 1,
continentId: 'asia',
countryId: 'singapore_country',
regionId: null,
sortOrder: 5,
unlockAfterCityId: 'seoul',
unlockAfterCityId: 'istanbul',
bundle: {
packId: 'asia-rest',
preload: 'on-city-page',
@@ -11,54 +15,45 @@ module.exports = {
display: {
name: '新加坡',
nameEn: 'Singapore',
bgColor: '#2ECC71',
tagline: '鱼尾狮旁撸猫猫',
funFact: '新加坡是全球绿化覆盖率最高的城市之一',
bgColor: '#00A896',
tagline: '海湾花园看猫猫',
funFact: '新加坡是花园城市国家',
},
cover: {
catImage: 'images/cats/cat_singapore.png',
catThumb: 'images/cats/cat_singapore_thumb.png',
shareAccent: '#F28C28',
shareAccent: '#02C39A',
},
cat: {
id: 'cat_singapore',
name: '狮',
intro: '戴小狮子鬃毛的花猫,骄傲地守护鱼尾狮',
baseColor: '#FFFFFF',
name: '狮',
baseColor: '#F2C078',
pattern: 'calico',
patternColor: '#F28C28',
accessory: '小狮子鬃毛',
expression: 'proud',
accessory: '小狮鬃',
},
passport: {
stampId: 'stamp_singapore',
stampLabel: '新加坡',
},
elements: [
{ id: 'singapore_01', name: '鱼尾狮', category: 'landmark', rarity: 'core', image: 'images/elements/singapore/singapore_01.png', tags: ['statue', 'water', 'iconic'] },
{ id: 'singapore_02', name: '辣椒螃蟹', category: 'food', rarity: 'core', image: 'images/elements/singapore/singapore_02.png', tags: ['seafood', 'spicy', 'red'] },
{ id: 'singapore_03', name: '榴莲建筑', category: 'landmark', rarity: 'core', image: 'images/elements/singapore/singapore_03.png', tags: ['theater', 'spiky', 'modern'] },
{ id: 'singapore_04', name: '叻沙', category: 'food', rarity: 'core', image: 'images/elements/singapore/singapore_04.png', tags: ['noodle', 'coconut', 'spicy'] },
{ id: 'singapore_05', name: '金沙酒店', category: 'landmark', rarity: 'core', image: 'images/elements/singapore/singapore_05.png', tags: ['hotel', 'pool', 'skyline'] },
{ id: 'singapore_06', name: '兰花', category: 'nature', rarity: 'core', image: 'images/elements/singapore/singapore_06.png', tags: ['flower', 'purple', 'national'] },
{ id: 'singapore_07', name: '肉骨茶', category: 'food', rarity: 'core', image: 'images/elements/singapore/singapore_07.png', tags: ['soup', 'herbal', 'pork'] },
{ id: 'singapore_08', name: '冰激凌三明治', category: 'food', rarity: 'core', image: 'images/elements/singapore/singapore_08.png', tags: ['dessert', 'cold', 'colorful'] },
{ id: 'singapore_09', name: '组屋', category: 'culture', rarity: 'core', image: 'images/elements/singapore/singapore_09.png', tags: ['housing', 'colorful', 'block'] },
{ id: 'singapore_10', name: '咖椰吐司', category: 'food', rarity: 'core', image: 'images/elements/singapore/singapore_10.png', tags: ['toast', 'jam', 'breakfast'] },
{ id: 'singapore_11', name: '摩天轮', category: 'item', rarity: 'core', image: 'images/elements/singapore/singapore_11.png', tags: ['wheel', 'night', 'view'] },
{ id: 'singapore_12', name: '热带雨林', category: 'nature', rarity: 'core', image: 'images/elements/singapore/singapore_12.png', tags: ['forest', 'green', 'tropical'] },
{ id: 'singapore_13', name: '娘惹瓷砖', category: 'culture', rarity: 'core', image: 'images/elements/singapore/singapore_13.png', tags: ['tile', 'pattern', 'peranakan'] },
],
levelPresets: [
{ id: 1, difficultyTier: 'intro', seedBase: 15001, elementCount: 6, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.95, targetDurationSec: [60, 120] },
{ id: 2, difficultyTier: 'easy', seedBase: 15002, elementCount: 7, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.90, targetDurationSec: [60, 120] },
{ id: 3, difficultyTier: 'normal', seedBase: 15003, elementCount: 8, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.80, targetDurationSec: [90, 150] },
{ id: 4, difficultyTier: 'normal', seedBase: 15004, elementCount: 9, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.70, targetDurationSec: [90, 150] },
{ id: 5, difficultyTier: 'hard', seedBase: 15005, elementCount: 10, piecesPerElement: 3, layers: 4, density: 'medium_high', targetPassRate: 0.60, targetDurationSec: [120, 180] },
{ id: 6, difficultyTier: 'boss', seedBase: 15006, elementCount: 10, piecesPerElement: [3,3,3,3,3,6,3,3,3,3], layers: 4, density: 'high', targetPassRate: 0.55, targetDurationSec: [120, 240] },
{ id: 'singapore_01', name: '鱼尾狮', category: 'landmark', rarity: 'core', image: 'images/elements/singapore/singapore_01.png', tags: ['statue'] },
{ id: 'singapore_02', name: '金沙酒店', category: 'landmark', rarity: 'core', image: 'images/elements/singapore/singapore_02.png', tags: ['hotel'] },
{ id: 'singapore_03', name: '叻沙', category: 'food', rarity: 'core', image: 'images/elements/singapore/singapore_03.png', tags: ['noodle'] },
{ id: 'singapore_04', name: '辣椒螃蟹', category: 'food', rarity: 'core', image: 'images/elements/singapore/singapore_04.png', tags: ['crab'] },
{ id: 'singapore_05', name: '咖椰吐司', category: 'food', rarity: 'core', image: 'images/elements/singapore/singapore_05.png', tags: ['toast'] },
{ id: 'singapore_06', name: '娘惹花砖', category: 'culture', rarity: 'core', image: 'images/elements/singapore/singapore_06.png', tags: ['tile'] },
{ id: 'singapore_07', name: '小红点贴纸', category: 'culture', rarity: 'core', image: 'images/elements/singapore/singapore_07.png', tags: ['badge'] },
{ id: 'singapore_08', name: '冰淇淋三明治', category: 'item', rarity: 'core', image: 'images/elements/singapore/singapore_08.png', tags: ['cart'] },
{ id: 'singapore_09', name: '组屋钥匙', category: 'item', rarity: 'core', image: 'images/elements/singapore/singapore_09.png', tags: ['key'] },
{ id: 'singapore_10', name: '兰花', category: 'nature', rarity: 'core', image: 'images/elements/singapore/singapore_10.png', tags: ['flower'] },
{ id: 'singapore_11', name: '榴莲', category: 'nature', rarity: 'core', image: 'images/elements/singapore/singapore_11.png', tags: ['fruit'] },
{ id: 'singapore_12', name: '雨树', category: 'nature', rarity: 'core', image: 'images/elements/singapore/singapore_12.png', tags: ['tree'] },
],
levelPresets: createLevelPresets(15000),
shareCard: {
titleUnlocked: '我解锁了新加坡猫!',
titlePassport: '新加坡护照盖章完成',
},
}
export default singapore

View File

@@ -1,9 +1,13 @@
module.exports = {
import { createLevelPresets } from '../shared/level-presets.js'
export const tokyo = {
id: 'tokyo',
contentVersion: 1,
continentId: 'asia',
countryId: 'japan',
regionId: null,
sortOrder: 2,
unlockAfterCityId: 'beijing',
unlockAfterCityId: 'bangkok',
bundle: {
packId: 'asia-rest',
preload: 'on-city-page',
@@ -11,55 +15,45 @@ module.exports = {
display: {
name: '东京',
nameEn: 'Tokyo',
bgColor: '#E84057',
tagline: '东京タワー下的喵',
funFact: '东京的铁路网是世界上最密集的',
bgColor: '#FF6F91',
tagline: '樱花街头看猫猫',
funFact: '东京拥有世界级的铁路网络',
},
cover: {
catImage: 'images/cats/cat_tokyo.png',
catThumb: 'images/cats/cat_tokyo_thumb.png',
shareAccent: '#FFB7C5',
shareAccent: '#FF9671',
},
cat: {
id: 'cat_tokyo',
name: '樱',
intro: '戴着招财猫铃铛的白猫,喜欢在樱花树下打盹',
baseColor: '#FFFFFF',
name: '樱',
baseColor: '#F7F7F7',
pattern: 'solid',
patternColor: '#F5F5F5',
accessory: '招财猫铃铛',
expression: 'wink',
accessory: '铃铛',
},
passport: {
stampId: 'stamp_tokyo',
stampLabel: '东京',
},
elements: [
{ id: 'tokyo_01', name: '寿司', category: 'food', rarity: 'core', image: 'images/elements/tokyo/tokyo_01.png', tags: ['fish', 'rice', 'fresh'] },
{ id: 'tokyo_02', name: '招财猫', category: 'culture', rarity: 'core', image: 'images/elements/tokyo/tokyo_02.png', tags: ['lucky', 'cat', 'golden'] },
{ id: 'tokyo_03', name: '富士山', category: 'landmark', rarity: 'core', image: 'images/elements/tokyo/tokyo_03.png', tags: ['mountain', 'snow', 'iconic'] },
{ id: 'tokyo_04', name: '樱花', category: 'nature', rarity: 'core', image: 'images/elements/tokyo/tokyo_04.png', tags: ['flower', 'pink', 'spring'] },
{ id: 'tokyo_05', name: '鸟居', category: 'landmark', rarity: 'core', image: 'images/elements/tokyo/tokyo_05.png', tags: ['gate', 'red', 'shrine'] },
{ id: 'tokyo_06', name: '拉面', category: 'food', rarity: 'core', image: 'images/elements/tokyo/tokyo_06.png', tags: ['noodle', 'hot', 'bowl'] },
{ id: 'tokyo_07', name: '抹茶', category: 'food', rarity: 'core', image: 'images/elements/tokyo/tokyo_07.png', tags: ['tea', 'green', 'powder'] },
{ id: 'tokyo_08', name: '浮世绘', category: 'culture', rarity: 'core', image: 'images/elements/tokyo/tokyo_08.png', tags: ['art', 'wave', 'woodblock'] },
{ id: 'tokyo_09', name: '新干线', category: 'item', rarity: 'core', image: 'images/elements/tokyo/tokyo_09.png', tags: ['train', 'fast', 'white'] },
{ id: 'tokyo_10', name: '达摩', category: 'culture', rarity: 'core', image: 'images/elements/tokyo/tokyo_10.png', tags: ['doll', 'red', 'wish'] },
{ id: 'tokyo_11', name: '和服扇', category: 'item', rarity: 'core', image: 'images/elements/tokyo/tokyo_11.png', tags: ['fan', 'elegant', 'pattern'] },
{ id: 'tokyo_12', name: '章鱼烧', category: 'food', rarity: 'core', image: 'images/elements/tokyo/tokyo_12.png', tags: ['octopus', 'ball', 'street-food'] },
{ id: 'tokyo_13', name: '东京塔', category: 'landmark', rarity: 'accent', image: 'images/elements/tokyo/tokyo_13.png', tags: ['tower', 'orange', 'night'] },
{ id: 'tokyo_14', name: '柴犬', category: 'nature', rarity: 'accent', image: 'images/elements/tokyo/tokyo_14.png', tags: ['dog', 'cute', 'fluffy'] },
],
levelPresets: [
{ id: 1, difficultyTier: 'intro', seedBase: 12001, elementCount: 6, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.95, targetDurationSec: [60, 120] },
{ id: 2, difficultyTier: 'easy', seedBase: 12002, elementCount: 7, piecesPerElement: 3, layers: 2, density: 'low', targetPassRate: 0.90, targetDurationSec: [60, 120] },
{ id: 3, difficultyTier: 'normal', seedBase: 12003, elementCount: 8, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.80, targetDurationSec: [90, 150] },
{ id: 4, difficultyTier: 'normal', seedBase: 12004, elementCount: 9, piecesPerElement: 3, layers: 3, density: 'medium', targetPassRate: 0.70, targetDurationSec: [90, 150] },
{ id: 5, difficultyTier: 'hard', seedBase: 12005, elementCount: 10, piecesPerElement: 3, layers: 4, density: 'medium_high', targetPassRate: 0.60, targetDurationSec: [120, 180] },
{ id: 6, difficultyTier: 'boss', seedBase: 12006, elementCount: 10, piecesPerElement: [3,3,3,3,3,6,3,3,3,3], layers: 4, density: 'high', targetPassRate: 0.55, targetDurationSec: [120, 240] },
{ id: 'tokyo_01', name: '东京塔', category: 'landmark', rarity: 'core', image: 'images/elements/tokyo/tokyo_01.png', tags: ['tower'] },
{ id: 'tokyo_02', name: '鸟居', category: 'landmark', rarity: 'core', image: 'images/elements/tokyo/tokyo_02.png', tags: ['gate'] },
{ id: 'tokyo_03', name: '寿司', category: 'food', rarity: 'core', image: 'images/elements/tokyo/tokyo_03.png', tags: ['rice'] },
{ id: 'tokyo_04', name: '拉面', category: 'food', rarity: 'core', image: 'images/elements/tokyo/tokyo_04.png', tags: ['noodle'] },
{ id: 'tokyo_05', name: '章鱼烧', category: 'food', rarity: 'core', image: 'images/elements/tokyo/tokyo_05.png', tags: ['snack'] },
{ id: 'tokyo_06', name: '招财猫', category: 'culture', rarity: 'core', image: 'images/elements/tokyo/tokyo_06.png', tags: ['lucky'] },
{ id: 'tokyo_07', name: '浮世绘', category: 'culture', rarity: 'core', image: 'images/elements/tokyo/tokyo_07.png', tags: ['art'] },
{ id: 'tokyo_08', name: '和服扇', category: 'item', rarity: 'core', image: 'images/elements/tokyo/tokyo_08.png', tags: ['fan'] },
{ id: 'tokyo_09', name: '新干线', category: 'item', rarity: 'core', image: 'images/elements/tokyo/tokyo_09.png', tags: ['ticket'] },
{ id: 'tokyo_10', name: '樱花', category: 'nature', rarity: 'core', image: 'images/elements/tokyo/tokyo_10.png', tags: ['flower'] },
{ id: 'tokyo_11', name: '富士山', category: 'nature', rarity: 'core', image: 'images/elements/tokyo/tokyo_11.png', tags: ['mountain'] },
{ id: 'tokyo_12', name: '锦鲤', category: 'nature', rarity: 'core', image: 'images/elements/tokyo/tokyo_12.png', tags: ['fish'] },
],
levelPresets: createLevelPresets(12000),
shareCard: {
titleUnlocked: '我解锁了东京猫!',
titlePassport: '东京护照盖章完成',
},
}
export default tokyo