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