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:
32
js/content/continents/asia.js
Normal file
32
js/content/continents/asia.js
Normal 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
|
||||
16
js/content/continents/index.js
Normal file
16
js/content/continents/index.js
Normal 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
|
||||
7
js/content/countries/japan.js
Normal file
7
js/content/countries/japan.js
Normal file
@@ -0,0 +1,7 @@
|
||||
export const japanCities = {
|
||||
countryId: 'japan',
|
||||
cityIds: ['tokyo', 'osaka', 'kyoto', 'sapporo'],
|
||||
// 4 城市,1 页
|
||||
}
|
||||
|
||||
export default japanCities
|
||||
73
js/content/regions/china.js
Normal file
73
js/content/regions/china.js
Normal 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
|
||||
70
js/content/shared/level-presets.js
Normal file
70
js/content/shared/level-presets.js
Normal 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],
|
||||
},
|
||||
]
|
||||
}
|
||||
14
js/content/shared/pagination.js
Normal file
14
js/content/shared/pagination.js
Normal file
@@ -0,0 +1,14 @@
|
||||
// 通用分页工具 — 将数组按 pageSize 分页
|
||||
// 默认 pageSize = 9(3x3 棋盘)
|
||||
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user