feat: season 2 'Summer Tide' content and manifest generator
Adds Summer Tide (season_002) — 30 stages with deep-teal gradient and cyan accent — generated remote-only (no copyToAssets). Introduces tool/make_manifest.dart to rebuild content/manifest.json from all season packs with SHA-256 verification support. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"schemaVersion": 1,
|
||||||
|
"minAppBuild": 1,
|
||||||
|
"current": "season_002",
|
||||||
|
"seasons": [
|
||||||
|
{
|
||||||
|
"seasonId": "season_001",
|
||||||
|
"version": 1,
|
||||||
|
"packUrl": "seasons/season_001/pack.json",
|
||||||
|
"sha256": "5b20b88251931838563aaaa7729f48e5a35f09dbf80c576b9bc2ec944050fc0a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"seasonId": "season_002",
|
||||||
|
"version": 1,
|
||||||
|
"packUrl": "seasons/season_002/pack.json",
|
||||||
|
"sha256": "47cc115f9982ade7df686b28aa95a82edcc1e8a4aae5f13319e7131477855de3"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,36 @@
|
|||||||
|
# season_002 difficulty report
|
||||||
|
|
||||||
|
30 stages, 80 bot runs each, generated in 4s.
|
||||||
|
|
||||||
|
| stage | objective | moves | bot win rate | 2★/3★ movesLeft |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| season_002_001 | clearGems 1 | 7 | 83% | 3/4 |
|
||||||
|
| season_002_002 | clearGems 1 | 8 | 79% | 4/5 |
|
||||||
|
| season_002_003 | clearGems 2 | 11 | 91% | 4/5 |
|
||||||
|
| season_002_004 | clearGems 2 | 12 | 86% | 5/6 |
|
||||||
|
| season_002_005 | reachScore 990 | 25 | 100% | 6/9 |
|
||||||
|
| season_002_006 | clearGems 3 | 24 | 74% | 11/17 |
|
||||||
|
| season_002_007 | clearLines 5 | 23 | 100% | 6/8 |
|
||||||
|
| season_002_008 | clearGems 2 | 6 | 75% | 2/3 |
|
||||||
|
| season_002_009 | clearGems 4 | 14 | 86% | 6/7 |
|
||||||
|
| season_002_010 | reachScore 1476 | 31 | 100% | 9/11 |
|
||||||
|
| season_002_011 | clearGems 4 | 16 | 95% | 6/9 |
|
||||||
|
| season_002_012 | clearGems 4 | 15 | 70% | 5/7 |
|
||||||
|
| season_002_013 | clearGems 4 | 20 | 75% | 9/11 |
|
||||||
|
| season_002_014 | clearLines 7 | 27 | 99% | 5/7 |
|
||||||
|
| season_002_015 | reachScore 1766 | 30 | 96% | 4/8 |
|
||||||
|
| season_002_016 | clearGems 5 | 10 | 73% | 3/5 |
|
||||||
|
| season_002_017 | clearGems 5 | 21 | 65% | 7/10 |
|
||||||
|
| season_002_018 | clearGems 6 | 27 | 74% | 9/13 |
|
||||||
|
| season_002_019 | clearGems 6 | 20 | 73% | 4/7 |
|
||||||
|
| season_002_020 | reachScore 2185 | 33 | 93% | 5/8 |
|
||||||
|
| season_002_021 | clearLines 8 | 23 | 79% | 1/3 |
|
||||||
|
| season_002_022 | clearGems 5 | 28 | 85% | 6/12 |
|
||||||
|
| season_002_023 | clearGems 7 | 26 | 76% | 6/10 |
|
||||||
|
| season_002_024 | clearGems 7 | 21 | 83% | 5/10 |
|
||||||
|
| season_002_025 | reachScore 2692 | 39 | 93% | 7/11 |
|
||||||
|
| season_002_026 | clearGems 6 | 31 | 59% | 9/15 |
|
||||||
|
| season_002_027 | clearGems 6 | 13 | 65% | 2/5 |
|
||||||
|
| season_002_028 | clearLines 10 | 27 | 89% | 2/4 |
|
||||||
|
| season_002_029 | clearGems 7 | 27 | 69% | 8/10 |
|
||||||
|
| season_002_030 | reachScore 3006 | 37 | 80% | 2/6 |
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"seasonId": "season_002",
|
||||||
|
"version": 1,
|
||||||
|
"title": { "en": "Summer Tide", "ko": "여름 파도" },
|
||||||
|
"theme": {
|
||||||
|
"tileSet": "summer",
|
||||||
|
"background": "",
|
||||||
|
"backgroundGradient": [4278854704, 4279253322, 4280179302],
|
||||||
|
"accentColor": 4285517301,
|
||||||
|
"particleType": "petals"
|
||||||
|
},
|
||||||
|
"stageCount": 30,
|
||||||
|
"baseSeed": 20260612,
|
||||||
|
"runsPerStage": 80
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:crypto/crypto.dart';
|
||||||
|
|
||||||
|
/// Builds content/manifest.json from the season packs under content/.
|
||||||
|
/// Usage: dart run tool/make_manifest.dart
|
||||||
|
void main() {
|
||||||
|
final contentDir = Directory('content');
|
||||||
|
final seasons = <Map<String, dynamic>>[];
|
||||||
|
|
||||||
|
final dirs = contentDir
|
||||||
|
.listSync()
|
||||||
|
.whereType<Directory>()
|
||||||
|
.where((d) => File('${d.path}/pack.json').existsSync())
|
||||||
|
.toList()
|
||||||
|
..sort((a, b) => a.path.compareTo(b.path));
|
||||||
|
|
||||||
|
for (final dir in dirs) {
|
||||||
|
final file = File('${dir.path}/pack.json');
|
||||||
|
final bytes = file.readAsBytesSync();
|
||||||
|
final pack = jsonDecode(utf8.decode(bytes)) as Map<String, dynamic>;
|
||||||
|
seasons.add({
|
||||||
|
'seasonId': pack['seasonId'],
|
||||||
|
'version': pack['version'],
|
||||||
|
'packUrl': 'seasons/${pack['seasonId']}/pack.json',
|
||||||
|
'sha256': sha256.convert(bytes).toString(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
final manifest = {
|
||||||
|
'schemaVersion': 1,
|
||||||
|
'minAppBuild': 1,
|
||||||
|
'current': seasons.isEmpty ? '' : seasons.last['seasonId'],
|
||||||
|
'seasons': seasons,
|
||||||
|
};
|
||||||
|
|
||||||
|
File('content/manifest.json').writeAsStringSync(
|
||||||
|
'${const JsonEncoder.withIndent(" ").convert(manifest)}\n');
|
||||||
|
stdout.writeln('manifest.json written with ${seasons.length} season(s).');
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user