nav: 三级导航分页结构 + 中国地区索引

- 02-game-design 地图结构重写:洲→国家→城市,3x3棋盘分页
- 中国 40 城按 8 地区分组(华北/东北/华东/华中/华南/西南/西北/港澳)
- 导航索引数据:continents/index + asia + regions/china + pagination工具

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
manpengan
2026-03-28 23:20:58 +08:00
parent 2d960632d6
commit faeb453a64
7 changed files with 355 additions and 21 deletions

View File

@@ -0,0 +1,32 @@
// 亚洲国家列表 — 16 国,分 2 页
export const asiaCountries = [
// Page 1
{ id: 'china', name: '中国', nameEn: 'China', sortOrder: 1, themeColor: '#CC2936', hasRegions: true, totalCities: 40 },
{ id: 'japan', name: '日本', nameEn: 'Japan', sortOrder: 2, themeColor: '#E84057', hasRegions: false, totalCities: 4 },
{ id: 'korea', name: '韩国', nameEn: 'South Korea', sortOrder: 3, themeColor: '#4A90D9', hasRegions: false, totalCities: 3 },
{ id: 'thailand', name: '泰国', nameEn: 'Thailand', sortOrder: 4, themeColor: '#FFB347', hasRegions: false, totalCities: 3 },
{ id: 'singapore', name: '新加坡', nameEn: 'Singapore', sortOrder: 5, themeColor: '#00A896', hasRegions: false, totalCities: 1 },
{ id: 'vietnam', name: '越南', nameEn: 'Vietnam', sortOrder: 6, themeColor: '#E74C3C', hasRegions: false, totalCities: 2 },
{ id: 'malaysia', name: '马来西亚', nameEn: 'Malaysia', sortOrder: 7, themeColor: '#3498DB', hasRegions: false, totalCities: 2 },
{ id: 'indonesia', name: '印度尼西亚', nameEn: 'Indonesia', sortOrder: 8, themeColor: '#E67E22', hasRegions: false, totalCities: 2 },
{ id: 'philippines', name: '菲律宾', nameEn: 'Philippines', sortOrder: 9, themeColor: '#2ECC71', hasRegions: false, totalCities: 1 },
// Page 2
{ id: 'india', name: '印度', nameEn: 'India', sortOrder: 10, themeColor: '#FF9933', hasRegions: false, totalCities: 2 },
{ id: 'uae', name: '阿联酋', nameEn: 'UAE', sortOrder: 11, themeColor: '#C0A062', hasRegions: false, totalCities: 1 },
{ id: 'turkey', name: '土耳其', nameEn: 'Turkey', sortOrder: 12, themeColor: '#1A5276', hasRegions: false, totalCities: 1 },
{ id: 'israel', name: '以色列', nameEn: 'Israel', sortOrder: 13, themeColor: '#5DADE2', hasRegions: false, totalCities: 1 },
{ id: 'nepal', name: '尼泊尔', nameEn: 'Nepal', sortOrder: 14, themeColor: '#DC143C', hasRegions: false, totalCities: 1 },
{ id: 'cambodia', name: '柬埔寨', nameEn: 'Cambodia', sortOrder: 15, themeColor: '#1E8449', hasRegions: false, totalCities: 1 },
{ id: 'sri_lanka', name: '斯里兰卡', nameEn: 'Sri Lanka', sortOrder: 16, themeColor: '#8E44AD', hasRegions: false, totalCities: 1 },
{ id: 'myanmar', name: '缅甸', nameEn: 'Myanmar', sortOrder: 17, themeColor: '#F4D03F', hasRegions: false, totalCities: 1 },
{ id: 'mongolia', name: '蒙古', nameEn: 'Mongolia', sortOrder: 18, themeColor: '#2980B9', hasRegions: false, totalCities: 1 },
]
// 分页2 页
export const asiaCountryPages = [
asiaCountries.slice(0, 9),
asiaCountries.slice(9),
]
export default asiaCountries

View File

@@ -0,0 +1,16 @@
// 洲索引 — 3x3 棋盘第 1 级
// 每页 9 格,当前 6 个洲 + 3 空位
export const continents = [
{ id: 'asia', name: '亚洲', nameEn: 'Asia', sortOrder: 1, themeColor: '#FF6B6B', icon: '🏯', totalCities: 70 },
{ id: 'europe', name: '欧洲', nameEn: 'Europe', sortOrder: 2, themeColor: '#6B8CFF', icon: '🏰', totalCities: 28 },
{ id: 'north_america', name: '北美洲', nameEn: 'North America', sortOrder: 3, themeColor: '#FFB347', icon: '🗽', totalCities: 12 },
{ id: 'south_america', name: '南美洲', nameEn: 'South America', sortOrder: 4, themeColor: '#4ECDC4', icon: '🌴', totalCities: 7 },
{ id: 'africa', name: '非洲', nameEn: 'Africa', sortOrder: 5, themeColor: '#F7DC6F', icon: '🦁', totalCities: 5 },
{ id: 'oceania', name: '大洋洲', nameEn: 'Oceania', sortOrder: 6, themeColor: '#82E0AA', icon: '🦘', totalCities: 4 },
]
// 分页1 页6 项 ≤ 9
export const continentPages = [continents]
export default continents

View File

@@ -0,0 +1,7 @@
export const japanCities = {
countryId: 'japan',
cityIds: ['tokyo', 'osaka', 'kyoto', 'sapporo'],
// 4 城市1 页
}
export default japanCities

View File

@@ -0,0 +1,73 @@
// 中国地区列表 — 8 个地区1 页
export const chinaRegions = [
{
id: 'north_china',
name: '华北',
nameEn: 'North China',
sortOrder: 1,
themeColor: '#CC2936',
cityIds: ['beijing', 'tianjin', 'shijiazhuang', 'taiyuan', 'hohhot'],
},
{
id: 'northeast',
name: '东北',
nameEn: 'Northeast',
sortOrder: 2,
themeColor: '#5DADE2',
cityIds: ['shenyang', 'changchun', 'harbin', 'dalian'],
},
{
id: 'east_china',
name: '华东',
nameEn: 'East China',
sortOrder: 3,
themeColor: '#2ECC71',
cityIds: ['shanghai', 'nanjing', 'hangzhou', 'hefei', 'fuzhou', 'nanchang', 'jinan', 'suzhou', 'xiamen', 'qingdao', 'ningbo'],
},
{
id: 'central_china',
name: '华中',
nameEn: 'Central China',
sortOrder: 4,
themeColor: '#E67E22',
cityIds: ['zhengzhou', 'wuhan', 'changsha'],
},
{
id: 'south_china',
name: '华南',
nameEn: 'South China',
sortOrder: 5,
themeColor: '#FF6B6B',
cityIds: ['guangzhou', 'shenzhen', 'nanning', 'haikou', 'sanya'],
},
{
id: 'southwest',
name: '西南',
nameEn: 'Southwest',
sortOrder: 6,
themeColor: '#9B59B6',
cityIds: ['chengdu', 'chongqing', 'guiyang', 'kunming', 'lhasa'],
},
{
id: 'northwest',
name: '西北',
nameEn: 'Northwest',
sortOrder: 7,
themeColor: '#F4D03F',
cityIds: ['xian', 'lanzhou', 'xining', 'yinchuan', 'urumqi'],
},
{
id: 'hk_macao',
name: '港澳',
nameEn: 'HK & Macao',
sortOrder: 8,
themeColor: '#E74C3C',
cityIds: ['hongkong', 'macao'],
},
]
// 分页1 页8 项 ≤ 9
export const chinaRegionPages = [chinaRegions]
export default chinaRegions

View File

@@ -0,0 +1,70 @@
export function createLevelPresets(seedBase) {
return [
{
id: 1,
difficultyTier: 'intro',
seedBase: seedBase + 1,
elementCount: 6,
piecesPerElement: 3,
layers: 2,
density: 'low',
targetPassRate: 0.95,
targetDurationSec: [90, 150],
},
{
id: 2,
difficultyTier: 'warmup',
seedBase: seedBase + 2,
elementCount: 7,
piecesPerElement: 3,
layers: 2,
density: 'low',
targetPassRate: 0.9,
targetDurationSec: [100, 160],
},
{
id: 3,
difficultyTier: 'ramp',
seedBase: seedBase + 3,
elementCount: 8,
piecesPerElement: 3,
layers: 3,
density: 'medium',
targetPassRate: 0.8,
targetDurationSec: [120, 180],
},
{
id: 4,
difficultyTier: 'mid',
seedBase: seedBase + 4,
elementCount: 9,
piecesPerElement: 3,
layers: 3,
density: 'medium',
targetPassRate: 0.7,
targetDurationSec: [130, 190],
},
{
id: 5,
difficultyTier: 'hard',
seedBase: seedBase + 5,
elementCount: 10,
piecesPerElement: 3,
layers: 4,
density: 'medium_high',
targetPassRate: 0.6,
targetDurationSec: [150, 220],
},
{
id: 6,
difficultyTier: 'boss',
seedBase: seedBase + 6,
elementCount: 10,
piecesPerElement: [3, 3, 3, 3, 3, 6, 3, 3, 3, 3],
layers: 4,
density: 'high',
targetPassRate: 0.55,
targetDurationSec: [180, 260],
},
]
}

View File

@@ -0,0 +1,14 @@
// 通用分页工具 — 将数组按 pageSize 分页
// 默认 pageSize = 93x3 棋盘)
export function paginate(items, pageSize = 9) {
const pages = []
for (let i = 0; i < items.length; i += pageSize) {
pages.push(items.slice(i, i + pageSize))
}
return pages
}
export function getPageCount(totalItems, pageSize = 9) {
return Math.ceil(totalItems / pageSize)
}