import type { GameContent } from '@tinywaste/game-core'; export const gameContent: GameContent = { version: '0.1.0', inventoryCapacity: 36, storageCapacity: 84, items: { water_dirty: { id: 'water_dirty', name: '浑水', desc: '简单过滤前的桶装浑水。能解渴,但会让身体吃点苦头。', type: 'water', stackLimit: 8, volume: 1, baseValue: 4, effects: [ { type: 'change-stat', stat: 'thirst', amount: 18 }, { type: 'change-stat', stat: 'radiation', amount: 4 }, ], }, water_purified: { id: 'water_purified', name: '净水', desc: '烧开并过滤后的安全饮用水。', type: 'water', stackLimit: 8, volume: 1, baseValue: 9, effects: [ { type: 'change-stat', stat: 'thirst', amount: 28 }, { type: 'change-stat', stat: 'radiation', amount: -2 }, ], }, canned_beans: { id: 'canned_beans', name: '罐装豆子', desc: '味道一般,但稳定可靠。', type: 'food', stackLimit: 6, volume: 1, baseValue: 10, effects: [ { type: 'change-stat', stat: 'hunger', amount: 22 }, { type: 'change-stat', stat: 'energy', amount: 4 }, ], }, jerky: { id: 'jerky', name: '风干肉条', desc: '便携,耐放,口感像旧皮带。', type: 'food', stackLimit: 8, volume: 1, baseValue: 7, effects: [{ type: 'change-stat', stat: 'hunger', amount: 14 }], }, herbal_tea: { id: 'herbal_tea', name: '草根热茶', desc: '温热、苦涩,但能让心跳慢下来。', type: 'water', stackLimit: 6, volume: 1, baseValue: 12, effects: [ { type: 'change-stat', stat: 'thirst', amount: 10 }, { type: 'change-stat', stat: 'sanity', amount: 8 }, ], }, field_bandage: { id: 'field_bandage', name: '野战绷带', desc: '沾了草药的简易绷带,止血比止痛更靠谱。', type: 'medicine', stackLimit: 5, volume: 1, baseValue: 15, effects: [ { type: 'change-stat', stat: 'life', amount: 18 }, { type: 'change-stat', stat: 'sanity', amount: 2 }, ], }, rad_pills: { id: 'rad_pills', name: '抗辐片', desc: '味道像粉笔,但能压住身体里的灼烧感。', type: 'medicine', stackLimit: 4, volume: 1, baseValue: 20, effects: [ { type: 'change-stat', stat: 'radiation', amount: -18 }, { type: 'change-stat', stat: 'sanity', amount: -4 }, ], }, mushroom_stew: { id: 'mushroom_stew', name: '蘑菇炖罐', desc: '热量不高,但足够让人重新像个人。', type: 'food', stackLimit: 4, volume: 2, baseValue: 18, effects: [ { type: 'change-stat', stat: 'hunger', amount: 18 }, { type: 'change-stat', stat: 'sanity', amount: 6 }, ], }, scrap_metal: { id: 'scrap_metal', name: '废金属', desc: '废墟社会的硬通货之一。', type: 'material', stackLimit: 12, volume: 1, baseValue: 3, }, wood_plank: { id: 'wood_plank', name: '旧木板', desc: '潮湿、开裂,但还能用。', type: 'material', stackLimit: 10, volume: 1, baseValue: 2, }, cloth_rag: { id: 'cloth_rag', name: '破布', desc: '包扎、擦拭、打火都能凑合。', type: 'material', stackLimit: 12, volume: 1, baseValue: 2, }, herb_bundle: { id: 'herb_bundle', name: '草药束', desc: '来自雨后的田边和破墙根。', type: 'material', stackLimit: 10, volume: 1, baseValue: 5, }, mushroom_cluster: { id: 'mushroom_cluster', name: '菌簇', desc: '颜色看着危险,但煮透了还能吃。', type: 'material', stackLimit: 8, volume: 1, baseValue: 4, }, filter_charcoal: { id: 'filter_charcoal', name: '过滤炭芯', desc: '净水和自制滤芯的核心。', type: 'material', stackLimit: 8, volume: 1, baseValue: 6, }, parts_wire: { id: 'parts_wire', name: '导线零件', desc: '断头的电线、卡扣和焊片,能救急。', type: 'material', stackLimit: 10, volume: 1, baseValue: 6, }, ammo_rifle: { id: 'ammo_rifle', name: '步枪弹', desc: '数量永远嫌少。', type: 'ammo', stackLimit: 20, volume: 1, baseValue: 5, }, shiv: { id: 'shiv', name: '磨尖铁片', desc: '贴身时很有说服力。', type: 'weapon', stackLimit: 1, volume: 2, baseValue: 16, equipSlot: 'weapon', combat: { damageMin: 7, damageMax: 11, range: 1, hitBonus: 0.04, critChance: 0.08, critMult: 1.6, }, }, crowbar: { id: 'crowbar', name: '撬棍', desc: '开门、撬箱、打人都很好使。', type: 'tool', stackLimit: 1, volume: 3, baseValue: 22, equipSlot: 'tool', combat: { damageMin: 9, damageMax: 14, range: 1, hitBonus: 0.02, critChance: 0.06, critMult: 1.5, }, }, pipe_rifle: { id: 'pipe_rifle', name: '管式步枪', desc: '看着像会炸膛,但比徒手讲道理要强。', type: 'weapon', stackLimit: 1, volume: 4, baseValue: 36, equipSlot: 'weapon', combat: { damageMin: 15, damageMax: 23, range: 4, hitBonus: 0.12, critChance: 0.1, critMult: 1.8, }, }, leather_coat: { id: 'leather_coat', name: '旧皮衣', desc: '不轻,但能扛风也能扛爪子。', type: 'armor', stackLimit: 1, volume: 3, baseValue: 26, equipSlot: 'body', combat: { damageMin: 0, damageMax: 0, range: 0, hitBonus: 0, armor: 2, dodgeBonus: 0.02, radiationResist: 1, }, }, field_filter: { id: 'field_filter', name: '野外滤芯', desc: '套在呼吸面罩和水瓶上的双用滤芯。', type: 'quest', stackLimit: 1, volume: 2, baseValue: 30, }, metro_keycard: { id: 'metro_keycard', name: '地铁门禁卡', desc: '塑料边缘已经卷起,但芯片还活着。', type: 'quest', stackLimit: 1, volume: 1, baseValue: 0, }, }, buffs: { warm_rest: { id: 'warm_rest', name: '稍微缓过来了', desc: '这点休息让身体没那么紧绷。', durationMin: 180, modifiers: { sanity: 0.01 }, }, }, recipes: { purify_water: { id: 'purify_water', name: '净化浑水', desc: '把能喝和不能喝的差别,再往前推一步。', workbenchType: 'craft', inputs: [ { itemId: 'water_dirty', count: 1 }, { itemId: 'filter_charcoal', count: 1 }, ], outputs: [{ itemId: 'water_purified', count: 1 }], timeCostMin: 18, energyCost: 3, }, craft_bandage: { id: 'craft_bandage', name: '缠一卷绷带', desc: '草药和破布混一混,也比流血强。', workbenchType: 'craft', inputs: [ { itemId: 'cloth_rag', count: 2 }, { itemId: 'herb_bundle', count: 1 }, ], outputs: [{ itemId: 'field_bandage', count: 1 }], timeCostMin: 16, energyCost: 4, }, craft_shiv: { id: 'craft_shiv', name: '再磨一把铁片', desc: '野外最便宜的威慑力。', workbenchType: 'craft', inputs: [ { itemId: 'scrap_metal', count: 2 }, { itemId: 'cloth_rag', count: 1 }, ], outputs: [{ itemId: 'shiv', count: 1 }], timeCostMin: 22, energyCost: 5, }, brew_tea: { id: 'brew_tea', name: '煮一壶草根茶', desc: '喝下去之前像药,喝下去之后也像药。', workbenchType: 'craft', inputs: [ { itemId: 'water_purified', count: 1 }, { itemId: 'herb_bundle', count: 1 }, ], outputs: [{ itemId: 'herbal_tea', count: 1 }], timeCostMin: 14, energyCost: 2, }, cook_stew: { id: 'cook_stew', name: '炖一锅菌菇罐头', desc: '废土里的高级菜。', workbenchType: 'craft', inputs: [ { itemId: 'mushroom_cluster', count: 1 }, { itemId: 'canned_beans', count: 1 }, ], outputs: [{ itemId: 'mushroom_stew', count: 1 }], timeCostMin: 28, energyCost: 5, }, assemble_filter: { id: 'assemble_filter', name: '组装野外滤芯', desc: '没有它,往深处走就是拿器官打赌。', workbenchType: 'craft', requirements: [{ kind: 'quest-state', questId: 'q_signal_hunt', state: 'completed' }], inputs: [ { itemId: 'filter_charcoal', count: 2 }, { itemId: 'parts_wire', count: 1 }, { itemId: 'cloth_rag', count: 1 }, ], outputs: [{ itemId: 'field_filter', count: 1 }], timeCostMin: 30, energyCost: 6, }, repair_rifle: { id: 'repair_rifle', name: '装一把管式步枪', desc: '有点像工程,有点像祈祷。', workbenchType: 'craft', requirements: [{ kind: 'flag', flag: 'met_trader', value: true }], inputs: [ { itemId: 'scrap_metal', count: 4 }, { itemId: 'parts_wire', count: 2 }, { itemId: 'wood_plank', count: 1 }, ], outputs: [{ itemId: 'pipe_rifle', count: 1 }], timeCostMin: 44, energyCost: 8, }, }, places: { home: { id: 'home', name: '临时避难点', desc: '一间被塑料布和铁皮拼起来的临时屋。这里不安全,但至少属于你。', tags: ['home', 'safe'], dangerLevel: 1, services: ['craft', 'rest'], actions: [ { id: 'home_rain_barrel', name: '检查雨水桶', kind: 'resource', desc: '夜里结的露和前天的雨还剩一点。', timeCostMin: 18, energyCost: 2, risk: 0.05, rewardHint: '稳定获取水', stock: { initial: 2, max: 4, refreshMin: 240, amountPerRefresh: 1 }, lootTable: [{ itemId: 'water_dirty', min: 1, max: 2, chance: 1 }], onEmptyText: '桶里只有一层灰。', }, { id: 'home_salvage_corner', name: '翻整理堆角', kind: 'scavenge', desc: '破屋的角落总会冒出一点还没用上的东西。', timeCostMin: 22, energyCost: 4, risk: 0.08, rewardHint: '少量基础材料', stock: { initial: 2, max: 3, refreshMin: 360, amountPerRefresh: 1 }, lootTable: [ { itemId: 'cloth_rag', min: 1, max: 2, chance: 0.8 }, { itemId: 'scrap_metal', min: 1, max: 2, chance: 0.7 }, { itemId: 'wood_plank', min: 1, max: 1, chance: 0.5 }, ], onEmptyText: '这个角落已经被翻干净了。', }, { id: 'home_listen_radio', name: '调一下旧收音机', kind: 'investigate', desc: '噪音里时不时会蹦出半截有用的话。', timeCostMin: 14, energyCost: 1, risk: 0.1, rewardHint: '可能得到线索', eventPool: ['home_radio_note'], }, ], }, roadside: { id: 'roadside', name: '近郊土路', desc: '从避难点延伸出去的一段土路,车辙里总积着灰和碎玻璃。', tags: ['road'], dangerLevel: 2, services: [], actions: [ { id: 'roadside_forage', name: '路边翻草丛', kind: 'resource', desc: '有时能翻到蘑菇,有时能翻到麻烦。', timeCostMin: 20, energyCost: 4, risk: 0.18, rewardHint: '草药与菌类', stock: { initial: 2, max: 3, refreshMin: 300, amountPerRefresh: 1 }, lootTable: [ { itemId: 'herb_bundle', min: 1, max: 2, chance: 0.75 }, { itemId: 'mushroom_cluster', min: 1, max: 1, chance: 0.55 }, ], }, { id: 'roadside_car', name: '搜废车后备箱', kind: 'scavenge', desc: '锁已经坏了,剩下的问题是谁先把它搜空。', timeCostMin: 28, energyCost: 5, risk: 0.22, rewardHint: '零件、金属、偶发补给', stock: { initial: 2, max: 3, refreshMin: 360, amountPerRefresh: 1 }, lootTable: [ { itemId: 'parts_wire', min: 1, max: 1, chance: 0.55 }, { itemId: 'scrap_metal', min: 1, max: 2, chance: 0.85 }, { itemId: 'water_dirty', min: 1, max: 1, chance: 0.35 }, ], eventPool: ['road_bandit_glimpse'], }, ], }, old_store: { id: 'old_store', name: '废弃便利店', desc: '玻璃门早就没了,里面剩下的是空包装、鼠窝和一点没被发现的东西。', tags: ['ruins'], dangerLevel: 4, services: [], actions: [ { id: 'store_shelves', name: '翻货架', kind: 'scavenge', desc: '越靠里,越有可能翻到别人没拿走的东西。', timeCostMin: 32, energyCost: 6, risk: 0.32, rewardHint: '食物与材料', stock: { initial: 3, max: 4, refreshMin: 420, amountPerRefresh: 1 }, lootTable: [ { itemId: 'canned_beans', min: 1, max: 1, chance: 0.45 }, { itemId: 'scrap_metal', min: 1, max: 2, chance: 0.8 }, { itemId: 'filter_charcoal', min: 1, max: 1, chance: 0.35 }, ], eventPool: ['store_rats', 'store_basement_cache'], }, { id: 'store_pharmacy', name: '撬药柜', kind: 'investigate', desc: '药柜门板卡着,幸运的话还会有剩药。', timeCostMin: 24, energyCost: 5, risk: 0.26, rewardHint: '药物与线索', stock: { initial: 1, max: 1, refreshMin: 9999, amountPerRefresh: 0 }, lootTable: [ { itemId: 'field_bandage', min: 1, max: 1, chance: 0.65 }, { itemId: 'rad_pills', min: 1, max: 1, chance: 0.4 }, ], eventPool: ['store_clinic_note'], }, ], }, village_market: { id: 'village_market', name: '村庄集市', desc: '用铁皮棚和布幔围起来的集市,所有人都在盯着所有人。', tags: ['settlement', 'safe'], dangerLevel: 2, services: ['trade', 'rest', 'info'], actions: [ { id: 'market_rumors', name: '打听风声', kind: 'investigate', desc: '消息要么值钱,要么要命。', timeCostMin: 18, energyCost: 2, risk: 0.08, rewardHint: '任务线索', eventPool: ['market_broker'], }, { id: 'market_herbs', name: '逛草药摊', kind: 'resource', desc: '有人把烂根和能治命的东西摆在了一起。', timeCostMin: 14, energyCost: 1, risk: 0.04, rewardHint: '草药和茶材', stock: { initial: 1, max: 2, refreshMin: 360, amountPerRefresh: 1 }, lootTable: [ { itemId: 'herb_bundle', min: 1, max: 2, chance: 1 }, { itemId: 'filter_charcoal', min: 1, max: 1, chance: 0.4 }, ], }, ], tradeOffers: [ { id: 'offer_clean_water', name: '用废金属换净水', desc: '三个废金属换一瓶净水。', costs: [{ itemId: 'scrap_metal', count: 3 }], gives: [{ itemId: 'water_purified', count: 1 }], }, { id: 'offer_bandage', name: '用草药换绷带', desc: '草药和破布能换别人做好的绷带。', costs: [ { itemId: 'herb_bundle', count: 1 }, { itemId: 'cloth_rag', count: 1 }, ], gives: [{ itemId: 'field_bandage', count: 1 }], }, { id: 'offer_ammo', name: '换一点子弹', desc: '凑零件的人永远知道弹药的价。', costs: [ { itemId: 'scrap_metal', count: 4 }, { itemId: 'parts_wire', count: 1 }, ], gives: [{ itemId: 'ammo_rifle', count: 4 }], }, ], }, rain_farm: { id: 'rain_farm', name: '雨棚农地', desc: '一片被破塑料顶棚勉强护住的试验田,泥里长着蘑菇和希望。', tags: ['resource'], dangerLevel: 3, services: [], actions: [ { id: 'farm_mushrooms', name: '采菌', kind: 'resource', desc: '棚下潮得发冷,菌类倒是长得很好。', timeCostMin: 24, energyCost: 4, risk: 0.18, rewardHint: '菌类与草药', stock: { initial: 3, max: 4, refreshMin: 300, amountPerRefresh: 1 }, lootTable: [ { itemId: 'mushroom_cluster', min: 1, max: 2, chance: 1 }, { itemId: 'herb_bundle', min: 1, max: 1, chance: 0.6 }, ], }, { id: 'farm_pump', name: '抽一桶井水', kind: 'resource', desc: '水有铁锈味,但至少是水。', timeCostMin: 20, energyCost: 3, risk: 0.12, rewardHint: '稳定水源', stock: { initial: 2, max: 3, refreshMin: 240, amountPerRefresh: 1 }, lootTable: [{ itemId: 'water_dirty', min: 1, max: 2, chance: 1 }], eventPool: ['farm_old_diary'], }, ], }, city_edge: { id: 'city_edge', name: '城市边缘', desc: '从这里开始,楼和阴影都不再给人安全感。', tags: ['ruins'], dangerLevel: 5, services: [], modifiers: { sanity: 0.005 }, actions: [ { id: 'city_checkpoint', name: '搜检查站', kind: 'scavenge', desc: '旧路障下埋着箱子和更旧的记录。', timeCostMin: 34, energyCost: 6, risk: 0.34, rewardHint: '零件、弹药、主线线索', stock: { initial: 2, max: 3, refreshMin: 480, amountPerRefresh: 1 }, lootTable: [ { itemId: 'parts_wire', min: 1, max: 2, chance: 0.8 }, { itemId: 'ammo_rifle', min: 2, max: 4, chance: 0.45 }, { itemId: 'wood_plank', min: 1, max: 1, chance: 0.5 }, ], eventPool: ['city_signal'], }, { id: 'city_rooftops', name: '观察高楼天线', kind: 'investigate', desc: '远处有规律的闪点,不像废墟会自己发出来的。', timeCostMin: 26, energyCost: 4, risk: 0.24, rewardHint: '得到通往地铁的情报', eventPool: ['city_rooftop_flash'], }, ], }, subway_entrance: { id: 'subway_entrance', name: '老地铁口', desc: '闸机早已没电,黑洞洞的入口像喉咙。', tags: ['tunnel'], dangerLevel: 6, services: [], modifiers: { sanity: 0.01, radiation: 0.004 }, actions: [ { id: 'subway_lockers', name: '撬储物柜', kind: 'scavenge', desc: '还没被撬开的柜子,不是幸运就是圈套。', timeCostMin: 32, energyCost: 6, risk: 0.38, rewardHint: '装备与零件', stock: { initial: 2, max: 2, refreshMin: 9999, amountPerRefresh: 0 }, lootTable: [ { itemId: 'filter_charcoal', min: 1, max: 1, chance: 0.6 }, { itemId: 'parts_wire', min: 1, max: 2, chance: 0.65 }, { itemId: 'leather_coat', min: 1, max: 1, chance: 0.2 }, ], eventPool: ['subway_power'], }, { id: 'subway_concourse', name: '摸进候车大厅', kind: 'investigate', desc: '有旧广播在循环,像是在等谁回应。', timeCostMin: 28, energyCost: 5, risk: 0.3, rewardHint: '推进主线', eventPool: ['subway_echo'], }, ], }, sewer: { id: 'sewer', name: '污染下水道', desc: '潮湿、温热、充满不该活动的东西。', tags: ['radiated', 'tunnel'], dangerLevel: 7, services: [], modifiers: { radiation: 0.012, sanity: 0.014 }, actions: [ { id: 'sewer_tunnel', name: '深入排水隧道', kind: 'scavenge', desc: '越往里越像在别人胃里找路。', timeCostMin: 36, energyCost: 7, risk: 0.42, rewardHint: '高风险高收益', stock: { initial: 2, max: 3, refreshMin: 600, amountPerRefresh: 1 }, lootTable: [ { itemId: 'scrap_metal', min: 2, max: 3, chance: 0.8 }, { itemId: 'parts_wire', min: 1, max: 1, chance: 0.55 }, { itemId: 'mushroom_cluster', min: 1, max: 1, chance: 0.4 }, ], eventPool: ['sewer_stalker'], }, { id: 'sewer_office', name: '搜维护办公室', kind: 'investigate', desc: '门牌还在,里面的秩序早就没了。', timeCostMin: 30, energyCost: 5, risk: 0.32, rewardHint: '关键任务物品', stock: { initial: 1, max: 1, refreshMin: 9999, amountPerRefresh: 0 }, eventPool: ['sewer_keycard'], }, ], }, vault_gate: { id: 'vault_gate', name: '避难所入口', desc: '混凝土门板像一整面沉默的墙,门缝里却有电流声。', tags: ['vault'], dangerLevel: 8, services: [], actions: [ { id: 'vault_console', name: '接入门禁终端', kind: 'investigate', desc: '键盘坏了一半,但屏幕还亮着。', timeCostMin: 24, energyCost: 3, risk: 0.18, rewardHint: '终局推进', eventPool: ['vault_console_event'], }, ], }, }, edges: [ { from: 'home', to: 'roadside', travelTimeMin: 24, risk: 1.1 }, { from: 'home', to: 'rain_farm', travelTimeMin: 34, risk: 1.3 }, { from: 'roadside', to: 'home', travelTimeMin: 24, risk: 1.0 }, { from: 'roadside', to: 'old_store', travelTimeMin: 20, risk: 1.4 }, { from: 'roadside', to: 'village_market', travelTimeMin: 28, risk: 1.2 }, { from: 'rain_farm', to: 'home', travelTimeMin: 34, risk: 1.2 }, { from: 'rain_farm', to: 'village_market', travelTimeMin: 26, risk: 1.3 }, { from: 'old_store', to: 'roadside', travelTimeMin: 20, risk: 1.4 }, { from: 'village_market', to: 'roadside', travelTimeMin: 28, risk: 1.2 }, { from: 'village_market', to: 'rain_farm', travelTimeMin: 26, risk: 1.3 }, { from: 'village_market', to: 'city_edge', travelTimeMin: 32, risk: 1.8, conditions: [{ kind: 'flag', flag: 'met_trader', value: true }], }, { from: 'city_edge', to: 'village_market', travelTimeMin: 32, risk: 1.7 }, { from: 'city_edge', to: 'subway_entrance', travelTimeMin: 30, risk: 2.2, conditions: [{ kind: 'flag', flag: 'got_subway_code', value: true }], }, { from: 'subway_entrance', to: 'city_edge', travelTimeMin: 30, risk: 2.0 }, { from: 'subway_entrance', to: 'sewer', travelTimeMin: 26, risk: 2.5, conditions: [{ kind: 'flag', flag: 'power_rerouted', value: true }], }, { from: 'sewer', to: 'subway_entrance', travelTimeMin: 26, risk: 2.4 }, { from: 'sewer', to: 'vault_gate', travelTimeMin: 34, risk: 2.8, conditions: [{ kind: 'has-item', itemId: 'field_filter', count: 1 }], }, { from: 'vault_gate', to: 'sewer', travelTimeMin: 34, risk: 2.8 }, ], events: { home_radio_note: { id: 'home_radio_note', title: '电波里的碎句', text: '旧收音机里混着白噪声和一句重复播报的短句:“……有交易,有水,有人知道旧线……”', trigger: 'action', options: [ { id: 'radio_focus', text: '把频率记下来', successText: '你把“旧线”和“集市”记在了心里。', successEffects: [ { type: 'log', message: '你决定去村庄集市碰碰运气。', tone: 'good' }, ], }, ], }, road_bandit_glimpse: { id: 'road_bandit_glimpse', title: '有人在看你', text: '你在废车玻璃里看到一道影子迅速缩回墙后。', trigger: 'action', options: [ { id: 'bandit_ignore', text: '装作没看到,快走', successEffects: [{ type: 'change-stat', stat: 'sanity', amount: -2 }], successText: '你没回头,但后颈一直发紧。', }, { id: 'bandit_search', text: '过去查看', check: { attribute: 'per', difficulty: 58 }, successEffects: [ { type: 'add-item', itemId: 'scrap_metal', count: 2 }, { type: 'add-item', itemId: 'parts_wire', count: 1 }, ], failureEffects: [{ type: 'change-stat', stat: 'life', amount: -6 }], successText: '人已经跑了,只留下半袋零件。', failureText: '你刚探出头,一块飞来的碎砖擦破了手臂。', }, ], }, store_rats: { id: 'store_rats', title: '货架下的尖叫', text: '翻动纸箱时,一群肥大的变异鼠突然从货架阴影里扑了出来。', trigger: 'action', options: [ { id: 'store_rats_fight', text: '抄家伙迎上去', successEffects: [{ type: 'start-combat', enemyId: 'rat_swarm' }], }, { id: 'store_rats_backoff', text: '放弃这片货架', timeCostMin: 6, successEffects: [{ type: 'change-stat', stat: 'sanity', amount: -3 }], successText: '你退了出来,鼠群在身后继续尖叫。', }, ], }, store_basement_cache: { id: 'store_basement_cache', title: '地下储藏门', text: '货架尽头有道半掩的地下门,门后传来一股潮湿冷气。', trigger: 'action', options: [ { id: 'basement_pry', text: '用撬棍撬开', check: { attribute: 'str', difficulty: 56 }, successEffects: [ { type: 'add-item', itemId: 'filter_charcoal', count: 1 }, { type: 'add-item', itemId: 'water_dirty', count: 1 }, ], successText: '你在阴冷的地下格里摸到了炭芯和一瓶没漏完的水。', failureEffects: [{ type: 'change-stat', stat: 'life', amount: -7 }], failureText: '门板反弹回来,狠狠砸在你的前臂上。', }, { id: 'basement_leave', text: '先记住位置', successEffects: [{ type: 'change-stat', stat: 'sanity', amount: 2 }], }, ], }, store_clinic_note: { id: 'store_clinic_note', title: '药柜里的便签', text: '药柜里夹着一张潮掉的便签:“如果还能读到这张纸,去集市找老罗,他知道哪条地铁线还通电。”', trigger: 'action', options: [ { id: 'clinic_note_keep', text: '把便签收起来', successEffects: [{ type: 'set-flag', flag: 'clinic_note_found', value: true }], }, ], }, market_broker: { id: 'market_broker', title: '老罗', text: '一个披着旧军大衣的老人用指节敲了敲桌面:“想往城里 deeper 走?拿出点诚意。”', trigger: 'arrive', options: [ { id: 'broker_trade_info', text: '递上一瓶净水换消息', conditions: [{ kind: 'has-item', itemId: 'water_purified', count: 1 }], successEffects: [ { type: 'remove-item', itemId: 'water_purified', count: 1 }, { type: 'set-flag', flag: 'met_trader', value: true }, { type: 'unlock-recipe', recipeId: 'repair_rifle' }, { type: 'unlock-recipe', recipeId: 'brew_tea' }, ], successText: '老罗收下水,告诉你城边检查站还能收到旧地铁维护信号。', }, { id: 'broker_smalltalk', text: '先听,不交易', successEffects: [{ type: 'set-flag', flag: 'met_trader', value: true }], successText: '你没换到全部消息,但至少混了个脸熟。', }, ], }, farm_old_diary: { id: 'farm_old_diary', title: '农棚日志', text: '抽水机旁边夹着一本湿掉的日志,上面反复写着:“雨季之后,地下味道变了。”', trigger: 'action', options: [ { id: 'farm_diary_keep', text: '记下这句', successEffects: [{ type: 'change-stat', stat: 'sanity', amount: 2 }], }, ], }, city_signal: { id: 'city_signal', title: '检查站残讯', text: '在检查站的桌板底下,你找到一块还能亮的终端屏。上面显示:“转入旧维护口,代号 4A。”', trigger: 'action', options: [ { id: 'city_signal_record', text: '记录地铁口代号', successEffects: [ { type: 'set-flag', flag: 'got_subway_code', value: true }, { type: 'add-item', itemId: 'parts_wire', count: 1 }, ], successText: '你记下了通往老地铁口的维护代号。', }, ], }, city_rooftop_flash: { id: 'city_rooftop_flash', title: '屋顶闪点', text: '高楼天线之间,一道不自然的蓝白闪光规律地亮了一下。', trigger: 'action', options: [ { id: 'rooftop_track', text: '沿着闪光方向观察', check: { attribute: 'per', difficulty: 60 }, successEffects: [{ type: 'set-flag', flag: 'got_subway_code', value: true }], successText: '你确认闪点来自旧地铁维护站方向。', failureEffects: [{ type: 'change-stat', stat: 'sanity', amount: -3 }], failureText: '你盯得太久,反而开始怀疑自己是不是看错了。', }, ], }, subway_power: { id: 'subway_power', title: '断续供电箱', text: '储物柜后方藏着一套维护供电箱,灯带忽明忽暗。', trigger: 'action', options: [ { id: 'subway_reroute_power', text: '重新跳线', check: { attribute: 'int', difficulty: 64 }, timeCostMin: 20, successEffects: [ { type: 'set-flag', flag: 'power_rerouted', value: true }, { type: 'add-item', itemId: 'parts_wire', count: 1 }, ], successText: '几秒后,深处的绿灯终于亮了起来。', failureEffects: [{ type: 'change-stat', stat: 'life', amount: -5 }], failureText: '一阵爆火花蹿过来,烫得你手背发麻。', }, ], }, subway_echo: { id: 'subway_echo', title: '深处回音', text: '大厅深处的回音像有人在一层层敲门。你意识到再往下,需要呼吸过滤。', trigger: 'action', options: [ { id: 'subway_echo_note', text: '把这点记进脑子里', successEffects: [{ type: 'change-stat', stat: 'sanity', amount: 2 }], }, ], }, sewer_stalker: { id: 'sewer_stalker', title: '水声不对', text: '隧道里的水声忽然变成了有节奏的拖拽声,有东西在接近。', trigger: 'action', options: [ { id: 'sewer_stalker_fight', text: '准备迎击', successEffects: [{ type: 'start-combat', enemyId: 'glow_stalker' }], }, { id: 'sewer_stalker_hide', text: '缩进管道死角', check: { attribute: 'agi', difficulty: 58 }, successEffects: [{ type: 'change-stat', stat: 'sanity', amount: 1 }], failureEffects: [{ type: 'change-stat', stat: 'life', amount: -8 }], successText: '那团影子滑了过去,留下刺鼻的潮气。', failureText: '你刚蹲下就被爪子扫中了肩膀。', }, ], }, sewer_keycard: { id: 'sewer_keycard', title: '维护办公室抽屉', text: '最底层抽屉卡得很死,里面露出一截发黄塑料边。', trigger: 'action', options: [ { id: 'sewer_take_card', text: '用力拽出来', successEffects: [ { type: 'add-item', itemId: 'metro_keycard', count: 1 }, { type: 'set-flag', flag: 'got_keycard', value: true }, ], successText: '你拿到了地铁门禁卡,背面印着避难所后勤编号。', }, ], }, vault_console_event: { id: 'vault_console_event', title: '门禁终端', text: '屏幕上跳出一行老旧提示:“输入权限或插入后勤卡。过滤状态需达标。”', trigger: 'action', options: [ { id: 'vault_insert_card', text: '插入门禁卡,尝试启动', conditions: [ { kind: 'has-item', itemId: 'metro_keycard', count: 1 }, { kind: 'has-item', itemId: 'field_filter', count: 1 }, ], successEffects: [{ type: 'set-flag', flag: 'vault_opened', value: true }], successText: '门板深处传来沉重的机械回声,锁止结构开始一层层回退。', }, { id: 'vault_step_back', text: '先退一步,确认准备', successEffects: [{ type: 'change-stat', stat: 'sanity', amount: 2 }], }, ], }, road_wanderer: { id: 'road_wanderer', title: '路边的求助声', text: '一辆翻覆的车旁边,有人虚弱地问你有没有水。', trigger: 'travel', options: [ { id: 'wanderer_share', text: '给他一瓶浑水', conditions: [{ kind: 'has-item', itemId: 'water_dirty', count: 1 }], successEffects: [ { type: 'remove-item', itemId: 'water_dirty', count: 1 }, { type: 'add-item', itemId: 'herb_bundle', count: 1 }, ], successText: '那人把最后一束干草药塞给了你。', }, { id: 'wanderer_leave', text: '继续赶路', successEffects: [{ type: 'change-stat', stat: 'sanity', amount: -2 }], successText: '你没有回头,但那声"算了"跟了你一路。', }, ], }, }, enemies: { rat_swarm: { id: 'rat_swarm', name: '变异鼠群', desc: '不大,但数量和牙都很多。', life: 24, damageMin: 4, damageMax: 8, armor: 0, range: 1, hitRate: 0.52, escapePressure: 0.12, lootTable: [ { itemId: 'cloth_rag', min: 1, max: 1, chance: 0.45 }, { itemId: 'mushroom_cluster', min: 1, max: 1, chance: 0.3 }, ], }, scavenger: { id: 'scavenger', name: '落单拾荒者', desc: '又瘦又急,眼神比刀子先到。', life: 34, damageMin: 6, damageMax: 10, armor: 1, range: 2, hitRate: 0.58, escapePressure: 0.18, lootTable: [ { itemId: 'scrap_metal', min: 1, max: 2, chance: 0.9 }, { itemId: 'water_dirty', min: 1, max: 1, chance: 0.35 }, ], }, feral_dog: { id: 'feral_dog', name: '疯狗', desc: '骨架外露,动作快得像要散架。', life: 28, damageMin: 5, damageMax: 11, armor: 0, range: 1, hitRate: 0.6, escapePressure: 0.2, lootTable: [{ itemId: 'jerky', min: 1, max: 1, chance: 0.3 }], }, tunnel_raider: { id: 'tunnel_raider', name: '地铁劫徒', desc: '知道该在什么时候要命,也知道该在什么时候要弹药。', life: 42, damageMin: 8, damageMax: 13, armor: 2, range: 3, hitRate: 0.64, escapePressure: 0.25, lootTable: [ { itemId: 'ammo_rifle', min: 2, max: 4, chance: 0.55 }, { itemId: 'parts_wire', min: 1, max: 1, chance: 0.5 }, ], }, glow_stalker: { id: 'glow_stalker', name: '荧光潜伏者', desc: '像被辐射烫过又被下水道养大的东西。', life: 48, damageMin: 9, damageMax: 15, armor: 1, range: 1, hitRate: 0.66, escapePressure: 0.28, lootTable: [ { itemId: 'scrap_metal', min: 2, max: 3, chance: 0.8 }, { itemId: 'filter_charcoal', min: 1, max: 1, chance: 0.45 }, ], }, }, quests: { q_tutorial_water: { id: 'q_tutorial_water', title: '先把水烧开', desc: '你需要先证明自己能活过今天。', type: 'tutorial', autoStart: [], steps: [ { id: 'q1_step1', text: '做出 1 瓶净水', kind: 'have-item', itemId: 'water_purified', count: 1 }, { id: 'q1_step2', text: '去一趟村庄集市', kind: 'reach-place', placeId: 'village_market' }, ], rewards: [{ type: 'unlock-recipe', recipeId: 'cook_stew' }], }, q_market_contact: { id: 'q_market_contact', title: '和老罗搭上线', desc: '想往城市深处走,集市里的消息是唯一捷径。', type: 'main', autoStart: [{ kind: 'quest-state', questId: 'q_tutorial_water', state: 'completed' }], steps: [ { id: 'q2_step1', text: '在集市见到老罗', kind: 'flag', flag: 'met_trader', value: true }, { id: 'q2_step2', text: '前往城市边缘', kind: 'reach-place', placeId: 'city_edge' }, ], rewards: [{ type: 'unlock-recipe', recipeId: 'repair_rifle' }], }, q_signal_hunt: { id: 'q_signal_hunt', title: '追踪旧信号', desc: '检查站和高楼天线都在指向同一个地方:老地铁口。', type: 'main', autoStart: [{ kind: 'quest-state', questId: 'q_market_contact', state: 'completed' }], steps: [ { id: 'q3_step1', text: '找到地铁代号', kind: 'flag', flag: 'got_subway_code', value: true }, { id: 'q3_step2', text: '前往老地铁口', kind: 'reach-place', placeId: 'subway_entrance' }, { id: 'q3_step3', text: '恢复地铁供电', kind: 'flag', flag: 'power_rerouted', value: true }, ], rewards: [{ type: 'unlock-recipe', recipeId: 'assemble_filter' }], }, q_sewer_route: { id: 'q_sewer_route', title: '从下水道进去', desc: '深处的空气和污水会先杀死没有准备的人。', type: 'main', autoStart: [{ kind: 'quest-state', questId: 'q_signal_hunt', state: 'completed' }], steps: [ { id: 'q4_step1', text: '做出野外滤芯', kind: 'have-item', itemId: 'field_filter', count: 1 }, { id: 'q4_step2', text: '进入污染下水道', kind: 'reach-place', placeId: 'sewer' }, { id: 'q4_step3', text: '找到门禁卡', kind: 'have-item', itemId: 'metro_keycard', count: 1 }, ], rewards: [{ type: 'log', message: '现在,你有资格去试试那道混凝土门。', tone: 'good' }], }, q_vault_gate: { id: 'q_vault_gate', title: '打开避难所', desc: '最后的门槛不会问你准备好了没。', type: 'main', autoStart: [{ kind: 'quest-state', questId: 'q_sewer_route', state: 'completed' }], steps: [ { id: 'q5_step1', text: '抵达避难所入口', kind: 'reach-place', placeId: 'vault_gate' }, { id: 'q5_step2', text: '启动门禁终端', kind: 'flag', flag: 'vault_opened', value: true }, ], rewards: [{ type: 'log', message: '厚重门板正在开启。', tone: 'good' }], }, }, travelEventPool: ['road_wanderer'], }; export default gameContent;