content: regenerate Season 1 with a gentle onboarding difficulty curve

Generator: raise the early bot-win-rate floor to ~0.97 (near-guaranteed first
stages), widen the early move-buffer margin, and delay score-chase/line-sprint
objectives until stage 9/13 so the opening stretch is pure clear-a-gem. Result:
stage 1 now 16 moves (was 11), stages 1-9 all simple gems at 90-99% bot win.
Preserves theme.bgm=season_001; manifest SHA regenerated. Settings tag -> build 4.
This commit is contained in:
2026-06-14 11:02:29 +09:00
parent 1682578501
commit 7c7c7afad0
7 changed files with 880 additions and 861 deletions
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -7,7 +7,7 @@
"seasonId": "season_001",
"version": 1,
"packUrl": "seasons/season_001/pack.json",
"sha256": "6018fc20187e5835e1a5bc5a3626479dcd448e3a9f35c708b89722587a881468"
"sha256": "8d09f85bf2d2af8c80d7de20b17b4f65a7df5587e8728a7182fed82b9e507f4a"
},
{
"seasonId": "season_002",
File diff suppressed because it is too large Load Diff
+58 -58
View File
@@ -1,66 +1,66 @@
# season_001 difficulty report
60 stages, 80 bot runs each, generated in 10s.
60 stages, 80 bot runs each, generated in 9s.
| stage | objective | moves | bot win rate | 2★/3★ movesLeft |
|---|---|---|---|---|
| season_001_001 | clearGems 2 | 11 | 89% | 4/5 |
| season_001_002 | clearGems 1 | 7 | 79% | 3/4 |
| season_001_003 | clearGems 1 | 6 | 90% | 2/3 |
| season_001_004 | clearGems 2 | 13 | 84% | 5/6 |
| season_001_005 | reachScore 888 | 28 | 99% | 9/12 |
| season_001_006 | clearGems 3 | 11 | 79% | 4/5 |
| season_001_007 | clearLines 4 | 19 | 100% | 6/8 |
| season_001_008 | clearGems 2 | 6 | 75% | 2/3 |
| season_001_009 | clearGems 2 | 8 | 75% | 3/4 |
| season_001_010 | reachScore 1017 | 27 | 99% | 8/10 |
| season_001_011 | clearGems 2 | 7 | 79% | 2/3 |
| season_001_012 | clearGems 3 | 22 | 79% | 9/12 |
| season_001_013 | clearGems 2 | 12 | 79% | 2/5 |
| season_001_014 | clearLines 5 | 24 | 100% | 7/9 |
| season_001_015 | reachScore 1243 | 30 | 100% | 8/11 |
| season_001_016 | clearGems 4 | 23 | 73% | 7/10 |
| season_001_017 | clearGems 3 | 18 | 73% | 10/11 |
| season_001_018 | clearGems 4 | 14 | 83% | 4/7 |
| season_001_019 | clearGems 3 | 16 | 78% | 5/6 |
| season_001_020 | reachScore 1478 | 32 | 99% | 7/11 |
| season_001_021 | clearLines 5 | 22 | 100% | 6/7 |
| season_001_022 | clearGems 4 | 26 | 86% | 10/13 |
| season_001_023 | clearGems 3 | 10 | 70% | 3/4 |
| season_001_024 | clearGems 3 | 18 | 80% | 5/8 |
| season_001_025 | reachScore 1707 | 28 | 85% | 3/6 |
| season_001_026 | clearGems 5 | 19 | 76% | 3/7 |
| season_001_027 | clearGems 5 | 17 | 86% | 4/8 |
| season_001_028 | clearLines 6 | 20 | 95% | 3/4 |
| season_001_029 | clearGems 4 | 23 | 88% | 7/10 |
| season_001_030 | reachScore 1838 | 28 | 86% | 3/6 |
| season_001_031 | clearGems 5 | 28 | 81% | 8/12 |
| season_001_032 | clearGems 5 | 23 | 74% | 5/9 |
| season_001_001 | clearGems 2 | 16 | 99% | 9/10 |
| season_001_002 | clearGems 1 | 11 | 96% | 7/8 |
| season_001_003 | clearGems 1 | 7 | 98% | 3/4 |
| season_001_004 | clearGems 2 | 20 | 96% | 10/13 |
| season_001_005 | clearGems 1 | 13 | 96% | 8/9 |
| season_001_006 | clearGems 3 | 16 | 94% | 9/10 |
| season_001_007 | clearGems 3 | 20 | 98% | 10/13 |
| season_001_008 | clearGems 2 | 10 | 95% | 6/7 |
| season_001_009 | clearGems 2 | 11 | 91% | 4/7 |
| season_001_010 | reachScore 1017 | 37 | 99% | 18/20 |
| season_001_011 | clearGems 2 | 11 | 90% | 6/7 |
| season_001_012 | clearGems 3 | 29 | 90% | 14/19 |
| season_001_013 | clearGems 2 | 15 | 93% | 5/8 |
| season_001_014 | clearLines 5 | 32 | 100% | 15/17 |
| season_001_015 | reachScore 1243 | 39 | 100% | 17/20 |
| season_001_016 | clearGems 4 | 30 | 91% | 11/16 |
| season_001_017 | clearGems 3 | 24 | 89% | 14/17 |
| season_001_018 | clearGems 4 | 19 | 94% | 9/12 |
| season_001_019 | clearGems 3 | 20 | 90% | 7/10 |
| season_001_020 | reachScore 1478 | 42 | 99% | 17/21 |
| season_001_021 | clearLines 5 | 29 | 100% | 13/14 |
| season_001_022 | clearGems 4 | 34 | 93% | 18/21 |
| season_001_023 | clearGems 3 | 13 | 84% | 6/7 |
| season_001_024 | clearGems 3 | 23 | 90% | 10/12 |
| season_001_025 | reachScore 1707 | 46 | 100% | 21/24 |
| season_001_026 | clearGems 5 | 25 | 95% | 9/12 |
| season_001_027 | clearGems 5 | 21 | 93% | 8/12 |
| season_001_028 | clearLines 6 | 29 | 100% | 12/13 |
| season_001_029 | clearGems 4 | 29 | 98% | 12/16 |
| season_001_030 | reachScore 1838 | 41 | 100% | 15/19 |
| season_001_031 | clearGems 5 | 36 | 90% | 14/20 |
| season_001_032 | clearGems 5 | 29 | 89% | 10/15 |
| season_001_033 | clearGems 4 | 24 | 73% | 11/14 |
| season_001_034 | clearGems 4 | 21 | 74% | 5/8 |
| season_001_034 | clearGems 4 | 27 | 94% | 8/14 |
| season_001_035 | clearLines 8 | 24 | 88% | 2/4 |
| season_001_036 | clearGems 6 | 25 | 65% | 5/8 |
| season_001_037 | clearGems 6 | 17 | 86% | 6/9 |
| season_001_038 | clearGems 6 | 29 | 78% | 10/15 |
| season_001_039 | clearGems 6 | 29 | 73% | 6/12 |
| season_001_040 | reachScore 2328 | 32 | 80% | 2/6 |
| season_001_041 | clearGems 5 | 17 | 73% | 5/8 |
| season_001_042 | clearLines 9 | 25 | 78% | 1/4 |
| season_001_043 | clearGems 6 | 22 | 79% | 5/9 |
| season_001_044 | clearGems 6 | 26 | 75% | 6/10 |
| season_001_036 | clearGems 6 | 31 | 85% | 9/13 |
| season_001_037 | clearGems 6 | 21 | 95% | 8/12 |
| season_001_038 | clearGems 6 | 36 | 85% | 16/22 |
| season_001_039 | clearGems 6 | 35 | 83% | 10/17 |
| season_001_040 | reachScore 2328 | 33 | 81% | 3/7 |
| season_001_041 | clearGems 5 | 21 | 81% | 8/12 |
| season_001_042 | clearLines 9 | 27 | 95% | 2/5 |
| season_001_043 | clearGems 6 | 27 | 88% | 9/14 |
| season_001_044 | clearGems 6 | 31 | 91% | 9/15 |
| season_001_045 | reachScore 2451 | 34 | 88% | 4/6 |
| season_001_046 | clearGems 6 | 22 | 74% | 6/9 |
| season_001_047 | clearGems 7 | 21 | 79% | 5/8 |
| season_001_048 | clearGems 7 | 26 | 71% | 6/11 |
| season_001_049 | clearLines 9 | 24 | 68% | 1/2 |
| season_001_050 | reachScore 2726 | 37 | 93% | 4/8 |
| season_001_051 | clearGems 6 | 24 | 78% | 5/10 |
| season_001_052 | clearGems 6 | 21 | 65% | 5/8 |
| season_001_053 | clearGems 6 | 28 | 83% | 9/14 |
| season_001_054 | clearGems 7 | 21 | 78% | 6/8 |
| season_001_055 | reachScore 2978 | 39 | 91% | 5/8 |
| season_001_056 | clearLines 11 | 30 | 83% | 2/4 |
| season_001_057 | clearGems 7 | 16 | 74% | 5/7 |
| season_001_058 | clearGems 8 | 20 | 85% | 7/10 |
| season_001_059 | clearGems 8 | 23 | 59% | 6/10 |
| season_001_060 | reachScore 3145 | 37 | 60% | 1/5 |
| season_001_046 | clearGems 6 | 26 | 83% | 9/13 |
| season_001_047 | clearGems 7 | 24 | 88% | 8/11 |
| season_001_048 | clearGems 7 | 30 | 75% | 10/15 |
| season_001_049 | clearLines 9 | 25 | 86% | 2/3 |
| season_001_050 | reachScore 2726 | 33 | 60% | 2/6 |
| season_001_051 | clearGems 6 | 28 | 90% | 9/13 |
| season_001_052 | clearGems 6 | 25 | 83% | 8/12 |
| season_001_053 | clearGems 6 | 32 | 88% | 13/18 |
| season_001_054 | clearGems 7 | 22 | 84% | 6/9 |
| season_001_055 | reachScore 2978 | 38 | 89% | 4/7 |
| season_001_056 | clearLines 11 | 28 | 69% | 1/2 |
| season_001_057 | clearGems 7 | 18 | 76% | 7/8 |
| season_001_058 | clearGems 8 | 22 | 88% | 9/12 |
| season_001_059 | clearGems 8 | 26 | 71% | 7/13 |
| season_001_060 | reachScore 3145 | 38 | 71% | 2/5 |
+1 -1
View File
@@ -2,7 +2,7 @@
"seasonId": "season_001",
"version": 1,
"title": { "en": "First Bloom", "ko": "첫 개화" },
"theme": { "tileSet": "spring", "background": "background.webp" },
"theme": { "tileSet": "spring", "background": "background.webp", "bgm": "season_001" },
"stageCount": 60,
"baseSeed": 20260611,
"runsPerStage": 80,
+1 -1
View File
@@ -79,7 +79,7 @@ class SettingsScreen extends ConsumerWidget {
const SizedBox(height: 24),
Center(
child: Text(
'Block Seasons · v1.0.0 (build 3)',
'Block Seasons · v1.0.0 (build 4)',
style: TextStyle(
color: Colors.white.withValues(alpha: 0.4),
fontSize: 12,
+11 -6
View File
@@ -106,8 +106,10 @@ ${reportRows.join('\n')}
/// weaker than the bot, so the floor stays high — and early stages are
/// allowed to be a guaranteed win (onboarding).
(double, double) _band(double t) => (
0.78 - 0.30 * t,
t < 0.4 ? 1.0 : 1.0 - 0.10 * (t - 0.4) / 0.6,
// Near-guaranteed onboarding (the bot easily clears the first stages, so
// a human does too), ramping to a genuine challenge by the season's end.
0.97 - 0.50 * t,
t < 0.5 ? 1.0 : 1.0 - 0.12 * (t - 0.5) / 0.5,
);
(StageConfig, double, List<int>)? _buildCandidate(
@@ -145,7 +147,9 @@ ${reportRows.join('\n')}
movesToWin.sort();
final median = movesToWin[movesToWin.length ~/ 2];
final margin = 0.45 - 0.25 * t;
// Generous early move buffer over what the bot needs (humans place less
// optimally and the piece RNG won't always cooperate), tightening later.
final margin = 1.0 - 0.65 * t;
var moveLimit = (median * (1 + margin)).ceil().clamp(6, 60);
// Validate at the real budget; nudge the budget up/down until the win
@@ -248,11 +252,12 @@ Objective _sampleObjective(
int index, double t, List<PresetCell> preset, SeededRng rng) {
final gemCount =
preset.where((c) => c.type == CellType.gem).length;
// Variety beats: every 5th stage is a score chase, every 7th a line sprint.
if (index % 7 == 6) {
// Keep the opening stretch pure "clear a gem" onboarding; introduce the
// score-chase and line-sprint variety only once the player has settled in.
if (index >= 12 && index % 7 == 6) {
return Objective.clearLines(3 + (t * 7).round() + rng.nextInt(2));
}
if (index % 5 == 4) {
if (index >= 8 && index % 5 == 4) {
return Objective.reachScore(600 + (t * 2400).round() + rng.nextInt(200));
}
return Objective.clearGems(gemCount);