Split custom world generation into staged lightweight batches
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
2026-04-05 22:20:30 +08:00
parent 89cecda7da
commit fcd8d727b0
57 changed files with 7646 additions and 1425 deletions

View File

@@ -1,88 +1,16 @@
type AffinityLevelMeta = {
label: string;
minAffinity: number;
nextAffinity: number | null;
description: string;
accentClassName: string;
};
import {
AFFINITY_PROGRESS_MARKERS,
AFFINITY_PROGRESS_MAX,
AFFINITY_PROGRESS_MIN,
getAffinityLevelMeta,
} from '../data/affinityLevels';
type AffinityProgressMarker = {
value: number;
label: string;
};
const AFFINITY_PROGRESS_MIN = -40;
const AFFINITY_PROGRESS_MAX = 90;
const AFFINITY_LEVELS: AffinityLevelMeta[] = [
{
label: '敌对',
minAffinity: Number.NEGATIVE_INFINITY,
nextAffinity: 0,
description:
'好感落入负值区间后,会按敌对关系处理,靠近时通常直接进入对战。',
accentClassName: 'border-rose-300/28 bg-rose-500/14 text-rose-100',
},
{
label: '戒备',
minAffinity: 0,
nextAffinity: 15,
description: '对方仍保持明显距离,只会给出谨慎而有限的回应。',
accentClassName: 'border-white/12 bg-white/8 text-zinc-100',
},
{
label: '缓和',
minAffinity: 15,
nextAffinity: 30,
description: '戒备已经开始松动,愿意正常交流,也会试探性配合你的节奏。',
accentClassName: 'border-sky-300/20 bg-sky-500/10 text-sky-100',
},
{
label: '友善',
minAffinity: 30,
nextAffinity: 60,
description: '态度明显友善了许多,愿意配合行动,也会给出更真诚的反馈。',
accentClassName: 'border-emerald-300/20 bg-emerald-500/10 text-emerald-100',
},
{
label: '信任',
minAffinity: 60,
nextAffinity: 90,
description: '双方已经建立稳定信任,对方更愿意分享想法、资源和立场。',
accentClassName: 'border-amber-300/20 bg-amber-500/10 text-amber-100',
},
{
label: '深交',
minAffinity: 90,
nextAffinity: null,
description: '关系已经非常亲近,对方几乎把你视作可以托付后背的自己人。',
accentClassName: 'border-rose-300/22 bg-rose-500/12 text-rose-100',
},
];
const DEFAULT_AFFINITY_LEVEL = AFFINITY_LEVELS[0]!;
const AFFINITY_PROGRESS_MARKERS: AffinityProgressMarker[] = [
{ value: -40, label: '敌对' },
{ value: 0, label: '戒备' },
{ value: 15, label: '缓和' },
{ value: 30, label: '友善' },
{ value: 60, label: '信任' },
{ value: 90, label: '深交' },
];
type AffinityProgressMarker = (typeof AFFINITY_PROGRESS_MARKERS)[number];
function clamp(value: number, min: number, max: number) {
return Math.min(max, Math.max(min, value));
}
function getAffinityLevelMeta(affinity: number) {
return (
[...AFFINITY_LEVELS]
.reverse()
.find((level) => affinity >= level.minAffinity) ?? DEFAULT_AFFINITY_LEVEL
);
}
function getNextAffinityMarker(affinity: number) {
const currentLevel = getAffinityLevelMeta(affinity);
if (currentLevel.nextAffinity == null) return null;