feat(levels): c50c trades one good idea repeated for five that alternate

c50b is sealed where it stands, as a reference sample rather than a candidate.
Its packed construction was judged good — clearing a board from the rim inward
is the experience it proved out — but at 32 of 50 levels it played as one level
fifty times: 体验太单一了,因为基本都是满盘. The note on why it is kept lives at
the top of its module, because the lesson is the useful part.

It was monotonous on a second axis nobody asked about. 环绕 and 花瓣, the two
route families the brief singles out as the good-looking ones, were absent from
it entirely — not by choice but by a crossing threshold. At 1.0 crossings per
cell, 0% of orbits boards pass and 4% of spirals; at 1.2, 84% and 94% do. The
gate meant to answer "交叉点太多" had quietly deleted the families most worth
looking at, so it moves to 1.2 — still half the 2.36 that drew the complaint.

c50c alternates five kinds of level every three to five: packed boards down to
32%, long-route departures to watch, deep locks to solve, small quick boards,
and segments given over to orbits, petals and spirals by name. All six families
appear, no family exceeds 24%, and the plan is 13 segments rather than 9.

Selection learned to ask for variety outright — by family, piece count and
longest drawn route — instead of hoping it falls out of a difficulty score.

Rule bot across all three: 50/50 cleared and zero dead taps everywhere; c50c
sits between the other two on blind rotations and on how much there is to do.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
cabinw
2026-09-15 15:53:26 +08:00
co-authored by Claude Opus 5
parent e447d1f807
commit 6e72b95ad8
9 changed files with 824965 additions and 16 deletions
+6
View File
@@ -5,6 +5,7 @@ import { PRODUCTION_CAMPAIGN, PRODUCTION_LEVELS } from './levels-v05.js';
import { TUTORIAL_LEVELS } from './tutorial-levels.js';
import { C50_CAMPAIGN, C50_LEVELS } from './levels-c50.js';
import { C50B_CAMPAIGN, C50B_LEVELS } from './levels-c50b.js';
import { C50C_CAMPAIGN, C50C_LEVELS } from './levels-c50c.js';
// Public layout versions are distinct from the level JSON schema's `version: 1`.
// Historical layouts stay intact; all editions share the current game rules.
@@ -44,6 +45,11 @@ export const CAMPAIGN_VERSIONS = [
chapters:C50B_CAMPAIGN.chapters, chapterSize:C50B_CAMPAIGN.chapterSize, levels:C50B_LEVELS,
legacyStorageKeys:[],
},
{
id:C50C_CAMPAIGN.id, name:C50C_CAMPAIGN.name, description:C50C_CAMPAIGN.description,
chapters:C50C_CAMPAIGN.chapters, chapterSize:C50C_CAMPAIGN.chapterSize, levels:C50C_LEVELS,
legacyStorageKeys:[],
},
];
export const DEFAULT_CAMPAIGN_VERSION = 'v0.5';
export function campaignVersion(id) {
+13 -2
View File
@@ -1,8 +1,19 @@
// Generated by scripts/select-50.mjs --id=c50b — do not edit by hand.
//
// SEALED 2026-09-15, kept as a reference sample rather than as a candidate for
// shipping. 32 of its 50 levels are packed boards, which on playtest read as one
// level fifty times over: "体验太单一了,因为基本都是满盘". Two families the
// design brief calls out as the good-looking ones — 环绕 and 花瓣 — are absent
// from it entirely, filtered upstream by a crossing threshold of 1.0 that orbits
// sits just above (0% of orbits boards pass at 1.0, 84% pass at 1.2).
//
// It is worth keeping because the packed construction itself was judged good:
// the experience of clearing from the rim inward is what this set proved out.
// What it also proves is that one good idea at 64% is not a campaign.
export const C50B_CAMPAIGN = {
"id": "c50b",
"name": "五十关 · 满盘版",
"description": "外圈留空、内部填满的满盘为主,由外向内逐层清空;深锁关卡穿插其间做变奏。",
"name": "五十关 · 满盘版(封存)",
"description": "封存样本:满盘占 64%,实测体验过于单一。保留用于复盘满盘构造本身。",
"chapters": [
"起步",
"转起来",
File diff suppressed because one or more lines are too long