273 lines
6.4 KiB
JavaScript
273 lines
6.4 KiB
JavaScript
|
|
// ==================== 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)) {
|
||
|
|
// 事件条件满足,由事件引擎决定是否触发
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|