Files
rebirthlife/src/content/npcs.js
T

273 lines
6.4 KiB
JavaScript
Raw Normal View History

// ==================== NPC系统 ====================
import { state, addLog } from '../engine/state.js';
// NPC定义
export const NPCS = {
old_beggar: {
id: 'old_beggar',
name: '老乞丐',
description: '一个衣衫褴褛的神秘老人',
relation: { trust: 0, favor: 0 },
// NPC事件线
eventLine: [
{
day: 30,
eventId: 'beggar_first_meet',
condition: (s) => !s.worldFlags.met_old_beggar,
},
{
day: 200,
eventId: 'beggar_teach',
condition: (s) => s.worldFlags.met_old_beggar && s.npcs.old_beggar?.favor > 20,
},
{
day: 500,
eventId: 'beggar_death',
condition: (s) => s.worldFlags.met_old_beggar && s.age > 50,
},
],
// 互动选项
interactions: [
{
id: 'give_food',
text: '给食物',
effect: (s) => {
s.npcs.old_beggar.favor += 10;
s.npcs.old_beggar.trust += 5;
addLog('老乞丐感激地收下了食物。');
}
},
{
id: 'ask_story',
text: '询问往事',
requirement: (s) => s.npcs.old_beggar.trust > 10,
effect: (s) => {
addLog('老乞丐讲述了一个关于江湖的传说...');
s.stats.wisdom += 0.2;
}
},
]
},
taoist_priest: {
id: 'taoist_priest',
name: '云游道士',
description: '一位行踪不定的修行者',
relation: { trust: 0, favor: 0 },
eventLine: [
{
day: 100,
eventId: 'taoist_first_meet',
condition: (s) => !s.worldFlags.met_taoist && s.stats.wisdom >= 3,
},
{
day: 300,
eventId: 'taoist_test',
condition: (s) => s.worldFlags.met_taoist && s.stats.wisdom >= 5,
},
],
interactions: [
{
id: 'ask_cultivation',
text: '请教修炼',
effect: (s) => {
addLog('道士传授了你一些呼吸吐纳之法。');
s.stats.wisdom += 0.3;
}
},
]
},
zhangsan: {
id: 'zhangsan',
name: '张三',
description: '村里的普通村民',
relation: { trust: 0, favor: 0 },
eventLine: [
{
day: 50,
eventId: 'zhangsan_marriage',
condition: (s) => !s.worldFlags.zhangsan_married,
},
{
day: 300,
eventId: 'zhangsan_child',
condition: (s) => s.worldFlags.zhangsan_married,
},
{
day: 800,
eventId: 'zhangsan_death',
condition: (s) => s.worldFlags.zhangsan_married && s.age > 60,
},
],
},
lisi: {
id: 'lisi',
name: '李四',
description: '镇上的商人',
relation: { trust: 0, favor: 0 },
eventLine: [
{
day: 150,
eventId: 'lisi_shop',
condition: (s) => !s.worldFlags.met_lisi,
},
],
interactions: [
{
id: 'trade',
text: '交易',
effect: (s) => {
addLog('和李四做了一笔生意。');
s.stats.charm += 0.1;
}
},
{
id: 'ask_news',
text: '打听消息',
effect: (s) => {
addLog('李四告诉你最近蛮族在边境活动频繁。');
s.stats.wisdom += 0.1;
}
},
]
},
wangwu: {
id: 'wangwu',
name: '王五',
description: '一个神秘的危险人物',
relation: { trust: -20, favor: -20 },
eventLine: [
{
day: 200,
eventId: 'wangwu_ambush',
condition: (s) => !s.worldFlags.met_wangwu && s.careers.hoodlum?.level >= 5,
},
{
day: 600,
eventId: 'wangwu_revenge',
condition: (s) => s.worldFlags.wangwu_humiliated,
},
],
},
};
// NPC事件定义
export const NPC_EVENTS = [
{
id: 'beggar_first_meet',
title: '偶遇',
text: '你在街头遇到了一个衣衫褴褛的老乞丐。',
isChoice: true,
defaultChoice: 0,
choices: [
{
text: '给些银钱',
effect: (s) => {
s.worldFlags.met_old_beggar = true;
s.npcs.old_beggar = { favor: 10, trust: 5 };
addLog('老乞丐感激地收下了。');
return {};
}
},
{
text: '视而不见',
effect: (s) => {
s.worldFlags.met_old_beggar = true;
s.npcs.old_beggar = { favor: -5, trust: 0 };
return {};
}
}
]
},
{
id: 'taoist_first_meet',
title: '云游道士',
text: '一位道士在山中与你相遇。',
isChoice: true,
defaultChoice: 0,
choices: [
{
text: '请教修行',
effect: (s) => {
s.worldFlags.met_taoist = true;
s.npcs.taoist_priest = { favor: 15, trust: 10 };
addLog('道士对你颇有好感,传授了一些心法。');
s.stats.wisdom += 0.5;
return {};
}
},
{
text: '礼貌离开',
effect: (s) => {
s.worldFlags.met_taoist = true;
s.npcs.taoist_priest = { favor: 0, trust: 0 };
return {};
}
}
]
},
{
id: 'zhangsan_marriage',
title: '喜事',
text: '张三今天娶了邻村的姑娘,村里举行了热闹的婚礼。',
isChoice: false,
effect: (s) => {
s.worldFlags.zhangsan_married = true;
addLog('张三结婚了!村里喜气洋洋。');
return {};
}
},
{
id: 'wangwu_ambush',
title: '埋伏',
text: '王五带着人堵住了你的去路。',
isChoice: true,
defaultChoice: 0,
choices: [
{
text: ' fight',
requirement: (s) => s.stats.body >= 5,
effect: (s) => {
if (s.stats.body + s.stats.luck >= 7) {
addLog('你打败了王五,他灰溜溜地逃走了。');
s.worldFlags.wangwu_humiliated = true;
} else {
addLog('你被王五打伤了。');
s.stats.body -= 2;
}
return {};
}
},
{
text: '逃跑',
effect: (s) => {
addLog('你趁乱逃走了。');
return {};
}
}
]
},
];
// 注册NPC事件
export function registerNPCEvents(eventEngine) {
for (const ev of NPC_EVENTS) {
eventEngine.register(ev);
}
}
// 检查NPC事件线
export function checkNPCEvents() {
for (const [npcId, npc] of Object.entries(NPCS)) {
for (const eventNode of npc.eventLine || []) {
if (eventNode.condition(state)) {
// 事件条件满足,由事件引擎决定是否触发
}
}
}
}