Honey Village: six model builds + hub frontend, Dockerized for Dokploy

This commit is contained in:
2026-07-15 10:50:12 -04:00
commit 67253bded5
523 changed files with 58879 additions and 0 deletions
+191
View File
@@ -0,0 +1,191 @@
/** Dialogue lines — clean source; corruption applied at render */
import type { NpcId } from './npcs';
export interface DialogOption {
label: string;
choice: 'gentle' | 'hesitant' | 'negate';
}
export interface DialogLine {
speaker: string;
npcId?: NpcId;
text: string;
options?: DialogOption[];
}
export const GENERIC_GREET: Record<string, DialogLine[]> = {
afu: [
{
speaker: '阿福',
npcId: 'afu',
text: '欢迎来到蜜糖村!看看公告板吧,今天的幸福任务都在上面。',
options: [
{ label: '好的,谢谢!', choice: 'gentle' },
{ label: '……任务?', choice: 'hesitant' },
{ label: '我不想做任务。', choice: 'negate' },
],
},
],
yuanyuan: [
{
speaker: '圆圆',
npcId: 'yuanyuan',
text: '刚出炉的蜂蜜面包,甜甜的,给你也留了一份哦。',
options: [
{ label: '好香啊,谢谢!', choice: 'gentle' },
{ label: '每天都是这个味道吗?', choice: 'hesitant' },
{ label: '我不太饿。', choice: 'negate' },
],
},
],
dabao: [
{
speaker: '大宝',
npcId: 'dabao',
text: '信件都送到了吗?大家都在等着幸福的消息呢。',
options: [
{ label: '我会帮忙的。', choice: 'gentle' },
{ label: '邮戳看起来都一样……', choice: 'hesitant' },
{ label: '我不送信。', choice: 'negate' },
],
},
],
mimi: [
{
speaker: '咪咪',
npcId: 'mimi',
text: '欢迎光临!今天的阳光真好,幸福满满的一天呢!',
options: [
{ label: '是啊,很美好。', choice: 'gentle' },
{ label: '货架上的标签……是空的?', choice: 'hesitant' },
{ label: '没什么好买的。', choice: 'negate' },
],
},
],
fu: [
{
speaker: '芙医生',
npcId: 'fu',
text: '村里有诊所,但你不需要去那里哦。你看起来很健康。',
options: [
{ label: '谢谢关心。', choice: 'gentle' },
{ label: '桌上的表格是什么?', choice: 'hesitant' },
{ label: '我其实不太舒服。', choice: 'negate' },
],
},
],
gui: [
{
speaker: '龟爷爷',
npcId: 'gui',
text: '湖水一直很平静。孩子,慢慢走,不必急。',
options: [
{ label: '好的,爷爷。', choice: 'gentle' },
{ label: '您想说什么?', choice: 'hesitant' },
{ label: '我不想听劝。', choice: 'negate' },
],
},
],
};
/** Soft redirect when approaching well/fog before D5 */
export const REDIRECT_WELL: DialogLine[] = [
{
speaker: '阿福',
npcId: 'afu',
text: '古井那里没有什么好看的哦。回广场晒晒阳光吧,会更开心的。',
},
];
export const REDIRECT_FOG: DialogLine[] = [
{
speaker: '阿福',
npcId: 'afu',
text: '雾墙外面什么都没有呀。村里才是最幸福的地方,留下来吧。',
},
];
export const RAIN_NPC_LINES: DialogLine[] = [
{
speaker: '圆圆',
npcId: 'yuanyuan',
text: '今天天气真好呢,一点都不潮湿。要来块面包吗?',
},
{
speaker: '大宝',
npcId: 'dabao',
text: '阳光真刺眼啊……啊,我是说,很适合送信。',
},
{
speaker: '咪咪',
npcId: 'mimi',
text: '完美的晴天!货架都亮晶晶的,幸福呀!',
},
];
export const TASK_LINES = {
breadOffer: {
speaker: '圆圆',
npcId: 'yuanyuan' as NpcId,
text: '蜂蜜面包好了!请帮我送给大宝、咪咪和龟爷爷,好吗?',
},
breadThanks: (name: string) => ({
speaker: name,
text: '哇,蜂蜜面包!谢谢你,真开心!',
}),
letterOffer: {
speaker: '大宝',
npcId: 'dabao' as NpcId,
text: '能帮我把这三封信送给圆圆、咪咪和芙医生吗?',
},
stockCount: {
speaker: '咪咪',
npcId: 'mimi' as NpcId,
text: '帮我清点一下货架好不好?东西好像……有点多。',
},
knead: {
speaker: '圆圆',
npcId: 'yuanyuan' as NpcId,
text: '能帮我揉一会儿面吗?当然,你也可以拒绝哦,今天是自由日。',
options: [
{ label: '好,我来帮你。', choice: 'gentle' as const },
{ label: '我再想想。', choice: 'hesitant' as const },
{ label: '拒绝。', choice: 'negate' as const },
],
},
boardWipe: {
speaker: '阿福',
npcId: 'afu' as NpcId,
text: '公告板有点旧了,擦一擦会更精神。不愿意的话也可以哦。',
options: [
{ label: '我来擦。', choice: 'gentle' as const },
{ label: '旧字迹是什么?', choice: 'hesitant' as const },
{ label: '拒绝。', choice: 'negate' as const },
],
},
picnic: {
speaker: '旁白',
text: '你在湖畔野餐布旁坐下。微风很甜,湖面倒影慢了半拍。',
},
smileStart: {
speaker: '阿福',
npcId: 'afu' as NpcId,
text: '庆典准备好了。请保持微笑,站在这里,六十秒。大家都会看着你。',
},
};
export const CLUE_REVEAL: Record<string, string> = {
C1: '床头日历的每一页……都是同一个日期。',
C2: '配方纸背面写着:「按疗程配比。甜度:最大。」',
C3: '散落的信件上,所有邮戳都是同一天。',
C4: '署名闪过乱码:PT-0▓',
C5: '货架上同一商品重复九格,标签全部空白。',
C6: '旧字迹叠着:「第 412 届」……「第 411 届」……「第 410 届」。',
C7: '井底传来极轻的监护仪滴声……',
C8: '表格抬头被手肘挡住,只露出「…谷情绪疗…」。',
C9: '孩子,今天是第几个今天?',
};
export const FORCE_CELEBRATION_LINE =
'忽然,彩带与笑声从四面八方涌来——欢乐庆典强制开始了。你也可以从场景边缘离开。';