JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
1918–1933 · 魏玛共和国
<<include "Init_Core">> /* 文本库/版本/时间/TP/标签池/遗产池/惯性矩阵(11_init_core) */ <<include "Init_Weimar">> /* 魏玛人格三层/历史锚点(12_init_weimar) */ <<include "Init_World">> /* 世界变量/相位滑轨/阶段注册表/事件母体(13_init_world) */ <<include "Init_Events">> /* 事件冷却/白色牌/记事本/军方线/暗涌/文件篮/地区事件/报纸(14_init_events) */ <<include "Init_Parties">> /* 政党拟人/结盟/区域/地区拟人/NPC/光谱/党派提案清单(15_init_parties) */ <<include "Init_Player_Review">> /* 章节/玩家状态/公文包/承诺/审议/国会(16_init_player_review) */ <<include "Init_S2Deck">> /* 第二章牌库(R201-R210 + S2暗涌,content/91_s2_deck) */ <<include "Init_Dialogue_Pools">> /* 叙事记忆/叙事池/主动对话动作池/对话状态(12_init_weimar) */ <<undercurrent-init>> /* 暗账系统(三条慢性积攒,27_undercurrent_system) */ <<weimar-ladder-init>> /* 魏玛的阶梯(关系深度解锁记忆/嗜好/裂缝,79e/79f) */ /* ── 开发测试钩子(门闸自动化验证用)── URL 查询参数预设状态:?test_fate=-95 直接设 $fate;?test_flag=uprising|junta 设门闸因果标志; ?test_goto=段落名 改写起始段落(引擎启动时生效)。 玩家正常进入不带这些参数,零影响;自动化验证走 story.html?test_fate=-95&test_flag=uprising#End_Chapter1 之类的地址。 */ <<set _q to new URLSearchParams(location.search)>>\ <<if _q.has("test_fate")>>\ <<set $fate to Number(_q.get("test_fate"))>>\ <</if>>\ <<if _q.has("test_flag")>>\ <<if _q.get("test_flag") eq "uprising">>\ <<set $flags.uprising_victory to "victory">>\ <<elseif _q.get("test_flag") eq "junta">>\ <<set $mil_outcome to "得逞">>\ <</if>>\ <</if>>\ <<if _q.has("test_goto")>>\ <<run Config.passages.start = String(_q.get("test_goto"))>>\ <</if>>
/* ════════════════════════════════════════════════════════════ 侧边面板(V1.3 cap 弹窗风格:金色小节头 + 两列·上下卡) ════════════════════════════════════════════════════════════ */ /* 区块1: 日期+章节+TP */ ''<<datestr>><<weekday>>'' <<set _cap_num to ($stage ? $stage.num : $chapter.num)>><<set _cap_name to ($stage ? $stage.name : $chapter.name)>>\ 第_cap_num章 · _cap_name <<tp-phase-name>><<tp-fatigue-status>> _phase_name · 剩余<<print Math.round($tp * 10) / 10>> TP 第$session_day天 <<if $pending_events and $pending_events.length gt 0>>· 待办$pending_events.length件<</if>> /* 区块1b: 政治资本(V0.4-F 原型,整行可点弹窗) 国会议事中:显示「国会预算」实时剩余($session_review.capital,随拉票/换票/撤案扣减) 国会外:显示推导式总政治资本 $pc_total(Game.pc()) */ <<if $session_review.in_review>>\ ''【政治资本 · 国会预算】'' <<link "资本 <<print Math.max(0, ($session_review.capital || 0))>> / <<print Math.max(0, ($session_review.capital_limit || 0))>> ▸ 详情">><<cap-dialog-review>><</link>> <<else>>\ <<silently>><<cap-calc>><</silently>> ''【政治资本】'' <<link "资本 $pc_total ▸ 详情">><<cap-dialog>><</link>> <</if>> /* 区块1c: 国会倒计时与生效立法(V0.5-C P1,D-14 起常驻预警 + 9.4 生效立法) */ <<if $congress_warning_level gt 0 or ($days_until_session and $days_until_session gt 0 and $days_until_session lte 14)>>\ <span class="sb-section-title">【国会】</span> <span class="sb-item sb-full"><span class="sb-top"><span class="sb-label">开幕倒计时</span><b class="sb-val"><<if $days_until_session gt 0>>$days_until_session 天<<else>>今日开庭<</if>></b></span></span> <<silently>> <<set _cw_hint to "">>\ <<if $congress_warning_level eq 1>><<set _cw_hint to "下届国会开幕在即">>\ <<elseif $congress_warning_level eq 2>><<set _cw_hint to "议程已排定 · 多案待表决">>\ <<elseif $congress_warning_level eq 3>><<set _cw_hint to "最后斡旋窗口">>\ <<else>><<set _cw_hint to "今日开庭 · 模拟轮启动">>\ <</if>>\ <</silently>>\ <span class="sb-item sb-full"><span class="sb-top"><span class="sb-label">状态</span><b class="sb-val">_cw_hint</b></span></span>\ <</if>>\ <<if $active_effects and $active_effects.length gt 0>>\ <span class="sb-section-title">【持续生效】</span> <<for _aed_i to 0; _aed_i lt $active_effects.length; _aed_i++>>\ <<set _aed to $active_effects[_aed_i]>>\ <<silently>> /* 类别+档位小标签:法案/文件/余波 · 短期/中期/超长期 */ <<set _aed_tag to (_aed.kind eq "file" ? "文件" : (_aed.kind eq "aftermath" ? "余波" : "法案"))>>\ <<if _aed.band eq "short">><<set _aed_tag to _aed_tag + "·短期">>\ <<elseif _aed.band eq "mid">><<set _aed_tag to _aed_tag + "·中期">>\ <<elseif _aed.band eq "super">><<set _aed_tag to _aed_tag + "·超长期">>\ <</if>>\ /* 每日变化摘要(显示层才取整,一位小数) */ <<set _aed_names to { economy:"经济压力", inflation:"通胀", social_anger:"愤怒", political_violence:"暴力", nationalism:"民族", gov_trust:"政府信任", middle_confidence:"中产信心", fiscal:"赤字", army_influence:"军方影响", revolution:"革命", intl_trust:"国际信任", spd:"SPD信任", kpd:"KPD信任", ddp:"DDP信任", dvp:"DVP信任", zentrum:"Zentrum信任", dnvp:"DNVP信任", nsdap:"NSDAP信任", army:"军方信任", weimar:"魏玛" }>> <<set _aed_parts to []>>\ <<set _aed_keys to Object.keys(_aed.daily)>>\ <<for _aed_k to 0; _aed_k lt _aed_keys.length; _aed_k++>>\ <<set _aed_v to _aed.daily[_aed_keys[_aed_k]]>>\ <<if _aed_keys[_aed_k] eq "party_trust">>\ <<set _aed_pk to Object.keys(_aed_v)>>\ <<for _aed_p to 0; _aed_p lt _aed_pk.length; _aed_p++>>\ <<set _aed_pv to _aed_v[_aed_pk[_aed_p]]>>\ <<set _aed_pn to _aed_names[_aed_pk[_aed_p]] ?? _aed_pk[_aed_p]>>\ <<set _aed_pf to Math.round(Math.abs(_aed_pv) * 10) / 10>>\ <<if _aed_pv gt 0>><<set _aed_parts.push(_aed_pn + "+" + _aed_pf)>>\ <<else>><<set _aed_parts.push(_aed_pn + "-" + _aed_pf)>>\ <</if>>\ <</for>>\ <<else>>\ <<set _aed_n to _aed_names[_aed_keys[_aed_k]] ?? _aed_keys[_aed_k]>>\ <<set _aed_f to Math.round(Math.abs(_aed_v) * 10) / 10>>\ <<if _aed_v gt 0>><<set _aed_parts.push(_aed_n + "+" + _aed_f)>>\ <<else>><<set _aed_parts.push(_aed_n + "-" + _aed_f)>>\ <</if>>\ <</if>>\ <</for>>\ <<if _aed_parts.length gt 3>>\ <<set _aed_daily_txt to _aed_parts[0] + " " + _aed_parts[1] + " " + _aed_parts[2] + " 等">>\ <<else>>\ <<set _aed_daily_txt to _aed_parts.join(" ")>>\ <</if>>\ <</silently>>\ <span class="sb-item sb-full"><span class="sb-top"><span class="sb-label">《_aed.title》<span class="sb-delta txt-muted">[_aed_tag]</span><<if _aed.source eq "pass_absent">><span class="sb-delta txt-severe">[被动]</span><</if>></span><b class="sb-val">剩 _aed.remaining 天</b></span><<if _aed_daily_txt neq "">><span class="sb-drip-sub">_aed_daily_txt/天</span><</if>></span> <</for>>\ <</if>> <<if $admin_paralysis or ($file_expiry_warn_log and $file_expiry_warn_log.length gt 0)>>\ <span class="sb-section-title">【文牍】</span> <<if $admin_paralysis>>\ <span class="sb-item sb-full"><span class="sb-top"><span class="sb-label">行政瘫痪</span><b class="sb-val txt-severe">已瘫痪</b></span></span>\ <</if>>\ <<if $file_expiry_warn_log>>\ <<for _fw_i to 0; _fw_i lt $file_expiry_warn_log.length; _fw_i++>>\ <<set _fw to $file_expiry_warn_log[_fw_i]>>\ <<print '<span class="sb-item sb-full"><span class="sb-top"><span class="sb-label">' + _fw.title + '</span><b class="sb-val' + ($admin_paralysis ? ' txt-severe' : '') + '">剩 ' + _fw.days_left + ' 天</b></span></span>'>> <</for>>\ <</if>>\ <</if>> /* 区块2: 玩家状态(两列·上下卡) */ <span class="sb-section-title">【你的状态】</span> <span class="sb-grid"> <<sb-item "疲惫" $player.mental.fatigue $player.mental.fatigue>>\ <<sb-item "理想" $player.mental.idealism $player.mental.idealism>>\ <<sb-item "偏执" $player.mental.paranoia $player.mental.paranoia>>\ <<sb-item "孤立" $player.mental.isolation $player.mental.isolation>>\ <<silently>> <<set _zhi to 0>>\ <<if $active_tags and $active_tags.length gt 0>>\ <<for _ti to 0; _ti lt $active_tags.length; _ti++>>\ <<if $active_tags[_ti] and $active_tags[_ti].name eq "知情者">>\ <<set _zhi to $active_tags[_ti].intensity>>\ <</if>>\ <</for>>\ <</if>>\ <<set _zhi_level to _zhi gte 20 ? "消息灵通" : (_zhi gte 10 ? "耳目渐多" : (_zhi gte 1 ? "初有所闻" : "闭塞寡闻"))>>\ <<set _zi_pct to Math.round(_zhi / 30 * 100)>>\ <<set _zhi_tip to "情报档位:" + _zhi_level>>\ <</silently>>\ <<sb-item "情报" _zhi _zi_pct _zhi_tip>>\ </span> /* 玩家标签(自我认知/失信/双面等) */ <<silently>> <<set _ptag_txt to "">>\ <<if $player.tags and $player.tags.length gt 0>>\ <<set _ptag_txt to $player.tags.join(" · ")>>\ <</if>>\ <</silently>>\ <<if _ptag_txt neq "">>\ <span class="sb-item sb-full"><span class="sb-top"><span class="sb-label">标签</span><b class="sb-val">_ptag_txt</b></span></span>\ <</if>> /* 区块3: 魏玛状态(两列·上下卡) */ <span class="sb-section-title">【共和国】</span> <span class="sb-grid"> <<silently>> <<set _tl_pct to Math.round($weimar.personality_tension / $weimar.effective_threshold * 100)>>\ <<set _tl_lbl to $weimar.personality_tension gte Math.round($weimar.effective_threshold * 0.75) ? "精神负荷 ⚠" : "精神负荷">>\ <<if _tl_pct lt 25>>\ <<set _tl_tier to "平稳">>\ <<elseif _tl_pct lt 50>>\ <<set _tl_tier to "紧绷">>\ <<elseif _tl_pct lt 75>>\ <<set _tl_tier to "焦虑">>\ <<else>>\ <<set _tl_tier to "濒临崩溃">>\ <</if>>\ <</silently>>\ <<sb-item "疲惫" $weimar.surface.fatigue $weimar.surface.fatigue>>\ <<sb-item _tl_lbl $weimar.personality_tension _tl_pct>>\ <span class="sb-item sb-full"><span class="sb-top"><span class="sb-label">情绪</span><b class="sb-val">''$weimar.surface.mood''</b></span></span> <<silently>> /* 魏玛的阶梯:他对你袒露到了哪一层(79e/79f) */ <<if not $weimar_ladder>><<weimar-ladder-init>><</if>>\ <<set _wl_names to {1:"轮廓", 2:"记忆", 3:"嗜好", 4:"裂缝"}>>\ <<set _wl_next to "">>\ <<if $weimar_ladder.level eq 1>><<set _wl_next to "再熟一些,他会告诉你一九一九年的事。">>\ <<elseif $weimar_ladder.level eq 2>><<set _wl_next to "再久一些,他会让你看见他不必有的那些偏好。">>\ <<elseif $weimar_ladder.level eq 3>><<set _wl_next to "在盛世里再稳一些,他会把最深的裂缝给你看。">>\ <</if>>\ <</silently>>\ <<print '<span class="sb-item sb-full" title="' + _wl_next + '"><span class="sb-top"><span class="sb-label">他对你</span><b class="sb-val txt-calm">' + _wl_names[$weimar_ladder.level] + '</b></span></span>'>> </span> <span class="sb-tier">精神负荷:_tl_tier</span> <span class="mb-wrap"><span class="mb-bar"><<print '<span class="mb-marker" style="left:' + _tl_pct + '%"></span>'>></span></span> /* 区块3b: 国家趋势(两列·上下卡,与昨日对比,四舍五入取整) */ <<if $world_yesterday neq null and $world and $world_yesterday>>\ <<silently>> <<set _econ_diff to Math.round($world.economy - $world_yesterday.economy)>>\ <<set _inf_diff to Math.round($world.inflation - $world_yesterday.inflation)>>\ <<set _anger_diff to Math.round($world.social_anger - $world_yesterday.social_anger)>>\ <<set _viol_diff to Math.round($world.political_violence - $world_yesterday.political_violence)>>\ <<set _econ_lbl to "经济压力">>\ <<if _econ_diff gt 0>><<set _econ_lbl to _econ_lbl + '<span class="sb-delta txt-severe"> ↑+' + _econ_diff + '</span>'>>\ <<elseif _econ_diff lt 0>><<set _econ_lbl to _econ_lbl + '<span class="sb-delta txt-recover"> ↓' + _econ_diff + '</span>'>>\ <<else>><<set _econ_lbl to _econ_lbl + '<span class="sb-delta txt-muted"> →0</span>'>>\ <</if>>\ <<set _inf_lbl to "通胀">>\ <<if _inf_diff gt 0>><<set _inf_lbl to _inf_lbl + '<span class="sb-delta txt-severe"> ↑+' + _inf_diff + '</span>'>>\ <<elseif _inf_diff lt 0>><<set _inf_lbl to _inf_lbl + '<span class="sb-delta txt-recover"> ↓' + _inf_diff + '</span>'>>\ <<else>><<set _inf_lbl to _inf_lbl + '<span class="sb-delta txt-muted"> →0</span>'>>\ <</if>>\ <<set _anger_lbl to "愤怒">>\ <<if _anger_diff gt 0>><<set _anger_lbl to _anger_lbl + '<span class="sb-delta txt-severe"> ↑+' + _anger_diff + '</span>'>>\ <<elseif _anger_diff lt 0>><<set _anger_lbl to _anger_lbl + '<span class="sb-delta txt-recover"> ↓' + _anger_diff + '</span>'>>\ <<else>><<set _anger_lbl to _anger_lbl + '<span class="sb-delta txt-muted"> →0</span>'>>\ <</if>>\ <<set _viol_lbl to "暴力">>\ <<if _viol_diff gt 0>><<set _viol_lbl to _viol_lbl + '<span class="sb-delta txt-severe"> ↑+' + _viol_diff + '</span>'>>\ <<elseif _viol_diff lt 0>><<set _viol_lbl to _viol_lbl + '<span class="sb-delta txt-recover"> ↓' + _viol_diff + '</span>'>>\ <<else>><<set _viol_lbl to _viol_lbl + '<span class="sb-delta txt-muted"> →0</span>'>>\ <</if>>\ /* 中产信心(越高越好,颜色与压力值相反:涨=绿、跌=红) */ <<set _mid_diff to Math.round($world.middle_confidence - ($world_yesterday.middle_confidence ?? $world.middle_confidence))>>\ <<set _mid_lbl to "中产信心">>\ <<if _mid_diff gt 0>><<set _mid_lbl to _mid_lbl + '<span class="sb-delta txt-recover"> ↑+' + _mid_diff + '</span>'>>\ <<elseif _mid_diff lt 0>><<set _mid_lbl to _mid_lbl + '<span class="sb-delta txt-severe"> ↓' + _mid_diff + '</span>'>>\ <<else>><<set _mid_lbl to _mid_lbl + '<span class="sb-delta txt-muted"> →0</span>'>>\ <</if>>\ /* 财政赤字(越高越糟:涨=红、跌=绿)。 注意:宏参数里不能写带空格的括号表达式(会被参数解析拆开),先算进临时变量 */ <<set _fis_val to $world.fiscal ?? 30>>\ <<set _fis_diff to Math.round(_fis_val - ($world_yesterday.fiscal ?? _fis_val))>>\ <<set _fis_lbl to "赤字">>\ <<if _fis_diff gt 0>><<set _fis_lbl to _fis_lbl + '<span class="sb-delta txt-severe"> ↑+' + _fis_diff + '</span>'>>\ <<elseif _fis_diff lt 0>><<set _fis_lbl to _fis_lbl + '<span class="sb-delta txt-recover"> ↓' + _fis_diff + '</span>'>>\ <<else>><<set _fis_lbl to _fis_lbl + '<span class="sb-delta txt-muted"> →0</span>'>>\ <</if>>\ <</silently>>\ <span class="sb-section-title">【国家趋势】</span> <span class="sb-grid"> <<sb-item _econ_lbl $world.economy $world.economy>>\ <<sb-item _inf_lbl $world.inflation $world.inflation>>\ <<sb-item _anger_lbl $world.social_anger $world.social_anger>>\ <<sb-item _viol_lbl $world.political_violence $world.political_violence>>\ <<sb-item _mid_lbl $world.middle_confidence $world.middle_confidence "职员、小商人、小储户的信心。他们倒向哪边,共和国就往哪边晃。">>\ <<sb-item _fis_lbl _fis_val _fis_val "国库的窟窿。花钱的决策会让它变大;赤字高企时,通胀和信任每天都在替你付利息。">>\ <<if $undercurrent>>\ <<silently>> <<set _uc_avg to Math.round(($undercurrent.party_rift + $undercurrent.extremism + $undercurrent.paper_gains) / 3)>>\ <<set _uc_tip to "水面之下没人清算的旧账。世界越平静,涨得越快;满线时,会有人来讨。">>\ <<if $undercurrent.party_rift gte 80 or $undercurrent.extremism gte 80 or $undercurrent.paper_gains gte 80>>\ <<set _uc_tip to "有一条暗账快满线了。满线的那天,它自己会上门。">>\ <</if>>\ <</silently>>\ <<print '<span class="sb-item" title="' + _uc_tip + '"><span class="sb-top"><span class="sb-label">潜流</span></span><span class="sb-bar-row"><span class="sb-bar"><span class="sb-bar-fill" style="width:' + _uc_avg + '%"></span></span><b class="sb-val">' + _uc_avg + '</b></span></span>'>> <</if>>\ </span>\ <</if>>\ /* 年度大势(V0.9 引导):一句话总判断,把八个数字翻译成局势档位。 只在年关托付($year_mission_done)之后显示--玩家先听魏玛说三件事,再看仪表盘。 */ <<if $year_mission_done>>\ <<silently>> /* 危机度 = 最危险的两条线(民变=暴力/革命/愤怒的均值,右翼=民族/军方)与通胀取最险 */ <<set _gm_upris to ($world.political_violence + $world.revolution + $world.social_anger) / 3>>\ <<set _gm_right to ($world.nationalism + $world.army_influence) / 2>>\ <<set _gm_worst to Math.max($world.inflation, _gm_upris, _gm_right)>>\ <<if _gm_worst gte 85>>\ <<set _gm_txt to "濒临崩溃">><<set _gm_cls to "txt-severe">>\ <<elseif _gm_worst gte 70>>\ <<set _gm_txt to "危机四伏">><<set _gm_cls to "txt-severe">>\ <<elseif _gm_worst gte 55>>\ <<set _gm_txt to "暗流涌动">><<set _gm_cls to "txt-warm">>\ <<elseif _gm_worst gte 40>>\ <<set _gm_txt to "局势尚可">><<set _gm_cls to "txt-calm">>\ <<else>>\ <<set _gm_txt to "风平浪静">><<set _gm_cls to "txt-recover">>\ <</if>>\ /* 危险时提醒玩家回看年关的三句托付 */ <<set _gm_tip to _gm_worst gte 70 ? "魏玛年初的三件事,有一件快压不住了。" : "魏玛年初托付的三件事:货币、民心、军队。">>\ <</silently>>\ <<print '<span class="sb-item sb-full" title="' + _gm_tip + '"><span class="sb-top"><span class="sb-label">年度大势</span><b class="sb-val ' + _gm_cls + '">' + _gm_txt + '</b></span></span>'>> <</if>>\ /* 危机链警示行(V0.8 给世界接牙):倒数中显示,玩家随时看到自己离深渊几步 */ <<crisis-status-line>>\ <<if _crisis_line and _crisis_line neq "">>\ <span class="sb-crisis">_crisis_line</span>\ <</if>> /* 区块3c: 外部局势(魏玛中层数值——国际/民主/军队/改革) */ <span class="sb-section-title">【外部局势】</span> <span class="sb-grid"> <<sb-item "国际信任" $weimar.mid.intl_trust $weimar.mid.intl_trust>>\ <<sb-item "民主信任" $weimar.mid.democracy_trust $weimar.mid.democracy_trust>>\ <<sb-item "军队依赖" $weimar.mid.army_dependence $weimar.mid.army_dependence>>\ <<sb-item "改革意愿" $weimar.mid.reform_will $weimar.mid.reform_will>>\ </span> /* 区块4: 政治光谱(整行宽) */ <span class="sb-section-title">【政治立场】</span> <span class="sb-item sb-full">左 ←⟦<<for _i to 0; _i lt 11; _i++>><<if _i eq Math.round(($spectrum.left_right + 100) / 20)>>●<<else>>·<</if>><</for>>⟧-> 右</span> <span class="sb-item sb-full">激进 ←⟦<<for _i to 0; _i lt 11; _i++>><<if _i eq Math.round(($spectrum.radical_conservative + 100) / 20)>>●<<else>>·<</if>><</for>>⟧-> 保守</span> <<route-current>>\ <<if _route_name neq "">>\ <<print '<span class="sb-item sb-full" title="跳过多天时,期间的公文、警报、见闻都会按【' + _route_name + '】自动处置;历史巨浪停不下来——日子会停在它面前,大事归你亲手处理。">治理路线:<b>' + _route_name + '</b></span>'>>\ <</if>> /* 区块5: 各方态度(两列,态度小字进悬停提示) */ <span class="sb-section-title">【各方对你的信任】</span> <span class="sb-grid"> <<sb-party "spd" "SPD 社民党">>\ <<sb-party "kpd" "KPD 共产党">>\ <<sb-party "ddp" "DDP 民主党">>\ <<sb-party "dvp" "DVP 人民党">>\ <<if $npcs.dvp_pm and $npcs.dvp_pm.active>><<sb-party "dvp_pm" "DVP派总理">><</if>>\ <<sb-party "zentrum" "Zentrum">>\ <<sb-party "dnvp" "DNVP 国族党">>\ <<sb-party "nsdap" "NSDAP">>\ <<sb-party "army" "军方">>\ <<sb-party "weimar" "魏玛">>\ </span> <<if $debug>><<fate-debug>><</if>>\ <<if $debug>><<link "调试">><<set $debug_return to passage()>><<goto "Debug_Lab">><</link>><</if>> <span class="mb-wrap">存档 <<link "导出到文件">> <<script>>\ if (window.exportSaveFile) { window.exportSaveFile(); } <</script>>\ <</link>></span>
/* ════════════════════════════════════════════════════════════ 扉页 · 暮色共和国 玩家进入游戏的第一眼。侧边栏在此页隐藏(05_script page-solo)。 结构:饰纹 → 大标题 → 年代刻度 → 题记 → 三段引言 → 入口按钮。 正文刻意压在三段以内:扉页是封面,不是序言。 注意:<<nobr>> 体内不许再写行尾续行符「\」——nobr 已吞换行, 多余的 \ 会漏显成游离字符(2026-09-21 修复标题页两处游离 \)。 ════════════════════════════════════════════════════════════ */ <<nobr>> <div class="title-wrap"> <div class="title-orn">◆ ◆ ◆</div> <div class="title-main">暮色共和国</div> <div class="title-era">一九一八 — 一九三三 · 魏玛共和国</div> <hr class="title-rule"> <div class="title-body"> <p>他把你从一场朦胧里剥离出来。你没有生日,没有籍贯,只有赋予一支笔,和一张不属于任何人的脸。</p> <p>你替他在威廉街醒来,替他在鲁尔沉默,替他把一个国家的名字,一遍遍写进快要作废的纸上。你不是他的良心,也不是他的顾问——你是他没说出口的那句话。</p> <p>1933年的脚步声一年比一年近。他假装听不见。你听见了。</p> </div> <div class="title-entries"> <<if $show_prologue>> <span class="title-btn"><<link "观看序章" "Scene_StageSelect">><</link>></span> <span class="title-btn title-btn-ghost"><<link "直接进入游戏" "Scene_StageSelect">> <<set $skip_birth to true>> <</link>></span> <<else>> <span class="title-btn"><<link "进入游戏" "Scene_StageSelect">> <<set $skip_birth to true>> <</link>></span> <</if>> </div> <<if $show_prologue>> <p class="title-hint">进入前先选一章开始。序章讲述魏玛的诞生——看过一次的话,选「直接进入游戏」就好。</p> <<else>> <p class="title-hint">进入前先选一章开始。</p> <</if>> <div class="title-foot">v<<=$version>> · 暮色共和国</div> </div> <</nobr>>
/* ============================================================ 通用显示/工具宏。所有段落都可通过 <<宏名>> 复用。 本文件只放与具体系统无关的通用工具;各子系统自己的宏 放在各自文件(20_/30_/40_/...)里。 ============================================================ */ /* 数值条:<<bar 当前值 上限>> (10 格 █/░) */ <<widget "bar">>\ <<silently>> <<set _b_cur to Math.max(0, Math.round(Number($args[0])))>> <<set _b_max to Math.round(Number($args[1]))>> <<set _b_max to _b_max > 0 ? _b_max : 100>> <<set _b_filled to Math.round(_b_cur / _b_max * 10)>> <<set _b_filled to Math.min(10, Math.max(0, _b_filled))>> <<set _b_empty to 10 - _b_filled>> <</silently>>\ <nobr><<for _i to 0; _i lt _b_filled; _i++>>█<</for>><<for _i to 0; _i lt _b_empty; _i++>>░<</for>></nobr> _b_cur/_b_max\ <</widget>> /* 侧边栏通用数值卡:<<sb-item 标签 数值 百分比 [悬停提示]>> 上=标签独占一行,下=细条(宽=百分比)+数值。侧边栏两列用。 */ <<widget "sb-item">>\ <<silently>> <<set _si_label to $args[0]>> <<set _si_val to Math.round(Number($args[1]))>> <<set _si_pct to Math.min(100, Math.max(0, Math.round(Number($args[2]))))>> <<set _si_title to $args.length gt 3 ? $args[3] : "">> <</silently>>\ <<print '<span class="sb-item" title="' + _si_title + '"><span class="sb-top"><span class="sb-label">' + _si_label + '</span></span><span class="sb-bar-row"><span class="sb-bar"><span class="sb-bar-fill" style="width:' + _si_pct + '%"></span></span><b class="sb-val">' + _si_val + '</b></span></span>'>>\ <</widget>> /* 政治倾向条:<<leanbar 值>> (-100 左 ~ 0 中 ~ +100 右,11 点指示) */ <<widget "leanbar">>\ <<silently>> <<set _l_v to Math.max(-100, Math.min(100, Math.round(Number($args[0]))))>> <<set _l_pos to _l_v + 100>> <<set _l_idx to Math.round(_l_pos / 20)>> <</silently>>\ 左 ⟦<nobr><<for _i to 0; _i lt 11; _i++>><<if _i eq _l_idx>>●<<else>>·<</if>><</for>></nobr>⟧ 右 (_l_v)\ <</widget>> /* 紧迫值权重:<<urgency-mult weight_condition>> 结果存入 $tmp_urgency 输入:weight_condition = { 世界变量键: 系数, ... }(如 {economy:1.5, nationalism:2}) 模型:mult = 1 + Σ( 系数 × 变量紧迫度 ) - 系数为正 → 变量越高越紧迫(紧迫度 = 值/100) - 系数为负 → 变量越低越紧迫(紧迫度 = (100-值)/100) 用于"世界状态决定哪类矛盾此刻更可能发生",文件篮与大类事件共用。 world 键:economy inflation social_anger political_violence nationalism revolution gov_trust army_influence */ <<widget "urgency-mult">>\ <<silently>> <<set _wc to $args[0] || {}>> <<set $tmp_urgency to 1>> <<set _has_wc to false>> <<if _wc and Object.keys(_wc).length gt 0>><<set _has_wc to true>><</if>> <<if _has_wc>> <<for _k range Object.keys(_wc)>> <<set _coef to _wc[_k]>> <<set _val to $world[_k] || 0>> <<if _coef gte 0>> <<set $tmp_urgency to $tmp_urgency + _coef * (_val / 100)>> <<else>> <<set $tmp_urgency to $tmp_urgency + Math.abs(_coef) * ((100 - _val) / 100)>> <</if>> <</for>> <</if>> <</silently>>\ <</widget>> /* 时间推进:<<advance 天数>> 。更新 $date 并自动进位月份/年份(含闰年简化)。 */ <<widget "advance">>\ <<silently>> <<set _d to Number($args[0])>> <<set _daysInMonth to [0,31,28,31,30,31,30,31,31,30,31,30,31]>> <<for _i to 0; _i lt _d; _i++>> <<set $date.day++>> <<set _dim to _daysInMonth[$date.month]>> <<if $date.month eq 2 and ($date.year % 4 eq 0)>> <<set _dim to 29>> <</if>> <<if $date.day gt _dim>> <<set $date.day to 1>> <<set $date.month++>> <<if $date.month gt 12>> <<set $date.month to 1>> <<set $date.year++>> <</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* 日期格式化:<<datestr>> 输出 "1919年1月1日" */ <<widget "datestr">>\ $date.year年$date.month月$date.day日\ <</widget>> /* 月份差计算:<<months-between 日期A 日期B>> 存入 _months_diff(A早于B为正)。 日期格式 {year,month,day}。供遗产衰减计算用。 */ <<widget "months-between">>\ <<silently>> <<set _a to $args[0]>> <<set _b to $args[1]>> <<set _months_diff to Math.round(((_b.year - _a.year) * 12 + (_b.month - _a.month)) + (_b.day - _a.day) / 30)>> <</silently>>\ <</widget>> /* 复制日期对象:<<copydate 日期>> 存入 _date_copy */ <<widget "copydate">>\ <<silently>> <<set _date_copy to { year: $args[0].year, month: $args[0].month, day: $args[0].day }>> <</silently>>\ <</widget>> /* 全局导航:<<nav "返回目标区域">> 在每个子场景底部显示统一导航: - ← 返回[区域名](回到该区域的概览页) - 返回柏林地图(直接回大地图) - 返回办公室(回到日常起点) 用法:<<nav "Region_Kreuzberg">> 或 <<nav "Scene_RegionSelect">> */ <<widget "nav">>\ <<silently>> <<set _nav_target to $args[0] ? $args[0] : "Scene_RegionSelect">> <<set _nav_label to "返回">> <<if _nav_target.startsWith("Region_")>> <<set _nav_label to "返回此处">> <<elseif _nav_target is "Scene_RegionSelect">> <<set _nav_label to "返回地图">> <<elseif _nav_target is "Scene_Office">> <<set _nav_label to "返回办公室">> <</if>> <</silently>>\ <hr>\ <<link "← _nav_label" _nav_target>><</link>> //<<link "返回柏林地图" "Scene_RegionSelect">><</link>>// //<<link "返回办公室" "Scene_Office">><</link>>//\ <</widget>> /* ---------- region-travel:前往区域(地图上一次性扣TP) ---------- 用法:在地图链接内调用 <<region-travel "chancellery"> 按区域 tp_cost 扣除TP并加疲惫;0成本区域不扣。 地图内活动(子场景/附近导航/返回地图)不再重复扣TP。 V0.9 防负数:TP不足时不再扣成负数,动作原样发生但 TP 只到 0。 (真正的拦截在各入口的 <<tp-can>> 渲染守卫:地图链接置灰、事件页出拦截盒。) */ <<widget "region-travel">>\ <<silently>> <<set _rt to $regions[$args[0]]>> <<if _rt.tp_cost gt 0>> <<set $tp to Math.max(0, $tp - _rt.tp_cost)>> <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + _rt.tp_fatigue)>> <<set $rest_count to 0>> <</if>> <</silently>>\ <</widget>> /* ---------- region-link:带TP守卫的地图链接 ---------- 用法:<<region-link "总理府" "Region_Chancellery" "chancellery">> (链接文字 / 目标段落 / 区域key) TP 足够 → 正常链接(内部扣点); TP 不足 → 置灰锁死,灰字标明需要/剩余。免得玩家点了才被拦。 */ <<widget "region-link">>\ <<silently>> <<set _rl_label to $args[0]>> <<set _rl_passage to $args[1]>> <<set _rl_key to $args[2]>> <<set _rl_cost to $regions[_rl_key].tp_cost>> <<set _rl_locked to false>> <<if _rl_cost gt 0>> <<tp-can _rl_cost>> <<set _rl_locked to (not _tp_ok)>> <</if>> <</silently>>\ <<if _rl_locked>>\ <span class="rmap-lock">==_rl_label==(今日去不了 · 需 _rl_cost 点,剩 _tp_have 点)</span>\ <<else>>\ <<link "_rl_label" _rl_passage>><<region-travel _rl_key>><</link>>\ <</if>>\ <</widget>> /* 附近区域导航:<<nearby "kreuzberg">> 根据当前区域的大区,列出同区和相邻大区的可进入区域。 同区直达(1TP),相邻大区直达(1TP),其余不显示(需回地图)。 大区相邻关系(基于1923柏林地理): 权力走廊 <-> 公共空间与枢纽 <-> 工人与左翼 权力走廊 <-> 旧精英与军方 公共空间与枢纽 <-> 新西部与波希米亚 旧精英与军方 <-> 新西部与波希米亚 口岸与边缘 <-> 公共空间与枢纽 */ <<widget "nearby">>\ <<silently>> <<set _nb_region to $args[0]>> <<set _nb_district to $regions[_nb_region].district>> <<set _nb_adjacent to {}>> <<set _nb_adjacent["权力走廊"] to ["公共空间与枢纽", "旧精英与军方"]>> <<set _nb_adjacent["旧精英与军方"] to ["权力走廊", "新西部与波希米亚"]>> <<set _nb_adjacent["新西部与波希米亚"] to ["旧精英与军方", "公共空间与枢纽"]>> <<set _nb_adjacent["工人与左翼"] to ["公共空间与枢纽"]>> <<set _nb_adjacent["公共空间与枢纽"] to ["权力走廊", "工人与左翼", "新西部与波希米亚", "口岸与边缘"]>> <<set _nb_adjacent["口岸与边缘"] to ["公共空间与枢纽"]>> <<set _nb_adjacent["外景地"] to []>> <<set _nb_allowed_districts to [_nb_district]>> <<if _nb_adjacent[_nb_district]>> <<set _nb_allowed_districts to _nb_allowed_districts.concat(_nb_adjacent[_nb_district])>> <</if>> <<set _nb_links to []>> <<for _nb_key range Object.keys($regions)>> <<set _nb_r to $regions[_nb_key]>> <<if _nb_r and _nb_r.district and _nb_key neq _nb_region and _nb_r.unlocked and _nb_allowed_districts.includes(_nb_r.district)>> <<set _nb_links.push({key: _nb_key, name: _nb_r.name, passage: _nb_r.passage, district: _nb_r.district, landmark: _nb_r.landmark})>> <</if>> <</for>> <</silently>>\ <<if _nb_links.length gt 0>>\ <<if $tp lt 1>>\ //你已经很累了。总理府那边有车来接你。// <<link "上车,回去休息" "Scene_Rest">><</link>> <<else>>\ ''附近可以走去:'' <<for _nb_i to 0; _nb_i lt _nb_links.length; _nb_i++>><<set _nb_l to _nb_links[_nb_i]>><<link "_nb_l.name(_nb_l.landmark)" _nb_l.passage>><</link>> //地图内走动·免费//<</for>> <</if>>\ <</if>>\ <</widget>> /* ---------- atmos-trend:晨报氛围的「现状×趋势」判定(atmos-pools/调试台共用) ---------- 前置:先调 <<undercurrent-worst>> 取 _uc_worst(世界最险值,越高越糟)。 依赖 $world_trend_log:daily-tick 每日 push { d:天数, v:当日最险值 },保留最近10条。 与约5天前的采样比较:升≥1.5 → 世道在下坡(_atmos_down);降≤-1.5 → 在爬坡(_atmos_up); 之间视作平稳(两标志皆 false);开局无历史也视作平稳。 */ <<widget "atmos-trend">>\ <<silently>> <<set $world_trend_log to $world_trend_log || []>> <<set _at_ref to -9999>> <<set _at_fb to -9999>> <<for _at_i to 0; _at_i lt $world_trend_log.length; _at_i++>> <<if _at_fb is -9999>><<set _at_fb to $world_trend_log[_at_i].v>><</if>> <<if $world_trend_log[_at_i].d lte $session_day - 5>><<set _at_ref to $world_trend_log[_at_i].v>><</if>> <</for>> <<if _at_ref is -9999>><<set _at_ref to _at_fb>><</if>> <<set _uc_delta to _at_ref is -9999 ? 0 : _uc_worst - _at_ref>> <<set _atmos_prosper to (_uc_worst lt 50)>> <<set _atmos_down to (_uc_delta gte 1.5)>> <<set _atmos_up to (_uc_delta lte -1.5)>> <</silently>>\ <</widget>> /* ---------- atmos-pools:晨报氛围池按「世道×趋势」四象限取材 ---------- 用法:<<atmos-pools>>(在 morning-report / morning-embed 的 silently 内调用) 输出 _rumor_pool(街头传闻)与 _morn_pool(今日见闻)。 四象限(现状 _atmos_prosper × 趋势 _atmos_down/_atmos_up): 盛世 (现状好·平稳/向好)→ 复苏柏林,克制的繁荣,留一两处边缘残留 盛世转坏 (现状好·下坡) → 好日子还在,但裂缝开始出现 危机转好 (现状差·爬坡) → 危机未散,但透进光(与危机池同意象的正向翻转) 危机 (现状差·平稳/恶化)→ 危机基调默认池 */ <<widget "atmos-pools">>\ <<silently>> <<undercurrent-worst>> <<atmos-trend>> <<if _atmos_prosper>> <<if _atmos_down>> <<set _rumor_pool to [ "百货公司的橱窗仍是新换的,玻璃角落多了几个字:概不赊账。", "咖啡馆到半夜仍亮着灯,侍者说,常客的位子空了几个。", "报童手里体育版卖得尚可,头版仍压在胳膊底下,没有举起来。", "当铺门前的队伍尚短,柜台上多了称金器的小秤。", "街角的面包房照常开门,招牌上的价目被纸条盖住。", "剧院门口的海报仍然鲜亮,撕角处露出上一场演出的名字。", "电车照常进站,车厢里空出几块广告位。", "体育宫的预售仍在继续,售票口排队的人比上周少了许多。", "有人搬出夏洛滕堡的公寓,家具在人行道上摆了许久,傍晚只剩几件。", "画展请柬仍在流传,只是没人再提买画的事。" ]>> <<set _morn_pool to [ "统计局月报显示,零售销售额较上月略有回落,专家将其归因于季节性波动。", "劳工局公布数据,登记失业人数结束连续数月的下降,本月持平。", "央行周报删去上周出现的「稳定」一词,改用「大体平稳」。", "市政住房办公室宣布,数处新住宅区二期工程延后开工,理由为「图纸修订」。", "多家银行维持贷款利率不变,同时收紧小商户的抵押条件。", "电车公司宣布暂缓恢复其余夜间线路,称恢复时间将视客流另行通知。", "慈善总会报告,领救济的队伍仍短于去年冬天,但入冬以来首次停止缩短。", "中央市场到货量正常,批发商反映,赊账的老主顾比上月明显增多。", "教育部通报,市立学校课时正常,新学期取暖用煤采购合同尚未签订。", "工商联合会月度问卷显示,对来年持悲观预期的会员企业首次明显增多。", "市立歌剧院平价夜场继续,上座率较首月有所回落,院方称属于正常波动。", "警察署月度统计显示,骚乱报案数持平,醉酒滋事类报案略有增加。" ]>> <<else>> <<set _rumor_pool to [ "库达姆大街的咖啡馆到半夜仍亮着灯,侍者已经开始赶人。", "乌发公司新片的巨幅海报贴上墙,底下站着一群看画的人。", "体育宫六日自行车赛开始预售,场外已有人问价。", "有人在选帝侯大街把一份经济周报读了许久。上周他还只看赛马版。", "地下室的爵士乐队排练到很晚。警察来提醒过音量,却站着听完才离开。", "百货公司的橱窗换上秋季新装,玻璃擦得很亮,能照见电车进站。", "报童今天多进了几份体育版,收摊前已卖光。", "画展请柬在咖啡馆的桌上传来传去。去不去另说,先谈论一晚上。", "当铺门前的队伍短了些,但还没有散。", "有人从波茨坦带来些苹果,换走旧皮鞋。离开时都在笑。" ]>> <<set _morn_pool to [ "市政厅公布秋季文化周安排,市立歌剧院将联合多家剧院开设平价夜场,学生票有优惠。", "柏林证券交易所今日交投平稳,工业股连续数周收涨,市场信心继续回升。", "电车公司宣布恢复此前削减的夜间线路,末班车延后至深夜。", "教育部今日通报,各市立学校课时与取暖恢复正常,秋季开学准备已就绪。", "劳工局公布数据,登记失业人数连续数月回落。工商界称新订单有所增加。", "乌发影业新片今日在柏林开机,制片方预计雇用一批本地工人。", "警察署月度统计显示,街头骚乱报案数较上月明显下降,日常巡逻仍维持常态。", "中央市场到货量恢复正常,蔬果价格连续数周走低。运货马车比上月明显增多。", "体育宫六日自行车赛下月开赛,门票预售顺利,铁路部门将增开夜间返程班次。", "多家银行小幅下调商业贷款利率。央行周报里出现一个久违的词:稳定。", "市政住房办公室宣布数处新住宅区动工,首批图纸自今日起在市政厅展出。", "慈善总会报告,领救济的队伍较去年冬天明显缩短。负责人同时提醒,缩短并不等于消失。" ]>> <</if>> <<else>> <<if _atmos_up>> <<set _rumor_pool to [ "当铺门前的队伍短了一点。排队的人说,下个月大概还能再短一些。", "面包房的炉子下午也生着火,隔着几条街都闻得到。", "报童今天把头版举得高高的。有人停下来看了一眼,他没有喊,也没有放下。", "克罗伊茨贝格的墙上,红漆字旁多了几个粉笔字:招工。", "有人在罗曼咖啡馆念诗,念完没有哭,桌上多了别人请的咖啡。", "工会的人在发传单,这次有人接过,还问了日期。", "安哈尔特火车站到站旅客中,多了几个拎工具箱的人。", "蒂尔加滕的长椅上晒着洗过的毯子。毯子干了,有人把它叠好带走。", "街角书报亭把经济周报摆到前排,压过了体育版。", "波茨坦来的苹果又进城了,这回换走几双半新的皮鞋。" ]>> <<set _morn_pool to [ "劳工局公布数据,登记失业人数数周以来首次回落,工商界称新订单已开始恢复。", "中央市场今日开市,蔬果到货量较上周增加,价格涨幅收窄。", "柏林交易所今日交投略有起色,工业股结束连续数周下跌,收盘微涨。", "市政当局公告,供暖用煤到港量增加,市立学校课时有望逐批恢复。", "电车公司表示,正在评估恢复部分夜间线路的成本,尚无时间表。", "多家私人银行小幅下调商业票据贴现率,央行周报措辞较上月缓和。", "警察署月度统计显示,街头骚乱报案数停止上升,警方称巡逻部署初见成效。", "慈善总会报告,社会捐助较上月增加,数处施粥点暂停夜间场次。", "工商联合会致函政府,称汇率出现趋稳迹象,建议尽快明确货币政策。", "教育部通报,数所市立学校恢复全日制课时,其余学校视燃煤到货逐批恢复。", "市政住房办公室重启部分停工住宅区的地基工程,用工来自失业登记名单。", "外贸商会统计,本月出口订单较上月回升,多为短期合同,长期订单仍然谨慎。" ]>> <<else>> <<set _rumor_pool to [ "听说威丁区昨晚又打起来了。", "报童今天没有喊,只是举着报纸。", "有人在选帝侯大街用成捆纸马克换咖啡。", "蒂尔加滕的长椅上躺着人,没有再起来。", "工会的人在发传单,但没有人接。", "克罗伊茨贝格的墙上新刷了红漆,字还没有干。", "安哈尔特火车站又来了一批人。他们不说话。", "有人在罗曼咖啡馆念诗,念完哭了。", "街角的当铺队伍比面包店还长。", "你说不清今天和昨天有什么不同。也许问题就在这里。" ]>> <<set _morn_pool to [ "市政当局今日公告,面包价格较昨日再度上调,各区食品店门前排起长队。官方呼吁市民保持冷静,有序购买。", "柏林电车公司宣布,自下周起票价上调,以应对煤价持续上涨。工会方面已表示反对。", "内政部发言人今日表示,将加强各主要车站与广场的警力部署,以维护公共秩序。", "工商联合会今日致函政府,呼吁尽快稳定汇率,并称当前物价波动已严重冲击中小企业经营。", "柏林市政厅公布最新住房报告,指住房短缺较上月未见缓解,当局正研究应对方案。", "气象台今日预报,未来数日持续低温,市政部门已安排增派供暖与街面保障人员。", "多家私人银行今日调整外汇牌价。央行未就此发表评论,市场人士多持观望态度。", "教育部今日通报,因取暖用煤短缺,部分市立学校将缩短课时。家长团体呼吁尽快解决。", "柏林警察署今日就近期多起街头集会发表声明,称将依法维护秩序,同时保障公民合法集会权利。", "劳工局今日公布数据,登记失业人数较上周继续增加。当局表示正协调各方提供临时救济岗位。", "中央市场今日开市,蔬果到货量较往日减少,价格小幅走高。摊贩称主因是运输受阻。", "柏林市政医院今日报告,入冬以来就诊人数增加,院方呼吁市民如感不适及时就医。" ]>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- morning-report:每日晨报仪式化 ---------- 用法:<<morning-report>> 在办公室页面顶部调用,生成固定版式的晨报: 头条(世界变动+感官描写)/ 地方电报(深耕区状态)/ 街头传闻(纯氛围)/ 你的日程(TP+暗示提示) */ <<widget "morning-report">>\ <<silently>> /* 星期计算:与侧边栏 weekday 宏一致,用真实日历推算 */ <<set _weekdays to ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]>> <<set _dateObj to new Date($date.year, $date.month - 1, $date.day)>> <<set _weekday to _weekdays[_dateObj.getDay()]>> /* 天气:根据月份生成基础天气,再叠加世界状态修饰 */ <<set _weather to "铅灰色">> <<if $date.month lte 2 or $date.month eq 12>> <<set _weather_pool to ["铅灰色,冻雨","灰白,无风","阴沉,偶有雪花","湿冷,雾气弥漫"]>> <<elseif $date.month gte 3 and $date.month lte 5>> <<set _weather_pool to ["阴冷,风很大","灰蒙蒙,偶尔放晴","潮湿,路面泥泞","冷雨间歇"]>> <<elseif $date.month gte 6 and $date.month lte 8>> <<set _weather_pool to ["闷热,沥青路面在扭曲","湿热,雷阵雨前兆","干燥,尘土飞扬","阴沉,暴雨将至"]>> <<else>> <<set _weather_pool to ["阴冷,落叶满地","灰暗,煤烟和雨混在一起","湿冷,雾锁全城","阴沉,风从东边来"]>> <</if>> <<set _weather to _weather_pool[random(0, _weather_pool.length - 1)]>> /* 世界状态叠加层:高数值时追加天气修饰,逐层降低概率 */ <<if $world.economy gte 60 and random(1, 100) lte 60>> <<set _weather to _weather + ",煤烟让空气发黄">> <<elseif $world.social_anger gte 50 and random(1, 100) lte 40>> <<set _weather to _weather + ",风很硬,像在抽人">> <<elseif $world.political_violence gte 40 and random(1, 100) lte 30>> <<set _weather to _weather + ",雾很低,分不清远处是树还是人">> <<elseif $world.inflation gte 70 and random(1, 100) lte 25>> <<set _weather to _weather + ",纸马克被风吹得满街飞">> <<elseif $world.gov_trust lt 20 and random(1, 100) lte 20>> <<set _weather to _weather + ",气象台的窗户被木板封了">> <</if>> /* 头条:根据世界变动生成 */ <<set _headline to "">> <<set _headline_text to "">> <<if $world_yesterday neq null>> <<set _yd to $world_yesterday>> <<set _econ_diff to Math.round($world.economy - _yd.economy)>> <<set _inf_diff to Math.round($world.inflation - _yd.inflation)>> <<set _anger_diff to Math.round($world.social_anger - _yd.social_anger)>> <<set _viol_diff to Math.round($world.political_violence - _yd.political_violence)>> <<if _inf_diff gte 5>> <<set _headline to "纸马克兑美元再创新低">> <<set _headline_text to "汇率数字又多了一位。你在总理府走廊里听到职员在低声计算:这个月的工资,到下班时还能买几公斤土豆。">> <<elseif _econ_diff gte 5>> <<set _headline to "鲁尔局势加剧经济压力">> <<set _headline_text to "工厂烟囱又少了几根在冒烟。面包店门口的队伍拐了两个弯,没人说话,只有鞋底踩在湿石板上的声音。">> <<elseif _viol_diff gte 5>> <<set _headline to "街头冲突升级">> <<set _headline_text to "昨夜某条街上传来碎玻璃声和哨声。今早环卫在冲洗路面,水混着颜料流进排水沟。">> <<elseif _anger_diff gte 5>> <<set _headline to "工人区气氛紧张">> <<set _headline_text to "克罗伊茨贝格方向冒烟了。不是烟囱--是篝火。有人在篝火旁讲话,声音被风削成碎片。">> <<elseif _inf_diff lte -5>> <<set _headline to "马克暂时企稳">> <<set _headline_text to "银行家们在擦汗。面包店换了新价牌--价格没涨。这在1923年本身就是新闻。">> <<elseif _econ_diff lte -5>> <<set _headline to "经济压力略有缓解">> <<set _headline_text to "工厂烟囱多冒了几缕烟。不多,但足够让人多看一眼。">> <<else>> /* 无显著变化时,根据倾向+数值分级显示 */ <<player-stance>> <<set _headline to "柏林今日无重大变动">> <<set _headline_text to "没有新的坏消息。">> /* 倾向偏移:在分级文本前加一句倾向性描述 */ <<if _stance_type eq "hard">> <<set _headline_text to "没有新的坏消息。你的笔在桌上放着,墨水干了,但笔尖朝下--随时准备签。">> <<elseif _stance_type eq "soft">> <<set _headline_text to "没有新的坏消息。你松了半口气,又咽了回去--在柏林,松气是奢侈品。">> <<elseif _stance_type eq "wait">> <<set _headline_text to "没有新的坏消息。你又多等了一天。等待在柏林不是策略,是习惯。">> <</if>> <<if $world_feedback and $world_feedback.inflation>> <<for _wf_i to 0; _wf_i lt $world_feedback.inflation.range.length; _wf_i++>> <<if $world.inflation lte $world_feedback.inflation.range[_wf_i].max>> <<set _headline_text to _headline_text + $world_feedback.inflation.range[_wf_i].text>> <<set _wf_i to $world_feedback.inflation.range.length>> <</if>> <</for>> <</if>> <</if>> <<else>> <<set _headline to "1923年的柏林">> <<set _headline_text to "法国人要进鲁尔了。电报机开始冒烟。你知道这一年不会太平。">> <</if>> /* 地方电报:检查深耕区的状态 */ <<set _local_telegraph to "">> <<set _active_regions to []>> <<for _rg_key range Object.keys($regions)>> <<set _rg to $regions[_rg_key]>> <<if _rg.unlocked and _rg.visit_count gt 0 and _rg.district neq "外景地">> <<set _active_regions.push({name: _rg.name, stability: _rg.stability, danger: _rg.danger})>> <</if>> <</for>> <<if _active_regions.length gt 0>> <<set _picked to _active_regions[random(0, _active_regions.length - 1)]>> <<if _picked.danger gte 40>> <<set _local_telegraph to _picked.name + " · 危险度 " + _picked.danger + "/100。街上有哨声。">> <<elseif _picked.stability gte 60>> <<set _local_telegraph to _picked.name + " · 稳定度 " + _picked.stability + "/100。今天还算平静。">> <<else>> <<set _local_telegraph to _picked.name + " · 稳定度 " + _picked.stability + "/100。空气绷着。">> <</if>> <<else>> <<set _local_telegraph to "你还没有去过任何区域。柏林在等你。">> <</if>> /* 街头传闻+今日见闻:池子由 atmos-pools 按世道给出(盛世=暗账最险值<50) */ <<atmos-pools>> <<set _rumor to _rumor_pool[random(0, _rumor_pool.length - 1)]>> /* 昨日简汇:找出昨天(前一天)处理过的事件,重大事件会被列出 */ <<set _ydo to new Date($date.year, $date.month - 1, $date.day - 1)>> <<set _y_events to []>> <<if $event_log>> <<for _ye to 0; _ye lt $event_log.length; _ye++>> <<set _ye_ev to $event_log[_ye]>> <<if _ye_ev.resolved_date and _ye_ev.resolved_date.year eq _ydo.getFullYear() and _ye_ev.resolved_date.month eq (_ydo.getMonth() + 1) and _ye_ev.resolved_date.day eq _ydo.getDate()>> <<set _y_events.push(_ye_ev)>> <</if>> <</for>> <</if>> /* 今日见闻:官媒社会新闻,从 atmos-pools 给的池子抽 2-3 则(不重复) */ <<set _morn_work to _morn_pool.slice()>> <<set _morn_picked to []>> <<set _morn_n to Math.min(3, _morn_work.length)>> <<for _mi to 0; _mi lt _morn_n; _mi++>> <<set _mi_idx to random(0, _morn_work.length - 1)>> <<set _morn_picked.push(_morn_work[_mi_idx])>> <<set _morn_work.splice(_mi_idx, 1)>> <</for>> /* 待办笔记本:现场待办(文件篮→地区推延)+ 欠条簿未兑现 + 即将到期的许诺 */ <<set _todo_list to []>> <<if $regions>> <<set _tk to Object.keys($regions)>> <<for _ti to 0; _ti lt _tk.length; _ti++>> <<set _tgr to $regions[_tk[_ti]]>> <<if _tgr and _tgr.active_event>> <<set _tdays to _tgr.active_event.deadline_day - $session_day>> <<set _todo_list.push({type: "现场", title: _tgr.active_event.title, days: _tdays})>> <</if>> <</for>> <</if>> <<if $promise_ledger>> <<for _tpi to 0; _tpi lt $promise_ledger.length; _tpi++>> <<set _tpl to $promise_ledger[_tpi]>> <<if _tpl.status eq "open">> <<set _tpdl to _tpl.deadline - $session_day>> <<set _todo_list.push({type: "欠条", title: _tpl.content, days: _tpdl})>> <</if>> <</for>> <</if>> <<if $promise_pending>> <<for _tppi to 0; _tppi lt $promise_pending.length; _tppi++>> <<set _tpp to $promise_pending[_tppi]>> <<set _tppd to _tpp.due_day - $session_day>> <<if _tppd lte 2>> <<set _todo_list.push({type: "许诺", title: _tpp.title, days: _tppd})>> <</if>> <</for>> <</if>> <</silently>>\ <hr>\ ''柏林晨报 · <<datestr>> · _weekday''\ 天气:_weather | 今日TP:<<if $tp gt $tp_max>><<print Math.round($tp * 10) / 10>>点<span class="txt-muted">(攒的,上限 $tp_max)</span><<else>><<print Math.round($tp * 10) / 10>>/<b>$tp_max</b><</if>> <hr>\ ''【头条】''_headline _headline_text <<if _y_events.length gt 0>>\ ''【昨日简汇 · 你经手的事】'' <<for _ye2 to 0; _ye2 lt _y_events.length; _ye2++>>\ • <<print _y_events[_ye2].title>> <</for>>\ //你昨天翻过的那些文件,今早还带着墨迹。纸上的字会淡,债不会。//\ <</if>>\ ''【地方电报】''<<print _local_telegraph>> <details class="ambient-fold" ontoggle="window.__ambFoldOpen && window.__ambFoldOpen()">\ <summary>街头随感 · 传闻与见闻</summary>\ <div class="af-body">\ ''街头传闻'' //_rumor// ''今日见闻'' <<for _sn2 to 0; _sn2 lt _morn_picked.length; _sn2++>>\ • <<print _morn_picked[_sn2]>> <</for>>\ </div>\ <div class="af-hint">//这些只是街头的风,与你今晚的决定无关。//</div>\ </details>\ <<if $site_neglect_log and $site_neglect_log.length gt 0>>\ ''【你错过的现场】'' <<for _sn_to 0; _sn_to lt $site_neglect_log.length; _sn_to++>>\ <<set _sn_item to $site_neglect_log[_sn_to]>>\ //<<print _sn_item.text>>// //你的代价:<span class="txt-severe"><<print _sn_item.cost>></span>// <hr> <</for>>\ <</if>>\ <<silently>> /* 街头的体感:每天随机展示一个世界变量的分级文本 */ <<set _body_text to "">> <<if $world_feedback>> <<set _body_keys to ["economy","social_anger","political_violence","nationalism","revolution","army_influence","gov_trust"]>> <<set _body_pick to _body_keys[random(0, _body_keys.length - 1)]>> <<if $world_feedback[_body_pick]>> <<for _bf_i to 0; _bf_i lt $world_feedback[_body_pick].range.length; _bf_i++>> <<if $world[_body_pick] lte $world_feedback[_body_pick].range[_bf_i].max>> <<set _body_text to $world_feedback[_body_pick].range[_bf_i].text>> <<set _bf_i to $world_feedback[_body_pick].range.length>> <</if>> <</for>> <</if>> <</if>> <</silently>>\ <<if _body_text neq "">>\ ''【街头的体感】''//_body_text//\ <</if>> <<if $review_morning_pending and $review_news_line and $review_news_line neq "">>\ ''【国会快报】''//$review_news_line// <<set $review_morning_pending to false>>\ <</if>> <<silently>> <<set _td_days_text to "">> <</silently>> ''【待办笔记本 · 你答应过的事】'' <<if _todo_list.length eq 0>>\ //本子是干净的。你暂时没欠任何事。但柏林从不欠你账。//\ <<else>>\ <<for _td to 0; _td lt _todo_list.length; _td++>>\ <<silently>> <<set _tdi to _todo_list[_td]>> <<if _tdi.days lt 0>><<set _td_days_text to "已超时">> <<elseif _tdi.days eq 0>><<set _td_days_text to "今天到期">> <<else>><<set _td_days_text to "剩" + _tdi.days + "天">><</if>> <</silently>> [<<print _tdi.type>>] <<print _tdi.title>> (_td_days_text) <</for>>\ //这些事,你做到一半,或还没开始。拖得越久,利息越贵。//\ <</if>> ''【你的日程】''_phase_name · 剩余<<print Math.round($tp * 10) / 10>> TP <<if $weimar.personality_tension gte Math.round($weimar.effective_threshold * 0.7) and $weimar.personality_tension lt $weimar.effective_threshold>>\ //⚠ 魏玛的状态不对。他最近沉默得太多了。也许该找他谈谈。//\ <</if>>\ <hr>\ <</widget>> /* ---------- morning-embed:办公室顶部精简晨报表 ---------- 用法:<<morning-embed>> 供办公室操作台顶部常驻嵌入。只保留每日最关心的三件事: 昨日差事(你昨天处理过的事件)/ 今日见闻(随机街头观察)/ 待办笔记本(现场待办+未兑现承诺+即将到期的许诺)。 天气、头条、地方电报等完整内容保留在资料室《柏林晨报》全文。 */ <<widget "morning-embed">>\ <<silently>> /* 危机预警提醒:daily-tick 的 crisis-warn-note 写入 $crisis_notice,晨报表顶部红字展示,看完清空 */ <<set _crisis_notes to []>> <<if $crisis_notice and $crisis_notice.length gt 0>> <<set _crisis_notes to $crisis_notice>> <<set $crisis_notice to []>> <</if>> /* 暗涌风声(63_swell_gate):硬门槛过了但骰子未中的「差点发生」,晨报表展示后清空 */ <<set _swell_rumors to []>> <<if $swell_rumor_pending and $swell_rumor_pending.length gt 0>> <<set _swell_rumors to $swell_rumor_pending>> <<set $swell_rumor_pending to []>> <</if>> /* 昨日简汇:前一天处理过的事件 */ <<set _yde to new Date($date.year, $date.month - 1, $date.day - 1)>> <<set _y_evs to []>> <<if $event_log>> <<for _ye to 0; _ye lt $event_log.length; _ye++>> <<set _ye_ev to $event_log[_ye]>> <<if _ye_ev.resolved_date and _ye_ev.resolved_date.year eq _yde.getFullYear() and _ye_ev.resolved_date.month eq (_yde.getMonth() + 1) and _ye_ev.resolved_date.day eq _yde.getDate()>> <<set _y_evs.push(_ye_ev)>> <</if>> <</for>> <</if>> /* 今日见闻:官媒社会新闻,池子由 atmos-pools 按世道给出(盛世=暗账最险值<50) */ <<atmos-pools>> <<set _mnp to _morn_pool>> <<set _mnp_work to _mnp.slice()>> <<set _mnp_picked to []>> <<set _mnp_n to Math.min(2, _mnp_work.length)>> <<for _mi to 0; _mi lt _mnp_n; _mi++>> <<set _mi_idx to random(0, _mnp_work.length - 1)>> <<set _mnp_picked.push(_mnp_work[_mi_idx])>> <<set _mnp_work.splice(_mi_idx, 1)>> <</for>> /* 待办笔记本:现场待办 + 欠条簿未兑现 + 即将到期的许诺 */ <<set _todo_list to []>> <<if $regions>> <<set _tk to Object.keys($regions)>> <<for _ti to 0; _ti lt _tk.length; _ti++>> <<set _tgr to $regions[_tk[_ti]]>> <<if _tgr and _tgr.active_event>> <<set _tdays to _tgr.active_event.deadline_day - $session_day>> <<set _todo_list.push({type: "现场", title: _tgr.active_event.title, days: _tdays})>> <</if>> <</for>> <</if>> <<if $promise_ledger>> <<for _tpi to 0; _tpi lt $promise_ledger.length; _tpi++>> <<set _tpl to $promise_ledger[_tpi]>> <<if _tpl.status eq "open">> <<set _tpdl to _tpl.deadline - $session_day>> <<set _todo_list.push({type: "欠条", title: _tpl.content, days: _tpdl})>> <</if>> <</for>> <</if>> <<if $promise_pending>> <<for _tppi to 0; _tppi lt $promise_pending.length; _tppi++>> <<set _tpp to $promise_pending[_tppi]>> <<set _tppd to _tpp.due_day - $session_day>> <<if _tppd lte 2>> <<set _todo_list.push({type: "许诺", title: _tpp.title, days: _tppd})>> <</if>> <</for>> <</if>> <</silently>>\ <div class="office-morning">\ <span class="om-title">柏林晨报 · <<datestr>></span>\ <!-- 危机预警:红字置顶(10天倒数的自救窗口提示) -->\ <<if _crisis_notes.length gt 0>>\ <<for _cn2 to 0; _cn2 lt _crisis_notes.length; _cn2++>>\ <span class="om-line txt-severe">_crisis_notes[_cn2]</span>\ <</for>>\ <</if>>\ <!-- 暗涌风声:差点发生的历史(灰字,🌫 前缀) -->\ <<if _swell_rumors.length gt 0>>\ <<for _swr2 to 0; _swr2 lt _swell_rumors.length; _swr2++>>\ <span class="om-line txt-muted">🌫 风声——<<print _swell_rumors[_swr2].text>></span>\ <</for>>\ <</if>>\ <!-- 决策层:昨日差事 + 待办置顶常驻 -->\ <<if _y_evs.length gt 0>>\ <span class="om-sec">昨日差事</span>\ <<for _ye2 to 0; _ye2 lt _y_evs.length; _ye2++>>\ <span class="om-line">• <<print _y_evs[_ye2].title>></span>\ <</for>>\ <</if>>\ <span class="om-sec">待办笔记本</span>\ <<if _todo_list.length eq 0>>\ <span class="om-line om-empty">本子是干净的。你暂时没欠任何事。</span>\ <<else>>\ <<for _td to 0; _td lt _todo_list.length; _td++>>\ <<set _tdi to _todo_list[_td]>><<if _tdi.days lt 0>><<set _td_days_text to "已超时">><<elseif _tdi.days eq 0>><<set _td_days_text to "今天到期">><<else>><<set _td_days_text to "剩" + _tdi.days + "天">><</if>>\ <span class="om-line">• [<<print _tdi.type>>] <<print _tdi.title>>(_td_days_text)</span>\ <</for>>\ <</if>>\ <!-- 氛围层:今日见闻收进可展开卡,看才展开(展开记为 $brief_log 埋点) -->\ <details class="ambient-fold" ontoggle="window.__ambFoldOpen && window.__ambFoldOpen()">\ <summary>街头随感 · 今日见闻</summary>\ <div class="af-body">\ <span class="om-sec">今日见闻</span>\ <<for _sn2 to 0; _sn2 lt _mnp_picked.length; _sn2++>>\ <span class="om-line">• <<print _mnp_picked[_sn2]>></span>\ <</for>>\ </div>\ <div class="af-hint">//这些只是街头的风,不会化进你今晚的账本。//</div>\ </details>\ </div>\ <</widget>> /* ---------- npc-attitude:政党态度层级文本 ---------- 用法:<<npc-attitude "spd">> 根据 $npcs[key].trust 返回对应档位的态度描述 输出存入 _attitude_text */ <<widget "npc-attitude">>\ <<silently>> <<set _attitude_text to "">> <<set _na_key to $args[0]>> <<if $npc_attitude and $npc_attitude[_na_key] and $npcs[_na_key]>> <<set _na_trust to $npcs[_na_key].trust>> <<for _na_i to 0; _na_i lt $npc_attitude[_na_key].length; _na_i++>> <<if _na_trust lte $npc_attitude[_na_key][_na_i].max>> <<set _attitude_text to $npc_attitude[_na_key][_na_i].text>> <<set _na_i to $npc_attitude[_na_key].length>> <</if>> <</for>> <</if>> <</silently>>\ <</widget>> /* ---------- attitude-tier-idx:查询信任档位序号与档位句 ---------- 用法:<<attitude-tier-idx "spd" 63>> → _tier_idx(-1=无数据)/_tier_text(档位句) 供 trust-capped 捕捉进档/掉档时机(前后档位变化才显示)。 */ <<widget "attitude-tier-idx">>\ <<silently>> <<set _ati_key to $args[0]>> <<set _ati_trust to Number($args[1]) || 0>> <<set _tier_idx to -1>> <<set _tier_text to "">> <<if $npc_attitude and $npc_attitude[_ati_key]>> <<for _atii to 0; _atii lt $npc_attitude[_ati_key].length; _atii++>> <<if _tier_idx eq -1 and _ati_trust lte $npc_attitude[_ati_key][_atii].max>> <<set _tier_idx to _atii>> <<set _tier_text to $npc_attitude[_ati_key][_atii].text>> <</if>> <</for>> <</if>> <</silently>>\ <</widget>> /* ---------- sb-party:侧边栏党派信任卡(两列·上下卡) ---------- 用法:<<sb-party "spd" "SPD 社民党">> 上=党名独占一行,下=细条+数值;态度描述放入 title 悬停提示。 与昨日快照 $trust_yesterday 对比,变化时数值旁显示 ↑绿/↓红 小字。 */ <<widget "sb-party">>\ <<silently>> <<set _sb_key to $args[0]>> <<set _sb_name to $args[1]>> <<npc-attitude _sb_key>> <<set _sb_val to Math.max(0, Math.round(Number($npcs[_sb_key].trust) || 0))>> <<set _sb_diff to 0>> <<if $trust_yesterday and $trust_yesterday[_sb_key] neq null>> <<set _sb_diff to Math.round(_sb_val - Number($trust_yesterday[_sb_key]))>> <</if>> <</silently>>\ <<print '<span class="sb-item" title="' + _attitude_text + '"><span class="sb-top"><span class="sb-label">' + _sb_name + '</span></span><span class="sb-bar-row"><span class="sb-bar"><span class="sb-bar-fill" style="width:' + _sb_val + '%"></span></span><b class="sb-val">' + _sb_val + '</b>' + (_sb_diff neq 0 ? '<span class="sb-trust-delta ' + (_sb_diff gt 0 ? 'txt-recover' : 'txt-severe') + '">' + (_sb_diff gt 0 ? '↑+' : '↓') + _sb_diff + '</span>' : '') + '</span>'>>\ <</widget>> /* ---------- player-stance:判断玩家选择倾向 ---------- 用法:<<player-stance>> 根据 stance_count 判断当前主导倾向 输出:_stance_type("hard"/"soft"/"wait"/"none") */ <<widget "player-stance">>\ <<silently>> <<set _sc to $player.stance_count>> <<set _stance_type to "none">> <<if _sc.hard gt _sc.soft and _sc.hard gt _sc.wait>> <<set _stance_type to "hard">> <<elseif _sc.soft gt _sc.hard and _sc.soft gt _sc.wait>> <<set _stance_type to "soft">> <<elseif _sc.wait gt _sc.hard and _sc.wait gt _sc.soft>> <<set _stance_type to "wait">> <</if>> <</silently>>\ <</widget>> /* ---------- img:统一图片引用 ---------- 用法:<<img "ui/foo.png">> 或 <<img "scene/bar.jpg" "alt文字">> 展开为 <img src="assets/img/...">,统一资源路径前缀。 图片放在 assets/img/ 下,按类型分子目录(ui/scene/bg)。 */ <<widget "img">>\ <<silently>> <<set _img_src to "assets/img/" + $args[0]>> <<set _img_alt to $args[1] ? $args[1] : "">> <</silently>>\ <img src="_img_src" alt="_img_alt">\ <</widget>> /* ---------- weekday:输出"星期X" ---------- */ <<widget "weekday">>\ <<silently>> <<if $date and $date.year and $date.month and $date.day>> <<set _dateObj to new Date($date.year, $date.month - 1, $date.day)>> <<set _weekdays to ["日", "一", "二", "三", "四", "五", "六"]>> <<set _wd to _weekdays[_dateObj.getDay()]>> <<else>> <<set _wd to "?">> <</if>> <</silently>>(星期_wd)\ <</widget>> /* ---------- prop-filter:按当前阶段过滤党派提案(V0.4-F) ---------- 规则:persistent 贯穿全场,否则 start_stage ≤ 当前 ≤ end_stage。 排除 counterfactual(历史歧路是玩家特权)与 type:"pressure"(外部压力牌走独立应对线)。 当前阶段从 $chapter 推导(骨架阶段固定 S3,后续接 $stage 系统)。 输出 $prop_available(可用提案数组)。 */ <<widget "prop-filter">>\ <<silently>> <<set _prop_stage to $stage ? $stage.id : "S3">> <<set $prop_available to []>> <<set _prop_parties to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]>> <<for _prop_pi to 0; _prop_pi lt _prop_parties.length; _prop_pi++>> <<set _prop_plist to $party_proposals[_prop_parties[_prop_pi]]>> <<if _prop_plist and _prop_plist.length gt 0>> <<for _prop_i to 0; _prop_i lt _prop_plist.length; _prop_i++>> <<set _prop_item to _prop_plist[_prop_i]>> <<if not _prop_item.counterfactual and not (_prop_item.type eq "pressure") and (_prop_item.persistent or (_prop_item.start_stage lte _prop_stage and _prop_item.end_stage gte _prop_stage))>> <<set $prop_available to $prop_available.concat([_prop_item])>> <</if>> <</for>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- cap-calc:政治资本实时推导(原型) ---------- 设计稿 V0.4-F 4.2:政治资本 = 党派信任加权和×0.4 + 承诺兑现数×5 + 姿态一致性(0~10) + 玩家标签修正(-10~+15) + 光谱居中(0~8) + 活跃遗产×2 原型用实时推导,不写 $political_capital 变量;后续替换为显式累积。 */ <<widget "cap-calc">>\ <<silently>><<set $pc_total to Game.pc()>><</silently>>\ <</widget>> /* ---------- cap-dialog:政治资本组成弹窗(DoL 风格) ---------- */ <<widget "cap-dialog">>\ <<silently>><<cap-calc>><</silently>> <<silently>> <<set _bd to Game.capParts()>>\ <<set _pc_trust_w to _bd.trust>>\ <<set _pc_promise to _bd.promise>>\ <<set _pc_stance to _bd.stance>>\ <<set _pc_tag to _bd.tag>>\ <<set _pc_spectrum to _bd.spectrum>>\ <<set _pc_legacy_w to _bd.legacy>>\ <</silently>> <<run Dialog.create("政治资本 " + $pc_total)>>\ <<run Dialog.open()>>\ <<run Dialog.append($(document.createElement("div")) .addClass("cap-breakdown") .html( "<div class='cap-line'><span>党派信任加权</span><b>" + _pc_trust_w + "</b></div>" + "<div class='cap-line'><span>承诺兑现</span><b>" + _pc_promise + "</b></div>" + "<div class='cap-line'><span>姿态一致</span><b>" + _pc_stance + "</b></div>" + "<div class='cap-line'><span>玩家标签修正</span><b>" + _pc_tag + "</b></div>" + "<div class='cap-line'><span>光谱居中</span><b>" + _pc_spectrum + "</b></div>" + "<div class='cap-line'><span>活跃遗产</span><b>" + _pc_legacy_w + "</b></div>" + "<div class='cap-line cap-total'><span>合计</span><b>" + $pc_total + "</b></div>" ))>>\ <</widget>> /* ---------- cap-dialog-review:国会预算弹窗(实时剩余 vs 上限快照) ---------- 国会中侧栏的政治资本改显示"国会预算",条目不展开推导式明细, 而是展示本轮可支配预算与你的总政治资本参考。 */ <<widget "cap-dialog-review">>\ <<silently>> <<set _cbr_left to Math.max(0, ($session_review.capital || 0))>>\ <<set _cbr_limit to Math.max(_cbr_left, ($session_review.capital_limit || 0))>>\ <<set _cbr_total to Game.pc()>>\ <</silently>> <<run Dialog.create("国会可支配资本 · " + _cbr_left + " / " + _cbr_limit)>>\ <<run Dialog.open()>>\ <<run Dialog.append($(document.createElement("div")) .addClass("cap-breakdown") .html( "<div class='cap-line'><span>进入国会时带上的预算</span><b>" + _cbr_limit + "</b></div>" + "<div class='cap-line'><span>已花(拉票/换票/撤案)</span><b>" + (_cbr_limit - _cbr_left) + "</b></div>" + "<div class='cap-line cap-total'><span>剩余可支配</span><b>" + _cbr_left + "</b></div>" + "<p class='cap-line'>国会的预算是独立的——本轮结束即清空,从你的总政治资本折算而来。</p>" + "<div class='cap-line'><span>你的总政治资本(威望)</span><b>" + _cbr_total + "</b></div>" ))>>\ <</widget>> /* ════════════════════════════════════════════════════════════ pool-pick · 轮转取句(复读治理 2026-10-02) 用法:先 <<set _pool to ["句A","句B",...]>>,再 <<pool-pick "槽位名">>, 取出的句子放在 $pool_pick。 游标存 $pool_cursor[槽位名],按序循环(打完一圈才回到第一句), 避免相邻页面连刷同一句。非数组(旧存档的字符串)原样返回,单句池不耗游标。 槽位名约定:fd_* = 抉择前预感三段 / motive_<党> = 背后的算盘 / voice_<党>_<向> = 结算页通用声音三段 / skip_* = 跳天摘要与疏远报告随机句(2026-10-09 接入) ============================================================ */ <<widget "pool-pick">>\ <<silently>> /* 键=所有实参拼接(宏实参不做表达式求值,故调用侧拆成多段传入,如 <<pool-pick "voice_" _ps_pid "_pos">>;纯字面量单参照常) */ <<set _pp_key to $args.join("")>> <<if _pp_key eq "">><<set _pp_key to "x">><</if>> <<set $pool_pick to "">> <<if Array.isArray(_pool) and _pool.length gt 0>> <<set $pool_pick to _pool[0]>> <<if _pool.length gt 1>> <<if not $pool_cursor>><<set $pool_cursor to {}>><</if>> <<set _pp_c to $pool_cursor[_pp_key] ? $pool_cursor[_pp_key] : 0>> <<set $pool_pick to _pool[_pp_c % _pool.length]>> <<set $pool_cursor[_pp_key] to _pp_c + 1>> <</if>> <<elseif _pool>> <<set $pool_pick to _pool>> <</if>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ foreboding · 抉择前的预感(条件拼接,非随机) 信息源三层决定「能不能看见+看见什么方向」: - 情报值(知情者标签强度归一 0-100)→ 清晰度档位 - 状态(精神负荷/光谱/通胀)→ 预感色调 - 抉择类型 + 相关势力 → 预感落点 用法: <<foreboding "violence" "军方">>\ <<foreboding "deal">>\ <<foreboding "speech" "DNVP">>\ 档位:blind 无知觉 → vague 模糊不安 → specific 具体警示 → precise 精确预测。 ============================================================ */ <<widget "foreboding">>\ <<silently>> <<set _fd_raw to $args[0] ? $args[0] : "general">>\ <<set _fd_faction to $args[1] ? $args[1] : "">> /* 红色事件专属文本库(deck_id → 专属预告;盲感与落点可覆盖泛用池) */ <<if not $foreboding_evt>>\ <<set $foreboding_evt to { "R01": { type:"violence", blind:"你打了个寒颤,想起鲁尔这个地名——它离柏林很远,却让桌上每一张纸都发沉。", c:"罢工令一旦签下,矿坑会先黑下来,火随后被点着——有人会把你的名字,钉进那根烧红的日子里。" }, "R02": { type:"speech", blind:"你听见国会传票翻动的声音,比马克贬值还快。", c:"号召罢工的决议一旦通过,鲁尔的补贴会化作一张张越来越轻的纸——法兰西人拿不到东西,德国人自己也吃不饱。" }, "R03": { type:"violence", blind:"你闻到埃森的风里有铁锈味,穿过好几道门还散不掉。", c:"法军的枪一旦在埃森响过,柏林的火就会被点着——死的人越多,你手上越烫。" }, "R04": { type:"violence", blind:"报纸第一版给你留了一个空位,像在等人填进去。", c:"那个被捕的人一旦变节,右翼会把他锻成一面旗;你若不拦,这面旗会越举越高。" }, "R05": { type:"violence", blind:"死刑令在你手里搁了一夜,纸上渗出一层薄汗。", c:"他死后会比活着更有用——圣徒和旗帜都备好了,只差一个名字。" }, "R06": { type:"violence", blind:"你想起柏林街头的煤烟,像一层揭不掉的灰。", c:"总罢工一旦炸开,电车会停、街会空,然后有人往人群里扔石头。" }, "R07": { type:"deal", blind:"走廊另一端有人在互换筹码,声音压得又快又低。", c:"那位演讲大师一旦坐上总理位,妥协就成了国策——你每让一步,对方的底线就退得更远。" }, "R08": { type:"deal", blind:"你听到有人在数投降的代价,数额大得像在开玩笑。", c:"一旦宣布结束抵抗,跪下去容易,可站起来的人里还有多少还信共和国——这笔账,算不清。" }, "R09": { type:"purge", blind:"宪法那一条被翻开三次了,翻开它的人,手很稳。", c:"总统的笔一旦落在第48条上,法律就不再是底线——每一条紧急令,都在为解散议会铺路。" }, "R10": { type:"purge", blind:"柏林的命令到了慕尼黑像废纸——你知道这件事,街对面的人也知道。", c:"一旦默许巴伐利亚独揽大权,别的邦就会照着学——共和国分离的第一道缝,就从这里裂开。" }, "R11": { type:"deal", blind:"一屋子人在低声表决,说出口的都是斩钉截铁的字眼。", c:"他们投了否决,可消息没能送到汉堡——你手里握着的,也许就是那句话会不会传出去。" }, "R12": { type:"violence", blind:"街垒在灰蒙蒙的天色里立起来,像一排来不及哭的墓碑。", c:"起义一旦点火,克姆尼茨说停、柏林没跟上——他们孤军三天,血会一直流到这条街的尽头。" }, "R13": { type:"purge", blind:"国防军的军靴在夜里开进一个州,像一声被压低的咳嗽。", c:"军队一旦开进萨克森,共和国就动手打自己的州——右翼会记住这个方法,然后原样用在你身上。" }, "R14": { type:"violence", blind:"慕尼黑那间啤酒馆,今晚门关得比平时早。有人不打算让它再开。", c:"冲锋队一旦冲进去,德国会记住一个种子的名字——这场失败,会把「下一次」种进每一颗等待的人心里。" }, "R15": { type:"violence", blind:"统帅堂前的石板路下,你能听见血渗进缝里的声音。", c:"枪一响,十六个人会倒在那里;而那个逃掉的人会把这一天磨成一把刀,你最好记得他是怎么跑的。" }, "R16": { type:"deal", blind:"账本合上又翻开,数字靠的是一张抵押在土地上的诺言。", c:"地租马克一旦发出去,通胀会像魔法一样停——可魔法的利息,是借来的黄金和押上的土地,迟早有人来收账。" }, "R17": { type:"deal", blind:"功劳簿刚递上去,辞呈已经有人在倒数。", c:"他救了马克、压了两翼、保住了共和国——议会的谢法,是投一张让他走人的票。共和国的报恩,一向如此。" }, "R18": { type:"general", blind:"数字每跳一次,面包就薄一层——你已经学会不看价签了。", c:"万点不是门槛,是一页被翻过去的纸;从今往后,没人能用「明天会好」骗住自己了。" }, "R19": { type:"general", blind:"储蓄罐里装的是灰,你不敢倒出来数。", c:"一个教师一生的积蓄,买不起一磅黄油——共和国的中产,正在这一刻,从脚底裂开。" }, "S01": { type:"violence", blind:"铁轨响了一整夜——运的不是人,是停摆的消息。", c:"罢工一旦越过柏林,共和国丢的就不是一座城,是一整块表皮;铁路线到哪里,火就种到哪里。" }, "S02": { type:"violence", blind:"同一面旗,在不同的街角同时立起来——你知道那不是巧合。", c:"当所有城市同一天举旗,平叛令就要同时面对好几条街——共和国一只脚刚站稳,另一只脚已在火里。" }, "S03": { type:"purge", blind:"卫戍部队的枪口朝错了方向举起来,你听见那种错位的声音。", c:"慕尼黑卫戍军一旦站到暴动者一边,巴伐利亚就会颁出一纸脱离书——而你桌上那份通教化,会变成废纸。" }, "S04": { type:"violence", blind:"矿灯和猎枪在往同一条街走——你分不清那是上班,还是上墙。", c:"国防军一旦在萨克森咬到硬骨头,镇压的代价就不再是纸上的数字,而是每一个不肯放下灯的人。" }, "S05": { type:"deal", blind:"两个本该各走各路的人,在边境小站停了很久——那里没有站台,只有握手的影子。", c:"慕尼黑一旦握住总参谋部的手,共和国就从中间裂开一道缝;你拦得住一个握手,拦不住一群早就想握手的人。" }, "S06": { type:"deal", blind:"新钞在柜台上被推了回来——连印它的银行,都不信它。", c:"地租马克一旦救不了市,通胀就会从每道裂缝里继续渗——货币心脏停跳一次,共和国就短一口气。" }, "S07": { type:"deal", blind:"莱茵来的公文上盖着一枚陌生的印章——印文你认得每个字,连起来却不属于任何一国。", c:"分离的旗一旦在占领军眼皮底下升起来,共和国的地图就缺了一角;收不回的国土,先丢的是纸面上的名字。" }, "S08": { type:"violence", blind:"台阶上的黑旗放低了半寸,花圈的白缎带在风里响。", c:"一颗子弹带走一个签署和约的名字——暗杀者要的不是一条命,是让所有签字的手都记住发抖是什么感觉。" }, "S09": { type:"purge", blind:"仓库的账面写着农具,清点单却短了几百支步枪的重量。", c:"影子部队一旦长成,共和国就有了两支军队——一支宣誓护宪,一支只效忠握它的人。" }, "S10": { type:"general", blind:"城里面粉涨了两成,乡下粮仓却上了锁——你闻到两头都有的火药味。", c:"农民一旦锁上粮仓,城市就得跟乡村讨饭吃;饿着肚子的工人和守着粮的农民,会替你把内战预演一遍。" }, "S11": { type:"purge", blind:"军官俱乐部的灯熄得比平时晚——夜谈的烟味顺着你窗缝爬进来。", c:"密谋一旦从酒馆走进军营,第48条救不了你——枪口转向的速度,比任何一届内阁倒台都快。" }, "S12": { type:"deal", blind:"伦敦的电报机响到深夜,你听见 Morse 码的滴答,像在数你的期限。", c:"通牒一旦到期没有答复,占领区就会再沉一寸;可你要是全盘接下,签字桌就变成审判席。" }, "S13": { type:"purge", blind:"报馆的灯还亮着,可排字工人的手停了——稿子在等一个章。", c:"审查的章一旦盖下去,共和国就先在纸面上死了一块;堵住嘴的声音,会从地底下更响地传回来。" }, "C01": { type:"violence", blind:"枪声不再只是零星的了。它们连成了串,像雨点砸在屋顶上,越来越密。", c:"街垒一旦立满柏林,每一条街都要选边--共和国不是被外敌打死的,是被自己的街道一寸一寸撕开的。" }, "C02": { type:"violence", blind:"今夜没有人睡。窗外的脚步声朝着一个方向去,又散开,又在聚集。", c:"总起义一旦点火,就没有回头路--要么他们赢,共和国死;要么共和国赢,流的血够写一部新的账。" }, "C03": { type:"purge", blind:"军靴的声音在夜里变得整齐了。整齐,是出发的声音。", c:"将军们只差一个签字--你若给,共和国就死在自己人手里;你若不给,他们就要自己拿。" }, "C04": { type:"general", blind:"钱变成了纸,纸变成了灰。所有人的目光第一次齐了--全部对着你。", c:"货币一旦彻底死掉,街上的人就什么都做得出来--愤怒会替他们找方向,而方向不会是爱。" } }>>\ <</if>>\ /* 事件 ID → 类型 回退表:没有专属文案的红色事件,也好歹归到正确的类型池,不至于掉成 general */ <<if not $foreboding_deck>>\ <<set $foreboding_deck to { "R01":"violence","R02":"speech","R03":"violence","R04":"violence","R05":"violence", "R06":"violence","R07":"deal","R08":"deal","R09":"purge","R10":"purge", "R11":"deal","R12":"violence","R13":"purge","R14":"violence","R15":"violence", "R16":"deal","R17":"deal","R18":"general","R19":"general", "S01":"violence","S02":"violence","S03":"purge","S04":"violence","S05":"deal","S06":"deal","S07":"deal","S08":"violence","S09":"purge","S10":"general","S11":"purge","S12":"deal","S13":"purge", "C01":"violence","C02":"violence","C03":"purge","C04":"general" }>>\ <</if>> <<set _fd_ev to $foreboding_evt[_fd_raw]>>\ <<set _fd_use_evt to false>>\ <<if _fd_ev>>\ <<set _fd_use_evt to true>>\ <<set _fd_type to _fd_ev.type>>\ <<elseif $foreboding_deck[_fd_raw]>>\ <<set _fd_type to $foreboding_deck[_fd_raw]>>\ <<elseif _fd_raw eq "violence" or _fd_raw eq "deal" or _fd_raw eq "escape" or _fd_raw eq "speech" or _fd_raw eq "purge" or _fd_raw eq "general">>\ <<set _fd_type to _fd_raw>>\ <<else>>\ <<set _fd_type to "general">>\ <</if>> /* 情报值:来自「知情者」标签强度,归一到 0-100 */ <<set _fd_intel to 0>>\ <<if $active_tags and $active_tags.length gt 0>>\ <<for _fd_i to 0; _fd_i lt $active_tags.length; _fd_i++>>\ <<if $active_tags[_fd_i] and $active_tags[_fd_i].name eq "知情者">>\ <<set _fd_intel to _fd_intel + $active_tags[_fd_i].intensity>>\ <</if>>\ <</for>>\ <</if>>\ <<set _fd_intel to Math.min(100, Math.round(_fd_intel * 100 / 30))>> /* 精神负荷:玩家疲惫感(0-100);光谱 -100..100;通胀 0-100 */ <<if $player and $player.mental and $player.mental.fatigue>><<set _fd_stress to $player.mental.fatigue>><<else>><<set _fd_stress to 0>><</if>>\ <<if $spectrum and $spectrum.left_right>><<set _fd_fate to $spectrum.left_right>><<else>><<set _fd_fate to 0>><</if>>\ <<if $world and $world.inflation>><<set _fd_inf to $world.inflation>><<else>><<set _fd_inf to 0>><</if>> /* 情报清晰度档位 */ <<set _fd_tier to "blind">>\ <<if _fd_intel gte 75>><<set _fd_tier to "precise">>\ <<elseif _fd_intel gte 50>><<set _fd_tier to "specific">>\ <<elseif _fd_intel gte 25>><<set _fd_tier to "vague">>\ <</if>> /* 状态色调(优先级固定:高压 > 右倾 > 左倾 > 崩溃 > 中性) */ <<set _fd_tint to "neutral">>\ <<if _fd_stress gte 70>><<set _fd_tint to "paranoid">>\ <<elseif _fd_fate gte 40>><<set _fd_tint to "rightward">>\ <<elseif _fd_fate lte -40>><<set _fd_tint to "leftward">>\ <<elseif _fd_inf gte 80>><<set _fd_tint to "collapse">>\ <</if>> /* ---- 拼接:段A 感知载体 → 段B 色调 → 段C 落点(三段各成池,轮转防复读 2026-10-02) ---- */ <<set _fd_carrier to "">>\ <<if _fd_tier eq "blind">>\ <<if _fd_use_evt and _fd_ev.blind>>\ <<set _fd_carrier to _fd_ev.blind>>\ <<else>>\ <<set _pool to ["你忽然停住。四周安静,来由不明,后颈一凉。","楼下的大门关得比平时重。你在椅子上坐直了一点,说不出为什么。","电话铃在别的楼层响了很久才有人接。你听着那串尾音,握着的笔没再落下去。","窗玻璃上有一道水痕,蜿蜒到你视线的尽头。你看完它,才发现自己一直屏着气。","值夜的门房换了班,时间对不上。你路过时多看了一眼,那张脸不认识。"]>>\ <<pool-pick "fd_blind">>\ <<set _fd_carrier to $pool_pick>>\ <</if>>\ <<elseif _fd_tier eq "vague">>\ <<set _pool to ["空气变了一层。重了一些,也闷了一些。你环顾四周,找不到源头。","有人说话的声音低了半度。不是对你,可你听不清的那半句,比听得清的更沉。","报纸比昨天厚,消息比昨天少。你翻完四个版,记住的只有广告。","走廊尽头的灯换了一只新的,光反而更暗。你在门口站了片刻,才想起要办什么。","秘书处送来的日程排得很满,最要紧的那一项后面,备注栏空着。"]>>\ <<pool-pick "fd_vague">>\ <<set _fd_carrier to $pool_pick>>\ <<elseif _fd_tier eq "specific">>\ <<set _pool to ["你注意到重复。不同来源的细节,正悄悄对齐。","三个不同部门的人,问了你同一个问题。措辞不一样,问的地方一样。","有一份文件在两个处室之间走了个来回,谁都不肯第一个签字。","昨天照常送来的简报,今天没来。问到的时候,对方只说「在印」。","名单上多了一个陌生的名字,页脚的日期改过一次。改动很小,墨色不对。"]>>\ <<pool-pick "fd_specific">>\ <<set _fd_carrier to $pool_pick>>\ <<else>>\ <<set _pool to ["局势的下一步摊在面前。谁先动,谁沉默,谁在等最后一刻。","各方的位置都摆上了桌。先开口的吃亏,可先开口的窗口,明天就关。","你报得出每家报纸明天的标题。报得出的东西,多半都会印出来。","时间表对上了。三件事会在同一个上午发生,没有一件等你。","谁在给谁让路,谁在替谁传话,纸面上都对得上号。只差最后一个名字落笔。"]>>\ <<pool-pick "fd_precise">>\ <<set _fd_carrier to $pool_pick>>\ <</if>> <<set _fd_tintline to "">>\ <<if _fd_tier neq "blind">>\ <<if _fd_tint eq "paranoid">>\ <<set _pool to ["你数了三次经过的人。第四次才意识到自己真的在数。后颈的凉意不散,像有人在你背后念你的名字,回头却什么都没有。","你把今天见过的人过了一遍,又过了一遍。名单很短,可你记住了每一张脸的朝向。","门关上的声音让你抬头。这一下午,已经是第七次了。","你发现自己能背出电话的接通时长。哪条线慢了半拍,你都记得。"]>>\ <<pool-pick "fd_par">>\ <<set _fd_tintline to $pool_pick>>\ <<elseif _fd_tint eq "rightward">>\ <<set _pool to ["措辞变了。从“建议”到“必须”,中间没有过渡,像有人把刻度直接拨了过去。边界在收拢,但没有人宣布。","公文开头的第一人称换了。从前是「我们建议」,如今是「兹决定」。","会议纪律好了。迟到的人开始道歉,反对的意见开始留到会下。","街上多了列队的靴子声。报馆把这则消息排在了第三版,比昨天靠前。"]>>\ <<pool-pick "fd_right">>\ <<set _fd_tintline to $pool_pick>>\ <<elseif _fd_tint eq "leftward">>\ <<set _pool to ["传单在暗中传阅。队伍排得比往常长,没人说话,只有鞋底蹭地的声音。空气里浮着一层热,随时会烧起来。","工厂门口的演说者换了三批,一台子比一台子嗓门高。听的人不动,人数在翻倍。","红色的粉笔字一夜爬满三条街。早上有人洗,晚上又写满了。","工会食堂的汤比平时稠了。你路过时,听见勺子碰着盆底,一下一下,齐得很。"]>>\ <<pool-pick "fd_left">>\ <<set _fd_tintline to $pool_pick>>\ <<elseif _fd_tint eq "collapse">>\ <<set _pool to ["你数了又数,明天的面包还差着一截。黑市汇率又跳了,这次贴数字的人都撤了。冷是从算术里渗出来的。","价格标签一天换了三次纸,最后一次干脆空着。店员朝你摊开手,两只都是空的。","有个女人用整篮子钞票换半棵白菜,数都没数。轮到你的那天,你也懒得数了。","汇率的数字排上了报纸头版,字号和宣战那天一样大。没有人抗议,大家只是把它抄下来。"]>>\ <<pool-pick "fd_collapse">>\ <<set _fd_tintline to $pool_pick>>\ <<else>>\ <<set _pool to ["命令互相矛盾,都盖着章。有人在角力,边界却模糊了,分不清哪边会先松手。","两份指示在你的桌上碰了头,说的是同一件事,方向相反。签署的两支笔都很体面。","该来的批复晚了两天,附言只有一句「再议」。这个词,最近用得很勤。","有人开始引用上任的旧例为自己作证。旧例被翻出来的时候,多半是新规矩还没谈拢。"]>>\ <<pool-pick "fd_neutral">>\ <<set _fd_tintline to $pool_pick>>\ <</if>>\ <</if>> <<set _fd_typeline to "">>\ <<if _fd_tier eq "specific" or _fd_tier eq "precise">>\ <<if _fd_use_evt and _fd_ev.c>>\ <<set _fd_typeline to _fd_ev.c>>\ <<elseif _fd_type eq "violence">>\ <<set _pool to ["名单圈好了。动手之前,空气先凝滞下来。","街角的修鞋摊今天没出摊。摊主什么都看得见,也什么都不说。","巡逻队的间隔缩短了一半,枪套的扣都解开了。","医院的侧门悄悄卸了门闩。做这个决定的人,比街上谁都先知道要出事。"]>>\ <<pool-pick "fd_violence">>\ <<set _fd_typeline to $pool_pick>>\ <<elseif _fd_type eq "deal">>\ <<set _pool to ["对方在等你的答复。筹码摊在桌上,底牌还扣着;话一旦说满,退路也就一并锁死了。","中间人把条件念了两遍,念得又慢又匀,像在替两边都留出翻脸的余地。","宴席的座次比菜单先谈妥。谁挨着谁坐下,比谁说了什么都更接近结果。","他们递来的方案抄在最好的纸上。纸越好,越说明这单生意输不起。"]>>\ <<pool-pick "fd_deal">>\ <<set _fd_typeline to $pool_pick>>\ <<elseif _fd_type eq "escape">>\ <<set _pool to ["你开始记出口,那些平时不走的也算上。证件和现金分两处放;多疑和求生之间,已经划不清线。","行李分成了三份:一份给人看见,一份备着拿走,一份干脆不留。","月台的时刻表你背下来了。哪班车人最少,哪班车一站不停,你比列车员还熟。","邻国的入境章最近查得松。有人把这句话当礼物送来,你没有道谢。"]>>\ <<pool-pick "fd_escape">>\ <<set _fd_typeline to $pool_pick>>\ <<elseif _fd_type eq "speech">>\ <<set _pool to ["讲稿已经排好版。一旦宣读,所有报纸都会用同一个标题。那句话出口之前,还有最后一次修改的机会。","广播线已经接进会场。全国会在同一个下午听见同一副嗓子,包括不识字的人。","打字员誊了三遍,每一遍都有人改一个词。最后那一版,笔迹已经认不出是谁的了。","讲台上摆几只话筒,台下站多少人,连天气都排进了议程。唯独要说的那句话,还空着。"]>>\ <<pool-pick "fd_speech">>\ <<set _fd_typeline to $pool_pick>>\ <<elseif _fd_type eq "purge">>\ <<set _pool to ["委员会少了几个名字——请假的人,不会连档案都一起抽走。那份名单,还在继续变短。","走廊里有人开始提前打包。动作很慢,慢得像在赔不是。","会议室的椅子重新摆过了。原先坐得最稳的那几把,如今空着。","人事令是傍晚送来的,措辞体面,理由栏写着「另有任用」。没有人问去了哪里。"]>>\ <<pool-pick "fd_purge">>\ <<set _fd_typeline to $pool_pick>>\ <<else>>\ <<set _pool to ["局势已经滑过一个点。从此每一步都是新的刻度,从前那套参照,全都不作数了。","地图上多了一支你没批过的箭头。批它的那支笔,在别处。","日程排到了月底,没有人敢排下个月。下个月的事,得看这几天怎么收场。","老练的人开始沉默,年轻的人开始抢话。两种声音说的,是同一件事的两种结局。"]>>\ <<pool-pick "fd_general">>\ <<set _fd_typeline to $pool_pick>>\ <</if>>\ <<if _fd_faction neq "">><<set _fd_typeline to "关于《" + _fd_faction + "》——" + _fd_typeline>><</if>>\ <</if>> <<set $fd_text to _fd_carrier + _fd_tintline + _fd_typeline>>\ <</silently>>\ <<if $fd_text neq "">>\ <div class="foreboding">$fd_text</div>\ <</if>>\ <</widget>> /* ============================================================ intel-forecast:选项级「范围预判」——依据知情者精度把 effects 译成方向/幅度/范围/内幕 用法:<<intel-forecast effects [mode]>> effects: 选项或法案的 effects 字典(world键 / 顶层党派键 / party_trust嵌套 / insider / observer / 红线 burst+ daily+ duration / 可选 hint) mode: "full"(默认,文件栏/拉票页)| "brief"(国会走廊,只方向+幅度、叠加字体级) 数据源:$active_tags 中"知情者"标签 intensity 累加 → 0-100(与 foreboding 同换算) 档位(调平价):<20 门外汉(模糊语感) / 20-39 消息灵通(方向) / 40-59 圈内人(方向+幅度) / 60-79 资深操盘者(范围err2) / 80+ 手眼通天(范围err1+内幕) 注意:(a) 结果用局部 _if_html(IIFE),无全局变量,循环内多次调用安全; (b) D3 跨零保护:|v|≤err 降级幅度描述,|v|>err 才给范围且方向锁定; (c) D2 红线:duration/daily 只追加"持续 N 天 / 且每日追加少量影响",不露数值; (d) O1 多键按 |v| 降序;O2 内幕 fallback 随机取一句。 ============================================================ */ <<widget "intel-forecast">>\ <<silently>> <<set _if_effects to $args[0]>>\ <<set _if_mode to ($args[1] ? $args[1] : "full")>>\ <<set _if_intel to 0>>\ <<if $active_tags and $active_tags.length gt 0>>\ <<for _if_i to 0; _if_i lt $active_tags.length; _if_i++>>\ <<if $active_tags[_if_i] and $active_tags[_if_i].name eq "知情者">>\ <<set _if_intel to _if_intel + $active_tags[_if_i].intensity>>\ <</if>>\ <</for>>\ <</if>>\ <<set _if_intel to Math.min(100, Math.round(_if_intel * 100 / 30))>>\ <<set _if_html to (function(){ var fx = _if_effects; if(!fx) return ""; var S = State.variables, pn = (S.party_names||{}); var intel = _if_intel, mode = _if_mode; var WORLD = { economy:"经济压力", inflation:"通胀", social_anger:"社会愤怒", nationalism:"民族主义", gov_trust:"政府信任", middle_confidence:"中产信心", revolution:"革命压力", army_influence:"军方影响", political_violence:"政治暴力", intl_trust:"国际信任" }; var VIOLENT = { "政治暴力":1, "革命压力":1, "军方影响":1 }; var PARTIES = ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]; var items = []; var src = fx.burst ? fx.burst : fx; var seen = {}; Object.keys(src).forEach(function(k){ if(WORLD[k] && src[k]!==0){ items.push({label:WORLD[k], v:src[k], grp:"world"}); seen[k]=1; } }); if(fx.party_trust && typeof fx.party_trust==="object"){ for(var p in fx.party_trust){ var pv=fx.party_trust[p]; if(pv!==0 && !seen[p]){ items.push({label:(pn[p]||p)+"信任", v:pv, grp:"party"}); seen[p]=1; } } } for(var i=0;i<PARTIES.length;i++){ var pk=PARTIES[i]; if(!seen[pk] && src[pk]!==undefined && src[pk]!==0){ items.push({label:(pn[pk]||pk)+"信任", v:src[pk], grp:"party"}); } } if(src.insider && src.insider!==0) items.push({label:"知情者", v:src.insider, grp:"info"}); if(src.observer && src.observer!==0) items.push({label:"观察者", v:src.observer, grp:"info"}); /* O1 多键按 |v| 降序 */ items.sort(function(a,b){ return Math.abs(b.v)-Math.abs(a.v); }); /* D2 红线 daily/duration */ var daily=false, dur=0; if(fx.daily){ for(var dk in fx.daily){ if(fx.daily[dk]!==0){ daily=true; break; } } } if(fx.duration>0) dur=fx.duration; function arr(v){ return v>0?"↑":"↓"; } function amt(v){ var a=Math.abs(v); return a>=6?"大幅":(a>=3?"中等":"小幅"); } var rows=[]; if(intel<20){ /* 门外汉:极模糊语感,不泄露键名 */ var hasParty=false, hasWorld=false; for(var j=0;j<items.length;j++){ if(items[j].grp==="party") hasParty=true; if(items[j].grp==="world") hasWorld=true; } if(hasParty && hasWorld) rows.push("你隐约觉得,这一手会同时牵动人脉与局势。"); else if(hasParty) rows.push("你隐约觉得,这一手或会得罪/讨好某些人。"); else if(hasWorld) rows.push("你隐约觉得,局面或有一阵波动。"); else rows.push("你隐约觉得,这一手有代价,却说不上来是哪一笔。"); } else { if(mode==="brief"){ /* O3 走廊简报:只方向+幅度 */ for(var j=0;j<items.length;j++){ var it=items[j]; var t = it.label + arr(it.v); if(intel>=40) t = it.label + arr(it.v) + "(" + amt(it.v) + ")"; rows.push(t); } } else { for(var j=0;j<items.length;j++){ var it2=items[j]; var t2; var v=it2.v, a2=Math.abs(v); if(intel<40){ t2 = it2.label + arr(v); } /* 方向 */ else if(intel<60){ t2 = it2.label + arr(v) + "(" + amt(v) + ")"; } /* 方向+幅度 */ else { var e = (intel>=80?1:2); /* D3 范围 */ if(a2<=e){ t2 = it2.label + (v>0?"小幅上升":"小幅下降"); } else if(v>0){ t2 = it2.label + " +" + Math.max(1,v-e) + "~" + (v+e); } else { t2 = it2.label + " " + (v-e) + "~" + Math.min(-1,v+e); } } rows.push(t2); } } } /* D2 追加 daily/duration */ var extra=[]; if(daily) extra.push("且每日追加少量影响"); if(dur>0) extra.push("持续 "+dur+" 天"); if(extra.length && rows.length) rows[rows.length-1] = rows[rows.length-1] + "(" + extra.join(",") + ")"; /* 连锁反应风险(full、60+、含政党+强 world 暴力键) */ if(mode!=="brief" && intel>=60){ var hp=false, hv=false; for(var j=0;j<items.length;j++){ if(items[j].grp==="party") hp=true; if(items[j].grp==="world" && VIOLENT[items[j].label]) hv=true; } if(hp && hv) rows.push("存在连锁反应风险。"); } /* 内幕提示(full、80+):effects.hint 优先,否则随机 fallback(O2) */ if(mode!=="brief" && intel>=80){ var tip = (typeof fx.hint==="string" && fx.hint!=="") ? fx.hint : ["线人提醒:此处不止表面这一层。","线人低声说:围观的人里,有人也在等这个结果。","递来的条子上写着:有人希望这一票是现在、而非以后。"][Math.floor(Math.random()*3)]; rows.push("<em>"+tip+"</em>"); } return rows.length ? rows.join("<br>") : ""; })()>> <</silently>>\ <<if _if_html neq "" and _if_mode eq "brief">><div class="intel-forecast brief">_if_html</div><</if>>\ <<if _if_html neq "" and _if_mode neq "brief">><div class="intel-forecast">_if_html</div><</if>>\ <</widget>> /* ---------- inline-gate:免费内联小动作「每日一次」闸门 ---------- 用法:<<inline-gate "id">> → 输出 _io_ok(true=今天首次,且已记账;false=今天已用过)。 调用后在值块外包 <<if _io_ok>>…<<else>>灰字提示<</if>>。 旗标键 inline_<id>_<session_day>,与 kreuzberg_observed_ 同一套按天累积习惯。 */ <<widget "inline-gate">>\ <<silently>> <<set _io_key to "inline_" + $args[0] + "_" + $session_day>>\ <<set _io_ok to ($flags[_io_key] ? false : true)>>\ <<if _io_ok>><<set $flags[_io_key] to true>><</if>>\ <</silently>>\ <</widget>> /* ═══════════════════════════════════════════════════════════════ 治理路线系统(光谱驱动托管)——v2「任何跳天全托管」 路线由 $spectrum 双轴实时推导(±33 切档,与国会纲领案九格一致),玩家零设置。 托管触发:跳过多于一天的任何跳天;期间一切事件按路线自动处置。 ═══════════════════════════════════════════════════════════════ */ /* ---------- route-current:推导当前治理路线 ---------- 输出:_route_name / _route_axis(主轴,2分) / _route_axis2(次轴,1分,可为空) / _route_desc(风味一句) / _route_lr / _route_rc 轴词汇:GM温和改良 / SM国家强势 / LE左翼激进 / RE右翼激进 / OP机会主义 / AP消极逃避 */ <<widget "route-current">>\ <<silently>> <<set _rt_lr to $spectrum.left_right>>\ <<set _rt_rc to $spectrum.radical_conservative>>\ <<set _route_lr to _rt_lr>>\ <<set _route_rc to _rt_rc>>\ <<set _route_name to "">>\ <<set _route_axis to "">>\ <<set _route_axis2 to "">>\ <<set _route_desc to "">>\ <<if _rt_lr lte -33>>\ <<if _rt_rc lte -33>>\ <<set _route_name to "革命路线">>\ <<set _route_axis to "LE">>\ <<set _route_desc to "旧世界必须碎掉。你不修补它,你和工人们一起把它掀翻。">>\ <<else>>\ <<set _route_name to "改良路线">>\ <<set _route_axis to "GM">>\ <<set _route_axis2 to "OP">>\ <<set _route_desc to "一张一张签下去:保险、仲裁、救济。世界是一张可以慢慢改对的答卷。">>\ <</if>>\ <<elseif _rt_lr gte 33>>\ <<if _rt_rc lte -33>>\ <<set _route_name to "强权路线">>\ <<set _route_axis to "RE">>\ <<set _route_axis2 to "SM">>\ <<set _route_desc to "秩序不够,就上力量。你在赌这头巨兽听得懂缰绳以外的语言。">>\ <<else>>\ <<set _route_name to "秩序路线">>\ <<set _route_axis to "SM">>\ <<set _route_axis2 to "RE">>\ <<set _route_desc to "国家先站稳,别的再说。强硬不是目的,是骨架。">>\ <</if>>\ <<else>>\ <<set _route_name to "务实路线">>\ <<set _route_axis to "OP">>\ <<set _route_axis2 to "GM">>\ <<set _route_desc to "哪个行得通就签哪个。意识形态是奢侈品,马克跌的时候没人买得起。">>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- route-flavor:路线风味兜底(无结构化选项的事件用) ---------- 前置:先调用 <<route-current>>。输出:_flav_fx(世界变量增量对象)/ _flav_text(一句日志)。 量级约为手动选项的一半——托管不是玩家亲手签的字。 */ <<widget "route-flavor">>\ <<silently>> <<set _flav_fx to {}>>\ <<set _flav_text to "">>\ <<if _route_name is "革命路线">>\ <<set _flav_fx to {social_anger:-2, revolution:1, gov_trust:-1}>>\ <<set _flav_text to "把事情交给了街头的热情——火被扇得更旺,账留给了旧秩序">>\ <<elseif _route_name is "改良路线">>\ <<set _flav_fx to {social_anger:-1, economy:1, fiscal:1}>>\ <<set _flav_text to "按部就班地批了救济与仲裁——安抚了人心,账单记在了国库上">>\ <<elseif _route_name is "务实路线">>\ <<set _flav_fx to {gov_trust:1, economy:1}>>\ <<set _flav_text to "挑了最不坏的那个办法——没人满意,但事情往前挪了一寸">>\ <<elseif _route_name is "秩序路线">>\ <<set _flav_fx to {political_violence:-1, social_anger:1}>>\ <<set _flav_text to "按秩序优先处置——街面平静了些,怨气沉进了水里">>\ <<else>>\ <<set _flav_fx to {political_violence:-2, social_anger:2, revolution:1}>>\ <<set _flav_text to "用力量说话——拳头落下的地方,安静和怨恨一起生长">>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- route-resolve:按治理路线托管结算一个事件 ---------- 用法:<<route-resolve _ev>>(_ev 为 $pending_events 成员;前置:<<route-current>>) 分支:A 文件篮公文(fb_data.options)→ 按 axis 抓取真实选项,走文件篮同款结算 B 红色/暗涌($red_opts 有表)→ 按 axis 抓取选项,apply-red-fx + 红色结算核心 A2 定制世界事件($world_custom_options 按标题有表)→ 复刻手动结算全路径 C 兜底 → 路线风味效果表 副作用:event-resolve(从待办移除+遗产/标签)、疲惫 +2(代替手动 TP 消耗) 输出:_rr_log = {title, route, choice, eff, narr, notes, kind} (不动 $pending_events——event-resolve 内部负责移除) */ <<widget "route-resolve">>\ <<silently>> <<if not $red_opts>><<set $red_opts to {}>><</if>>\ /* 定制选项表是懒加载(渲染时才建)——托管路径可能先于任何手动渲染,先确保表在 */ <<world-event-custom-init>>\ <<set _rr_ev to $args[0]>>\ <<set _rr_title to _rr_ev.title ? _rr_ev.title : (_rr_ev.deck_id ? _rr_ev.deck_id : "一件小事")>>\ <<set _rr_route to _route_name>>\ <<set _rr_choice to "">>\ <<set _rr_eff to "">>\ <<set _rr_narr to "">>\ <<set _rr_notes to []>>\ <<set _rr_kind to "fallback">>\ <<set $player.mental.fatigue to Math.min(100, ($player.mental.fatigue || 0) + 2)>> /* ── 分支A:文件篮公文(按选项 axis 抓取) ── */ <<if _rr_ev.fb_data and _rr_ev.fb_data.stages and _rr_ev.fb_data.stages.length gt 0>>\ <<set _rr_si to _rr_ev.fb_stage ? _rr_ev.fb_stage : 0>>\ <<if _rr_si gte _rr_ev.fb_data.stages.length>><<set _rr_si to 0>><</if>>\ <<set _rr_stage to _rr_ev.fb_data.stages[_rr_si]>>\ <<if _rr_stage and _rr_stage.options and _rr_stage.options.length gt 0>>\ <<set _rr_kind to "fb">>\ <<set _rr_best to null>>\ <<set _rr_best_s to -1>>\ <<for _rri to 0; _rri lt _rr_stage.options.length; _rri++>>\ <<set _rr_opt to _rr_stage.options[_rri]>>\ <<set _rr_s to 0>>\ <<if _rr_opt.axis and _route_axis and _rr_opt.axis.indexOf(_route_axis) gte 0>><<set _rr_s to 2>><</if>>\ <<if _rr_s lt 2 and _rr_opt.axis and _route_axis2 and _rr_opt.axis.indexOf(_route_axis2) gte 0>><<set _rr_s to 1>><</if>>\ <<if _rr_s eq 0 and _rr_opt.axis and _rr_opt.axis.indexOf("AP") gte 0>><<set _rr_s to 0.5>><</if>>\ <<if _rr_s gt _rr_best_s>>\ <<set _rr_best_s to _rr_s>>\ <<set _rr_best to _rr_opt>>\ <</if>>\ <</for>>\ <<if _rr_best is null>><<set _rr_best to _rr_stage.options[0]>><</if>>\ /* 与 fb-render-options 的选项链接同一套结算(多段事件只落当前段的效果,不再续段) */ <<if not _rr_best.effects>><<set _rr_best.effects to {}>><</if>>\ <<set $file_action to _rr_best.label>>\ <<set $opt_label to _rr_best.label>>\ <<set $fb_narrative to _rr_best.narrative ? _rr_best.narrative : "">>\ <<set $file_spd_delta to _rr_best.effects.spd ? _rr_best.effects.spd : 0>>\ <<set $file_ddp_delta to _rr_best.effects.ddp ? _rr_best.effects.ddp : 0>>\ <<set $file_dvp_delta to _rr_best.effects.dvp ? _rr_best.effects.dvp : 0>>\ <<fb-apply-effects _rr_best.effects>>\ <<fb-deck-fx _rr_ev "auto">>\ /* 托管选到 delay_next 选项:同样登记隐藏回访(否则跳天会吃掉整个后续链)。 $file_action 经 $fu_src_action 一并持久化——全局值会被后续事件覆盖, 回访触发比对(option_chosen)认的是此刻的选择(与手动路径同链路)。 */ <<if _rr_best.delay_next>>\ <<set _rr_dn to _rr_best.delay_next>>\ <<set _rr_dn_days to _rr_dn.days ? _rr_dn.days : 3>>\ <<set $fu_src_fb to _rr_ev.fb_data>>\ <<set $fu_src_action to $file_action>>\ <<site-followup-add _rr_dn.title _rr_dn.desc _rr_dn_days "delayed" "File_Event_Stage_Delayed" _rr_dn.stage_id true>>\ <</if>>\ <<event-resolve _rr_ev.event_id>>\ <<if not $today_handled>><<set $today_handled to []>><</if>>\ <<set $today_handled.push({deck_id: _rr_ev.deck_id, title: _rr_ev.title, template: _rr_ev.template, intensity: _rr_ev.intensity, level: "yellow", action: $file_action, auto: true})>>\ <<set _rr_choice to _rr_best.label>>\ <<set _rr_narr to $fb_narrative>>\ <<fb-bonus-text _rr_best.effects>>\ <<set _rr_eff to _fb_bonus_text>>\ <</if>>\ /* ── 分支B:红色/暗涌($red_opts 数据表抓取) ── */\ <<elseif _rr_ev.deck_id and $red_opts[_rr_ev.deck_id]>>\ <<set _rr_kind to "red">>\ <<set _rr_opts to $red_opts[_rr_ev.deck_id]>>\ <<set _rr_best to null>>\ <<set _rr_best_s to -1>>\ <<for _rri to 0; _rri lt _rr_opts.length; _rri++>>\ <<set _rr_opt to _rr_opts[_rri]>>\ <<set _rr_s to 0>>\ <<if _rr_opt.axis and _route_axis and _rr_opt.axis.indexOf(_route_axis) gte 0>><<set _rr_s to 2>><</if>>\ <<if _rr_s lt 2 and _rr_opt.axis and _route_axis2 and _rr_opt.axis.indexOf(_route_axis2) gte 0>><<set _rr_s to 1>><</if>>\ <<if _rr_s eq 0 and _rr_opt.axis and _rr_opt.axis.indexOf("AP") gte 0>><<set _rr_s to 0.5>><</if>>\ <<if _rr_s gt _rr_best_s>>\ <<set _rr_best_s to _rr_s>>\ <<set _rr_best to _rr_opt>>\ <</if>>\ <</for>>\ <<if _rr_best is null>><<set _rr_best to _rr_opts[0]>><</if>>\ /* 与手动选项链接同一套动作($opt_label 驱动 R16/S01 等专属结算的 label 匹配) */ <<set $file_action to _rr_best.action>>\ <<set $opt_label to _rr_best.label>>\ <<set $opt_msg1 to _rr_best.msg1 ? _rr_best.msg1 : "">>\ <<if _rr_best.flag>>\ <<set _rr_fk to Object.keys(_rr_best.flag)>>\ <<for _rrf to 0; _rrf lt _rr_fk.length; _rrf++>>\ <<set $flags[_rr_fk[_rrf]] to _rr_best.flag[_rr_fk[_rrf]]>>\ <</for>>\ <</if>>\ <<apply-red-fx _rr_best.fx _rr_ev.deck_id>>\ <<red-settle-core _rr_ev "auto">>\ <<set _rr_choice to _rr_best.label>>\ <<set _rr_narr to (_rr_best.msg1 ? _rr_best.msg1 : "")>>\ <<set _rr_eff to $choice_effects_summary>>\ /* ── 分支A2:定制世界事件(A/Y/白色,$world_custom_options 按标题抓取) ── 结算路径与 render-world-custom-options 的手动选项链接逐项一致: fx→apply-red-fx、shift→光谱+威权幽灵、chain→旗标+后续、军官三题→军方线、 line_resolve/escalate/longline/kills_key 全复刻,最后走共用结算核心。 */\ <<elseif $world_custom_options and $world_custom_options[_rr_ev.title]>>\ <<set _rr_cur to $world_custom_options[_rr_ev.title]>>\ <<set _rr_kind to "custom">>\ <<set _rr_best to null>>\ <<set _rr_best_s to -1>>\ <<set _rr_best_i to 0>>\ <<for _rri to 0; _rri lt _rr_cur.options.length; _rri++>>\ <<set _rr_opt to _rr_cur.options[_rri]>>\ <<set _rr_s to 0>>\ <<if _rr_opt.axis and _route_axis and _rr_opt.axis.indexOf(_route_axis) gte 0>><<set _rr_s to 2>><</if>>\ <<if _rr_s lt 2 and _rr_opt.axis and _route_axis2 and _rr_opt.axis.indexOf(_route_axis2) gte 0>><<set _rr_s to 1>><</if>>\ <<if _rr_s eq 0 and _rr_opt.axis and _rr_opt.axis.indexOf("AP") gte 0>><<set _rr_s to 0.5>><</if>>\ <<if _rr_s gt _rr_best_s>>\ <<set _rr_best_s to _rr_s>>\ <<set _rr_best to _rr_opt>>\ <<set _rr_best_i to _rri>>\ <</if>>\ <</for>>\ <<if _rr_best is null>><<set _rr_best to _rr_cur.options[0]>><</if>>\ <<set $file_action to "custom">>\ <<set $custom_aid to (_rr_best_i eq 0)>>\ <<set $opt_label to _rr_best.label>>\ <<set $opt_msg to (_rr_best.msg ? _rr_best.msg : "")>>\ <<apply-red-fx _rr_best.fx _rr_ev.deck_id>>\ <<set _rr_wsh to _rr_best.shift>>\ <<if _rr_wsh>>\ <<if _rr_wsh.lr>><<set $spectrum.left_right to Math.max(-100, Math.min(100, $spectrum.left_right + _rr_wsh.lr))>><</if>>\ <<if _rr_wsh.rc>><<set $spectrum.radical_conservative to Math.max(-100, Math.min(100, $spectrum.radical_conservative + _rr_wsh.rc))>><</if>>\ <<if _rr_wsh.authoritarian>>\ <<if not $weimar.historical_anxiety["威权幽灵"]>><<set $weimar.historical_anxiety["威权幽灵"] to 0>><</if>>\ <<set $weimar.historical_anxiety["威权幽灵"] to Math.max(0, $weimar.historical_anxiety["威权幽灵"] + Math.max(0, Math.round(_rr_wsh.authoritarian)))>>\ <</if>>\ <</if>>\ <<set _rr_wch to _rr_best.chain>>\ <<if _rr_wch>>\ <<if _rr_wch.flag>><<set $flags[_rr_wch.flag] to true>><</if>>\ <<if _rr_wch.followup>>\ <<for _rrf2 to 0; _rrf2 lt _rr_wch.followup.length; _rrf2++>>\ <<set _rrf3 to _rr_wch.followup[_rrf2]>>\ <<set _rrf3p to (_rrf3.passage ? _rrf3.passage : "Followup_World")>>\ <<site-followup-add _rrf3.title _rrf3.desc _rrf3.delay "_world" _rrf3p>>\ <</for>>\ <</if>>\ <</if>>\ <<if _rr_title eq "军官密谋" or _rr_title eq "政变传言" or _rr_title eq "国防军抗命">>\ <<mil-line-advance>>\ <</if>>\ <<if _rr_best.line_resolve>>\ <<set $mil_line to 9>>\ <<set $mil_outcome to _rr_best.line_resolve>>\ <</if>>\ <<if _rr_best.escalate>>\ <<set $escalate_pending to _rr_best.escalate>>\ <<set _rr_esc to _rr_best.escalate>>\ <<site-followup-add _rr_esc.fu_title _rr_esc.fu_desc _rr_esc.delay "_world" "Escalate_Trigger">>\ <</if>>\ <<set _rr_ll to _rr_best.longline>>\ <<if _rr_ll>>\ <<set $last_ll_key to _rr_ll.key>>\ <<set $notebook.push({key:_rr_ll.key, tag:(_rr_ll.tag ? _rr_ll.tag : "追查"), title:_rr_ll.title, status:"追查中", born:$session_day, due:(_rr_ll.due ? _rr_ll.due : 5)})>>\ <<set $flags[_rr_ll.key] to "waiting">>\ <<site-followup-add _rr_ll.title _rr_ll.reveal `(_rr_ll.due ? _rr_ll.due : 5)` "_world" "Notebook_Reveal">>\ <</if>>\ <<if _rr_best.kills_key>>\ <<notebook-fail _rr_best.kills_key "主动反制,长线作废">>\ <</if>>\ <<red-settle-core _rr_ev "auto">>\ <<set _rr_choice to _rr_best.label>>\ <<set _rr_narr to ($opt_msg ? $opt_msg : "")>>\ <<set _rr_eff to $choice_effects_summary>>\ /* ── 分支C:兜底(无结构化选项:白色见闻/母体事件等) ── */\ <<else>>\ <<route-flavor>>\ <<run (function(){ var w = State.variables.world; var fx = _flav_fx; var keys = Object.keys(fx); for (var i = 0; i < keys.length; i++) { var k = keys[i]; w[k] = Math.max(0, Math.min(100, (w[k] || 0) + fx[k])); } })()>> <<event-resolve _rr_ev.event_id>>\ <<set _rr_choice to _route_name>>\ <<set _rr_eff to _flav_text>>\ <</if>>\ <<set _rr_axis to (_rr_best and _rr_best.axis) ? _rr_best.axis : "">>\ <<set _rr_log to {title: _rr_title, route: _rr_route, choice: _rr_choice, eff: _rr_eff, narr: _rr_narr, notes: _rr_notes, kind: _rr_kind, axis: _rr_axis, src: _rr_ev.source}>>\ <</silently>>\ <</widget>>
/* ---------- 文本库初始化(必须在所有系统 widget 之前,$txt 供其取值)---------- */ <<include "TextLibrary">> /* ---------- 版本号(semver,每次发版递增) ---------- */ <<set $version to "0.0.4">> /* ---------- 时间与节拍 ---------- 起点年份由章节选择决定(Scene_StageSelect);默认 1923(S3),StoryInit 阶段指针也指向 S3。 S2(1920-21 动荡与暗杀)在选章时改写 $date/$stage/$event_deck。 */ <<set $date to { year: 1923, month: 1, day: 1 }>>\ <<set $session_day to 0>> /* 60天审议周期计数器 */ <<set $debug to true>> /* 开发期:开启侧边栏/办公室的调试台入口 */ <<set $stage_selected to false>> /* 章节选择:进序章前先过 Scene_StageSelect */ <<set $show_prologue to false>> /* 序章调优期隐藏:扉页/选章不露出「观看序章」,只留调试台入口;调完改 true 恢复 */ /* ---------- 【节奏系统TP】 ---------- 一天4个时间段:上午(T1)/下午(T2)/傍晚(T3)/夜晚(T4) 每天开局6TP(整数),事件/移动/区域行动消耗TP,用完进入第二天 时段由剩余TP整数档位判定:≥5上午 / ≥3下午 / ≥1傍晚 / <1夜晚 休息=终止项,剩余TP转化恢复 */ <<set $tp to 6>>\ <<set $tp_max to 6>>\ <<set $tp_phase to 1>> /* 1=上午 2=下午 3=傍晚 4=夜晚 */ <<set $tp_phase_names to ["", "上午", "下午", "傍晚", "夜晚"]>>\ <<set $rest_count to 0>> /* 连续空窗期天数(递减用) */ /* ---------- 【标签池】活跃标签数组 ---------- 每个标签结构(V0.4-B 第六章): {id, name, level:"micro|struct|era", category, intensity, decay_rate, direction, target, fusion_candidates:[], weimar_text, born_date, source_event} level 权重:微5-15 / 结构20-50 / 时代50-100 decay_rate 默认:微0.95 / 结构0.98 / 时代0.99(每月) */ <<set $active_tags to []>> /* ---------- 【遗产池】历史遗产数组 ---------- 每个遗产9字段(V0.4-D 2.2 冻结): {legacy_id, source_event_id, birth_date, base_tags:{}, current_intensity, decay_type:"trauma|habit|sediment|ghost", interpretation_owner, narrative_text, inheritance_chain:[], status:"active|dormant|sedimented|awakened"} 衰减曲线见 30_legacy_system.twee */ <<set $legacy_pool to []>> /* ---------- 【惯性矩阵】历史惯性格数组 ---------- 每个惯性五维结构(V0.3-B 第二章): {inertia_id, source_events:[], level:1-5, source_event, emotional_memory, affect_target, decay_speed, transform_condition, intensity, direction, born_date} 五级:1微小/2政治/3社会/4国家/5文明 */ <<set $inertia_matrix to []>>
/* ---------- 【魏玛人格三层】(V0.4-D 6.1 冻结) ---------- */ <<set $weimar to { core: { will_to_exist: 100, /* 国家存续意志,几乎不可变 */ republic_identity: 80 /* 对"共和国"概念的认同 */ }, mid: { democracy_trust: 60, /* 民主信任度 */ army_dependence: 20, /* 军队依赖度 */ intl_trust: 40, /* 国际信任度 */ reform_will: 50 /* 社会改革意愿 */ }, surface: { mood: "平静", /* 今日情绪 */ mood_base: 0, /* 长线情绪基线:国家好→正、国家差→负,每日向目标漂移 */ fatigue: 0, /* 近期疲惫感 */ anxiety: 0, /* 当前焦虑源强度 */ tension: 0 /* 即时张力 */ }, stability: 50, /* 人格稳定度(占位50) */ personality_tension: 0, /* 累积张力,达阈值触发震荡 */ shock_threshold: 16, /* 人格震荡触发基准阈值(重大仪式感版)——见下方 effective_threshold,实读阈值随稳定度浮动 */ effective_threshold: 13, /* 有效阈值 = round(基准 × (0.6 + stability/100 + 0.4)),每次稳定度变化后由 weimar-effective-update 宏刷新 */ presence: "calm", /* 在场状态档位:calm/tense/anxious/critical,由 weimar-presence 宏现场计算 */ self_identity: 80, /* 自我认同:魏玛对自身"该是什么"的确认度(结盟系统 §2.3,初始80) */ historical_anxiety: {} /* 历史恐惧记录(V0.3-B 第七章),key=恐惧名 value=强度 */ }>> <<set $stance_history to []>> /* 姿态系统:最近3次姿态,用于连用递减(第2次×0.6 / 第3次×0.3 / 第4次无效) */ /* ---------- 【历史锚点事件】(V0.4-C 2.1,不可删除) ---------- 游戏开始时即存在,玩家只能改变强度/范围/形式,不能消除。 */ <<set $historical_anchors to { versailles: { name: "凡尔赛体系", intensity: 90, note: "外部惯性,不可删除" }, ww1_trauma: { name: "一战战败创伤", intensity: 85, note: "创伤型,永不归零" }, revolution_fear: { name: "革命恐惧", intensity: 60, note: "十一月革命的余震" } }>>
/* ---------- 【叙事记忆】全局共享 ---------- */ <<set $narrative_memory to { recent_fragments: [], shock_history: [], npc_encounters: {}, player_choices: [] }>> /* ---------- 【叙事池子】6级池化系统 ---------- 每个条目:entry_id, text, text_variants[], conditions[], weight, cooldown, last_picked, tags[], format 先填少量条目验证,后续扩充 */ <<set $pools to { /* L1 核心独白池 - 表层情绪(平静) */ weimar_core_surface: [ {entry_id:"wcs_01", text:"今天柏林的天空是灰色的。这算是好消息。", text_variants:["雾很浓,浓到看不见边界。这让我安心。","没有太阳。没有影子。没有新消息。"], conditions:[{type:"stat",key:"weimar.surface.mood",op:"eq",val:"平静"}], weight:2, cooldown:3, last_picked:-1, tags:["mood","weather"], format:"italic"}, {entry_id:"wcs_02", text:"他靠在窗边,数着街上的马车。数到第七辆的时候停了。那辆车没有套马,车夫自己在前面拽。", conditions:[{type:"stat",key:"weimar.surface.mood",op:"eq",val:"平静"}], weight:1, cooldown:3, last_picked:-1, tags:["mood","street"], format:"italic"} ], /* L1 核心独白池 - 中层焦虑 */ weimar_core_mid: [ {entry_id:"wcm_01", text:"他开始觉得墙在变薄。声音穿透得越来越容易,外面的一切都在往里渗。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:30}], weight:1.5, cooldown:3, max_uses:3, last_picked:-1, tags:["anxiety","body"], format:"italic"}, {entry_id:"wcm_02", text:"他牙齿里有玻璃碎屑。1919年咬碎的,一直没掉。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:30}], weight:1, cooldown:5, last_picked:-1, tags:["trauma","body","1919"], format:"italic"} ], /* L2 数值回响池 - 张力变化 */ echo_tension: [ {entry_id:"et_01", text:"脊椎上有东西在爬。今天一小寸,明天一小寸。那东西有个年份。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["body","future","dread"], format:"plain"}, {entry_id:"et_02", text:"空气变沉了。气压真的变了。也许是要下雨。也许不是。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["weather","tension"], format:"plain"}, {entry_id:"et_03", text:"走廊尽头的打字机停了。停了三秒。然后又响了。那三秒比任何文件都重。", conditions:[], weight:1, cooldown:2, max_uses:3, last_picked:-1, tags:["sound","office"], format:"plain"} ], /* L2 数值回响池 - 疲惫变化 */ echo_fatigue: [ {entry_id:"ef_01", text:"墨水在变稀。也许是水分蒸发了,也许是你。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["fatigue","writing"], format:"plain"}, {entry_id:"ef_02", text:"你的手指在发抖。跟冷没关系。它们已经不记得「不动」是什么感觉了。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["body","fatigue"], format:"plain"}, {entry_id:"ef_03", text:"天花板上有道裂缝。你盯着它,直到它变成别的东西--一条河,一条国境线,一道伤口。", conditions:[], weight:1, cooldown:3, last_picked:-1, tags:["fatigue","vision"], format:"plain"} ], /* L2 数值回响池 - 民主信任变化 */ echo_democracy: [ {entry_id:"ed_01", text:"国会走廊里的脚步声变轻了。有人开始相信,这个共和国也许能撑过春天。", conditions:[], weight:1, cooldown:2, max_uses:3, last_picked:-1, tags:["hope","corridor","sound"], format:"plain"}, {entry_id:"ed_02", text:"夏洛滕堡的军官俱乐部亮着灯。有人在擦拭一把并不存在的枪。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["army","shadow"], format:"plain"}, {entry_id:"ed_03", text:"报纸上的措辞软了一度。字小心了,事没变。小心和好是两码事。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["media","subtle"], format:"plain"} ], /* L5 晨间叙事池 - 天气 */ dawn_weather: [ {entry_id:"dw_01", text:"柏林起了薄雾,天和地的边界糊成一片。", conditions:[{type:"stat",key:"weimar.surface.mood",op:"eq",val:"平静"}], weight:1, cooldown:2, last_picked:-1, tags:["weather","calm"], format:"italic"}, {entry_id:"dw_02", text:"风从鲁尔方向吹来。带着煤灰和铁锈的味道。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["weather","ruhr"], format:"italic"}, {entry_id:"dw_03", text:"天没亮。也许今天不会亮了。这是可能的。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:30}], weight:1.5, cooldown:2, last_picked:-1, tags:["weather","dark"], format:"italic"} ], /* L5 晨间叙事池 - 城市 */ dawn_city: [ {entry_id:"dc_01", text:"卖报童已经在街角了。嗓门比昨天哑了一度。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["city","news"], format:"plain"}, {entry_id:"dc_02", text:"远处有人在敲什么。声音是金属的,也许是管道,也许是别的。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["city","sound"], format:"plain"} ], /* L5 晨间叙事池 - 预兆(日期敏感) */ dawn_omen: [ {entry_id:"do_nov8", text:"今天是十一月八日。慕尼黑的啤酒馆里,有人在排练一场尚未发生的戏。", conditions:[{type:"date",month:11,day:8}], weight:10, cooldown:0, last_picked:-1, tags:["date","munich","omen"], format:"italic"}, {entry_id:"do_jan11", text:"今天是一月十一日。法国人的火车正在往鲁尔开。你能听到铁轨的声音。", conditions:[{type:"date",month:1,day:11}], weight:10, cooldown:0, last_picked:-1, tags:["date","ruhr","omen"], format:"italic"}, {entry_id:"do_may1", text:"今天是五月一日。工人区有人在磨刀。不是为了切面包。", conditions:[{type:"date",month:5,day:1}], weight:10, cooldown:0, last_picked:-1, tags:["date","labor","omen"], format:"italic"} ], /* ═══ 魏玛对话回应池 V1.1 ═══ */ /* 状态标签:calm/anxious/numb/fractured */ /* 子池:low/mid/high(calm)/ universal(anxious/numb)/ whisper/vision(fractured) */ /* calm_low(民主信任低:0-40,平静但不信任) */ weimar_speak_calm_low: [ {entry_id:"wcl_01", text:"我不确定这是不是个好主意。反正也没谁来问过我。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"lte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["calm","doubt"], format:"plain"}, {entry_id:"wcl_02", text:"走廊里的脚步声,一双一双,都是不信任我的人的。他们走得比信任我的人快。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"lte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["calm","sound"], format:"plain"}, {entry_id:"wcl_03", text:"天色又是铅灰的。这样也好,至少没有什么在发光。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"lte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["calm","weather"], format:"plain"} ], /* calm_mid(民主信任中:41-70) */ weimar_speak_calm_mid: [ {entry_id:"wcm2_01", text:"你来了。坐下吧。椅子是旧的,还结实。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:41}], weight:1, cooldown:2, last_picked:-1, tags:["calm","welcome"], format:"plain"}, {entry_id:"wcm2_02", text:"今天的事我不评价。我只记录。记录是我的工作。活着也是。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:41}], weight:1, cooldown:2, last_picked:-1, tags:["calm","duty"], format:"plain"}, {entry_id:"wcm2_03", text:"他靠在窗边数马车。第七辆开过去时,他别过头,没再数下去。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:41}], weight:1, cooldown:3, last_picked:-1, tags:["calm","street"], format:"plain"} ], /* calm_high(民主信任高:71-100) */ weimar_speak_calm_high: [ {entry_id:"wch_01", text:"有时候我觉得能撑过去。说不上确信,就是……有那种感觉。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:71}], weight:1, cooldown:3, last_picked:-1, tags:["calm","hope"], format:"plain"}, {entry_id:"wch_02", text:"走廊里有人开始跟我打招呼了。以前没有。以前他们绕着我走。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:71}], weight:1, cooldown:3, last_picked:-1, tags:["calm","trust"], format:"plain"}, {entry_id:"wch_03", text:"柏林的天又是灰的。灰得没那么重了。也许是我看错了。也许不是。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:71}], weight:1, cooldown:2, last_picked:-1, tags:["calm","weather"], format:"plain"} ], /* anxious_universal(焦虑:anxiety>=30) */ weimar_speak_anxious_universal: [ {entry_id:"wau_01", text:"走廊里的脚步声,在我门口慢了半拍。风解释不了这个。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:30}], weight:1.5, cooldown:2, max_uses:3, last_picked:-1, tags:["anxious","sound"], format:"plain"}, {entry_id:"wau_02", text:"我牙齿里还嵌着玻璃渣。1919年留下的,一直没掉。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:30}], weight:1, cooldown:3, last_picked:-1, tags:["anxious","trauma","1919"], format:"plain"}, {entry_id:"wau_03", text:"马克又跌了。数字不用念给我听。我的骨头先知道,正一根一根往里缩。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:30}], weight:1, cooldown:2, last_picked:-1, tags:["anxious","economy","body"], format:"plain"} ], /* numb_universal(麻木:fatigue>=70) */ weimar_speak_numb_universal: [ {entry_id:"wnu_01", text:"……", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["numb","silence"], format:"plain"}, {entry_id:"wnu_02", text:"我在。只是不想说话。这和不在差不了多少。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["numb","presence"], format:"plain"}, {entry_id:"wnu_03", text:"椅子很硬。站着更累。坐着至少不用假装在走。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["numb","fatigue"], format:"plain"} ], /* fractured_whisper(裂变前兆-低语) */ weimar_speak_fractured_whisper: [ {entry_id:"wfw_01", text:"有人在我身后说话。声音都是从前的人的。话我还记得,人早就不在了。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["fractured","memory","ghost"], format:"plain"}, {entry_id:"wfw_02", text:"钟声。1918年11月的那种敲法。我以为自己忘了。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["fractured","sound","1918"], format:"plain"}, {entry_id:"wfw_03", text:"镜子里的那个人比我更老。也可能更年轻。我分不清了。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["fractured","identity","mirror"], format:"plain"} ], /* fractured_vision(裂变前兆-幻象) */ weimar_speak_fractured_vision: [ {entry_id:"wfv_01", text:"他看见一个年轻人站在街垒上,举着红旗。那是谁?也许是他。也许是他杀死的那个。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["fractured","vision","revolution"], format:"plain"}, {entry_id:"wfv_02", text:"地板在流血。木纹里全是细红的纹路,说不定本来就是血管。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["fractured","vision","body"], format:"plain"}, {entry_id:"wfv_03", text:"1933年在走廊尽头等我。脸看不清。他在笑,笑声我听得见。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["fractured","future","1933"], format:"plain"} ], /* ═══ 主动对话系统 · 魏玛回复池(V1.2 需求文档)═══ */ /* 8个子池,每池6-8条。reaction_tags 用于动作联动权重。 */ /* 状态匹配:calm(mood=平静且tension<30) / anxious(anxiety>=30或tension>=50) / numb(fatigue>=50且anxiety<20) */ /* 深度递进:回合1主抽surface,回合2中层概率升,回合3+核心池开放 */ /* surface_calm(平静-表层)8条 */ weimar_dialogue_surface_calm: [ {entry_id:"wdc_01", text:"今天窗外的鸽子飞得很低,可能是要下雨了。我不讨厌雨天,雨声能盖住很多别的声音。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["calm","weather"], reaction_tags:[]}, {entry_id:"wdc_02", text:"墨水还剩半瓶。以前我会担心用完,现在觉得……用完也许是一种解脱。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["calm","office"], reaction_tags:[]}, {entry_id:"wdc_03", text:"你来了。坐吧,椅子是干的,我检查过了。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["calm","welcome"], reaction_tags:["comforted"]}, {entry_id:"wdc_04", text:"走廊里的脚步声今天慢了一些。也许是因为没人急着去哪儿。也许是因为有人已经不来了。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["calm","sound"], reaction_tags:[]}, {entry_id:"wdc_05", text:"我数了一下桌上的文件。七份。不多。说明今天的世界还没完全压上来。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["calm","office"], reaction_tags:[]}, {entry_id:"wdc_06", text:"你每次来的时候,我都想说什么。话到嘴边,就变成了天气。也许天气才是我们之间最安全的话题。", conditions:[], weight:1.5, cooldown:2, last_picked:-1, tags:["calm","relation"], reaction_tags:["comforted","empathized"]}, {entry_id:"wdc_07", text:"窗玻璃上有道裂纹。从去年就在了。我习惯了。习惯也是一种活法。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["calm","detail"], reaction_tags:[]}, {entry_id:"wdc_08", text:"今天没什么特别的事。没有特别的事在柏林已经算好消息了。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["calm","city"], reaction_tags:[]} ], /* surface_anxious(焦虑-表层)8条 */ weimar_dialogue_surface_anxious: [ {entry_id:"wda_01", text:"你听到那个声音了吗?走廊里像有人在拖东西。也许是昨天的,也许是明天的。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["anxious","sound"], reaction_tags:[]}, {entry_id:"wda_02", text:"别动那扇窗。冷倒是其次,我怕外面有什么东西正往里看。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["anxious","fear"], reaction_tags:[]}, {entry_id:"wda_03", text:"我今天数了数,国会里还有多少人叫我「共和国」。数到一半我就忘了为什么要数。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["anxious","identity"], reaction_tags:[]}, {entry_id:"wda_04", text:"马克又跌了。你不用告诉我数字。我能感觉到。像骨头在缩。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["anxious","economy"], reaction_tags:["informed"]}, {entry_id:"wda_05", text:"你每次说「会好的」,我都想相信。「想相信」和「相信」之间,隔着一条我跨不过的沟。", conditions:[], weight:2, cooldown:2, last_picked:-1, tags:["anxious","relation"], reaction_tags:["comforted"]}, {entry_id:"wda_06", text:"有人在我背后写字。我听得到笔尖的声音。回头,什么也没有。也许字写在里面。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["anxious","paranoia"], reaction_tags:[]}, {entry_id:"wda_07", text:"昨晚我没睡。不敢睡。一闭眼,1918年的声音就回来了。", conditions:[], weight:1.5, cooldown:2, last_picked:-1, tags:["anxious","trauma","1918"], reaction_tags:[]}, {entry_id:"wda_08", text:"门把手在动。不是风。风不会那样动。也许是风。也许是。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["anxious","fear"], reaction_tags:[]} ], /* surface_numb(麻木-表层)6条 */ weimar_dialogue_surface_numb: [ {entry_id:"wdn_01", text:"……", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["numb","silence"], reaction_tags:[]}, {entry_id:"wdn_02", text:"我在。只是不想说话。跟不在差不了多少。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["numb","presence"], reaction_tags:["listened"]}, {entry_id:"wdn_03", text:"椅子很硬。站起来更累。坐着,至少不用假装在走。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["numb","fatigue"], reaction_tags:[]}, {entry_id:"wdn_04", text:"你说什么我都听见了。只是没什么反应。反应要花力气,我今天没那份力气。", conditions:[], weight:1.5, cooldown:2, last_picked:-1, tags:["numb","relation"], reaction_tags:["listened","empathized"]}, {entry_id:"wdn_05", text:"今天的报纸我没翻开。知道了也不会怎样,翻它做什么。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["numb","apathy"], reaction_tags:[]}, {entry_id:"wdn_06", text:"灯还亮着。这就够了。亮着就行。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["numb","minimal"], reaction_tags:[]} ], /* mid_political(中层-政治)8条 */ weimar_dialogue_mid_political: [ {entry_id:"wdmp_01", text:"你问我国会里最危险的位置是哪。反对派那边都排不上。最危险的是中间,站在那里的人,两边都看得见你。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["mid","politics"], reaction_tags:["informed"]}, {entry_id:"wdmp_02", text:"那位老元帅今天又叫我「那个东西」。连「共和国」两个字都省了。他以为自己很含蓄。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["mid","old_marshal"], reaction_tags:["informed"]}, {entry_id:"wdmp_03", text:"有时候我想,民主是不是一种奢侈。饿肚子的人不需要选票,需要面包。给他们面包的人,总会顺便拿走点什么。", conditions:[], weight:1.5, cooldown:2, last_picked:-1, tags:["mid","democracy"], reaction_tags:["empathized"]}, {entry_id:"wdmp_04", text:"你签的每一份文件,都在替我做一个决定。我有时候想问:你替我做的决定,还是不是我的决定?", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["mid","agency"], reaction_tags:["confronted","hurt"]}, {entry_id:"wdmp_05", text:"法国人要的是钱吗?要的是膝盖。钱我给不出,膝盖……膝盖还在考虑。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["mid","versailles"], reaction_tags:["informed"]}, {entry_id:"wdmp_06", text:"军队说他们保护我。上一次他们保护我的时候,差点把我杀了。保护这个词,在他们嘴里和「控制」是同一个音。", conditions:[], weight:1.5, cooldown:2, last_picked:-1, tags:["mid","army"], reaction_tags:["informed"]}, {entry_id:"wdmp_07", text:"你说你在帮我。我相信。帮忙的人有时候比敌人更让人累。因为敌人至少让你知道往哪边防。", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["mid","relation"], reaction_tags:["confronted"]}, {entry_id:"wdmp_08", text:"今天又有一个党派成立了。柏林的党派比面包店多。也许有一天,我们会用党证换面包。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["mid","parties"], reaction_tags:[]} ], /* mid_social(中层-社会)6条 */ weimar_dialogue_mid_social: [ {entry_id:"wdms_01", text:"克罗伊茨贝格今天又有人上街了,这一回是找工作的。找工作的人比抗议的人安静,也更让人害怕。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["mid","workers"], reaction_tags:["informed"]}, {entry_id:"wdms_02", text:"街上有个孩子在卖火柴。他不该在那里。「应该」这个词,1923年的柏林已经不认识它了。", conditions:[], weight:1.5, cooldown:2, last_picked:-1, tags:["mid","poverty"], reaction_tags:["empathized"]}, {entry_id:"wdms_03", text:"工厂的烟囱少了一根。烟囱一停,人也就停了。人停了,就会开始想。想多了就麻烦。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["mid","economy"], reaction_tags:["informed"]}, {entry_id:"wdms_04", text:"有人问我,共和国给他们带来了什么。我想说「自由」。自由不能当饭吃。而他们问的时候,眼睛是空的。", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["mid","promise"], reaction_tags:["confronted"]}, {entry_id:"wdms_05", text:"昨晚蒂尔加滕有枪声。也许是演习。也许不是。我没有去查。有些事,不查比查更安全。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["mid","army","fear"], reaction_tags:[]}, {entry_id:"wdms_06", text:"工人恨我。军官瞧不起我。资产阶级怕我。有时候我想,我到底是谁的人?也许我谁的人都不是。也许这就是共和国。", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["mid","identity"], reaction_tags:["empathized","listened"]} ], /* core_trauma(核心-创伤)8条 */ weimar_dialogue_core_trauma: [ {entry_id:"wdct_01", text:"1918年11月,我也在签字。笔很沉,纸是湿的。墨水冻住了,还是别的什么……你带烟了吗?", conditions:[], weight:1, cooldown:3, last_picked:-1, tags:["core","1918"], reaction_tags:["listened"]}, {entry_id:"wdct_02", text:"凡尔赛的走廊有十四公里长。我走了四年,每次以为要到头了,拐弯处又出现一扇门。", conditions:[], weight:1, cooldown:3, last_picked:-1, tags:["core","versailles"], reaction_tags:["listened"]}, {entry_id:"wdct_03", text:"有时候我梦见自己变成了德意志帝国。醒来发现帝国死了,我还得接着替他腐烂。", conditions:[], weight:1, cooldown:3, last_picked:-1, tags:["core","empire"], reaction_tags:["listened"]}, {entry_id:"wdct_04", text:"卡普政变那天,我躲在桌子底下。一个共和国,躲在桌子底下。他们叫我出来。我没出来。出来的时候,桌上多了一道牙印。是我的。", conditions:[], weight:1.5, cooldown:3, last_picked:-1, tags:["core","kapp"], reaction_tags:["listened","empathized"]}, {entry_id:"wdct_05", text:"你问我怕什么。我怕的不是死。我怕的是死之前,发现自己已经不是自己了。那种死,比死还安静。", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["core","identity","fear"], reaction_tags:["inquired"]}, {entry_id:"wdct_06", text:"1919年有人朝我扔石头。石头上刻着一个字:「叛」。我把石头收起来了。它比任何勋章都重。", conditions:[], weight:1, cooldown:3, last_picked:-1, tags:["core","1919","betrayal"], reaction_tags:["listened"]}, {entry_id:"wdct_07", text:"我出生的那天,有人在欢呼,有人在咒骂。我以为欢呼会赢。现在我不确定了。也许咒骂比欢呼活得更久。", conditions:[], weight:1.5, cooldown:3, last_picked:-1, tags:["core","birth"], reaction_tags:["empathized","listened"]}, {entry_id:"wdct_08", text:"你听见过一个国家哭吗?没有。国家不会哭。他只是慢慢地,把声音调小。调到最后,你以为他安静了。其实他只是不想让你听见。", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["core","silence"], reaction_tags:["listened","empathized"]} ], /* core_identity(核心-身份)6条 */ weimar_dialogue_core_identity: [ {entry_id:"wdci_01", text:"我是谁?你问我是谁。我是十一月的那个声音。「共和国万岁」。万岁之后呢,从来没人告诉过我。", conditions:[], weight:1.5, cooldown:3, last_picked:-1, tags:["core","identity"], reaction_tags:["inquired"]}, {entry_id:"wdci_02", text:"他们叫我魏玛。魏玛只是个地名。我是在柏林出生的。名字和出生地不一样。这也许是个隐喻。也许不是。", conditions:[], weight:1, cooldown:3, last_picked:-1, tags:["core","name"], reaction_tags:["inquired"]}, {entry_id:"wdci_03", text:"如果我消失了,谁会记得我?我说的不是「魏玛共和国」这五个字,是那个在窗边数马车、害怕雨声、牙齿里嵌着玻璃渣的东西。", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["core","memory"], reaction_tags:["empathized","listened"]}, {entry_id:"wdci_04", text:"1933年。我不说那个字。说了他就离我更近。他每天逼近一寸。我能感觉到,钉子在脊椎里爬。", conditions:[], weight:1.5, cooldown:3, last_picked:-1, tags:["core","1933","fear"], reaction_tags:["inquired"]}, {entry_id:"wdci_05", text:"你有时候看我的眼神,像在看一个将死之人。也许你是对的。只求你别在我还活着的时候,就用那种眼神。", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["core","relation"], reaction_tags:["empathized","confronted"]}, {entry_id:"wdci_06", text:"共和国是什么?宪法是它,议会也是它,再往里一层,是一群人同意一起活。我活着的每一天,都是他们在同意。哪天他们不同意了,我就不在了。那也不叫死,叫……解散。", conditions:[], weight:2, cooldown:3, last_picked:-1, tags:["core","definition"], reaction_tags:["listened","inquired"]} ], /* leave(结束语,按状态条件过滤)6条 */ weimar_dialogue_leave: [ {entry_id:"wdl_01", text:"门关上的时候轻一点。我今天对声音很敏感。", conditions:[{type:"stat",key:"weimar.surface.mood",op:"eq",val:"平静"}], weight:1, cooldown:0, last_picked:-1, tags:["leave","calm"], reaction_tags:[]}, {entry_id:"wdl_02", text:"别回头。算……一个建议。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:30}], weight:1, cooldown:0, last_picked:-1, tags:["leave","anxious"], reaction_tags:[]}, {entry_id:"wdl_03", text:"你走吧。1933年也会走的,我们都会走的。", conditions:[{type:"stat",key:"weimar.personality_tension",op:"gte",val:2}], weight:1, cooldown:0, last_picked:-1, tags:["leave","tense"], reaction_tags:[]}, {entry_id:"wdl_04", text:"嗯。(没有抬头)", conditions:[{type:"stat",key:"weimar.surface.fatigue",op:"gte",val:50}], weight:1, cooldown:0, last_picked:-1, tags:["leave","numb"], reaction_tags:[]}, {entry_id:"wdl_05", text:"去吧。我没事。「没事」在柏林的意思是:还没死。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["leave","default"], reaction_tags:[]}, {entry_id:"wdl_06", text:"谢谢你今天来。这话没有客套的成分。有人愿意停下来听,已经是奢侈品了。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:50}], weight:1.5, cooldown:0, last_picked:-1, tags:["leave","grateful"], reaction_tags:[]} ], /* ═══ 功能性报告池(玩家向魏玛报告当天事务)═══ */ /* 安静日:今天没处理任何事务 */ weimar_report_quiet: [ {entry_id:"wrq_01", text:"今天很安静。没有文件,没有电报,没有枪声。安静得让我有点不习惯。也许安静才是这个国家最奢侈的东西。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","quiet"], reaction_tags:[]}, {entry_id:"wrq_02", text:"你今天什么都没处理。文件篮是空的。我数了数,空的。有时候,什么都不做也是一种选择。只是不知道是不是对的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","quiet"], reaction_tags:[]}, {entry_id:"wrq_03", text:"没有消息。没有坏消息,也没有好消息。在柏林,没有消息就是好消息。这话信不信,我自己也没底。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","quiet"], reaction_tags:[]}, {entry_id:"wrq_04", text:"你今天没碰那些文件。我猜你是想歇一歇。歇吧。这个国家不会因为你歇一天就塌。至少今天不会。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","quiet"], reaction_tags:[]} ], /* 一般事务:处理了事,但没有重大历史事件 */ weimar_report_generic: [ {entry_id:"wrg_01", text:"你处理了那些事。我看见了。每一件都让这个国家朝某个方向倾斜了一点。你感觉到了吗?那种倾斜。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","generic"], reaction_tags:[]}, {entry_id:"wrg_02", text:"你签了字,你打了电话,你见了人。然后你回来告诉我。我听着。这就是我能做的--听着。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","generic"], reaction_tags:[]}, {entry_id:"wrg_03", text:"那些文件,那些数字,那些人。你替我做了一个又一个决定。我有时候想问:签下去的,还算不算我的决定?", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","generic"], reaction_tags:[]}, {entry_id:"wrg_04", text:"你今天很忙。我听见你翻文件的声音。忙是好事。忙的时候,你不会去想那些不该想的事。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","generic"], reaction_tags:[]} ], /* 多件事务承接:处理了2件以上时,在定向回复前加一句 */ weimar_report_multi: [ {entry_id:"wrm_01", text:"你今天处理了不止一件事。我数了数。你忙了一整天。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","multi"], reaction_tags:[]}, {entry_id:"wrm_02", text:"几件事叠在一起。你一件一件地拆。我听见纸的声音。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["report","multi"], reaction_tags:[]} ], /* ═══ 区域氛围池(地点×时段,每池5条)═══ */ /* 克罗伊茨贝格·上午 */ atmo_kreuzberg_morning: [ {entry_id:"akm_01", text:"煤灰味从烟囱里飘下来,混着早饭的卷心菜气。工人们低着头往厂里走,一路无话。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","worker"], format:"plain"}, {entry_id:"akm_02", text:"海报墙上又贴了新的一层。旧的字从纸缝里透出来,一条不肯咽气的旧消息。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","poster"], format:"plain"}, {entry_id:"akm_03", text:"一个孩子在巷口蹲着,用钉子在地上画马。马背上空着,没有骑手。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","child"], format:"plain"}, {entry_id:"akm_04", text:"面包店开了门,队已经排到街角。队里安安静静,沉默比吵闹更让人害怕。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","queue"], format:"plain"}, {entry_id:"akm_05", text:"工会据点的门关着,楼上有烟。有人在里面,只是还没准备好开门。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","union"], format:"plain"} ], /* 克罗伊茨贝格·傍晚 */ atmo_kreuzberg_evening: [ {entry_id:"ake_01", text:"路灯亮了,只亮一半。另一半是被人打碎的,玻璃碴还散在灯柱下。光是残缺的,影子是完整的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","light"], format:"plain"}, {entry_id:"ake_02", text:"酒馆里传出手风琴声,走了调。有人跟着唱,也走了调。两种走调叠在一起,反而像真的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","music"], format:"plain"}, {entry_id:"ake_03", text:"巷子深处有人在喊口号。词听不清,愤怒的节奏听得清。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","shout"], format:"plain"}, {entry_id:"ake_04", text:"几个工人蹲在台阶上抽烟。烟头的红点在暮色里一明一灭,一排微弱的信号灯。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","worker"], format:"plain"}, {entry_id:"ake_05", text:"墙上新刷了一条标语,墨迹还没干。风一吹,字开始往下淌,淌出血来。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","slogan"], format:"plain"} ], /* 克罗伊茨贝格·夜晚 */ atmo_kreuzberg_night: [ {entry_id:"akn_01", text:"夜里的克罗伊茨贝格比白天安静。是屏住呼吸的那种安静。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["mood","silence"], format:"plain"}, {entry_id:"akn_02", text:"脚步声从巷子另一头传来。你分不清是一个人还是好几个人。在夜里,这很重要。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","footstep"], format:"plain"}, {entry_id:"akn_03", text:"一扇窗户亮着。窗帘后面有人影在走动,走来走去,走来走去。睡不着的人。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","window"], format:"plain"}, {entry_id:"akn_04", text:"远处传来玻璃碎裂的声音。然后是骂声。然后是安静。碎玻璃之后的安静,比碎玻璃本身更让人不安。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["sound","violence"], format:"plain"}, {entry_id:"akn_05", text:"一只猫从墙头跳下来,看了你一眼,走了。这条街的事,它比谁都门儿清。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","cat"], format:"plain"} ], /* 总理府·上午 */ atmo_chancellery_morning: [ {entry_id:"acm_01", text:"打字机在走廊尽头咔嗒咔嗒响。电话铃每隔七分钟炸一次,你数过。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","office"], format:"plain"}, {entry_id:"acm_02", text:"秘书端着咖啡进来,杯子里是菊苣根。真咖啡的价格已经够买一辆自行车了。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","coffee"], format:"plain"}, {entry_id:"acm_03", text:"窗帘拉开了一半。另一半被谁拉上过,又被人拉开了。在这栋楼里,连窗帘都有立场。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","curtain"], format:"plain"}, {entry_id:"acm_04", text:"文件堆成了小山。最底下的那份已经发黄了。你不确定它是在等处理,还是在等被遗忘。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","files"], format:"plain"}, {entry_id:"acm_05", text:"走廊里有人快步经过,没敲门。脚步声停在隔壁,然后是低语。在这栋楼里,低语比喊叫重要。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["sound","whisper"], format:"plain"} ], /* 总理府·夜晚 */ atmo_chancellery_night: [ {entry_id:"acn_01", text:"夜里的总理府比白天更大。走廊在黑暗中延伸,一条没有尽头的议案。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["mood","space"], format:"plain"}, {entry_id:"acn_02", text:"只有你的办公室亮着灯。隔壁总理走了,雪茄味还在。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","cigar"], format:"plain"}, {entry_id:"acn_03", text:"电话安静了。电话安静比电话响更让人不安。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","silence"], format:"plain"}, {entry_id:"acn_04", text:"窗外的柏林在过夜。远处的灯火零星明灭,一群奄奄一息的萤火虫。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","city"], format:"plain"}, {entry_id:"acn_05", text:"墙上威廉二世的画像蒙了半幅布。夜里,布的下摆垂出一个低头的轮廓。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","portrait"], format:"plain"} ], /* 蒂尔加滕·上午 */ atmo_tiergarten_morning: [ {entry_id:"atm_01", text:"林荫道上的霜还没化。叶子掉光了,枝桠伸向灰色的天,一把把黑色的枯血管。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","tree"], format:"plain"}, {entry_id:"atm_02", text:"一个老军官在遛狗。狗很老,军官更老。他们走得一样慢。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","officer"], format:"plain"}, {entry_id:"atm_03", text:"空气里有松针和旧呢大衣的气味。这是柏林少数闻不到煤灰的地方。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","pine"], format:"plain"}, {entry_id:"atm_04", text:"长椅上落了一层霜,空着。早晨的冷筛掉了赶路的人。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","bench"], format:"plain"}, {entry_id:"atm_05", text:"一只乌鸦停在俾斯麦雕像的头上。它看了你一眼,没飞走。它觉得它才是这里的主人。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","crow"], format:"plain"} ], /* 蒂尔加滕·傍晚 */ atmo_tiergarten_evening: [ {entry_id:"ate_01", text:"暮色把林荫道染成了铜色。偶尔有军装闪过,步伐比白天快。天黑了,他们也想回家。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","officer"], format:"plain"}, {entry_id:"ate_02", text:"长椅上坐着几个老人,穿着磨旧的呢大衣。他们在看报,眼睛落在路人身上。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","elderly"], format:"plain"}, {entry_id:"ate_03", text:"远处的运河反着最后一丝天光。1919年,KPD的两位领袖被杀害后,尸体被扔进了那条运河。水还在流,沉下去的东西再没浮上来。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["visual","canal","1919"], format:"plain"}, {entry_id:"ate_04", text:"两个军官在低声交谈,看到你就停了。沉默了三秒,然后他们换了个方向走了。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","officer"], format:"plain"}, {entry_id:"ate_05", text:"风从西边来,带着煤灰和铁锈。鲁尔方向的风,总是带着那个方向的味道。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["smell","wind"], format:"plain"} ], /* ═══ 状态后缀池(根据魏玛状态,50%概率追加)═══ */ atmo_suffix_anxiety: [ {entry_id:"asa_01", text:"你的后颈在发紧。是那种「有人在看你」的感觉。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["anxiety","body"], format:"plain"}, {entry_id:"asa_02", text:"空气里有一种说不清的紧绷,像暴风雨前的那种,天上没有云。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["anxiety","air"], format:"plain"}, {entry_id:"asa_03", text:"你注意到自己加快了脚步。倒不是赶时间,只是想离开这里。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["anxiety","walk"], format:"plain"} ], atmo_suffix_fatigue: [ {entry_id:"asf_01", text:"你的眼皮在变沉。街道开始模糊,一张对不上焦的照片。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["fatigue","vision"], format:"plain"}, {entry_id:"asf_02", text:"腿在发软。走了太久,腿先知道。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["fatigue","body"], format:"plain"}, {entry_id:"asf_03", text:"你开始分不清今天是星期几。很多人已经分不清了。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["fatigue","time"], format:"plain"} ], atmo_suffix_hope: [ {entry_id:"ash_01", text:"但也有什么不一样了。也许是你,也许是天气,也许是别的。说不清。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["hope","subtle"], format:"plain"}, {entry_id:"ash_02", text:"有人在吹口哨。曲调你认不出来,口哨声本身倒是个好信号。无缘无故吹口哨的人可不多。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["hope","sound"], format:"plain"}, {entry_id:"ash_03", text:"一个孩子从你身边跑过,笑着。笑声在灰色的街上格外刺耳,好在算不得坏的刺耳。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["hope","child"], format:"plain"} ], /* ═══ 其余区域氛围池(上午+傍晚,各5条)═══ */ /* 罗曼咖啡馆·上午 */ atmo_romanisches_morning: [ {entry_id:"arm_01", text:"推门进去时铃铛响了一声。菊苣根咖啡的蒸汽和烟草雾混在一起,形成灰黄色的天棚。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","cafe"], format:"plain"}, {entry_id:"arm_02", text:"靠窗那桌坐着几个戴圆眼镜的人。一个在用叉子戳报纸,一下一下,验尸的手法。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","intellectual"], format:"plain"}, {entry_id:"arm_03", text:"角落里有人下棋。棋子落盘的声音比说话声大。在这个咖啡馆,沉默是一种品位。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","chess"], format:"plain"}, {entry_id:"arm_04", text:"服务生端着托盘穿过人群,杯子在抖但没洒。这种平衡术在柏林不只是工作技能。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","waiter"], format:"plain"}, {entry_id:"arm_05", text:"门口的衣帽架上挂满了大衣。军装的影子混在里面,你不确定是不是看花了眼。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","army"], format:"plain"} ], /* 罗曼咖啡馆·傍晚 */ atmo_romanisches_evening: [ {entry_id:"are_01", text:"傍晚的咖啡馆更吵了。争论声叠着争论声,一锅煮过了头的汤。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","argument"], format:"plain"}, {entry_id:"are_02", text:"有人开始念诗。声音不大,周围静了下来。愿意听诗的人比愿意听政客的人多。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","poetry"], format:"plain"}, {entry_id:"are_03", text:"灯光暗了一度。也许是省电,也许是气氛。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","light"], format:"plain"}, {entry_id:"are_04", text:"一个记者在角落里奋笔疾书,墨水溅到了袖口上。他没注意。新闻比袖口重要。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","journalist"], format:"plain"}, {entry_id:"are_05", text:"有人在你身后低声说了一个名字--一个你不认识的名字。说话的人语气很重,像在宣读一份判决。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","whisper"], format:"plain"} ], /* 亚历山大广场·上午 */ atmo_alexanderplatz_morning: [ {entry_id:"aam_01", text:"Manoli香烟的霓虹灯还亮着,忘了关。或者有人故意让它亮着--在灰色里需要一点颜色。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","neon"], format:"plain"}, {entry_id:"aam_02", text:"红堡的窗户是一排眼睛。你抬头看的时候,有一扇窗的窗帘动了。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","police"], format:"plain"}, {entry_id:"aam_03", text:"黑市贩子还没开张,已经在踩点了。他们站在街角,手插口袋,眼睛在扫。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","blackmarket"], format:"plain"}, {entry_id:"aam_04", text:"卖报童的嗓门比昨天哑了一度。头条还是那个意思,只是数字又大了了一些。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","newsboy"], format:"plain"}, {entry_id:"aam_05", text:"有轨电车叮叮当当驶过。车上的人挤着脸贴在玻璃上,一缸挤来挤去的鱼。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","tram"], format:"plain"} ], /* 亚历山大广场·傍晚 */ atmo_alexanderplatz_evening: [ {entry_id:"aae_01", text:"霓虹灯真正亮起来了。红色、蓝色、绿色的光在湿漉漉的石板上淌。柏林在一刻钟内变成了另一个城市。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","neon"], format:"plain"}, {entry_id:"aae_02", text:"黑市贩子开始招呼了。「美元?荷兰盾?」声音压得很低,手比划得很清楚。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","blackmarket"], format:"plain"}, {entry_id:"aae_03", text:"红堡的塔楼在暮色中显得更高了。它压着广场,不掺半点看的意思。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","police"], format:"plain"}, {entry_id:"aae_04", text:"一个独腿退伍兵在卖火柴。没人买。他的火柴盒在手里转,一圈又一圈,停不下来。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","veteran"], format:"plain"}, {entry_id:"aae_05", text:"人群在流动。卖报的、卖烟的、卖身的、卖情报的。一切都是商品,包括沉默。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["mood","commerce"], format:"plain"} ], /* 安哈尔特火车站·上午 */ atmo_anhalter_morning: [ {entry_id:"ahm_01", text:"站台上的广播喇叭坏了。火车到不到,全凭运气。时间表是假的,大家心照不宣。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","station"], format:"plain"}, {entry_id:"ahm_02", text:"红十字的摊位前排着队。稀粥的蒸汽和机油的气味混在一起,像一种只有柏林才有的早餐。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","food"], format:"plain"}, {entry_id:"ahm_03", text:"一列从鲁尔方向来的列车靠站。下来的人脸色灰白,一副被倒出来的样子。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","refugee"], format:"plain"}, {entry_id:"ahm_04", text:"招工佬在站台转悠。「码头缺人,管饭。」他压低声音:「不管别的。」", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","recruiter"], format:"plain"}, {entry_id:"ahm_05", text:"候车大厅的长椅上坐着一个打盹的男人,膝盖上放着一个空布袋。布袋上印着埃森一家大工厂的商标。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","sleeping"], format:"plain"} ], /* 安哈尔特火车站·傍晚 */ atmo_anhalter_evening: [ {entry_id:"ahe_01", text:"末班车快到了。站台上的人开始焦虑,怕的并非错过车,怕的是到了之后没人接。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["mood","anxiety"], format:"plain"}, {entry_id:"ahe_02", text:"一个抱着孩子的女人坐在长椅上。孩子睡着了,她没有。她的眼睛在看火车来的方向。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","mother"], format:"plain"}, {entry_id:"ahe_03", text:"蒸汽散了,露出空荡荡的铁轨。铁轨在暮色里反着光,两条线,逃不掉的那种。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","tracks"], format:"plain"}, {entry_id:"ahe_04", text:"招工佬走了,换了一拨人。他们不招工,他们招别的。眼神比招工佬更直接。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","shadow"], format:"plain"}, {entry_id:"ahe_05", text:"站台的灯亮了,有一盏坏了。光断了一截,像一句话说到一半。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","light"], format:"plain"} ], /* 夏洛滕堡·上午 */ atmo_charlottenburg_morning: [ {entry_id:"acm2_01", text:"街上的建筑比柏林市区新,也比柏林市区傲慢。每一扇窗户都擦得很亮,亮到你觉得它在审视你。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","building"], format:"plain"}, {entry_id:"acm2_02", text:"一个技术大学的学生迎面走来,臂上别着一个你没见过的徽章。他朝你微微点头,脚步没停。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","student"], format:"plain"}, {entry_id:"acm2_03", text:"夏洛滕堡宫的轮廓在晨雾中显得格外庞大,一副不肯退场的旧时代布景。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","palace"], format:"plain"}, {entry_id:"acm2_04", text:"咖啡馆的窗户里透出暖光。你经过的时候,里面有人朝外看了一眼,然后拉上了窗帘。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","cafe"], format:"plain"}, {entry_id:"acm2_05", text:"一辆擦得锃亮的汽车从你身边驶过。车里的人你没看清,车牌是新的。新车牌是一种宣言。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","car"], format:"plain"} ], /* 夏洛滕堡·傍晚 */ atmo_charlottenburg_evening: [ {entry_id:"ace_01", text:"军官俱乐部的灯亮了。透过窗帘能看到军装的影子在移动,慢条斯理,一种仪式的步子。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","officer"], format:"plain"}, {entry_id:"ace_02", text:"街上的人变少了。都去了该去的地方。傍晚筛掉了不该在街上的人。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["mood","empty"], format:"plain"}, {entry_id:"ace_03", text:"一个老妇人在遛狗。狗比她精神。她看你的方式带着一种旧式礼貌--那种「我看见了但我假装没看见」的礼貌。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","elderly"], format:"plain"}, {entry_id:"ace_04", text:"技术大学门口的布告栏贴满了纸。有学术讲座,也有别的东西。纸层层叠叠,又一面海报墙。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","poster"], format:"plain"}, {entry_id:"ace_05", text:"远处传来进行曲的声音,放的却是留声机。旧时代的音乐比新时代的更有市场。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","music"], format:"plain"} ], /* 选帝侯大街·上午 */ atmo_kurfurstendamm_morning: [ {entry_id:"akm2_01", text:"橱窗里摆着真丝衬衫和象牙梳子。店员已经懒得换价签了,直接在旧价格上划一道写新的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","shop"], format:"plain"}, {entry_id:"akm2_02", text:"清洁工在擦霓虹灯。他擦得很仔细,擦一件武器的手法。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","cleaner"], format:"plain"}, {entry_id:"akm2_03", text:"一个穿燕尾服的男人从Cabaret里出来,脚步踉跄。他打了个嗝,声音在安静的街上格外响亮。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","drunk"], format:"plain"}, {entry_id:"akm2_04", text:"早咖啡的真假取决于价格。真咖啡50亿马克一杯,假的只要5000万。味道差不多,价格差了一万倍。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","coffee"], format:"plain"}, {entry_id:"akm2_05", text:"一个独腿退伍兵坐在路边。穿貂皮大衣的女人从他身边走过,没有看他。他也没看她。他们彼此看不见。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","contrast"], format:"plain"} ], /* 选帝侯大街·傍晚 */ atmo_kurfurstendamm_evening: [ {entry_id:"ake2_01", text:"霓虹灯全亮了。红、蓝、绿,在湿漉漉的石板上流淌。柏林在这一刻像巴黎。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","neon"], format:"plain"}, {entry_id:"ake2_02", text:"Cabaret的音乐从门缝里漏出来。走了调,比正经音乐更有生命力。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","music"], format:"plain"}, {entry_id:"ake2_03", text:"一辆亮闪闪的汽车停在路边。车门打开,一只貂皮大衣的袖子伸出来,然后是一条腿。下车是一种表演。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","car"], format:"plain"}, {entry_id:"ake2_04", text:"两个通胀暴富者在比谁的手表更贵。一个说「我这块值一栋楼」,另一个笑了:「我这块值一栋楼加一个仆人。」", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","rich"], format:"plain"}, {entry_id:"ake2_05", text:"好时光。1923年的柏林,这个词听起来像一句外语。有人在努力说着它。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["mood","decadence"], format:"plain"} ], /* 威丁·上午 */ atmo_wedding_morning: [ {entry_id:"awm_01", text:"出租兵营的红砖墙在晨光里显得更红了。六层楼围着一块泥地,泥地上晒着衣服和孩子。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","barracks"], format:"plain"}, {entry_id:"awm_02", text:"Schering药厂的汽笛响了。工人们从兵营里涌出来,顺着红砖缝往外淌的水。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","factory"], format:"plain"}, {entry_id:"awm_03", text:"米勒街的拐角有人在卖《红旗》。卖报的人看你一眼,把报纸举高了些。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","newspaper"], format:"plain"}, {entry_id:"awm_04", text:"空气里有化工品的酸味和煮土豆的蒸汽。这两种味道叠在一起,就是威丁的早晨。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","chemical"], format:"plain"}, {entry_id:"awm_05", text:"一个老妇人从三楼窗口探出头,把一盆水泼下来浇晾衣绳上的灰。她看到了你,没说话。陌生人不需要打招呼。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","woman"], format:"plain"} ], /* 威丁·傍晚 */ atmo_wedding_evening: [ {entry_id:"awe_01", text:"兵营院子里有人在唱歌。《国际歌》。声音不大,整栋楼都在听。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","song"], format:"plain"}, {entry_id:"awe_02", text:"泥地上的孩子被叫回去了。楼里的灯一盏一盏亮起来,蜂巢在发光。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","lights"], format:"plain"}, {entry_id:"awe_03", text:"楼梯间里有人在争论。声音从三楼传到一楼,一层楼一层扩音。墙是透的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","argument"], format:"plain"}, {entry_id:"awe_04", text:"一个年轻人在楼梯口靠着墙抽烟,手上有油污。他看你的眼神,是在读一份文件。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","worker"], format:"plain"}, {entry_id:"awe_05", text:"Rotaprint厂的烟囱还在冒烟。夜班开始了。机器不需要睡觉,人也不需要。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","factory"], format:"plain"} ], /* 弗里德里希斯海因·上午 */ atmo_friedrichshain_morning: [ {entry_id:"afm_01", text:"工厂烟囱在远处冒着烟。烟是灰的,天也是灰的。分不清哪是烟哪是天。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","smoke"], format:"plain"}, {entry_id:"afm_02", text:"人民公园的长椅上没有晨练的人。工人不晨练,他们直接去工厂。公园在早上是空的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","park"], format:"plain"}, {entry_id:"afm_03", text:"面包店的队伍比克罗伊茨贝格短一些,脸色一样灰。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","queue"], format:"plain"}, {entry_id:"afm_04", text:"一个老人在公园湖边坐着,膝盖上放着一个空饭盒。他在看湖。湖面结了薄冰。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","elderly"], format:"plain"}, {entry_id:"afm_05", text:"街上的海报比别处少。海报贴上去能活多久,全看是谁贴的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","poster"], format:"plain"} ], /* 弗里德里希斯海因·傍晚 */ atmo_friedrichshain_evening: [ {entry_id:"afe_01", text:"人民公园里有人了。工人们下了班来这里喘气。长椅上坐满了不说话的人。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","park"], format:"plain"}, {entry_id:"afe_02", text:"湖面的冰上有一道裂缝。你盯着它看了很久,直到它变成别的东西。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","ice"], format:"plain"}, {entry_id:"afe_03", text:"有人在弹手风琴。曲调很旧,旧到你的祖父可能听过。现在听的人换成了工人的孩子。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","music"], format:"plain"}, {entry_id:"afe_04", text:"烟囱还在冒烟。夜班接了白班。烟囱是唯一不休息的东西。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","factory"], format:"plain"}, {entry_id:"afe_05", text:"一对夫妻在吵架。声音从二楼传下来。你听不清词,听得出疲惫。吵架也变成了一种日常。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","argument"], format:"plain"} ], /* 勃兰登堡门·上午 */ atmo_brandenburg_morning: [ {entry_id:"abm_01", text:"巴黎广场的石板被千万双脚磨得发亮。今天广场上没有人集会,地面上还残留着热度。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","square"], format:"plain"}, {entry_id:"abm_02", text:"门顶上的四马双轮战车俯瞰着柏林。马头朝着东方。有人说,哪天马头朝了西,帝国就会回来。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","statue"], format:"plain"}, {entry_id:"abm_03", text:"清洁工在扫传单。扫帚的声音在空旷的广场上回荡,扫的是一场没打完的仗的残骸。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","sweeping"], format:"plain"}, {entry_id:"abm_04", text:"一个老人坐在石阶上,怀里抱着一面叠好的黑白红三色旗--帝国旗,不是共和旗。他闭着眼。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","flag"], format:"plain"}, {entry_id:"abm_05", text:"风从蒂尔加滕方向吹来,带着松针和旧呢大衣的气味。穿过城门的时候,风顿了一秒,鞠了个躬。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","wind"], format:"plain"} ], /* 勃兰登堡门·傍晚 */ atmo_brandenburg_evening: [ {entry_id:"abe_01", text:"暮色中的城门是一张黑洞洞的嘴。穿过它的人不回头。回头是危险的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","gate"], format:"plain"}, {entry_id:"abe_02", text:"战车雕塑的影子在夕阳下横过广场,一把切过去的刀。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","shadow"], format:"plain"}, {entry_id:"abe_03", text:"有人在高处拍照。闪光灯亮了一下,把广场照成白色。那一秒里,所有人的脸都一样。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","flash"], format:"plain"}, {entry_id:"abe_04", text:"三个穿制服的人在城门下站了一会儿,然后走了。你不确定他们是军人还是演员。界限模糊。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","uniform"], format:"plain"}, {entry_id:"abe_05", text:"风停了。广场上突然很安静。安静到你能听见自己的脚步声在石板上回响。这种安静不正常。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","silence"], format:"plain"} ], /* 菩提树下大街·上午 */ atmo_unter_den_linden_morning: [ {entry_id:"aulm_01", text:"腓特烈大帝的铜像立在中间,面朝东方。他看着柏林大学和军械库,一副临考的神情。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","statue"], format:"plain"}, {entry_id:"aulm_02", text:"大学生们匆匆走过,书包在背上晃。有人背单词,有人背口号,两种背诵并行不悖。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","student"], format:"plain"}, {entry_id:"aulm_03", text:"椴树排列在两侧,光秃秃的。菩提树下大街成了一条没有尽头的走廊,一眼望不到冬天的那头。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","tree"], format:"plain"}, {entry_id:"aulm_04", text:"军械库的门开着。门口的老兵立在那里,守卫是虚的,回忆是实的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","guard"], format:"plain"}, {entry_id:"aulm_05", text:"一辆马车从铜像旁驶过。马蹄声在空旷的大街上回响,一声一声,敲着心跳的拍子。柏林还有马车,只是越来越少了。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","horse"], format:"plain"} ], /* 菩提树下大街·傍晚 */ atmo_unter_den_linden_evening: [ {entry_id:"aule_01", text:"路灯亮了,只亮了街道的一侧。另一侧一直黑着,无人来修。连照明都有偏好。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","light"], format:"plain"}, {entry_id:"aule_02", text:"大学门口的学生在辩论。声音很大,手势很大,眼神是空的。年轻人的空,在于还没决定信什么。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","debate"], format:"plain"}, {entry_id:"aule_03", text:"铜像的影子在暮色中变得巨大。腓特烈大帝的影子比他本人更吓人。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","shadow"], format:"plain"}, {entry_id:"aule_04", text:"一个卖花的女人站在街角。花是真花,已经蔫了。她不看人,人也不看她。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","flower"], format:"plain"}, {entry_id:"aule_05", text:"远处传来进行曲的声音,出自大学里的社团。年轻人喜欢模仿大人的严肃。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","march"], format:"plain"} ], /* 【新增】红堡·上午 */ atmo_police_hq_morning: [ {entry_id:"aphm_01", text:"红堡前的台阶扫过三遍。上岗的皮靴声从街口一直响到门廊,路上的行人听见了,把步子放慢半拍。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","boots"], format:"plain"}, {entry_id:"aphm_02", text:"囚车停在侧门,发动机没熄。押送的人靠着车头,手始终搭在门把上。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","van"], format:"plain"}, {entry_id:"aphm_03", text:"广场上的摊贩把炉子支在十步开外。红堡的规矩,他们比巡警背得熟。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","stall"], format:"plain"}, {entry_id:"aphm_04", text:"通报室的窗口排着报案的队伍。轮到的人把证件递进去,没轮到的数着瓷砖消磨时间。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","queue"], format:"plain"} ], /* 【新增】红堡·傍晚 */ atmo_police_hq_evening: [ {entry_id:"aphe_01", text:"塔楼上的灯亮了。红堡的夜班从点名开始,点名声隔着院子传出来,一排一排,像报平安。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","rollcall"], format:"plain"}, {entry_id:"aphe_02", text:"街对面酒馆的窗子里放着留声机。声音开得不大,这条街上,喧哗要挑日子。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","gramophone"], format:"plain"}, {entry_id:"aphe_03", text:"侧门开了一条缝,出去的是文书,抱着公文箱,走得很急。夜里的事,多半从这扇门开始。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","clerk"], format:"plain"}, {entry_id:"aphe_04", text:"换岗的哨兵跺着脚取暖。红砖在暮色里更红了,像炉膛。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","brick"], format:"plain"} ], /* 【新增】外交部·上午 */ atmo_foreign_office_morning: [ {entry_id:"afom_01", text:"电报房的排风扇嗡嗡转着,把电码味和烟味一起排进院子。院子里的雪,落一层,踩一层。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","fan"], format:"plain"}, {entry_id:"afom_02", text:"信使把一夜的外文报纸抱进来,报头上的日期比柏林晚半天。楼里的人管这个叫「时差」,谁也不敢让它超过一天。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","papers"], format:"plain"}, {entry_id:"afom_03", text:"走廊里,管灯的老头爬在梯子上换新灯,嘴里念叨:这楼里别的都省,就灯不省。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","lamp"], format:"plain"}, {entry_id:"afom_04", text:"黑板上抄着昨夜的汇率。抄的人换了三班,数字后面跟着一道一道横线,谁也舍不得擦。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","rate"], format:"plain"} ], /* 【新增】外交部·傍晚 */ atmo_foreign_office_evening: [ {entry_id:"afoe_01", text:"大楼的窗户一扇一扇暗下去,只有电报房的排风扇整夜转。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","windows"], format:"plain"}, {entry_id:"afoe_02", text:"晚班的誊写员把台灯罩低了一格。誊错一个字的规矩,白天黑夜一样。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","lamp"], format:"plain"}, {entry_id:"afoe_03", text:"后楼梯口有人影闪过,约好了似的。你没有多看,外交部的夜里,多看是失礼。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","shadow"], format:"plain"}, {entry_id:"afoe_04", text:"门口的信使换上自行车。夜里加急的照会,靠两条腿蹬出去。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","bicycle"], format:"plain"} ], /* 【新增】财政部·上午 */ atmo_finance_ministry_morning: [ {entry_id:"afim_01", text:"算盘声从走廊两头一起响,节奏对不齐,两场不合拍的雨。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","abacus"], format:"plain"}, {entry_id:"afim_02", text:"地下印刷间的排气口冒白汽。纸和油墨的味道闻久了头疼,楼里的人都说习惯了。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","ink"], format:"plain"}, {entry_id:"afim_03", text:"送文件的信差一趟一趟跑,鞋底的钉子敲在石板上。账房的走廊不铺地毯,账房不惯着谁。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","steps"], format:"plain"}, {entry_id:"afim_04", text:"黑板上的昨日兑换价还没擦。擦黑板的人说,留着吧,明天还要写更大的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","board"], format:"plain"} ], /* 【新增】财政部·傍晚 */ atmo_finance_ministry_evening: [ {entry_id:"afie_01", text:"下班的人流在门口散开,谁也没有结伴。账房的人把一天的数字锁在脑子里,带不出门。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","crowd"], format:"plain"}, {entry_id:"afie_02", text:"部长室的灯亮着。秘书抱着文件进去,出来时文件少了两份,人瘦了一圈。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","office"], format:"plain"}, {entry_id:"afie_03", text:"天黑透了,总账房还有一盏灯。老科员在核最后一栏,核完才锁柜子,这个习惯比这座楼老。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","lamp"], format:"plain"}, {entry_id:"afie_04", text:"印刷间的夜班接了班。从街上看,这栋楼的地下还亮着,一炉压着的火。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","cellar"], format:"plain"} ], /* 总统府·上午 */ atmo_presidency_morning: [ {entry_id:"apm_01", text:"总统府的门口站着两个卫兵。他们的姿势很标准,眼神在打哈欠。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","guard"], format:"plain"}, {entry_id:"apm_02", text:"总统府的办公室窗户亮着灯。SPD出身的总统起得比柏林早。天不亮就动手。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","window"], format:"plain"}, {entry_id:"apm_03", text:"走廊里有消毒水的味道。这栋楼在给旧时代消毒,把那股细菌味一并熏出去。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","disinfect"], format:"plain"}, {entry_id:"apm_04", text:"秘书端着文件匆匆走过,鞋跟在地板上敲出急促的节奏。节奏就是命令。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","secretary"], format:"plain"}, {entry_id:"apm_05", text:"一辆黑色轿车停在门口。引擎没熄。在等什么人。也许是部长,也许是麻烦。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","car"], format:"plain"} ], /* 总统府·傍晚 */ atmo_presidency_evening: [ {entry_id:"ape_01", text:"总统府的灯还亮着。总统没走。他总是在的。也许他不知道该怎么走。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","window"], format:"plain"}, {entry_id:"ape_02", text:"门口的卫兵换了班。新来的比走的更僵硬--夜班的规矩更严。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","guard"], format:"plain"}, {entry_id:"ape_03", text:"走廊里安静了。白天那些急促的脚步声消失了,取而代之的是钟摆的声音。这栋楼有自己的心跳。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","clock"], format:"plain"}, {entry_id:"ape_04", text:"窗外偶尔有车经过。车灯扫过窗帘,在天花板上画一条短暂的光线。然后暗了。然后又一条。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","light"], format:"plain"}, {entry_id:"ape_05", text:"你闻到雪茄味。不是总统的--他不抽雪茄。是访客留下的。雪茄味是一种权力的残留。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","cigar"], format:"plain"} ], /* 国会大厦·上午 */ atmo_reichstag_morning: [ {entry_id:"arm2_01", text:"玻璃穹顶在晨光里反着光。从外面看,里面的人成了玻璃罩子里跑动的蚂蚁。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","dome"], format:"plain"}, {entry_id:"arm2_02", text:"议员们还没到。走廊里只有清洁工在擦地板。她擦得很仔细,比议员们认真。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","cleaner"], format:"plain"}, {entry_id:"arm2_03", text:"议事厅空荡荡的。椅子上的人早已散去,一排等着坐下的嘴。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","chamber"], format:"plain"}, {entry_id:"arm2_04", text:"记者席上有人在打盹。他来得太早了。或者昨晚走得太晚了。新闻没有上下班时间。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","journalist"], format:"plain"}, {entry_id:"arm2_05", text:"走廊里的雪茄味还没散。昨天的密谈还在空气里。雪茄是另一种语言。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["smell","cigar"], format:"plain"} ], /* 国会大厦·傍晚 */ atmo_reichstag_evening: [ {entry_id:"are2_01", text:"穹顶在暮色中变成了黑色剪影。玻璃不再反光,变成了镜子--你能看到柏林的倒影映在上面。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","dome"], format:"plain"}, {entry_id:"are2_02", text:"议事厅里传出国歌声。散会了。国歌是最后一道程序,走个章的手续。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","anthem"], format:"plain"}, {entry_id:"are2_03", text:"走廊里有人在密谈。声音压得很低,低到只有雪茄的烟在动。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["sound","whisper"], format:"plain"}, {entry_id:"are2_04", text:"议员们鱼贯而出。有的快步走,有的慢吞吞。快的是有事要办,慢的是在等人。走路的快慢是一种信号。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","mp"], format:"plain"}, {entry_id:"are2_05", text:"门口停着一排汽车。引擎都在转。汽车和议员一样--来了就急着走。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["visual","car"], format:"plain"} ], /* ═══ 区域行为伪随机池("走一走"选项的文字变体)═══ */ /* 观察·平静状态 */ atmo_action_observe_calm: [ {entry_id:"aoc_01", text:"你放慢脚步,让自己变成背景的一部分。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe"], format:"plain"}, {entry_id:"aoc_02", text:"你找了个角落站定,站成一根柱子。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe"], format:"plain"}, {entry_id:"aoc_03", text:"你装作在看橱窗。橱窗里什么也没有,但你的眼睛不在橱窗上。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe"], format:"plain"}, {entry_id:"aoc_04", text:"你靠在墙边,点了一根烟。烟是真的,注意力是假的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe"], format:"plain"}, {entry_id:"aoc_05", text:"你站在人群边上,缩成一个逗号,不起眼,位置却讲究。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe"], format:"plain"} ], /* 观察·焦虑状态 */ atmo_action_observe_anxious: [ {entry_id:"aoa_01", text:"你的目光在扫。与其说在看,不如说在找。找什么,你也不确定。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe","anxiety"], format:"plain"}, {entry_id:"aoa_02", text:"你加快了脚步又放慢。这种犹豫比走快更引人注目。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe","anxiety"], format:"plain"}, {entry_id:"aoa_03", text:"你感到后颈在发紧。有人在身后。你回头了。身后空无一人。空无一人也是一种回答。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe","anxiety"], format:"plain"}, {entry_id:"aoa_04", text:"你的手不自觉地攥紧了口袋里的东西。口袋里什么也没有。但攥着让你安心。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe","anxiety"], format:"plain"}, {entry_id:"aoa_05", text:"你在一个路口停了太久。一个路人看了你一眼。你假装在等什么人。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","observe","anxiety"], format:"plain"} ], /* 走一走·通用 */ atmo_action_walk: [ {entry_id:"aaw_01", text:"你漫无目的地走。漫无目的是一种奢侈。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","walk"], format:"plain"}, {entry_id:"aaw_02", text:"你沿着街走,走到哪算哪。柏林的街没有方向,只有尽头。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","walk"], format:"plain"}, {entry_id:"aaw_03", text:"你的鞋底在石板上磨。声音很轻,但在空旷的街上格外清晰。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","walk"], format:"plain"}, {entry_id:"aaw_04", text:"你绕了一个弯。多看一眼,有时候是值得的。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","walk"], format:"plain"}, {entry_id:"aaw_05", text:"你走了一段时间。不知道多久。时间不用钟量,用脚步量。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["action","walk"], format:"plain"} ], /* ═══ 区域随机事件池("世界活过来")═══ 每个事件带条件:标签强度/世界变量/时段 进入区域时50%概率触发1个 */ /* 克罗伊茨贝格·随机事件 */ atmo_event_kreuzberg: [ {entry_id:"ek_01", text:"一个孩子拽着你的衣角:「先生,买份报吧。」报纸头版是马克汇率。汇率是什么,孩子不懂,他只知道今天要多卖几份。", conditions:[], weight:2, cooldown:0, last_picked:-1, tags:["encounter","child","economy"], format:"plain"}, {entry_id:"ek_02", text:"巷口有人在演讲。声音嘶哑但充满力量:「他们告诉我们忍耐。忍耐了四年!」人群在聚集。你站在边缘。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:20}], weight:1.5, cooldown:0, last_picked:-1, tags:["encounter","speech","left"], format:"plain"}, {entry_id:"ek_03", text:"墙上新贴了一张海报。一只鹰,爪子抓着一个你不认识的符号。下面写着「德国,醒醒!」浆糊还没干。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","poster","right"], format:"plain"}, {entry_id:"ek_04", text:"一个老妇人在面包店门口摔倒了。面包从她篮子里滚出来。周围不少人看见了,都装作没看见。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:40}], weight:1, cooldown:0, last_picked:-1, tags:["encounter","elderly","decency"], format:"plain"}, {entry_id:"ek_05", text:"两个工人在巷子里低声说话。你经过时他们停了。其中一个看了你三秒,继续说下去。词没听清,那种「不该被外人听到」的语气你听清了。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","whisper","worker"], format:"plain"} ], /* 蒂尔加滕·随机事件 */ atmo_event_tiergarten: [ {entry_id:"et_01", text:"一个退役将军叫住了你。他认出了你。「年轻人,」他说,「共和国需要军队,还是军队需要共和国?」不等你回答,他自己笑了:「别回答。这个问题连我也没想明白。」", conditions:[{type:"stat",key:"weimar.mid.army_dependence",op:"lte",val:50}], weight:1.5, cooldown:0, last_picked:-1, tags:["encounter","officer","question"], format:"plain"}, {entry_id:"et_02", text:"长椅上坐着一个穿貂皮大衣的女人。她旁边是一个独腿退伍兵。她在看报,他在看天。他们没有说话,但坐得很近。这种组合不奇怪。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","contrast"], format:"plain"}, {entry_id:"et_03", text:"你无意中听到两个军官的对话片段:「……不能再这样下去了……共和国……软弱……」他们看到你,立刻住了嘴。其中一个移开目光,另一个直直地盯着你。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:20}], weight:1.5, cooldown:0, last_picked:-1, tags:["rumor","officer","conspiracy"], format:"plain"}, {entry_id:"et_04", text:"一个年轻人在长椅上读尼采。书脊快散了。他看到你在看他的书,举了起来:「与怪物战斗的人,应当小心自己不要成为怪物。」他笑了:「这条建议每天都需要。」", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["encounter","student","philosophy"], format:"plain"}, {entry_id:"et_05", text:"运河边有人在放花。一朵,两朵,三朵。你没有问为什么。但在1919年,KPD的领袖被杀害后,尸体被扔进了这条运河。花也许是为他们。也许不是。花不问原因。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","canal","1919"], format:"plain"} ], /* 罗曼咖啡馆·随机事件 */ atmo_event_romanisches: [ {entry_id:"er_01", text:"邻桌两个记者在争论。一个声音说:「这不是通胀,这是物理学。物质正在从有意义变成无意义。」另一个说:「你喝多了。」第一个笑了:「我没喝多。我只是在用经济学解释形而上学。」", conditions:[], weight:2, cooldown:0, last_picked:-1, tags:["rumor","journalist","economy"], format:"plain"}, {entry_id:"er_02", text:"一个戴圆眼镜的学者叫住你。「你读过马克思?」他问。「谁没读过。」你说。「读过和读懂是两件事。」他往前倾了倾身子:「但你能说出这句话,说明你至少读懂了一半。坐吧。」", conditions:[], weight:1.5, cooldown:0, last_picked:-1, tags:["encounter","intellectual","marx"], format:"plain"}, {entry_id:"er_03", text:"服务生在你桌上放了一杯咖啡。你没点。「那位先生请的。」他指了指角落。角落里的人已经走了,只留下一杯咖啡的余温和一个空的烟盒。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"gte",val:50}], weight:1, cooldown:0, last_picked:-1, tags:["encounter","gift","mystery"], format:"plain"}, {entry_id:"er_04", text:"有人在你身后念诗。声音不大,每个字都落在桌上,一枚一枚硬币,清脆、精确、有分量。「诗比新闻真实,」他念完说,「因为诗不假装自己不是编的。」", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","poetry","truth"], format:"plain"}, {entry_id:"er_05", text:"一个记者凑过来低声问:「听说总理府那边要换人了。你知道什么吗?」你不知道。他这么一问,你倒觉得:也许你应该知道。被问问题本身就是一种信息。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:15}], weight:1.5, cooldown:0, last_picked:-1, tags:["rumor","journalist","politics"], format:"plain"} ], /* 亚历山大广场·随机事件 */ atmo_event_alexanderplatz: [ {entry_id:"ea_01", text:"一个黑市贩子凑过来:「要外汇吗?美元,荷兰盾。马克不要。」你没理他。他也没纠缠,转身去找下一个目标。被拒绝在他那里只是一次概率事件。", conditions:[], weight:2, cooldown:0, last_picked:-1, tags:["encounter","blackmarket","economy"], format:"plain"}, {entry_id:"ea_02", text:"一个孩子拽着你的衣角:「先生,买份报吧。」你看了看报纸。头版:马克对美元又创新低。「这还算新闻?」孩子耸肩:「这年头,什么算新闻?」", conditions:[], weight:1.5, cooldown:0, last_picked:-1, tags:["encounter","child","news"], format:"plain"}, {entry_id:"ea_03", text:"布告栏上贴着一张告示:禁止未经批准的集会。告示下面,有人用炭笔写了一行字:「批准由谁来批?」墨迹被雨水洇开了一半,每个字都还在。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","protest","authority"], format:"plain"}, {entry_id:"ea_04", text:"一个独腿退伍兵在卖火柴。乏人问津。他看到你在看,举了举火柴盒:「一盒火柴换一个故事。关于战争的。你听吗?」你没听。但你记住了他的脸。和火柴盒上的商标。", conditions:[{type:"stat",key:"weimar.surface.fatigue",op:"gte",val:30}], weight:1, cooldown:0, last_picked:-1, tags:["encounter","veteran","war"], format:"plain"}, {entry_id:"ea_05", text:"有轨电车叮叮当当驶过。车上有人朝窗外吐了口痰。痰落在一个穿西装的人肩上。那人抬头看了看车,没有骂。在亚历山大广场,愤怒是一种太贵的情绪。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","tram","city"], format:"plain"} ], /* 安哈尔特火车站·随机事件 */ atmo_event_anhalter: [ {entry_id:"eh_01", text:"女人抱着孩子从你身边走过。孩子睡着了。女人没有。她的眼睛盯着火车来的方向,等谁,你猜不出。也许在等一个不会再回来的人。", conditions:[], weight:2, cooldown:0, last_picked:-1, tags:["encounter","refugee","mother"], format:"plain"}, {entry_id:"eh_02", text:"一个招工佬凑过来:「要活儿吗?码头缺人。管饭。」他压低声音:「其余的不管。」你不确定「其余的」是什么。在安哈尔特,这两个字可以意味着很多事。", conditions:[{type:"stat",key:"weimar.surface.fatigue",op:"gte",val:20}], weight:1.5, cooldown:0, last_picked:-1, tags:["encounter","recruiter","work"], format:"plain"}, {entry_id:"eh_03", text:"站台上一列火车刚到。下来的人像被倒出来的样子。一个老人蹲在站台边,手里攥着一张皱巴巴的纸条。纸条上写着一个地址。他在找。在柏林,找是一种日常。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","refugee","search"], format:"plain"}, {entry_id:"eh_04", text:"红十字的护士在搅一锅灰色的糊。她看到你,问:「你也要一碗吗?」语气里没有施舍。在安哈尔特,稀粥是必要的口粮。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"lte",val:50}], weight:1, cooldown:0, last_picked:-1, tags:["encounter","nurse","food"], format:"plain"}, {entry_id:"eh_05", text:"候车大厅角落里有人在拉小提琴。曲子你认识,是《德意志之歌》。拉的人穿的是法国军装。也许是战俘。也许是别的什么。在安哈尔特,身份和制服对不上号是常事。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:15}], weight:1, cooldown:0, last_picked:-1, tags:["scene","music","irony"], format:"plain"} ], /* 通用街头事件池(无专属池的区域回退用) */ atmo_event_street: [ {entry_id:"es_01", text:"一个卖报童从你身边跑过,嗓门比风还大。你听到了一个词:「马克」。在柏林,这个词不需要上下文。", conditions:[], weight:2, cooldown:0, last_picked:-1, tags:["rumor","newsboy","economy"], format:"plain"}, {entry_id:"es_02", text:"一只狗跟着你走了半条街。它没有项圈。你停下来,它也停。你走,它也走。最后它在一个路口拐走了。在柏林,连狗都有自己的方向。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","dog","street"], format:"plain"}, {entry_id:"es_03", text:"一阵风把一张传单吹到你脸上。上面印着:「加入我们,拯救德意志!」落款是一个你没听过的组织。在柏林,每天都有一个新组织在拯救德意志。", conditions:[], weight:1.5, cooldown:0, last_picked:-1, tags:["scene","flyer","politics"], format:"plain"}, {entry_id:"es_04", text:"你踩到了什么。低头一看,是一枚硬币。面额已经买不了任何东西了。你捡起来放回地上。也许下一个人会用上。也许不会。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","coin","economy"], format:"plain"}, {entry_id:"es_05", text:"远处传来钟声。教堂没到点,响的是工厂的汽笛。换班了。汽笛一响,人流就动。", conditions:[], weight:1, cooldown:0, last_picked:-1, tags:["scene","whistle","factory"], format:"plain"} ], /* 军官俱乐部·随机事件 */ atmo_event_officers_club: [ {entry_id:"eoc_01", text:"吧台上一杯威士忌里冰块轻轻撞击。杯子旁放着一只皮手套,指节处已经泛白。手套的主人不在。冰块声在空椅间回响,一声接一声,接不上话。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","whiskey","privilege"], format:"plain"}, {entry_id:"eoc_02", text:"墙上挂着一张地图,铅笔圈层层叠叠。最新的圈压在旧的上面,颜色更深。旧圈没人擦掉,那些圈就是地质层。在军官俱乐部,战略靠累积,不靠替换。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","map","strategy"], format:"plain"}, {entry_id:"eoc_03", text:"雪茄剪咔哒一声咬合。烟头落在铜碟上,还在冒烟。剪雪茄的人没看你,他知道你在。在军官俱乐部,被注意到不需要目光,需要的是金属咬合的精确。", conditions:[{type:"stat",key:"world.army_influence",op:"gte",val:40}], weight:1.5, cooldown:1, last_picked:-1, tags:["encounter","cigar","ritual"], format:"plain"}, {entry_id:"eoc_04", text:"角落里有人低声说了一个词:「时机」。另一只手把一杯威士忌推过去,冰块声盖住了下半句。你只听见肩章上铜扣轻碰。在军官俱乐部,密谋的声音和碰杯声一个调。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:20}], weight:1.5, cooldown:2, last_picked:-1, tags:["rumor","conspiracy","officer"], format:"plain"} ], /* 卡巴莱·随机事件 */ atmo_event_kabarett: [ {entry_id:"ekb_01", text:"脚灯投出一圈橙色光晕,光晕里飘着烟尘。亮片从台缝里反光,像散落一地的星屑。手风琴风箱一伸一缩,空气被反复折叠。在卡巴莱,连呼吸都踩着节奏。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","spotlight","stage"], format:"plain"}, {entry_id:"ekb_02", text:"吧台上一只玻璃杯沿印着半圆口红。杯子空了,口红还在。旁边一沓皱巴巴的钞票压着一张纸条,字迹被酒渍洇开。在卡巴莱,交易不留名字,只留痕迹。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","glass","underworld"], format:"plain"}, {entry_id:"ekb_03", text:"萨克斯管的按键已经氧化,按下去发涩。乐手皱眉,没停。曲子因此多了一丝沙哑。台下没人介意,在卡巴莱,瑕疵也是一种商品,标好了价。", conditions:[{type:"stat",key:"weimar.surface.fatigue",op:"gte",val:20}], weight:1.5, cooldown:1, last_picked:-1, tags:["encounter","saxophone","economy"], format:"plain"}, {entry_id:"ekb_04", text:"后台有人压低嗓子:「明天换段子。」另一只手把一卷钞票塞进亮片鞋里。脚灯照不到这里。在卡巴莱,舆论的风向是凌晨三点后台改的,不是新闻版面定的。", conditions:[{type:"stat",key:"weimar.mid.democracy_trust",op:"lte",val:50}], weight:1.5, cooldown:2, last_picked:-1, tags:["rumor","backstage","opinion"], format:"plain"} ], /* 莫阿比特·随机事件 */ atmo_event_moabit: [ {entry_id:"em_01", text:"铁栅栏上结着一层霜花,手指碰上去会留下湿痕。栅栏后面是空地,空地后面是墙。在莫阿比特,距离按栅栏算,米尺量不出来。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","fence","cold"], format:"plain"}, {entry_id:"em_02", text:"走廊尽头的回声回来了三次。每过一扇铁门,回声就薄一层。门上的编号牌搪瓷剥落,数字只剩半边。在莫阿比特,身份是被磨掉的,不是确认出来的。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","corridor","number"], format:"plain"}, {entry_id:"em_03", text:"探视窗上糊着一层呼吸的雾。雾散了又起,起又散。窗那边的人没说话,只把一张纸条贴在玻璃上。纸条上的字你认不全,墨迹是新的。在莫阿比特,沉默也是一种交接。", conditions:[{type:"stat",key:"world.political_violence",op:"gte",val:40}], weight:1.5, cooldown:2, last_picked:-1, tags:["encounter","window","prisoner"], format:"plain"}, {entry_id:"em_04", text:"铁床架的锈迹爬到了第三根横档。有人说昨晚这间空了,怎么空的,问的人不多。墙根有一道擦痕,方向朝上。在莫阿比特,越狱算不上新闻,只能算回声的一种。", conditions:[{type:"stat",key:"weimar.surface.anxiety",op:"gte",val:20}], weight:1.5, cooldown:2, last_picked:-1, tags:["rumor","escape","prison"], format:"plain"} ], /* 波茨坦火车站·随机事件 */ atmo_event_potsdamer: [ {entry_id:"epd_01", text:"宫殿台阶的铜绿渗进了石缝。台阶上马车辙与汽车胎痕交叠,深浅不一。新辙压着旧辙,旧辙压着更旧的。在波茨坦,秩序是一层压一层压出来的。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","steps","order"], format:"plain"}, {entry_id:"epd_02", text:"钟楼的影子在广场上缓慢移动,一根不发声的指针。影子扫过煤气灯杆,扫过石板缝里的煤烟。煤烟今年比去年厚。在波茨坦,时间看得见,也闻得着。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","shadow","clock"], format:"plain"}, {entry_id:"epd_03", text:"候车室角落里两杯咖啡还冒着热气。椅子是空的,桌上却压着两张车票。车票的方向相反,时间却相同。在波茨坦,密会不需要人,只需要两杯没凉透的咖啡。", conditions:[{type:"stat",key:"world.gov_trust",op:"lte",val:50}], weight:1.5, cooldown:2, last_picked:-1, tags:["encounter","coffee","bureaucracy"], format:"plain"}, {entry_id:"epd_04", text:"月台尽头停着一节没挂牌的车厢。车窗帘拉得严实,窗帘角偶尔被气流掀起又落下。无人上下车,车厢的弹簧却在轻微起伏。在波茨坦,军事存在不挂牌,只挂窗帘。", conditions:[{type:"stat",key:"world.army_influence",op:"gte",val:40}], weight:1.5, cooldown:2, last_picked:-1, tags:["rumor","carriage","military"], format:"plain"} ], /* 总理府·随机事件 */ atmo_event_chancellery: [ {entry_id:"ec_01", text:"窗外传来一阵骚动。这样的声音每天都有,今天离得更近了。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","sound"], format:"plain"}, {entry_id:"ec_02", text:"走廊里的脚步声变密了。有人在跑。在总理府,跑意味着出事了。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","office"], format:"plain"}, {entry_id:"ec_03", text:"街上的报童换了头条。隔着玻璃看不清字,标题的长度说明了一切。", conditions:[{type:"stat",key:"world.inflation",op:"gte",val:50}], weight:1, cooldown:1, last_picked:-1, tags:["rumor","news"], format:"plain"}, {entry_id:"ec_04", text:"电话铃响了三次,无人去接。第四次的时候你听见了,找的人没有找你,你倒希望是。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["scene","phone"], format:"plain"}, {entry_id:"ec_05", text:"空气里有什么变了。温度没变,变的是密度。像暴风雨前的那种沉重,天上却没有云。", conditions:[{type:"stat",key:"world.political_violence",op:"gte",val:40}], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","tension"], format:"plain"} ], /* 总统府·随机事件 */ atmo_event_presidency: [ {entry_id:"ep2_01", text:"一个侍从端着银盘从你身边经过。盘子上放着一封信,信封上的火漆是总统徽记。他没有看你。在总统府,不看人是礼节的一部分。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","palace"], format:"plain"}, {entry_id:"ep2_02", text:"走廊尽头有人在低声争论。你听到了SPD的声音,另一个人的听不清。在总统府,另一个人的身份永远比声音本身更重要。", conditions:[{type:"stat",key:"world.gov_trust",op:"lte",val:50}], weight:1.5, cooldown:2, last_picked:-1, tags:["rumor","politics"], format:"plain"}, {entry_id:"ep2_03", text:"一面镜子映出你的脸。你几乎没认出自己。年纪没长,退场的是别的东西。在总统府的镜子里,每个人都像别人。", conditions:[{type:"stat",key:"player.mental.fatigue",op:"gte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["scene","mirror"], format:"plain"}, {entry_id:"ep2_04", text:"一辆马车停在门口。马在喷白气。车夫在打盹。无人上下车,马车也不走。在总统府,等待本身就是一种权力展示。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","carriage"], format:"plain"} ], /* 国会大厦·随机事件 */ atmo_event_reichstag: [ {entry_id:"er2_01", text:"一个议员拦住你。他的领带歪了,手里攥着一份修正案。「你觉得这个能过吗?」他问。你没来得及回答,他自己接上:「谁也说不准。这就是民主。」", conditions:[], weight:2, cooldown:1, last_picked:-1, tags:["encounter","mp","democracy"], format:"plain"}, {entry_id:"er2_02", text:"旁听席上坐着一群中学生。老师在低声解释表决流程。一个孩子举手问:「为什么投了票还是会输?」老师沉默了三秒:「这就是为什么叫投票,不叫赢票。」", conditions:[], weight:1.5, cooldown:2, last_picked:-1, tags:["scene","student","democracy"], format:"plain"}, {entry_id:"er2_03", text:"走廊里两个议员在交换烟。一个说:「你的票呢?」另一个说:「我的票在烟里。」他们都笑了。在国会大厦,交易有时候不需要钱。", conditions:[{type:"stat",key:"world.gov_trust",op:"lte",val:50}], weight:1.5, cooldown:2, last_picked:-1, tags:["rumor","deal","politics"], format:"plain"}, {entry_id:"er2_04", text:"穹顶下的光线穿过玻璃,在地板上画了一个圆。你站在圆心。脚下的石头是冷的。帝国的石头,共和国的地板。在国会大厦,你脚踩两个时代。", conditions:[{type:"stat",key:"player.mental.idealism",op:"gte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["scene","dome","history"], format:"plain"}, {entry_id:"er2_05", text:"速记员在角落里飞快地打字。她不看发言的人,只听声音。在国会大厦,文字比人更诚实,因为文字不会在说完之后改口。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","stenographer"], format:"plain"} ], /* 夏洛滕堡·随机事件 */ atmo_event_charlottenburg: [ {entry_id:"ec2_01", text:"两个军官从你身边走过。军装笔挺,马刺叮当。他们在说笑。其中一个的手,一直搭在另一个的剑柄附近。在夏洛滕堡,笑容和警惕可以同时存在。", conditions:[{type:"stat",key:"world.army_influence",op:"gte",val:40}], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","officer","army"], format:"plain"}, {entry_id:"ec2_02", text:"一个老太太牵着一条大丹狗。狗比她重。她停,狗也停。她走,狗也走。但你在想:到底是谁在遛谁。在夏洛滕堡,等级不是用职位量的。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","dog","class"], format:"plain"}, {entry_id:"ec2_03", text:"一扇窗户的窗帘动了一下。你抬头,窗帘已经回去了。在夏洛滕堡,有人总是在看,从不让你看到他在看。", conditions:[{type:"stat",key:"player.mental.paranoia",op:"gte",val:20}], weight:1.5, cooldown:2, last_picked:-1, tags:["scene","curtain","surveillance"], format:"plain"}, {entry_id:"ec2_04", text:"街角的咖啡馆里,一个男人在独自下棋。两边都是他。黑棋赢了。他站起来,付了两杯咖啡的钱。在夏洛滕堡,孤独是一种可以买得起的东西。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["scene","chess","solitude"], format:"plain"} ], /* 选帝侯大街·随机事件 */ atmo_event_kurfurstendamm: [ {entry_id:"ek2_01", text:"一个女人的皮草大衣拖在地上。大衣的下摆是湿的,人是干的。在选帝侯大街,财富可以从细节里漏出来,但不会从全身漏出来。", conditions:[{type:"stat",key:"world.economy",op:"gte",val:30}], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","wealth","class"], format:"plain"}, {entry_id:"ek2_02", text:"橱窗里的霓虹灯拼出一个单词。你认了半天,是'Kino'。电影院。灯有三个字母不亮了,你还是看懂了。在选帝侯大街,即使坏掉的东西也在炫耀。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["scene","neon","cinema"], format:"plain"}, {entry_id:"ek2_03", text:"一个男人在数钞票。一叠,两叠,三叠。他的表情没有快乐,只有确认。在选帝侯大街,数钱不为快乐,只为确认。", conditions:[{type:"stat",key:"world.inflation",op:"gte",val:40}], weight:1.5, cooldown:2, last_picked:-1, tags:["scene","money","inflation"], format:"plain"}, {entry_id:"ek2_04", text:"一个卖花女孩把一枝玫瑰塞到你手里。「送你的。」她笑。你还没来得及拒绝,她已经跑了。你低头看玫瑰--花瓣边缘已经开始枯了。在选帝侯大街,免费的东西保质期最短。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["encounter","flower","gift"], format:"plain"} ], /* 威丁·随机事件 */ atmo_event_wedding: [ {entry_id:"ew2_01", text:"一面墙上刷着红漆标语:「一切权力归苏维埃」。红漆还在流。有人刚刷的。在威丁,墙比报纸更快地传播消息。", conditions:[{type:"stat",key:"world.revolution",op:"gte",val:30}], weight:2, cooldown:1, last_picked:-1, tags:["scene","slogan","left"], format:"plain"}, {entry_id:"ew2_02", text:"一个工人在街角擦手。手上的油洗不掉,他还是擦。在威丁,干净是一种向往,不是一种状态。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["encounter","worker","labor"], format:"plain"}, {entry_id:"ew2_03", text:"一排人在排队。你不确定他们在排什么。队尾的人也不确定。队伍却没有散。在威丁,排队本身就是一种信仰,你排了,就有可能。", conditions:[{type:"stat",key:"world.economy",op:"lte",val:50}], weight:1.5, cooldown:2, last_picked:-1, tags:["scene","queue","poverty"], format:"plain"}, {entry_id:"ew2_04", text:"一个孩子在街边吹口琴。曲子是《国际歌》。他吹错了三个音,节奏是对的。在威丁,对的是节奏,不是音。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["scene","music","left"], format:"plain"} ], /* 弗里德里希斯海因·随机事件 */ atmo_event_friedrichshain: [ {entry_id:"ef2_01", text:"工厂门口的烟囱在冒烟。白烟,不是黑烟。白烟意味着还在烧,黑烟意味着烧完了。在弗里德里希斯海因,烟的颜色就是经济晴雨表。", conditions:[{type:"stat",key:"world.economy",op:"gte",val:30}], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","factory","economy"], format:"plain"}, {entry_id:"ef2_02", text:"一个工人靠在墙上抽烟。烟卷是自己卷的,纸比烟多。他看到你,点了点头。在弗里德里希斯海因,点头就是全部的寒暄。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["encounter","worker","smoke"], format:"plain"}, {entry_id:"ef2_03", text:"街角有人在刷传单。浆糊的气味比墨汁还重。传单上印着一个拳头。在弗里德里希斯海因,拳头不需要解释自己属于谁。", conditions:[{type:"stat",key:"world.political_violence",op:"gte",val:30}], weight:1.5, cooldown:2, last_picked:-1, tags:["scene","flyer","left"], format:"plain"}, {entry_id:"ef2_04", text:"一只猫从工厂围墙上跳下来。它嘴里叼着什么。不是老鼠--是一块抹布。在弗里德里希斯海因,猫也不挑食了。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["scene","cat","street"], format:"plain"} ], /* 勃兰登堡门·随机事件 */ atmo_event_brandenburg: [ {entry_id:"eb2_01", text:"一支游行队伍从门下穿过。横幅上写着一个口号,风把字吹折了,你只看到了前半句。在勃兰登堡门,口号的下半句总是在风里。", conditions:[{type:"stat",key:"world.political_violence",op:"gte",val:40}], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","protest","politics"], format:"plain"}, {entry_id:"eb2_02", text:"一个游客在门下拍照。他的相机是新的,鞋是旧的。在勃兰登堡门,人们用新机器记录旧伤痛。", conditions:[], weight:1, cooldown:2, last_picked:-1, tags:["encounter","tourist","symbol"], format:"plain"}, {entry_id:"eb2_03", text:"一个老兵站在门柱旁。他不看门,也不看人,只看自己的鞋尖。他的勋章别在胸口,别反了。在勃兰登堡门,勋章的方向不影响它的重量。", conditions:[{type:"stat",key:"world.nationalism",op:"gte",val:40}], weight:1.5, cooldown:2, last_picked:-1, tags:["encounter","veteran","war"], format:"plain"}, {entry_id:"eb2_04", text:"四马铜车在头顶。马的头朝东。是在前进还是在后退,全看你站在哪一边。", conditions:[{type:"stat",key:"player.mental.idealism",op:"gte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["scene","quadriga","symbol"], format:"plain"} ], /* 菩提树下大街·随机事件 */ atmo_event_unter_den_linden: [ {entry_id:"el2_01", text:"一个教授模样的老人在树下踱步。他在自言自语,声音不大,你听清了一个词:「荒谬」。在菩提树下大街,荒谬是一种学术课题,也是一种日常体验。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["encounter","professor","philosophy"], format:"plain"}, {entry_id:"el2_02", text:"一辆豪华轿车从你身边驶过。车窗是关的,你却觉得有人在看。被看的其实并非你,是你在的那条街。", conditions:[{type:"stat",key:"player.mental.paranoia",op:"gte",val:20}], weight:1, cooldown:2, last_picked:-1, tags:["scene","car","class"], format:"plain"}, {entry_id:"el2_03", text:"两个学生模样的年轻人在辩论。一个说「尼采」,另一个说「马克思」。谁也没说服谁,两个人都笑了。在菩提树下大街,辩论不为赢,只为证明还能辩。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["encounter","student","debate"], format:"plain"}, {entry_id:"el2_04", text:"树影在地上移动。风吹不动它,动它的是时间。在菩提树下大街,树比人更耐心,因为树知道秋天还会来。", conditions:[{type:"stat",key:"player.mental.idealism",op:"gte",val:50}], weight:1, cooldown:2, last_picked:-1, tags:["scene","tree","time"], format:"plain"} ], /* 鲁尔/埃森·随机事件 */ atmo_event_ruhr: [ {entry_id:"eu2_01", text:"一队法国士兵从你面前走过。刺刀在阳光下闪。他们的步子很齐,脸上的表情不齐。", conditions:[], weight:2, cooldown:1, last_picked:-1, tags:["encounter","soldier","occupation"], format:"plain"}, {entry_id:"eu2_02", text:"一个矿工坐在路边的石头上。他的脸是黑的,眼白是白的。他没看你,盯着矿井的方向。在鲁尔,矿井比家更像归宿。", conditions:[{type:"stat",key:"world.economy",op:"lte",val:40}], weight:1.5, cooldown:2, last_picked:-1, tags:["encounter","miner","labor"], format:"plain"}, {entry_id:"eu2_03", text:"一面墙上用粉笔画着一幅画:一只公鸡被钉在十字架上。下面写着:'Vive la France'。有人用泥巴把字盖了一半。在鲁尔,嘲讽是唯一不会被没收的武器。", conditions:[{type:"stat",key:"world.nationalism",op:"gte",val:40}], weight:1.5, cooldown:2, last_picked:-1, tags:["scene","graffiti","resistance"], format:"plain"}, {entry_id:"eu2_04", text:"火车汽笛响了。运煤的车,声比客车的闷。今天的煤车上坐满了人,工人坐着煤车离开了鲁尔。在鲁尔,连离开都要搭煤的车。", conditions:[{type:"stat",key:"world.social_anger",op:"gte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["scene","train","exodus"], format:"plain"} ], /* 慕尼黑·随机事件 */ atmo_event_munich: [ {entry_id:"em2_01", text:"一个穿皮裤的男人在啤酒馆门口撒尿。他吹着口哨,调子是《德意志之歌》。在慕尼黑,爱国主义有时候从膀胱开始。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","beer","bavaria"], format:"plain"}, {entry_id:"em2_02", text:"一面墙上贴着一张集会海报。时间是今晚,地点是一个啤酒馆。海报上没有写政党名字,颜色你认识:红底白圆。在慕尼黑,有些颜色比文字更大声。", conditions:[{type:"stat",key:"world.nationalism",op:"gte",val:40}], weight:2, cooldown:2, last_picked:-1, tags:["scene","poster","right"], format:"plain"}, {entry_id:"em2_03", text:"一个警察在街角站着。他的手放在腰带上,离配枪很近。他不在看任何人,他在看所有人。在慕尼黑,秩序的维护者比秩序本身更紧张。", conditions:[{type:"stat",key:"world.political_violence",op:"gte",val:40}], weight:1.5, cooldown:2, last_picked:-1, tags:["scene","police","tension"], format:"plain"}, {entry_id:"em2_04", text:"天主教堂的钟响了。一下,两下,三下。你数到第七下停了手,钟还在响,你不想再数了。在慕尼黑,信仰和疲惫共用同一口钟。", conditions:[{type:"stat",key:"player.mental.fatigue",op:"gte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["scene","church","bell"], format:"plain"} ], /* 汉堡·随机事件 */ atmo_event_hamburg: [ {entry_id:"eh2_01", text:"码头的起重机在动。吊臂很慢,一只疲倦的手臂,够什么东西。在汉堡,速度是奢侈的,慢才是常态。", conditions:[], weight:1.5, cooldown:1, last_picked:-1, tags:["scene","dock","crane"], format:"plain"}, {entry_id:"eh2_02", text:"一个水手靠在缆绳柱上。他在喝朗姆酒,瓶子已经见底。他看到你,举了举瓶子:「最后的。」在汉堡,「最后的」可以是酒,也可以是别的。", conditions:[{type:"stat",key:"world.economy",op:"lte",val:40}], weight:1.5, cooldown:2, last_picked:-1, tags:["encounter","sailor","drink"], format:"plain"}, {entry_id:"eh2_03", text:"一面墙上刷着红漆:'KPD'。没有别的话。在汉堡,三个字母本身就是口号。", conditions:[{type:"stat",key:"world.revolution",op:"gte",val:30}], weight:2, cooldown:2, last_picked:-1, tags:["scene","slogan","left"], format:"plain"}, {entry_id:"eh2_04", text:"鱼市上一个鱼贩在喊价。他的嗓门比海鸥还大。鱼是冷的,他的手是热的。在汉堡,热和冷可以同时存在一个人身上。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["encounter","fishmonger","market"], format:"plain"} ], /* 第三段:玩家感知(按玩家状态过滤) */ echo_perception: [ {entry_id:"ep_01", text:"你注意到自己的手在抖。怪咖啡喝多了,还是怪别的,也许两者都有份。", conditions:[{type:"stat",key:"player.mental.fatigue",op:"gte",val:31}], weight:1, cooldown:1, last_picked:-1, tags:["perc","fatigue"], format:"plain"}, {entry_id:"ep_02", text:"你开始分不清这是第几次做同样的选择了。也许选择本身才是问题。", conditions:[{type:"stat",key:"player.mental.fatigue",op:"gte",val:50}], weight:1, cooldown:2, last_picked:-1, tags:["perc","fatigue"], format:"plain"}, {entry_id:"ep_03", text:"你下意识地看了一眼门口。门口没有来人,你只是想确认自己还能走。", conditions:[{type:"stat",key:"player.mental.paranoia",op:"gte",val:15}], weight:1, cooldown:1, last_picked:-1, tags:["perc","paranoia"], format:"plain"}, {entry_id:"ep_04", text:"你想起了一些不该这时候想起的东西。1914年的夏天。那时候一切也「还好」。", conditions:[{type:"stat",key:"player.mental.idealism",op:"gte",val:40}], weight:1, cooldown:2, max_uses:3, last_picked:-1, tags:["perc","memory"], format:"plain"}, {entry_id:"ep_05", text:"你什么都没感觉到。这已经谈不上平静,是麻木。两者之间的区别,在柏林已经不重要了。", conditions:[{type:"stat",key:"player.mental.fatigue",op:"gte",val:61}], weight:1.5, cooldown:1, last_picked:-1, tags:["perc","numb"], format:"plain"}, {entry_id:"ep_06", text:"你感觉自己还活着。这本身就已经是一种成就了。", conditions:[], weight:1, cooldown:2, max_uses:3, last_picked:-1, tags:["perc","alive"], format:"plain"} ], /* 第二段:环境反应(按世界状态过滤) */ echo_environment: [ {entry_id:"en_01", text:"窗外,一队工人沉默地走过。口号一喊,反倒好懂了。这种沉默更让你不安。", conditions:[{type:"stat",key:"world.social_anger",op:"gte",val:30}], weight:2, cooldown:1, max_uses:3, last_picked:-1, tags:["env","worker","silence"], format:"plain"}, {entry_id:"en_02", text:"远处的工厂汽笛响了。这个点不该换班,是警报。有人在外面跑。", conditions:[{type:"stat",key:"world.political_violence",op:"gte",val:30}], weight:1.5, cooldown:2, last_picked:-1, tags:["env","alarm"], format:"plain"}, {entry_id:"en_03", text:"报童的嗓门又大了。他不需要喊内容,只需要喊数字--马克的数字。", conditions:[{type:"stat",key:"world.inflation",op:"gte",val:40}], weight:0.6, cooldown:4, last_picked:-1, tags:["env","newsboy","inflation"], format:"plain"}, {entry_id:"en_04", text:"街上多了一群穿军装的人。他们不在行军,只是在散步。散步的步伐太齐了。", conditions:[{type:"stat",key:"world.army_influence",op:"gte",val:30}], weight:1.5, cooldown:2, last_picked:-1, tags:["env","army","presence"], format:"plain"}, {entry_id:"en_05", text:"一面墙上新刷了红漆。字还没干,刷漆的人你猜得到。KPD的符号在湿漆里反着光。", conditions:[{type:"stat",key:"world.revolution",op:"gte",val:25}], weight:1.5, cooldown:2, last_picked:-1, tags:["env","graffiti","left"], format:"plain"}, {entry_id:"en_06", text:"一面墙上贴着新海报。鹰,爪子,卐字。浆糊还没干。你经过时闻到了浆糊的酸味。", conditions:[{type:"stat",key:"world.nationalism",op:"gte",val:30}], weight:1.5, cooldown:2, last_picked:-1, tags:["env","poster","right"], format:"plain"}, {entry_id:"en_07", text:"咖啡馆里比往常安静。几桌人低着头说话,用手挡着嘴。在柏林,低声说话比大声争论更凶险。", conditions:[{type:"stat",key:"world.political_violence",op:"gte",val:20}], weight:1, cooldown:1, last_picked:-1, tags:["env","cafe","whisper"], format:"plain"}, {entry_id:"en_08", text:"面包店门口排的队又长了。队伍一声不响,在风里缩着。", conditions:[{type:"stat",key:"world.economy",op:"gte",val:40}], weight:1.5, cooldown:1, last_picked:-1, tags:["env","queue","poverty"], format:"plain"}, {entry_id:"en_09", text:"电话铃响了。隔壁办公室的,响了很久,无人去接。在总理府,没人接的电话通常意味着坏消息。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["env","phone","office"], format:"plain"}, {entry_id:"en_10", text:"风从窗户缝里挤进来,带着煤灰和某种说不清的焦味。柏林的冬天闻起来像什么东西在慢慢烧。", conditions:[], weight:1, cooldown:1, last_picked:-1, tags:["env","smell","winter"], format:"plain"}, {entry_id:"en_11", text:"走廊里有人在等。等谁,你猜不出。他已经等了很久。在总理府,等待是一种职业。", conditions:[{type:"stat",key:"world.gov_trust",op:"lte",val:40}], weight:1, cooldown:2, last_picked:-1, tags:["env","waiting"], format:"plain"}, {entry_id:"en_12", text:"一辆马车从街上驶过。马蹄声在石板路上敲出回响。窗帘动了一下。有人往外看了一眼,又拉上了。", conditions:[{type:"stat",key:"player.mental.paranoia",op:"gte",val:20}], weight:1, cooldown:2, last_picked:-1, tags:["env","carriage","surveillance"], format:"plain"} ], /* 第四段:隐藏暗示(低概率出现,按历史锚点/遗产过滤) */ echo_hint: [ {entry_id:"eh_01", text:"某个角落里,有人在记笔记。记的是谁,你无从得知。你做的每一件事,都会出现在某本未来的书里。", conditions:[], weight:1, cooldown:3, last_picked:-1, tags:["hint","future"], format:"italic"}, {entry_id:"eh_02", text:"墙上威廉二世的画像被布盖着。风一吹,布面绷出一个人低头的轮廓。它在看什么,你不想知道。", conditions:[], weight:1, cooldown:3, last_picked:-1, tags:["hint","empire"], format:"italic"}, {entry_id:"eh_03", text:"凡尔赛的回声没有停过。你以为他走了,他只是在换一种调子。", conditions:[{type:"stat",key:"world.nationalism",op:"gte",val:50}], weight:1.5, cooldown:2, last_picked:-1, tags:["hint","versailles"], format:"italic"}, {entry_id:"eh_04", text:"1933年还没有来。他的影子已经候在走廊尽头。你不看他,他就不在吗?", conditions:[{type:"stat",key:"weimar.personality_tension",op:"gte",val:2}], weight:2, cooldown:3, last_picked:-1, tags:["hint","1933"], format:"italic"}, {entry_id:"eh_05", text:"你突然想起一个不相干的问题:一栋楼倒塌之前,住在里面的人,是先听到声音,还是先感觉到震动?", conditions:[{type:"stat",key:"world.economy",op:"gte",val:60}], weight:1.5, cooldown:3, last_picked:-1, tags:["hint","collapse"], format:"italic"} ] }>> /* ---------- 【主动对话系统】玩家动作池(V1.2 需求文档 §3)---------- 12个动作,4类。每个动作隐含可预测的数值影响方向。 effects 里的字段名对应 $weimar / $player 的路径。 */ <<set $dialogue_actions to [ /* 信息类 Inform */ {id:"inform_daily", label:"你向魏玛介绍了今天柏林街头的见闻。", category:"inform", reaction_tag:"informed", effects:{"npcs.weimar.trust":1, "weimar.mid.intl_trust":1}, openers:["街上的事?你每天都能带回一些我没看到的碎片。","外面又有什么了?你说吧,我听着。","柏林每天都在变,但有些东西从来没变过。你今天看到了什么?"], responses:[ {tone:"calm", text:"街头的事,你每天都能带回一些我没看到的碎片。窗外的情形,比文件上写的鲜活。"}, {tone:"calm", text:"新见闻?你讲吧。柏林的消息,我宁可听你讲,也不愿看那些干巴巴的简报。"}, {tone:"anxious", text:"街上又有什么了?你今天带回来的消息,听着比前几天更沉。你说,我听着。"}, {tone:"numb", text:"你说了街上的事。我听着,但有些话进去了,有些没进去。你讲你的,我陪你坐着。"} ]}, {id:"explain_policy", label:"你向魏玛解释了你在某项决策上的立场。", category:"inform", reaction_tag:"informed", effects:{"weimar.mid.democracy_trust":3, "npcs.weimar.trust":1}, openers:["解释政策?好,你说。我听着,同不同意另说。","你说得对,有些决定需要解释清楚。我在听。","你总有你的道理。说来听听吧。"], responses:[ {tone:"calm", text:"你解释你的立场。好,我听。你说得有没有道理,我自己会判断。"}, {tone:"anxious", text:"你解释政策的时候,我总在想:纸上的道理,到了街上还对不对。你继续说,我尽量跟上。"}, {tone:"numb", text:"你说明你的决定。我没什么可反驳的,也没力气反驳。你定吧。"} ]}, {id:"report_event", label:"你向魏玛汇报了刚刚发生的重大事件。", category:"inform", reaction_tag:"informed", effects:{"weimar.surface.anxiety":5, "npcs.weimar.trust":1}, openers:["那件事我收到消息了,我想先听听你怎么说。","你来了。我知道你有话要说。说吧,电报上的字太冷了。","事情发生了。我看到了文件,文件不会说话。你会。"], responses:[ {tone:"calm", text:"那件事我收到线报了,但电报太冷。你说给我听,我更像听见了真事。"}, {tone:"anxious", text:"你提起那件事……我本来想避开它。你讲吧,至少讲的时候,它只是话,不是电报。"}, {tone:"numb", text:"那件事我听说了。你再说一遍,我当是多听一次。反正睡觉前它也会自己找上来。"} ]}, {id:"share_rumor", label:"你向魏玛提到了街头流传的流言。", category:"inform", reaction_tag:"informed", effects:{"weimar.surface.anxiety":5, "player.mental.paranoia":1}, openers:["流言?在柏林,流言比报纸跑得快。你听到了什么?","街上的人在说什么?你告诉我,我不确定我想知道,但我需要知道。","有些话在走廊里传得比风还快。你也听到了?"], responses:[ {tone:"calm", text:"街头流言?柏林的风向来比报纸跑得快。你说,我记下该记的。"}, {tone:"anxious", text:"流言……我最怕的就是流言。它没有出处,却比电报准。你说,我听着。"}, {tone:"numb", text:"流言。到处都有人在传。你说你的版本,我听着,听过就忘。"} ]}, {id:"report_affairs", label:"你向魏玛报告了今天处理的事务。", category:"report", reaction_tag:"informed", effects:{"weimar.surface.anxiety":3, "npcs.weimar.trust":1}, openers:["你今天处理的事,我知道一些。你说给我听,我会再听一遍。","忙了一天了。说吧,你做了什么,我听听。","你的报告我看了。可我想听你说,不想看纸。"], responses:[ {tone:"calm", text:"你今天经手的事,我知道一些。你当面说给我听,我会再听一遍。"}, {tone:"anxious", text:"你今天处理的事,我听着。你经手的每一件,都牵着一片我不知道的地方。"}, {tone:"numb", text:"你的报告我看了。你愿意当面说,我就当面听。说慢点也行。"} ]}, /* 情感类 Emotion */ {id:"comfort", label:"你试图安抚魏玛,告诉他一切都会好起来。", category:"emotion", reaction_tag:"comforted", effects:{"weimar.surface.anxiety":-8, "weimar.surface.fatigue":-3, "weimar.personality_tension":-1, "player.mental.fatigue":2}, openers:["你是在安慰我,还是在安慰你自己?……算了,不管怎样,谢谢。","你总想把事情变好。这份心是真的。","你说会好的。我信你。虽然我不太信这句话,但我信你。"], responses:[ {tone:"calm", text:"你安慰我。我知道你是真心的。这话听多了,我仍会把它当真接住。"}, {tone:"calm", text:"你说会好的。我信这一句。哪怕这信毫无根据,我也想先信着。"}, {tone:"calm", text:"你把手搭在我肩上。你没说会好,就只是待在那儿。我忽然没来由地觉得,今天能撑到底。"}, {tone:"anxious", text:"你替我把它说成『会好起来』。我抓着这几个字,抓着一根漂在水上的木头。"}, {tone:"anxious", text:"你安慰我,可你的眉头也是皱着的。你没瞒我,这让我比听一句谎更要安心。"}, {tone:"numb", text:"你安慰我。我听见了,谢谢你。只是我今天接不住,你先放着,等我攒够力气。"} ]}, {id:"encourage", label:"你鼓励魏玛坚持下去,强调共和国的价值。", category:"emotion", reaction_tag:"comforted", effects:{"weimar.mid.democracy_trust":5, "weimar.core.will_to_exist":2, "weimar.personality_tension":1, "player.mental.idealism":-2}, openers:["你让我坚持下去。这句话我听了多少遍了?……我还是想听。","你又在推我往前走了。这条路我走得很累,你推的时候,我没那么想停。","你总说「撑住」。我撑了这么久了。你还在说,我就还在撑。"], responses:[ {tone:"calm", text:"你劝我撑住。这条路我走了太久,你推的时候,我至少知道有人不愿我停。"}, {tone:"anxious", text:"你让我相信共和国值得撑下去。我信,我只是怕信得不够久。你再说一次,我多撑一段。"}, {tone:"numb", text:"鼓励的话,我听过很多。你这份,我记下了。撑不撑得住,明天再看。"} ]}, {id:"empathize", label:"你对魏玛表达了理解,承认现状确实艰难。", category:"emotion", reaction_tag:"empathized", effects:{"weimar.surface.anxiety":-5, "weimar.surface.fatigue":-5, "weimar.personality_tension":-1}, openers:["你说你理解。你真的理解吗?还是只是想让事情变得好过一点?……没关系,你说了我就信。","你这句话,比今天任何人说的都重。我会记住的。","你懂我。我不知道你是怎么做到的,但你能说出这种话,说明你确实在看着我。"], responses:[ {tone:"calm", text:"你说你懂我。这句话,比今天所有人说的都重。谢谢你,我记下了。"}, {tone:"calm", text:"你没有说『我理解你的难处』那种场面话。你只说,换作我在你的位置,我未必撑得比你久。我愣了一下。"}, {tone:"anxious", text:"你承认现状艰难。这不是安慰,是承认。这比安慰更让我站得住。"}, {tone:"numb", text:"你说你理解。夜深了,有人愿意说我理解,我听着,心里暖了一点。"} ]}, {id:"confront", label:"你质问魏玛为什么如此软弱。", category:"emotion", reaction_tag:"confronted", effects:{"weimar.personality_tension":3, "weimar.surface.anxiety":10, "weimar.mid.army_dependence":5, "npcs.weimar.trust":-3}, openers:["质问。终于有人开口问我了。问的是我这个人,连共和国的壳都替我脱了。","你问我为什么这样。我也想问自己同样的问题。","你说话很直。在柏林,直话通常活不长。你既然说出来了,我就听着。"], responses:[ {tone:"calm", text:"你质问我为什么软弱。问得好。我也问过自己,问得比你还狠。"}, {tone:"calm", text:"你逼视着我,要我回答。我张了张嘴,却发现自己准备好的那些『形势所迫』,在你面前一个字都说不出口。"}, {tone:"anxious", text:"你直问我的软弱。这句话推开一扇窗,风灌进来,我一时站不稳。"}, {tone:"anxious", text:"你越说越急,我退了一步。怕你倒在其次,我怕自己真会顺着你的话,把最后的骨气也交出去。"}, {tone:"numb", text:"你质问我。我连解释的力气都没有。你若要答案,我大概给不出像样的。"} ]}, {id:"vent", label:"你向魏玛发泄了今天积累的挫败与愤怒。", category:"emotion", reaction_tag:"confronted", effects:{"player.mental.fatigue":-10, "weimar.surface.anxiety":10, "weimar.mid.democracy_trust":-5, "npcs.weimar.trust":-2}, openers:["你也有话要说。说吧,我听。这栋楼里愿意听的人不多。","你今天憋了很久了吧。我听,我不打断。","你说。有时候你先说了,我反而能说得出话来。"], responses:[ {tone:"calm", text:"你今天憋了很多吧。你说,我听着,不打断。这楼里愿意听的人不多。"}, {tone:"calm", text:"你冲我发完火,屋里安静下来。你没道歉,我也没安慰你。但我们都知道,这火不冲我发,你会自己烧完。"}, {tone:"anxious", text:"你发火的样子,我见过不少。你发吧,发出来总比烧在里面强。"}, {tone:"anxious", text:"你骂得越大声,我越不接话。等你说完,我递给你一杯水。你气的是这个国家,这杯水接不住。"}, {tone:"numb", text:"你发泄你的愤怒。我听着,像听远处的雷。雷声近,雨落不到我身上。"} ]}, /* 询问类 Inquire */ {id:"ask_feeling", label:"你询问魏玛现在感觉如何。", category:"inquire", reaction_tag:"inquired", effects:{"npcs.weimar.trust":1, "player.mental.fatigue":2}, openers:["你问我感觉如何。想听真话,还是想听我该说的话?……问真话,我就给真话。","感觉?我每天都在感觉。今天的感觉是,我还活着。","你想知道我今天怎么样?……你坐下吧,这问题一句话说不完。"], responses:[ {tone:"calm", text:"你想听真话,还是想听该说的话?……你问了真话,我就说真话:今天我还撑得住。"}, {tone:"anxious", text:"像站在一扇没锁的门边,不知门后是风还是墙。"}, {tone:"numb", text:"感觉?今天没什么感觉。这大概就是我今天的感觉,没有感觉。"} ]}, {id:"ask_fear", label:"你问魏玛现在最害怕的是什么。", category:"inquire", reaction_tag:"inquired", effects:{"weimar.personality_tension":2, "weimar.surface.anxiety":3, "npcs.weimar.trust":2}, openers:["你问我怕什么。这个问题我白天不会去想,晚上它会自己来找我。","你确定你想知道吗?好。我怕的是死,更怕死之前发现我已经不是我了。","我梦见1919年。醒着的时候也看见它。你问我怕什么?我怕的就是这句话。"], responses:[ {tone:"calm", text:"你问我怕什么。这个问题白天我不碰,晚上它自己来找我。你要听,我就说。"}, {tone:"anxious", text:"死我不怕。我怕的是死之前发现,我已经换成了另一个我。"}, {tone:"numb", text:"怕?我连怕的力气都攒不起来了。你问这个,我答不上来。"} ]}, {id:"ask_dream", label:"你问魏玛昨晚睡得好吗。", category:"inquire", reaction_tag:"inquired", effects:{"npcs.weimar.trust":1, "weimar.surface.fatigue":-2, "player.mental.fatigue":2}, openers:["你问我昨晚睡得好不好?你是第一个这么问的人。","睡?睡了。但那种睡不叫休息,叫断电。","昨晚我睡着了。睡了三个小时。在柏林,三个小时算好的。"], responses:[ {tone:"calm", text:"你问昨晚睡得好不好。睡了,但那种睡不叫休息,叫断电。"}, {tone:"anxious", text:"昨晚没怎么睡。一闭眼,1918年的动静全回来了。你问这个,是怕我撑不住吧。"}, {tone:"numb", text:"睡不好也不记得睡没睡了。你问这个,我谢谢,但别担心。"} ]}, /* 行动类 Action */ {id:"silent_listen", label:"你什么也没说,只是静静地陪着他。", category:"action", reaction_tag:"listened", effects:{"weimar.surface.anxiety":-3, "weimar.personality_tension":-1, "npcs.weimar.trust":1}, openers:["你什么都不说。有时候不说话比说话更重。","你只是站着。我不确定你是不知道说什么,还是什么都不用说。……也许后者。","你陪了我一会儿。这种沉默,比任何话都管用。"], responses:[ {tone:"calm", text:"你什么都不说。有时候,沉默比话更重。你陪着我,我其实缺的就是这个。"}, {tone:"calm", text:"你只是在我身边坐下,什么都没说。窗外的天黑下去,可屋里那盏灯,好像久违地暖了一回。"}, {tone:"anxious", text:"你只是站着,不说话。这比你开口更让我安心。起码这一刻,有人陪我待着。"}, {tone:"anxious", text:"你没问,我反而说得出来。你坐到我旁边,我断断续续讲了整晚。你不必听懂,你在就够了。"}, {tone:"numb", text:"你不说话,只陪着我。就这样吧,这样挺好。"} ]}, {id:"change_topic", label:"你转移了话题,聊起了无关紧要的事。", category:"action", reaction_tag:"listened", effects:{"weimar.personality_tension":-1, "weimar.surface.anxiety":-2}, openers:["你换了个话题。也好,有些话说到一半就该停了。","你不想谈那个了。行,我顺着你。今天我们不说那些事。","你绕开了。你为什么绕,我清楚。没关系,我陪你绕。"], responses:[ {tone:"calm", text:"你转了个话题。也好,有些话说到一半就该停。今天不说那些。"}, {tone:"calm", text:"你忽然说起菜市场今天多便宜。我愣了一下,忍不住笑了。在柏林,有人愿意陪你聊柴米油盐,是一种奢侈。"}, {tone:"anxious", text:"你绕开了那个话题。你为什么不绕不行,我明白。"}, {tone:"numb", text:"你说别的吧。我顺着你,反正今天说什么都一样。"} ]}, {id:"leave", label:"你起身准备离开。", category:"action", reaction_tag:"listened", effects:{}, openers:["你要走了。……也好,我该习惯一个人待着了。","你走了,门关上的声音我听得见。明天你还会来吗?……算了,不用回答。","你走的时候,走廊里有风。你走之后,风停了。"]} ]>> /* ---------- 【对话系统状态】全局持久(跨passage) ---------- */ <<set $dialogue_turn to 0>> /* 当前对话回合数(深度递进用) */ <<set $dialogue_recent to []>> /* 最近5条对话entry_id(防重用) */ <<set $weimar_dialogue_line to "">> /* 魏玛当前回复文本 */ <<set $today_handled to []>> /* 当天处理的事务(deck_id/title/template/intensity),每日清空 */ <<set $weimar_action_recent to []>> /* 每动作专属回应池的防重队列(最近3条) */ /* ---------- 【魏玛记忆】 ---------- 魏玛会记住玩家说过的话、做过的选择,后续对话可自然引用。 每条 { theme, text, source, day }:theme 为话题归属,text 为魏玛记住的那句话。 */ <<set $weimar_memory to []>> /* ---------- 【冷战循环】 ---------- 等级 0-3:高张力下多次激烈互动(质问/发泄)升温,安抚/共情/陪伴降温。 冷战>0 时部分对话选项受限,告别语变冷;等级高后需刻意和解。 */ <<set $weimar_cold_war to 0>>\ <<set $weimar_topic to "">> /* 当前多轮话题模式(空=普通对话;如 "comfort"/"confront") */ /* ---------- 【多轮深聊池】 ---------- 弹窗式深聊:选 emotional 类动作后,可打开 Dialog 弹窗连续深聊。 每动作含 2-3 轮,每轮多句随机;弹窗内点「继续」就地推进,不退出重进。 */ <<set $weimar_deep_pools to { comfort: [ [ "「我有时候分不清,撑这个国家的究竟是我,还是我在靠这个国家撑着。」", "「你让我说『会好起来的』。可我说不出口。好起来这件事,从来轮不到这句话来做。」" ], [ "他讲起1919年,讲起那些他以为早已忘掉的日子。", "「我梦见过它倒下来。枪炮都还没动,它自己就一点点松了。」" ], [ "「可你今晚在这儿。」他忽然说,「你站在我身后。这比一百句『会好起来』都重。」" ] ], confront: [ [ "「你问我国王和总统有什么区别?区别是,国王倒下时,国家不会跟着他一起跪。」", "「你嫌我软弱。可你知不知道,我每一分软弱,都是为了少流一滴血。」" ], [ "他声音低下去:「你要我强硬。好。可强硬的下场你也见过。1919年,他们用枪回答了我。」", "「你是不是也觉得,我早就该学那些人,把枪架在桌上说话?」" ], [ "他盯着你,一字一句:「你把我当共和国。可你有没有想过,我也是一个会累、会怕、会想逃的人?」" ] ] }>> /* ---------- 【对话数值每日上限】 ---------- 防止玩家把日常对话当快速刷数值的捷径。 每日所有对话动作的增/减幅度合计受 $dialogue_cap_daily 约束(每轮 +2 疲惫不计入)。 $dialogue_special_paths:未来的特殊数值路径(由特殊事件划定),不计入上限、全额生效。 示例:改 economy 通胀等世界数值时,把路径加进这里即可豁免。 */ <<set $dialogue_cap_daily to 20>> /* 每日对话数值总预算(增幅+减幅合计) */ <<set $dialogue_spent to 0>> /* 当日已消耗的预算,每日由 daily-tick 清零 */ <<set $dialogue_special_paths to []>> /* 特殊数值路径白名单(暂空,后续由特殊事件划定) */ <<set $chat_bond to 0>> /* 聊天亲密度(长期,每次对话+1,攒满5点信任+1,跨天保留) */ <<set $chat_bond_today to 0>> /* 当日通过聊天获得的信任增量(受每日上限约束,daily-tick清零) */ <<set $weimar_chat_bond_gain to false>> /* 本次对话是否触发信任提升(供回复页提示) */ /* ---------- 【好感/信任每日+每周上限】(V0.7 渠道防刷) ---------- 约束政党信任 $npcs.*与州邦拟人信任 $region_npcs.* 在可重复渠道上的正向积累。 $affinity_budget:预算账本。party/region 各自按 {d:今日已计, w:本周已计} 记增量。 周期重置:daily 用 day != session_day 判跨天;weekly 用周起点绝对值 _w0 = session_day - session_day%7 判跨周(含快进一次跨多周)。 闸门 widget:<<trust-capped party 量>> / <<region-trust-capped 邦 量>>。 负向增量不占预算、不受限。一次性剧情决策(事件模板/专属剧情)不走闸门。 */ <<set $affinity_budget to { day: -1, /* 当前记账日(首次触碰即重算) */ week: -1, /* 当前记账周起点,切换重置 weekly(-1 确保首次也重算) */ party: {}, /* 政党:army/spd/... → {d, w} */ region: {} /* 州邦:prussia/... → {d, w} */ }>> <<set $affinity_caps to { daily: 4, weekly: 12 }>> /* 每势力每日/每周正向上限,可调 */ <<set $affinity_cap_log to []>> /* 被截断记录,供晨报/过夜去重摘要 */ <<set $trust_act_log to []>> /* 本批选择的信任「实际到账」账本(trust-capped 累加,trust-act-note 渲染后清空) */ /* ---------- 【功能性报告】重大历史事件定向回复(R01-R19) ---------- 玩家向魏玛报告当天事务时,若处理了这些事件,魏玛定向回应。 */ <<set $weimar_report_directed to { R01: "鲁尔。他们把脚踩上去了。我能感觉到那片土地在疼,像一根骨头被踩断。你签了让工人罢工的命令。罢工是武器,也是伤口。", R02: "你让国会通过了消极抵抗。283比12。他们鼓掌的时候,我听见印钞机在响。钱从哪来?从明天来。明天的马克,今天已经贬值了。", R18: "万点。我数过,从一到一万,要数很久。但马克从一万跌到一文不值,只要一个下午。数字已经没有意义了,但人还在用数字活着。", R03: "埃森。法军开枪了。工人死了。你收到消息的时候,克罗伊茨贝格的火已经点着了。你打算怎么扑?用水,还是用更多的火?", R04: "他们抓了一个人。一个搞破坏的军官。他会变成英雄,因为死人比活人好用。你救不了他。你甚至不知道该不该救他。", R05: "他死了。法军枪决了他。现在他是圣人了。右翼会把他举起来,像举一面旗。你看着那面旗,不知道该说什么。", R19: "恶性。这个词真好听。一个教师一生的积蓄,买不了一磅黄油。中产在塌。共和国站在中产的肩膀上。肩膀塌了,共和国还能站多久?", R06: "柏林停了。没有工人,没有电车,没有面包。马克也在罢工。你站在空荡荡的街上,第一次觉得,这个国家真的会停。", R07: "他们让DVP的人上台了。一个演讲大师,一个妥协大师。务实。在柏林,务实就是投降的另一种说法。你信他吗?", R08: "你结束了消极抵抗。该跪的还是要跪。我听见膝盖落地的声音。站起来的人里,还有几个信共和国?", R09: "第48条。你用紧急法令保护共和国。共和国用紧急法令保护自己的时候,他其实已经在变了。你签的时候,手抖了吗?", R10: "巴伐利亚在走自己的路。柏林的命令到了慕尼黑就变成废纸。一个共和国,连自己的州都管不住。你管得住什么?", R11: "KPD在克姆尼茨开会。他们想武装起义。会议否决了。但汉堡的人没收到消息。你收到消息了吗?你打算怎么办?", R12: "汉堡起义了。他们孤军奋战了三天。然后被镇压。你站在柏林,看着汉堡流血。你帮不了他们。你甚至不知道该不该帮。", R13: "你用军队解散了自己的州政府。共和国用军队对付自己的州。右翼看着,记住了这个方法。你教会了他们。", R14: "慕尼黑。他们冲进啤酒馆,宣布革命。他们失败了。但他们在排队等下一个机会。你听见了吗?那种排队的声音。", R15: "统帅堂。16个人死了。那个趴在地上跑掉的人,会记住这一天,也会记住怎么跑。你记住他了吗?", R16: "地租马克。一夜之间,通胀停了。像魔法,底下垫着的却是借来的黄金和抵押的土地。你信魔法吗?我不信。", R17: "他救了马克,镇压了左右两翼,保住了共和国。议会的感谢方式是让他走人。共和国的报恩方式,一向如此。你也会这样对我吗?" }>> /* ---------- 【周主题氛围文系统】 ---------- 9周主题,每周含:全局氛围文 + 3个区域切片 第7-9周文案待填充,暂用占位 */ <<set $weekly_themes to [ { week: 1, theme: "鲁尔冲击", global: "煤车从西站驶出的时间,晚了四小时十七分。轨道上的霜被敲碎,调度室里的报纸,半栏被墨水洇湿。\n\n柏林的早晨从煤开始。今天,却没有一件按时发生:木底鞋在结冰的路面打滑,纸袋被风撕破,配给站的铁门拉起时,链条发锈响。\n\n有人把一张马克钞票折成方块,塞进咖啡馆门槛的缝隙,赌明天它还能不能买到一杯不加糖的咖啡。\n\n煤烟从西边飘来,比柏林自己的更黑,更粗,带着还没被稀释的愤怒。", slices: { kreuzberg: "煤站的铁门挂着锁,锈成了门的颜色。队伍从台阶上垂下来,挪得比钟摆还慢。\n\n墙根有一小堆煤渣,几只手同时伸向那堆黑色,又同时缩回。谁也不看谁的脸,只看别人的手,指节的红肿,指甲缝里的黑垢。\n\n木底鞋的声音停了。前面的人突然弯下腰,把配给券按在膝盖上,试图抚平被手汗泡软的纸面。", kurfurstendamm: "霓虹灯管在白天也亮着,亮给别人看,证明电力还没被切断。灯管的颜色,比上周淡了一层。\n\n橱窗里的皮草模特保持着永恒的姿势,玻璃眼球上积了灰,刚好能模糊视线,又刚好不能遮挡价格标签上涂改的数字。\n\n咖啡馆的门把手是铜的,通常很凉,今天却有一种异常的温吞。门槛内侧的地毯上,有几张被踩扁的马克钞票,墨迹洇进了纤维。", tiergarten: "蒂尔加滕的林荫道在午后几乎没有人。落叶被来回踩过,碎成一片灰绿,贴着风走。\n\n林间空地上,一队士兵在清理积雪,动作没有多余。你学会了不看他们。在这片林地里,目光和口气一样,会被当成一种探问。\n\n胜利大道的尽头,骑马雕像的铜绿比上周又深了一截。冬天停在这里,一时半会儿不会走。" } }, { week: 2, theme: "煤荒", global: "柏林的冬天,只剩九天煤。配给站黑板上写着,旁边有人用指甲划了九道杠,一道比一道深。\n\n零下十一度。有人把家具拆了当柴烧,燃烧的木头,释放出二十年前的油漆味。\n\n咖啡馆改用蜡烛。有人把硬币按进温热的蜡里,等凝固后再抠出来,这是目前最可靠的存钱方式。\n\n柏林在学会用替代品取暖:书籍、椅子腿、旧报纸。旧报纸烧得很快,火焰是黄的,带着油墨的刺鼻味。", slices: { kreuzberg: "煤站的门开了,里面没有煤,只有一张用图钉按在木板上的告示。纸很薄,被穿堂风吹得掀起一角,啪啪作响。\n\n队伍没有散去,因为有人传说,下午会有一车煤从西站运来。空煤袋被用来占位置,铺在结冰的地面上,然后站上去,防止脚底的热量被吸走。\n\n墙根的煤渣已被扫得干干净净,只剩一道浅灰色的痕迹。一只手的指节抵在铁门上,没有敲门,只是抵着。", kurfurstendamm: "霓虹灯管在傍晚熄灭了大半。剩下的几根闪烁着,发出类似哮喘的电流声。\n\n橱窗里的皮草模特被搬走了,留下空荡荡的底座,底座上有一圈灰尘,勾勒出模特的鞋跟轮廓。\n\n有人把糖块从咖啡杯里捞出来,用纸巾包好放进口袋。糖图的是热量,甜味倒在其次。门槛上的马克钞票不见了,取而代之的是几枚被踩进地毯纤维的硬币,铜币已经氧化发黑。", tiergarten: "蒂尔加滕的霜比前几天更重了,桦树主干覆着一层银灰,整片林地仿佛被谁用石灰重新刷过。\n\n一早有人从林间穿过,靴印在霜上留得很深,又被后来的风填平。树林入口的长椅上放着一副手套,皮面被冻得发硬,指节处泛白,旁边没有主人。\n\n你站了一会儿,发现那些脚印并不通往林苑深处,而是折向东南。那个方向,是平时少有人走的旧阅兵场。" } }, { week: 3, theme: "消极抵抗", global: "政府号召不合作,怎么个不合作法,没人教。工厂的高炉,第三天开始冷却。烟囱不再冒烟,煤尘平铺在城市上空。\n\n罢工的标语贴在砖墙上,浆糊被雨水泡胀,字迹从边缘融化。邮件堆积在分局窗口后面,未送达的信件用麻绳捆着。\n\n有人试图继续生产,但传送带停了,半成品留在履带上,姿势扭曲。仓库的门上多了几道锁,锁的品牌各不相同。", slices: { kreuzberg: "工会建筑的木门敞开着,门洞里面比外面更暗。门板上贴着五层标语,每一层都压着上一层的边角,层层叠叠如同鱼鳞。最上面那层是新的,浆糊还没干透。\n\n大厅里的长椅空着,椅面上积了一层灰,刚好能留下一个臀部的轮廓。一只手的影子投在墙上,手里拿着一张被揉皱的传单,边缘已经断裂。\n\n墙角有一堆未发出的信件,信封上贴着去年的邮票,面值早已失去了意义。传送带的电机停了,但皮带因为惯性还在颤动,发出类似呼吸的摩擦声。", kurfurstendamm: "仓库的卷帘门拉下了一半,下半截露出堆积的麻袋,封口绳系得很紧,绳结上缠着红色的蜡封。门把手被一根铁链缠绕,末端挂着三把锁,钥匙孔朝向不同的方向。\n\n橱窗里的白布被风吹动,布角掀起时,露出模特的一只玻璃眼球,反射着对面建筑的霓虹灯残光。\n\n菜单被收走了,取而代之的是一块挂在墙上的黑板。粉笔字被反复涂改,数字的轮廓重叠在一起,像一团纠缠的蛇。一支粉笔掉在地上,断成三截。", tiergarten: "蒂尔加滕的黄昏来得早。林荫道上的路灯还没亮,灰大衣、走得笔直的身影已经三三两两多了起来,都是往同一个方向去。\n\n他们不说话,也没有并排走,保持着一种互不追问的距离。风从河面那边过来,把脚步声卷散。\n\n你站在路口的暗处看了一会儿。落叶贴着地面滚过,一群被打发回去的信使。", } }, { week: 4, theme: "纸马克发芽", global: "价格开始每天一变,纸马克像霉菌,在钱包里过夜就繁殖一层。印刷厂的气味弥漫在清晨的街道上。\n\n面包店的黑板,每天清晨被擦净,重新写上数字。写数字的人手在抖,粉笔摩擦的声音,比往常更刺耳。\n\n钞票的面值在变大,纸张的厚度在变薄。一张五百万马克,对着光能透出手指的轮廓。孩子们把纸马克折成方块,堆成塔,塔在微风中倒塌。", slices: { kreuzberg: "日结工资在下午三点发放,到三点一刻,同样的金额已经买不到同样重量的土豆。工资装在牛皮纸信封里,封口被舔湿粘好,又很快被手汗松开。\n\n一只手把信封拆开,动作很快,像是在空气里抓取什么。纸马克滑出来,边缘毛糙,毛边挂在手指上,成了细小的刺。\n\n有人用线把钞票串起来,线的一端系在腰带上。走路时钞票拍打大腿,发出类似旗帜的声响。", kurfurstendamm: "黑板上的墨水字迹从黑色变成蓝黑,再变成灰蓝,因为不断被覆盖。一支钢笔躺在柜台上,笔尖干涸,缝隙里卡着干涸的墨渣。\n\n价目表的纸条用图钉固定,图钉的金属帽因反复按压而歪斜。一张纸条被风吹落,纸面上只有一个数字,数字的尾巴拖得很长,一条逃跑的蛇。\n\n橱窗里的模特依然赤裸,有人给它围上了一条报纸折成的裙子。报纸头条朝下,油墨蹭在模特的塑料大腿上。", tiergarten: "托盘上的硬币从一种变成两种。纸马克被推到托盘边缘,堆成一堆,边缘卷曲,一叠被遗弃的传单。\n\n金马克躺在托盘中央,表面反光,把壁炉的火焰投射到天花板上,形成一块晃动的光斑。壁炉里的火焰高度没变,但颜色从橙黄变成带蓝心的白,烧的是更干燥的硬木。\n\n一只空酒杯被倒扣在地图上,杯口压着柏林的位置。烟灰缸里出现了一种新的烟蒂,滤嘴是金色的,没有齿痕。", } }, { week: 5, theme: "黑市蔓延", global: "霓虹灯管彻底熄灭了,没人付得起电费。咖啡馆的蜡烛换成了油灯,灯芯剪得很短,火焰只有蚕豆大。\n\n合法的货架正在变空,灰色的交易从后门搬进搬出。纸马克在白天是货币,夜晚是废纸。转换的临界点在傍晚六点,银行卷帘门拉下的那一刻。\n\n煤块从后门滚进面包房,秤不用砝码,用拳头。壁炉的温度,有些地方下降了,有些没有,取决于燃料是否还经过配给站。", slices: { kreuzberg: "煤站的后门开着,门槛上有两道新鲜的车辙印,辙印里嵌着不是柏林的煤渣。一只空麻袋躺在墙根,袋口用红绳扎着,绳结是活扣。\n\n墙上的标语被覆盖了,新浆糊下面鼓着一个包,像是藏着一张更厚的纸。木底鞋在结冰的地面上打滑,但打滑的声音停了一下,因为有人从门缝里递出一块黑色的东西。", kurfurstendamm: "后巷里,木箱被搬进搬出,箱角磕碰墙面留下的痕迹是新鲜的白色。霓虹灯管的残骸还挂在招牌上,像一排断掉的肋骨。\n\n有人用粉笔在墙上画了一个十字,下面写着今天的汇率,粉笔字被雨水冲掉了一半。咖啡馆的门槛上,马克卷筒增加了。橡皮筋断裂后,钞票散开,被进出的鞋子踩进地毯的纤维。", tiergarten: "壁炉里的火焰高度没变,但木柴的纹理变了,从橡木的直纹变成松木的螺旋纹。\n\n地毯上散落着几张收据,金额用的是外币符号。一只空酒杯的杯底有一圈褐色的环,环的厚度比上周增加了。", } }, { week: 6, theme: "社会裂缝", global: "雨下了三天,把墙上的标语冲进了下水道。纸马克吸饱了水,变成一团团灰色的纸浆,堵塞了排水口。\n\n积水在不同区域,呈现不同的颜色:灰黑的带着煤渣,泛着油彩的,或者清的。口音在雨中混在一起,却各自流向不同的方向。\n\n有人开始用地域称呼彼此,虽然还不敢大声。", slices: { kreuzberg: "墙上的标语换了新的,浆糊是冷的。排水口堵着一团泡烂的纸,纸浆里嵌着半张配给券的编号。\n\n木底鞋在积水里发出不同的声响,取决于鞋底沾的是煤渣还是泥。一扇门开着,门缝里漏出热气,但没有人进出,里面的煤,只够自己烧。", kurfurstendamm: "霓虹灯管有几根重新亮了,但颜色不对,是偏蓝的冷光。橱窗里的皮草模特被移走了,底座上放着一盆花,花是塑料的。\n\n门槛的积水里漂着几张纸马克,面值很大,但没人弯腰。一张桌子上的糖罐空了,罐底残留着几粒结块的砂糖,因为吸了空气中的湿气,变得半透明。", tiergarten: "百叶窗抬起了一格,刚好能看见室内的吊灯。火焰是稳定的橙黄色,没有蓝心。\n\n地毯上的收据被收走了,留下一个长方形的压痕,压痕里没有灰尘。一只手套的皮面因长时间佩戴而拉伸,指节处泛白,搁在扶手上,一件被遗弃的证物。", } }, { week: 7, theme: "超级通胀", global: "纸马克死了,死讯无人去通知它。钞票离开柜台的那一刻,就开始腐烂。\n\n人们不再说多少马克,而是说多大的一捆、多沉的一袋。面包店的黑板被擦坏了,数字写得越来越大,黑板显得越来越小。\n\n有人用推车运钱,推车的轮子在石板路上留下湿痕,不是水,是汗。推车的人不看守车里的钱,看守的是推车本身,因为车比钱值钱。\n\n纸马克唯一剩的用途是引火,但连引火都嫌它烧得太快、灰太多。", slices: { kreuzberg: "煤站的铁门被拆走了,门没被偷,被人拿去换了面包。门洞敞着,一颗拔掉后留下的牙洞。\n\n墙根的煤渣痕迹还在,颜色变浅了。有人用刷子蘸着水反复刷洗,图的并非干净,是收集冲刷下来的黑色粉尘,据说可以用来写字。\n\n有人把纸马克糊在墙上,一层又一层,堵的是墙缝里的风。木底鞋的声音变得稀疏,人数没少,鞋底磨穿了。", kurfurstendamm: "霓虹灯管亮着,颜色不稳定,电流声像喉咙里的痰。橱窗里的塑料花枯了,暖气停了,塑料在低温中变脆,花瓣掉在底座上。\n\n咖啡馆的门把手重新变凉了,说明进出的频率降低了。门槛上不再有马克卷筒,取而代之的是几枚外币硬币,旁边放着一小堆纸火柴,是找零的替代品。\n\n一张桌子上的驼色大衣不见了,椅子被推进了桌底,椅腿在地毯上拖出两道平行的痕迹。", tiergarten: "壁炉里的火焰保持着稳定的高度,但燃料的种类变得难以辨认,有人开始烧混合材料:木柴、纸张,以及某种压得很紧的纤维块。\n\n温度计显示二十四度,但湿度计也出现了,指针偏向干燥。地图上的铅笔圈被擦掉了,但擦痕留下一片灰色的云。\n\n一只空酒杯被正放着,杯底朝上,里面盛着一层细白的灰。烟灰缸里的烟蒂只有一种了,金色的滤嘴,长度一致,没有齿痕。", } }, { week: 8, theme: "政府崩溃", global: "旧总理走了,新总理来了,但椅子还是那张椅子。总理府的门把手换了新的铜套,门轴的吱嘎声没有变。\n\n报纸上的头像变了,墨水还是同样的黑色、同样的气味。有人刷掉了旧标语,刷子的油漆不够厚,旧字迹从白色下面透出来,一块淤青。\n\n咖啡馆里有人在低声念新内阁的名单。念到某个名字时声音变轻,说不上尊敬,只是不确定这个名字能留几天。\n\n纸马克还在流通,流通的速度加快了,血液正从破裂的血管里涌出。", slices: { kreuzberg: "工会建筑的门板被卸掉了一块,进去是假,把里面的长椅搬出来当柴烧是真。长椅倒在地上,四条腿朝天,一头被翻过来的甲壳虫。\n\n墙上的标语被白色油漆覆盖了,油漆在夜间凝结成皮,白天又被晒裂,露出下面一层红色的字迹。\n\n有人用钉子把一张新告示钉在门板上,钉子的位置偏了,告示纸的左上角翘起,在风中拍打,发出类似鼓掌的声音。", kurfurstendamm: "霓虹灯管全部熄灭了。限电谈不上,是有人剪断了电线,为了里面的铜丝。\n\n橱窗里的塑料花被扫走了,底座上放着一块石头,挂着一张手写的纸条,纸条上只有一个数字,后面跟着一个问号。\n\n咖啡馆的门上挂着一把新锁,锁的品牌和上周不同。一张桌子上的咖啡杯被收走了,桌面留下一个圆形的白圈,边缘有一圈褐色的渍,一圈年轮。", tiergarten: "壁炉里的火焰高度降了约三厘米。木柴的爆裂声变得沉闷,说明烧的是潮湿的硬木。\n\n百叶窗抬起了一格,但玻璃上多了一层灰,厚度刚好让对面的建筑轮廓变得柔和。地毯上的长方形压痕还在,但压痕里落了一层新的灰。\n\n烟灰缸被倒空了,底部却有一圈湿润的痕迹,边缘不规则,像地图上的海岸线。", } }, { week: 9, theme: "啤酒馆政变", global: "慕尼黑的枪声,在柏林的地下室里回响。枪声本身没有传到柏林,但消息比声音更快,沿着铁路线和电话线爬行,在墙壁上留下焦痕。\n\n纸马克在这周停止了呼吸,地租马克被宣布诞生。但新生儿没有哭声,只有银行窗口后面,铁抽屉拉开的金属声。\n\n有人用粉笔写下了新的价格,这次用的是单数字,没有百万,没有十亿,小得几乎看不见,但每一笔都很重。\n\n壁炉里的火焰,在某些地方被熄灭了。说节约也行,其实是有人要出门,去确认街角的枪声是不是只是爆竹。", slices: { kreuzberg: "工会建筑的门板重新装上了,但装反了,有铰链的一面朝外,锁扣的一面朝内。门板上有一道新鲜的弹痕,弹痕周围的油漆呈放射状裂开,炸开一朵黑色的花。\n\n煤站的木板封条被撕掉了一半,另一半挂在门框上,一条断掉的舌头。墙根处出现了一堆碎玻璃,玻璃的来源不明,但碎片上沾着一种暗褐色的痕迹,已经干了。\n\n有人用粉笔在墙上画了一个箭头,箭头指向地下室的入口。", kurfurstendamm: "霓虹灯管重新亮了,但有几根闪烁不定,闪烁的频率和心跳不一致。橱窗里的底座上换了一盆新的花,是真花,但已经枯萎,花瓣落在底座周围,像一圈被剪掉的指甲。\n\n咖啡馆的门锁被打开了,门把手是温的。门槛上放着一枚地租马克硬币,硬币是新的,边缘的齿纹还没有磨平。\n\n驼色大衣重新出现了,搭在椅背上,但位置比原来偏左了五厘米。", tiergarten: "壁炉里的火焰被调小了,木柴堆积在炉膛旁边,没有立刻烧掉。温度计显示二十度,比上周降低了四度。\n\n百叶窗完全抬起,但窗户被从里面锁上了,锁是新的,金属表面没有氧化。地毯上的长方形压痕被吸尘器清理过了,但痕迹更深了。\n\n烟灰缸里堆满了烟蒂,都是同一种金色滤嘴,但长度不一,有的只烧了一半就被按灭了。地图被抽出一半,露出柏林以南的区域,铅笔的压痕在那里形成了一个密集的交叉。" } } ]>> <<set $last_weekly_week to 0>> /* 上次显示周主题的周号,防重复 */ /* ============================================================ 【区域动态行动系统】(逐级解锁) 每个区域维护一张行动表,行动按「条件」动态解锁(见 77b_region_actions.twee)。 tier 越高越深入;cond 为条件数组(全部满足才出现)。 passage 为该行动的目标场景;hint 为已解锁后果提示;lock_hint 为未解锁提示。 ============================================================ */ <<set $region_tier to 1>> /* 全局进度层级,由 region-tier-calc 动态计算 */ <<set $show_locked_features to true>> /* 未解锁行动:以"尚未开放"折叠块显示(点开看解锁条件),非隐藏 */ <<set $region_actions to { kreuzberg: [ { id:"kb_observe", tier:1, label:"在街上游荡,观察", hint:"(每日一次 · 疲惫)", fatigue:2, cond:["always"], rot:0, passage:"Kreuzberg_Observe", lock_hint:"" }, { id:"kb_union", tier:1, label:"找工会的人聊聊", hint:"(疲惫)", fatigue:2, cond:["always"], passage:"Kreuzberg_Union", lock_hint:"" }, { id:"kb_spd", tier:1, label:"去 SPD 党部", hint:"(疲惫)", fatigue:2, cond:["always"], passage:"Scene_Visit_SPD", lock_hint:"" }, { id:"kb_speech", tier:1, label:"对聚集的人群说几句", hint:"(疲惫 · 可能引起注意)", fatigue:2, cond:["always"], rot:2, passage:"Kreuzberg_Speech", lock_hint:"" }, { id:"kb_baker", tier:1, label:"帮面包店老板卸一袋面粉", hint:"(知情者+2 · 来过两次才有的活)", fatigue:2, cond:["visit>=2"], passage:"Kreuzberg_Baker", lock_hint:"老板只把零活交给熟脸。" }, { id:"kb_relief", tier:2, label:"参与工会的救济物资分发", hint:"(稳定度↑ · SPD信任↑)", fatigue:3, cond:["world:economy>=55"], passage:"Kreuzberg_Relief", gain:{party:"spd",amount:3}, lock_hint:"要等经济压力更重,工人才会求你帮忙。" }, { id:"kb_rally", tier:2, label:"站在集会边缘听演讲", hint:"(知情者↑ · 疲惫)", fatigue:2, cond:["world:social_anger>=50"], passage:"Kreuzberg_Rally", lock_hint:"人群还没到沸腾的程度。" }, { id:"kb_refugee", tier:3, label:"探望鲁尔来的难民", hint:"(社会愤怒± · 政党信任)", fatigue:3, cond:["event:R01"], passage:"Kreuzberg_Refugee", lock_hint:"鲁尔危机之后,这里才会涌进逃离的人。" }, { id:"kb_blackmarket", tier:3, label:"在巷子里找黑市情报", hint:"(知情者↑ · 通胀情报)", fatigue:2, cond:["tag:知情者>=15"], passage:"Kreuzberg_Blackmarket", lock_hint:"只有当你在柏林消息够灵通,才找得到黑市的门。" }, { id:"kb_agitation", tier:4, label:"处理 KPD 街头煽动", hint:"(政治暴力↓ · KPD信任↓)", fatigue:3, cond:["world:revolution>=50"], passage:"Kreuzberg_Agitation", lock_hint:"革命压力不足时,这只是一面墙上的红漆。" }, { id:"kb_coremeet", tier:4, label:"进入工会核心会议", hint:"(SPD信任↑ · 稳定度↑)", fatigue:3, cond:["visit>=3","trust:spd>=40"], passage:"Kreuzberg_CoreMeet", gain:{party:"spd",amount:4}, lock_hint:"需要你常来、且得到工会的信任,他们才让你进门。" }, { id:"kb_yard", tier:2, label:"进后院看孩子们踢球", hint:"(稳定度+1 · 社会愤怒-1 · 来熟了才进得去)", fatigue:2, cond:["visit>=6"], passage:"Kreuzberg_Yard", lock_hint:"后院的门只为常来的人开条缝。" } ], kurfurstendamm: [ { id:"kd_walk", tier:1, label:"在街上走走", hint:"(疲惫)", fatigue:2, cond:["always"], rot:0, passage:"Kudamm_Walk", lock_hint:"" }, { id:"kd_dvp", tier:1, label:"去 DVP 党部", hint:"(疲惫)", fatigue:2, cond:["always"], passage:"Scene_Visit_DVP", lock_hint:"" }, { id:"kd_records", tier:1, label:"在唱片行听半张新唱片", hint:"(知情者+2 · 来过两次才有人搭话)", fatigue:2, cond:["visit>=2"], passage:"Kudamm_Records", lock_hint:"唱片行老板只跟熟客聊两句。" }, { id:"kd_blackmarket", tier:2, label:"找黑市兑换情报", hint:"(知情者↑ · 通胀±)", fatigue:2, cond:["world:inflation>=60"], passage:"Kudamm_Blackmarket", lock_hint:"要等通胀到了疯狂的地步,黑市才会在霓虹灯下营业。" }, { id:"kd_chamber", tier:2, label:"与商会代表谈失业救济", hint:"(DVP信任↑ · 稳定度↑)", fatigue:2, cond:["world:economy>=55"], passage:"Kudamm_Chamber", gain:{party:"dvp",amount:3}, lock_hint:"要等经济压力压到商人头上,他们才愿意谈判。" }, { id:"kd_eavesdrop", tier:3, label:"在咖啡馆窃听商人密谈", hint:"(知情者↑ · 情报)", fatigue:2, cond:["tag:知情者>=15"], passage:"Kudamm_Eavesdrop", lock_hint:"只有当消息灵通,你才知道该坐到哪张桌子旁边。" }, { id:"kd_calmmoney", tier:3, label:"安抚恐慌的存款人", hint:"(政府信任↑ · 疲惫)", fatigue:3, cond:["world:gov_trust<=25"], passage:"Kudamm_CalmMoney", lock_hint:"要等政府信任跌到谷底,银行门口才会排起人龙。" }, { id:"kd_bizprotest", tier:4, label:"处理消极抵抗的商人抗议", hint:"(DVP信任分化)", fatigue:3, cond:["event:R02"], passage:"Kudamm_BizProtest", lock_hint:"要等国会通过消极抵抗之后,商人们才会起来抗议。" } ], tiergarten: [ { id:"tg_walk", tier:1, label:"在林荫道上走走", hint:"(疲惫)", fatigue:2, cond:["always"], rot:0, passage:"Tiergarten_Walk", lock_hint:"" }, { id:"tg_officer", tier:1, label:"找退役军官搭话", hint:"(疲惫 · 可解锁军官区)", fatigue:2, cond:["always"], rot:1, passage:"Tiergarten_Officer", lock_hint:"" }, { id:"tg_army", tier:1, label:"去国防军司令部", hint:"(疲惫)", fatigue:2, cond:["always"], passage:"Scene_Visit_Army", lock_hint:"" }, { id:"tg_bench", tier:1, label:"在长椅上坐一会儿", hint:"(疲惫恢复)", fatigue:0, cond:["always"], rot:2, passage:"Tiergarten_Bench", lock_hint:"" }, { id:"tg_gardener", tier:1, label:"跟扫落叶的老园丁搭话", hint:"(知情者+2 · 来过两次才遇得上)", fatigue:2, cond:["visit>=2"], passage:"Tiergarten_Gardener", lock_hint:"老园丁只跟记得住的脸说话。" }, { id:"tg_cafe", tier:2, label:"在森林咖啡馆坐到打烊", hint:"(知情者+2 · 军方信任+1 · 来熟了才有的位置)", fatigue:2, cond:["visit>=6"], passage:"Tiergarten_Cafe", gain:{party:"army",amount:1}, lock_hint:"要常来,侍者才会给你留靠窗那张桌子。" }, { id:"tg_dinner", tier:2, label:"列席军官非正式晚宴", hint:"(军方信任↑ · 疲惫)", fatigue:3, cond:["world:army_influence>=45"], passage:"Tiergarten_Dinner", gain:{party:"army",amount:4}, lock_hint:"要等军方影响力上升,军官们才会把你算进桌边的人。" }, { id:"tg_gauge", tier:2, label:"观察军官对时局的反应", hint:"(知情者↑ · 军方信任±)", fatigue:2, cond:["world:political_violence>=40"], passage:"Tiergarten_Gauge", gain:{party:"army",amount:2}, lock_hint:"要等街头暴力升温,军官们的神经才会紧绷起来。" }, { id:"tg_veteran", tier:3, label:"从老兵口中套取前线消息", hint:"(知情者↑)", fatigue:2, cond:["tag:知情者>=15"], passage:"Tiergarten_Veteran", lock_hint:"只有当消息灵通,老兵才愿意多说半句。" }, { id:"tg_article48", tier:4, label:"试探军方对第48条的态度", hint:"(军方信任± · 军方影响力±)", fatigue:3, cond:["event:R09"], passage:"Tiergarten_Article48", lock_hint:"要等紧急状态真的颁下,这个话题才开得了口。" }, { id:"tg_oberkommando", tier:4, label:"进入本德勒大楼高层会面", hint:"(军方信任↑)", fatigue:3, cond:["visit>=4","trust:army>=50"], passage:"Tiergarten_Oberkommando", gain:{party:"army",amount:4}, lock_hint:"需要你常来、且赢得军方信任,他们才愿让你上楼。" }, { id:"tg_kasino", tier:1, label:"在军士食堂付钱混脸熟", hint:"(军方信任↑ · 疲惫)", fatigue:2, cond:["always"], rot:1, passage:"Tiergarten_Kasino", gain:{party:"army",amount:1}, lock_hint:"" }, { id:"tg_officertalk", tier:2, label:"旁听军官饭后的闲谈", hint:"(知情者↑ · 军方信任±)", fatigue:2, cond:["trust:army>=25"], passage:"Tiergarten_OfficerTalk", gain:{party:"army",amount:1}, lock_hint:"要等军方先认得你,他们才会在你面前多聊两句。" }, { id:"tg_swr", tier:3, label:"应约赴一场地窖里的宴(黑色国防军)", hint:"(军方信任↑↑ · 魏玛精神↓ · 相位右偏)", fatigue:3, cond:["trust:army>=40"], passage:"Tiergarten_SchwarzeReichswehr", lock_hint:"要等你赢得军方相当信任,他们才会把更野的暗面那条线摊给你。" } ], alexanderplatz: [ { id:"ap_walk", tier:1, label:"在广场钟楼下走走", hint:"(疲惫)", fatigue:2, cond:["always"], passage:"Alexanderplatz_Walk", lock_hint:"" }, { id:"ap_arbeitsamt", tier:1, label:"进失业登记处排队等盖章", hint:"(SPD信任± · 社会愤怒± · 精神负荷)", fatigue:3, cond:["always"], passage:"Alexanderplatz_Arbeitsamt", gain:{party:"spd",amount:1}, lock_hint:"" }, { id:"ap_clearing", tier:2, label:"在登记队列里物色传话人", hint:"(知情者↑)", fatigue:2, cond:["tag:知情者>=10"], passage:"Alexanderplatz_Clearing", gain:{party:"spd",amount:1}, lock_hint:"只有你在柏林消息够灵通,才知道队列里哪个人值得多留一眼。" } ], romanisches: [ { id:"rm_walk", tier:1, label:"在咖啡馆里坐坐,听人高谈", hint:"(疲惫)", fatigue:2, cond:["always"], passage:"Romanisches_Walk", lock_hint:"" }, { id:"rm_editorial", tier:1, label:"去街角那家报社编辑部", hint:"(DDP/DVP信任± · 知情者· 舆论)", fatigue:2, cond:["always"], passage:"Romanisches_Editorial", lock_hint:"" }, { id:"rm_sources", tier:2, label:"和值班记者交换消息", hint:"(知情者↑)", fatigue:2, cond:["tag:知情者>=15"], passage:"Romanisches_Sources", lock_hint:"只有消息够灵通,记者们才愿意拿真消息跟你换。" } ], /* 弗里德里希斯海因:工厂与工人区(2026-09-17 区域扩展第一批) */ friedrichshain: [ { id:"fh_gate", tier:1, label:"在工厂大门口等下班的队伍", hint:"(工人愤怒± · 疲惫)", fatigue:2, cond:["always"], rot:0, passage:"Friedrichshain_Gate", lock_hint:"" }, { id:"fh_barricade", tier:1, label:"去1919年街垒的旧街角看看", hint:"(观察者↑)", fatigue:2, cond:["always"], passage:"Friedrichshain_Barricade", lock_hint:"" }, { id:"fh_canteen", tier:1, label:"在工人食堂搭一餐便宜的伙", hint:"(疲惫恢复 · 来过两次才坐得进去)", fatigue:0, cond:["visit>=2"], passage:"Friedrichshain_Canteen", lock_hint:"食堂的长桌只为熟脸留位置。" }, { id:"fh_kitchen", tier:2, label:"在人民公园的露天厨房帮忙", hint:"(SPD信任↑ · 稳定度↑)", fatigue:3, cond:["world:economy>=55"], passage:"Friedrichshain_Kitchen", gain:{party:"spd",amount:2}, lock_hint:"要等经济压力更重,露天厨房才会开火。" }, { id:"fh_rent", tier:3, label:"听房客们算房租的账", hint:"(知情者↑ · 社会愤怒±)", fatigue:2, cond:["world:inflation>=60"], passage:"Friedrichshain_Rent", lock_hint:"要等通胀把房租也吞掉,楼道里的账才值得听。" }, { id:"fh_press", tier:4, label:"给左翼文化周刊递一份圈内消息", hint:"(知情者↑ · KPD/SPD信任±)", fatigue:2, cond:["tag:知情者>=15"], passage:"Friedrichshain_Press", lock_hint:"只有当你消息够灵通,周刊的人才肯见你。" } ], /* 菩提树下大街:大学与旧街(同上) */ unter_den_linden: [ { id:"ul_lecture", tier:1, label:"去大学蹭一堂公开课", hint:"(知情者↑ · 理想↑)", fatigue:2, cond:["always"], rot:0, passage:"Linden_Lecture", lock_hint:"" }, { id:"ul_students", tier:1, label:"在学生布告栏前站一会儿", hint:"(观察者↑ · 民族主义±)", fatigue:2, cond:["always"], rot:1, passage:"Linden_Students", lock_hint:"" }, { id:"ul_library", tier:2, label:"在旧图书馆借一册和约文本", hint:"(知情者↑ · 理想↑ · 来过两次才有借书的位置)", fatigue:2, cond:["visit>=2"], passage:"Linden_Library", lock_hint:"阅览室的位置要常来才轮得到。" }, { id:"ul_cafe", tier:2, label:"在街角老咖啡馆听教授们聊", hint:"(知情者↑ · DDP信任↑)", fatigue:2, cond:["tag:知情者>=15"], passage:"Linden_Cafe", gain:{party:"ddp",amount:1}, lock_hint:"只有消息够灵通,教授们才不避着你。" }, { id:"ul_hall", tier:3, label:"去看一场学生团体的集会", hint:"(民族主义± · 知情者↑)", fatigue:3, cond:["world:nationalism>=40"], passage:"Linden_Hall", lock_hint:"要等民族主义烧得更旺,礼堂才会被年轻人占满。" }, { id:"ul_opera", tier:3, label:"在歌剧院门口看散场的人", hint:"(DVP信任↑ · 知情者↑)", fatigue:2, cond:["world:economy>=55"], passage:"Linden_Opera", gain:{party:"dvp",amount:1}, lock_hint:"要等经济压力把包厢压出怨气,门口才值得站。" } ], /* 夏洛滕堡:军官住宅区(同上) */ charlottenburg: [ { id:"cb_avenue", tier:1, label:"沿军官住宅区的林荫道走一段", hint:"(军队不满± · 疲惫)", fatigue:2, cond:["always"], rot:0, passage:"Charlottenburg_Avenue", lock_hint:"" }, { id:"cb_tech", tier:1, label:"在技术大学门口站一会儿", hint:"(知情者↑)", fatigue:2, cond:["always"], passage:"Charlottenburg_Tech", lock_hint:"" }, { id:"cb_tea", tier:2, label:"参加一场军官家的下午茶会", hint:"(军方信任↑ · 知情者↑ · 来过两次才收得到请柬)", fatigue:2, cond:["visit>=2"], passage:"Charlottenburg_Tea", gain:{party:"army",amount:2}, lock_hint:"请柬只送到常来的人手里。" }, { id:"cb_widows", tier:2, label:"听军官太太们说家里的难处", hint:"(知情者↑ · 军方信任± · 来熟了才让你进客厅)", fatigue:2, cond:["visit>=3"], passage:"Charlottenburg_Widows", lock_hint:"客厅的门只为见过几面的脸开。" }, { id:"cb_cards", tier:3, label:"赴一场退役军官的牌局", hint:"(军方信任↑ · 知情者↑)", fatigue:3, cond:["trust:army>=25"], passage:"Charlottenburg_Cards", gain:{party:"army",amount:2}, lock_hint:"要等军方先认下你,牌桌才会给你留一把椅子。" }, { id:"cb_badges", tier:4, label:"记下技术大学里那几个戴新徽章的学生", hint:"(知情者↑ · 民族主义±)", fatigue:2, cond:["world:nationalism>=45"], passage:"Charlottenburg_Badges", lock_hint:"要等民族主义烧起来,那枚徽章才会出现在校园里。" } ], /* 红堡·警察总局(同上) */ police_hq: [ { id:"ph_square", tier:1, label:"在红堡前的广场上站一会儿", hint:"(观察者↑)", fatigue:2, cond:["always"], rot:0, passage:"PoliceHQ_Square", lock_hint:"" }, { id:"ph_chief", tier:1, label:"求见警察总监", hint:"(军方± · 治安线)", fatigue:2, cond:["always"], passage:"PoliceHQ_Chief", lock_hint:"" }, { id:"ph_report", tier:2, label:"听一份治安周报", hint:"(知情者↑ · 政治暴力± · 赢得红堡信任后)", fatigue:2, cond:["trust:police>=25"], passage:"PoliceHQ_Report", gain:{party:"police",amount:1}, lock_hint:"要等红堡把你当自己人,周报才会送到你面前。" }, { id:"ph_rally", tier:2, label:"打招呼:游行那天别见血", hint:"(政治暴力↓ · SPD信任±)", fatigue:3, cond:["world:social_anger>=45"], passage:"PoliceHQ_RallyTip", gain:{party:"police",amount:1}, lock_hint:"要等街上的火气攒够,这句话才说得上。" }, { id:"ph_list", tier:3, label:"对一遍紧急状态的执行细则", hint:"(知情者↑ · 红堡信任↑ · 第48条颁下后)", fatigue:3, cond:["event:R09"], passage:"PoliceHQ_Brief48", gain:{party:"police",amount:2}, lock_hint:"要等第48条真的到手,这份细则才对得上。" }, { id:"ph_cells", tier:3, label:"要一份莫阿比特在押名册", hint:"(知情者↑ · 来过两次才肯给)", fatigue:2, cond:["visit>=2"], passage:"PoliceHQ_Detainees", lock_hint:"名册不外借,只给常来的人抄。" } ], /* 外交部(同上) */ foreign_office: [ { id:"fo_corridor", tier:1, label:"在电报房的走廊里走一圈", hint:"(知情者↑)", fatigue:2, cond:["always"], rot:0, passage:"ForeignOffice_Corridor", lock_hint:"" }, { id:"fo_brief", tier:1, label:"听外交司过一遍今天的照会", hint:"(知情者↑ · 国际信任±)", fatigue:2, cond:["always"], passage:"ForeignOffice_Brief", lock_hint:"" }, { id:"fo_note", tier:2, label:"草一份关于鲁尔的抗议照会", hint:"(民族主义↑ · 国际信任↑ · DNVP/DDP信任↑)", fatigue:3, cond:["event:R01"], passage:"ForeignOffice_Note", gain:{party:"dnvp",amount:1}, lock_hint:"要等法国人真进了鲁尔,这份照会才有得写。" }, { id:"fo_journalist", tier:2, label:"在后楼梯口见一位外国记者", hint:"(国际信任↑ · 知情者↑)", fatigue:2, cond:["tag:知情者>=15"], passage:"ForeignOffice_Journalist", lock_hint:"只有消息够灵通,才有人肯在后楼梯口等你。" }, { id:"fo_delegation", tier:3, label:"陪财政的人见外国银行代表团", hint:"(国际信任↑ · 经济↑ · DVP信任↑)", fatigue:3, cond:["world:economy>=55"], passage:"ForeignOffice_Delegation", gain:{party:"dvp",amount:2}, lock_hint:"要等经济压力把门压开,代表团的船才会靠岸。" } ], /* 财政部(同上) */ finance_ministry: [ { id:"fm_hall", tier:1, label:"在账房走廊里等人谈事", hint:"(知情者↑)", fatigue:2, cond:["always"], rot:0, passage:"Finance_Hall", lock_hint:"" }, { id:"fm_ledger", tier:1, label:"翻一翻本月的收支总账", hint:"(知情者↑ · 经济±)", fatigue:2, cond:["always"], passage:"Finance_Ledger", lock_hint:"" }, { id:"fm_bankers", tier:2, label:"接见来诉苦的银行家们", hint:"(DVP信任↑ · 经济±)", fatigue:3, cond:["world:inflation>=60"], passage:"Finance_Bankers", gain:{party:"dvp",amount:2}, lock_hint:"要等通胀烧到银行门口,他们才会成群结队地来。" }, { id:"fm_print", tier:2, label:"问一句印钞机的事", hint:"(通胀↓ · 政府信任↑ · DVP信任↓ · 马克跌破万点后)", fatigue:2, cond:["event:R18"], passage:"Finance_Print", lock_hint:"要等马克真的跌破万点,这个问题才开得了口。" }, { id:"fm_stabilize", tier:3, label:"看住地租马克的头一个月", hint:"(经济↑↑ · 通胀↓ · 政府信任↑ · 地租马克发行后)", fatigue:3, cond:["event:R16"], passage:"Finance_Rentenmark", lock_hint:"要等新货币上了柜台,才轮得到你去看住它。" }, { id:"fm_austerity", tier:4, label:"把一份节流清单压到各部头上", hint:"(经济↑ · 政府信任↑ · SPD信任↓ · 常来才推得动)", fatigue:3, cond:["visit>=4"], passage:"Finance_Austerity", lock_hint:"要常来、跟账房混熟,清单才压得下去。" } ] }>>
/* ---------- 【世界模拟层】(Layer 1 · $world)---------- 宏观世界变量,每日由 world-tick 自行演化。 与 $active_tags(微观标签)分开:标签是事件的即时产物, $world 是世界自身的持续状态。 变量范围 0-100,越高表示该维度压力越大(gov_trust 例外,越高越好)。 */ <<set $world to { economy: 30, /* 经济压力(越高越糟) */ inflation: 40, /* 通胀恶化度(1923专属,11月后骤降) */ social_anger: 20, /* 社会愤怒 */ nationalism: 25, /* 民族主义热度 */ gov_trust: 40, /* 政府信任(越高越好,自然衰减) */ middle_confidence: 32, /* 中产信心(越高越好;1923 开局已被通胀压得很低) */ army_influence: 20, /* 军方影响力 */ revolution: 15, /* 革命压力 */ political_violence: 10, /* 政治暴力 */ fiscal: 30 /* 财政赤字(越高越糟;花钱类决策累积,>60 每日推高通胀、侵蚀信任) */ }>> <<set $last_world_tick to "">>\ /* 晨报氛围趋势采样日志:daily-tick 每日记录 { d:天数, v:世界最险值 }, atmos-trend 取约5天前采样对比,判定「下坡/爬坡/平稳」选晨报氛围池 */ <<set $world_trend_log to []>> /* ---------- 【历史相位滑轨】(C 层的局部闸门) ---------- $fate 为**单轴连续标量**(钢4意识形态滑轨式): -100 ← … ← 0 → … → +100 负端=革命势能(左) 0=魏玛默认 正端=右翼/复辟势能(政变/纳粹/君主合并) 日常选择使其 ±1~±5 浮动;相位内被钳制在 $stage.fate_range 内。 它同时驱动: - C 层:事件抽取按 $fate 加权(fate_weight) - B 层:阶段结算 <<PhaseExitCheck>>(阈值 + 具体因果 flag) 区分"红潮 vs 军政府"不靠轴(同为正负轨道),靠 exit_gates 里的 flag(如 $mil_outcome)。 */ <<set $fate to 0>> /* 默认魏玛中道 */ <<set $fate_log to []>> /* 相位漂移日志 {day,tag,dir,drift,after},仅记非零漂移,调试分布用 */ /* 党派信赖每日桶($trust_today/$trust_today_special)已废除: 党信任统一走 trust-capped 闸门(每党每日+4/每周+12),避免双重裁剪。 */ <<set $region_sp_due to {}>> /* 各地区"特殊事件保底"计数:访问没出特殊则+1,达4强制出一条(C层) */ /* ---------- 【当前阶段】(由 $chapter 升级而来) ---------- $stage 为"任意阶段"的一等配置:世界漂移参数(tick)、初始世界值(world_base)、 牌库、路由(next)。S3(危机元年/1923) 为当前章,其余阶段骨架待填。 world-tick 从 $stage.tick 读漂移(去 1923 写死),缺省用 base 中性值。 */ /* ---------- 【六相位注册表】(A 骨架 · 河床层) ---------- $phases = 所有可能河床相位的配置;$stage = 当前相位指针(=当前章)。 默认史六阶段 = S1..S6;每条 = { num,id,timeline,name,year,theme, world_base, tick, deck, fate_range, exit_gates, meta }。 S3 为当前章(全配),其余为骨架占位,待各阶段内容落地时补 world_base/tick/exit_gates。 替代/硬断相位(BR_RED_SPRING 等)不在此默认表内,由 exit_gates.next 指向。 */ <<set $phases to { WEIMAR_1919: { num:1, id:"S1", timeline:"WEIMAR_1919", name:"建国与革命", year:1918, theme:"诞生、合法性、血与火", world_base:{ economy:25, inflation:10, social_anger:25, nationalism:30, gov_trust:45, middle_confidence:45, army_influence:15, revolution:20, political_violence:15 }, tick:null, deck:"S1", fate_range:{min:-80,max:80}, exit_gates:[], meta:{ density:3, note:"TODO 骨架" } }, WEIMAR_1921: { num:2, id:"S2", timeline:"WEIMAR_1921", name:"动荡与暗杀", year:1920, theme:"共和国在暗杀中求生", world_base:{ economy:28, inflation:15, social_anger:20, nationalism:35, gov_trust:40, middle_confidence:40, army_influence:22, revolution:15, political_violence:18 }, /* S2 漂移基调(V0.9 骨架):无恶性通胀(马克只是慢跌),主菜是暴力/民族主义缓涨; gov_trust 走弱、军方影响比 S3 更活跃(十万陆军限额与自由军团的摩擦期)。 end_date = 本章结算日(年末触发 Stage-Settlement)。 */ tick:{ inflation: { base:0.05 }, revolution:{ boostY:1921, boostM:3, boost:0.3 } }, deck:"S2", fate_range:{min:-75,max:75}, exit_gates:[], meta:{ density:2, end_date:{y:1921, m:12, d:31}, note:"动荡与暗杀 · 第二章(骨架)" } }, WEIMAR_1923: { num:3, id:"S3", timeline:"WEIMAR_1923", name:"危机元年", year:1923, theme:"崩溃边缘、信心与货币", world_base:{ economy:30, inflation:40, social_anger:20, nationalism:25, gov_trust:40, middle_confidence:32, army_influence:20, revolution:15, political_violence:10 }, tick:{ economy: { base:0.3, boostY:1923, boost:0.8, peakM:[9,10,11], peak:1.5 }, /* 通胀节奏(V0.8 调缓):上半年温和爬升,7-8月加速,9-10月冲刺,11/15地租马克后骤降。 原配置(全年 boost 1.2)会让通胀 2 月就崩盘,全年戏提前泄劲。 */ inflation: { base:0.1, boostM:[7,8], boost:0.35, peakM:[9,10], peak:0.8, collapseDay:{ m:11, d:15, val:-3.0 }, postCollapseMonth:12, postCollapseVal:-1.0 }, revolution:{ boostY:1923, boostM:10, boost:0.5 } }, /* fate_range 放宽到 ±100(滑轨全轴):出口门闸要求 ±90, 原 ±70 钳制会让门闸永远够不着(2026-10-09 修复)。 ±90 仍需整年持续极化才摸得到——门闸本身保持"极难"定位。 */ deck:"S3", fate_range:{ min:-100, max:100 }, exit_gates:[ /* 因果 flag 与实际写入点对齐(同为 2026-10-09 修复): uprising_victory ← C02「总起义前夜」顺水推舟选项(65_event_templates); mil_outcome="得逞" ← C03「政变前夜」默许政变条件选项(同 政变之夜 的 清理/蛰伏/裂痕 字段)。 */ { fate:-90, check:"flags.uprising_victory", val:"victory", next:"BR_RED_SPRING" }, { fate:90, check:"mil_outcome", val:"得逞", next:"BR_MARCH_ON_BERLIN" } ], meta:{ density:3, end_date:{y:1923, m:12, d:31}, note:"危机元年 · 当前章" } }, WEIMAR_1927: { num:4, id:"S4", timeline:"WEIMAR_1927", name:"黄金岁月", year:1927, theme:"繁荣的幻觉、文化狂欢", world_base:{ economy:20, inflation:5, social_anger:10, nationalism:20, gov_trust:55, middle_confidence:55, army_influence:18, revolution:8, political_violence:10 }, tick:null, deck:"S4", fate_range:{min:-70,max:70}, exit_gates:[], meta:{ density:2, note:"TODO 骨架" } }, WEIMAR_1930: { num:5, id:"S5", timeline:"WEIMAR_1930", name:"大萧条与极化", year:1930, theme:"危机重临且更深、民主退潮", world_base:{ economy:15, inflation:5, social_anger:35, nationalism:50, gov_trust:30, middle_confidence:20, army_influence:40, revolution:30, political_violence:35 }, tick:null, deck:"S5", fate_range:{min:-85,max:85}, exit_gates:[], meta:{ density:3, note:"TODO 骨架" } }, WEIMAR_1933: { num:6, id:"S6", timeline:"WEIMAR_1933", name:"垂死与抉择", year:1933, theme:"共和国最后一局、或存续", world_base:{ economy:45, inflation:10, social_anger:50, nationalism:65, gov_trust:20, middle_confidence:12, army_influence:55, revolution:40, political_violence:55 }, tick:null, deck:"S6", fate_range:{min:-90,max:90}, exit_gates:[], meta:{ density:3, note:"TODO 骨架" } } }>> <<set $stage to $phases.WEIMAR_1923>> /* 当前相位指针(S3) */ /* ---------- 【共和国数值→张力转化状态】(人格系统) ---------- 记录各数值历史峰值与累计涨幅,用于"破新高→魏玛夜谈变现"。 peak:该数值历史最高值(决定是否触发变现) gain:自上次变现以来的累计涨幅(短期急涨判定) converted:该数值是否已变现过(防止重复触发) */ <<set $world_peak to { inflation: 60, social_anger: 50, political_violence: 45, revolution: 50 }>> <<set $world_gain to { inflation: 0, social_anger: 0, political_violence: 0, revolution: 0 }>> <<set $world_converted to { inflation: false, social_anger: false, political_violence: false, revolution: false }>> <<set $weimar_night_talk to false>> /* 夜谈变现待触发标记 */ <<set $weimar_night_history to []>> /* 夜谈实际发生过的 session_day 记录(频率限制用) */ <<set $weimar_night_forced_until to 0>> /* 强制冷却结束的 day:该 day 前魏玛晚上不来(连续来两三天后触发) */ <<set $weimar_pending_convert to "">> /* 待变现的数值key */ <<set $last_convert to "">> /* 上次变现的数值key(debug用) */ /* ---------- 【事件母体系统】(Layer 3 · $archetypes)---------- 事件母体 = 条件 + 权重 + 结果分支 + 文本模板 世界压力过载时,从母体生成事件(不再从预设牌库抽)。 每个母体定义"什么压力下会产生什么事件"。 */ <<set $archetypes to [ { id:"arch_econ_crisis", name:"经济危机", category:"经济", conditions:{stat:"world.economy",op:"gte",val:55}, cooldown:5, weight_condition:{economy:1.5, middle_confidence:-0.6}, outcomes:[ { id:"物价飞涨", weight:40, tag:"经济压力", template:"decision", intensity:30, world_effects:{"economy":5,"social_anger":3} }, { id:"黑市扩大", weight:30, tag:"经济压力", template:"survival", intensity:25, world_effects:{"economy":3,"gov_trust":-2} }, { id:"工厂倒闭", weight:20, tag:"工人愤怒", template:"action", intensity:35, world_effects:{"social_anger":5,"economy":3} }, { id:"银行挤兑", weight:10, tag:"货币信任下降", template:"decision", intensity:40, world_effects:{"inflation":5,"economy":5} } ]}, { id:"arch_inflation", name:"通胀恶化", category:"经济", conditions:{stat:"world.inflation",op:"gte",val:60}, cooldown:4, weight_condition:{inflation:1.5, middle_confidence:-0.6}, outcomes:[ { id:"大面额马克遭拒收", weight:35, tag:"货币信任下降", template:"decision", intensity:30, world_effects:{"inflation":5,"social_anger":3} }, { id:"外汇黑市", weight:30, tag:"经济压力", template:"survival", intensity:25, world_effects:{"economy":3,"gov_trust":-3} }, { id:"工资谈判破裂", weight:20, tag:"工人愤怒", template:"action", intensity:30, world_effects:{"social_anger":5} }, { id:"中产储蓄归零", weight:15, tag:"经济压力", template:"stance", intensity:35, world_effects:{"social_anger":5,"gov_trust":-5,"middle_confidence":-8} } ]}, { id:"arch_unemployment", name:"失业潮", category:"经济", conditions:{stat:"world.economy",op:"gte",val:65}, cooldown:6, weight_condition:{economy:1.2}, outcomes:[ { id:"码头工人失业", weight:40, tag:"工人愤怒", template:"action", intensity:30, world_effects:{"social_anger":4,"revolution":3} }, { id:"白领阶层沦落", weight:25, tag:"经济压力", template:"survey", intensity:25, world_effects:{"social_anger":3,"gov_trust":-3,"middle_confidence":-5} }, { id:"乞讨者增多", weight:35, tag:"经济压力", template:"observe", intensity:20, world_effects:{"social_anger":2,"gov_trust":-2} } ]}, { id:"arch_speculation", name:"投机横行", category:"经济", conditions:{stat:"world.inflation",op:"gte",val:50}, cooldown:5, weight_condition:{inflation:1.2}, outcomes:[ { id:"暴发户炫耀", weight:40, tag:"经济压力", template:"stance", intensity:20, world_effects:{"social_anger":3} }, { id:"外汇贩子活跃", weight:35, tag:"经济压力", template:"survival", intensity:25, world_effects:{"economy":2,"gov_trust":-2}, scene:"kurfurstendamm" }, { id:"资本外逃", weight:25, tag:"经济压力", template:"decision", intensity:30, world_effects:{"economy":5,"gov_trust":-3} } ]}, { id:"arch_labor_unrest", name:"劳工动荡", category:"社会", conditions:{stat:"world.social_anger",op:"gte",val:50}, cooldown:4, weight_condition:{social_anger:1.5}, outcomes:[ { id:"罢工蔓延", weight:35, tag:"工人愤怒", template:"action", intensity:35, world_effects:{"social_anger":3,"economy":3} }, { id:"工会请愿", weight:30, tag:"工人愤怒", template:"decision", intensity:25, world_effects:{"social_anger":-2,"gov_trust":2} }, { id:"街头冲突", weight:20, tag:"政治暴力增加", template:"action", intensity:30, world_effects:{"political_violence":5,"social_anger":3} }, { id:"工人占领工厂", weight:15, tag:"工人愤怒", template:"action", intensity:40, world_effects:{"revolution":5,"social_anger":3}, scene:"kreuzberg", fate_weight:-2 } ]}, { id:"arch_revolution", name:"革命暗流", category:"社会", conditions:{stat:"world.revolution",op:"gte",val:50}, cooldown:5, weight_condition:{revolution:1.5}, outcomes:[ { id:"传单散发", weight:35, tag:"工人愤怒", template:"action", intensity:25, world_effects:{"revolution":3,"social_anger":2} }, { id:"地下集会", weight:30, tag:"政治暴力增加", template:"survey", intensity:30, world_effects:{"revolution":3} }, { id:"武装训练", weight:20, tag:"政治暴力增加", template:"action", intensity:40, world_effects:{"revolution":5,"political_violence":3}, fate_weight:-1.5 }, { id:"告密者", weight:15, tag:"政治暴力增加", template:"survival", intensity:30, world_effects:{"revolution":-3,"gov_trust":-2} } ]}, { id:"arch_food_shortage", name:"粮食短缺", category:"社会", conditions:{stat:"world.economy",op:"gte",val:60}, cooldown:4, weight_condition:{economy:1.0}, outcomes:[ { id:"面包店排队", weight:40, tag:"经济压力", template:"observe", intensity:15, world_effects:{"social_anger":2} }, { id:"抢粮事件", weight:30, tag:"工人愤怒", template:"action", intensity:35, world_effects:{"social_anger":5,"political_violence":3}, scene:"friedrichshain" }, { id:"配给制讨论", weight:30, tag:"经济压力", template:"decision", intensity:25, world_effects:{"gov_trust":2,"social_anger":-2} } ]}, { id:"arch_refugee", name:"难民涌入", category:"社会", conditions:{stat:"world.economy",op:"gte",val:50}, cooldown:6, weight_condition:{economy:1.0, nationalism:0.8}, outcomes:[ { id:"鲁尔难民到柏林", weight:50, tag:"民族屈辱", template:"action", intensity:25, world_effects:{"social_anger":2,"nationalism":3}, scene:"anhalter" }, { id:"占领区儿童撤离", weight:30, tag:"民族屈辱", template:"action", intensity:20, world_effects:{"social_anger":3,"nationalism":2} }, { id:"边境流民", weight:20, tag:"经济压力", template:"survey", intensity:20, world_effects:{"economy":2,"social_anger":2} } ]}, { id:"arch_nationalism", name:"民族主义躁动", category:"政治", conditions:{stat:"world.nationalism",op:"gte",val:55}, cooldown:5, weight_condition:{nationalism:1.5}, outcomes:[ { id:"右翼集会", weight:35, tag:"民族主义", template:"stance", intensity:30, world_effects:{"nationalism":3,"political_violence":2}, fate_weight:1.5 }, { id:"殉道者崇拜", weight:25, tag:"民族主义", template:"survey", intensity:25, world_effects:{"nationalism":5} }, { id:"复仇主义宣传", weight:25, tag:"民族屈辱", template:"stance", intensity:30, world_effects:{"nationalism":3,"gov_trust":-2} }, { id:"排外情绪", weight:15, tag:"政治暴力增加", template:"action", intensity:35, world_effects:{"political_violence":5,"nationalism":2} } ]}, { id:"arch_gov_crisis", name:"政府危机", category:"政治", conditions:{stat:"world.gov_trust",op:"lte",val:25}, cooldown:6, weight_condition:{gov_trust:-1.5}, outcomes:[ { id:"不信任动议", weight:35, tag:"政府信誉", template:"decision", intensity:35, world_effects:{"gov_trust":-3} }, { id:"内阁改组", weight:30, tag:"政府信誉", template:"decision", intensity:30, world_effects:{"gov_trust":3,"economy":2} }, { id:"示威倒阁", weight:20, tag:"工人愤怒", template:"action", intensity:35, world_effects:{"gov_trust":-5,"social_anger":3} }, { id:"第48条讨论", weight:15, tag:"政治暴力增加", template:"decision", intensity:40, world_effects:{"army_influence":5,"gov_trust":-3} } ]}, { id:"arch_separatism", name:"分离主义", category:"政治", conditions:{stat:"world.nationalism",op:"gte",val:60}, cooldown:7, weight_condition:{nationalism:1.5}, outcomes:[ { id:"巴伐利亚对抗柏林", weight:40, tag:"民族主义", template:"action", intensity:35, world_effects:{"nationalism":3,"political_violence":3} }, { id:"莱茵分离主义", weight:30, tag:"民族屈辱", template:"survey", intensity:30, world_effects:{"nationalism":2,"gov_trust":-3} }, { id:"地方武装集结", weight:30, tag:"军队不满", template:"action", intensity:35, world_effects:{"political_violence":3,"army_influence":3} } ]}, { id:"arch_media_war", name:"舆论战", category:"政治", conditions:{stat:"world.gov_trust",op:"lte",val:30}, cooldown:4, weight_condition:{gov_trust:-1.5}, outcomes:[ { id:"报纸攻击政府", weight:40, tag:"政府信誉", template:"stance", intensity:25, world_effects:{"gov_trust":-3} }, { id:"谣言扩散", weight:35, tag:"政治暴力增加", template:"survey", intensity:20, world_effects:{"social_anger":2,"gov_trust":-2} }, { id:"报馆被冲击", weight:25, tag:"政治暴力增加", template:"action", intensity:30, world_effects:{"political_violence":5} } ]}, { id:"arch_military", name:"军方异动", category:"军事", conditions:{stat:"world.army_influence",op:"gte",val:45}, cooldown:6, weight_condition:{army_influence:1.5}, outcomes:[ { id:"军官密谋", weight:35, tag:"军队不满", template:"survey", intensity:35, world_effects:{"army_influence":3,"political_violence":2}, scene:"tiergarten", fate_weight:2 }, { id:"志愿团集结", weight:30, tag:"军队不满", template:"action", intensity:30, world_effects:{"political_violence":3,"army_influence":2} }, { id:"政变传言", weight:20, tag:"政治暴力增加", template:"decision", intensity:40, world_effects:{"political_violence":5,"gov_trust":-3} }, { id:"国防军抗命", weight:15, tag:"军队不满", template:"decision", intensity:45, world_effects:{"army_influence":5,"gov_trust":-5} } ]}, { id:"arch_political_violence", name:"政治暴力", category:"军事", conditions:{stat:"world.political_violence",op:"gte",val:45}, cooldown:3, weight_condition:{political_violence:1.5}, outcomes:[ { id:"街头斗殴", weight:35, tag:"政治暴力增加", template:"action", intensity:25, world_effects:{"political_violence":3} }, { id:"暗杀事件", weight:25, tag:"政治暴力增加", template:"action", intensity:40, world_effects:{"political_violence":5,"social_anger":3} }, { id:"冲锋队挑衅", weight:25, tag:"民族主义", template:"action", intensity:30, world_effects:{"political_violence":3,"nationalism":2} }, { id:"警方镇压", weight:15, tag:"政治暴力增加", template:"decision", intensity:35, world_effects:{"political_violence":-2,"social_anger":3} } ]}, { id:"arch_paramilitary", name:"准军事组织", category:"军事", conditions:{stat:"world.political_violence",op:"gte",val:55}, cooldown:5, weight_condition:{political_violence:1.5}, outcomes:[ { id:"冲锋队扩编", weight:40, tag:"民族主义", template:"action", intensity:35, world_effects:{"political_violence":3,"nationalism":3} }, { id:"红色阵线活动", weight:35, tag:"工人愤怒", template:"action", intensity:35, world_effects:{"revolution":3,"political_violence":3} }, { id:"街头巡逻", weight:25, tag:"政治暴力增加", template:"survey", intensity:30, world_effects:{"political_violence":2,"social_anger":3} } ]}, { id:"arch_fiscal", name:"财政危机", category:"经济", conditions:{stat:"world.economy",op:"gte",val:50}, cooldown:5, weight_condition:{economy:1.4, inflation:0.8}, outcomes:[ { id:"财政黑洞", weight:34, tag:"经济压力", template:"decision", intensity:32, world_effects:{"economy":4,"gov_trust":-2} }, { id:"增税与抗税", weight:30, tag:"工人愤怒", template:"decision", intensity:32, world_effects:{"social_anger":4,"economy":2} }, { id:"国债无人认购", weight:20, tag:"货币信任下降", template:"decision", intensity:36, world_effects:{"economy":3,"gov_trust":-3} }, { id:"军费挤占民生", weight:16, tag:"军队不满", template:"decision", intensity:30, world_effects:{"army_influence":3,"social_anger":3} } ]} ]>> <<set $archetype_cooldowns to {}>> /* key=母体id, value=上次触发的session_day */
<<red-opts-init>> /* 填充红色/暗涌事件选项数据表($red_opts/$red_prompts) */ /* ---------- 事件冷却(≥60天) ---------- key=具体事件 title,value=被选中的 session_day。收录后 60 天不再出现; 相当于洗牌后丢回牌库底,至少 60 天后才可能再次上手。 */ <<set $event_cooldowns to {}>> /* key=title, value=session_day */ /* ---------- 现场处置记录 ---------- key=区域,value={ title, status, at_day }。现场事件处理完毕当日记一笔, 区域内当天显示“此事已了结 / 待后续(欠条待兑现)”,隔天不再显示。 */ <<set $site_done to {}>> /* ---------- 白色事件(日常小事件) ---------- 低数值、多维度、每日公文感;最常被抽出。$white_deck 为牌库(title 列表), white-roll 按权重+60天冷却出牌;$white_cooldowns[key]=title/value=上次上手日。 数值普遍很小(0~2),氛围写实,不危急、不离奇。 */ <<set $white_deck to [ "歌剧院新季揭幕", "包豪斯教授解聘争议", "铁路货运调度积压", "小国外长约见", "军营卫生巡查报告", "某邦请求中央批准河流疏浚", "副刊作家逆评", "农业协会请求降低农业税", "电台直播音乐会", "汉堡与不来梅港口管辖权争议", "德语拼写之争", "某邦博物馆请求将私人收藏划归国有", "国家图书馆请求转移手稿", "邮政部与某邦邮政管辖争议", "某邦拟将前皇室园林改为建筑用地", "柏林电车公司与工会夜班津贴争议", "莱茵河某段堤坝年久失修", "工人夜校筹办", "各邦流动商贩执照规定不一", "气象台拟在东部边境增设观测站", "柏林消防队与某邦消防队跨区支援争议", "某邦养老院协会请求中央增加冬季燃料补贴", "某邦拟将历史公园改为建筑用地", "儿童接种登记", "前帝国档案归属争议", "各邦小酒馆营业时间规定不一" ]>> <<set $white_cooldowns to {}>> /* key=title, value=上次上手 session_day */ /* ---------- 记事本·长线选项 ---------- 部分选项(卧底/暗中记名/暗访/摸网)是"长线"的:选了先入记事本、状态"追查中", 若干天后触发 Notebook_Reveal 收束为"已生效/第二阶段",并回显"上一次的选择……"。 */ <<set $notebook to []>> /* {key, tag, title, status, born, due} */ <<set $last_ll_key to "">> /* 最近登记的追查线,供 reveal 场景定位 */ /* 记事本增强:深挖消耗行动点/最早可挖日/同线最多深挖次数;催线=花行动点提前收线 */ <<set $notebook_config to { dig_cost_tp: 1, dig_min_day: 2, dig_bonus_threshold: 1, hurry_cost_tp: 1, hurry_days: 3 }>> /* ---------- 军方线(长线剧情链)状态 ---------- 0=潜伏 < 3=摊牌:玩家处理军方三桩事(军官密谋/政变传言/国防军抗命)到第3件, 触发最后的抉择事件「政变之夜」。$mil_outcome 记录最终走向(得逞/清洗/蛰伏)。 */ <<set $mil_line to 0>>\ <<set $mil_climax_done to false>>\ <<set $mil_outcome to "">> /* ---------- 【事件池相关】 ---------- */ <<set $event_log to []>> /* 已发生事件记录 */ <<set $pending_events to []>> /* 待处理事件队列 */ <<set $last_aggregation to null>> /* 上次聚合检测结果 */ <<set $event_counter to 0>> /* 事件ID自增计数器 */ <<set $world_yesterday to null>> /* 昨日世界快照(用于简报对比)*/ <<set $trust_yesterday to null>> /* 昨日信任快照(侧边栏信任卡箭头用)*/ <<set $legacy_counter to 0>> /* 遗产ID自增计数器 */ <<set $inertia_counter to 0>> /* 惯性ID自增计数器 */ <<set $pending_cap to 12>> /* 待处理事件队列上限(防积压雪崩) */ <<set $site_followups to []>> /* 延迟后续事件队列 {due_day, deck_id, ...}(长线现场链) */ <<set $fu_src_fb to null>> /* site-followup-add 的对象中转变量(delayed 回访带原事件 fb_data) */ <<set $fu_notice_seen to 0>> /* 本日已提示过「几天后回访」的后续数量(防手记重复渲染) */ /* ---------- 【历史暗涌系统】备选红色事件(Layer 红色·暗涌) ---------- 历史巨浪 = 红色事件(既定、必发生、按日期硬触发) 历史暗涌 = 备选事件(极可能发生但实际未发生;判定通过时替换/改写原事件) 判定(63_swell_gate.twee:两道门+一颗骰子): gate.hard 硬门槛——全过暗涌才「可能」发生,缺一即历史照旧; gate.soft 加权项——每满足一条 +w 分,推高触发概率(深度经营玩家的优势所在); 骰子 p = base_p + step_p×加权分(封顶 max_p,永不 100%); 硬门槛过但骰子未中 → 晨报「风声」(差点发生,每暗涌每章最多一次); 每章触发上限见 $swell_cfg(替换制/独立制分开计数)。 条件项 { t:类型, k:键, min:下限 或 max:上限, w:权重 },t 类型: world=世界变量 party=政党好感 regionnpc=邦国拟人好感 weimar=魏玛中层(intl_trust等) tag=标签强度 flag=玩家选择痕迹 player=个人状态 fate=命运轴 unlock=区域解锁 */ <<set $swell_cfg to { base_p: 15, /* 硬门槛刚过、加权项全不满足时的触发概率%(常规玩家档) */ step_p: 12, /* 每满足 1 点加权分增加的概率% */ max_p: 75, /* 概率上限%(永不必然发生) */ max_replace_per_stage: 2, /* 每章替换制暗涌上限 */ max_free_per_stage: 2, /* 每章独立暗涌上限 */ rumor_on: true, /* 「差点发生」风声开关 */ free_daily_scale: 0.5 /* 独立暗涌每日概率 = 概率 × 此系数(每日判定,防硬核玩家必中) */ }>> <<set $swell_fired to { replace: 0, free: 0 }>> /* 本章已触发暗涌数(阶段切换时清零) */ <<set $swell_rumor_pending to []>> /* 待上晨报的风声队列 {id,title,text} */ <<set $swell_events to [ /* ── 替换制暗涌(target=红事件id):在该红事件到期日判定一次 ── */ /* S01:R06 柏林总罢工 → 全国总动员(工人愤怒+革命压力爆表;KPD 关系/工人愤怒标签加分) */ { id:"S01", target:"R06", priority:70, title:"总罢工升级为全国总动员", tag:"工人愤怒", template:"action", intensity:85, irreversible:4, world_effects:{"political_violence":8,"revolution":6,"social_anger":5,"gov_trust":-4}, desc:"内政部急报:柏林总罢工未止于柏林。消息沿铁路线外传,汉堡、科隆、鲁尔等地工人相继放下工具。KPD已喊出全国总罢工。内政部认为,此事已超出地方警力处置范围,请总理府定夺。", gate:{ hard:[ { t:"world", k:"political_violence", min:60 }, { t:"world", k:"revolution", min:55 } ], soft:[ { t:"world", k:"political_violence", min:75, w:1 }, { t:"world", k:"revolution", min:70, w:1 }, { t:"party", k:"kpd", min:40, w:1 }, { t:"tag", k:"工人愤怒", min:15, w:1 } ], rumor:"码头工人换班的时间越来越不准。有人说,他们在等一个日子。" } }, /* S02:R12 汉堡起义 → 起义席卷多城(政治暴力+革命压力爆表;KPD 深度经营加分) */ { id:"S02", target:"R12", priority:75, title:"汉堡起义点燃多城响应", tag:"政治暴力增加", template:"action", intensity:90, irreversible:4, world_effects:{"political_violence":10,"revolution":8,"gov_trust":-6}, desc:"内政部急报:汉堡起义未如预期孤立。鲁尔、萨克森与莱茵地区在同日出现响应,KPD中央已改电文,号召全国响应。多地警察局报告警力不足。部里请示中央如何处置。", gate:{ hard:[ { t:"world", k:"political_violence", min:70 }, { t:"world", k:"revolution", min:65 } ], soft:[ { t:"world", k:"political_violence", min:80, w:1 }, { t:"world", k:"revolution", min:75, w:1 }, { t:"party", k:"kpd", min:50, w:1 }, { t:"tag", k:"政治暴力增加", min:15, w:1 } ], rumor:"三个城市的宪兵队在同一天申请了增援。报告没有说明理由。" } }, /* S03:R14 啤酒馆暴动 → 慕尼黑军队倒戈,暴动得逞(民族主义+军方不满双高;军方/DNVP 好感加分) */ { id:"S03", target:"R14", priority:75, title:"啤酒馆暴动得逞:慕尼黑变色", tag:"民族主义", template:"decision", intensity:90, irreversible:4, world_effects:{"nationalism":8,"army_influence":6,"political_violence":6,"gov_trust":-6}, desc:"巴伐利亚邦政府宣布脱离共和国。慕尼黑卫戍部队未予镇压,部分军官已公开站在暴动者一边。邦政府向柏林发出最后通牒。内政部请示中央是否采取行动。", gate:{ hard:[ { t:"world", k:"nationalism", min:75 }, { t:"world", k:"army_influence", min:65 } ], soft:[ { t:"world", k:"nationalism", min:85, w:1 }, { t:"world", k:"army_influence", min:75, w:1 }, { t:"party", k:"army", min:40, w:1 }, { t:"party", k:"dnvp", min:40, w:1 } ], rumor:"慕尼黑的军官俱乐部最近夜夜满座。没人透露他们在庆祝什么。" } }, /* S04:R13 清除萨克森 → 萨克森武装抵抗(革命压力爆表;KPD/萨克森邦拟人好感加分) */ { id:"S04", target:"R13", priority:70, title:"萨克森武装抵抗:国防军遇阻", tag:"政治暴力增加", template:"action", intensity:85, irreversible:4, world_effects:{"political_violence":8,"revolution":5,"army_influence":4,"gov_trust":-4}, desc:"国防部呈报:国防军开进萨克森时遭遇武装抵抗,工人政府支持者已构筑街垒,分发武器。邦内局势超出原计划预期。部里请示是否增兵。", gate:{ hard:[ { t:"world", k:"revolution", min:70 }, { t:"world", k:"political_violence", min:60 } ], soft:[ { t:"world", k:"revolution", min:80, w:1 }, { t:"world", k:"political_violence", min:70, w:1 }, { t:"party", k:"kpd", min:40, w:1 }, { t:"regionnpc", k:"saxony", min:35, w:1 } ], rumor:"萨克森的工厂夜里还亮着灯。值夜的人比白班还多。" } }, /* S05:R10 巴伐利亚独裁 → 巴伐利亚与军方秘密结盟(军方影响高;军方/巴伐利亚/DNVP 好感加分) */ { id:"S05", target:"R10", priority:75, title:"巴伐利亚与军方结盟:共和国裂痕", tag:"民族主义", template:"decision", intensity:90, irreversible:4, world_effects:{"nationalism":7,"army_influence":7,"political_violence":5,"gov_trust":-6}, desc:"内政部密报:巴伐利亚邦政府与国防军部分军官在边境小站秘密会面。据线报,双方已达成某种默契,慕尼黑获得军方默许,柏林对此未获通报。部里请示如何处置。", gate:{ hard:[ { t:"world", k:"army_influence", min:70 }, { t:"world", k:"nationalism", min:65 } ], soft:[ { t:"world", k:"army_influence", min:80, w:1 }, { t:"party", k:"army", min:40, w:1 }, { t:"regionnpc", k:"bavaria", min:30, w:1 }, { t:"party", k:"dnvp", min:40, w:1 } ], rumor:"有人在边境小站看见穿便装的军官下车。他没走旅客通道。" } }, /* S06:R16 地租马克 → 货币改革失控(通胀爆表+政府信任崩塌;常规玩家后期也常够门槛的一件) */ { id:"S06", target:"R16", priority:70, title:"地租马克失效:通胀持续失控", tag:"货币信任下降", template:"decision", intensity:85, irreversible:4, world_effects:{"inflation":8,"economy":6,"social_anger":6,"gov_trust":-8,"nationalism":2}, desc:"财政部急报:地租马克发行后未能止住通胀。市场对新钞接受度有限,旧通胀继续蔓延。部里请示是否追加担保,或另作安排。", gate:{ hard:[ { t:"world", k:"inflation", min:80 }, { t:"world", k:"gov_trust", max:20 } ], soft:[ { t:"world", k:"inflation", min:90, w:1 }, { t:"world", k:"economy", min:60, w:1 }, { t:"world", k:"gov_trust", max:10, w:1 }, { t:"tag", k:"经济压力", min:20, w:1 } ], rumor:"央行走廊里开始有人小声念叨一个数字。比现在市面上的任何一个都大。" } }, /* ── 独立暗涌(target "*"):不替换任何红色事件,世界状态够坏时自行涌上水面(每日判定,60天冷却) ── */ /* S07:莱茵兰分离(民族主义高 + 国际信任低;国际信任再低加分) */ { id:"S07", target:"*", priority:70, title:"莱茵共和国分离运动", tag:"民族屈辱", template:"decision", intensity:85, irreversible:4, world_effects:{"nationalism":4,"intl_trust":-3,"gov_trust":-2,"political_violence":2}, desc:"外交部呈报:莱茵兰分离主义者在法国占领当局默许下,于亚琛、科布伦茨等地宣布成立莱茵共和国,并寻求法国承认。当地部分官员已表示服从新政权。部里请示中央如何回应。", gate:{ hard:[ { t:"world", k:"nationalism", min:60 }, { t:"weimar", k:"intl_trust", max:35 } ], soft:[ { t:"world", k:"nationalism", min:70, w:1 }, { t:"weimar", k:"intl_trust", max:25, w:1 } ], rumor:"科布伦茨来的信封上贴着没人见过的邮票。收发室把它登记成了「误投」。" } }, /* S08:外交部长遇刺余波(政治暴力气候成形;右翼好感/暴力标签加分) */ { id:"S08", target:"*", priority:70, title:"外交部长遇刺余波", tag:"政治暴力增加", template:"decision", intensity:85, irreversible:4, world_effects:{"political_violence":4,"gov_trust":-2,"social_anger":2}, desc:"外交部呈报:外交部长在柏林近郊遇刺身亡。凶手据信与右翼组织有关。政府内部震动,部里请示是否采取特别措施。", gate:{ hard:[ { t:"world", k:"political_violence", min:55 } ], soft:[ { t:"world", k:"political_violence", min:65, w:1 }, { t:"party", k:"dnvp", min:40, w:1 }, { t:"tag", k:"政治暴力增加", min:15, w:1 } ], rumor:"外交部有人开始坐末班电车下班。保镖在站台上等他,他假装不认识。" } }, /* S09:黑色国防军(军方影响坐大;军方/DNVP 好感加分) */ { id:"S09", target:"*", priority:68, title:"黑色国防军与秘密动员", tag:"军方影响", template:"decision", intensity:80, irreversible:4, world_effects:{"army_influence":4,"intl_trust":-2,"gov_trust":-1}, desc:"国防部密报:军方部分单位与右翼准军事组织合作,绕过《凡尔赛条约》限制,秘密训练人员、储存武器。此项活动未向内阁通报。部里请示如何处置。", gate:{ hard:[ { t:"world", k:"army_influence", min:60 } ], soft:[ { t:"world", k:"army_influence", min:70, w:1 }, { t:"party", k:"army", min:45, w:1 }, { t:"party", k:"dnvp", min:40, w:1 } ], rumor:"梅克伦堡的猎场最近不对外人开放。看守说是打猎季,可猎季还没到。" } }, /* S10:农民拒售粮食(通胀+经济双高压垮乡村;经济压力标签加分) */ { id:"S10", target:"*", priority:66, title:"农民运动与粮食拒售", tag:"经济压力", template:"decision", intensity:80, irreversible:3, world_effects:{"economy":3,"social_anger":3,"inflation":2}, desc:"农业部呈报:多地农民因工业品价格飞涨、农产品被限价,拒绝向城市出售粮食,部分地方出现武装护粮。城市供应日趋紧张。部里请示如何处置。", gate:{ hard:[ { t:"world", k:"economy", min:60 }, { t:"world", k:"inflation", min:65 } ], soft:[ { t:"world", k:"economy", min:70, w:1 }, { t:"world", k:"inflation", min:75, w:1 }, { t:"tag", k:"经济压力", min:20, w:1 } ], rumor:"进城的粮车比上个月少了一半。集市上的秤,称出来的分量一天比一天虚。" } }, /* S11:军内政变密谋(军方影响极高 + 政府信任崩塌;军方好感加分) */ { id:"S11", target:"*", priority:72, title:"国防军内部政变密谋", tag:"军方影响", template:"decision", intensity:90, irreversible:4, world_effects:{"army_influence":4,"political_violence":3,"gov_trust":-4}, desc:"内政部密报:国防军内部部分军官与右翼组织、巴伐利亚势力保持联系,曾讨论向柏林进军、建立军事独裁。目前尚无确凿证据表明行动迫在眉睫。部里请示如何处置。", gate:{ hard:[ { t:"world", k:"army_influence", min:65 }, { t:"world", k:"gov_trust", max:40 } ], soft:[ { t:"world", k:"army_influence", min:75, w:1 }, { t:"world", k:"gov_trust", max:30, w:1 }, { t:"party", k:"army", min:45, w:1 } ], rumor:"有人说,本德勒街的灯最近熄得比往常晚。也有人说,那只是省电。" } }, /* S12:协约国最后通牒(经济深水区 + 外交孤立;DVP 好感加分) */ { id:"S12", target:"*", priority:72, title:"协约国最后通牒与赔款重谈", tag:"经济压力", template:"decision", intensity:90, irreversible:4, world_effects:{"economy":4,"intl_trust":-3,"nationalism":3,"gov_trust":-2}, desc:"外交部呈报:协约国就赔款问题发出最后通牒,要求德国在规定期限内接受新的赔款安排,否则将扩大制裁。部里请示政府如何回应。", gate:{ hard:[ { t:"world", k:"economy", min:65 }, { t:"weimar", k:"intl_trust", max:35 } ], soft:[ { t:"world", k:"economy", min:75, w:1 }, { t:"weimar", k:"intl_trust", max:25, w:1 }, { t:"party", k:"dvp", min:40, w:1 } ], rumor:"译电科连续三天加班。有份电文译到一半被调走了,等级比部长的阅件权还高。" } }, /* S13:新闻界与政府审查冲突(社会愤怒 + 政府信誉双低;DDP 失望加分) */ { id:"S13", target:"*", priority:64, title:"新闻界与政府审查冲突", tag:"政府信誉", template:"decision", intensity:70, irreversible:3, world_effects:{"gov_trust":-2,"social_anger":2}, desc:"总理府新闻处呈报:左右翼报纸连日攻击政府,部分报道泄露外交与军事机密,另有报纸公开煽动反对现政府。新闻界内部对是否应受管制争论激烈。部里请示是否加强新闻审查。", gate:{ hard:[ { t:"world", k:"social_anger", min:55 }, { t:"world", k:"gov_trust", max:45 } ], soft:[ { t:"world", k:"social_anger", min:65, w:1 }, { t:"world", k:"gov_trust", max:35, w:1 }, { t:"party", k:"ddp", max:35, w:1 } ], rumor:"几家大报的主编在同一天推掉了总理府的午餐邀请。理由栏都是空的。" } } ]>> /* ---------- 【文件篮事件系统】独立事件层(60件公文决策事件) ---------- 与区域小事件/区域事件并存,是不同性质与玩法的独立层。 数据池 $file_basket_events 在 88_file_basket_events.twee 定义。 */ <<set $event_pool to { seen_count: {}, last_seen: {}, cooling_until: {} }>>\ <<set $last_event_day to -1>> /* 上次文件篮事件出现的 session_day */ <<set $days_without_event to 0>> /* 连续无文件篮事件天数(保底用) */ <<set $file_basket_events to []>> /* 文件篮事件池,先置空避免 undefined */ <<fb-init-data>> /* 填充60件公文决策事件数据 */ <<set $valve_state to {}>> /* 泄压阀门计数:economy/social_anger 各 {days,cooldown}(valve-check 维护) */ /* ---------- 【地区事件库】短名单四区:固定要事 + 机动状况(刷新/挂载后续再接) ---------- */ <<set $region_events to []>>\ <<region-event-init>> /* 填充地区事件库数据 */ /* ---------- 【报纸系统】每周一自动生成,存入 $newspaper_archive ---------- */ <<set $newspaper_archive to []>>\ <<set $newspaper_current to null>>\ <<set $newspaper_issue_count to 0>>\ <<set $np_last_world to null>> /* 上一期生成时的世界变量快照(用于计算周变化) */ <<set $np_last_log_idx to 0>> /* 上一期生成时的 event_log 索引(用于提取本周事件) */ <<set $np_last_gen_day to -7>> /* 上一期生成时的 session_day(避免同一天重复生成) */ <<set $np_has_new to false>> /* 是否有新报纸未读 */ <<newspaper-init-pools>> /* 加载报纸文本池 */
/* ---------- 【政党拟人】按信任度分档叙事文本 ---------- */ <<party-personality-init>> /* 填充 $pp 文本池 */ <<party-trust100-init>> /* 填充 $pp 的 100 档专属文本 */ <<spd-reviews-init>> /* 填充红色事件 SPD 专属评价表 */ <<ddp-reviews-init>> /* 填充红色事件 DDP 专属评价表 */ <<dvp-reviews-init>> /* 填充红色事件 DVP 专属评价表 */ <<party-reviews-rekey>> /* 专属评价表按位重挂:键对齐 $red_opts 现行选项文字(改稿润色后自动跟随) */ <<affection-cards-init>> /* 填充好感卡组(擦肩反应+跨档瞬间) */ /* ---------- 【政党档案解锁】亲和度与立场计数 ---------- */ <<set $party_affinity_count to { spd: 0, kpd: 0, ddp: 0, dvp: 0, zentrum: 0, dnvp: 0, nsdap: 0, army: 0 }>> <<set $party_aligned_count to { spd: 0, kpd: 0, ddp: 0, dvp: 0, zentrum: 0, dnvp: 0, nsdap: 0, army: 0 }>> <<set $party_archive_unlocked to { spd: { fear: false, want: false, memory: false }, kpd: { fear: false, want: false, memory: false }, ddp: { fear: false, want: false, memory: false }, dvp: { fear: false, want: false, memory: false }, zentrum: { fear: false, want: false, memory: false }, dnvp: { fear: false, want: false, memory: false }, nsdap: { fear: false, want: false, memory: false }, army: { fear: false, want: false, memory: false } }>> /* ---------- 【满信任里程碑】分档回报(60同盟/80心声/100巅峰) ---------- 第一波只填 SPD 与 DNVP 的完整内容,其余党建结构待后续扩展。 arc_state:none=未触发 / pulling=光谱拉拢中 / offered=正式邀请 / accepted=已接受 / refused=已拒绝 */ <<set $party_milestones to { spd: { ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" }, dnvp: { ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" }, kpd: { ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" }, ddp: { ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" }, dvp: { ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" }, zentrum:{ ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" }, nsdap: { ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" }, army: { ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" } }>> /* DNVP 遗属抚恤长期标志:true=每月从稳定度/经济持续扣 */ <<set $dnvp_pension to false>>\ /* DNVP 试炼时间门控:记录上一次做试炼的 session_day(一天只做一关) */ <<set $dnvp_last_trial_day to null>>\ /* DNVP 额外立场试炼链进度:0-3,三道全过但光谱不够格时触发,做完即进正式邀约 */ <<set $dnvp_extra_step to 0>>\ /* 魏玛「察觉背叛」谈话:是否已触发过(一次性) */ <<set $weimar_betray_talk_done to false>>\ /* 魏玛背叛谈话的选项记录(1/2/3) */ <<set $talk_betrayal_choice to 0>>\ /* KPD 革命线:试炼进度/时间门控/额外链 */ <<set $kpd_trials to { a:false, b:false, c:false }>>\ <<set $kpd_pull to 0>>\ <<set $kpd_last_day to null>>\ <<set $kpd_extra_step to 0>>\ <<set $kpd_arc to "">>\ /* 许诺事件待晋升队列:承诺后几天到期才进入文件篮 */ <<set $promise_pending to []>>\ /* SPD 守护盟约:是否已缔结 / 事件结果记录 */ <<set $spd_covenant to false>>\ <<set $spd_arc to "">>\ /* SPD 阶段性点评触发记录 / 信任低谈话是否已发生 */ <<set $spd_notes to {}>>\ <<set $spd_distrust_talk_done to false>>\ /* SPD 敌对地盘提醒触发记录 */ <<set $spd_region_notes to {}>> /* DDP 宪法之约:是否已缔结 / 事件结果记录 */ <<set $ddp_covenant to false>>\ <<set $ddp_arc to "">>\ <<set $ddp_promise to "">>\ /* DDP 阶段性点评触发记录 */ <<set $ddp_notes to {}>> /* DVP 治国之约:是否已缔结 / 事件结果记录 */ <<set $dvp_covenant to false>>\ <<set $dvp_arc to "">>\ <<set $dvp_promise to "">>\ /* Zentrum 守门之约:是否已缔结 / 事件结果记录 */ <<set $zentrum_covenant to false>>\ <<set $zentrum_arc to "">>\ <<set $zentrum_promise to "">>\ /* NSDAP 运动邀约:事件结果记录 */ <<set $nsdap_arc to "">>\ /* 军方效忠邀约:事件结果记录 */ <<set $army_arc to "">> /* ---------- 【秘密结盟账本】(结盟系统 §2) ---------- 每党一条,带独立 exposure(0-100)。 established_day=0 表示尚未秘密结盟;>0 表示已立约。 exposure 越高越易暴露;broken=true 为暴露破裂终态。 P1 只做数据模型 + 暴露递增 + 四级判定,附加要求/投名状后波接入。 */ <<set $secret_ledger to { kpd: { pid:"kpd", partner:"KPD", established_day:0, exposure:0, suspect:false, flagged:false, broken:false, demands:0, tier:0, deeds:[], leverage:0 }, dnvp: { pid:"dnvp", partner:"DNVP", established_day:0, exposure:0, suspect:false, flagged:false, broken:false, demands:0, tier:0, deeds:[], leverage:0 }, nsdap:{ pid:"nsdap",partner:"NSDAP",established_day:0, exposure:0, suspect:false, flagged:false, broken:false, demands:0, tier:0, deeds:[], leverage:0 }, army: { pid:"army", partner:"军方", established_day:0, exposure:0, suspect:false, flagged:false, broken:false, demands:0, tier:0, deeds:[], leverage:0 } }>> /* 暴露值递增节拍:每累计3天结算一次 */ <<set $secret_tick_day to 0>>\ /* 公开接触计数:去该党地盘/接触一次 +1(影响 exposure 递增) */ <<set $secret_contact to { kpd:0, dnvp:0, nsdap:0, army:0 }>>\ /* 已暴露待处理队列:exposure 达阈值时 push,供投名状事件(P3)拾取 */ <<set $secret_exposed_queue to []>> /* ---------- 【起疑附加要求】(P2) ---------- $secret_demand:当前待处理的一条要求;null=无要求。 { pid, type, text, issue_day } type=sabotage(跑图)/sign(签字)/stance(承诺) $secret_demand_history:每党上次给要求的天数(节流,避免每次结算都生成) */ <<set $secret_demand to null>>\ <<set $secret_demand_history to { kpd:0, dnvp:0, nsdap:0, army:0 }>> /* ---------- 【大联合政府】(结盟系统 §5) ---------- members:已公开结盟的温和党 pid;>=3 时 active=true(大联盟奖励后波接入) spokesman:大联盟激活时随机抽一位温和党作为代言人(代表四位共同利益说话) spokesman_shown:代言人专属互动是否已展示(只显示一次) */ <<set $covenant to { members: [], active: false, bonus_applied: false, spokesman: null, spokesman_shown: false }>> /* ---------- 【玩家行为修正】(事件池算法用,V0.5-A 预留) ---------- */ <<set $player_modifier to 1.0>>\ <<set $daily_event_count to 0>> /* 今日已生成母体事件数 */ <<set $daily_event_cap to 2>> /* 每日母体事件上限 */ <<set $kabarett_today to 0>> /* 今日卡巴莱已消费次数 */ /* ---------- 【幕间侧写系统】 ---------- */ <<set $act_report to null>> /* 当前幕间侧写文本(null=无侧写) */ <<set $act_num to 0>> /* 当前幕号 */ /* ---------- 运行时反馈变量(调试用,预初始化避免 def 判定 null 报错) ---------- */ <<set $tmp_found to -1>>\ <<set $last_event_roll to []>>\ <<set $crisis_notice to []>>\ <<set $last_resolve to "">>\ <<set $last_inertia_check to []>>\ <<set $last_shock to "">>\ <<set $last_tension_release to "">>\ <<set $last_awaken to []>>\ <<set $last_father_check to []>>\ <<set $last_aggregation to []>>\ <<set $last_inheritance to "">>\ <<set $last_fusion to []>>\ <<set $prompt_color to "white">> /* ---------- 【阵营兼容性表】(V0.4-D 附录A,供继承判定用) ---------- key=阵营, value={compat:[兼容阵营], conflict:[冲突阵营]} "有限"=0.5系数, "强烈冲突"=0.0系数, 其余默认1.0 */ <<set $ideology_compat to { weimar: { compat: ["spd","ddp","dvp","zentrum"], conflict: ["kpd","dnvp","nsdap"] }, spd: { compat: ["kpd有限","weimar","ddp"], conflict: ["dnvp","nsdap"] }, kpd: { compat: ["spd有限"], conflict: ["dnvp","nsdap","ddp","dvp","zentrum","weimar","军方"] }, dnvp: { compat: ["nsdap有限","军方"], conflict: ["weimar","spd","kpd","ddp"] }, ddp: { compat: ["weimar","spd","dvp","zentrum"], conflict: ["kpd","nsdap"] }, dvp: { compat: ["weimar","ddp","zentrum"], conflict: ["kpd","dnvp有限"] }, zentrum: { compat: ["weimar","ddp","dvp"], conflict: ["kpd","nsdap强烈"] }, nsdap: { compat: ["dnvp有限"], conflict: ["weimar","spd","kpd","ddp","zentrum"] }, 军方: { compat: ["dnvp","nsdap有限","weimar有限"], conflict: ["kpd"] } }>> /* ---------- 【区域】完整柏林地图(21个+3外景) ---------- 每个区域:name(显示名), district(所属大区), atmosphere, stability, danger, tilt(-100左~+100右), unlocked(是否可访问), desc(进入文字), tags, visit_count, last_visit, active_event 外景地需要特殊条件解锁。 */ <<set $regions to { /* 区一:权力走廊 */ chancellery: { name: "总理府", passage: "Region_Chancellery", district: "权力走廊", landmark: "办公室", atmosphere: "沉重", stability: 70, danger: 15, tilt: 0, unlocked: true, tp_cost: 0, tp_fatigue: 0, tags: [], visit_count: 0, last_visit: null, active_event: null }, presidency: { name: "总统府", passage: "Region_Presidency", district: "权力走廊", landmark: "总统", atmosphere: "肃穆", stability: 75, danger: 10, tilt: 5, unlocked: false, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, reichstag: { name: "国会大厦", passage: "Region_Reichstag", district: "权力走廊", landmark: "议会", atmosphere: "喧嚣", stability: 60, danger: 25, tilt: 0, unlocked: false, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, foreign_office: { name: "外交部", passage: "Region_ForeignOffice", district: "权力走廊", landmark: "照会", atmosphere: "克制", stability: 70, danger: 10, tilt: 5, unlocked: false, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, finance_ministry: { name: "财政部", passage: "Region_FinanceMinistry", district: "权力走廊", landmark: "账房", atmosphere: "紧绷", stability: 65, danger: 15, tilt: 0, unlocked: true, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, /* 区二:旧精英与军方 */ tiergarten: { name: "蒂尔加滕", passage: "Region_Tiergarten", district: "旧精英与军方", landmark: "军官", atmosphere: "沉默", stability: 60, danger: 30, tilt: 10, unlocked: true, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, charlottenburg: { name: "夏洛滕堡", passage: "Region_Charlottenburg", district: "旧精英与军方", landmark: "军官住宅", atmosphere: "傲慢", stability: 65, danger: 20, tilt: 15, unlocked: false, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, officers_club: { name: "军官俱乐部", passage: "Region_OfficersClub", district: "旧精英与军方", landmark: "军方密谋", atmosphere: "烟熏", stability: 55, danger: 25, tilt: 20, unlocked: false, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, /* 区三:新西部与波希米亚 */ kurfurstendamm: { name: "选帝侯大街", passage: "Region_Kurfurstendamm", district: "新西部与波希米亚", landmark: "霓虹灯", atmosphere: "奢靡", stability: 55, danger: 15, tilt: 5, unlocked: true, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, romanisches: { name: "罗曼咖啡馆", passage: "Region_Romanisches", district: "新西部与波希米亚", landmark: "知识分子", atmosphere: "喧嚣", stability: 60, danger: 10, tilt: -5, unlocked: true, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, kabarett: { name: "卡巴莱", passage: "Region_Kabarett", district: "新西部与波希米亚", landmark: "夜生活", atmosphere: "迷醉", stability: 45, danger: 20, tilt: -10, unlocked: true, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, /* 区四:工人与左翼 */ kreuzberg: { name: "克罗伊茨贝格", passage: "Region_Kreuzberg", district: "工人与左翼", landmark: "工会", atmosphere: "紧绷", stability: 50, danger: 40, tilt: -20, unlocked: true, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, wedding: { name: "威丁", passage: "Region_Wedding", district: "工人与左翼", landmark: "KPD票仓", atmosphere: "愤怒", stability: 40, danger: 50, tilt: -30, unlocked: false, tp_cost: 2, tp_fatigue: 3, tags: [], visit_count: 0, last_visit: null, active_event: null }, friedrichshain: { name: "弗里德里希斯海因", passage: "Region_Friedrichshain", district: "工人与左翼", landmark: "工厂", atmosphere: "疲惫", stability: 45, danger: 35, tilt: -25, unlocked: true, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, moabit: { name: "莫阿比特", passage: "Region_Moabit", district: "工人与左翼", landmark: "监狱", atmosphere: "灰暗", stability: 35, danger: 45, tilt: -15, unlocked: false, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, /* 区五:公共空间与枢纽 */ alexanderplatz: { name: "亚历山大广场", passage: "Region_Alexanderplatz", district: "公共空间与枢纽", landmark: "霓虹灯", atmosphere: "嘈杂", stability: 50, danger: 30, tilt: 0, unlocked: true, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, police_hq: { name: "红堡·警察总局", passage: "Region_PoliceHQ", district: "公共空间与枢纽", landmark: "治安", atmosphere: "威严", stability: 65, danger: 30, tilt: 5, unlocked: true, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, brandenburg: { name: "勃兰登堡门", passage: "Region_Brandenburg", district: "公共空间与枢纽", landmark: "国门", atmosphere: "肃杀", stability: 55, danger: 35, tilt: 0, unlocked: false, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, unter_den_linden: { name: "菩提树下大街", passage: "Region_UnterDenLinden", district: "公共空间与枢纽", landmark: "大学", atmosphere: "庄严", stability: 65, danger: 20, tilt: 5, unlocked: true, tp_cost: 1, tp_fatigue: 1, tags: [], visit_count: 0, last_visit: null, active_event: null }, /* 区六:口岸与边缘 */ anhalter: { name: "安哈尔特火车站", passage: "Region_Anhalter", district: "口岸与边缘", landmark: "鲁尔难民", atmosphere: "混乱", stability: 40, danger: 35, tilt: 0, unlocked: true, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, potsdamer: { name: "波茨坦火车站", passage: "Region_Potsdamer", district: "口岸与边缘", landmark: "巴伐利亚来客", atmosphere: "嘈杂", stability: 42, danger: 30, tilt: 5, unlocked: true, tp_cost: 2, tp_fatigue: 2, tags: [], visit_count: 0, last_visit: null, active_event: null }, /* 外景地 */ ruhr_essen: { name: "埃森·鲁尔区", passage: "Region_Ruhr", district: "外景地", landmark: "法军占领", atmosphere: "紧张", stability: 30, danger: 60, tilt: -10, unlocked: false, tp_cost: 3, tp_fatigue: 5, tags: [], visit_count: 0, last_visit: null, active_event: null }, munich: { name: "慕尼黑", passage: "Region_Munich", district: "外景地", landmark: "NSDAP", atmosphere: "躁动", stability: 35, danger: 55, tilt: 20, unlocked: false, tp_cost: 3, tp_fatigue: 5, tags: [], visit_count: 0, last_visit: null, active_event: null }, hamburg: { name: "汉堡", passage: "Region_Hamburg", district: "外景地", landmark: "码头", atmosphere: "压抑", stability: 40, danger: 50, tilt: -25, unlocked: false, tp_cost: 3, tp_fatigue: 5, tags: [], visit_count: 0, last_visit: null, active_event: null } }>> <<set $current_region to null>> /* ---------- 【NPC意识体】(V0.4-E §5,MVP 5个) ---------- */ <<set $npcs to { weimar: { trust: 50, goals: ["共和国存续"], alliance: {} }, spd: { trust: 60, goals: ["工人利益","民主维护"], alliance: {} }, kpd: { trust: 10, goals: ["无产阶级革命"], alliance: {} }, ddp: { trust: 50, goals: ["自由主义","议会民主"], alliance: {} }, dvp: { trust: 40, goals: ["工商业利益","务实妥协"], alliance: {} }, zentrum: { trust: 45, goals: ["天主教利益","中间路线"], alliance: {} }, dnvp: { trust: 25, goals: ["恢复传统秩序"], alliance: {} }, nsdap: { trust: 5, goals: ["民族革命","推翻共和国"], alliance: {} }, army: { trust: 30, goals: ["军队利益","秩序"], alliance: {} }, police: { trust: 30, met: false, goals: ["秩序","预算"], alliance: {} }, dvp_pm: { trust: 0, goals: ["务实妥协","共和国存续","外交正常化"], alliance: {}, active: false } }>> /* ---------- 【地区拟人】(旧王国 · 王座记忆,非政党信任) ---------- 六位邦国拟人。结构对齐 $npcs:trust(0-100,走 bill-apply-effects 钳制)。 区别于政党:不是利益交换型信任,是「王座记忆的认可」,可说软话/提旧事/讲所求。 base_city: 驻地城市(出差地/绕道拜访的落点),passage: 绕道拜访场景。 文本池 $region_pp 在 77b_region_actions.twee 初始化,取档 region-npc-line。 */ <<set $region_npcs to { prussia: { trust: 25, state_name: "普鲁士自由邦", short_name: "普鲁士", base_city: "柯尼斯堡", passage: "Scene_Visit_Prussia", goals: ["秩序","效忠的惯性"], alliance: {} }, bavaria: { trust: 18, state_name: "巴伐利亚自由邦", short_name: "巴伐利亚", base_city: "慕尼黑", passage: "Scene_Visit_Bavaria", goals: ["乡愁","自治"], alliance: {} }, saxony: { trust: 43, state_name: "萨克森自由邦", short_name: "萨克森", base_city: "德累斯顿", passage: "Scene_Visit_Saxony", goals: ["工业","手艺"], alliance: {} }, wurttemberg:{ trust: 35, state_name: "符腾堡自由邦", short_name: "符腾堡", base_city: "斯图加特", passage: "Scene_Visit_Wurttemberg", goals: ["王室工业","经得住下传"], alliance: {} }, baden: { trust: 50, state_name: "巴登", short_name: "巴登", base_city: "卡尔斯鲁厄", passage: "Scene_Visit_Baden", goals: ["共和","清醒"], alliance: {} }, hamburg: { trust: 40, state_name: "汉堡自由汉萨城", short_name: "汉堡", base_city: "汉堡", passage: "Scene_Visit_Hamburg", goals: ["贸易","过路"], alliance: {} } }>> /* ---------- 地区拟人:召见状态字段默认值 ---------- */ <<for _rnk range Object.keys($region_npcs)>>\ <<set $region_npcs[_rnk].arrive_day to -1>>\ <<set $region_npcs[_rnk].met_last_arrival to false>>\ <<set $region_npcs[_rnk].last_meet_day to -1>>\ <<set $region_npcs[_rnk].visit_count to 0>>\ <</for>>\ <<set $region_npc_chat to { active: false, rounds_used: 0, tp_used: 0 }>> /* ---------- 【政治光谱】双轴 ---------- */ <<set $spectrum to { left_right: 0, /* -100左 ~ 0中 ~ +100右 */ radical_conservative: 0 /* -100激进 ~ 0中 ~ +100保守 */ }>> /* ---------- 【党派提案清单】(V0.4-F 骨架) ---------- 每条提案字段: id / party(党) / title / category(类别) start_stage+end_stage(时效) / persistent(长期诉求,贯穿全场) base_support(基础支持率) / bendable(可否软化) effects(通过后效果) / narrative(叙事文本) / axis(关联轴向) counterfactual(反事实牌,三层闸门解锁) / historical(贴近历史的真实提案) type("bill"正式提案默认 / "pressure"外部压力牌) resolution(外部压力牌的应对选项骨架,见设计稿8.2) 过滤逻辑:按当前阶段选 persistent 或 start≤当前≤end; 反事实牌额外检查 unlock 三层闸门; 条件权重:长期诉求 = 基础概率 + 世界状态吻合加成。 数值为方向性设定,细节待 playtest 平衡。 */ <<set $party_proposals to { /* SPD(社会民主党):执政联盟主力、工人政党、民主维护者 */ spd: [ /* 时效案:鲁尔工人紧急救济案 */ {id:"spd_01", party:"spd", title:"鲁尔工人紧急救济案", category:"社会", start_stage:"S3", end_stage:"S3", persistent:false, base_support:55, bendable:true, historical:true, effects:{economy:-5, social_anger:-15, party_trust:{spd:10}}, narrative:"鲁尔的矿工在罢工,也在挨饿。消极抵抗的旗子不能当饭吃——救济要钱,钱从哪来?SPD 说:先救工人,再谈其他。", axis:"左"}, /* 时效案:通胀工资指数化法案 */ {id:"spd_02", party:"spd", title:"通胀工资指数化法案", category:"社会/经济", start_stage:"S3", end_stage:"S3", persistent:false, base_support:50, bendable:true, historical:true, effects:{inflation:5, social_anger:-20, party_trust:{spd:15, dvp:-5}}, narrative:"昨天发的工资,今天买不起面包。SPD 要求工资与物价挂钩——工人们等不了一个月,他们等的是当天的数字。", axis:"左"}, /* 时效案:工人代表权扩展法案 */ {id:"spd_03", party:"spd", title:"工人代表权扩展法案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:true, historical:true, effects:{social_anger:-10, party_trust:{spd:10, kpd:-5, dvp:-10}}, narrative:"矿场停工的时候,工人们连个能说话的人都没有。SPD 想把工厂委员会的法律地位抬高——企业说这是干预,SPD 说这是讨价还价。", axis:"左"}, /* 长期诉求:八小时工作制保护案 */ {id:"spd_04", party:"spd", title:"八小时工作制保护案", category:"社会", start_stage:"S1", end_stage:null, persistent:true, base_support:60, bendable:false, historical:true, effects:{economy:-3, social_anger:-5, party_trust:{spd:10}}, narrative:"1918 年赢回来的八小时,1923 年正在被通胀和加班一点点偷走。SPD 的老人们还记得,这时间是用街垒换来的。", axis:"左"}, /* 反事实牌(左):鲁尔工人自治委员会案 */ {id:"spd_05", party:"spd", title:"鲁尔工人自治委员会案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:40, bendable:false, counterfactual:true, effects:{social_anger:-15, revolution:6, party_trust:{spd:10, kpd:8, dvp:-8, army:-10}}, narrative:"SPD 的党魁盯着你看了很久,最后说:「如果非要和工人说话,我们得用他们的语言。」他推过来的文件上,写着鲁尔工人自治委员会。", axis:"左"}, /* 反事实牌(右):财政紧缩与军事预算优先案 */ {id:"spd_06", party:"spd", title:"财政紧缩与军事预算优先案", category:"政治/军事", start_stage:"S3", end_stage:"S3", persistent:false, base_support:50, bendable:false, counterfactual:true, effects:{social_anger:20, party_trust:{army:15, dvp:10, spd:-10}}, narrative:"SPD 党魁的脸色很难看。「如果共和国要活下去,这次我们得先保住军队的预算。工人……以后再说。」——有人小声说,这是 SPD 的另一个 1914。", axis:"右"} ], /* KPD(德国共产党):革命党、工人政党、议会内外的双面手 */ kpd: [ /* 时效案:没收投机商财产案 */ {id:"kpd_01", party:"kpd", title:"没收投机商财产案", category:"经济", start_stage:"S3", end_stage:"S3", persistent:false, base_support:40, bendable:false, historical:true, effects:{inflation:-10, social_anger:-15, party_trust:{kpd:15, dvp:-10, zentrum:-5}}, narrative:"投机商把金条锁进保险箱,把废纸一样的马克甩给工人当工资。KPD 说:没收他们的仓库、货栈和钱。钱不滚了,物价才肯低头。", axis:"左"}, /* 时效案:失业工人全面救济案 */ {id:"kpd_02", party:"kpd", title:"失业工人全面救济案", category:"社会", start_stage:"S3", end_stage:"S3", persistent:false, base_support:50, bendable:true, historical:true, effects:{economy:-8, social_anger:-20, party_trust:{kpd:15, spd:5, dvp:-10}}, narrative:"失业的工人站在街角,数着面包店几点降价。KPD 说:政府出钱养他们,养到工厂重新冒烟。资本家骂这是养懒汉,可工人记得是谁提的。", axis:"左"}, /* 时效案:银行与重工业国有化案 */ {id:"kpd_03", party:"kpd", title:"银行与重工业国有化案", category:"经济", start_stage:"S3", end_stage:"S3", persistent:false, base_support:35, bendable:false, historical:true, effects:{economy:-5, social_anger:-10, party_trust:{kpd:10, dvp:-15, zentrum:-10, army:-10}}, narrative:"重工业的钢铁现在在给谁造东西,柏林说不清。KPD 说:把银行和重工业收归国有,共和国才有自己的骨头。中间的议员听完,脸色发白。", axis:"左"}, /* 长期诉求:武装工人案 */ {id:"kpd_04", party:"kpd", title:"武装工人案", category:"军事", start_stage:"S1", end_stage:null, persistent:true, base_support:30, bendable:false, historical:true, effects:{revolution:10, political_violence:8, army_influence:-10, party_trust:{kpd:15, army:-20, spd:-15, zentrum:-10}}, narrative:"KPD 的老口号:武装起来。他们说的不是国防军,是工人。「要保卫共和国,先让工人手里有枪。」——这句话一出,会议室安静了三十秒。", axis:"左"}, /* 反事实牌(右):统一战线联合工会案 */ {id:"kpd_05", party:"kpd", title:"统一战线联合工会案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:false, counterfactual:true, effects:{social_anger:-20, revolution:-15, party_trust:{kpd:10, spd:15, dvp:5}}, narrative:"KPD 的书记推过来一份文件:「我们先不谈革命,谈谈工会。」——当年被开除出党的那批老人们,把写满「统一战线」的纸又拿了出来。共产国际说这是叛变;可如果你点头,他们会把它递进国会。", axis:"右"}, /* 反事实牌(左):全国起义号召案 */ {id:"kpd_06", party:"kpd", title:"全国起义号召案", category:"政治/军事", start_stage:"S3", end_stage:"S3", persistent:false, base_support:35, bendable:false, counterfactual:true, effects:{revolution:25, political_violence:20, gov_trust:-15, party_trust:{kpd:20, army:-15, spd:-20, zentrum:-15}}, narrative:"克姆尼茨会议上,有人拍着桌子:「等通知就是等死。十月不动,就永远不用动了。」——历史上他们最后一刻收回了手。如果你递进去的不是收手的信号,而是动手的信号……", axis:"左"} ], /* DDP(德意志民主党):自由派、宪法党、中产与知识分子的共和国 */ ddp: [ /* 时效案:中产储蓄救助案 */ {id:"ddp_01", party:"ddp", title:"中产储蓄救助案", category:"经济/社会", start_stage:"S3", end_stage:"S3", persistent:false, base_support:50, bendable:true, historical:true, effects:{inflation:-5, social_anger:-10, economy:-5, party_trust:{ddp:15, dvp:10, spd:-5}}, narrative:"一个中学教师的毕生积蓄,现在买不了一磅黄油。DDP 的议员声音发颤:共和国可以欠工人的,不能欠教师的。他说的是共和国最忠实的阶层——而他们正在被通胀连根拔起。", axis:"中"}, /* 时效案:宪法防线案 */ {id:"ddp_02", party:"ddp", title:"宪法防线案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:true, historical:true, effects:{gov_trust:-5, political_violence:-5, party_trust:{ddp:15, zentrum:10, spd:10, army:-5}}, narrative:"宪法写了第 48 条,是让共和国在最坏的日子有根拐杖,不是让总理拄着它过日子。DDP 要求:紧急状态要有期限,期限一到,权力回到国会。", axis:"中"}, /* 长期诉求:文官中立与法治案 */ {id:"ddp_03", party:"ddp", title:"文官中立与法治案", category:"政治", start_stage:"S1", end_stage:null, persistent:true, base_support:55, bendable:false, historical:true, effects:{gov_trust:5, political_violence:-5, party_trust:{ddp:10, zentrum:5, dnvp:-10}}, narrative:"邮差、法官、警察——他们领共和国的薪水,心里却还记着皇帝的生日。DDP 要文官宣誓忠于宪法。老官僚们笑:宪法管得了领带结的方向吗?", axis:"中"}, /* 时效案:没收财产的司法审查案 */ {id:"ddp_04", party:"ddp", title:"没收财产的司法审查案", category:"司法", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:true, historical:true, effects:{gov_trust:-3, social_anger:-5, party_trust:{ddp:15, spd:5, zentrum:10}}, narrative:"共和国没收了投机商的金子,也顺走了普通人的嫁妆。DDP 说:没收可以,但让法官说话。当政府的手伸得太远,宪法是唯一的绳索。", axis:"中"}, /* 反事实牌(右):民族自由党化案 */ {id:"ddp_05", party:"ddp", title:"民族自由党化案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:50, bendable:false, counterfactual:true, effects:{nationalism:10, gov_trust:5, party_trust:{ddp:10, dnvp:10, nsdap:5, spd:-15, kpd:-10}}, narrative:"党内年轻人说:再不谈民族,中产就要跑光了。他们递来的纲领里,「民主」两个字排到了「德意志」后面。——写宪法的那只手,如今在学喊口号。", axis:"右"}, /* 反事实牌(左):宪法社会主义案 */ {id:"ddp_06", party:"ddp", title:"宪法社会主义案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:false, counterfactual:true, effects:{social_anger:-20, gov_trust:5, party_trust:{ddp:15, spd:15, kpd:5, dvp:-15, dnvp:-10}}, narrative:"最老的那批自由派说:共和国的第二口气,要从工人嘴里吸。他们要 DDP 跟 SPD 一起,把「经济民主」写进宪法——把共和国的敌人从左边也堵死。", axis:"左"} ], /* DVP(德意志人民党):民族自由派、工商业代言人、1923 的危机执政者 */ dvp: [ /* 时效案:结束消极抵抗案 */ {id:"dvp_01", party:"dvp", title:"结束消极抵抗案", category:"外交", start_stage:"S3", end_stage:"S3", persistent:false, base_support:60, bendable:true, historical:true, effects:{inflation:-10, nationalism:5, social_anger:5, party_trust:{dvp:15, ddp:10, spd:5, dnvp:-15, nsdap:-15}}, narrative:"印钞机印的不是钱,是共和国最后的家底。DVP 的实业家们算了一笔账:再抵抗下去,工厂和工人一起饿死。他们说:谈判桌上拿不回来的,战场上更拿不回来。", axis:"中"}, /* 时效案:地租马克与财政稳定案 */ {id:"dvp_02", party:"dvp", title:"地租马克与财政稳定案", category:"经济", start_stage:"S3", end_stage:"S3", persistent:false, base_support:55, bendable:true, historical:true, effects:{inflation:-20, economy:-5, party_trust:{dvp:15, ddp:10, zentrum:10, spd:5, kpd:-10}}, narrative:"纸马克已经买不到它的印刷成本。DVP 的财政专家推过来一份抵押品:用土地和实物做底,发一种新钱。工人不信,银行家盯着看——总得有人先迈出这一步。", axis:"中"}, /* 长期诉求:劳资仲裁与产业和平案 */ {id:"dvp_03", party:"dvp", title:"劳资仲裁与产业和平案", category:"经济", start_stage:"S1", end_stage:null, persistent:true, base_support:50, bendable:false, historical:true, effects:{social_anger:-10, economy:-3, political_violence:-5, party_trust:{dvp:10, spd:5, kpd:-10}}, narrative:"工厂主和工人,谁也不比谁先饿死。DVP 主张把罢工和锁厂都交到仲裁桌上——资本家要秩序,共和国要喘息。至少他们说的是秩序。", axis:"中"}, /* 时效案:重开与法国谈判案 */ {id:"dvp_04", party:"dvp", title:"重开与法国谈判案", category:"外交", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:true, historical:true, effects:{economy:-5, nationalism:5, gov_trust:5, party_trust:{dvp:10, ddp:10, dnvp:-10, nsdap:-10}}, narrative:"伦敦在喊停,巴黎在冷笑——停战之后,德国第一次有人认真想谈。DVP 说:谈钱不丢人,丢人的是让人民为一场打不赢的仗继续付钱。", axis:"中"}, /* 反事实牌(右):重工业党团夺权案 */ {id:"dvp_05", party:"dvp", title:"重工业党团夺权案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:false, counterfactual:true, effects:{nationalism:10, social_anger:10, gov_trust:-5, party_trust:{dvp:15, dnvp:10, army:10, spd:-15, kpd:-10, ddp:-10}}, narrative:"重工业巨头的会客厅里,有人递给党部一张支票,附着一张名单。名单上的人主张:联合右翼,把党主席那套「社会合作」扔进莱茵河。——务实妥协的政党,第一次打算跟妥协翻脸。", axis:"右"}, /* 反事实牌(左):务实派社会合作案 */ {id:"dvp_06", party:"dvp", title:"务实派社会合作案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:false, counterfactual:true, effects:{social_anger:-15, revolution:-10, party_trust:{dvp:10, spd:15, zentrum:10, kpd:5, army:-5}}, narrative:"党主席在党内说:共和国是我们捡回来的独轮车,推不推得动,看工人肯不肯搭手。他要 DVP 承认八小时工作制、承认工会——实业家们说这是叛变,他说这是续命。", axis:"左"} ], /* Zentrum(中央党):天主教中间党、联合政府常客、教区与柏林之间 */ zentrum: [ /* 时效案:家庭救济与社会福利案 */ {id:"zent_01", party:"zentrum", title:"家庭救济与社会福利案", category:"社会", start_stage:"S3", end_stage:"S3", persistent:false, base_support:50, bendable:true, historical:true, effects:{economy:-5, inflation:-5, social_anger:-15, party_trust:{zentrum:15, spd:10, dvp:-5}}, narrative:"教区的神父在布道台上念的不是经,是挨家挨户的饥荒名单。Zentrum 说:救济金按面包价补,孩子不能因为共和国挨饿。", axis:"中"}, /* 时效案:莱茵教区安抚案 */ {id:"zent_02", party:"zentrum", title:"莱茵教区安抚案", category:"政治/外交", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:true, historical:true, effects:{nationalism:-5, social_anger:-10, gov_trust:5, party_trust:{zentrum:15, ddp:5, dnvp:-10}}, narrative:"莱茵河边,法国的旗子在飘,「莱茵共和国」的标语也在飘。Zentrum 的议员在国会里说话,声音一半给柏林,一半给科隆的教区。——他们说:民族可以等,教区不能散。", axis:"中"}, /* 长期诉求:政教协约保障案 */ {id:"zent_03", party:"zentrum", title:"政教协约保障案", category:"宗教/政治", start_stage:"S1", end_stage:null, persistent:true, base_support:45, bendable:false, historical:true, effects:{gov_trust:5, party_trust:{zentrum:15, ddp:-5, spd:-5, kpd:-10}}, narrative:"教堂和学校,是教会碰不得的两样东西。Zentrum 要共和国跟罗马谈一份协约:教会管自己的事,共和国管自己的事,界限写进纸里。", axis:"中"}, /* 时效案:教区学校法 */ {id:"zent_04", party:"zentrum", title:"教区学校法", category:"文化/教育", start_stage:"S3", end_stage:"S3", persistent:false, base_support:40, bendable:false, historical:true, effects:{social_anger:5, party_trust:{zentrum:15, ddp:-15, spd:-15, kpd:-10}}, narrative:"老师教什么、孩子学什么,是教区的心头肉。Zentrum 要小学分设教区学校——世俗派骂这是把教室还给了神坛,他们说:不然你把教室还给谁?", axis:"中"}, /* 反事实牌(右):转向总统内阁案 */ {id:"zent_05", party:"zentrum", title:"转向总统内阁案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:false, counterfactual:true, effects:{gov_trust:-10, army_influence:10, party_trust:{zentrum:15, dnvp:10, army:10, spd:-20, ddp:-10}}, narrative:"党内有人说:议会已经救不了共和国,能救他的是总统、军队,和教区的祷告。与其在国会里跟左右两边耗着挨骂,不如把权力交出去——总统用紧急法令治国,教会用信仰安民。亲手建了国会的那批人,开始认真讨论要不要从里面搬出去。", axis:"右"}, /* 反事实牌(左):基督教社会工团案 */ {id:"zent_06", party:"zentrum", title:"基督教社会工团案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:false, counterfactual:true, effects:{social_anger:-15, economy:-5, party_trust:{zentrum:15, spd:15, kpd:5, dvp:-10, dnvp:-10}}, narrative:"天主教的劳工领袖们说:信经里没有说工人必须挨饿。他们要 Zentrum 跟 SPD 一起把「社会国家」做到底——红衣主教皱着眉,车间里的神父举起了手。", axis:"左"} ], /* DNVP(德国民族人民党):右翼君主派/民族保守,代表容克地主、旧官僚、重工业、乡村新教 */ dnvp: [ /* 时效案:君主制与传统秩序讨论案 */ {id:"dnvp_01", party:"dnvp", title:"君主制与传统秩序讨论案", category:"政治", constitutional:true, start_stage:"S3", end_stage:"S3", persistent:false, base_support:45, bendable:false, historical:true, effects:{nationalism:8, gov_trust:-5, political_violence:5, party_trust:{dnvp:15, zentrum:8, army:8, spd:-12, kpd:-15, dvp:-5}}, narrative:"每当共和国在危机里踉跄,DNVP 的老人们就想起那顶皇冠。他们不谈登基,只谈「秩序」——如果旧世界的柱子还在,共和国就不会散架。有人听出了弦外之音。", axis:"右"}, /* 时效案:东部边防与民兵整备案 */ {id:"dnvp_02", party:"dnvp", title:"东部边防与民兵整备案", category:"军事/政治", start_stage:"S3", end_stage:"S3", persistent:false, base_support:50, bendable:true, historical:true, effects:{army_influence:8, nationalism:8, intl_trust:-5, political_violence:5, party_trust:{dnvp:15, army:12, nsdap:5, spd:-10, kpd:-12}}, narrative:"波兰的边境线钉在旧帝国的伤疤上。DNVP 说:东边不能没有枪和民兵——不是要打仗,是得让对面知道,德国人还认得回家的路。", axis:"右"}, /* 时效案:乡村土地与农业保护案 */ {id:"dnvp_03", party:"dnvp", title:"乡村土地与农业保护案", category:"经济/社会", start_stage:"S3", end_stage:"S3", persistent:false, base_support:50, bendable:true, historical:true, effects:{economy:-5, social_anger:5, nationalism:5, gov_trust:3, party_trust:{dnvp:15, zentrum:10, spd:-8, kpd:-10}}, narrative:"容克的地,东部的农,乡村教堂的钟——DNVP 要保住这一切不被「城市里的红色」吞掉。他们递给你的文件里,写满了土地、粮价和教会。", axis:"右"}, /* 长期诉求:反共和宣传与清算十一月罪人案 */ {id:"dnvp_04", party:"dnvp", title:"清算「十一月罪人」案", category:"政治/司法", start_stage:"S1", end_stage:null, persistent:true, base_support:45, bendable:false, historical:true, effects:{nationalism:10, gov_trust:-8, revolution:-5, party_trust:{dnvp:15, nsdap:10, spd:-15, kpd:-18, ddp:-10}}, narrative:"1918 年签下投降的人,在 DNVP 嘴里有一个名字:十一月罪人。他们要公审、要清算、要一个「交代」。这份执念,比任何法案都活得久。", axis:"右"}, /* 反事实牌(右):旧军功贵族复权案 */ {id:"dnvp_05", party:"dnvp", title:"旧军功贵族复权案", category:"政治/军事", start_stage:"S3", end_stage:"S3", persistent:false, base_support:40, bendable:false, counterfactual:true, effects:{army_influence:10, nationalism:8, gov_trust:-5, party_trust:{army:15, dnvp:10, spd:-10, kpd:-15}}, narrative:"旧帝国的军服挂在衣柜里,没人敢穿,也没人敢扔。DNVP 的容克说:让那些丢掉俸禄、丢掉军衔的老军官回来——共和国欠他们一个位置。", axis:"右"}, /* 反事实牌(右):极端民族主义动员案 */ {id:"dnvp_06", party:"dnvp", title:"民族复兴总动员案", category:"政治/社会", start_stage:"S3", end_stage:"S3", persistent:false, base_support:40, bendable:false, counterfactual:true, effects:{nationalism:15, political_violence:10, revolution:5, gov_trust:-5, party_trust:{dnvp:12, nsdap:15, army:8, spd:-15, kpd:-18}}, narrative:"DNVP 里最躁的那群人,已经把「清算」喊成了「复兴」。他们问:共和国到底是在守卫德国,还是在拖累德国?——这个问题问出口的时候,答案已经不重要了。", axis:"右"} ], /* NSDAP(纳粹党):S3 无国会席位(1924.5 前),全部为「外部压力牌」 不占正式表决,登场呈现为危机决策(镇压/分化/容忍/谈判)。 resolution.suppress.base 为基础成功率,将叠加军方信任修正 (每10点±5%,封顶±25%)与投入政治资本(每5点+5%); trust_mod:"army" 标记该应对受军方信任修正。烈度 intensity 为 压力牌内部动态(影响暴动事件线),默认0~100。 */ nsdap: [ /* 外部压力牌:冲锋队扩编与街头动员案 */ {id:"nsdap_01", party:"nsdap", title:"冲锋队扩编与街头动员案", category:"军事/社会", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:50, bendable:false, historical:true, narrative:"慕尼黑的啤酒馆里,褐衫一天比一天多。冲锋队不要国会席位,他们要街角——每个街角。他们说:谁控制街头,谁才配谈德国的命运。", axis:"右", resolution:{ suppress:{ base:65, trust_mod:"army", cost:{capital:10}, effects:{political_violence:8, nationalism:5}, fail:{political_violence:12, gov_trust:-5} }, divide:{ base:70, req:{trust:{dnvp:25}}, cost:{capital:8}, effects:{political_violence:-5, nationalism:3} }, tolerate:{ effects:{political_violence:8, nationalism:5} }}}, /* 外部压力牌:共和国清算案 */ {id:"nsdap_02", party:"nsdap", title:"共和国清算案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:55, bendable:false, historical:true, narrative:"「十一月罪人必须付出代价。」传单在鲁尔、在柏林、在慕尼黑同时出现,字迹是同一个模板。国会里没有他们的人,但他们说:国会本身就是罪名。", axis:"右", resolution:{ suppress:{ base:70, cost:{capital:8}, effects:{nationalism:8, gov_trust:-5}, fail:{nationalism:12, gov_trust:-8} }, tolerate:{ effects:{nationalism:10, gov_trust:-5} }, negotiate:{ cost:{gov_trust:-8}, effects:{nationalism:5} }}}, /* 外部压力牌:向柏林进军案(暴动联动前奏) */ {id:"nsdap_03", party:"nsdap", title:"向柏林进军案", category:"政治/军事", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:45, bendable:false, historical:true, narrative:"慕尼黑和柏林之间,隔着一条铁路。冲锋队、民族自由团和那批老兵开始排演:占领火车站,占领广播,占领「那头」。他们给这次排演起名叫——向柏林进军。", axis:"右", resolution:{ suppress:{ base:50, trust_mod:"army", cost:{capital:15}, effects:{political_violence:15, nationalism:10}, fail:{political_violence:20} }, divide:{ base:65, req:{trust:{dnvp:30}}, cost:{capital:10}, effects:{intensity:-10, nationalism:5, party_trust:{dnvp:5}} }, tolerate:{ effects:{intensity:10} }}}, /* 外部压力牌:布尔什维克警戒案 */ {id:"nsdap_04", party:"nsdap", title:"布尔什维克警戒案", category:"意识形态", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:50, bendable:false, historical:true, narrative:"红旗每升起一面,他们就多一个理由。NSDAP 说:魏玛共和国是「莫斯科的代理人」,保卫祖国就是先消灭自己家里的敌人。他们要的不是选举,是审判。", axis:"右", resolution:{ suppress:{ base:65, trust_mod:"army", cost:{capital:10}, effects:{political_violence:8, revolution:-5, nationalism:5}, fail:{political_violence:12, gov_trust:-5} }, tolerate:{ effects:{political_violence:8, revolution:-5} }, negotiate:{ cost:{gov_trust:-8}, effects:{revolution:-5} }}}, /* 反事实牌(右):武装革命总动员案 */ {id:"nsdap_05", party:"nsdap", title:"武装革命总动员案", category:"政治/军事", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:45, bendable:false, counterfactual:true, narrative:"冲锋队的军械库里,有人打开了一只没登记的箱子。箱子里的东西不是棍棒,是枪。他们说:暴动要么不来,要来就是总动员——他们不等慕尼黑,等的是你的一封信。", axis:"右", resolution:{ suppress:{ base:40, trust_mod:"army", cost:{capital:20}, effects:{political_violence:15, nationalism:10}, fail:{political_violence:25, gov_trust:-10} }, divide:{ base:55, req:{trust:{dnvp:35}}, cost:{capital:15}, effects:{intensity:-10, party_trust:{dnvp:5}} }, tolerate:{ effects:{intensity:15, political_violence:8} }}}, /* 反事实牌(左):民族布尔什维克转向案 */ {id:"nsdap_06", party:"nsdap", title:"民族布尔什维克转向案", category:"意识形态", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:40, bendable:false, counterfactual:true, narrative:"有人从莫斯科回来,带回来一句话:资本主义的德国该死,凡尔赛的德国更该死——那为什么不一起动手?党内北方的激进派开始谈「德国工人与俄国士兵的同盟」。纳粹党的反资本主义,第一次被认真拿上台面。", axis:"左", resolution:{ suppress:{ base:60, trust_mod:"army", cost:{capital:15}, effects:{political_violence:10, nationalism:5, revolution:5}, fail:{political_violence:15, gov_trust:-8} }, divide:{ base:60, req:{trust:{dnvp:25}}, cost:{capital:10}, effects:{nationalism:5} }, tolerate:{ effects:{revolution:5, intensity:5} }}} ], /* 军方(国防军):S3 的国中之国、共和国支柱。要求以压力牌呈现, 应对为「满足/拒绝/谈判」(与 NSDAP 语义相反:NSDAP 反你, 军方保你但要你付钱)。拒绝的代价 = 军方信任降 → 镇压其他 压力牌的成功率修正进一步变差。满足则军方影响涨(喂激进右翼弦)。 */ army: [ /* 军方要求:军费补足案 */ {id:"army_01", party:"army", title:"军费补足案", category:"军事/经济", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:55, bendable:false, historical:true, narrative:"国防部长把预算案推到你面前:纸马克已经不是钱,军饷发不出,军官在典当自己的马。陆军总司令不开口,但预算表上的每一行都在替你开口。——共和国的盾牌,要钱。", axis:"右", resolution:{ satisfy:{ cost:{economy:-8, inflation:5}, effects:{army_influence:5, party_trust:{army:10}} }, refuse:{ effects:{army_influence:-5, party_trust:{army:-15}} }, negotiate:{ cost:{economy:-4}, effects:{party_trust:{army:5}} }}}, /* 军方要求:紧急状态授权案 */ {id:"army_02", party:"army", title:"紧急状态授权案", category:"军事/政治", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:50, bendable:false, historical:true, narrative:"总参谋部说:共和国的敌人不需要国会批准。他们要一份空白授权——动用国防军清剿「秩序威胁」,不必先问柏林的长桌。那张桌上,已经有人听到军靴的脚步声。", axis:"右", resolution:{ satisfy:{ cost:{gov_trust:-8}, effects:{army_influence:10, political_violence:-10, party_trust:{army:10}} }, refuse:{ effects:{party_trust:{army:-12}} }, negotiate:{ cost:{gov_trust:-4}, effects:{army_influence:5, party_trust:{army:5}} }}}, /* 军方要求:东部边境驻军案 */ {id:"army_03", party:"army", title:"东部边境驻军案", category:"军事/外交", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:45, bendable:false, historical:true, narrative:"东边的电报在催:边境要人。军方要求增调部队,并「灵活处理」凡尔赛对兵力的数字限制——数字可以写两份,一份给巴黎,一份给东部。军官们说:这是国防,不是欺骗。", axis:"右", resolution:{ satisfy:{ cost:{intl_trust:-5}, effects:{nationalism:5, army_influence:5, party_trust:{army:10}} }, refuse:{ effects:{army_influence:-5, party_trust:{army:-10}} }, negotiate:{ effects:{nationalism:3, party_trust:{army:5}} }}}, /* 军方要求:黑色国防军默许案 */ {id:"army_04", party:"army", title:"黑色国防军默许案", category:"军事/政治", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:50, bendable:false, historical:true, narrative:"凡尔赛只准十万,可东部实际养着两倍。军方说:默许他们,就是默许德国的骨气。——那些没有编制的人叫「劳动连队」,连队里的人管自己叫预备役。", axis:"右", resolution:{ satisfy:{ cost:{gov_trust:-8, intl_trust:-5}, effects:{nationalism:8, party_trust:{army:12}} }, refuse:{ effects:{army_influence:-5, party_trust:{army:-15}} }, negotiate:{ cost:{gov_trust:-4}, effects:{party_trust:{army:5}} }}}, /* 反事实牌(右):军政独裁案 */ {id:"army_05", party:"army", title:"军政独裁案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:45, bendable:false, counterfactual:true, narrative:"有人从总统府带话来:共和国需要一个能按住局面的人。陆军总司令没有拒绝,也没有问细节,只是让副官把军靴擦亮了些。——军人走进文官政府的第一步,往往不是政变,是「奉命」。", axis:"右", resolution:{ allow:{ cost:{gov_trust:-15}, effects:{army_influence:20, political_violence:-15, party_trust:{army:15}} }, limit:{ cost:{gov_trust:-8}, effects:{army_influence:10, party_trust:{army:5}} }, refuse:{ effects:{party_trust:{army:-15}} }}}, /* 反事实牌(左):共和军案 */ {id:"army_06", party:"army", title:"共和军案", category:"政治", start_stage:"S3", end_stage:"S3", persistent:false, type:"pressure", base_support:40, bendable:false, counterfactual:true, narrative:"总参谋部里,有个声音很小但没停过:让军队属于共和国,而不是共和国属于军队。他们要军官宣誓忠于宪法、撤销黑色国防军、文官监督军权。——没人敢接这话,但有些年轻军官已经把手放在了胸前。", axis:"左", resolution:{ push:{ effects:{gov_trust:10, political_violence:-10, army_influence:-10, party_trust:{army:-10, spd:10, kpd:5}} }, partial:{ effects:{gov_trust:5, army_influence:-5, party_trust:{army:-5}} }, shelve:{ effects:{party_trust:{army:5}} }}} ] }>>
/* ============================================================ 文本库 · 系统动态文字的唯一来源 场景叙述就地写在 75_scenes / 76_events_content,不进这里。 这里只放"系统生成、玩家可见"的动态文字: - 事件描述(event-spawn 按 source+related_tag 取) - 遗产叙事兜底(legacy-create 无叙事参数时) - 标签魏玛台词(tag-fuse 融合时写入 weimar_text) 使用:在 StoryInit 里 <<include "TextLibrary">> 一次即初始化 $txt。 修改文字只改本文件,不动系统逻辑。 注意:本段落不带 [widget] 标签,因为它不是 <<widget>> 定义, 只是数据初始化,带 [widget] 会导致 <<include>> 不渲染正文。 ============================================================ */ <<set $txt to { /* ===== 事件描述 ===== event-spawn 按 _source + _related_tag 取 $txt.ev[_source][_related_tag]。 无匹配则回退到 $txt.ev[_source].default。冷峻:一句定调,不解释。 */ ev: { historical: { "经济压力": "西边的电报一封接一封。马克又跌了,这次没人报价。", "工人愤怒": "克罗伊茨贝格方向冒烟了。不是烟囱。", "军队不满": "蒂尔加滕的军官们今天没散步。这不正常。", "民族屈辱": "法国使馆升了旗。柏林这边没人升。", "政府信誉": "几份报纸换了措辞。词还是那些词,味道变了。", "政治暴力增加": "昨晚又有人倒在小巷里。今天巷子被冲洗过。", "货币信任下降": "面包店挂出了新价牌。墨迹没干。", default: "一份标了「急」的文件送到了桌上。" }, "tag-induced": { "经济压力": "马克还在跌。跌得连骂它的人都没力气了。", "工人愤怒": "工会的传单印得比昨天多。纸也涨价了。", "军队不满": "军官们的沉默在变厚。", "民族屈辱": "街上有人开始唱旧歌。歌词没人记得全。", "政府信誉": "嘲讽共和国成了一种时髦。", "政治暴力增加": "冲锋队的靴子声开始有节奏了。", "货币信任下降": "店里开始拒收纸币。", default: "某种东西在变大。还没人给它命名。" }, random: { "经济压力": "面包店门口排着长队。没人说话。", "工人愤怒": "远处有人在喊。听不清喊什么,但调子是升的。", "军队不满": "一队退役军官从你身边走过。没人点头。", "民族屈辱": "墙上新刷了一行字://记住1919。//", "政府信誉": "报童今天没喊。只是举着报纸。", "政治暴力增加": "街角有血迹。已经发黑了。", "货币信任下降": "一个老太太在数钞票。数得很慢,像怕数错。", default: "柏林今天灰蒙蒙的。卖报童的嗓子哑了。" }, player: { default: "你种下的东西开始发芽了。" } }, /* ===== 遗产叙事兜底 ===== legacy-create 第五个参数为空时用。 按 decay_type 取一句冷峻定调。 */ legacy: { trauma: "一道没结痂的伤。", habit: "一件做熟了的事。", sediment: "沉到水底的东西。", ghost: "一个没走远的影子。", default: "一块被翻过去的土。" }, /* ===== 标签魏玛台词 ===== tag-fuse 融合时写入 weimar_text。 结构级(微->结构)/ 时代级(结构->时代)各一句。 */ fuse_struct: "风向变了。不是今天变的,是今天才看出来。", fuse_era: "这不是风向了。这是季节。" }>> /* ═══ 世界数值分级文本 ═══ 根据数值区间返回不同的感官化描述。 用法:在晨报/区域描述中按数值取文本。 */ <<set $world_feedback to { inflation: { range: [ { max: 20, text: "马克稳住了。面包店的价格牌三天没动了--这在柏林简直是奇迹。" }, { max: 40, text: "物价在涨,但还有规律可循。你还能在月初算出月底的开销。" }, { max: 60, text: "月初预算月末就废了。你开始习惯把工资的一半立刻换成实物。" }, { max: 80, text: "面包店老板不再报价格了,直接看顾客手里拿的钞票厚度。" }, { max: 100, text: "你的钱包在贬值,比走路还快。有人开始用马克糊墙。" } ] }, economy: { range: [ { max: 20, text: "工厂的烟囱都在冒烟。不多,但在冒。" }, { max: 40, text: "有些烟囱灭了。你路过的时候能听到停转的机器发出一种低沉的嗡鸣。" }, { max: 60, text: "排队的人比上班的人多。队伍不说话,只有鞋底踩在湿地面的声音。" }, { max: 80, text: "面包店门口的队拐了两个弯。没人说话。沉默比喊叫更重。" }, { max: 100, text: "你走过三个街区,所有店面都关着。只有当铺排着队。" } ] }, social_anger: { range: [ { max: 20, text: "街上的人走路很慢。不是累,是没什么好急的。" }, { max: 40, text: "有人在巷口争论。声音不大,但手势很大。" }, { max: 60, text: "墙上的标语变多了。浆糊还没干,字迹已经很凶。" }, { max: 80, text: "你经过人群时,有人朝你的方向吐了口痰。不是针对你。也许是。" }, { max: 100, text: "街上弥漫着烧焦的气味。不是火灾,是有人在烧传单--用火宣布开始。" } ] }, political_violence: { range: [ { max: 20, text: "夜里偶尔有哨声。也许是警察,也许是风。" }, { max: 40, text: "远处传来碎玻璃声。不远,但你选择不去想那是谁的窗户。" }, { max: 60, text: "环卫在冲洗路面。水混着颜料流进排水沟。今早又有标语被血染过。" }, { max: 80, text: "你不再走小巷了。不是怕,是没必要。大路上也不安全,但至少有目击者。" }, { max: 100, text: "街角有人倒着。你不确定他是醉了还是死了。你绕着走了。" } ] }, gov_trust: { range: [ { max: 20, text: "报纸上的措辞变了。不是骂,是嘲--嘲比骂更冷。" }, { max: 40, text: "有人在酒会上提起政府,旁边的人端起酒杯遮住了嘴。" }, { max: 60, text: "报纸还在印。骂声和赞美交替出现,你分不清哪个是真心。" }, { max: 80, text: "有人在国会为政府鼓掌。不热烈,但至少是掌声。" }, { max: 100, text: "报纸头版用了「信心」这个词。在柏林,这本身就是新闻。" } ] }, nationalism: { range: [ { max: 20, text: "帝国旗偶尔出现在窗台。不多,但在。" }, { max: 40, text: "墙上贴了新海报。鹰、爪子、口号。浆糊还没干。" }, { max: 60, text: "集会上有人喊「德意志」。喊的人不多,但声音很齐。" }, { max: 80, text: "褐色衬衫出现在街头。不游行,只是走路。但步伐太齐了。" }, { max: 100, text: "那个名字出现在头版了。不再是边栏。你数了数,这篇报道里它出现了七次。" } ] }, revolution: { range: [ { max: 20, text: "工会门口偶尔有人发传单。接的人不多。" }, { max: 40, text: "墙上刷了红漆。字不多,但颜色很刺眼。" }, { max: 60, text: "有人在工人区演讲。围了一圈人,不多,但很安静。安静意味着在听。" }, { max: 80, text: "KPD的口号出现在三个区的墙上。字迹不同,内容一样。" }, { max: 100, text: "有人在分发东西。不是传单。你不想看清是什么。" } ] }, army_influence: { range: [ { max: 20, text: "街上偶尔看到军装。不走路,散步。但步伐太齐。" }, { max: 40, text: "军官俱乐部灯火通明。在限电的冬天,这本身就是一种声明。" }, { max: 60, text: "军方的人出现在不该出现的地方--国会走廊、市政厅、你的办公室门口。" }, { max: 80, text: "有人开始用「必要时」这个词。每次出现,都离「必要」更近一步。" }, { max: 100, text: "国防军不再躲着说了。他们在公开讨论「秩序」。你知道「秩序」是什么意思。" } ] } }>> /* ═══ NPC态度层级文本 ═══ 每个政党7档,根据信任度返回一句有质感的态度描述。 写法约定:不写态度形容词("他认为你可靠"),写行为—— 他能让你看到什么、做到哪一步,信任的深浅让玩家自己读出来。 用法:<<npc-attitude "spd">> 输出存入 _attitude_text */ <<set $npc_attitude to { spd: [ { max: 10, text: "他把你的信压在待办堆的最底下。" }, { max: 25, text: "他回你的公函,只回必要的那几行。" }, { max: 45, text: "他开始把会议记录的副本,多留一份给你。" }, { max: 65, text: "他把工会代表的联络方式抄给了你。" }, { max: 80, text: "他请你直接去工会大楼,不用事先约。" }, { max: 95, text: "罢工基金的账本,他愿意摊开给你看。" }, { max: 100, text: "夜里出了事,他第一个电话打给你。" } ], kpd: [ { max: 10, text: "他的报纸点过你的名。" }, { max: 25, text: "他的人在你办公室外的街上站着。" }, { max: 45, text: "他让你旁听一次不重要的会,看你坐不坐得住。" }, { max: 65, text: "街头要出事的前一晚,他会递个信给你。" }, { max: 80, text: "他带你去过一次只许自己人进的地方。" }, { max: 95, text: "他把一条接头路线告诉了你。" }, { max: 100, text: "他问你下一步怎么走,问得很认真。" } ], ddp: [ { max: 10, text: "他把你的提案转给下属去批注。" }, { max: 25, text: "他回你的信,落款只有一个姓。" }, { max: 45, text: "他开始引用你说过的话,还注明出处。" }, { max: 65, text: "宪法条文上的事,他来问你的意见了。" }, { max: 80, text: "重要的草案,他先送到你桌上。" }, { max: 95, text: "他把名字签在你那份草案的副署栏里。" }, { max: 100, text: "那本他批注了半辈子的宪法,他借给了你。" } ], dvp: [ { max: 10, text: "他让你的电话在总机里挂了一刻钟。" }, { max: 25, text: "他收下你的名片,没有回片。" }, { max: 45, text: "他开始回你的电话了,虽然用的是秘书。" }, { max: 65, text: "他请你吃饭,账单他付,付得心甘情愿。" }, { max: 80, text: "合同文本他拟好了,只等你签字。" }, { max: 95, text: "他在你名下留了一个董事会的席位。" }, { max: 100, text: "他对别人提起你,用的是「合伙人」这个称呼。" } ], zentrum: [ { max: 10, text: "教堂门口的人流里,他没有朝你走过来。" }, { max: 25, text: "他回你的信,祝词是印好的那一种。" }, { max: 45, text: "地方上难办的事务,他开始问你的意见。" }, { max: 65, text: "他约你在教堂回廊里单独谈话。" }, { max: 80, text: "家里的婚丧大事,他给你送了请柬。" }, { max: 95, text: "教区里那桩最难看的官司,他托付给了你。" }, { max: 100, text: "晚祷的时候,他加上了你的名字。" } ], dnvp: [ { max: 10, text: "他从你身边经过,脚步没有慢下来。" }, { max: 25, text: "他允许你在客厅门口把话说完。" }, { max: 45, text: "他容许你听他谈旧时代。" }, { max: 65, text: "庄园的狩猎会,他给你递了请帖。" }, { max: 80, text: "他让管家在你手边多添了一把椅子。" }, { max: 95, text: "旧朋友的名单,他翻给你看过一页。" }, { max: 100, text: "他说,等一切回到从前,会给你留个位置。" } ], nsdap: [ { max: 10, text: "他的报纸登过挖苦你的漫画。" }, { max: 25, text: "他的队伍在你门外走过,脚步故意踩得很齐。" }, { max: 45, text: "他开始给你们寄党部集会的通知。" }, { max: 65, text: "他托人来问,能不能借你的名义办一场会。" }, { max: 80, text: "他的集会上念到了你的名字,底下有人鼓掌。" }, { max: 95, text: "他把手下一个能办事的人指给你。" }, { max: 100, text: "他说你可以直接去找他,不用通报。" } ], army: [ { max: 10, text: "他的副官答复你:访客名单上没有你。" }, { max: 25, text: "你去国防部,他没出面,茶是副官倒的。" }, { max: 45, text: "演习观礼的名册上,出现了你的名字。" }, { max: 65, text: "军方的每日简报,多出一份送到你桌上。" }, { max: 80, text: "他请你去练兵场看操,从头看到尾。" }, { max: 95, text: "动员预案的柜子,他当着你的面打开过。" }, { max: 100, text: "他说,军队开动之前,会先把路线图给你看。" } ], weimar: [ { max: 10, text: "他把要紧的文件收进抽屉,才让你进门。" }, { max: 25, text: "他给你看文件的时候,用手压住下面几页。" }, { max: 45, text: "他泡茶的时候,会顺手给你也倒一杯。" }, { max: 65, text: "他写讲稿写到一半,会停下来念给你听。" }, { max: 80, text: "他撑着额头打盹,不再避着你了。" }, { max: 95, text: "失眠的缘由,他原原本本讲给你听。" }, { max: 100, text: "他把你的字条收在贴身的口袋里。" } ] }>> /* ════════════════════════════════════════════════════════════ 【文字创作指引 · 给文字创作者】 一、风格方向 - 参考《极乐迪斯科》(Disco Elysium):陈述调重但不沉闷,精炼, 带黑色幽默和哲学感 - 操作选项(签署/退回/拖延等)直白陈述即可,不需要文学化 - 叙事段落需要氛围感和沉浸感 二、用户参考文本:「下坠与苏醒」(见 Downloads/weimar test00000.twee) 关键特征: - 魏玛不是"站在窗前说话的人",是在混沌中坠落的意识 - 被左右两股力量撕扯,在"谁杀死了德二"的谜团中诞生 - 感官描写:铁锈味、硝烟、泥泞、饥饿、疲惫 - 意识流:不是画面,是"感觉" - 低语和呼唤直接在意识里响起 - 魏玛被赋予生命同时被赋予原罪 三、需要填充的位置(在 75_scenes.twee 和 76_events_content.twee) - Scene_Intro:开场(当前为占位) - 各场景的氛围描写 - 事件内容(File_Economy / File_Workers / File_Army / File_National) - 魏玛夜话台词(Talk_Weimar) - 区域描述(咖啡馆/图书馆/克罗伊茨贝格/蒂尔加滕/码头) 四、修改方式 - 直接在对应 .twee 文件里改文字 - 或在 15_text_library.twee 的 $txt 里改动态文本 - 不需要动任何逻辑代码(<<if>>/<<link>>/<<set>> 等宏不动) ════════════════════════════════════════════════════════════ */
/* ---------- 【章节系统】 ---------- */ <<set $chapter to { num: 1, name: "鲁尔的代价" }>>\ <<set $chapter_ending_triggered to false>> /* 第一章结算触发标记 */ <<set $tutorial_done to false>> /* 开场引导(一页纸)是否已完成 */ <<set $office_morning_done to false>> /* 办公室晨报仪式:第一天开场翻页后置 true,之后进办公室不再自动弹出晨报 */ <<set $reception_done to false>> /* 首周政党酒会(零和第一课):完成标记 */ <<set $reception_pending to false>> /* 酒会待触发(第4天进办公室强制跳转) */ <<set $reception_started to false>> /* 酒会已开场(防重入重复扣TP) */ <<set $reception_choices to []>> /* 酒会走向过谁 */ <<set $reception_round to 0>> /* 酒会社交轮次(3轮) */ <<set $reception_observations to 0>> /* 酒会躲角落观察次数 */ <<set $party_modes_unlocked to false>> /* 八党相处模式卡是否解锁(柏林手记) */ /* ---------- 【咖啡因系统】 ---------- */ <<set $coffee_today to 0>> /* 今日已饮杯数 */ <<set $coffee_streak to 0>> /* 连续饮用天数 */ <<set $coffee_last_day to -1>> /* 上次饮用的 session_day */ /* ---------- 【玩家状态】(V0.5-A) ---------- */ <<set $player to { tags: [], mental: { fatigue: 20, paranoia: 10, idealism: 60, isolation: 20 }, promises: [], stance_count: { hard: 0, soft: 0, wait: 0 } /* 选择累积计数 */ }>> /* 立场叙述反馈(apply-choice-effects 在命中 3/5/8 次计数时写入,未命中为空) */ <<set $stance_feedback to "">>\ /* 日记系统:主题计数(累计3次生成标签、5次固化)+ 连续强化记录 */ <<set $diary_counts to { 希望: 0, 绝望: 0, 无力: 0, 魏玛: 0, 人民: 0 }>>\ <<set $diary_last_theme to "">> /* 上一次写的主题(连续强化检测) */ <<set $diary_streak to 0>> /* 连续写同一主题的天数 */ <<set $diary_total to 0>> /* 累计写日记次数(供魏玛引用判定) */ /* 日记主题 → 正文池(每条为一段日记正文,写日记时随机抽取,丰富重玩差异) 一律用第二人称"你"代称玩家,以"你写下"开头,避免第一人称"我"。 */ <<set $diary_entry_pools to { 希望: [ "你写下『还有救』三个字。笔尖在墨水里停了一会儿,像在等谁来反驳。没有人反驳。于是它留在了纸上。", "你写下:总有一天,柏林的清晨会不再以煤灰开头。你写得很轻,怕写得响了,就把它写碎了。", "有人在街头把一块面包分给陌生人。你把它记下来。这世上最小的善,有时是共和国最大的地基。" ], 绝望: [ "你写下:一切都在崩塌。笔到『塌』字时慢了半拍——写完这个字,它就真的塌了。你合上本子,没再翻开。", "马克今天又跌了。你把数字抄进日记,墨迹还没干透,数目已经作废。你抄的到底是钱,还是某种正在死掉的东西?", "你写:中产在塌,制度在晃,连你自己也是。写完觉得不对,擦掉重写——你不是在塌,你只是在跟着塌。" ], 无力: [ "你写下:『我只是棋子』。笔尖顿了顿,把『只是』划掉,改成『是』。棋子也能走,只是不能自己选方向。", "今天有十个人来求你,你救不了其中任何一个。你写下这句话,像把一只没做完的船放进瓶里。", "你写:你站在棋盘外,却每一步都落在棋格里。这大概就是共谋者的宿命——看得清楚,却走不出去。" ], 魏玛: [ "你试图写魏玛。笔悬了很久。他是一栋你每天住着却从没摸清过结构的房子。最后你只写了一句:他今天看你的眼神,你分不清是信任还是审判。", "你写:魏玛今天在窗边站了很久。他在等什么,你不知道。他自己知道吗?也许他也只是在等天亮。", "你落笔写他,却写出自己。写人写到一半,发现纸张另一面照出的是你的脸。这大概就是『他』离你最近的方式。" ], 人民: [ "你写了今天在街上看到的人。卖报童、码头工、排队的老妇。他们不知道自己在你的本子里有一行。但你记住了。在柏林,记住本身就是一种立场。", "街角有人把最后一块面包撕成两半。你记下那双裂着口子的手。共和国若真有什么,应当先是这双手。", "你在日记里写他们。不是替他们说话——他们不需要你替。你只是想让自己记得,这国家不是一堆数字,是一张张不肯低头的脸。" ] }>> /* ---------- 【公文包】(V0.4-F 扩展·第一波 S3) ---------- 玩家主动可打的内容,分五类: banners 施政纲领案(立场提案)· 9 格 · 由光谱双轴决定解锁哪格(每格 3 条) agenda 时局案(施政议程)· 世界状态解锁 sublime 践诺案模板 · 由承诺欠条触发 longline 长远案(跨阶段战略案)· 阶段推进解锁 counterfact 历史歧路(反事实)· 深层经营解锁,打一张少一张 统一三件套:axis(光谱坐标) / effects(通过后效果) / narrative effects 的 party_trust 字段对应 $npcs.*.trust 变化 */ <<set $player_proposals to { /* ═══ 施政纲领案(立场提案)· 光谱 3×3 · 每格 3 条 ═══ */ banners: { /* 左·激进 */ ban_lr: [ {id:"ban_lr_a", lr:"左", rc:"激进", title:"财富公有与再分配案", category:"经济/政治", base_support:35, effects:{economy:-15, social_anger:-25, gov_trust:-5, party_trust:{kpd:15, spd:-8, dvp:-18, zentrum:-15, dnvp:-18, nsdap:-20, army:-15}}, narrative:"把大资产收归公有,把财富还给每个人。会议室安静了三秒,然后所有人都开始说话。"}, {id:"ban_lr_b", lr:"左", rc:"激进", title:"全面国有化方案", category:"经济/政治", base_support:30, effects:{economy:-20, social_anger:-20, gov_trust:-8, party_trust:{kpd:18, spd:-10, dvp:-20, zentrum:-15, dnvp:-20, nsdap:-20, army:-15}}, narrative:"煤矿、铁路、银行——凡是关乎民生的,都该姓「全体」。KPD 的委员把头点得像钟摆,DVP 的老板已经去按警报了。"}, {id:"ban_lr_c", lr:"左", rc:"激进", title:"工人自卫武装案", category:"政治/军事", base_support:32, effects:{revolution:15, political_violence:10, social_anger:-15, party_trust:{kpd:18, spd:5, army:-18, dnvp:-15}}, narrative:"街垒不只是防御,也是声明:工人要能自己保卫自己。共和国听见这口号,脊背发凉。"} ], /* 左·中 */ ban_lm: [ {id:"ban_lm_a", lr:"左", rc:"中", title:"工人共决扩权案", category:"社会/政治", base_support:45, effects:{economy:-8, social_anger:-15, gov_trust:-2, party_trust:{spd:15, kpd:8, dvp:-12, dnvp:-10, army:-8}}, narrative:"工人应该在企业里有发言权,而不只是领工资时露一次面。企业主说这是干预,工人说这是尊重。"}, {id:"ban_lm_b", lr:"左", rc:"中", title:"工会谈判权保障案", category:"社会", base_support:52, effects:{economy:-5, social_anger:-12, gov_trust:2, party_trust:{spd:15, kpd:5, dvp:-8, dnvp:-5}}, narrative:"谈判不是施舍,是权力。把工会的桌子摆正,让雇主知道对面坐的不是一群可打发的人。"}, {id:"ban_lm_c", lr:"左", rc:"中", title:"失业救济扩大案", category:"社会/经济", base_support:48, effects:{economy:-10, social_anger:-18, inflation:3, party_trust:{spd:15, kpd:10, dvp:-10}}, narrative:"失业不只是没工作,是连明天都丢了。给失业的人一张能喘气的网——哪怕这网贵,也比让街角堆满绝望便宜。"} ], /* 左·保守 */ ban_ll: [ {id:"ban_ll_a", lr:"左", rc:"保守", title:"工人权益守护案", category:"社会", base_support:55, effects:{economy:-5, social_anger:-8, gov_trust:2, party_trust:{spd:12, kpd:-5, dvp:-5, dnvp:-8}}, narrative:"不冒进,不没收,只守住已有的:八小时、工会、谈判权。守着守着的日子,就是日子。"}, {id:"ban_ll_b", lr:"左", rc:"保守", title:"八小时工时固化案", category:"社会", base_support:58, effects:{economy:-3, social_anger:-5, gov_trust:2, party_trust:{spd:12, kpd:-3, dvp:-5}}, narrative:"1918 年用街垒换来的八小时,1923 年正被通胀一点点偷走。把它写进铁律,别让它再缩水。"}, {id:"ban_ll_c", lr:"左", rc:"保守", title:"工人合作社扶持案", category:"经济/社会", base_support:50, effects:{economy:-5, social_anger:-8, gov_trust:1, party_trust:{spd:10, kpd:5, dvp:-8}}, narrative:"工人自己开店、自己记账、自己分钱。不夺谁的产,自成一家灯火——这是最温的社会主义。"} ], /* 中·激进 */ ban_cr: [ {id:"ban_cr_a", lr:"中", rc:"激进", title:"宪政改革案", category:"政治", constitutional:true, base_support:40, band:"super", effects:{party_trust:{ddp:10, spd:5, zentrum:-8, dnvp:-10, army:-5}}, drip:{daily:{political_violence:-0.2, revolution:0.1, gov_trust:-0.1}, duration:90, decay:true}, narrative:"宪法是给活人用的,不该像件过时的外套。重写,重塑,让共和国配得上他承诺的未来。"}, {id:"ban_cr_b", lr:"中", rc:"激进", title:"削弱第48条案", category:"政治", constitutional:true, base_support:42, effects:{gov_trust:3, political_violence:-8, revolution:3, party_trust:{ddp:12, spd:8, zentrum:-5, army:-10, dnvp:-8}}, narrative:"紧急状态是治病的药,不是过日子的饭。给第48条装上闹钟,让紧急权力别想赖着不走。"}, {id:"ban_cr_c", lr:"中", rc:"激进", title:"议会民主强化案", category:"政治", constitutional:true, base_support:45, effects:{gov_trust:5, political_violence:-5, revolution:-3, party_trust:{ddp:15, spd:10, zentrum:5, dnvp:-8, army:-5}}, narrative:"共和国的命门在议会。把被行政权抢走的权力,一根一根还给议员——共和国才坐得稳。"} ], /* 中·中 */ ban_cm: [ {id:"ban_cm_a", lr:"中", rc:"中", title:"宪政平衡案", category:"政治", base_support:50, effects:{gov_trust:5, political_violence:-8, revolution:-5, party_trust:{ddp:15, zentrum:10, spd:8, army:-8, dnvp:-8}}, narrative:"第48条是拐杖,不是轮椅。给紧急状态上期限,给总理上问责——共和国不靠谁的自觉活着。"}, {id:"ban_cm_b", lr:"中", rc:"中", title:"文官中立准则案", category:"行政/政治", base_support:55, effects:{gov_trust:8, economy:-3, political_violence:-5, party_trust:{ddp:12, zentrum:10, dvp:5, dnvp:-3, spd:-3}}, narrative:"文官不站队,共和国才不散架。给公务员一条铁律:忠于宪法,不忠于任何一党。"}, {id:"ban_cm_c", lr:"中", rc:"中", title:"预算与审计透明案", category:"经济/政治", base_support:52, effects:{gov_trust:8, economy:-5, inflation:-3, party_trust:{ddp:12, dvp:8, zentrum:5, kpd:3}}, narrative:"钱花到哪去了,共和国得给国民一个交代。账本摊开,贪腐和猜疑一起见光。"} ], /* 中·保守 */ ban_cl: [ {id:"ban_cl_a", lr:"中", rc:"保守", title:"行政稳定案", category:"政治", base_support:55, effects:{gov_trust:5, economy:-3, party_trust:{ddp:12, zentrum:8, dvp:5, spd:-5, dnvp:-5}}, narrative:"政治是风暴,行政是压舱石。稳住文官体系,让共和国在浪里别翻船。少折腾,多干活。"}, {id:"ban_cl_b", lr:"中", rc:"保守", title:"任期与问责稳定案", category:"政治", base_support:55, effects:{gov_trust:5, political_violence:-5, party_trust:{ddp:10, zentrum:10, dvp:5, spd:-3, dnvp:-3}}, narrative:"内阁一届换三回,共和国就成了走马灯。给任期装上刹——不是不换,是不来回折腾。"}, {id:"ban_cl_c", lr:"中", rc:"保守", title:"联邦与邦权均衡案", category:"政治", base_support:52, effects:{gov_trust:3, political_violence:-5, nationalism:3, party_trust:{zentrum:12, dnvp:8, ddp:8, spd:-3}}, narrative:"柏林管得太死,各邦就不服;各邦太野,共和国就散。给中央和邦重新画一条都服的线。"} ], /* 右·激进 */ ban_rr: [ {id:"ban_rr_a", lr:"右", rc:"激进", title:"民族复兴纲领案", category:"政治/军事", base_support:40, effects:{nationalism:15, political_violence:10, gov_trust:-5, party_trust:{dnvp:15, nsdap:18, army:10, spd:-15, kpd:-18}}, narrative:"德国失去的,要在一次复兴里拿回来。有人鼓掌,有人握紧了拳头——这是同一件事的两种反应。"}, {id:"ban_rr_b", lr:"右", rc:"激进", title:"重振军备与国防案", category:"军事/政治", base_support:38, effects:{army_influence:15, nationalism:10, political_violence:8, intl_trust:-8, party_trust:{army:18, dnvp:12, nsdap:10, spd:-15, kpd:-18}}, narrative:"凡尔赛捆住了德国的手脚,但捆不住德国的心。把国防军的脊梁重新撑起来——哪怕邻居们皱眉。"}, {id:"ban_rr_c", lr:"右", rc:"激进", title:"退伍军人权益总案", category:"军事/社会", base_support:45, effects:{nationalism:8, social_anger:-5, economy:-5, party_trust:{army:15, dnvp:12, spd:5, kpd:-8}}, narrative:"把枪交回国家的人,不该在街头讨饭。给退伍军人一份体面——共和国欠他们的,不止一句谢谢。"} ], /* 右·中 */ ban_rm: [ {id:"ban_rm_a", lr:"右", rc:"中", title:"财政纪律与紧缩案", category:"经济", base_support:50, effects:{economy:-5, inflation:-15, social_anger:10, gov_trust:5, party_trust:{dvp:15, dnvp:10, ddp:5, spd:-10, kpd:-12}}, narrative:"花钱是治国,省钱是续命。收紧每一笔预算,让马克学会自己站直。"}, {id:"ban_rm_b", lr:"右", rc:"中", title:"稳定币值与金本位案", category:"经济", base_support:48, effects:{inflation:-18, economy:-5, intl_trust:5, party_trust:{dvp:15, ddp:8, zentrum:5, spd:-8, kpd:-10}}, narrative:"纸币买不到信任,金子可以。给马克找一个不倒的锚——哪怕这锚很重,总比在风里飘强。"}, {id:"ban_rm_c", lr:"右", rc:"中", title:"工商业解绑与减税案", category:"经济", base_support:52, effects:{economy:-8, inflation:-5, social_anger:5, party_trust:{dvp:15, dnvp:8, ddp:5, spd:-8}}, narrative:"别把工厂卡死,德国才有活路。给工商业松绑,让老板敢开工,工人有班上。"} ], /* 右·保守 */ ban_rl: [ {id:"ban_rl_a", lr:"右", rc:"保守", title:"传统秩序案", category:"政治/社会", base_support:55, effects:{nationalism:5, political_violence:-8, gov_trust:3, party_trust:{dnvp:12, zentrum:8, army:8, spd:-8, kpd:-10}}, narrative:"等级、权威、秩序——旧世界的东西不全是对的,但也不全是错的。有些柱子不能拆。"}, {id:"ban_rl_b", lr:"右", rc:"保守", title:"教会与家庭保障案", category:"社会", base_support:55, effects:{nationalism:3, social_anger:-3, gov_trust:3, party_trust:{zentrum:15, dnvp:10, spd:-5, kpd:-8}}, narrative:"教堂的钟、家里的炉火、礼拜天的休憩——旧秩序里也有人情味。保住这些,别让崩溃把根一起带走。"}, {id:"ban_rl_c", lr:"右", rc:"保守", title:"容克与地主权益案", category:"经济/社会", base_support:52, effects:{nationalism:5, economy:-3, gov_trust:2, party_trust:{dnvp:15, zentrum:8, army:5, spd:-8, kpd:-10}}, narrative:"东部的容克是共和国的地基之一。给他们的地、他们的庄园、他们的秩序留一条活路——换他们不掀桌子。"} ] }, /* ═══ 时局案(施政议程)· S3 · 世界状态解锁 ═══ */ agenda: [ {id:"age_01", title:"谷物进口补贴案", category:"经济/社会", unlock:{world:{inflation:60}}, base_support:50, bendable:true, effects:{inflation:-10, economy:-10, social_anger:-15, party_trust:{zentrum:8, spd:8, dvp:-8}}, narrative:"高价进口粮食,平价卖出去。账面上是亏的,但面包比账本重要。"}, {id:"age_02", title:"住宅与房租管控案", category:"社会/经济", unlock:{world:{social_anger:50}}, base_support:50, bendable:true, effects:{social_anger:-15, economy:-5, inflation:-5, party_trust:{spd:12, kpd:8, dvp:-12, zentrum:-5}}, narrative:"柏林的地窖里住着人,阁楼里也住着人。房租是穷人的最后一根弦——不能断。"}, {id:"age_03", title:"公务员养老金保值案", category:"行政/社会", unlock:{world:{gov_trust:40, op:"lt"}}, base_support:55, bendable:true, effects:{gov_trust:10, economy:-8, social_anger:-5, party_trust:{ddp:10, dvp:8, spd:-5}}, narrative:"公务员是共和国的手。手在抖,共和国签的字就签不稳。给他们一个不缩水的退休金。"}, {id:"age_04", title:"治安与秩序法", category:"政治", unlock:{world:{political_violence:40}}, base_support:50, bendable:true, effects:{political_violence:-15, gov_trust:5, revolution:-5, party_trust:{army:10, dnvp:8, spd:-8, kpd:-12}}, narrative:"街头斗殴不是政治,是犯罪。但这句话本身就有人不同意——左右都不信你。"}, {id:"age_05", title:"东部易货贸易案", category:"外交/经济", unlock:{world:{nationalism:40, op:"lt"}}, base_support:45, bendable:true, effects:{inflation:-8, economy:-3, nationalism:5, party_trust:{kpd:10, spd:5, dnvp:-12, nsdap:-15}}, narrative:"用工业品换东边的粮食。有人骂这是通俄,有人小声说:能吃饱就行。"} ], /* ═══ 践诺案模板(S3 首批)· 由欠条 target 触发 ═══ */ sublime: { worker: {id:"sublime_worker", title:"失业保险制度化案", category:"社会/经济", axis:{lr:"左", rc:"中"}, base_support:50, band:"mid", effects:{party_trust:{spd:12, kpd:8, dvp:-8}}, drip:{daily:{social_anger:-0.7, economy:-0.35, inflation:0.2}, duration:40, decay:true}, narrative:"你在街头答应过他们的事,现在要变成一条法律。承诺要兑现,就得有法律兜底。"}, military: {id:"sublime_military", title:"军饷保障案", category:"军事/经济", axis:{lr:"右", rc:"中"}, base_support:50, effects:{economy:-8, army_influence:5, gov_trust:2, party_trust:{army:12, dvp:5, spd:-8, kpd:-10}}, narrative:"你答应过军人们的事:按时发饷,不欠账。军官把这话记了很久。"}, middle: {id:"sublime_middle", title:"储蓄补偿案", category:"经济/社会", axis:{lr:"中", rc:"保守"}, base_support:50, effects:{social_anger:-10, gov_trust:8, economy:-8, party_trust:{ddp:12, zentrum:8, dvp:5, spd:-5}}, narrative:"一个教师的毕生积蓄变成了一沓废纸。你答应过他们:共和国会记住这笔账。"}, foreign: {id:"sublime_foreign", title:"财政稳定与债务重组案", category:"经济/外交", axis:{lr:"中", rc:"中"}, base_support:45, effects:{inflation:-12, intl_trust:8, gov_trust:5, economy:-5, party_trust:{dvp:10, ddp:8, zentrum:5, nsdap:-10}}, narrative:"你对协约国做过承诺:德国会为自己的债务负责。现在,让这份责任变成白纸黑字。"}, civil: {id:"sublime_civil", title:"文官待遇保障案", category:"行政/社会", axis:{lr:"中", rc:"保守"}, base_support:55, effects:{gov_trust:10, economy:-5, party_trust:{ddp:10, zentrum:8, spd:-3}}, narrative:"你答应过那些替你盖章的人:你们的饭碗,共和国盯着呢。"} }, /* ═══ 长远案(跨阶段战略案)· S3 首批试点 2 张 ═══ */ longline: [ {id:"lon_01", title:"财政重建计划", category:"经济", stage_start:"S3", base_support:45, milestones:["启动新税制讨论","富人税与消费税博弈","财政收支平衡"], effects:{inflation:-10, economy:-8, gov_trust:8, party_trust:{dvp:10, ddp:8, spd:-8, kpd:-12}}, narrative:"地租马克只是救火。真正的事是重建财政——从地租马克出发,让共和国自己养得起自己。"}, {id:"lon_02", title:"邦权改革案", category:"政治", stage_start:"S3", constitutional:true, base_support:40, milestones:["摆出巴伐利亚与普鲁士问题","与各邦谈判","重新划分中央与邦权"], effects:{gov_trust:5, political_violence:-8, party_trust:{zentrum:8, dnvp:5, spd:5, kpd:-8}}, narrative:"柏林的命令到了慕尼黑就是废纸。要么给邦权,要么收邦权——总得有个说法。"} ], /* ═══ 历史歧路(反事实)· S3 首批 1 张 · 打一张少一张 ═══ */ counterfact: [ {id:"cnt_01", title:"军队国家化方案", category:"政治/军事", stage_start:"S3", constitutional:true, base_support:35, once:true, effects:{army_influence:-15, revolution:-5, political_violence:-10, gov_trust:8, party_trust:{army:-20, dnvp:-15, ddp:10, spd:10, kpd:5}}, narrative:"让军队属于共和国,而不是共和国属于军队。这是国中之国上的一把钥匙——钥匙很烫,但锁必须开。"} ] }>> /* ---------- 【承诺欠条簿】日常承诺 → 60天清算 ---------- */ <<set $promise_ledger to []>>\ /* 每条欠条:{id, target(对象), content(内容), deadline(到期session_day), status("open"未兑现/"fulfilled"已兑现/"defaulted"违约), created_day, sublimated(是否已作为践诺案上桌), axis} */ /* ---------- 【紧急权力·第48条】R09 启用后持有,每期(60天)限用一次 ---------- */ <<set $a48 to { held: false, ready: false, recharge_day: 0, uses: 0 }>>\ /* 上下文:动用中的用法(suppress/annul/force)+ 目标 + 返回去向;用完即清 */ <<set $a48_ctx to {}>>\ <<set $a48_vote_note to "">> /* ---------- 【审议会话状态】 ---------- */ <<set $session_review to { in_review: false, /* 是否处于审议流程中 */ round: 0, /* 第几轮审议(每60天一循环) */ table: [], /* 本轮玩家上桌的提案(施政纲领/践诺/时局/长远) */ opp_bills: [], /* 他党提案(本轮上桌的2-5张) */ lobby: {}, /* 游说结果:{billId+"|"+party: "yes"/"no"} */ lobby_deliver: {}, /* 游说兑现率:{billId+"|"+party: {direction, bonus}}(bonus=0表示收了钱没兑现) */ deals: [], /* 换票协议:{party, opp_bill_id, player_bill_id} */ player_stances: {}, /* 玩家对他党提案表态:{billId: "yes"/"no"/"abstain"} */ capital: 0, /* 本轮政治资本快照(游说从这里扣) */ pending: false, /* 有审议待处理(强制通知,进办公室跳转审议日提示页) */ absent: 0, /* 缺席过几次国会(不去也会照常开票,只是没你的声音) */ counterfact_used: [], /* 已打过的历史歧路(打一张少一张) */ results: [], /* 本轮开票结果(表决页计算,结算时应用) */ continue_skip: null,/* 跳过途中被审议拦住时,记录剩余要跳的天数 */ flags: { review_done: {}, /* {round:true} 标记本轮是否已结算 */ compromise_count: 0 } /* 已用折中次数(累进成本) */ }>> <<set $skip_days_mode to 0>> /* 跳过模式:0=跳到下一个红色事件日;>0=固定跳过该天数(跳过5天用) */ /* ---------- 【持续效果容器】法案/事件/余波的长效滴灌(V0.5-C P0 / 通用化) ---------- $active_effects:通过的法案、处理的文件、事件余波,其 daily 效果在生效期内逐日结算。 每条:{id, src_id, title, kind("bill"/"file"/"aftermath"), band("short"/"mid"/"super"), daily:{...}, remaining, divisor, decay, source, from_round, to_day} burst(即时效果)在注册时已即时耗掉,不在此容器;这里只管 daily + duration。 $effect_cool:来源冷却表 {src_id: 冷却截止日}。注册时写入「生效期 + 半程尾冷却」, 期间同类事件不再触发(文件栏权重归零 / 母体不选 / 国会不再抽同源提案)。 */ <<set $active_effects to []>>\ <<set $effect_cool to {}>> /* ---------- 【国会倒计时/预警】(V0.5-C P1) ---------- $days_until_session:距下次国会开幕的天数(60天一议,daily_tick 每日刷新) $congress_warning_level:预警级 0无/1开幕在即D-14/2议程已排定D-7/3最后斡旋D-3/4模拟轮D-0 初始都为 0(第一天的 capt 不显示预警,等 daily_tick 推进后自行刷新) */ <<set $congress_warning_level to 0>>\ <<set $days_until_session to 60>> /* ---------- 【消极处理报告】(V0.5-C) ---------- $passive_report:玩家没处理、被自动/消极结算的事件列表 :[{title, kind}](kind: auto自动姿态 / expire白色过期 / site现场超时 / dropped跳过后丢弃) $passive_report_pending:有不有要弹给玩家过目的消极后果 $skip_dropped_list:跳过后被丢弃的非必要事件标题(供报告引用) */ <<set $passive_report to []>>\ <<set $passive_report_pending to false>>\ <<set $skip_dropped_list to []>> /* ---------- 【文件栏机制】(V0.6-A) ---------- $backlog_score:加权文牍负荷(白/低档1,黄/许诺2,历史不计) $admin_paralysis:是否行政瘫痪(score≥8) $paralysis_tier:四层阶梯 0无/1机会成本/2直接伤害/3声誉侵蚀/4不可逆剧情 $paralysis_days:瘫痪持续天数(逐日+1,脱离归0;快进不累加) $file_expiry_warn_log:T-3/T-1 到期预警(每日日清重算) $paralysis_tier_log:T3 相关党信任损失记录(供晨报/侧栏) $pc_pool_spent:干预刀(冷处理/紧急公关)已消耗的政治资本池(持久化消减,不影响 Game.pc()) $paralysis_news_line:T3 触发的晨报短条文案 */ <<set $backlog_score to 0>>\ <<set $admin_paralysis to false>>\ <<set $paralysis_tier to 0>>\ <<set $paralysis_days to 0>>\ <<set $file_expiry_warn_log to []>>\ <<set $paralysis_tier_log to []>>\ <<set $pc_pool_spent to 0>>\ <<set $paralysis_news_line to "">>\ <<set $skip_pre_backlog_score to 0>> /* ---------- 【国会决议汇总/报纸】(国会决议弹窗) ---------- $review_summary:每轮国会结束后的决议汇总(出席态 + 通过/否决 + 代价) $review_news_pending:是否有未上报纸的国会结论 $review_news_title / $review_news_line:报纸头条/摘要用语句 */ <<set $review_summary to null>>\ <<set $review_news_pending to false>>\ <<set $review_news_title to "">>\ <<set $review_news_line to "">>\ <<set $review_morning_pending to false>> /* ---------- 【国会党派档案】表决立场与游说用 ---------- 席位:1923年大致构成(合计449席,7党投票;军方/魏玛不投票) 立场:lean 左右(-1左 ~ +1右),radical 激进程度(0~1,越高越难被拉拢) 动机:他党提案上桌时,情报≥30 能看到的一句话(背后的算盘)。 2026-10-02 复读治理:每党扩成 3 条数组,发牌时用 pool-pick 轮转取句(打完一圈才重复)。 */ <<set $party_seats to {spd:110, kpd:88, ddp:39, dvp:65, zentrum:64, dnvp:71, nsdap:12}>>\ <<set $party_profile to { spd: {lean: -1.0, radical: 0.2, discipline: 0.9}, kpd: {lean: -1.0, radical: 0.9, discipline: 0.95}, ddp: {lean: 0.0, radical: 0.3, discipline: 0.6}, dvp: {lean: 0.8, radical: 0.5, discipline: 0.65}, zentrum:{lean: 0.2, radical: 0.1, discipline: 0.9}, dnvp: {lean: 0.9, radical: 0.7, discipline: 0.75}, nsdap: {lean: 0.9, radical: 1.0, discipline: 0.95} }>> <<set $party_motives to { spd: ["他要在鲁尔工人面前证明,社民党还是那个把工人当人的党。","罢工的补贴是他在内阁里拍着桌子争来的,他要让国会看看这笔钱花得值。","他怕工人等不到胜利——这一票,至少要让吃饭的问题先着落。"], kpd: ["他想借这张票把国会当讲台,喊给街上的工人听。","汉堡和萨克森的火还没灭干净,他要让议会承认这些火是谁点的。","他要拿这个讲台证明:共产党的每一票,都替还在坐牢的人投。"], ddp: ["他要证明共和国还有第三个选项——宪法护得住中产。","他的存折也在贬值,可他还在替宪政记账——他要证明讲道理的人没有跑光。","他要在最坏的日子里替法庭说话:越是人人想抄近道,越得有人守着路口。"], dvp: ["他要让工业界的钱安心留在国内,别都逃去荷兰。","鲁尔停一天工,他的账本就烂一页——他要国会承认这个代价该谁出。","他要替厂主们换一句话回来:补贴可以谈,国有化免谈。"], zentrum: ["他要在教会的信众和共和国的薪水之间,再走一次钢丝。","他夹在左右两把火中间,只想把这个国家从火上端下来。","他要保住教区的学校和工作,哪怕这些议程排到最后。"], dnvp: ["他要撕开共和国的裂缝,让旧旗子再飘起来。","他要让每一场辩论都通向同一个结论:这届政府撑不到冬天。","他要替田庄和旧军功讨一句话:共和国欠他们的,该还了。"], nsdap: ["他要让国会看起来很蠢,这样街上的拳头才显得有理。","议席少得可怜,他要的就是这个比例——体面话轮不到他,他只负责让坏消息更响。","他要抢在所有党前面,把「十一月罪人」再喊一遍,喊到人人接得上。"], army: ["他要让共和国记住:枪杆子不会一直等着。","他只问一件事:机密经费能不能绕开国会。","他要看清这个政府还能撑几天——撑得越短,他桌上那份方案越厚。"] }>> <<set $party_names to { spd: "社民党", kpd: "共产党", ddp: "民主党", dvp: "人民党", zentrum: "Zentrum", dnvp: "民族人民党", nsdap: "NSDAP", army: "军方" }>> /* ---------- 【场景标记】地图深层探索用的全局标记 ---------- */ <<set $flags to { has_drawer_key: false, /* 总理府办公桌抽屉钥匙 */ kuno_letter_read: false /* 是否读过前任总理的未寄出信件 */ }>> /* ---------- 【事件牌库】发牌制(第一章鲁尔危机25个预设事件) ---------- 每个事件:id, level(red/yellow/white), date(红色专用{m,d}), title, tag(关联标签), template(选项模板), intensity, irreversible, desc(描述占位), dealt(是否已发牌) */ <<set $event_deck to [ /* 红色事件(17个,日期绑定,必发生) */ {id:"R01", level:"red", date:{m:1,d:11}, title:"法比军队占领鲁尔", tag:"民族屈辱", template:"decision", intensity:80, irreversible:4, desc:"外交部呈报:法国与比利时军队已进入鲁尔区,占领矿场与工厂。鲁尔区行政官员来电请示,是否继续执行柏林指令。内政部与外交部均认为此事关系重大,请总理府尽快定夺。", dealt:false, party_affinity:["dnvp","nsdap"]}, {id:"R02", level:"red", date:{m:1,d:13}, title:"国会授权消极抵抗", tag:"经济压力", template:"passive_resistance", intensity:70, irreversible:3, desc:"国会秘书处呈报:国会已以压倒多数通过消极抵抗政策,号召鲁尔工人停工,使占领方无法获取煤炭。决议同时要求政府拨付补贴。财政部附注:补贴所需款项尚无着落。", dealt:false, party_affinity:["spd","dvp"]}, {id:"R18", level:"red", date:{m:2,d:1}, title:"马克跌破万点", tag:"货币信任下降", template:"observe", intensity:50, irreversible:2, desc:"央行呈报:美元兑马克已跌破万点关口,市场交易近乎停顿。工人要求日薪日结。部里请示是否采取外汇管制,或另行处置。", dealt:false, party_affinity:["dvp","zentrum"]}, {id:"R03", level:"red", date:{m:3,d:31}, title:"埃森流血事件", tag:"工人愤怒", template:"action", intensity:60, irreversible:3, desc:"外交部急报:法军在埃森向罢工工人开枪,伤亡人数尚在核实。消息传至柏林后,克罗伊茨贝格区已出现集会。部里请示中央如何回应。", dealt:false, party_affinity:["spd","kpd"]}, {id:"R04", level:"red", date:{m:4,d:8}, title:"鲁尔破坏者被捕", tag:"民族主义", template:"action", intensity:55, irreversible:3, desc:"外交部呈报:一名前军官在鲁尔从事破坏活动时被法军逮捕,现关押于法军拘留所。DNVP已就此发起公开声援,并请求政府表态。部里请示是否介入。", dealt:false, party_affinity:["dnvp","nsdap"]}, {id:"R05", level:"red", date:{m:5,d:26}, title:"鲁尔破坏者被枪决", tag:"民族主义", template:"stance", intensity:65, irreversible:4, desc:"外交部呈报:在鲁尔被捕的前军官已被法军枪决。DNVP与NSDAP均已就此发起宣传,将其塑造为民族殉道者。部里请示政府是否作出正式回应。", dealt:false, party_affinity:["dnvp","nsdap"]}, {id:"R19", level:"red", date:{m:6,d:15}, title:"通胀进入恶性阶段", tag:"货币信任下降", template:"observe", intensity:55, irreversible:3, desc:"教育部与财政部联合呈报:恶性通胀已使中产阶级储蓄大面积归零。一名教师的毕生积蓄,目前买不到一磅黄油。两部请示是否出台专项救助,或另作安排。", dealt:false, party_affinity:["dvp","zentrum"]}, {id:"R06", level:"red", date:{m:8,d:10}, title:"柏林总罢工", tag:"工人愤怒", template:"action", intensity:70, irreversible:3, desc:"劳工部呈报:柏林工人总罢工已全面展开,电车停运,印刷厂停工,市政部门多数瘫痪。工会代表表示,在政府作出正式回应前,罢工不会停止。部里请示是否介入调停。", dealt:false, party_affinity:["spd","kpd"]}, {id:"R07", level:"red", date:{m:8,d:13}, title:"DVP组阁", tag:"政府信誉", template:"decision", intensity:65, irreversible:3, desc:"总统府呈报:DVP方面提出总理人选,请总统授权组阁。该人选以务实与善于妥协著称。总统府请总理府就是否支持作出表态。此前总理职位已多次更迭。", dealt:false, party_affinity:["dvp"]}, {id:"R08", level:"red", date:{m:9,d:26}, title:"结束消极抵抗", tag:"经济压力", template:"passive_resistance", intensity:75, irreversible:4, desc:"总理府呈报:新总理拟宣布结束消极抵抗。此举意在停止印钞、稳定马克,但鲁尔工人将因此失去补贴。总理府请各部就是否支持作出表态。", dealt:false, party_affinity:["dvp","ddp"]}, {id:"R09", level:"red", date:{m:9,d:26}, title:"全国紧急状态", tag:"政治暴力增加", template:"decision", intensity:70, irreversible:4, desc:"总统府呈报:总统已依据宪法第48条签署紧急法令,全国进入紧急状态。这是第48条又一次被动用,共和国以紧急权力维持自身,本身即构成先例。部里请示政府方面如何配合。", dealt:false, party_affinity:["army","dvp"]}, {id:"R10", level:"red", date:{m:9,d:26}, title:"巴伐利亚独裁", tag:"民族主义", template:"stance", intensity:70, irreversible:4, desc:"内政部呈报:巴伐利亚邦已宣布戒严,授权邦委员独揽大权。柏林发往慕尼黑的指令目前未获执行。部里请示中央如何回应。", dealt:false, party_affinity:["dnvp","nsdap"]}, {id:"R11", level:"red", date:{m:10,d:21}, title:"克姆尼茨会议", tag:"工人愤怒", template:"action", intensity:60, irreversible:3, desc:"警察局呈报:KPD在克姆尼茨召开秘密会议,讨论是否发动武装起义。据线报,会议已否决立即行动,但部分地方组织未收到通知。局里请示是否采取行动。", dealt:false, party_affinity:["kpd","spd"]}, {id:"R12", level:"red", date:{m:10,d:23}, title:"汉堡起义", tag:"政治暴力增加", template:"action", intensity:80, irreversible:4, desc:"内政部急报:汉堡KPD已发动起义,占领警察局并构筑街垒。克姆尼茨会议未予批准,柏林方面亦未响应,起义者目前孤立。部里请示是否调兵镇压。", dealt:false, party_affinity:["kpd"]}, {id:"R13", level:"red", date:{m:10,d:29}, title:"清除萨克森政府", tag:"政治暴力增加", template:"stance", intensity:65, irreversible:4, desc:"国防部呈报:国防军已开进萨克森与图林根,拟解散当地左翼州政府。邦政府方面表示拒绝服从。部里请示中央是否授权行动。", dealt:false, party_affinity:["army","ddp"]}, {id:"R14", level:"red", date:{m:11,d:8}, title:"啤酒馆暴动", tag:"民族主义", template:"action", intensity:85, irreversible:4, desc:"巴伐利亚邦内政部急报:NSDAP武装人员冲入慕尼黑一家啤酒馆,宣布「全国革命」。邦政府尚未正式表态,慕尼黑警方已封锁周边街道。部里请示中央是否介入。", dealt:false, party_affinity:["nsdap","dnvp"]}, {id:"R15", level:"red", date:{m:11,d:9}, title:"统帅堂交火", tag:"政治暴力增加", template:"action", intensity:60, irreversible:3, desc:"巴伐利亚邦警察局呈报:NSDAP冲锋队向统帅堂进发,与国防军发生交火,现场有人员伤亡。暴动头目在交火后逃离。邦政府已请求中央指示。", dealt:false, party_affinity:["nsdap","army"]}, {id:"R16", level:"red", date:{m:11,d:15}, title:"地租马克发行", tag:"货币信任下降", template:"decision", intensity:70, irreversible:4, desc:"财政部呈报:地租马克发行方案已就绪,拟以土地与工业资产为抵押,按新比价发行。方案若获通过,通胀可望在短期内得到控制。部里请总理府尽快批复。", dealt:false, party_affinity:["dvp","zentrum"]}, {id:"R17", level:"red", date:{m:11,d:23}, title:"总理下台", tag:"政府信誉", template:"decision", intensity:60, irreversible:3, desc:"国会秘书处呈报:部分议员已联名提出不信任动议,要求总理就鲁尔政策与货币改革作出说明。动议即将进入表决程序。总统府请总理府就是否介入作出表态。", dealt:false, party_affinity:["dvp","ddp"]}, /* 黄色事件(8个,概率+条件诱发) */ {id:"Y01", level:"yellow", title:"鲁尔罢工补贴不足", tag:"经济压力", template:"decision", intensity:35, irreversible:2, desc:"鲁尔罢工工人拿到的补贴已经买不起面包了。工会在问:还要撑多久。", dealt:false}, {id:"Y02", level:"yellow", title:"马克跌破万亿", tag:"货币信任下降", template:"decision", intensity:40, irreversible:2, desc:"美元兑马克突破了一万亿。这个数字已经没有意义了--它只是一个符号,标记着旧秩序的死亡。", dealt:false}, {id:"Y03", level:"yellow", title:"埃森工厂冲突", tag:"工人愤怒", template:"action", intensity:30, irreversible:2, desc:"埃森的大工厂又出事了。法军和工人之间的紧张在升级。有人受了伤。", dealt:false}, {id:"Y04", level:"yellow", title:"巴伐利亚右翼集会", tag:"民族主义", template:"stance", intensity:35, irreversible:2, desc:"巴伐利亚的右翼组织在扩大。他们公开集会,公开喊口号。柏林看得到,但暂时管不了。", dealt:false}, {id:"Y05", level:"yellow", title:"法国驱逐鲁尔官员", tag:"民族屈辱", template:"stance", intensity:30, irreversible:2, desc:"法军占领当局驱逐了一批鲁尔区的德国官员。理由是「不合作」。这些官员的家属正在往柏林跑。", dealt:false}, {id:"Y06", level:"yellow", title:"工会抗议物价", tag:"工人愤怒", template:"action", intensity:25, irreversible:1, desc:"总工会组织了抗议物价的集会。规模不大,但口号越来越激进。「共和国」三个字开始出现在骂声里。", dealt:false}, {id:"Y07", level:"yellow", title:"学生政治集会", tag:"政治暴力增加", template:"stance", intensity:20, irreversible:1, desc:"柏林大学的学生在搞政治集会。左右两派都有。有人在走廊里动了手。", dealt:false}, {id:"Y08", level:"yellow", title:"黑市猖獗", tag:"经济压力", template:"decision", intensity:25, irreversible:1, desc:"亚历山大广场的黑市已经不躲了。外汇、食品、香烟、情报,什么都在卖。警察假装看不见。", dealt:false} ]>>
/* ============================================================ 标签系统(V0.4-B + V0.4-C 附录B) 标签是事件的"即时产物",参与事件池计算,会衰减。 单向转化链:事件 -> 标签 -> 遗产 ->(共振)-> 惯性 ============================================================ */ /* ---------- tag-add:新增或强化标签 ---------- 用法:<<tag-add "经济压力" "micro" 15 "经济" "spd">> 同名标签累加强度;自动记录 born_date、填入默认 decay_rate。 参数:名称 等级(micro|struct|era) 强度 类别 [解释权] [来源事件] */ <<widget "tag-add">>\ <<silently>> <<set _name to $args[0]>> <<set _level to $args[1] ? $args[1] : "micro">> <<set _intensity to Number($args[2] ? $args[2] : 10)>> <<set _category to $args[3] ? $args[3] : "general">> <<set _owner to $args[4] ? $args[4] : "weimar">> <<set _source to $args[5] ? $args[5] : "unknown">> <<set _decay to 0.95>> <<if _level eq "struct">><<set _decay to 0.98>><</if>> <<if _level eq "era">><<set _decay to 0.99>><</if>> /* 情报(知情者)不随日常遗忘:约每月-2%,折算成等价日衰减率 */ <<if _name eq "知情者">><<set _decay to Math.pow(0.98, 1/30)>><</if>> /* 关键经验(踩坑记录,避免重犯): 1. SugarCube <<for>> 循环内对临时变量 _var 的 <<set>> 赋值,循环结束后会丢失。 必须用 $var 全局变量暂存中间结果。 2. <<link>> 回调里,widget 内部对 $var 的 <<set>> 不会被持久化到历史 moment。 只有 <<link>> 回调体直接写的 <<set>> 才被持久化。 解决方案:widget 把结果存到 $ret,由调用方的 <<link>> 回调用 <<set $x to $ret>> 持久化。 3. 不能直接修改对象属性(tags[i].intensity=...),必须用 map 创建全新对象+全新数组, 再整体 <<set $active_tags to 新数组>>。SugarCube 通过引用比较判断是否需要重新快照。 */ <<set $tmp_src to $active_tags>> <<set $tmp_out to []>> <<set $tmp_found to false>> <<for _i to 0; _i lt $tmp_src.length; _i++>> <<set _t to $tmp_src[_i]>> <<if _t.name eq _name and _t.level eq _level>> <<set $tmp_found to true>> <<set _cap to 15>> <<if _level eq "struct">><<set _cap to 50>><</if>> <<if _level eq "era">><<set _cap to 100>><</if>> <<if _name eq "知情者">><<set _cap to 30>><</if>> <<set $tmp_out.push({ id: _t.id, name: _t.name, level: _t.level, category: _t.category, intensity: Math.min(_cap, _t.intensity + _intensity), decay_rate: _t.decay_rate, direction: _t.direction, target: _t.target, fusion_candidates: _t.fusion_candidates, weimar_text: _t.weimar_text, born_date: _t.born_date, source_event: _source, owner: _t.owner })>> <<else>> <<set $tmp_out.push({ id: _t.id, name: _t.name, level: _t.level, category: _t.category, intensity: _t.intensity, decay_rate: _t.decay_rate, direction: _t.direction, target: _t.target, fusion_candidates: _t.fusion_candidates, weimar_text: _t.weimar_text, born_date: _t.born_date, source_event: _t.source_event, owner: _t.owner })>> <</if>> <</for>> <<if not $tmp_found>> <<set $tmp_out.push({ id: "tag_" + _name + "_" + _level, name: _name, level: _level, category: _category, intensity: _intensity, decay_rate: _decay, direction: 0, target: "nation", fusion_candidates: [], weimar_text: "", born_date: { year: $date.year, month: $date.month, day: $date.day }, source_event: _source, owner: _owner })>> <</if>> /* 结果写回 $active_tags(段落渲染场景),并存到 $ret 供 link 回调场景持久化 */ <<set $active_tags to $tmp_out>> <<set $ret to $tmp_out>> <</silently>>\ <</widget>> /* ---------- tag-get:返回某标签强度 ---------- 用法:<<tag-get "经济压力">> 结果存入 _tag_val(无则0) 可选第二参数指定等级:<<tag-get "经济压力" "micro">> */ <<widget "tag-get">>\ <<silently>> <<set _name to $args[0]>> <<set _level to $args[1] ? $args[1] : "any">> <<set _tag_val to 0>> <<for _i to 0; _i lt $active_tags.length; _i++>> <<if $active_tags[_i].name eq _name and (_level eq "any" or $active_tags[_i].level eq _level)>> <<set _tag_val to $active_tags[_i].intensity>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- tag-decay:每月衰减 ---------- 遍历所有活跃标签,强度 ×= decay_rate;强度 < 1 则移除。 对应 V0.4-D 3.3 环境修正:相似标签多时衰减变慢。 */ <<widget "tag-decay">>\ <<silently>> <<set _new_tags to []>> <<for _i to 0; _i lt $active_tags.length; _i++>> <<set _t to $active_tags[_i]>> /* 环境修正:同类别标签数量越多,衰减越慢 */ <<set _same_cat to 0>> <<for _j to 0; _j lt $active_tags.length; _j++>> <<if $active_tags[_j].category eq _t.category>> <<set _same_cat to _same_cat + 1>> <</if>> <</for>> <<set _env_mult to 1 + (_same_cat - 1) * 0.01>> <<set _t.intensity to _t.intensity * _t.decay_rate * (2 - _env_mult)>> <<if _t.intensity gte 1>> <<set _new_tags.push(_t)>> <</if>> <</for>> <<set $active_tags to _new_tags>> <</silently>>\ <</widget>> /* ---------- tag-fuse:标签融合检测 ---------- 微标签同类别强度总和 ≥ 50 -> 生成结构标签; 结构标签同类别强度总和 ≥ 120 -> 生成时代标签。 对应 V0.4-B 第四章 + V0.4-C 第六章融合三条件之"标签相似"。 */ <<widget "tag-fuse">>\ <<silently>> <<set _fused_log to []>> /* 按类别聚合微标签强度 */ <<set _micro_by_cat to {}>> <<for _i to 0; _i lt $active_tags.length; _i++>> <<set _t to $active_tags[_i]>> <<if _t.level eq "micro">> <<if not _micro_by_cat.hasOwnProperty(_t.category)>> <<set _micro_by_cat[_t.category] to { total: 0, names: [], owner: _t.owner }>> <</if>> <<set _micro_by_cat[_t.category].total to _micro_by_cat[_t.category].total + _t.intensity>> <<set _micro_by_cat[_t.category].names.push(_t.name)>> <</if>> <</for>> /* 微 -> 结构 */ <<for _cat range Object.keys(_micro_by_cat)>> <<if _micro_by_cat[_cat].total gte 50>> <<set _struct_name to _cat + "趋势">> /* 检查是否已存在该结构标签 */ <<set _exists to false>> <<for _k to 0; _k lt $active_tags.length; _k++>> <<if $active_tags[_k].name eq _struct_name and $active_tags[_k].level eq "struct">> <<set _exists to true>> <</if>> <</for>> <<if not _exists>> <<set $active_tags.push({ id: "tag_" + _struct_name + "_struct", name: _struct_name, level: "struct", category: _cat, intensity: Math.min(50, _micro_by_cat[_cat].total * 0.6), decay_rate: 0.98, direction: 0, target: "nation", fusion_candidates: _micro_by_cat[_cat].names, weimar_text: $txt.fuse_struct, born_date: { year: $date.year, month: $date.month, day: $date.day }, source_event: "fusion", owner: _micro_by_cat[_cat].owner })>> <<set _fused_log.push("微标签融合 -> 结构标签【" + _struct_name + "】强度" + Math.round(Math.min(50, _micro_by_cat[_cat].total * 0.6)))>> <</if>> <</if>> <</for>> /* 按类别聚合结构标签强度 */ <<set _struct_by_cat to {}>> <<for _i to 0; _i lt $active_tags.length; _i++>> <<set _t to $active_tags[_i]>> <<if _t.level eq "struct">> <<if not _struct_by_cat.hasOwnProperty(_t.category)>> <<set _struct_by_cat[_t.category] to { total: 0, names: [], owner: _t.owner }>> <</if>> <<set _struct_by_cat[_t.category].total to _struct_by_cat[_t.category].total + _t.intensity>> <<set _struct_by_cat[_t.category].names.push(_t.name)>> <</if>> <</for>> /* 结构 -> 时代 */ <<for _cat range Object.keys(_struct_by_cat)>> <<if _struct_by_cat[_cat].total gte 120>> <<set _era_name to _cat + "时代">> <<set _exists to false>> <<for _k to 0; _k lt $active_tags.length; _k++>> <<if $active_tags[_k].name eq _era_name and $active_tags[_k].level eq "era">> <<set _exists to true>> <</if>> <</for>> <<if not _exists>> <<set $active_tags.push({ id: "tag_" + _era_name + "_era", name: _era_name, level: "era", category: _cat, intensity: Math.min(100, _struct_by_cat[_cat].total * 0.5), decay_rate: 0.99, direction: 0, target: "nation", fusion_candidates: _struct_by_cat[_cat].names, weimar_text: $txt.fuse_era, born_date: { year: $date.year, month: $date.month, day: $date.day }, source_event: "fusion", owner: _struct_by_cat[_cat].owner })>> <<set _fused_log.push("结构标签融合 -> 时代标签【" + _era_name + "】强度" + Math.round(Math.min(100, _struct_by_cat[_cat].total * 0.5)))>> <</if>> <</if>> <</for>> <<set $last_fusion to _fused_log>> <</silently>>\ <</widget>> /* ---------- tag-list:调试用,打印所有活跃标签 ---------- */ <<widget "tag-list">>\ <<if $active_tags.length eq 0>>\ //(标签池为空)//\ <<else>>\ //(名称|等级|类别|强度|衰减率|来源)// <<for _i to 0; _i lt $active_tags.length; _i++>><<set _t to $active_tags[_i]>>· _t.name|_t.level|_t.category|<<print Math.round(_t.intensity)>>|_t.decay_rate|_t.source_event<br> <</for>>\ <</if>>\ <</widget>>
/* ============================================================ 世界模拟层(Layer 1 · Simulation Layer) ------------------------------------------------------------ 让世界"自己活着":$world 里的宏观变量每日自行演化, 不依赖玩家行为或预设事件,而是由历史锚点 + 标签压力 + 时间趋势共同驱动。 数据流: 历史锚点(底色) + 标签(即时压力) + 时间(趋势) -> world-tick(每日演化) -> world-pressure-check(压力过载 -> 触发事件母体) -> $player_modifier(世界状态调制事件概率) $world 变量与 $active_tags 的区别: - $active_tags 是微观的、事件产生的、会衰减的 - $world 是宏观的、世界自身的、持续演化的 - 标签会"喂"给世界变量(影响漂移方向),但世界变量独立存在 ============================================================ */ /* ---------- world-tick:每日世界演化 ---------- 用法:<<world-tick>>(在 daily-tick 里每日调用) 每个变量 = 基础漂移 + 历史锚点修正 + 活跃标签修正 钳制 0-100 防止雪崩。 */ <<widget "world-tick">>\ <<silently>> /* --- 读取标签强度辅助函数(内联,避免额外widget调用)--- */ <<set _tag_sum to {}>> <<for _i to 0; _i lt $active_tags.length; _i++>> <<set _tn to $active_tags[_i].name>> <<if not _tag_sum.hasOwnProperty(_tn)>> <<set _tag_sum[_tn] to 0>> <</if>> <<set _tag_sum[_tn] to _tag_sum[_tn] + $active_tags[_i].intensity>> <</for>> /* --- 经济压力 --- */ /* 基准漂移从 $stage.tick.economy 读取(替代写死的 1923);缺省 base 中性值。 */ <<set _econ_drift to (($stage.tick and $stage.tick.economy) ? $stage.tick.economy.base : 0.3)>> <<if $stage.tick and $stage.tick.economy and $stage.tick.economy.boostY eq $date.year>> <<set _econ_drift to $stage.tick.economy.boost>> /* 危机顶峰月,漂移翻倍 */ <<if $stage.tick.economy.peakM.indexOf($date.month) gte 0>> <<set _econ_drift to $stage.tick.economy.peak>> <</if>> <</if>> /* 标签修正:经济压力标签越强,世界经济压力涨得越快 */ <<set _econ_tag to _tag_sum["经济压力"] ?? 0>> <<set $world.economy to Math.min(100, $world.economy + _econ_drift + _econ_tag * 0.02)>> /* --- 通胀恶化度 --- */ /* 从 $stage.tick.inflation 读取(替代 1923 写死);base 为中性默认。 V0.8 调缓:支持 boostM(指定月份加速档),避免全年 uniform 漂移导致通胀 2 月就崩。 层级:base(全年)-> boostM 命中当月 -> peakM 命中当月(最高档)。 */ <<set _inf_drift to (($stage.tick and $stage.tick.inflation) ? $stage.tick.inflation.base : 0.2)>> <<if $stage.tick and $stage.tick.inflation>> <<if $stage.tick.inflation.boostM and $stage.tick.inflation.boostM.indexOf($date.month) gte 0>> <<set _inf_drift to $stage.tick.inflation.boost>> <</if>> <<if $stage.tick.inflation.peakM and $stage.tick.inflation.peakM.indexOf($date.month) gte 0>> <<set _inf_drift to $stage.tick.inflation.peak>> <</if>> /* 地租马克发行日,通胀骤降 */ <<if $stage.tick.inflation.collapseDay and $date.month eq $stage.tick.inflation.collapseDay.m and $date.day gte $stage.tick.inflation.collapseDay.d>> <<set _inf_drift to $stage.tick.inflation.collapseDay.val>> <</if>> <<if $stage.tick.inflation.postCollapseMonth and $date.month eq $stage.tick.inflation.postCollapseMonth>> <<set _inf_drift to $stage.tick.inflation.postCollapseVal>> <</if>> <</if>> <<set _inf_tag to _tag_sum["货币信任下降"] ?? 0>> /* 消极抵抗政策连锁:印钞养罢工 -> 通胀加速。 V0.8 调缓:改按月份分段雪崩(前期可控、后期失控),不再全年匀速 +1.5/--原值 2 月就崩。 full:1-5月+0.15 / 6-8月+0.3 / 9月起+0.8;limited 减半。 */ <<set _passive_drift to 0>> <<if $flags.passive_resistance eq "full" or $flags.passive_resistance eq "limited">> <<set _p_mult to ($flags.passive_resistance eq "full") ? 1 : 0.5>> <<if $date.month lte 5>> <<set _passive_drift to 0.15 * _p_mult>> <<elseif $date.month lte 8>> <<set _passive_drift to 0.3 * _p_mult>> <<else>> <<set _passive_drift to 0.8 * _p_mult>> <</if>> <</if>> <<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + _inf_drift + _passive_drift + _inf_tag * 0.01))>> /* --- 社会愤怒 --- */ /* 受经济压力和工人愤怒标签驱动 */ <<set _anger_drift to 0.1>> <<set _anger_drift to _anger_drift + ($world.economy - 30) * 0.005>> <<set _anger_tag to _tag_sum["工人愤怒"] ?? 0>> <<set $world.social_anger to Math.min(100, $world.social_anger + _anger_drift + _anger_tag * 0.02)>> /* --- 中产信心 --- */ /* 学桌游:中产(职员/小商人/小储户)是共和国的压舱石,也是极端派的燃料池。 越高越好:通胀与经济压力烧他,政府信任托他,政治暴力吓他。 */ <<set _mid_drift to -0.02>> <<set _mid_drift to _mid_drift - Math.max(0, $world.inflation - 40) * 0.004>> <<set _mid_drift to _mid_drift - Math.max(0, $world.economy - 30) * 0.004>> <<set _mid_drift to _mid_drift - $world.political_violence * 0.001>> <<set _mid_drift to _mid_drift + ($world.gov_trust - 40) * 0.002>> /* 恶性通胀高峰期,中产加速逃散 */ <<if $world.inflation gte 60>><<set _mid_drift to _mid_drift - 0.1>><</if>> <<set _mid_tag to (_tag_sum["政府信誉"] ?? 0) - (_tag_sum["货币信任下降"] ?? 0) - (_tag_sum["经济压力"] ?? 0)>> <<set $world.middle_confidence to Math.max(0, Math.min(100, ($world.middle_confidence ?? 32) + _mid_drift + _mid_tag * 0.008))>> /* --- 民族主义热度 --- */ /* 受凡尔赛锚点持续推动 + 民族屈辱标签加成 */ <<set _nat_drift to 0.15>> <<set _nat_drift to _nat_drift + $historical_anchors.versailles.intensity * 0.003>> <<set _nat_tag to (_tag_sum["民族屈辱"] ?? 0) + (_tag_sum["民族主义"] ?? 0)>> /* 学桌游:中产是极端派的燃料——中产信心跌破 30,绝望者开始寻找强人 */ <<if $world.middle_confidence lt 30>><<set _nat_drift to _nat_drift + 0.12>><</if>> <<set $world.nationalism to Math.min(100, $world.nationalism + _nat_drift + _nat_tag * 0.015)>> /* --- 政府信任 --- */ /* 自然衰减(共和国天然不被信任),经济恶化加速衰减 */ <<set _trust_drift to -0.1>> <<set _trust_drift to _trust_drift - ($world.economy - 30) * 0.003>> <<set _trust_tag to (_tag_sum["政府信誉"] ?? 0) - (_tag_sum["政府失信"] ?? 0)>> <<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + _trust_drift + _trust_tag * 0.01))>> /* --- 军方影响力 --- */ /* 受政治暴力增加和军队不满标签推动 */ <<set _army_drift to 0.05>> <<set _army_tag to _tag_sum["军队不满"] ?? 0>> <<set _army_drift to _army_drift + _army_tag * 0.01>> /* 政府信任越低,军方越有借口扩大影响 */ <<if $world.gov_trust lt 30>><<set _army_drift to _army_drift + 0.1>><</if>> <<set $world.army_influence to Math.min(100, $world.army_influence + _army_drift)>> /* --- 革命压力 --- */ /* 受社会愤怒 + 工人愤怒标签 + 革命恐惧锚点驱动 */ <<set _rev_drift to 0.05>> <<set _rev_drift to _rev_drift + $world.social_anger * 0.003>> <<set _rev_tag to _tag_sum["工人愤怒"] ?? 0>> <<set _rev_drift to _rev_drift + _rev_tag * 0.015>> /* 阶段内特定月革命压力飙升(S3=汉堡起义月10月) */ <<if $stage.tick and $stage.tick.revolution and $stage.tick.revolution.boostY eq $date.year and $stage.tick.revolution.boostM eq $date.month>> <<set _rev_drift to _rev_drift + $stage.tick.revolution.boost>> <</if>> <<set $world.revolution to Math.min(100, $world.revolution + _rev_drift)>> /* --- 政治暴力 --- */ /* 受民族主义 + 革命压力 + 军方影响共同推动 */ <<set _viol_drift to 0.05>> <<set _viol_drift to _viol_drift + $world.nationalism * 0.002 + $world.revolution * 0.002>> <<set _viol_tag to _tag_sum["政治暴力增加"] ?? 0>> <<set $world.political_violence to Math.min(100, $world.political_violence + _viol_drift + _viol_tag * 0.02)>> /* --- 财政赤字 --- */ /* 赤字无自然漂移,只随花钱类决策累积;消极抵抗是1923最大的烧钱项目 */ <<if $flags.passive_resistance eq "full">> <<set $world.fiscal to Math.min(100, ($world.fiscal ?? 30) + 0.15)>> <<elseif $flags.passive_resistance eq "limited">> <<set $world.fiscal to Math.min(100, ($world.fiscal ?? 30) + 0.08)>> <</if>> /* 赤字高企(>60):印钞与借债撑赤字——每天通胀+0.1、政府信任-0.04,代价延迟兑现 */ <<if ($world.fiscal ?? 0) gt 60>> <<set $world.inflation to Math.min(100, $world.inflation + 0.1)>> <<set $world.gov_trust to Math.max(0, $world.gov_trust - 0.04)>> <</if>> /* --- 写入世界演化日志(调试用)--- */ <<set $last_world_tick to "经济" + Math.round($world.economy) + " 通胀" + Math.round($world.inflation) + " 愤怒" + Math.round($world.social_anger) + " 民族" + Math.round($world.nationalism) + " 信任" + Math.round($world.gov_trust) + " 中产" + Math.round($world.middle_confidence) + " 军方" + Math.round($world.army_influence) + " 革命" + Math.round($world.revolution) + " 暴力" + Math.round($world.political_violence) + " 赤字" + Math.round($world.fiscal ?? 0)>> <</silently>>\ <</widget>> /* ---------- world-pressure-check:压力阈值检测 ---------- 用法:<<world-pressure-check>>(在 daily-tick 里 world-tick 之后调用) 检测世界变量是否超过阈值,超阈值时: 1. 调用 archetype-spawn 从事件母体生成事件 2. 更新 $player_modifier(世界状态调制后续事件概率) */ <<widget "world-pressure-check">>\ <<silently>> /* --- 更新 $player_modifier(修复"无人修改"的坑)--- 世界压力越高,生态事件(黄/白)生成概率越高 0.8(稳定)~ 1.5(危机) */ <<set _pressure_avg to ($world.economy + $world.social_anger + $world.nationalism + $world.political_violence + $world.revolution) / 5>> <<set $player_modifier to Math.max(0.8, Math.min(1.5, 0.8 + _pressure_avg * 0.007))>> /* --- 检测压力过载,触发事件母体 --- 每个维度超过阈值时,有概率触发对应母体 同一天最多触发1个母体事件(防刷屏) 每日母体事件总数不超过 $daily_event_cap(防窒息)*/ <<set _spawned to false>> <<if $daily_event_count gte $daily_event_cap>> <<set _spawned to true>> <</if>> /* 经济压力过载 */ <<if not _spawned and $world.economy gte 55>> <<if random(1, 100) lte Math.min(80, 30 + ($world.economy - 55))>> <<archetype-spawn "经济">> <<set _spawned to true>> <</if>> <</if>> /* 社会愤怒过载 */ <<if not _spawned and $world.social_anger gte 50>> <<if random(1, 100) lte Math.min(70, 25 + ($world.social_anger - 50))>> <<archetype-spawn "社会">> <<set _spawned to true>> <</if>> <</if>> /* 民族主义过载 */ <<if not _spawned and $world.nationalism gte 55>> <<if random(1, 100) lte Math.min(60, 20 + ($world.nationalism - 55))>> <<archetype-spawn "政治">> <<set _spawned to true>> <</if>> <</if>> /* 政治暴力过载 */ <<if not _spawned and $world.political_violence gte 45>> <<if random(1, 100) lte Math.min(60, 20 + ($world.political_violence - 45))>> <<archetype-spawn "军事">> <<set _spawned to true>> <</if>> <</if>> /* 革命压力过载 */ <<if not _spawned and $world.revolution gte 50>> <<if random(1, 100) lte Math.min(50, 15 + ($world.revolution - 50))>> <<archetype-spawn "社会">> <<set _spawned to true>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- world-status:世界状态简报(调试+UI用)---------- 用法:<<world-status>> 输出到 _world_status_text */ <<widget "world-status">>\ <<silently>> <<set _world_status_text to "">> <<set _world_status_text to _world_status_text + "经济压力:" + Math.round($world.economy) + " ">> <<set _world_status_text to _world_status_text + "通胀:" + Math.round($world.inflation) + " ">> <<set _world_status_text to _world_status_text + "社会愤怒:" + Math.round($world.social_anger) + " ">> <<set _world_status_text to _world_status_text + "民族主义:" + Math.round($world.nationalism) + " ">> <<set _world_status_text to _world_status_text + "政府信任:" + Math.round($world.gov_trust) + " ">> <<set _world_status_text to _world_status_text + "中产信心:" + Math.round($world.middle_confidence) + " ">> <<set _world_status_text to _world_status_text + "军方影响:" + Math.round($world.army_influence) + " ">> <<set _world_status_text to _world_status_text + "革命压力:" + Math.round($world.revolution) + " ">> <<set _world_status_text to _world_status_text + "政治暴力:" + Math.round($world.political_violence)>> <</silently>>\ <</widget>> /* ---------- world-apply-effects:应用世界效果 ---------- 用法:<<world-apply-effects _effects_obj>> 参数:{economy:+5, social_anger:-3, ...} 用于事件结算时改变世界状态 */ <<widget "world-apply-effects">>\ <<silently>> <<set _eff to $args[0]>> <<if _eff and typeof _eff eq "object">> <<if _eff.hasOwnProperty("economy")>> <<set $world.economy to Math.max(0, Math.min(100, $world.economy + _eff.economy))>> <</if>> <<if _eff.hasOwnProperty("inflation")>> <<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + _eff.inflation))>> <</if>> <<if _eff.hasOwnProperty("social_anger")>> <<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger + _eff.social_anger))>> <</if>> <<if _eff.hasOwnProperty("nationalism")>> <<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + _eff.nationalism))>> <</if>> <<if _eff.hasOwnProperty("gov_trust")>> <<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + _eff.gov_trust))>> <</if>> <<if _eff.hasOwnProperty("middle_confidence")>> <<set $world.middle_confidence to Math.max(0, Math.min(100, ($world.middle_confidence ?? 32) + _eff.middle_confidence))>> <</if>> <<if _eff.hasOwnProperty("army_influence")>> <<set $world.army_influence to Math.max(0, Math.min(100, $world.army_influence + _eff.army_influence))>> <</if>> <<if _eff.hasOwnProperty("revolution")>> <<set $world.revolution to Math.max(0, Math.min(100, $world.revolution + _eff.revolution))>> <</if>> <<if _eff.hasOwnProperty("political_violence")>> <<set $world.political_violence to Math.max(0, Math.min(100, $world.political_violence + _eff.political_violence))>> <</if>> <<if _eff.hasOwnProperty("fiscal")>> <<set $world.fiscal to Math.max(0, Math.min(100, ($world.fiscal ?? 30) + _eff.fiscal))>> <</if>> <</if>> <</silently>>\ <</widget>>
/* ================================================================================ 跨阶段协议 / Cross-Stage Protocol(选项 1 交付物) ------------------------------------------------------------------------------- 定位:只写"变量表和注释"的地基文件,不写任何业务逻辑。 目的:在写更多章节内容前,把"阶段怎么组织、什么跨章传、什么时候硬断"定死, 避免第三章写死了、后面五章接不上(机制漂移 / 变量爆炸 / 章间断裂)。 本文档回答 5 个问题: ① $stage 阶段化怎么组织(线性主轴 + 分轨路由) ② $fate 历史相位轴怎么工作(A:滑动分轨) ③ 局部 B(硬断)与局部 C(门闸)落到哪些现有系统 ④ 变量跨章协议:哪些持久 / 哪些阶段内 / 哪些清洗 ⑤ 阶段结算与 next 路由规则 实现选址: - $fate 与 $stage 的**初始值**放 01_init.twee(见本文件的"初始化约定"段) - world-tick 的**漂移参数化**改 25_world_system.twee(见 ⑥) - 阶段结算 widget 新建(引用 40_inertia_system / 90_endings 的思路) - 门闸复用现有 $swell_events(历史暗涌);军方局部硬断复用 $mil_line ================================================================================ ━┓(一)三条铁律 ┃ 1. 阶段 = 节点,不是索引。S1→S3 不是 next=+1,而是按结算后 $fate 路由。 ┃ 2. $fate 是滑动权重,不是布尔开关。任何选择只让某轴漂一点,绝不瞬跳。 ┃ 3. 六章史只是"玩家没踹翻历史"时的默认主轴;踹翻后进少数手工硬断节点, ┃ 不补六章整套分叉内容。 ━┓(二)$stage 结构(Schema) ┃ 每条阶段配置 = { id, timeline, name, year, theme, ┃ world_base, // 世界初始值(读入 $world) ┃ tick, // world-tick 漂移参数(替换写死的 1923) ┃ deck, // 红牌/母体/白牌 复用分库开关 ┃ fate_range, // $fate 相位内钳制 [min,max] ┃ exit_gates, // B 层硬门闸:[{ fate, flag, next }] ┃ anchors, // 历史锚点($historical_anchors 该阶段基线) ┃ meta } // 密度/主题/设计备注 ┃ 说明:$chapter 升级为 $stage。$chapter.num/name 迁移进 $stage。 ┃ 兼容:过渡期保留 $chapter 只读别名,避免一次性改爆所有 passage。 ┃ 注:$phase 与本文件 $stage 同义(河床层);沿用 $stage 避免返工。 ━┓(三)六章主轴配置表(默认史,A 的 weimar 主线) ┃ ┌────┬─────────────┬──────────┬──────────────────────────────────────────┐ ┃ │ id │ 名称 │ 年份 │ 主题 / 世界 tick 差异化 │ ┃ ├────┼─────────────┼──────────┼──────────────────────────────────────────┤ ┃ │ S1 │ 建国与革命 │ 1918-19 │ 诞生合法性。禁用:议会投票未建。 │ ┃ │ │ │ │ 新增:凡尔赛谈判 / 制宪博弈。 │ ┃ │ S2 │ 动荡与暗杀 │ 1920-22 │ 赔款与暗杀。禁用:大规模街头战未到。 │ ┃ │ │ │ │ 新增:卡普政变应对、暗杀链。 │ ┃ │ S3 │ 危机元年 │ 1923 │ 恶性通胀 ★当前。tick 见下方 ⑥ 参数化。 │ ┃ │ │ │ │ 新增:鲁尔抵抗、啤酒馆、通胀骤降(地租马克)。 │ ┃ │ S4 │ 黄金岁月 │ 1924-28 │ 道威斯稳定。禁用:通胀机制。 │ ┃ │ │ │ │ 新增:外交贷款、选举常态、文化黄金。 │ ┃ │ S5 │ 大萧条极化 │ 1929-32 │ 危机重临。禁用:繁荣福利。 │ ┃ │ │ │ │ 新增:紧急法令、街头战争、纳粹崛起。 │ ┃ │ S6 │ 垂死与抉择 │ 1932-33+ │ 终局。禁用:议会民主(已死)。 │ ┃ │ │ │ │ 新增:密室谈判、权力移交 / 存续线。 │ ┃ └────┴─────────────┴──────────┴──────────────────────────────────────────┘ ━┓(四)$fate 历史相位滑轨(C 层局部闸门 + B 层哨兵) ┃ $fate = 单轴连续标量: -100 ← … ← 0 → … → +100 ┃ 负端=革命势能(左) 0=魏玛默认 正端=右翼/复辟势能 ┃ 语义:连续势能,不是布尔也不是概率;同一相位内可反复玩出不同风味。 ┃ 初始:0(魏玛中道)。浮动:日常选择 ±1~±5;相位内钳制在 $stage.fate_range。 ┃ 读取位: ┃ ① C 层:事件抽取按 $fate 加权(fate_weight:负偏左翼事件 / 正偏右翼事件) ┃ ② B 层:结算 <<PhaseExitCheck>> 比 $fate 突破 exit_gates.fate 且满足因果 flag ┃ ③ 文本 / 报纸头条 / 锚点强度 ┃ 区分"红潮 vs 军政府":不靠轴(同处 ± 轨道),靠 exit_gates 的 flag(如 $mil_outcome)。 ┃ 对应钢4:party popularity 的连续意识形态滑轨。 ━┓(五)A + 局部 B + 局部 C 落地映射 ┃ ① A(主轴分轨) —— $stage.next 按 $fate 路由 + tick/world_base 按轴取档。 ┃ ② 局部 B(硬断) —— 当一轴推过硬阈值(如 $fate.red ≥ 70,或 $world.revolution ┃ + $mil_outcome 满足),触发"世界基准整体更换"的硬断节点: ┃ 红潮(revolution 硬断)→ 复用并泛化 $mil_line 结构, ┃ 军政府(military 硬断)→ 复用 $mil_outcome。 ┃ 硬断节点是少数手工精调节点,不是补六章。 ┃ ③ 局部 C(门闸) —— 已有 $swell_events(历史暗涌)就是 C:紧迫值达标时 ┃ 把历史的红色事件替换/改写。直接沿用,不用新造。 ┃ 三者关系:C 负责"事件级偏转"(无硬断),A 负责"阶段级分轨", ┃ B 负责"世界现实级断裂"。层级递增。 ━┓(六)world-tick 漂移参数化(S3 现状 → 通用) ┃ 现状:25_world_system.twee 里通胀/经济等把 1923 写死($date.year eq 1923)。 ┃ 改造:漂移值移入 $stage.tick,world-tick 从 $stage.tick 读取,缺失则用中性默认。 ┃ 各轴漂移参数(来自当前 S3 写死值,迁移时不改数值): ┃ economy: base 0.3 | S3: 0.8, 9-11月 1.5 ┃ inflation: base 0.2 | S3: 1.2, 9-10月 2.0, 11/15起 -3.0, 12月 -1.0 ┃ (另有 消极抵抗 full 1.5 / limited 0.8 属玩家政策链路,保留在 code) ┃ social_anger: 0.1 + (economy-30)*0.005 ┃ nationalism: 0.15 + versailles.intensity*0.003 ┃ gov_trust: -0.1 - (economy-30)*0.003 ┃ army_influence: 0.05 (+ gov_trust<30 时 +0.1) ┃ revolution: 0.05 + social_anger*0.003 | S3 10月额外 +0.5 ┃ political_violence: 0.05 + nationalism*0.002 + revolution*0.002 ┃ 中性默认 = 上面的 base;S4 需把 inflation 改为不涨(禁用通胀机制)。 ━┓(七)跨章变量协议(核心交付物:什么传 / 什么清 / 什么改) ┃ 原则:记忆(legacy/inertia)跨越;微观数值清洗;相位轴重算。 ┃ ┌ 必须跨章(持久)──────────────────────────────────────────────┐ ┃ │ $legacy_pool 历史遗产(status: active/sedimented) │ ┃ │ $inertia_matrix 惯性矩阵(跨阶段起始底色) │ ┃ │ $fate 相位轴(重新加权但保留方向,不清零) │ ┃ │ $flags 关键党争/政策承诺(白名单持久,见下) │ ┃ │ $mil_line/outcome 军方线跨阶段延续(军政府轨的种子) │ ┃ └───────────────────────────────────────────────────────────────┘ ┃ ┌ 阶段内(结算后清洗,不跨章)────────────────────────────────────┐ ┃ │ $white_deck 牌库状态 $event_cooldowns $site_done 现场处置 │ ┃ │ $last_world_tick 简报快照 session_day 日计数(阶段内) │ ┃ │ 微观:面包价格/当日公文单 等仅本阶段意义 │ ┃ └───────────────────────────────────────────────────────────────┘ ┃ ┌ 结算时重算(由本阶段数据反推,不直接传)────────────────────────┐ ┃ │ world_base 下一阶段初始值(tick 领域差异大,阶段内演化后再重设基线)│ ┃ │ stage.next 下一节点 id(按 $fate 最高轴选定) │ ┃ └───────────────────────────────────────────────────────────────┘ ┃ $flags 白名单(必须持久但仍需逐项审计): ┃ passive_resistance(1923 关键,S4 不再有意义→可沉降进 legacy) ┃ {party}st_{xyz} 对话/承诺标记 —— 是否跨章待定(见 S4 设计) ┃ 约定命名空间:跨阶段长变量一律顶层($legacy_pool / $fate), ┃ 阶段内变量一律 $stage.xxx 或全局散装并在结算清洗脚本列白名单。 ━┓(八)阶段结算与路由规则 ┃ 1. @阶段末:跑 <Stage-Settlement> widget(新建,参照 90_endings 结算思路) ┃ ├─ 生成"历史简报":报纸头版 + 数据总结(解决章间断裂) ┃ ├─ 更新 $fate(各轴加权结算) ┃ ├─ 把本阶段结果写进 $legacy_pool / $inertia_matrix ┃ └─ 清洗阶段内变量(按第七节白名单) ┃ 2. 路由:$stage.next[ 结算后最高相位轴 ] → 若非 default,进硬断/支线节点。 ┃ 3. 结局非第六章专属:每阶段都能"提前收束"(流亡/政变/红潮), ┃ 第六章是"总结算"而非"选结局"。 ━┓(九)初始化约定(放 01_init.twee,代码见选项 2 骨架) ┃ <<set $fate to 0>> // 单轴标量,默认魏玛中道 ┃ <<set $stage to { // S3 为当前章,先落 S3 配置,其余留 TODO ┃ num:3, id:"S3", timeline:"WEIMAR_1923", name:"危机元年", year:1923, theme:"…", ┃ world_base:{ … }, tick:{ economy:{…}, inflation:{…}, revolution:{…} }, ┃ deck:"S3", fate_range:{min:-100,max:100}, ┃ exit_gates:[ {fate:-90, flag:"$flags.uprising_victory eq 'victory'", next:"BR_RED_SPRING"}, ┃ {fate:90, flag:"$mil_outcome eq '得逞'", next:"BR_MARCH_ON_BERLIN"} ], ┃ meta:{} }>> ┃ (2026-10-09 修正:S3 range 放宽到 ±100 使 ±90 门闸可达;因果 flag 与实际 ┃ 写入点对齐——uprising_victory←C02顺水推舟 / 得逞←C03默许政变条件。) ━┓(十)Done / TODO(本文档推进清单) ┃ [x] 定死 $stage schema 与六轴主表 ┃ [x] 定死 $fate 单轴滑轨、fate_range、exit_gates(B/C 分层) ┃ [x] 定死跨章变量协议(持久/阶段内/重算 三分法) ┃ [~] 01_init:$fate 标量 + $stage 扩展字段(已成,全六相位注册表待定) ┃ [x] 25_world_system:world-tick 读 $stage.tick 去写死年份 ┃ [x] 02_caption:显示升级为 $stage ┃ [x] 90_phase_system:PhaseExitCheck(B)+ fate-clamp + 阶段结算( ┃ 简报 + $fate 更新 + 清洗 + 路由)(结算/门闸已成;简报 UI 与清洗仍 TODO) ┃ [x] C 层:archetype/事件 fate_weight 加权抽取(需先读 archetype-spawn) ┃ [~] 六相位注册表 $phases 落位(骨架已成,S1/S2/S4-S6 world_base 待各章内容) ┃ [x] 硬断节点 BR_RED_SPRING / BR_MARCH_ON_BERLIN 落位(已成文,在 90_endings; ┃ 经 End_Chapter1 顶部 Stage-Settlement 门闸转跳,2026-10-09) ┃ [ ] 验证 S3 完整可玩(进游戏→日循环→红/橙/白→结算) ================================================================================ */
/* ════════════════════════════════════════════════════════════ 危机链系统(V0.8 给世界接牙) ------------------------------------------------------------ 三条危机线 + 一条通胀导火索: - 暴力线:政治暴力 ≥60 开始倒数10天 → ≥72 且倒数走完 → C01 内战边缘 - 革命线:革命压力 ≥60 开始倒数10天 → ≥72 且倒数走完 → C02 总起义前夜 - 右翼线:民族主义 ≥70 且 军方影响 ≥55 开始倒数 → 双值续涨 ≥62/双≥68 或倒数走完 → C03 政变前夜 - 通胀导火索:通胀 ≥85 一次性触发 C04 货币崩溃关口(不倒数,直接红事件) 倒数期间把变量压回预警线以下即解除。 危机事件进 pending 为红色级(不可跳过)。 死亡判定(宽线):爆发时相关变量 ≥90 且玩家选了最坏选项 → End_Death。 挂接点:daily-tick 结尾、tp-skip-to-event 世界演化后、tick-cycle。 ════════════════════════════════════════════════════════════ */ /* ---------- crisis-check:每日危机检查 ---------- 用法:<<crisis-check [跳过的天数]>> 不传参数=逐日检查(倒数-1);传天数=快进批量(倒数按天数递减)。 */ <<widget "crisis-check">>\ <<silently>> <<set _cc_days to ($args.length gt 0 and Number($args[0]) gt 0) ? Number($args[0]) : 1>> <<if not $crisis_state>> <<set $crisis_state to {}>> <</if>> <<set _cc_lines to ["violence","revolution","rightwing"]>> <<for _ci to 0; _ci lt _cc_lines.length; _ci++>> <<set _cl to _cc_lines[_ci]>> <<set _cc_ignite to false>> <<set _cc_warn to false>> <<if _cl eq "violence">> <<if $world.political_violence gte 72>> <<set _cc_ignite to true>> <<elseif $world.political_violence gte 60>> <<set _cc_warn to true>> <</if>> <<elseif _cl eq "revolution">> <<if $world.revolution gte 72>> <<set _cc_ignite to true>> <<elseif $world.revolution gte 60>> <<set _cc_warn to true>> <</if>> <<else>> /* 右翼线:民族主义+军方双值 */ <<if $world.nationalism gte 70 and $world.army_influence gte 55>> <<if $world.nationalism gte 68 and $world.army_influence gte 62>> <<set _cc_ignite to true>> <<else>> <<set _cc_warn to true>> <</if>> <</if>> <</if>> <<if not $crisis_state[_cl]>> <<set $crisis_state[_cl] to { warned: false, countdown: -1, fired: false }>> <</if>> <<if not $crisis_state[_cl].fired>> <<if _cc_ignite and $crisis_state[_cl].countdown lte 0 and not $crisis_state[_cl].warned>> /* 未预警直接到爆发值(猛涨):先预警,从现在开始倒数 */ <<set $crisis_state[_cl].warned to true>> <<set $crisis_state[_cl].countdown to 10>> <<elseif _cc_ignite and $crisis_state[_cl].countdown lte 0>> /* 倒数走完且仍在爆发值之上 → 爆发 */ <<crisis-ignite _cl>> <<elseif _cc_warn and not $crisis_state[_cl].warned>> /* 首次进入预警区:开始倒数 */ <<set $crisis_state[_cl].warned to true>> <<set $crisis_state[_cl].countdown to 10>> <<crisis-warn-note _cl>> <<elseif $crisis_state[_cl].warned>> <<if _cc_ignite and $crisis_state[_cl].countdown gt 0>> /* 预警中且已到爆发值:倒数照走,走完即爆 */ <<set $crisis_state[_cl].countdown to $crisis_state[_cl].countdown - _cc_days>> <<if $crisis_state[_cl].countdown lte 0>> <<crisis-ignite _cl>> <</if>> <<elseif _cc_warn>> /* 预警中但还没到爆发值:倒数照走(自救窗口在收窄) */ <<set $crisis_state[_cl].countdown to $crisis_state[_cl].countdown - _cc_days>> <<if $crisis_state[_cl].countdown lte 0>> <<set $crisis_state[_cl].countdown to 1>> /* 倒数耗尽但未到爆发值:钉在1天,变量一涨就爆 */ <<if not $crisis_state[_cl].pin_noted>> <<set $crisis_state[_cl].pin_noted to true>> <<crisis-warn-note _cl>> <</if>> <</if>> <<else>> /* 压回预警线以下:解除预警 */ <<set $crisis_state[_cl].warned to false>> <<set $crisis_state[_cl].countdown to -1>> <<set $crisis_state[_cl].pin_noted to false>> <</if>> <</if>> <</if>> <</for>> /* 通胀导火索:≥85 一次性触发 C04 */ <<if not $crisis_state.inflation_fired and $world.inflation gte 85>> <<set $crisis_state.inflation_fired to true>> <<crisis-spawn "C04">> <</if>> <</silently>>\ <</widget>> /* ---------- crisis-warn-note:预警提示(写入 $crisis_notice 提醒队列) ---------- morning-embed 晨报表顶部红字展示,玩家看过即清空。 首次预警($flags.crisis_taught_未置)额外附一条金色教学点: 告诉玩家火还能灭、去哪灭(区域/国会/报纸),之后不再重复。 注意:不能写 $last_event_roll--它在 event-pool-roll 里每天被清空, 而 crisis-check 在其后执行,写进去的警告活不过当天。 */ <<widget "crisis-warn-note">>\ <<silently>> <<set _wn to $args[0]>> <<if not $crisis_notice>><<set $crisis_notice to []>><</if>> <<set _wn_text to "">> <<if _wn eq "violence">> <<set _wn_text to "⚠ 街上的枪声越来越密。政治暴力正在逼近失控的边缘。">> <<elseif _wn eq "revolution">> <<set _wn_text to "⚠ 革命的火种在往干柴上落。有人已经在磨刀。">> <<elseif _wn eq "rightwing">> <<set _wn_text to "⚠ 右翼的鼓声和军靴声在同一个节拍上。有人在等一个机会。">> <</if>> <<if _wn_text neq "">> <<set $crisis_notice.push(_wn_text)>> <<if not $flags["crisis_taught_" + _wn]>> <<set $flags["crisis_taught_" + _wn] to true>> <<set $crisis_notice.push('<span class="teaching-note">火还没烧起来。灭火的东西在街上、在国会、在报纸上--趁倒数还没走完,去用它们。把对应的数字压回去,火就熄了。</span>')>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- crisis-ignite:危机爆发(注入红色级待办) ---------- 用法:<<crisis-ignite "violence">> */ <<widget "crisis-ignite">>\ <<silently>> <<set _ig to $args[0]>> <<set $crisis_state[_ig].fired to true>> <<set $crisis_state[_ig].warned to false>> <<set $crisis_state[_ig].countdown to -1>> <<if _ig eq "violence">> <<crisis-spawn "C01">> <<elseif _ig eq "revolution">> <<crisis-spawn "C02">> <<else>> <<crisis-spawn "C03">> <</if>> <</silently>>\ <</widget>> /* ---------- crisis-spawn:把危机事件塞进待办(红色级) ---------- 用法:<<crisis-spawn "C01">> */ <<widget "crisis-spawn">>\ <<silently>> <<set _cs to $args[0]>> <<set _cs_def to {}>> <<if _cs eq "C01">> <<set _cs_def to { title: "内战边缘", desc: "街垒一夜之间回到了柏林。左右两翼的武装在同一座城市里互相搜索。死人的名单每天早上更新,报纸开始像战报。军队在兵营里待命,等一个命令--或者等一个不需要命令的借口。", tag: "政治暴力增加", irreversible: 4 }>> <<elseif _cs eq "C02">> <<set _cs_def to { title: "总起义前夜", desc: "工厂委员会通过了总罢工决议,措辞里藏着「一切权力归苏维埃」。武器在工会地下室之间转移。所有人都知道明天会发生什么,所有人都在等别人先动。共和国的命,悬在今夜。", tag: "革命压力", irreversible: 4 }>> <<elseif _cs eq "C03">> <<set _cs_def to { title: "政变前夜", desc: "国防军的卡车在夜色里向柏林集结。将军们的会议开到了第三个小时,桌上摊着一份「临时政府」的名单。他们只差一样东西--一个签字,或者一个不签字的沉默。", tag: "民族主义", irreversible: 4 }>> <<elseif _cs eq "C04">> <<set _cs_def to { title: "货币崩溃关口", desc: "马克不再是货币,是笑话。面包按小时改价,工资用麻袋装。中产一生的积蓄,抵不上一封信的邮资。街头巷尾在传同一句话:这样下去,要出大事。所有人都看着政府--看你。", tag: "货币信任下降", irreversible: 3 }>> <</if>> <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _cs, source: "crisis", lifecycle: "era", irreversible: _cs_def.irreversible, intensity: 95, related_tag: _cs_def.tag, tag: _cs_def.tag, title: _cs_def.title, description: _cs_def.desc, template: "decision", born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> <<set $last_event_roll.push("⬛ 危机爆发:" + _cs_def.title)>> <</silently>>\ <</widget>> /* ---------- crisis-status-line:状态栏警示行(倒数中显示) ---------- */ <<widget "crisis-status-line">>\ <<silently>> <<set _csl to "">> <<if $crisis_state>> <<if $crisis_state.violence and $crisis_state.violence.warned and not $crisis_state.violence.fired>> <<set _csl to _csl + "⚠ 暴力失控边缘 · 剩余" + $crisis_state.violence.countdown + "天 ">> <</if>> <<if $crisis_state.revolution and $crisis_state.revolution.warned and not $crisis_state.revolution.fired>> <<set _csl to _csl + "⚠ 革命一触即发 · 剩余" + $crisis_state.revolution.countdown + "天 ">> <</if>> <<if $crisis_state.rightwing and $crisis_state.rightwing.warned and not $crisis_state.rightwing.fired>> <<set _csl to _csl + "⚠ 政变阴云 · 剩余" + $crisis_state.rightwing.countdown + "天 ">> <</if>> <</if>> <<set _crisis_line to _csl>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ 暗账系统(Layer 1.5 · 静水深流) ------------------------------------------------------------ 解决「玩家把世界治理好后无事可干」的短板: 世界越平静,暗账涨得越快——好状态本身就是债。 三条暗账(0-100): - party_rift 党争裂痕:太平年代的日常是互相拆台。 - extremism 极端滋长:绝望平息了,但绝望过的人还在等下一次。 - paper_gains 纸面繁荣:靠借来的钱和没兑现的承诺撑起来的体面。 涨速 = gain_base + gain_calm × 平静度(世界"最险值"越低越平静)。 最险值 ≥ crisis_stop(55) → 停涨冻结; 最险值 ≥ crisis_drain(70) → 每天回落(现实压力冲淡积怨)。 满 100 → 引爆一件潜伏危机事件(A 前缀,选项定义在 $world_custom_options,与 67 件定制事件同管线), 该条清零、进入 cool_gap 天冷却(防连环爆)。 1923(S3)开局最险值≈60 → 全程基本冻结,短板在黄金年代(S4)显形。 接线:daily-tick 在 event-pool-roll 之后调 undercurrent-day (演化+引爆一次做完);tick-cycle 快进调 <<undercurrent-day 60>>。 侧栏「国家趋势」"潜流"行;调试台「后台总览」暗账面板。 ════════════════════════════════════════════════════════════ */ /* ---------- undercurrent-init:初始化(StoryInit 调一次) ---------- */ <<widget "undercurrent-init">>\ <<silently>> <<set $undercurrent to { party_rift: 18, extremism: 22, paper_gains: 15 }>> /* key=条名, value=下次可计涨的 session_day(引爆后冷却) */ <<set $undercurrent_cool to {}>> /* key=条名, value=累计引爆次数(调试/后续引用) */ <<set $undercurrent_stats to { party_rift: 0, extremism: 0, paper_gains: 0 }>> /* 引爆事件定义:deck_id 用 Auc 前缀(A 开头=走黄/橙渲染管线), title 对应 $world_custom_options 里的题干与选项(90_world_event_custom) */ <<set $undercurrent_defs to { party_rift: { deck_id: "Auc1", title: "执政联盟停摆", intensity: 40, world_effects: { gov_trust: -4, middle_confidence: -3 } }, extremism: { deck_id: "Auc2", title: "两翼上街", intensity: 45, world_effects: { political_violence: 5, nationalism: 2, revolution: 2, middle_confidence: -2 } }, paper_gains: { deck_id: "Auc3", title: "信贷骤停", intensity: 40, world_effects: { economy: 5, inflation: 2, gov_trust: -3, middle_confidence: -4 } } }>> /* 调参区 */ <<set $undercurrent_config to { gain_base: 0.12, /* 基础涨速/天 */ gain_calm: 0.10, /* 全平静时的加成上限 */ crisis_stop: 55, /* 世界最险值≥此 → 停涨 */ crisis_drain: 70, /* 世界最险值≥此 → 回落 */ drain_rate: 0.5, /* 回落速率/天 */ burst_line: 100, /* 引爆线 */ cool_gap: 45 /* 引爆后冷却天数 */ }>> <</silently>>\ <</widget>> /* ---------- undercurrent-worst:算世界最险值(内部辅助) ---------- */ <<widget "undercurrent-worst">>\ <<silently>> /* 最险值 = 各压力变量与"信任/中产的余数、赤字"取最大。 信任/中产是越高越好的变量,用 100-x 折算成风险口径。 */ <<set _ucw_1 to Math.max($world.economy, $world.inflation, $world.social_anger, $world.political_violence)>> <<set _ucw_2 to Math.max($world.nationalism, $world.army_influence, $world.revolution, $world.fiscal ?? 30)>> <<set _ucw_3 to Math.max(100 - $world.gov_trust, 100 - ($world.middle_confidence ?? 32))>> <<set _uc_worst to Math.max(_ucw_1, _ucw_2, _ucw_3)>> <</silently>>\ <</widget>> /* ---------- undercurrent-day:每日演化 + 引爆检查(一次做完) ---------- 用法:<<undercurrent-day>>(日常)或 <<undercurrent-day 60>>(快进累计) 快进时先按天数累计演化,再检查一次引爆(只爆最先满的一条/天) */ <<widget "undercurrent-day">>\ <<silently>> <<if not $undercurrent>><<undercurrent-init>><</if>> <<set _ucd_days to ($args[0] ? $args[0] : 1)>> <<set _ucd_cfg to $undercurrent_config>> <<undercurrent-worst>> <<set _ucd_keys to ["party_rift", "extremism", "paper_gains"]>> /* === 1. 逐条演化 === */ <<for _ucd_i to 0; _ucd_i lt _ucd_keys.length; _ucd_i++>> <<set _ucd_k to _ucd_keys[_ucd_i]>> <<set _ucd_cool_until to ($undercurrent_cool[_ucd_k] ? $undercurrent_cool[_ucd_k] : -999)>> <<if $session_day lt _ucd_cool_until>> /* 引爆冷却中:不涨不泄 */ <<elseif _uc_worst gte _ucd_cfg.crisis_drain>> /* 危机高压:现实把暗账冲淡 */ <<set $undercurrent[_ucd_k] to Math.max(0, $undercurrent[_ucd_k] - _ucd_cfg.drain_rate * _ucd_days)>> <<elseif _uc_worst gte _ucd_cfg.crisis_stop>> /* 中危:冻结 */ <<else>> /* 平静积攒 */ <<set _ucd_gain to (_ucd_cfg.gain_base + _ucd_cfg.gain_calm * (1 - _uc_worst / _ucd_cfg.crisis_stop)) * _ucd_days>> <<set $undercurrent[_ucd_k] to Math.min(_ucd_cfg.burst_line, $undercurrent[_ucd_k] + _ucd_gain)>> <</if>> <</for>> /* === 2. 引爆检查:满线的条各爆一件(快进时最多 2 件/轮,防雪崩) === */ <<set _ucd_burst_n to 0>> <<for _ucd_i to 0; _ucd_i lt _ucd_keys.length; _ucd_i++>> <<set _ucd_k to _ucd_keys[_ucd_i]>> <<if $undercurrent[_ucd_k] gte _ucd_cfg.burst_line and (_ucd_days eq 1 or _ucd_burst_n lt 2)>> <<set $undercurrent[_ucd_k] to 0>> <<set $undercurrent_cool[_ucd_k] to $session_day + _ucd_cfg.cool_gap>> <<set $undercurrent_stats[_ucd_k] to ($undercurrent_stats[_ucd_k] ?? 0) + 1>> <<set _ucd_def to $undercurrent_defs[_ucd_k]>> <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _ucd_def.deck_id, source: "undercurrent", lifecycle: "instant", irreversible: 2, intensity: _ucd_def.intensity, related_tag: "暗账清算", tag: "暗账清算", title: _ucd_def.title, description: "一笔没人认领的旧账,今天到期了。", template: "decision", born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> /* 落地即伤:与母体事件同规矩(world_effects 发牌时生效) */ <<world-apply-effects _ucd_def.world_effects>> <<if not $last_event_roll>><<set $last_event_roll to []>><</if>> <<set $last_event_roll.push("🌑 暗账引爆:" + _ucd_def.title + "(积怨满线总清算)")>> <<set _ucd_burst_n to _ucd_burst_n + 1>> <</if>> <</for>> <</silently>>\ <</widget>>
/* ============================================================ 历史遗产系统(V0.4-D 第二~三、七、八章) 遗产是事件结束后从"活跃"转入"沉睡"的社会痕迹。 单向转化链:事件 -> 标签 -> 遗产 ->(共振)-> 惯性 遗产不删除,只会:沉睡 / 转化 / 苏醒。 ============================================================ */ /* ---------- legacy-create:事件结束时生成遗产 ---------- 用法:<<legacy-create "ev_001" {经济压力:15,工人愤怒:10} "spd" "trauma" "工人阶级的期待落空">> 参数:来源事件id base_tags字典 解释权 衰减类型 叙事文本 生成的遗产9字段见 V0.4-D 2.2。 */ <<widget "legacy-create">>\ <<silently>> <<set $legacy_counter to $legacy_counter + 1>> <<set _id to "LG_" + $date.year + "_" + $legacy_counter>> <<set _base to $args[1] ? $args[1] : {}>> <<set _intensity to 0>> <<for _k range Object.keys(_base)>> <<set _intensity to _intensity + _base[_k]>> <</for>> /* 叙事文本:优先用调用方传入的;否则按衰减类型从文本库取冷峻定调句 */ <<set _narr to $args[4] ? $args[4] : "">> <<if _narr eq "">> <<set _dtype to $args[3] ? $args[3] : "default">> <<set _narr to $txt.legacy[_dtype] ? $txt.legacy[_dtype] : $txt.legacy.default>> <</if>> <<set $legacy_pool.push({ legacy_id: _id, source_event_id: $args[0], birth_date: { year: $date.year, month: $date.month, day: $date.day }, base_tags: _base, current_intensity: _intensity, decay_type: $args[3] ? $args[3] : "trauma", interpretation_owner: $args[2] ? $args[2] : "weimar", narrative_text: _narr, inheritance_chain: [], status: "active", /* 运行时辅助字段 */ trigger_count: 0, /* 习惯型固化判定用 */ awakened_months_left: 0, /* 苏醒后剩余活跃月数 */ original_intensity: _intensity /* 苏醒恢复基准 */ })>> <</silently>>\ <</widget>> /* ---------- legacy-decay:每月衰减 ---------- 按四种衰减类型分别套公式(V0.4-D 3.2 冻结骨架): - 创伤型:I(t)=I₀×(0.92^t)+max(I₀×0.1,5),永不归零,相似环境反弹 - 习惯型:前6月0.85^t,之后触发≥3则固化,否则继续0.95^(t-6) - 沉淀型:线性转移给结构标签,自身递减 - 幽灵型:立即降至15%,之后每月×0.98 环境修正(3.3):相似活跃标签多时衰减变慢。 */ <<widget "legacy-decay">>\ <<silently>> <<for _i to 0; _i lt $legacy_pool.length; _i++>> <<set _lg to $legacy_pool[_i]>> <<if _lg.status eq "sedimented">> <<continue>> <</if>> /* 计算经过月数 */ <<set _t to Math.round(($date.year - _lg.birth_date.year) * 12 + ($date.month - _lg.birth_date.month))>> <<if _t lte 0>><<set _t to 1>><</if>> /* 环境修正:相似活跃标签强度总和 */ <<set _env to 0>> <<for _j to 0; _j lt $active_tags.length; _j++>> <<set _at to $active_tags[_j]>> <<for _bt range Object.keys(_lg.base_tags)>> <<if _at.name eq _bt or _at.category eq _bt>> <<set _env to _env + _at.intensity>> <</if>> <</for>> <</for>> <<set _env_mult to 1 + _env * 0.01>> /* 按衰减类型分别计算 */ <<if _lg.decay_type eq "trauma">> /* 创伤型:指数衰减 + 渐近线,永不归零 */ <<set _min to Math.max(_lg.original_intensity * 0.1, 5)>> <<set _lg.current_intensity to _lg.original_intensity * Math.pow(0.92, _t) + _min>> /* 相似环境反弹 30-50% */ <<if _env gte 30>> <<set _lg.current_intensity to Math.max(_lg.current_intensity, _lg.original_intensity * 0.4)>> <</if>> <<elseif _lg.decay_type eq "habit">> /* 习惯型:前6月快速衰减,之后看触发次数 */ <<if _t lte 6>> <<set _lg.current_intensity to _lg.original_intensity * Math.pow(0.85, _t)>> <<else>> <<if _lg.trigger_count gte 3>> /* 已固化,不再衰减 */ <<set _lg.current_intensity to _lg.original_intensity * Math.pow(0.85, 6)>> <<else>> <<set _lg.current_intensity to _lg.original_intensity * Math.pow(0.85, 6) * Math.pow(0.95, _t - 6)>> <</if>> <</if>> <<elseif _lg.decay_type eq "sediment">> /* 沉淀型:线性转移给结构标签,自身递减 */ <<set _T to 24>> <<set _ratio to Math.max(0, 1 - _t / _T)>> <<set _transferred to (_lg.original_intensity - _lg.original_intensity * _ratio) * 0.7>> <<set _lg.current_intensity to _lg.original_intensity * _ratio>> /* 转移量加到对应类别的结构标签 */ <<if _transferred gt 0>> <<for _bt range Object.keys(_lg.base_tags)>> <<tag-add _bt "struct" Math.round(_transferred / Object.keys(_lg.base_tags).length) _bt _lg.interpretation_owner "sediment">> <</for>> <</if>> <<if _lg.current_intensity lte 1>> <<set _lg.status to "sedimented">> <</if>> <<elseif _lg.decay_type eq "ghost">> /* 幽灵型:立即降至15%,之后极缓慢衰减 */ <<set _lg.current_intensity to _lg.original_intensity * 0.15 * Math.pow(0.98, _t)>> <<if _lg.current_intensity lt 0.5>> <<set _lg.current_intensity to 0.5>> <</if>> <</if>> /* 沉睡判定:强度低于阈值(5)且非创伤型 */ <<if _lg.status eq "active" and _lg.current_intensity lt 5 and _lg.decay_type neq "trauma">> <<set _lg.status to "dormant">> <</if>> /* 苏醒后活跃期倒计时 */ <<if _lg.status eq "awakened">> <<set _lg.awakened_months_left to _lg.awakened_months_left - 1>> <<if _lg.awakened_months_left lte 0>> <<set _lg.status to "dormant">> <</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- legacy-awaken:幽灵型遗产苏醒检测 ---------- 沉睡的幽灵型遗产,若当前活跃标签与 base_tags 相似度>70%, 则苏醒:强度恢复至原初始50%,status=awakened,持续3个月。 相似度 = Σmin(活跃,遗产)/Σmax(活跃,遗产) ×100%。 (V0.4-D 7.3) */ <<widget "legacy-awaken">>\ <<silently>> <<set $last_awaken to []>> <<for _i to 0; _i lt $legacy_pool.length; _i++>> <<set _lg to $legacy_pool[_i]>> <<if _lg.status eq "dormant" and _lg.decay_type eq "ghost">> <<set _sim to 0>> <<set _sum_min to 0>> <<set _sum_max to 0>> <<for _bt range Object.keys(_lg.base_tags)>> <<set _active_val to 0>> <<for _j to 0; _j lt $active_tags.length; _j++>> <<if $active_tags[_j].name eq _bt or $active_tags[_j].category eq _bt>> <<set _active_val to $active_tags[_j].intensity>> <</if>> <</for>> <<set _legacy_val to _lg.base_tags[_bt]>> <<set _sum_min to _sum_min + Math.min(_active_val, _legacy_val)>> <<set _sum_max to _sum_max + Math.max(_active_val, _legacy_val)>> <</for>> <<if _sum_max gt 0>> <<set _sim to _sum_min / _sum_max>> <</if>> <<if _sim gt 0.7>> <<set _lg.status to "awakened">> <<set _lg.current_intensity to _lg.original_intensity * 0.5>> <<set _lg.awakened_months_left to 3>> <<set $last_awaken.push(_lg.legacy_id + " 苏醒!相似度" + Math.round(_sim*100) + "%")>> <</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- legacy-list:调试用,打印遗产池 ---------- */ <<widget "legacy-list">>\ <<if $legacy_pool.length eq 0>>\ //(遗产池为空)//\ <<else>>\ //(ID|类型|强度|状态|解释权|衰减类型|来源)// <<for _i to 0; _i lt $legacy_pool.length; _i++>><<set _lg to $legacy_pool[_i]>>· _lg.legacy_id|_lg.narrative_text|<<print Math.round(_lg.current_intensity)>>|_lg.status|_lg.interpretation_owner|_lg.decay_type|_lg.source_event_id<br> <</for>>\ <</if>>\ <</widget>>
/* ============================================================ 历史惯性系统(V0.3-B + V0.4-D 第四~五章) 惯性是遗产在特定条件下"发酵"产生的结构性社会力量, 改变国家长期方向。不可删除,只能改变方向。 ============================================================ */ /* ---------- inertia-check:共振检测,生成惯性 ---------- 按转化四条件检测(V0.4-D 4.2 冻结): 1. 数量:≥3个遗产共享同一类 base_tags 2. 解释一致性:interpretation_owner 相同或同阵营 3. 时间窗口:产生时间跨度 ≤ 5年 4. 强度阈值:共振强度总和 ≥ 50 满足后生成惯性,等级按强度分级: 50-80->一/二级 / 80-120->三级 / 120-180->四级 / 180+->五级 相关遗产标记"已沉淀"。 */ <<widget "inertia-check">>\ <<silently>> <<set $last_inertia_check to []>> <<set _active_legacies to []>> <<for _i to 0; _i lt $legacy_pool.length; _i++>> <<if $legacy_pool[_i].status eq "active" or $legacy_pool[_i].status eq "awakened">> <<set _active_legacies.push($legacy_pool[_i])>> <</if>> <</for>> /* 按 base_tags 的标签家族分组 */ <<set _groups to {}>> <<for _i to 0; _i lt _active_legacies.length; _i++>> <<set _lg to _active_legacies[_i]>> <<for _bt range Object.keys(_lg.base_tags)>> <<if not _groups.hasOwnProperty(_bt)>> <<set _groups[_bt] to []>> <</if>> <<set _groups[_bt].push(_lg)>> <</for>> <</for>> /* 逐组检测四条件 */ <<for _tagkey range Object.keys(_groups)>> <<set _group to _groups[_tagkey]>> <<if _group.length gte 3>> /* 时间窗口:最早与最晚跨度 ≤ 5年 */ <<set _min_year to 9999>> <<set _max_year to 0>> <<for _k to 0; _k lt _group.length; _k++>> <<set _y to _group[_k].birth_date.year>> <<if _y lt _min_year>><<set _min_year to _y>><</if>> <<if _y gt _max_year>><<set _max_year to _y>><</if>> <</for>> <<if (_max_year - _min_year) lte 5>> /* 强度总和 */ <<set _sum_int to 0>> <<for _k to 0; _k lt _group.length; _k++>> <<set _sum_int to _sum_int + _group[_k].current_intensity>> <</for>> <<if _sum_int gte 50>> /* 解释一致性:检查 owner 是否同阵营 */ <<set _owners to []>> <<for _k to 0; _k lt _group.length; _k++>> <<set _owners.push(_group[_k].interpretation_owner)>> <</for>> <<set _consistent to true>> <<for _k to 0; _k lt _owners.length; _k++>> <<if _owners[_k] neq _owners[0]>> /* 检查阵营兼容(简化:spd/kpd 同左翼,dnvp/nsdap 同右翼) */ <<set _left to ["spd","kpd"]>> <<set _right to ["dnvp","nsdap"]>> <<set _center to ["weimar","ddp","dvp","zentrum"]>> <<set _same_camp to false>> <<if _left.includes(_owners[_k]) and _left.includes(_owners[0])>><<set _same_camp to true>><</if>> <<if _right.includes(_owners[_k]) and _right.includes(_owners[0])>><<set _same_camp to true>><</if>> <<if _center.includes(_owners[_k]) and _center.includes(_owners[0])>><<set _same_camp to true>><</if>> <<if not _same_camp>> <<set _consistent to false>> <</if>> <</if>> <</for>> <<if _consistent>> /* 生成惯性 */ <<set $inertia_counter to $inertia_counter + 1>> <<set _level to 1>> <<if _sum_int gte 180>><<set _level to 5>> <<elseif _sum_int gte 120>><<set _level to 4>> <<elseif _sum_int gte 80>><<set _level to 3>> <<elseif _sum_int gte 65>><<set _level to 2>> <</if>> <<set _source_events to []>> <<for _k to 0; _k lt _group.length; _k++>> <<set _source_events.push(_group[_k].source_event_id)>> <</for>> <<set $inertia_matrix.push({ inertia_id: "IN_" + $inertia_counter, source_events: _source_events, level: _level, source_event: _tagkey, emotional_memory: _owners[0], affect_target: "nation", decay_speed: 0.99, transform_condition: "", intensity: _sum_int, direction: _owners[0], born_date: { year: $date.year, month: $date.month, day: $date.day } })>> /* 相关遗产标记已沉淀 */ <<for _k to 0; _k lt _group.length; _k++>> <<for _m to 0; _m lt $legacy_pool.length; _m++>> <<if $legacy_pool[_m].legacy_id eq _group[_k].legacy_id>> <<set $legacy_pool[_m].status to "sedimented">> <</if>> <</for>> <</for>> <<set $last_inertia_check.push("共振!【" + _tagkey + "】强度" + Math.round(_sum_int) + " -> " + _level + "级惯性," + _group.length + "个遗产已沉淀")>> /* 触发魏玛人格震荡(V0.4-D 第六章接口) */ <<weimar-shock _sum_int "conflict" "neutral">> <</if>> <</if>> <</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- inertia-inherit:政权更替继承 ---------- 用法:<<inertia-inherit "nsdap" 0.1>> 参数:新政权id 新政权主动叙事匹配度(0-1) 按继承率公式(V0.4-D 5.1 冻结): 继承率 = 国家连续性×0.30 + 意识形态兼容度×0.25 + 制度继承程度×0.20 + 社会记忆强度×0.15 + 新政权叙事匹配度×0.10 结果分级(5.2): ≥0.80 完全继承 / 0.50-0.79 分裂继承 / <0.50 幽灵化 */ <<widget "inertia-inherit">>\ <<silently>> <<set _new_regime to $args[0]>> <<set _narrative_match to Number($args[1] ? $args[1] : 0.5)>> /* 简化:各因子占位取值,实际应由政权更替事件提供 */ <<set _continuity to 0.5>> /* 国家连续性 */ <<set _ideo_compat to 0.3>> /* 意识形态兼容度 */ <<set _inst_inherit to 0.4>> /* 制度继承程度 */ /* 社会记忆强度:相关遗产 current_intensity 加权平均 */ <<set _mem_sum to 0>> <<set _mem_n to 0>> <<for _i to 0; _i lt $legacy_pool.length; _i++>> <<set _mem_sum to _mem_sum + $legacy_pool[_i].current_intensity>> <<set _mem_n to _mem_n + 1>> <</for>> <<set _mem_strength to _mem_n gt 0 ? Math.min(1, _mem_sum / _mem_n / 50) : 0>> <<set _inherit_rate to _continuity * 0.30 + _ideo_compat * 0.25 + _inst_inherit * 0.20 + _mem_strength * 0.15 + _narrative_match * 0.10>> <<set $last_inheritance to "继承率 " + Math.round(_inherit_rate * 100) + "%">> <<for _i to 0; _i lt $inertia_matrix.length; _i++>> <<set _in to $inertia_matrix[_i]>> <<if _inherit_rate gte 0.80>> /* 完全继承:改变解释权 */ <<set _in.direction to _new_regime>> <<set _in.emotional_memory to _new_regime>> <<elseif _inherit_rate gte 0.50>> /* 分裂继承:强度×继承率 */ <<set _in.intensity to _in.intensity * _inherit_rate>> <<else>> /* 幽灵化:强度降至15%,标记待苏醒 */ <<set _in.intensity to _in.intensity * 0.15>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- inertia-list:调试用,打印惯性矩阵 ---------- */ <<widget "inertia-list">>\ <<if $inertia_matrix.length eq 0>>\ //(惯性矩阵为空)//\ <<else>>\ //(ID|等级|强度|方向|来源标签|解释权|诞生日期)// <<for _i to 0; _i lt $inertia_matrix.length; _i++>><<set _in to $inertia_matrix[_i]>>· _in.inertia_id|_in.level|<<print Math.round(_in.intensity)>>|_in.direction|_in.source_event|_in.emotional_memory|_in.born_date.year年_in.born_date.month月<br> <</for>>\ <</if>>\ <</widget>>
/* ============================================================ 魏玛人格三层 + 震荡公式(V0.3-B 第七~十二章 + V0.4-D 第六章) 核心人格(几乎不变)/ 中层人格(长期可变)/ 表层状态(短期) 人格改变必须经过重大历史震荡。 ============================================================ */ /* ---------- weimar-crisis-coef:共和国危机系数 ---------- 用法:<<weimar-crisis-coef>> 输出:_republic_crisis(0-1),由世界状态加权得出。 共和国越危,魏玛张力越易堆积、越难回落。 权重:economy/inflation/social_anger/political_violence/revolution 各0.15, nationalism/army_influence 各0.10,(100-gov_trust) 0.05。 */ <<widget "weimar-crisis-coef">>\ <<silently>> <<set _crisis to ( ($world.economy || 0) * 0.15 + ($world.inflation || 0) * 0.15 + ($world.social_anger || 0) * 0.15 + ($world.political_violence || 0) * 0.15 + ($world.revolution || 0) * 0.15 + ($world.nationalism || 0) * 0.10 + ($world.army_influence || 0) * 0.10 + (100 - ($world.gov_trust || 0)) * 0.05 ) / 100>> <<set _republic_crisis to Math.max(0, Math.min(1, _crisis))>> <</silently>>\ <</widget>> /* ---------- weimar-effective-update:刷新有效人格阈值 ---------- 用法:<<weimar-effective-update>> 有效阈值 = round(基准16 × (0.6 + stability/100 × 0.4)),稳定度100=基准16、越低越易触发。 在 daily-tick 与稳定度变化(震荡释放)后调用,写回 $weimar.effective_threshold。 */ <<widget "weimar-effective-update">>\ <<silently>> <<set $weimar.effective_threshold to Math.max(1, Math.round($weimar.shock_threshold * (0.6 + $weimar.stability / 100 * 0.4)))>> <</silently>>\ <</widget>> /* ---------- weimar-presence:在场状态四档 + 边界噪声 ---------- 用法:<<weimar-presence>> 输出:$weimar.presence(calm/tense/anxious/critical)并渲染一段"烟"(环境文本)。 边界 ±4% 内用随机抖动移档,防止玩家背分水岭;只写环境与他,不评判玩家感受。 */ <<widget "weimar-presence">>\ <<silently>> <<set _rp to ($weimar.personality_tension / $weimar.effective_threshold) * 100>> <<set _calm to 30>><<set _tense to 60>><<set _anx to 90>> <<if _rp gte 26 and _rp lt 34>><<set _calm to 26 + Math.random() * 8>> <<elseif _rp gte 56 and _rp lt 64>><<set _tense to 56 + Math.random() * 8>> <<elseif _rp gte 86 and _rp lt 94>><<set _anx to 86 + Math.random() * 8>><</if>> <<if _rp lt _calm>><<set $weimar.presence to "calm">> <<elseif _rp lt _tense>><<set $weimar.presence to "tense">> <<elseif _rp lt _anx>><<set $weimar.presence to "anxious">> <<else>><<set $weimar.presence to "critical">><</if>> <</silently>>\ <<switch $weimar.presence>>\ <<case "tense">>\ 他停下转笔的动作,抬头看了你一眼,没有笑。桌旁的咖啡已经凉了,纸边压着折痕。 <<case "anxious">>\ 窗帘拉着,他背对着门。桌角那盏台灯是屋里唯一的光,纸上满是涂改的痕迹。 <<case "critical">>\ 台灯闪了一下,又暗下去。屋里比外面更静,纸上散落着没写完的东西。他没有抬头——但你知道他听见你进来了。 <<default>>\ 灯是亮的。他从文件里抬起头,叫了你的全名。桌上的墨水瓶摆得整整齐齐。 <</switch>>\ <</widget>> /* ---------- weimar-mood-refresh:刷新魏玛情绪档位(当场变) ---------- 用法:<<weimar-mood-refresh>> 输出:$weimar.surface.mood(情绪文本档位) 情绪由「即时焦虑/张力」+「长线情绪基线 mood_base(国家状态)」+「信任」共同决定: - mood_base:长线,国家好→正、国家差→负,每天向目标漂移(见 weimar-mood-drift)。 - 有效焦虑 _mood_adj = anxiety - mood_base(国家好时代为抵消部分焦虑)。 档位(扩展后,从正面到负面): 笃定 / 平静 / 安稳 / 紧绷 / 不安 / 焦虑 / 麻木 */ <<widget "weimar-mood-refresh">>\ <<silently>> <<if not $weimar.surface.mood_base>><<set $weimar.surface.mood_base to 0>><</if>> <<set _mb to $weimar.surface.mood_base>> <<set _madj to $weimar.surface.anxiety - _mb>> <<set _madj_p to $weimar.personality_tension>> <<set _madj to Math.round(_madj)>> <<if _madj gte 70>> <<set $weimar.surface.mood to "麻木">> <<elseif _madj gte 50>> <<set $weimar.surface.mood to "焦虑">> <<elseif _madj gte 30>> <<set $weimar.surface.mood to "不安">> <<elseif _madj_p gte 5 or _madj gte 10>> <<set $weimar.surface.mood to "紧绷">> <<elseif _mb gte 20>> <<set $weimar.surface.mood to "从容">> <<elseif _mb gte 5>> <<set $weimar.surface.mood to "安稳">> <<else>> <<set $weimar.surface.mood to "平静">> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-mood-drift:国家状态 → 情绪基线每日漂移(长线) ---------- 用法:<<weimar-mood-drift>>(在 daily-tick 每日调用) 根据国家健康,把 mood_base 每天向目标值挪一点(趋近)。 国家健康由危机系数反推:危机越高,情绪目标越偏负面。 目标:_target = round((0.5 - crisis) * 80) → 危机0.5时0,危机0→+40,危机1→-40 */ <<widget "weimar-mood-drift">>\ <<silently>> <<weimar-crisis-coef>> <<if not $weimar.surface.mood_base>><<set $weimar.surface.mood_base to 0>><</if>> <<set _mb_target to Math.round((0.5 - _republic_crisis) * 80)>> <<set _mb_cur to $weimar.surface.mood_base>> <<if _mb_cur lt _mb_target>> <<set $weimar.surface.mood_base to Math.min(_mb_target, _mb_cur + 4)>> <<elseif _mb_cur gt _mb_target>> <<set $weimar.surface.mood_base to Math.max(_mb_target, _mb_cur - 4)>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-chat-bond:聊天信任累积(每日封顶 + 跨天累进) ---------- 用法:<<weimar-chat-bond>>(每轮对话后调用一次) 多聊提升信任: - $chat_bond:长期亲密度,每次对话 +1,跨天保留。 - 每攒满 $chat_bond_step(默认5)点 → 信任 +1,并扣减 bond。 - $chat_bond_today:当日已通过聊天获得的信任,受 $chat_bond_cap(默认5)封顶,防刷。 - 每日由 daily-tick 清零 $chat_bond_today,bond 本身保留(隔天继续累进)。 输出:$weimar_chat_bond_gain(本次是否触发信任提升,供回复页提示)。 */ <<widget "weimar-chat-bond">>\ <<silently>> <<set _bond_step to 5>> <<set _bond_cap to 5>> <<if not $chat_bond>><<set $chat_bond to 0>><</if>> <<if not $chat_bond_today>><<set $chat_bond_today to 0>><</if>> <<set $weimar_chat_bond_gain to false>> <<set $chat_bond to $chat_bond + 1>> <<for _bi to 0; _bi lt _bond_cap; _bi++>> <<if $chat_bond gte _bond_step and $chat_bond_today lt _bond_cap>> <<set $chat_bond to $chat_bond - _bond_step>> <<set $chat_bond_today to $chat_bond_today + 1>> <<set $npcs.weimar.trust to Math.min(100, (Number($npcs.weimar.trust) || 0) + 1)>> <<set $weimar_chat_bond_gain to true>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- weimar-relation-state:自我认同 × 信任 → 关系状态 ---------- 用法:<<weimar-relation-state>> 输出:_relation(信赖 / 怀疑 / 依赖 / 疏远) 双轴机制: - 高认同(self_identity≥50) + 高信任(trust≥50) → 信赖(坚定且信任你) - 高认同 + 低信任 → 怀疑(审视你,不安) - 低认同 + 高信任 → 依赖(没主见,等你拿主意) - 低认同 + 低信任 → 疏远(戒备、把自己关起来) */ <<widget "weimar-relation-state">>\ <<silently>> <<if not $weimar.self_identity>><<set $weimar.self_identity to 80>><</if>> <<set _hi_id to ($weimar.self_identity gte 50)>> <<set _hi_tr to ($npcs.weimar.trust gte 50)>> <<if _hi_id and _hi_tr>> <<set _relation to "信赖">> <<elseif _hi_id and not _hi_tr>> <<set _relation to "怀疑">> <<elseif not _hi_id and _hi_tr>> <<set _relation to "依赖">> <<else>> <<set _relation to "疏远">> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-relation-line:关系状态 → 一句关系基调(回复页显示) ---------- 用法:<<weimar-relation-line>> 输出:$weimar_relation_line(一句体现当前关系状态的描写,暗示玩家此刻魏玛对你的态度) */ <<widget "weimar-relation-line">>\ <<silently>> <<weimar-relation-state>> <<if _relation is "信赖">><<set $weimar_relation_line to "他看你的眼神,没有了试探。他信你,也知道自己是谁。">> <<elseif _relation is "怀疑">><<set $weimar_relation_line to "他信你几分,却不敢全信。他看你的目光,像在核对一张来历不明的证件。">> <<elseif _relation is "依赖">><<set $weimar_relation_line to "他不再笃定自己是谁,却把每个决定都递到你手边。他目光里的顺从,让你有些不安。">> <<else>><<set $weimar_relation_line to "他把自己关在门里。你敲了很久他才应声——那声音里,没有迎你进去的意思。">> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-appraise:魏玛评价玩家治理(镜子/出口) ---------- 用法:<<weimar-appraise>> 输出:_gov_score(0-100 治理评分)、$weimar_appraise_line(魏玛评价文本) 评分 = 国家健康(0.7) + 政党信任均值(0.3)。 分档:褒扬(≥75) / 认可(55-74) / 中性(40-54) / 失望(25-39) / 质问(<25)。 供两种用途:玩家主动问「我做得怎么样」;国家恶化时魏玛开场主动质问。 */ <<widget "weimar-appraise">>\ <<silently>> <<set _gscore to ( (100 - ($world.economy || 0)) * 0.15 + (100 - ($world.inflation || 0)) * 0.15 + ($world.gov_trust || 0) * 0.20 + (100 - ($world.social_anger || 0)) * 0.15 + (100 - ($world.political_violence || 0)) * 0.15 + (100 - ($world.revolution || 0)) * 0.10 + (100 - ($world.nationalism || 0)) * 0.05 + (100 - ($world.army_influence || 0)) * 0.05 )>> <<set _gscore to Math.max(0, Math.min(100, Math.round(_gscore)))>> <<set _party_sum to (($npcs.spd.trust || 0) + ($npcs.kpd.trust || 0) + ($npcs.ddp.trust || 0) + ($npcs.dvp.trust || 0) + ($npcs.zentrum.trust || 0) + ($npcs.dnvp.trust || 0) + ($npcs.nsdap.trust || 0) + ($npcs.army.trust || 0))>> <<set _party_avg to _party_sum / 8>> <<set _gov_score to Math.max(0, Math.min(100, Math.round(_gscore * 0.7 + _party_avg * 0.3)))>> <<weimar-relation-state>> <<if _gov_score gte 75>> <<set $weimar_appraise_line to "「你做得比我想象中好。国家稳了一些,人心也不那么散了。我该感谢你。」他说这话时,没有移开视线。">> <<elseif _gov_score gte 55>> <<set $weimar_appraise_line to "「你做得不算差。虽有些变数,但算是端住了大局。」他点了点头,「我没夸你,也没骂你,总之我们一起努力。」">> <<elseif _gov_score gte 40>> <<set $weimar_appraise_line to "「你做得……中规中矩。」他斟酌着词,「这个国家没更好,也没更坏……你自己满意吗?」">> <<elseif _gov_score gte 25>> <<set $weimar_appraise_line to "「你做得还不够。」他没看你,「我本可以骗你说还好……但你我都清楚,这国家正在往下走。我不想陪你自欺欺人。」">> <<else>> <<set $weimar_appraise_line to "他慢慢转过身,逼视着你:「这就是你治理出来的国家?」他压着声音,指节扣在桌沿,泛白。「你答应过我什么,你还记得吗?」">> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-question-pending:检测魏玛是否有话要主动质问 ---------- 用法:<<weimar-question-pending>> 输出:_question_pending(bool)、_question_key 条件:治理评分极差(<25)且当天尚未质问过($flags 标记)。 供出门前 / 会客区两处挂质问入口,避免「每天起床被骂」的突兀。 */ <<widget "weimar-question-pending">>\ <<silently>> <<weimar-appraise>> <<set _question_key to "weimar_questioned_" + $date.year + "_" + $date.month + "_" + $date.day>> <<set _question_pending to false>> <<if _gov_score lt 25 and not $flags[_question_key]>> <<set _question_pending to true>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-memory-record:写入一条魏玛记忆 ---------- 用法:<<weimar-memory-record 主题 文本>> 若同主题已存在则更新其文本与日期,否则新增。上限 20 条。 */ <<widget "weimar-memory-record">>\ <<silently>> <<set _mr_theme to $args[0]>> <<set _mr_text to $args[1]>> <<if not $weimar_memory>><<set $weimar_memory to []>><</if>> <<set _mr_found to false>> <<for _i to 0; _i lt $weimar_memory.length; _i++>> <<if $weimar_memory[_i].theme eq _mr_theme>> <<set $weimar_memory[_i].text to _mr_text>> <<set $weimar_memory[_i].day to $session_day>> <<set _mr_found to true>> <</if>> <</for>> <<if not _mr_found>> <<set $weimar_memory.push({theme:_mr_theme, text:_mr_text, source:"dialogue", day:$session_day})>> <<if $weimar_memory.length gt 20>> <<set $weimar_memory.remove(0)>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-memory-recall:魏玛引用一段记忆 ---------- 用法:<<weimar-memory-recall>> 若已有记忆,约 25% 概率亮出最近一条;否则 `$weimar_memory_line` 为空。 供对话开场 callout 用。 */ <<widget "weimar-memory-recall">>\ <<silently>> <<set $weimar_memory_line to "">> <<if $weimar_memory and $weimar_memory.length gt 0 and random(1, 100) lte 25>> <<set $weimar_memory_line to $weimar_memory[$weimar_memory.length - 1].text>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-coldwar-shift:调整冷战等级 ---------- 用法:<<weimar-coldwar-shift delta>> delta>0 升温(激烈互动越多越冷),delta<0 降温(安抚/和解)。 等级钳制 0-3。 */ <<widget "weimar-coldwar-shift">>\ <<silently>> <<set _cw_d to Number($args[0]) || 0>> <<if not $weimar_cold_war>><<set $weimar_cold_war to 0>><</if>> <<set $weimar_cold_war to Math.max(0, Math.min(3, $weimar_cold_war + _cw_d))>> <</silently>>\ <</widget>> /* ---------- weimar-tension-gain:日常张力累积(乘共和国危机系数) ---------- 用法:<<weimar-tension-gain 2>> 日常小摩擦(对话/区域/事件)专用:只堆张力、不触发震荡。 共和国越危,堆积越剧烈:× (1 + 危机度×2)。 重要:重大事件(惯性共振)用 weimar-shock,不走此函数。 */ <<widget "weimar-tension-gain">>\ <<silently>> <<weimar-crisis-coef>> <<set _gain to Number($args[0] ? $args[0] : 1)>> <<set $weimar.personality_tension to $weimar.personality_tension + _gain * 0.7 * (1 + _republic_crisis * 1.5)>> <</silently>>\ <</widget>> /* ---------- weimar-night-convert-check:共和国数值显著恶化→夜谈变现检测 ---------- 用法:<<weimar-night-convert-check>> 在 daily-tick 每日调用。检查 monitored 数值(通胀/社会愤怒/政治暴力/革命压力) 是否比历史峰值再高"门槛"(默认10点),即显著恶化。若是,则记录待变现数值并标记 $weimar_night_talk=true,待玩家休息时触发夜谈变现。 防连续触发:converted=true 表示该数值"已变现,进入冷却"。 只有该数值之后先跌破"释放线"(峰值的70%),再重新涨过"峰值+门槛",才重置冷却并允许再次触发。 —— 即"开局缓慢上涨不触发;只有显著恶化才变现;曾回落再恶化才再次变现"。 */ <<widget "weimar-night-convert-check">>\ <<silently>> <<set _monitor to ["inflation", "social_anger", "political_violence", "revolution"]>> <<set _gain_threshold to 10>> /* 显著恶化门槛:比历史峰值高出的点数 */ <<for _mi to 0; _mi lt _monitor.length; _mi++>> <<set _mk to _monitor[_mi]>> <<set _cur to Number($world[_mk] ?? 0)>> <<set _pk to Number($world_peak[_mk] ?? 0)>> <<if $world_converted[_mk]>> /* 冷却中:若数值已跌破释放线(峰值70%),重置冷却,允许未来再涨破峰值+门槛时重新变现 */ <<if _cur lte _pk * 0.7>> <<set $world_converted[_mk] to false>> <</if>> <<else>> /* 非冷却:仅当显著恶化(比峰值高出门槛)才触发变现 */ <<if _cur gte _pk + _gain_threshold and $weimar_pending_convert eq "">> <<set $world_peak[_mk] to _cur>> <<set $world_converted[_mk] to true>> <<set $weimar_pending_convert to _mk>> <<set $weimar_night_talk to true>> <</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- weimar-night-convert:夜谈变现(把破新高数值转为张力) ---------- 用法:<<weimar-night-convert 数值key>> 在夜谈变现场景中调用。张力 +3 上限(防爆)。 变现后该数值进入冷却(converted 保持 true,需先回落再涨破才再次触发)。 */ <<widget "weimar-night-convert">>\ <<silently>> <<set _ck to $args[0]>> <<if _ck eq "party_spd" or _ck eq "party_ddp" or _ck eq "party_dvp" or _ck eq "party_zentrum">> <<set _tension_delta to 0>> /* 温和盟约(SPD/DDP/DVP/Zentrum):正面,不加剧创伤 */ <<else>> <<set _tension_delta to Math.round(3 * 0.7)>> /* 数值恶化 / 背叛投靠(DNVP/KPD/NSDAP/army):加剧创伤(×0.7 事件强度缩放) */ <</if>> <<set $weimar.personality_tension to Math.min($weimar.effective_threshold + 5, $weimar.personality_tension + _tension_delta)>> <<set $weimar_night_talk to false>> <<set $weimar_pending_convert to "">> <<set $last_convert to _ck>> <</silently>>\ <</widget>> /* ---------- weimar-night-gate:魏玛夜谈频率限制 + 强制冷却 ---------- 用法:<<weimar-night-gate>>(在夜谈叩门渲染前调用) 输出:_night_allowed(bool,今晚是否真的让魏玛来) 规则: 1. 频率限制:近 7 天内已来 2 次,则今晚抑制(不来)。 2. 强制冷却:若处于强制冷却期($weimar_night_forced_until > 今天),则不来。 3. 若今晚允许且魏玛确实来,记录 history;连续来 ≥2 天则设强制冷却 7 天。 注意:不改 $weimar_night_talk 本身,仅决定显示与否,避免污染其他触发判断。 */ <<widget "weimar-night-gate">>\ <<silently>> <<if not $weimar_night_history>><<set $weimar_night_history to []>><</if>> <<if not $weimar_night_forced_until>><<set $weimar_night_forced_until to 0>><</if>> <<set _today to $session_day>> <<set _night_allowed to true>> /* 2. 强制冷却优先:冷却期未结束则今晚不来 */ <<if $weimar_night_forced_until gt _today>> <<set _night_allowed to false>> <</if>> /* 1. 频率限制:近 7 天已来 2 次则今晚不来(随机哪天,不连着) */ <<if _night_allowed>> <<set _recent_count to 0>> <<for _i to 0; _i lt $weimar_night_history.length; _i++>> <<if _today - $weimar_night_history[_i] lte 7>> <<set _recent_count to _recent_count + 1>> <</if>> <</for>> <<if _recent_count gte 2>> <<set _night_allowed to false>> <</if>> <</if>> /* 3. 今晚允许且魏玛确实来:记录 + 检测连续触发 */ <<if _night_allowed and $weimar_night_talk>> <<set $weimar_night_history.push(_today)>> <<if $weimar_night_history.length gt 20>> <<set $weimar_night_history.remove(0)>> <</if>> <<set _streak to 1>> <<for _i to $weimar_night_history.length - 2; _i gte 0; _i-->> <<if $weimar_night_history[_i] eq _today - 1>> <<set _streak to _streak + 1>> <<elseif $weimar_night_history[_i] lte _today - 2>> <<break>> <</if>> <</for>> <<if _streak gte 2>> /* 连续来两三天了,之后强制冷却一周 */ <<set $weimar_night_forced_until to _today + 7>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-shock:人格震荡幅度计算与累积 ---------- 用法:<<weimar-shock 强度 冲突类型 玩家行为类型>> 参数: 强度:新惯性强度 冲突类型:"resonance"(共鸣0.3) / "conflict"(冲突1.5) / "orthogonal"(正交1.0) 玩家行为类型:"aligned"(符合0.5) / "violated"(违背2.0) / "neutral"(中立1.0) 公式(V0.4-D 6.3 冻结): 震荡幅度 = ln(强度+1) × 冲突系数 × 玩家权重 ÷ 人格稳定度 累积到 personality_tension,达有效阈值(effective_threshold)触发震荡(基准16,随稳定度浮动)。 */ <<widget "weimar-shock">>\ <<silently>> <<set _intensity to Number($args[0] ? $args[0] : 50)>> <<set _conflict_type to $args[1] ? $args[1] : "orthogonal">> <<set _player_type to $args[2] ? $args[2] : "neutral">> <<set _conflict_coef to 1.0>> <<if _conflict_type eq "resonance">><<set _conflict_coef to 0.3>> <<elseif _conflict_type eq "conflict">><<set _conflict_coef to 1.5>> <</if>> <<set _player_weight to 1.0>> <<if _player_type eq "aligned">><<set _player_weight to 0.5>> <<elseif _player_type eq "violated">><<set _player_weight to 2.0>> <</if>> <<set _shock to Math.log(_intensity + 1) * _conflict_coef * _player_weight / $weimar.stability>> <<set $weimar.personality_tension to $weimar.personality_tension + _shock>> <<set $last_shock to "震荡幅度 " + _shock.toFixed(2) + ",累积张力 " + $weimar.personality_tension.toFixed(2) + "/" + $weimar.effective_threshold>> /* 达阈值触发震荡 */ <<if $weimar.personality_tension gte $weimar.effective_threshold>> <<weimar-tension-release>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-tension-release:张力释放,触发人格震荡 ---------- 张力释放时,根据累积张力方向修改中层人格。 共鸣型张力(正向)-> 强化现有人格方向; 冲突型张力(负向)-> 撕裂,改变人格方向。 同时产生历史恐惧(V0.3-B 第七章)。 */ <<widget "weimar-tension-release">>\ <<silently>> <<set _released to $weimar.personality_tension>> <<set $weimar.personality_tension to 0>> /* 简化:根据近期事件判断方向。 若军队相关惯性多 -> 军队依赖↑民主信任↓; 若经济/工人相关多 -> 改革意愿↑。 */ <<set _army_weight to 0>> <<set _reform_weight to 0>> <<for _i to 0; _i lt $inertia_matrix.length; _i++>> <<set _in to $inertia_matrix[_i]>> <<if _in.source_event eq "军方不满" or _in.source_event eq "军队">> <<set _army_weight to _army_weight + _in.intensity>> <</if>> <<if _in.source_event eq "经济压力" or _in.source_event eq "工人愤怒">> <<set _reform_weight to _reform_weight + _in.intensity>> <</if>> <</for>> <<if _army_weight gt _reform_weight>> /* 威权化方向 */ <<set $weimar.mid.democracy_trust to Math.max(0, $weimar.mid.democracy_trust - Math.round(_released * 2))>> <<set $weimar.mid.army_dependence to Math.min(100, $weimar.mid.army_dependence + Math.round(_released * 2))>> /* 产生历史恐惧:威权幽灵 */ <<set $weimar.historical_anxiety["威权幽灵"] to ($weimar.historical_anxiety["威权幽灵"] ? $weimar.historical_anxiety["威权幽灵"] : 0) + Math.round(_released * 3)>> <<set $last_tension_release to "人格震荡!张力" + _released.toFixed(1) + " 释放 -> 民主信任↓" + Math.round(_released*2) + " 军队依赖↑" + Math.round(_released*2) + ",产生【威权幽灵】恐惧">> <<elseif _reform_weight gt 0>> /* 改革方向 */ <<set $weimar.mid.reform_will to Math.min(100, $weimar.mid.reform_will + Math.round(_released * 2))>> <<set $weimar.mid.democracy_trust to Math.min(100, $weimar.mid.democracy_trust + Math.round(_released))>> <<set $last_tension_release to "人格震荡!张力" + _released.toFixed(1) + " 释放 -> 改革意愿↑" + Math.round(_released*2) + " 民主信任↑" + Math.round(_released)>> <<else>> /* 无明确方向,整体焦虑 */ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + Math.round(_released * 3))>> <<set $last_tension_release to "人格震荡!张力" + _released.toFixed(1) + " 释放 -> 表层焦虑↑" + Math.round(_released*3)>> <</if>> /* 稳定度小幅下降(震荡消耗稳定度),但不低于10 */ <<set $weimar.stability to Math.max(10, $weimar.stability - 1)>> <<weimar-effective-update>> <</silently>>\ <</widget>> /* ---------- weimar-surface-update:表层状态刷新 ---------- 根据近期事件和张力,刷新 mood/fatigue/anxiety/tension。 */ <<widget "weimar-surface-update">>\ <<silently>> <<set $weimar.surface.tension to Math.round($weimar.personality_tension / $weimar.effective_threshold * 100)>> <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + $pending_events.length * 5)>> /* 情绪判定(统一走 mood-refresh,含国家长线基线) */ <<weimar-mood-refresh>> /* 疲劳缓慢恢复 */ <<set $weimar.surface.fatigue to Math.max(0, $weimar.surface.fatigue - 2)>> <</silently>>\ <</widget>> /* ---------- weimar-status:调试用,打印三层人格 ---------- */ <<widget "weimar-status">>\ ''核心人格''(几乎不可变) - 国家存续意志:$weimar.core.will_to_exist - 共和国认同:$weimar.core.republic_identity ''中层人格''(长期可变) - 民主信任度:<<bar $weimar.mid.democracy_trust 100>> - 军队依赖度:<<bar $weimar.mid.army_dependence 100>> - 国际信任度:<<bar $weimar.mid.intl_trust 100>> - 社会改革意愿:<<bar $weimar.mid.reform_will 100>> ''表层状态''(短期) - 今日情绪:$weimar.surface.mood - 疲惫感:$weimar.surface.fatigue - 焦虑度:$weimar.surface.anxiety - 今日余力:$weimar.surface.tension ''系统'' - 人格稳定度:$weimar.stability - 精神负荷:<<print Math.round($weimar.personality_tension*10)/10>> / $weimar.effective_threshold(有效阈值) <<if Object.keys($weimar.historical_anxiety).length gt 0>>\ ''历史恐惧'' <<for _k range Object.keys($weimar.historical_anxiety)>>- _k:$weimar.historical_anxiety[_k] <</for>>\ <</if>>\ <</widget>> /* ---------- weimar-stance-link:姿态链接渲染(可用 / 不合时宜) ---------- 用法:<<weimar-stance-link "姿态ID" "显示标签">> 读同一 $weimar.presence 判定可用性;不可用则变灰但仍可点(走犯错惩罚)。 姿态ID:comfort / confront / silent / probe / confrontation */ <<widget "weimar-stance-link">>\ <<silently>> <<set _st_id to $args[0]>> <<set _st_label to $args[1]>> <<set _allowed to true>> <<if $weimar.presence eq "calm">> <<if _st_id eq "comfort" or _st_id eq "confront" or _st_id eq "confrontation">><<set _allowed to false>><</if>> <<elseif $weimar.presence eq "tense">> <<if _st_id eq "comfort">><<set _allowed to false>><</if>> <<elseif $weimar.presence eq "anxious">> <<if _st_id eq "probe" or _st_id eq "confrontation">><<set _allowed to false>><</if>> <<elseif $weimar.presence eq "critical">> <<if _st_id eq "confront" or _st_id eq "confrontation">><<set _allowed to false>><</if>> <</if>> <<if _st_id eq "confrontation" and Number($npcs.weimar.trust) lt 60>><<set _allowed to false>><</if>> <</silently>> <<capture _st_id>>\ <<if $tp lt 1>>\ <span class="stance-disabled">_st_label(你今天已经没有力气再开口了 · 每次开口要 1 点行动力)</span>\ <<elseif _allowed>>\ <<link `_st_label` "Talk_Weimar_Stance_Reply">><<weimar-stance-apply `_st_id`>><</link>> <<else>>\ <span class="stance-disabled"><<link `_st_label + "(不合时宜)"` "Talk_Weimar_Stance_Reply">><<weimar-stance-apply `_st_id`>><</link>></span> <</if>>\ <</capture>>\ <</widget>> /* ---------- weimar-stance-apply:姿态效果引擎 ---------- 用法:<<weimar-stance-apply "comfort"|"confront"|"silent"|"probe"|"confrontation">> 处理:可用性、连用递减、效果应用、TP/额度消耗。结果写入 $stance_last_id / $stance_last_result (持久变量,供 Talk_Weimar_Stance_Reply 场景读取——临时变量跨 passage 会丢失)。 */ <<widget "weimar-stance-apply">>\ <<silently>> <<set _st to $args[0]>> <<weimar-crisis-coef>> <<if not $stance_history>><<set $stance_history to []>><</if>> <<set _result to "success">> <<set _decay to 1.0>> /* 连用递减 */ <<set _rc to 0>> <<for _i to 0; _i lt $stance_history.length; _i++>> <<if $stance_history[_i] eq _st>><<set _rc to _rc + 1>><</if>> <</for>> <<if _rc eq 1>><<set _decay to 0.6>> <<elseif _rc eq 2>><<set _decay to 0.3>> <<elseif _rc gte 3>><<set _decay to 0>><</if>> /* 可用性判定(与 weimar-stance-link 一致,读同一 $weimar.presence) */ <<set _allowed to true>> <<if $weimar.presence eq "calm">> <<if _st eq "comfort" or _st eq "confront" or _st eq "confrontation">><<set _allowed to false>><</if>> <<elseif $weimar.presence eq "tense">> <<if _st eq "comfort">><<set _allowed to false>><</if>> <<elseif $weimar.presence eq "anxious">> <<if _st eq "probe" or _st eq "confrontation">><<set _allowed to false>><</if>> <<elseif $weimar.presence eq "critical">> <<if _st eq "confront" or _st eq "confrontation">><<set _allowed to false>><</if>> <</if>> <<if _st eq "confrontation" and Number($npcs.weimar.trust) lt 60>><<set _allowed to false>><</if>> /* 效果应用 */ <<if not _allowed>> <<set $weimar.personality_tension to $weimar.personality_tension + 5>> <<set $npcs.weimar.trust to Math.max(0, Number($npcs.weimar.trust) - 3)>> <<set _result to "punish">> <<elseif _decay lte 0>> <<set _result to "invalid">> <<else>> <<if _st eq "comfort">> <<set _td to Math.round(-(2 + random(0, 2)) * (1 + _republic_crisis) * _decay)>> <<set $weimar.personality_tension to Math.max(0, $weimar.personality_tension + _td)>> <<set $npcs.weimar.trust to Math.min(100, Number($npcs.weimar.trust) + Math.round((1 + random(0, 2)) * _decay))>> <<set $weimar.self_identity to Math.min(100, $weimar.self_identity + Math.round(random(0, 1) * _decay))>> <<set $weimar.surface.anxiety to Math.max(0, $weimar.surface.anxiety - 3)>> <<elseif _st eq "confront">> <<set _td to Math.round((1 + random(0, 2)) * _decay)>> <<set $weimar.personality_tension to $weimar.personality_tension + _td>> <<set $npcs.weimar.trust to Math.max(0, Number($npcs.weimar.trust) - Math.round((1 + random(0, 1)) * _decay))>> <<set $weimar.self_identity to Math.min(100, $weimar.self_identity + Math.round(random(0, 2) * _decay))>> <<set $weimar.stability to Math.max(10, $weimar.stability - 1)>> <<if $weimar.presence eq "critical">> <<weimar-tension-release>> <<set _result to "release">> <</if>> <<elseif _st eq "silent">> <<set $weimar.stability to Math.min(100, $weimar.stability + 1)>> <<set $weimar.surface.fatigue to Math.max(0, $weimar.surface.fatigue - 2)>> <<elseif _st eq "confrontation">> <<weimar-stance-release-special>> <<set _result to "special_release">> <<elseif _st eq "probe">> <<set $weimar.personality_tension to $weimar.personality_tension + random(0, 1)>> <<set $npcs.weimar.trust to Math.min(100, Number($npcs.weimar.trust) + Math.round(random(0, 1) * _decay))>> <</if>> <</if>> /* 记录 & 消耗 */ <<set $stance_last_id to _st>> <<set $stance_last_result to _result>> <<set $stance_history.push(_st)>> <<if $stance_history.length gt 3>><<set $stance_history.shift()>><</if>> /* 寒战循环(仅成功应用时):安抚类降温、交锋类升温 */ <<if _result eq "success" or _result eq "release" or _result eq "special_release">> <<if _st eq "comfort" or _st eq "silent">> <<weimar-coldwar-shift -1>> <<elseif _st eq "confront" or _st eq "confrontation" or _st eq "probe">> <<weimar-coldwar-shift 1>> <</if>> <</if>> <<tp-spend 1 2>> <<set $dialogue_spent to (Number($dialogue_spent) || 0) + 1>> /* 稳定度变化会影响有效阈值,这里统一刷新 */ <<weimar-effective-update>> <<weimar-mood-refresh>> <</silently>>\ <</widget>> /* ---------- weimar-stance-release-special:对峙特殊释放 ---------- 清空张力,不落瘢痕、不扣稳定度。信任大幅下降,自我认同上升。 */ <<widget "weimar-stance-release-special">>\ <<silently>> <<set _released to $weimar.personality_tension>> <<set $weimar.personality_tension to 0>> <<set $npcs.weimar.trust to Math.max(0, Number($npcs.weimar.trust) - Math.round(3 + random(0, 2)))>> <<set $weimar.self_identity to Math.min(100, $weimar.self_identity + Math.round(2 + random(0, 2)))>> <<set $last_stance_release to "对峙释放:张力 " + _released.toFixed(1) + " 清空">> <</silently>>\ <</widget>>
/* ============================================================ 事件引擎(V0.4-C 事件系统唯一权威 + V0.4-B 事件池算法 + V0.4-D 7.1 反馈) 事件不是任务列表,而是生态中的波动。 循环:事件 -> 标签 -> 社会生态 -> 国家变量 -> 新事件 ============================================================ */ /* ---------- free-swell-check:独立暗涌检查(target 为 "*" 的暗涌) ---------- 用法:<<free-swell-check>> 判定交给 swell-maybe-fire(63_swell_gate:硬门槛+加权分+概率骰,每日概率按 $swell_cfg.free_daily_scale 打折)。本 widget 只管:60天冷却 + 发牌入队。每次调用至多发一件。 */ <<widget "free-swell-check">>\ <<silently>> <<if $swell_events>> <<set _free_swell to null>> <<for _si2 to 0; _si2 lt $swell_events.length; _si2++>> <<set _sw2 to $swell_events[_si2]>> <<if _sw2.target eq "*" and not _free_swell>> <<set _sw_cd to ($event_cooldowns[_sw2.id] ? $event_cooldowns[_sw2.id] : -999)>> <<if $session_day - _sw_cd gte 60>> <<swell-maybe-fire _sw2 "free">> <<if $tmp_sw_fire>> <<set _free_swell to _sw2>> <</if>> <</if>> <</if>> <</for>> <<if _free_swell>> <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _free_swell.id, source: "swell", lifecycle: "era", irreversible: _free_swell.irreversible, intensity: _free_swell.intensity, related_tag: _free_swell.tag, tag: _free_swell.tag, title: _free_swell.title, description: _free_swell.desc, template: _free_swell.template, born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> <<set $event_cooldowns[_free_swell.id] to $session_day>> <<set $last_event_roll.push("🌊 历史暗涌涌上水面:" + _free_swell.title)>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- is-red-ev:历史巨浪统一身份判定 ---------- 用法:<<is-red-ev _ev>> → 输出 _ev_is_red(true=历史巨浪/暗涌/危机爆发)。 口径与办公室「不可跳过」守卫(75b_office_day _has_red)完全一致: deck_id R/S/C 前缀,或 source historical/swell/crisis。 注意判定的是「身份」而非「如何发牌」——日常逐日发牌的红卡不带 manual_hold, 只认 manual_hold 会漏掉它们(P0-1 吞剧情根因之一)。 三道防线(跳过托管 7.6 / 挂起自动处置 route-expire-check / 队列上限裁剪 pending-cap-trim)一律以此豁免:2026-09-21 用户定,历史巨浪一律留给玩家亲手处理。 */ <<widget "is-red-ev">>\ <<silently>> <<set _ire_ev to $args[0]>>\ <<set _ev_is_red to false>>\ <<if _ire_ev and _ire_ev.deck_id and (_ire_ev.deck_id.indexOf("R") eq 0 or _ire_ev.deck_id.indexOf("S") eq 0 or _ire_ev.deck_id.indexOf("C") eq 0)>><<set _ev_is_red to true>><</if>>\ <<if _ire_ev and (_ire_ev.source is "historical" or _ire_ev.source is "swell" or _ire_ev.source is "crisis")>><<set _ev_is_red to true>><</if>>\ <</silently>>\ <</widget>> /* ---------- is-major-ev:剧情级大事统一身份判定 ---------- 用法:<<is-major-ev _ev>> → 输出 _ev_is_major(true=后果深远、必须玩家亲自拍板)。 三种来源(2026-09-26 用户定:谍战密约/军事摊牌/宪政命脉/大联盟十连等35件 UE 公文打 major:true 标记,永远不被治理路线代签): 1. 事件数据带 major:true(88_file_basket_events 内的 UE 大事) 2. 延迟回访卡(如《密使的第二封信》):fb_data 指回原事件,自动继承 major 3. 军方线长线链(军官密谋/政变传言/国防军抗命/政变之夜):按标题认定 与 is-red-ev 同口径接入全部自动处置路径:跳过托管 7.6 / 挂起自动处置 route-expire-check / 队列上限裁剪 pending-cap-trim / 文件批了 files-batch-route; 并禁用冷处理(大事不许 1 资本打发,只能亲手选一个方向)。 */ <<widget "is-major-ev">>\ <<silently>> <<set _ime_ev to $args[0]>>\ <<set _ev_is_major to false>>\ <<if _ime_ev and _ime_ev.major>><<set _ev_is_major to true>><</if>>\ <<if _ime_ev and _ime_ev.fb_data and _ime_ev.fb_data.major>><<set _ev_is_major to true>><</if>>\ <<if _ime_ev and _ime_ev.title and (_ime_ev.title is "军官密谋" or _ime_ev.title is "政变传言" or _ime_ev.title is "国防军抗命" or _ime_ev.title is "政变之夜")>><<set _ev_is_major to true>><</if>>\ <</silently>>\ <</widget>> /* ---------- pending-cap-trim:待办队列超限裁剪(历史巨浪/剧情级大事豁免) ---------- 超出 $pending_cap 时只从队首挤掉可丢弃事件;历史巨浪/暗涌/危机绝不被挤掉—— 它们的牌已标记 dealt,被挤掉=这段历史永远消失(P0-1「吞剧情」实锤之一, 旧实现无差别 splice(0, 溢出数) 曾把 R10 静默抹掉)。 剧情级大事(is-major-ev,2026-09-26 用户定)同样绝不被挤掉——大事挤掉=密使信凭空消失; 全是红卡+大事挤不动时,维持原样把警告写进 $last_event_roll 由晨报知情。 */ <<widget "pending-cap-trim">>\ <<silently>> <<if $pending_events.length gt $pending_cap>>\ <<set _pct_drop to $pending_events.length - $pending_cap>>\ <<set _pct_keep to []>>\ <<set _pct_dropped to 0>>\ <<for _pcti to 0; _pcti lt $pending_events.length; _pcti++>>\ <<set _pcte to $pending_events[_pcti]>>\ <<is-red-ev _pcte>>\ <<is-major-ev _pcte>>\ <<if _ev_is_red or _ev_is_major or _pct_dropped gte _pct_drop>>\ <<set _pct_keep.push(_pcte)>>\ <<else>>\ <<set _pct_dropped to _pct_dropped + 1>>\ <</if>>\ <</for>>\ <<set $pending_events to _pct_keep>>\ <<if _pct_dropped gt 0>>\ <<if not $last_event_roll>><<set $last_event_roll to []>><</if>>\ <<set $last_event_roll.push("⚠️ 队列已满,搁置了 " + _pct_dropped + " 件最旧的待处理事件")>>\ <</if>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- event-pool-roll:发牌调度 ---------- 发牌(事件生态版): 1. 红色事件:当前日期匹配则强制发牌(不受概率影响,从 $event_deck) (旧第2层「白色保底见闻」已删——氛围归晨报 atmos-pools, 白色小事件归 white-roll,引导归开场教程) 黄色事件已改由事件母体系统(archetype-spawn)驱动, 在 world-pressure-check 里按世界压力自动生成,不再从此处抽牌。 */ <<widget "event-pool-roll">>\ <<silently>> <<set $last_event_roll to []>> /* === 1. 红色事件:日期匹配则发牌(含暗涌替换 + pending上限) === */ /* 章节牌库(V0.9 S2):S3 走 $event_deck(date 无年份),S2 走 $s2_event_deck(date 含年份 y)。 通过把 $event_deck 整体指向当前章的数组来切换(选章时已重写), 此处兼容两种日期格式:有 y 则年份也须匹配。 */ /* 1a. 收集当日到期的红色事件 */ <<set _red_today to []>> <<for _i to 0; _i lt $event_deck.length; _i++>> <<set _card to $event_deck[_i]>> <<set _date_hit to (_card.level is "red" and not _card.dealt and _card.date.m eq $date.month and _card.date.d eq $date.day)>> <<if _date_hit and _card.date.y>> <<set _date_hit to (_card.date.y eq $date.year)>> <</if>> <<if _date_hit>> <<set _red_today.push(_i)>> <</if>> <</for>> /* 同日多件全部保留发牌(不取舍、不糊脸,由 pending 上限兜底) */ /* 1b. 逐件发牌(应用暗涌替换 + pending上限) */ <<for _ri to 0; _ri lt _red_today.length; _ri++>> <<set _card to $event_deck[_red_today[_ri]]>> <<set $event_deck[_red_today[_ri]].dealt to true>> <<set _use_swell to null>> /* 暗涌判定(两道门+一颗骰子,见 63_swell_gate):该红色事件是否有判定通过的暗涌可替换 */ <<if $swell_events>> <<for _si to 0; _si lt $swell_events.length; _si++>> <<set _sw to $swell_events[_si]>> <<if _sw.target eq _card.id and not _use_swell>> <<swell-maybe-fire _sw>> <<if $tmp_sw_fire>> <<set _use_swell to _sw>> <</if>> <</if>> <</for>> <</if>> <<if _use_swell>> /* 暗涌替换原事件:历史方向偏转 */ <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _use_swell.id, source: "swell", lifecycle: "era", irreversible: _use_swell.irreversible, intensity: _use_swell.intensity, related_tag: _use_swell.tag, tag: _use_swell.tag, title: _use_swell.title, description: _use_swell.desc, template: _use_swell.template, swell_replaces: _card.id, born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> <<set $last_event_roll.push("🌊 历史暗涌偏转:" + _use_swell.title + "(替换了本应发生的" + _card.title + ")")>> <<else>> <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _card.id, source: "historical", lifecycle: "era", irreversible: _card.irreversible, intensity: _card.intensity, related_tag: _card.tag, tag: _card.tag, title: _card.title, description: _card.desc, template: _card.template, born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> <<set $last_event_roll.push("🔴 发牌:" + _card.title + "(" + $date.month + "月" + $date.day + "日")>> <</if>> /* 该事件关联的政党亲合度+1 */ <<if _card.party_affinity>> <<for _pa to 0; _pa lt _card.party_affinity.length; _pa++>> <<party-affinity-count _card.party_affinity[_pa]>> <</for>> <</if>> <</for>> /* 1c2. 独立暗涌(target 为 "*"):不替换红色事件,世界状态够坏时自己涌上来 */ <<free-swell-check>> /* 1d. pending 队列上限:超出则从队首挤掉最旧的可丢弃事件(防积压雪崩) 红色巨浪/暗涌/危机一律豁免(dealt 已置位,挤掉=永远消失) */ <<pending-cap-trim>> /* === 2. 白色事件(已移除) === 旧版第1天引导见闻「马克的数字」(W0)已删:开场引导由教程场景 (75a_intro_tutorial)负责,氛围类文本归晨报氛围池(atmos-pools), 白色小事件归 white-roll(A_white,日常公文感),文件栏不再出现⚪氛围见闻。 */ <</silently>>\ <</widget>> /* ---------- event-spawn:生成事件入池 ---------- 用法:<<event-spawn "historical">> 或 <<event-spawn "tag-induced" "经济压力">> 事件带:来源类型、生命周期(瞬时/阶段/结构/时代)、不可逆等级(1-4)、 强度、关联标签、关联地区。 */ <<widget "event-spawn">>\ <<silently>> <<set _source to $args[0] ? $args[0] : "random">> <<set _force_tag to $args[1] ? $args[1] : "">> <<set $event_counter to $event_counter + 1>> /* 选关联标签:强制指定 or 从活跃标签里挑强度最高的 */ <<set _related_tag to _force_tag>> <<if _related_tag eq "">> <<set _max_int to 0>> <<for _i to 0; _i lt $active_tags.length; _i++>> <<if $active_tags[_i].intensity gt _max_int>> <<set _max_int to $active_tags[_i].intensity>> <<set _related_tag to $active_tags[_i].name>> <</if>> <</for>> <</if>> <<if _related_tag eq "">><<set _related_tag to "general">><</if>> /* 按来源决定生命周期与不可逆等级 */ <<set _lifecycle to "instant">> <<set _irreversible to 1>> <<set _intensity to 10>> <<if _source eq "historical">> /* 历史锚点:多为阶段/结构事件 */ <<set _roll to random(1, 3)>> <<if _roll eq 1>><<set _lifecycle to "phase">><<set _intensity to 30>><<set _irreversible to 2>> <<elseif _roll eq 2>><<set _lifecycle to "structural">><<set _intensity to 50>><<set _irreversible to 3>> <<else>><<set _lifecycle to "era">><<set _intensity to 80>><<set _irreversible to 4>> <</if>> <<elseif _source eq "tag-induced">> <<set _lifecycle to "phase">><<set _intensity to 25>><<set _irreversible to 2>> <<elseif _source eq "random">> <<set _lifecycle to "instant">><<set _intensity to 10>><<set _irreversible to 1>> <<else>> <<set _lifecycle to "phase">><<set _intensity to 20>><<set _irreversible to 1>> <</if>> /* 事件描述:从文本库按 source+related_tag 取冷峻定调句,回退到 default */ <<set _desc to $txt.ev[_source].default>> <<if $txt.ev[_source] and $txt.ev[_source][_related_tag]>> <<set _desc to $txt.ev[_source][_related_tag]>> <</if>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: "EV", source: _source, lifecycle: _lifecycle, irreversible: _irreversible, intensity: _intensity, related_tag: _related_tag, title: _desc.slice(0, 12) + "……", description: _desc, born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> <<set $last_event_roll.push("生成事件 EV_" + $event_counter + " [" + _source + "/" + _lifecycle + "/不可逆" + _irreversible + "]:" + _desc)>> <</silently>>\ <</widget>> /* ---------- event-aggregate:事件聚合器 ---------- 后台检测标签共振,判断"是否有历史趋势正在形成"。 满足融合三条件(标签相似+地理关联+政治解释一致)则强化父事件。 (V0.4-C 第五章、六章) */ <<widget "event-aggregate">>\ <<silently>> <<set $last_aggregation to []>> /* 按类别聚合活跃标签强度 */ <<set _cat_totals to {}>> <<for _i to 0; _i lt $active_tags.length; _i++>> <<set _t to $active_tags[_i]>> <<if not _cat_totals.hasOwnProperty(_t.category)>> <<set _cat_totals[_t.category] to { total: 0, count: 0, owners: [] }>> <</if>> <<set _cat_totals[_t.category].total to _cat_totals[_t.category].total + _t.intensity>> <<set _cat_totals[_t.category].count to _cat_totals[_t.category].count + 1>> <<if not _cat_totals[_t.category].owners.includes(_t.owner)>> <<set _cat_totals[_t.category].owners.push(_t.owner)>> <</if>> <</for>> /* 检测趋势:同类别 ≥3个标签且总强度 ≥40 */ <<for _cat range Object.keys(_cat_totals)>> <<if _cat_totals[_cat].count gte 3 and _cat_totals[_cat].total gte 40>> <<set $last_aggregation.push("趋势检测:【" + _cat + "】类别 " + _cat_totals[_cat].count + "个标签共振,总强度" + Math.round(_cat_totals[_cat].total))>> /* 触发标签融合 */ <<tag-fuse>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- event-resolve:事件结算 ---------- 用法:<<event-resolve "EV_1">> 结算时:产生标签、按生命周期决定是否进遗产层、 按不可逆等级处理(4级=历史断裂,触发政权更替检查)。 */ <<widget "event-resolve">>\ <<silently>> <<set _eid to $args[0]>> /* 用全局变量 $tmp_target 避免 <<for>> 循环内临时变量丢失 */ <<set $tmp_target to -1>> <<for _i to 0; _i lt $pending_events.length; _i++>> /* 只认第一个同号事件(编号本应唯一,历史坏档里可能撞号) */ <<if $tmp_target lt 0 and $pending_events[_i].event_id eq _eid>> <<set $tmp_target to _i>> <</if>> <</for>> <<if $tmp_target lt 0>> <<set $last_resolve to "未找到事件 " + _eid>> <<else>> <<set _ev to $pending_events[$tmp_target]>> /* 0. 许诺事件:trust 结算已在 promise template 完成,这里只入日志,不产标签/遗产/政权检查 */ <<if _ev.level is "promise">> <<set _ev.status to "resolved">> <<set _ev.resolved_date to { year: $date.year, month: $date.month, day: $date.day }>> <<set $event_log to $event_log.concat([_ev])>> <<set $tmp_newpending to []>> <<for _j to 0; _j lt $pending_events.length; _j++>> <<if _j neq $tmp_target>> <<set $tmp_newpending.push($pending_events[_j])>> <</if>> <</for>> <<set $pending_events to $tmp_newpending>> <<set $last_resolve to "许诺事件已了结:" + _ev.event_id>> <<else>> /* 1. 产生标签(事件 -> 标签)。tag-add 结果存 $ret,需 set 持久化 */ <<set _tag_intensity to Math.round(_ev.intensity * 0.5)>> <<tag-add _ev.related_tag "micro" _tag_intensity _ev.related_tag "weimar" _ev.event_id>> <<set $active_tags to $ret>> <<set $last_resolve to "结算 " + _ev.event_id + " -> 产生微标签【" + _ev.related_tag + "】+" + _tag_intensity>> /* 2. 按生命周期决定是否进遗产层 */ <<if _ev.lifecycle eq "phase" or _ev.lifecycle eq "structural" or _ev.lifecycle eq "era">> <<set _decay_type to "trauma">> <<if _ev.lifecycle eq "structural">><<set _decay_type to "habit">> <<elseif _ev.lifecycle eq "era">><<set _decay_type to "ghost">> <</if>> <<set _base_tags to {}>> <<set _base_tags[_ev.related_tag] to _ev.intensity>> <<legacy-create _ev.event_id _base_tags "weimar" _decay_type _ev.description>> <<set $last_resolve to $last_resolve + ";产生" + _decay_type + "型遗产">> <</if>> /* 3. 不可逆等级处理 */ <<if _ev.irreversible eq 4>> <<set $last_resolve to $last_resolve + ";⚠ 历史断裂!触发政权更替检查">> <<inertia-inherit "new_regime" 0.2>> <</if>> /* 4. 移入事件日志:从 pending 移除,push 到 log。 必须创建新数组整体赋值(直接修改不被持久化)。 */ <<set _ev.status to "resolved">> <<set _ev.resolved_date to { year: $date.year, month: $date.month, day: $date.day }>> <<set $event_log to $event_log.concat([_ev])>> <<set $tmp_newpending to []>> <<for _j to 0; _j lt $pending_events.length; _j++>> <<if _j neq $tmp_target>> <<set $tmp_newpending.push($pending_events[_j])>> <</if>> <</for>> <<set $pending_events to $tmp_newpending>> <</if>> <</if>> <<set $tmp_target to -1>> <</silently>>\ <</widget>> /* ---------- event-father-check:父事件结构检测 ---------- 多个子事件汇聚则生成父事件 (V0.4-C 第四章)。 示例:经济+社会+政治三个方向汇聚 -> 共和国合法性危机。 */ <<widget "event-father-check">>\ <<silently>> <<set $last_father_check to []>> /* 统计事件日志中各类别事件数 */ <<set _cat_events to {}>> <<for _i to 0; _i lt $event_log.length; _i++>> <<set _cat to $event_log[_i].related_tag>> <<if not _cat_events.hasOwnProperty(_cat)>> <<set _cat_events[_cat] to 0>> <</if>> <<set _cat_events[_cat] to _cat_events[_cat] + 1>> <</for>> /* 同类别 ≥3 个已结算事件 -> 生成父事件候选 */ <<for _cat range Object.keys(_cat_events)>> <<if _cat_events[_cat] gte 3>> <<set $last_father_check.push("父事件候选:【" + _cat + "】方向已积累" + _cat_events[_cat] + "个子事件")>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- event-prompt-color:玩家提示颜色判定 ---------- 白色(普通)/黄色(趋势)/红色(风险) (V0.4-C 第十章)。 结果存入 _prompt_color。 */ <<widget "event-prompt-color">>\ <<silently>> <<set _risk to 0>> <<for _i to 0; _i lt $pending_events.length; _i++>> <<if $pending_events[_i].irreversible gte 3>> <<set _risk to _risk + 30>> <<elseif $pending_events[_i].irreversible eq 2>> <<set _risk to _risk + 10>> <</if>> <</for>> <<if _risk gte 60>> <<set _prompt_color to "red">> <<elseif _risk gte 30>> <<set _prompt_color to "yellow">> <<else>> <<set _prompt_color to "white">> <</if>> <</silently>>\ <</widget>> /* ---------- event-list:调试用,打印事件池与日志 ---------- */ <<widget "event-list">>\ ''待处理事件($pending_events.length)'' <<if $pending_events.length eq 0>>\ //(无待处理事件)//\ <<else>>\ //(ID|来源|生命周期|不可逆|强度|关联标签|描述)// <<for _i to 0; _i lt $pending_events.length; _i++>><<set _ev to $pending_events[_i]>>· _ev.event_id|_ev.source|_ev.lifecycle|_ev.irreversible|<<print _ev.intensity>>|_ev.related_tag|_ev.description<br> <</for>>\ <</if>> ''事件日志(最近5条)'' <<if $event_log.length eq 0>>\ //(无历史事件)//\ <<else>>\ <<for _i to Math.max(0, $event_log.length - 5); _i lt $event_log.length; _i++>><<set _ev to $event_log[_i]>>- _ev.event_id [_ev.lifecycle/不可逆_ev.irreversible] _ev.description <</for>>\ <</if>>\ <</widget>>
/* ============================================================ 事件母体系统(Layer 3 · Archetype Event System) ------------------------------------------------------------ 世界压力过载时,从事件母体生成事件。 不再从预设牌库抽黄/白事件,而是由世界状态驱动事件诞生。 核心流程: world-pressure-check 检测压力过载 -> archetype-spawn "经济/社会/政治/军事" -> 遍历 $archetypes,按 category 筛选 -> 检查 conditions(世界变量是否满足) -> 检查 cooldown(防重复) -> 按权重选一个 outcome -> 生成 event 对象(补全 deck_id/title/template) -> push 到 $pending_events -> 应用 world_effects(改变世界状态) 生成的 event 用 deck_id "A" 前缀(Archetype),区别于: - "R" 前缀 = 红色历史事件($event_deck 预设) - "Y" 前缀 = 旧黄色事件(已废弃,保留兼容) - "W" 前缀 = 旧白色事件(已废弃,保留兼容) ============================================================ */ /* ---------- archetype-spawn:从母体生成事件 ---------- 用法:<<archetype-spawn "经济">> 参数:$args[0] = category(经济/社会/政治/军事) 被 world-pressure-check 调用。 */ <<widget "archetype-spawn">>\ <<silently>> <<set _cat to $args[0] ? $args[0] : "经济">> <<set _candidates to []>> /* 1. 按类别筛选母体,检查条件和冷却 */ <<for _i to 0; _i lt $archetypes.length; _i++>> <<set _arch to $archetypes[_i]>> <<if _arch.category eq _cat>> /* 冷却检查:上次触发距今天数 < cooldown 则跳过 */ <<set _last_trigger to $archetype_cooldowns[_arch.id] ?? -999>> <<if $session_day - _last_trigger gte _arch.cooldown>> /* 条件检查:读取世界变量做比较 */ <<set _cond to _arch.conditions>> <<set _val to 0>> /* 解析 stat 路径,支持 world.xxx */ <<if _cond.stat eq "world.economy">><<set _val to $world.economy>> <<elseif _cond.stat eq "world.inflation">><<set _val to $world.inflation>> <<elseif _cond.stat eq "world.social_anger">><<set _val to $world.social_anger>> <<elseif _cond.stat eq "world.nationalism">><<set _val to $world.nationalism>> <<elseif _cond.stat eq "world.gov_trust">><<set _val to $world.gov_trust>> <<elseif _cond.stat eq "world.army_influence">><<set _val to $world.army_influence>> <<elseif _cond.stat eq "world.revolution">><<set _val to $world.revolution>> <<elseif _cond.stat eq "world.political_violence">><<set _val to $world.political_violence>> <</if>> /* 条件判断 */ <<set _pass to false>> <<if _cond.op eq "gte" and _val gte _cond.val>><<set _pass to true>> <<elseif _cond.op eq "lte" and _val lte _cond.val>><<set _pass to true>> <<elseif _cond.op eq "gt" and _val gt _cond.val>><<set _pass to true>> <<elseif _cond.op eq "lt" and _val lt _cond.val>><<set _pass to true>> <</if>> <<if _pass>> <<set _candidates.push(_arch)>> <</if>> <</if>> <</if>> <</for>> /* 2. 从候选母体中按紧迫度加权选一个,再按权重选 outcome */ <<if _candidates.length gt 0>> /* 按紧迫值权重选母体(世界压力越高,对口母体越可能触发) */ <<set _total_w to 0>> <<set _arch_weights to []>> <<for _j to 0; _j lt _candidates.length; _j++>> <<urgency-mult _candidates[_j].weight_condition>> <<set _arch_weights.push($tmp_urgency)>> <<set _total_w to _total_w + $tmp_urgency>> <</for>> <<set _roll to Math.random() * _total_w>> <<set _acc to 0>> <<set _arch_idx to 0>> <<for _j to 0; _j lt _arch_weights.length; _j++>> <<set _acc to _acc + _arch_weights[_j]>> <<if _roll lt _acc>> <<set _arch_idx to _j>> <<set _j to _arch_weights.length>> /* break */ <</if>> <</for>> <<set _arch to _candidates[_arch_idx]>> /* 洗牌+冷却:可用=近60天内没被抽到过的具体事件;若整组都还在冷却则整组重置可用。 持续效果封锁:某 outcome 的同类效果还在生效期/尾冷却($effect_cool)→ 不选(防同源效果翻倍); 冷却重置解不开生效期封锁——全员被封则本次不生成事件。 */ <<set _avail to []>> <<for _j to 0; _j lt _arch.outcomes.length; _j++>> <<set _oc to ($event_cooldowns[_arch.outcomes[_j].id] ? $event_cooldowns[_arch.outcomes[_j].id] : -999)>> <<set _oc_blk to ($effect_cool and $effect_cool[_arch.outcomes[_j].id] and $session_day lt $effect_cool[_arch.outcomes[_j].id])>> <<if $session_day - _oc gte 60 and not _oc_blk>> <<set _avail.push(_j)>> <</if>> <</for>> <<if _avail.length eq 0>> <<for _j to 0; _j lt _arch.outcomes.length; _j++>> <<set _oc_blk to ($effect_cool and $effect_cool[_arch.outcomes[_j].id] and $session_day lt $effect_cool[_arch.outcomes[_j].id])>> <<if not _oc_blk>> <<set _avail.push(_j)>> <</if>> <</for>> <</if>> /* <<return>> 是导航宏不是提前返回(贯穿会拿 undefined 选 outcome),改 if 包裹(2026-09-21 根治) */ <<if _avail.length gt 0>>\ /* 在可用集合里按权重挑一个(C层:按 $fate * fate_weight 加权) 每个 outcome 可带可选字段 fate_weight: 负值=左倾事件($fate<0 时权重放大)、正值=右倾事件($fate>0 放大)、0/缺省=中性不受影响。 $fate=0 时 mod=1,完全等价旧逻辑。 */ <<set _fate_norm to Math.max(-1, Math.min(1, $fate / 100))>> <<set _eff_w to []>> <<set _total_w to 0>> <<for _j to 0; _j lt _avail.length; _j++>> <<set _oc to _arch.outcomes[_avail[_j]]>> <<set _fw to (_oc.fate_weight ? _oc.fate_weight : 0)>> <<set _mod to 1 + _fate_norm * _fw>> <<set _mod to Math.max(0.1, Math.min(3, _mod))>> <<set _eff_w.push(_oc.weight * _mod)>> <<set _total_w to _total_w + _oc.weight * _mod>> <</for>> <<set _roll to Math.random() * _total_w>> <<set _acc to 0>> <<set _outcome_idx to _avail[0]>> <<for _j to 0; _j lt _avail.length; _j++>> <<set _acc to _acc + _eff_w[_j]>> <<if _roll lt _acc>> <<set _outcome_idx to _avail[_j]>> <<set _j to _avail.length>> /* break */ <</if>> <</for>> <<set $event_cooldowns[_arch.outcomes[_outcome_idx].id] to $session_day>> <<set _outcome to _arch.outcomes[_outcome_idx]>> /* 3. 生成 event 对象(补全 deck_id/title/template) */ <<set $event_counter to $event_counter + 1>> <<set _eid to "EV_" + $event_counter>> <<set _deck_id to "A" + String(_arch.id).substring(5, 8)>> /* 截取母体id后几位做deck_id,如 arch_econ_crisis -> Aeco */ <<set _deck_id to "A" + _arch.id.charAt(5) + _arch.id.charAt(6) + _arch.id.charAt(7)>> <<set _eco_desc to "某种东西在变大。还没人给它命名。">> <<if $txt and $txt.ev and $txt.ev["tag-induced"]>> <<if $txt.ev["tag-induced"][_outcome.tag]>> <<set _eco_desc to $txt.ev["tag-induced"][_outcome.tag]>> <<elseif $txt.ev["tag-induced"].default>> <<set _eco_desc to $txt.ev["tag-induced"].default>> <</if>> <</if>> <<set $pending_events.push({ event_id: _eid, deck_id: _deck_id, source: "tag-induced", lifecycle: "phase", irreversible: 2, intensity: _outcome.intensity, related_tag: _outcome.tag, tag: _outcome.tag, title: _outcome.id, description: _eco_desc, template: _outcome.template, world_effects: _outcome.world_effects, scene: _outcome.scene, born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> /* 5. 母体事件落地即伤:world_effects 在发牌时生效一次。 (File_Result 结算层不再重复应用;选项层 fx 只算玩家的处置。) */ <<if _outcome.world_effects>> <<world-apply-effects _outcome.world_effects>> <</if>> /* 6. 记录冷却 */ <<set $archetype_cooldowns[_arch.id] to $session_day>> <<set $daily_event_count to $daily_event_count + 1>> /* 7. 日志 */ <<set $last_event_roll.push("🟠 母体生成:" + _outcome.id + "(来自" + _arch.name + ",权重" + _outcome.weight + ")")>> <</if>>\ <</if>> <</silently>>\ <</widget>> /* ---------- archetype-cooldown-tick:每日冷却记录 ---------- 用法:<<archetype-cooldown-tick>>(在 daily-tick 里每日调用) 冷却靠 $archetype_cooldowns[id] 存的 session_day 做差值比较, 不需要递减计数器。此 widget 预留给未来"冷却衰减"等扩展用。 */ <<widget "archetype-cooldown-tick">>\ <<silently>> /* 冷却通过 session_day 差值计算,无需每日操作。 此处预留给未来扩展(如:随时间降低冷却阈值等)。 */ <</silently>>\ <</widget>>
/* ============================================================ 历史暗涌判定系统 V2(分层门槛 + 概率骰 + 风声) ============================================================ 取代旧 swell_condition(紧迫值权重)判定。旧判定把门槛值当权重系数 算紧迫倍率,实际结果「永远达标」→ 暗涌必发,条件形同虚设。 新判定(两道门 + 一颗骰子): gate.hard 硬门槛数组 —— 全部满足暗涌才「可能」发生,缺一即历史照旧 gate.soft 加权数组 —— 每满足一条 +w 分,分数推高触发概率 (深度经营玩家优势所在:好感/标签/解锁/选择痕迹) 骰子 p = base_p + step_p × 加权分,封顶 max_p(永不 100%) 风声 硬门槛过了但骰子未中 → 晨报留一条「差点发生」的风声 (每个暗涌每章最多一次,$flags["swell_rumor_<id>_<stage>"] 去重) 上限 每章替换制/独立制暗涌各限 $swell_cfg.max_replace_per_stage / max_free_per_stage 件 ($swell_fired = { replace, free } 分开计数) 条件项格式:{ t:"world", k:"political_violence", min:60 } 当前值 ≥ min 满足 { t:"world", k:"gov_trust", max:20 } 当前值 ≤ max 满足(越低越糟类) 可选 w:权重(仅 soft 用,默认 1) t 类型(swell-cond-val 解析): world → $world.X(世界变量) party → $npcs.X.trust(政党/军方好感) regionnpc → $region_npcs.X.trust(邦国拟人好感) weimar → $weimar.mid.X(魏玛中层:intl_trust 国际信任等) tag → $active_tags 里名为 k 的标签强度(无则 0) flag → $flags.X(真=1 假=0) player → $player.mental.X(疲惫/偏执/理想/孤立) fate → $fate(命运轴 -100~+100,k 忽略) unlock → $regions.X.unlocked(区域解锁,k=区域id,真=1 假=0) ============================================================ */ /* ---------- swell-cond-val:读单个条件项的当前值 → $tmp_swv(-1=类型/路径无法解析) ---------- */ <<widget "swell-cond-val">>\ <<silently>> <<set _scv_t to $args[0].t>> <<set _scv_k to $args[0].k>> <<set $tmp_swv to -1>> <<if _scv_t eq "fate">> <<set $tmp_swv to $fate>> <<elseif _scv_t eq "world" and $world and $world[_scv_k] neq undefined>> <<set $tmp_swv to $world[_scv_k]>> <<elseif _scv_t eq "party" and $npcs and $npcs[_scv_k] neq undefined>> <<set $tmp_swv to $npcs[_scv_k].trust>> <<elseif _scv_t eq "regionnpc" and $region_npcs and $region_npcs[_scv_k] neq undefined>> <<set $tmp_swv to $region_npcs[_scv_k].trust>> <<elseif _scv_t eq "weimar" and $weimar and $weimar.mid and $weimar.mid[_scv_k] neq undefined>> <<set $tmp_swv to $weimar.mid[_scv_k]>> <<elseif _scv_t eq "player" and $player and $player.mental and $player.mental[_scv_k] neq undefined>> <<set $tmp_swv to $player.mental[_scv_k]>> <<elseif _scv_t eq "flag">> <<if $flags[_scv_k]>><<set $tmp_swv to 1>><<else>><<set $tmp_swv to 0>><</if>> <<elseif _scv_t eq "unlock" and $regions and $regions[_scv_k] neq undefined>> <<if $regions[_scv_k].unlocked>><<set $tmp_swv to 1>><<else>><<set $tmp_swv to 0>><</if>> <<elseif _scv_t eq "tag">> <<set $tmp_swv to 0>> <<if $active_tags>> <<for _scv_i to 0; _scv_i lt $active_tags.length; _scv_i++>> <<if $active_tags[_scv_i].name eq _scv_k and $active_tags[_scv_i].intensity gt $tmp_swv>> <<set $tmp_swv to $active_tags[_scv_i].intensity>> <</if>> <</for>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- swell-gate-check:完整判定(输入 _sw 暗涌对象,输出 $swell_chk) ---------- $swell_chk = { ok(硬门槛是否全过), score(加权满足分), p(触发概率%), fail(未过的硬门槛描述) } 旧数据兼容:无 gate 但有 swell_condition → 全部转硬门槛 (gov_trust / middle_confidence 是「越低越糟」,按上限处理,其余按下限) */ <<widget "swell-gate-check">>\ <<silently>> <<set _sgc_sw to $args[0]>> <<set $swell_chk to { ok: true, score: 0, p: 0, fail: "" }>> <<set $tmp_swell_gate to _sgc_sw.gate>> <<if not $tmp_swell_gate and _sgc_sw.swell_condition>> <<set $tmp_swell_gate to { hard: [], soft: [] }>> <<set _sgc_old to _sgc_sw.swell_condition>> <<set _sgc_keys to Object.keys(_sgc_old)>> <<for _sgc_i to 0; _sgc_i lt _sgc_keys.length; _sgc_i++>> <<if _sgc_keys[_sgc_i] eq "gov_trust" or _sgc_keys[_sgc_i] eq "middle_confidence">> <<set $tmp_swell_gate.hard.push({ t: "world", k: _sgc_keys[_sgc_i], max: _sgc_old[_sgc_keys[_sgc_i]] })>> <<else>> <<set $tmp_swell_gate.hard.push({ t: "world", k: _sgc_keys[_sgc_i], min: _sgc_old[_sgc_keys[_sgc_i]] })>> <</if>> <</for>> <</if>> /* 1. 硬门槛:一项不过 → 整体不可能(ok=false,p=0) */ <<if $tmp_swell_gate and $tmp_swell_gate.hard and $tmp_swell_gate.hard.length gt 0>> <<for _sgc_i to 0; _sgc_i lt $tmp_swell_gate.hard.length; _sgc_i++>> <<if $swell_chk.ok>> <<set $tmp_swell_met to false>> <<swell-cond-val $tmp_swell_gate.hard[_sgc_i]>> <<if $tmp_swv gte 0>> <<if $tmp_swell_gate.hard[_sgc_i].max neq undefined>> <<if $tmp_swv lte $tmp_swell_gate.hard[_sgc_i].max>><<set $tmp_swell_met to true>><</if>> <<elseif $tmp_swell_gate.hard[_sgc_i].min neq undefined>> <<if $tmp_swv gte $tmp_swell_gate.hard[_sgc_i].min>><<set $tmp_swell_met to true>><</if>> <<else>> <<if $tmp_swv gte 1>><<set $tmp_swell_met to true>><</if>> <</if>> <</if>> <<if not $tmp_swell_met>> <<set $swell_chk.ok to false>> <<set $swell_chk.fail to _sgc_sw.id + ":" + ($tmp_swell_gate.hard[_sgc_i].k ? $tmp_swell_gate.hard[_sgc_i].k : "fate")>> <</if>> <</if>> <</for>> <</if>> /* 2. 加权项:满足一条 +w 分 */ <<if $swell_chk.ok and $tmp_swell_gate and $tmp_swell_gate.soft and $tmp_swell_gate.soft.length gt 0>> <<for _sgc_i to 0; _sgc_i lt $tmp_swell_gate.soft.length; _sgc_i++>> <<set $tmp_swell_met to false>> <<swell-cond-val $tmp_swell_gate.soft[_sgc_i]>> <<if $tmp_swv gte 0>> <<if $tmp_swell_gate.soft[_sgc_i].max neq undefined>> <<if $tmp_swv lte $tmp_swell_gate.soft[_sgc_i].max>><<set $tmp_swell_met to true>><</if>> <<elseif $tmp_swell_gate.soft[_sgc_i].min neq undefined>> <<if $tmp_swv gte $tmp_swell_gate.soft[_sgc_i].min>><<set $tmp_swell_met to true>><</if>> <<else>> <<if $tmp_swv gte 1>><<set $tmp_swell_met to true>><</if>> <</if>> <</if>> <<if $tmp_swell_met>> <<set $swell_chk.score to $swell_chk.score + ($tmp_swell_gate.soft[_sgc_i].w ? $tmp_swell_gate.soft[_sgc_i].w : 1)>> <</if>> <</for>> <</if>> /* 3. 概率映射(单位 %):p = base + step × score,封顶 max */ <<if $swell_chk.ok and $swell_cfg>> <<set $swell_chk.p to Math.min($swell_cfg.max_p, $swell_cfg.base_p + $swell_cfg.step_p * $swell_chk.score)>> <</if>> <</silently>>\ <</widget>> /* ---------- swell-maybe-fire:掷骰 + 配额 + 风声(输入 _sw,可选 $args[1]="free",输出 $tmp_sw_fire) ---------- 每章上限($swell_fired vs $swell_cfg.max_per_stage)→ 概率骰 → 未中且硬门槛过则记风声。 mode="free"(独立暗涌每日判定)时概率按 free_daily_scale 打折,避免硬核玩家必中。 */ <<widget "swell-maybe-fire">>\ <<silently>> <<set _smf_sw to $args[0]>> <<set _smf_mode to ($args.length gt 1 and $args[1] eq "free" ? "free" : "replace")>> <<set $tmp_sw_fire to false>> /* 双计数上限:替换制/独立制分开算($swell_fired = { replace, free }) */ <<set _smf_fired to (_smf_mode eq "free" ? $swell_fired.free : $swell_fired.replace)>> <<set _smf_cap to (_smf_mode eq "free" ? $swell_cfg.max_free_per_stage : $swell_cfg.max_replace_per_stage)>> <<if $swell_cfg and $swell_fired and _smf_fired lt _smf_cap>> <<swell-gate-check _smf_sw>> <<if $swell_chk.ok>> <<set _smf_p to Math.round($swell_chk.p)>> <<if _smf_mode eq "free">><<set _smf_p to Math.round(_smf_p * ($swell_cfg.free_daily_scale ? $swell_cfg.free_daily_scale : 0.2))>><</if>> <<if random(1, 100) lte _smf_p>> <<set $tmp_sw_fire to true>> <<if _smf_mode eq "free">> <<set $swell_fired.free to $swell_fired.free + 1>> <<else>> <<set $swell_fired.replace to $swell_fired.replace + 1>> <</if>> <<elseif $swell_cfg.rumor_on and $swell_rumor_pending neq undefined>> /* 差点发生:硬门槛过了但骰子没中 → 留一条风声(每个暗涌每章最多一次) */ <<set _smf_rkey to "swell_rumor_" + _smf_sw.id + "_" + $stage.id>> <<if not $flags[_smf_rkey]>> <<set $flags[_smf_rkey] to true>> <<set _smf_rtext to (_smf_sw.gate and _smf_sw.gate.rumor ? _smf_sw.gate.rumor : "最近有种说不出的躁动。好像有什么事,差一点就要发生了。")>> <<set $swell_rumor_pending.push({ id: _smf_sw.id, title: _smf_sw.title, text: _smf_rtext })>> <</if>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>>
/* ============================================================ 事件选项模板 + 反馈池抽签系统 6套模板 × 3方向,三层反馈池抽签拼接 ============================================================ */ /* ---------- opt-variant-index:通用选项变体抽签 ---------- 按事件 id 做稳定散列取 _ov(0..2):同一事件每次渲染同一套措辞, 不同事件措辞错开,消除"每个文件都是同一行选项"的重复感。 */ <<widget "opt-variant-index">>\ <<silently>> <<set _ovsrc to ($args[0] and $args[0].id) ? String($args[0].id) : "">> <<set _ovsum to 0>> <<for _ovi to 0; _ovi lt _ovsrc.length; _ovi++>> <<set _ovsum to (_ovsum * 31 + _ovsrc.charCodeAt(_ovi)) % 9973>> <</for>> <<set _ov to _ovsum % 3>> <</silently>>\ <</widget>> /* ---------- render-options:渲染选项 ---------- 用法:<<render-options "decision" _ev>> 输出3个 <<link>>,点击后设 _file_action 并跳转 File_Result */ <<widget "render-options">>\ <<silently>> <<set _tmpl to $args[0]>> <<set _ev to $args[1]>> <</silently>>\ <<world-event-custom-init>>\ <<silently>> <<set _use_custom to ((_ev.deck_id.startsWith("A") or _ev.deck_id.startsWith("Y")) and $world_custom_options and $world_custom_options[_ev.title])>> <</silently>>\ <<opt-variant-index _ev>>\ <<silently>> /* 通用选项变体表:每格三套措辞,按事件ID稳定取一套(_ov=0..2)。 数值与后果注释不变,只换说法;同一事件每次渲染同一套。 */ <<set _olab to { decision: [ ["签署命令,直接介入", "落笔签发,不再转手", "今晚就签,不等天亮"], ["找人转圜,各方协调", "请几位关键人物从中斡旋", "牵线搭桥,让他们自己谈拢"], ["搁置不办,等等再说", "先把文件压进抽屉", "先看看风向再说"] ], action: [ ["亲自到场处理", "自己跑一趟,当场拍板", "现在就去,办完再回来"], ["托人代为施压", "递句话过去,让他自己领会", "找一个他不敢怠慢的人出面"], ["按兵不动,静观其变", "守在电话旁边,只听不说", "不帮任何一方,先看清局势"], ["坚持原则,公开表明立场", "照规矩办,一步不让", "把立场写成白纸黑字"] ], stance: [ ["公开支持", "站到台前,把话说在明处", "署名声援,见报也无妨"], ["沉默不表态", "闭口不言,谁问都推说再议", "只做事,不站队"], ["公开反对", "当众表明反对,不怕结怨", "发声明反对,白纸黑字"] ], observe: [ ["仔细记下,深挖细节", "把数字和人名都抄下来", "多留一天,把疑点看透"], ["看一眼就行,不多想", "翻过去,不往深里想", "知道有这么回事就够了"] ], survey: [ ["亲自去现场查看", "不听汇报,亲自去看", "换一身便装,去现场走一圈"], ["找在场的人打听", "分头约几个当事人问话", "让秘书处收一份书面经过"], ["转身离开,不掺和", "只路过,不停留", "把门带上,装作没看见"] ], interact: [ ["请对方喝杯酒,套近乎", "递一支烟,把话谈开", "请他吃顿饭,先做朋友再谈事"], ["亮出身份,压对方就范", "把职务亮出来,让他自己掂量", "把名片压在桌上,什么也不必说"], ["点个头就走,保持距离", "客套两句,转身告辞", "举一下帽子,算是打过招呼"] ], survival: [ ["趁机捞一笔", "先落袋为安,道理以后再讲", "这种机会,过时不候"], ["守住底线,不碰脏钱", "这钱烫手,一分不拿", "宁可难看,不赚这个钱"], ["随大流,别人怎样我怎样", "跟着大伙走,不出头", "别人排队你也排,不问缘由"] ] }>> <</silently>>\ <<if _use_custom>>\ <<render-world-custom-options _ev>>\ <<elseif _ev.deck_id eq "R01" or _ev.deck_id eq "R02" or _ev.deck_id eq "R03" or _ev.deck_id eq "R04" or _ev.deck_id eq "R05" or _ev.deck_id eq "R06" or _ev.deck_id eq "R07" or _ev.deck_id eq "R08" or _ev.deck_id eq "R09" or _ev.deck_id eq "R10" or _ev.deck_id eq "R11" or _ev.deck_id eq "R12" or _ev.deck_id eq "R13" or _ev.deck_id eq "R14" or _ev.deck_id eq "R15" or _ev.deck_id eq "R16" or _ev.deck_id eq "R17" or _ev.deck_id eq "R18" or _ev.deck_id eq "R19" or _ev.deck_id eq "S01" or _ev.deck_id eq "S02" or _ev.deck_id eq "S03" or _ev.deck_id eq "S04" or _ev.deck_id eq "S05" or _ev.deck_id eq "S06" or _ev.deck_id eq "S07" or _ev.deck_id eq "S08" or _ev.deck_id eq "S09" or _ev.deck_id eq "S10" or _ev.deck_id eq "S11" or _ev.deck_id eq "S12" or _ev.deck_id eq "S13" or _ev.deck_id eq "R201" or _ev.deck_id eq "R202" or _ev.deck_id eq "R203" or _ev.deck_id eq "R204" or _ev.deck_id eq "R205" or _ev.deck_id eq "R206" or _ev.deck_id eq "R207" or _ev.deck_id eq "R208" or _ev.deck_id eq "R209" or _ev.deck_id eq "R210">>\ <<foreboding _ev.deck_id>>\ <<render-red-custom-options _ev>>\ <<elseif _ev.deck_id eq "C01" or _ev.deck_id eq "C02" or _ev.deck_id eq "C03" or _ev.deck_id eq "C04">>\ <<foreboding _ev.deck_id>>\ <<render-crisis-options _ev>>\ <<elseif _tmpl is "decision">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.3)>> <<set _g2 to Math.round(_ev.intensity * 0.15)>> <</silently>>\ ''你的决定:'' <<link _olab.decision[0][_ov] "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to _olab.decision[0][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.3)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<weimar-tension-gain 1>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(魏玛精神负荷+1。_ev_tag 标签+_g1。社会矛盾可能激化,但局面也许能压住。)// <<link _olab.decision[1][_ov] "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to _olab.decision[1][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.15)` _ev.tag "spd" _ev.id>>\ <<set $active_tags to $ret>>\ <<tag-add "政府信誉" "micro" 5 "政治" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "delegate" _ev.intensity>>\ <</link>>\ //(政府信誉+5。_ev_tag 标签+_g2。矛盾缓解但谁都不完全满意。)// <<if $player.mental.fatigue lt 81>>\ <<link _olab.decision[2][_ov] "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to _olab.decision[2][_ov]>>\ <<tag-add "拖延者" "micro" 5 "玩家行为" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 5)>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(魏玛焦虑+5。问题会继续发酵,但你争取了时间。)//\ <<else>>\ //(你太累了,连搁置的力气都没有。)//\ <</if>> <<elseif _tmpl is "action">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.3)>> <<set _g2 to Math.round(_ev.intensity * 0.2)>> <</silently>>\ ''你的行动:'' <<link _olab.action[0][_ov] "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to _olab.action[0][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.3)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + 8)>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(你的疲惫+8。_ev_tag 标签+_g1。事情会立刻有进展。)// <<link _olab.action[1][_ov] "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to _olab.action[1][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.2)` _ev.tag "spd" _ev.id>>\ <<set $active_tags to $ret>>\ <<trust-capped "spd" 3>>\ <<apply-choice-effects _ev.tag "delegate" _ev.intensity>>\ <</link>>\ //(SPD对你的信任+3。_ev_tag 标签+_g2。欠下人情,但不用亲力亲为。)// <<link _olab.action[2][_ov] "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to _olab.action[2][_ov]>>\ <<tag-add "观察者" "micro" 5 "玩家行为" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 3)>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(你的偏执+3。观察者标签+5。错过了干预时机。)// /* 理想试点:当理想≥60,解锁"坚持原则"选项(你的理想让你无法袖手旁观) */ <<if $player.mental.idealism gte 60>>\ <<link _olab.action[3][_ov] "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to _olab.action[3][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.25)` _ev.tag "ddp" _ev.id>>\ <<set $active_tags to $ret>>\ <<trust-capped "ddp" 4>>\ <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + 5)>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(你的理想让你无法假装没看见。DDP信任+4 · 疲惫+5 · _ev_tag 标签+_g1。)//\ <</if>> <<elseif _tmpl is "stance">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.25)>> <<set _g2 to Math.round(_ev.intensity * 0.2)>> <</silently>>\ ''你的表态:'' <<link _olab.stance[0][_ov] "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to _olab.stance[0][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.25)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<tag-add "政府信誉" "micro" 8 "政治" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(政府信誉+8。_ev_tag 标签+_g1。你的立场被公开记录,以后难以改口。)// <<link _olab.stance[1][_ov] "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to _olab.stance[1][_ov]>>\ <<tag-add "观察者" "micro" 5 "玩家行为" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "delegate" _ev.intensity>>\ <</link>>\ //(观察者标签+5。各方觉得你不可靠,但你不被任何立场绑定。)// <<link _olab.stance[2][_ov] "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to _olab.stance[2][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.2)` _ev.tag "dnvp" _ev.id>>\ <<set $active_tags to $ret>>\ <<tag-add "政府信誉" "micro" -8 "政治" "dnvp" _ev.id>>\ <<set $active_tags to $ret>>\ <<trust-capped "dnvp" 3>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(政府信誉-8。DNVP信任+3。_ev_tag 标签+_g2。树敌但立场清晰。)// <<elseif _tmpl is "observe">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.2)>> <<set _g2 to Math.round(_ev.intensity * 0.1)>> <</silently>>\ ''你选择:'' <<link _olab.observe[0][_ov] "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to _olab.observe[0][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.2)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<tag-add "知情者" "micro" 5 "玩家行为" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(知情者+5。_ev_tag 标签+_g1。有些事知道了反而是负担。)// <<link _olab.observe[1][_ov] "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to _olab.observe[1][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.1)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(_ev_tag 标签+_g2。影响很小。你保持了距离,但也可能错过了什么。)// <<elseif _tmpl is "survey">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.25)>> <<set _g2 to Math.round(_ev.intensity * 0.15)>> <</silently>>\ ''你的调查:'' <<link _olab.survey[0][_ov] "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to _olab.survey[0][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.25)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<tag-add "洞察者" "micro" 8 "玩家行为" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + 5)>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(你的疲惫+5。洞察者+8。_ev_tag 标签+_g1。获得第一手信息,但消耗精力。)// <<link _olab.survey[1][_ov] "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to _olab.survey[1][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.15)` _ev.tag "spd" _ev.id>>\ <<set $active_tags to $ret>>\ <<trust-capped "spd" 2>>\ <<apply-choice-effects _ev.tag "delegate" _ev.intensity>>\ <</link>>\ //(SPD信任+2。_ev_tag 标签+_g2。获得他人视角,但信息可能被加工过。)// <<link _olab.survey[2][_ov] "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to _olab.survey[2][_ov]>>\ <<tag-add "观察者" "micro" 3 "玩家行为" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(观察者标签+3。安全、不被牵连,但错过了信息。)// <<elseif _tmpl is "interact">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.2)>> <<set _g2 to Math.round(_ev.intensity * 0.3)>> <</silently>>\ ''你的手段:'' <<link _olab.interact[0][_ov] "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to _olab.interact[0][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.2)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<trust-capped "spd" 5>>\ <<set $player.mental.isolation to Math.max(0, $player.mental.isolation - 3)>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(SPD信任+5。你的孤立感-3。_ev_tag 标签+_g1。花了资源,但拉近距离。)// <<link _olab.interact[1][_ov] "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to _olab.interact[1][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.3)` _ev.tag "dnvp" _ev.id>>\ <<set $active_tags to $ret>>\ <<trust-capped "dnvp" -3>>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 3)>>\ <<apply-choice-effects _ev.tag "delegate" _ev.intensity>>\ <</link>>\ //(DNVP信任-3。你的偏执+3。_ev_tag 标签+_g2。短期服从,但关系恶化。)// <<link _olab.interact[2][_ov] "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to _olab.interact[2][_ov]>>\ <<set $player.mental.isolation to Math.min(100, $player.mental.isolation + 2)>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(你的孤立感+2。不欠人情,但也没交到朋友。)// <<elseif _tmpl is "survival">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.2)>> <<set _g2 to Math.round(_ev.intensity * 0.1)>> <</silently>>\ ''你的选择:'' <<link _olab.survival[0][_ov] "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to _olab.survival[0][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.2)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<tag-add "投机者" "micro" 8 "玩家行为" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<set $player.mental.idealism to Math.max(0, $player.mental.idealism - 5)>>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 3)>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(你的理想-5、偏执+3。投机者标签+8。_ev_tag 标签+_g1。活下去比体面重要。)// <<link _olab.survival[1][_ov] "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to _olab.survival[1][_ov]>>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.1)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<set $player.mental.idealism to Math.min(100, $player.mental.idealism + 5)>>\ <<trust-capped "weimar" 3>>\ <<apply-choice-effects _ev.tag "delegate" _ev.intensity>>\ <</link>>\ //(你的理想+5。魏玛信任+3。_ev_tag 标签+_g2。经济损失,但守住了自己。)// <<link _olab.survival[2][_ov] "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to _olab.survival[2][_ov]>>\ <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - 3)>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(你的疲惫-3。没有得失,但自我认同在消磨。)// <<elseif _tmpl is "passive_resistance">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.3)>> <<set _g2 to Math.round(_ev.intensity * 0.15)>> <<set _g3 to Math.round(_ev.intensity * 0.4)>> <</silently>>\ ''你的政策:'' <<link "全力推行消极抵抗" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "全力推行消极抵抗">>\ <<set $flags.passive_resistance to "full">>\ <<tag-add "民族屈辱" "micro" `Math.round(_ev.intensity * 0.3)` "政治" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<weimar-tension-gain 2>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(印钞机转起来,通胀每天额外+1.5。民族屈辱标签+_g1。民族尊严和工人支持上升,法国人拿不到煤。)// <<link "有限抵抗" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "有限抵抗">>\ <<set $flags.passive_resistance to "limited">>\ <<tag-add "经济压力" "micro" `Math.round(_ev.intensity * 0.15)` "经济" "spd" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "delegate" _ev.intensity>>\ <</link>>\ //(通胀每天额外+0.8。经济压力标签+_g2。两边都不满,但面子保住了一点。)// <<link "拒绝抵抗,谋求谈判" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "拒绝抵抗,谋求谈判">>\ <<set $flags.passive_resistance to "none">>\ <<tag-add "民族屈辱" "micro" `Math.round(_ev.intensity * 0.4)` "政治" "dnvp" _ev.id>>\ <<set $active_tags to $ret>>\ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 8)>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(魏玛焦虑+8。民族屈辱标签+_g3。被骂投降派、民族愤怒大涨,但保住经济不印钞。)// <<elseif _tmpl is "promise">>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "许诺")>> <<set _pe_party to (_ev.party_name ? _ev.party_name : "KPD")>> <<set _pe_tk to (_ev.trust_key ? _ev.trust_key : "kpd")>> <</silently>>\ <div class="promise-box"> <span class="promise-tag">⚜ 许诺 · 对方握着你的承诺</span> $this_promise_hint </div> ''你的抉择:'' <<link "履行承诺。答应过的事,就做到。" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "履行承诺">>\ <<promise-event-resolve _ev "fulfill">>\ <</link>>\ //(_pe_party 信任+8。你守住了自己说的话。)// <<link "违背承诺。装作这件事不存在。" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "违背承诺">>\ <<promise-event-resolve _ev "break">>\ <</link>>\ //(_pe_party 信任大降。你出了事,却不认账——这比一开始就拒绝更伤他。)// <<else>>\ <<silently>> <<set _ev_tag to (_ev.tag ? _ev.tag : "局势")>> <<set _g1 to Math.round(_ev.intensity * 0.2)>> <</silently>>\ ''你的处理:'' <<link "认真处理" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "认真处理">>\ <<tag-add _ev.tag "micro" `Math.round(_ev.intensity * 0.2)` _ev.tag "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "sign" _ev.intensity>>\ <</link>>\ //(_ev_tag 标签+_g1。事情会有进展,但矛盾也可能激化。)// <<link "搁置一旁" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "搁置一旁">>\ <<tag-add "拖延者" "micro" 5 "玩家行为" "weimar" _ev.id>>\ <<set $active_tags to $ret>>\ <<apply-choice-effects _ev.tag "delay" _ev.intensity>>\ <</link>>\ //(拖延者标签+5。问题继续发酵。你争取了时间,但时间在魏玛是最贵的东西。)//\ <</if>>\ <</widget>> /* ---------- apply-red-fx:应用红色事件订制选项的手写效果 ---------- 用法:<<apply-red-fx _effects>> 结果存入 $choice_effects_summary 支持键:政党(spd/kpd/ddp/dvp/zentrum/dnvp/nsdap/army)、 世界(economy/inflation/social_anger/nationalism/gov_trust/army_influence/revolution/political_violence/intl_trust)、 个人(idealism/fatigue/isolation/paranoia)、标签(insider/observer) */ <<widget "apply-red-fx">>\ <<silently>> <<set _fx to $args[0]>> <<set _eid to $args[1] ? $args[1] : "red">> /* SugarCube 宏参数里直接写 `{a:1, b:2}` 会按空格/逗号拆成多个字符串参数, 此处若 _fx 是字符串,则从 $args 重组成一个真正的对象(一处修复,全局生效)。 */ <<run (function(){ if (typeof _fx === 'string') { var args = $args; var srcParts = [], eid = null; for (var i = 0; i < args.length; i++) { srcParts.push(args[i]); if (String(args[i]).indexOf('}') !== -1) { eid = args[i+1]; break; } } if (srcParts.length > 0) { try { var obj = new Function('return (' + srcParts.join(' ') + ')')(); if (obj && typeof obj === 'object') { _fx = obj; } } catch(e){} } if (eid !== null) { _eid = eid; } } })()>> <<set _parts to []>> /* 捕获本次选项对 SPD / DDP 的信任增量(供 party-supervise 监督评议使用) */ <<set $file_spd_delta to _fx.spd ? _fx.spd : 0>> <<set $file_ddp_delta to _fx.ddp ? _fx.ddp : 0>> <<set $file_dvp_delta to _fx.dvp ? _fx.dvp : 0>> /* 全派系增量捕获:结算页 party-review-loop 逐势力点评用 */ <<set $file_party_deltas to {}>> <<set _fpk to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]>> <<for _fpi to 0; _fpi lt _fpk.length; _fpi++>> <<if _fx[_fpk[_fpi]]>><<set $file_party_deltas[_fpk[_fpi]] to _fx[_fpk[_fpi]]>><</if>> <</for>> /* 每批选择开新账:清记仇账与信任实际到账账本 */ <<rival-cost-reset>> <<set $trust_act_log to []>> <<set _names to { spd:"SPD信任", kpd:"KPD信任", ddp:"DDP信任", dvp:"DVP信任", zentrum:"Zentrum信任", dnvp:"DNVP信任", nsdap:"NSDAP信任", army:"军方信任", economy:"经济压力", inflation:"通胀", social_anger:"社会愤怒", political_violence:"政治暴力", nationalism:"民族主义", revolution:"革命压力", gov_trust:"政府信任", army_influence:"军方影响", intl_trust:"国际信任", middle_confidence:"中产信心", fiscal:"财政赤字", idealism:"理想", fatigue:"疲惫", isolation:"孤立感", paranoia:"偏执", insider:"知情者", observer:"观察者" }>> <<set _ekeys to Object.keys(_fx)>> /* 记仇并账底册:每个党的行号(-1=尚无行)与当前净值 */ <<set _pidx to {}>> <<set _pval to {}>> <<for _pi to 0; _pi lt _fpk.length; _pi++>> <<set _pidx[_fpk[_pi]] to -1>> <<set _pval[_fpk[_pi]] to 0>> <</for>> <<for _fi to 0; _fi lt _ekeys.length; _fi++>> <<set _k to _ekeys[_fi]>> <<set _v to _fx[_k]>> <<set _label to (_names[_k] ? _names[_k] : _k)>> <<if _k eq "spd" or _k eq "kpd" or _k eq "ddp" or _k eq "dvp" or _k eq "zentrum" or _k eq "dnvp" or _k eq "nsdap" or _k eq "army">> /* 红色事件=国家大事通道:不设每日上限,但统一走闸门(钳制0-100+零和记仇+实际值记账) */ <<trust-capped _k _v "big">> /* 钳制边角:信任已满/已空时实际到账≠设计值,摘要按实际值显示 */ <<set _v to Number($affinity_actual) || 0>> <<elseif _k eq "intl_trust">> <<run (function(){ var before = State.variables.weimar.mid.intl_trust || 0; State.variables.weimar.mid.intl_trust = Math.max(0, Math.min(100, before + _v)); /* 实际增量回写 _v 供摘要显示;drip 效果会把存量磨成分数,取一位小数防漂浮点尾巴 */ _v = Math.round((State.variables.weimar.mid.intl_trust - before) * 10) / 10; })()>> <<elseif _k eq "idealism" or _k eq "fatigue" or _k eq "isolation" or _k eq "paranoia">> <<run (function(){ var key = _k; var before = State.variables.player.mental[key] || 0; State.variables.player.mental[key] = Math.max(0, Math.min(100, before + _v)); _v = Math.round((State.variables.player.mental[key] - before) * 10) / 10; })()>> <<elseif _k eq "insider" or _k eq "observer">> <<tag-add `( _k eq "insider" ? "知情者" : "观察者" )` "micro" _v "玩家行为" "weimar" _eid>> <<set $active_tags to $ret>> <<else>> <<run (function(){ var key = _k; var before = State.variables.world[key] || 0; State.variables.world[key] = Math.max(0, Math.min(100, before + _v)); _v = Math.round((State.variables.world[key] - before) * 10) / 10; })()>> <</if>> <<if _v gt 0>> <<set _parts.push(_label + " +" + _v)>> <<if _fpk.includes(_k)>><<set _pidx[_k] to _parts.length - 1>><<set _pval[_k] to _v>><</if>> <<elseif _v lt 0>> <<set _parts.push(_label + " " + _v)>> <<if _fpk.includes(_k)>><<set _pidx[_k] to _parts.length - 1>><<set _pval[_k] to _v>><</if>> <</if>> <</for>> /* 零和记仇并入对应党的那一行(同一党只出现一次,以净值为准;无原行的追加新行)。 来由标注:玩家能看懂这行里哪部分是「此事传开」的记仇账(2026-10-09) */ <<if $rival_costs and $rival_costs.length gt 0>> <<for _rci to 0; _rci lt $rival_costs.length; _rci++>> <<set _rc to $rival_costs[_rci]>> <<set _rc_label to (_names[_rc.party] ? _names[_rc.party] : _rc.party)>> <<if _pidx[_rc.party] gte 0>> <<set _rc_net to (_pval[_rc.party] || 0) + _rc.delta>> <<set _parts[_pidx[_rc.party]] to _rc_label + " " + (_rc_net gt 0 ? "+" + _rc_net : _rc_net) + "(含此事传开 " + _rc.delta + ")">> <<set _pval[_rc.party] to _rc_net>> <<else>> <<set _parts.push(_rc_label + " " + (_rc.delta gt 0 ? "+" + _rc.delta : _rc.delta) + "(此事传开)")>> <</if>> <</for>> <</if>> <<set $choice_effects_summary to _parts.length gt 0 ? _parts.join(",") : "无显著变化">> /* 摘要即实际值:party 键由 trust-capped 写真实到账(顶格截断不算数), world/intl_trust/mental 键在钳制后把实际增量回写 _v(2026-10-09); 销掉两本账,避免结果页 trust-act-note / rival-note-show 重复显示 */ <<set $trust_act_log to []>> <<set $rival_costs to []>> <<set $rival_note to "">> <</silently>>\ <</widget>> /* ---------- red-opts-init:红色/暗涌事件选项数据表(治理路线 v2) ---------- 手动渲染(render-red-custom-options 的表驱动分支)与跳天托管(route-resolve 分支B) 共用同一份数据:$red_opts[事件ID]=选项数组,$red_prompts[事件ID]=题干。 选项字段:label=选项文字 / action=sign|delegate|delay(反馈三向映射) / fx=数值对象(apply-red-fx) / axis=光谱标(GM温和改良 SM国家强势 LE左翼激进 RE右翼激进 OP机会主义 AP消极逃避;可组合如 "SM LE") / msg1=选项专属第一段反馈(可省) / flag=旗标副作用对象(可省) / note=数值注记 / cmt=后果提示。 改表即同时改两条路径——手动游玩与跳天托管永远殊途同归。 */ <<widget "red-opts-init">>\ <<set $red_opts to { R01: [ {label:"签署动员令,实施全面消极抵抗", action:"sign", axis:"SM", fx:{nationalism:6, economy:4, inflation:3, gov_trust:-2, spd:2, army:-2, fatigue:5}, note:"民族尊严 +6|经济压力 +4|通胀 +3|政府信任 -2|SPD信任 +2|军队信任 -2|疲惫 +5", cmt:"签署全面消极抵抗,等于公开拒绝承认占领。鲁尔工人会得到支持,但补贴只能靠印钞维持,财政缺口和通胀都会继续扩大。军方是否愿意承担长期消耗,也成了未知数。"}, {label:"召见法国大使,提出强硬抗议", action:"sign", axis:"RE", msg1:"你召见了法国使馆参赞,递交抗议照会。对方未作争辩,仅在结束时询问:「贵国打算何时恢复对法煤炭供应?」你未予答复。", fx:{nationalism:4, intl_trust:-3, gov_trust:2, dnvp:3, political_violence:2}, note:"民族主义 +4|国际信任 -3|政府信任 +2|DNVP信任 +3|政治暴力 +2", cmt:"强硬抗议能安抚国内情绪,却改变不了法比两国的立场。赔款与占领问题仍会拖延,外交部今后的回旋余地也会更小。"}, {label:"起草照会,启动外交谈判", action:"delegate", axis:"GM OP", fx:{intl_trust:3, gov_trust:2, economy:-2, ddp:3, dvp:2, nationalism:-2}, note:"国际信任 +3|政府信任 +2|经济压力 -2|DDP信任 +3|DVP信任 +2|民族主义 -2", cmt:"启动谈判,外部压力或许能稍有缓和。但在柏林,主张谈判的人很容易被说成投降;右翼不会放过这个把柄,政府在国内要付的政治代价恐怕更大。"}, {label:"秘密联络工会,策动鲁尔罢工", action:"sign", axis:"LE", msg1:"你绕开外交部,经非正式渠道向工会传话:柏林支持鲁尔工人的抵抗。工会方面未公开回应,但表示已知悉。", fx:{spd:4, kpd:2, social_anger:-3, economy:3, fatigue:4}, note:"SPD信任 +4|KPD信任 +2|社会愤怒 -3|经济压力 +3|疲惫 +4", cmt:"工会若肯接手,鲁尔抵抗会更有组织,占领方也会多一层压力。只是这种联系一旦走漏,政府就再难假装置身事外,冲突升级时也没有退路。"}, {label:"暂缓表态,观望局势发展", action:"delay", axis:"AP", fx:{economy:3, inflation:3, gov_trust:-3, nationalism:2, fatigue:-2}, note:"经济压力 +3|通胀 +3|政府信任 -3|民族主义 +2|疲惫 -2", cmt:"不表态能暂时避开抉择,局势却不会因此停下来。等柏林想开口时,鲁尔和市场的局面都已经变了。"} ], R02: [ {label:"全力推行,增发货币补贴工人", action:"sign", axis:"SM LE", flag:{passive_resistance:"full"}, fx:{spd:3, dvp:2, inflation:5, economy:4, nationalism:3}, note:"SPD信任 +3|DVP信任 +2|通胀 +5|经济压力 +4|民族主义 +3", cmt:"国会的要求得到执行,鲁尔工人也能继续拿到补贴。代价是钞票越印越多,通胀压力迅速抬头,财政部很快会再次要求追加拨款。"}, {label:"有限抵抗,控制补贴规模", action:"sign", axis:"OP", flag:{passive_resistance:"limited"}, msg1:"补贴令照发,但数额被压到最低一档:只保铁路和邮员工的最低口粮,其余申请一律缓议。财政部连夜重核了账目,鲁尔的厂主抱怨柏林给得太少。印钞机没有停,只是转得慢了些。", fx:{spd:2, dvp:1, inflation:3, economy:2, gov_trust:1}, note:"SPD信任 +2|DVP信任 +1|通胀 +3|经济压力 +2|政府信任 +1", cmt:"有限抵抗能让财政喘一口气,却喂不饱鲁尔,也堵不住右翼的嘴。工人嫌少,民族派嫌软,政策夹在中间,勉强维持。"}, {label:"仅援助工人,不承认为正式政策", action:"delegate", axis:"GM", fx:{spd:2, kpd:1, inflation:2, gov_trust:1, insider:3}, note:"SPD信任 +2|KPD信任 +1|通胀 +2|政府信任 +1|知情者 +3", cmt:"工人能得到一些援助,政府却不必公开背上政策责任。只是这种遮遮掩掩瞒不了太久,工会和右翼都会看出柏林的犹豫。"}, {label:"拒绝抵抗,直接寻求谈判", action:"delay", axis:"RE", flag:{passive_resistance:"none"}, fx:{dnvp:3, dvp:2, inflation:-2, nationalism:-3, gov_trust:2}, note:"DNVP信任 +3|DVP信任 +2|通胀 -2|民族主义 -3|政府信任 +2", cmt:"拒绝抵抗会招来投降派的骂名,右翼和民族团体不会善罢甘休。好处是财政少一个无底洞,马克也许能少受一点冲击。"}, {label:"拖延表决,交由国会自行争论", action:"delay", axis:"AP", fx:{inflation:3, gov_trust:-2, social_anger:2, fatigue:-2}, note:"通胀 +3|政府信任 -2|社会愤怒 +2|疲惫 -2", cmt:"政府暂时不用表态,国会却会陷入争吵。各党都想把责任推给别人,决议迟迟出不了门,鲁尔的事也就继续悬着。"} ], R03: [ {label:"追加补贴,安抚工人", action:"sign", axis:"GM", fx:{spd:4, social_anger:-3, gov_trust:2, inflation:2}, note:"SPD信任 +4|社会愤怒 -3|政府信任 +2|通胀 +2", cmt:"补贴能稍稍安抚工人,也让政府显得没有抛弃鲁尔。但每一笔补偿都来自新印的钞票,通胀会继续加重,普通人的日子更难过。"}, {label:"调军队进驻,维持秩序", action:"sign", axis:"SM", msg1:"你调一个营进入鲁尔。军列随后开入埃森,街头障碍被清除,现场血迹亦被处理。秩序得以恢复,但军队的存在使工人区气氛紧张。", fx:{army:4, political_violence:3, social_anger:3, spd:-3, gov_trust:1}, note:"军队信任 +4|政治暴力 +3|社会愤怒 +3|SPD信任 -3|政府信任 +1", cmt:"军队能恢复街面秩序,却会让工人区把柏林看成占领者的一边。埃森的伤亡尚未平息,政府与工人之间的裂痕会更深。"}, {label:"派调查团,查明真相", action:"delegate", axis:"OP", fx:{ddp:3, gov_trust:2, social_anger:-1, insider:3}, note:"DDP信任 +3|政府信任 +2|社会愤怒 -1|知情者 +3", cmt:"调查团能给外界一个交代,也能把责任推向法军。但真相需要时间,街头的愤怒等不了那么久。"}, {label:"扶持工会,扩大抗争", action:"sign", axis:"LE", msg1:"你未采取安抚措施,而是通过非正式渠道向工会抗争基金提供资金。罢工随后从埃森扩散至邻近矿区,传单出现新的动员口号。", fx:{kpd:4, spd:2, social_anger:4, political_violence:3, revolution:2}, note:"KPD信任 +4|SPD信任 +2|社会愤怒 +4|政治暴力 +3|革命压力 +2", cmt:"工会拿到资金后,罢工可能从埃森蔓延到邻近矿区。抵抗会更有力,也会更难收场,政府迟早要面对失控的风险。"}, {label:"封锁消息,暂不回应", action:"delay", axis:"AP", fx:{social_anger:4, gov_trust:-2, observer:3}, note:"社会愤怒 +4|政府信任 -2|观察者 +3", cmt:"封锁消息能拖过一时,却挡不住伤亡数字流传。工人和舆论不会因为柏林沉默就忘记埃森。"} ], R04: [ {label:"官方声援,将其塑造为民族英雄", action:"sign", axis:"RE", fx:{nationalism:5, dnvp:4, nsdap:3, intl_trust:-3, political_violence:2}, note:"民族主义 +5|DNVP信任 +4|NSDAP信任 +3|国际信任 -3|政治暴力 +2", cmt:"官方声援会让他从被告变成民族象征,右翼自然乐见其成。政府也会被卷入这套叙事,日后想降温就不容易了。"}, {label:"秘密外交营救,低调向法国施压", action:"delegate", axis:"GM", fx:{intl_trust:2, gov_trust:2, ddp:2, insider:3, nationalism:-2}, note:"国际信任 +2|政府信任 +2|DDP信任 +2|知情者 +3|民族主义 -2", cmt:"秘密营救能避免公开冲突,也不至于让外交彻底撕破脸。但右翼不会因为政府低调就停止宣传,人还在拘留所里,事件仍会继续发酵。"}, {label:"冷处理,避免成为全国焦点", action:"delay", axis:"AP", fx:{nationalism:-3, dnvp:-2, gov_trust:1, social_anger:2, observer:3}, note:"民族主义 -3|DNVP信任 -2|政府信任 +1|社会愤怒 +2|观察者 +3", cmt:"冷处理能让政府暂时脱身,却未必能让公众忘记这个人。右翼正需要一名受难者,柏林的沉默反而给了他们宣传空间。"}, {label:"经中间人传话,暗中安抚右翼", action:"delegate", axis:"OP", fx:{dnvp:2, nsdap:2, gov_trust:-2, intl_trust:-2, insider:2}, note:"DNVP信任 +2|NSDAP信任 +2|政府信任 -2|国际信任 -2|知情者 +2", cmt:"中间人传话能暂时稳住右翼,避免他们立刻把事闹大。但政府没有给出实质承诺,右翼也不会真正收手。"}, {label:"抢先于右翼,将其叙述为共和国受难者", action:"sign", axis:"LE", fx:{spd:2, nationalism:-3, dnvp:-3, nsdap:-2, social_anger:2}, note:"SPD信任 +2|民族主义 -3|DNVP信任 -3|NSDAP信任 -2|社会愤怒 +2", cmt:"政府想抢先定义他的牺牲,把右翼的叙事压下去。可他的经历和立场摆在那里,共和国很难把他完全说成自己的人。"} ], R05: [ {label:"宣布全国哀悼,亲自出席葬礼", action:"sign", axis:"RE", fx:{nationalism:7, dnvp:5, nsdap:4, intl_trust:-4, gov_trust:-2}, note:"民族主义 +7|DNVP信任 +5|NSDAP信任 +4|国际信任 -4|政府信任 -2", cmt:"全国哀悼能显示政府的态度,却也会把葬礼变成右翼的动员场。政府越是隆重,越容易替对方把殉道者形象坐实。"}, {label:"仅发官方声明,不参与纪念活动", action:"delegate", axis:"GM", fx:{gov_trust:2, ddp:2, intl_trust:1, nationalism:-2, dnvp:-2}, note:"政府信任 +2|DDP信任 +2|国际信任 +1|民族主义 -2|DNVP信任 -2", cmt:"官方声明能表明立场,又不至于让政府直接卷入纪念活动。但右翼仍会自行组织悼念,政府缺席并不能阻止他们借题发挥。"}, {label:"压制右翼借机煽动的集会", action:"sign", axis:"SM", msg1:"你签署集会禁令。慕尼黑与杜塞尔多夫的广场随即被警察封锁,公开讲演无法举行。右翼改为手抄传单,在酒馆等场所继续传播。", fx:{dnvp:-4, nsdap:-3, political_violence:3, social_anger:3, gov_trust:-2}, note:"DNVP信任 -4|NSDAP信任 -3|政治暴力 +3|社会愤怒 +3|政府信任 -2", cmt:"禁令能压住公开集会,短期内维持街面秩序。可右翼会转入酒馆和地下传单,镇压本身也会成为他们宣传的一部分。"}, {label:"暗中资助遗属,安抚相关群体", action:"delegate", axis:"OP", fx:{social_anger:-2, insider:3, nationalism:-1, dnvp:1, gov_trust:1}, note:"社会愤怒 -2|知情者 +3|民族主义 -1|DNVP信任 +1|政府信任 +1", cmt:"资助遗属能缓和家属处境,也能让政府留一点人情。但这件事不能公开,右翼仍可继续把他塑造成被共和国抛弃的人。"}, {label:"将其收编为共和国的民族象征", action:"sign", axis:"LE", fx:{nationalism:-4, dnvp:-4, nsdap:-3, spd:3, gov_trust:2}, note:"民族主义 -4|DNVP信任 -4|NSDAP信任 -3|SPD信任 +3|政府信任 +2", cmt:"政府想用共和国名义收编他,以此压过右翼的纪念。可他生前反对共和国,这种收编很难让人信服,反而可能招来嘲笑。"} ], S01: [ {label:"倾力镇压,封锁铁路线", action:"sign", axis:"SM", fx:{army:4, social_anger:3, political_violence:3, revolution:-4, spd:-3, gov_trust:1}, note:"军方信任 +4|社会愤怒 +3|政治暴力 +3|革命压力 -4|SPD信任 -3|政府信任 +1", cmt:"封锁铁路可切断罢工扩散,但也会激化工人与政府的对立,冲突可能进一步升级。"}, {label:"分批谈判,分化各城", action:"delegate", axis:"OP", fx:{spd:3, kpd:1, political_violence:-2, revolution:-2, fatigue:4, gov_trust:2}, note:"SPD信任 +3|KPD信任 +1|政治暴力 -2|革命压力 -2|疲惫 +4|政府信任 +2", cmt:"分批谈判可分化罢工阵营,争取时间,但各地诉求不一,谈判过程可能漫长且反复。"}, {label:"顺应部分诉求,增发救济", action:"delegate", axis:"GM LE", fx:{spd:4, social_anger:-3, economy:4, inflation:3, revolution:-2, gov_trust:1}, note:"SPD信任 +4|社会愤怒 -3|经济压力 +4|通胀 +3|革命压力 -2|政府信任 +1", cmt:"增发救济可缓和部分工人情绪,但财政支出增加,货币增发也会进一步推高通胀。"} ], S02: [ {label:"援引第48条,全国戒严", action:"sign", axis:"SM", fx:{army:4, gov_trust:-3, political_violence:4, revolution:-5, social_anger:3}, note:"军方信任 +4|政府信任 -3|政治暴力 +4|革命压力 -5|社会愤怒 +3", cmt:"全国戒严可迅速压制起义,但也会使共和国进一步依赖紧急权力,宪政秩序受到侵蚀。"}, {label:"集中打击汉堡,其余怀柔", action:"sign", axis:"OP GM", msg1:"你将可调部队集中调往汉堡,其余城市的谈判代表则收到延期答复。汉堡街垒被攻破,其他城市仍在谈判。", fx:{army:3, political_violence:3, revolution:-3, spd:2, social_anger:2, gov_trust:1}, note:"军方信任 +3|政治暴力 +3|革命压力 -3|SPD信任 +2|社会愤怒 +2|政府信任 +1", cmt:"集中打击汉堡可震慑其他城市,但怀柔与镇压并行,双方都会记下这笔账,政府信誉可能受损。"}, {label:"承认部分工人政府", action:"delegate", axis:"LE", fx:{spd:4, kpd:3, revolution:3, nationalism:4, dnvp:-3, gov_trust:-2}, note:"SPD信任 +4|KPD信任 +3|革命压力 +3|民族主义 +4|DNVP信任 -3|政府信任 -2", cmt:"承认萨克森工人政府可换取部分城市停火,但右翼会指责共和国向革命屈服,政府将失去部分中间派支持。"} ], S03: [ {label:"调兵平叛,收复慕尼黑", action:"sign", axis:"SM", fx:{army:-3, dnvp:-3, nsdap:-3, political_violence:4, revolution:-2, gov_trust:2}, note:"军方信任 -3|DNVP信任 -3|NSDAP信任 -3|政治暴力 +4|革命压力 -2|政府信任 +2", cmt:"调兵平叛可能收复慕尼黑,但军官是否愿意执行命令尚不确定,军队忠诚度将受到考验。"}, {label:"谈判周旋,拖延时间", action:"delegate", axis:"OP", fx:{intl_trust:2, gov_trust:-2, dvp:2, nationalism:2, political_violence:1, fatigue:3}, note:"国际信任 +2|政府信任 -2|DVP信任 +2|民族主义 +2|政治暴力 +1|疲惫 +3", cmt:"谈判可争取时间,但巴伐利亚会利用这段时间巩固事实独立,拖延越久,收复难度越大。"}, {label:"默认现状,稳住其他邦", action:"delegate", axis:"AP", fx:{gov_trust:2, zentrum:2, ddp:2, nationalism:5, intl_trust:-2, revolution:-1}, note:"政府信任 +2|Zentrum信任 +2|DDP信任 +2|民族主义 +5|国际信任 -2|革命压力 -1", cmt:"默认巴伐利亚脱离可避免立即内战,但共和国将失去对巴伐利亚的控制,其他邦也可能效仿。"} ], S04: [ {label:"增兵强攻,彻底清剿", action:"sign", axis:"SM", fx:{army:4, political_violence:5, revolution:-5, social_anger:4, gov_trust:1}, note:"军方信任 +4|政治暴力 +5|革命压力 -5|社会愤怒 +4|政府信任 +1", cmt:"增兵强攻可迅速击溃抵抗,但伤亡会加深萨克森与中央的仇恨,共和国也将付出沉重代价。"}, {label:"谈判解散政府,避免流血", action:"delegate", axis:"GM LE", fx:{spd:4, kpd:2, political_violence:-3, revolution:-2, dnvp:-2, gov_trust:2}, note:"SPD信任 +4|KPD信任 +2|政治暴力 -3|革命压力 -2|DNVP信任 -2|政府信任 +2", cmt:"谈判解散政府可避免流血,但会被右翼指责为软弱,中央权威可能受损。"}, {label:"只清首脑,其余赦免", action:"sign", axis:"OP", msg1:"名单上仅列七人,其余参与者在交出武器后可返回家中。士兵认为命令过软,工人则怀疑其诚意,但未再发生交火。", fx:{army:3, political_violence:3, revolution:-3, spd:2, social_anger:2, gov_trust:1}, note:"军方信任 +3|政治暴力 +3|革命压力 -3|SPD信任 +2|社会愤怒 +2|政府信任 +1", cmt:"只惩首脑可分化抵抗者,减少流血,但军方与工人都可能对政府的处理方式不满。"} ], S05: [ {label:"清洗军方,整肃总参谋部", action:"sign", axis:"SM LE", fx:{army:-5, dnvp:-3, political_violence:4, army_influence:-5, gov_trust:2}, note:"军方信任 -5|DNVP信任 -3|政治暴力 +4|军方影响 -5|政府信任 +2", cmt:"清洗军方可能削弱巴伐利亚在军中的支持,但也会引发军队内部动荡,国防军对政府的忠诚可能进一步下降。"}, {label:"公开谴责,施压巴伐利亚", action:"delegate", axis:"GM", msg1:"声明通令各邦:中央绝不承认私相授受的联盟,慕尼黑必须给出交代。各邦回电大多含糊,只有两封明确站在柏林一边。声明见报当晚,两边的报纸都换了更硬的标题。", fx:{intl_trust:2, gov_trust:2, ddp:2, nationalism:3, political_violence:2, fatigue:3}, note:"国际信任 +2|政府信任 +2|DDP信任 +2|民族主义 +3|政治暴力 +2|疲惫 +3", cmt:"公开谴责可表明中央立场,但巴伐利亚未必退让,反而可能加速与军方反对派的联合。"}, {label:"默许结盟,换取时间", action:"delegate", axis:"RE", fx:{nationalism:5, army_influence:3, intl_trust:-2, gov_trust:-2, revolution:-1}, note:"民族主义 +5|军方影响 +3|国际信任 -2|政府信任 -2|革命压力 -1", cmt:"默许结盟可暂时避免冲突,但巴伐利亚与军方的联系将更加稳固,中央日后更难控制局面。"} ], S06: [ {label:"追加担保,强行救市", action:"sign", axis:"SM", fx:{inflation:-4, economy:3, gov_trust:2, social_anger:-2, nationalism:2}, note:"通胀 -4|经济压力 +3|政府信任 +2|社会愤怒 -2|民族主义 +2", cmt:"追加担保可暂时提升新钞信用,但共和国将抵押更多土地与黄金,财政回旋余地进一步缩小。"}, {label:"有限担保,只保工人储蓄", action:"delegate", axis:"GM LE", fx:{spd:3, social_anger:-3, inflation:-2, economy:2, dnvp:-2, gov_trust:1}, note:"SPD信任 +3|社会愤怒 -3|通胀 -2|经济压力 +2|DNVP信任 -2|政府信任 +1", cmt:"只保工人储蓄可争取工人支持,但银行界与右翼会认为政府敌视资本,未来融资可能受阻。"}, {label:"放弃担保,听任市场", action:"delay", axis:"AP", fx:{economy:5, inflation:4, social_anger:5, gov_trust:-5, dnvp:-2}, note:"经济压力 +5|通胀 +4|社会愤怒 +5|政府信任 -5|DNVP信任 -2", cmt:"放弃担保意味着政府不再干预,新钞可能继续贬值,货币体系面临崩溃风险,但政府也避免了进一步消耗家底。"} ], S07: [ {label:"宣布分离为叛国,派兵镇压", action:"sign", axis:"SM", fx:{army:3, political_violence:4, nationalism:3, intl_trust:-5, social_anger:2, army_influence:3}, note:"军队信任 +3|政治暴力 +4|民族主义 +3|国际信任 -5|社会愤怒 +2|军方影响 +3", cmt:"派兵可表明中央维护领土完整的立场,但莱茵兰驻有法比军队,军事行动一旦与占领军发生摩擦,后果难以控制。"}, {label:"不予承认,但避免与法国直接冲突", action:"delegate", axis:"GM", fx:{gov_trust:2, intl_trust:2, nationalism:-2, dvp:-2, dnvp:-2}, note:"政府信任 +2|国际信任 +2|民族主义 -2|DVP信任 -2|DNVP信任 -2", cmt:"不承认可保留法律立场,也避免与法国正面冲突。但分离政权会继续巩固,拖延越久,收回的难度越大。"}, {label:"秘密资助当地反分离团体", action:"delegate", axis:"OP", msg1:"几笔经费以商业往来的名义,经科隆的中间人转到了反分离团体手里。占领区的传单和小报随后多了起来,来源无人认领。外交部提醒:法国的密探不是瞎子。", fx:{insider:3, intl_trust:-2, nationalism:2, dnvp:2, political_violence:2}, note:"知情者 +3|国际信任 -2|民族主义 +2|DNVP信任 +2|政治暴力 +2", cmt:"资助反分离团体可给分离政权制造麻烦,但一旦暴露,法国可能指责柏林破坏占领区秩序,外交上更加被动。"} ], S08: [ {label:"借刺杀案取缔右翼组织", action:"sign", axis:"SM", fx:{dnvp:-4, nsdap:-3, political_violence:-2, army:-3, gov_trust:2, social_anger:2}, note:"DNVP信任 -4|NSDAP信任 -3|政治暴力 -2|军队信任 -3|政府信任 +2|社会愤怒 +2", cmt:"取缔右翼组织可打击其网络,但也会激化右翼仇恨,部分军方人士可能对政府产生不满。"}, {label:"只惩凶,不扩大打击面", action:"delegate", axis:"GM", fx:{gov_trust:1, ddp:2, political_violence:1, dnvp:1}, note:"政府信任 +1|DDP信任 +2|政治暴力 +1|DNVP信任 +1", cmt:"只惩凶可避免局势进一步激化,但右翼组织网络不会被触动,类似事件仍可能发生。"}, {label:"强化共和国保护法,扩大政府权限", action:"sign", axis:"SM OP", fx:{ddp:-2, spd:2, gov_trust:3, army:-2}, note:"DDP信任 -2|SPD信任 +2|政府信任 +3|军队信任 -2", cmt:"强化保护法可给政府更多工具对付右翼,但扩大权限也会招致左翼和自由派警惕,认为政府正在走向专制。"} ], S09: [ {label:"默许军方秘密准备,以备不时之需", action:"sign", axis:"RE", fx:{army:4, army_influence:3, intl_trust:-3, dnvp:2, gov_trust:-2}, note:"军队信任 +4|军方影响 +3|国际信任 -3|DNVP信任 +2|政府信任 -2", cmt:"默许可为未来国防留一手,但一旦被协约国发现,法国可能以此为借口扩大制裁,外交后果严重。"}, {label:"要求军方停止,避免外交危机", action:"delegate", axis:"GM", fx:{army:-4, army_influence:-2, ddp:3, intl_trust:2, gov_trust:1}, note:"军队信任 -4|军方影响 -2|DDP信任 +3|国际信任 +2|政府信任 +1", cmt:"要求停止可避免外交危机,但军方会认为政府束缚国防,军民关系可能进一步紧张。"}, {label:"将秘密组织收编为政府控制下的准军事力量", action:"delegate", axis:"OP", msg1:"收编令没有公开文本。名册由国防部接管,经费改走农垦公司的账目,人员一律以劳工名义造册。在账面上,他们只是垦荒的工人。", fx:{army:2, insider:2, intl_trust:-2, gov_trust:1, dvp:2}, note:"军队信任 +2|知情者 +2|国际信任 -2|政府信任 +1|DVP信任 +2", cmt:"收编可让政府掌握这支力量,但秘密武装一旦曝光,协约国仍会追究,且收编过程可能引发军方抵制。"} ], S10: [ {label:"强制征粮,稳定城市供应", action:"sign", axis:"SM", fx:{social_anger:4, spd:-2, economy:-2, political_violence:3, gov_trust:-2}, note:"社会愤怒 +4|SPD信任 -2|经济压力 -2|政治暴力 +3|政府信任 -2", cmt:"强制征粮可暂时稳住城市供应,但会激化农村与政府的对立,农民可能进一步拒绝出售甚至武装抵抗。"}, {label:"提高农产品价格,安抚农民", action:"delegate", axis:"GM OP", fx:{inflation:3, spd:-1, dvp:2, social_anger:-2, economy:1}, note:"通胀 +3|SPD信任 -1|DVP信任 +2|社会愤怒 -2|经济压力 +1", cmt:"提高价格可鼓励农民出售,但城市食品价格也会上涨,工人生活更加困难,罢工风险上升。"}, {label:"允许地方自行协商,中央不介入", action:"delay", axis:"AP", fx:{gov_trust:-2, insider:2, economy:2, social_anger:1}, note:"政府信任 -2|知情者 +2|经济压力 +2|社会愤怒 +1", cmt:"地方协商可减轻中央压力,但各地情况不一,城市供应能否稳定难以保证,中央也可能失去对粮食分配的控制。"} ], S11: [ {label:"立即清洗涉嫌军官", action:"sign", axis:"SM", fx:{army:-5, army_influence:-3, political_violence:2, spd:2, dnvp:-3, gov_trust:-1}, note:"军队信任 -5|军方影响 -3|政治暴力 +2|SPD信任 +2|DNVP信任 -3|政府信任 -1", cmt:"清洗可迅速消除隐患,但也会震动军队,部分军官可能认为政府敌视军方,忠诚度进一步下降。"}, {label:"只调离核心人物,避免震荡", action:"delegate", axis:"OP", fx:{army:-1, insider:3, gov_trust:1, ddp:1}, note:"军队信任 -1|知情者 +3|政府信任 +1|DDP信任 +1", cmt:"调离核心人物可降低政变风险,又避免大规模清洗,但其他参与者可能继续活动,隐患未必根除。"}, {label:"派密探渗透,搜集更多证据", action:"delay", axis:"AP", fx:{insider:4, army:-1, gov_trust:1, fatigue:2}, note:"知情者 +4|军队信任 -1|政府信任 +1|疲惫 +2", cmt:"渗透可掌握更多证据,但政变密谋不会因监视而停止,若行动迟缓,可能错失处置时机。"} ], S12: [ {label:"全盘接受,换取占领结束", action:"sign", axis:"GM", fx:{intl_trust:4, nationalism:-4, dnvp:-4, nsdap:-3, gov_trust:-2, economy:-2}, note:"国际信任 +4|民族主义 -4|DNVP信任 -4|NSDAP信任 -3|政府信任 -2|经济压力 -2", cmt:"接受可换取协约国缓和制裁,但国内右翼会指责政府投降,民族主义情绪可能进一步高涨。"}, {label:"拒绝接受,坚持抵抗", action:"sign", axis:"RE", msg1:"照会原件退了回去,附言只有一行:德国不接受最后通牒。当晚电台把这句话播了三遍。次日,比利时方面的煤炭装运配额再次下调,海关的禁运清单厚了一倍。", fx:{nationalism:5, dnvp:3, intl_trust:-5, economy:4, inflation:2}, note:"民族主义 +5|DNVP信任 +3|国际信任 -5|经济压力 +4|通胀 +2", cmt:"拒绝可表明政府立场,但协约国可能扩大制裁,法比军队也可能采取更严厉行动,经济压力进一步加大。"}, {label:"提出反方案,争取英国支持", action:"delegate", axis:"OP", msg1:"反方案连夜起草:以分期偿付换制裁缓期,再请英国出面担保。文件经伦敦的银行家递了出去,回音还要等上几周。在那之前,煤炭照运,制裁照旧,没有谁先让步。", fx:{intl_trust:2, ddp:2, dvp:2, insider:2, economy:1}, note:"国际信任 +2|DDP信任 +2|DVP信任 +2|知情者 +2|经济压力 +1", cmt:"提出反方案可争取外交回旋空间,但英国是否支持尚不确定,协约国内部立场也不一致,谈判可能拖延。"} ], S13: [ {label:"加强新闻审查,查封煽动性报纸", action:"sign", axis:"SM", fx:{social_anger:2, ddp:-3, spd:-2, gov_trust:2, political_violence:1}, note:"社会愤怒 +2|DDP信任 -3|SPD信任 -2|政府信任 +2|政治暴力 +1", cmt:"加强审查可暂时压制煽动性报道,但会被新闻界和自由派指责侵犯新闻自由,左右翼都可能借此攻击政府。"}, {label:"依法起诉个别报纸,不全面管制", action:"delegate", axis:"GM", fx:{ddp:2, gov_trust:1, insider:2}, note:"DDP信任 +2|政府信任 +1|知情者 +2", cmt:"依法起诉可表明政府按法律行事,避免全面管制的指责。但诉讼过程较长,舆论攻击不会因此停止,被告也可能借法庭扩大影响。"}, {label:"不干预,任由舆论自行争论", action:"delay", axis:"AP", fx:{gov_trust:-2, insider:1, ddp:1}, note:"政府信任 -2|知情者 +1|DDP信任 +1", cmt:"不干预可避免政府与新闻界直接冲突,但泄密与煽动性报道仍会继续,政府权威和外交机密都可能受到损害。"} ], R06: [ {label:"宣布戒严,强制复工", action:"sign", axis:"SM", fx:{army:3, dvp:3, gov_trust:2, social_anger:4, political_violence:3, spd:-3}, note:"军队信任 +3|DVP信任 +3|政府信任 +2|社会愤怒 +4|政治暴力 +3|SPD信任 -3", cmt:"戒严能强行恢复工厂运转,但工人不会因此心服。街面上的秩序回来了,政府与工会之间的对立却更深了。"}, {label:"与工会谈判,承诺改善待遇", action:"delegate", axis:"GM", fx:{spd:4, social_anger:-3, gov_trust:2, economy:2}, note:"SPD信任 +4|社会愤怒 -3|政府信任 +2|经济压力 +2", cmt:"谈判若达成,城市运作可逐步恢复。但改善待遇的承诺需要财政支撑,而政府此时拿不出多少钱,兑现起来会很困难。"}, {label:"压住不动,等罢工自己散", action:"delay", axis:"AP", fx:{economy:3, inflation:3, social_anger:2, gov_trust:-2}, note:"经济压力 +3|通胀 +3|社会愤怒 +2|政府信任 -2", cmt:"政府不介入,罢工或许会自行消退。但停工的损失已经造成,工厂停产越久,恢复越难。"}, {label:"秘密接触工会领袖,分化罢工", action:"delegate", axis:"OP", msg1:"你经秘密渠道约见了几位工会领袖,谈判不在总理府,在一间不起眼的旅馆房间里。对方答应分城劝说工人复工,条件没有落在纸面上;共产党被撇在门外,当晚的传单骂得很难听。", fx:{spd:2, kpd:-2, insider:3, social_anger:-1, gov_trust:-1}, note:"SPD信任 +2|KPD信任 -2|知情者 +3|社会愤怒 -1|政府信任 -1", cmt:"收买工会上层可能分化罢工,但基层工人仍在街头。工会一旦分裂,政府日后更难找到统一的谈判对象。"}, {label:"借罢工危机,宣布第48条紧急状态", action:"sign", axis:"SM RE", fx:{army:3, gov_trust:-2, political_violence:3, revolution:2, dvp:1}, note:"军队信任 +3|政府信任 -2|政治暴力 +3|革命压力 +2|DVP信任 +1", cmt:"借罢工宣布紧急状态,政府可暂时获得更大权力。但紧急权力一旦动用,就会成为惯例,政府今后也更难摆脱对它的依赖。"} ], R07: [ {label:"放手支持,将印信交予其人", action:"sign", axis:"OP RE", fx:{dvp:4, gov_trust:2, intl_trust:2, economy:-2, social_anger:1}, note:"DVP信任 +4|政府信任 +2|国际信任 +2|经济压力 -2|社会愤怒 +1", cmt:"支持他组阁,可尽快结束政府空转。但他能否稳定局势尚难预料,政府也将把命运交到这位新总理手中。"}, {label:"有条件支持,派人入阁监督", action:"delegate", axis:"GM", fx:{dvp:2, zentrum:2, gov_trust:1, insider:2}, note:"DVP信任 +2|Zentrum信任 +2|政府信任 +1|知情者 +2", cmt:"有条件支持可保留影响力,但监督权在国会而不在总理府,实际约束力有限。"}, {label:"压住不签,等待其他人选", action:"delay", axis:"AP", fx:{inflation:3, gov_trust:-2, dvp:-2, social_anger:2}, note:"通胀 +3|政府信任 -2|DVP信任 -2|社会愤怒 +2", cmt:"拖延可争取时间,但局势不等人。愿意接手的人本就不多,再等下去未必有更好选择。"}, {label:"要求其先承诺不碰地租马克方案", action:"delegate", axis:"OP", msg1:"组阁谈判进行到深夜。你让人带话:印信可以交,货币方案一根手指都不能碰。对方没有当场应允,只回了一句「容我考虑」。方案暂时原封不动,组阁却为此多拖了两天。", fx:{dvp:2, zentrum:1, insider:2, intl_trust:1, gov_trust:1, inflation:1}, note:"DVP信任 +2|Zentrum信任 +1|知情者 +2|国际信任 +1|政府信任 +1|通胀 +1", cmt:"要求承诺可暂时保住货币方案,但对方若真心改革,未必会受此约束。"}, {label:"公开支持,但坚持共治", action:"sign", axis:"GM", fx:{dvp:2, spd:2, gov_trust:2, social_anger:-1, insider:1}, note:"DVP信任 +2|SPD信任 +2|政府信任 +2|社会愤怒 -1|知情者 +1", cmt:"公开支持并拉各党共治,可扩大新政府的根基,但共治也意味着决策更慢,责任更分散。"} ], R08: [ {label:"果断终止,接受法国条件", action:"sign", axis:"OP", fx:{inflation:-4, economy:-2, intl_trust:3, dvp:3, nationalism:-4, social_anger:3}, note:"通胀 -4|经济压力 -2|国际信任 +3|DVP信任 +3|民族主义 -4|社会愤怒 +3", cmt:"终止消极抵抗可停止印钞,有助于稳定马克。但鲁尔工人将失去补贴,右翼会借此指责政府抛弃工人。"}, {label:"逐步收缩,给工人安置善后", action:"delegate", axis:"GM", fx:{inflation:-2, spd:3, social_anger:-3, gov_trust:2, economy:2}, note:"通胀 -2|SPD信任 +3|社会愤怒 -3|政府信任 +2|经济压力 +2", cmt:"逐步收缩可减轻对工人的冲击,但过程较慢,财政仍需承担一段时间的补贴支出。"}, {label:"拖着,让抵抗自己断气", action:"delay", axis:"AP", fx:{inflation:3, economy:3, social_anger:2, gov_trust:-2}, note:"通胀 +3|经济压力 +3|社会愤怒 +2|政府信任 -2", cmt:"不明确终止也不继续支持,财政会继续失血,马克的跌势也难以止住。"}, {label:"将终止决定提交国会表决", action:"delegate", axis:"OP", msg1:"你将终止案连同评估报告提交国会程序委员会,表决随后被排入议程。决定被转交出去,总理府暂时不必承担直接责任。", fx:{gov_trust:-2, dvp:1, ddp:2, social_anger:2, insider:1}, note:"政府信任 -2|DVP信任 +1|DDP信任 +2|社会愤怒 +2|知情者 +1", cmt:"提交国会可分担责任,但街头不会因为国会表决就接受既成事实,工人仍会认为政府背弃了他们。"}, {label:"宣布抵抗胜利,体面收场", action:"sign", axis:"RE", fx:{nationalism:3, gov_trust:2, dnvp:2, intl_trust:-2, social_anger:1}, note:"民族主义 +3|政府信任 +2|DNVP信任 +2|国际信任 -2|社会愤怒 +1", cmt:"宣布胜利能保住政府面子,但实际结果是法国人拿走煤炭,工人失去补贴,这种胜利难以让人信服。"} ], R09: [ {label:"签署,并扩大紧急权力", action:"sign", axis:"SM RE", fx:{army:4, dvp:2, gov_trust:-2, political_violence:3, revolution:-2}, note:"军队信任 +4|DVP信任 +2|政府信任 -2|政治暴力 +3|革命压力 -2", cmt:"扩大紧急权力可迅速压制危机,但也会让共和国更加依赖非常手段,未来难以恢复正常宪政。"}, {label:"签署,但限定三个月期限", action:"delegate", axis:"GM", fx:{army:2, ddp:2, gov_trust:2, political_violence:1, revolution:-1}, note:"军队信任 +2|DDP信任 +2|政府信任 +2|政治暴力 +1|革命压力 -1", cmt:"限定期限可防止紧急权力无限期延长,但一旦局势再度紧张,政府仍可能要求续期。"}, {label:"拒绝签署,坚持议会路线", action:"delay", axis:"LE", fx:{spd:3, ddp:3, gov_trust:2, political_violence:3, social_anger:2}, note:"SPD信任 +3|DDP信任 +3|政府信任 +2|政治暴力 +3|社会愤怒 +2", cmt:"拒绝签署可维护议会原则,但紧急状态下政府缺乏应对手段,社会动荡可能继续扩大。"}, {label:"签署,但将监督权交给国会", action:"delegate", axis:"GM", msg1:"你在紧急状态令上签了字,随后把监督条款一并送交国会:动用军警须按月向议会报告。军方联络官全程没有说话,离开时把帽子握在了手里。", fx:{ddp:2, zentrum:2, gov_trust:2, insider:2, army:-1}, note:"DDP信任 +2|Zentrum信任 +2|政府信任 +2|知情者 +2|军队信任 -1", cmt:"国会监督可部分约束紧急权力,但监督机制在实际运作中未必能有效限制政府行动。"}, {label:"签署,借机整顿各州", action:"sign", axis:"SM", fx:{army:3, gov_trust:-1, dnvp:2, revolution:-3, political_violence:2}, note:"军队信任 +3|政府信任 -1|DNVP信任 +2|革命压力 -3|政治暴力 +2", cmt:"借紧急状态整顿各州可加强中央权威,但也会加深联邦与各邦之间的紧张关系。"} ], R10: [ {label:"调兵施压,迫使巴伐利亚服从", action:"sign", axis:"SM", fx:{army:3, gov_trust:2, dnvp:-3, nsdap:-3, political_violence:3}, note:"军队信任 +3|政府信任 +2|DNVP信任 -3|NSDAP信任 -3|政治暴力 +3", cmt:"调兵施压可能迫使巴伐利亚让步,但中央与邦之间的对立会加深,巴伐利亚不会轻易忘记这次压力。"}, {label:"发温和照会,寻求协商", action:"delegate", axis:"GM", fx:{ddp:2, zentrum:2, gov_trust:1, intl_trust:1, nationalism:-1}, note:"DDP信任 +2|Zentrum信任 +2|政府信任 +1|国际信任 +1|民族主义 -1", cmt:"温和照会可保留协商余地,但慕尼黑未必回应,中央的权威也可能被视为软弱。"}, {label:"默认放任,不承认也不反对", action:"delay", axis:"AP", fx:{nationalism:2, gov_trust:-2, social_anger:2, army:1}, note:"民族主义 +2|政府信任 -2|社会愤怒 +2|军队信任 +1", cmt:"默认放任可避免立即冲突,但巴伐利亚会继续扩大自主权,中央对其约束力将进一步下降。"}, {label:"暗中支持巴伐利亚反对派", action:"delegate", axis:"OP", msg1:"一笔来路不明的经费经中间人转入慕尼黑反对派手中。未留下正式文件或回执,资金去向难以追查。", fx:{insider:3, political_violence:2, gov_trust:-1, nationalism:1}, note:"知情者 +3|政治暴力 +2|政府信任 -1|民族主义 +1", cmt:"暗中支持反对派可给巴伐利亚制造麻烦,但事态发展难以控制,一旦暴露,中央将陷入被动。"}, {label:"公开将巴伐利亚定性为叛乱", action:"sign", axis:"SM", msg1:"声明当夜发往各报:慕尼黑的所作所为,自此一律按叛乱论处。巴伐利亚的回文只有一句「柏林无权干涉」。总参谋部没有表态,右翼报纸把这份声明和十一月革命排在了同一个版面上。", fx:{gov_trust:2, dnvp:-3, army:-2, political_violence:3, revolution:2}, note:"政府信任 +2|DNVP信任 -3|军队信任 -2|政治暴力 +3|革命压力 +2", cmt:"公开定性为叛乱可表明中央立场,但也会彻底关闭谈判空间,巴伐利亚可能公开对抗。"} ], R11: [ {label:"派警察包围,逮捕与会者并搜集证据", action:"sign", axis:"SM", fx:{army:2, gov_trust:1, kpd:-4, political_violence:3, revolution:-2}, note:"军队信任 +2|政府信任 +1|KPD信任 -4|政治暴力 +3|革命压力 -2", cmt:"逮捕可阻止会议继续,但也会迫使KPD转入地下,未来行动可能更加隐蔽和激烈。"}, {label:"按兵不动,持续监视", action:"delay", axis:"OP AP", fx:{insider:3, social_anger:2, gov_trust:-1, spd:1}, note:"知情者 +3|社会愤怒 +2|政府信任 -1|SPD信任 +1", cmt:"监视可掌握KPD动向,但无法阻止其组织扩散,其地方网络仍可能继续活动。"}, {label:"通过工会警告其不要轻举妄动", action:"delegate", axis:"GM", fx:{spd:2, kpd:-2, social_anger:-1, insider:2, gov_trust:1}, note:"SPD信任 +2|KPD信任 -2|社会愤怒 -1|知情者 +2|政府信任 +1", cmt:"通过工会传话可能劝退部分人,但并非所有地方组织都会听从,汉堡等地仍有行动风险。"}, {label:"公开谴责,迫使其放弃", action:"sign", axis:"GM", fx:{gov_trust:2, kpd:-2, political_violence:2, social_anger:2}, note:"政府信任 +2|KPD信任 -2|政治暴力 +2|社会愤怒 +2", cmt:"公开谴责可施加舆论压力,但也可能刺激对方为证明决心而采取更激进行动。"}, {label:"将消息泄露给右翼报纸,借第三方施压", action:"delegate", axis:"RE OP", fx:{dnvp:2, nsdap:2, insider:2, political_violence:3, gov_trust:-2}, note:"DNVP信任 +2|NSDAP信任 +2|知情者 +2|政治暴力 +3|政府信任 -2", cmt:"向右翼报纸泄露消息可借其手打击KPD,但右翼势力也会因此坐大,政府未来可能反受其制。"} ], R12: [ {label:"调国防军与警察,果断镇压", action:"sign", axis:"SM", fx:{army:4, political_violence:3, kpd:-4, spd:-2, gov_trust:2, social_anger:3}, note:"军队信任 +4|政治暴力 +3|KPD信任 -4|SPD信任 -2|政府信任 +2|社会愤怒 +3", cmt:"镇压可迅速平息起义,但会造成人员伤亡,政府也将再次以军队对付本国工人,社会裂痕加深。"}, {label:"让工会与SPD出面劝降,避免流血", action:"delegate", axis:"GM", fx:{spd:3, kpd:-1, social_anger:-2, political_violence:-1, gov_trust:1, insider:2}, note:"SPD信任 +3|KPD信任 -1|社会愤怒 -2|政治暴力 -1|政府信任 +1|知情者 +2", cmt:"由工会与SPD劝降可避免军队直接介入,但起义者未必听从,流血仍可能发生。"}, {label:"不调军队,交由汉堡警方处理", action:"delay", axis:"AP", fx:{kpd:-2, army:-2, political_violence:2, gov_trust:-1, observer:2}, note:"KPD信任 -2|军队信任 -2|政治暴力 +2|政府信任 -1|观察者 +2", cmt:"不调军队可避免国防军介入内政的先例,但警方力量有限,起义可能持续更久,伤亡也可能增加。"}, {label:"承认起义根源,善后并改善待遇", action:"delegate", axis:"LE GM", msg1:"你成立善后委员会,向死者家属和港口工人提供补助。枪声随后停止,无人宣布胜利,街垒也未再出现。", fx:{spd:4, kpd:2, social_anger:-4, economy:2, gov_trust:2}, note:"SPD信任 +4|KPD信任 +2|社会愤怒 -4|经济压力 +2|政府信任 +2", cmt:"以善后和改善待遇平息起义,见效较慢,但有助于缓解工人不满,避免军队再次卷入内政。"}, {label:"借机清算,取缔共产党", action:"sign", axis:"RE", msg1:"镇压令之外,你加签了一道取缔令:共产党的报纸、党部与武装组织一律查封,军警连日在各城搜捕党部人员。有人提醒你,取缔一个政党须走宪法程序,你把这份提醒压进了档案。", fx:{kpd:-5, army:3, dnvp:2, political_violence:4, gov_trust:-2, revolution:-3}, note:"KPD信任 -5|军队信任 +3|DNVP信任 +2|政治暴力 +4|政府信任 -2|革命压力 -3", cmt:"取缔KPD可消除左翼武装威胁,但也会开政府以非常手段打击政党的先例,右翼日后可能效仿。"} ], R13: [ {label:"默许军队解散萨克森政府", action:"sign", axis:"SM", fx:{army:4, kpd:-4, spd:-3, political_violence:3, gov_trust:1}, note:"军队信任 +4|KPD信任 -4|SPD信任 -3|政治暴力 +3|政府信任 +1", cmt:"默许军队行动可迅速解散州政府,但这也意味着共和国首次以军队对付本国的州政府,右翼会借此鼓吹强力手段。"}, {label:"阻止军队,交由议会解决", action:"delegate", axis:"GM", fx:{spd:3, ddp:3, gov_trust:2, army:-3, political_violence:-1}, note:"SPD信任 +3|DDP信任 +3|政府信任 +2|军队信任 -3|政治暴力 -1", cmt:"阻止军队可避免流血,但议会程序耗时,局势能否等到议会解决仍是未知数。"}, {label:"下令军队撤出,避免流血", action:"delay", axis:"AP", fx:{army:-3, kpd:2, spd:2, political_violence:-2, gov_trust:-1}, note:"军队信任 -3|KPD信任 +2|SPD信任 +2|政治暴力 -2|政府信任 -1", cmt:"撤军可避免冲突,但军方会认为政府不敢使用他们,未来军队对政府的信任可能下降。"}, {label:"只解散KPD阁员,保留SPD", action:"delegate", axis:"OP", fx:{spd:2, kpd:-3, gov_trust:1, army:1, social_anger:2}, note:"SPD信任 +2|KPD信任 -3|政府信任 +1|军队信任 +1|社会愤怒 +2", cmt:"只清除KPD阁员可分化州政府,但部分解散也会开一个先例,未来中央可能更随意地干预各邦。"}, {label:"公开谴责军队越权", action:"sign", axis:"GM LE", fx:{army:-4, spd:3, ddp:2, gov_trust:1, political_violence:2}, note:"军队信任 -4|SPD信任 +3|DDP信任 +2|政府信任 +1|政治暴力 +2", cmt:"公开谴责可表明政府维护宪政的立场,但军方会认为政府敌视军队,军民关系可能恶化。"} ], R14: [ {label:"调军镇压,追捕暴动头目", action:"sign", axis:"SM", fx:{army:4, political_violence:3, nsdap:-4, dnvp:-2, gov_trust:2}, note:"军队信任 +4|政治暴力 +3|NSDAP信任 -4|DNVP信任 -2|政府信任 +2", cmt:"镇压可迅速平息暴动,但也会让NSDAP获得受迫害的宣传材料,其头目可能因此更受关注。"}, {label:"让巴伐利亚警方自行处理", action:"delegate", axis:"OP", fx:{ddp:2, zentrum:2, gov_trust:1, political_violence:1, nsdap:-1}, note:"DDP信任 +2|Zentrum信任 +2|政府信任 +1|政治暴力 +1|NSDAP信任 -1", cmt:"交由巴伐利亚处理可避免中央直接介入,但巴伐利亚的态度与柏林未必一致,处理结果可能不符合中央预期。"}, {label:"等它自己垮掉,不介入", action:"delay", axis:"AP", fx:{political_violence:2, gov_trust:-2, nsdap:-2, observer:2}, note:"政治暴力 +2|政府信任 -2|NSDAP信任 -2|观察者 +2", cmt:"不介入可避免中央与暴动者直接冲突,但暴动若自行瓦解,其组织者也可能从中吸取教训,转向合法斗争。"}, {label:"借机整肃全国右翼武装", action:"sign", axis:"SM LE", fx:{army:-3, nsdap:-4, dnvp:-3, political_violence:3, gov_trust:-1}, note:"军队信任 -3|NSDAP信任 -4|DNVP信任 -3|政治暴力 +3|政府信任 -1", cmt:"整肃右翼武装可削弱其势力,但也会触及国防军等机构,引发军方不满。"}, {label:"利用暴动,向军队示好结盟", action:"delegate", axis:"RE SM", msg1:"你放开了边界:慕尼黑的处置交给军方主导,柏林只问结果。作为交换,你默许军方在善后的名义下清点各民团的枪械。这笔交易没有文件,只有一顿晚饭。", fx:{army:4, dvp:2, gov_trust:1, army_influence:3, political_violence:2}, note:"军队信任 +4|DVP信任 +2|政府信任 +1|军方影响 +3|政治暴力 +2", cmt:"借暴动向军队示好可拉近与军方关系,但军队并非可靠盟友,政府可能因此受制于军方。"} ], R15: [ {label:"下令军队开火,镇压到底", action:"sign", axis:"SM", fx:{army:4, political_violence:3, nsdap:-4, gov_trust:2, social_anger:2}, note:"军队信任 +4|政治暴力 +3|NSDAP信任 -4|政府信任 +2|社会愤怒 +2", cmt:"镇压可迅速结束冲突,但伤亡会激化矛盾,死者可能被右翼奉为烈士。"}, {label:"只让警察拦截,不调军队", action:"delegate", axis:"OP", fx:{ddp:2, gov_trust:1, political_violence:2, army:-1, nsdap:-1}, note:"DDP信任 +2|政府信任 +1|政治暴力 +2|军队信任 -1|NSDAP信任 -1", cmt:"仅由警察拦截可避免军队直接介入,但警察火力有限,冲突仍可能造成严重伤亡。"}, {label:"压住消息,不让它传开", action:"delay", axis:"AP", fx:{gov_trust:-2, insider:2, political_violence:1, nsdap:-1, observer:2}, note:"政府信任 -2|知情者 +2|政治暴力 +1|NSDAP信任 -1|观察者 +2", cmt:"封锁消息可暂时控制舆论,但枪声和伤亡难以完全掩盖,消息迟早会扩散。"}, {label:"公开谴责,将头目送上法庭", action:"sign", axis:"GM", fx:{gov_trust:2, ddp:2, nsdap:-3, political_violence:2, revolution:-1}, note:"政府信任 +2|DDP信任 +2|NSDAP信任 -3|政治暴力 +2|革命压力 -1", cmt:"公开审判可彰显政府立场,但法庭也可能成为被告宣传的舞台,反而提升其知名度。"}, {label:"处理善后,安抚遇难者家属", action:"delegate", axis:"GM", fx:{social_anger:-2, gov_trust:1, spd:2, nsdap:-1, insider:1}, note:"社会愤怒 -2|政府信任 +1|SPD信任 +2|NSDAP信任 -1|知情者 +1", cmt:"善后与抚恤可缓和家属情绪,但死者若被右翼纪念,政府很难阻止其成为象征。"} ], R16: [ {label:"果断改革,立即发行地租马克", action:"sign", axis:"OP", fx:{inflation:-6, economy:-3, gov_trust:3, dvp:3, social_anger:3}, note:"通胀 -6|经济压力 -3|政府信任 +3|DVP信任 +3|社会愤怒 +3", cmt:"立即发行地租马克可迅速遏制通胀,但旧马克储蓄将大幅贬值,中产阶级的损失难以避免。"}, {label:"新旧并行,分步过渡", action:"delegate", axis:"GM", fx:{inflation:-3, economy:-1, gov_trust:1, dvp:1, social_anger:1}, note:"通胀 -3|经济压力 -1|政府信任 +1|DVP信任 +1|社会愤怒 +1", cmt:"分步过渡可减轻冲击,但新旧货币并行会延长市场混乱,通胀未必能及时止住。"}, {label:"压住方案,再等等看", action:"delay", axis:"AP", fx:{inflation:3, gov_trust:-2, social_anger:2, insider:1}, note:"通胀 +3|政府信任 -2|社会愤怒 +2|知情者 +1", cmt:"拖延不决会令货币继续贬值,每多等一天,损失都在扩大,改革成本更高。"}, {label:"改革之外,补偿储蓄受损者", action:"delegate", axis:"GM", msg1:"除货币改革法令外,你追加补偿令,按比例向受损储户换发少量新马克。金额有限,但储蓄银行前的排队情况有所缓和。", fx:{inflation:-4, spd:3, social_anger:-3, gov_trust:2, economy:2}, note:"通胀 -4|SPD信任 +3|社会愤怒 -3|政府信任 +2|经济压力 +2", cmt:"补偿储户可缓和部分民怨,但财政支出增加,共和国需要为此承担额外负担。"}, {label:"借机将央行收归政府,垄断金融权", action:"sign", axis:"OP RE", fx:{dvp:2, gov_trust:2, intl_trust:-2, zentrum:-2, insider:3}, note:"DVP信任 +2|政府信任 +2|国际信任 -2|Zentrum信任 -2|知情者 +3", cmt:"将央行收归政府可加强政府对金融的控制,但银行界会强烈不满,未来融资可能更加困难。"} ], R17: [ {label:"为他辩护,逆转不信任案", action:"sign", axis:"OP", msg1:"你亲自出席议会,为总理辩护。不信任案以微弱多数被否决,总理留任。离开议场时,他向您点头致意,未多言。", fx:{dvp:3, gov_trust:2, intl_trust:2, social_anger:1, dnvp:-2}, note:"DVP信任 +3|政府信任 +2|国际信任 +2|社会愤怒 +1|DNVP信任 -2", cmt:"为总理辩护可使其留任,但政府为此与半个议会对立,未来立法合作可能更加困难。"}, {label:"保他留任外长,退下总理", action:"delegate", axis:"GM", fx:{dvp:2, ddp:2, gov_trust:1, insider:1}, note:"DVP信任 +2|DDP信任 +2|政府信任 +1|知情者 +1", cmt:"让总理转任外长可保留其外交经验,但总理职位更迭,政府仍需面对议会的压力。"}, {label:"顺应议会,让他下台", action:"delay", axis:"AP", fx:{dvp:-3, gov_trust:-1, social_anger:1, spd:1}, note:"DVP信任 -3|政府信任 -1|社会愤怒 +1|SPD信任 +1", cmt:"顺应议会可避免政府与议会正面冲突,但总理去职后,鲁尔政策与货币改革可能失去连续性。"}, {label:"借机改组,自己更多掌权", action:"sign", axis:"OP RE", msg1:"改组令随后签发,数个部的权限划归总理府直管。总理名义上留任至交接,实际决策权已转移。", fx:{dvp:2, gov_trust:2, insider:3, dnvp:1, intl_trust:-1}, note:"DVP信任 +2|政府信任 +2|知情者 +3|DNVP信任 +1|国际信任 -1", cmt:"借改组扩大总理府权力可加强控制,但权力过度集中也会招致议会和舆论的警惕。"}, {label:"公开为他说话,落个义气", action:"delegate", axis:"GM", msg1:"你在报纸上公开为总理说话,称其救过共和国,不应如此对待。文章未能保住其职位,但随后他自外交部办公室致电与你。", fx:{dvp:2, spd:2, gov_trust:1, social_anger:-1, insider:1}, note:"DVP信任 +2|SPD信任 +2|政府信任 +1|社会愤怒 -1|知情者 +1", cmt:"公开为其说话可显示政治道义,但无法改变表决结果,总理仍将去职。"} ], R18: [ {label:"宣布紧急外汇管制", action:"sign", axis:"SM", fx:{inflation:-3, gov_trust:2, dvp:2, intl_trust:-2, economy:2}, note:"通胀 -3|政府信任 +2|DVP信任 +2|国际信任 -2|经济压力 +2", cmt:"外汇管制可暂时稳住汇率,但资本会寻找其他渠道外流,管制效果有限。"}, {label:"约束物价,限制囤积", action:"delegate", axis:"GM", fx:{inflation:-2, spd:2, social_anger:-2, gov_trust:1, economy:1}, note:"通胀 -2|SPD信任 +2|社会愤怒 -2|政府信任 +1|经济压力 +1", cmt:"限制物价可短期安抚民众,但商品可能因无利可图而退出市场,短缺反而加剧。"}, {label:"承认救不了,坦诚面对", action:"delay", axis:"AP", fx:{gov_trust:-2, social_anger:2, ddp:2, insider:1}, note:"政府信任 -2|社会愤怒 +2|DDP信任 +2|知情者 +1", cmt:"坦诚承认危机可避免虚假安慰,但政府将承受更大舆论压力,民众信心可能进一步下降。"}, {label:"发声明安抚,称局势可控", action:"sign", axis:"AP", fx:{gov_trust:2, nationalism:2, inflation:2, insider:1}, note:"政府信任 +2|民族主义 +2|通胀 +2|知情者 +1", cmt:"声明可暂时稳定人心,但若局势继续恶化,政府公信力将受到更大损害。"}, {label:"秘密寻求外国资本援助", action:"delegate", axis:"OP", fx:{intl_trust:3, dvp:2, insider:3, gov_trust:-1, nationalism:-2}, note:"国际信任 +3|DVP信任 +2|知情者 +3|政府信任 -1|民族主义 -2", cmt:"寻求外国资本可缓解外汇短缺,但援助往往附带条件,政府未来决策将受制于人。"} ], R19: [ {label:"承认中产破产,承诺补偿", action:"delegate", axis:"OP", fx:{spd:2, social_anger:-2, gov_trust:1, middle_confidence:1, insider:1}, note:"SPD信任 +2|社会愤怒 -2|政府信任 +1|中产信心 +1|知情者 +1", cmt:"承认破产并承诺补偿可安抚部分情绪,但若无实际拨款,承诺很快会被视为空话。"}, {label:"宣布币制改革在即", action:"sign", axis:"OP", fx:{dvp:3, gov_trust:2, inflation:-2, insider:2, social_anger:1}, note:"DVP信任 +3|政府信任 +2|通胀 -2|知情者 +2|社会愤怒 +1", cmt:"宣布币制改革可给市场一个预期,但在新货币发行前,旧货币仍将继续贬值。"}, {label:"否认危机,称数字将会好转", action:"delay", axis:"AP", fx:{gov_trust:-3, social_anger:2, nationalism:1, ddp:-1}, note:"政府信任 -3|社会愤怒 +2|民族主义 +1|DDP信任 -1", cmt:"否认危机可暂时回避压力,但储户手中的空存折会让政府的说法难以取信于人。"}, {label:"追责印钞官员,平息民怨", action:"sign", axis:"OP RE", fx:{gov_trust:2, dvp:1, social_anger:-2, insider:2}, note:"政府信任 +2|DVP信任 +1|社会愤怒 -2|知情者 +2", cmt:"追责个别官员可转移部分民愤,但无法解决通胀根源,公众很快会看穿这种替罪羊做法。"}, {label:"发起储蓄救济,政府出资补底", action:"delegate", axis:"GM", fx:{spd:3, social_anger:-3, gov_trust:2, economy:3, inflation:-1, middle_confidence:2}, note:"SPD信任 +3|社会愤怒 -3|政府信任 +2|经济压力 +3|通胀 -1|中产信心 +2", cmt:"政府出资救济储户可缓和民怨,但财政支出巨大,共和国需要权衡是否承担得起。"} ] }>> <<set $red_prompts to { R01: "法国与比利时军队已占领鲁尔,政府应如何决断:", R02: "国会已通过消极抵抗决议,政府应如何执行:", R03: "埃森发生流血事件,政府应如何回应:", R04: "被捕者仍关押于法军拘留所,政府应否介入:", R05: "被捕者已被枪决,右翼正借势宣传。政府应如何应对:", S01: "总罢工已蔓延至全国多地,政府应如何回应:", S02: "多城同时响应起义,政府应如何处置:", S03: "慕尼黑已宣布脱离共和国,中央应如何回应:", S04: "国防军在萨克森遭遇武装抵抗,政府应如何处置:", S05: "巴伐利亚与部分军官秘密结盟,中央应如何处置:", S06: "地租马克未能遏制通胀,政府应如何应对:", S07: "莱茵兰分离势力宣布独立,政府应如何回应:", S08: "外交部长遇刺身亡,政府应如何应对:", S09: "军方秘密扩军活动曝光,政府应如何处置:", S10: "农民拒售粮食,城市供应紧张。政府应如何处置:", S11: "军方内部出现政变密谋,政府应如何处置:", S12: "协约国发出赔款最后通牒,政府应如何回应:", S13: "左右翼报纸同时攻击政府,政府应如何应对:", R06: "柏林已陷入瘫痪,电车与印刷业停工。政府应如何应对这场总罢工:", R07: "DVP提出总理人选,拟授权组阁。政府应否支持:", R08: "消极抵抗已持续数月,货币与财政均难以维持。政府应如何结束这一政策:", R09: "总统已依据第48条宣布紧急状态,政府应如何配合:", R10: "慕尼黑宣布戒严,巴伐利亚自行其是。中央应如何回应:", R11: "KPD在克姆尼茨秘密集会,讨论武装起义。政府应如何处置:", R12: "汉堡起义已经爆发,起义者尚未获得外部响应。政府应如何应对:", R13: "国防军已开入萨克森,准备解散左翼州政府。中央应如何决断:", R14: "慕尼黑发生暴动,NSDAP宣布「全国革命」。中央应如何回应:", R15: "纳粹冲锋队与国防军在慕尼黑交火,政府应如何应对:", R16: "货币改革方案已提交总理府,政府应如何批复:", R17: "议会已提出不信任动议,总理面临去留。政府应如何应对:", R18: "马克汇率已跌破万点,市场陷入停顿。政府应如何应对:", R19: "恶性通胀已使中产储蓄归零,政府应如何回应:" }>>\ <</widget>> /* ---------- render-red-custom-options:红色事件订制选项(R01/R02/R03 样板) ---------- 用法:<<render-red-custom-options _ev>> 每个事件 5 个专属选项,手写数值 + 生动后果描述。 $file_action 仍映射到 sign/delegate/delay 三向,供反馈/结算/政党立场判定复用。 */ <<widget "render-red-custom-options">>\ <<silently>> <<set _ev to $args[0]>> /* 清掉上一次可能残留的选项专属反馈(防跨事件泄漏) */ <<set $opt_msg1 to "">> <</silently>>\ <<if $red_opts and $red_opts[_ev.deck_id]>>\ ''<<print $red_prompts[_ev.deck_id]>>'' <<nobr>><<for _rri to 0; _rri lt $red_opts[_ev.deck_id].length; _rri++>> <<set _opt to $red_opts[_ev.deck_id][_rri]>> <<capture _opt _ev>> <span class="red-choice"><<link "_opt.label" "File_Result">> <<set $file_action to _opt.action>> <<set $opt_label to _opt.label>> <<set $opt_msg1 to _opt.msg1 ? _opt.msg1 : "">> <<if _opt.flag>> <<set _fk to Object.keys(_opt.flag)>> <<for _fk2 to 0; _fk2 lt _fk.length; _fk2++>> <<set $flags[_fk[_fk2]] to _opt.flag[_fk[_fk2]]>> <</for>> <</if>> <<apply-red-fx _opt.fx _ev.id>> <</link>></span> <<if false>>@@.red-choice-note;_opt.note@@<</if>>/* 数值注记按用户要求不上屏;数据保留在表内 */ //(_opt.cmt)// <</capture>> <<if _rri lt $red_opts[_ev.deck_id].length - 1>><br><</if>> <</for>><</nobr>> <<elseif _ev.deck_id eq "R201">>\ ''两百万把刺刀要缩成十万,你如何执行:'' <span class="red-choice"><<link "按期解散,一分不减" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "按期解散,一分不减">>\ <<apply-red-fx {army:-4, gov_trust:3, ddp:3, political_violence:2, nationalism:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 -4|政府信任 +3|DDP信任 +3|政治暴力 +2|民族主义 +2@@<</if>> //(命令照办。被裁的军团把徽章扯下来的时候,眼里没有感恩。他们带着枪和恨回了乡--自由军团的骨干,就这样流进了各个「爱国同盟」的名单里。)// <span class="red-choice"><<link "先解散,暗中留一批骨干" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "先解散,暗中留一批骨干">>\ <<apply-red-fx {army:3, insider:3, ddp:-2, political_violence:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +3|知情者 +3|DDP信任 -2|政治暴力 +2@@<</if>> //(明面上十万,暗地里多留了几千「临时工」。将军们对你露出了一点笑。你知道这笔账早晚要还--违约的把柄,从此攥在穿军装的手里。)// <span class="red-choice"><<link "给遣散费和安置,赎买人心" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "给遣散费和安置,赎买人心">>\ <<apply-red-fx {spd:2, army:1, economy:3, gov_trust:2, social_anger:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +2|军方信任 +1|经济压力 +3|政府信任 +2|社会愤怒 -2@@<</if>> //(欠条换成了现金,哪怕是从印钞机里现印的。有人拿钱回了家,有人拿钱买了枪。你买下的是时间--贵,但比内战便宜。)// <span class="red-choice"><<link "拖延期限,观望协约国" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "拖延期限,观望协约国">>\ <<apply-red-fx {gov_trust:-3, ddp:-2, army:2, nationalism:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 -3|DDP信任 -2|军方信任 +2|民族主义 +1@@<</if>> //(文件在桌上压着。巴黎在催,将军们在拖。你觉得还有转圜--协约国觉得你在试探底线。拖到最后,还是要裁,只是多背了一条「不履行」的罪名。)// <span class="red-choice"><<link "借解散之机清洗极右军官" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "借解散之机清洗极右军官">>\ <<apply-red-fx {army:-5, spd:3, kpd:2, political_violence:-2, dnvp:-3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 -5|SPD信任 +3|KPD信任 +2|政治暴力 -2|DNVP信任 -3@@<</if>> //(名单上勾掉的都是名字最响的。左翼鼓掌,军营记仇。被清洗的人没消失--他们只是换了身衣服,把仇恨排进了日程表。你以为拔了牙,其实只是把牙藏进了抽屉。)// <<elseif _ev.deck_id eq "R202">>\ ''海军旅向柏林进军,政府何去何从:'' <span class="red-choice"><<link "号召全民抵抗,寸土不让" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "号召全民抵抗,寸土不让">>\ <<apply-red-fx {spd:3, gov_trust:3, social_anger:2, political_violence:3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +3|政府信任 +3|社会愤怒 +2|政治暴力 +3@@<</if>> //(政府在斯图加特喊话:不要服从叛军。可政府自己已经不在柏林了。抵抗的旗交到了工人手里--他们举了,但他们会记住这面旗是谁的。)// <span class="red-choice"><<link "妥协谈判,收编政变部队" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "妥协谈判,收编政变部队">>\ <<apply-red-fx {army:3, dnvp:3, spd:-5, kpd:-4, gov_trust:-4} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +3|DNVP信任 +3|SPD信任 -5|KPD信任 -4|政府信任 -4@@<</if>> //(你跟拿着枪进京的人谈条件。谈出来的「团结政府」里坐着政变的发起者。共和国第一次学会了跟推翻他的人分桌子--这个先例,比政变本身更危险。)// <span class="red-choice"><<link "静观其变,等政变自溃" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "静观其变,等政变自溃">>\ <<apply-red-fx {gov_trust:-3, spd:-2, political_violence:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 -3|SPD信任 -2|政治暴力 +2@@<</if>> //(你赌政变者自己管不好一个国家。赌对了--他们真的四天就乱了套。可这几天里,柏林的部长们在墙报上看到了自己的通缉令。共和国的脸,先丢了一半。)// <span class="red-choice"><<link "请工会出手,发动总罢工" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "请工会出手,发动总罢工">>\ <<apply-red-fx {spd:4, kpd:2, social_anger:2, political_violence:-2, revolution:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +4|KPD信任 +2|社会愤怒 +2|政治暴力 -2|革命压力 +2@@<</if>> //(你把共和国的命,交给了工人的手。他们接住了--电停了,水停了,政变政府的命令出不了总理府。可你心里清楚:能用罢工救回来的国家,也能被罢工掀翻。这是双刃的恩情。)// <span class="red-choice"><<link "请国防军镇压,事后不追责" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "请国防军镇压,事后不追责">>\ <<apply-red-fx {army:5, spd:-3, ddp:-2, gov_trust:-2, political_violence:3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +5|SPD信任 -3|DDP信任 -2|政府信任 -2|政治暴力 +3@@<</if>> //(「军队不打军队」--这句话今天被打破了。代价是特赦:政变的头目们交了枪,坐上了开往瑞典的火车,座位是一等舱。左翼记住了:共和国对右边的叛乱,连罚酒都没有。)// <<elseif _ev.deck_id eq "R203">>\ ''总罢工瘫痪了政变政府,你如何收场:'' <span class="red-choice"><<link "亲自出面感谢罢工工人" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "亲自出面感谢罢工工人">>\ <<apply-red-fx {spd:4, kpd:2, gov_trust:2, social_anger:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +4|KPD信任 +2|政府信任 +2|社会愤怒 -2@@<</if>> //(你走进工厂大门,站在木箱上说了声谢谢。有人摘了帽子。工人知道共和国欠他们一次--这种债,不写在账本上,写在下一次选举里。)// <span class="red-choice"><<link "给罢工者记功,写入官方叙事" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "给罢工者记功,写入官方叙事">>\ <<apply-red-fx {spd:3, kpd:1, gov_trust:3, dnvp:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +3|KPD信任 +1|政府信任 +3|DNVP信任 -2@@<</if>> //(教科书上会写:总罢工拯救了共和国。右翼的报纸冷笑:用街上的野火救房子,也算消防。可名字上了墙的工会,从此跟共和国绑在了一根绳上。)// <span class="red-choice"><<link "迅速翻篇,低调重建秩序" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "迅速翻篇,低调重建秩序">>\ <<apply-red-fx {gov_trust:1, spd:-2, kpd:-2, political_violence:-1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 +1|SPD信任 -2|KPD信任 -2|政治暴力 -1@@<</if>> //(电闸重新合上,报纸改口,好像什么都没发生。可鲁尔那边,罢工的工人已经拿起了枪--他们说:罢工既然能救共和国,为什么不能救我们自己。你翻篇的手,压不住他们翻开的页。)// <span class="red-choice"><<link "借势清算,审判政变主谋" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "借势清算,审判政变主谋">>\ <<apply-red-fx {spd:2, ddp:2, army:-3, dnvp:-4, gov_trust:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +2|DDP信任 +2|军方信任 -3|DNVP信任 -4|政府信任 +2@@<</if>> //(法庭开张了。可「叛国」两个字在法官嘴里绕了三圈,变成了「情节轻微」。判决书比通缉令薄得多--这个国家的法槌,握在同情叛乱的人手里。你赢了名义,输了牙齿。)// <span class="red-choice"><<link "反手镇压鲁尔红军" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "反手镇压鲁尔红军">>\ <<apply-red-fx {army:4, spd:-4, kpd:-5, political_violence:5, revolution:-3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +4|SPD信任 -4|KPD信任 -5|政治暴力 +5|革命压力 -3@@<</if>> //(罢工的工人放下工具拿起枪的地方,你派了正规军去「恢复秩序」。刺刀对刺刀。左翼从此记住:总罢工救了共和国,共和国用军队还礼。这笔账,十年后还有人念。)// <<elseif _ev.deck_id eq "R204">>\ ''选举失利,联合破裂,你如何组阁:'' <span class="red-choice"><<link "重建魏玛联合,少数执政" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "重建魏玛联合,少数执政">>\ <<apply-red-fx {spd:3, ddp:2, zentrum:2, gov_trust:2, economy:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +3|DDP信任 +2|Zentrum信任 +2|政府信任 +2|经济压力 +1@@<</if>> //(亲爹娘重新坐回一张桌子,虽然席位不够,事事要看右翼脸色。吵归吵,共和国的名字还是那三家一起签的。矮一截的屋子,好歹还是自己的屋子。)// <span class="red-choice"><<link "拉右翼入阁,向中间偏移" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "拉右翼入阁,向中间偏移">>\ <<apply-red-fx {dvp:3, dnvp:2, spd:-4, kpd:-2, gov_trust:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DVP信任 +3|DNVP信任 +2|SPD信任 -4|KPD信任 -2|政府信任 +1@@<</if>> //(你请了原本想请回皇帝的人入席。他们举杯的时候没说「共和国万岁」--他们说「为了德国」。同一张桌上的两个客人,对国家的名字各怀心思。)// <span class="red-choice"><<link "依赖宪法第48条,绕开国会" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "依赖宪法第48条,绕开国会">>\ <<apply-red-fx {army:2, ddp:-4, spd:-3, gov_trust:-2, zentrum:-1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +2|DDP信任 -4|SPD信任 -3|政府信任 -2|Zentrum信任 -1@@<</if>> //(法案通不过?那就让总统签「紧急法令」,绕过去。快是真快--可宪法的每一条缝,都是被这么撑开的。你省下的每一场辩论,都会在将来加倍偿还。)// <span class="red-choice"><<link "提前大选,赌一次翻盘" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "提前大选,赌一次翻盘">>\ <<apply-red-fx {gov_trust:-3, social_anger:2, spd:-1, dnvp:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 -3|社会愤怒 +2|SPD信任 -1|DNVP信任 +1@@<</if>> //(赌桌再开一把。可民意没有翻盘的迹象--再选一次,只会更碎。你在冒一个只有输面的险:选民不认错,只认情绪。)// <span class="red-choice"><<link "接受监交政府,只管民生" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "接受监交政府,只管民生">>\ <<apply-red-fx {gov_trust:-2, economy:2, social_anger:-1, spd:-1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 -2|经济压力 +2|社会愤怒 -1|SPD信任 -1@@<</if>> //(大事不决,小事照办。面包照发,电车照跑,条约照签。共和国变成一台只运转不转向的机器--方向盘空了,可至少轮子还在动。)// <<elseif _ev.deck_id eq "R205">>\ ''条约生效,国耻日的怒火,你如何引导:'' <span class="red-choice"><<link "默哀仪式,克制收场" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "默哀仪式,克制收场">>\ <<apply-red-fx {gov_trust:2, ddp:2, nationalism:-1, social_anger:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 +2|DDP信任 +2|民族主义 -1|社会愤怒 -2@@<</if>> //(烛火排到勃兰登堡门就停了,没有冲向总理府。你给愤怒一个体面的出口--让它烧成灰,而不是烧成火。第二天,柏林照常上班。)// <span class="red-choice"><<link "总统亲署,担起骂名" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "总统亲署,担起骂名">>\ <<apply-red-fx {gov_trust:3, ddp:2, spd:1, dnvp:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 +3|DDP信任 +2|SPD信任 +1|DNVP信任 -2@@<</if>> //(老人颤抖着签了字。右翼的报纸骂他「卖国」--他替共和国挡了这一枪。签名的人换来了几年的喘息,代价是自己的名字从此跟耻辱钉在一起。)// <span class="red-choice"><<link "放任游行,宣泄民愤" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "放任游行,宣泄民愤">>\ <<apply-red-fx {nationalism:3, social_anger:1, political_violence:2, dnvp:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;民族主义 +3|社会愤怒 +1|政治暴力 +2|DNVP信任 +2@@<</if>> //(你没有拦。人群骂够了、哭够了、散了。可组织游行的钱是谁出的、喇叭是谁递的、口号是谁教的--这些答案都在极右翼的口袋里。你放的是情绪,他们收的是名单。)// <span class="red-choice"><<link "公开辩论,讲清代价" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "公开辩论,讲清代价">>\ <<apply-red-fx {ddp:3, zentrum:2, gov_trust:1, nationalism:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DDP信任 +3|Zentrum信任 +2|政府信任 +1|民族主义 +1@@<</if>> //(你把账摊开:不签约,就没有和平;没有和平,封锁线就还在,孩子还在挨饿。理性的人点头了。可理性从来不是多数--多数人只记住了「割地」两个字。)// <span class="red-choice"><<link "暗中扩军,对冲屈辱" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "暗中扩军,对冲屈辱">>\ <<apply-red-fx {army:4, dnvp:2, ddp:-3, insider:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +4|DNVP信任 +2|DDP信任 -3|知情者 +2@@<</if>> //(屈辱要有账本,账本要用枪杆子记。你在条约的表格底下开了第二本账。将军们感动了--可一个愿意替军队瞒账的共和国,早晚要还这笔瞒出来的债。)// <<elseif _ev.deck_id eq "R206">>\ ''公投赢了,土地还是被分走,你如何回应:'' <span class="red-choice"><<link "接受划界,止损求和" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "接受划界,止损求和">>\ <<apply-red-fx {dvp:3, ddp:2, nationalism:2, gov_trust:1, dnvp:-1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DVP信任 +3|DDP信任 +2|民族主义 +2|政府信任 +1|DNVP信任 -1@@<</if>> //(你劝所有人往好处看:投票赢了六成,说明人心还在。可上西里西亚的矿工看着波兰的旗插在矿井上--他们不懂外交辞令,只懂煤是谁的。你的止损,止在柏林;止不住的,在矿区。)// <span class="red-choice"><<link "抗议到底,拒不承认" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "抗议到底,拒不承认">>\ <<apply-red-fx {dnvp:3, nationalism:4, ddp:-2, dvp:-2, gov_trust:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DNVP信任 +3|民族主义 +4|DDP信任 -2|DVP信任 -2|政府信任 -2@@<</if>> //(照会一份一份发往巴黎,一份一份石沉大海。国内的报纸夸你硬气--可硬气换不回一寸土地,只是把「受害者」的戏份演足。愤怒越攒越多,你把它留给了下一代。)// <span class="red-choice"><<link "鼓动地方对抗,暗中较劲" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "鼓动地方对抗,暗中较劲">>\ <<apply-red-fx {nationalism:3, political_violence:3, insider:2, ddp:-3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;民族主义 +3|政治暴力 +3|知情者 +2|DDP信任 -3@@<</if>> //(官方说「克制」,非官方的渠道却在给德裔自卫队递消息。你玩了一把火:让民意去撕协约国的公文。火烧到了边境--幸亏没烧回柏林。这局侥幸,别指望第二次。)// <span class="red-choice"><<link "安置迁出的德裔,给补贴" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "安置迁出的德裔,给补贴">>\ <<apply-red-fx {spd:2, zentrum:2, economy:3, social_anger:1, gov_trust:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +2|Zentrum信任 +2|经济压力 +3|社会愤怒 +1|政府信任 +2@@<</if>> //(火车一列列开进来,站台上是拎着全部家当的德国人。他们成了新选民,也是最愤怒的选民--「被抛弃的人」这个身份,极右翼会用十年。你花了钱,买来一批别人的票仓。)// <span class="red-choice"><<link "借势动员「民族受难」叙事" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "借势动员「民族受难」叙事">>\ <<apply-red-fx {dnvp:3, nationalism:5, social_anger:2, ddp:-2, gov_trust:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DNVP信任 +3|民族主义 +5|社会愤怒 +2|DDP信任 -2|政府信任 +1@@<</if>> //(你把伤口做成了旗。民族受难的大合唱里,每个声部都在往上加码。可这面旗织好了就收不回来--它认下家的时候,可不会来问你。)// <<elseif _ev.deck_id eq "R207">>\ ''伦敦最后通牒:三天内答复,你签不签:'' <span class="red-choice"><<link "全盘接受,先保住鲁尔" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "全盘接受,先保住鲁尔">>\ <<apply-red-fx {dvp:3, ddp:2, economy:2, nationalism:3, gov_trust:1, dnvp:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DVP信任 +3|DDP信任 +2|经济压力 +2|民族主义 +3|政府信任 +1|DNVP信任 -2@@<</if>> //(签了。一千三百二十亿,四十二年。报纸骂「奴役条约」--可鲁尔的矿井还在德国手里,法国的坦克没开进来。你买的是最贵的和平。账,往后慢慢算。)// <span class="red-choice"><<link "讨价还价,争取缓期" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "讨价还价,争取缓期">>\ <<apply-red-fx {dvp:1, gov_trust:-1, economy:1, ddp:1, nationalism:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DVP信任 +1|政府信任 -1|经济压力 +1|DDP信任 +1|民族主义 +1@@<</if>> //(你让人在伦敦磨了三天。数字没少一个零,只换来一句「可以考虑年中付款」。谈判桌没赢,可国内至少看到了你争取过--这种姿态,值一条报纸标题。)// <span class="red-choice"><<link "拒绝通牒,宁折不弯" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "拒绝通牒,宁折不弯">>\ <<apply-red-fx {dnvp:4, nationalism:5, army:1, dvp:-4, ddp:-4, gov_trust:-4, economy:3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DNVP信任 +4|民族主义 +5|军方信任 +1|DVP信任 -4|DDP信任 -4|政府信任 -4|经济压力 +3@@<</if>> //(你说不。第三天,法军的先头部队过了桥。鲁尔的烟囱熄了,马克开始跳水--你赢得了街头的欢呼,输掉了整个货币。骨头是硬的,可骨头不能当面包。)// <span class="red-choice"><<link "把通牒提交全民公决" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "把通牒提交全民公决">>\ <<apply-red-fx {spd:2, gov_trust:-2, social_anger:3, nationalism:2, zentrum:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +2|政府信任 -2|社会愤怒 +3|民族主义 +2|Zentrum信任 +1@@<</if>> //(签不签,让人民自己说。可人民说的不会是「接受」或「拒绝」--是四个字:奇耻大辱。公决的结果你比谁都清楚,你还是把它递了出去:骂名大家一起背。)// <span class="red-choice"><<link "接受赔款,但对内甩锅协约国" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "接受赔款,但对内甩锅协约国">>\ <<apply-red-fx {gov_trust:2, nationalism:4, dvp:2, insider:2, ddp:-1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 +2|民族主义 +4|DVP信任 +2|知情者 +2|DDP信任 -1@@<</if>> //(手在签,嘴在骂。官方叙事:不是我们要赔,是他们抢。你的政府保住了,可「受害者」的怒火没有保质期--它在街头自己发酵,迟早酿成别的什么东西。)// <<elseif _ev.deck_id eq "R208">>\ ''签停战协定的人被枪杀了,你如何回应:'' <span class="red-choice"><<link "国葬,最高规格悼念" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "国葬,最高规格悼念">>\ <<apply-red-fx {ddp:3, zentrum:2, spd:2, gov_trust:2, dvp:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DDP信任 +3|Zentrum信任 +2|SPD信任 +2|政府信任 +2|DVP信任 +1@@<</if>> //(黑黑的森林路,白白的国葬队列。你把「罪人」的骂名从死者身上摘下来,钉在国家的十字架上:他不是卖国贼,他是替所有人挨枪的人。棺材很重--重得让活着的人想想枪的事。)// <span class="red-choice"><<link "全面清剿「Consul」组织" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "全面清剿「Consul」组织">>\ <<apply-red-fx {ddp:3, spd:2, army:-2, dnvp:-3, political_violence:-2, gov_trust:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DDP信任 +3|SPD信任 +2|军方信任 -2|DNVP信任 -3|政治暴力 -2|政府信任 +2@@<</if>> //(名单一个一个抓。可线索每往深处走一步,就碰到一个「不便深究」的名字--有人替凶手租过车,有人替他们传过信,那些人都穿着体面的衣服。你抓到了扣扳机的手,抓不到递枪的手。)// <span class="red-choice"><<link "谴责暴力,但不扩大事态" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "谴责暴力,但不扩大事态">>\ <<apply-red-fx {gov_trust:-2, political_violence:2, ddp:-2, nationalism:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政府信任 -2|政治暴力 +2|DDP信任 -2|民族主义 +2@@<</if>> //(一份声明,一段默哀,一次「相信司法」。可司法对右翼的凶杀,从来是选择性失明。你知道,凶手知道,下一个目标也知道--这道菜会再上,只是换一副刀叉。)// <span class="red-choice"><<link "推动「保护共和国法」" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "推动「保护共和国法」">>\ <<apply-red-fx {spd:3, ddp:3, zentrum:1, dnvp:-3, nsdap:-3, gov_trust:2, political_violence:-3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +3|DDP信任 +3|Zentrum信任 +1|DNVP信任 -3|NSDAP信任 -3|政府信任 +2|政治暴力 -3@@<</if>> //(用一部法回应一颗子弹:取缔阴谋组织,加重政治谋杀的刑。左翼鼓掌,右翼骂娘。可法律颁布了才发现:执行它的法院,一半的人同情被告。字是黑的,判决常常是白的。)// <span class="red-choice"><<link "借机清算右翼民兵武装" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "借机清算右翼民兵武装">>\ <<apply-red-fx {spd:3, kpd:2, army:-4, dnvp:-4, political_violence:-2, nationalism:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +3|KPD信任 +2|军方信任 -4|DNVP信任 -4|政治暴力 -2|民族主义 +2@@<</if>> //(你在愤怒的掩护下动了真格。收枪,抓人,查账。右翼骂「借尸讨伐」--可死者的血还没干,你的手比平时稳。清理是清理了;恨,也结结实实清理进了下一代的仇恨里。)// <<elseif _ev.deck_id eq "R209">>\ ''影子军队曝光,协约国质询,你如何应对:'' <span class="red-choice"><<link "切割黑国防军,配合调查" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "切割黑国防军,配合调查">>\ <<apply-red-fx {ddp:3, dvp:2, army:-4, gov_trust:2, dnvp:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DDP信任 +3|DVP信任 +2|军方信任 -4|政府信任 +2|DNVP信任 -2@@<</if>> //(「工人体操队」的账本交上去了,几个名字掉了军籍。协约国满意了三分钟。将军们记了很久--你斩了他们的影子,可影子断的地方,还会再长。)// <span class="red-choice"><<link "为军方周旋,大事化小" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "为军方周旋,大事化小">>\ <<apply-red-fx {army:4, ddp:-3, gov_trust:-2, insider:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +4|DDP信任 -3|政府信任 -2|知情者 +2@@<</if>> //(你在协约国面前打圆场:账目混乱、下级瞒报、纯属误会。调查组带着一肚子狐疑走了。你替军队挡了子弹--现在你欠他们的,他们记得比协约国清楚。)// <span class="red-choice"><<link "秘密重组,藏得更深" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "秘密重组,藏得更深">>\ <<apply-red-fx {army:3, insider:3, ddp:-2, political_violence:2, gov_trust:-1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +3|知情者 +3|DDP信任 -2|政治暴力 +2|政府信任 -1@@<</if>> //(表面上交了一批枪,私底下换了三个马甲:渔会、飞行俱乐部、体育协会。子弹埋得更深了--可埋子弹的手,从此不太听你使唤。你养了猫看鱼,猫的胃口越来越大。)// <span class="red-choice"><<link "顺势收回军权,整顿指挥链" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "顺势收回军权,整顿指挥链">>\ <<apply-red-fx {army:-3, spd:2, ddp:2, gov_trust:3, political_violence:-2, nationalism:1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 -3|SPD信任 +2|DDP信任 +2|政府信任 +3|政治暴力 -2|民族主义 +1@@<</if>> //(你趁协约国的探照灯还亮着,把几把不听话的椅子换了主人。文官的手第一次伸进了军营的门缝--伸进去了三分,剩下的七分,抵在门外那只手上。)// <span class="red-choice"><<link "公开透明,全军整编报备" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "公开透明,全军整编报备">>\ <<apply-red-fx {ddp:3, dvp:1, army:-2, gov_trust:2, economy:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;DDP信任 +3|DVP信任 +1|军方信任 -2|政府信任 +2|经济压力 +2@@<</if>> //(你把军营的抽屉全倒出来晒:番号、枪械、训练名单,全报协约国备案。条约的安全感回来了--军营里的士气,从此变成了一种需要管理的东西。透明是有代价的,账单开给了将军们的自尊。)// <<elseif _ev.deck_id eq "R210">>\ ''两边都在等对方先动,你如何拆这个局:'' <span class="red-choice"><<link "两边同时喊停,武装隔离" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "两边同时喊停,武装隔离">>\ <<apply-red-fx {army:2, gov_trust:2, political_violence:-2, spd:-1, kpd:-1, dnvp:-1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +2|政府信任 +2|政治暴力 -2|SPD信任 -1|KPD信任 -1|DNVP信任 -1@@<</if>> //(警察开进中间地带,两边都收到同一纸禁令。两边也都骂你偏心对方。可骂声替代了枪声--这一页,先翻过去再说。)// <span class="red-choice"><<link "先发制人,收缴右翼武器" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "先发制人,收缴右翼武器">>\ <<apply-red-fx {spd:2, kpd:2, dnvp:-4, nsdap:-3, political_violence:-2, army:-2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +2|KPD信任 +2|DNVP信任 -4|NSDAP信任 -3|政治暴力 -2|军方信任 -2@@<</if>> //(你赌先动手的会是右边。搜查令连夜签发,慕尼黑的军械库开了箱。右翼骂你「预防性暴政」--左翼没骂你,可他们在图林根擦枪的手,也没停。你按住了半边,另一半在你看不见的地方上膛。)// <span class="red-choice"><<link "安抚工人区,查禁极右报纸" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "安抚工人区,查禁极右报纸">>\ <<apply-red-fx {spd:3, kpd:1, social_anger:-2, nationalism:2, dnvp:-2, ddp:-1} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;SPD信任 +3|KPD信任 +1|社会愤怒 -2|民族主义 +2|DNVP信任 -2|DDP信任 -1@@<</if>> //(煤价补贴进了工人区,两份骂政府最凶的报纸被禁了三期。左边的火压下去一点--右边的火苗被你这一禁,反而在地下烧得更旺。禁言令从来是宣传最好的肥料。)// <span class="red-choice"><<link "密谈两边,私下各让一步" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "密谈两边,私下各让一步">>\ <<apply-red-fx {insider:3, gov_trust:1, political_violence:-2, fatigue:4} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;知情者 +3|政府信任 +1|政治暴力 -2|疲惫 +4@@<</if>> //(两个中间人,两条线,一桌散装的酒。你让右翼撤两个岗哨,让左翼缩一条纠察线--都没落纸。两边都觉得赚了,也都觉得自己亏了。局暂时稳住:秘密外交的坏处是,下次稳不住的时候,没人记得你做过什么。)// <span class="red-choice"><<link "调集国防军,全面戒备" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "调集国防军,全面戒备">>\ <<apply-red-fx {army:4, political_violence:-3, spd:-2, kpd:-3, gov_trust:1, nationalism:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方信任 +4|政治暴力 -3|SPD信任 -2|KPD信任 -3|政府信任 +1|民族主义 +2@@<</if>> //(装甲车停在两个集结区中间的桥上。谁先动,就先对付谁--你把规则亮在明处。两边的动员都泄了气。可军队尝到了「仲裁者」的味道,这个味道,比任何军饷都上瘾。)// <</if>>\ <</widget>> /* ---------- render-feedback:4段式抽签拼接反馈 ---------- 用法:<<render-feedback _ev>> 读取 $file_action,从四层各抽1条拼接: 1. 客观事实(按动作分池,事件本身的直接后果) 2. 环境反应(按地点+世界状态过滤,pool-draw "echo_environment") 3. 玩家感知(按疲惫/偏执过滤,pool-draw "echo_perception") 4. 隐藏暗示(低概率出现,按历史锚点/遗产过滤,pool-draw "echo_hint") 结果存入 _feedback_text */ <<widget "render-feedback">>\ <<silently>> <<set _ev to $args[0]>> <<set _act to $file_action>> /* 按严重度着色:历史巨浪=红 / 区域警报=橙 / 日常见闻=青 与 File_Event 的标题/正文同一档位,事件后果文本用专属色 */ <<set _sev to "calm">> <<if _ev.deck_id and (_ev.deck_id.indexOf("R") eq 0 or _ev.deck_id.indexOf("S") eq 0)>> <<set _sev to "severe">> <<elseif _ev.source is "historical" or _ev.source is "swell">> <<set _sev to "severe">> <<elseif _ev.deck_id and (_ev.deck_id.indexOf("A") eq 0 or _ev.deck_id.indexOf("Y") eq 0)>> <<set _sev to "warm">> <<elseif _ev.source is "tag-induced">> <<set _sev to "warm">> <</if>> <<set _fb_class to "fb-seg fb-seg-" + _sev>> /* 第一段:客观事实 红色历史事件用专属文本(按事件ID),其余按动作分池 */ <<set _pool1 to []>> <<if _ev.deck_id eq "R01">> /* 法比军队占领鲁尔 · 专属文本 */ <<if _act is "sign">> <<set _pool1 to [ "你签了动员令。鲁尔的官员接到命令:不合作,不交接,不给法国人一根煤。电报线烧得发烫。柏林在做一件从未做过的事--用罢工当武器。", "钢笔落在纸上的那一刻,你知道这意味着什么。印钞机要转起来了。鲁尔的工人要靠柏林养,柏林靠印纸养。纸不是面包,但现在没有别的选择。", "你的签名让整条电报线颤抖。命令是:消极抵抗。不举枪,但也不低头。让法国人占领一座沉默的矿井--沉默比枪声更贵。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你起草了一份照会。措辞很小心:抗议,但不挑衅。你让人传话给巴黎--柏林愿意谈,但不是在刺刀底下谈。法国人会不会听是另一回事。", "折中方案:部分合作,部分抗议。你让鲁尔官员「酌情处理」。这个词在柏林的意思是:我不替你决定,但出事了我也不负责。", "你召见了法国使馆的人。谈话很礼貌,像两把裹着天鹅绒的刀在互相试探。你提了赔款,他提了鲁尔。谁也没让步,但至少门没有关死。" ]>> <<else>> <<set _pool1 to [ "你把电报压了下来。没有签动员令,也没有发抗议照会。你让鲁尔的事自己发酵。也许它会自己解决。也许不会。在柏林,「也许」是唯一不需要签字的东西。", "抽屉关上了。鲁尔的消息还在涌进来,但你的桌上暂时安静了。这份安静是借来的--利息正在一分一分地长。", "你选择等。等什么?你不知道。也许等法国人自己觉得没意思了走掉。也许等工人的怒火烧到柏林。等待本身就是一个决定,只是不用签字。" ]>> <</if>> <<elseif _ev.deck_id eq "R02">> /* 国会授权消极抵抗 · 专属文本 */ <<if _act is "sign">> <<set _pool1 to [ "国会投票的时候,你站在旁听席。283票对12票。几乎全票通过。掌声不算热烈--因为每个人都知道,他们刚批准的是一台印钞机。", "你签发了执行令。鲁尔的官员接到指令:不合作,不交接,不运煤。罢工工人的补贴由国库承担。国库是空的,但印钞机不空。", "命令下达了。电报线把「消极抵抗」四个字传遍鲁尔。矿工放下了工具,铁路工人停了车。法国人占领了矿井,但矿井是沉默的。沉默比煤更贵。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你让鲁尔官员「酌情抵抗」。这个词在柏林的意思是:我不替你背锅,但出事了我也不会怪你。在鲁尔,它的意思是:自己看着办。", "折中方案:官方层面抗议,民间层面不阻拦。工人自己决定罢不罢工。你把选择权交给了最没有选择权的人。", "你起草了一份「有限抵抗」的指导方针。措辞模糊得像雾。在柏林,模糊是一种保护。在鲁尔,模糊是一种抛弃。" ]>> <<else>> <<set _pool1 to [ "你拒绝签发抵抗令。国会通过了,但执行令在你桌上。你把它压了下来。鲁尔的事,让鲁尔自己决定。也许他们会谈。也许不会。", "你没有推行抵抗。你让外交部去和巴黎接触。谈判需要时间。时间在鲁尔是用马克计量的--而马克在跌。", "抽屉关上了。国会吵了三天,你沉默了三天。沉默在柏林是一种姿态。在鲁尔,它是一种放弃。" ]>> <</if>> <<elseif _ev.deck_id eq "R03">> /* 埃森流血事件 */ <<if _act is "sign">> <<set _pool1 to [ "你下令追加对鲁尔工人的补贴。钱从印钞机里来。死人的消息比马克跌得更快--克罗伊茨贝格的街头已经在烧东西了。", "你的笔在纸上划了一道。追加补贴,安抚家属。每一笔补偿都在印钞机上变成了新的通胀。死人的代价,活着的人用面包还。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你让人通过红十字会去了解伤亡情况。官方数字和街头数字不一样。你选择相信官方的。但街上的人不信。", "你安排中间人和法军占领当局接触。对方很冷淡:「我们是在维持秩序。」维持秩序用的子弹,和杀人用的子弹是同一种。" ]>> <<else>> <<set _pool1 to [ "你把伤亡报告放到一边。不是不痛,是痛不起。每一次愤怒都需要行动,而每一次行动都需要钱。钱已经没有了。", "你没有发表声明。秘书看了你一眼,什么都没说。在总理府,沉默有时候比声明更响。但响的不是好声音。" ]>> <</if>> <<elseif _ev.deck_id eq "R05">> /* 鲁尔破坏者被枪决 */ <<if _act is "sign">> <<set _pool1 to [ "你签发了全国哀悼令。他成了官方认证的殉道者。你知道DNVP会怎么用这件事--他们不需要你的令,但有了它更好用。", "你的笔在纸上停了一秒。然后签了。哀悼令。三个字。一个人的死变成了一个国家的符号。符号比人活得久。", "你下令降半旗。消息传到慕尼黑的时候,NSDAP的人已经在印传单了。你的令比他们的传单慢了一天。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你让外交部发了一份「遗憾声明」。不是抗议--抗议太硬。不是默哀--默哀太软。「遗憾」。在柏林,这是一个万能词。", "你安排了低调的善后。家属收到了一笔补偿金。数目不大,但在通胀里,什么数目都不大。" ]>> <<else>> <<set _pool1 to [ "你什么都没做。枪决的消息在报纸上占了半个版面。另一半版面是汇率。在柏林,一个人的死和一组数字共享同一个版面。", "你把报纸翻了过去。不是因为不痛。是因为痛也需要力气,而你的力气要用在活着的人身上。" ]>> <</if>> <<elseif _ev.deck_id eq "R06">> /* 柏林总罢工 */ <<if _act is "sign">> <<set _pool1 to [ "你下令动用紧急法维持秩序。警察上了街。罢工的人没有散--他们只是从工厂门口挪到了街口。在柏林,挪一个位置就算一种行动。", "你签署了强制复工令。没有人理它。在马克每小时都在贬值的年代,「强制」这个词本身也在贬值。", "你调了警察。街上的人比警察多。你站在窗前看--人群像一条河,警察像几块石头。石头挡不住河。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你和工会谈了。他们要的很简单:工资按美元算,不是按马克。你给不了。但你能给「尽快谈」。「尽快」在柏林的意思是:等我想办法。", "你让SPD的人去和工会沟通。他们谈了一下午。结果:工会同意「暂停」罢工三天。三天之后呢?三天之后再说。" ]>> <<else>> <<set _pool1 to [ "你让罢工自己烧。火总有灭的时候--要么燃料烧完了,要么雨来了。在柏林,马克是燃料,希望是雨。两样都没有。", "你没有干预。城市在停摆。电车的轮子不转了,印刷机也不转了--只有印钞机还在转。" ]>> <</if>> <<elseif _ev.deck_id eq "R07">> /* DVP组阁 · DVP派总理上台 */ <<if _act is "sign">> <<set _pool1 to [ "你签署了组阁令。他走进总理府的时候,连椅子都还是热的。上一个坐在这里的人留下的文件还没收走。他看了一眼,没有让人搬走。", "新总理上任了。他是DVP的人,说话像演讲,做事像下棋。他第一件事不是开会,是看汇率表。「先稳钱,」他说,「钱不稳,什么都不稳。」", "你把印信交给他的时候,他的手很稳。比你想的稳。「我知道你们怎么看我的,」他说,「妥协者。但在柏林,不妥协的人已经走了三个了。」" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你给他留了足够的余地。组阁令的措辞很宽泛--宽泛到他能往任何方向走。在柏林,模糊是一种授权。", "新总理上任了。你没有给他明确的指示。他也不需要。他带来了自己的人,自己的方案。你只需要点头。" ]>> <<else>> <<set _pool1 to [ "你拖延了组阁令的签署。一天。两天。街上的人在问:谁在管这个国家?答案是谁也没管。马克在等你签字的时候又跌了一截。", "你没有立刻签。你想看看还有没有别的人选。没有了。在柏林,愿意接这个烂摊子的人只有一个。他已经在门外等了三天。" ]>> <</if>> <<elseif _ev.deck_id eq "R08">> /* 结束消极抵抗 */ <<if _act is "sign">> <<set _pool1 to [ "你签署了终止令。消极抵抗结束了。鲁尔的工人接到命令:回去上班。没有人告诉他们,这八个月的罢工换来了什么。除了废纸一样的马克。", "笔落在纸上。结束了。你抬头看窗外--柏林的天没有变。但鲁尔的天变了。法国人笑了。工人们没有表情。表情需要力气,他们已经没有了。", "你的签名终止了一项政策。但终止不了八个月的后果:印钞机转了八个月,马克跌到了地板下面。地板也塌了。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你让新总理「逐步收缩」消极抵抗。不是一下子停,是慢慢停。像退烧。但通胀不是发烧,退不了。", "折中方案:官方宣布结束,民间自行决定。你知道「自行决定」在鲁尔的意思是:没人再给补贴了,你不上班就饿死。" ]>> <<else>> <<set _pool1 to [ "你没有签终止令。你让消极抵抗「自然消亡」。没有补贴,没有命令,让它自己断气。在柏林,「自然」这个词的意思是:不是我杀的。", "你拖延了。但通胀不拖延。每一天的犹豫都在印钞机上变成新的零。马克上的零比天上的星星还多。" ]>> <</if>> <<elseif _ev.deck_id eq "R09">> /* 全国紧急状态 · 第48条 */ <<if _act is "sign">> <<set _pool1 to [ "你签署了紧急法令。第48条。总统授权,绕过国会。你用的是宪法给的权力--用来保护宪法的权力。这件事的讽刺,历史会比你自己先发现。", "紧急状态生效了。报纸不能随便写了,集会不能随便开了。你告诉自己这是暂时的。在柏林,「暂时」是一个会长大的词。", "你的签名激活了第48条。法律的紧急通道打开了。它可以救命,也可以杀人。你用的是哪一种,要等到后来才知道。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你让紧急状态「有期限」--三个月。三个月后自动失效。你以为期限能管住权力。权力笑了。", "折中方案:紧急状态加上国会监督。但国会在开会的时候吵架,不开会的时候也吵架。监督是一种形式。形式比实质安全。" ]>> <<else>> <<set _pool1 to [ "你把笔搁回了笔架,说了一个字:不。第48条留在抽屉里,国会的门敞开着。总统看了你一眼,什么也没说。有些拒绝,比签字更费力。", "你拒绝动用第48条,坚持走议会程序。法案明天提交表决。街上的火不等人,可你赌的是:一个靠紧急令续命的共和国,比一个受伤的共和国死得更快。" ]>> <</if>> <<elseif _ev.deck_id eq "R10">> /* 巴伐利亚独裁 */ <<if _act is "sign">> <<set _pool1 to [ "你的调兵令下了。两个旅向纽伦堡方向移动,对外只说是演习。慕尼黑看懂了——演习的终点线,画在巴伐利亚的边界上。", "军队在边境集结的电报一封封发往柏林。慕尼黑的邦委员读完,把独裁令的措辞放缓了半分。枪没有响,但话好说了。", "你在声明里写下了「叛乱」两个字。柏林的报纸照排,慕尼黑的报纸删稿。可这两个字一旦印出来就收不回去了——从此慕尼黑走的每一步,都顶着叛乱的名字。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你发了「协商」电报。措辞客气。慕尼黑回了四个字:「情形必要。」然后就没有然后了。在柏林和慕尼黑之间,四个字就是一封完整的信。", "你派了人去慕尼黑谈。人到了,谈了一下午。回来的报告只有一句话:「他们不听我们的。」" ]>> <<else>> <<set _pool1 to [ "你没有回应。既不承认也不否认。在柏林,沉默是一种立场。在慕尼黑,沉默是柏林的软弱。", "你把巴伐利亚的电报放到一边。慕尼黑的事让慕尼黑自己处理。你管不了。或者说,你选择不管。两者在历史上没有区别。" ]>> <</if>> <<elseif _ev.deck_id eq "R12">> /* 汉堡起义 */ <<if _act is "sign">> <<set _pool1 to [ "你下令调国防军镇压。命令下得很快--快到你没有时间想,这群人在汉堡筑了街垒的时候,柏林的党否决了起义。他们不知道。他们打了三天,孤军奋战。", "你签了镇压令。警察和国防军开进了汉堡。街垒被推倒了。17个警察死了。21个起义者死了。61个平民死了。数字在报纸上排成一排,像墓碑。", "你的笔签了。汉堡的枪声响了三天然后停了。台尔曼的人占领了警察局,但没有占领汉堡。没有人来帮他们。克姆尼茨说了不。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你通过SPD的渠道和KPD接触。没有用。KPD的汉堡支部不听柏林的。他们只听莫斯科的。而莫斯科说了:等。但他们没等到。" ]>> <<else>> <<set _pool1 to [ "你让警察处理,没有调军队。警察不够。街垒比警察多。但你不想让军队再介入一次内政--萨克森的前例还在烧。", "你让汉堡的事自己烧。三天就灭了。起义者没有后援,没有弹药,也没有退路。他们打着一场注定输的仗。你只是站在旁边看。", "你没有立刻干预。汉堡的枪声在柏林听不到。但报纸上的标题很大。你等它自己结束。它确实自己结束了。代价是99条命。" ]>> <</if>> <<elseif _ev.deck_id eq "R14">> /* 啤酒馆暴动 */ <<if _act is "sign">> <<set _pool1 to [ "你下令国防军镇压。慕尼黑的啤酒馆外面响了枪。16个冲锋队员死了。那个留小胡子的人趴在地上,然后跑了。他会记住这一天,也会记住怎么跑。", "你签了镇压令。慕尼黑的政变在一天内就失败了。但失败也是一种广告--现在全德国都知道了他的名字。他输了政变,赢了版面。", "你的命令到了慕尼黑。国防军开了枪。冲锋队散了。但你知道,散了不等于没了。他们只是换了个地方。在慕尼黑,换地方也是一种革命。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你让巴伐利亚当局自己处理。他们处理了。慕尼黑的事慕尼黑解决。但「解决」这个词在巴伐利亚的意思和柏林不一样--在那里,有些政变失败了反而算赢。", "你通过外交渠道施压。措辞很硬。但慕尼黑已经在开枪了。措辞比子弹慢。" ]>> <<else>> <<set _pool1 to [ "你等了一天。暴动自己就散了。16个人死了,头目跑了。你不需要做什么。在柏林,有时候等待就是最好的行动。但这次不是。", "你没有立刻干预。慕尼黑的事在慕尼黑。但你不知道的是:那个趴在地上的人,站起来之后学会了穿西装。下一次他不会冲进啤酒馆了。下一次他会走进国会。" ]>> <</if>> <<elseif _ev.deck_id eq "R16">> /* 地租马克发行 */ <<if _act is "sign">> <<set _pool1 to [ "你签署了货币改革令。地租马克。一夜之间,通胀停了。像魔法。魔法背后是央行的算盘和抵押的土地。旧马克上的零一夜之间全归零了。", "你的签名发行了一种新钱。一万亿旧马克换一张新马克。数字归零了。但归零的不只是数字--还有所有人的积蓄。中产在哭泣。但至少面包有价了。", "笔落在纸上。地租马克诞生了。印刷机换了版。一夜之间,面包有了固定的价格。人们不知道该哭还是该笑。所以他们两样都做了。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你让货币改革的方案「分步推行」。先试点,再推广。但通胀不等试点。每犹豫一天,就多一批人破产。最后你还是一步到位了。", "折中方案:新货币加上旧货币过渡期。两种钱同时流通。混乱。但至少有人在用钱了,而不是用烟和面包。" ]>> <<else>> <<set _pool1 to [ "你犹豫了。货币改革太大了。万一新钱也不值钱呢?但你犹豫的每一天,都有人的积蓄变成废纸。最后你没有犹豫--是马克替你做了决定。", "你把方案放到「待定」那摞。它在等。通胀也在等。但通胀比你急。" ]>> <</if>> <<elseif _ev.deck_id eq "R17">> /* 总理下台 · DVP派总理被投不信任票 */ <<if _act is "sign">> <<set _pool1 to [ "你站上了议会的讲台,替他做了辩护。不信任案没有被通过。他保住了椅子,你花掉了人情--在柏林,这两样从来不放在同一个口袋里。", "你为他做了辩护。表决散场的时候,几个原本要举手反对的人收回了手。报纸第二天写道:总理府第一次为一个人、而不是一届政府说话。", "你的辩护词念了四十分钟。念完的时候议场很静。他留下来了。可你听见有人在后排低声说:下次,就没人替他辩护了。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你试图斡旋。让他留任外长,辞去总理。议会同意了。他保住了面子,但丢了椅子。在柏林,面子比椅子值钱。但也不是一直值钱。", "你安排了一个体面的退场。他转任外长。不是总理了,但还在台上。在柏林,下台和退场是两回事。他选了退场。" ]>> <<else>> <<set _pool1 to [ "你让议会的投票自己走。没有斡旋,没有施压。他走了。你站在窗前看他的车离开总理府。车很普通。在柏林,走的时候大家都一样普通。", "你没有干预。议会做了选择。他做了他能做的。然后他走了。走了之后,桌上还留着一支钢笔。你没有收走。" ]>> <</if>> <<elseif _ev.deck_id and _ev.deck_id.indexOf("R") eq 0>> /* 其他红色历史事件:用更重的通用文本 */ <<if _act is "sign">> <<set _pool1 to [ "你拿起了笔。这不是一份普通的文件--它会被写进历史,或者被历史抹掉。钢笔尖刮过纸的声音,在安静的办公室里像一声叹息。", "签名的时候,你的手很稳。比你想的要稳。也许是因为你已经习惯了做这种决定。习惯本身才是最可怕的。", "文件生效了。秘书拿走的时候,多看了你一眼。不是同情,也不是审视——是一种「我记住了」的眼神。在总理府,眼神比文件活得久。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你把文件转给了别人。这是一种技巧:让别人做决定,你保留否决权。但这一次,「别人」也在看你。在柏林,踢皮球的人太多的时候,球会爆。", "折中方案写好了。各方都不满意,这通常意味着它是对的。或者至少是活着的。但活着的方案不一定能活过下周。", "你安排了一个中间人。他点头的时候,你知道这意味着另一笔账。在柏林,人情比马克贬值得慢--但终归也会贬值。" ]>> <<else>> <<set _pool1 to [ "你把文件放到「待定」那摞。它会在那里等。文件有耐心,柏林的问题没有。而这一份,等不起。", "你没有签字,也没有拒绝。你只是把它翻了过去。像翻过一页日历。但这一页的历史不会因为你没看就跳过去。", "抽屉关上的声音很轻。但魏玛在角落里动了一下。他什么都没说。沉默在总理府里比喊叫更响。" ]>> <</if>> <<elseif _ev.deck_id eq "S01">> /* 历史暗涌·全国总动员 */ <<if _act is "sign">> <<set _pool1 to [ "火车停在了关卡前。全国总动员的火,被铁路上的路障拦住了。工人区安静下来,安静得能听见这只手箍住喉咙的声音。你压住了今天——可那股气压在锅底,还在慢慢升温。", "你下令封锁铁路。各城的工人没有汇成一股。可你也清楚,这股火没有灭,只是被拆成了几百堆灰烬,各自闷烧。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你派的人跑了一座又一座城。汉堡谈成了,鲁尔还在观望。总动员没有变成全国性的浪头,而是碎成了几滩浅水。你赢了时间,却没赢安心。", "谈判桌上,各城的火被一个个按下去。不是熄灭,是谈熄的。你给出去的东西,都记在了共和国身上。" ]>> <</if>> <<elseif _ev.deck_id eq "S02">> /* 历史暗涌·多城响应 */ <<if _act is "sign">> <<set _pool1 to [ "第48条盖上蜡印,全国戒严。街垒被清理,红旗被收走,多城的火被人用铁与令压了下去。共和国第一次用宪法保护自己——可这道命令,也成了别人明日的借口。", "你调来的军队同时开进了几座城。起义被压回了地下。你赢了这一仗,却把共和国往悬崖边又推了一步。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你承认了部分工人政府。汉堡的热血退了,可右翼的报纸在尖叫:共和国向革命下跪了。你保住了城,输掉了人心。" ]>> <<else>> <<set _pool1 to [ "你按兵不动,让各城的起事者自己耗尽弹药。汉堡先塌了,别的城跟着散了。你什么都没做——可死在街垒上的人,名字都记在了你头上。" ]>> <</if>> <<elseif _ev.deck_id eq "S03">> /* 历史暗涌·慕尼黑变色 */ <<if _act is "sign">> <<set _pool1 to [ "你调兵平叛。慕尼黑郊外的军官们斟酌了很久,最终还是去了。慕尼黑被收回了——可你清楚,这道让他们去的命令,比任何一道都危险。他们今天听你的,明天未必。", "国防军开进了慕尼黑。独裁者逃了,变色的旗被换下。可德意志的土地上,那道裂缝已经划下,收不拢了。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你让和谈使节在慕尼黑住了下来。独裁者每拖一天,就多一分坐实。你争取的是缓冲——可缓冲的尽头是什么,你自己也不知道。", "你吞下了这口气,默认巴伐利亚先走。共和国的旗还在别处飘着,主体还活着——可德意志裂开的那道缝,从此写在宪法之外。" ]>> <</if>> <<elseif _ev.deck_id eq "S04">> /* 历史暗涌·萨克森武装抵抗 */ <<if _act is "sign">> <<set _pool1 to [ "增援的军队碾过了萨克森的街垒。矿灯熄了,猎枪被收走,工人政府倒了。你赢了——可你始终想不起来,共和国打赢自己的州,算不算一种胜利。", "你下令强攻。萨克森的血渗进了泥里。共和国用子弹回答了自己州的工人——这个回答,会被很多人记很久。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你派人和工人政府谈。他们放下了枪,换走一份体面的下台。血没流,可右翼在骂你心软,柏林的心软是最贵的奢侈品。", "谈判桌上,萨克森的火熄了。共和国免于流血,只是那道缝,也从此更深了一点。" ]>> <</if>> <<elseif _ev.deck_id eq "S05">> /* 历史暗涌·巴伐利亚与军方结盟 */ <<if _act is "sign">> <<set _pool1 to [ "你把总参谋部里那些眉来眼去的军官清了出去。共和国暂时抽回了握在慕尼黑那边的半只手——可你知道,被抽走的不是忠诚,是几只还没掏出来的枪。", "整肃令下了。军方安静得可怕。他们没抗议——可那种安静,比抗议更让柏林脊背发凉。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你假装没看见那道握手。共和国暂时谁也没得罪,可那道从内部裂开的缝,已经长进了骨头里。你换来的时间,是给自己用的,还是给那道缝的?", "你选择周旋而不是撕破脸。慕尼黑和总参谋部还在眉来眼去,可至少共和国的门面还挂着。" ]>> <</if>> <<elseif _ev.deck_id eq "S06">> /* 历史暗涌·地租马克失效 */ <<if _act is "sign">> <<set _pool1 to [ "你把更多的土地和黄金押了上去,给新钞增信。市场半信半疑地接住了。通胀缓了缓,可你抵押出去的,已经是共和国最后的家底了。", "追加担保的令签了。新钞暂时站稳了脚。可你心里清楚,这张站住脚的纸,脚下垫着的是共和国自己的地。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你只担保普通人的储蓄,放弃了资本家的账。工人保住了存款,可银行家和右翼记住了这笔账。你救的是人心,丢的是资本。", "有限担保下去了。一半的人得救了,另一半的人在骂你。通胀没有止住,只是换了个方向流。" ]>> <<else>> <<set _pool1 to [ "你没有再往里押任何东西。新钞的报价一天之内掉了三成,储蓄银行门口的队伍从早上排到了关门前。你听任它沉下去——市场自会给出它的裁决。", "担保的方案被你压在了抽屉最底下。傍晚的时候,财政部送来了第一份挤兑报告。你没有签任何字。有些决定,不签字也是决定。" ]>> <</if>> <<elseif _ev.deck_id eq "S07">> /* 历史暗涌·莱茵分离 */ <<if _act is "sign">> <<set _pool1 to [ "开进莱茵兰的部队在占领军的哨线前停住了。两边的枪口隔着一条街对了一个下午,谁也没有先动。分离的旗没有降——你的枪,也没有收。", "镇压令发出去了。亚琛的分离政府躲进了法军营区后面,抓不着,也打不得。你在地图上盯着那块地方,像盯着一处不能碰的伤口。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "政府的声明只用了「不予承认」四个字。科布伦茨的「新政权」照常开它的办公会——没有谁能赶走它,也没有谁去承认它。僵住了。", "你把问题留给了时间。分离政权的告示贴上了墙,你的报纸不提它。两边都在等对方先眨眼。" ]>> <<else>> <<set _pool1 to [ "钱从三条互不相识的渠道流进了莱茵兰。当地的反分离团体忽然有了报纸、有了会场、有了人手。没有人知道钱从哪来——这正是你要的。", "秘密资助的名单锁在你抽屉最底层。莱茵兰的地下报纸开始出现批驳分离派的文章,笔调很硬,像是有人出钱。确实有人出钱。" ]>> <</if>> <<elseif _ev.deck_id eq "S08">> /* 历史暗涌·外长遇刺 */ <<if _act is "sign">> <<set _pool1 to [ "取缔令连夜起草,天亮前签了字。右翼组织的办事处被查封,名单一份份递上来。将军们的电话安静得很——那种不接电话的安静。", "你借一场刺杀拔掉了几个钉子。右翼的报纸停刊了几家。可军营里的沉默比报纸的叫骂更响。你听得见。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "凶手在四十八小时内落网。审判、定罪、量刑,每一步都走在法律的格子里。右翼在观望,自由派在点头,死者的办公室挂上了黑纱。", "你只办了拿枪的那两只手。组织还在,名单还在,仇恨也还在。可法庭的程序一步没有走错。你选择了程序,也就选择了它的速度。" ]>> <<else>> <<set _pool1 to [ "保护法的修订案递到了国会。权限扩大了,范围扩大了,反对的声音也起来了——左翼说你伸手太长,你说这是必要的盾牌。", "新的法令给了政府更多工具。工具箱满了,可递工具的手,从今往后也在被更多人盯着。" ]>> <</if>> <<elseif _ev.deck_id eq "S09">> /* 历史暗涌·黑色国防军 */ <<if _act is "sign">> <<set _pool1 to [ "你把那份密报放回了信封,没有批任何字。军营深处的操练声照旧。你在赌一把大的——赌这些枪将来对准的是外敌。", "默许的代价是装作不知道。协约国的委员会下周就要来查库存。你的将军们保证万无一失。将军们的保证,向来只到出事为止。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "叫停的公函送进了国防部。训练停了,武器库贴了封条。军官们执行了命令——用你能感觉到的那种不情愿。", "你选了外交安全。巴黎那边暂时不会有话说。可柏林军营里的账,从此记在了你头上:政府束缚国防,这四个字会跟着你很久。" ]>> <<else>> <<set _pool1 to [ "收编方案在三个晚上内拟好:名册、编制、军饷,全部换成政府的章。影子部队见到了太阳——代价是他们都记住了自己有牌可打。", "你把体制外的枪收进了体制内。名单交上来的那天,总参谋部的人笑了。你也在笑,只是笑得没有他们放心。" ]>> <</if>> <<elseif _ev.deck_id eq "S10">> /* 历史暗涌·农民拒售 */ <<if _act is "sign">> <<set _pool1 to [ "征粮队下乡了。粮车一车车往城里去,村口的路被圆木堵了两次。城市吃上了饭,乡村记住了刺刀。", "强征的数字达成了。粮仓满了,县政府的报告写了「总体平稳」。报告没写的是,有三户农家连夜举家进了山。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "收购价提了两成。粮贩子重新进了村,粮开始往城里流。同一天,面包铺的价签也换了新数字。两头都在付账。", "你用涨价买来了粮食。农民肯卖了,工人在骂。市场把你的安抚,原封不动转嫁给了另一头。" ]>> <<else>> <<set _pool1 to [ "你让各邦自己去谈。有的邦谈成了议价,有的邦什么也没谈成。粮食还在路上走走停停,你手里没有一张全国性的牌。", "不介入的第三个星期,三座城市的面粉配给降了标准。地方在吵,你在听。有些账目一旦分散,中央就再难收回。" ]>> <</if>> <<elseif _ev.deck_id eq "S11">> /* 历史暗涌·军内密谋 */ <<if _act is "sign">> <<set _pool1 to [ "清洗令下得很快。三个团级军官被带离驻地,办公室的抽屉撬开时没有人反抗。军队安静了——是那种憋着话的安静。", "你动手比他们早。名单上的人连夜被调离、看管、审查。政变没有发生,因为你先开了刀。刀口留下的缝,要用很多年去缝合。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "几个核心人物被调去了无关紧要的边防站。调令写的是「正常轮换」。军队保住了体面,你也买到了安静——至于那些没被调走的,你记下了名字。", "你只动了最上面那几个。震动感控制在军官团能接受的范围里。可你知道,密谋不是几个人,是一种情绪。情绪没有编制,调不走。" ]>> <<else>> <<set _pool1 to [ "密探进了军营。报告一周一份,越写越厚。你比上周多知道了很多名字,政变的时钟却没有停——你只是听清了它走针的声音。", "你选了等。情报一页页积累,证据链在变长。可密谋的人也在等。两条线在赛跑,你押的是你的线更快。" ]>> <</if>> <<elseif _ev.deck_id eq "S12">> /* 历史暗涌·协约国通牒 */ <<if _act is "sign">> <<set _pool1 to [ "接受照会的电文发了出去。占领区的时钟开始往回拨,报纸的黑框少了,街上的骂声多了。你换来的是喘息,押上的是名声。", "你签了。右翼的传单当晚就上了街,标题只有一个词。可占领军在收拾行李,这也是真的。两件事都是真的。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "拒绝照会的声明念得字字清楚。巴黎的回击在三天内到了:制裁加码,铁路封锁延长。民族的腰杆挺直了,国库的底又薄了一层。", "你说不。工厂挂出了旗,酒馆里在唱歌。可财政部的报表在你桌上,数字不会唱歌。" ]>> <<else>> <<set _pool1 to [ "反方案递给了伦敦。你赌的是英法之间那道老裂缝。回电还没有到,谈判桌往上抬了一寸——只有一寸。", "你没有接受,也没有拒绝。你递了一份新的算法上去,把球踢回了协约国内部。英国人收下了文件,脸上没有表情。" ]>> <</if>> <<elseif _ev.deck_id eq "S13">> /* 历史暗涌·新闻审查 */ <<if _act is "sign">> <<set _pool1 to [ "查封令一式七份,分送七家报馆。印刷机停了四台。新闻工会的抗议书当晚送到,可泄密的版面也确实停了。", "审查的章盖了下去。头版安静了,地下的油印小报多了起来。你堵住了前门,后门的动静更大了。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "三家越线的报纸收到了法院传票。政府没有封任何一家报馆,只请它们的编辑去法庭上解释。程序很慢,道理很硬。", "你把争端交给了法庭。起诉书一页页写得很干净。报界松了口气——然后继续写,只是每写一句,都先想想法庭。" ]>> <<else>> <<set _pool1 to [ "你没有签任何管制令。攻击你的报纸照常出刊,泄露的版面照常刊登。你把新闻自由完整地留给了它——连同它捅出的每一个窟窿。", "政府选择了沉默。报纸吵了三天,把你也吵成了话题。可自由派在专栏里承认了一句话:至少它还敢写。这句话,你收下了。" ]>> <</if>> <<elseif _act is "sign">> <<set _pool1 to [ "你拿起了笔。钢笔尖刮过纸的声音--那种细小的、干涩的、不可逆的声音。", "签名的时候,你的手很稳。比你想的要稳。也许是因为你已经习惯了。", "文件生效了。它在桌面上躺了一会儿,然后被秘书拿走了。她没有看你。" ]>> <<elseif _act is "delegate">> <<set _pool1 to [ "你把文件转给了别人。这是一种技巧:让别人做决定,你保留否决权。或者看起来像否决权。", "你安排了一个中间人。这种人在柏林很多--认识所有人,不属于任何人。", "折中方案写好了。各方都不满意,这通常意味着它是对的。或者至少是活着的。" ]>> <<else>> <<set _pool1 to [ "你把文件放到「待定」那摞。它会在那里等。文件有耐心,柏林的问题没有。", "你没有签字,也没有拒绝。你只是把它翻了过去。像翻过一页日历。", "抽屉关上的声音很轻。但魏玛在角落里动了一下。也许他什么都没看到。也许他什么都看到了。" ]>> <</if>> /* 第二段:环境反应(从叙事池抽取,按世界状态过滤) */ <<set _seg2 to "">> <<pool-draw "echo_environment" 1>> <<if $pool_result.length gt 0>> <<set _seg2 to $pool_result[0].text>> <</if>> /* 第三段:玩家感知(从叙事池抽取,按玩家状态过滤) */ <<set _seg3 to "">> <<pool-draw "echo_perception" 1>> <<if $pool_result.length gt 0>> <<set _seg3 to $pool_result[0].text>> <</if>> /* 第四段:隐藏暗示(40%概率出现,从叙事池抽取) */ <<set _seg4 to "">> <<if random(1, 100) lte 40>> <<pool-draw "echo_hint" 1>> <<if $pool_result.length gt 0>> <<set _seg4 to $pool_result[0].text>> <</if>> <</if>> /* 拼接:专属事件段必留,随机段控制在 1-2 条(不冗余、不刷屏) */ /* 结果主文:定制黄色/白色事件带上该选项的 msg(处理经过+后果),逐段展开;否则用事件池/通用池 */ <<set _opt_res to "">> <<if $world_custom_options and $world_custom_options[_ev.title] and $opt_msg and $opt_msg neq "">> <<set _opt_res to $opt_msg>> <</if>> <<set _paras to []>> <<if _opt_res neq "">> <<set _opt_segs to _opt_res.split("\n")>> <<for _osi to 0; _osi lt _opt_segs.length; _osi++>> <<set _oseg to _opt_segs[_osi].trim()>> <<if _oseg neq "">> <<set _paras.push(_oseg)>> <</if>> <</for>> <<else>> /* 红色/危机事件的逐选项专属反馈通道:选项里写了 $opt_msg1 就优先用它(用完即清) */ <<if $opt_msg1 and $opt_msg1 neq "">> <<set _f1 to $opt_msg1>> <<set $opt_msg1 to "">> <<else>> <<set _f1 to _pool1[random(0, _pool1.length - 1)]>> <</if>> <<set _paras.push(_f1)>> <</if>> /* 收集可用随机段(环境/感知/暗示) */ <<set _rpool to []>> <<if _seg2 neq "">><<set _rpool.push(_seg2)>><</if>> <<if _seg3 neq "">><<set _rpool.push(_seg3)>><</if>> <<if _seg4 neq "">><<set _rpool.push(_seg4)>><</if>> /* 随机段至少抽 1 条,55% 概率加第 2 条(不重复),压在结果主文之后当氛围 */ <<if _rpool.length gt 0>> <<set _pi to random(0, _rpool.length - 1)>> <<set _paras.push(_rpool[_pi])>> <<if _rpool.length gt 1 and random(1, 100) lte 55>> <<set _pj to random(0, _rpool.length - 1)>> <<if _pj eq _pi>><<set _pj to (_pj + 1) % _rpool.length>><</if>> <<set _paras.push(_rpool[_pj])>> <</if>> <</if>> /* 渲染为独立段落(fb-seg),避免 \n 在 HTML 里折叠成一段而粘连成团 */ <<set _feedback_text to "">> <<for _fi to 0; _fi lt _paras.length; _fi++>> <<set _feedback_text to _feedback_text + '<p class="' + _fb_class + '">' + _paras[_fi] + '</p>'>> <</for>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ 危机事件订制选项(C01-C04,V0.8 给世界接牙) 每个危机 5 个专属选项,其中含一个「最坏选项」: 爆发时相关变量已 ≥90(底子烂穿)且选最坏选项 -> 直接 End_Death。 死亡判定走 crisis-death-check widget(File_Result 渲染前调用)。 ════════════════════════════════════════════════════════════ */ <<widget "render-crisis-options">>\ <<silently>> <<set _ev to $args[0]>> /* 清掉上一次可能残留的选项专属反馈(防跨事件泄漏) */ <<set $opt_msg1 to "">> <</silently>>\ <<if _ev.deck_id eq "C01">>\ ''街垒立起来了。你的命令:'' <span class="red-choice"><<link "颁布紧急状态,军队上街戒严" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "颁布紧急状态,军队上街戒严">>\ <<apply-red-fx {political_violence:-8, army_influence:6, gov_trust:-4, spd:-3, kpd:-5, army:4, fatigue:6} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政治暴力 -8|军方影响 +6|政府信任 -4|SPD信任 -3|KPD信任 -5|军方信任 +4|疲惫 +6@@<</if>> //(军队压得住街面,压不住牙缝里的话。左翼会记住是谁请来的枪。)// <span class="red-choice"><<link "同时约谈左右两翼,强制停火谈判" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "约谈左右两翼,强制停火谈判">>\ <<apply-red-fx {political_violence:-5, gov_trust:3, social_anger:-3, spd:2, dnvp:2, fatigue:8} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政治暴力 -5|政府信任 +3|社会愤怒 -3|SPD信任 +2|DNVP信任 +2|疲惫 +8@@<</if>> //(把仇人按在同一张桌前。桌子随时会翻,但今晚没翻。)// <span class="red-choice"><<link "只保护政府机关,其余街区放任自流" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "只保护政府机关,其余街区放任自流">>\ <<set $crisis_death_check to "C01">>\ <<apply-red-fx {political_violence:5, social_anger:6, gov_trust:-5, economy:3, fatigue:3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政治暴力 +5|社会愤怒 +6|政府信任 -5|经济压力 +3|疲惫 +3@@<</if>> //(你保住了大楼,丢了街道。街上的人记住了谁没来。)// <span class="red-choice"><<link "武装工会纠察队,让工人自己守自己的街" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "武装工会纠察队,让工人自己守自己的街">>\ <<apply-red-fx {political_violence:-4, revolution:4, spd:4, kpd:3, army:-5, dnvp:-3, fatigue:5} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政治暴力 -4|革命压力 +4|SPD信任 +4|KPD信任 +3|军方信任 -5|DNVP信任 -3|疲惫 +5@@<</if>> //(枪发出去容易,收回来难。军方在看一份新的报告。)// <span class="red-choice"><<link "让国防军「自由处置」--放开一切限制" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "让国防军自由处置">>\ <<apply-red-fx {political_violence:-10, army_influence:12, revolution:6, social_anger:8, gov_trust:-8, ddp:-6, spd:-6, army:6, fatigue:8} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;政治暴力 -10|军方影响 +12|革命压力 +6|社会愤怒 +8|政府信任 -8|DDP信任 -6|SPD信任 -6|军方信任 +6|疲惫 +8@@<</if>> //(军队问的「自由到什么程度」,你没有回答。他们自己会理解的--按他们的方式。)// <<elseif _ev.deck_id eq "C02">>\ ''起义前夜。你的选择:'' <span class="red-choice"><<link "提前收网,突袭工会总部缴械" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "提前收网,突袭工会总部缴械">>\ <<apply-red-fx {revolution:-12, political_violence:5, social_anger:6, kpd:-8, spd:-3, army:4, gov_trust:2, fatigue:6} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;革命压力 -12|政治暴力 +5|社会愤怒 +6|KPD信任 -8|SPD信任 -3|军方信任 +4|政府信任 +2|疲惫 +6@@<</if>> //(火种被踩灭了。但烧红的地面还在冒烟,仇恨换了个地方埋。)// <span class="red-choice"><<link "深夜密会工人领袖,劝他们等一等" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "深夜密会工人领袖,劝他们等一等">>\ <<apply-red-fx {revolution:-7, spd:3, kpd:2, social_anger:-2, fatigue:7} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;革命压力 -7|SPD信任 +3|KPD信任 +2|社会愤怒 -2|疲惫 +7@@<</if>> //(你赌他们会听。这一次,他们听了。你不知道还有几次。)// <span class="red-choice"><<link "宣布选举让步,换取罢工解散" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "宣布选举让步,换取罢工解散">>\ <<apply-red-fx {revolution:-8, gov_trust:-3, kpd:1, spd:2, ddp:-2, dnvp:-4, economy:2} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;革命压力 -8|政府信任 -3|KPD信任 +1|SPD信任 +2|DDP信任 -2|DNVP信任 -4|经济压力 +2@@<</if>> //(让步买来了今晚。右翼的报纸明早会把「让步」两个字加粗。)// <span class="red-choice"><<link "顺水推舟,承认工人委员会的合法性" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "顺水推舟,承认工人委员会的合法性">>\ /* B 层门闸因果标志:年底 fate ≤ -90 且此 flag 在 → 红色春天替代结局(13_init_world exit_gates) */ <<set $flags.uprising_victory to "victory">>\ <<apply-red-fx {revolution:8, kpd:6, spd:2, army:-6, dnvp:-5, ddp:-5, gov_trust:-5} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;革命压力 +8|KPD信任 +6|SPD信任 +2|军方信任 -6|DNVP信任 -5|DDP信任 -5|政府信任 -5@@<</if>> //(你亲手把牌桌掀给了左翼。军队和右翼在同一个晚上写好了讨伐檄文。)// <span class="red-choice"><<link "任其爆发,等血流干再说" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "任其爆发,等血流干再说">>\ <<set $crisis_death_check to "C02">>\ <<apply-red-fx {revolution:10, political_violence:12, social_anger:10, economy:8, gov_trust:-10, spd:-8, kpd:-4, army:-3, fatigue:5} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;革命压力 +10|政治暴力 +12|社会愤怒 +10|经济压力 +8|政府信任 -10|SPD信任 -8|KPD信任 -4|军方信任 -3|疲惫 +5@@<</if>> //(你关了灯,说睡吧,明天再说。可枪声替所有人做了决定--共和国的名字,今晚被踩在了街垒的烂泥里。)// <<elseif _ev.deck_id eq "C03">>\ ''政变前夜。你的笔:'' <span class="red-choice"><<link "连夜召集内阁,发布坚定抵抗声明" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "连夜召集内阁,发布坚定抵抗声明">>\ <<apply-red-fx {nationalism:-5, army_influence:-6, gov_trust:5, ddp:4, spd:3, dnvp:-4, nsdap:-5, army:-5, fatigue:8} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;民族主义 -5|军方影响 -6|政府信任 +5|DDP信任 +4|SPD信任 +3|DNVP信任 -4|NSDAP信任 -5|军方信任 -5|疲惫 +8@@<</if>> //(凌晨的电台念出你的声明。卡车停在了原地--这一次,他们没敢。但不甘心的人都听见了。)// <span class="red-choice"><<link "秘密谈判,给将军们保留体面的台阶" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "秘密谈判,给将军们保留体面的台阶">>\ <<apply-red-fx {nationalism:-3, army_influence:2, gov_trust:-2, army:3, ddp:-2, fatigue:6} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;民族主义 -3|军方影响 +2|政府信任 -2|军方信任 +3|DDP信任 -2|疲惫 +6@@<</if>> //(你用一半的兵权换了一夜平安。将军们笑着收下了台阶--和台阶下面的一切。)// <span class="red-choice"><<link "争取中下层军官,分化军队" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "争取中下层军官,分化军队">>\ <<apply-red-fx {army_influence:-8, army:-3, dnvp:-2, nsdap:-3, gov_trust:3, ddp:2, fatigue:9} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;军方影响 -8|军方信任 -3|DNVP信任 -2|NSDAP信任 -3|政府信任 +3|DDP信任 +2|疲惫 +9@@<</if>> //(军营里出现了第二声音。军队最恨的不是敌人,是背叛--他们会记住是谁先捅的口子。)// <span class="red-choice"><<link "默许政变条件,换取「秩序过渡」承诺" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "默许政变条件,换取秩序过渡承诺">>\ <<set $crisis_death_check to "C03">>\ /* B 层门闸因果标志:年底 fate ≥ +90 且军政府接管成局 → 向柏林进军替代结局; 取值与 政变之夜 的 清理/蛰伏/裂痕 同字段($mil_outcome) */ <<set $mil_outcome to "得逞">>\ <<apply-red-fx {nationalism:8, army_influence:10, gov_trust:-8, dnvp:5, nsdap:5, army:6, ddp:-8, spd:-7, revolution:5} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;民族主义 +8|军方影响 +10|政府信任 -8|DNVP信任 +5|NSDAP信任 +5|军方信任 +6|DDP信任 -8|SPD信任 -7|革命压力 +5@@<</if>> //(你把钥匙递给了他们,说只借一晚。他们收下了,没说还。)// <span class="red-choice"><<link "拖。什么都不做,赌他们不敢开枪" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "拖。什么都不做,赌他们不敢开枪">>\ <<apply-red-fx {nationalism:4, army_influence:6, gov_trust:-6, political_violence:4, ddp:-3, spd:-2, fatigue:4} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;民族主义 +4|军方影响 +6|政府信任 -6|政治暴力 +4|DDP信任 -3|SPD信任 -2|疲惫 +4@@<</if>> //(你赌对了七成。剩下三成,变成了明天的另外一个前夜。)// <<elseif _ev.deck_id eq "C04">>\ ''货币的心跳快停了。你的方子:'' <span class="red-choice"><<link "全力推出货币改革,抵押一切能抵押的" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "全力推出货币改革,抵押一切能抵押的">>\ <<apply-red-fx {inflation:-20, economy:5, social_anger:-6, gov_trust:4, dvp:5, zentrum:2, ddp:2, spd:2, fatigue:8} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;通胀 -20|经济压力 +5|社会愤怒 -6|政府信任 +4|DVP信任 +5|Zentrum信任 +2|DDP信任 +2|SPD信任 +2|疲惫 +8@@<</if>> //(新钞票从印厂连夜运向全国。你抵押了铁路、矿山和未来--先把今晚买回来再说。)// <span class="red-choice"><<link "配给制:面包和煤由国家直供" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "配给制:面包和煤由国家直供">>\ <<apply-red-fx {social_anger:-8, revolution:-4, economy:4, inflation:-5, spd:4, kpd:2, dvp:-3, gov_trust:2, fatigue:6} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;社会愤怒 -8|革命压力 -4|经济压力 +4|通胀 -5|SPD信任 +4|KPD信任 +2|DVP信任 -3|政府信任 +2|疲惫 +6@@<</if>> //(面包排上了队,怒气进了账本。商人们叫苦,但街上的人今晚有饭吃。)// <span class="red-choice"><<link "严打投机商,枪毙几个平息民愤" "File_Result">> <<set $file_action to "sign">>\ <<set $opt_label to "严打投机商,枪毙几个平息民愤">>\ <<apply-red-fx {social_anger:-5, political_violence:5, economy:2, ddp:-5, dvp:-6, gov_trust:-2, kpd:3, fatigue:4} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;社会愤怒 -5|政治暴力 +5|经济压力 +2|DDP信任 -5|DVP信任 -6|政府信任 -2|KPD信任 +3|疲惫 +4@@<</if>> //(枪响了三声,人群散了。物价一分没降。法律在这三声里裂了道缝。)// <span class="red-choice"><<link "等。市场会自己找到平衡的" "File_Result">> <<set $file_action to "delay">>\ <<set $opt_label to "等。市场会自己找到平衡的">>\ <<set $crisis_death_check to "C04">>\ <<apply-red-fx {inflation:8, social_anger:15, political_violence:12, revolution:6, economy:6, gov_trust:-12, spd:-5, ddp:-4, fatigue:3} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;通胀 +8|社会愤怒 +15|政治暴力 +12|革命压力 +6|经济压力 +6|政府信任 -12|SPD信任 -5|DDP信任 -4|疲惫 +3@@<</if>> //(你把账本合上,说再等等。人群没等--他们砸开了面包店的门,然后是银行的门。怒火从货币烧向了政权的名字本身。)// <span class="red-choice"><<link "向战胜国求援,用国际调停换货币锚定" "File_Result">> <<set $file_action to "delegate">>\ <<set $opt_label to "向战胜国求援,用国际调停换货币锚定">>\ <<apply-red-fx {inflation:-12, intl_trust:5, nationalism:6, dnvp:-4, nsdap:-5, dvp:3, gov_trust:1, fatigue:7} _ev.id>>\ <</link>></span> <<if false>> @@.red-choice-note;通胀 -12|国际信任 +5|民族主义 +6|DNVP信任 -4|NSDAP信任 -5|DVP信任 +3|政府信任 +1|疲惫 +7@@<</if>> //(海外的专家带着金本位的方案来了。马克稳了,报纸的标题只有两个字:投降。)//\ <</if>>\ <</widget>> /* ---------- crisis-death-check:危机死亡判定(宽线) ---------- 在 File_Result 渲染前调用:$crisis_death_check 存了危机ID, 相关变量 ≥90(底子烂穿)时 -> 直接 End_Death(灭亡结局文本现成)。 */ <<widget "crisis-death-check">>\ <<silently>> <<set _cd to $crisis_death_check>> <<if _cd>> <<set _cd_die to false>> <<if _cd eq "C01" and $world.political_violence gte 90>> <<set _cd_die to true>> <<elseif _cd eq "C02" and $world.revolution gte 90>> <<set _cd_die to true>> <<elseif _cd eq "C03" and $world.army_influence gte 90>> <<set _cd_die to true>> <<elseif _cd eq "C04" and $world.social_anger gte 90>> <<set _cd_die to true>> <</if>> <<set $crisis_death_check to null>> <<set $opt_msg1 to "">> <<if _cd_die>> <<set $death_cause to _cd>> <<goto "End_Death">> <</if>> <</if>> <</silently>>\ <</widget>>
/* ============================================================ 选择后果系统:事件主题 × 选择方向 -> 世界变量变化 核心思想(学自 DoL 的"行动密度"): 玩家每次处理事件,选择不只改标签和NPC信任, 还要直接改变 $world 宏观变量(经济/通胀/革命/暴力等)。 这样玩家能立刻看到"我的决定改变了这个国家"。 三种选择方向: - sign(强硬/直接/支持):激化矛盾,短期见效,代价高 - delegate(妥协/间接/沉默):各方微调,代价低,效果弱 - delay(回避/按兵/反对):问题发酵,焦虑上升,但争取时间 事件 tag 决定影响哪些世界变量: - 工人愤怒 -> social_anger, revolution - 经济压力 -> economy, inflation - 民族屈辱 -> nationalism, political_violence - 民族主义 -> nationalism, army_influence - 政治暴力增加 -> political_violence, social_anger - 货币信任下降 -> inflation, gov_trust - 政府信誉 -> gov_trust - 军队不满 -> army_influence ============================================================ */ /* ---------- apply-choice-effects:按主题×方向改世界变量 ---------- 用法:<<apply-choice-effects _ev.tag "sign" _ev.intensity>> 结果存入 $choice_effects_summary(供 File_Result 显示) */ <<widget "apply-choice-effects">>\ <<silently>> <<set _tag to $args[0]>> <<set _dir to $args[1]>> <<set _intensity to $args[2] ? $args[2] : 30>> /* 强度系数:根据事件强度缩放影响 */ <<set _scale to _intensity / 50>> /* 默认效果(无匹配tag时) */ <<set _effects to {}>> /* ---- 按 tag 定义世界效果映射 ---- */ <<if _tag eq "工人愤怒">> <<if _dir eq "sign">> <<set _effects to {social_anger: Math.round(8*_scale), revolution: Math.round(4*_scale), political_violence: Math.round(3*_scale)}>> <<elseif _dir eq "delegate">> <<set _effects to {social_anger: Math.round(-3*_scale), gov_trust: Math.round(2*_scale)}>> <<else>> <<set _effects to {social_anger: Math.round(5*_scale), revolution: Math.round(2*_scale)}>> <</if>> <<elseif _tag eq "经济压力">> <<if _dir eq "sign">> <<set _effects to {economy: Math.round(6*_scale), inflation: Math.round(4*_scale), social_anger: Math.round(3*_scale)}>> <<elseif _dir eq "delegate">> <<set _effects to {economy: Math.round(-2*_scale), gov_trust: Math.round(3*_scale)}>> <<else>> <<set _effects to {economy: Math.round(4*_scale), inflation: Math.round(3*_scale)}>> <</if>> <<elseif _tag eq "民族屈辱">> <<if _dir eq "sign">> <<set _effects to {nationalism: Math.round(7*_scale), political_violence: Math.round(4*_scale)}>> <<elseif _dir eq "delegate">> <<set _effects to {nationalism: Math.round(3*_scale), gov_trust: Math.round(-2*_scale)}>> <<else>> <<set _effects to {nationalism: Math.round(5*_scale), social_anger: Math.round(3*_scale)}>> <</if>> <<elseif _tag eq "民族主义">> <<if _dir eq "sign">> <<set _effects to {nationalism: Math.round(6*_scale), army_influence: Math.round(3*_scale)}>> <<elseif _dir eq "delegate">> <<set _effects to {nationalism: Math.round(2*_scale), gov_trust: Math.round(2*_scale)}>> <<else>> <<set _effects to {nationalism: Math.round(4*_scale), political_violence: Math.round(2*_scale)}>> <</if>> <<elseif _tag eq "政治暴力增加">> <<if _dir eq "sign">> <<set _effects to {political_violence: Math.round(8*_scale), social_anger: Math.round(4*_scale)}>> <<elseif _dir eq "delegate">> <<set _effects to {political_violence: Math.round(-2*_scale), gov_trust: Math.round(2*_scale)}>> <<else>> <<set _effects to {political_violence: Math.round(5*_scale), revolution: Math.round(3*_scale)}>> <</if>> <<elseif _tag eq "货币信任下降">> <<if _dir eq "sign">> <<set _effects to {inflation: Math.round(5*_scale), gov_trust: Math.round(-3*_scale)}>> <<elseif _dir eq "delegate">> <<set _effects to {inflation: Math.round(-2*_scale), gov_trust: Math.round(3*_scale)}>> <<else>> <<set _effects to {inflation: Math.round(4*_scale), social_anger: Math.round(3*_scale)}>> <</if>> <<elseif _tag eq "政府信誉">> <<if _dir eq "sign">> <<set _effects to {gov_trust: Math.round(5*_scale), political_violence: Math.round(3*_scale)}>> <<elseif _dir eq "delegate">> <<set _effects to {gov_trust: Math.round(3*_scale)}>> <<else>> <<set _effects to {gov_trust: Math.round(-4*_scale), social_anger: Math.round(3*_scale)}>> <</if>> <<elseif _tag eq "军队不满" or _tag eq "军方接触">> <<if _dir eq "sign">> <<set _effects to {army_influence: Math.round(6*_scale), political_violence: Math.round(2*_scale)}>> <<elseif _dir eq "delegate">> <<set _effects to {army_influence: Math.round(2*_scale), gov_trust: Math.round(2*_scale)}>> <<else>> <<set _effects to {army_influence: Math.round(3*_scale), nationalism: Math.round(2*_scale)}>> <</if>> <<else>> /* 默认效果(无匹配tag时) */ <<if _dir eq "sign">> <<set _effects to {social_anger: Math.max(2, Math.round(3*_scale)), political_violence: Math.max(1, Math.round(2*_scale))}>> <<elseif _dir eq "delegate">> <<set _effects to {gov_trust: Math.max(1, Math.round(2*_scale))}>> <<else>> <<set _effects to {social_anger: Math.max(1, Math.round(2*_scale))}>> <</if>> <</if>> /* 应用效果到 $world(用 <<run>> 确保在 link 回调里也被持久化) */ <<run (function(){ var eff = _effects; var keys = Object.keys(eff); for (var i = 0; i < keys.length; i++) { var k = keys[i]; var v = eff[k]; if (typeof v === "number" && v !== 0) { State.variables.world[k] = Math.max(0, Math.min(100, (State.variables.world[k] || 0) + v)); } } })()>> /* ---- C 层:把每次事件选择接进 $fate(相位滑轨) ---- 依据 事件tag × 选择方向 给出一个 ± 漂移: sign = 强硬/直接/镇压 → 右向集权(正) delegate= 妥协/斡旋/支援 → 中和(负向) delay = 回避/按兵 → 轻度偏移 数值可在此统一调(目标:日常 ±1~±2 / 明确站队 ±3~±4)。 注意:B 层门闸需要 $fate 突破 ±90,而本层被钳在 $stage.fate_range 内, 突破范围需靠"重大历史抉择"(后续 B 层再引 fate-surge),此处只负责日常累积。 */ <<set _fate_map to { 工人愤怒:{sign:3, delegate:-3, delay:1}, 经济压力:{sign:1, delegate:-1, delay:0}, 民族屈辱:{sign:3, delegate:-1, delay:2}, 民族主义:{sign:3, delegate:-2, delay:2}, 政治暴力增加:{sign:2, delegate:-1, delay:1}, 货币信任下降:{sign:0, delegate:-1, delay:0}, 政府信誉:{sign:1, delegate:1, delay:-1}, 军队不满:{sign:4, delegate:-2, delay:1}, 军方接触:{sign:4, delegate:-2, delay:1} }>> <<set _tagrow to _fate_map[_tag]>> <<if _tagrow>> <<set _fate_drift to _tagrow[_dir] ?? 0>> <<else>> <<set _fate_drift to (_dir eq "sign" ? 1 : 0)>> <</if>> <<if _fate_drift neq 0>> <<fate-shift _fate_drift>> <<set $fate_log.push({ day: $session_day, tag: _tag, dir: _dir, drift: _fate_drift, after: $fate })>> <<if $fate_log.length gt 60>><<set $fate_log.splice(0, $fate_log.length - 60)>><</if>> <</if>> /* 生成可读摘要(供 File_Result 显示) */ <<set _parts to []>> <<for _key range Object.keys(_effects)>> <<set _val to _effects[_key]>> <<set _name to { economy: "经济压力", inflation: "通胀", social_anger: "社会愤怒", nationalism: "民族主义", gov_trust: "政府信任", army_influence: "军方影响", revolution: "革命压力", political_violence: "政治暴力" }>> <<set _label to _name[_key] ?? _key>> <<if _val gt 0>> <<set _parts.push(_label + " +" + _val)>> <<elseif _val lt 0>> <<set _parts.push(_label + " " + _val)>> <</if>> <</for>> <<set $choice_effects_summary to _parts.length gt 0 ? _parts.join(",") : "无显著变化">> /* 累积选择计数 + 每5次触发特殊反馈 */ <<set $stance_feedback to "">> <<if _dir eq "sign">> <<set $player.stance_count.hard to $player.stance_count.hard + 1>> <<if $player.stance_count.hard eq 3>> <<set $stance_feedback to "走廊里的脚步声更急促了。没人再敢在你面前犹豫。">> <<elseif $player.stance_count.hard eq 5>> <<set $stance_feedback to "有人开始在你背后称你为铁手。你分不清这是尊敬还是诅咒。">> <<elseif $player.stance_count.hard eq 8>> <<set $stance_feedback to "你的签名越来越快。笔尖刮过纸面的声音,像刀划过布。">> <</if>> <<elseif _dir eq "delegate">> <<set $player.stance_count.soft to $player.stance_count.soft + 1>> <<if $player.stance_count.soft eq 3>> <<set $stance_feedback to "你开始习惯在签字前多问一句:还有别的方案吗。这句话在柏林比钢笔更危险。">> <<elseif $player.stance_count.soft eq 5>> <<set $stance_feedback to "有人在酒会上说你是懂转弯的人。在柏林,转弯是一种生存技能,也是一种罪名。">> <<elseif $player.stance_count.soft eq 8>> <<set $stance_feedback to "你桌上的文件越来越厚,但签的名字越来越少。你学会了用沉默代替拒绝,用推迟代替反对。">> <</if>> <<elseif _dir eq "delay">> <<set $player.stance_count.wait to $player.stance_count.wait + 1>> <<if $player.stance_count.wait eq 3>> <<set $stance_feedback to "抽屉里的待定文件摞到了第三层。你关抽屉的时候,它发出了一声叹息。也许是你自己的。">> <<elseif $player.stance_count.wait eq 5>> <<set $stance_feedback to "秘书不再催你了。不是因为你说了什么,是因为他学会了看你的眼神--那种再等等的眼神。">> <<elseif $player.stance_count.wait eq 8>> <<set $stance_feedback to "你开始分不清等一等和不处理的区别。也许本来就没有区别。在柏林,时间不是你的盟友,它只是另一个在加速的东西。">> <</if>> <</if>> <</silently>>\ <</widget>>
/* ============================================================ 叙事引擎 · 6级池化系统(V0.2 设计文档) 核心接口:pool-draw / pool-compose / memory-ref 池子分级:L1核心独白 / L2数值回响 / L3环境氛围 / L4 NPC反应 / L5晨间叙事 / L6震荡裂变 ============================================================ */ /* ---------- pool-draw:核心抽取接口(洗牌袋版 · P0③反复读改造) ---------- 用法:<<pool-draw "weimar_core_surface" 1>> 输出:结果存入 $pool_result(数组),每元素为 {entry_id, text, tags, reaction_tags, format, weight} (输出是副本:text_variants 只进输出,不回写池内原文) 反复读三件套: 1. 洗牌袋:每池一袋 $pool_bags[池名](存池内下标)。装袋按权重放 份数(四舍五入,至少1份),洗乱后按序抽取,抽一条出一条, 全袋抽空才重新装袋——每句都露过面才轮到第二轮。 2. 冷却拉长:冷却判定 = 条目 cooldown × _cd_mult(默认 6,调参改 这一处即可)。原 cooldown 1-3 天 → 实际 6-18 天内不重复。 3. 退场制:条目标 max_uses:N,use_count 记已说次数;说满 N 次 在装袋与抽取两处都被排除——整个存档周期不再出现。 兜底:第一遍扫袋全被冷却挡住 → 第二遍忽略冷却再扫(条件与退场 始终生效);两遍全空 → 返回空数组,调用方以 length 守卫决定不显示。 */ <<widget "pool-draw">>\ <<silently>> <<set _pool_name to $args[0]>> <<set _count to $args[1] ? $args[1] : 1>> <<set $pool_result to []>> <<set _picked to []>> <<set _cd_mult to 6>> <<if $pools and $pools[_pool_name] and $pools[_pool_name].length gt 0>> /* 袋容器懒初始化(旧存档没有 $pool_bags 也能直接跑) */ <<if not $pool_bags>><<set $pool_bags to {}>><</if>> <<for _n to 0; _n lt _count; _n++>> /* 袋空(含首次)→ 装袋:权重=份数(四舍五入,至少1份); 说满 max_uses 的条目不装;Fisher-Yates 洗乱 */ <<if not $pool_bags[_pool_name] or $pool_bags[_pool_name].length eq 0>> <<set _bag to []>> <<for _i to 0; _i lt $pools[_pool_name].length; _i++>> <<set _e to $pools[_pool_name][_i]>> <<if not (_e.max_uses and _e.use_count gte _e.max_uses)>> <<set _w to _e.weight ? _e.weight : 1>> <<set _copies to Math.max(1, Math.round(_w))>> <<for _c to 0; _c lt _copies; _c++>> <<set _bag.push(_i)>> <</for>> <</if>> <</for>> <<for _i to _bag.length - 1; _i gt 0; _i-->> <<set _j to random(0, _i)>> <<set _tmp_i to _bag[_i]>> <<set _bag[_i] to _bag[_j]>> <<set _bag[_j] to _tmp_i>> <</for>> <<set $pool_bags[_pool_name] to _bag>> <</if>> <<set _bag to $pool_bags[_pool_name]>> /* 扫袋:第一遍冷却生效;全被挡则第二遍忽略冷却(条件/退场始终生效) */ <<set _pick_k to -1>> <<for _pass to 0; _pass lt 2 and _pick_k lt 0; _pass++>> <<for _k to 0; _k lt _bag.length and _pick_k lt 0; _k++>> <<set _idx to _bag[_k]>> <<if _idx gte 0 and _idx lt $pools[_pool_name].length>> <<set _e to $pools[_pool_name][_idx]>> <<set _ok to true>> /* 退场:说满 max_uses 永不再出 */ <<if _e.max_uses and _e.use_count gte _e.max_uses>> <<set _ok to false>> <</if>> /* 冷却:×_cd_mult 拉长;第二遍忽略 */ <<if _ok and _pass eq 0 and _e.cooldown gt 0 and _e.last_picked gte 0>> <<if $session_day - _e.last_picked lt _e.cooldown * _cd_mult>> <<set _ok to false>> <</if>> <</if>> /* 条件检查(沿用原版口径) */ <<if _ok and _e.conditions and _e.conditions.length gt 0>> <<for _ci to 0; _ci lt _e.conditions.length; _ci++>> <<set _c to _e.conditions[_ci]>> <<if _c.type is "stat">> /* 数值比较:从 $weimar / $player / $npcs 等取值 */ <<set _val to null>> <<if _c.key.startsWith("weimar.")>> <<set _parts to _c.key.split(".")>> <<if _parts.length eq 3>> <<set _val to $weimar[_parts[1]][_parts[2]]>> <<elseif _parts.length eq 2>> <<set _val to $weimar[_parts[1]]>> <</if>> <<elseif _c.key.startsWith("world.")>> <<set _parts to _c.key.split(".")>> <<if _parts.length eq 2>> <<set _val to $world[_parts[1]]>> <</if>> <<elseif _c.key.startsWith("player.")>> <<set _parts to _c.key.split(".")>> <<if _parts.length eq 3>> <<set _val to $player[_parts[1]][_parts[2]]>> <</if>> <<elseif _c.key is "session_day">> <<set _val to $session_day>> <<elseif _c.key is "legacy_pool.length">> <<set _val to $legacy_pool.length>> <</if>> <<if _val neq null>> <<if _c.op is "gte" and _val lt _c.val>><<set _ok to false>> <<elseif _c.op is "lte" and _val gt _c.val>><<set _ok to false>> <<elseif _c.op is "gt" and _val lte _c.val>><<set _ok to false>> <<elseif _c.op is "lt" and _val gte _c.val>><<set _ok to false>> <<elseif _c.op is "eq" and _val neq _c.val>><<set _ok to false>> <</if>> <</if>> <<elseif _c.type is "date">> <<if _c.month neq $date.month or _c.day neq $date.day>> <<set _ok to false>> <</if>> <<elseif _c.type is "region">> <<if $current_region and $regions[$current_region]>> <<set _rval to $regions[$current_region][_c.key]>> <<if _c.op is "gte" and _rval lt _c.val>><<set _ok to false>> <<elseif _c.op is "lte" and _rval gt _c.val>><<set _ok to false>> <</if>> <</if>> <</if>> <</for>> <</if>> <<if _ok>> <<set _pick_k to _k>> <</if>> <<else>> /* 越界残签(池子数据更新防护):剔出袋 */ <<set _bag.splice(_k, 1)>> <<set _k to _k - 1>> <</if>> <</for>> <</for>> /* 抽中:出袋 + 记账(冷却起点/退场计数)+ 组装输出 + 写叙事记忆 */ <<if _pick_k gte 0>> <<set _idx to _bag[_pick_k]>> <<set _e to $pools[_pool_name][_idx]>> <<set _bag.splice(_pick_k, 1)>> <<set _e.last_picked to $session_day>> <<set _e.use_count to (_e.use_count ? _e.use_count : 0) + 1>> <<set _out_text to _e.text>> <<if _e.text_variants and _e.text_variants.length gt 0>> <<set _out_text to _e.text_variants[random(0, _e.text_variants.length - 1)]>> <</if>> <<set _picked.push({ entry_id: _e.entry_id, text: _out_text, tags: _e.tags ? _e.tags : [], reaction_tags: _e.reaction_tags, format: _e.format ? _e.format : "plain", weight: _e.weight ? _e.weight : 1 })>> <<set $narrative_memory.recent_fragments.push({ entry_id: _e.entry_id, text: _out_text, tags: _e.tags ? _e.tags : [], pool_id: _pool_name, day: $session_day, region_key: $current_region })>> /* 记忆容量限制:保留最近20条 */ <<if $narrative_memory.recent_fragments.length gt 20>> <<set $narrative_memory.recent_fragments.shift()>> <</if>> <</if>> <</for>> <</if>> <<set $pool_result to _picked>> <</silently>>\ <</widget>> /* ---------- narrate-choice:选择后叙事接口(V1.1 修订) ---------- 用法:<<narrate-choice>> 在 File_Result 段落调用。 L2 数值回响:每次选择都抽(感官翻译,不是魏玛说话) 魏玛回应:仅在被动触发条件满足时插入(weimar-check-trigger) */ <<widget "narrate-choice">>\ <<silently>> <<set $choice_narration to []>> /* L2 数值回响:根据 $file_action 的副作用抽取(每次都有) */ <<if $file_action is "sign">> <<pool-draw "echo_tension" 1>> <<if $pool_result.length gt 0>> <<set $choice_narration.push($pool_result[0].text)>> <</if>> <<elseif $file_action is "delay">> <<pool-draw "echo_fatigue" 1>> <<if $pool_result.length gt 0>> <<set $choice_narration.push($pool_result[0].text)>> <</if>> <<else>> <<pool-draw "echo_democracy" 1>> <<if $pool_result.length gt 0>> <<set $choice_narration.push($pool_result[0].text)>> <</if>> <</if>> /* 魏玛回应:仅在被动触发条件满足时插入 */ <<weimar-check-trigger>> <<if _weimar_triggered>> <<weimar-speak>> <<if $weimar_line neq "">> <<set $choice_narration.push($weimar_line)>> <</if>> <</if>> <</silently>>\ <<nobr>><<if $choice_narration.length gt 0>> <hr> <<for _i to 0; _i lt $choice_narration.length; _i++>> //<<print $choice_narration[_i]>>//<<if _i lt $choice_narration.length - 1>><br><</if>> <</for>> <</if>><</nobr>>\ <</widget>> /* ---------- narrate-dawn:晨间叙事接口 ---------- 用法:<<narrate-dawn>> 在每日开始时调用,组合天气/身体/城市/低语/遗产/预兆 */ <<widget "narrate-dawn">>\ <<silently>> <<set $dawn_text to []>> /* 天气句 */ <<pool-draw "dawn_weather" 1>> <<if $pool_result.length gt 0>> <<set $dawn_text.push($pool_result[0].text)>> <</if>> /* 城市句:根据最强标签 */ <<pool-draw "dawn_city" 1>> <<if $pool_result.length gt 0>> <<set $dawn_text.push($pool_result[0].text)>> <</if>> /* 预兆句:日期敏感 */ <<pool-draw "dawn_omen" 1>> <<if $pool_result.length gt 0>> <<set $dawn_text.push($pool_result[0].text)>> <</if>> <</silently>>\ <<if $dawn_text.length gt 0>>\ <<for _i to 0; _i lt $dawn_text.length; _i++>>\ //<<print $dawn_text[_i]>>// <</for>>\ <</if>>\ <</widget>> /* ---------- memory-ref:记忆引用接口 ---------- 用法:<<memory-ref "left" 2>> 返回最近N天内匹配tag的记忆文本,存入 _mem_text */ <<widget "memory-ref">>\ <<silently>> <<set _tag to $args[0]>> <<set _days to $args[1] ? $args[1] : 3>> <<set _mem_text to "">> <<set _matches to []>> <<for _i to 0; _i lt $narrative_memory.recent_fragments.length; _i++>> <<set _frag to $narrative_memory.recent_fragments[_i]>> <<if $session_day - _frag.day lte _days>> <<if _frag.tags.includes(_tag)>> <<set _matches.push(_frag.text)>> <</if>> <</if>> <</for>> <<if _matches.length gt 0>> <<set _mem_text to _matches[random(0, _matches.length - 1)]>> <</if>> <</silently>>\ <</widget>>
/* ============================================================ 系统节拍器(V0.4-E 第六章数据流) 按"每日/每月1日/每60天"三个节奏调度后台更新。 本波只跑后台部分,前台部分(文件生成/报纸/夜话)留空钩子, 待第二波接入。 ============================================================ */ /* ---------- daily-tick:推进一天并执行当日后台更新 ---------- 用法:<<daily-tick>> 执行顺序: 每日:日期推进 -> 标签衰减 -> 遗产衰减 -> 遗产苏醒检测 -> 世界模拟(world-tick) -> 压力检测(world-pressure-check) -> 母体冷却(archetype-cooldown-tick) -> 事件池滚动(红色保留) -> 事件聚合 -> 空窗期计数(rest_count) 每月1日额外:惯性共振检测 -> 魏玛表层刷新 每60天额外:强制惯性检查(审议结算点) */ <<widget "daily-tick">>\ <<silently>> /* === 存昨日快照(在推进日期之前) === */ <<set $world_yesterday to { economy: $world.economy, inflation: $world.inflation, social_anger: $world.social_anger, political_violence: $world.political_violence, nationalism: $world.nationalism, gov_trust: $world.gov_trust, middle_confidence: $world.middle_confidence, revolution: $world.revolution, army_influence: $world.army_influence, fiscal: $world.fiscal ?? 30 }>> /* 信任昨日快照(侧边栏信任卡箭头用) */ <<set $trust_yesterday to {}>> <<set _tys_keys to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army","weimar"]>> <<for _tys_i to 0; _tys_i lt _tys_keys.length; _tys_i++>> <<if $npcs[_tys_keys[_tys_i]]>><<set $trust_yesterday[_tys_keys[_tys_i]] to $npcs[_tys_keys[_tys_i]].trust>><</if>> <</for>> <<if $npcs.dvp_pm and $npcs.dvp_pm.active>><<set $trust_yesterday.dvp_pm to $npcs.dvp_pm.trust>><</if>> /* === 每日 === */ <<advance 1>> <<set $session_day to $session_day + 1>> <<set $daily_event_count to 0>> /* 好感预算周期同步:跨天/跨周清空(渠道防刷双上限) */ <<affinity-cycle-sync>> /* 关系冷却/回温:7天不往来向「常温线30」漂移(77b affinity-drift,公式按idle天数算,幂等) */ <<affinity-drift>> /* 咖啡因系统:每日重置杯数,检查连续饮用 */ <<if $session_day - $coffee_last_day gt 1>> <<set $coffee_streak to 0>> <</if>> <<set $coffee_today to 0>> <<set $kabarett_today to 0>> <<set $today_handled to []>> <<set $mini_today to []>> <<set $region_event_day to {}>> /* 每区每日小事件上限:新的一天各区可重新触发 */ <<set $dialogue_spent to 0>> <<set $chat_bond_today to 0>> /* 每日清零聊天信任累计,bond 本身跨天保留 */ /* 第48条回充:动用后冷却 60 天,到期自动可用 */ <<if $a48 and not $a48.ready and $a48.recharge_day gt 0 and $session_day gte $a48.recharge_day>> <<set $a48.ready to true>> <<set $a48.recharge_day to 0>> <</if>> /* 长线情绪:国家状态每日向目标漂移 mood_base */ <<weimar-mood-drift>> <<weimar-mood-refresh>> /* 魏玛张力日净变化(危机渗透 + 自然衰减一条公式): 日净 = 危机度 − 0.5×(1 − 危机度×0.5)。和平期回落,中危微升,高危净升(恶性循环)。 */ <<weimar-crisis-coef>> <<set _tension_net to _republic_crisis - 0.5 * (1 - _republic_crisis * 0.5)>> <<set $weimar.personality_tension to Math.max(0, $weimar.personality_tension + _tension_net)>> <<weimar-effective-update>> <<weimar-night-convert-check>> <<tag-decay>> <<legacy-decay>> <<legacy-awaken>> /* 世界模拟层:让世界自己演化 */ <<world-tick>> <<world-pressure-check>> <<archetype-cooldown-tick>> /* 生效立法逐日结算:daily 效果 + 到期移除(V0.5-C P0) */ <<active-effects-tick>> /* 国会倒计时/预警级刷新:D-14/D-7/D-3/D-0(V0.5-C P1) */ <<congress-countdown>> /* 文件栏行政瘫痪落档(V0.6-A):先算加权负荷、判瘫痪/四层阶梯、结算 T2/T4、记 T3 */ <<backlog-settle>> /* 白色事件(日常小事件)出牌:负荷门 + 概率;瘫痪(T1+)时门收紧且概率降档 */ <<if not $admin_paralysis and $backlog_score lt 8 and random(1,100) lte 60>> <<white-roll>> <<elseif $admin_paralysis and $backlog_score lt 6 and random(1,100) lte 40>> <<white-roll>> <</if>> /* 挂起托管(治理路线 v2):单日过夜不托管;挂起满 3 天仍未亲手处理的事件, 按当前治理路线自动处置并进晨报(替代旧的白色3天/黄色7天「自动消失」) */ <<route-expire-check>> /* 到期预警链 T-3/T-1(V0.6-A):逐日清空重算,供 Scene_Files / 侧栏展示 */ <<file-expiry-warn>> /* 事件发牌:红色按日期保留,黄白改由母体驱动 */ <<event-pool-roll>> /* 暗账系统:世界越平静积攒越快,满线引爆潜伏危机(27_undercurrent_system) */ <<undercurrent-day>> /* 晨报氛围趋势采样:记录当日世界最险值,供 atmos-trend 判定世道走向 */ <<undercurrent-worst>> <<set $world_trend_log to $world_trend_log || []>> <<set $world_trend_log.push({ d: $session_day, v: _uc_worst })>> <<if $world_trend_log.length gt 10>><<set $world_trend_log.splice(0, $world_trend_log.length - 10)>><</if>> /* 影子内阁:曝光/党争裂痕/编辑人情逐日结算(92_shadow_cabinet) */ <<shadow-day>> /* 魏玛的阶梯:治理天数推进 + 晋级判定(79e/79f) */ <<weimar-ladder-tick>> /* 延迟后续事件检查:到期的 site_followups 推入 pending(长线现场链) */ <<site-followup-check>> /* 现场时限检查:超时的现场做消极处理(前一天清空标记,当天新超时写入 $site_neglect_log 供晨报) */ <<set $site_neglect_log to []>> <<site-expiry-check>> /* 文件篮事件刷新:独立事件层(60件公文决策事件) */ <<fb-roll>> /* 泄压阀门检查:经济压力/社会愤怒顶格满4天 → 强制投递泄压文件(88_file_basket_events) */ <<valve-check>> <<event-aggregate>> /* 报纸系统:每周一自动生成 */ <<newspaper-generate>> /* 空窗期计数:当天没有新事件入pending时递增,有事件时重置 */ <<if $pending_events.length eq 0>> <<set $rest_count to $rest_count + 1>> <</if>> /* 满信任里程碑扫描:捕获非 party-chat 入口跨过的里程碑 */ <<party-milestone-scan>> /* 许诺事件到期晋升:玩家承诺几天后,文件篮必现该事件 */ <<promise-event-promote>> /* 秘密结盟暴露值递增:每3天结算一次 + 四级判定 */ <<secret-exposure-tick>> /* 大联合政府同步:扫温和党成员,>=3 触发活性 */ <<covenant-sync>> /* 大联盟奖励:魏玛张力每周-1(每7天结算一次) */ <<if $covenant and $covenant.active and $session_day % 7 eq 0>> <<set $weimar.personality_tension to Math.max(0, $weimar.personality_tension - 1)>> <</if>> /* 消极处理报告:汇总今日自动/过期/现场超时,供「结束这一天」弹窗展示(V0.5-C) */ <<passive-report-build>> /* === 每月1日 === */ <<if $date.day eq 1>> <<inertia-check>> <<weimar-surface-update>> <<event-father-check>> /* DNVP 遗属抚恤:长期按月扣(共和国为旧名单持续付钱) */ <<if $dnvp_pension>> <<set $world.economy to Math.min(100, $world.economy + 2)>> <<set $world.gov_trust to Math.max(0, $world.gov_trust - 1)>> <</if>> <</if>> /* === 章节结算触发:到达 $stage.meta.end_date(S3=1923-12-31,S2=1921-12-31) === */ <<if $stage and $stage.meta and $stage.meta.end_date and not $chapter_ending_triggered>> <<if $date.year gt $stage.meta.end_date.y or ($date.year eq $stage.meta.end_date.y and ($date.month gt $stage.meta.end_date.m or ($date.month eq $stage.meta.end_date.m and $date.day gte $stage.meta.end_date.d)))>> <<set $chapter_ending_triggered to true>> <</if>> <</if>> /* === 危机链检查(V0.8 给世界接牙):预警倒数/爆发/通胀导火索 === */ <<crisis-check>> /* === 幕间侧写:第20/40/60天生成 === */ <<if $session_day eq 20 or $session_day eq 40 or $session_day eq 60>> <<if $session_day eq 20>><<set $act_num to 1>> <<elseif $session_day eq 40>><<set $act_num to 2>> <<elseif $session_day eq 60>><<set $act_num to 3>> <</if>> <<generate-act-report $act_num>> <</if>> /* === 每60天(审议结算点) === */ <<if $session_day gt 0 and $session_day % 60 eq 0>> <<inertia-check>> <<weimar-surface-update>> <</if>> /* 审议结算点检查每天都要跑(review-check 内部判断是否跨过了60的倍数): 快进/跳天可能整块越过第60天而不落在它上面 */ <<review-check>> <</silently>>\ <</widget>> /* ---------- generate-act-report:幕间人格侧写 ---------- 用法:<<generate-act-report 1>> 根据当前人格状态生成魏玛自我陈述,存入 $act_report */ <<widget "generate-act-report">>\ <<silently>> <<set _act to $args[0]>> <<set _act_names to ["", "鲁尔之冬", "通胀之春夏", "政变之秋"]>> <<set _act_name to _act_names[_act]>> /* 表层情绪描述 */ <<set _mood_text to "">> <<if $weimar.surface.fatigue gte 60>> <<set _mood_text to "疲惫,但不肯闭眼。像是一个守了三天夜的人,知道天快亮了,但不确定来的是日出还是火灾。">> <<elseif $weimar.surface.anxiety gte 40>> <<set _mood_text to "焦虑。像有人在耳边不停地念一个数字,你听不清是什么数字,但你知道它在涨。">> <<elseif $weimar.mid.democracy_trust gte 60>> <<set _mood_text to "平静。不是安心的平静,是暴风眼里的平静。你知道外面在刮,但此刻,这里不刮。">> <<else>> <<set _mood_text to "沉默。不是没话说,是说了也没用。他学会了一种新的语言:等待。">> <</if>> /* 生存策略描述 */ <<set _strategy_text to "">> <<if $weimar.mid.democracy_trust gte 50 and $weimar.mid.army_dependence lt 40>> <<set _strategy_text to "他仍然相信共和国。不是信仰,是习惯--像呼吸一样,你不会因为空气不好就不呼吸。但他开始怀疑自己的肺够不够用。">> <<elseif $weimar.mid.army_dependence gte 50>> <<set _strategy_text to "他越来越多地看向蒂尔加滕的方向。不是因为爱,是因为冷。军队是冬天里唯一还在冒烟的烟囱。但靠得太近,你会烫伤。">> <<elseif $weimar.mid.democracy_trust lt 30>> <<set _strategy_text to "他不再相信共和国了。或者说,他相信的共和国和纸上的那个不是同一个。他相信的是一个还没有出现的、也许永远不会出现的东西。">> <<else>> <<set _strategy_text to "他在两种秩序之间摇摆:一种是他出生时听到的,一种是他冷的时候闻到的。两种都不是他的选择,但他必须选一个。">> <</if>> /* 下幕预告 */ <<set _next_text to "">> <<if _act eq 1>> <<set _next_text to "春天来了,但纸马克正在发芽。有人在新西部用美元买面包,有人在国会用演讲买时间。你建立的秩序能撑过这个夏天吗?">> <<elseif _act eq 2>> <<set _next_text to "秋天了。慕尼黑的枪声在柏林的地下室里回响。你将面临一个选择:这个共和国,到底用什么方式活下去?">> <<else>> <<if $stage.id eq "S2">> <<set _next_text to "这一年要结束了。你陪他跑过了没有玩具的童年。但童年的伤不会因为长大就消失--有些东西埋进了他的骨头里。">> <<else>> <<set _next_text to "1923年要结束了。你活过了这一年。但活过不等于活下来。有些东西在1923年死了,只是还没倒下。">> <</if>> <</if>> /* 拼接侧写 */ <<set $act_report to { act: _act, act_name: _act_name, date: $date.year + "年" + $date.month + "月" + $date.day + "日", mood_text: _mood_text, democracy: Math.round($weimar.mid.democracy_trust), army: Math.round($weimar.mid.army_dependence), intl: Math.round($weimar.mid.intl_trust), reform: Math.round($weimar.mid.reform_will), strategy_text: _strategy_text, will: Math.round($weimar.core.will_to_exist), identity: Math.round($weimar.core.republic_identity), next_text: _next_text }>> <</silently>>\ <</widget>> /* ---------- tick-month:快速推进一个月 ---------- 用法:<<tick-month>> 推进到下月同日(约30天) */ <<widget "tick-month">>\ <<silently>> /* 推进到「次月同日」(若同日超出目标月天数则钳制到该月最后一天)。 按真实月长(28/29/30/31 天,含 2 月闰年)逐日 tick,不能一律 +30 天。 */ <<set _dimL to [0,31,28,31,30,31,30,31,31,30,31,30,31]>> <<set _ty to $date.year>> <<set _tm to $date.month + 1>> <<if _tm gt 12>><<set _tm to 1>><<set _ty to _ty + 1>><</if>> <<set _tdim to _dimL[_tm]>> <<if _tm eq 2 and (_ty % 4 eq 0)>><<set _tdim to 29>><</if>> <<set _td to Math.min($date.day, _tdim)>> /* 从当前日走到目标日,数出天数 */ <<set _t_days to 0>> <<set _y to $date.year>> <<set _m to $date.month>> <<set _d to $date.day>> <<for _tg to 0; (_y lt _ty) or (_y eq _ty and _m lt _tm) or (_y eq _ty and _m eq _tm and _d lt _td); _tg++>> <<set _d++>> <<set _dim to _dimL[_m]>> <<if _m eq 2 and (_y % 4 eq 0)>><<set _dim to 29>><</if>> <<if _d gt _dim>><<set _d to 1>><<set _m++>><<if _m gt 12>><<set _m to 1>><<set _y++>><</if>><</if>> <<set _t_days to _t_days + 1>> <</for>> <<for _i to 0; _i lt _t_days; _i++>> <<daily-tick>> <</for>> <</silently>>\ <</widget>> /* ---------- tick-cycle:推进一个60天审议周期 ---------- 用法:<<tick-cycle>> 不跑60次完整 daily-tick(会卡死浏览器),而是: 1. 日期推进60天 2. 标签衰减一次(按60天累计衰减率) 3. 遗产衰减一次(按60天累计) 4. 惯性检查 5. 魏玛表层刷新 */ <<widget "tick-cycle">>\ <<silently>> <<advance 60>> <<set $session_day to $session_day + 60>> /* 标签批量衰减:60天 = 0.95^60 ≈ 0.046,几乎归零 */ <<for _i to 0; _i lt $active_tags.length; _i++>> <<if $active_tags[_i].status is "active">> <<set $active_tags[_i].intensity to $active_tags[_i].intensity * Math.pow($active_tags[_i].decay_rate, 60)>> <<if $active_tags[_i].intensity lt 1>> <<set $active_tags[_i].status to "dormant">> <<set $active_tags[_i].intensity to 0>> <</if>> <</if>> <</for>> /* 遗产衰减一次(legacy-decay 内部已按月数计算,传一次即可) */ <<legacy-decay>> <<legacy-awaken>> /* 惯性检查 + 魏玛刷新 */ <<inertia-check>> <<weimar-surface-update>> /* 60天审议结算点检查:挂起审议,强制通知 */ <<review-check>> /* 世界模拟层:快进期间世界也要演化(跑一次60天累计) */ <<world-tick>> <<world-pressure-check>> <<archetype-cooldown-tick>> /* 泄压阀门:快进落地后同样检查一次(顶格压力不该被跳天数躲掉) */ <<valve-check>> /* 持续效果补算:快进60天,生效中的法案/余波照常滴灌60天(不补算=冻结) */ <<active-effects-tick 60>> /* 危机链检查(V0.8 给世界接牙):60天快进同样可能引爆危机线 */ <<crisis-check 60>> /* 秘密结盟暴露:跳天数也要按每3天累计(60天=20次结算),防跳天数规避暴露 */ <<for _scy to 0; _scy lt 60; _scy++>> <<secret-exposure-tick>> <</for>> /* 关系冷却/回温:60天快进批结算(affinity-drift 按 idle 天数算累计漂移,一次到位) */ <<affinity-drift>> /* 暗账系统:快进60天按累计演化+检查引爆(防跳天数把暗账挂机攒满也照爆) */ <<undercurrent-day 60>> /* 晨报氛围趋势采样(快进后记一笔当日值,与此前采样衔接成趋势) */ <<undercurrent-worst>> <<set $world_trend_log to $world_trend_log || []>> <<set $world_trend_log.push({ d: $session_day, v: _uc_worst })>> <<if $world_trend_log.length gt 10>><<set $world_trend_log.splice(0, $world_trend_log.length - 10)>><</if>> /* 影子内阁:快进60天曝光照常累积(0.4/人/天×60,防跳天数把视线挂机清零) */ <<shadow-day 60>> /* 红色事件补发:快进期间跳过的红色事件按日期全部发牌(兼容带年份的 S2 牌) */ <<if $event_deck>> <<for _di to 0; _di lt $event_deck.length; _di++>> <<set _card to $event_deck[_di]>> <<if _card.level is "red" and not _card.dealt>> <<set _past to (_card.date.m lt $date.month or (_card.date.m eq $date.month and _card.date.d lte $date.day))>> <<if _card.date.y>> <<set _past to (_card.date.y lt $date.year or (_card.date.y eq $date.year and (_card.date.m lt $date.month or (_card.date.m eq $date.month and _card.date.d lte $date.day))))>> <</if>> <<if _past>> /* 该红色事件的日期已过,补发 */ <<set $event_deck[_di].dealt to true>> <<set _use_swell to null>> /* 暗涌判定(两道门+一颗骰子,见 63_swell_gate):快进补发同样走新判定 */ <<if $swell_events>> <<for _si to 0; _si lt $swell_events.length; _si++>> <<set _sw to $swell_events[_si]>> <<if _sw.target eq _card.id and not _use_swell>> <<swell-maybe-fire _sw>> <<if $tmp_sw_fire>> <<set _use_swell to _sw>> <</if>> <</if>> <</for>> <</if>> <<set $event_counter to $event_counter + 1>> <<if _use_swell>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _use_swell.id, source: "swell", lifecycle: "era", irreversible: _use_swell.irreversible, intensity: _use_swell.intensity, related_tag: _use_swell.tag, tag: _use_swell.tag, title: _use_swell.title, description: _use_swell.desc, template: _use_swell.template, swell_replaces: _card.id, born_date: { year: (_card.date.y ? _card.date.y : $date.year), month: _card.date.m, day: _card.date.d }, status: "pending" })>> <<else>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _card.id, source: "historical", lifecycle: "era", irreversible: _card.irreversible, intensity: _card.intensity, related_tag: _card.tag, tag: _card.tag, title: _card.title, description: _card.desc, template: _card.template, born_date: { year: (_card.date.y ? _card.date.y : $date.year), month: _card.date.m, day: _card.date.d }, status: "pending" })>> <</if>> <</if>> <</if>> <</for>> <</if>> /* pending 队列上限:超出则挤掉最旧(防快进积压);红色巨浪/暗涌/危机豁免 */ <<pending-cap-trim>> /* 事件池滚动一次(黄白事件) */ <<event-pool-roll>> /* 黄/蓝随机事件刷新:60天档位(2 + floor(40/10) = 6 件) */ <<skip-refresh-minor 60>> /* 报纸补发:快进跳过的每个周一各补一份(落点是周一也照出) */ <<newspaper-catchup>> /* 延迟回访:快进里到期的「本子上记的事」落地即进案头(与 tp-skip-to-event 同口径, 不再等下一个自然日) */ <<site-followup-check>> /* 治理路线托管(v2):快进60天里挂起的事件按路线处置,汇总进消极报告 */ <<route-expire-check>> /* 现场时限检查:快进期间超时的现场做消极处理(先清日志,防与过夜残留混叠; passive-report-build 会把 $site_neglect_log 消费进报告——2026-10-09 补齐,此前 60 天快进可躲掉现场时限) */ <<set $site_neglect_log to []>> <<site-expiry-check>> <<passive-report-build>> <<event-aggregate>> /* ── 落地日逐日系统补算(2026-10-09 日期规则统一,与 tp-skip-to-event 12.6 同口径)── */ /* 落地日=新的一天:每日限额与计数重置 */ <<set $daily_event_count to 0>> <<affinity-cycle-sync>> <<set $coffee_today to 0>> <<set $kabarett_today to 0>> <<set $mini_today to []>> <<set $region_event_day to {}>> <<set $dialogue_spent to 0>> <<set $chat_bond_today to 0>> /* 章节结算检测:快进60天同样可能跨过 $stage.meta.end_date(此前只有 daily-tick/跳天有,快进可越过章节节点) */ <<if $stage and $stage.meta and $stage.meta.end_date and not $chapter_ending_triggered>> <<if $date.year gt $stage.meta.end_date.y or ($date.year eq $stage.meta.end_date.y and ($date.month gt $stage.meta.end_date.m or ($date.month eq $stage.meta.end_date.m and $date.day gte $stage.meta.end_date.d)))>> <<set $chapter_ending_triggered to true>> <</if>> <</if>> /* 魏玛的阶梯:治理天数按 $session_day 差值幂等推进 */ <<weimar-ladder-tick>> /* 到期预警链 T-3/T-1:按落地日重算 */ <<file-expiry-warn>> /* 满信任里程碑扫描(幂等) */ <<party-milestone-scan>> /* 国会倒计时刷新:侧边栏「开幕倒计时」按落地日重算 */ <<congress-countdown>> <</silently>>\ <</widget>> /* ---------- route-expire-check:挂起满 3 天按治理路线托管(治理路线 v2) ---------- 用法:<<route-expire-check>>(daily-tick 每天调用 / tick-cycle 快进后调用) 单日过夜不托管;事件挂起满 3 天仍未被玩家亲手处理,则按当前治理路线自动处置, 结果经 $route_day_log 汇入晨报(passive-report-build,kind="route"—— 不是「你没处理」,是「已按你的路数办妥」)。 挂起天数:优先 born_day(经历天数差),无则退回 born_date(日历日差,Date 精确计算)。 许诺事件(P 开头 / level promise)不入托管——那是玩家的债,到期走审议清算。 历史巨浪/暗涌/危机(is-red-ev)同样不入托管——一律留给玩家亲手处理 (2026-09-21 用户定;P0-1 吞剧情实锤之二:旧版只豁免 manual_hold, 日常逐日发牌的红卡不带该标记,挂起满 3 天被静默「按路线办妥」)。 剧情级大事(is-major-ev,2026-09-26 用户定)同样不入托管——密使信/国防政策/ 大联盟之争只能玩家亲自拍板;挂满 3 天起改为在晨报里提醒一句,不再代签。 */ <<widget "route-expire-check">>\ <<silently>> <<set $route_day_log to []>> <<set _rx_queue to []>> <<set _rx_wait to []>> <<route-current>> <<for _rxi to 0; _rxi lt $pending_events.length; _rxi++>> <<set _rxe to $pending_events[_rxi]>> <<is-red-ev _rxe>> <<is-major-ev _rxe>> <<set _rx_age to -1>> <<run (function(){ var ev = State.variables.pending_events[State.temporary.rxi]; var age = -1; if (ev.born_day !== undefined && ev.born_day !== null) { age = State.variables.session_day - ev.born_day; } else if (ev.born_date && ev.born_date.month && ev.born_date.day) { var y = ev.born_date.year || State.variables.date.year; var d1 = new Date(y, ev.born_date.month - 1, ev.born_date.day); var d2 = new Date(State.variables.date.year, State.variables.date.month - 1, State.variables.date.day); age = Math.floor((d2 - d1) / 86400000); } State.temporary.rx_age = age; })()>> <<if _rx_age gte 3 and not _ev_is_red and not _ev_is_major and not (_rxe.level is "promise") and not (_rxe.deck_id and _rxe.deck_id.indexOf("P") eq 0) and not _rxe.manual_hold>> <<set _rx_queue.push(_rxe)>> <</if>> <<if _ev_is_major and _rx_age gte 3>> <<set _rx_wait.push(_rxe.title)>> <</if>> <</for>> <<for _rxi to 0; _rxi lt _rx_queue.length; _rxi++>> <<route-resolve _rx_queue[_rxi]>> <<set $route_day_log.push(_rr_log)>> <</for>> /* 大事挂起名单交晨报(passive-report-build 消费后清空);不覆盖也无需判空——每次全量重算 */ <<set $major_wait_log to _rx_wait>> <</silently>>\ <</widget>> /* ---------- passive-report-build:聚合本轮消极处理为报告(V0.5-C) ---------- 用法:<<passive-report-build>>(daily-tick 末尾调用) 把 route(治理路线托管)/ site-expiry / 行政积压 三路日志 汇总进 $passive_report,并置 $passive_report_pending 供「结束这一天」弹窗展示。 */ <<widget "passive-report-build">>\ <<silently>> <<set $passive_report to []>> /* 治理路线托管条目(挂起3天):已按玩家路线办妥,不算「没处理」(治理路线 v2) */ <<if $route_day_log and $route_day_log.length gt 0>> <<for _prr0 to 0; _prr0 lt $route_day_log.length; _prr0++>> <<set _prl to $route_day_log[_prr0]>> <<set $passive_report.push({ name: _prl.title, kind: "route", route: _prl.route, choice: _prl.choice, eff: _prl.eff, delta: (_prl.notes and _prl.notes.length gt 0) ? _prl.notes.join(";") : "" })>> <</for>> <<set $route_day_log to []>> <</if>> /* 剧情级大事挂满3天:路线托管已豁免不代签,这里改为晨报一句提醒(等玩家亲自决定) */ <<if $major_wait_log and $major_wait_log.length gt 0>> <<for _mw0 to 0; _mw0 lt $major_wait_log.length; _mw0++>> <<set $passive_report.push({ name: "《" + $major_wait_log[_mw0] + "》还压在案头,标着「后果深远」", kind: "note", eff: "它不归路线管,等你亲自决定。", delta: "" })>> <</for>> <<set $major_wait_log to []>> <</if>> /* 国会动静(缺席自动结算 / 第48条否决,72_review_system 写入整句日志):原样进报告 */ <<if $auto_stance_log and $auto_stance_log.length gt 0>> <<for _pra to 0; _pra lt $auto_stance_log.length; _pra++>> <<set $passive_report.push({ name: $auto_stance_log[_pra], kind: "note", eff: "", delta: "" })>> <</for>> <<set $auto_stance_log to []>> <</if>> <<if $site_neglect_log>> <<for _prs to 0; _prs lt $site_neglect_log.length; _prs++>> <<set _sit to $site_neglect_log[_prs]>> <<set $passive_report.push({ name: _sit.title, kind: "site", eff: _sit.text, delta: _sit.cost })>> <</for>> <</if>> <<if $backlog_daily_active>> <<set $backlog_daily_active to false>> <<set $passive_report.push({ name: "行政积压", kind: "paralysis", eff: "文牍堆积。机器还在转,只是开始掉零件。", delta: "社会愤怒 +1 · 政府信任 -1" })>> <</if>> /* 好感/信任渠道上限:当日被预算截断的正向赠予,去重摘要为一条(V0.7) */ <<if $affinity_cap_log and $affinity_cap_log.length gt 0>> <<set _aff_days to []>> <<for _aff0 to 0; _aff0 lt $affinity_cap_log.length; _aff0++>> <<set _aff_it to $affinity_cap_log[_aff0]>> <<if _aff_days.indexOf(_aff_it.party) eq -1 and _aff_days.length lt 3>> <<set _aff_days.push(_aff_it.party)>> <</if>> <</for>> <<set _aff_names to []>> <<for _aff1 to 0; _aff1 lt _aff_days.length; _aff1++>> <<set _aff_k to _aff_days[_aff1]>> <<if $npcs and $npcs[_aff_k]>> <<set _aff_names.push(_aff_k.toUpperCase())>> <<else>> <<set _aff_names.push(_aff_k)>> <</if>> <</for>> <<set _aff_has_more to false>> <<if $affinity_cap_log.length gt 3>><<set _aff_has_more to true>><</if>> <<set $affinity_note_daily to "你对" + _aff_names.join("、") + (_aff_has_more ? "等的示好,因过满而未被对方尽数收下。" : "的示好,因过满而未被对方尽数收下。")>> <<set $affinity_cap_log to []>> <</if>> <<set $passive_report_pending to ($passive_report.length gt 0)>> /* 当日日志到这里已消费进 $passive_report,立即清空,避免跨天残留 */ <</silently>>\ <</widget>>
/* ============================================================ 节奏系统 · TP时间点(平衡重构版) 一天6TP(整数):上午/下午/傍晚/夜晚 时段判定:≥5上午 / ≥3下午 / ≥1傍晚 / <1夜晚 时段加成:上午要务+10% / 下午探索+15% / 傍晚社交+3信任 / 夜晚休息+50% 事件消耗TP:重3/常规2/轻1;区域移动近1/中距2/出差3;区域行动1 疲惫四区间:0-30清醒/31-60疲倦/61-80疲惫不堪/81-100崩溃边缘/100强制休息 休息=终止项,剩余TP转化恢复 空窗期递减:1.0->0.85->0.7->0.5->0.3->0.15 ============================================================ */ /* ---------- tp-spend:消耗TP ---------- 用法:<<tp-spend 2>> 或 <<tp-spend 2 10>> 只扣TP和加玩家疲惫,不加魏玛疲惫 魏玛疲惫只在事件结算(File_Result)时单独加 防负数兜底:正常流程应先过 tp-can / tp-guard 拦截; 若仍出现不足(漏网的调用点),TP 只扣到 0 为止,绝不为负。 */ <<widget "tp-spend">>\ <<silently>> <<set _cost to $args[0]>> <<set _fatigue_gain to $args[1] ? $args[1] : 10>> <<set $tp to Math.max(0, $tp - _cost)>> <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + _fatigue_gain)>> <<set $rest_count to 0>> <</silently>>\ <</widget>> /* ---------- tp-can:够不够(只读判定) ---------- 用法:<<tp-can 3>> → 输出 _tp_ok(true/false)与 _tp_need/_tp_have 只算不动账。适合渲染层做「按钮置灰」或选择前自查。 */ <<widget "tp-can">>\ <<silently>> <<set _tp_need to Number($args[0])>> <<set _tp_have to $tp>> <<set _tp_ok to (_tp_have gte _tp_need)>> <</silently>>\ <</widget>> /* ---------- tp-guard-text:拦截弹窗文案(按缺口分档) ---------- 用法:<<tp-guard-text>> → 输出 _tp_guard_text 身体感受起笔,不绑定时段(早晚通用);缺口大=身体先垮,缺口小=心里想但手上没有。 */ <<widget "tp-guard-text">>\ <<silently>> <<set _gap to _tp_need - _tp_have>> <<set _tp_guard_text to "">> <<if _gap gte 2>> <<set _tp_guard_text to "太阳穴突突地跳,眼前的字开始发虚。你比谁都清楚:这件事急不得,也省不得,而你的身体已经先一步替你做了决定。">> <<else>> <<set _tp_guard_text to "心里还想着那件事,手上已经没有力气了。就差一口气,可一口气就是拿不出来。">> <</if>> <</silently>>\ <</widget>> /* ---------- tp-guard:TP不足拦截弹窗(纯拦截 · 零副作用) ---------- 用法:<<tp-guard 3>> 或 <<tp-guard 3 "Scene_Office">> (第二参数=「先放一放」回去的页面,缺省回办公室) 不足时:什么都不动(TP/疲惫/事件/账本全部原样),渲染拦截盒; 足够时:_tp_guard_hit 为 false,页面照常往下走。 */ <<widget "tp-guard">>\ <<silently>> <<set _tp_need to Number($args[0])>> <<set _tp_have to $tp>> <<set _tp_guard_hit to (_tp_have lt _tp_need)>> <<set _tp_guard_back to ($args.length gt 1 and $args[1]) ? $args[1] : "Scene_Office">> <</silently>>\ <<if _tp_guard_hit>>\ <<tp-guard-text>>\ <div class="tp-guard-box">\ <div class="tp-guard-title">手上的力气不够了</div> <div class="tp-guard-body">_tp_guard_text</div> <div class="tp-guard-num">需要 _tp_need 点行动力 · 你还有 _tp_have 点</div> <div class="tp-guard-actions"> <<link "先放一放" _tp_guard_back>><</link>>\ <<link "回去休息">><<goto "Scene_Rest">><</link>>\ </div>\ <div class="tp-guard-note">什么都不会变:这件事还在桌上,等你想好了再来。</div> </div>\ <</if>>\ <</widget>> /* ---------- tp-phase-bonus:时段加成文字提示 ---------- 用法:<<tp-phase-bonus>> 输出存入 _phase_bonus_text */ <<widget "tp-phase-bonus">>\ <<silently>> <<set _phase_bonus_text to "">> <<if $tp_phase eq 1>> <<set _phase_bonus_text to "(上午:处理要务效果+10%)">> <<elseif $tp_phase eq 2>> <<set _phase_bonus_text to "(下午:探索发现率+15%)">> <<elseif $tp_phase eq 3>> <<set _phase_bonus_text to "(傍晚:适合出门走动,见闻更多)">> <<elseif $tp_phase eq 4>> <<set _phase_bonus_text to "(夜晚:休息恢复+50%)">> <</if>> <</silently>>\ <</widget>> /* ---------- tp-apply-bonus:应用时段加成 ---------- 在事件结算后调用,根据当前时段加成 上午:标签强度+10% / 下午:额外产生观察者标签 (原「傍晚:随机NPC信任+3」已移除--白送好感绕过零和与闸门, 好感只能通过亲历的社交/决策获得,V0.8 反平推改造) */ <<widget "tp-apply-bonus">>\ <<silently>> <<if $tp_phase eq 1 and $active_tags.length gt 0>> /* 上午:最后一个活跃标签强度+10% */ <<set _last to $active_tags.length - 1>> <<if $active_tags[_last].status is "active">> <<set $active_tags[_last].intensity to $active_tags[_last].intensity * 1.1>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- tp-check-exhausted:检查疲惫强制休息 ---------- 返回 _force_rest */ <<widget "tp-check-exhausted">>\ <<silently>> <<set _force_rest to false>> <<if $player.mental.fatigue gte 100>> <<set _force_rest to true>> <</if>> <</silently>>\ <</widget>> /* ---------- tp-fatigue-effect:疲惫区间效果 ---------- 用法:<<tp-fatigue-effect>> 根据疲惫区间产生副作用: 31-60疲倦:演讲类选项效果打折(设 _speech_penalty = true) 61-80疲惫不堪:产生焦虑和偏执 81-100崩溃边缘:选项减少(设 _option_reduce = true) 输出 _fatigue_effect_text(文字提示) */ <<widget "tp-fatigue-effect">>\ <<silently>> <<set _f to $player.mental.fatigue>> <<set _fatigue_effect_text to "">> <<set _speech_penalty to false>> <<set _option_reduce to false>> <<if _f gt 40 and _f lte 70>> <<set _fatigue_effect_text to "你有点累了。说话的时候词不达意。">> <<set _speech_penalty to true>> <<elseif _f gt 70 and _f lte 90>> <<set _fatigue_effect_text to "疲惫不堪。胃在缩,手在抖。">> <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 1)>> <<elseif _f gt 90 and _f lt 100>> <<set _fatigue_effect_text to "崩溃边缘。有些选项你看不到了。该回去了。">> <<set _option_reduce to true>> <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 2)>> <</if>> <</silently>>\ <</widget>> /* ---------- tp-rest:休息,终止当天 ---------- 基础恢复45点 + 剩余TP×8的加成 夜晚额外+10点 */ <<widget "tp-rest">>\ <<silently>> <<set _recover to 45 + $tp * 8>> <<if $tp_phase eq 4>><<set _recover to _recover + 10>><</if>> <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - _recover)>> <<set $weimar.surface.fatigue to Math.max(0, $weimar.surface.fatigue - _recover)>> <<set $tp to $tp_max>> <<set $tp_phase to 1>> <<set $rest_count to 0>> <</silently>>\ <</widget>> /* ---------- tp-next-day:进入下一天 ---------- */ <<widget "tp-next-day">>\ <<silently>> <<set $tp to $tp_max>> <<set $tp_phase to 1>> <<daily-tick>> <</silently>>\ <</widget>> /* ---------- tp-skip-calc:只读计算下一次跳过会推进多少天 ---------- 用法:<<tp-skip-calc>> 结果存入 $skip_preview = { days, target_date, cross_review, red_stop } - days:到下一个红色事件日期的天数(固定天数模式:指定天数,撞上红事件日则截停到那天) - target_date:目标日期 {m,d} - cross_review:跳过期间是否跨过国会审议日(60天一议) - red_stop:固定天数模式被红事件截停时的信息 {title, m, d};没撞上则 null 不修改任何状态,供跳转前确认页展示;tp-skip-to-event 内部也复用同一计算。 */ <<widget "tp-skip-calc">>\ <<silently>> <<set _force_days to ($args.length gt 0 and Number($args[0]) gt 0) ? Number($args[0]) : null>> <<set _next_date to null>> <<for _i to 0; _i lt $event_deck.length; _i++>> <<set _card to $event_deck[_i]>> <<if _card.level is "red" and not _card.dealt>> <<set _in_future to false>> <<if _card.date.y>> <<set _in_future to (_card.date.y gt $date.year or (_card.date.y eq $date.year and (_card.date.m gt $date.month or (_card.date.m eq $date.month and _card.date.d gt $date.day))))>> <<else>> <<if _card.date.m gt $date.month or (_card.date.m eq $date.month and _card.date.d gt $date.day)>> <<set _in_future to true>> <</if>> <</if>> <<if _in_future>> <<set _cand_y to (_card.date.y ? _card.date.y : $date.year)>> <<set _cand_ord to _cand_y * 10000 + _card.date.m * 100 + _card.date.d>> <<set _best_ord to null>> <<if _next_date neq null>> <<set _best_ord to ((_next_date.y ? _next_date.y : $date.year) * 10000 + _next_date.m * 100 + _next_date.d)>> <</if>> <<if _best_ord eq null or _cand_ord lt _best_ord>> <<set _next_date to { y: (_card.date.y ? _card.date.y : null), m: _card.date.m, d: _card.date.d }>> <</if>> <</if>> <</if>> <</for>> <<if _next_date eq null>> /* 没有未发的红事件:落到下月1日;12月则跨年到次年1月1日(带准年份, 否则 _nd_ord 会落到「今年的1月1日」而误入按月差近似分支) */ <<if $date.month gte 12>> <<set _next_date to { y: $date.year + 1, m: 1, d: 1 }>> <<else>> <<set _next_date to { y: $date.year, m: $date.month + 1, d: 1 }>> <</if>> <</if>> /* _next_date 可能带 y(S2 牌)也可能不带(S3 牌);统一换算成绝对序号再算天数差 */ <<set _nd_y to (_next_date.y ? _next_date.y : $date.year)>> <<set _nd_ord to _nd_y * 10000 + _next_date.m * 100 + _next_date.d>> <<set _now_ord to $date.year * 10000 + $date.month * 100 + $date.day>> <<set _days to 0>> <<if _nd_ord gte _now_ord and _nd_ord lt _now_ord + 10000>> /* 同年或下一年内:按月历逐月累加(S3 单年 + S2 跨年都覆盖) */ <<set _month_days to [31,28,31,30,31,30,31,31,30,31,30,31]>> <<set _cm to $date.month>> <<set _cd to $date.day>> <<set _cy to $date.year>> <<for _guard to 0; (_cy * 10000 + _cm * 100 + _cd) lt _nd_ord and _guard lt 800; _guard++>> <<set _cd to _cd + 1>> <<set _dim to _month_days[_cm - 1]>> <<if _cm eq 2 and _cy % 4 eq 0>><<set _dim to 29>><</if>> <<if _cd gt _dim>> <<set _cd to 1>> <<set _cm to _cm + 1>> <<if _cm gt 12>> <<set _cm to 1>> <<set _cy to _cy + 1>> <</if>> <</if>> <<set _days to _days + 1>> <</for>> <<else>> /* 兜底(不该走到):按月差近似 */ <<set _month_days to [31,28,31,30,31,30,31,31,30,31,30,31]>> <<set _days to _month_days[$date.month - 1] - $date.day + _next_date.d>> <<set _mm to $date.month + 1>> <<for _i to 0; _i lt 14 and _mm lt _next_date.m; _i++>> <<set _days to _days + _month_days[_mm - 1]>> <<set _mm to _mm + 1>> <</for>> <</if>> <<if _days lt 1>><<set _days to 1>><</if>> /* 固定天数模式:覆盖为指定天数,并算出目标日期(供确认页显示) */ <<if _force_days neq null>> <<set _days to _force_days>> <<set $skip_days to _force_days>> <<run (function(){ var n = State.variables.skip_days; var date = State.variables.date; var monthDays = [0,31,28,31,30,31,30,31,31,30,31,30,31]; var m = date.month, d = date.day, y = date.year; for (var i = 0; i < n; i++) { d++; var dim = monthDays[m]; if (m === 2 && y % 4 === 0) dim = 29; if (d > dim) { d = 1; m++; if (m > 12) { m = 1; y++; } } } State.variables.__skip_target = { y: y, m: m, d: d }; })()>> <<set _next_date to $__skip_target>> <<set $__skip_target to null>> <<set $skip_days to 0>> <</if>> /* 红事件断点(2026-09-21 用户定:特殊事件不能跳过):固定快进的窗口里撞上未发的 红色事件,就把窗口截停到那天——历史巨浪归玩家亲手处理,不按治理路线托管。 「跳到下一事件日」模式天然以红事件日为锚,不走这一步。 */ <<set _red_stop to null>> <<if _force_days neq null and $event_deck>> <<set _red_days to null>> <<set _red_card to null>> <<set _start_ord to $date.year * 10000 + $date.month * 100 + $date.day>> <<set _month_days to [31,28,31,30,31,30,31,31,30,31,30,31]>> <<for _ri to 0; _ri lt $event_deck.length; _ri++>> <<set _rc to $event_deck[_ri]>> <<if _rc.level is "red" and not _rc.dealt>> <<set _rc_ord to (_rc.date.y ? _rc.date.y : $date.year) * 10000 + _rc.date.m * 100 + _rc.date.d>> /* 无年份牌(S3):月日序不大于当前=去年漏下的旧事,不算未来(跨年后防误截停) */ <<set _rc_stale to (not _rc.date.y and (_rc.date.m * 100 + _rc.date.d) lte ($date.month * 100 + $date.day))>> <<if _rc_ord gt _start_ord and not _rc_stale>> /* 逐月累加算红事件日落在窗口内的偏移天数;超出窗口即落空 */ <<set _cm to $date.month>> <<set _cd to $date.day>> <<set _cy to $date.year>> <<set _off to 0>> <<for _rg to 0; _rg lt _days and (_cy * 10000 + _cm * 100 + _cd) lt _rc_ord; _rg++>> <<set _cd to _cd + 1>> <<set _dim to _month_days[_cm - 1]>> <<if _cm eq 2 and _cy % 4 eq 0>><<set _dim to 29>><</if>> <<if _cd gt _dim>> <<set _cd to 1>> <<set _cm to _cm + 1>> <<if _cm gt 12>> <<set _cm to 1>> <<set _cy to _cy + 1>> <</if>> <</if>> <<set _off to _off + 1>> <</for>> <<if (_cy * 10000 + _cm * 100 + _cd) eq _rc_ord>> <<if _red_days eq null or _off lt _red_days>> <<set _red_days to _off>> <<set _red_card to _rc>> <</if>> <</if>> <</if>> <</if>> <</for>> <<if _red_card neq null>> <<set _days to _red_days>> <<set _next_date to { y: _red_card.date.y ? _red_card.date.y : null, m: _red_card.date.m, d: _red_card.date.d }>> <<set _red_stop to { title: _red_card.title, m: _red_card.date.m, d: _red_card.date.d }>> <</if>> <</if>> <<set _cross_review to false>> <<set _next_review to null>> <<set _start_day to $session_day>> <<for _k to _start_day + 1; _k lte _start_day + _days; _k++>> <<if _k gt 0 and _k % 60 eq 0>> <<set _cross_review to true>> /* 只把「本场审议还没开过」的审议日算作拦截点(开过的就放过去) */ <<set _rk to Math.floor(_k / 60) - 1>> <<if $session_review.flags.review_done[_rk] neq true>> <<if _next_review eq null>> <<set _next_review to _k>> <</if>> <</if>> <</if>> <</for>> <<set _days_to_review to _days>> <<set _review_date to null>> <<if _next_review neq null>> <<set _days_to_review to _next_review - _start_day>> /* 审议拦截时真正落地日=审议日;确认页据此说实话(原窗口只到审议为止) */ <<set _month_days to [31,28,31,30,31,30,31,31,30,31,30,31]>> <<set _rm to $date.month>> <<set _rd to $date.day>> <<set _ry to $date.year>> <<for _rw to 0; _rw lt _days_to_review; _rw++>> <<set _rd to _rd + 1>> <<set _rdim to _month_days[_rm - 1]>> <<if _rm eq 2 and _ry % 4 eq 0>><<set _rdim to 29>><</if>> <<if _rd gt _rdim>> <<set _rd to 1>> <<set _rm to _rm + 1>> <<if _rm gt 12>> <<set _rm to 1>> <<set _ry to _ry + 1>> <</if>> <</if>> <</for>> <<set _review_date to { y: _ry, m: _rm, d: _rd }>> <</if>> <<set $skip_preview to { days: _days, target_date: _next_date, cross_review: _cross_review, review_day: _next_review, days_to_review: _days_to_review, review_date: _review_date, red_stop: _red_stop }>> <</silently>>\ <</widget>> /* ---------- tp-skip-to-event:跳到下一个有事件的日子 ---------- 用法:<<tp-skip-to-event>> 查找 $event_deck 里下一个未发牌的红色事件日期, 把日期推进到那天,中间天数批量演化世界。 同时生成1-3条随机托管事件(报刊/秘书/密报/来信)。 结果存入 $skip_info(天数/简报/托管事件列表) */ <<widget "tp-skip-to-event">>\ <<silently>> <<set $skip_info to null>> /* 固定天数模式:传正数则按指定天数跳过;否则跳到下一个红色事件日 */ <<set _skip_arg to ($args.length gt 0 and Number($args[0]) gt 0) ? Number($args[0]) : null>> /* 跳过期间跨越多天,清空当天已处理事务,避免汇报时残留旧事件 */ <<set $today_handled to []>> /* 0. 治理路线 v2:跳过期间积压的事件不再「丢弃」——全部按治理路线托管(见 step 7.6)。 只有许诺(P 前缀 / level promise)永远留给玩家亲手兑现。 */ <<set $skip_pre_pending_count to $pending_events.length>> /* 1-3. 计算目标日期与天数(与跳过前确认页共用同一计算,保证前后一致) */ <<tp-skip-calc _skip_arg>> <<set _next_date to $skip_preview.target_date>> <<set _days to $skip_preview.days>> <<if $skip_preview.review_day neq null>> /* 跳过期间会撞上一场还没开的国会审议——只先跳到审议日那天, 把玩家送去国会;剩下的日子等审议结束后再继续跳(存 continue_skip)。 */ <<set _days to $skip_preview.days_to_review>> <<set $session_review.pending to true>> <<set $session_review.continue_skip to { target_day: $session_day + $skip_preview.days }>> <<else>> <<set $session_review.continue_skip to null>> <</if>> /* 4. 记录跳过前的世界状态 */ <<set _world_before to { economy: $world.economy, inflation: $world.inflation, social_anger: $world.social_anger, political_violence: $world.political_violence, nationalism: $world.nationalism, gov_trust: $world.gov_trust, revolution: $world.revolution, army_influence: $world.army_influence }>> /* 5. 批量推进:日期前进(用 <<run>> 直接操作,不调 <<advance>> 避免嵌套 widget 问题) */ <<set $skip_start_ord to ($date.year * 10000 + $date.month * 100 + $date.day)>> <<set $skip_days to _days>> <<run (function(){ var d = State.variables.skip_days; var date = State.variables.date; var monthDays = [0,31,28,31,30,31,30,31,31,30,31,30,31]; for (var i = 0; i < d; i++) { date.day++; var dim = monthDays[date.month]; if (date.month === 2 && date.year % 4 === 0) dim = 29; if (date.day > dim) { date.day = 1; date.month++; if (date.month > 12) { date.month = 1; date.year++; } } } })()>> <<set $session_day to $session_day + _days>> /* 6. 世界批量演化(S3 读 1923 通胀/经济曲线;S2 等其他章走中性慢漂移) */ <<set $skip_days to _days>> <<run (function(){ var d = State.variables.skip_days; var w = State.variables.world; var dt = State.variables.date; var inS3 = (State.variables.stage && State.variables.stage.id === "S3"); var econDrift = 0.8 * d; if (inS3 && dt.year === 1923 && dt.month > 8 && dt.month < 12) econDrift = 1.5 * d; w.economy = Math.max(0, Math.min(100, w.economy + econDrift * 0.3)); /* 通胀(S3:V0.8 调缓,与 world-tick 新曲线同步:上半年0.1 / 7-8月0.35 / 9-10月0.8 / 崩溃段负值; 非 S3:中性慢跌 0.05/天,无恶性通胀) */ var infDrift = (inS3 ? 0.1 : 0.05) * d; if (inS3 && dt.year === 1923) { if (dt.month >= 7 && dt.month <= 8) infDrift = 0.35 * d; if (dt.month >= 9 && dt.month <= 10) infDrift = 0.8 * d; if (dt.month === 11 && dt.day > 14) infDrift = -3.0 * d; if (dt.month === 12) infDrift = -1.0 * d; } /* 消极抵抗分段雪崩(与 world-tick 同步;仅 S3 会出现该 flag) */ var pasDrift = 0; var pr = State.variables.flags.passive_resistance; if (pr === "full" || pr === "limited") { var pm = (pr === "full") ? 1 : 0.5; if (dt.month <= 5) pasDrift = 0.15 * pm * d; else if (dt.month <= 8) pasDrift = 0.3 * pm * d; else pasDrift = 0.8 * pm * d; } w.inflation = Math.max(0, Math.min(100, w.inflation + infDrift + pasDrift)); w.social_anger = Math.max(0, Math.min(100, w.social_anger + d * 0.1)); w.political_violence = Math.max(0, Math.min(100, w.political_violence + d * 0.08)); w.nationalism = Math.max(0, Math.min(100, w.nationalism + d * 0.05)); w.gov_trust = Math.max(0, Math.min(100, w.gov_trust - d * 0.03)); w.revolution = Math.max(0, Math.min(100, w.revolution + d * 0.04)); w.army_influence = Math.max(0, Math.min(100, w.army_influence + d * 0.03)); })()>> <<set $skip_days to 0>> /* 6.1 持续效果补算:跳过 N 天,生效中的法案/余波照常滴灌 N 天(不补算=冻结) */ <<active-effects-tick _days>> /* 6.2 危机链检查(V0.8 给世界接牙):快进期间世界也在恶化, 倒数按跳过天数累计;爆发则注入红色级待办,托管按治理路线处置(见 step 7.6)。 */ <<crisis-check _days>> /* 6.4 固定天数模式:窗口内撞上的红色事件发牌并挂 manual_hold—— 2026-09-21 用户定:特殊事件不能跳过,历史巨浪一律留给玩家亲手处理。 (正常情况下 tp-skip-calc 已把窗口截停到第一个红事件日,这里只是兜底; 「跳到下一事件日」模式不走这里,它的目标红由 6.5 发牌。) 暗涌判定与 born_date(牌的真实日期)与 tick-cycle 补发/event-pool-roll 同口径 (2026-10-09 日期规则统一:快进发红牌不再绕过暗涌门)。 */ <<if _skip_arg neq null and $event_deck>> <<for _di to 0; _di lt $event_deck.length; _di++>> <<set _card to $event_deck[_di]>> <<if _card.level is "red" and not _card.dealt>> <<set _rd_y to (_card.date.y ? _card.date.y : $date.year)>> <<set _rd_ord to (_rd_y * 10000 + _card.date.m * 100 + _card.date.d)>> <<set _rd_end to ($date.year * 10000 + $date.month * 100 + $date.day)>> <<if _rd_ord gt $skip_start_ord and _rd_ord lte _rd_end>> <<set _use_swell to null>> <<if $swell_events>> <<for _rsi to 0; _rsi lt $swell_events.length; _rsi++>> <<set _rsw to $swell_events[_rsi]>> <<if _rsw.target eq _card.id and not _use_swell>> <<swell-maybe-fire _rsw>> <<if $tmp_sw_fire>><<set _use_swell to _rsw>><</if>> <</if>> <</for>> <</if>> <<set $event_deck[_di].dealt to true>> <<set $event_counter to $event_counter + 1>> <<if _use_swell>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _use_swell.id, source: "swell", lifecycle: "era", irreversible: _use_swell.irreversible, intensity: _use_swell.intensity, related_tag: _use_swell.tag, tag: _use_swell.tag, title: _use_swell.title, description: _use_swell.desc, template: _use_swell.template, swell_replaces: _card.id, born_date: { year: _rd_y, month: _card.date.m, day: _card.date.d }, status: "pending" })>> <<else>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _card.id, source: "historical", lifecycle: "era", irreversible: _card.irreversible, intensity: _card.intensity, related_tag: _card.tag, tag: _card.tag, title: _card.title, description: _card.desc, template: _card.template, manual_hold: true, born_date: { year: _rd_y, month: _card.date.m, day: _card.date.d }, status: "pending" })>> <</if>> <</if>> <</if>> <</for>> <</if>> <<set $skip_start_ord to null>> /* 6.5 发牌:跳到目标日期后,检查当天是否有红色事件需要发牌(兼容 S2 带年份牌) 抵达日的红事件一律挂 manual_hold——2026-09-21 用户定:特殊事件不能跳过, 历史巨浪永远归玩家亲手处理(两种跳法都如此)。 暗涌判定与 event-pool-roll/tick-cycle 同口径(2026-10-09 日期规则统一): 逐日路径在红牌上会掷暗涌门,快进抵达日原本绕过了这道门。 */ <<set $skip_manual_hold to true>> <<if $event_deck>> <<for _i to 0; _i lt $event_deck.length; _i++>> <<set _card to $event_deck[_i]>> <<if _card.level is "red" and not _card.dealt>> <<set _same_day to (_card.date.m eq $date.month and _card.date.d eq $date.day)>> <<if _same_day and _card.date.y>> <<set _same_day to (_card.date.y eq $date.year)>> <</if>> <<if _same_day>> <<set _use_swell to null>> <<if $swell_events>> <<for _esi to 0; _esi lt $swell_events.length; _esi++>> <<set _esw to $swell_events[_esi]>> <<if _esw.target eq _card.id and not _use_swell>> <<swell-maybe-fire _esw>> <<if $tmp_sw_fire>><<set _use_swell to _esw>><</if>> <</if>> <</for>> <</if>> <<set $skip_card_idx to _i>> <<set $skip_card to _card>> <<if _use_swell>><<set $skip_swell to _use_swell>><<else>><<set $skip_swell to null>><</if>> <<set $event_counter to $event_counter + 1>> <<run (function(){ var idx = State.variables.skip_card_idx; var card = State.variables.skip_card; var sw = State.variables.skip_swell; var deck = State.variables.event_deck; var pending = State.variables.pending_events; var ec = State.variables.event_counter; deck[idx].dealt = true; if (sw) { pending.push({ event_id: "EV_" + ec, deck_id: sw.id, source: "swell", lifecycle: "era", irreversible: sw.irreversible, intensity: sw.intensity, related_tag: sw.tag, tag: sw.tag, title: sw.title, description: sw.desc, template: sw.template, swell_replaces: card.id, born_date: { year: (card.date.y ? card.date.y : State.variables.date.year), month: card.date.m, day: card.date.d }, status: "pending" }); } else { pending.push({ event_id: "EV_" + ec, deck_id: card.id, source: "historical", lifecycle: "era", irreversible: card.irreversible, intensity: card.intensity, related_tag: card.tag, tag: card.tag, title: card.title, description: card.desc, template: card.template, manual_hold: State.variables.skip_manual_hold, born_date: { year: State.variables.date.year, month: State.variables.date.month, day: State.variables.date.day }, status: "pending" }); } })()>> <<set $skip_card_idx to null>> <<set $skip_card to null>> <<set $skip_swell to null>> <</if>> <</if>> <</for>> <</if>> <<set $skip_manual_hold to null>> /* 7. 随机托管事件(全部用 <<run>> 一次完成) */ <<set $skip_days_num to _days>> <<run (function(){ var days = State.variables.skip_days_num; var numEvents = 1; if (days > 13) numEvents = 3; else if (days > 6) numEvents = 2; var pool = [ {source:"报刊", text:"这几天的报纸摞在桌上。头条越来越长,字越来越小。", effects:{economy:2, inflation:1}}, {source:"报刊", text:"一份海外报纸混在了本地报纸里。《泰晤士报》评价德国经济:令人担忧的螺旋。你把这个词圈了起来。", effects:{inflation:2, gov_trust:-2}}, {source:"秘书送件", text:"秘书送来一摞签呈。你不在的时候,他按惯例处理了几件小事。其中一件他犹豫了,附了张便条:请您过目,我不敢签。", effects:{gov_trust:1, social_anger:1}}, {source:"秘书送件", text:"秘书告诉你,这几天来过三拨人。一拨找你,一拨找总理,还有一拨不肯说找谁。他都记下了。", effects:{political_violence:1}}, {source:"密报", text:"一份没有署名的密报:巴伐利亚方面有异动。具体不详,但频率在增加。落款处只有一个墨点。", effects:{nationalism:3, political_violence:1}}, {source:"密报", text:"密报:KPD在汉堡码头活动频繁。有人在分发武器。真假不详。你把密报锁进抽屉。", effects:{revolution:3, political_violence:2}}, {source:"密报", text:"军方线人的消息:国防军内部在讨论第48条的适用范围。语气比以前认真。你不知道这意味着什么。也许你不想知道。", effects:{army_influence:3}}, {source:"私人来信", text:"一封来自SPD总部的信。措辞客气,但意思很硬:希望政府能对工人诉求给予更积极的回应。信末盖着党徽。", effects:{social_anger:2, gov_trust:-1}}, {source:"私人来信", text:"DNVP的一封公开信抄本。骂得很狠,但你注意到一个细节:他们没有提共和国三个字。对他们来说,这个政权已经不需要被骂了,只需要被替代。", effects:{nationalism:2, gov_trust:-2}}, {source:"私人来信", text:"一封没有落款的信。字迹很轻,像是怕纸记住。只写了一行:Zentrum在动摇。我们也许能拉过来。你不知道是谁写的,但你把信收好了。", effects:{gov_trust:1}}, {source:"魏玛", text:"魏玛在你不在的几天里写了一些东西。纸条上只有零散的句子:钟摆,太重了,1919年的水还在流。你把纸条折好,放进抽屉。", effects:{}}, {source:"魏玛", text:"魏玛留了一张便条在桌上:有几天没见了。我以为你会走。你没有。这让我觉得你也许会留下。也许。字迹比以前工整了一些。", effects:{gov_trust:1}}, {source:"街头见闻", text:"你不在的几天,街角新开了一家当铺。门口排队的人比面包店还多。在柏林,当铺开得比面包店快,说明有些东西正在被卖掉。", effects:{economy:3, social_anger:2}}, {source:"街头见闻", text:"秘书提到,你办公室窗外的树开花了。你错过了。在柏林,错过一棵树开花不是大事。但错过的时候,你觉得它是。", effects:{economy:-1}} ]; var w = State.variables.world; var picked = []; for (var i = 0; i < numEvents && pool.length > 0; i++) { var idx = Math.floor(Math.random() * pool.length); var evt = pool[idx]; pool.splice(idx, 1); picked.push(evt); var keys = Object.keys(evt.effects); for (var j = 0; j < keys.length; j++) { var k = keys[j]; w[k] = Math.max(0, Math.min(100, (w[k]||0) + evt.effects[k])); } } State.variables.skip_trust_events = picked; })()>> <<set $skip_days_num to 0>> <<set _skip_events to $skip_trust_events>> <<set $skip_trust_events to null>> /* 7.5 黄/蓝随机事件刷新:跳过 N 天,按档位必定补入一批可选随机事件 */ <<skip-refresh-minor _days>> /* 7.55 延迟回访转换:窗口内到期的「本子上记的事」落地即进案头—— 与确认页「会在这段日子里回来」的承诺对齐。原版只在 daily-tick 转换, 跳天落地当天看不到,要等次日早晨才出现(连续跳天甚至一直不出)。 大事回访(fb_data.major→is-major-ev)会被下方托管豁免,原样等玩家; 小事回访按治理路线处置并记入报告(「之前记下的那笔账到期了」)。 */ <<site-followup-check>> /* 7.6 治理路线托管:跳过期间积压的事件(公文/警报/见闻/母体/危机爆发) 按当前治理路线自动处置。历史巨浪/暗涌/危机(is-red-ev)与一切 manual_hold 事件留给玩家亲手处理(2026-09-21 用户定:特殊事件不能跳过); 许诺(P)永远留给玩家;剧情级大事(is-major-ev,2026-09-26 用户定)同样不代签—— 密使信、国防政策、大联盟之争这类选择只能玩家亲自拍板,原样压在案头等回来。 注意必须按「身份」豁免而非只认 manual_hold——日常逐日发牌的红卡 (event-pool-roll)不带 manual_hold,旧版在这里被整段托管掉(P0-1 吞剧情根因)。 */ <<route-current>> <<set $skip_route_name to _route_name>> <<set $route_handled_log to []>> <<set _rr_queue to []>> <<for _rqi to 0; _rqi lt $pending_events.length; _rqi++>> <<set _rqe to $pending_events[_rqi]>> <<is-red-ev _rqe>> <<is-major-ev _rqe>> <<if not _ev_is_red and not _ev_is_major and not _rqe.manual_hold and not (_rqe.level is "promise") and not (_rqe.deck_id and _rqe.deck_id.indexOf("P") eq 0)>> <<set _rr_queue.push(_rqe)>> <</if>> <</for>> <<for _rqi to 0; _rqi lt _rr_queue.length; _rqi++>> <<route-resolve _rr_queue[_rqi]>> <<set $route_handled_log.push(_rr_log)>> /* 托管有代价:每件替你处置的事,魏玛多一分疲惫(跳过确认页承诺过) */ <<set $weimar.surface.fatigue to Math.min(100, ($weimar.surface.fatigue || 0) + 1)>> <</for>> /* 7.7 本周出行(周节奏 v1):跳过的日子里替玩家走一遭—— 一趟区域(氛围句 + 知情者微增)、一次政党拜访(trust-capped 信任+2,吃每日/每周帽与零和)。 出行不占TP,但每次魏玛疲惫+1(与托管同价)。结果写 $skip_outing_log 供汇报页渲染。 */ <<week-outing-exec _days>> /* 7.8 太吾式休整:没干事的日子本身有一点收益——魏玛紧绷小幅松开(至多3)。 平衡取向:跳过仍有世界恶化/积压的代价,这里只回补一点「睡了几宿整觉」。 */ <<set _wo_rest to Math.min(3, _days, ($weimar.personality_tension || 0))>> <<set $weimar.personality_tension to Math.max(0, ($weimar.personality_tension || 0) - _wo_rest)>> /* 8. 标签批量衰减 */ <<for _i to 0; _i lt $active_tags.length; _i++>> <<if $active_tags[_i].status is "active">> <<set $active_tags[_i].intensity to $active_tags[_i].intensity * Math.pow($active_tags[_i].decay_rate, _days)>> <<if $active_tags[_i].intensity lt 1>> <<set $active_tags[_i].status to "dormant">> <<set $active_tags[_i].intensity to 0>> <</if>> <</if>> <</for>> /* 9. 遗产衰减 */ <<legacy-decay>> <<legacy-awaken>> /* 9.5 秘密结盟暴露:跳过期间也要按每3天累计(防跳天数规避暴露) */ <<for _skd to 0; _skd lt _days; _skd++>> <<secret-exposure-tick>> <</for>> /* 10. 月初检查 */ <<if $date.day eq 1>> <<inertia-check>> <<weimar-surface-update>> <</if>> /* 11. 重置 TP 和疲惫 */ <<set $tp to $tp_max>> <<set $tp_phase to 1>> <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - _days * 3)>> <<set $weimar.surface.fatigue to Math.max(0, $weimar.surface.fatigue - _days * 2)>> /* 11.5 周攒行动力:跳过的日子按天攒 TP(至多攒 7 天),回来随玩家一口气用。 不另立账本:只加进 $tp,之后照常每天回满上限,没花掉的自然回落。 */ <<set _tp_bank to Math.min(_days, 7) * $tp_max>> <<set $tp to $tp + _tp_bank>> /* 12. 章节结算检测(按 $stage.meta.end_date,与 daily-tick 同一判定) */ <<if $stage and $stage.meta and $stage.meta.end_date and not $chapter_ending_triggered>> <<if $date.year gt $stage.meta.end_date.y or ($date.year eq $stage.meta.end_date.y and ($date.month gt $stage.meta.end_date.m or ($date.month eq $stage.meta.end_date.m and $date.day gte $stage.meta.end_date.d)))>> <<set $chapter_ending_triggered to true>> <</if>> <</if>> /* 12.5 快进消极节拍结算(V0.5-D S1 改权重):行政负担传导 + 节拍批量生成 + 软封顶积压清算 + 封面叙事 */ <<backlog-score>> <<set $skip_pre_backlog_score to $backlog_score>> <<skip-passive-cadence _days $skip_pre_backlog_score>> /* 12.6 落地日逐日系统补算(2026-10-09 日期规则统一): 跳天不经过 daily-tick,这些「每天都要跑」的子系统原本整段冻结或残留旧值。 此处按跳过天数批量补算/按落地日重算——各 widget 均支持天数参数或按天数差幂等, 与逐日路径、tick-cycle 同口径。只补算、不新增节奏(白色事件/文件篮刷新仍走快进自己的节拍)。 */ /* 落地日=新的一天:每日限额与计数重置(对齐 daily-tick 每日重置块,防残留封死落地日的行动) */ <<set $daily_event_count to 0>> <<affinity-cycle-sync>> <<set $coffee_today to 0>> <<set $kabarett_today to 0>> <<set $mini_today to []>> <<set $region_event_day to {}>> <<set $dialogue_spent to 0>> <<set $chat_bond_today to 0>> /* 暗账/影子内阁:跳过的 N 天照常演化(防跳天数把暗账挂机攒满、曝光挂机清零——与 tick-cycle 同理由) */ <<undercurrent-day _days>> <<shadow-day _days>> /* 晨报氛围趋势采样:补一笔落地日采样(与 daily-tick/tick-cycle 衔接成趋势) */ <<undercurrent-worst>> <<set $world_trend_log to $world_trend_log || []>> <<set $world_trend_log.push({ d: $session_day, v: _uc_worst })>> <<if $world_trend_log.length gt 10>><<set $world_trend_log.splice(0, $world_trend_log.length - 10)>><</if>> /* 魏玛的阶梯:治理天数按 $session_day 差值幂等推进(快进跨越晋级线时落地即晋级) */ <<weimar-ladder-tick>> /* 泄压阀门:顶格压力落地即检查,不留给下一晚(与 tick-cycle 同口径) */ <<valve-check>> /* pending 队列上限:暗账引爆/危机爆发可能已入队,超限挤掉最旧(红卡/大事豁免,与 tick-cycle 同口径) */ <<pending-cap-trim>> /* 到期预警链 T-3/T-1:按落地日重算(原残留的是跳天前的预警名单) */ <<file-expiry-warn>> /* 标签聚合/融合检查(daily-tick 与 tick-cycle 均在结算尾部调用) */ <<event-aggregate>> /* 满信任里程碑扫描:本周出行/托管可能已把某党信任推过档位(幂等扫描) */ <<party-milestone-scan>> /* 国会倒计时刷新:侧边栏「开幕倒计时」按落地日重算(原为跳天前的旧值) */ <<congress-countdown>> /* 13. 生成简报 */ <<set _world_after to { economy: $world.economy, inflation: $world.inflation, social_anger: $world.social_anger, political_violence: $world.political_violence, nationalism: $world.nationalism, gov_trust: $world.gov_trust, revolution: $world.revolution, army_influence: $world.army_influence }>> <<set $skip_info to { days: _days, target_date: { month: _next_date.m, day: _next_date.d }, world_before: _world_before, world_after: _world_after, trust_events: _skip_events, rest_tension: Math.round(_wo_rest), tp_bank: _tp_bank }>> /* 13.5 现场时限检查:快进期间超时的现场做消极处理(同一机制,防跳天数规避时限) 先清空,避免与普通过夜残留的日志混叠 */ <<set $site_neglect_log to []>> <<site-expiry-check>> /* 14. 跳过期间的报纸补发:错过的周一逐份补上(落点当天是周一也照出) */ <<newspaper-catchup>> /* 15. 跳过版消极报告:节拍结算 + 现场超时(治理路线 v2: 「丢弃惩罚」已废除——没有谁被丢弃,每件事都按路线处置并记入托管清单 $route_handled_log) */ <<set $passive_report to []>> <<if $skip_cadence_report and $skip_cadence_report.length gt 0>> <<for _scr to 0; _scr lt $skip_cadence_report.length; _scr++>> <<set $passive_report.push($skip_cadence_report[_scr])>> <</for>> <</if>> <<if $site_neglect_log>> <<for _prs to 0; _prs lt $site_neglect_log.length; _prs++>> <<set _sitd to $site_neglect_log[_prs]>> <<set $passive_report.push({ name: _sitd.title, kind: "site", eff: _sitd.text, delta: _sitd.cost })>> <</for>> <</if>> <<set $passive_report_pending to ($passive_report.length gt 0)>> /* 16. 审议基准日对齐:快进路径不经过逐日 review-check。不把基准日推到落点的话, 第二天的逐日检查会把同一次「跨过60天」再报一遍——第60天开完审议,第61天又弹一次(试玩报告实测)。 */ <<set $review_last_checked_day to $session_day>> <</silently>>\ <</widget>> /* ---------- week-outing-exec:快进/周推进期间执行「本周出行」 ---------- 用法:<<week-outing-exec DAYS>>(tp-skip-to-event 内调用) $week_outings = { region, party, picked_day, auto, pref_region:"hot"|"fresh", pref_party:"estranged"|"close" } 托管(auto=true):region/party 为空时按偏好现场挑—— 出门:hot=已解锁里 danger 最高 / fresh=避开上回($flags.wo_last_region)随机挑; 登门:estranged=信任≥40 里最低 / close=信任最高(不勉强去敌意人家)。 区域出行:region-atmosphere 氛围句 + tag-add 知情者+1;无氛围池的区域用兜底句。 政党拜访:trust-capped 信任+2(吃每日/每周预算帽与零和),文本用政党人格当前档位段。 每次出行魏玛疲惫+1。结果写 $skip_outing_log(汇报页渲染后清空),条目带 auto 标记供汇报页换标题。 */ <<widget "week-outing-exec">>\ <<silently>> <<set $skip_outing_log to []>> <<set _wo_days to Number($args[0]) || 0>> <<if _wo_days gte 1 and $week_outings>> <<set _wo_names to { spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"国防军" }>> <<set _wo_auto to $week_outings.auto ? true : false>> <<if _wo_auto>> /* 托管出门:时局=已解锁里最危险;生疏=避开上回去过的,随机挑 */ <<if not $week_outings.region>> <<set _wo_cand to []>> <<set _wo_rk3 to Object.keys($regions)>> <<for _wo_k3 range _wo_rk3>> <<if $regions[_wo_k3].unlocked>><<set _wo_cand.push(_wo_k3)>><</if>> <</for>> <<if _wo_cand.length gt 0>> <<if $week_outings.pref_region is "fresh">> <<set _wo_cand2 to []>> <<for _wo_k4 range _wo_cand>> <<if _wo_k4 neq $flags.wo_last_region>><<set _wo_cand2.push(_wo_k4)>><</if>> <</for>> <<if _wo_cand2.length gt 0>><<set _wo_cand to _wo_cand2>><</if>> <<set $week_outings.region to _wo_cand[random(0, _wo_cand.length - 1)]>> <<else>> <<set _wo_best to _wo_cand[0]>> <<for _wo_k5 range _wo_cand>> <<if $regions[_wo_k5].danger gt $regions[_wo_best].danger>><<set _wo_best to _wo_k5>><</if>> <</for>> <<set $week_outings.region to _wo_best>> <</if>> <<set $flags.wo_last_region to $week_outings.region>> <</if>> <</if>> /* 托管登门:生疏=信任≥40里最低的;亲近=信任最高的(不勉强去敌意人家) */ <<if not $week_outings.party>> <<set _wo_pl to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]>> <<set _wo_bestp to "">> <<for _wo_k6 range _wo_pl>> <<if $week_outings.pref_party is "close">> <<if _wo_bestp is "" or $npcs[_wo_k6].trust gt $npcs[_wo_bestp].trust>><<set _wo_bestp to _wo_k6>><</if>> <<else>> <<if $npcs[_wo_k6].trust gte 40 and (_wo_bestp is "" or $npcs[_wo_k6].trust lt $npcs[_wo_bestp].trust)>><<set _wo_bestp to _wo_k6>><</if>> <</if>> <</for>> <<set $week_outings.party to _wo_bestp>> <</if>> <</if>> /* 区域出行 */ <<if $week_outings.region and $regions and $regions[$week_outings.region]>>\ <<set _wo_r to $week_outings.region>>\ <<region-atmosphere _wo_r>>\ <<if $atmo_text eq "">>\ <<set $atmo_text to "这一周你抽了一个下午去了趟" + $regions[_wo_r].name + "。没有急事,就是去看看。回来时天已经擦黑,你把大衣上的煤灰掸了掸。">>\ <</if>>\ <<tag-add "知情者" "micro" 1 "情报" "weimar" "outing">>\ <<set $active_tags to $ret>>\ <<set $skip_outing_log.push({ kind: "region", name: $regions[_wo_r].name, text: $atmo_text, auto: _wo_auto })>>\ <<set $weimar.surface.fatigue to Math.min(100, ($weimar.surface.fatigue || 0) + 1)>>\ <</if>>\ /* 政党拜访 */ <<if $week_outings.party and $npcs[$week_outings.party]>>\ <<set _wo_p to $week_outings.party>>\ <<trust-capped _wo_p 2>>\ <<party-personality-show _wo_p>>\ <<set $skip_outing_log.push({ kind: "party", name: _wo_names[_wo_p], text: $ret, auto: _wo_auto })>>\ <<set $weimar.surface.fatigue to Math.min(100, ($weimar.surface.fatigue || 0) + 1)>>\ <</if>>\ <<set $week_outings to null>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- files-batch-route:文件篮批量托管(周节奏 v1,逐日模式用) ---------- 用法:<<files-batch-route>>(Scene_Files 按钮回调) 把所有「低危」待办按治理路线托管(与跳天托管同一套 route-resolve); 每件玩家疲惫+2(route-resolve 内置)+魏玛疲惫+1。 红色巨浪/暗涌/许诺/黄色警报/历史事件/剧情级大事(is-major-ev)一律不动 (比跳天托管更保守——玩家还在场;按钮写着「次等事务」,大事不许混进去)。 日志写 $files_batch_log(Scene_Files 顶部渲染后清空)。 */ <<widget "files-batch-route">>\ <<silently>> <<route-current>> <<set $files_batch_log to []>> /* 先快照再循环:route-resolve 内部会从 $pending_events 摘除已办结事件,边遍历边摘会跳项 */ <<set _fb_queue to []>>\ <<for _fbi to 0; _fbi lt $pending_events.length; _fbi++>>\ <<set _fb_queue.push($pending_events[_fbi])>>\ <</for>>\ <<for _fbq2 to 0; _fbq2 lt _fb_queue.length; _fbq2++>>\ <<set _fbe to _fb_queue[_fbq2]>>\ <<set _fb_low to true>>\ <<if _fbe.deck_id and (_fbe.deck_id.indexOf("Y") eq 0 or _fbe.deck_id.indexOf("R") eq 0 or _fbe.deck_id.indexOf("S") eq 0 or _fbe.deck_id.indexOf("P") eq 0)>><<set _fb_low to false>><</if>>\ <<if _fbe.level is "promise" or _fbe.level is "yellow">><<set _fb_low to false>><</if>>\ <<if _fbe.source is "historical" or _fbe.source is "swell">><<set _fb_low to false>><</if>>\ <<is-major-ev _fbe>>\ <<if _ev_is_major>><<set _fb_low to false>><</if>>\ <<if _fb_low>>\ <<route-resolve _fbe>>\ <<set $files_batch_log.push(_rr_log)>>\ <<set $weimar.surface.fatigue to Math.min(100, ($weimar.surface.fatigue || 0) + 1)>>\ <</if>>\ <</for>>\ <</silently>>\ <</widget>> /* ---------- skip-passive-cadence:快进消极事件定时结算(V0.5-D) ---------- 用法:<<skip-passive-cadence DAYS PRE_PENDING_COUNT>>(tp-skip-to-event 内调用) 让快进≈手动逐日:按「约每5天一拍」的节拍批量生成并消极结算小事件, - 行政负担传导:快进前 pending 件数压低生成率(3件→50% / 4件→25% / ≥5件瘫痪→0%) - 节拍批量:每拍"主件点名(1) + 背景噪音结算(2)",合计数值折进该拍一条回执 - 软封顶积压清算:超20天后每+10天追加1次(对未到期 pending 恶化+10%; 无 pending 则一次性「行政积压」debuff) 结果写进 $skip_cadence_report(name/eff/delta,同 $passive_report 结构)与 $skip_cadence_cover(封面叙事)。 */ <<widget "skip-passive-cadence">>\ <<silently>> <<set $skip_cadence_report to []>> <<set $skip_cadence_cover to "">> <<set _sed_days to Number($args[0]) || 0>> <<set _sed_score to Number($args[1]) || 0>> /* 行政负担(V0.6-A 权重映射):负荷 0-3→全发 / 4-5→50% / 6-7→25% / ≥8(瘫痪)→0% 只结到期 */ <<set _sed_burden to 1>> <<if _sed_score gte 8>><<set _sed_burden to 0>> <<elseif _sed_score gte 6>><<set _sed_burden to 0.25>> <<elseif _sed_score gte 4>><<set _sed_burden to 0.5>> <</if>> <<run (function(){ var days = _sed_days; var burden = _sed_burden; var w = State.variables.world; var rep = State.variables.skip_cadence_report; var minorPool = [ { t:"街角的物价又往上抬了抬", a:1, gv:-1 }, { t:"拖欠的一纸补助函被压进了卷宗", a:1, gv:-1 }, { t:"市政的一次修缮悄无声息地停了", a:1, gv:-1 }, { t:"黑市贩子在巷子里又得了一单", a:1, gv:-1 } ]; /* 节拍数:每5天一拍;不足一拍也抽一次 */ var beats = Math.floor(days / 5); if (beats < 1 && days >= 1) beats = 1; /* 行政负担:burden=0(瘫痪)不再生成新件 */ var effBeats = (burden <= 0) ? 0 : Math.max(0, Math.ceil(beats * burden)); for (var b = 0; b < effBeats; b++) { var mm = minorPool[Math.floor(Math.random() * minorPool.length)]; /* 主件(1) + 背景噪音(2) 一起结算 = 一拍合计 */ var sumA = mm.a, sumT = mm.gv; for (var nb = 0; nb < 2; nb++) { sumA += 1; sumT -= 1; } w.social_anger = Math.min(100, (w.social_anger||0) + sumA); w.gov_trust = Math.max(0, (w.gov_trust||0) + sumT); rep.push({ name: mm.t, kind: "cadence", eff: "即使没有经过你手,这件事也有它自己的运作方式。", delta: "社会愤怒 +" + sumA + " · 政府信任 " + sumT + "(该段时间另有几件小情绪一并发酵)" }); } /* 软封顶积压清算:超20天每+10天追加1次 */ var extra = (days > 20) ? Math.floor((days - 20) / 10) : 0; var pend = State.variables.pending_events || []; for (var x = 0; x < extra; x++) { if (pend.length > 0) { w.social_anger = Math.min(100, (w.social_anger||0) + 1); w.political_violence = Math.min(100, (w.political_violence||0) + 1); rep.push({ name:"久拖的一件旧案", kind:"cadence", eff:"在无人过问里腐化得更深。", delta:"社会愤怒 +1 · 政治暴力 +1" }); } else { w.social_anger = Math.min(100, (w.social_anger||0) + 1); w.gov_trust = Math.max(0, (w.gov_trust||0) - 1); rep.push({ name:"行政积压", kind:"cadence", eff:"没有你,账本只会在桌上越堆越高。", delta:"社会愤怒 +1 · 政府信任 -1" }); } } /* 重返柏林封面叙事(随缺席天数分档) */ var cover; if (days < 5) cover = "『您离开的这几天,府里照常运转,几件小事赶在您回来前办完了。』"; else if (days <= 15) cover = "『内阁短暂失声期间,街角几件小事各自了结——它们不需要你,也没等你。』"; else cover = "『政府缺席半月,柏林却在自行运转。有些人不在,事情反而顺了?』"; /* 快进前已行政瘫痪(负荷≥8):回执追加一句"维持"叙事(V0.6-A:只看维持,不新触发/不多日累积) */ if (_sed_score >= 8) { cover += "「你走时的烂摊子还摊在案头,没有人替你收拾。它不会因为你不看就消失——它只是继续烂着。」"; } State.variables.skip_cadence_cover = cover; })()>> <</silently>>\ <</widget>> /* ---------- skip-refresh-minor:跳过天数抽牌(白+蓝为主,黄只危机出) ---------- 用法:<<skip-refresh-minor DAYS>> 跳 N 天时按档位补入可选事件(5≤N<20→1 件;N≥20→2+每+10 天 1 件,封顶 6,且不超待办上限): 主槽(白+蓝均为"日常档"):轮流补白色事件与蓝色"文件篮·呈报公文"(见 88_file_basket_events); 黄(生态/危机)只在中/重档门槛命中时,且整轮至多 1 件、放在最后一格。 白色带 60 天冷却;蓝色沿用文件篮 5~7 天冷却与"见过越少越优先";黄门槛/权重/分档在 skip-pool-config 调参区改。 */ <<widget "skip-refresh-minor">>\ <<silently>> <<world-event-custom-init>> <<skip-pool-config>> <<set _sr_days to Number($args[0])>> <<set $skip_minor_spawn to 0>> <<set $skip_flavor to []>> <<run (function(){ var days = _sr_days; var n = 0; if (days >= 5 && days < 20) { n = 1; } else if (days >= 20) { n = 2 + Math.floor((days - 20) / 10); } n = Math.min(n, 6); var cap = (State.variables.pending_cap != null) ? State.variables.pending_cap : 12; var room = cap - (State.variables.pending_events ? State.variables.pending_events.length : 0); if (n > room) n = Math.max(room, 0); State.variables.skip_minor_spawn = n; if (n <= 0) { return; } var w = State.variables.world; var archetypes = State.variables.archetypes || []; var evCd = State.variables.event_cooldowns || {}; var worldOpt = State.variables.world_custom_options || {}; var whiteDeck = State.variables.white_deck || []; var whiteCd = State.variables.white_cooldowns || {}; var tierMap = State.variables.skip_yellow_tier || {}; var tierW = State.variables.skip_yellow_w || { light:6, medium:3, critical:1 }; var gateF = State.variables.skip_gate || { light:0.5, medium:0.72, critical:1.0 }; var gateLte = State.variables.skip_gate_lte || { light:25, medium:12, critical:0 }; var extra = State.variables.skip_yellow_extra || {}; var session = State.variables.session_day; /* 1) 组黄池:title -> meta(stat/op/baseVal/tag/template/intensity/world_effects/baseWeight) */ var yellow = {}; for (var a = 0; a < archetypes.length; a++) { var arch = archetypes[a]; var cond = arch.conditions; var statK = String(cond.stat).replace("world.", ""); for (var o = 0; o < arch.outcomes.length; o++) { var oc = arch.outcomes[o]; if (!yellow[oc.id]) { yellow[oc.id] = { stat: statK, op: cond.op, baseVal: cond.val, tag: oc.tag, template: oc.template, intensity: oc.intensity, world_effects: oc.world_effects || null, baseWeight: (typeof oc.weight === "number" ? oc.weight : 1) }; } } } var ek; for (ek in extra) { if (extra.hasOwnProperty(ek)) { var e = extra[ek]; yellow[ek] = { stat:e.stat, op:e.op, baseVal:e.val, tag:e.tag, template:e.template, intensity:e.intensity, world_effects:e.world_effects || null, baseWeight:1 }; } } /* 2) 过滤:命中当前世界状态门槛 + 60 天冷却已过 */ var eligible = []; var t; for (t in yellow) { if (!yellow.hasOwnProperty(t)) continue; var m = yellow[t]; var tier = tierMap[t] ? tierMap[t] : "medium"; var tv = w[m.stat]; if (typeof tv !== "number") continue; var gate; if (m.op === "lte") { var add = gateLte[tier] ? gateLte[tier] : 0; gate = m.baseVal + add; } else { var f = gateF[tier] ? gateF[tier] : 1.0; gate = Math.max(15, Math.round(m.baseVal * f)); } var pass = false; if (m.op === "gte") pass = tv >= gate; else if (m.op === "lte") pass = tv <= gate; else if (m.op === "gt") pass = tv > gate; else if (m.op === "lt") pass = tv < gate; var cd = (evCd[t] != null) ? evCd[t] : -999; /* 跳天以白为主:黄只在中/重档门槛命中才进池(轻档日常张力留给每日压力触发) */ if (pass && (session - cd >= 60) && tier !== "light") { eligible.push({ title:t, meta:m, tier:tier }); } } /* 3) 逐槽出牌:白+蓝为主(蓝色=文件篮呈报公文),黄只危机门槛命中时才在末尾格出(整轮至多1件) */ var pending = State.variables.pending_events; if (!pending) { pending = []; State.variables.pending_events = pending; } var ec = State.variables.event_counter || 0; var pickedY = {}; var pickedW = {}; var pickedB = {}; var log = State.variables.last_event_roll; if (!log) { log = []; State.variables.last_event_roll = log; } /* 白色可用 */ var whiteAvail = []; for (var wi = 0; wi < whiteDeck.length; wi++) { var wtt = whiteDeck[wi]; var wcd = (whiteCd[wtt] != null) ? whiteCd[wtt] : -999; if (session - wcd >= 60) whiteAvail.push(wtt); } if (whiteAvail.length === 0) whiteAvail = whiteDeck.slice(); /* 蓝色(文件篮)可用:满足条件 + 不在冷却;蓝色优先选没见过的 */ if (!State.variables.event_pool) State.variables.event_pool = {}; var ePool = State.variables.event_pool; var bCool = ePool.cooling_until = ePool.cooling_until || {}; var bSeen = ePool.seen_count = ePool.seen_count || {}; var fbe = State.variables.file_basket_events || []; var evLog = State.variables.event_log || []; var covenant = State.variables.covenant; function fbAvailOK(ev){ if (!ev.available) return false; var av = ev.available; if (av.requires_event) { for (var i=0;i<av.requires_event.length;i++){ var found=false, rid=av.requires_event[i]; for (var j=0;j<evLog.length;j++){ if (evLog[j].deck_id===rid){found=true;break;} } if (!found) return false; } } if (av.requires_state) { var ksr = Object.keys(av.requires_state); for (var i=0;i<ksr.length;i++){ if (w[ksr[i]] < av.requires_state[ksr[i]]) return false; } } if (av.requires_flag) { var kf = Object.keys(av.requires_flag); for (var i=0;i<kf.length;i++){ var v = av.requires_flag[kf[i]]; var nowF = (kf[i]==="covenant_active") ? (covenant && covenant.active) : false; if (nowF !== v) return false; } } if (av.excludes_event) { for (var i=0;i<av.excludes_event.length;i++){ var eid=av.excludes_event[i]; for (var j=0;j<evLog.length;j++){ if (evLog[j].deck_id===eid) return false; } } } if (av.excludes_state) { var ke = Object.keys(av.excludes_state); for (var i=0;i<ke.length;i++){ if (w[ke[i]] >= av.excludes_state[ke[i]]) return false; } } return true; } var blueCand = []; for (var bi=0; bi<fbe.length; bi++){ var bev = fbe[bi]; if (!fbAvailOK(bev)) continue; if ((bCool[bev.id] || -1) > session) continue; /* 5~7 天冷却 */ blueCand.push(bev); } var blueUnseen = []; for (var bu=0; bu<blueCand.length; bu++){ if ((bSeen[blueCand[bu].id]||0) === 0) blueUnseen.push(blueCand[bu]); } var born = { year: State.variables.date.year, month: State.variables.date.month, day: State.variables.date.day }; /* 黄只危机出:整轮至多 1 件(中/重档),只在末尾格 */ var yellowDrawnPossible = true; var primaryIdx = 0; function takeBlue(){ var pool = []; for (var i=0;i<blueUnseen.length;i++){ if (!pickedB[blueUnseen[i].id]) pool.push(blueUnseen[i]); } if (pool.length === 0){ for (var i=0;i<blueCand.length;i++){ if (!pickedB[blueCand[i].id]) pool.push(blueCand[i]); } } if (pool.length === 0) return false; var ev = pool[Math.floor(Math.random() * pool.length)]; pickedB[ev.id] = true; ec += 1; var descB = ev.description ? ev.description : ev.title; pending.push({ event_id: "EV_" + ec, deck_id: ev.id, source: "filebasket", lifecycle: "instant", /* 大事(major)卡面提到 3:跳过中新抽到的大事同样置顶+徽章,且不被随后的 7.6 托管代签 */ irreversible: (ev.major ? 3 : 1), intensity: (ev.base_intensity || 12), related_tag: (ev.tag || "general"), title: ev.title, description: descB, template: "filebasket", fb_data: ev, fb_stage: 0, born_date: born, born_day: session, status: "pending", is_normal: true }); bSeen[ev.id] = (bSeen[ev.id] || 0) + 1; ePool.last_seen = ePool.last_seen || {}; ePool.last_seen[ev.id] = session; bCool[ev.id] = session + 5 + Math.floor(Math.random() * 3); log.push("🔵 跳过·蓝:" + ev.title); return true; } function takeWhite(){ var wp = []; for (var i4 = 0; i4 < whiteAvail.length; i4++) { if (!pickedW[whiteAvail[i4]]) wp.push(whiteAvail[i4]); } if (wp.length === 0) return false; var widx = Math.floor(Math.random() * wp.length); var wtt2 = wp[widx]; pickedW[wtt2] = true; ec += 1; var descW = (worldOpt[wtt2] && worldOpt[wtt2].prompt) ? worldOpt[wtt2].prompt : wtt2; pending.push({ event_id: "EV_" + ec, deck_id: "A_white", source: "skip", lifecycle: "instant", irreversible: 1, intensity: 8, related_tag: "日常", tag: "日常", title: wtt2, description: descW, template: "decision", born_date: born, born_day: session, status: "pending" }); whiteCd[wtt2] = session; log.push("⚪ 跳过·白:" + wtt2); return true; } for (var s = 0; s < n; s++) { var isLast = (s === n - 1); /* 黄:只在最后一格,且整轮最多 1 件,且过了危机门槛 */ var useYellow = false; if (isLast && n >= 2 && yellowDrawnPossible) { for (var iy = 0; iy < eligible.length; iy++) { if (!pickedY[eligible[iy].title]) { useYellow = true; break; } } } var choice = null; if (useYellow) { var yp = []; for (var i = 0; i < eligible.length; i++) { if (!pickedY[eligible[i].title]) yp.push(eligible[i]); } if (yp.length > 0) { var totalY = 0; for (var i2 = 0; i2 < yp.length; i2++) totalY += (tierW[yp[i2].tier] || 1) * yp[i2].meta.baseWeight; var rr = Math.random() * totalY; var acc = 0; for (var i3 = 0; i3 < yp.length; i3++) { acc += (tierW[yp[i3].tier] || 1) * yp[i3].meta.baseWeight; if (rr < acc) { choice = yp[i3]; break; } } if (!choice) choice = yp[yp.length - 1]; yellowDrawnPossible = false; pickedY[choice.title] = true; ec += 1; var descY = (worldOpt[choice.title] && worldOpt[choice.title].prompt) ? worldOpt[choice.title].prompt : choice.title; pending.push({ event_id: "EV_" + ec, deck_id: "A_skip", source: "skip", lifecycle: "instant", irreversible: 1, intensity: choice.meta.intensity, related_tag: choice.meta.tag, tag: choice.meta.tag, title: choice.title, description: descY, template: choice.meta.template, world_effects: choice.meta.world_effects, born_date: born, status: "pending" }); evCd[choice.title] = session; log.push("🟡 跳过·黄(" + choice.tier + "):" + choice.title); } } if (!choice) { /* 主槽:白+蓝为主,偶数主槽优先蓝、奇数优先白,池空则回退另一池 */ var placed = false; var tryBlue = (primaryIdx % 2 === 0); for (var at = 0; at < 2 && !placed; at++) { if (tryBlue) { if (takeBlue()) { placed = true; } else { tryBlue = false; } } else { if (takeWhite()) { placed = true; } else { tryBlue = true; } } } if (!placed) break; primaryIdx++; } } State.variables.event_counter = ec; })()>> <<set _sr_days to null>> <</silently>>\ <</widget>> /* ---------- tp-phase-name:当前时段名称(基于剩余TP整数档位判定) ---------- 一天6TP:≥5上午 / ≥3下午 / ≥1傍晚 / <1夜晚 */ <<widget "tp-phase-name">>\ <<silently>> <<if $tp gte 5>> <<set _phase_name to "上午">> <<set $tp_phase to 1>> <<elseif $tp gte 3>> <<set _phase_name to "下午">> <<set $tp_phase to 2>> <<elseif $tp gte 1>> <<set _phase_name to "傍晚">> <<set $tp_phase to 3>> <<else>> <<set _phase_name to "夜晚">> <<set $tp_phase to 4>> <</if>> <</silently>>\ <</widget>> /* ---------- tp-fatigue-status:疲惫状态文字 ---------- */ <<widget "tp-fatigue-status">>\ <<silently>> <<set _f to $player.mental.fatigue>> <<if _f lte 30>> <<set _fatigue_status to "清醒">> <<elseif _f lte 60>> <<set _fatigue_status to "疲倦">> <<elseif _f lte 80>> <<set _fatigue_status to "疲惫不堪">> <<elseif _f lt 100>> <<set _fatigue_status to "崩溃边缘">> <<else>> <<set _fatigue_status to "强制休息">> <</if>> <</silently>>\ <</widget>> /* ---------- tp-empty-bonus:空窗期收益系数 ---------- */ <<widget "tp-empty-bonus">>\ <<silently>> <<set _empty_bonus to 1.0>> <<if $rest_count eq 1>><<set _empty_bonus to 0.85>> <<elseif $rest_count eq 2>><<set _empty_bonus to 0.7>> <<elseif $rest_count eq 3>><<set _empty_bonus to 0.5>> <<elseif $rest_count eq 4>><<set _empty_bonus to 0.3>> <<elseif $rest_count gte 5>><<set _empty_bonus to 0.15>> <</if>> <</silently>>\ <</widget>> /* ---------- tp-empty-hint:空窗期递减文字提示 ---------- 输出 _empty_hint_text,用身体感受暗示递减,不报数字 */ <<widget "tp-empty-hint">>\ <<silently>> <<set _empty_hint_text to "">> <<if $rest_count eq 1>> <<set _empty_hint_text to "">> <<elseif $rest_count eq 2>> <<set _empty_hint_text to "腿开始沉了。">> <<elseif $rest_count eq 3>> <<set _empty_hint_text to "你开始重复走同一条街。鞋底磨得厉害。">> <<elseif $rest_count eq 4>> <<set _empty_hint_text to "柏林的灰你看了太多遍。它不会变的。">> <<elseif $rest_count gte 5>> <<set _empty_hint_text to "你该回去了。再走下去也只是走。">> <</if>> <</silently>>\ <</widget>>
/* ============================================================ 国会审议系统 · 第二波(完整会期) 一次会期(60天一议): ① 国会走廊:违约清算 + 欠条簿 + 抽取他党提案(2-5张,局势加权) + 游说(拉票/换票/撤案,花政治资本)+ 定自己的牌(0-3张) ② 议事厅:玩家对他党提案逐张表态(支持/反对/弃权) → 开票(席位加权支持率 + 情报分级明细 + 动机) 承诺:日常写入欠条 → 到期未兑现=违约(失信者标签+对方党信任-8) → 已兑现可升华成正式法案上桌。 情报:知情者标签(上限30,每月-2%)。 0-9 只知支持率 / 10-19 看阵营 / 20-29 看每票 / 30 看动机。 ============================================================ */ /* ---------- promise-write:写入承诺欠条 ---------- 用法:<<promise-write "worker" "提高工人补贴" 60>> 参数:target(对象键)/content(内容)/deadline(到期天数,相对) */ <<widget "promise-write">>\ <<silently>> <<set _t to $args[0]>> <<set _c to $args[1]>> <<set _dl to $args[2] ? $args[2] : 60>> <<set $promise_ledger.push({id:"pr_" + ($promise_ledger.length + 1), target:_t, content:_c, deadline:$session_day + _dl, status:"open", created_day:$session_day, sublimated:false})>> <</silently>>\ <</widget>> /* ---------- promise-fulfill:兑现欠条 ---------- 用法:<<promise-fulfill "pr_1">>(玩家日常做了对应的事) 同时写入 $player.promises(供政治资本公式统计) */ <<widget "promise-fulfill">>\ <<silently>> <<set _id to $args[0]>> <<set _found to false>> <<set _pf_target to "">> <<set _pf_content to "">> <<for _i to 0; _i lt $promise_ledger.length; _i++>> <<if $promise_ledger[_i].id eq _id and $promise_ledger[_i].status eq "open">> <<set $promise_ledger[_i].status to "fulfilled">> <<set _found to true>> <<set _pf_target to $promise_ledger[_i].target>> <<set _pf_content to $promise_ledger[_i].content>> <</if>> <</for>> <<if _found>> <<set $player.promises.push("承诺兑现")>> /* 记忆回响:兑现的承诺,对方下次见面会主动提起 */ <<set _pf_pid to "">> <<if _pf_target eq "worker">><<set _pf_pid to "spd">> <<elseif _pf_target eq "military">><<set _pf_pid to "army">> <<elseif _pf_target eq "middle">><<set _pf_pid to "ddp">> <<elseif _pf_target eq "foreign">><<set _pf_pid to "dvp">> <<elseif _pf_target eq "civil">><<set _pf_pid to "zentrum">> <<elseif $npcs[_pf_target]>><<set _pf_pid to _pf_target>> <</if>> <<if _pf_pid neq "">><<memory-register _pf_pid "promise_kept" _pf_content>><</if>> <</if>> <</silently>>\ <</widget>> /* ---------- promise-settle:到期违约判定(进入审议时调用) ---------- 对 deadline ≤ 当前天 且 未兑现 的欠条判违约: 打上「失信者」标签 + 对方党信任-8。输出 _settle_report */ <<widget "promise-settle">>\ <<silently>> <<set _settle_report to []>> <<for _i to 0; _i lt $promise_ledger.length; _i++>> <<set _p to $promise_ledger[_i]>> <<if _p.deadline lte $session_day and _p.status eq "open">> <<set _p.status to "defaulted">> /* 承诺对象 → 对应政党(对象是群体,惩罚落在代表它的党头上)。 先映射再入报告——2026-09-21 修复:原先 push 在映射之前, 首条 party 为 undefined、后续继承上一条的错位 */ <<set _ptg to "spd">> <<if _p.target eq "military">><<set _ptg to "army">> <<elseif _p.target eq "middle">><<set _ptg to "ddp">> <<elseif _p.target eq "foreign">><<set _ptg to "dvp">> <<elseif _p.target eq "civil">><<set _ptg to "zentrum">> <<elseif $npcs[_p.target]>><<set _ptg to _p.target>> <</if>> <<set _settle_report.push({target:_p.target, content:_p.content, party:_ptg})>> <<if not $player.tags.includes("失信者")>> <<set $player.tags.push("失信者")>> <</if>> <<if $npcs[_ptg]>> <<set _ps_before to $npcs[_ptg].trust>> <<set $npcs[_ptg].trust to Math.max(0, Math.min(100, _ps_before - 8))>> /* 记忆回响:违约的账他记着,下次见面会提 */ <<memory-register _ptg "promise_broken" _p.content>> /* 跨档检测:违约扣信任此前不走闸门,补上掉档推卡 */ <<attitude-tier-idx _ptg _ps_before>>\ <<set _ps_tfrom to _tier_idx>>\ <<attitude-tier-idx _ptg $npcs[_ptg].trust>>\ <<if _tier_idx neq _ps_tfrom>><<cross-queue-push _ptg "down">><</if>>\ <</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- promise-sublimate:把已兑现的承诺升华成法案上桌 ---------- 用法:<<promise-sublimate "pr_1">> 从 sublime 模板按 target 取牌,push 进 $session_review.table */ <<widget "promise-sublimate">>\ <<silently>> <<set _id to $args[0]>> <<for _i to 0; _i lt $promise_ledger.length; _i++>> <<if $promise_ledger[_i].id eq _id and $promise_ledger[_i].status eq "fulfilled" and not $promise_ledger[_i].sublimated>> <<set _tmpl to $player_proposals.sublime[$promise_ledger[_i].target]>> <<if _tmpl>> <<set $promise_ledger[_i].sublimated to true>> <<set $session_review.table.push({kind:"sublime", id:_tmpl.id, title:_tmpl.title, category:_tmpl.category, base_support:_tmpl.base_support, effects:_tmpl.effects, band:_tmpl.band, drip:_tmpl.drip, narrative:_tmpl.narrative, axis:_tmpl.axis, constitutional:_tmpl.constitutional, promise_id:_id})>> <</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- banner-current:按光谱双轴取当前施政纲领案(当格 3 条候选) ---------- 输出 _banners(当格数组)/_banner_lr/_banner_rc(档位文本) */ <<widget "banner-current">>\ <<silently>> <<set _lr to $spectrum.left_right>> <<set _rc to $spectrum.radical_conservative>> <<set _lrk to "中">> <<if _lr lte -33>><<set _lrk to "左">> <<elseif _lr gte 33>><<set _lrk to "右">><</if>> <<set _rck to "中">> <<if _rc lte -33>><<set _rck to "激进">> <<elseif _rc gte 33>><<set _rck to "保守">><</if>> <<set _banner_key to "ban_cm">> <<if _lrk eq "左" and _rck eq "激进">><<set _banner_key to "ban_lr">> <<elseif _lrk eq "左" and _rck eq "中">><<set _banner_key to "ban_lm">> <<elseif _lrk eq "左" and _rck eq "保守">><<set _banner_key to "ban_ll">> <<elseif _lrk eq "中" and _rck eq "激进">><<set _banner_key to "ban_cr">> <<elseif _lrk eq "中" and _rck eq "保守">><<set _banner_key to "ban_cl">> <<elseif _lrk eq "右" and _rck eq "激进">><<set _banner_key to "ban_rr">> <<elseif _lrk eq "右" and _rck eq "中">><<set _banner_key to "ban_rm">> <<elseif _lrk eq "右" and _rck eq "保守">><<set _banner_key to "ban_rl">> <</if>> <<set _cell to $player_proposals.banners[_banner_key]>> <<set _banners to []>> <<if _cell and _cell.length gt 0>> <<set _banners to _cell>> <<elseif _cell>> /* 兼容:若某格仍是单对象(未扩数组),包成单条数组 */ <<set _banners to [_cell]>> <</if>> <<set _banner_lr to _lrk>> <<set _banner_rc to _rck>> <</silently>>\ <</widget>> /* ---------- agenda-unlocked:按世界状态取已解锁时局牌 ---------- 输出 _agenda_unlocked(数组) */ <<widget "agenda-unlocked">>\ <<silently>> <<set _agenda_unlocked to []>> <<for _i to 0; _i lt $player_proposals.agenda.length; _i++>> <<set _card to $player_proposals.agenda[_i]>> <<set _ok to true>> <<if _card.unlock and _card.unlock.world>> <<set _wk to Object.keys(_card.unlock.world)>> <<for _j to 0; _j lt _wk.length; _j++>> <<set _wkey to _wk[_j]>> <<if _wkey neq "op">> <<set _val to _card.unlock.world[_wkey]>> <<set _cur to $world[_wkey]>> <<set _op to _card.unlock.world.op ? _card.unlock.world.op : "gte">> <<if _op eq "lt">> <<if not (_cur lt _val)>><<set _ok to false>><</if>> <<else>> <<if not (_cur gte _val)>><<set _ok to false>><</if>> <</if>> <</if>> <</for>> <</if>> <<if _ok>><<set _agenda_unlocked.push(_card)>><</if>> <</for>> <</silently>>\ <</widget>> /* ---------- intel-current:当前情报值 ---------- 输出 _intel_val(0-30)、_intel_tier("low"/"mid"/"high"/"max") */ <<widget "intel-current">>\ <<silently>> <<set _intel_val to 0>> <<if $active_tags>> <<for _i to 0; _i lt $active_tags.length; _i++>> <<if $active_tags[_i] and $active_tags[_i].name eq "知情者">> <<set _intel_val to $active_tags[_i].intensity>> <</if>> <</for>> <</if>> <<set _intel_val to Math.round(_intel_val)>> <<set _intel_tier to "low">> <<if _intel_val gte 30>><<set _intel_tier to "max">> <<elseif _intel_val gte 20>><<set _intel_tier to "high">> <<elseif _intel_val gte 10>><<set _intel_tier to "mid">> <</if>> <</silently>>\ <</widget>> /* ---------- party-bill-draw:抽取他党提案(局势加权 2-5 张) ---------- 从 8 党提案库抽取,每党至多 1 张,排除 counterfactual(历史歧路是玩家特权) 与 type:"pressure"(外部压力牌没有正式 effects,走独立的应对线,不进正式表决)。 权重:经济类随通胀/经济压力上涨,社会类随愤怒,政治类随暴力/信任危机, 军事类随军方影响,司法类随信任危机。 写入 $session_review.opp_bills(kind:"party"),含 motive(背后的算盘)。 */ <<widget "party-bill-draw">>\ <<silently>> <<set _draw_num to random(2, 5)>> <<set _pool3 to []>> <<for _pk range Object.keys($party_proposals)>> <<for _pi to 0; _pi lt $party_proposals[_pk].length; _pi++>> <<set _c to $party_proposals[_pk][_pi]>> /* 过滤:反事实牌/施压牌不上桌;来源还在生效期/尾冷却的同源提案也不再抽 (比如失业保险案正在滴灌,同源提案不该又上桌) */ <<set _pc_blocked to ($effect_cool and $effect_cool[_c.id] and $session_day lt $effect_cool[_c.id])>> <<if not _c.counterfactual and not (_c.type eq "pressure") and not _pc_blocked>> <<set _w to 1>> <<if _c.category and _c.category.indexOf("经济") gte 0>> <<set _w to _w + $world.inflation/40 + $world.economy/40>> <</if>> <<if _c.category and _c.category.indexOf("社会") gte 0>> <<set _w to _w + $world.social_anger/30>> <</if>> <<if _c.category and _c.category.indexOf("政治") gte 0>> <<set _w to _w + $world.political_violence/30 + $world.gov_trust/60>> <</if>> <<if _c.category and _c.category.indexOf("军事") gte 0>> <<set _w to _w + $world.army_influence/30>> <</if>> <<if _c.category and _c.category.indexOf("司法") gte 0>> <<set _w to _w + $world.gov_trust/50>> <</if>> <<set _pool3.push({card:_c, w:_w, party:_pk})>> <</if>> <</for>> <</for>> <<set $session_review.opp_bills to []>> <<for _di to 0; _di lt _draw_num; _di++>> <<if _pool3.length eq 0>><<break>><</if>> <<set _wsum to 0>> <<for _i2 to 0; _i2 lt _pool3.length; _i2++>> <<set _wsum to _wsum + _pool3[_i2].w>> <</for>> <<set _r to random(0, 1000) / 1000 * _wsum>> <<set _acc to 0>> <<set _pick to -1>> <<for _i2 to 0; _i2 lt _pool3.length; _i2++>> <<set _acc to _acc + _pool3[_i2].w>> <<if _r lte _acc and _pick lt 0>> <<set _pick to _i2>> <</if>> <</for>> <<if _pick lt 0>><<set _pick to 0>><</if>> <<set _chosen to _pool3[_pick]>> <<set _c2 to _chosen.card>> <<set _pool to $party_motives[_chosen.party]>>\ <<pool-pick "motive_" _chosen.party>>\ <<set $session_review.opp_bills.push({kind:"party", party:_chosen.party, id:_c2.id, title:_c2.title, category:_c2.category, base_support:_c2.base_support, effects:_c2.effects, narrative:_c2.narrative, axis:_c2.axis, constitutional:_c2.constitutional, motive:$pool_pick})>> <<set _pool3 to _pool3.filter(function(o){ return o.party !== _chosen.party && o.card.id !== _c2.id; })>> <</for>> <</silently>>\ <</widget>> /* ---------- party-stance:计算某张牌各党表决立场与支持率 ---------- 用法:<<party-stance 牌对象>> 牌字段:id/party(提出党,可选)/axis("左"/"中"/"右"或含"左·激进")/is_player(玩家牌)/effects 输出:_stance_map({party:"yes"/"no"/"abstain"})、_stance_yes/_stance_no(席位)、 _stance_support(赞成/(赞成+反对)%) 规则: 1. 提出党 → 必投赞成(自己的提案) 2. 轴距惩罚:|党lean - 牌axis|,激进党(radical≥0.6)惩罚×1,温和党×0.5 3. 玩家牌:与该党信任高→偏赞成,低→偏反对 4. effects.party_trust:给该党正的→偏赞成,负的→偏反对 4.5 玩家公开表态(议事厅支持/反对):信任越高越跟你走(弃权不带动) 5. 游说覆盖:$session_review.lobby[bill.id+"|"+party] 强改向 6. 换票:deal 承诺支持玩家牌,若玩家已对他党牌投赞成→该党投赞成;否则翻脸投反对 第二参传 "base"=基准模式(跳过 4.5/5/6,算「假如你什么都没做」的票数) */ <<widget "party-stance">>\ <<silently>> <<set _bill to $args[0]>> /* 模式:actual(默认,含你的全部介入) / base(开票页算「假如你什么都没做」的票数) */ <<set _ps_mode to ($args.length gt 1 and $args[1] eq "base") ? "base" : "actual">> <<set _axis_v to 0>> <<if _bill.axis and _bill.axis.lr>> <<if _bill.axis.lr eq "左">><<set _axis_v to -1>> <<elseif _bill.axis.lr eq "右">><<set _axis_v to 1>><</if>> <<elseif _bill.axis and _bill.axis.includes>> <<if _bill.axis.includes("左")>><<set _axis_v to -1>> <<elseif _bill.axis.includes("右")>><<set _axis_v to 1>><</if>> <</if>> <<set _stance_map to {}>> <<set _stance_seats to {}>> <<set _stance_yes to 0>> <<set _stance_no to 0>> <<set _voters to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap"]>> /* V0.9 S2:第二章(1920-21)国会里 KPD 席位归在独立社民党(USPD)名下, 沿用 kpd 槽位以复用全部档案/游说/开票逻辑,仅席位与立场读 S2 数值 */ <<if $stage and $stage.id eq "S2" and $party_seats.kpd gt 60>> <<set $party_seats.kpd to 0>> /* 守卫:S2 不该用 S3 的 88 席 */ <</if>> <<for _i to 0; _i lt _voters.length; _i++>> <<set _pk to _voters[_i]>> <<set _score to 0>> /* 1. 提出党必赞成 */ <<if _bill.party and _bill.party eq _pk>> <<set _score to _score + 3>> <<else>> <<set _prof to $party_profile[_pk]>> <<set _dist to Math.abs(_prof.lean - _axis_v)>> <<set _pen to _dist * (_prof.radical gte 0.6 ? 1.0 : 0.5)>> <<set _score to _score - _pen>> /* 基础支持率漂移:base_support 高的法案各方更愿意抬一手 */ <<if _bill.base_support>> <<set _score to _score + (_bill.base_support - 50) / 50 * 0.4>> <</if>> /* 3. 玩家牌的信任修正 */ <<if _bill.is_player and $npcs[_pk]>> <<set _score to _score + ($npcs[_pk].trust - 50) / 50>> <</if>> /* 3.5 大联盟加成:玩家牌 + 大联合政府激活时,温和党成员(SPD/DDP/DVP/Zentrum)额外抬票(联合执政票底) */ <<if _bill.is_player and $covenant and $covenant.active>> <<if _pk eq "spd" or _pk eq "ddp" or _pk eq "dvp" or _pk eq "zentrum">> <<set _score to _score + 0.8>> <</if>> <</if>> /* 4. effects.party_trust 修正 */ <<if _bill.effects and _bill.effects.party_trust and _bill.effects.party_trust[_pk]>> <<if _bill.effects.party_trust[_pk] gt 0>> <<set _score to _score + 0.6>> <<else>> <<set _score to _score - 0.6>> <</if>> <</if>> <</if>> /* 4.5 玩家公开表态的带动力:议事厅里你站了队,信任你的党跟着你的调子走 (信任 50 以上顺着你,50 以下偏要拧着来;弃权不带动)。 base 模式不计入——开票页要用「假如你什么都没做」的票数算差值 */ <<if _ps_mode neq "base" and not _bill.is_player and $session_review.player_stances and $session_review.player_stances[_bill.id] and $session_review.player_stances[_bill.id] neq "abstain" and $npcs[_pk]>>\ <<set _ps_dir2 to ($session_review.player_stances[_bill.id] eq "yes" ? 1 : -1)>>\ <<set _score to _score + _ps_dir2 * (($npcs[_pk].trust - 50) / 50)>>\ <</if>>\ /* 5. 游说生效:买票有兑现率,bonus 在买票时已掷好(lobby_deliver),0=收了钱没兑现 */ <<set _lobby_bonus to 0>> <<if _ps_mode neq "base" and $session_review.lobby and $session_review.lobby[_bill.id + "|" + _pk] eq "yes">> <<set _lobby_bonus to ($session_review.lobby_deliver and $session_review.lobby_deliver[_bill.id + "|" + _pk]) ? $session_review.lobby_deliver[_bill.id + "|" + _pk].bonus : 3>> <<set _score to _score + _lobby_bonus>> <<elseif _ps_mode neq "base" and $session_review.lobby and $session_review.lobby[_bill.id + "|" + _pk] eq "no">> <<set _lobby_bonus to ($session_review.lobby_deliver and $session_review.lobby_deliver[_bill.id + "|" + _pk]) ? $session_review.lobby_deliver[_bill.id + "|" + _pk].bonus : -3>> <<set _score to _score + _lobby_bonus>> <</if>> /* 6. 换票结算 */ <<if _ps_mode neq "base" and _bill.is_player and $session_review.deals and $session_review.deals.length gt 0>> <<for _d to 0; _d lt $session_review.deals.length; _d++>> <<set _dl2 to $session_review.deals[_d]>> <<if _dl2.party eq _pk and (_dl2.player_bill_id eq "any" or _dl2.player_bill_id eq _bill.id)>> <<if $session_review.player_stances and $session_review.player_stances[_dl2.opp_bill_id] eq "yes">> <<set _score to _score + 3>> <<else>> <<set _score to _score - 3>> <</if>> <</if>> <</for>> <</if>> /* 提出党永远支持自己的提案——游说、换票都改不掉这一票 */ <<if _bill.party and _bill.party eq _pk>> <<set _score to 99>> <</if>> /* 判定:按党纪拆票(党内不是铁板一块,票数按赞成概率分配) */ <<set _dis to 0.8>> <<if _prof and _prof.discipline>><<set _dis to _prof.discipline>><</if>> <<if _bill.party and _bill.party eq _pk>><<set _dis to 1.0>><</if>> <<set _dir to Math.max(-1, Math.min(1, _score / 3))>> <<set _p_yes to Math.max(0, Math.min(1, 0.5 + 0.5 * _dir * _dis))>> <<set _p_abstain to Math.max(0, Math.min(1, 0.15 * (1 - Math.abs(_dir) * _dis)))>> <<set _p_no to Math.max(0, 1 - _p_yes - _p_abstain)>> <<set _seats to $party_seats[_pk]>> <<set _s_yes to Math.round(_seats * _p_yes)>> <<set _s_no to Math.round(_seats * _p_no)>> <<set _s_ab to _seats - _s_yes - _s_no>> <<if _s_ab lt 0>><<set _s_no to _s_no + _s_ab>><<set _s_ab to 0>><</if>> <<if _s_no lt 0>><<set _s_yes to _s_yes + _s_no>><<set _s_no to 0>><</if>> <<set _stance_seats[_pk] to { yes: _s_yes, no: _s_no, abstain: _s_ab }>> <<set _stance_yes to _stance_yes + _s_yes>> <<set _stance_no to _stance_no + _s_no>> <<if _s_yes gte _s_no and _s_yes gte _s_ab>> <<set _stance_map[_pk] to "yes">> <<elseif _s_no gte _s_yes and _s_no gte _s_ab>> <<set _stance_map[_pk] to "no">> <<else>> <<set _stance_map[_pk] to "abstain">> <</if>> <</for>> <<set _stance_support to 5>> <<if _stance_yes + _stance_no gt 0>> <<set _stance_support to Math.round(_stance_yes / (_stance_yes + _stance_no) * 100)>> <</if>> <<set _stance_support to Math.max(5, Math.min(95, _stance_support))>> /* 修宪门槛:普通法案简单多数(>50%),修宪法案需 ≥2/3 总席位(魏玛宪法第76条) 7 党总席位 449,2/3 ≈ 299 席。输出 _stance_quota(需赞成席) 与 _stance_quota_type */ <<set _total_seats to 0>> <<for _vi to 0; _vi lt _voters.length; _vi++>> <<set _total_seats to _total_seats + $party_seats[_voters[_vi]]>> <</for>> <<set _stance_quota_type to "普通">> <<if _bill.constitutional>> <<set _stance_quota_type to "修宪">> <<set _stance_quota to Math.ceil(_total_seats * 2 / 3)>> <<else>> <<set _stance_quota to Math.floor(_total_seats / 2) + 1>> <</if>> <<set _stance_passed to (_stance_yes gte _stance_quota)>> <</silently>>\ <</widget>> /* ============================================================ review-show-actions:在任意国会展示卡上渲染「你已做的拉票/换票」状态 用法:<<review-show-actions bill mode>> bill: 法案对象,须含 .id(他党提案或自己的案皆可) mode: "pre"(表态页) 换票警示 + 拉票徽章;不泄露买票兑现随机 "corridor"(走廊) 仅拉票徽章;换票由现有 _ob_dealt 负责,不重复 "post"(开票明细) 显式标注「照办 / 收了钱却没兑现」+「换票守信/翻脸」 数据源(全部已在 $session_review):lobby / lobby_deliver / deals / player_stances 注意:(a) 结果用局部 _aa_html,无全局变量,循环内多次调用安全; (b) post 模式读取 $session_review.results[i].stance_map 前做对象类型守卫; (c) lobby_deliver 键与 lobby 同为 bid+"|"+party(买票同一处写入), 缺失时按「照办」兜底,不误判为未兑现。 ============================================================ */ <<widget "review-show-actions">>\ <<silently>> <<set _aa_bill to $args[0]>> <<set _aa_mode to ($args[1] ? $args[1] : "pre")>> <<set _aa_html to (function(){ var b=_aa_bill; if(!b||!b.id) return ""; var S=State.variables, pn=(S.party_names||{}); var bid=b.id; var name=function(pk){ return pn[pk] || pk || "某党"; }; /* 兜底 undefined */ var cells=[]; /* 换票(deals 锚定本 he党 案:opp_bill_id==bid);corridor 模式跳过 */ if(_aa_mode!=="corridor"){ var deals=(S.session_review.deals||[]), dnotes=[]; for(var i=0;i<deals.length;i++){var d=deals[i]; if(d.opp_bill_id===bid){ var st=S.session_review.player_stances ? S.session_review.player_stances[d.opp_bill_id] : ""; var ok=(st==="yes"); if(_aa_mode==="post"){ dnotes.push(ok?("<span class='txt-muted'>与"+name(d.party)+"换票守信,他投了你的提案。</span>"):("<span class='txt-muted'>与"+name(d.party)+"的换票未兑现,他翻了脸。</span>")); }else{ dnotes.push(ok?"<span class='txt-muted'>你与"+name(d.party)+"换过票:已投支持,换票生效中。</span>":"<span class='txt-muted'>你与"+name(d.party)+"换过票:若不投「支持」,他会翻脸。</span>"); } } } if(dnotes.length) cells.push(dnotes.join(" ")); } /* 拉票(lobby 键前缀 bid+"|") */ var lobby=(S.session_review.lobby||{}), rows=[]; for(var k in lobby){ if(k.indexOf(bid+"|")!==0) continue; var pk=k.split("|")[1]; var dir=lobby[k], pc=(dir==="no"?"st-no":"st-yes"), lab=(dir==="no"?"反对":"支持"); var t="<span class='st-badge "+pc+"'>已拉票·"+lab+"</span> "+name(pk); if(_aa_mode==="post"){ /* 键一致:ldel 与 lobby 同源 bid+"|"+pk;缺失按照办兜底不误判 */ var ldel=S.session_review.lobby_deliver ? S.session_review.lobby_deliver[k] : null; var deliver=(ldel ? (ldel.bonus!==0) : true); /* 兑现失败用 .txt-severe(红) 显眼,不用 .vt-muted */ var actual="?"; var rl=(S.session_review.results||[]); for(var ri=0;ri<rl.length;ri++){var rn=rl[ri]; /* 对象类型守卫:rn.bill 必须是含 .id 的对象 */ if(rn&&rn.bill&&typeof rn.bill==="object"&&rn.bill.id===bid){var sm=rn.stance_map||{};actual=sm[pk]||"?";break;} } var an=(actual==="yes"?"支持":(actual==="no"?"反对":(actual==="abstain"?"弃权":"?"))); t="<span class='st-badge "+pc+"'>已买·"+lab+"</span> "+name(pk)+(deliver?(" → 照办("+an+")"):(" → <span class='txt-severe'>收了钱却没兑现("+an+")</span>")); } rows.push(t); } if(rows.length) cells.push(rows.join(" ")); return cells.join("<br>"); })()>> <</silently>>\ <<if _aa_html neq "">><div class="vpa-actions">_aa_html</div><</if>>\ <</widget>> /* ---------- bill-apply-effects:应用法案通过后的效果 ---------- 世界变量钳制0-100;intl_trust 映射到 $weimar.mid.intl_trust; party_trust 作用于 $npcs.*.trust */ <<widget "bill-apply-effects">>\ <<silently>> <<set _fx to $args[0]>> <<if _fx>> <<if _fx.economy>><<set $world.economy to Math.max(0, Math.min(100, $world.economy + _fx.economy))>><</if>> <<if _fx.inflation>><<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + _fx.inflation))>><</if>> <<if _fx.social_anger>><<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger + _fx.social_anger))>><</if>> <<if _fx.nationalism>><<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + _fx.nationalism))>><</if>> <<if _fx.gov_trust>><<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + _fx.gov_trust))>><</if>> <<if _fx.army_influence>><<set $world.army_influence to Math.max(0, Math.min(100, $world.army_influence + _fx.army_influence))>><</if>> <<if _fx.revolution>><<set $world.revolution to Math.max(0, Math.min(100, $world.revolution + _fx.revolution))>><</if>> <<if _fx.political_violence>><<set $world.political_violence to Math.max(0, Math.min(100, $world.political_violence + _fx.political_violence))>><</if>> <<if _fx.middle_confidence>><<set $world.middle_confidence to Math.max(0, Math.min(100, ($world.middle_confidence ?? 32) + _fx.middle_confidence))>><</if>> <<if _fx.fiscal>><<set $world.fiscal to Math.max(0, Math.min(100, ($world.fiscal ?? 30) + _fx.fiscal))>><</if>> <<if _fx.intl_trust>><<set $weimar.mid.intl_trust to Math.max(0, Math.min(100, $weimar.mid.intl_trust + _fx.intl_trust))>><</if>> <<if _fx.party_trust>> <<set _pk2 to Object.keys(_fx.party_trust)>> <<for _i to 0; _i lt _pk2.length; _i++>> <<set _pkey to _pk2[_i]>> <<if $npcs[_pkey]>> /* 国家大事通道:不占每日预算,仍钳制 0-100 + 零和记仇 */ <<trust-capped _pkey _fx.party_trust[_pkey] "big">> <</if>> <</for>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- active-effect-register:注册一条持续效果(V0.5-C P0 / 通用化改造) ---------- 用法:<<set _reg_arg to {src_id, title, kind, band, source, effects}>> 后 <<active-effect-register _reg_arg>>。 【必须先存变量再传】widget 参数位置的对象字面量不会被求值成对象(静默失效)。 - src_id:来源ID(冷却与去重的钥匙;缺省退回 id/title) - kind:类别 "bill"法案 / "file"文件栏 / "aftermath"余波(侧边栏标签用) - band:档位 "short"短期 / "mid"中期 / "super"超长期(侧边栏标签用) - source:"pass"(推动/放任通过) / "pass_absent"(缺席导致通过) / "aftermath"等 新结构 effects {burst, daily, duration, decay}: - burst 立即结算(走 bill-apply-effects) - daily 挂进 $active_effects,生效期内逐日结算(保留小数) - 注册时写入 $effect_cool[src_id] = 今天 + 生效期 + 半程尾冷却: 生效期+尾冷却内,同类事件不再触发(文件栏权重归零 / 母体不选 / 国会不再抽同源提案) 旧式平加 effects(无 duration)→ 回退 bill-apply-effects,行为不变。 同 src_id 已在生效期 → 不重复堆叠(防止同源效果翻倍)。 */ <<widget "active-effect-register">>\ <<silently>> <<set _aereg_arg to $args[0]>> <<if _aereg_arg and _aereg_arg.effects>> <<if _aereg_arg.effects.duration>> <<set _aereg_efx to _aereg_arg.effects>> <<set _aereg_sid to _aereg_arg.src_id || _aereg_arg.id || _aereg_arg.title>> /* 防重复堆叠:同源效果已在生效期则不重复注册 */ <<set _aereg_dup to false>> <<for _aereg_i to 0; _aereg_i lt $active_effects.length; _aereg_i++>> <<if $active_effects[_aereg_i].src_id eq _aereg_sid>><<set _aereg_dup to true>><</if>> <</for>> <<if not _aereg_dup>> <<if _aereg_efx.burst>> <<bill-apply-effects _aereg_efx.burst>> <</if>> <<if _aereg_efx.daily>> <<set _aereg_len to $active_effects.length>> <<set $active_effects[_aereg_len] to { id: _aereg_arg.id || _aereg_arg.title, src_id: _aereg_sid, title: _aereg_arg.title || _aereg_arg.id, kind: _aereg_arg.kind || "bill", band: _aereg_arg.band || "", daily: _aereg_efx.daily, remaining: _aereg_efx.duration, divisor: _aereg_efx.duration, decay: _aereg_efx.decay ? true : false, source: _aereg_arg.source || "pass", from_round: ($session_review ? $session_review.round : 0), to_day: $session_day + _aereg_efx.duration }>> /* 来源冷却表:生效期 + 半程尾冷却,期间同类来源不再触发 */ <<if not $effect_cool>><<set $effect_cool to {}>><</if>> <<set $effect_cool[_aereg_sid] to $session_day + _aereg_efx.duration + Math.ceil(_aereg_efx.duration / 2)>> <</if>> <</if>> <<else>> <<bill-apply-effects _aereg_arg.effects>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- active-drip-apply:把一天的滴灌量加到状态上 ---------- 用法:<<active-drip-apply _daily_obj>>(保留小数,只在世界变量上钳制 0-100) - 世界变量直接钳制累加(含 fiscal / middle_confidence) - intl_trust 映射到 $weimar.mid.intl_trust - party_trust 直接钳制累加,不走 trust-capped: 滴灌是既定制度的日常运转,不该刷信任账本/占每日预算/触发零和记仇 */ <<widget "active-drip-apply">>\ <<silently>> <<set _da_fx to $args[0]>> <<if _da_fx and typeof _da_fx eq "object">> <<if _da_fx.economy>><<set $world.economy to Math.max(0, Math.min(100, $world.economy + _da_fx.economy))>><</if>> <<if _da_fx.inflation>><<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + _da_fx.inflation))>><</if>> <<if _da_fx.social_anger>><<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger + _da_fx.social_anger))>><</if>> <<if _da_fx.nationalism>><<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + _da_fx.nationalism))>><</if>> <<if _da_fx.gov_trust>><<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + _da_fx.gov_trust))>><</if>> <<if _da_fx.army_influence>><<set $world.army_influence to Math.max(0, Math.min(100, $world.army_influence + _da_fx.army_influence))>><</if>> <<if _da_fx.revolution>><<set $world.revolution to Math.max(0, Math.min(100, $world.revolution + _da_fx.revolution))>><</if>> <<if _da_fx.political_violence>><<set $world.political_violence to Math.max(0, Math.min(100, $world.political_violence + _da_fx.political_violence))>><</if>> <<if _da_fx.middle_confidence>><<set $world.middle_confidence to Math.max(0, Math.min(100, ($world.middle_confidence ?? 32) + _da_fx.middle_confidence))>><</if>> <<if _da_fx.fiscal>><<set $world.fiscal to Math.max(0, Math.min(100, ($world.fiscal ?? 30) + _da_fx.fiscal))>><</if>> <<if _da_fx.intl_trust>><<set $weimar.mid.intl_trust to Math.max(0, Math.min(100, $weimar.mid.intl_trust + _da_fx.intl_trust))>><</if>> <<if _da_fx.party_trust>> <<set _da_pk to Object.keys(_da_fx.party_trust)>> <<for _da_i to 0; _da_i lt _da_pk.length; _da_i++>> <<if $npcs[_da_pk[_da_i]]>> <<attitude-tier-idx _da_pk[_da_i] $npcs[_da_pk[_da_i]].trust>> <<set _da_tier_from to _tier_idx>> <<set $npcs[_da_pk[_da_i]].trust to Math.max(0, Math.min(100, $npcs[_da_pk[_da_i]].trust + _da_fx.party_trust[_da_pk[_da_i]]))>> <<attitude-tier-idx _da_pk[_da_i] $npcs[_da_pk[_da_i]].trust>> <<set _da_dir to (_da_fx.party_trust[_da_pk[_da_i]] gt 0 ? "up" : "down")>> <<if _tier_idx neq _da_tier_from>><<cross-queue-push _da_pk[_da_i] _da_dir>><</if>> <</if>> <</for>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- active-effects-tick:逐日结算持续效果(通用化改造) ---------- daily_tick 每日调用(不传参=1天);跳天/快进传 N 补算 N 天(快进不再冻结滴灌)。 遍历 $active_effects:按 decay(remaining/divisor,线性)缩放 daily, 保留小数直接累加(取整只发生在显示层);remaining-1;到期移除。 */ <<widget "active-effects-tick">>\ <<silently>> <<set _aect_days to ($args.length gt 0 and Number($args[0]) gt 0) ? Math.floor(Number($args[0])) : 1>> <<if $active_effects and $active_effects.length gt 0>> <<for _aect_d to 0; _aect_d lt _aect_days; _aect_d++>> <<for _aectx_i to 0; _aectx_i lt $active_effects.length;>> <<set _aectx_eff to $active_effects[_aectx_i]>> <<set _aectx_mult to 1>> <<if _aectx_eff.decay and _aectx_eff.divisor gt 0>> <<set _aectx_mult to _aectx_eff.remaining / _aectx_eff.divisor>> <</if>> <<if _aectx_mult gt 0 and _aectx_eff.daily>> <<set _aectx_scaled to {}>> <<set _aectx_keys to Object.keys(_aectx_eff.daily)>> <<for _aectx_k to 0; _aectx_k lt _aectx_keys.length; _aectx_k++>> <<set _aectx_scaled[_aectx_keys[_aectx_k]] to _aectx_eff.daily[_aectx_keys[_aectx_k]] * _aectx_mult>> <</for>> <<active-drip-apply _aectx_scaled>> <</if>> <<set _aectx_eff.remaining to _aectx_eff.remaining - 1>> <<if _aectx_eff.remaining lte 0>> <<set $active_effects.splice(_aectx_i, 1)>> <<else>> <<set _aectx_i to _aectx_i + 1>> <</if>> <</for>> <</for>> <</if>> <</silently>>\ <</widget>> /* ---------- effect-src-blocked:检查某来源是否处于生效期/冷却期 ---------- 用法:<<effect-src-blocked "UE_71">> 输出 _eff_blocked(true=该来源的事件暂不触发)。 生效期间 + 到位后半程尾冷却内都返回 true(冷却表在注册时一次写入)。 */ <<widget "effect-src-blocked">>\ <<silently>> <<set _esb_id to $args[0]>> <<set _eff_blocked to false>> <<if $effect_cool and _esb_id and $effect_cool[_esb_id] and $session_day lt $effect_cool[_esb_id]>> <<set _eff_blocked to true>> <</if>> <</silently>>\ <</widget>> /* ---------- congress-countdown:计算国会倒计时与预警级(V0.5-C P1) ---------- daily_tick 每日调用。days_until = 距下次国会开幕天数(60天一议)。 预警级:>14=0无 / 8~14=1开幕在即D-14 / 4~7=2议程已排定D-7 / 1~3=3最后斡旋D-3 / 0=4模拟轮D-0。 */ <<widget "congress-countdown">>\ <<silently>> <<set _cpc_mod to $session_day % 60>> <<set $days_until_session to (_cpc_mod eq 0 ? 0 : 60 - _cpc_mod)>> <<if $days_until_session gte 15>><<set $congress_warning_level to 0>> <<elseif $days_until_session gte 8>><<set $congress_warning_level to 1>> <<elseif $days_until_session gte 4>><<set $congress_warning_level to 2>> <<elseif $days_until_session gte 1>><<set $congress_warning_level to 3>> <<else>><<set $congress_warning_level to 4>> <</if>> <</silently>>\ <</widget>> /* ---------- review-remove-card:把一张牌移出公文包 ---------- 升华承诺对应的欠条会被重新标记为可升华(撤下不等于撕毁)。 */ <<widget "review-remove-card">>\ <<silently>> <<set _ci to $args[0]>> <<set _card2 to $session_review.table[_ci]>> <<if _card2 and _card2.promise_id>> <<for _j to 0; _j lt $promise_ledger.length; _j++>> <<if $promise_ledger[_j].id eq _card2.promise_id>> <<set $promise_ledger[_j].sublimated to false>> <</if>> <</for>> <</if>> <<if _card2>><<set $session_review.table.splice(_ci, 1)>><</if>> <</silently>>\ <</widget>> /* ---------- card-on-table:检查某张牌是否已在公文包 ---------- 用法:<<card-on-table "kind" "banner">> 或 <<card-on-table "id" "age_01">> 或 <<card-on-table "promise" "pr_1">>。输出 _ct_found。 (SugarCube 宏里不能写 function(o){...} 字面量,用循环代替。) */ <<widget "card-on-table">>\ <<silently>> <<set _ct_type to $args[0]>> <<set _ct_val to $args[1]>> <<set _ct_found to false>> <<for _i to 0; _i lt $session_review.table.length; _i++>> <<set _c to $session_review.table[_i]>> <<if _ct_type eq "kind" and _c.kind eq _ct_val>> <<set _ct_found to true>> <<elseif _ct_type eq "id" and _c.id eq _ct_val>> <<set _ct_found to true>> <<elseif _ct_type eq "promise" and _c.promise_id eq _ct_val>> <<set _ct_found to true>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- review-check:60天结算点检查,置 pending(强制通知) ---------- 在 daily-tick(逐日推进)和 tick-cycle(60天快进)中都调用, 保证无论怎么推进时间,审议日都不会被错过。 判定改为「跨过结算点即触发」:快进可能一口气越过第60天而不落在它上面, 用 $review_last_checked_day 记录上次检查时的天数,比较两次是否跨过了60的倍数。 */ <<widget "review-check">>\ <<silently>> <<set _rc_prev to $review_last_checked_day ? $review_last_checked_day : 0>> <<if $session_day gt 0 and (Math.floor($session_day / 60) gt Math.floor(_rc_prev / 60)) and not $session_review.flags.review_done[$session_review.round]>> <<set $session_review.pending to true>> <</if>> <<set $review_last_checked_day to $session_day>> <</silently>>\ <</widget>> /* ---------- review-open:开启新一轮审议 ---------- 清空旧桌、抽取他党提案、快照政治资本。 */ <<widget "review-open">>\ <<silently>> <<set $review_news_pending to false>> /* 新一轮开启,清掉上一轮未上报纸的残留 */ <<set $session_review.pending to false>> <<set $a48_vote_note to "">> /* 清掉上一轮的第48条动用现场记录 */ <<set $a48_ctx to {}>> <<set $session_review.in_review to true>> <<set $session_review.table to []>> <<set $session_review.lobby to {}>> <<set $session_review.lobby_deliver to {}>> <<set $session_review.deals to []>> <<set $session_review.player_stances to {}>> <<party-bill-draw>> <<cap-calc>> <<set $session_review.capital to $pc_total>> <<set $session_review.capital_limit to $pc_total>> /* 国会上限快照:供侧栏/预算弹窗显示 剩余/快照 */ <</silently>>\ <</widget>> /* ---------- review-close:结算本轮审议,标记完成,清空桌面 ---------- */ <<widget "review-close">>\ <<silently>> <<set $session_review.pending to false>> <<set $session_review.flags.review_done[$session_review.round] to true>> <<set $session_review.round to $session_review.round + 1>> <<set $session_review.table to []>> <<set $session_review.opp_bills to []>> <<set $session_review.lobby to {}>> <<set $session_review.lobby_deliver to {}>> <<set $session_review.deals to []>> <<set $session_review.player_stances to {}>> <<set $session_review.in_review to false>> <</silently>>\ <</widget>> /* ---------- review-decline:玩家缺席审议时,国会照常开会 ---------- 抽取他党提案并自动开票,通过的法案照样生效; 记缺席一次,舆论略有不安。玩家的提案不上桌(他没去)。 */ <<widget "review-decline">>\ <<silently>> <<set $session_review.pending to false>> <<rival-cost-reset>> <<set $trust_act_log to []>> <<party-bill-draw>> <<set _res to []>> <<for _rx to 0; _rx lt $session_review.opp_bills.length; _rx++>> <<party-stance $session_review.opp_bills[_rx]>> <<set _res.push({bill: $session_review.opp_bills[_rx], support: _stance_support, passed: _stance_passed})>> <</for>> <<if not $auto_stance_log>><<set $auto_stance_log to []>><</if>> <<set $auto_stance_log.push("国会照常开会(你缺席):")>> <<for _rx2 to 0; _rx2 lt _res.length; _rx2++>> <<if _res[_rx2].passed>> <<set _reg_arg to {src_id: _res[_rx2].bill.id, title: _res[_rx2].bill.title, kind: "bill", band: _res[_rx2].bill.band || "", effects: (_res[_rx2].bill.drip || _res[_rx2].bill.effects), source: "pass_absent"}>> <<active-effect-register _reg_arg>> <<if _res[_rx2].bill.drip and _res[_rx2].bill.effects>><<bill-apply-effects _res[_rx2].bill.effects>><</if>> <<set $auto_stance_log.push("通过:《" + _res[_rx2].bill.title + "》")>> <<else>> <<set $auto_stance_log.push("否决:《" + _res[_rx2].bill.title + "》")>> <</if>> <</for>> <<review-commit-summary _res false>> <<set $session_review.flags.review_done[$session_review.round] to true>> <<set $session_review.round to $session_review.round + 1>> <<set $session_review.opp_bills to []>> <<set $session_review.in_review to false>> <<set $session_review.absent to $session_review.absent + 1>> <<set $weimar.surface.anxiety to Math.max(0, Math.min(100, $weimar.surface.anxiety + 3))>> <<set $auto_stance_log.push("你缺席的消息传开了。魏玛在窗前站了很久,什么也没说。(焦虑+3)")>> <</silently>>\ <</widget>> /* ---------- review-eff-text:把 bill.effects 转成"代价"文本(三段式,带防御) ---------- 用法:<<review-eff-text effects>> 输出 _eff_world/_eff_party/_eff_long 空对象/undefined 直接按「(无法衡量)」处理,不遍历空对象。 */ <<widget "review-eff-text">>\ <<silently>> <<set _eff to $args[0]>> <<set _eff_world to "">> <<set _eff_party to "">> <<set _eff_long to "">> <<run (function(){ var eff = _eff; function sgn(n){ return (n>0?"+":"")+n; } if (!eff || Object.keys(eff).length===0){ State.variables.__rew_w = "(无法衡量)"; State.variables.__rew_p = ""; State.variables.__rew_l = ""; return; } var src = eff.burst ? eff.burst : eff; var nm = { economy:"经济压力", inflation:"通胀", social_anger:"社会愤怒", nationalism:"民族主义", gov_trust:"政府信任", revolution:"革命压力", army_influence:"军方影响", political_violence:"政治暴力", intl_trust:"国际信任", middle_confidence:"中产信心", fiscal:"财政赤字" }; var ws = []; for (var k in nm){ if (typeof src[k]==="number" && src[k]!==0) ws.push(nm[k]+sgn(src[k])); } var world = ws.join(" · "); var party = ""; if (eff.party_trust && typeof eff.party_trust==="object"){ var pn = State.variables.party_names || {}; var ps = []; for (var pk in eff.party_trust){ var d = eff.party_trust[pk]; if (!d) continue; ps.push((pn[pk]||pk)+sgn(d)); } party = ps.join(" · "); } var long = eff.duration ? ("持续 "+eff.duration+" 天生效") : ""; State.variables.__rew_w = world || "(无法衡量)"; State.variables.__rew_p = party; State.variables.__rew_l = long; })()>> <<set _eff_world to $__rew_w>> <<set _eff_party to $__rew_p>> <<set _eff_long to $__rew_l>> <<set $__rew_w to null>> <<set $__rew_p to null>> <<set $__rew_l to null>> <</silently>>\ <</widget>> /* ---------- review-measure-snap:记下法案生效前的世界/党派/国际信任数值 ---------- 结算离场时、每张通过的法案应用效果前调用一次。 只写内部快照 $__rm_snap,无可见输出。 */ <<widget "review-measure-snap">>\ <<silently>> <<run (function(){ var S = State.variables; var wk = ["economy","inflation","social_anger","nationalism","gov_trust","revolution","army_influence","political_violence"]; var w = {}; for (var i=0;i<wk.length;i++){ var k=wk[i]; w[k]=(S.world && typeof S.world[k]==="number") ? S.world[k] : null; } var pk = ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]; var p = {}; for (var j=0;j<pk.length;j++){ var q=pk[j]; p[q]=(S.npcs && S.npcs[q] && typeof S.npcs[q].trust==="number") ? S.npcs[q].trust : null; } S.__rm_snap = { world: w, party: p, intl: (S.weimar && S.weimar.mid && typeof S.weimar.mid.intl_trust==="number") ? S.weimar.mid.intl_trust : null }; })()>> <</silently>>\ <</widget>> /* ---------- review-measure-bill:法案应用后算「当前值→新值」 ---------- 用法:<<review-measure-bill 结果对象>>(对象须含 .passed/.bill)。 与 $__rm_snap 比差,结果按 bill.id 存入 $__rm_rows(world/party 两串)。 0-100 截断、被裁剪的差额都会如实反映在差值里。 */ <<widget "review-measure-bill">>\ <<silently>> <<set _rmb_res to $args[0]>> <<run (function(){ var S = State.variables; var snap = S.__rm_snap, res = _rmb_res; if (!snap || !res || !res.passed || !res.bill) return; var nm = { economy:"经济压力", inflation:"通胀", social_anger:"社会愤怒", nationalism:"民族主义", gov_trust:"政府信任", revolution:"革命压力", army_influence:"军方影响", political_violence:"政治暴力" }; var wparts = []; for (var k in nm){ var b = snap.world[k], a = S.world ? S.world[k] : null; if (typeof b==="number" && typeof a==="number" && a!==b) wparts.push(nm[k]+" "+Math.round(b)+"→"+Math.round(a)); } var ib = snap.intl, ia = (S.weimar && S.weimar.mid) ? S.weimar.mid.intl_trust : null; if (typeof ib==="number" && typeof ia==="number" && ia!==ib) wparts.push("国际信任 "+Math.round(ib)+"→"+Math.round(ia)); var pparts = []; var pn = S.party_names || {}; for (var q in snap.party){ var pb = snap.party[q], pa = (S.npcs && S.npcs[q] && typeof S.npcs[q].trust==="number") ? S.npcs[q].trust : pb; if (typeof pb==="number" && pa!==pb) pparts.push((pn[q]||q)+" "+Math.round(pb)+"→"+Math.round(pa)); } if (!S.__rm_rows) S.__rm_rows = {}; S.__rm_rows[res.bill.id] = { world: wparts.join(" · "), party: pparts.join(" · ") }; })()>> <</silently>>\ <</widget>> /* ---------- review-commit-summary:每轮国会结束汇总 + 报纸待发 ---------- 用法:<<review-commit-summary results attended>> results 元素统一包裹 bill(缺席 _res={bill,...} / 参加 $session_review.results 同构)。 产出 $review_summary.lines(含党派名/通过/三段代价)+ $review_news_title/_line,并置 pending。 */ <<widget "review-commit-summary">>\ <<silently>> <<set _rac_results to $args[0]>> <<set _rattended to ($args[1] ? true : false)>> <<set $session_review.attend_note to (_rattended ? "你在场" : "你缺席")>> <<set $__rcl to []>> <<set $__rcp to []>> <<run (function(){ var res = _rac_results || []; var pn = State.variables.party_names || {}; var lines = []; var passedTitles = []; for (var i=0;i<res.length;i++){ var b = res[i] ? res[i].bill : null; if (!b) continue; var pc = b.party && pn[b.party] ? pn[b.party] : (b.party ? b.party : "国会"); if (b.is_player) pc = "你的提案"; var line = { party_name: pc, title: (b.title||"未命名"), is_player: !!b.is_player, passed: !!res[i].passed, bill: b }; lines.push(line); if (line.passed) passedTitles.push(line.is_player ? "你的《"+line.title+"》" : line.party_name+"的《"+line.title+"》"); } State.variables.__rcl = lines; State.variables.__rcp = passedTitles; })()>> <<set _linesout to []>> <<for _ll to 0; _ll lt $__rcl.length; _ll++>> <<set _lb to $__rcl[_ll]>> <<review-eff-text _lb.bill.effects>> <<set _lb_act to ($__rm_rows and _lb.bill and $__rm_rows[_lb.bill.id]) ? $__rm_rows[_lb.bill.id] : null>> <<run _linesout.push({ party_name: _lb.party_name, title: _lb.title, is_player: _lb.is_player, passed: _lb.passed, cost_world: _eff_world, cost_party: _eff_party, cost_long: _eff_long, act_world: _lb_act ? _lb_act.world : "", act_party: _lb_act ? _lb_act.party : "" })>> <</for>> <<set $review_summary to { attended: _rattended, attend_note: $session_review.attend_note, lines: _linesout }>> <<set _rcpt to $__rcp>> <<set $review_news_pending to true>> <<set $review_morning_pending to true>> <<if _rcpt.length gt 0>> <<set _newsitems to []>> <<for _nl to 0; _nl lt _linesout.length; _nl++>> <<if _linesout[_nl].passed>> <<set _nd to (_linesout[_nl].cost_world eq "(无法衡量)" ? "" : _linesout[_nl].cost_world)>> <<if _linesout[_nl].cost_party neq "">><<set _nd to (_nd eq "" ? _linesout[_nl].cost_party : _nd + " · " + _linesout[_nl].cost_party)>><</if>> <<run _newsitems.push("《" + _linesout[_nl].title + "》" + (_nd eq "" ? "" : ":" + _nd))>> <</if>> <</for>> <<set $review_news_line to "国会通过:" + _newsitems.join(";")>> <<set _rfirst to _rcpt[0]>> <<set $review_news_title to "国会议决 · " + _rfirst>> <<else>> <<set $review_news_line to "国会照常开会,本轮提案均未获通过。">> <<set $review_news_title to "国会平淡收场">> <</if>> <<set $__rcl to null>> <<set $__rcp to null>> <<set $__rm_rows to null>> <<set $__rm_snap to null>> <</silently>>\ <</widget>> /* ============================================================ ① 国会走廊:清算 + 欠条 + 他党提案 + 游说 + 定牌 ============================================================ */
<<silently>><<if not $session_review.in_review>><<review-open>><</if>><</silently>>\ ''国会 · 走廊'' //国会大厦的后走廊。再往前就是议事厅。墙上的钟在走。各党的人三五成群,等着你走过去说话。// <<intel-current>>\ //(你的情报 _intel_val/30 —— 这决定你在表决时能看清多少。)// <<if not $flags.intel_teach_done>>\ <div class="guide-box">\ ''情报'':你知道多少,表决时就听得多清。10 以下只有一个干巴巴的总数;10 以上能看出两边阵营的深浅;20 以上能看到每一票怎么投;攒满 30,连各党背后的算盘都瞒不住你。\ //涨的途径:事件里选「多问一句」类的动作(+5),出门跑图每趟(+1)。它会随日子淡掉,但很慢;上限 30。//\ </div>\ <<set $flags.intel_teach_done to true>>\ <</if>> <<if $session_review.lobby_notice>>\ //$session_review.lobby_notice// <<set $session_review.lobby_notice to null>>\ <hr>\ <</if>> <<promise-settle>>\ <<if _settle_report.length gt 0>>\ ''—— 违约清算 ——'' <<set _sr_names to {spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方"}>>\ <<for _si to 0; _si lt _settle_report.length; _si++>>\ //你答应过<<print _settle_report[_si].target>>的事,没有做到。// <<set _st to _settle_report[_si].target>>\ <<if _st eq "worker">>街角的人群还在等。\ <<elseif _st eq "military">>军靴声在走廊里多响了一次。\ <<elseif _st eq "middle">>那位教师的积蓄,又薄了一页。\ <<elseif _st eq "foreign">>协约国的备忘录上,你的名字旁边多了一个问号。\ <<elseif _st eq "civil">>盖章的手,慢了一拍。\ <</if>>\ <span class="txt-severe">(<<print _sr_names[_settle_report[_si].party]>>信任-8)</span> <</for>>\ //(失信的名字贴在了你身上:「失信者」。)// <hr>\ <</if>> ''你的欠条簿'' <<if $promise_ledger.length eq 0>>\ //欠条簿是空的。要么你从没答应过谁,要么你答应的事都还清了。//\ <<else>>\ <<for _pi to 0; _pi lt $promise_ledger.length; _pi++>>\ <<set _p to $promise_ledger[_pi]>>\ <<set _st2 to _p.status>>\ <<if _st2 eq "open">>//【未兑现】// _p.content\ <<elseif _st2 eq "fulfilled">>//【已兑现】// _p.content\ <<else>>//【已违约】// _p.content<</if>>\ (对象:_p.target | 到期:第 _p.deadline 天) <</for>>\ <</if>>\ <hr>\ ''政治资本:<<print $session_review.capital>>'' //(游说就花这个。)// <<if not $flags.cap_teach_done>>\ <div class="guide-box">\ ''政治资本'':你在政坛的名望折成的硬通货——各党的信任、兑现过的承诺、一贯的立场、攒下的声望,都算在里面。\ //进国会时折成这一轮的预算:散场就清空,下一轮按名望重算。花法:拉票买票(按钮上标价),让一党撤回提案(25)。侧栏的「资本 ▸ 详情」点开有明细。//\ </div>\ <<set $flags.cap_teach_done to true>>\ <</if>> ''你的公文包'' <<if $session_review.table.length eq 0>>\ //空的。这一轮你可以一张牌都不推——只等别人的提案上桌,再决定支持还是反对。//\ <<else>>\ <<for _ti to 0; _ti lt $session_review.table.length; _ti++>>\ <<set _tc to $session_review.table[_ti]>>\ - 《_tc.title》 <<if not (_tc.kind eq "counterfact")>><<capture _ti>><<link "移出">><<review-remove-card _ti>><<goto "Scene_Review">><</link>><</capture>><<else>>//(历史歧路一旦上桌,收不回——打一张少一张。)//<</if>> <<capture _tc>><<link "「为自己拉票」">><<set $session_review.lobby_target to _tc.id>><<goto "Scene_Lobby_Vote">><</link>><</capture>> //(代价会告诉你,谁真站你这边。)//\ <<review-show-actions _tc "corridor">>\ <<intel-forecast _tc.effects "brief">>\ <</for>>\ <</if>>\ <<link "「打开公文包,定牌(0~3张)」">><<goto "Scene_Review_Cards">><</link>> //(施政纲领 / 践诺 / 时局 / 长远 / 历史歧路)// <hr>\ ''他党递上来的提案'' <<if $session_review.opp_bills.length eq 0>>\ //没有他党提案。走廊空得反常。//\ <<else>>\ <<for _bi to 0; _bi lt $session_review.opp_bills.length; _bi++>>\ <<set _ob to $session_review.opp_bills[_bi]>>\ <div class="bill-card">\ <span class="bill-title">《_ob.title》</span><span class="bill-meta">(<<print $party_names[_ob.party]>> 的提案)</span> <span class="bill-body">_ob.narrative</span> <<if _intel_val gte 30>><span class="bill-meta">背后的算盘:_ob.motive</span><</if>> <<set _ob_dealt to false>>\ <<for _di to 0; _di lt $session_review.deals.length; _di++>>\ <<if $session_review.deals[_di].opp_bill_id eq _ob.id and $session_review.deals[_di].party eq _ob.party>>\ <<set _ob_dealt to true>>\ <</if>>\ <</for>>\ <<review-show-actions _ob "corridor">>\ <<intel-forecast _ob.effects "brief">>\ <div class="bill-actions"> <<capture _ob _ob_dealt>>\ <<link "「拉票」">><<set $session_review.lobby_target to _ob.id>><<goto "Scene_Lobby_Vote">><</link>> | <<if _ob_dealt>>\ <span class="vt-muted">(已与他换过票。)</span>\ <<else>>\ <<link "「换票」">><<set $session_review.deals.push({party:_ob.party, opp_bill_id:_ob.id, player_bill_id:"any"})>><<set $session_review.lobby_notice to "你答应支持《" + _ob.title + "》。作为交换,他会投你的提案一票——前提是你真投了他的。">><<goto "Scene_Review">><</link>> | <</if>>\ <<link "「撤案」">><<set $session_review.pull_target to _ob.id>><<goto "Scene_Review_Pull">><</link>>\ <</capture>>\ </div>\ </div>\ <hr>\ <</for>>\ <</if>>\ <<link "「进议事厅」">><<goto "Scene_Review_Vote">><</link>> /* ---------- 拉票页:选一个党,决定买他赞成还是反对 ---------- */
<<silently>> <<set _lb to null>>\ <<for _bi to 0; _bi lt $session_review.opp_bills.length; _bi++>>\ <<if $session_review.opp_bills[_bi].id eq $session_review.lobby_target>>\ <<set _lb to $session_review.opp_bills[_bi]>>\ <</if>>\ <</for>>\ <<if _lb eq null>>\ <<for _ti to 0; _ti lt $session_review.table.length; _ti++>>\ <<if $session_review.table[_ti].id eq $session_review.lobby_target>>\ <<set _lb to $session_review.table[_ti]>>\ <</if>>\ <</for>>\ <</if>>\ <<set _is_own to false>>\ <<if _lb and _lb.is_player>><<set _is_own to true>><</if>>\ <</silently>>\ <<if _lb>>\ ''拉票 ·《_lb.title》''<<if _is_own>>//(你自己的提案——别人的代价,就是他们心里那杆称。)//<<else>>\ //顺着他的性子买,便宜;拧着他的性子买,就贵。//\ <</if>>\ <<intel-forecast _lb.effects>>\ <<party-stance _lb>>\ <<set _voters2 to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap"]>>\ <<for _vi to 0; _vi lt _voters2.length; _vi++>>\ <<set _pk2 to _voters2[_vi]>>\ <<if _lb.party eq _pk2>>\ - <<print $party_names[_pk2]>>——//这本就是他递上来的。他投他自己。// <hr>\ <<continue>>\ <</if>>\ <<set _lobby_st2 to $session_review.lobby[_lb.id + "|" + _pk2]>>\ <<set _cur_cls2 to "st-unk">>\ <<set _cur_st2 to "未收买">>\ <<if _lobby_st2 eq "yes">><<set _cur_st2 to "已收买·支持">><<set _cur_cls2 to "st-yes">>\ <<elseif _lobby_st2 eq "no">><<set _cur_st2 to "已收买·反对">><<set _cur_cls2 to "st-no">><</if>>\ <<set _bought2 to (_lobby_st2 eq "yes" or _lobby_st2 eq "no")>>\ <<set _nat2 to _stance_map[_pk2]>>\ <<set _cost_yes to 4>>\ <<set _cost_no to 4>>\ <<if _nat2 eq "yes">><<set _cost_no to 8>>\ <<elseif _nat2 eq "no">><<set _cost_yes to 8>>\ <<else>><<set _cost_yes to 6>><<set _cost_no to 6>><</if>>\ <<set _dis2 to 0.8>>\ <<if $party_profile[_pk2] and $party_profile[_pk2].discipline>><<set _dis2 to $party_profile[_pk2].discipline>><</if>>\ <<set _pct2 to Math.round(55 + 40 * _dis2)>>\ <<capture _pk2 _cost_yes _cost_no _cur_st2 _cur_cls2 _bought2 _dis2 _pct2>>\ - <<print $party_names[_pk2]>> <<print '<span class="st-badge ' + _cur_cls2 + '">' + _cur_st2 + '</span>'>> <<if _bought2>>\ <span class="vt-muted">(已收买,这一票定了。)</span>\ <<else>>\ <<set _roll2 to random(1, 100)>>\ <<set _deliv2 to (_roll2 lte _pct2)>>\ <span class="vt-yes"><<link "买支持(-_cost_yes)">> <<if $session_review.capital gte _cost_yes>>\ <<set $session_review.capital to $session_review.capital - _cost_yes>>\ <<set $session_review.lobby[_lb.id + "|" + _pk2] to "yes">>\ <<set _bonus2 to 3>>\ <<if not _deliv2>><<set _bonus2 to 0>><</if>>\ <<if not $session_review.lobby_deliver>><<set $session_review.lobby_deliver to {}>><</if>>\ <<set $session_review.lobby_deliver[_lb.id + "|" + _pk2] to {direction:"yes", bonus:_bonus2}>>\ <<if _deliv2>>\ <<set $session_review.lobby_notice to $party_names[_pk2] + " 收了钱,答应投支持票。(买通成功:该党倾向+3)">>\ <<else>>\ <<set $session_review.lobby_notice to $party_names[_pk2] + " 收了钱,但你看出他眼神游移——这票未必靠得住。(未兑现:+0)">>\ <</if>>\ <<else>>\ <<set $session_review.lobby_notice to "资本不够(这次要 " + _cost_yes + ")。">>\ <</if>>\ <<goto "Scene_Lobby_Vote">>\ <</link>></span> <<if not _is_own>>| <span class="vt-no"><<link "买反对(-_cost_no)">> <<if $session_review.capital gte _cost_no>>\ <<set $session_review.capital to $session_review.capital - _cost_no>>\ <<set $session_review.lobby[_lb.id + "|" + _pk2] to "no">>\ <<set _bonus2 to -3>>\ <<if not _deliv2>><<set _bonus2 to 0>><</if>>\ <<if not $session_review.lobby_deliver>><<set $session_review.lobby_deliver to {}>><</if>>\ <<set $session_review.lobby_deliver[_lb.id + "|" + _pk2] to {direction:"no", bonus:_bonus2}>>\ <<if _deliv2>>\ <<set $session_review.lobby_notice to $party_names[_pk2] + " 收了钱,答应投反对票。(买通成功:该党倾向-3)">>\ <<else>>\ <<set $session_review.lobby_notice to $party_names[_pk2] + " 收了钱,但你看得出他未必真照办。(未兑现:+0)">>\ <</if>>\ <<else>>\ <<set $session_review.lobby_notice to "资本不够(这次要 " + _cost_no + ")。">>\ <</if>>\ <<goto "Scene_Lobby_Vote">>\ <</link>></span><</if>>\ <</if>>\ <</capture>>\ <</for>>\ <<link "「回走廊」">><<goto "Scene_Review">><</link>> <<else>>\ //你找的那张提案已经不在了。// <<link "「回走廊」">><<goto "Scene_Review">><</link>> <</if>> /* ---------- 定牌页:从公文包选 0~3 张上桌 ---------- 施政纲领案(光谱)/ 践诺案 / 时局案 / 长远案 / 历史歧路(打一张少一张) */
''公文包 · 定牌'' //国会不是舞台,是集市——你端上什么,别人就跟你算什么账。这一轮,你可以放0到3张。// ''已选 <<print $session_review.table.length>>/3 张'' <<if $session_review.table.length eq 0>>\ //公文包还是空的。你也可以什么都不带,去议事厅看别人拿主意。//\ <<else>>\ <<for _ci to 0; _ci lt $session_review.table.length; _ci++>>\ <<set _tc2 to $session_review.table[_ci]>>\ <div class="bill-card">\ <span class="bill-title">《_tc2.title》</span> <div class="bill-actions"> <<if not (_tc2.kind eq "counterfact")>><<capture _ci>><<link "「移出公文包」">><<review-remove-card _ci>><<goto "Scene_Review_Cards">><</link>><</capture>><<else>><span class="vt-muted">//(历史歧路,收不回)//</span><</if>> </div>\ </div>\ <</for>>\ <</if>>\ <hr>\ <span class="player-sec">① 施政纲领案</span> <<banner-current>>\ <span class="bill-meta">//你的光谱坐标:左/右 _banner_lr | 激进/保守 _banner_rc。这一格,你有 <<print _banners.length>> 条纲领可选。//</span> <<for _bi to 0; _bi lt _banners.length; _bi++>>\ <<set _b to _banners[_bi]>>\ <div class="bill-card">\ <span class="bill-title">《_b.title》</span><span class="bill-meta">(_b.category)</span> <span class="bill-body">_b.narrative</span> <<intel-forecast _b.effects "brief">>\ <<card-on-table "id" _b.id>>\ <div class="bill-actions"> <<if _ct_found>>\ <span class="vt-muted">(这条纲领已在你的公文包里。)</span>\ <<elseif $session_review.table.length gte 3>>\ <span class="vt-muted">(公文包已满。)</span>\ <<else>>\ <<capture _b>>\ <<link "「放进公文包」">>\ <<set $session_review.table.push({kind:"banner", id:_b.id, title:_b.title, category:_b.category, base_support:_b.base_support, effects:_b.effects, band:_b.band, drip:_b.drip, narrative:_b.narrative, axis:{lr:_b.lr, rc:_b.rc}, constitutional:_b.constitutional, is_player:true})>>\ <<goto "Scene_Review_Cards">>\ <</link>>\ <</capture>>\ <</if>>\ </div>\ </div>\ <hr>\ <</for>>\ <hr>\ <span class="player-sec">② 践诺案</span> <<set _sublime_count to 0>>\ <<for _pi to 0; _pi lt $promise_ledger.length; _pi++>>\ <<set _p2 to $promise_ledger[_pi]>>\ <<if _p2.status eq "fulfilled" and not _p2.sublimated>>\ <<set _sublime_count to _sublime_count + 1>>\ <<set _tmpl to $player_proposals.sublime[_p2.target]>>\ <<if _tmpl>>\ <div class="bill-card">\ <span class="bill-title">《_tmpl.title》</span><span class="bill-meta">(源自承诺:_p2.content)</span> <span class="bill-body">_tmpl.narrative</span> <<intel-forecast _tmpl.effects "brief">>\ <<card-on-table "promise" _p2.id>>\ <div class="bill-actions"> <<if _ct_found>>\ <span class="vt-muted">(已在公文包里。)</span>\ <<elseif $session_review.table.length gte 3>>\ <span class="vt-muted">(公文包已满。)</span>\ <<else>>\ <<capture _p2 _tmpl>>\ <<link "「放进公文包」">>\ <<set $session_review.table.push({kind:"sublime", id:_tmpl.id, title:_tmpl.title, category:_tmpl.category, base_support:_tmpl.base_support, effects:_tmpl.effects, band:_tmpl.band, drip:_tmpl.drip, narrative:_tmpl.narrative, axis:_tmpl.axis, constitutional:_tmpl.constitutional, promise_id:_p2.id, is_player:true})>>\ <<set _p2.sublimated to true>>\ <<goto "Scene_Review_Cards">>\ <</link>>\ <</capture>>\ <</if>>\ </div>\ </div>\ <hr>\ <</if>>\ <</if>>\ <</for>>\ <<if _sublime_count eq 0>>\ <span class="vt-muted">//你手上没有可成案的践诺。想有的话,记得去兑现那些欠条。//</span>\ <</if>>\ <hr>\ <span class="player-sec">③ 时局案</span> <<agenda-unlocked>>\ <<if _agenda_unlocked.length eq 0>>\ <span class="vt-muted">//这一轮没有够格的时局案。//</span>\ <<else>>\ <<for _ai to 0; _ai lt _agenda_unlocked.length; _ai++>>\ <<set _ac to _agenda_unlocked[_ai]>>\ <div class="bill-card">\ <span class="bill-title">《_ac.title》</span><span class="bill-meta">(_ac.category)</span> <span class="bill-body">_ac.narrative</span> <<intel-forecast _ac.effects "brief">>\ <<card-on-table "id" _ac.id>>\ <div class="bill-actions"> <<if _ct_found>>\ <span class="vt-muted">(已在公文包里。)</span>\ <<elseif $session_review.table.length gte 3>>\ <span class="vt-muted">(公文包已满。)</span>\ <<else>>\ <<capture _ac>>\ <<link "「放进公文包」">>\ <<set $session_review.table.push({kind:"agenda", id:_ac.id, title:_ac.title, category:_ac.category, base_support:_ac.base_support, effects:_ac.effects, narrative:_ac.narrative, axis:{lr:"中", rc:"中"}, constitutional:_ac.constitutional, is_player:true})>>\ <<goto "Scene_Review_Cards">>\ <</link>>\ <</capture>>\ <</if>>\ </div>\ </div>\ <hr>\ <</for>>\ <</if>>\ <hr>\ <span class="player-sec">④ 长远案</span> <<for _li to 0; _li lt $player_proposals.longline.length; _li++>>\ <<set _lc to $player_proposals.longline[_li]>>\ <div class="bill-card">\ <span class="bill-title">《_lc.title》</span><span class="bill-meta">(_lc.category)</span> <span class="bill-body">_lc.narrative</span> <span class="bill-meta">//里程碑:<<print _lc.milestones.join(" → ")>>//</span> <<intel-forecast _lc.effects "brief">>\ <<card-on-table "id" _lc.id>>\ <div class="bill-actions"> <<if _ct_found>>\ <span class="vt-muted">(已在公文包里。)</span>\ <<elseif $session_review.table.length gte 3>>\ <span class="vt-muted">(公文包已满。)</span>\ <<else>>\ <<capture _lc>>\ <<link "「放进公文包」">>\ <<set $session_review.table.push({kind:"longline", id:_lc.id, title:_lc.title, category:_lc.category, base_support:_lc.base_support, effects:_lc.effects, narrative:_lc.narrative, axis:{lr:"中", rc:"中"}, constitutional:_lc.constitutional, is_player:true})>>\ <<goto "Scene_Review_Cards">>\ <</link>>\ <</capture>>\ <</if>>\ </div>\ </div>\ <hr>\ <</for>>\ <hr>\ <span class="player-sec">⑤ 历史歧路</span> <<if not $session_review.counterfact_used>><<set $session_review.counterfact_used to []>><</if>>\ <<for _ci2 to 0; _ci2 lt $player_proposals.counterfact.length; _ci2++>>\ <<set _cc to $player_proposals.counterfact[_ci2]>>\ <<set _cc_used to false>>\ <<for _u to 0; _u lt $session_review.counterfact_used.length; _u++>>\ <<if $session_review.counterfact_used[_u] eq _cc.id>>\ <<set _cc_used to true>>\ <</if>>\ <</for>>\ <<card-on-table "id" _cc.id>>\ <<if _cc_used and not _ct_found>>\ <span class="vt-muted">//《_cc.title》—— 这把钥匙已经用过了,收不进抽屉。//</span>\ <<else>>\ <div class="bill-card">\ <span class="bill-title">《_cc.title》</span><span class="bill-meta">(_cc.category)</span> <span class="bill-body">_cc.narrative</span> <<intel-forecast _cc.effects "brief">>\ <div class="bill-actions"> <<if _ct_found>>\ <span class="vt-muted">(已在公文包里。历史歧路一旦上桌就收不回。)</span>\ <<elseif $session_review.table.length gte 3>>\ <span class="vt-muted">(公文包已满。)</span>\ <<else>>\ <<capture _cc>>\ <<link "「放进公文包」">>\ <<set $session_review.table.push({kind:"counterfact", id:_cc.id, title:_cc.title, category:_cc.category, base_support:_cc.base_support, effects:_cc.effects, narrative:_cc.narrative, axis:{lr:"中", rc:"中"}, constitutional:_cc.constitutional, is_player:true})>>\ <<set $session_review.counterfact_used.push(_cc.id)>>\ <<goto "Scene_Review_Cards">>\ <</link>>\ <</capture>>\ <</if>>\ </div>\ </div>\ <</if>>\ <hr>\ <</for>>\ <hr>\ <<link "「回走廊」">><<goto "Scene_Review">><</link>> /* ---------- 撤案页:出价让他党撤回自己的提案 ---------- */
<<silently>> <<set _pb to null>>\ <<for _bi to 0; _bi lt $session_review.opp_bills.length; _bi++>>\ <<if $session_review.opp_bills[_bi].id eq $session_review.pull_target>>\ <<set _pb to $session_review.opp_bills[_bi]>>\ <</if>>\ <</for>>\ <</silently>>\ <<if _pb>>\ ''撤案 ·《_pb.title》'' _pb.narrative //要让 <<print $party_names[_pb.party]>> 撤回自己的提案,得出一笔足够体面的价码:25 政治资本。// <<if $session_review.capital gte 25>>\ <<link "「出价,让他撤案(-25)」">>\ <<set $session_review.capital to $session_review.capital - 25>>\ <<set $session_review.opp_bills to $session_review.opp_bills.filter(function(b){ return b.id !== _pb.id; })>>\ <<set $session_review.lobby_notice to $party_names[_pb.party] + " 收下了钱。那件提案不会再上桌了——但他们会记得你是怎么用钱的。">>\ <<goto "Scene_Review">>\ <</link>>\ <<else>>\ //你的资本不够出这个价。想别的办法吧。//\ <</if>>\ <<link "「算了,回走廊」">><<goto "Scene_Review">><</link>> <<else>>\ //你找的那张提案已经不在了。// <<link "「回走廊」">><<goto "Scene_Review">><</link>> <</if>> /* ---------- 议事厅 · 表态页:玩家对他党提案逐张表态 ---------- */
''议事厅 · 逐张表态'' //议长在念议程。他党的提案先上桌。你点头,或摇头,或者让自己成为一个沉默的符号。// <<intel-current>>\ <<if not $flags.stance_teach_done>>\ //(你公开站队不是白站的——信任你的党会跟着你的调子走,看你不顺眼的偏要拧着来。)//\ <<set $flags.stance_teach_done to true>>\ <</if>>\ <<if $session_review.opp_bills.length eq 0>>\ //这一轮没有他党提案上桌。桌上只有你的东西,和空气。//\ <<else>>\ <<for _bi3 to 0; _bi3 lt $session_review.opp_bills.length; _bi3++>>\ <<set _ob3 to $session_review.opp_bills[_bi3]>>\ <div class="bill-card">\ <span class="bill-title">《_ob3.title》</span><span class="bill-meta">(<<print $party_names[_ob3.party]>> 的提案)</span> <span class="bill-body">_ob3.narrative</span> <<set _cur3 to "尚未表态">>\ <<set _cur_cls3 to "st-unk">>\ <<if $session_review.player_stances[_ob3.id] eq "yes">><<set _cur3 to "已表态·支持">><<set _cur_cls3 to "st-yes">>\ <<elseif $session_review.player_stances[_ob3.id] eq "no">><<set _cur3 to "已表态·反对">><<set _cur_cls3 to "st-no">>\ <<elseif $session_review.player_stances[_ob3.id] eq "abstain">><<set _cur3 to "已表态·弃权">><<set _cur_cls3 to "st-abst">><</if>>\ <span class="bill-meta">当前立场:</span><<print '<span class="st-badge ' + _cur_cls3 + '">' + _cur3 + '</span>'>> <<review-show-actions _ob3 "pre">>\ <<party-stance _ob3>>\ <<if _intel_val gte 10>><span class="bill-meta">//风闻:赞成约 _stance_yes 席 · 反对约 _stance_no 席(通过需 _stance_quota 席)//</span>\ <<else>><span class="bill-meta">//(你的情报太少,估不出这场表决的风向。)//</span><</if>>\ <div class="bill-actions"> <<capture _ob3>>\ <span class="vt-yes"><<link "「支持」">><<set $session_review.player_stances[_ob3.id] to "yes">><<goto "Scene_Review_Vote">><</link>></span> | <span class="vt-no"><<link "「反对」">><<set $session_review.player_stances[_ob3.id] to "no">><<goto "Scene_Review_Vote">><</link>></span> | <span class="vt-abst"><<link "「弃权」">><<set $session_review.player_stances[_ob3.id] to "abstain">><<goto "Scene_Review_Vote">><</link>></span>\ <</capture>>\ </div>\ </div>\ <hr>\ <</for>>\ <</if>>\ <<link "「开票」">><<goto "Scene_Review_Results">><</link>> //(未表态的,一律视为弃权。)// /* ---------- 议事厅 · 开票页:逐张唱票 + 情报分级明细 + 结算 ---------- */
<<silently>> <<set $session_review.results to []>>\ <<set _all_bills to []>>\ <<for _oi to 0; _oi lt $session_review.opp_bills.length; _oi++>>\ <<set _all_bills.push($session_review.opp_bills[_oi])>>\ <</for>>\ <<for _pi3 to 0; _pi3 lt $session_review.table.length; _pi3++>>\ <<set _all_bills.push($session_review.table[_pi3])>>\ <</for>>\ <<for _bi2 to 0; _bi2 lt _all_bills.length; _bi2++>>\ <<set _b3 to _all_bills[_bi2]>>\ <<party-stance _b3>>\ /* 「你的介入」检测:表过态 / 拉过票(lobby 键前缀)/ 自己的案有换票牵连。 有介入则再算一遍基准票数(base 模式=假如你什么都没做),开票页显示差值 */ <<set _r3_acted to false>>\ <<if $session_review.player_stances and $session_review.player_stances[_b3.id]>>\ <<set _r3_acted to true>>\ <</if>>\ <<if not _r3_acted and $session_review.lobby>>\ <<set _r3_keys to Object.keys($session_review.lobby)>>\ <<for _r3k to 0; _r3k lt _r3_keys.length; _r3k++>>\ <<if _r3_keys[_r3k].indexOf(_b3.id + "|") eq 0>><<set _r3_acted to true>><</if>>\ <</for>>\ <</if>>\ <<if not _r3_acted and _b3.is_player and $session_review.deals.length gt 0>>\ <<set _r3_acted to true>>\ <</if>>\ /* 先把实际票数(含你的介入)存进临时变量——后面的 base 重跑会覆写 _stance_*, 不存下来 push 到 results 的 yes/passed 就会变成「假如你什么都没做」的数值 */ <<set _r3_yes to _stance_yes>>\ <<set _r3_no to _stance_no>>\ <<set _r3_support to _stance_support>>\ <<set _r3_passed to _stance_passed>>\ <<set _r3_map to _stance_map>>\ <<set _r3_seats to _stance_seats>>\ <<set _r3_base_yes to _stance_yes>>\ <<set _r3_base_no to _stance_no>>\ <<if _r3_acted>>\ <<party-stance _b3 "base">>\ <<set _r3_base_yes to _stance_yes>>\ <<set _r3_base_no to _stance_no>>\ <</if>>\ <<set $session_review.results.push({bill:_b3, stance_map:_r3_map, stance_seats:_r3_seats, yes:_r3_yes, no:_r3_no, support:_r3_support, quota:_stance_quota, quota_type:_stance_quota_type, passed:_r3_passed, player_acted:_r3_acted, base_yes:_r3_base_yes, base_no:_r3_base_no})>>\ <</for>>\ <</silently>>\ ''议事厅 · 开票'' //唱票员开始念。每张牌,七个党依次表态。你的情报决定你听到多少。// <<intel-current>>\ <<if $a48_vote_note and $a48_vote_note neq "">>\ <div class="a48-box">//<<= $a48_vote_note >>//</div>\ <</if>>\ <div class="vp-legend"> <span class="vp-leg vp-leg-yes">赞成</span> <span class="vp-leg vp-leg-no">反对</span> <span class="vp-leg vp-leg-abst">弃权</span> </div>\ <<for _ri to 0; _ri lt $session_review.results.length; _ri++>>\ <<set _r to $session_review.results[_ri]>>\ <<if _r.bill.a48 eq "annulled">>\ <div class="vp-result vp-result-fail">\ <span class="vt-fail">【作废·第48条】</span> <span>《_r.bill.title》</span> <<if _r.bill.is_player>><span class="bill-meta">(你的提案)</span><<else>><span class="bill-meta">(<<print $party_names[_r.bill.party]>> 的提案)</span><</if>> <span class="bill-meta">赞成 _r.yes 席 · 已被紧急法令作废,表决结果不再生效</span>\ </div>\ <<elseif _r.bill.a48 eq "forced">>\ <div class="vp-result vp-result-pass">\ <span class="vt-pass">【强推·第48条】</span> <span>《_r.bill.title》</span> <<if _r.bill.is_player>><span class="bill-meta">(你的提案)</span><<else>><span class="bill-meta">(<<print $party_names[_r.bill.party]>> 的提案)</span><</if>> <span class="bill-meta">赞成 _r.yes 席 · 未经表决,紧急法令使其直接生效</span>\ </div>\ <<elseif _r.passed>>\ <div class="vp-result vp-result-pass">\ <span class="vt-pass">【通过】</span> <span>《_r.bill.title》</span> <<if _r.bill.is_player>><span class="bill-meta">(你的提案)</span><<else>><span class="bill-meta">(<<print $party_names[_r.bill.party]>> 的提案)</span><</if>> <<if _r.quota_type eq "修宪">><span class="bill-meta">修宪法案 · 需 2/3多数 = _r.quota 席</span><<else>><span class="bill-meta">普通法案 · 简单多数 = _r.quota 席</span><</if>> <span class="bill-meta">赞成 _r.yes 席 / 需 _r.quota 席</span>\ </div>\ <<else>>\ <div class="vp-result vp-result-fail">\ <span class="vt-fail">【否决】</span> <span>《_r.bill.title》</span> <<if _r.bill.is_player>><span class="bill-meta">(你的提案)</span><<else>><span class="bill-meta">(<<print $party_names[_r.bill.party]>> 的提案)</span><</if>> <<if _r.quota_type eq "修宪">><span class="bill-meta">修宪法案 · 需 2/3多数 = _r.quota 席</span><<else>><span class="bill-meta">普通法案 · 简单多数 = _r.quota 席</span><</if>> <span class="bill-meta">赞成 _r.yes 席 / 需 _r.quota 席</span>\ </div>\ <</if>>\ <<if _r.bill.a48 eq "annulled">>\ <span class="vp-note vp-note-fail">紧急法令压过了表决。这已经不是立法,是命令。</span>\ <<elseif _r.bill.a48 eq "forced">>\ <span class="vp-note vp-note-pass">第48条替它投了票。宪法允许这样——宪法确实没说不能。</span>\ <<elseif _r.quota_type eq "修宪">>\ <<if _r.passed>><span class="vp-note vp-note-pass">支持已跨过 2/3 多数门槛。</span><<else>><span class="vp-note vp-note-fail">支持未达 2/3 多数(需 _r.quota 席)。</span><</if>>\ <<else>>\ <<if _r.passed>><span class="vp-note vp-note-pass">通过率已过半。</span><<else>><span class="vp-note vp-note-fail">通过率未到 50%(需 _r.quota 席)。</span><</if>>\ <</if>>\ <<if _r.bill.a48 neq "annulled">>\ <<review-eff-text _r.bill.effects>>\ <<if _eff_world neq "(无法衡量)" or _eff_party neq "">><span class="vp-note"><<if _r.passed or _r.bill.a48 eq "forced">>生效后将使:_eff_world<<if _eff_party neq "">> | 党派:_eff_party<</if>><<else>>若通过将使:_eff_world<<if _eff_party neq "">> | 党派:_eff_party<</if>><</if>></span><</if>>\ <</if>>\ <<review-show-actions _r.bill "post">>\ <<if _r.player_acted and _r.bill.a48 neq "annulled" and _r.bill.a48 neq "forced">>\ <<set _ps_moved to _r.yes - _r.base_yes>>\ <<set _ps_moved_abs to Math.abs(_ps_moved)>>\ <<if _intel_val gte 10>>\ <span class="vp-note vp-note-you">你的介入:赞成 _r.base_yes 席 → _r.yes 席。<<if _ps_moved gt 0>>你的表态和动作,多撬到了 _ps_moved 席。<<elseif _ps_moved lt 0>>你的动作把他们中 _ps_moved_abs 席推到了反面。<<else>>但你的动作没能撼动票数——这案的风向不归你管。<</if>></span>\ <<else>>\ <span class="vp-note vp-note-you">你为这张案表过态、递过话。唱票声太杂,你听不出这些动作换回了什么。</span>\ <</if>>\ <</if>>\ <<if $a48 and $a48.held and $a48.ready and not _r.bill.a48>>\ /* 第48条教学 · 第2拍:开票页首见提醒(与事件页共用旗标,先到先显) */ <<if not $flags.a48_hint_done>>\ <span class="txt-muted">//第48条第一次摆上你的桌面。它不用开会,也不用表决——点进去,会先把这一签的全部代价一条条列给你,然后才要你落笔。//</span><br>\ <<set $flags.a48_hint_done to true>>\ <</if>>\ <<capture _r>>\ <<if _r.passed and not _r.bill.is_player>>\ <div class="a48-box"><span class="a48-choice"><<link "⚡ 动用紧急权力:作废此案(提案党-12 · 赞成党各-4)">> <<set $a48_pm_asked to false>>\ <<set $a48_ctx to { mode: "annul", bill_id: _r.bill.id, title: _r.bill.title, return: "vote" }>>\ <<goto "Scene_A48_Consent">>\ <</link>></span></div>\ <</if>>\ <<if not _r.passed>>\ <div class="a48-box"><span class="a48-choice"><<link "⚡ 动用紧急权力:不经表决,强行生效(反对党各-6 · 赞成党各+2)">> <<set $a48_pm_asked to false>>\ <<set $a48_ctx to { mode: "force", bill_id: _r.bill.id, title: _r.bill.title, return: "vote" }>>\ <<goto "Scene_A48_Consent">>\ <</link>></span></div>\ <</if>>\ <</capture>>\ <</if>>\ <<silently>> <<set _vo to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap"]>>\ <<set _g_yes to []>>\ <<set _g_no to []>>\ <<set _g_ab to []>>\ <<if _intel_val gte 20>>\ <<for _vi to 0; _vi lt _vo.length; _vi++>>\ <<set _vp to _vo[_vi]>>\ <<set _s to _r.stance_seats[_vp]>>\ <<if _s.yes gte _s.no and _s.yes gte _s.abstain>><<set _g_yes.push(_vp)>>\ <<elseif _s.no gte _s.yes and _s.no gte _s.abstain>><<set _g_no.push(_vp)>>\ <<else>><<set _g_ab.push(_vp)>><</if>>\ <</for>>\ <</if>>\ <</silently>>\ <<if _intel_val gte 20>>\ <<if _intel_val gte 30>>\ <span class="vt-muted">(情报 _intel_val —— 每一票,你都看得清清楚楚。)</span>\ <<else>>\ <span class="vt-muted">(情报 _intel_val —— 你看到了每一票,只是不知道背后的算盘。)</span>\ <</if>>\ <<nobr>><<if _g_yes.length gt 0>> <span class="vp-group-title vp-group-yes">—— 赞成 ——</span> <<for _gi to 0; _gi lt _g_yes.length; _gi++>> <<set _vp to _g_yes[_gi]>> <div class="vp-row"> <span class="vp-party"><<print $party_names[_vp]>><<if _r.bill.party eq _vp>><span class="vp-author">提出者</span><</if>></span> <span class="vp-seat vp-seat-yes vp-seat-domin">赞 <<print _r.stance_seats[_vp].yes>></span> <span class="vp-seat vp-seat-no">反 <<print _r.stance_seats[_vp].no>></span> <span class="vp-seat vp-seat-abst">弃 <<print _r.stance_seats[_vp].abstain>></span> </div> <</for>> <</if>><</nobr>>\ <<nobr>><<if _g_no.length gt 0>> <span class="vp-group-title vp-group-no">—— 反对 ——</span> <<for _gi to 0; _gi lt _g_no.length; _gi++>> <<set _vp to _g_no[_gi]>> <div class="vp-row"> <span class="vp-party"><<print $party_names[_vp]>><<if _r.bill.party eq _vp>><span class="vp-author">提出者</span><</if>></span> <span class="vp-seat vp-seat-yes">赞 <<print _r.stance_seats[_vp].yes>></span> <span class="vp-seat vp-seat-no vp-seat-domin">反 <<print _r.stance_seats[_vp].no>></span> <span class="vp-seat vp-seat-abst">弃 <<print _r.stance_seats[_vp].abstain>></span> </div> <</for>> <</if>><</nobr>>\ <<nobr>><<if _g_ab.length gt 0>> <span class="vp-group-title vp-group-abst">—— 摇摆 ——</span> <<for _gi to 0; _gi lt _g_ab.length; _gi++>> <<set _vp to _g_ab[_gi]>> <div class="vp-row vp-row-swing"> <span class="vp-party"><<print $party_names[_vp]>><<if _r.bill.party eq _vp>><span class="vp-author">提出者</span><</if>></span> <span class="vp-seat vp-seat-yes">赞 <<print _r.stance_seats[_vp].yes>></span> <span class="vp-seat vp-seat-no">反 <<print _r.stance_seats[_vp].no>></span> <span class="vp-seat vp-seat-abst vp-seat-domin">弃 <<print _r.stance_seats[_vp].abstain>></span> </div> <</for>> <</if>><</nobr>>\ <<elseif _intel_val gte 10>>\ <span class="vt-muted">(情报 _intel_val —— 你只知道两边阵营的深浅。)</span>\ <div class="vp-row">\ <span class="vp-party">阵营</span>\ <span class="vp-seat vp-seat-yes">赞 _r.yes 席</span>\ <span class="vp-seat vp-seat-no">反 _r.no 席</span>\ <span class="vp-seat vp-seat-abst">其余弃权</span>\ </div>\ <<else>>\ <span class="vt-muted">(情报 _intel_val —— 你只听到一个干巴巴的数字。)</span>\ <div class="vp-row">\ <span class="vp-party">唱票</span>\ <span class="vp-seat vp-seat-yes">赞 _r.yes 席</span>\ <span class="vp-seat vp-seat-no">反 _r.no 席</span>\ </div>\ <</if>>\ <hr>\ <</for>>\ <<if $session_review.opp_bills.length eq 0 and $session_review.table.length eq 0>>\ //桌上空无一物。唱票员念了个寂寞。//\ <</if>>\ <<spd-supervise-review>>\ <<if $spd_review_text neq "">>\ <div class="spd-note"><span class="spd-note-tag">SPD 的声音</span>$spd_review_text<<if $spd_review_delta neq 0>><span class="spd-note-delta">(SPD信任<<if $spd_review_delta gt 0>>+<</if>>$spd_review_delta)</span><</if>></div>\ <</if>>\ <<ddp-supervise-review>>\ <<if $ddp_review_text neq "">>\ <div class="ddp-note"><span class="ddp-note-tag">DDP 的声音</span>$ddp_review_text<<if $ddp_review_delta neq 0>><span class="ddp-note-delta">(DDP信任<<if $ddp_review_delta gt 0>>+<</if>>$ddp_review_delta)</span><</if>></div>\ <</if>>\ <<link "「结算离场」">> <<if not $auto_stance_log>><<set $auto_stance_log to []>><</if>>\ <<rival-cost-reset>>\ <<set $trust_act_log to []>>\ <<set $a48_vote_note to "">>\ <<for _ri2 to 0; _ri2 lt $session_review.results.length; _ri2++>>\ <<set _rr to $session_review.results[_ri2]>>\ <<if _rr.bill.a48 eq "annulled">>\ /* 第48条作废:表决结果作废,效果不结算(改动 _rr.passed 让早报/总结按"未通过"记账) */ <<set _rr.passed to false>>\ <<set $auto_stance_log.push("作废(第48条):《" + _rr.bill.title + "》——表决结果不再生效")>>\ <<elseif _rr.bill.a48 eq "forced">>\ /* 第48条强推:未经表决,效果照常结算(改动 _rr.passed 让早报/总结按"通过"记账) */ <<set _rr.passed to true>>\ <<review-measure-snap>>\ <<set _reg_arg to {src_id: _rr.bill.id, title: _rr.bill.title, kind: "bill", band: _rr.bill.band || "", effects: (_rr.bill.drip || _rr.bill.effects)}>>\ <<active-effect-register _reg_arg>>\ /* 滴灌法案的即时部分(政党反应等平加效果)单独结算——register 只吃 drip */ <<if _rr.bill.drip and _rr.bill.effects>><<bill-apply-effects _rr.bill.effects>><</if>>\ <<review-measure-bill _rr>>\ <<review-eff-text _rr.bill.effects>>\ <<set _fx_note to (_eff_world eq "(无法衡量)" ? "" : _eff_world)>>\ <<if _eff_party neq "">><<set _fx_note to (_fx_note eq "" ? _eff_party : _fx_note + " | " + _eff_party)>><</if>>\ <<if _fx_note neq "">><<set _fx_note to "(" + _fx_note + ")">><</if>>\ <<set $auto_stance_log.push("强行生效(第48条):《" + _rr.bill.title + "》" + _fx_note)>>\ <<elseif _rr.passed>>\ <<review-measure-snap>>\ <<set _reg_arg to {src_id: _rr.bill.id, title: _rr.bill.title, kind: "bill", band: _rr.bill.band || "", effects: (_rr.bill.drip || _rr.bill.effects)}>>\ <<active-effect-register _reg_arg>>\ /* 滴灌法案的即时部分(政党反应等平加效果)单独结算——register 只吃 drip */ <<if _rr.bill.drip and _rr.bill.effects>><<bill-apply-effects _rr.bill.effects>><</if>>\ /* 历史偏移实感(93_drift_memory):历史歧路(反事实牌)通过后,世界记住他 */ <<if _rr.bill.kind eq "counterfact">><<drift-note-card _rr.bill.id>><</if>>\ <<review-measure-bill _rr>>\ <<review-eff-text _rr.bill.effects>>\ <<set _fx_note to (_eff_world eq "(无法衡量)" ? "" : _eff_world)>>\ <<if _eff_party neq "">><<set _fx_note to (_fx_note eq "" ? _eff_party : _fx_note + " | " + _eff_party)>><</if>>\ <<if _fx_note neq "">><<set _fx_note to "(" + _fx_note + ")">><</if>>\ <<set $auto_stance_log.push("通过:《" + _rr.bill.title + "》" + _fx_note)>>\ <<else>>\ <<set $auto_stance_log.push("否决:《" + _rr.bill.title + "》")>>\ <</if>>\ <</for>>\ <<review-commit-summary $session_review.results true>>\ <<review-close>>\ <<goto "Scene_Review_Summary">>\ <</link>> /* ============================================================ 审议日 · 强制提示页 国会开会当天(或快进跨过审议日后),进办公室会被带到这里: 玩家可以选择去,或不去。不去 = 国会照常开会,只是没你的声音。 ============================================================ */
''国会 · 审议日'' //门房的钟敲过了。今天国会开会。你听见走廊里传来脚步声——各党的议员正在往议会大厦走。// <<if $session_review.absent gt 0>>\ //你记得上次你没去。议会大厦的门对你关上了一扇,又开了一扇。//\ <</if>>\ //这是第 <<print $session_review.round + 1>> 次审议。你可以去,也可以不去——不去,国会照样开会,决议照样通过,只是没有你的声音。// <<link "「去国会」">><<review-open>><<goto "Scene_Review">><</link>> <<link "「今天不去」">><<review-decline>><<goto "Scene_Review_Summary">><</link>> //(不去的话,你桌上的提案也不会被端上去。欠条还在,承诺照旧。国会只是没有你而已。)// /* ============================================================ 国会决议弹窗(V0.5-D/S4 完善 + 国会决议汇总进弹窗) 每轮国会结束后(无论参加/缺席)展示:通过/否决 + 党派 + 代价; 承接并取代原 Scene_Review_Resume(迁移:继续跳红/回办公室决策并入本窗口)。 ============================================================ */
<div class="rev-sum-head">''国会 · 决议''</div> //议会大厦的灯一盏盏暗了。议案有了着落——不论你在不在场,方向已经偏了一点。// <<if $review_summary and $review_summary.lines.length gt 0>>\ ''—— 决议 ——'' <<for _rsi to 0; _rsi lt $review_summary.lines.length; _rsi++>>\ <<set _rs to $review_summary.lines[_rsi]>>\ <<if _rs.passed>>\ <div class="vp-result vp-result-pass"> <span class="vt-pass">【通过】</span> <span>《_rs.title》</span> <span class="bill-meta">(_rs.party_name)· 已生效</span> </div>\ <<else>>\ <div class="vp-result vp-result-fail"> <span class="vt-fail">【否决】</span> <span>《_rs.title》</span> <span class="bill-meta">(_rs.party_name)</span> </div>\ <</if>>\ <<if _rs.cost_world and _rs.cost_world neq "">><span class="vp-note">代价:_rs.cost_world</span><</if>>\ <<if _rs.cost_party and _rs.cost_party neq "">><span class="txt-muted">党派:_rs.cost_party</span> <</if>>\ <<if _rs.cost_long and _rs.cost_long neq "">><span class="txt-muted">_rs.cost_long</span> <</if>> <<if _rs.act_world and _rs.act_world neq "">><span class="vp-note vp-note-pass">实际:_rs.act_world</span><</if>>\ <<if _rs.act_party and _rs.act_party neq "">><span class="txt-muted">党派实际:_rs.act_party</span> <</if>>\ <hr>\ <</for>>\ <<else>>\ //桌上空无一物。国会这一场,什么也没留下。//\ <</if>> <<trust-act-note>>\ <<rival-note-show>>\ <<silently>> /* 下一场红色事件还有几天:与办公室「跳到下一事件日」共用同一计算(tp-skip-calc,只读)。 旧版显示的是「被打断的那段跳天还剩几天」(continue_skip 的残余)——按周推进被审议 截停时,这个数跟红色事件日期对不上,点了落到空窗日(试玩报告实测)。 */ <<tp-skip-calc>>\ <<set _rs_days to ($skip_preview and $skip_preview.days gt 0) ? $skip_preview.days : 0>>\ <<set _rs_note to $session_review.attend_note>>\ <<set $session_review.attend_note to "">>\ <</silently>>\ <<if _rs_note neq "">>//_rs_note。你已离场。//<</if>>\ <<if _rs_days gt 0>>\ ''是否继续跳转至下一个红色事件?'' <<link "「继续跳向红色事件(剩 _rs_days 天)」">> <<set $session_review.continue_skip to null>>\ /* 0=跳到下一个红色事件日,跳过执行统一交给 Scene_SkipReport 顶部做一次 (此前「先原地跳一遍、goto 后又跳一遍」的双重执行坑,这里只设模式不原地跳)。 */ <<set $skip_days_mode to 0>>\ <<goto "Scene_SkipReport">>\ <</link>> <<link "「停止跳转,回办公室」">> <<set $session_review.continue_skip to null>>\ <<goto "Scene_Office">>\ <</link>>\ <<else>>\ <<link "「回到办公室」" "Scene_Office">><<set $session_review.continue_skip to null>><</link>> <</if>>
/* ============================================================ 调试台(侧栏 + 手风琴) 界面:左侧分类导航 + 主区手风琴面板(大功能类含小功能)。 数值按钮一律用 <<link>> + <<goto>> 的可靠写法。 ============================================================ */ <<if not $debug_active>><<set $debug_active to "time">><</if>>\ <div class="dl-shell"> // — 顶部总览条 — // <div class="dl-top"> <span class="dl-top-title">《魏玛》历史生态引擎 · 调试台</span> <span class="dl-top-meta"> 当前日期:<<datestr>> | 审议周期第 $session_day 天 | 光谱 左/右:<<print $spectrum.left_right>> /激/保:<<print $spectrum.radical_conservative>> | 知情者:<<secret-intel>><<print Math.round(_intel_now * 10) / 10>> | TP:<<print $tp>> / <<print $tp_max>> </span> <span class="dl-top-return"> <<if $debug_return>><<link "← 返回上一个会话">><<goto $debug_return>><</link>> <<else>><<link "← 返回办公室">><<goto "Scene_Office">><</link>><</if>> </span> </div> <div class="dl-wrap"> // — 左侧分类导航 — // <nav class="dl-nav"> <span class="dl-nav-hint">功能分区</span> <<if $debug_active eq "time">><span class="dl-nav-btn is-active"><<link "⏱ 时间与节奏">><<set $debug_active to "time">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "⏱ 时间与节奏">><<set $debug_active to "time">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "core">><span class="dl-nav-btn is-active"><<link "🏛 政党信任">><<set $debug_active to "core">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "🏛 政党信任">><<set $debug_active to "core">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "weimar">><span class="dl-nav-btn is-active"><<link "🧠 魏玛人格">><<set $debug_active to "weimar">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "🧠 魏玛人格">><<set $debug_active to "weimar">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "spectrum">><span class="dl-nav-btn is-active"><<link "⚖ 立场光谱">><<set $debug_active to "spectrum">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "⚖ 立场光谱">><<set $debug_active to "spectrum">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "intel">><span class="dl-nav-btn is-active"><<link "🗞 知情情报">><<set $debug_active to "intel">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "🗞 知情情报">><<set $debug_active to "intel">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "tags">><span class="dl-nav-btn is-active"><<link "🏷 标签事件">><<set $debug_active to "tags">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "🏷 标签事件">><<set $debug_active to "tags">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "secret">><span class="dl-nav-btn is-active"><<link "🤫 秘密结盟">><<set $debug_active to "secret">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "🤫 秘密结盟">><<set $debug_active to "secret">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "swell">><span class="dl-nav-btn is-active"><<link "🌊 历史暗涌">><<set $debug_active to "swell">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "🌊 历史暗涌">><<set $debug_active to "swell">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "drip">><span class="dl-nav-btn is-active"><<link "⏳ 持续效果">><<set $debug_active to "drip">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "⏳ 持续效果">><<set $debug_active to "drip">><<goto "Debug_Lab">><</link>></span><</if>> <<if $debug_active eq "data">><span class="dl-nav-btn is-active"><<link "📊 后台总览">><<set $debug_active to "data">><<goto "Debug_Lab">><</link>></span> <<else>><span class="dl-nav-btn"><<link "📊 后台总览">><<set $debug_active to "data">><<goto "Debug_Lab">><</link>></span><</if>> </nav> // — 主区面板 — // <div class="dl-main"> <<if $debug_active eq "time">>\ <details open class="dl-panel dl-time"> <summary>⏱ 时间与节奏</summary> <div class="dl-body"> /% 相位与结局面板置顶:面板太深时(小窗口)底部按钮会超出可视区点不到;它也是高频测试入口 %/ <details class="dl-sub"> <summary>└ 相位与结局(B 层门闸测试)</summary> <div class="dl-body"> <<fate-debug>> <div class="dl-row"> <span class="dl-label">相位滑轨</span> <span class="dl-st"> <span class="dl-btn"><<link "[−10]">><<set $fate to Math.max(($stage and $stage.fate_range ? $stage.fate_range.min : -100), $fate - 10)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+10]">><<set $fate to Math.min(($stage and $stage.fate_range ? $stage.fate_range.max : 100), $fate + 10)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=−95]">><<set $fate to -95>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=+95]">><<set $fate to 95>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=0]">><<set $fate to 0>><<goto "Debug_Lab">><</link>></span> </span> </div> <div class="dl-row"> <span class="dl-label">门闸因果标志</span> <span class="dl-st"> <span class="dl-btn"><<link "[革命得手·开]">><<set $flags.uprising_victory to "victory">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[革命得手·关]">><<set $flags.uprising_victory to false>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[政变得逞·开]">><<set $mil_outcome to "得逞">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[政变得逞·关]">><<set $mil_outcome to "">><<goto "Debug_Lab">><</link>></span> </span> </div> <p class="dl-detail">>>> 直接跳本章年终结算:fate 突破 ±90 且对应标志开 → 替代结局(红色春天 / 向柏林进军);否则走默认结算页。</p> <div class="dl-actions"> <span class="dl-btn"><<link "[跳到 12-31 年终结算]">><<set $date to {year: $date.year, month: 12, day: 31}>><<goto "End_Chapter1">><</link>></span> </div> </div> </details> <p class="dl-detail">>>> 推进时间(会触发日常 tick / 事件结算)</p> <div class="dl-actions"> <span class="dl-btn"><<link "[+1天]">><<daily-tick>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+1月]">><<tick-month>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+60天/一周期]">><<tick-cycle>><<goto "Debug_Lab">><</link>></span> </div> <p class="dl-detail">>>> 章节切换(第二章施工中,入口只在这里)</p> <div class="dl-actions"> <span class="dl-btn"><<link "[章节选择 · 含第二章]">><<set $debug_stage_select to true>><<set $skip_birth to true>><<goto "Scene_StageSelect">><</link>></span> <span class="dl-btn"><<link "[序章(调优入口)]">><<set $skip_birth to false>><<goto "Scene_Birth_1">><</link>></span> </div> <p class="dl-detail">切到另一章 = 重开该章开局(日期/牌库/席位/世界基准重置)。测完想回主流程,重启游戏即可。</p> <details class="dl-sub"> <summary>└ 政务节奏 TP</summary> <div class="dl-body"> <div class="dl-row"> <span class="dl-label">剩余 TP</span> <span class="dl-val"><<print $tp>> / <<print $tp_max>></span> <span class="dl-st"> <span class="dl-btn"><<link "[−1]">><<set $tp to Math.max(0, $tp - 1)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+1]">><<set $tp to Math.min($tp_max, $tp + 1)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=满]">><<set $tp to $tp_max>><<goto "Debug_Lab">><</link>></span> </span> </div> </div> </details> </div> </details>\ <</if>> <<if $debug_active eq "core">>\ <details open class="dl-panel dl-core"> <summary>🏛 政党信任度</summary> <div class="dl-body"> <p class="dl-detail">>>> 各党 ±10 微调 / 一键拉满触发巅峰邀约入口</p> <<set _db_parties to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]>>\ <<for _db_i to 0; _db_i lt _db_parties.length; _db_i++>>\ <<set _db_p to _db_parties[_db_i]>>\ <<capture _db_p>>\ <div class="dl-row"> <span class="dl-label"><<print $party_names[_db_p]>></span> <span class="dl-val"><<print $npcs[_db_p].trust>>/100</span> <span class="dl-st"> <span class="dl-btn"><<link "[−10]">><<set $npcs[_db_p].trust to Math.max(0, $npcs[_db_p].trust - 10)>><<party-milestone-check _db_p>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+10]">><<set $npcs[_db_p].trust to Math.min(100, $npcs[_db_p].trust + 10)>><<party-milestone-check _db_p>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=0]">><<set $npcs[_db_p].trust to 0>><<party-milestone-check _db_p>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=100]">><<set $npcs[_db_p].trust to 100>><<party-milestone-check _db_p>><<goto "Debug_Lab">><</link>></span> </span> </div> <</capture>>\ <</for>> <details class="dl-sub"> <summary>└ 满信任·里程碑与邀约入口</summary> <div class="dl-body"> <div class="dl-actions"> <span class="dl-btn"><<link "[SPD=60]">><<set $npcs.spd.trust to 60>><<party-milestone-check "spd">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[SPD=100]">><<set $npcs.spd.trust to 100>><<party-milestone-check "spd">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[SPD盟约]">><<set $party_milestones.spd.arc_state to "offered">><<goto "Scene_SPD_Offer">><</link>></span> <span class="dl-btn"><<link "[DNVP=100]">><<set $npcs.dnvp.trust to 100>><<party-milestone-check "dnvp">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[DNVP邀约]">><<set $party_milestones.dnvp.arc_state to "offered">><<goto "Scene_DNVP_Offer">><</link>></span> <span class="dl-btn"><<link "[DNVP额外链(光谱左)]">><<set $spectrum.left_right to -40>><<set $spectrum.radical_conservative to -40>><<set $dnvp_trials.a to true>><<set $dnvp_trials.b to true>><<set $dnvp_trials.c to true>><<set $dnvp_extra_step to 0>><<set $party_milestones.dnvp.arc_state to "pulling">><<goto "Scene_DNVP_Offer">><</link>></span> <span class="dl-btn"><<link "[KPD=100]">><<set $npcs.kpd.trust to 100>><<party-milestone-check "kpd">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[KPD邀约]">><<set $party_milestones.kpd.arc_state to "offered">><<goto "Scene_KPD_Offer">><</link>></span> <span class="dl-btn"><<link "[KPD额外链(光谱右)]">><<set $spectrum.left_right to 40>><<set $spectrum.radical_conservative to 40>><<set $kpd_trials.a to true>><<set $kpd_trials.b to true>><<set $kpd_trials.c to true>><<set $kpd_extra_step to 0>><<set $party_milestones.kpd.arc_state to "pulling">><<goto "Scene_KPD_Offer">><</link>></span> <span class="dl-btn"><<link "[光谱=右+保守]">><<set $spectrum.left_right to 60>><<set $spectrum.radical_conservative to 60>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[魏玛背叛谈话]">><<set $npcs.weimar.trust to 25>><<set $dnvp_pull to 2>><<set $weimar_betray_talk_done to false>><<goto "Talk_Weimar_Betrayal">><</link>></span> <span class="dl-btn"><<link "[DVP=80]">><<set $npcs.dvp.trust to 80>><<party-milestone-check "dvp">><<goto "Scene_DVP_Offer">><</link>></span> <span class="dl-btn"><<link "[Zentrum=80]">><<set $npcs.zentrum.trust to 80>><<party-milestone-check "zentrum">><<goto "Scene_Zentrum_Offer">><</link>></span> <span class="dl-btn"><<link "[NSDAP=100]">><<set $npcs.nsdap.trust to 100>><<party-milestone-check "nsdap">><<goto "Scene_NSDAP_Offer">><</link>></span> <span class="dl-btn"><<link "[军方=100]">><<set $npcs.army.trust to 100>><<party-milestone-check "army">><<goto "Scene_Army_Offer">><</link>></span> </div> <p class="dl-note">(大联合政府)</p> <div class="dl-actions"> <span class="dl-btn"><<link "[激活大联盟(SPD+DDP+DVP)]">><<set $party_milestones.spd.arc_state to "accepted">><<set $party_milestones.ddp.arc_state to "accepted">><<set $party_milestones.dvp.arc_state to "accepted">><<covenant-sync>><<covenant-active-text>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[激活大联盟(Zentrum替代)]">><<set $party_milestones.spd.arc_state to "accepted">><<set $party_milestones.ddp.arc_state to "accepted">><<set $party_milestones.zentrum.arc_state to "accepted">><<covenant-sync>><<covenant-active-text>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[重置大联盟]">><<set $party_milestones.spd.arc_state to "none">><<set $party_milestones.ddp.arc_state to "none">><<set $party_milestones.dvp.arc_state to "none">><<set $party_milestones.zentrum.arc_state to "none">><<set $covenant to { members: [], active: false, bonus_applied: false, spokesman: null, spokesman_shown: false }>><<goto "Debug_Lab">><</link>></span> <<covenant-active-text>><<if $covenant_active_text neq "">><span class="dl-note">状态:$covenant_active_text</span><</if>> </div> <p class="dl-note">(SPD 点评 / 信任低谈话等更细入口)</p> <div class="dl-actions"> <span class="dl-btn"><<link "[SPD点评(信任低)]">><<set $npcs.spd.trust to 60>><<set $weimar.mid.intl_trust to 10>><<set $spd_notes to {}>><<goto "Scene_Office">><</link>></span> <span class="dl-btn"><<link "[SPD信任低谈话]">><<set $npcs.spd.trust to 15>><<set $npcs.kpd.trust to 70>><<set $spd_distrust_talk_done to false>><<goto "Talk_SPD_Distrust">><</link>></span> </div> </div> </details> </div> </details>\ <</if>> <<if $debug_active eq "weimar">>\ <details open class="dl-panel dl-weimar"> <summary>🧠 魏玛人格与精神</summary> <div class="dl-body"> <p class="dl-detail">>>> 人格状态总览</p> <<weimar-status>> <details class="dl-sub"> <summary>└ 数值微调</summary> <div class="dl-body"> <div class="dl-row"> <span class="dl-label">自我认同 self_identity</span> <span class="dl-val"><<print $weimar.self_identity>>/100</span> <span class="dl-st"> <span class="dl-btn"><<link "[−5]">><<set $weimar.self_identity to Math.max(0, $weimar.self_identity - 5)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+5]">><<set $weimar.self_identity to Math.min(100, $weimar.self_identity + 5)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=0]">><<set $weimar.self_identity to 0>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=100]">><<set $weimar.self_identity to 100>><<goto "Debug_Lab">><</link>></span> </span> </div> <div class="dl-row"> <span class="dl-label">人格张力 tension</span> <span class="dl-val"><<print Math.round($weimar.personality_tension)>> / <<print $weimar.effective_threshold>>(阈值)</span> <span class="dl-st"> <span class="dl-btn"><<link "[−10]">><<set $weimar.personality_tension to Math.max(0, $weimar.personality_tension - 10)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+10]">><<set $weimar.personality_tension to ($weimar.personality_tension + 10)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=濒临崩溃]">><<set $weimar.personality_tension to ($weimar.effective_threshold + 5)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=归零]">><<set $weimar.personality_tension to 0>><<goto "Debug_Lab">><</link>></span> </span> </div> <div class="dl-row"> <span class="dl-label">民主信任</span> <span class="dl-val"><<print $weimar.mid.democracy_trust>></span> <span class="dl-st"> <span class="dl-btn"><<link "[−10]">><<set $weimar.mid.democracy_trust to Math.max(0, $weimar.mid.democracy_trust - 10)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+10]">><<set $weimar.mid.democracy_trust to Math.min(100, $weimar.mid.democracy_trust + 10)>><<goto "Debug_Lab">><</link>></span> </span> </div> <div class="dl-row"> <span class="dl-label">军队依赖</span> <span class="dl-val"><<print $weimar.mid.army_dependence>></span> <span class="dl-st"> <span class="dl-btn"><<link "[−10]">><<set $weimar.mid.army_dependence to Math.max(0, $weimar.mid.army_dependence - 10)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+10]">><<set $weimar.mid.army_dependence to Math.min(100, $weimar.mid.army_dependence + 10)>><<goto "Debug_Lab">><</link>></span> </span> </div> <div class="dl-row"> <span class="dl-label">国际信任</span> <span class="dl-val"><<print $weimar.mid.intl_trust>></span> <span class="dl-st"> <span class="dl-btn"><<link "[−10]">><<set $weimar.mid.intl_trust to Math.max(0, $weimar.mid.intl_trust - 10)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+10]">><<set $weimar.mid.intl_trust to Math.min(100, $weimar.mid.intl_trust + 10)>><<goto "Debug_Lab">><</link>></span> </span> </div> <div class="dl-row"> <span class="dl-label">社会改革意愿</span> <span class="dl-val"><<print $weimar.mid.reform_will>></span> <span class="dl-st"> <span class="dl-btn"><<link "[−10]">><<set $weimar.mid.reform_will to Math.max(0, $weimar.mid.reform_will - 10)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+10]">><<set $weimar.mid.reform_will to Math.min(100, $weimar.mid.reform_will + 10)>><<goto "Debug_Lab">><</link>></span> </span> </div> </div> </details> </div> </details>\ <</if>> <<if $debug_active eq "spectrum">>\ <details open class="dl-panel dl-spectrum"> <summary>⚖ 立场与光谱</summary> <div class="dl-body"> <div class="dl-row"> <span class="dl-label">左 / 右</span> <span class="dl-val"><<print $spectrum.left_right>></span> <span class="dl-st"> <span class="dl-btn"><<link "[−20]">><<set $spectrum.left_right to Math.max(-100, $spectrum.left_right - 20)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+20]">><<set $spectrum.left_right to Math.min(100, $spectrum.left_right + 20)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=0]">><<set $spectrum.left_right to 0>><<goto "Debug_Lab">><</link>></span> </span> </div> <div class="dl-row"> <span class="dl-label">激进 / 保守</span> <span class="dl-val"><<print $spectrum.radical_conservative>></span> <span class="dl-st"> <span class="dl-btn"><<link "[−20]">><<set $spectrum.radical_conservative to Math.max(-100, $spectrum.radical_conservative - 20)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+20]">><<set $spectrum.radical_conservative to Math.min(100, $spectrum.radical_conservative + 20)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[=0]">><<set $spectrum.radical_conservative to 0>><<goto "Debug_Lab">><</link>></span> </span> </div> <p class="dl-note">治理路线预设(一键拨光谱,模拟跳天托管抓取):</p> <div class="dl-actions"> <span class="dl-btn"><<link "[革命]">><<set $spectrum.left_right to -45>><<set $spectrum.radical_conservative to -45>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[改良]">><<set $spectrum.left_right to -45>><<set $spectrum.radical_conservative to 0>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[务实]">><<set $spectrum.left_right to 0>><<set $spectrum.radical_conservative to 0>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[秩序]">><<set $spectrum.left_right to 45>><<set $spectrum.radical_conservative to 0>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[强权]">><<set $spectrum.left_right to 45>><<set $spectrum.radical_conservative to -45>><<goto "Debug_Lab">><</link>></span> </div> <p class="dl-note">快捷场景预设:</p> <div class="dl-actions"> <span class="dl-btn"><<link "[光谱=右+保守]">><<set $spectrum.left_right to 60>><<set $spectrum.radical_conservative to 60>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[光谱=左+激进]">><<set $spectrum.left_right to -60>><<set $spectrum.radical_conservative to -60>><<goto "Debug_Lab">><</link>></span> </div> </div> </details>\ <</if>> <<if $debug_active eq "intel">>\ <details open class="dl-panel dl-intel"> <summary>🗞 知情者 / 情报(0~30,每月-2%)</summary> <div class="dl-body"> <<intel-current>>\ <div class="dl-row"> <span class="dl-label">当前情报</span> <span class="dl-val"><<print _intel_val>>/30(档位:_intel_tier)</span> <span class="dl-st"> <span class="dl-btn"><<link "[+1]">><<tag-add "知情者" "micro" 1 "情报" "weimar" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+5]">><<tag-add "知情者" "micro" 5 "情报" "weimar" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+10]">><<tag-add "知情者" "micro" 10 "情报" "weimar" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[清零]">><<run $active_tags = $active_tags.map(function(t){ if(t.name==="知情者"){ return Object.assign({},t,{intensity:0}); } return t; })>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[−1]">><<run $active_tags = $active_tags.map(function(t){ if(t.name==="知情者"){ return Object.assign({},t,{intensity:Math.max(0, t.intensity - 1)}); } return t; })>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[−5]">><<run $active_tags = $active_tags.map(function(t){ if(t.name==="知情者"){ return Object.assign({},t,{intensity:Math.max(0, t.intensity - 5)}); } return t; })>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[−10]">><<run $active_tags = $active_tags.map(function(t){ if(t.name==="知情者"){ return Object.assign({},t,{intensity:Math.max(0, t.intensity - 10)}); } return t; })>><<goto "Debug_Lab">><</link>></span> </span> </div> </div> </details>\ <</if>> <<if $debug_active eq "tags">>\ <details open class="dl-panel dl-tags"> <summary>🏷 标签 / 事件</summary> <div class="dl-body"> <details class="dl-sub"> <summary>└ 添加标签</summary> <div class="dl-body"> <div class="dl-actions"> <span class="dl-btn"><<link "[+经济压力15(微)]">><<tag-add "经济压力" "micro" 15 "经济" "spd" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+经济压力15(结构)]">><<tag-add "经济压力" "struct" 15 "经济" "spd" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+工人愤怒20]">><<tag-add "工人愤怒" "micro" 20 "社会" "spd" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+军队不满25]">><<tag-add "军队不满" "micro" 25 "军事" "军方" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+民族主义30]">><<tag-add "民族主义" "micro" 30 "政治" "dnvp" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[标签融合]">><<tag-fuse>><<goto "Debug_Lab">><</link>></span> </div> </div> </details> <details class="dl-sub"> <summary>└ 生成事件</summary> <div class="dl-body"> <div class="dl-actions"> <span class="dl-btn"><<link "[生成历史事件]">><<event-spawn "historical">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[生成标签事件]">><<event-spawn "tag-induced">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[生成随机事件]">><<event-spawn "random">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[生成难民现场事件]">><<silently>><<set $event_counter to $event_counter + 1>><<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: "Aref", source: "tag-induced", lifecycle: "phase", irreversible: 2, intensity: 25, related_tag: "民族屈辱", tag: "民族屈辱", title: "鲁尔难民到柏林", description: "一列从鲁尔方向来的列车靠站。下来的人脸色灰白,像被倒出来的。候车大厅变成了临时收容所--红十字的粥桶前排着队。这件事,不该只在文件里结束。", template: "action", world_effects: {"social_anger":2,"nationalism":3}, scene: "anhalter", born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>><</silently>><<goto "Scene_Files">><</link>></span> </div> <<if $pending_events.length eq 0>>\ <p class="dl-note">(当前无待处理事件,可用上方按钮生成)</p>\ <<else>>\ <p class="dl-note"><待处理事件></p> <<for _i to 0; _i lt $pending_events.length; _i++>>\ <<set _ev to $pending_events[_i]>>\ <<capture _ev>>\ <div class="dl-ev"> <span class="dl-ev-id">_ev.event_id</span> <span class="dl-ev-meta">[_ev.source/_ev.lifecycle/不可逆_ev.irreversible]</span> <span class="dl-ev-desc">_ev.description</span> <span class="dl-btn"><<link "[结算]">><<event-resolve _ev.event_id>><<goto "Debug_Lab">><</link>></span> </div> <</capture>>\ <</for>>\ <</if>>\ </div> </details> <details class="dl-sub"> <summary>└ 系统联动</summary> <div class="dl-body"> <div class="dl-actions"> <span class="dl-btn"><<link "[惯性共振检测]">><<inertia-check>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[魏玛表层刷新]">><<weimar-surface-update>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[进入国会审议]">><<goto "Scene_Review">><</link>></span> <span class="dl-btn"><<link "[写一条工人承诺]">><<promise-write "worker" "提高工人补贴" 60>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[兑现所有承诺]">><<for _pi2 to 0; _pi2 lt $promise_ledger.length; _pi2++>><<set $promise_ledger[_pi2].status to "fulfilled">><</for>><<set $player.promises.push("承诺兑现")>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[许诺事件=立即]">><<promise-event-write "P99" "测试许诺" "KPD" "kpd" "这是一条测试许诺事件。" 0>><<set $promise_pending to []>><<promise-event-promote>><<goto "Debug_Lab">><</link>></span> </div> </div> </details> <details class="dl-sub"> <summary>└ 活跃标签池</summary> <div class="dl-body"> <<tag-list>>\ </div> </details> </div> </details>\ <</if>> <<if $debug_active eq "secret">>\ <details open class="dl-panel dl-secret"> <summary>🤫 秘密结盟 · 曝光模拟</summary> <div class="dl-body"> <details class="dl-sub"> <summary>└ 各党秘密线</summary> <div class="dl-body"> <<set _sec_keys to ["kpd","dnvp","nsdap","army"]>>\ <<for _sdb_i to 0; _sdb_i lt _sec_keys.length; _sdb_i++>>\ <<set _sdb_p to _sec_keys[_sdb_i]>>\ <<capture _sdb_p>>\ <div class="dl-secline"> <span class="dl-label"><b><<print $secret_ledger[_sdb_p].partner>></b></span> <span class="dl-meta"> exposure=<<print $secret_ledger[_sdb_p].exposure>> | suspect=<<print $secret_ledger[_sdb_p].suspect>> | flagged=<<print $secret_ledger[_sdb_p].flagged>> | broken=<<print $secret_ledger[_sdb_p].broken>> | 立约日=<<print $secret_ledger[_sdb_p].established_day>> | 档位=<<secret-tier-name _sdb_p>><<print _tier_name>> | 把柄<<print $secret_ledger[_sdb_p].leverage>> </span> <span class="dl-st"> <span class="dl-btn"><<link "[立约]">><<secret-establish _sdb_p>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[接触+1]">><<secret-contact-add _sdb_p>><<goto "Debug_Lab">><</link>></span> </span> </div> <</capture>>\ <</for>>\ </div> </details> <details class="dl-sub"> <summary>└ 曝光推进</summary> <div class="dl-body"> <p class="dl-note">对已立约的所有线生效。跳60天=20次结算,可直接看 exposure 快速爬升</p> <div class="dl-actions"> <span class="dl-btn"><<link "[强制结算·每3天]">><<set $secret_tick_day to $secret_tick_day + 2>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[跳60天]">><<for _scy2 to 0; _scy2 lt 60; _scy2++>><<secret-exposure-tick>><</for>><<goto "Debug_Lab">><</link>></span> </div> </div> </details> <details class="dl-sub"> <summary>└ 一键拉档(检验不同触发文本)</summary> <div class="dl-body"> <p class="dl-note">阈值随 self_identity 浮动:起疑/风声/暴露 ≈ 30+/60+/80+</p> <<silently>><<secret-exposure-thresholds>><</silently>>\ <div class="dl-actions"> <span class="dl-btn"><<link "[拉到起疑档]">><<for _sdb_i2 to 0; _sdb_i2 lt _sec_keys.length; _sdb_i2++>><<set _sdb_p2 to _sec_keys[_sdb_i2]>><<if $secret_ledger[_sdb_p2].established_day gt 0>>><<set $secret_ledger[_sdb_p2].exposure to Math.min(_thr_flagged - 1, Math.max(_thr_suspect + 1, $secret_ledger[_sdb_p2].exposure))>><<set $secret_ledger[_sdb_p2].suspect to true>><<set $secret_ledger[_sdb_p2].flagged to false>><</if>><</for>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[拉到风声档]">><<for _sdb_i2 to 0; _sdb_i2 lt _sec_keys.length; _sdb_i2++>><<set _sdb_p2 to _sec_keys[_sdb_i2]>><<if $secret_ledger[_sdb_p2].established_day gt 0>>><<set $secret_ledger[_sdb_p2].exposure to Math.min(_thr_expose - 1, Math.max(_thr_flagged + 1, $secret_ledger[_sdb_p2].exposure))>><<set $secret_ledger[_sdb_p2].suspect to true>><<set $secret_ledger[_sdb_p2].flagged to true>><</if>><</for>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[拉到暴露档]">><<for _sdb_i2 to 0; _sdb_i2 lt _sec_keys.length; _sdb_i2++>><<set _sdb_p2 to _sec_keys[_sdb_i2]>><<if $secret_ledger[_sdb_p2].established_day gt 0>>><<set $secret_ledger[_sdb_p2].exposure to Math.max(_thr_expose + 1, $secret_ledger[_sdb_p2].exposure)>><<set $secret_ledger[_sdb_p2].suspect to true>><<set $secret_ledger[_sdb_p2].flagged to true>><<if not $secret_exposed_queue.includes(_sdb_p2)>><<set $secret_exposed_queue.push(_sdb_p2)>><</if>><</if>><</for>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[全部清零]">><<for _sdb_i2 to 0; _sdb_i2 lt _sec_keys.length; _sdb_i2++>><<set _sdb_p2 to _sec_keys[_sdb_i2]>><<set $secret_ledger[_sdb_p2].established_day to 0>><<set $secret_ledger[_sdb_p2].exposure to 0>><<set $secret_ledger[_sdb_p2].suspect to false>><<set $secret_ledger[_sdb_p2].flagged to false>><<set $secret_ledger[_sdb_p2].broken to false>><<set $secret_contact[_sdb_p2] to 0>><</for>><<set $secret_exposed_queue to []>><<goto "Debug_Lab">><</link>></span> </div> </div> </details> <details class="dl-sub"> <summary>└ 情报对曝光的抑制</summary> <div class="dl-body"> <p class="dl-note">知情者越高越会藏</p> <div class="dl-actions"> <span class="dl-btn"><<link "[知情者+15]">><<tag-add "知情者" "micro" 15 "情报" "weimar" "manual">><<set $active_tags to $ret>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[知情者清零]">><<run $active_tags = $active_tags.map(function(t){ if(t.name==="知情者"){ return Object.assign({},t,{intensity:0}); } return t; })>><<goto "Debug_Lab">><</link>></span> </div> </div> </details> <details class="dl-sub"> <summary>└ 曝光触发点测试</summary> <div class="dl-body"> <p class="dl-note">直接跳到对应事件,检验文本人称与对象</p> <div class="dl-actions"> <span class="dl-btn"><<link "[处理秘密要求]">><<set $secret_demand to null>><<secret-demand-gen "kpd">><<goto "Scene_SecretDemand">><</link>></span> <span class="dl-btn"><<link "[触发质问对峙]">><<secret-establish "kpd">><<set $secret_ledger.kpd.exposure to 90>><<set $secret_ledger.kpd.suspect to true>><<set $secret_ledger.kpd.flagged to true>><<if not $secret_exposed_queue.includes("kpd")>><<set $secret_exposed_queue.push("kpd")>><</if>><<goto "Scene_SecretConfront">><</link>></span> </div> </div> </details> </div> </details>\ <</if>> <<if $debug_active eq "drip">>\ <details open class="dl-panel dl-drip"> <summary>⏳ 持续效果(滴灌/冷却)测试</summary> <div class="dl-body"> <p class="dl-detail">>>> 注册测试效果(注册后看侧边栏【持续生效】;世界变量逐日变化看这里或总览)</p> <div class="dl-actions"> <span class="dl-btn"><<link "[注册A:通胀-0.3×90天(不衰减)]">> <<set _reg_arg to {src_id:"TEST_A", title:"测试·货币止血", kind:"aftermath", band:"super", effects:{daily:{inflation:-0.3}, duration:90, decay:false}}>>\ <<active-effect-register _reg_arg>>\ <<goto "Debug_Lab">>\ <</link>></span> <span class="dl-btn"><<link "[注册B:愤怒+0.5×10天(衰减)]">> <<set _reg_arg to {src_id:"TEST_B", title:"测试·余温", kind:"aftermath", band:"short", effects:{daily:{social_anger:0.5}, duration:10, decay:true}}>>\ <<active-effect-register _reg_arg>>\ <<goto "Debug_Lab">>\ <</link>></span> </div> <p class="dl-detail">>>> 同源防重:A 生效中再点 [注册A] 应无效果(容器里只有一条 TEST_A)</p> <p class="dl-detail">>>> 冷却封锁测试:先封锁 UE_67,再抽牌20次——UE_67 应一次也抽不到</p> <div class="dl-actions"> <span class="dl-btn"><<link "[封锁UE_67·50天]">> <<if not $effect_cool>><<set $effect_cool to {}>><</if>>\ <<set $effect_cool.UE_67 to $session_day + 50>>\ <<goto "Debug_Lab">>\ <</link>></span> <span class="dl-btn"><<link "[抽牌测试×20]">> <<silently>> /* 计数必须用故事变量:临时变量过不了 goto 的跳段 */ <<set _dl_pool to []>>\ <<for _dl_i to 0; _dl_i lt $file_basket_events.length; _dl_i++>>\ <<if $file_basket_events[_dl_i].id eq "UE_66" or $file_basket_events[_dl_i].id eq "UE_67">>\ <<set _dl_pool.push($file_basket_events[_dl_i])>>\ <</if>>\ <</for>>\ <<set $debug_dl to {c66: 0, c67: 0, cN: 0, done: true}>>\ <<for _dl_t to 0; _dl_t lt 20; _dl_t++>>\ <<fb-pick _dl_pool>>\ <<if $tmp_picked is null>><<set $debug_dl.cN to $debug_dl.cN + 1>>\ <<elseif $tmp_picked.id eq "UE_67">><<set $debug_dl.c67 to $debug_dl.c67 + 1>>\ <<else>><<set $debug_dl.c66 to $debug_dl.c66 + 1>>\ <</if>>\ <</for>>\ <</silently>>\ <<goto "Debug_Lab">>\ <</link>></span> <<if $debug_dl and $debug_dl.done>>抽牌20次:UE_66 ×<span class="dl-val"><<print $debug_dl.c66>></span> | UE_67 ×<span class="dl-val"><<print $debug_dl.c67>></span> | 空手 ×<span class="dl-val"><<print $debug_dl.cN>></span><</if>> </div> <p class="dl-detail">>>> 清场(重开实验用)</p> <div class="dl-actions"> <span class="dl-btn"><<link "[清空持续效果+冷却]">> <<set $active_effects to []>>\ <<set $effect_cool to {}>>\ <<goto "Debug_Lab">>\ <</link>></span> </div> <details class="dl-sub"> <summary>└ 当前生效中(active_effects 容器)</summary> <div class="dl-body"> <<if $active_effects and $active_effects.length gt 0>>\ <<for _dl_e to 0; _dl_e lt $active_effects.length; _dl_e++>>\ <<set _dl_eff to $active_effects[_dl_e]>>\ - [<<print _dl_eff.kind>>/<<print _dl_eff.band>>] <<print _dl_eff.title>> | 剩 <<print _dl_eff.remaining>> 天 | src=<<print _dl_eff.src_id>> | daily=<<print JSON.stringify(_dl_eff.daily)>><br> <</for>>\ <<else>>(空)<</if>> </div> </details> <details class="dl-sub"> <summary>└ 来源冷却表(effect_cool 容器)</summary> <div class="dl-body"> <<if $effect_cool>>\ <<set _dl_ck to Object.keys($effect_cool)>>\ <<if _dl_ck.length gt 0>>\ <<for _dl_c to 0; _dl_c lt _dl_ck.length; _dl_c++>>\ - <<print _dl_ck[_dl_c]>> → 第 <<print $effect_cool[_dl_ck[_dl_c]]>> 天解禁(今天=<<print $session_day>><<if $session_day gte $effect_cool[_dl_ck[_dl_c]]>>,已解禁<</if>>)<br> <</for>>\ <<else>>(空)<</if>>\ <<else>>(空)<</if>> </div> </details> </div> </details>\ <</if>> <<if $debug_active eq "data">>\ <details open class="dl-panel dl-data"> <summary>📊 后台数据总览</summary> <div class="dl-body"> <p class="dl-detail">>>> 事件提示色:<<event-prompt-color>><<switch _prompt_color>><<case "white">>⚪ 白色(普通)<<case "yellow">>🟡 黄色(趋势)<<case "red">>🔴 红色(风险)<</switch>></p> <details class="dl-sub"><summary>活跃标签池</summary><div class="dl-body"><<tag-list>></div></details> <details class="dl-sub"><summary>历史遗产池</summary><div class="dl-body"><<legacy-list>></div></details> <details class="dl-sub"><summary>惯性矩阵</summary><div class="dl-body"><<inertia-list>></div></details> <details class="dl-sub"><summary>魏玛人格</summary><div class="dl-body"><<weimar-status>></div></details> <details class="dl-sub"><summary>事件系统</summary><div class="dl-body"><<event-list>></div></details> <details class="dl-sub"><summary>魏玛的阶梯(临时自检)</summary><div class="dl-body"> <p class="dl-detail">L2 独白池与注入钩自检:强制解锁 L2 + 10 连抽命中统计。</p> <div class="dl-actions"><span class="dl-btn"><<link "[运行阶梯自检]">><<goto "Debug_Ladder_Test">><</link>></span></div> </div></details> <details class="dl-sub"> <summary>暗账系统(潜流)</summary> <div class="dl-body"> <<if $undercurrent>>\ <<set _uc_keys_db to ["party_rift","extremism","paper_gains"]>>\ <<set _uc_names_db to {party_rift:"党争裂痕", extremism:"极端滋长", paper_gains:"纸面繁荣"}>>\ <<for _uc_db_i to 0; _uc_db_i lt _uc_keys_db.length; _uc_db_i++>>\ <<capture _uc_db_i>>\ <<set _uc_k_db to _uc_keys_db[_uc_db_i]>>\ <div class="dl-row"> <span class="dl-label">''_uc_names_db[_uc_k_db]''</span> <span class="dl-val"><<print Math.round($undercurrent[_uc_k_db])>> / 100</span> <span class="dl-st"> <span class="dl-btn"><<link "[−20]">><<set $undercurrent[_uc_k_db] to Math.max(0, $undercurrent[_uc_k_db] - 20)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+20]">><<set $undercurrent[_uc_k_db] to Math.min(100, $undercurrent[_uc_k_db] + 20)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[清冷却]">><<set $undercurrent_cool[_uc_k_db] to -999>><<goto "Debug_Lab">><</link>></span> </span> </div> <</capture>>\ <</for>>\ <p class="dl-detail">平静涨速约 0.2-0.3/天/条;最险值≥55 冻结,≥70 回落。引爆走 A 前缀定制管线(Auc1-3)。</p> <div class="dl-actions"> <span class="dl-btn"><<link "[一键引爆·三条全满]">><<set $undercurrent.party_rift to 100>><<set $undercurrent.extremism to 100>><<set $undercurrent.paper_gains to 100>><<undercurrent-day>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[一键盛世·世界全绿]">> <<silently>> <<set $world.economy to 25>><<set $world.inflation to 20>><<set $world.social_anger to 15>>\ <<set $world.political_violence to 8>><<set $world.nationalism to 30>><<set $world.army_influence to 25>>\ <<set $world.revolution to 12>><<set $world.fiscal to 20>><<set $world.gov_trust to 65>>\ <<set $world.middle_confidence to 60>>\ /* 趋势采样置为「与当前持平」→ 平稳,出标准盛世池 */ <<undercurrent-worst>>\ <<set $world_trend_log to [{ d: $session_day - 6, v: _uc_worst }]>>\ <</silently>>\ <<goto "Debug_Lab">>\ <</link>></span> <span class="dl-btn"><<link "[一键盛世转坏·裂缝]">> <<silently>> <<set $world.economy to 25>><<set $world.inflation to 20>><<set $world.social_anger to 15>>\ <<set $world.political_violence to 8>><<set $world.nationalism to 30>><<set $world.army_influence to 25>>\ <<set $world.revolution to 12>><<set $world.fiscal to 20>><<set $world.gov_trust to 65>>\ <<set $world.middle_confidence to 60>>\ /* 趋势采样置为「6天前更低」→ 最险值在爬 → 下坡,出盛世转坏池 */ <<undercurrent-worst>>\ <<set $world_trend_log to [{ d: $session_day - 6, v: _uc_worst - 4 }]>>\ <</silently>>\ <<goto "Debug_Lab">>\ <</link>></span> <span class="dl-btn"><<link "[一键危机转好·透光]">> <<silently>> <<set $world.economy to 55>><<set $world.inflation to 70>><<set $world.social_anger to 45>>\ <<set $world.political_violence to 40>><<set $world.nationalism to 55>><<set $world.army_influence to 50>>\ <<set $world.revolution to 35>><<set $world.fiscal to 45>><<set $world.gov_trust to 35>>\ <<set $world.middle_confidence to 25>>\ /* 趋势采样置为「6天前更高」→ 最险值在降 → 爬坡,出危机转好池 */ <<undercurrent-worst>>\ <<set $world_trend_log to [{ d: $session_day - 6, v: _uc_worst + 4 }]>>\ <</silently>>\ <<goto "Debug_Lab">>\ <</link>></span> <span class="dl-btn"><<link "[一键危机·1923开局]">> <<silently>> <<set $world.economy to 55>><<set $world.inflation to 70>><<set $world.social_anger to 45>>\ <<set $world.political_violence to 40>><<set $world.nationalism to 55>><<set $world.army_influence to 50>>\ <<set $world.revolution to 35>><<set $world.fiscal to 45>><<set $world.gov_trust to 35>>\ <<set $world.middle_confidence to 25>>\ /* 趋势采样置为「与当前持平」→ 平稳,出标准危机池 */ <<undercurrent-worst>>\ <<set $world_trend_log to [{ d: $session_day - 6, v: _uc_worst }]>>\ <</silently>>\ <<goto "Debug_Lab">>\ <</link>></span> </div> <<undercurrent-worst>>\ <<atmos-trend>>\ <p class="dl-detail">当前最险值:<span class="dl-val"><<print Math.round(_uc_worst)>></span>;较5日前 <span class="dl-val"><<print ((_uc_delta gte 0 ? "+" : "") + (Math.round(_uc_delta * 10) / 10))>></span> → 晨报氛围池:<span class="dl-val"><<print _atmos_prosper ? (_atmos_down ? "盛世·下坡(转坏文案)" : "盛世") : (_atmos_up ? "危机·爬坡(转好文案)" : "危机")>></span>。</p> <<else>>\ <p class="dl-detail">$undercurrent 未初始化(应已随 StoryInit 建)。</p>\ <</if>>\ </div> </details> <details class="dl-sub"> <summary>影子内阁(92_shadow_cabinet)</summary> <div class="dl-body"> <<shadow-init>>\ <<shadow-exp-label>>\ <<set $sh_dl_acc to $shadow_cabinet.intel_acc ? $shadow_cabinet.intel_acc : 0>>\ <<if not $shadow_cabinet.unlocked>>\ <<shadow-gate-check>>\ <p class="dl-detail">未解锁。信笺门:情报≥12 且 最险值<55(当前门 <<print _sh_gate ? "开" : "关">>)。</p> <div class="dl-actions"> <span class="dl-btn"><<link "[直接解锁·看信]">><<set $shadow_cabinet.intro_seen to true>><<set $shadow_cabinet.unlocked to true>><<goto "Debug_Lab">><</link>></span> </div>\ <<else>>\ <div class="dl-row"><span class="dl-label">''解锁''</span><span class="dl-val">是</span></div> <div class="dl-row"><span class="dl-label">''视线曝光''</span><span class="dl-val"><<print Math.floor($shadow_cabinet.exposure)>> / 100(_sh_exp_label)</span> <span class="dl-st"> <span class="dl-btn"><<link "[−20]">><<set $shadow_cabinet.exposure to Math.max(0, $shadow_cabinet.exposure - 20)>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[+20]">><<set $shadow_cabinet.exposure to Math.min(100, $shadow_cabinet.exposure + 20)>><<goto "Debug_Lab">><</link>></span> </span></div> <div class="dl-row"><span class="dl-label">''在职''</span><span class="dl-val"><<print Object.keys($shadow_cabinet.members).length>> 人(编辑人情积 $sh_dl_acc 天)</span></div> <div class="dl-row"><span class="dl-label">''对质次数''</span><span class="dl-val">$shadow_cabinet.exposed_count</span></div> <div class="dl-actions"> <span class="dl-btn"><<link "[情报+10]">><<shadow-intel-delta 10>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[去名单页]">><<goto "Scene_Shadow_Cabinet">><</link>></span> <span class="dl-btn"><<link "[强制对质]">><<set $shadow_cabinet.exposure to 100>><<goto "Scene_Shadow_Exposed">><</link>></span> </div> <p class="dl-detail">曝光 0.4/人/天(档案联络官在职 ×0.75);党争裂痕 0.05/人/天;编辑每满30天 情报+2。视线≥100 办公室强制对质。</p>\ <</if>>\ </div> </details> <details class="dl-sub"> <summary>历史偏移实感(93_drift_memory)</summary> <div class="dl-body"> <<drift-memory-init>>\ <div class="dl-row"><span class="dl-label">''账本条目''</span><span class="dl-val"><<print $drift_memory.length>> 条</span></div> <<if $drift_memory.length gt 0>>\ <<for _dmri to 0; _dmri lt $drift_memory.length; _dmri++>>\ <<capture _dmri>>\ <<drift-kind-name $drift_memory[_dmri].kind>>\ <div class="dl-row"><span class="dl-label">''$drift_memory[_dmri].id''</span><span class="dl-val">$drift_memory[_dmri].title(_dkn · 第 $drift_memory[_dmri].day 天 <<if $drift_memory[_dmri].spoken>>· 夜话已讲<</if>>)</span></div> <</capture>>\ <</for>>\ <</if>>\ <div class="dl-actions"> <span class="dl-btn"><<link "[记一笔 S08(模拟暗涌结算)]">><<set $file_action to "sign">><<drift-note-swell "S08">><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[清空账本]">><<set $drift_memory to []>><<set $drift_mem_lookup to {}>><<set $drift_echo_used to {}>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[生成一期报纸]">><<set $np_last_gen_day to -999>><<newspaper-generate>><<goto "Debug_Lab">><</link>></span> </div> <p class="dl-detail">暗涌结算自动记账(76_events_content);历史歧路通过后自动记账(72_review_system)。报纸摘要附「余波」、夜话提一次、手记页尾留档。</p> </div> </details> <details class="dl-sub"> <summary>└ 最近一次操作反馈</summary> <div class="dl-body"> <<if $last_event_roll and $last_event_roll.length gt 0>>\ 事件池:<<for _i to 0; _i lt $last_event_roll.length; _i++>>- $last_event_roll[_i]<br><</for>>\ <</if>>\ <<if $last_resolve and $last_resolve neq "">>结算:$last_resolve<br><</if>> <<if $last_inertia_check and $last_inertia_check.length gt 0>>\ 惯性:<<for _i to 0; _i lt $last_inertia_check.length; _i++>>- $last_inertia_check[_i]<br><</for>>\ <</if>>\ <<if $last_shock and $last_shock neq "">>$last_shock<br><</if>> <<if $last_tension_release and $last_tension_release neq "">>$last_tension_release<br><</if>> <<if $last_awaken and $last_awaken.length gt 0>>\ 苏醒:<<for _i to 0; _i lt $last_awaken.length; _i++>>- $last_awaken[_i]<br><</for>>\ <</if>>\ <<if $last_father_check and $last_father_check.length gt 0>>\ 父事件:<<for _i to 0; _i lt $last_father_check.length; _i++>>- $last_father_check[_i]<br><</for>>\ <</if>>\ <<if $last_aggregation.length gt 0>>\ 聚合:<<for _i to 0; _i lt $last_aggregation.length; _i++>>- $last_aggregation[_i]<br><</for>>\ <</if>>\ <<if $last_inheritance and $last_inheritance neq "">>继承:$last_inheritance<br><</if>> </div> </details> </div> </details>\ <</if>> <<if $debug_active eq "swell">>\ <details open class="dl-panel dl-swell"> <summary>🌊 历史暗涌(备选红事件判定台)</summary> <div class="dl-body"> <p class="dl-detail">>>> 判定(63_swell_gate):硬门槛全过 → 才「可能」发生;每满足 1 条加权项 +12% 概率(基数 15%,封顶 75%);骰子没中留一条风声(差点发生)。替换制在目标红事件到期日判定一次;独立制每日判定(概率减半,60 天冷却)。</p> <<if $swell_cfg and $swell_fired>>\ <div class="dl-row"> <span class="dl-label">''本章已触发''</span> <span class="dl-val">替换制 <<print $swell_fired.replace>> / <<print $swell_cfg.max_replace_per_stage>> | 独立制 <<print $swell_fired.free>> / <<print $swell_cfg.max_free_per_stage>></span> <span class="dl-st"> <span class="dl-btn"><<link "[重置本章配额]">><<set $swell_fired to { replace: 0, free: 0 }>><<goto "Debug_Lab">><</link>></span> <span class="dl-btn"><<link "[清空风声队列]">><<set $swell_rumor_pending to []>><<goto "Debug_Lab">><</link>></span> </span> </div>\ <</if>>\ <<if $swell_rumor_pending and $swell_rumor_pending.length gt 0>>\ <p class="dl-detail">>>> 待上晨报的风声(<<print $swell_rumor_pending.length>> 条):</p> <<for _swdb_r to 0; _swdb_r lt $swell_rumor_pending.length; _swdb_r++>>\ <p class="dl-detail">· <<print $swell_rumor_pending[_swdb_r].title>>——<<print $swell_rumor_pending[_swdb_r].text>></p> <</for>>\ <</if>>\ <<if $swell_events>>\ <p class="dl-detail">>>> 实时判定(按当前世界/好感/标签现算):</p> <<for _swdb_i to 0; _swdb_i lt $swell_events.length; _swdb_i++>>\ <<set _swdb_sw to $swell_events[_swdb_i]>>\ <<swell-gate-check _swdb_sw>>\ <div class="dl-row"> <span class="dl-label">''<<print _swdb_sw.id>>'' <<print _swdb_sw.title>><<if _swdb_sw.target neq "*">> <span class="txt-muted">(替换 <<print _swdb_sw.target>>)</span><<else>> <span class="txt-muted">(独立)</span><</if>></span> <span class="dl-val"><<if $swell_chk.ok>>✓ 门槛过 · 加权 <<print $swell_chk.score>> 分 · p=<<print Math.round($swell_chk.p)>>%<<else>>✗ <<print $swell_chk.fail>><</if>></span> </div> <</for>>\ <<else>>\ <p class="dl-detail">$swell_events 未初始化(先选章节再来看这里)。</p>\ <</if>>\ </div> </details>\ <</if>> </div> </div> <div class="dl-foot"> <<if $debug_return>><<link "← 返回上一个会话 >>">><<goto $debug_return>><</link>> <<else>><<link "返回办公室">><<goto "Scene_Office">><</link>><</if>> </div> </div>
/* ════════════════════════════════════════════════════════════ 第三章结算 ·「鲁尔的代价」 1923年12月。一年过去了。 根据这一年的累积选择,判定你塑造了什么样的魏玛。 判定维度: 1. 民主健康度 = gov_trust - (political_violence + revolution) / 2 2. 经济稳定度 = 100 - (economy + inflation) / 2 3. 魏玛人格 = democracy_trust vs army_dependence 4. 玩家精神 = idealism vs paranoia 结局分类: A. 勉强支撑 -- 民主还在,但摇摇欲坠 B. 威权倾斜 -- 军方和民族主义坐大 C. 革命边缘 -- 左翼革命压力逼近 D. 撕裂崩溃 -- 政治暴力失控 ════════════════════════════════════════════════════════════ */ <<silently>> /* ═══ B 层门闸:阶段结算组件先行(90_phase_system · Stage-Settlement)═══ 校准相位滑轨并判定 $stage.exit_gates(fate 突破 ±90 且因果 flag 满足)。 命中 → 直接转跳替代结局(BR_RED_SPRING 红色春天 / BR_MARCH_ON_BERLIN 向柏林进军), 不再渲染下方的默认年终结算;未命中 → 照常走本章结算。 */ <<Stage-Settlement>> <<if _phase_exit and _phase_exit.triggered>> <<goto _phase_exit.next>> <</if>> /* 章节字眼(V0.9 S2):S2=1920-21 动荡与暗杀 / S3=1923 鲁尔的代价 */ <<set _ch_year to $date.year>> <<set _ch_label to "第三章:鲁尔的代价">> <<set _ch_num to "第三章">> <<set _ch_next to "1924年">> <<if $stage and $stage.id eq "S2">> <<set _ch_label to "第二章:动荡与暗杀">> <<set _ch_num to "第二章">> <<set _ch_next to "1922年">> <</if>> /* 计算综合维度 */ <<set _democracy_health to $world.gov_trust - ($world.political_violence + $world.revolution) / 2>> <<set _economy_stability to 100 - ($world.economy + $world.inflation) / 2>> <<set _violence_level to $world.political_violence>> <<set _radical_right to $world.nationalism + $world.army_influence>> <<set _radical_left to $world.revolution + $world.social_anger>> <<set _events_resolved to $event_log.length>> /* 三件事答卷(呼应年关幕的托付): _c_fired 爆过的线 / _c_averted warned过但压回去的线 / _c_quiet 从未预警的线 */ <<set _c_fired to []>> <<set _c_averted to []>> <<set _c_quiet to []>> <<set _cl_names to {violence: "街上的火", revolution: "革命的火", rightwing: "军营的火", inflation: "马克"}>> <<if $crisis_state>> <<for _ck to 0; _ck lt 3; _ck++>> <<set _cl2 to ["violence","revolution","rightwing"][_ck]>> <<if $crisis_state[_cl2] and $crisis_state[_cl2].fired>> <<set _c_fired.push(_cl_names[_cl2])>> <<elseif $crisis_state[_cl2] and $crisis_state[_cl2].warned>> <<set _c_averted.push(_cl_names[_cl2])>> <<else>> <<set _c_quiet.push(_cl_names[_cl2])>> <</if>> <</for>> <</if>> <<if $crisis_state and $crisis_state.inflation_fired>> <<set _c_fired.push(_cl_names.inflation)>> <<else>> <<set _c_quiet.push(_cl_names.inflation)>> <</if>> /* 三件事全压住 = 四条线一次都没爆发 */ <<set _all_averted to (_c_fired.length eq 0)>> /* 判定结局类型 */ <<set _ending to "A">> <<if _violence_level gte 60>> <<set _ending to "D">> <<elseif _radical_right gte _radical_left and _radical_right gte 100>> <<set _ending to "B">> <<elseif _radical_left gte _radical_right and _radical_left gte 100>> <<set _ending to "C">> <<else>> <<set _ending to "A">> <</if>> <</silently>>\ <<if $stage.id eq "S2">>\ //1921年12月。// //_ch_label。//\ <<else>>\ //1923年12月。// //_ch_label。//\ <</if>>\ <hr> 这一年,你做了这些事: //处理了 _events_resolved 个事件。// //每一天,你都在做选择。每一个选择都像往天平上加了一颗砝码。// //现在天平停了。你看到了它倾斜的方向。// ''-- 国家年终状态 --'' //经济压力//:<<bar $world.economy 100>> //通胀恶化//:<<bar $world.inflation 100>> //社会愤怒//:<<bar $world.social_anger 100>> //民族主义//:<<bar $world.nationalism 100>> //政府信任//:<<bar $world.gov_trust 100>> //军方影响//:<<bar $world.army_influence 100>> //革命压力//:<<bar $world.revolution 100>> //政治暴力//:<<bar $world.political_violence 100>> ''-- 魏玛的状态 --'' //民主信任//:<<bar $weimar.mid.democracy_trust 100>> //军队依赖//:<<bar $weimar.mid.army_dependence 100>> //人格张力//:<<bar $weimar.personality_tension $weimar.effective_threshold>> ''-- 你的状态 --'' //理想主义//:<<bar $player.mental.idealism 100>> //偏执//:<<bar $player.mental.paranoia 100>> ''-- 三件事的答卷 --'' <<if _all_averted>>\ /* ═══ 全压住:正反馈结算 ═══ */ <span class="txt-recover">四条线,一条都没让他烧起来。</span> <<if _c_averted.length gt 0>>\ //<<print _c_averted.join("、")>>--这几处火苗冒过头,被你按回去了。// <</if>>\ <<if _c_quiet.length gt 0>>\ //<<print _c_quiet.join("、")>>--从年初到年尾,连预警线都没碰过。有人一辈子不知道自己躲过了什么。// <</if>> //没有内战,没有起义,没有政变,没有一夜之间作废的积蓄。这些「没有」,没有任何报纸会登。// //但年底的柏林还是原来的样子:报纸在骂,国会在吵,面包店门口排队的人骂完还排着。// <<elseif _c_fired.length eq 1>>\ //<<print _c_fired[0]>> 烧起来过。你亲手把它扑灭了,但灰烬留在原地--有些东西烧过一次,就再也不是原来的形状。// <<if _c_averted.length gt 0>>//<<print _c_averted.join("、")>> 到过悬崖边,被你拉了回来。//<</if>> <<else>>\ //四条线里,_c_fired.length 条烧起来过。// <<if _c_averted.length gt 0>>//<<print _c_averted.join("、")>> 靠你拉了回来。剩下那些,你没能拉住。//<</if>> <</if>>\ <hr> <<if _ending is "A">>\ /* ═══ 结局A:勉强支撑 ═══ */ //「共和国还活着。」// 你看着窗外的柏林。12月的雪在落。 经济一塌糊涂。通胀差点毁了所有人。但地租马克发了,新货币的魔法至少暂时管用。马克稳了。人还在。 政治暴力没有停。KPD在汉堡起义失败了,NSDAP在慕尼黑闹了一场笑话。但他们没有消失。他们只是在等。 国会还在开会。报纸还在骂。工会还在组织。这些东西还在,就是共和国还活着的证据。 但你知道他活得很累。 魏玛站在你身后。他这一年瘦了很多。眼下的青色更深了。但他的背还是直的--那种「我知道很糟但我还没倒」的直。 <<if _all_averted>>\ /* ═══ 三件事全压住:年关对话收口(呼应年初托付) ═══ */ //他手里拿着年初那本日历。翻到了最后一页。// 「一月的时候,我托付过你三件事。」他说。手指在日历封面上敲了敲,像敲一扇门。 「马克。街上的人。将军们。」 他没有往下说。他只是把日历放回桌上,动作很慢,像放下一整年。 「都在。」他说。「都还在。」 //然后他做了一件你从没见过的事。他伸手揉了揉自己的眉心,像是终于允许自己累了一下。// 「我以为年底我要问你,会不会站在我这一边。现在不用问了。」他看着窗外。「你一直都在。」 //年初那句「年底我会再问你一次」,在这里收了口。魏玛没有问--你已经用一整年回答过了。//\ <<else>>\ 「你说,明年会好吗?」他问。\ <</if>> 你没有回答。因为你不知道。在柏林,没有人知道明年会怎样。 但有一件事你是知道的——<<if $stage.id eq "S2">>''共和国两岁了。他没有被政变掀翻,也没有被条约压死。'' 在一个刺杀部长的年代,活着本身就需要有人守夜。<<else>>''共和国活过了1923年。'' 这本身就已经是一种胜利。也许是最小的那种。但在柏林,最小的胜利也是胜利。<</if>> //—— _ch_num 结束:勉强支撑 ——// //你保住了民主的基本框架,但代价是巨大的。// //经济在废墟上重建,政治暴力只是暂时退潮。// //右翼和左翼都在舔伤口。他们还会回来。// ''-- 如果共和国继续走这条路 --'' //马克稳了,但稳得很脆弱。新货币的魔法靠的是借来的黄金和抵押的土地--那些东西迟早要还。// //NSDAP在慕尼黑失败了,但失败让他们学到了一件事:暴力不够,还需要选票。他们开始穿西装。开始排队投票。开始学会说「合法」。这比冲锋队更危险。// //KPD在汉堡流血了,但血让他们更硬。莫斯科在看着。莫斯科觉得时候还没到,但快了。// //而魏玛--他活着。但他活着的姿态,越来越像一个在悬崖边抓住树根的人。不是掉下去,也不是爬上来。只是抓着。手在发白。// <<elseif _ending is "B">>\ /* ═══ 结局B:威权倾斜 ═══ */ //「秩序。我们需要秩序。」// 你看着窗外的柏林。军方的人比去年多了。他们的军装更笔挺了,步伐更齐了。 民族主义在膨胀。DNVP的席位在涨。NSDAP虽然闹砸了啤酒馆暴动,但他们的名字现在是每个柏林人都知道的了。失败也可以是一种广告。 国会还在开会,但它的声音越来越小。真正的决定在别的地方做--在军营里,在俱乐部里,在那些穿便服但脊背太直的人的会议室里。 魏玛站在你身后。他这一年变了。不是变坏了--是变硬了。他看你的眼神里多了一种东西:审查。 「也许民主不是答案。」他说。声音很轻,但很确定。「也许我们需要的是秩序。真正的秩序。」 你不确定这是他在说话,还是那些将军在通过他说话。 //—— _ch_num 结束:威权倾斜 ——// //军方和民族主义势力坐大。// //民主框架还在,但它的牙齿被一颗颗拔掉了。// //共和国在向右转。他告诉自己这是「暂时」的。// ''-- 如果共和国继续走这条路 --'' //国防军的将军们在学一个词:第48条。紧急法令。总统可以绕过国会。一开始是「紧急情况」,后来变成「方便」,最后变成「习惯」。每用一次,国会就矮一截。// //NSDAP不需要暴动了。他们发现选票比子弹便宜。穿上西装,剪掉胡子,说「合法」--这个词在柏林比任何口号都好用。他们在学民主的语法,用民主的工具,拆民主的墙。// //DVP和DNVP开始坐同一张桌子。一个要钱,一个要秩序。他们发现彼此需要的东西可以互换。 // //而魏玛--他的脊背越来越直,但那种直不是倔强,是僵硬。像一扇铰链生锈的门。还能关,还能开,但每次开合都有金属摩擦的声音。// <<elseif _ending is "C">>\ /* ═══ 结局C:革命边缘 ═══ */ //「时候到了。」// 你看着窗外的柏林。红色的旗帜比去年多了。不是在墙上--是在人心里。 KPD在壮大。汉堡起义失败了,但它证明了一件事:有人愿意为革命死。在柏林的工人区,这比任何选举都有说服力。 社会愤怒在沸腾。通胀吃掉了所有人的积蓄。中产阶级变成了无产阶级。无产阶级变成了赤贫。而他们都在看同一个方向。 SPD在撕裂。左翼在向KPD靠拢,右翼在和DVP妥协。中间地带在消失。 魏玛站在你身后。他的眼神变了。是害怕之外一些其他的,你在赌徒桌上见过的东西。 「也许该试试别的路了。」他说。「这条路走到头了。」 //—— _ch_num 结束:革命边缘 ——// //左翼革命压力逼近。// //工人运动的激进派在上升,温和派在失语。// //共和国没有解决穷人的问题。穷人正在失去耐心。// ''-- 如果共和国继续走这条路 --'' //莫斯科在算账。汉堡的血流得值不值?答案是:不够。下一次要多准备。多联络。多等。等到柏林和汉堡同时动,等到军队分裂,等到那一天。KPD在等「那一天」。他们有耐心。// //SPD的右翼在和资本家握手,左翼在和KPD对视。对视久了,眼神会变。有一天他们会发现,他们已经站在同一边了--只是自己还没意识到。// //工会的人在问一个问题:罢工还有用吗?如果没用,什么有用?这个问题在1924年还没有答案。但提问本身就是一种危险。// //而魏玛--他的眼睛亮了。但那种亮不是希望,是发烧。一个人烧到三十九度的时候,眼睛也是亮的。他觉得自己看到了出路。但发烧的人看到的出路,通常是窗户。// <<elseif _ending is "D">>\ /* ═══ 结局D:撕裂崩溃 ═══ */ //「够了。」// 你看着窗外的柏林。街上有血迹。不是新的--是昨天还没洗掉的。明天还会有新的。 政治暴力失控了。左翼和右翼在街头互相厮杀。警察管不住,也许不想管。国防军在旁观,也许在等。 国会变成了角斗场。辩论变成咒骂,咒骂变成拳头。民主不是在衰退--是在被两边同时撕扯。 没有人相信政府了。没有人相信未来了。相信的东西只剩一个:自己的阵营。于是阵营变成了国家里的国家。 魏玛站在你身后。他在发抖。不是冷--是某种从内部来的震荡。 「我撑不住了。」他说。声音碎的。「他们在撕我。左边撕一块,右边撕一块。再这样下去,就没有『我』了。」 //—— _ch_num 结束:撕裂崩溃 ——// //政治暴力失控,社会撕裂到无法弥合。// //共和国不是在衰落--是在被同时拉向两个方向,直到断裂。// //1924年还会来。但来的是什么样的德国,已经没人能说了。// ''-- 如果共和国继续走这条路 --'' //街上的血干得很快。雨一冲就没了。但血留下的东西冲不掉--仇恨。左翼记住了谁镇压了他们,右翼记住了谁挡了路。两边的记忆都比任何档案都精确。// //国防军在看。他们看到的不是混乱,是机会。每一次街头暴力,都是「我们需要秩序」的论据。他们不需要制造混乱--他们只需要等混乱自己来,然后说:让我们来。// //国会还在开会。但开会和运转不是一回事。一扇门可以开着,但铰链断了,它只是碰巧还立着。风大一点就倒。// //而魏玛--他在碎。不是突然碎,是像冰面开裂那样,一条线一条线地蔓延。你能看到裂纹。他也能看到。但看到裂纹和阻止裂纹是两回事。有时候,看到本身就是裂纹的一部分。// <</if>>\ <hr> ''-- _ch_num 数据统计 --'' <<set _dem_score to Math.round(_democracy_health)>>\ <<set _econ_score to Math.round(_economy_stability)>>\ //民主健康度:_dem_score// //经济稳定度:_econ_score// //累计处理事件:_events_resolved 个// //历史恐惧数量:<<print ($weimar and $weimar.historical_anxiety) ? Object.keys($weimar.historical_anxiety).length : 0>> 个// <<if $weimar and $weimar.historical_anxiety and Object.keys($weimar.historical_anxiety).length gt 0>>\ //魏玛在这一年学会了恐惧:// <<for _k range Object.keys($weimar.historical_anxiety)>>\ - _k <</for>>\ <</if>>\ <hr> ''-- 这一年,你 --'' <<silently>> <<set _visited_regions to 0>> <<set _most_visited to "">> <<set _max_visits to 0>> <<for _rk range Object.keys($regions)>> <<if $regions[_rk].visit_count gt 0>> <<set _visited_regions to _visited_regions + 1>> <<if $regions[_rk].visit_count gt _max_visits>> <<set _max_visits to $regions[_rk].visit_count>> <<set _most_visited to $regions[_rk].name>> <</if>> <</if>> <</for>> <<set _hard_count to $player.stance_count.hard>> <<set _soft_count to $player.stance_count.soft>> <<set _wait_count to $player.stance_count.wait>> <</silently>>\ //你在总理府签过 _events_resolved 份文件。<<if _hard_count gt _soft_count and _hard_count gt _wait_count>>你签得很快,笔尖刮纸的声音像刀。<<elseif _soft_count gt _hard_count and _soft_count gt _wait_count>>你签得很慢,总是在落笔前多问一句。<<else>>你签得不多--更多的文件被你放进了抽屉的「待定」那一摞。<</if>>// //你去过 _visited_regions 个区域。<<if _max_visits gt 0>>_most_visited 去过 _max_visits 次,比任何地方都多。<<if _most_visited eq "克罗伊茨贝格">>那里的工人不再叫你「先生」,他们叫你「那扇不关的门」。<<elseif _most_visited eq "选帝侯大街">>那里的咖啡馆侍应认识你的口味,不用问就端上来。<<elseif _most_visited eq "蒂尔加滕">>那里的军官开始在你面前说真话--也许是假话,但至少不再是客套。<</if>><</if>>// <<if _all_averted>>\ //而这个国家在_ch_year年没有灭亡--不是运气,是这一年里每一次「多看一眼」攒下来的。//\ <<else>>\ //这个国家在_ch_year年没有灭亡。这不算胜利,但在柏林,这也不算失败。//\ <</if>>\ <hr> //_ch_num 结束了。// //但魏玛的故事没有结束。// //_ch_next 还在等着。// //新的危机。新的选择。新的代价。// //(新的章节还在筹备。当前可重新开始,尝试不同的路线。)// <<link "重新开始" "Scene_Birth_1">> <<restart>>\ <</link>>
/* ════════════════════════════════════════════════════════════ 替代结局 · 红色春天(B 层门闸出口,13_init_world S3 exit_gates) 进入条件:$fate ≤ -90(整年持续向左极化) 且 $flags.uprising_victory eq "victory" (「总起义前夜」选了 顺水推舟,承认工人委员会的合法性)。 共和国没有在年关倒下——它在年关前换了一个方向。 ════════════════════════════════════════════════════════════ */ <<set $stage_alt to "red">>\ <<nobr>> //1923年12月。// ''-- 第三章结束:红色春天 --'' <hr> <span class="sb-section-title">历史方向偏转</span> //相位滑轨停在 <<print Math.round($fate)>>。一整年,你把每一样能递出去的东西都递向了街的那一头——而在总起义前夜,你把共和国的名字也递了过去。// <hr> <p>承认令是后半夜签的。天亮之前,总工会的人已经站在威廉街的门口。他们没有走侧门,也没有按名册通报——从这一天起,他们不再需要。</p> <p>面包的配给归了工厂委员会的分发点,铁路的调度表盖上了管理委员会的章。鲁尔还在抵制占领军,只是街上的口号换了词:从「不给法国人一车煤」,变成了「不给任何老爷一车煤」。</p> <p>国会照常开会。人人心里都清楚,另一本名册在工厂里。SPD的领袖在电台里讲「负责任的社会主义」,讲稿改了三遍,删掉了所有犯忌的词;KPD的报纸把你的签字印上头版,标题只有七个字:第一步,已经走了。</p> <p>国防军没有开进来。工会地下室的枪还没有交出来,各师的花名册也不满,莫斯科在看着。将军们把通令发到每一个团:形势已变,原地待命,等待命令。通令的抄本同时摆上了你的办公桌——呈阅,不署名。</p> <p>魏玛站在窗前。他瘦了,站姿却比年初松。肩膀放下来了,手也不再揣着。</p> <p>「一月的时候,人们叫我共和国。」他说,「工人叫我的时候声音最轻,像怕把我叫碎了。现在他们换了称呼。现在他们叫『我们的』。」</p> <p>他把承认令的副本抚平,放进抽屉最底层,压在宪法文本上面。抽屉推上的时候卡了一下,他用力按了按,才关严。</p> <p>窗外,工人给街灯换新的灯罩。有人哼一支进行曲,跑调,但整条街都跟上了。</p> <hr> ''-- 国家年终状态 --'' //革命压力//:<<bar $world.revolution 100>><br> //政府信任//:<<bar $world.gov_trust 100>><br> //军方影响//:<<bar $world.army_influence 100>><br> //政治暴力//:<<bar $world.political_violence 100>> <hr> //—— 第三章结束:红色春天 ——// //共和国活过了1923年,并且朝没有人预想过的方向拐了弯。// //将军们在等下一个冬天。工人们在等下一个春天。两边都记好了日子。// //(这条路线的后续章节还在筹备。当前可重新开始,尝试不同的路线。)// <<link "重新开始" "Scene_Birth_1">> <<restart>>\ <</link>> <</nobr>>
/* ════════════════════════════════════════════════════════════ 替代结局 · 向柏林进军(B 层门闸出口,13_init_world S3 exit_gates) 进入条件:$fate ≥ +90(整年持续向右极化) 且 $mil_outcome eq "得逞" (「政变前夜」选了 默许政变条件,换取秩序过渡承诺; 军方影响 ≥ 90 会先走 End_Death,到不了这里)。 卡车开进了威廉街。共和国活着,替它做主的换了人。 ════════════════════════════════════════════════════════════ */ <<set $stage_alt to "junta">>\ <<nobr>> //1923年12月。// ''-- 第三章结束:向柏林进军 --'' <hr> <span class="sb-section-title">历史方向偏转</span> //相位滑轨停在 <<print Math.round($fate)>>。一整年,你把每一样能递出去的东西都递给了营房——而在政变前夜,你把钥匙也递了出去。// <hr> <p>卡车队开进威廉街的那个晚上没有枪声。车灯全亮着,慢速,整齐,像一次例行的换防。你从办公室的窗口看着他们进去,看见总参谋部的车停在你楼下。从那天起,你的每一道命令都从这里发出,也在这里落地。</p> <p>「秩序过渡」的内阁名单第二天见报,几个旧名字坐进了新椅子。国会照常开幕,议程提前一周印好,表决结果提前三天算好。报纸照常出,社论版开始「自愿保持一致」。KPD的党部第三天被查封,封条上的浆糊是国防部文具室的。</p> <p>工会没有总罢工。这一年,每一次动员都被你按了下去——传单、集会、联合声明,一样一样。现在没有人相信动员了。面包的价签安静地涨到地租马克撑得住的地方,然后停住。街上很干净。干净得过了头。</p> <p>魏玛还站在他一直站的地方:你的右后方,半步。他的背挺得比哪一年都直——有人教过他,军人喜欢站得直的人。</p> <p>「明年会有秩序。」他说,声音很平,像在念一份气象公报。「面包会有的。电车会准点的。报纸会安静的。」</p> <p>他停了停。</p> <p>「他们问我,共和国这个名字还要不要用。我说留着吧。留着,大家都不用重新学。」</p> <p>窗外,换岗的哨兵踏着正步经过。靴跟砸在石板上,隔着一层玻璃,像很远、很匀的鼓。</p> <hr> ''-- 国家年终状态 --'' //军方影响//:<<bar $world.army_influence 100>><br> //民族主义//:<<bar $world.nationalism 100>><br> //政府信任//:<<bar $world.gov_trust 100>><br> //政治暴力//:<<bar $world.political_violence 100>> <hr> //—— 第三章结束:向柏林进军 ——// //共和国活过了1923年。只是从秋天起,替它做主的已经不是那张会议桌。// //宪法还在生效。一条一条,挑着生效。// //(这条路线的后续章节还在筹备。当前可重新开始,尝试不同的路线。)// <<link "重新开始" "Scene_Birth_1">> <<restart>>\ <</link>> <</nobr>>
/* 灭亡结局 · 意识流调性 呼应序章"下坠与苏醒":这一次,没有苏醒。 感官一层层熄灭,最后归于序章开头的混沌--但这次是永久的。 */ //$date.year年$date.month月// <<silently>> <<set _death_cause_name to "">> <<if $death_cause eq "C01">><<set _death_cause_name to "内战的枪声">> <<elseif $death_cause eq "C02">><<set _death_cause_name to "总起义的浪潮">> <<elseif $death_cause eq "C03">><<set _death_cause_name to "政变的皮靴声">> <<elseif $death_cause eq "C04">><<set _death_cause_name to "货币的崩塌">> <</if>> <</silently>>\ <<type 50ms>><font color="#FE0C0C"><b>又来了。</b></font><</type>> <<timed 2s>><<type 40ms>>那种感觉。失重。坠落。和序章里一样。只是这一次,没有容器接住他。没有声浪。没有光丝。<</type>><</timed>> <<timed 7s>><<type 40ms>>魏玛停止了呼吸。<</type>><</timed>> <<timed 10s>>\ <center>声音先走了。</center><</timed>> <<timed 12s>><<type 40ms>>不是安静。是声音本身失去了意义。口号、欢呼、咒骂、低语--它们还在,但像隔着一层厚玻璃,越来越远。最后变成一种嗡嗡的、没有内容的白噪音。<</type>><</timed>> <<timed 17s>>\ <center>气味也散了。</center><</timed>> <<timed 19s>><<type 40ms>>硝烟。汗味。廉价烟草。旧时代的尘埃。它们一层层剥落,像墙皮。最后只剩下一种气味--什么都没有的气味。<</type>><</timed>> <<timed 24s>>\ <center>光熄了。</center><</timed>> <<timed 26s>><<type 40ms>>不是黑暗。是「看」这个动作本身变得多余。色块、轮廓、人形--它们淡去。窗边那个深色的人形,最后消失。连同它喊出的那句话。<</type>><</timed>> <<timed 32s>>\ <center><<type 60ms>><font color="#FEC90C">共和国……</font><</type>></center><</timed>> <<timed 35s>><<type 40ms>>这个词汇,曾经像烙印一样刻入他的核心。现在烙印也在褪。不是被擦掉--是承载它的那块东西,本身在变薄。<</type>><</timed>> <<timed 40s>>\ <center><<type 80ms>>我……是……<</type>></center><</timed>> <<timed 44s>>\ <center><<type 120ms>><font color="#666666">……</font><</type>></center><</timed>> <<timed 48s>><<type 40ms>>下坠的眩晕终于停了。不是落到了底--是「底」这个概念也不再需要了。混沌回来了。序章开头的那种混沌。只是这一次,没有下一段。<</type>><</timed>> <<if $death_cause>>\ <<timed 51s>>\ <center><font color="#8a4a3a">(死于:_death_cause_name)</font></center><</timed>>\ <</if>> <<if $weimar and $weimar.historical_anxiety and Object.keys($weimar.historical_anxiety).length gt 0>>\ <<timed 53s>>\ <center><font color="#666666">他最后记得的,是这些恐惧:</font></center> <<for _k range Object.keys($weimar.historical_anxiety)>>\ - _k <</for>><</timed>>\ <</if>> <<timed 58s>>\ <center><<type 150ms>><font color="#666666">这一次,钟摆停了。</font><</type>></center><</timed>> <<timed 62s>>\ <<link "重新开始" "Scene_Birth_1">><<run Engine.restart()>><</link>><</timed>>
/* ============================================================ 三层门闸系统(A 骨架 / C 血肉 / B 关节) ------------------------------------------------------------ A 河床层:$stage(阶段=相位配置,见 25b_cross_stage_protocol) C 血肉层:$fate 单轴滑轨 ± 钳制 → <<fate-shift>> / <<fate-range>> (同相位内按 $fate 加权抽取事件,见 Archetype 的 fate_weight) B 关节层:<<PhaseExitCheck>>(结算时判定 exit_gates 是否触发相位跳转) + <<Stage-Settlement>>(阶段结算:简报 / $fate / 清洗 / 路由) 用法: · 日常选择改变势能 → <<fate-shift ±n>> · 阶段末(结算页前) → <<Stage-Settlement>>(内部调 PhaseExitCheck) ============================================================ */ /* ---------- C 层 · fate-shift:让 $fate 浮动并钳制进相位范围 ---------- 用法:<<fate-shift -3>>(+ 右倾 / - 左倾) */ <<widget "fate-shift">>\ <<silently>> <<set _amt to $args[0]>> <<set $fate to $fate + _amt>> <<if $stage and $stage.fate_range>> <<set $fate to Math.max($stage.fate_range.min, Math.min($stage.fate_range.max, $fate))>> <</if>> <</silently>>\ <</widget>> /* ---------- C 层 · fate-range:把当前 $fate 主动钳回相位范围(保险) ---------- */ <<widget "fate-range">>\ <<silently>> <<if $stage and $stage.fate_range>> <<set $fate to Math.max($stage.fate_range.min, Math.min($stage.fate_range.max, $fate))>> <</if>> <</silently>>\ <</widget>> /* ---------- B 层 · PhaseExitCheck:结算时判定相位出口 ---------- 检查 $stage.exit_gates 每一条: 条件① $fate 突破 gate.fate(负→ 需 ≤;正→ 需 ≥) 条件② 因果标志 gate.check 解析值 == gate.val 两条件都满足 → 触发该 gate 的 next 相位。 输出到 _phase_exit = { triggered, gate, next } (不退默认相位时 next 为空串,由调用方走默认主线) */ <<widget "PhaseExitCheck">>\ <<silently>> <<set _pv to State.variables>> <<set _gate_hit to "">> <<set _gate_next to "">> <<if $stage and $stage.exit_gates>> <<for _i to 0; _i lt $stage.exit_gates.length; _i++>> <<set _g to $stage.exit_gates[_i]>> <<set _fate_pass to ((_g.fate lt 0 and $fate lte _g.fate) or (_g.fate gt 0 and $fate gte _g.fate))>> <<if _fate_pass>> <<set _cv to _pv>> <<if _g.check and _g.check.indexOf(".") gte 0>> <<set _path to _g.check.split(".")[0]>> <<set _key to _g.check.split(".")[1]>> <<if _cv[_path] and _cv[_path][_key] eq _g.val>> <<set _gate_hit to _g.next>> <</if>> <<else>> <<if _cv[_g.check] eq _g.val>> <<set _gate_hit to _g.next>> <</if>> <</if>> <</if>> <</for>> <</if>> <<set _phase_exit to { triggered: _gate_hit neq "", gate: _gate_hit, next: _gate_hit }>> <</silently>>\ <</widget>> /* ---------- B 层 · Stage-Settlement:阶段结算(阶段末调用) ---------- 职责(按 25b_cross_stage_protocol §八): 1. 生成"历史简报":报纸头版 + 数据总结(解决章间断裂) 2. 更新 $fate(按结算累积,写入/校准) 3. 把本阶段结果写进 $legacy_pool / $inertia_matrix 4. 按 §七 白名单清洗阶段内变量 5. 调 <<PhaseExitCheck>> 得 _phase_exit.next → 跳转硬断相位或下一阶段 TODO(结算页):简报 UI 与变量清洗暂为骨架,接入 90_endings 结算思路后实现。 */ <<widget "Stage-Settlement">>\ <<silently>> /* ① 校准 $fate:结算前先钳回本相位范围(S3 为 ±100,门闸 ±90 在范围内, 钳制不会吃掉已达标的极化值——2026-10-09 起 range 已与门闸对齐) ② 阶段内变量清洗:见协议 §七。micro 变量在结算后纳入 $last_world_tick 归零等。 */ <<fate-range>> /* ③ 结算 $fate:此处为占位,真正的"按结算累积 $fate"在接入 legacy_converter 时实现 */ /* ④ 判定相位出口 */ <<PhaseExitCheck>> /* _phase_exit = { triggered, gate, next } 已就绪,供结算 passage 消费: End_Chapter1 顶部据此 <<goto>> 替代结局(BR_RED_SPRING / BR_MARCH_ON_BERLIN); 未触发 → 留在本 passage 走默认年终结算。 */ <</silently>>\ <<if _phase_exit and _phase_exit.triggered>>\ <span class="sb-section-title">历史方向偏转</span> 相位滑轨已达临界 —— 出口:_phase_exit.gate\ <</if>>\ <</widget>> /* ---------- C 层 · fate-debug:观测 $fate 分布(调试用) ---------- 用法:<<fate-debug>> 放在侧栏/Debug 页即可实时看相位滑轨走向。 输出:当前值 / 方向档位 / 相位钳制范围 / 本局累计漂移。 */ <<widget "fate-debug">>\ <<silently>> <<set _fd_min to ($stage and $stage.fate_range ? $stage.fate_range.min : -100)>> <<set _fd_max to ($stage and $stage.fate_range ? $stage.fate_range.max : 100)>> <<set _fd_label to ( $fate lte -60 ? "强力革命势能" : ( $fate lte -30 ? "偏左·革命暗涌" : ( $fate gt -30 and $fate lt 30 ? "魏玛中道" : ( $fate lt 60 ? "偏右·复辟暗涌" : "强力右翼/复辟势能" ) ) ) )>> <<set _fd_total to 0>> <<if $fate_log and $fate_log.length gt 0>> <<for _i to 0; _i lt $fate_log.length; _i++>><<set _fd_total to _fd_total + $fate_log[_i].drift>><</for>> <</if>> <</silently>>\ <span class="sb-item sb-full"><b>相位滑轨 fate=<<print Math.round($fate)>></b> _fd_label · 钳制[_fd_min,_fd_max] · 本局累计漂移<<print Math.round(_fd_total)>></span>\ <</widget>> /* ---------- foreboding:已统一到 10_widgets.twee(tier/tint/type 条件模板,非随机)。 用法:<<foreboding "violence">> <<foreboding "deal" "军方">> <<foreboding "speech">> ---------- */ /* ---------- fate-digest:日报"政治风向"摘要行 ---------- 用法:<<fate-digest>> 放进晨报/每日总结,玩家看到相位走向(报纸设定友好)。 */ <<widget "fate-digest">>\ <<silently>> <<set _fd_lbl to ( $fate lte -30 ? "政治风向:左倾 · 革命势能抬头" : ( $fate gte 30 ? "政治风向:右倾 · 复辟势力蠢动" : "政治风向:僵持的中道" ) )>> <</silently>>\ <<if $fate neq 0>><span class="sb-item sb-full">''_fd_lbl''(<<print Math.round($fate)>>)</span><</if>>\ <</widget>> /* ============================================================ 局部 B 硬断节点 · 替代相位 入口:<<Stage-Settlement>>(End_Chapter1 年终结算时调用)命中 exit_gates[].next → <<goto>> 转跳替代结局。两个出口均已成文: · BR_RED_SPRING 红色春天 (fate ≤ -90 + 总起义承认工人委员会) · BR_MARCH_ON_BERLIN 向柏林进军(fate ≥ +90 + 政变前夜默许政变条件) 正文在 90_endings.twee。若日后把替代相位扩成可玩章节 (继承日循环骨架、替换 deck/npc/报纸),再把对应 passage 迁回本文件。 */
/* 呈现与扉页统一(title-wrap 体系,见 03_stylesheet 扉页区块) */ <<nobr>> <div class="title-wrap title-wrap-sub"> <div class="title-orn">◆ ◆ ◆</div> <div class="ss-main">选择你的共和国</div> <div class="title-era">同一个国家 · 一段绝境</div> <hr class="title-rule"> <div class="ss-card"> <div class="ss-chapter">第三章 · 危机元年(1923)<span class="badge badge-red">完整版</span></div> <p class="ss-desc">鲁尔被占领,马克在凋敝,工人要上街,将军要「秩序」。共和国被推上悬崖,没有退路。</p> <span class="title-btn"><<link "进入 1923" "Scene_StageSelect_Confirm">> <<set $stage_pick to "S3">> <</link>></span> </div> <<if $debug_stage_select>> <div class="ss-card"> <div class="ss-chapter">第二章 · 动荡与暗杀(1920-22)<span class="badge badge-cyan">施工中</span></div> <p class="ss-desc">条约压顶,军队养虎,暗杀名单在咖啡馆之间一桌一桌地传。年轻的共和国,不得不奔跑。</p> <span class="title-btn title-btn-ghost"><<link "进入 1920" "Scene_StageSelect_Confirm">> <<set $stage_pick to "S2">> <</link>></span> </div> /* 未来章节的文案梯子:卡片与文案已就位(走改稿接口 67), 章节本体建成前不可进入,只到「未建成」占位页 */ <div class="ss-card"> <div class="ss-chapter">第四章 · 黄金岁月(1924-29)<span class="badge badge-gray">未建成</span></div> <p class="ss-desc">新钱稳住了市面,贷款从大洋对岸源源而来。共和国第一次有了余裕——也第一次有本钱,把裂缝藏进体面里。</p> <span class="title-btn title-btn-ghost"><<link "了解本章" "Scene_StageSelect_Unbuilt">> <<set $stage_pick to "S4">> <</link>></span> </div> <div class="ss-card"> <div class="ss-chapter">第五章 · 大萧条(1929-32)<span class="badge badge-gray">未建成</span></div> <p class="ss-desc">大洋对岸的股市塌了下来,砸穿了全世界。工作没了,议会瘫了,街上几万个声音开始喊同一句话。</p> <span class="title-btn title-btn-ghost"><<link "了解本章" "Scene_StageSelect_Unbuilt">> <<set $stage_pick to "S5">> <</link>></span> </div> <div class="ss-card"> <div class="ss-chapter">第六章 · 垂死抉择(1932-33)<span class="badge badge-gray">未建成</span></div> <p class="ss-desc">总理换得比月份还快,宪法一页一页被翻过去。共和国躺在中街上,等最后一年的判决。</p> <span class="title-btn title-btn-ghost"><<link "了解本章" "Scene_StageSelect_Unbuilt">> <<set $stage_pick to "S6">> <</link>></span> </div> <</if>> <<if $show_prologue>> <p class="title-hint">选择后仍可观看序章。</p> <</if>> <p class="title-hint">目前完成的是第三章(1923)——一段完整的绝境体验。共和国的整段故事(1918-1933)仍在逐章搭建,每建成一章就开放一章。</p> </div> <</nobr>>
/* 未建成章节的占位页:从选章页的「未建成」卡片进入,只做导航、不写任何状态 */ <<nobr>> <div class="title-wrap title-wrap-sub"> <div class="title-orn">◆ ◆ ◆</div> <div class="ss-main">这一章还没建成</div> <div class="title-era">档案柜里这一格还空着</div> <hr class="title-rule"> <div class="title-body-center"> <p>等它写完,你会在这里读到它。现在先回第三章吧。</p> </div> <div class="title-entries"> <span class="title-btn title-btn-ghost"><<link "回到章节选择" "Scene_StageSelect">><</link>></span> </div> </div> <</nobr>>
<<silently>> /* ── 按选择改写阶段变量 ── 牌库一律深拷贝(JSON 往返):发牌把 dealt=true 直接写在牌元素上, 若引用赋值会把原始库($s2_event_deck / $s3_snapshot)一并污染,二次进章全哑。 */ <<if $stage_pick eq "S2">> /* S2:阶段指针 / 起点 1920-01-01 / S2 牌库与暗涌 / 1920 年席位 */ <<set $stage to $phases.WEIMAR_1921>> <<set $date to { year: 1920, month: 1, day: 1 }>> <<set $event_deck to JSON.parse(JSON.stringify($s2_event_deck))>> <<set $swell_events to JSON.parse(JSON.stringify($s2_swell_events))>> <<set $party_seats to { spd: 102, kpd: 82, ddp: 39, dvp: 62, zentrum: 64, dnvp: 71, nsdap: 0 }>> /* ^ S2 用 1920-06 选后席位:kpd 槽位=USPD 82 席(沿用 kpd 通道复用档案/游说/开票逻辑), NSDAP 1920 年尚未进议会(nsdap:0,开票时自然归零弃权)。 */ <<set $party_profile.kpd.lean to -0.9>> <<set $party_profile.kpd.radical to 0.8>> /* S2 算盘池覆盖(每党 3 条,pool-pick 轮转取句——2026-10-02 复读治理同步扩池) */ <<set $party_motives.kpd to ["他要让所有还在犹豫的工人看到:议会里也有敢掀桌子的人。","他要证明这届国会撑不过一年——散架得越快,街上的组织得越快。","他不指望通过任何东西。他来,就是为了让拒绝他的人难堪。"]>> <<set $party_motives.nsdap to ["他要让国会看起来很蠢,这样街上的拳头才显得有理。","他还没摸到议会的门,可他的传单已经进了每一家啤酒馆。","他在等一个能让报纸印上他名字的日子,哪一天都行。"]>> <<set $party_motives.dnvp to ["他要撕开共和国的裂缝,让旧旗子再飘起来。","他要给被和约裁掉的军官和水兵留位置——留给他们的人,就是留给他的人。","他要把每一个签过字的手都记下来,等哪天连本带利一起算。"]>> <<set $party_motives.spd to ["他刚在选举里摔了跟头,急着证明自己还是多数工人的人。","他要赶在裁军案定稿之前,把工人的八小时写进不能反悔的条文。","他想让党内看清:留在政府里做事,比在街上喊话更能保住八小时。"]>> <<set $party_motives.dvp to ["他要让工业界的钱安心留在国内,别都逃去荷兰。","他要拿着赔款分期表压国会:每让一步,都得记清这笔账挂在谁头上。","他要替鲁尔的厂主问一句:军队能不能护住上工的人。"]>> <<set $party_motives.ddp to ["他要证明共和国还有第三个选项——宪法护得住中产。","他要给新宪法挑几根结实的梁柱:文官、法庭,还有一支不问政治的官僚队伍。","他怕再乱一年,中间派就散光了——这一票,是他拉住他们的手。"]>> <<set $party_motives.zentrum to ["他要在教会的信众和共和国的薪水之间,再走一次钢丝。","他要在新宪法里给教会学校留一间屋子,再小他都要。","他两边都不敢输:莱茵兰的信众在看着,柏林的部长席也在看着。"]>> /* S2 世界基准写入(重放 base) */ <<set $world.economy to 28>> <<set $world.inflation to 15>> <<set $world.social_anger to 20>> <<set $world.nationalism to 35>> <<set $world.gov_trust to 40>> <<set $world.army_influence to 22>> <<set $world.revolution to 15>> <<set $world.political_violence to 18>> /* S2 起点国旗:政党信任按「刚建国两年」基调微调(军事弱势期) */ <<set $npcs.army.trust to 35>> <<else>> /* S3(从 $s3_snapshot 恢复完整原始态):StoryInit 末尾已备份开局的牌库/席位/动机/世界基准, 从 S2 切回或二次进入时逐项还原,避免 1920 席位/牌面残留串进 1923。 */ <<set $stage to $phases.WEIMAR_1923>> <<set $date to { year: 1923, month: 1, day: 1 }>> <<set $event_deck to JSON.parse(JSON.stringify($s3_snapshot.deck))>> <<set $swell_events to JSON.parse(JSON.stringify($s3_snapshot.swell))>> <<set $party_seats to JSON.parse(JSON.stringify($s3_snapshot.seats))>> <<set $party_motives to JSON.parse(JSON.stringify($s3_snapshot.motives))>> <<set $party_profile.kpd to JSON.parse(JSON.stringify($s3_snapshot.profile_kpd))>> <<set $world to JSON.parse(JSON.stringify($s3_snapshot.world))>> <<set $npcs.army.trust to $s3_snapshot.army_trust>> <</if>> /* ── 会话状态清零(两章通用;正常标题页路径这些本来就是初始态,重置无副作用)── */ <<set $session_day to 0>> <<set $tp to 6>> <<set $pending_events to []>> /* 暗涌系统状态清零:每章触发配额重新计满、风声队列清空(63_swell_gate) */ <<set $swell_fired to { replace: 0, free: 0 }>> <<set $swell_rumor_pending to []>> /* 文件篮牌库是静态数据(60件),不是会话状态——清空会让公文事件永远发不出, 必须整池重建 */ <<fb-init-data>> <<set $event_log to []>> <<set $world_yesterday to JSON.parse(JSON.stringify($world))>> <<set $stage_selected to true>> <</silently>>\ <<nobr>> <div class="title-wrap title-wrap-sub"> <div class="title-orn">◆ ◆ ◆</div> <<if $stage_pick eq "S2">> <div class="ss-main">一九二〇 · 柏林</div> <div class="title-era">共和国第二年</div> <hr class="title-rule"> <div class="title-body-center"> <p>共和国第二年。年轻的共和国不得不奔跑。</p> </div> <div class="title-epigraph">「第二年。你已经在这里。」</div> <<else>> <div class="ss-main">一九二三 · 柏林</div> <div class="title-era">共和国第五年</div> <hr class="title-rule"> <div class="title-body-center"> <p>共和国第五年。站得直,但站得很累。</p> </div> <div class="title-epigraph">「第五年。你仍然在这里。」</div> <</if>> <div class="title-entries"> <<if $skip_birth or not $show_prologue>> <span class="title-btn"><<link "进入游戏" "Scene_Intro">> <<daily-tick>> <</link>></span> <<else>> <span class="title-btn"><<link "观看序章" "Scene_Birth_1">><</link>></span> <span class="title-btn title-btn-ghost"><<link "跳过序章,直接开始" "Scene_Intro">> <<daily-tick>> <</link>></span> <</if>> </div> </div> <</nobr>>
/* ============================================================ 魏玛对话回应系统 V1.1 触发:主动对话 / 被动数值波动 双层池子:状态标签(calm/anxious/numb/fractured) × 子池 会话级防重:_weimar_recent(临时变量,不存档) 身份标识:每条回应带「魏玛」前缀 兜底:池空时输出"(魏玛没有说话。)" ============================================================ */ /* ---------- weimar-state-tag:判定当前状态标签 ---------- 输出存入 _state_tag */ <<widget "weimar-state-tag">>\ <<silently>> <<set _t to $weimar.personality_tension>> <<set _thresh to $weimar.effective_threshold>> <<if _t gte _thresh * 0.8>> <<set _state_tag to "fractured">> <<elseif $weimar.surface.fatigue gte 70>> <<set _state_tag to "numb">> <<elseif $weimar.surface.anxiety gte 30>> <<set _state_tag to "anxious">> <<else>> <<set _state_tag to "calm">> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-speak:主抽取接口 ---------- 用法:<<weimar-speak>> (自动判定状态标签) 或:<<weimar-speak "anxious">> (强制指定状态) 输出:带「魏玛:」前缀的回应文本,存入 $weimar_line */ <<widget "weimar-speak">>\ <<silently>> <<set $weimar_line to "">> /* 判定状态标签 */ <<if $args.length gt 0>> <<set _state_tag to $args[0]>> <<else>> <<weimar-state-tag>> <</if>> /* 判定子池(按状态标签×数值强度) */ <<set _subpool to "universal">> <<if _state_tag is "calm">> <<if $weimar.mid.democracy_trust lte 40>> <<set _subpool to "low">> <<elseif $weimar.mid.democracy_trust lte 70>> <<set _subpool to "mid">> <<else>> <<set _subpool to "high">> <</if>> <<elseif _state_tag is "anxious">> <<set _subpool to "universal">> <<elseif _state_tag is "numb">> <<set _subpool to "universal">> <<elseif _state_tag is "fractured">> <<if random(1,2) eq 1>> <<set _subpool to "whisper">> <<else>> <<set _subpool to "vision">> <</if>> <</if>> /* 拼接池子名:weimar_speak_状态_子池 */ <<set _pool_name to "weimar_speak_" + _state_tag + "_" + _subpool>> /* 初始化会话级防重(临时变量,不存档) */ <<if not _weimar_recent>> <<set _weimar_recent to []>> <</if>> /* 从池子抽取(用for循环代替while,最多重试3次避免防重死循环) */ <<set _picked_text to "">> <<set _found to false>> <<for _attempts to 0; _attempts lt 3 and not _found; _attempts++>> <<pool-draw _pool_name 1>> <<if $pool_result.length gt 0>> <<set _candidate to $pool_result[0]>> /* 检查防重 */ <<if _weimar_recent.includes(_candidate.entry_id) and $pools[_pool_name].length gt 1>> /* 已用过且池子里还有别的,重抽(什么都不做,循环继续) */ <<else>> <<set _found to true>> <<set _picked_text to _candidate.text>> /* 写入防重队列(保持3条) */ <<set _weimar_recent.push(_candidate.entry_id)>> <<if _weimar_recent.length gt 3>> <<set _weimar_recent.shift()>> <</if>> <</if>> <</if>> <</for>> /* 兜底 */ <<if _picked_text eq "">> <<set _picked_text to "……">> <</if>> /* 加身份标识前缀 */ <<set $weimar_line to "魏玛:「" + _picked_text + "」">> <</silently>>\ <</widget>> /* ---------- weimar-check-trigger:被动触发检测 ---------- 用法:<<weimar-check-trigger>> 在事件结算后调用,检查数值变化是否突破阈值 若触发,设置 _weimar_triggered 为 true */ <<widget "weimar-check-trigger">>\ <<silently>> <<set _weimar_triggered to false>> /* 人格张力骤变 */ <<if $weimar.personality_tension gte $weimar.effective_threshold * 0.8>> <<set _weimar_triggered to true>> <</if>> /* 关键日期 */ <<if ($date.month eq 1 and $date.day eq 11) or ($date.month eq 11 and $date.day eq 8) or ($date.month eq 5 and $date.day eq 1)>> <<set _weimar_triggered to true>> <</if>> /* 有待处理红色事件 */ <<if $pending_events.length gt 0 and $pending_events[0].deck_id and $pending_events[0].deck_id.startsWith("R")>> <<set _weimar_triggered to true>> <</if>> <</silently>>\ <</widget>>
/* ============================================================ 主动对话系统 · 逻辑层(V1.2 需求文档 §四/§五) 两个 widget: - weimar-dialogue-apply:应用玩家动作的数值影响 - weimar-dialogue-pick:状态匹配选池 + 动作联动 + 防重 + 抽取 复用 pool-draw 做加权随机;输出存 $weimar_dialogue_line ============================================================ */ /* ---------- apply-dialogue-delta:按路径字符串应用单个数值 ---------- 用法:<<apply-dialogue-delta "weimar.surface.anxiety" -8>> 支持 weimar.* / player.* / npcs.weimar.* 三类前缀,0-100 钳制。 */ <<widget "apply-dialogue-delta">>\ <<silently>> <<set _pkey to $args[0]>> <<set _pdelta to Number($args[1]) || 0>> <<set _pparts to _pkey.split(".")>> <<if _pparts.length eq 3>> <<set _pbefore to 0>> <<set _pafter to 0>> <<if _pparts[0] is "weimar">> <<set _pbefore to Number($weimar[_pparts[1]][_pparts[2]]) || 0>> <<set $weimar[_pparts[1]][_pparts[2]] to Math.max(0, Math.min(100, _pbefore + _pdelta))>> <<set _pafter to Number($weimar[_pparts[1]][_pparts[2]]) || 0>> <<elseif _pparts[0] is "player">> <<set _pbefore to Number($player[_pparts[1]][_pparts[2]]) || 0>> <<set $player[_pparts[1]][_pparts[2]] to Math.max(0, Math.min(100, _pbefore + _pdelta))>> <<set _pafter to Number($player[_pparts[1]][_pparts[2]]) || 0>> <<elseif _pparts[0] is "npcs" and _pparts[1] is "weimar">> <<set _pbefore to Number($npcs.weimar[_pparts[2]]) || 0>> <<set $npcs.weimar[_pparts[2]] to Math.max(0, Math.min(100, _pbefore + _pdelta))>> <<set _pafter to Number($npcs.weimar[_pparts[2]]) || 0>> <</if>> /* 真实到账记账(钳制后差值;回复页效果标注用,防「显示+2实际+0」) */ <<if not $dialogue_applied>><<set $dialogue_applied to {}>><</if>> <<set $dialogue_applied[_pkey] to ($dialogue_applied[_pkey] ? $dialogue_applied[_pkey] : 0) + (_pafter - _pbefore)>> <<elseif _pparts.length eq 2>> <<set _pbefore to 0>> <<set _pafter to 0>> <<if _pparts[0] is "weimar">> <<set _pbefore to Number($weimar[_pparts[1]]) || 0>> <<set $weimar[_pparts[1]] to Math.max(0, _pbefore + _pdelta)>> <<set _pafter to Number($weimar[_pparts[1]]) || 0>> <<elseif _pparts[0] is "player">> <<set _pbefore to Number($player[_pparts[1]]) || 0>> <<set $player[_pparts[1]] to Math.max(0, _pbefore + _pdelta)>> <<set _pafter to Number($player[_pparts[1]]) || 0>> <</if>> <<if not $dialogue_applied>><<set $dialogue_applied to {}>><</if>> <<set $dialogue_applied[_pkey] to ($dialogue_applied[_pkey] ? $dialogue_applied[_pkey] : 0) + (_pafter - _pbefore)>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-dialogue-apply:应用动作数值(含每日上限) ---------- 用法:<<weimar-dialogue-apply "comfort">> 查 $dialogue_actions 找 effects,按路径字符串应用到对应变量。 每日对话数值上限 $dialogue_cap_daily(增幅+减幅合计): - 特殊数值($dialogue_special_paths,未来由特殊事件划定的数值)不计入上限、全额生效。 - 普通数值按剩余预算应用:预算不足时按比例缩放,避免玩家把对话当刷数值捷径。 每轮 fatigue += 2(对话疲劳)。 */ <<widget "weimar-dialogue-apply">>\ <<silently>> /* 本轮真实到账账本(每轮清空,回复页据此标注实际数值) */ <<set $dialogue_applied to {}>> /* 信任值自检:若被污染成 NaN/非数字,重置回默认值,避免告别语分档异常 */ <<set $npcs.weimar.trust to Math.max(0, Math.min(100, Number($npcs.weimar.trust) || 50))>> <<set _aid to $args[0]>> <<set _act to null>> <<for _i to 0; _i lt $dialogue_actions.length; _i++>> <<if $dialogue_actions[_i].id eq _aid>> <<set _act to $dialogue_actions[_i]>> <</if>> <</for>> <<if _act and _act.effects>> /* 拆分特殊数值与普通数值 */ <<set _special to []>> <<set _normal to []>> <<for _key range Object.keys(_act.effects)>> <<if $dialogue_special_paths.includes(_key)>> <<set _special.push({k:_key, d:_act.effects[_key]})>> <<else>> <<set _normal.push({k:_key, d:_act.effects[_key]})>> <</if>> <</for>> /* 特殊数值:全额生效,不计入上限 */ <<for _i to 0; _i lt _special.length; _i++>> <<apply-dialogue-delta _special[_i].k _special[_i].d>> <</for>> /* 关系状态修正:自我认同×信任影响部分选项效果(双轴机制) */ <<weimar-relation-state>> <<for _i to 0; _i lt _normal.length; _i++>> <<set _rk to _normal[_i].k>> <<set _rd to _normal[_i].d>> <<if _relation is "怀疑">> /* 高认同+低信任:他不信你,安抚/解释打折;质问/发泄更深伤关系 */ <<if (_aid is "comfort" or _aid is "empathize" or _aid is "explain_policy" or _aid is "inform_daily") and _rd lt 0>> <<set _rd to Math.round(_rd * 0.5)>> <</if>> <<if (_aid is "confront" or _aid is "vent") and _rk is "npcs.weimar.trust">> <<set _rd to Math.round(_rd * 1.5)>> <</if>> <<elseif _relation is "依赖">> /* 低认同+高信任:他依赖你,安抚更见效;质问近乎无效(他顺着你) */ <<if _aid is "comfort" or _aid is "empathize">> <<if _rd lt 0>><<set _rd to Math.round(_rd * 1.5)>><</if>> <<if _rk is "npcs.weimar.trust">><<set _rd to Math.round(_rd * 1.5)>><</if>> <</if>> <<if _aid is "confront" and _rk is "npcs.weimar.trust">> <<set _rd to Math.round(_rd * 0.5)>> <</if>> <</if>> <<set _normal[_i].d to _rd>> <</for>> /* 普通数值:受每日上限约束(增/减幅度合计) */ <<set _total to 0>> <<for _i to 0; _i lt _normal.length; _i++>> <<set _total to _total + Math.abs(_normal[_i].d)>> <</for>> <<set _remaining to Math.max(0, $dialogue_cap_daily - $dialogue_spent)>> <<if _total gt 0 and _remaining gt 0>> <<set _scale to (_total <= _remaining) ? 1 : (_remaining / _total)>> <<for _i to 0; _i lt _normal.length; _i++>> /* 注意:宏参数里带空格的表达式必须用反引号包住,否则被按空格拆参、数值恒为 0 */ <<apply-dialogue-delta _normal[_i].k `Math.round(_normal[_i].d * _scale)`>> <</for>> <<set $dialogue_spent to $dialogue_spent + Math.min(_total, _remaining)>> <</if>> <</if>> /* 对话疲劳:每轮 +2 */ <<set $weimar.surface.fatigue to Math.min(100, $weimar.surface.fatigue + 2)>> /* 当场刷新情绪档位(对话即时影响情绪) */ <<weimar-mood-refresh>> /* 聊天信任累积(每日封顶 + 跨天累进) */ <<weimar-chat-bond>> /* 冷战循环:激烈互动升温,安抚/共情/陪伴降温 */ <<if _aid is "confront" or _aid is "vent">> <<weimar-coldwar-shift 1>> <<elseif _aid is "comfort" or _aid is "empathize" or _aid is "silent_listen">> <<weimar-coldwar-shift -1>> <</if>> /* 魏玛记忆:有分量的话被记住,后续对话可引用 */ <<if _aid is "comfort">><<weimar-memory-record "comfort" "你曾经试图安抚他,告诉他一切都会好起来。他记得。" >> <<elseif _aid is "encourage">><<weimar-memory-record "encourage" "你鼓励他坚持,说共和国的路值得走下去。他记下了。">> <<elseif _aid is "empathize">><<weimar-memory-record "empathize" "你对他说过,你懂他的艰难。">> <<elseif _aid is "confront">><<weimar-memory-record "confront" "你质问过他为什么如此软弱。他忘不了那句话。">> <<elseif _aid is "silent_listen">><<weimar-memory-record "listen" "你曾静静地陪着他,什么都没说。他记得那份沉默。">> <</if>> /* 不调 weimar-surface-update:它会按 pending_events 重算 anxiety,干扰对话的精细数值调节 */ /* mood 已由 weimar-mood-refresh 当场刷新 */ <</silently>>\ <</widget>> /* ---------- dialogue-blocked-option:判定动作当前是否应被禁用 ---------- 用法:<<dialogue-blocked-option "comfort">> → set _blocked(true=应禁用)。 触顶即禁用:每日数值额度耗尽($dialogue_spent ≥ $dialogue_cap_daily)或按比例缩放取整后 不再产生任何普通数值变化时,该动作即使被点选也改不动数值——应禁用并在菜单置灰, 避免「选项写了效果,点了却没真正加上」。 复刻 weimar-dialogue-apply 的关系修正 + 缩放判定,须保持两处同步。 特殊数值($dialogue_special_paths)全额生效,不计入额度,故不受此限制。 */ <<widget "dialogue-blocked-option">>\ <<silently>> <<set _ba to $args[0]>> <<set _bact to null>> <<for _i to 0; _i lt $dialogue_actions.length; _i++>> <<if $dialogue_actions[_i].id eq _ba>><<set _bact to $dialogue_actions[_i]>><</if>> <</for>> <<set _blocked to false>> <<if _bact and _bact.effects and Object.keys(_bact.effects).length gt 0>> <<set _has_normal to false>> <<set _has_special to false>> <<set _total to 0>> <<set _all_zero to true>> <<set _ekeys to Object.keys(_bact.effects)>> <<if not _relation>><<weimar-relation-state>><</if>> <<for _ki to 0; _ki lt _ekeys.length; _ki++>> <<set _key to _ekeys[_ki]>> <<if $dialogue_special_paths.includes(_key)>> <<set _has_special to true>> <<else>> <<set _has_normal to true>> <<set _rd to _bact.effects[_key]>> /* 关系修正(与 weimar-dialogue-apply 同步) */ <<if _relation is "怀疑">> <<if (_ba is "comfort" or _ba is "empathize" or _ba is "explain_policy" or _ba is "inform_daily") and _rd lt 0>> <<set _rd to Math.round(_rd * 0.5)>> <</if>> <<if (_ba is "confront" or _ba is "vent") and _key is "npcs.weimar.trust">> <<set _rd to Math.round(_rd * 1.5)>> <</if>> <<elseif _relation is "依赖">> <<if _ba is "comfort" or _ba is "empathize">> <<if _rd lt 0>><<set _rd to Math.round(_rd * 1.5)>><</if>> <<if _key is "npcs.weimar.trust">><<set _rd to Math.round(_rd * 1.5)>><</if>> <</if>> <<if _ba is "confront" and _key is "npcs.weimar.trust">> <<set _rd to Math.round(_rd * 0.5)>> <</if>> <</if>> <<set _total to _total + Math.abs(_rd)>> <</if>> <</for>> <<if _has_normal>> <<set _remaining to Math.max(0, $dialogue_cap_daily - $dialogue_spent)>> <<set _scale to (_total lte _remaining) ? 1 : ((_remaining gt 0) ? (_remaining / _total) : 0)>> <<for _ki to 0; _ki lt _ekeys.length; _ki++>> <<set _key to _ekeys[_ki]>> <<if not $dialogue_special_paths.includes(_key) and _bact.effects[_key] neq 0>> <<if Math.round(_bact.effects[_key] * _scale) neq 0>> <<set _all_zero to false>> <</if>> <</if>> <</for>> <<if not _has_special and (_remaining lte 0 or _all_zero)>> <<set _blocked to true>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- dialogue-effects-label:动作数值标注 ---------- 用法:<<dialogue-effects-label "comfort">> 输出带括号的灰色小字,如 (焦虑-8·疲惫-3·张力-1·你的疲惫+2)。 供对话选项下方标注用,与政党对话的灰色标注风格一致。 */ <<widget "dialogue-effects-label">>\ <<silently>> <<set _la to $args[0]>> <<set _lact to null>> <<for _i to 0; _i lt $dialogue_actions.length; _i++>> <<if $dialogue_actions[_i].id eq _la>> <<set _lact to $dialogue_actions[_i]>> <</if>> <</for>> <<set _map to { "weimar.surface.anxiety":"焦虑", "weimar.surface.fatigue":"疲惫", "weimar.surface.tension":"即时张力", "weimar.mid.democracy_trust":"民主信任", "weimar.mid.army_dependence":"军方依赖", "weimar.mid.intl_trust":"国际信任", "weimar.mid.reform_will":"改革意愿", "weimar.core.will_to_exist":"存续意志", "weimar.core.republic_identity":"共和认同", "weimar.personality_tension":"人格张力", "weimar.self_identity":"自我认同", "npcs.weimar.trust":"魏玛信任", "player.mental.fatigue":"你的疲惫", "player.mental.paranoia":"你的偏执", "player.mental.idealism":"你的理想", "player.mental.isolation":"你的孤独" }>> <<set _label_out to "">> <<if _lact and _lact.effects>> <<set _keys to Object.keys(_lact.effects)>> <<for _i to 0; _i lt _keys.length; _i++>> <<set _k to _keys[_i]>> <<set _d to _lact.effects[_k]>> <<set _zh to _map[_k] ? _map[_k] : _k>> <<if _i gt 0>><<set _label_out to _label_out + "·">><</if>> <<set _label_out to _label_out + _zh>> <<if _d > 0>><<set _label_out to _label_out + "+" + _d>> <<else>><<set _label_out to _label_out + _d>><</if>> <</for>> <</if>> <</silently>>\ @@color:gray;( _label_out )@@\ <</widget>> /* ---------- weimar-dialogue-reply:每动作专属回应池 ---------- 用法:<<weimar-dialogue-reply "comfort">> 从该动作自己的 responses 池中,按魏玛当前状态(calm/anxious/numb)过滤抽取, 避免「质问」和「安慰」都落到同一段通用文本。防重(最近3条)。 输出:$weimar_response(裸文本)与 $weimar_line(带前缀)。 池空/无匹配时回退到通用 weimar-v2-speak。 */ <<widget "weimar-dialogue-reply">>\ <<silently>> <<set _raid to $args[0]>> <<set _ra to null>> <<for _i to 0; _i lt $dialogue_actions.length; _i++>> <<if $dialogue_actions[_i].id eq _raid>> <<set _ra to $dialogue_actions[_i]>> <</if>> <</for>> <<weimar-v2-state>> <<set _tone to _v2_state>> <<if _tone is "fracture">><<set _tone to "calm">><</if>> <<set _pool_all to []>> <<if _ra and _ra.responses>> <<for _i to 0; _i lt _ra.responses.length; _i++>> <<set _r to _ra.responses[_i]>> <<if not _r.tone or _r.tone eq _tone>> <<set _pool_all.push(_r.text)>> <</if>> <</for>> <</if>> <<if not $weimar_action_recent>><<set $weimar_action_recent to []>><</if>> <<set _cands to []>> <<for _i to 0; _i lt _pool_all.length; _i++>> <<if not $weimar_action_recent.includes(_pool_all[_i])>> <<set _cands.push(_pool_all[_i])>> <</if>> <</for>> <<set _picked to "">> <<if _cands.length gt 0>> <<set _picked to _cands[random(0, _cands.length - 1)]>> <<elseif _pool_all.length gt 0>> <<set _picked to _pool_all[random(0, _pool_all.length - 1)]>> <</if>> <<if _picked neq "">> <<set $weimar_response to _picked>> <<set $weimar_line to "魏玛:「" + _picked + "」">> <<set $weimar_action_recent.push(_picked)>> <<if $weimar_action_recent.length gt 3>> <<set $weimar_action_recent.shift()>> <</if>> <<else>> <<weimar-v2-speak>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-dialogue-pick:选池 + 抽取 + 联动 + 防重 ---------- 用法:<<weimar-dialogue-pick "comfort">> 参数:玩家动作id(用于 reaction_tag 联动) 输出:$weimar_dialogue_line(含"魏玛:"前缀) 依赖:pool-draw、$pools.weimar_dialogue_*、$dialogue_turn、$dialogue_recent */ <<widget "weimar-dialogue-pick">>\ <<silently>> <<set _aid to $args[0]>> <<set $weimar_dialogue_line to "">> /* 1. 找当前动作的 reaction_tag */ <<set _rtag to "">> <<for _i to 0; _i lt $dialogue_actions.length; _i++>> <<if $dialogue_actions[_i].id eq _aid>> <<set _rtag to $dialogue_actions[_i].reaction_tag>> <</if>> <</for>> /* 2. 状态判定选主子池(需求文档 §4.3) */ <<set _main_pool to "weimar_dialogue_surface_calm">> <<if $weimar.personality_tension gte $weimar.effective_threshold * 0.8>> /* 接近震荡:核心池 */ <<set _main_pool to "weimar_dialogue_core_trauma">> <<elseif $weimar.surface.fatigue gte 50 and $weimar.surface.anxiety lt 20>> <<set _main_pool to "weimar_dialogue_surface_numb">> <<elseif $weimar.surface.anxiety gte 30 or $weimar.surface.tension gte 50>> <<set _main_pool to "weimar_dialogue_surface_anxious">> <<else>> <<set _main_pool to "weimar_dialogue_surface_calm">> <</if>> /* 3. 深度递进:回合数高时概率切到中层/核心(简化版) */ /* 回合>=2 有概率切中层;回合>=3 有概率切核心(疲劳<60时) */ <<if $dialogue_turn gte 2 and _main_pool.startsWith("weimar_dialogue_surface")>> <<set _depth_roll to random(1, 10)>> <<if _depth_roll lte 3>> <<set _main_pool to "weimar_dialogue_mid_political">> <</if>> <</if>> <<if $dialogue_turn gte 3 and $weimar.surface.fatigue lt 60>> <<set _depth_roll to random(1, 10)>> <<if _depth_roll lte 2>> <<set _main_pool to "weimar_dialogue_core_trauma">> <</if>> <</if>> /* 疲劳>=60 关闭核心池,降级到表层 */ <<if $weimar.surface.fatigue gte 60 and _main_pool.startsWith("weimar_dialogue_core")>> <<set _main_pool to "weimar_dialogue_surface_numb">> <</if>> /* 4. 抽取(最多3次重抽:动作联动 + 防重) */ <<set _picked_entry to null>> <<for _attempt to 0; _attempt lt 3; _attempt++>> <<pool-draw _main_pool 1>> <<if $pool_result.length gt 0>> <<set _cand to $pool_result[0]>> /* 防重检查:最近5条不重复 */ <<if $dialogue_recent.includes(_cand.entry_id)>> /* 命中防重,继续重抽 */ <<else>> /* 动作联动检查 */ <<set _rtag_match to false>> <<if _cand.reaction_tags and _cand.reaction_tags.length gt 0>> <<if _cand.reaction_tags.includes(_rtag)>> <<set _rtag_match to true>> <</if>> <</if>> <<if _rtag_match>> /* 匹配,直接接受 */ <<set _picked_entry to _cand>> <<set _attempt to 3>> <<elseif _attempt eq 2>> /* 最后一次尝试,不管联不联动都接受 */ <<set _picked_entry to _cand>> <</if>> <</if>> <<else>> /* 池空,退出 */ <<set _attempt to 3>> <</if>> <</for>> /* 5. 输出 */ <<if _picked_entry>> <<set $dialogue_recent.push(_picked_entry.entry_id)>> <<if $dialogue_recent.length gt 5>> <<set $dialogue_recent.shift()>> <</if>> <<set $weimar_dialogue_line to "「" + _picked_entry.text + "」">> <<else>> /* 兜底 */ <<set $weimar_dialogue_line to "「……」">> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-report-affairs:功能性报告 ---------- 用法:<<weimar-report-affairs>> 玩家向魏玛报告当天处理的事务,魏玛针对具体事务回应。 逻辑: - 今天没处理任何事 -> 安静日词池 - 处理了事 -> 找最重要的一件(红>黄>白,再按强度) - 若是重大历史事件(R01-R19) -> 定向回复 - 否则 -> 一般事务词池 - 处理了多件 -> 加一句承接 输出:$weimar_dialogue_line */ <<widget "weimar-report-affairs">>\ <<silently>> <<set _resp to "">> <<if not $today_handled or $today_handled.length eq 0>> /* 安静日 */ <<pool-draw "weimar_report_quiet" 1>> <<if $pool_result.length gt 0>> <<set _resp to $pool_result[0].text>> <<else>> <<set _resp to "今天很安静。">> <</if>> <<else>> /* 找最重要的一件 */ <<set _top to $today_handled[0]>> <<for _i to 1; _i lt $today_handled.length; _i++>> <<set _cand to $today_handled[_i]>> <<set _top_prio to 0>> <<set _cand_prio to 0>> <<if _top.level is "red">><<set _top_prio to 3>> <<elseif _top.level is "yellow">><<set _top_prio to 2>> <<else>><<set _top_prio to 1>><</if>> <<if _cand.level is "red">><<set _cand_prio to 3>> <<elseif _cand.level is "yellow">><<set _cand_prio to 2>> <<else>><<set _cand_prio to 1>><</if>> <<if _cand_prio gt _top_prio or (_cand_prio eq _top_prio and _cand.intensity gt _top.intensity)>> <<set _top to _cand>> <</if>> <</for>> /* 定向 or 一般 */ <<set _directed to "">> <<if _top.deck_id and $weimar_report_directed[_top.deck_id]>> <<set _directed to $weimar_report_directed[_top.deck_id]>> <</if>> <<if _directed neq "">> <<set _resp to _directed>> <<else>> <<pool-draw "weimar_report_generic" 1>> <<if $pool_result.length gt 0>> <<set _resp to $pool_result[0].text>> <<else>> <<set _resp to "你处理了那些事。我听着。">> <</if>> <</if>> /* 多件事务承接 */ <<if $today_handled.length gt 1>> <<pool-draw "weimar_report_multi" 1>> <<if $pool_result.length gt 0>> <<set _resp to $pool_result[0].text + " " + _resp>> <</if>> <</if>> <</if>> <<set $weimar_dialogue_line to "「" + _resp + "」">> <</silently>>\ <</widget>> /* ---------- weimar-soften:软化魏玛(P4 核心) ---------- 用法:<<weimar-soften "方向">> 方向:anchor(给方向·稳固认同) / bend(顺党引导·骤降) / vague(含糊·略降) self_identity 下降 = 魏玛掏空 → exposure 阈值上移(P1 已接)、双面惩罚减弱、 魏玛对下一步只轻声问(P3 已接)。 每次软化轻微消耗理想(你在操纵一个国家的灵魂)。 */ <<widget "weimar-soften">>\ <<silently>> <<set _sof_dir to $args[0]>> <<if not $weimar.self_identity>><<set $weimar.self_identity to 80>><</if>> <<set $weimar_soften_text to "">> <<if _sof_dir eq "anchor">> <<set $weimar.self_identity to Math.min(100, $weimar.self_identity + 6)>> <<set $weimar_soften_text to "他重复了一遍你的话,很轻,像在确认自己听清了。然后,他扶着窗框的那只手,慢慢松开了。">> <<elseif _sof_dir eq "bend">> <<set $weimar.self_identity to Math.max(0, $weimar.self_identity - 12)>> <<if $player and $player.mental and $player.mental.idealism>> <<set $player.mental.idealism to Math.max(0, $player.mental.idealism - 3)>> <</if>> <<set $weimar_soften_text to "他安静了很久,然后轻轻应了一声:「……好。」那是他头一回,没有替共和国说话。">> <<else>> <<set $weimar.self_identity to Math.max(0, $weimar.self_identity - 4)>> <<set $weimar_soften_text to "他点点头,没有追问。只是转回窗前的时候,他把肩膀收得很紧。">> <</if>> <</silently>>\ <</widget>> /* ---------- 多轮深聊 ---------- 状态由 Talk_Weimar_Dialogue_Reply 的「继续深聊」直接写入 $weimar_deep_id / $weimar_deep_round, Deep_Talk 场景据此连续渲染(见 75_scenes)。此处不再保留占位 widget。 */
/* 1918年11月9日 · 魏玛诞生 · 第一章 意识流调性:从魏玛意识内部写,感官轰炸,概念具象化。 打字动效 + 延迟显示 + 居中彩色独白。 文本在约6秒内完全展露,玩家自行决定阅读速度; 导航链接常驻可见(不锁在定时器里),随时可以继续或跳过。 文本走改稿接口 67(manuscript/67_章节序章.md),改动文字请走稿子。 */ <<type 5ms>><font color="#FE0C0C"><b>混沌。</b></font><</type>> <<type 5ms>>不是黑暗,也不是光明——是一种粘稠的、没有方向的悬浮,像沉在某种巨大液体的底部,只能感知到远处传来的、被水层层阻隔的模糊波动。<</type>> <<timed 0.8s>>然后,是<font color="#FE0C0C"><b>坠落。</b></font><</timed>> <<timed 1s>><<type 5ms>>悬浮感消散了。一种失控的滑落。温暖被剥离,取而代之的,是刺骨的寒意。<</type>><</timed>> <<timed 1.8s>><<type 5ms>>在呼啸而过的虚无中,<b>碎片</b>来了。<</type>><</timed>> <<timed 2s>><<type 5ms>>不是画面。是感觉:铁锈味、硝烟、泥泞、饥饿。声音也涌进来——尖锐的哨声、沉闷的爆炸、愤怒或绝望的呐喊。还有一种优雅却冰冷的音乐,像玻璃碰撞,正在被更粗粝的声音碾碎。<</type>><</timed>> <<timed 3s>><<type 5ms>>一些清晰的意念试图触碰他,像微弱的光丝。他捕捉到几个词——「人民」、「权利」、「和平」。这些感觉带着一种……<</type>><</timed>> <<timed 3.3s>><<type 5ms>>恳求?<</type>><</timed>> <<timed 3.5s>><<type 5ms>>期待?<</type>><</timed>> <<timed 4s>><<type 5ms>>它们很弱。在坠落的风中摇曳欲灭。<</type>><</timed>> <<timed 4.5s>><<type 5ms>>但更多的,是推搡他的力量。沉重、蛮横。它们不像光丝,更像拳头——裹挟着「叛徒」、「耻辱」、「秩序」这样沉重如铁的词,砸在他的感知上。他加速<font color="#FE0C0C"><b>下坠</b></font>。<</type>><</timed>> <<link "继续" "Scene_Birth_2">><</link>> <<link "重新阅读" "Scene_Birth_1">><</link>> <<link "跳过序章" "Scene_Intro">><</link>>
<<type 5ms>>谁……?<</type>> <<timed 0.3s>>一个模糊的疑问在他混乱的核心中成形。<</timed>> <<timed 0.5s>><<type 5ms>>谁在推我?<</type>><</timed>> <<timed 0.8s>><<type 5ms>>……要去哪里?<</type>><</timed>> <<timed 1.3s>><<type 5ms>>……会<font color="#FE0C0C">死</font>吗?<</type>><</timed>> <<timed 1.8s>><<type 5ms>>这疑问带着本能的恐惧,成为他意识萌芽的第一个清晰印记。<</type>><</timed>> <<timed 2.3s>><<type 5ms>>下坠骤然停止。<</type>><</timed>> <<timed 2.5s>><<type 5ms>>不是撞上了什么。是仿佛落入了一个充满喧嚣的容器里。<</type>><</timed>> <<timed 3s>><<type 5ms>>感官的洪流瞬间淹没了他。<</type>><</timed>> <<link "继续" "Scene_Birth_3">><</link>> <<link "返回上页" "Scene_Birth_1">><</link>>
/* 感官苏醒 · 点击展开三层 */ <<linkreplace "声音">><font color="#FDEC03">声音</font>是第一个清晰起来的。不再是碎片,而是巨大的、混杂的声浪。无数人在呼喊,声音叠在一起,听不清喊的是什么,但声浪炽热滚烫。他后来才想明白,那里面混着兴奋、害怕,和一种还没名字的东西。 然后是更近的声音:鞋底在地板上移动。纸张翻动。有人压低声音交谈,语气紧张。<</linkreplace>> <<linkreplace "气味">><font color="#FDEC03">气味</font>也跟着涌入:陈旧木材和灰尘。廉价的烟草。窗外飘来的城市空气——煤烟、潮湿的石材,以及一种隐约的、像是某种东西在缓慢腐烂的气息。<</linkreplace>> <<linkreplace "睁眼">>他试着「睁开」什么,但他还没有「眼睛」的概念。他只是开始能「看」了——模糊的光影、晃动的轮廓。他感知自己在一个宽敞的、光线不算太亮的房间里。许多人形在晃动,聚集在某个方向。 一种强烈的牵引力将他的注意力拉向窗户旁——那里站着一个深色的人形。那个轮廓深吸了一口气,然后,一个清晰的、带着决绝和颤抖的声音,劈开了围绕着他的噪音,在他的脑海中形成一道烙印: <font color="#FDEC03">「伟大的德意志共和国——万岁!」</font><</linkreplace>> <<link "继续" "Scene_Birth_4">><</link>> <<link "返回上页" "Scene_Birth_2">><</link>>
/* 命名 · 原罪 */ 轰!!! <<timed 0.3s>><<type 5ms>>窗外的声浪骤然拔高。这声音仿佛有某种魔力,与下坠时那些微弱的光丝产生了共鸣。一股微弱但确实存在的力量,伴随呼声注入他模糊的形体,试图让他稳定。<</type>><</timed>> <<timed 0.8s>>\ <center>共和国……</center><</timed>> <<timed 1s>><<type 5ms>>这个词,连同海啸般的声浪,如同烙印,刻入他的核心。<</type>><</timed>> <<timed 1.5s>>\ <center><<type 5ms>>我……是……共和国。 德意志……共和国。 <font color="#FDEC03">魏玛</font><</type>></center><</timed>> <<timed 2.3s>><<type 5ms>>名字随之而来。不是因为此地——他在柏林。是因为他知道,一个即将定义他存在的、名为「宪法」的东西,将在那个叫魏玛的地方被写出来。<</type>><</timed>> <<timed 3s>><<type 5ms>>新生的感觉像微弱的电流,试图贯通他。但这感觉太脆弱了,仿佛薄冰——覆盖在坠落恐惧和冰冷的推搡感之上。<</type>><</timed>> <<timed 3.5s>><<type 5ms>>还没等他仔细体会这「出生」,一些冰冷的低语,像细碎的冰锥,从房间的角落刺入他的感知。这些低语不是通过耳朵听见的,而是直接在意识里响起:<</type>><</timed>> <<timed 4s>>\ 「……就是他……」 「……陛下去世了……他就出现了……」 「……篡位者……」 「……承载着耻辱诞生的东西……」<</timed>> <<timed 4.5s>><<type 5ms>>这些低语充满憎恨、鄙夷,还有一种打量劣质品的冷漠。<</type>><</timed>> <<timed 5s>>\ <center><font color="#FE0C0C">帝国……死了? 我……是<b>罪魁祸首</b>?</font></center><</timed>> <<timed 5.5s>><<type 5ms>>又一个沉重的烙印覆盖在「共和国」这个名字之上。他不知道「帝国」是谁,不知道「死」对他意味着什么。但那浓烈的指责,像滚烫的沥青,泼在他新生的意识上。<</type>><</timed>> <<timed 6.3s>><<type 5ms>>几乎同时,另一些热切得近乎滚烫的意念也靠近了。不像低语那样隐蔽,而是带着公开的、急于灌输的冲动:<</type>><</timed>> <<timed 6.5s>>\ 「共和国!这只是开始!」 「必须彻底砸碎旧的国家机器!」 「学习东边的榜样!这才是真正的未来!」 「你能做到的!带领我们继续前进!」<</timed>> <<timed 7s>><<type 5ms>>这些意念充满燃烧般的激情,一种要打破一切、重塑一切的渴望。继续前进?走向哪里?他体内那微弱的新生力量,与这种激烈的主张并不完全同调。他本能渴望的,是某种稳定,某种能让各种声音不至于互相撕裂的框架。<</type>><</timed>> <<timed 7.5s>><<type 5ms>>热切与恶意同时灌进来。一片声音要把他往前推,推向没见过的前路;另一片要把他往回拖,拖回已经塌掉的昨天。他被夹在中间,还没站稳。<</type>><</timed>> <<link "继续" "Scene_Birth_5">><</link>> <<link "返回上页" "Scene_Birth_3">><</link>>
/* 羁绊 · 重负 */ <<timed 0.3s>><<type 5ms>>一个温和但带着深深疲惫的意念靠近了他。他「看」到一个模糊的、穿深色外套的人形,脸上带着紧张后的松弛和巨大的忧虑。<</type>><</timed>> <<timed 0.8s>>\ 「共和国,」这个意念传过来,带着确认的意味,像在呼唤他的名字,「得让一切尽快上轨道。外面的人支持我们,但局势……非常脆弱。」<</timed>> <<timed 1.8s>><<type 5ms>>共和国。他现在知道这是他的名字了。他做出了回应——不是通过语言,而是一种意念的微微振动。他能感受到窗外人群的躁动不安,感受到这座城市深处弥漫的焦虑、饥饿、愤怒和迷茫。这些纷乱的情绪开始汇入他新生的意识,成为他的一部分,也成为他沉重的负担。<</type>><</timed>> <<timed 2.8s>>\ <center><font color="#FE0C0C">谁推搡我下坠? 谁……杀死了帝国?</font></center><</timed>> <<timed 3.3s>><<type 5ms>>这两个问题,如同两个漩涡,在他诞生之初就盘踞在意识核心,与「我是谁」、「我该往何处去」紧紧缠绕,无法分离。<</type>><</timed>> <<timed 4.3s>><<type 5ms>>一种无形的力量牵引着他,向门口、向那扇传来欢呼的窗户移动。他的「步伐」生涩。他感觉那些冰冷的恶意目光依旧黏在背后。他也感觉那股灼热,像火,烤着他的侧翼。<</type>><</timed>> <<timed 5s>><<type 5ms>>下坠的眩晕感仍在灵魂深处回荡。那些推搡的力量只是暂时隐匿在阴影里,并未远离。<</type>><</timed>> <<timed 5.5s>><<type 5ms>>稳定。共和国。这是他此刻最本能的目标。他得先站稳,再往前走。<</type>><</timed>> <<link "继续" "Scene_Birth_6">><</link>> <<link "返回上页" "Scene_Birth_4">><</link>>
/* 迈步 · 开始 */ <<type 5ms>>但首先,他必须走出去,面对这个将他视为不速之客、弑君者、希望与灾难混合体的世界。<</type>> <<timed 0.5s>><<type 5ms>>他无形中深吸了一口气,感知着空气中硝烟味、汗味、旧时代的尘埃,以及一种新事物在废墟上挣扎求生的、尖锐而脆弱的气息。<</type>><</timed>> <<timed 1.3s>><<type 5ms>>他的共和国,开始了。<</type>><</timed>> <<timed 1.8s>>\ <center><<type 5ms>>在混沌中惊醒。 在坠落中成形。 在罪名中得名。<</type>></center><</timed>> <<timed 2.5s>><<type 5ms>>那促使他苏醒的下坠感还在,两个问题也还没有答案。它们像烙印,从他诞生的那天起烙在身上,往后许多年,也抹不干净。<</type>><</timed>> <<timed 3.3s>>\ <<if $stage.id eq "S2">><center>-- 共和国第二年 --</center>\ <<elseif $stage.id eq "S4">><center>-- 共和国第六年 --</center>\ <<elseif $stage.id eq "S5">><center>-- 共和国第十一年 --</center>\ <<elseif $stage.id eq "S6">><center>-- 共和国第十四年 --</center>\ <<else>><center>-- 共和国第五年 --</center><</if>> <</timed>> <<timed 3.8s>>\ <<if $stage.id eq "S2">>\ //1920年1月。柏林。共和国第二年。一切刚刚开始。//\ <<elseif $stage.id eq "S4">>\ //1924年1月。柏林。共和国第六年。短暂的喘息。//\ <<elseif $stage.id eq "S5">>\ //1929年1月。柏林。黄金的余热已尽数褪去。//\ <<elseif $stage.id eq "S6">>\ //1932年1月。柏林。一个被推到悬崖边的共和国。//\ <<else>>\ //1923年1月。柏林。共和国第五年。最凶的一年,来了。//\ <</if>><</timed>> <<if $stage.id eq "S2">>\ <<link "走进1920" "Scene_Intro">><</link>> <<elseif $stage.id eq "S4">>\ <<link "走进1924" "Scene_Intro">><</link>> <<elseif $stage.id eq "S5">>\ <<link "走进1929" "Scene_Intro">><</link>> <<elseif $stage.id eq "S6">>\ <<link "走进1932" "Scene_Intro">><</link>> <<else>>\ <<link "走进1923" "Scene_Intro">><</link>> <</if>>\ <<link "重新阅读序章" "Scene_Birth_1">><</link>>
/* 开场 · 序章后的第一幕(按 $stage 切换年份与基调) S2=1920年1月 两岁 条约压顶;S3=1923年1月 五岁 鲁尔危机前夜; S4/S5/S6 为未来章节预埋的文案梯子(章节未建成,暂不可达)。 */ <<if $stage.id eq "S2">> <span class="scene-stamp">1920年1月。柏林。</span> //两年了。// //威廉街七十七号的窗前,立着一个背影。米色风衣,领子竖起,帽檐压得很低——你分辨不清那是一个人的轮廓,还是这间办公室在灰白天光里投下的一道阴影。他的手指在蒙雾的窗玻璃上擦开一小块,动作很慢,像是这个动作本身就需要他全部的注意力。// //窗外,一月的风把行人的脖子削短了一截。卖报童的嗓门比风还利,喊的是协约国又要开会——名单、赔款、军队人数,每一项都拴着绳子,绳子的另一头攥在巴黎手里。停战只是停了枪。凡尔赛的墨迹早就干了,账单却还在一张一张寄过来,像是某种不会结痂的伤口。// //桌上摆着今天的电报。军队在说他们管不住右翼的民兵,右翼的民兵说他们只听军队的。两边都说自己在保卫共和国,可共和国究竟是谁,还有待商榷。// //魏玛没有回头。他的轮廓在窗光里仍然单薄。// <span class="txt-calm">「我很好奇此刻你在想什么?」</span>//他问,还是没有回头。// //你没有回答。你在想很多事情,但它们缠在一起,像一团湿了水的线,找不到可以拉动的线头。// //赔款。条约。军队。民兵。左边右边都在向他逼近。而你站在中间,只感到塌陷的预兆。// <span class="txt-calm">「这一次,」</span>//魏玛转过身来,眼里还带着一些你现在还无法理解的东西,//<span class="txt-calm">「你是否会一直站在我这边?」</span> //你看着桌上的文件。看着窗外的灰。看着这个走到第二年却已无处可退的共和国。// //然后,你坐了下来。// <<elseif $stage.id eq "S4">> <span class="scene-stamp">1924年1月。柏林。</span> //新钱刚落地。街上的面包房重新支起了秤,秤是准的。// //魏玛站在威廉街77号的窗前。他瘦了,但站得直。// //桌上的电报不再谈马克了。它们谈赔款、谈贷款、谈军队的人数——有人开始谈明年了。// <span class="txt-calm">「你在想什么?」</span>//他问,转头看了一眼桌上的电报。// <span class="txt-calm">「这一次,」</span>//魏玛转过身来,眼里有一点去年没有的东西,//<span class="txt-calm">「你是否会站在我这一边?」</span> //你看着桌上的文件。看着窗外的光。看着这个刚有了一点好转的共和国。// //然后你在他对面坐了下来。// <<elseif $stage.id eq "S5">> <span class="scene-stamp">1929年1月。柏林。</span> //冬天照旧。街上的队列比去年整齐,也比去年安静。// //魏玛站在威廉街77号的窗前。他学会了在窗前站得很稳,稳得几乎看不出累。// //桌上的电报来自大洋对岸:股市涨得很高,高得让人不敢往下看。// <span class="txt-calm">「你在想什么?」</span>//他问,声音比去年平了很多。// <span class="txt-calm">「这一次,」</span>//魏玛转过身来,眼睛里有久违的一点亮,//<span class="txt-calm">「你是否会站在我这一边?」</span> //你看着桌上的文件。看着窗外的灰。看着这个以为自己终于走稳了的共和国。// //然后你照例坐了下来。// <<elseif $stage.id eq "S6">> <span class="scene-stamp">1932年1月。柏林。</span> //冬天照旧,只是更长了。街上的队伍一眼望不到头,臂章的颜色比旗帜还多。// //魏玛站在威廉街77号的窗前。他站得直——用尽全力的那种直。// //桌上的电报不用拆。总理的名字又换了,议会在解散和选举之间打转。// <span class="txt-calm">「你在想什么?」</span>//他问,声音哑得几乎听不见。他的手扶着窗框,指节发白。// <span class="txt-calm">「这一次,」</span>//魏玛转过身来,眼睛陷得很深,//<span class="txt-calm">「你是否会站在我这一边?」</span> //你看着桌上的文件。看着窗外的灰。你有点看不清共和国的轮廓了。// //然后你坐了下来——这一次,椅子比哪一年都凉。// <<else>> <span class="scene-stamp">1923年1月。柏林。</span> //五年了。// //魏玛站在威廉街77号的窗前。窗玻璃上有雾气,他用手指擦了一小块,往外看。// //窗外,一月的风把行人的脖子削短了一截。你听不清街边的报童在喊什么--你不想听清。你知道那不会是好数字。// //新闻持续更新着马克下跌的速度。// //桌上摆着今天的电报:法国人准备进入鲁尔,比利时人跟在后面。他们说要「保证」赔款支付。你知道「保证」是什么意思。// //魏玛没有回头。他的轮廓在窗光里比五年前更薄了。// <span class="txt-calm">「此时此刻你在想什么?」</span>//他问,没有回头。// //你没有回答。你在想很多事情,但它们搅在一起,像一团湿了水的线。// //鲁尔。赔款。马克。工人。军队。左边右边都在伺机行动,你站在中间的那地板,只感到脚下吱呀响,像随时会从中间裂开。// <span class="txt-calm">「这一次,」</span>//魏玛转过身来,眼里没有疲惫,或者说,疲惫已经沉到了更下面的地方,浮上来的是一种你不太敢确认的东西:像是早就知道结局,却还在等别人先开口。//<span class="txt-calm">「你会替我选择哪条道路?」</span> //你看着桌上的文件。看着窗外的灰。看着这个在混乱中挣扎五年,疲惫的共和国。// //然后你坐了下来。// <</if>> <<if not $tutorial_done>>\ <<link "走进办公室" "Scene_Tutorial">> <</link>>\ <<else>>\ <<link "走进办公室" "Scene_Office">> <</link>>\ <</if>>
/* ════════════════════════════════════════════════════════════ 开场引导 · 一页纸 魏玛亲自演示一轮,让玩家在对话中学会"处理一件事"的基本循环 ════════════════════════════════════════════════════════════ */ //雪还没停。你站在门口。// //窗外的街道上,声音一层一层涌上来——口号、脚步、哨子,混成一片低沉的嗡响。他听了一会儿,才开口://<span class="txt-calm">「楼下的事,你也听到了。」</span> //他拿起桌上一张纸,是秘书处刚送来的简报,边角还带着油墨味。// <span class="txt-calm">「你先看看。」</span>//他转过身,把纸递给你。语气像是在说一件已经发生过的事。// <span class="txt-calm">「你不需要知道规则。你只需要知道每件事都要有个去向。」</span> //纸上只有寥寥数字:// //「威廉街七十七号外约四百人聚集,本次由社民党左翼与独立社民党联合发起,口号针对凡尔赛条约与赔款政策。警方在场尚未干预。游行组织预计入夜前散去。」// //很简单。但即便是很小的事你也要决定它怎么过去。// <hr> <<link "📝 签个字,记下这场集会" "Scene_Tutorial_Result">> <<set $tutorial_choice to "sign">>\ <</link>> <<link "📤 转给内政部与警方酌情处理" "Scene_Tutorial_Result">> <<set $tutorial_choice to "delegate">>\ <</link>> <<link "📂 先放一边,明天再说" "Scene_Tutorial_Result">> <<set $tutorial_choice to "delay">>\ <</link>>
/* ════════════════════════════════════════════════════════════ 引导反馈 · 三轮演示收束 每种选择拆成四段:叙事(_story) → 魏玛的话(_weimar,自动青色) → 收尾(_tail) → 教学点(_note,自动金色)。文本走改稿接口 67。 教学闭环绕回办公室 ════════════════════════════════════════════════════════════ */ <<silently>> <<set $tutorial_done to true>> <<if $tutorial_choice eq "sign">> <<set _learn_insider to 3>> <<set _learn_story to "你拿起笔,在简报上划了一道。魏玛听到了你批阅的书写声,他走过来,看了眼你的签字。没作出评价,将它折好,放在桌上的「待处理」那摞文件最上面。">> <<set _learn_weimar to "「好,这件事过去了。」他回到窗边,声音听起来轻松一点。楼下传来一阵短暂的骚动,随即又平了下去。">> <<set _learn_tail to "">> <<set _learn_note to "你花了少许时间来处理这场小事,但你的名字已经跟着这份简报进了警方的档案。楼下的人不会被抓走,但他们会知道共和国注意到了他们。祝贺你,这是你在共和国留下的第一个痕迹。">> <<elseif $tutorial_choice eq "delegate">> <<set _learn_insider to 3>> <<set _learn_story to "你没有签字,相反你在简报上补了一行字:「请内政部与警方酌情处理」。\n\n魏玛拿起来看,没有说话。他把简报放到了桌子的另一侧,和那摞待处理的文件分开了。隔着一摞文件,他问你:">> <<set _learn_weimar to "「你相信内政部有他们的判断,警方也有自己的分寸。也好,不论今天还是明天,又或许拖到有人先动手,这群人都会散的。」">> <<set _learn_tail to "他靠回椅背,手指在桌沿上敲了一下,没有再说下去。">> <<set _learn_note to "你让出控制换取时间。这件事会有人处理,只是不一定按你的步调。">> <<else>> <<set _learn_insider to 0>> <<set _learn_story to "你把简报放回了桌上。没有签字也没有转交,更没有处理。">> <<set _learn_weimar to "「你什么都没做。你自己知道自己没有解决,只是推迟。」">> <<set _learn_tail to "他拿起简报,把它放进了抽屉。一个更深的抽屉,不是「待处理」那一摞。关上抽屉的声音很轻,像一声叹气。">> <<set _learn_note to "楼下的口号声还会继续。今晚明天都不会停。但倘若你一直沉默,等到有人替你做决定的那天,你就再也发不出任何声音了。">> <</if>> /* 收尾:消耗时间、魏玛分担疲惫、知情者入账 */ <<tp-spend 1 2>> <<set $weimar.surface.fatigue to Math.min(100, $weimar.surface.fatigue + 2)>> <<if _learn_insider gt 0>> <<tag-add "知情者" "micro" _learn_insider "玩家行为" "weimar" "tutorial">> <<set $active_tags to $ret>> <</if>> <</silently>>\ <em><<print _learn_story>></em> <span class="txt-calm"><<print _learn_weimar>></span> <<if _learn_tail neq "">><em><<print _learn_tail>></em> <</if>><span class="teaching-note"><<print _learn_note>></span> //魏玛站回窗边。// <span class="txt-calm">「这就是每天的事。文件、选择、后果。有时候小到换一纸公文,有时候大到楼下站满了人,你迟早会知道的。」</span> //他侧过头来看你,窗外的光把他的脸切成两半。// <span class="txt-calm">「会了吗?」</span> //没等你回答,他转了回去。// <span class="txt-calm">「去忙吧。今天的事不止这一件。」</span> <<link "出门之前" "Scene_Tutorial_Year">><</link>>
/* ════════════════════════════════════════════════════════════ 年关 · 三句托付(框架共用,三件事按 $stage 切换) 教玩家「这一年在为什么而活」:三条命线与后台危机系统一一对应。 只在教程后第一次进办公室前出现一次。 ════════════════════════════════════════════════════════════ */ <<silently>> <<set $year_mission_done to true>> <</silently>>\ //你走到门口,手已经搭上了门把。// //魏玛的声音从背后传来。这次不是在说楼下的事。// <span class="txt-calm">「等一下。」</span> //他走到桌前,把摊着的日历合上了。一年,三百多页,被他合在掌心底下。// <span class="txt-calm">「今年年底,我会再问你一次今天问过的话。你是否会站在我这一边。」</span> //他伸出三根手指,一根一根按在桌面上。// <<if $stage.id eq "S2">>\ <span class="txt-calm">「条约。赔款的名单一年定一次,军队的人数一年数一遍。巴黎说一个数,我们就得低头。但它压着的不只是钱--是街上的人肯不肯再忍。这是第一件。」</span> <span class="txt-calm">「民兵。仗打完了,枪没有收回来。右翼的民兵在乡下练队形,名单在咖啡馆之间传来传去。他们杀的不是我--他们杀说共和国好话的人。这是第二件。」</span> <span class="txt-calm">「将军们。他们在等一个借口。宪法的缝里塞着一支军队,只要有人给他们递台阶,他们就会自己走下来。别给他们。这是第三件。」</span> <<elseif $stage.id eq "S4">>\ <span class="txt-calm">「新钱。它在柜台上站住了,还没在人心里站住。别让信心再断一次——断过一次的国家,再没有便宜的信用。这是第一件。」</span> <span class="txt-calm">「安静。街上的枪声停了,收枪的手还没停。谁在攒名字、攒名单,你要比我先知道。这是第二件。」</span> <span class="txt-calm">「将军们。他们学会了向共和国敬礼,可敬礼和服从是两回事。盯紧他们的账本和操典。这是第三件。」</span> <<elseif $stage.id eq "S5">>\ <span class="txt-calm">「工作。队伍从劳动局门口排到街角,一天比一天长。他们要的不是解释,是活干。这是第一件。」</span> <span class="txt-calm">「选票。饿的人会用愤怒投票,左边右边都一样。别让喊得最响的人,领走饿得最狠的人。这是第二件。」</span> <span class="txt-calm">「议会。它越来越瘫了。每一张否决票,都在替等台阶的人铺路。这是第三件。」</span> <<elseif $stage.id eq "S6">>\ <span class="txt-calm">「我自己。我比你看上去的更接近散架。今年,别再让我一个人撑着。这是第一件。」</span> <span class="txt-calm">「宪法。它剩下的每一页都有人想要。你手里的每一笔,都在决定它最后剩多少。这是第二件。」</span> <span class="txt-calm">「之后。无论今年怎么收场,总得有人活下去,替我记住这一切。这是第三件。」</span> <<else>>\ <span class="txt-calm">「街头运动混着左右两边的人,他们都在等一个时机。听他们喊什么比劝他们别喊管用,反正他们最终的目标都会是我。这是第二件。」</span> <span class="txt-calm">「将军们还在等台阶。谁递他们就敢下,所以别递——但也别让旁人看出你在提防这群旧势力。防出来的兵变比等出来的更糟。这是第三件。」</span>\ <</if>>\ //他把日历推到桌角,像把一件重物放下了。// <span class="txt-calm">「这三件,你替我看着。文件会来找你,人也会来找你。哪些是小事,哪些是这三件的事--你自己分辨。」</span> <span class="txt-calm">「我不要求你全做到。没有人能做到。」</span>//他顿了顿,声音低下去。// <span class="txt-calm">「但你要知道自己在看着什么。不然这一年过去,你只是在盖章。」</span> <<if $stage.id eq "S2">>\ <span class="teaching-note">这是这一年的三件事:条约、暗杀、军队。右下角「国家趋势」里的数字,就是这三件事的体温计。年底,魏玛会问你要答案。</span>\ <<elseif $stage.id eq "S4">>\ <span class="teaching-note">这是这一年的三件事:新钱、暗流、军队。右下角「国家趋势」里的数字,就是这三件事的体温计。年底,魏玛会问你要答案。</span>\ <<elseif $stage.id eq "S5">>\ <span class="teaching-note">这是这一年的三件事:工作、选票、议会。右下角「国家趋势」里的数字,就是这三件事的体温计。年底,魏玛会问你要答案。</span>\ <<elseif $stage.id eq "S6">>\ <span class="teaching-note">这是这一年的三件事:我、宪法、之后。右下角「国家趋势」里的数字,就是这三件事的体温计。年底,魏玛会问你要答案。</span>\ <<else>>\ <span class="teaching-note">这是这一年的三件事:货币、民心、军队。侧边栏「国家趋势」里的数字会体现它们。年底,魏玛会问你要答案。</span>\ <</if>> <<link "走进办公室" "Scene_Office">><</link>>
/* 全局检查:只在疲惫>=100时强制送回休息(TP=0不强制) */ <<silently>> <<set _force_return to false>> <<if $player.mental.fatigue gte 100>> <<set _current_passage to passage()>> <<if _current_passage.startsWith("Region_") or _current_passage is "Scene_RegionSelect">> <<set _force_return to true>> <</if>> <</if>> <</silently>>\ <<if _force_return>>\ //你撑不住了。腿在发软,视线在模糊。// //总理府的车不知道什么时候已经停在街口。你被扶上了后座。// <<goto "Scene_Rest">>\ <</if>>
/* ════════════════════════════════════════════════════════════ 办公室晨报仪式 · 仅在第一天开场翻页 把长叙事(晨报全文/周主题/侧写/黎明叙述)从"操作台"剥离, 做成翻页的晨报,读完才进干净的操作台。 之后每天进办公室不再自动弹出,改由资料室翻阅。 ════════════════════════════════════════════════════════════ */ <<silently>> <<tp-phase-name>><<tp-fatigue-status>><<tp-phase-bonus>> <<weekday>> <</silently>>\ ''晨报 · <<datestr>> · 星期_wd'' <<fate-digest>>\ <<morning-report>>\ <<link "继续" "Scene_Morning_Papers_2">><</link>>
/* 晨报仪式第二页:周主题 + 黎明叙述 + 侧写 */ <<silently>><<weekly-theme>><</silently>>\ <<if $weekly_text neq "">>\ <hr> <<set _wtp to $weekly_text.split("\n\n")>>\ <<for _wti to 0; _wti lt _wtp.length; _wti++>>\ //<<print _wtp[_wti]>>// <</for>>\ <</if>>\ <<narrate-dawn>>\ <<if $act_report neq null>>\ <hr> ''魏玛共和国 · 第$act_report.act幕「$act_report.act_name」侧写报告'' ''生成日期:$act_report.date'' <hr> ''【表层·今日情绪】'' //$act_report.mood_text// ''【中间层·生存策略】'' 民主信任度:$act_report.democracy · 军队依赖度:$act_report.army 国际信任度:$act_report.intl · 改革意愿:$act_report.reform //$act_report.strategy_text// ''【核心层·不可动摇之物】'' 国家存续意志:$act_report.will · 共和认同:$act_report.identity ''【下幕预告】'' //$act_report.next_text// <<set $act_report to null>>\ <</if>> <span class="scene-stamp">威廉街77号。总理府。</span> <<link "收好报纸,走进办公室" "Scene_Office">><</link>>
<<silently>> <<if $chapter_ending_triggered>>\ <<goto "End_Chapter1">>\ <</if>>\ <<if $session_review.pending and not $session_review.in_review>>\ /* 有国会审议待处理:强制跳转审议日提示页(玩家可选去/不去) */ <<goto "Scene_Review_Prompt">>\ <</if>>\ <<shadow-init>>\ <<if $shadow_cabinet.unlocked and $shadow_cabinet.exposure gte 100>>\ /* 影子内阁视线攒满:强制对质(92_shadow_cabinet) */ <<goto "Scene_Shadow_Exposed">>\ <</if>>\ <<if not $reception_done and $session_day gte 4>>\ /* 首周第4天:魏玛的政党招待会(零和第一课,强制触发) */ <<set $reception_pending to true>>\ <<goto "Scene_Reception">>\ <</if>>\ <<if not $office_morning_done>>\ /* 第一天:先走晨报翻页仪式,再进操作台 */ <<set $office_morning_done to true>>\ <<goto "Scene_Morning_Papers">>\ <</if>>\ <<tp-phase-name>><<tp-fatigue-status>><<tp-phase-bonus>>\ <<weekday>>\ <</silently>>\ <<secret-demand-render>><<secret-exposed-render>>\ /* 大联盟代言人:激活后随机一位温和党代表四党说一段新话(只显示一次) */ <<covenant-chaperone-text>>\ <<if $covenant_chaperone_text neq "" and not $covenant.spokesman_shown>>\ <<set $covenant.spokesman_shown to true>>\ <hr> //$covenant_chaperone_text// <hr>\ <</if>>\ <span class="scene-stamp">威廉街77号。总理府。</span> /* 好感卡组:擦肩反应(每天至多一张灰字)+ 跨档瞬间冲刷(金框,漏网兜底) */\ <<aff-draw "office">>\ <<cross-tier-flush>>\ /* 关系冷却/回温提示:隔夜有漂移时出现一行小字(读后清) */\ <<drift-report-render>>\ /* ═══════════ 今日速览条(一眼看到今天要干啥) ═══════════ */\ <<silently>> /* 魏玛是否有话要主动质问(治理极差时,出门前/会客区提示) */ <<weimar-question-pending>>\ /* 邀约计数:统计所有待处理密谈/盟约/邀约 */ <<set _wait_count to 0>>\ <<if $party_milestones and $party_milestones.dnvp and ($party_milestones.dnvp.arc_state eq "offered" or ($party_milestones.dnvp.arc_state eq "pulling" and (not $dnvp_last_trial_day or $session_day gt $dnvp_last_trial_day)))>><<set _wait_count to _wait_count + 1>><</if>>\ <<if $party_milestones and $party_milestones.kpd and ($party_milestones.kpd.arc_state eq "offered" or ($party_milestones.kpd.arc_state eq "pulling" and (not $kpd_last_day or $session_day gt $kpd_last_day)))>><<set _wait_count to _wait_count + 1>><</if>>\ <<if $party_milestones and $party_milestones.spd and $party_milestones.spd.arc_state eq "offered">><<set _wait_count to _wait_count + 1>><</if>>\ <<if $party_milestones and $party_milestones.ddp and $party_milestones.ddp.arc_state eq "offered">><<set _wait_count to _wait_count + 1>><</if>>\ <<if $party_milestones and $party_milestones.dvp and $party_milestones.dvp.arc_state eq "offered">><<set _wait_count to _wait_count + 1>><</if>>\ <<if $party_milestones and $party_milestones.zentrum and $party_milestones.zentrum.arc_state eq "offered">><<set _wait_count to _wait_count + 1>><</if>>\ <<if $party_milestones and $party_milestones.nsdap and $party_milestones.nsdap.arc_state eq "offered">><<set _wait_count to _wait_count + 1>><</if>>\ <<if $party_milestones and $party_milestones.army and $party_milestones.army.arc_state eq "offered">><<set _wait_count to _wait_count + 1>><</if>>\ <<if $npcs.weimar.trust lte 30 and ($dnvp_pull gt 0 or $kpd_pull gt 0) and not $weimar_betray_talk_done>><<set _wait_count to _wait_count + 1>><</if>>\ <<if $npcs.spd.trust lte 20 and ($npcs.dnvp.trust gte 60 or $npcs.kpd.trust gte 60 or $spd_covenant) and not $spd_distrust_talk_done>><<set _wait_count to _wait_count + 1>><</if>>\ <<if $secret_demand_text neq "">><<set _wait_count to _wait_count + 1>><</if>>\ <<if $secret_exposed_text neq "">><<set _wait_count to _wait_count + 1>><</if>>\ /* 限期待办计数:必须处理的(许诺/历史巨浪) */ <<set _must_count to 0>>\ <<for _i to 0; _i lt $pending_events.length; _i++>>\ <<set _pe to $pending_events[_i]>>\ <<if (_pe.level is "promise" or (_pe.deck_id and _pe.deck_id.indexOf("P") eq 0)) or (_pe.deck_id and (_pe.deck_id.indexOf("R") eq 0 or _pe.deck_id.indexOf("S") eq 0 or _pe.deck_id.indexOf("C") eq 0)) or _pe.source eq "historical" or _pe.source eq "swell" or _pe.source eq "crisis">>\ <<set _must_count to _must_count + 1>>\ <</if>>\ <</for>>\ <<set _all_count to $pending_events.length>>\ <</silently>>\ <div class="office-dash">\ <!-- #UI: 可在此插入英雄图/背景图 --> <div class="dash-hero-media"></div>\ <div class="dash-statstrip">\ <span class="dash-date"><b>■ 今日</b> · <<datestr>> · 星期_wd</span>\ <span class="stat-grid">\ <span class="stat-item"><span class="stat-label">行动点</span><span class="stat-val"><<if $tp gt $tp_max>><<print Math.round($tp * 10) / 10>>点<span class="txt-muted">(攒的,上限 $tp_max)</span><<else>><<print Math.round($tp * 10) / 10>>/<b>$tp_max</b><</if>></span></span>\ <span class="stat-item"><span class="stat-label">限期待办</span><span class="stat-val">_must_count <b>件</b></span><<if _must_count gt 0>><span class="badge badge-red">必</span><</if>></span>\ <span class="stat-item"><span class="stat-label">邀约</span><span class="stat-val">_wait_count <b>场</b></span><<if _wait_count gt 0>><span class="badge badge-orange">可</span><</if>></span>\ <span class="stat-item"><span class="stat-label">纸面案</span><span class="stat-val">_all_count <b>件</b></span></span>\ </span>\ <span class="dash-hint">限期待办不可跳过,错过要付出代价;邀约可选,可能改变某党的信任。</span>\ </div>\ <details class="dash-morning" open>\ <summary>柏林晨报 · <<datestr>>(点此收合)</summary>\ <<morning-embed>>\ </details>\ /* 第48条教学 · 第0拍:解锁前的保证性伏笔(9月10日起、R09发牌前、一次性) */ <<if not $flags.a48_plant_done and $a48 and not $a48.held>>\ <<silently>> <<set _a48_plant to false>> <<for _apd to 0; _apd lt $event_deck.length; _apd++>> <<if $event_deck[_apd].id eq "R09" and not $event_deck[_apd].dealt>><<set _a48_plant to true>><</if>> <</for>> <</silently>>\ <<if _a48_plant and $date.month eq 9 and $date.day gte 10>>\ <hr>\ //早上的光斜落在桌角。魏玛站在窗前,背对着你,忽然开了口。// <span class="txt-calm">「宪法第48条。建国那年写下的最后一件武器。这些年它一直躺在抽屉最底层——我但愿它永远躺在那里。」</span> //他没有再解释。楼下街口,有人在卖号外。//\ <hr>\ <<set $flags.a48_plant_done to true>>\ <</if>>\ <</if>>\ <<if _must_count gt 0>>\ <div class="dash-quick"><span class="badge badge-red">必</span> <span class="dash-hint">限期待办不可跳过,错过要付出代价。</span> <span class="dash-actions"><<link "▶ 先处理限期待办" "Scene_Files">><</link>></span></div>\ <</if>>\ <<if _force_rest>>\ //膝盖先软的。然后是眼皮。你扶着墙,但墙也在动。// //秘书叫了车。你被扶上了后座。// <<link "睡过去" "Scene_Rest">><</link>> <<else>>\ <<silently>> /* 检查待办里有没有红色事件(必须处理,不能跳过) */ <<set _has_red to false>>\ <<set _has_minor to false>>\ <<set _has_promise to false>>\ <<for _i to 0; _i lt $pending_events.length; _i++>>\ <<set _pe to $pending_events[_i]>>\ <<if (_pe.level is "promise" or (_pe.deck_id and _pe.deck_id.indexOf("P") eq 0))>>\ <<set _has_promise to true>>\ <<elseif (_pe.deck_id and (_pe.deck_id.indexOf("R") eq 0 or _pe.deck_id.indexOf("S") eq 0 or _pe.deck_id.indexOf("C") eq 0)) or _pe.source eq "historical" or _pe.source eq "swell" or _pe.source eq "crisis">>\ <<set _has_red to true>>\ <<else>>\ <<set _has_minor to true>>\ <</if>>\ <</for>>\ <</silently>>\ /* ═══════ 今日要务(横贯双列 hero 卡) ═══════ */\ <div class="dash-card dash-hero">\ <!-- #UI: 可在此插入今日配图/图标 --> <span class="dash-chip">今日要务</span>\ <<if _has_promise or _has_red>>\ <span class="dash-desc">\ <<if _has_promise>><span class="badge badge-red">♔</span> 有许诺待处理,不可跳过。\ <<else>><span class="badge badge-red">红</span> 有历史巨浪待处理,不可跳过。<</if>>\ </span>\ <span class="dash-hint">限期待办不可跳过,错过要付出代价。</span>\ <span class="dash-actions"><<link "► 处理待办事项(<<print $pending_events.length>> 件)" "Scene_Files">><</link>></span>\ <<else>>\ <<if $pending_events.length gt 0>>\ <span class="dash-desc">有 $pending_events.length 件次等事务。你可以去处理,也可以直接跳到下一个红色事件--跳过的话,它们会各自了结(或者不会)。</span>\ <span class="dash-actions"><<link "► 处理待办事项(<<print $pending_events.length>> 件)" "Scene_Files">><</link>></span>\ <<else>>\ <span class="dash-desc">文件篮是空的。今日无紧急待办。</span>\ <<if $tp gte 3>>\ <span class="dash-hint">空闲的日子是资本。出门走走、见见人、翻翻报纸--很多线索不在文件里,在街上、在待客室里、在魏玛的话里。</span>\ <<else>>\ <span class="dash-hint">案头清了。趁着天没黑,还来得及去做一件今天不做、以后就要花大钱办的事。</span>\ <</if>>\ <</if>>\ <span class="dash-actions">\ <<if $pending_events.length eq 0>>\ <<link "出门走走" "Scene_RegionSelect">><</link>> \ <<link "和魏玛说说话" "Talk_Weimar">><</link>> \ <</if>>\ <<link "跳到下一事件日">><<set $skip_days_mode to 0>><<if not $flags.route_intro_seen>><<set $skip_days_mode_pending to true>><<goto "Scene_Route">><<else>><<goto "Scene_SkipConfirm">><</if>><</link>> \ <<link "按周推进 · 7 天">><<set $skip_days_mode to 7>><<if not $flags.route_intro_seen>><<set $skip_days_mode_pending to true>><<goto "Scene_Route">><<else>><<goto "Scene_SkipConfirm">><</if>><</link>>\ </span>\ <span class="dash-hint">一周按一次「按周推进」:跳过 7 天,路上可安排一趟出门、一次登门,公文按你的治理路线代办,回来时晨报替你把日子过成了摘要。但跳过去的每一天,世界都不会等你。</span>\ <</if>>\ </div>\ /* ═══════ 双列网格:外出 / 会客 / 资料 ═══════ */\ <div class="dash-card dash-sec" title="出门调研消耗行动点;治理路线决定跳天时事件如何被自动处置">\ <span class="dash-chip">外出与行动</span>\ <<if $tp lt 1>>\ <span class="dash-desc">你今天已经很累了,需要休息。</span>\ <span class="dash-actions"><<link "回去休息" "Scene_Rest">><</link>></span>\ <<else>>\ <span class="dash-actions">\ <<if _question_pending>>\ <<set $weimar_question_return to "Scene_RegionSelect">><<link "出门走走" "Talk_Weimar_Questioned_Reply">><</link>> <<link "治理路线" "Scene_Route">><</link>>\ <span class="dash-hint">你刚迈出门,魏玛的声音从身后传来。</span>\ <<else>>\ <<link "出门走走" "Scene_RegionSelect">><</link>> <<link "治理路线" "Scene_Route">><</link>>\ <</if>>\ </span>\ <</if>>\ </div>\ /* ═══════ 会客与谈话(内嵌待客室窗口) ═══════ */\ <<silently>> <<region-npc-pending-arrival>><<set _region_pending to $ret>>\ <</silently>>\ <div class="dash-card dash-sec" title="拜访可能改变某党的信任;政党与诸侯的邀约都会在待客室里等你">\ <span class="dash-chip">会客与谈话<<if _wait_count gt 0 or _region_pending neq "">>(有人在这里等你)<</if>></span>\ <span class="dash-actions">\ <<link "会见 SPD" "Scene_Visit_SPD">><</link>> \ <<if _question_pending>>\ <<set $weimar_question_return to "Scene_Office">><<link "⚠ 魏玛有话对你说" "Talk_Weimar_Questioned_Reply">><</link>>\ <<elseif $weimar.personality_tension gte $weimar.effective_threshold>>\ <<link "⚠ 魏玛在等你" "Talk_Weimar">><</link>>\ <<else>>\ <<link "和魏玛说说话" "Talk_Weimar">><</link>>\ <</if>>\ </span>\ <<set _room_open to _wait_count gt 0 or _region_pending neq "">>\ <<set _room_attr to _room_open ? "open" : "">>\ <details class="dash-room" _room_attr title="受邀约/到访的人,都在这个待客室里等着">\ <summary class="dash-room-title">待客室\ <<if _region_pending neq "" or _wait_count gt 0>><span class="rm-hint">(有人在这里等你 · 点此收合)</span><</if>>\ </summary>\ <span class="dash-actions">\ <<if _region_pending neq "">>\ <<link "$region_npcs[_region_pending].short_name在待客厅等你" "Scene_RegionNpcMeet">><<set $region_npc_target to _region_pending>><<set $region_npc_chat to {}>><</link>> \ <</if>>\ <<if $party_milestones and $party_milestones.dnvp and ($party_milestones.dnvp.arc_state eq "offered" or ($party_milestones.dnvp.arc_state eq "pulling" and (not $dnvp_last_trial_day or $session_day gt $dnvp_last_trial_day)))>>\ <<link "DNVP 邀你密谈" "Scene_DNVP_Offer">><</link>> \ <</if>>\ <<if $party_milestones and $party_milestones.kpd and ($party_milestones.kpd.arc_state eq "offered" or ($party_milestones.kpd.arc_state eq "pulling" and (not $kpd_last_day or $session_day gt $kpd_last_day)))>>\ <<link "KPD 邀你密谈" "Scene_KPD_Offer">><</link>> \ <</if>>\ <<if $party_milestones and $party_milestones.spd and $party_milestones.spd.arc_state eq "offered">>\ <<link "SPD 邀你盟约" "Scene_SPD_Offer">><</link>> \ <</if>>\ <<if $party_milestones and $party_milestones.ddp and $party_milestones.ddp.arc_state eq "offered">>\ <<link "DDP 邀你立约" "Scene_DDP_Offer">><</link>> \ <</if>>\ <<if $party_milestones and $party_milestones.dvp and $party_milestones.dvp.arc_state eq "offered">>\ <<link "DVP 邀你立约" "Scene_DVP_Offer">><</link>> \ <</if>>\ <<if $party_milestones and $party_milestones.zentrum and $party_milestones.zentrum.arc_state eq "offered">>\ <<link "Zentrum 邀你立约" "Scene_Zentrum_Offer">><</link>> \ <</if>>\ <<if $party_milestones and $party_milestones.nsdap and $party_milestones.nsdap.arc_state eq "offered">>\ <<link "NSDAP 邀你夜谈" "Scene_NSDAP_Offer">><</link>> \ <</if>>\ <<if $party_milestones and $party_milestones.army and $party_milestones.army.arc_state eq "offered">>\ <<link "军方邀你夜谈" "Scene_Army_Offer">><</link>> \ <</if>>\ <<shadow-init>>\ <<shadow-gate-check>>\ <<set $sh_ofc_count to Object.keys($shadow_cabinet.members).length>>\ <<if not $shadow_cabinet.intro_seen and _sh_gate>>\ <<link "深夜的信笺(拆开看看)" "Scene_Shadow_Intro">><</link>> \ <</if>>\ <<if $shadow_cabinet.unlocked>>\ <<link "影子内阁 · 你的名单($sh_ofc_count 人)" "Scene_Shadow_Cabinet">><</link>> \ <</if>>\ <<if $npcs.weimar.trust lte 30 and ($dnvp_pull gt 0 or $kpd_pull gt 0) and not $weimar_betray_talk_done>>\ <<link "魏玛要和你谈谈" "Talk_Weimar_Betrayal">><</link>> \ <</if>>\ <<if $npcs.spd.trust lte 20 and ($npcs.dnvp.trust gte 60 or $npcs.kpd.trust gte 60 or $spd_covenant) and not $spd_distrust_talk_done>>\ <<link "SPD 在门口等你" "Talk_SPD_Distrust">><</link>> \ <</if>>\ <<if $secret_demand_text neq "">>\ <<link "处理秘密要求" "Scene_SecretDemand">><</link>> \ <</if>>\ <<if $secret_exposed_text neq "">>\ <<link "$secret_exposed_text" "Scene_SecretConfront">><</link>> \ <</if>>\ <<if _wait_count eq 0 and _region_pending eq "">>\ <span class="rm-hint">//待客室空着。没有人在等你。//</span>\ <</if>>\ </span>\ </details>\ </div>\ /* ═══════ 召见各地诸侯(旧王国拟人) ═══════ */\ <<region-npc-summon-panel>>\ /* ═══════ 长线记事本(追查中的线 / 已生效 / 已失效) ═══════ */\ <<notebook-render>>\ /* ═══════ 资料室(免行动点,随时可查) ═══════ */\ <div class="dash-card dash-ref" title="资料室随时可查,不消耗行动点。">\ <span class="dash-chip">资料室</span>\ <span class="dash-actions">\ <<if $a48 and $a48.held>><<link "紧急权力·第48条" "Scene_A48_Status">><</link>> \ <</if>>\ <<link "查看自身状态" "Sys_SelfPanel">><</link>> \ <<link "翻阅柏林手记" "BerlinNotebook">><</link>> \ <<link "阅读本周报纸" "Scene_Newspaper">><<set $np_has_new to false>><</link>><<if $np_has_new>>(新报纸已送达)<</if>> \ <<link "翻阅晨报档案" "Scene_Archive">><</link>>\ </span>\ </div>\ /* ═══════ 一键收口位(底部动作条) ═══════ */\ <div class="dash-footer">\ <!-- #UI: 可在此插入收工徽记/音效入口 --> <span class="dash-chip">收工</span>\ <span class="dash-actions">\ <<link "■ 结束这一天" "Scene_EndDay">><</link>> \ <<if not (_has_promise or _has_red)>><<link "按周推进 · 7 天">><<set $skip_days_mode to 7>><<if not $flags.route_intro_seen>><<set $skip_days_mode_pending to true>><<goto "Scene_Route">><<else>><<goto "Scene_SkipConfirm">><</if>><</link>><</if>>\ <<if $debug>><<link "调试台">><<set $debug_return to passage()>><<goto "Debug_Lab">><</link>><</if>>\ </span>\ <span class="dash-hint">处理完今天的要务后,结束这一天,让时间前进。</span>\ </div>\ <</if>>\ </div>\
/* ════════════════════════════════════════════════════════════ 资料室 · 晨报档案 重读今日晨报(每日随当日状态生成,事后可随时回看)。 历史各期的详细内容见《共和国周报》合订本。 ════════════════════════════════════════════════════════════ */ <<silently>><<tp-phase-name>><<tp-fatigue-status>><<tp-phase-bonus>><<weekday>><</silently>>\ ''晨报档案 · <<datestr>> · 星期_wd'' //今晨的报纸。墨迹还新。// <hr>\ <<morning-report>>\ <hr>\ //历史各期的长文,收录在《共和国周报》合订本里。// <<link "返回办公室" "Scene_Office">><</link>>
/* 治理路线 · 光谱驱动的自动托管说明页(治理路线 v2,替代旧 Scene_Stance) 首次点跳天按钮先进这里($flags.route_intro_seen 只出现一次), 「明白了,继续跳天」回到跳天确认页;平时也可从办公室进来查看。 */ <<silently>> <<route-current>>\ <<set $flags.route_intro_seen to true>>\ <</silently>>\ ''治理路线'' //你不需要为每一件小事拿主意。// //只要你在办公室选择跳过多天的日子——或者「跳到下一事件日」——期间发生的一切公文、警报、见闻,都会按你的''治理路线''自动处置:''用你的方式''。// //连搁了三天没亲手的文件,也会照你的路数被办妥,写进晨报。标着「⚠ 后果深远」的大事例外——路线不替你拍板,只会在晨报里提醒你它们还压着。// //路线不由你挑选,由你的''政治光谱''长出来:// //左·激进——''革命路线''。掀翻旧世界,不修补它。// //左·温和——''改良路线''。一张一张签下去:保险、仲裁、救济。// //中间——''务实路线''。哪个行得通签哪个,意识形态是奢侈品。// //右·温和——''秩序路线''。国家先站稳,强硬是骨架不是目的。// //右·激进——''强权路线''。秩序不够,就上力量。// //历史巨浪不归路线管——日子会停在它面前。标着「⚠ 后果深远」的大事也不归它管——路线不会替你拍板。''抵达日的大事与案头压着的大事,都归你亲手处理。''许诺是你的债,托管永远不替你签。// //托管不消耗TP,但每件事会让魏玛多一分疲惫。// <hr> ''当前路线:_route_name'' //光谱坐标:左/右 _route_lr · 激/保 _route_rc// //_route_desc// <hr> <<if not $skip_days_mode_pending>>\ <<link "明白了,回办公室" "Scene_Office">><</link>>\ <<else>>\ <<link "明白了,继续跳天" "Scene_SkipConfirm">><</link>> <<link "先不跳了">><<set $skip_days_mode_pending to false>><<goto "Scene_Office">><</link>>\ <</if>>\ /* ---------- Talk_Weimar_Betrayal:魏玛察觉你背叛共和国 ---------- 触发:魏玛信任 ≤30 且走了 DNVP 投名状线($dnvp_pull>0)。 魏玛主动来质问你对共和国的背叛。 */
/* 跳转前确认页:先告诉玩家会跳过多少天(以及是否跨过国会审议日),再决定跳不跳 $skip_days_mode:0=跳到下一个红色事件日;>0=固定跳过该天数(如5) */ <<silently>> <<set _skip_mode to $skip_days_mode ? $skip_days_mode : 0>>\ <<set $skip_days_mode_pending to false>>\ <<tp-skip-calc _skip_mode>>\ <<set _sd to $skip_preview.days>>\ <<set _td to $skip_preview.target_date>>\ /* 审议拦截时真正落地日=审议日(原窗口被截短),确认页按真实落地日说话 */ <<set _land_short to ($skip_preview.review_day neq null and $skip_preview.days_to_review lt $skip_preview.days)>>\ <<set _ld to _land_short ? $skip_preview.review_date : $skip_preview.target_date>>\ <<set _cr to $skip_preview.cross_review>>\ <<route-current>>\ <</silently>>\ ''时间 · 向前'' <<if _skip_mode gt 0>>\ <<if _land_short>>\ //你决定给自己 _sd 天;日子会先停在<<if _ld.y and _ld.y neq $date.year>>_ld.y年<</if>>_ld.m月_ld.d日。//\ <<else>>\ //你决定给自己 _sd 天。日历翻过 _sd 页,落在<<if _ld.y and _ld.y neq $date.year>>_ld.y年<</if>>_ld.m月_ld.d日。//\ <</if>>\ <<else>>\ //日历翻过了你办公桌上的台历。下一个红色事件,在<<if _td.y and _td.y neq $date.year>>_td.y年<</if>>_td.m月_td.d日。// //那之前,还有 _sd 天。//\ <</if>> <<if _cr>>\ <<if _land_short>>\ //⚠ 这段日子里,将迎来一次国会审议(60天一议)。你躲不掉——日子会先停在_ld.m月_ld.d日,国会在那天敲你的门;审议散场,剩下的路再作打算。//\ <<else>>\ //⚠ 这段日子里,将迎来一次国会审议(60天一议)。你躲不掉——它会在那天准时敲你的门。//\ <</if>>\ <<else>>\ //这段日子里没有国会审议。//\ <</if>> <<if $skip_preview.red_stop>>\ //⚠ 这段日子里,将迎来历史巨浪——''《$skip_preview.red_stop.title》''(<<if _td.y and _td.y neq $date.year>>_td.y年<</if>>_td.m月_td.d日)。<<if _land_short>>日子会先停在国会审议那天;审议散场,它仍会等你亲手处理。<<else>>日子会停在那天:大事不归路线管,归你亲手处理。<</if>>//\ <</if>> <<silently>> /* 承诺到期:窗口内到期的未兑现承诺,跳过去=下一次审议记失信 */ <<set _pr_due to []>>\ <<if $promise_ledger and $promise_ledger.length gt 0>>\ <<for _prq to 0; _prq lt $promise_ledger.length; _prq++>>\ <<set _pr_e to $promise_ledger[_prq]>>\ <<if _pr_e.status eq "open" and _pr_e.deadline gt $session_day and _pr_e.deadline lte $session_day + _sd>>\ <<set _pr_due.push(_pr_e.content)>>\ <</if>>\ <</for>>\ <</if>>\ /* 危机引信:预警中且倒数会在窗口内走完的火线 */ <<set _cr_hot to []>>\ <<if $crisis_state>>\ <<set _cr_names to { violence: "街头的暴力", revolution: "起义的引信", rightwing: "政变的引信" }>>\ <<set _cr_keys to ["violence", "revolution", "rightwing"]>>\ <<for _crk to 0; _crk lt _cr_keys.length; _crk++>>\ <<set _crs to $crisis_state[_cr_keys[_crk]]>>\ <<if _crs and _crs.warned and _crs.countdown gt 0 and _crs.countdown lte _sd>>\ <<set _cr_hot.push({ name: _cr_names[_cr_keys[_crk]], days: _crs.countdown })>>\ <</if>>\ <</for>>\ <</if>>\ <</silently>>\ <<if _pr_due.length gt 0>>\ //⚠ 你许下的承诺,有 _pr_due.length 件在这段日子里到期://\ <<for _prd range _pr_due>>\ //· 「_prd」——过了期限还没兑现,下一场国会审议就要记你失信。//\ <</for>>\ <</if>> <<if _cr_hot.length gt 0>>\ //⚠ 这几根引信已经点着了,跳过去的日子里多半会烧到爆发://\ <<for _crh range _cr_hot>>\ //· _crh.name——倒数只剩 _crh.days 天。托管会按你的路线去接,但那不是你亲手接的。//\ <</for>>\ <</if>> <<silently>> <<set _fu_in_skip to []>>\ <<for _sfq to 0; _sfq lt $site_followups.length; _sfq++>>\ <<set _fu_f to $site_followups[_sfq]>>\ <<if _fu_f.due_day gt $session_day and _fu_f.due_day lte $session_day + _sd>>\ <<set _fu_in_skip.push(_fu_f.title)>>\ <</if>>\ <</for>>\ <</silently>>\ <<if _fu_in_skip.length gt 0>>\ //另外,你本子上记着的事,有 _fu_in_skip.length 件会在这段日子里回来:// <<for _ful range _fu_in_skip>>\ //· 《_ful》// <</for>>\ <</if>> <<silently>> /* 剧情级大事(is-major-ev)永不被托管:跳过前点名,让玩家知道哪些事等他回来拍板 */ <<set _mj_waiting to []>>\ <<set _mj_list to "">>\ <<for _mjq to 0; _mjq lt $pending_events.length; _mjq++>>\ <<set _mje to $pending_events[_mjq]>>\ <<is-major-ev _mje>>\ <<if _ev_is_major>>\ <<set _mj_waiting.push(_mje.title)>>\ <<set _mj_list to _mj_list + "《" + _mje.title + "》">>\ <</if>>\ <</for>>\ <</silently>>\ <<silently>> /* 限期事件到期预告:与 site-expiry-check(77b)同口径——落地日「大于」期限日才算错过 (77b 用 gt 判定),期限日恰为抵达日的不列(回来当天还来得及亲手处理); 同标题已在其他预告(回访/大事压案)里点过名的不重复列。 cost 文案与 site-expiry-check 各分支的 cost 字段一一对应,两处改动需同步。 */ <<set _dl_costs to { refugee: "社会愤怒+3 · 政府信任-3 · 民族主义+2", labor: "社会愤怒+4 · 革命压力+3 · 政府信任-3 · SPD信任-3", market: "通胀+4 · 政府信任-3", military: "军方信任+3 · 军方影响+3 · 政府信任-2", food: "社会愤怒+4 · 政治暴力+3 · 政府信任-3", strike: "社会愤怒+5 · 革命压力+4 · 政府信任-4 · SPD信任-4", veteran: "军方信任-4 · 政治暴力+3 · 民族主义+3 · 政府信任-3", housing: "社会愤怒+4 · 政治暴力+3 · 政府信任-3 · SPD信任-3", refugeeflow: "社会愤怒+4 · 国际信任-3 · 政府信任-3 · Zentrum信任-3", university: "政府信任-3 · 社会愤怒+3 · DDP信任-3", epidemic: "社会愤怒+5 · 政府信任-4 · 通胀+2", justice: "政府信任-4 · 社会愤怒+3 · SPD信任-3", culture: "政府信任-2 · DDP信任-2 · 民族主义+2" }>>\ <<set _dl_list to []>>\ <<run (function(){ var tv = State.temporary, sv = State.variables; var landing = sv.session_day + tv.sd; var md = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; var listed = {}; var i, k; for (i = 0; i < tv.mj_waiting.length; i++) listed[tv.mj_waiting[i]] = true; for (i = 0; i < tv.fu_in_skip.length; i++) listed[tv.fu_in_skip[i]] = true; var keys = Object.keys(sv.regions); for (i = 0; i < keys.length; i++) { var r = sv.regions[keys[i]]; var a = r.active_event; if (!a || a.deadline_day < sv.session_day || a.deadline_day >= landing) continue; if (listed[a.title]) continue; var off = a.deadline_day - sv.session_day; var m = sv.date.month, d = sv.date.day, y = sv.date.year; for (k = 0; k < off; k++) { d++; if (d > (m === 2 && y % 4 === 0 ? 29 : md[m - 1])) { d = 1; m++; if (m > 12) { m = 1; y++; } } } tv.dl_list.push({ name: r.name, title: a.title, m: m, d: d, cost: tv.dl_costs[a.kind] || "政府信任-2" }); } })()>>\ <</silently>>\ <<if _dl_list.length gt 0>>\ //⚠ 另外,有 _dl_list.length 件你答应亲自去办的现场事,期限会在这段日子里过去://\ <<for _dlr range _dl_list>>\ //· 《_dlr.title》(_dlr.name,_dlr.m月_dlr.d日到期)——错过期限按消极处理,代价照记:_dlr.cost。//\ <</for>>\ //(这些事托管不代办:期限过了就是过了,代价照记。抵达当天才到期的不算错过,回来还来得及亲手处理。)//\ <</if>> //你不在的这些天,案头的事不会停着等你。// //它们会按你的治理路线——''【_route_name】''——自动处置:公文、警报、见闻,都会用''你的方式''被对待。// //但有些事不归路线管:历史巨浪会让日子停在它面前;标着「⚠ 后果深远」的大事也一样——路线不会替你拍板,它们原样压在案头,等你回来亲手决定。// <<if _mj_waiting.length gt 0>>\ //眼下案头就压着 _mj_waiting.length 件:_mj_list——这些事路线不会代签,只等你的手。// <</if>> //_route_desc// //(抵达日的大事仍归你亲手处理;许诺永远等你回来兑现。跳过期间不消耗TP,但每件事会让魏玛多一分疲惫。)// /* ═══ 出行安排(可选):跳过的日子里,一趟区域 + 一次政党拜访 ═══ */ <<silently>> /* 每天首次进本页时重置出行选择(防残留);同一天内反复进出保留已选。 旧档缺 auto/pref 字段时现场补默认(auto=false / hot / estranged)。 */ <<if not $week_outings or $week_outings.picked_day neq $session_day>>\ <<set $week_outings to { region: "", party: "", picked_day: $session_day, auto: false, pref_region: "hot", pref_party: "estranged" }>>\ <<else>>\ <<if $week_outings.auto is undefined>><<set $week_outings.auto to false>><</if>>\ <<if $week_outings.pref_region is undefined>><<set $week_outings.pref_region to "hot">><</if>>\ <<if $week_outings.pref_party is undefined>><<set $week_outings.pref_party to "estranged">><</if>>\ <</if>> <<set _wo_regions to []>>\ <<set _wo_rk to Object.keys($regions)>>\ <<for _wo_k range _wo_rk>>\ <<if $regions[_wo_k].unlocked>><<set _wo_regions.push({ id: _wo_k, name: $regions[_wo_k].name })>><</if>>\ <</for>>\ <<set _wo_parties to [ {id:"spd",name:"SPD"}, {id:"kpd",name:"KPD"}, {id:"ddp",name:"DDP"}, {id:"dvp",name:"DVP"}, {id:"zentrum",name:"Zentrum"}, {id:"dnvp",name:"DNVP"}, {id:"nsdap",name:"NSDAP"}, {id:"army",name:"国防军"} ]>>\ <</silently>>\ <div class="week-plan">\ <span class="week-plan-title">出行安排(可选)</span> //跳过去的这些天,你可以安排两桩小事:出一趟门,登一次门。它们会替你在缺席的日子里保留一点「你在场」的痕迹。// ''交给托管:''\ <span class="week-chips">\ <<if $week_outings.auto>>\ <span class="week-chip week-chip-on"><<link "替我跑这一周 ✓">><<set $week_outings.auto to false>><<goto "Scene_SkipConfirm">><</link>></span>\ <<else>>\ <span class="week-chip"><<link "替我跑这一周">><<set $week_outings.auto to true>><<set $week_outings.region to "">><<set $week_outings.party to "">><<goto "Scene_SkipConfirm">><</link>></span>\ <</if>>\ </span> <<if $week_outings.auto>>\ //托管会替你出门、替你登门,按下面的偏好挑地方,回来把见闻写进汇报。批公文另算,永远走你的治理路线。// ''出门去哪:''\ <span class="week-chips">\ <<if $week_outings.pref_region is "hot">>\ <span class="week-chip week-chip-on"><<link "跟着时局走 ✓">><<set $week_outings.pref_region to "hot">><<goto "Scene_SkipConfirm">><</link>></span>\ <span class="week-chip"><<link "找个生疏的地方">><<set $week_outings.pref_region to "fresh">><<goto "Scene_SkipConfirm">><</link>></span>\ <<else>>\ <span class="week-chip"><<link "跟着时局走">><<set $week_outings.pref_region to "hot">><<goto "Scene_SkipConfirm">><</link>></span>\ <span class="week-chip week-chip-on"><<link "找个生疏的地方 ✓">><<set $week_outings.pref_region to "fresh">><<goto "Scene_SkipConfirm">><</link>></span>\ <</if>>\ </span> ''登门见谁:''\ <span class="week-chips">\ <<if $week_outings.pref_party is "estranged">>\ <span class="week-chip week-chip-on"><<link "走动生疏的人家 ✓">><<set $week_outings.pref_party to "estranged">><<goto "Scene_SkipConfirm">><</link>></span>\ <span class="week-chip"><<link "走动亲近的人家">><<set $week_outings.pref_party to "close">><<goto "Scene_SkipConfirm">><</link>></span>\ <<else>>\ <span class="week-chip"><<link "走动生疏的人家">><<set $week_outings.pref_party to "estranged">><<goto "Scene_SkipConfirm">><</link>></span>\ <span class="week-chip week-chip-on"><<link "走动亲近的人家 ✓">><<set $week_outings.pref_party to "close">><<goto "Scene_SkipConfirm">><</link>></span>\ <</if>>\ </span> <<else>>\ ''出门走走:''\ <span class="week-chips">\ <<for _wo_r range _wo_regions>>\ <<capture _wo_r>>\ <<if $week_outings.region eq _wo_r.id>>\ <span class="week-chip week-chip-on"><<link `_wo_r.name + " ✓"`>><<set $week_outings.region to "">><<goto "Scene_SkipConfirm">><</link>></span>\ <<else>>\ <span class="week-chip"><<link `_wo_r.name`>><<set $week_outings.region to _wo_r.id>><<goto "Scene_SkipConfirm">><</link>></span>\ <</if>>\ <</capture>>\ <</for>>\ </span> ''登门拜访:''\ <span class="week-chips">\ <<for _wo_p2 range _wo_parties>>\ <<capture _wo_p2>>\ <<if $week_outings.party eq _wo_p2.id>>\ <span class="week-chip week-chip-on"><<link `_wo_p2.name + " ✓"`>><<set $week_outings.party to "">><<goto "Scene_SkipConfirm">><</link>></span>\ <<else>>\ <span class="week-chip"><<link `_wo_p2.name`>><<set $week_outings.party to _wo_p2.id>><<goto "Scene_SkipConfirm">><</link>></span>\ <</if>>\ <</capture>>\ <</for>>\ </span> <</if>>\ //(出一趟门:带一点街上的消息回来。登一次门:他那边的信任照常往上涨,该付的人情照付。)//\ </div> <<link "「确认,跳过这些日子」" "Scene_SkipReport">><</link>> <<link "「先不跳,再想想」" "Scene_Office">><</link>>
/* 时间跳过简报 · 显示"X天过去了"和世界变化 tp-skip-to-event 在段落顶部执行(非 link 回调),确保持久化可靠 */ <<silently>> <<set _skip_mode to $skip_days_mode ? $skip_days_mode : 0>>\ <<tp-skip-to-event _skip_mode>>\ <<set $skip_days_mode to 0>>\ <<region-npc-pending-arrival>><<set _skip_region_arrived to $ret>>\ <</silently>>\ <<if $skip_info neq null>>\ <<set _d to $skip_info.days>>\ //_d 天过去了。// <<if $route_handled_log and $route_handled_log.length gt 0>>\ ''-- 按你的路线处置的事 --'' //你不在的这些天,【$skip_route_name】替你做了主。// <<for _rhi to 0; _rhi lt $route_handled_log.length; _rhi++>>\ <<silently>> /* 光谱倾向标注:把选项 axis(可含多个,如 "SM" "OP")翻成中文 */ <<set _rh_axis_cn to "">>\ <<set _rh_axis_names to {GM:"温和改良", SM:"国家强势", LE:"左翼路线", RE:"右翼路线", OP:"暗中运作", AP:"置身事外"}>>\ <<set _rh_axis to $route_handled_log[_rhi].axis ? $route_handled_log[_rhi].axis : "">>\ <<set _rh_parts to []>>\ <<if _rh_axis neq "">>\ <<for _rhc to 0; _rhc lt _rh_axis.length; _rhc++>>\ <<set _rh_two to _rh_axis.slice(_rhc, _rhc + 2)>>\ <<if _rh_axis_names[_rh_two] and _rh_parts.length lt 2>>\ <<set _rh_parts.push(_rh_axis_names[_rh_two])>>\ <<set _rhc to _rhc + 1>>\ <</if>>\ <</for>>\ <<set _rh_axis_cn to _rh_parts.join("·")>>\ <</if>>\ /* 被托管的延迟回访(source=followup):点一句来龙去脉 */ <<set _rh_fu to ($route_handled_log[_rhi].src is "followup")>>\ <</silently>>\ <div class="passive-item"><span class="passive-sym">✒</span>《$route_handled_log[_rhi].title》\ <<if _rh_fu>><span class="passive-eff">//之前记下的那笔账到期了——按既定路线处置://</span><</if>>\ <<if $route_handled_log[_rhi].kind is "fallback">><span class="passive-eff">//按既定方针处置:$route_handled_log[_rhi].eff//</span>\ <<else>><span class="passive-eff">//选了「$route_handled_log[_rhi].choice」<<if _rh_axis_cn neq "">>(_rh_axis_cn)<</if>>-- $route_handled_log[_rhi].eff//</span><</if>></div> <<if $route_handled_log[_rhi].notes and $route_handled_log[_rhi].notes.length gt 0>><<for _rhn range $route_handled_log[_rhi].notes>><div class="passive-sub">· //(_rhn)//</div><</for>><</if>> <</for>>\ <<set $route_handled_log to []>>\ <hr>\ <</if>>\ /* 「等你亲自决定的事」:跳过期间被豁免托管、原样留置的剧情级大事(2026-09-26 用户定) */ <<set _mj_left to []>>\ <<for _mjl to 0; _mjl lt $pending_events.length; _mjl++>>\ <<set _mje to $pending_events[_mjl]>>\ <<is-major-ev _mje>>\ <<if _ev_is_major>><<set _mj_left.push(_mje)>><</if>>\ <</for>>\ <<if _mj_left.length gt 0>>\ ''-- 等你亲自决定的事 --'' //这些文件标着「⚠ 后果深远」。治理路线不会替你拍板——它们原样压在案头,一个字没动。// <<for _mjr range _mj_left>>\ <div class="passive-item"><span class="passive-sym">✒</span>《_mjr.title》<span class="passive-eff">//等你回来,亲手决定。//</span></div> <</for>>\ <hr>\ <</if>> <<drift-report-render "full">>\ <<if $passive_report and $passive_report.length gt 0>>\ <<silently>> <<set _zhi to 0>>\ <<set _psr_warn to 0>>\ <<set _psr_cadence to 0>>\ <<set _psr_note to 0>>\ <<if $active_tags and $active_tags.length gt 0>>\ <<for _zs2 to 0; _zs2 lt $active_tags.length; _zs2++>>\ <<if $active_tags[_zs2] and $active_tags[_zs2].name eq "知情者">>\ <<set _zhi to Number($active_tags[_zs2].intensity) || 0>>\ <</if>>\ <</for>>\ <</if>>\ <<for _psr0 to 0; _psr0 lt $passive_report.length; _psr0++>>\ <<set _psrk to $passive_report[_psr0].kind ? $passive_report[_psr0].kind : "warn">>\ <<if _psrk is "cadence">><<set _psr_cadence to _psr_cadence + 1>>\ <<elseif _psrk is "note">><<set _psr_note to _psr_note + 1>>\ <<elseif not (_psrk is "route")>><<set _psr_warn to _psr_warn + 1>>\ <</if>>\ <</for>>\ <</silently>>\ <<if $skip_cadence_cover and $skip_cadence_cover neq "">>\ <div class="passive-cover">$skip_cadence_cover</div>\ <</if>>\ <<if _psr_warn gt 0>>\ ''-- 你搁下的那些事 --''\ <<elseif _psr_cadence gt 0>>\ ''-- 你不在时发生的事 --''\ <<elseif _psr_note gt 0>>\ ''-- 这一天的其他动静 --''\ <<else>>\ ''-- 按你的路数办妥的事 --''\ <</if>>\ <<for _psr to 0; _psr lt $passive_report.length; _psr++>>\ <<set _psrk to $passive_report[_psr].kind ? $passive_report[_psr].kind : "warn">>\ <<if _psrk is "route">>\ <div class="passive-item"><span class="passive-sym">✒</span>已按【$passive_report[_psr].route】处理《$passive_report[_psr].name》:选了「$passive_report[_psr].choice」<<if _zhi gte 15 and $passive_report[_psr].eff>><span class="passive-eff">「$passive_report[_psr].eff」</span><</if>><<if _zhi gte 25 and $passive_report[_psr].delta>><span class="passive-delta">演化影响:$passive_report[_psr].delta</span><</if>></div>\ <<elseif _psrk is "note">>\ <div class="passive-item"><span class="passive-sym">·</span>$passive_report[_psr].name</div>\ <<elseif _psrk is "cadence">>\ <div class="passive-item"><span class="passive-sym">·</span>《$passive_report[_psr].name》——没等你,自己走完了。<<if _zhi gte 15 and $passive_report[_psr].eff>><span class="passive-eff">「$passive_report[_psr].eff」</span><</if>><<if _zhi gte 25 and $passive_report[_psr].delta>><span class="passive-delta">演化影响:$passive_report[_psr].delta</span><</if>></div>\ <<else>>\ <div class="passive-item"><span class="passive-sym">⚠</span>//你没有处理《$passive_report[_psr].name》。//<<if _zhi gte 15>>\ <span class="passive-eff">「$passive_report[_psr].eff」</span><<if _zhi gte 25 and $passive_report[_psr].delta>><span class="passive-delta">演化影响:$passive_report[_psr].delta</span><</if>><</if>></div>\ <</if>>\ <</for>>\ <<set $passive_report_pending to false>>\ <hr>\ <</if>>\ <<if _d gte 30>>\ <<set _pool to [ "一个多月。你把自己埋进文件,埋得很深。台历撕掉了厚厚一沓。", "一个多月。你几乎没抬头看过窗外。等你终于抬头,街上的树换了一茬颜色。", "看文件,出门,回来,睡。一个多月都是这样。你数不清哪一天是哪一天。" ]>>\ <<pool-pick "skip_tier30">>\ <<print $pool_pick>> //但柏林没有停。//\ <<elseif _d gte 7>>\ <<set _pool to [ "一周多。日子在重复中压缩,变成一个模糊的色块。但你回来的时候,有些东西不一样了。", "一周多。你处理完手头的事,回头一看,说不上来哪一件算是数。", "一周多。台历翻过几页,你记住的只有数字。出门时你瞥了一眼,街上的人换了张脸。" ]>>\ <<pool-pick "skip_tier7">>\ <<print $pool_pick>> <<else>>\ <<set _pool to [ "几天。你没有数。在柏林,数日子是一种奢侈。", "几天。你数了一下,又觉得没必要。柏林的日子向来不照天数走。", "几天。不算长,但足够让几件小事各自有了结局。" ]>>\ <<pool-pick "skip_tierfew">>\ <<print $pool_pick>> <</if>>\ <div class="skip-date"><<datestr>></div>\ <div class="skip-sec">''-- 这段时间,世界变了 --''</div>\ <<silently>> <<set _wb to $skip_info.world_before>>\ <<set _wa to $skip_info.world_after>>\ <<set _changes to []>>\ <<if _wa.economy - _wb.economy gte 3>>\ <<set _pool to [ "经济压力加重了。街上的排队更长了。", "经济又沉了一分。当铺柜台前排着的人多了。", "经济在往下沉。菜场的价签又换了一张。" ]>>\ <<pool-pick "skip_econ_up">>\ <<set _changes.push($pool_pick)>>\ <<elseif _wb.economy - _wa.economy gte 3>>\ <<set _pool to [ "经济压力略有缓解。但没人敢说好了。", "经济缓了一口气。街上的队短了一点,仅此而已。", "日子松了一点。没有人大声庆祝,只是说话的嗓门低了些。" ]>>\ <<pool-pick "skip_econ_down">>\ <<set _changes.push($pool_pick)>>\ <</if>>\ <<if _wa.inflation - _wb.inflation gte 5>>\ <<set _pool to [ "马克又跌了。报童的嗓门更大了,因为数字更大了。", "马克又跌了。你看到的数字,比上周多了一位。", "马克在跌。钱留在手里过夜,就少一分。" ]>>\ <<pool-pick "skip_infl_up">>\ <<set _changes.push($pool_pick)>>\ <<elseif _wb.inflation - _wa.inflation gte 5>>\ <<set _pool to [ "马克稳了一些。银行家们在擦汗。", "马克站住了。至少这周没有继续往下掉。", "马克没再跌。街角黑市贩子报价时,没那么急了。" ]>>\ <<pool-pick "skip_infl_down">>\ <<set _changes.push($pool_pick)>>\ <</if>>\ <<if _wa.social_anger - _wb.social_anger gte 3>>\ <<set _pool to [ "街上的愤怒在积聚。空气绷成一根弦。", "街上的愤怒在积聚。有人往墙上写了字,字比上次的更直白。", "愤怒在街道之间传染。走在路上的人,眼神比脚步更硬。" ]>>\ <<pool-pick "skip_anger">>\ <<set _changes.push($pool_pick)>>\ <</if>>\ <<if _wa.political_violence - _wb.political_violence gte 3>>\ <<set _pool to [ "夜里传来了更多哨声。也许是警察。也许不是。", "夜里传来一阵哨声,又断了。你分不清是警笛还是别的。", "街角多了一摊没扫干净的玻璃。没人知道是打碎的酒杯,还是别的什么。" ]>>\ <<pool-pick "skip_violence">>\ <<set _changes.push($pool_pick)>>\ <</if>>\ <<if _changes.length eq 0>>\ <<set _pool to [ "表面上什么都没变。但在柏林,没变本身也是一种消息。", "什么都照旧。你甚至怀疑时间是不是真的走过。", "日子照往常滑过去。没有风声,也没有好消息。" ]>>\ <<pool-pick "skip_none">>\ <<set _changes.push($pool_pick)>>\ <</if>>\ <</silently>>\ <<for _i to 0; _i lt _changes.length; _i++>>\ <div class="skip-li">- //_changes[_i]//</div>\ <</for>> <<if $skip_flavor and $skip_flavor.length gt 0>>\ ''-- 街角的这些天 --'' <<for _i to 0; _i lt $skip_flavor.length; _i++>>\ <div class="skip-li">- //$skip_flavor[_i]//</div>\ <</for>>\ <<set $skip_flavor to []>>\ <</if>> <<if $skip_info.trust_events and $skip_info.trust_events.length gt 0>>\ ''-- 这段时间收到的 --'' <<for _i to 0; _i lt $skip_info.trust_events.length; _i++>>\ <<set _te to $skip_info.trust_events[_i]>>\ <<if _te.source eq "报刊">>\ <div class="skip-li">📰 //_te.text//</div>\ <<elseif _te.source eq "秘书送件">>\ <div class="skip-li">📋 //_te.text//</div>\ <<elseif _te.source eq "密报">>\ <div class="skip-li">🔐 //_te.text//</div>\ <<elseif _te.source eq "私人来信">>\ <div class="skip-li">✉ //_te.text//</div>\ <<elseif _te.source eq "魏玛">>\ <div class="skip-li">💬 //_te.text//</div>\ <<elseif _te.source eq "街头见闻">>\ <div class="skip-li">👁 //_te.text//</div>\ <<else>>\ <div class="skip-li"> //_te.text//</div>\ <</if>>\ <</for>>\ <</if>> <<if $skip_outing_log and $skip_outing_log.length gt 0>>\ <<silently>><<set _wo_has_auto to false>><<for _woa range $skip_outing_log>><<if _woa.auto>><<set _wo_has_auto to true>><</if>><</for>><</silently>>\ ''-- 这些天里,<<if _wo_has_auto>>托管替你出了门<<else>>你出门了<</if>> --'' <<for _wo to 0; _wo lt $skip_outing_log.length; _wo++>>\ <<set _woe to $skip_outing_log[_wo]>>\ <<if _woe.kind is "region">>\ <div class="skip-li">🚶 ''_woe.name'' //_woe.text//</div>\ <<else>>\ <div class="skip-li">🚪 ''_woe.name'' //_woe.text//</div>\ <</if>>\ <</for>>\ <<set $skip_outing_log to []>>\ <</if>> <<if $skip_info.rest_tension gt 0>>\ //(不办公的那些晚上,你睡得很沉。魏玛身上的紧绷,松开了 $skip_info.rest_tension 分。)//\ <</if>> <<if $skip_info.tp_bank and $skip_info.tp_bank gt 0>>\ //(你没亲自跑动的这些天,力气替你攒下了 $skip_info.tp_bank 点行动力。想跑图,回来正好一口气用——攒的没有另立账本,按平时节奏睡一觉,就回到平日的量。)//\ <</if>> <<if $session_review.continue_skip>>\ //这段日子在一片国会审议前戛然而止。国会在等你。// <<link "「前往国会」" "Scene_Review_Prompt">><</link>> <<elseif _skip_region_arrived neq "">>\ ''你召见的人,到了。'' //$region_npcs[_skip_region_arrived].short_name已经在待客厅等你。你在跳过这段日子时,把行期给忘了。// <<if $tp lt 1>>\ //你太疲惫了,坐在桌后没起身。// <<link "「下楼赴约,勉力一谈」" "Scene_RegionNpcMeet">><<set $region_npc_target to _skip_region_arrived>><<set $region_npc_chat to {}>><</link>> \ <<link "「托辞不见(信任 -3)」" "Scene_Office">><<region-npc-trust _skip_region_arrived -3>><<set $region_npcs[_skip_region_arrived].met_last_arrival to true>><<set $region_npcs[_skip_region_arrived].last_meet_day to $session_day>><<set $region_npcs[_skip_region_arrived].arrive_day to -1>><</link>>\ <<else>>\ <<link "「下楼赴约」" "Scene_RegionNpcMeet">><<set $region_npc_target to _skip_region_arrived>><<set $region_npc_chat to {}>><</link>> \ <<link "「托辞不见(信任 -3)」" "Scene_Office">><<region-npc-trust _skip_region_arrived -3>><<set $region_npcs[_skip_region_arrived].met_last_arrival to true>><<set $region_npcs[_skip_region_arrived].last_meet_day to $session_day>><<set $region_npcs[_skip_region_arrived].arrive_day to -1>><</link>>\ <</if>>\ <<elseif $pending_events.length gt 0>>\ ''有 $pending_events.length 件新待办在等你。'' <<link "处理待办" "Scene_Files">><</link>> <<else>>\ //没有新的待办。又是平静的一天。也许太平静了。// <<link "回到办公室" "Scene_Office">><</link>> <</if>> <<else>>\ //没有可跳过的日期。// <<link "返回" "Scene_Office">><</link>> <</if>>
/* 文件篮 · 一次性铺开所有待办,按严重程度从上到下排列 */ <div class="scene-files">\ //文件篮// <<silently>> <<cap-calc>>\ <<set _pc_avail to Math.max(0, ($pc_total || 0) - ($pc_pool_spent || 0))>>\ <<backlog-score>>\ /* 瘫痪显示用当刻负荷实时判定(不依赖 daily-tick 时机,便签页同一日自洽) */ <<set _disp_admin to ($backlog_score gte 8)>>\ /* 批处理可用数:与文件项 _fis_low 同一过滤,只有次等事务可整批托管 */ <<set _batch_n to 0>>\ <<for _bi to 0; _bi lt $pending_events.length; _bi++>>\ <<set _bev to $pending_events[_bi]>>\ <<set _blow to true>>\ <<if _bev.deck_id and (_bev.deck_id.indexOf("Y") eq 0 or _bev.deck_id.indexOf("R") eq 0 or _bev.deck_id.indexOf("S") eq 0 or _bev.deck_id.indexOf("P") eq 0)>><<set _blow to false>><</if>>\ <<if _bev.level is "promise" or _bev.level is "yellow">><<set _blow to false>><</if>>\ <<if _bev.source is "historical" or _bev.source is "swell">><<set _blow to false>><</if>>\ /* 剧情级大事不计入批量托管(与 files-batch-route 本体同口径) */ <<is-major-ev _bev>>\ <<if _ev_is_major>><<set _blow to false>><</if>>\ <<if _blow>><<set _batch_n to _batch_n + 1>><</if>>\ <</for>>\ <</silently>>\ <<if $tool_note and $tool_note neq "">><div class="tool-note">$tool_note</div><</if>> <div class="backlog-meter"><span class="backlog-meter-label">文牍负荷</span><span class="backlog-meter-val">$backlog_score/8</span><span class="backlog-meter-track"><<print '<span class="backlog-meter-fill" style="width:' + Math.min(100, $backlog_score / 8 * 100) + '%"></span>'>></span><<if _disp_admin>> <span class="backlog-meter-warn">行政瘫痪</span><</if>></div>\ <<if $backlog_score gte 8>>\ <div class="backlog-t1-hint">文牍负荷 ≥8:行政流程受阻,普通文件不再呈报</div>\ <</if>>\ <<if $files_batch_log and $files_batch_log.length gt 0>>\ ''刚批出去:<<print $files_batch_log.length>> 件'' <<for _fb range $files_batch_log>>\ <div class="passive-item"><span class="passive-sym">✒</span>《_fb.title》<span class="passive-eff">//按「_fb.choice」办妥:_fb.eff//</span></div>\ <</for>>\ <<set $files_batch_log to []>>\ <</if>> <<if _batch_n gt 0>>\ <div class="files-batch-bar"><span class="tool-btn tool-btn-promo"><<link "按治理路线批了(<<print _batch_n>> 件次等事务)">><<files-batch-route>><<goto "Scene_Files">><</link>></span> <span class="dash-hint">//小事不必一件件过目,批出去的照你的路线办妥。//</span></div>\ <</if>> <<if $pending_events.length gt 0>>\ <<set _sorted to []>>\ <<for _i to 0; _i lt $pending_events.length; _i++>>\ <<set _sorted.push({ev: $pending_events[_i], idx: _i})>>\ <</for>>\ /* 按严重程度排序:irreversible 降序 -> intensity 降序 */ <<for _i to 0; _i lt _sorted.length - 1; _i++>>\ <<for _j to 0; _j lt _sorted.length - 1 - _i; _j++>>\ <<set _a to _sorted[_j].ev>>\ <<set _b to _sorted[_j+1].ev>>\ <<if _a.irreversible lt _b.irreversible or (_a.irreversible eq _b.irreversible and _a.intensity lt _b.intensity)>>\ <<set _tmp to _sorted[_j]>>\ <<set _sorted[_j] to _sorted[_j+1]>>\ <<set _sorted[_j+1] to _tmp>>\ <</if>>\ <</for>>\ <</for>>\ <<for _i to 0; _i lt _sorted.length; _i++>>\ <<set _ev to _sorted[_i].ev>>\ <<set _ev_idx to _sorted[_i].idx>>\ <<if _ev.template eq "filebasket">>\ //📄 呈报 · 决策//\ <<elseif _ev.level is "promise" or (_ev.deck_id and _ev.deck_id.startsWith("P"))>>\ //⚜ 许诺 · 必须处理//\ <<elseif _ev.deck_id and _ev.deck_id.startsWith("R")>>\ //🔴 历史巨浪 · 必须处理//\ <<elseif _ev.deck_id and _ev.deck_id.startsWith("A")>>\ //🟡 区域警报 · 建议处理//\ <<elseif _ev.deck_id and _ev.deck_id.startsWith("Y")>>\ //🟡 区域警报 · 建议处理//\ <<elseif _ev.deck_id and _ev.deck_id.startsWith("S")>>\ //🌊 历史暗涌 · 历史在此偏转//\ <<elseif _ev.source is "historical" or _ev.source is "swell">>\ //🔴 历史巨浪 · 必须处理//\ <<elseif _ev.source is "tag-induced">>\ //🟡 区域警报 · 建议处理//\ <<elseif _ev.source is "followup" and _ev.irreversible gte 3>>\ //📬 大事余波 · 必须处理//\ <<elseif _ev.intensity gte 25>>\ //🔵 日常涟漪 · 可选//\ <<else>>\ //⚪ 氛围见闻 · 可选//\ <</if>>\ ''_ev.title'' -- _ev.description <<silently>> <<set _exp_win to 0>>\ <<set _exp_left to null>>\ <<if _ev.deck_id and _ev.deck_id.indexOf("A_white") eq 0>>\ <<set _exp_win to 3>>\ <<elseif (_ev.deck_id and _ev.deck_id.indexOf("Y") eq 0) or (_ev.level is "yellow")>>\ <<set _exp_win to 7>>\ <</if>>\ <<if _exp_win gt 0 and _ev.born_day>>\ <<set _exp_win_left to _exp_win - ($session_day - _ev.born_day)>>\ <<if _exp_win_left lt 0>><<set _exp_win_left to 0>><</if>>\ <<set _exp_left to _exp_win_left>>\ <</if>>\ <</silently>>\ <<if _exp_left neq null>> <<print '<span class="ev-expiry' + (_exp_left eq 1 ? ' ev-warn-1' : (_exp_left eq 3 ? ' ev-warn-3' : '')) + '">时效 ' + _exp_win + ' 天 · 还剩 ' + _exp_left + ' 天,到点自动了结</span>'>><</if>> <<if _ev.irreversible gte 3>> //⚠ 后果深远//<</if>> <<if _ev.paralysis_failed>> //🌒 已在无人过问中发酵成不可逆剧情//<</if>> <<if _ev.site_pending>> //🚩 已决定亲赴现场,期限未到//<</if>> <<print '<a class="file-handle-link" data-target-idx="' + _ev_idx + '" role="link" tabindex="0">[处理]</a>'>> <<set _fis_low to true>>\ <<if _ev.deck_id and (_ev.deck_id.indexOf("Y") eq 0 or _ev.deck_id.indexOf("R") eq 0 or _ev.deck_id.indexOf("S") eq 0 or _ev.deck_id.indexOf("P") eq 0)>><<set _fis_low to false>><</if>>\ <<if _ev.level is "promise" or _ev.level is "yellow">><<set _fis_low to false>><</if>>\ <<if _ev.source is "historical" or _ev.source is "swell">><<set _fis_low to false>><</if>>\ /* 剧情级大事不显示「冷处理」按钮(file-tool-cold 本体同口径拒绝) */ <<is-major-ev _ev>>\ <<if _ev_is_major>><<set _fis_low to false>><</if>>\ <<set _fis_heavy to false>>\ <<if _ev.level is "promise" or (_ev.deck_id and _ev.deck_id.indexOf("P") eq 0) or (_ev.deck_id and _ev.deck_id.indexOf("Y") eq 0) or _ev.level is "yellow">><<set _fis_heavy to true>><</if>>\ <<if _fis_low>><span class="tool-btn"><<link "冷处理">><<set $tool_target to _ev_idx>><<file-tool-cold>><<goto "Scene_Files">><</link>></span><</if>><<if _fis_heavy>><span class="tool-btn tool-btn-promo"><<link "紧急公关 (需6·现有_pc_avail)">><<set $tool_target to _ev_idx>><<file-tool-pr>><<goto "Scene_Files">><</link>></span><</if>> <</for>>\ <<else>>\ 文件篮是空的。纸片在风里打转。 //有时候,没有消息本身就是一种消息。//\ <</if>> <<link "返回办公室" "Scene_Office">><</link>> <<script>> // 文件篮处理链接:点击时把 data-target-idx 写入 $file_target_idx 并跳转 $(document).one(':passageend', function() { $('#passages .file-handle-link').each(function() { var idx = $(this).attr('data-target-idx'); $(this).on('click', function() { SugarCube.State.variables.file_target_idx = parseInt(idx); SugarCube.Engine.play('File_Event'); }).on('keydown', function(ev) { if (ev.key === 'Enter' || ev.key === ' ') { ev.preventDefault(); $(this).trigger('click'); } }); }); }); <</script>>\ </div>\
/* 处理完一个事件后,检查是否还有剩余 */ <<if $pending_events.length gt 0>>\ //还有 $pending_events.length 件待办。// <<link "处理下一件" "Scene_Files">><</link>> <<else>>\ //文件篮空了。// //你靠在椅背上,听见自己的脊椎咔嗒响了一声。这一天还没过完,但你已经累了。//\ <</if>>\ <<link "返回办公室" "Scene_Office">><</link>>
/* 夜幕降临 · 一天的收束时刻 */\ //夜幕降临。// 威廉街的灯亮了。煤气灯,在风里晃。 远处传来一阵哨声--也许是警察,也许是某个醉鬼在自娱自乐。在柏林,你分不清。 ''-- 今日回顾 --'' <<silently>> <<set _today_resolved to 0>>\ <<for _i to 0; _i lt $event_log.length; _i++>>\ <<set _log_ev to $event_log[_i]>>\ <<if _log_ev.resolved_date and _log_ev.resolved_date.year eq $date.year and _log_ev.resolved_date.month eq $date.month and _log_ev.resolved_date.day eq $date.day>>\ <<set _today_resolved to _today_resolved + 1>>\ <</if>>\ <</for>>\ <</silently>>\ <<if _today_resolved gt 0>>\ //今天你处理了 _today_resolved 件事。每一件都让这个国家朝某个方向倾斜了一点。//\ <<elseif $pending_events.length eq 0>>\ //今天没有需要你经手的事。文件篮空着,纸在风里安安静静地翻。//\ <<else>>\ //今天你没有处理任何事件。文件篮里的纸在风里翻。//\ <</if>>\ <<if $affinity_note_daily and $affinity_note_daily neq "">>\ <span class="txt-muted">$affinity_note_daily</span>\ <<set $affinity_note_daily to "">>\ <</if>>\ //你的疲惫://<<bar $player.mental.fatigue 100>> //魏玛情绪://''$weimar.surface.mood'' //魏玛疲惫://<<bar $weimar.surface.fatigue 100>> ''-- 国家状态 --'' //经济压力//:<<bar $world.economy 100>> //通胀恶化//:<<bar $world.inflation 100>> //社会愤怒//:<<bar $world.social_anger 100>> //政治暴力//:<<bar $world.political_violence 100>> //夜越来越深。你也该躺下了。这一天的重量,会压出一个短暂的梦。// <<if $weimar.personality_tension gte $weimar.effective_threshold>>\ //走廊尽头有脚步声。魏玛还没走。他没看你,但你知道他在等。// <<link "先去看看他" "Talk_Weimar">><</link>>\ <</if>> <<link "■ 休息 · 进入明天" "Scene_Office">> <<tp-rest>>\ <<tp-next-day>>\ <<if $passive_report_pending>><<goto "Scene_PassiveReport">><</if>>\ <</link>>\ @@.txt-muted;点它,一夜过去,日历翻到明天。@@ //也可以先做点别的——// <<link "找魏玛谈谈" "Talk_Weimar_Dialogue">><</link>> <<link "读报纸" "Private_Newspaper">><</link>> <<link "写日记" "Private_Diary">><</link>>
/* 消极处理结算回执(V0.5-C):按知情者分层——10+ 显示定性效果,20+ 显示具体数值 治理路线 v2:kind="route" 的条目是「已按你的路线办妥」,不是「你没处理」 */ <<silently>> <<set _pr_count to $passive_report.length>>\ <<set $passive_report_pending to false>>\ <<set _zhi to 0>>\ <<set _pr_route to 0>>\ <<set _pr_warn to 0>>\ <<set _pr_note to 0>>\ <<if $active_tags and $active_tags.length gt 0>>\ <<for _zt to 0; _zt lt $active_tags.length; _zt++>>\ <<if $active_tags[_zt] and $active_tags[_zt].name eq "知情者">>\ <<set _zhi to Number($active_tags[_zt].intensity) || 0>>\ <</if>>\ <</for>>\ <</if>>\ <<for _prc to 0; _prc lt _pr_count; _prc++>>\ <<set _prk to $passive_report[_prc].kind ? $passive_report[_prc].kind : "warn">>\ <<if _prk is "route">><<set _pr_route to _pr_route + 1>>\ <<elseif _prk is "note">><<set _pr_note to _pr_note + 1>>\ <<else>><<set _pr_warn to _pr_warn + 1>>\ <</if>>\ <</for>>\ <</silently>>\ <<if _pr_warn gt 0 and _pr_route gt 0>>\ ''-- 夜里的两本账 --'' //夜里你合上眼。有些事照你的路数办妥了;有些,你始终没有伸手。//\ <<elseif _pr_route gt 0 and _pr_warn eq 0>>\ ''-- 已按你的路数办妥的事 --'' //夜里你合上眼。搁了几天没亲手的文件,秘书照你一贯的口味替你办了。//\ <<elseif _pr_warn gt 0>>\ ''-- 你没有处理的那些事 --'' //夜里你合上眼。文件篮里有几张纸,始终没有你的手印。//它们没有等你,已经各自有了结局。//\ <<else>>\ ''-- 案头压着的事 --'' //有几份文件在灯下摊着。它们不归任何路线管——只等你的手。//\ <</if>>\ <<if _pr_count gt 0>>\ <<for _prr to 0; _prr lt _pr_count; _prr++>>\ <<set _prk to $passive_report[_prr].kind ? $passive_report[_prr].kind : "warn">>\ <<if _prk is "route">>\ <div class="passive-item"><span class="passive-sym">✒</span>已按【$passive_report[_prr].route】处理《$passive_report[_prr].name》:选了「$passive_report[_prr].choice」<<if _zhi gte 10 and $passive_report[_prr].eff>><span class="passive-eff">「$passive_report[_prr].eff」</span><</if>><<if _zhi gte 20 and $passive_report[_prr].delta>><span class="passive-delta">演化影响:$passive_report[_prr].delta</span><</if>></div>\ <<elseif _prk is "cadence">>\ <div class="passive-item"><span class="passive-sym">·</span>《$passive_report[_prr].name》——没等你,自己走完了。<<if _zhi gte 10 and $passive_report[_prr].eff>><span class="passive-eff">「$passive_report[_prr].eff」</span><</if>><<if _zhi gte 20 and $passive_report[_prr].delta>><span class="passive-delta">演化影响:$passive_report[_prr].delta</span><</if>></div>\ <<elseif _prk is "note">>\ <div class="passive-item"><span class="passive-sym">✉</span>$passive_report[_prr].name<<if $passive_report[_prr].eff>><span class="passive-eff">//「$passive_report[_prr].eff」//</span><</if>></div>\ <<else>>\ <div class="passive-item"><span class="passive-sym">⚠</span>//你没有处理《$passive_report[_prr].name》。//<<if _zhi gte 10>>\ <span class="passive-eff">「$passive_report[_prr].eff」</span><<if _zhi gte 20 and $passive_report[_prr].delta>><span class="passive-delta">演化影响:$passive_report[_prr].delta</span><</if>><</if>></div>\ <</if>>\ <</for>>\ <hr> <<if _zhi gte 20>>\ //你的线报够灵。每一笔高低起伏,都在你账本上落了墨。//\ <<elseif _zhi gte 10>>\ //你的线报只说个大概——方向你知道了,深浅暂时还看不清。//\ <<else>>\ //有些事,你只看见它们发生,看不清它们改变了什么。//\ <</if>>\ <<if _pr_warn gt 0>>\ //有的会自己了结。有的,把那口气憋成了更大的事。你会知道的。//\ <<else>>\ //办得对不对,天亮自有分晓。//\ <</if>>\ <<else>>\ <div class="passive-item passive-nil"><span class="passive-sym">·</span>今天没有需要你过目、就会被自己了结的事。夜很安静。</div>\ <</if>> <<link "「合上眼睛」" "Scene_Office">><</link>>
/* ════════════════════════════════════════════════════════════ 日记系统:自我认知标签生成/固化 + 连续强化检测 主题 -> 3次生成标签 -> 5次固化(升级标签) 主题映射: 希望 -> 【自信者】 -> 【坚定者】 绝望 -> 【疲惫者】 -> 【倦怠者】 无力 -> 【怀疑者】 -> 【犬儒者】 魏玛 -> 【冷静者】 -> 【计算者】 人民 -> 【共情者】 -> 【守护者】 ════════════════════════════════════════════════════════════ */ /* ---------- diary-tag-check:日记主题计数 + 标签生成/固化 ---------- 用法:<<diary-tag-check 主题>> 在写完一篇日记后调用:该主题计数+1,达3次生成第一档标签,达5次固化(升级第二档)。 输出 _diary_tag_msg(本次获得的标签提示,空则无)。 */ <<widget "diary-tag-check">>\ <<silently>> <<set _dtc_theme to $args[0]>> <<set _diary_tag_msg to "">> <<set $diary_counts[_dtc_theme] to $diary_counts[_dtc_theme] + 1>> <<set $diary_total to $diary_total + 1>> <<set _dtc_n to $diary_counts[_dtc_theme]>> /* 主题 -> 第一档/第二档标签 */ <<set _dtc_first to "">> <<set _dtc_second to "">> <<if _dtc_theme eq "希望">><<set _dtc_first to "自信者">><<set _dtc_second to "坚定者">> <<elseif _dtc_theme eq "绝望">><<set _dtc_first to "疲惫者">><<set _dtc_second to "倦怠者">> <<elseif _dtc_theme eq "无力">><<set _dtc_first to "怀疑者">><<set _dtc_second to "犬儒者">> <<elseif _dtc_theme eq "魏玛">><<set _dtc_first to "冷静者">><<set _dtc_second to "计算者">> <<elseif _dtc_theme eq "人民">><<set _dtc_first to "共情者">><<set _dtc_second to "守护者">> <</if>> /* 固化(5次):替换第一档为第二档 */ <<if _dtc_n gte 5 and _dtc_second neq "" and not $player.tags.includes(_dtc_second)>> <<set $player.tags.push(_dtc_second)>> <<set _dtc_tmp to []>> <<for _dtc_i to 0; _dtc_i lt $player.tags.length; _dtc_i++>> <<if $player.tags[_dtc_i] neq _dtc_first>> <<set _dtc_tmp.push($player.tags[_dtc_i])>> <</if>> <</for>> <<set $player.tags to _dtc_tmp>> <<set _diary_tag_msg to "你在日记里反复写下这个念头,它已经成了你的一部分。你获得了自我认知:【" + _dtc_second + "】。">> /* 生成(3次) */ <<elseif _dtc_n gte 3 and _dtc_first neq "" and not $player.tags.includes(_dtc_first)>> <<set $player.tags.push(_dtc_first)>> <<set _diary_tag_msg to "你开始认识自己了。你获得了自我认知:【" + _dtc_first + "】。">> <</if>> <</silently>>\ <</widget>> /* ---------- diary-streak:连续强化检测 ---------- 用法:<<diary-streak 主题>> 若与上次写的主题相同,连续天数+1;否则重置为1。 连续达到3天时,本次计数额外算作+1(在 diary-tag-check 前调用)。 输出 _diary_streak_bonus(本次是否因连续而额外+1)。 */ <<widget "diary-streak">>\ <<silently>> <<set _ds_theme to $args[0]>> <<set _diary_streak_bonus to false>> <<if $diary_last_theme eq _ds_theme>> <<set $diary_streak to $diary_streak + 1>> <<else>> <<set $diary_streak to 1>> <</if>> <<set $diary_last_theme to _ds_theme>> <<if $diary_streak gte 3>> <<set $diary_streak to 0>> <<set $diary_counts[_ds_theme] to $diary_counts[_ds_theme] + 1>> <<set _diary_streak_bonus to true>> <</if>> <</silently>>\ <</widget>>
<<tp-rest>>\ <<silently>> <<player-stance>> /* 10条随机睡眠文本 + 3种倾向变体 */ <<set _rest_pool to []>> <<if _stance_type eq "hard">> <<set _rest_pool to [ "你躺下,但手还握着拳。指节在黑暗里发白,像攥着一支看不见的笔。", "枕头上有墨水渍。你翻了个身,墨水渍转到另一边。有些东西翻不掉。", "你梦到签字。签了一整夜。醒来的时候,手指还在动--在床单上划名字。", "壁炉灭了。你没去管。你太累了,连灭火的力气都用来睡了。", "你听见走廊里有脚步声。不是真的--是你的身体在模仿白天的紧张。它还没学会怎么停。", "窗外有风。风声像有人在叫你的名字。你知道不是,但你的手还是摸到了床头。", "你睡了一觉,醒来发现牙咬得很紧。下巴酸。也许白天咬得太紧了,夜里没松开。", "天花板上有道裂缝。你盯着它,直到它变成一道签字的笔迹--弯曲的,不可逆的。", "你翻了三次身。每次翻身都伴随着一声叹息,不是你的,是床的。床也累了。", "你闭上眼,但脑子里还在转。像一台停不了的机器,只是拔了电源,齿轮还在惯性里滑行。" ]>> <<elseif _stance_type eq "soft">> <<set _rest_pool to [ "你躺下,松了一口气。气只松了一半--另一半卡在喉咙里,像一句没说完的话。", "枕头上有咖啡渍。你翻了翻,找到了一块干净的地方。在柏林,干净的地方越翻越小。", "你梦到谈判。谈了一整夜。醒来的时候,嘴角在笑--也许是梦里达成了什么。", "壁炉还亮着。你没灭它。让它亮着,像留一盏灯给可能来的人。", "你听见走廊里有脚步声。不是真的--但你还是听了一会儿。也许是习惯,也许是期待。", "窗外有风。风声像有人在低声说话。你听不清内容,但语气温和。也许梦里的。", "你睡了一觉,醒来发现手是摊开的。不是握拳,是摊开。你不确定这意味着什么。", "天花板上有道裂缝。你盯着它,直到它变成一条路--弯弯曲曲,通向一个你看不清的地方。", "你翻了三次身。每次翻身前都想了一下今天的事,然后决定不想了。然后又想了。", "你闭上眼,脑子里还剩一个问题没解决。它陪你睡了一夜,早上还在。" ]>> <<elseif _stance_type eq "wait">> <<set _rest_pool to [ "你躺下,但脑子里还有一份文件没处理。它在抽屉里等。抽屉也在等你。", "枕头上有灰。你吹了吹,灰飞起来,落在别处。问题也是这样--吹走一个,落在另一个地方。", "你梦到等待。等了一整夜。等什么不知道,但等的感觉很真实。", "壁炉灭了。你没去管。反正明天再说。明天总是再说。", "你听见走廊里有脚步声。不是真的--但你也没有起身确认。也许不是也许。", "窗外有风。风声像有人在催你。你翻了个身,背对着窗户。催也没用。", "你睡了一觉,醒来发现时间过了一整夜。你不确定这是浪费还是休息。也许没有区别。", "天花板上有道裂缝。你盯着它,直到它变成一道裂痕--不是天花板的,是某个你没处理的问题的。", "你翻了三次身。每次翻身都想:明天处理。明天到了,再翻一次。", "你闭上眼,脑子里一片空白。不是平静的空白,是推迟了的空白。推迟的东西会在白天回来。" ]>> <<else>> <<set _rest_pool to [ "你躺下。天花板上有道裂缝,你盯着它,直到它变成别的东西--一条河,一道伤口。", "枕头是凉的。你翻了翻,找到一块暖的地方。暖的地方很快变凉,你又翻。", "你梦到什么都不记得的东西。醒来时只剩一种感觉,像手心里残留的温度。", "壁炉的光在墙上晃。你看着影子变形,像看一场没有声音的戏。", "窗外有风。风声不大,但持续。像有人在很远的地方说话,说了一整夜。", "你睡了一觉。醒来不确定睡了多少。在柏林,时间不是用钟量的,是用疲惫量的。", "你闭上眼。黑暗里有光点在动,不是星星,是眼底血管的投影。你以为看见了什么,其实什么都没看见。", "床板硬。你换了个姿势,骨头咔嗒响了一声。这声比白天任何文件都真实。", "你翻了个身。窗外有人在咳。咳了很久,然后停了。你不确定他好了还是睡了。", "你睡着了。没有梦。在柏林,没有梦已经是最好的梦了。" ]>> <</if>> <<set _rest_text to _rest_pool[random(0, _rest_pool.length - 1)]>> <</silently>>\ <<if $player.mental.fatigue gte 100>>\ //膝盖先软的。然后是眼皮。你扶着墙,但墙也在动。// //秘书叫了车。你被扶上了后座。车开了,你不知道路,只知道在动。// //_rest_text//\ <<else>>\ //_rest_text//\ <</if>> //(疲惫恢复)// <<link "迎接新的一天" "Scene_Office">> <<tp-next-day>>\ <</link>> <<silently>> <<weimar-night-gate>> <</silently>>\ <<if $weimar_night_talk and _night_allowed>>\ <hr> ''夜深了。窗口的光还没有熄灭。'' //你正要睡下,门被轻轻叩响了。不是秘书,不是警卫——是那种你不会认错的声音。// //魏玛站在门外,没有进来。他披着衣服,脸色在走廊的灯下显出一种疲惫的灰。他看了你很久,才开口。// <<silently>> <<set _pc to $weimar_pending_convert>> <<if _pc eq "party_dnvp">> <<set $weimar_night_line to "「你答应了他们。」他站在门口,没有进来,声音比夜色还轻,「复辟。你听过那个词吗?我听过——1919年,有一群人差点把它写回宪法。他们没得逞,是因为有太多人愿意挡在它前面。今晚,你也站到了他们那一边。」他顿了顿,「我不是来劝你回头的。我只是想让你知道,我看见你走过去的那一步了。共和国在自己人手里,比死在敌人手里更疼。」">> <<elseif _pc eq "party_kpd">> <<set $weimar_night_line to "「你答应了他们。」他靠在门框上,像站不稳,「革命。他们要烧掉这栋楼,再从灰里建一座新的。我没拦那些想烧的人——可我以为,你会是我们这边拦火的人。今晚你松了手。」他低声道,「我梦见过共和国着火的样子。我没想到,点亮第一根火柴的,是你。」">> <<elseif _pc eq "party_spd">> <<set $weimar_night_line to "「你答应了 SPD。」他站在门外,这一次他没有回避你的目光,「我好高兴。不是高兴你站到了谁那边——是高兴你终于回到了我想要的民主。你没有扭曲我的意志,没有要把我改造成另一副模样。你握着刀,却用它来握宪法。」他顿了顿,「好些人说要替我守住它,到头来却把它改得面目全非。而你,是头一个真想让共和国,还是它本来的样子的。」">> <<elseif _pc eq "party_ddp">> <<set $weimar_night_line to "「你答应了 DDP。」他站在门外,声音像怕惊动什么,「宪法之约。你答应他,不绕过那本东西行事。你知道这意味着什么吗——意味着你手里那根能走捷径的钥匙,你不打算用了。」他眼里的光,比夜色深,「许多人以为宪法是共和国脚上的锁链,可你我都知道,它是它站着的骨头。你肯抱着这根骨头走下去,我……我没什么可多说的了。谢谢你,替它守着。」">> <<elseif _pc eq "inflation">> <<set $weimar_night_line to "「马克。」他说,声音很轻,像怕这个名字太重,「我数过它的零。从一数到一万,要数很久。可它从一万跌下去,只花了一个下午。我睡不着——不是怕它跌,是怕它有一天跌进我的梦里,我就分不清醒着和睡着了。」">> <<elseif _pc eq "social_anger">> <<set $weimar_night_line to "「街上的人。」他说,「他们的眼睛。我白天在文件里看到的是数字,可一到晚上,我看到的是那些眼睛。它们在看我——问我钱够不够,面包够不够。我答不上来。」">> <<elseif _pc eq "political_violence">> <<set $weimar_night_line to "「巷子里有血。」他说,「不是真的血,是那种还没发生、但已经能闻到的血。我听见铁器在暗中碰撞的声音。我担心总有一天,它会在我的梦里开火。」">> <<elseif _pc eq "revolution">> <<set $weimar_night_line to "「有人在传说革命。」他说,「我听过这个词,在1919年听过。我不怕它发生——我怕的是我不知道它什么时候来,而我还没准备好该站在哪一边。」">> <<else>> <<set $weimar_night_line to "「我睡不着。」他说,「你也睡不着吧。今晚的柏林,比平时更重了一些。」">> <</if>> <</silently>>\ //$weimar_night_line// //他顿了顿,像是把什么咽了回去。// //「你来……你来就好。我就是想让你知道,我看见了。这些数字,这些事,我都看见了。」// //他转身走回黑暗里。你站在原地,听见他的脚步声一节一节地远了。你睡了,但你知道今晚,他大概还醒着。// <<weimar-night-convert _pc>>\ <<if _pc eq "party_spd" or _pc eq "party_ddp">>\ <span class="txt-sys">//(魏玛的精神状态因今晚的对话而波动 · 有一个人,愿意陪他一起守了)//</span>\ <<else>>\ <span class="txt-sys">//(魏玛的精神状态因今晚的对话而波动 · 共和国的伤痛正在加深)//</span>\ <</if>>\ <</if>>
/* 读报 · 世界状态新闻化呈现 根据 $world 变量生成头条新闻,让玩家通过报纸感知国家变化 */ //报纸// <<silently>> <<set _headlines to []>> /* 经济类新闻:根据 economy + inflation 生成 */ <<if $world.inflation gte 60>> <<set _headlines.push("马克再次暴跌。美元汇率又多了一个零。报童在街角喊这个数字的时候,自己都笑了。")>> <<elseif $world.inflation gte 35>> <<set _headlines.push("物价委员会宣布新一轮限价措施。零售商协会表示「遗憾」。")>> <<elseif $world.inflation lt 20>> <<set _headlines.push("马克企稳。银行家们说「最坏的时刻已经过去」。他们说这话的时候在擦汗。")>> <</if>> <<if $world.economy gte 60>> <<set _headlines.push("鲁尔工业区产出再创新低。失业统计处门口排的队比面包店还长。")>> <<elseif $world.economy gte 35>> <<set _headlines.push("工会要求提高最低工资标准。DVP代表称之为「不切实际的幻想」。")>> <</if>> /* 政治类新闻:根据 social_anger + revolution + political_violence */ <<if $world.political_violence gte 50>> <<set _headlines.push("柏林又发生街头冲突。伤亡人数各方说法不一。警方称「局势可控」。")>> <<elseif $world.political_violence gte 30>> <<set _headlines.push("夜间巡逻加强。内政部发言人说这是「预防性措施」。居民说这是「习惯」。")>> <</if>> <<if $world.revolution gte 40>> <<set _headlines.push("KPD机关报呼吁工人总罢工。社论标题只有三个字:「时候到。」")>> <<elseif $world.revolution gte 25>> <<set _headlines.push("总工会内部就是否支持大罢工产生分歧。SPD右翼称「为时过早」。")>> <</if>> <<if $world.social_anger gte 50>> <<set _headlines.push("多座城市爆发自发抗议。没有组织者,没有口号,只有人。")>> <</if>> /* 民族主义类 */ <<if $world.nationalism gte 50>> <<set _headlines.push("DNVP在多个邦议会选举中取得突破。NSDAP宣称「我们的时代到了」。")>> <<elseif $world.nationalism gte 30>> <<set _headlines.push("民族协会举办大型集会。主题:「凡尔赛的枷锁」。座无虚席。")>> <</if>> <<if $world.army_influence gte 40>> <<set _headlines.push("国防部预算审议通过。军方代表没有出席投票--他们不需要。")>> <</if>> /* 政府信誉类 */ <<if $world.gov_trust lte 20>> <<set _headlines.push("国会质询中,多名议员要求总理解释「信任危机」。总理沉默了七秒。")>> <<elseif $world.gov_trust gte 60>> <<set _headlines.push("最新民调显示政府支持率回升。分析人士称「与货币稳定有关」。")>> <</if>> /* 如果没有触发任何新闻 */ <<if _headlines.length eq 0>> <<set _headlines.push("今天的报纸很薄。头版是天气预报。在柏林,没有新闻有时候是唯一的新闻。")>> <</if>> /* 活跃标签也会出现在报纸里 */ <<if $active_tags.length gt 0>> <<for _i to 0; _i lt Math.min(2, $active_tags.length); _i++>> <<if $active_tags[_i].status is "active" and $active_tags[_i].intensity gt 10>> <<set _headlines.push($active_tags[_i].name + ":相关报道持续见诸报端。")>> <</if>> <</for>> <</if>> <</silently>>\ 今天的报纸有 _headlines.length 条值得看的: <<for _i to 0; _i lt _headlines.length; _i++>>\ - //_headlines[_i]// <</for>> <<tag-add "知情者" "micro" 5 "玩家行为" "weimar" "newspaper">>\ //(知情者 +5)// <<link "休息" "Scene_Rest">><</link>>
/* 日记 · 基于今日选择自动生成内容回顾 从 event_log 中提取今天处理的事件,生成日记回顾 */ //日记本// 你翻开本子。纸是黄的。墨水在变稀--也许是水分蒸发了,也许是你自己。 <<silently>> /* 提取今天处理的事件 */ <<set _today_events to []>> <<for _i to 0; _i lt $event_log.length; _i++>> <<set _log_ev to $event_log[_i]>> <<if _log_ev.resolved_date and _log_ev.resolved_date.year eq $date.year and _log_ev.resolved_date.month eq $date.month and _log_ev.resolved_date.day eq $date.day>> <<set _today_events.push(_log_ev)>> <</if>> <</for>> <</silently>>\ <<if _today_events.length gt 0>>\ 今天你处理了这些事: <<for _i to 0; _i lt _today_events.length; _i++>>\ - //_today_events[_i].title// <</for>> 什么让你印象最深?\ <<else>>\ 今天没有处理任何事件。纸是空白的。 //有时候空白本身就是一种记录。// 你在想什么?\ <</if>> <<link "这个国家还有救" "Private_Diary_Write">><<set _diary_theme to "希望">><</link>> <<link "一切都在崩塌" "Private_Diary_Write">><<set _diary_theme to "绝望">><</link>> <<link "你只是棋子" "Private_Diary_Write">><<set _diary_theme to "无力">><</link>> <<link "魏玛让你不安" "Private_Diary_Write">><<set _diary_theme to "魏玛">><</link>> <<link "街上的人让你想了很久" "Private_Diary_Write">><<set _diary_theme to "人民">><</link>>
/* 日记 · 感受记录 根据选择的主题产生不同的精神效果 并累计日记主题计数(diary-streak 连续强化 + diary-tag-check 生成自我认知标签) */ <<silently>> <<diary-streak _diary_theme>> <<diary-tag-check _diary_theme>> <<set _diary_streak_note to "">> <<if _diary_streak_bonus>> <<set _diary_streak_note to "(连续三日写着同一个念头,它在你心里扎了根。)">> <</if>> /* 从正文池随机抽取一段日记正文(丰富重玩差异) */ <<set _diary_entry to "">> <<if $diary_entry_pools and $diary_entry_pools[_diary_theme] and $diary_entry_pools[_diary_theme].length gt 0>> <<set _diary_entry to $diary_entry_pools[_diary_theme][random(0, $diary_entry_pools[_diary_theme].length - 1)]>> <</if>> /* 提示词:反映这次书写带来的状态变化(紧跟正文之后) */ <<set _diary_hint to "">> <<if _diary_theme eq "希望">><<set _diary_hint to "你对『共和国』写下这行字后,对共和国能撑下去这件事,多了一点信心。">> <<elseif _diary_theme eq "绝望">><<set _diary_hint to "写下这些字时,疲惫顺着笔杆爬进你的掌心。">> <<elseif _diary_theme eq "无力">><<set _diary_hint to "写完这句,你更清楚地看见自己站在棋盘外的位置。">> <<elseif _diary_theme eq "魏玛">><<set _diary_hint to "落笔时,你和魏玛之间那扇门,像又开了一线。">> <<elseif _diary_theme eq "人民">><<set _diary_hint to "记下他们的脸之后,你心里冻住的那块,松动了一点。">> <</if>> <</silently>>\ <<if _diary_theme eq "希望">>\ //_diary_entry// //<span class="txt-sys">_diary_hint</span>// //你盯着那三个字看了很久。它们在纸上越来越小。// //也许你是在说服自己。也许不是。在柏林,「还有救」有时候是一种勇气,有时候是一种幻觉。// <<set $player.mental.idealism to Math.min(100, $player.mental.idealism + 5)>>\ <<set $player.mental.isolation to Math.max(0, $player.mental.isolation - 2)>>\ //(理想 +5,孤独 -2)//\ <<elseif _diary_theme eq "绝望">>\ //_diary_entry// //<span class="txt-sys">_diary_hint</span>// //你合上本子。墨水还没干,但你不想再看了。// <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + 3)>>\ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 3)>>\ //(疲惫 +3,魏玛焦虑 +3)//\ <<elseif _diary_theme eq "无力">>\ //_diary_entry// //<span class="txt-sys">_diary_hint</span>// //棋子也能走。只是不能自己选方向。但这不意味着不能选怎么走。// <<set $player.mental.isolation to Math.min(100, $player.mental.isolation + 3)>>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 2)>>\ //(孤独 +3,偏执 +2)//\ <<elseif _diary_theme eq "魏玛">>\ //_diary_entry// //<span class="txt-sys">_diary_hint</span>// //他是一栋你每天住在里面、却从不完全了解的房子。// <<set $weimar.mid.democracy_trust to Math.min(100, $weimar.mid.democracy_trust + 1)>>\ <<set $npcs.weimar.trust to Math.min(100, $npcs.weimar.trust + 2)>>\ //(魏玛民主信任 +1,魏玛信任 +2)//\ <<elseif _diary_theme eq "人民">>\ //_diary_entry// //<span class="txt-sys">_diary_hint</span>// //卖报童。码头工人。排队的老妇。他们不知道你在写他们。// //但在柏林,记住本身就是一种立场。// <<set $player.mental.idealism to Math.min(100, $player.mental.idealism + 3)>>\ <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - 2)>>\ //(理想 +3,疲惫 -2)//\ <</if>> <<if _diary_streak_note neq "">>\ //<span class="txt-sys">_diary_streak_note</span>//\ <</if>>\ <<if _diary_tag_msg neq "">>\ <div class="spd-note"><span class="spd-note-tag">自我认知</span>_diary_tag_msg</div>\ <</if>> //你合上日记本。// //明天又是新的一天。也许。// <<link "休息" "Scene_Rest">><</link>>
''自身状态'' ''精神'' 疲惫:<<bar $player.mental.fatigue 100>> 偏执:<<bar $player.mental.paranoia 100>> 理想:<<bar $player.mental.idealism 100>> 孤独:<<bar $player.mental.isolation 100>> ''政治光谱'' <<if $player.tags.length eq 0>>\ //(你还没有明显的政治倾向。也许这是好事。也许不是。)//\ <<else>>\ <<for _i to 0; _i lt $player.tags.length; _i++>>\ <<set _t to $player.tags[_i]>>\ <<if _t.solidified>>''_t.name''<<else>>_t.name<</if>>(_t.intensity) <</for>>\ <</if>> ''魏玛'' 民主信任:<<bar $weimar.mid.democracy_trust 100>> 军队依赖:<<bar $weimar.mid.army_dependence 100>> 精神负荷:<<bar $weimar.personality_tension $weimar.effective_threshold>> <<if $weimar.mid.democracy_trust gt 60>>\ 他开始问你问题了。这是一个好迹象。也许。\ <<elseif $weimar.mid.democracy_trust gt 30>>\ 他对你保持礼貌的距离。像两根靠得太近的电线。\ <<else>>\ 他看你的眼神变了。不是恨。是更安静的东西。\ <</if>> ''历史恐惧'' <<set _any to false>>\ <<for _k, _v range $weimar.historical_anxiety>>\ <<if _v gt 0>>\ <<set _any to true>>\ _k:<<bar _v 20>>\ <</if>>\ <</for>>\ <<if not _any>>\ //(暂无。他还不知道怕什么。)//\ <</if>> <<link "返回" "Scene_Office">><</link>>
<<set $weimar_betray_talk_done to true>>\ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 10)>> ''魏玛在等你。'' //你推门进来时,魏玛正站在窗前。他没有回头。窗外的柏林,正下着细雪。// //「你回来了。」他说,声音很平,平得像在陈述一件他已经确认过的事实。「我以为你今天不会回来。我以为,你已经去了别的地方。」// //他转过身。他的目光落在你身上,又移开,像在看一件他曾经熟悉、如今却认不出的东西。// <div class="dnvp-speech">「我见过你签字的样子。你替军部批预算的时候,笔尖落得那样稳。你替那家报纸封口的时候,稳得像早就练过。你替那些旧名字发抚恤的时候……你甚至没有停顿。」</div> //「你不是在替共和国做事。你是在替一个已经死去的东西,铺路。」// //他说这话的时候,没有愤怒。他只是陈述。可正是这种平静,让你觉得,屋子里的空气都冷了一分。// ''你要怎么回答他。'' <<link "「我没有背叛共和国。我只是在走一条更稳的路。」">> <<set $talk_betrayal_choice to 1>>\ <<set $weimar.surface.anxiety to Math.max(0, $weimar.surface.anxiety - 5)>>\ <<goto "Talk_Weimar_Betrayal_End">>\ <</link>> <<link "「共和国已经救不活了。我只是在找下一个可以站的地方。」">> <<set $talk_betrayal_choice to 2>>\ <<set $npcs.weimar.trust to Math.max(0, $npcs.weimar.trust - 8)>>\ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 5)>>\ <<goto "Talk_Weimar_Betrayal_End">>\ <</link>> <<link "沉默。你没有什么可辩解的。">> <<set $talk_betrayal_choice to 3>>\ <<set $weimar.surface.anxiety to Math.max(0, $weimar.surface.anxiety - 3)>>\ <<goto "Talk_Weimar_Betrayal_End">>\ <</link>>
<<if $talk_betrayal_choice eq 1>>\ //魏玛看着你,很久。最后他点了点头。// //「更稳的路。」他重复了一遍,像在咀嚼一个陌生的词。「但愿它真的更稳。但愿它不会,在某个夜里,回过头来咬你。」//\ <<elseif $talk_betrayal_choice eq 2>>\ //魏玛的目光暗了下去。他转过身,重新面对窗外的雪。// //「那你就去找吧。」他说,「只是别再打着共和国的旗号,走进那间屋子。」//\ <<else>>\ //魏玛没有追问。他陪你沉默了很久,久到窗外的雪,积了一层。// //「你走吧。」他终于开口,「只是记住——你今天签下的每一笔,总有一天,会有人来问你,那笔钱,流向了哪里。」//\ <</if>> <<link "返回办公室" "Scene_Office">><</link>>
<<set _anxiety to 0>>\ <<for _k, _v range $weimar.historical_anxiety>>\ <<set _anxiety to _anxiety + _v>>\ <</for>>\ <<weimar-presence>>\ <<silently>> /* 魏玛的阶梯:夜话计数 + 每晚结算晋级(79e/79f) */ <<if not $weimar_ladder>><<weimar-ladder-init>><</if>> <<set $weimar_ladder.talks to ($weimar_ladder.talks || 0) + 1>> <<weimar-ladder-tick>> <</silently>> <<if $weimar.presence is "critical">>\ /* 震荡分支 · 意识流调性:人格张力爆发,呼应序章下坠感 */ <<type 18ms>>又来了。<<br>><<br>><</type>> <<type 18ms>>那种感觉。失重,坠落,被撕扯。他以为它已经走了。它蛰伏在意识的阴影里等待着,等一个他自己也说不上来的时机。<<br>><<br>><</type>> <<timed 2s>><<type 18ms>>魏玛站在窗前,背对着你。他的轮廓在灯下微微晃动。<</type>><</timed>> <<timed 3s>><<type 18ms>>「我说不清是什么。」<<br>><<br>><</type>><</timed>> <<timed 3.5s>><<type 18ms>>声音很轻,像怕惊醒什么。<</type>><</timed>> <<timed 4s>><<type 18ms>>「但我知道它变了。」<<br>><<br>><</type>><</timed>> <<timed 4.5s>><<type 18ms>>他停了一下。<</type>><</timed>> <<timed 5s>><<type 18ms>>「像骨头在变脆。不是折断——是慢慢变空。」<<br>><<br>><</type>><</timed>> <<timed 6s>><<type 18ms>>他转过身。<<br>><<br>><</type>><</timed>> <<timed 6.5s>><<type 18ms>>眼里的血丝比以前更重了。此刻看着你的这一个,和白天的那一个,好像不是同一个「他」。<</type>><</timed>> <<timed 8s>><<type 18ms>>他在等你开口。<</type>><</timed>> <<timed 10s>>\ ''他会记住你今晚说的每一个字。'' <<link "「你还是你。这一点从来没变。」">> <<set $weimar.personality_tension to $weimar.personality_tension * 0.3>>\ <<set $weimar.surface.anxiety to Math.max(0, $weimar.surface.anxiety - 10)>>\ <<weimar-soften "anchor">>\ <<goto "Talk_Weimar_Resolve">>\ <</link>>\ <<link "「也许……你不必非得是共和国。」">> <<set $weimar.personality_tension to 0>>\ <<set $weimar.mid.democracy_trust to Math.max(0, $weimar.mid.democracy_trust - 3)>>\ <<weimar-soften "bend">>\ <<goto "Talk_Weimar_Resolve">>\ <</link>>\ <<link "「我不知道。真的。」">> <<set $weimar.personality_tension to Math.min($weimar.effective_threshold + 5, $weimar.personality_tension + 2)>>\ <<weimar-soften "vague">>\ <<goto "Talk_Weimar_Resolve">>\ <</link>>\ <<link "你什么也没说,走过去,和他并排站着。">> <<set $weimar.personality_tension to $weimar.personality_tension * 0.5>>\ <<goto "Talk_Weimar_Resolve">>\ <</link>><</timed>>\ <<else>>\ /* 非崩溃分支:独白 + 姿态面板 */ <<weimar-v2-speak>>\ $weimar_line ''你想怎么回应?'' <<weimar-stance-link "comfort" "安慰他">>\ <<weimar-stance-link "confront" "质问他">>\ <<weimar-stance-link "silent" "沉默陪伴">>\ <<weimar-stance-link "probe" "试探边界">>\ <<weimar-stance-link "confrontation" "与他对峙">> <<link "继续倾听" "Talk_Weimar_Listen">><</link>> <<link "坐下来深谈" "Talk_Weimar_Dialogue">><</link>> <<link "返回办公室" "Scene_Office">><</link>> <</if>>
/* 继续倾听:再抽一条魏玛独白(redo 原地重渲染,不跳页、不闪动) */ <<weimar-v2-speak>>\ $weimar_line <<link "继续倾听" "Talk_Weimar_Listen">><<redo>><</link>> <<link "回应他" "Talk_Weimar_Respond">><</link>> <<link "返回办公室" "Scene_Office">><</link>>
<<weimar-crisis-coef>>\ //你怎么回应?// <<link "解释你的立场" "Scene_Office">> <<set $weimar.surface.anxiety to Math.max(0, $weimar.surface.anxiety - 5)>>\ <</link>>\ <<link "认同他的担忧" "Scene_Office">> <<set $weimar.mid.democracy_trust to Math.min(100, $weimar.mid.democracy_trust + 2)>>\ <</link>>\ <<link "不以为然" "Scene_Office">> <<set $weimar.personality_tension to Math.min($weimar.effective_threshold, $weimar.personality_tension + 2 * (1 + _republic_crisis * 1.5))>>\ <</link>>\ <<link "沉默" "Scene_Office">><</link>>
/* 震荡平息 · 意识流收尾 */ <<type 50ms>>落。<</type>> <<timed 2s>><<type 40ms>>不是坠落的那种落。是钟摆摆到尽头,停了一瞬的那种落。下坠的眩晕退去了,但没走远。它只是退回阴影,重新趴下,等着下一次被惊醒。<</type>><</timed>> <<timed 7s>><<type 40ms>>魏玛没有再说话。他重新转向窗外。轮廓不再发颤了——或者说,颤得慢了,慢到你几乎看不见。<</type>><</timed>> <<timed 12s>>\ <center><<type 80ms>><font color="#FEC90C">有些东西确实不同了。</font><</type>></center><</timed>> <<timed 15s>><<type 40ms>>你说不清是什么。就像你说不清一道裂缝是什么时候出现的——它只是在某一天,突然就在那里了。<</type>><</timed>> <<timed 20s>>\ <<link "返回办公室" "Scene_Office">><</link>><</timed>> <<if $weimar_soften_text neq "">>\ <hr> //$weimar_soften_text//\ <</if>>
/* 主动对话系统 · 主界面(V2 UI:四组折叠 + 状态禁用选项) 取代旧 Talk_Weimar 非震荡分支。震荡分支(Talk_Weimar)保留不动。 */ <<set $dialogue_action_id to "">> /* 步骤1:模糊呈现魏玛当前状态 */ <<if $weimar.surface.fatigue gte 60>>\ //魏玛靠在椅背上,眼底发青。他看着你,但焦点不太对。// //他今天已经很累了。再说几句,他可能就会请你走。//\ <<elseif $weimar.surface.anxiety gte 30>>\ //魏玛在窗边踱步。脚步比平时快。他的手指在抠窗框上的漆皮。//\ <<elseif $weimar.surface.mood is "紧绷" or $weimar.personality_tension gte 6>>\ //魏玛坐着,但坐姿很僵。他在忍着什么。//\ <<else>>\ //魏玛在窗边站着。今天他看起来还算平静。//\ <</if>> /* 魏玛引用日记:当你写过足够多日记,他偶尔会提起你写下的那个自己 */ <<set _diary_callout to "">>\ <<set _diary_top_theme to "">>\ <<set _diary_top_n to 0>>\ <<silently>> <<if $diary_total gte 3 and $diary_counts>> <<set _dcb_keys to ["希望","绝望","无力","魏玛","人民"]>> <<for _dcb_i to 0; _dcb_i lt _dcb_keys.length; _dcb_i++>> <<if ($diary_counts[_dcb_keys[_dcb_i]] || 0) gt _diary_top_n>> <<set _diary_top_n to $diary_counts[_dcb_keys[_dcb_i]]>> <<set _diary_top_theme to _dcb_keys[_dcb_i]>> <</if>> <</for>> <<if _diary_top_theme neq "" and random(1, 100) lte 25>> <<if _diary_top_theme eq "希望">><<set _diary_callout to "「你昨天在日记里写,这个国家还有救。」他说,语气平常得像在说天气,「我看见了。你写下它的时候,笔很用力。」">> <<elseif _diary_top_theme eq "绝望">><<set _diary_callout to "「你昨晚写,一切都在崩塌。」魏玛没有看你,「我以前也这么写过。……可你还在写,说明你还没完全信。」">> <<elseif _diary_top_theme eq "无力">><<set _diary_callout to "「你在日记里说,你只是一枚棋子。」魏玛低声说,「棋子不知道自己会走到哪一步,可它每一步都是真的。」">> <<elseif _diary_top_theme eq "魏玛">><<set _diary_callout to "「你写到了我。」魏玛的声音顿了一下,「你写,你分不清是信任还是审判。……我也分不清。」">> <<elseif _diary_top_theme eq "人民">><<set _diary_callout to "「你写那些街上的人。」魏玛说,「写他们的时候,你比写我的时候要平静。……也许那才是你真正在乎的东西。」">> <</if>> <</if>> <</if>> <</silently>>\ <<if _diary_callout neq "">>\ <div class="spd-note"><span class="spd-note-tag">魏玛</span>_diary_callout</div>\ <</if>> /* 魏玛记忆引用:他偶尔会提起你曾说过的话 */ <<weimar-memory-recall>>\ <<if $weimar_memory_line neq "">>\ <div class="spd-note"><span class="spd-note-tag">魏玛记得</span>$weimar_memory_line</div>\ <</if>> /* 冷战提示:多次激烈互动后,魏玛会跟你冷战 */ <<if $weimar_cold_war gt 0>>\ <<if $weimar_cold_war is 1>>\ <div class="spd-note"><span class="spd-note-tag">冷</span>他还在生你的气。说话前,你最好掂量掂量。</div>\ <<elseif $weimar_cold_war is 2>>\ <div class="spd-note"><span class="spd-note-tag">冷</span>他几乎不看你。你进来时,他转向了窗外。</div>\ <<elseif $weimar_cold_war is 3>>\ <div class="spd-note"><span class="spd-note-tag">冷</span>魏玛没有抬头。空气像结了冰。这时候,话越少越好。</div>\ <</if>>\ <</if>> /* 展示当前关系状态(自我认同×信任,双轴) */ <<weimar-relation-state>>\ <<if _relation is "信赖">>\ <div class="spd-note"><span class="spd-note-tag">他待你</span>信赖 · 他信你,也清楚自己是谁。</div>\ <<elseif _relation is "怀疑">>\ <div class="spd-note"><span class="spd-note-tag">他待你</span>怀疑 · 他握着自我,却不敢信你。他看你的目光带着审视。</div>\ <<elseif _relation is "依赖">>\ <div class="spd-note"><span class="spd-note-tag">他待你</span>依赖 · 他已不确定自己是谁,却把决定都递给你。</div>\ <<else>>\ <div class="spd-note"><span class="spd-note-tag">他待你</span>疏远 · 他把自己关了起来,没有迎你进去的意思。</div>\ <</if>>\ <<silently>> /* 计算禁用状态 */ <<set _fatigue_high to ($weimar.surface.fatigue gte 70)>> <<set _anxiety_high to ($weimar.surface.anxiety gte 50)>> <<set _trust_low to ($npcs.weimar.trust lte 20)>> <<set _tension_critical to ($weimar.personality_tension gte $weimar.effective_threshold * 0.8)>> <<set _cold_high to ($weimar_cold_war gte 2)>> /* 每日数值额度触顶阻断:额度耗尽或缩放后不产生任何数值变化时,该动作应置灰禁用 */ <<set _blk_map to {}>> <<for _ba_i to 0; _ba_i lt $dialogue_actions.length; _ba_i++>> <<set _ba_id to $dialogue_actions[_ba_i].id>> <<dialogue-blocked-option _ba_id>> <<set _blk_map[_ba_id] to _blocked>> <</for>> <</silently>>\ @@color:gray;今日对话数值额度:$dialogue_spent / $dialogue_cap_daily。额度用尽后,其余对话选项将置灰,不再产生数值影响。@@ <<if $dialogue_spent gte $dialogue_cap_daily>>\ <div class="spd-note"><span class="spd-note-tag">额度已尽</span>再和他聊,不会有什么数值上的收益了——可只要你还在,魏玛就知道你不是为那些数字来的。他感谢你的陪伴。</div>\ <</if>> ''你想……'' /* ═══ 信息类 · 汇报 ═══ */ <<linkappend "▸ 信息类 · 汇报">>\ <<if not _anxiety_high and not _blk_map["inform_daily"]>>\ <<link "你向魏玛介绍了今天柏林街头的见闻。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "inform_daily">><<weimar-dialogue-apply "inform_daily">><</link>> //<<dialogue-effects-label "inform_daily">>//\ <<elseif _blk_map["inform_daily"]>>\ @@color:gray;你向魏玛介绍了今天柏林街头的见闻。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你向魏玛介绍了今天柏林街头的见闻。@@\ <</if>>\ <<if not _anxiety_high and not _blk_map["explain_policy"]>>\ <<link "你向魏玛解释了你在某项决策上的立场。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "explain_policy">><<weimar-dialogue-apply "explain_policy">><</link>> //<<dialogue-effects-label "explain_policy">>//\ <<elseif _blk_map["explain_policy"]>>\ @@color:gray;你向魏玛解释了你在某项决策上的立场。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你向魏玛解释了你在某项决策上的立场。(魏玛的耳朵是关着的。现在不是说这个的时候。)@@\ <</if>>\ <<if not _blk_map["report_event"]>>\ <<link "你向魏玛汇报了刚刚发生的重大事件。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "report_event">><<weimar-dialogue-apply "report_event">><</link>> //<<dialogue-effects-label "report_event">>//\ <<else>>\ @@color:gray;你向魏玛汇报了刚刚发生的重大事件。(无收益 · 他记得你的陪伴)@@\ <</if>>\ <<if not _blk_map["share_rumor"]>>\ <<link "你向魏玛提到了街头流传的流言。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "share_rumor">><<weimar-dialogue-apply "share_rumor">><</link>> //<<dialogue-effects-label "share_rumor">>//\ <<else>>\ @@color:gray;你向魏玛提到了街头流传的流言。(无收益 · 他记得你的陪伴)@@\ <</if>>\ <<if not _blk_map["report_affairs"]>>\ <<link "你向魏玛报告了今天处理的事务。" "Talk_Weimar_Report_Reply">><<set $dialogue_action_id to "report_affairs">><<weimar-dialogue-apply "report_affairs">><</link>> //<<dialogue-effects-label "report_affairs">>//\ <<else>>\ @@color:gray;你向魏玛报告了今天处理的事务。(无收益 · 他记得你的陪伴)@@\ <</if>>\ <</linkappend>> /* ═══ 情感类 · 情感 ═══ */ <<linkappend "▸ 情感类 · 情感">>\ <<if not _tension_critical and not _blk_map["comfort"]>>\ <<link "你试图安抚魏玛,告诉他一切都会好起来。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "comfort">><<weimar-dialogue-apply "comfort">><</link>> //<<dialogue-effects-label "comfort">>//\ <<elseif _blk_map["comfort"]>>\ @@color:gray;你试图安抚魏玛,告诉他一切都会好起来。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你试图安抚魏玛,告诉他一切都会好起来。(他整个人缩着。你最好只是坐着。)@@\ <</if>>\ <<if not _anxiety_high and not _tension_critical and not _blk_map["encourage"]>>\ <<link "你鼓励魏玛坚持下去,强调共和国的价值。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "encourage">><<weimar-dialogue-apply "encourage">><</link>> //<<dialogue-effects-label "encourage">>//\ <<elseif _blk_map["encourage"]>>\ @@color:gray;你鼓励魏玛坚持下去,强调共和国的价值。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你鼓励魏玛坚持下去,强调共和国的价值。(这些话落不到他身上。你得等他回过神。)@@\ <</if>>\ <<if not _tension_critical and not _blk_map["empathize"]>>\ <<link "你对魏玛表达了理解,承认现状确实艰难。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "empathize">><<weimar-dialogue-apply "empathize">><</link>> //<<dialogue-effects-label "empathize">>//\ <<elseif _blk_map["empathize"]>>\ @@color:gray;你对魏玛表达了理解,承认现状确实艰难。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你对魏玛表达了理解,承认现状确实艰难。(他太紧绷了。)@@\ <</if>>\ <<if not _fatigue_high and not _tension_critical and not _cold_high and not _blk_map["confront"]>>\ <<link "你质问魏玛为什么如此软弱。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "confront">><<weimar-dialogue-apply "confront">><</link>> //<<dialogue-effects-label "confront">>//\ <<elseif _blk_map["confront"]>>\ @@color:gray;你质问魏玛为什么如此软弱。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你质问魏玛为什么如此软弱。(他正在气头上,你质问只会让裂痕更深。)@@\ <</if>>\ <<if not _fatigue_high and not _tension_critical and not _cold_high and not _blk_map["vent"]>>\ <<link "你向魏玛发泄了今天积累的挫败与愤怒。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "vent">><<weimar-dialogue-apply "vent">><</link>> //<<dialogue-effects-label "vent">>//\ <<elseif _blk_map["vent"]>>\ @@color:gray;你向魏玛发泄了今天积累的挫败与愤怒。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你向魏玛发泄了今天积累的挫败与愤怒。(他现在听不进你的火,这话留着等气消了再说。)@@\ <</if>>\ <</linkappend>> /* ═══ 重塑类 · 你给他的方向(仅当自我认同≤30时解锁,且以特殊颜色显示)═══ */ <<set _reshape_unlocked to ($weimar.self_identity lte 30 and not _tension_critical)>>\ <<if _reshape_unlocked>>\ <<linkappend "▸ @@color:#c9a0dc;重塑类 · 你给他的方向@@">>\ <<if not _tension_critical>>\ <<link "「你还是你。这一点从来没变。」" "Talk_Weimar_Soften_Reply">><<set $soften_dir to "anchor">><</link>> @@color:#c9a0dc;(自我认同+6)@@\ <</if>>\ <<if not _tension_critical>>\ <<link "「也许……你不必非得是共和国。」" "Talk_Weimar_Soften_Reply">><<set $soften_dir to "bend">><</link>> @@color:#c9a0dc;(自我认同-12·你的理想-3)@@\ <</if>>\ <<if not _tension_critical>>\ <<link "「我不知道。真的。」" "Talk_Weimar_Soften_Reply">><<set $soften_dir to "vague">><</link>> @@color:#c9a0dc;(自我认同-4)@@\ <</if>>\ <</linkappend>>\ <</if>> /* ═══ 自我认知类 · 你在日记里写下的那个自己 ═══ */ <<set _diary_positive to false>>\ <<set _diary_negative to false>>\ <<set _diary_ideal_high to false>>\ <<silently>> <<if $player.tags and $player.tags.length gt 0>> <<for _dt to 0; _dt lt $player.tags.length; _dt++>> <<if $player.tags[_dt] is "坚定者" or $player.tags[_dt] is "守护者">><<set _diary_positive to true>><</if>> <<if $player.tags[_dt] is "犬儒者" or $player.tags[_dt] is "计算者">><<set _diary_negative to true>><</if>> <</for>> <</if>> <<if $player.mental.idealism gte 60>><<set _diary_ideal_high to true>><</if>> <</silently>>\ <<linkappend "▸ 自我认知 · 你在日记里写下的那个自己">>\ <<if ($diary_positive or _diary_ideal_high) and not _tension_critical>>\ <<link "你告诉魏玛:你会陪他走到最后。" "Talk_Weimar_Diary_Reply">><<set $diary_action to "坚定不移">><<set $npcs.weimar.trust to Math.min(100, $npcs.weimar.trust + 4)>><<set $weimar.personality_tension to Math.max(0, $weimar.personality_tension - 2)>><</link>> //(魏玛信任+4 · 张力-2)//\ <<else>>\ @@color:gray;你告诉魏玛:你会陪他走到最后。(这个念头还没在你心里站稳。)@@\ <</if>>\ <<if _diary_negative and not _tension_critical>>\ <<link "你向魏玛坦白:你最近也不信这套了。" "Talk_Weimar_Diary_Reply">><<set $diary_action to "动摇">><<set $weimar.personality_tension to Math.max(0, $weimar.personality_tension - 4)>><<set $npcs.weimar.trust to Math.max(0, $npcs.weimar.trust - 3)>><</link>> //(张力-4 · 魏玛信任-3)//\ <<else>>\ @@color:gray;你向魏玛坦白:你最近也不信这套了。(你还愿意相信些什么。)@@\ <</if>>\ <</linkappend>> /* ═══ 询问类 · 探询 ═══ */ <<linkappend "▸ 询问类 · 探询">>\ <<if not _tension_critical and not _blk_map["ask_feeling"]>>\ <<link "你询问魏玛现在感觉如何。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "ask_feeling">><<weimar-dialogue-apply "ask_feeling">><</link>> //<<dialogue-effects-label "ask_feeling">>//\ <<elseif _blk_map["ask_feeling"]>>\ @@color:gray;你询问魏玛现在感觉如何。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你询问魏玛现在感觉如何。(魏玛的状态不对,他现在需要你安静地陪着。)@@\ <</if>>\ <<if not _trust_low and not _tension_critical and not _blk_map["ask_fear"]>>\ <<link "你问魏玛现在最害怕的是什么。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "ask_fear">><<weimar-dialogue-apply "ask_fear">><</link>> //<<dialogue-effects-label "ask_fear">>//\ <<elseif _blk_map["ask_fear"]>>\ @@color:gray;你问魏玛现在最害怕的是什么。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你问魏玛现在最害怕的是什么。(你们之间还没到能问这个的距离。)@@\ <</if>>\ <<if not _trust_low and not _tension_critical and not _blk_map["ask_dream"]>>\ <<link "你问魏玛昨晚睡得好吗。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "ask_dream">><<weimar-dialogue-apply "ask_dream">><</link>> //<<dialogue-effects-label "ask_dream">>//\ <<elseif _blk_map["ask_dream"]>>\ @@color:gray;你问魏玛昨晚睡得好吗。(无收益 · 他记得你的陪伴)@@\ <<else>>\ @@color:gray;你问魏玛昨晚睡得好吗。(你们之间还没到能问这个的距离。)@@\ <</if>>\ <<if not _tension_critical>>\ <<link "你问魏玛:你觉得我做得怎么样?" "Talk_Weimar_Appraise_Reply">><<weimar-appraise>><</link>> //(魏玛会评价你的治理)//\ <<else>>\ @@color:gray;你问魏玛:你觉得我做得怎么样?(他现在没法冷静地评价你。)@@\ <</if>>\ <</linkappend>> /* ═══ 行动类 · 陪伴 ═══ */ <<linkappend "▸ 行动类 · 陪伴">>\ <<if not _blk_map["silent_listen"]>>\ <<link "你什么也没说,只是静静地陪着他。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "silent_listen">><<weimar-dialogue-apply "silent_listen">><</link>> //<<dialogue-effects-label "silent_listen">>//\ <<else>>\ @@color:gray;你什么也没说,只是静静地陪着他。(无收益 · 他记得你的陪伴)@@\ <</if>>\ <<if not _blk_map["change_topic"]>>\ <<link "你转移了话题,聊起了无关紧要的事。" "Talk_Weimar_Dialogue_Reply">><<set $dialogue_action_id to "change_topic">><<weimar-dialogue-apply "change_topic">><</link>> //<<dialogue-effects-label "change_topic">>//\ <<else>>\ @@color:gray;你转移了话题,聊起了无关紧要的事。(无收益 · 他记得你的陪伴)@@\ <</if>>\ <<link "你起身准备离开。" "Talk_Weimar_Dialogue_Leave">><</link>> <</linkappend>> <<link "返回办公室" "Scene_Office">><</link>>
/* 主动对话 · 魏玛回应(三层结构:旁白 + 接话句 + 过渡句 + 状态回应) */ <<silently>> <<weimar-v2-init>> <<weimar-dialogue-reply $dialogue_action_id>> <<set _act to null>> <<set _dialogue_effect_label to "">> <<for _i to 0; _i lt $dialogue_actions.length; _i++>> <<if $dialogue_actions[_i].id eq $dialogue_action_id>> <<set _act to $dialogue_actions[_i]>> <</if>> <</for>> <<set _act_label to "">> <<set _opener to "">> <<if _act>> <<set _act_label to _act.label>> <<if _act.openers and _act.openers.length gt 0>> <<set _opener to _act.openers[random(0, _act.openers.length - 1)]>> <</if>> <</if>> <<weimar-v2-state>> <<set _trans_pool to $weimar_v2.transitions[_v2_state]>> <<set _transition to _trans_pool[random(0, _trans_pool.length - 1)]>> /* 计算本次动作的实际数值标注(用 apply 记账的真实到账值,非设计值: 关系修正与每日额度缩放都可能让实际值小于设计值) */ <<set _emap to { "weimar.surface.anxiety":"焦虑","weimar.surface.fatigue":"疲惫","weimar.surface.tension":"即时张力", "weimar.mid.democracy_trust":"民主信任","weimar.mid.army_dependence":"军方依赖","weimar.mid.intl_trust":"国际信任", "weimar.mid.reform_will":"改革意愿","weimar.core.will_to_exist":"存续意志","weimar.core.republic_identity":"共和认同", "weimar.personality_tension":"人格张力","weimar.self_identity":"自我认同","npcs.weimar.trust":"魏玛信任", "player.mental.fatigue":"你的疲惫","player.mental.paranoia":"你的偏执","player.mental.idealism":"你的理想","player.mental.isolation":"你的孤独" }>> <<set _dialogue_effect_label to "">> <<set _edi to 0>> <<if $dialogue_applied>> <<set _ekeys to Object.keys($dialogue_applied)>> <<for _i to 0; _i lt _ekeys.length; _i++>> <<set _ek to _ekeys[_i]>> <<set _ed to Math.round(Number($dialogue_applied[_ek]) || 0)>> <<if _ed neq 0>> <<set _ezh to _emap[_ek] ? _emap[_ek] : _ek>> <<if _edi gt 0>><<set _dialogue_effect_label to _dialogue_effect_label + "·">><</if>> <<set _dialogue_effect_label to _dialogue_effect_label + _ezh>> <<if _ed > 0>><<set _dialogue_effect_label to _dialogue_effect_label + "+" + _ed>> <<else>><<set _dialogue_effect_label to _dialogue_effect_label + _ed>><</if>> <<set _edi to _edi + 1>> <</if>> <</for>> <</if>> <</silently>>\ _act_label //「_opener」// //_transition// //「$weimar_response」// <<weimar-relation-line>>\ //<span class="txt-sys">$weimar_relation_line</span>// <<if _dialogue_effect_label neq "">>@@color:gray;实际效果:_dialogue_effect_label · 每轮对话魏玛疲惫+2@@<<else>><<if $dialogue_spent gte $dialogue_cap_daily>>@@color:gray;实际效果:无数值变化(今日对话额度已尽) · 每轮对话魏玛疲惫+2@@<<else>>@@color:gray;实际效果:无数值变化(相关数值已在边界) · 每轮对话魏玛疲惫+2@@<</if>><</if>> @@color:gray;魏玛情绪:''$weimar.surface.mood'' · 焦虑 $weimar.surface.anxiety · 疲惫 $weimar.surface.fatigue · 信任 $npcs.weimar.trust · 今日额度 $dialogue_spent/$dialogue_cap_daily@@ <<if $weimar_chat_bond_gain>>\ <span class="txt-sys">//他看你的目光,似乎比刚才近了一点。你们之间的信任,悄然长了一分。//</span>\ <</if>> <<set $dialogue_turn to $dialogue_turn + 1>>\ <<if $weimar.surface.fatigue gte 60 and $dialogue_turn gte 3>>\ //魏玛闭上了眼。// //「我需要一个人待会儿。」// <<link "离开" "Talk_Weimar_Dialogue_Leave">><</link>> <<else>>\ <<link "继续对话" "Talk_Weimar_Dialogue">><</link>> <<link "结束对话" "Talk_Weimar_Dialogue_Leave">><</link>> <<if $dialogue_action_id eq "comfort">> <<link "继续深聊" "Deep_Talk">><<set $weimar_deep_id to "comfort">><<set $weimar_deep_round to 0>><</link>><</if>> <<if $dialogue_action_id eq "confront">> <<link "继续深聊" "Deep_Talk">><<set $weimar_deep_id to "confront">><<set $weimar_deep_round to 0>><</link>><</if>> <</if>>
/* 多轮深聊 · 场景式连续对话 由 Talk_Weimar_Dialogue_Reply 的「继续深聊」进入($weimar_deep_id 定池、$weimar_deep_round 定位)。 每轮从池里随机抽一句;未到末轮点「继续」就地 +1 轮(redo 重渲染),末轮「结束」返回对话页。 承接旧弹窗式深聊的连续体验,改用普通场景渲染,阅读节奏更稳。 */ <<silently>> <<set _dt_pool to ($weimar_deep_pools[$weimar_deep_id] or [])>> <<set _dt_last to (_dt_pool.length gt 0 ? _dt_pool.length - 1 : 0)>> <<set _dt_round to $weimar_deep_round>> <<set _dt_lines to (_dt_pool.length gt _dt_round ? _dt_pool[_dt_round] : null)>> <<set _dt_line to "">> <<if _dt_lines and _dt_lines.length gt 0>> <<set _dt_line to _dt_lines[random(0, _dt_lines.length - 1)]>> <</if>> <<set _dt_more to (_dt_round lt _dt_last)>> <</silently>>\ <<if not _dt_lines>>\ //他沉默了一会儿,没有再往下说。你也没再追问。// <<link "结束" "Talk_Weimar_Dialogue_Reply">><</link>> <<else>>\ <<if _dt_round eq 0>>//你留在他身边,没有走。灯光垂在那张旧地图上,他开口时,声音比刚才更低。//\ <<else>>//他顿了顿,又接下去,像是终于在你面前卸下了什么。//\ <</if>> //_dt_line// <<if _dt_more>>\ <<link "继续" "Deep_Talk">><<set $weimar_deep_round to _dt_round + 1>><</link>> // <<link "就此打住" "Talk_Weimar_Dialogue_Reply">><</link>> <<else>>\ //他说完这句就不再开口。房间里只剩那盏灯的低鸣。// //有些话,今晚只能说到这里。// <<link "结束深聊" "Talk_Weimar_Dialogue_Reply">><</link>> <</if>>\ <</if>>
/* 主动对话 · 问评价:魏玛评价玩家治理(镜子/出口) 承接对话菜单的「你觉得我做得怎么样」,调用 weimar-appraise 展示评价。 */ <<silently>> <<weimar-appraise>> <</silently>>\ //你问魏玛:你觉得我做得怎么样?// $weimar_appraise_line <<set $dialogue_turn to $dialogue_turn + 1>>\ <<link "继续对话" "Talk_Weimar_Dialogue">><</link>> <<link "结束对话" "Talk_Weimar_Dialogue_Leave">><</link>>
/* 被动质问 · 玩家回应魏玛的质问(治理差时魏玛主动质疑) 触发点:出门前(魏玛喊住)/ 会客区(魏玛有话对你说)。 应答后设当天 $flags 标记,防止同日重复,再返回出发场景($weimar_question_return)。 */ <<weimar-question-pending>>\ <<if not $weimar_question_return>><<set $weimar_question_return to "Scene_Office">><</if>>\ <<if $weimar_question_return is "Scene_RegionSelect">>\ //你刚迈出门,身后传来魏玛的声音。他喊住了你。//\ <<else>>\ //你在办公室,魏玛没有绕弯子——他开口就是质问。//\ <</if>>\ <<set _trans_pool to ["他盯着你,等你开口。","空气安静了一会儿。他在等你的解释。","他没有打断你,只是看着你。"]>>\ <<set _transition to _trans_pool[random(0, _trans_pool.length - 1)]>>\ ''「你告诉我——这就是你治理出来的国家?」他压着声音,指节扣在桌沿,泛白。「你答应过我什么,你还记得吗?」'' ''你该如何回应他?'' <<link "你辩解:我已经尽力了,局面不是我能左右的。">> <<set $weimar_response to "「尽力。」他重复了一遍这个词,像在咀嚼一块没熟的肉,「我也『尽力』了五年。可『尽力』这两个字,喂不饱街上的孩子,也换不回鲁尔的煤。」他别开脸,「你尽力了,然后呢?」">>\ <<set $npcs.weimar.trust to Math.max(0, $npcs.weimar.trust - 2)>>\ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 2)>>\ <<set $weimar_more_line to "(魏玛信任-2 · 魏玛焦虑+2)">>\ <<set $flags[$question_key] to true>>\ <<weimar-mood-refresh>>\ <<set $done_question to true>>\ <</link>>\ <<link "你沉默,没有辩解。">> <<set $weimar_response to "你什么都没说。他等着,然后慢慢收回那逼视的目光,声音低下去:「……你不辩解,我反而不知道该拿你怎么办。」他转过身,「至少你没骗我。」">>\ <<set $npcs.weimar.trust to Math.min(100, $npcs.weimar.trust + 2)>>\ <<set $weimar.surface.anxiety to Math.max(0, $weimar.surface.anxiety - 2)>>\ <<set $weimar_more_line to "(魏玛信任+2 · 魏玛焦虑-2)">>\ <<set $flags[$question_key] to true>>\ <<weimar-mood-refresh>>\ <<set $done_question to true>>\ <</link>>\ <<link "你反问他:那你来?你来做这些事给我看看。">> <<set $weimar_response to "他被你噎住了。半晌,他低低笑了一声,那笑里没有温度:「……我若做得到,也不会只剩下骂你的力气。」他声音很轻,「你说得对。可正因为如此,我才更怕——我把你当我们唯一的那条路。」">>\ <<set $weimar.surface.fatigue to Math.min(100, $weimar.surface.fatigue + 3)>>\ <<set $weimar.surface.anxiety to Math.max(0, $weimar.surface.anxiety - 3)>>\ <<set $weimar_more_line to "(魏玛疲惫+3 · 魏玛焦虑-3)">>\ <<set $flags[$question_key] to true>>\ <<weimar-mood-refresh>>\ <<set $done_question to true>>\ <</link>> <<if $done_question>>\ //_transition// //「$weimar_response」// <span class="txt-sys">$weimar_more_line</span> <<link "离开" $weimar_question_return>><</link>> <</if>>
/* 主动对话 · 自我认知回应(由日记标签解锁) 玩家说出自己在日记里写下的那个自己,魏玛据此回应 */ <<set _trans_pool to ["魏玛看着你,沉默了一会儿。","魏玛没有立刻接话。窗外有风。","魏玛的目光在你脸上停了一下。"]>>\ <<set _transition to _trans_pool[random(0, _trans_pool.length - 1)]>>\ <<if $diary_action eq "坚定不移">>\ //你看着魏玛,第一次没有犹豫。你告诉他:共和国的路再难走,你也会陪他走到最后。// //话出口时,你才发现自己早已想过这句话很多遍。// <<set $weimar_response to "他很久没有说话。然后他低低地笑了一声,那声音里没有嘲弄,只有一种听天由命之后的安稳:「你知道有多少人对我保证过类似的话?……可你是第一个,说这话的时候,没有看着别处的人。」">>\ <span class="txt-sys">//(魏玛信任+4 · 张力-2)//</span>\ <<elseif $diary_action eq "动摇">>\ //你垂下眼。你坦言:你已经不确定还能不能信这一切,有时候觉得,所有人都在自欺欺人。// //说完,你才听见自己声音里的疲倦。// <<set $weimar_response to "他没有生气。他只是安静了很久,然后说:「至少你对我,没说谎。……这在这栋楼里,已经算得上顶好的品德了。」他停了一下,声音低下去——「可你骗我,也比骗你自己好受些。」">>\ <span class="txt-sys">//(张力-4 · 魏玛信任-3)//</span>\ <<else>>\ <<set $weimar_response to "魏玛看了你一眼,没有多说什么。他知道,有些话,你不必对他说,他也懂。">>\ <</if>> //_transition// //「$weimar_response」// <<set $dialogue_turn to $dialogue_turn + 1>>\ <<link "继续" "Talk_Weimar_Dialogue">><</link>> <<link "结束对话" "Talk_Weimar_Dialogue_Leave">><</link>>
/* 主动对话 · 魏玛回应(功能性报告:针对当天事务) 玩家先汇报选择,魏玛再按状态回复(V2 汇报框架) */ <<silently>> /* 取最近处理的一件事务(数组末尾 = 最新) */ <<set _top to null>> <<if $today_handled and $today_handled.length gt 0>> <<set _top to $today_handled[$today_handled.length - 1]>> <</if>> <<set _rep_deck to "">> <<set _rep_act to "delegate">> <<if _top and _top.deck_id>> <<set _rep_deck to _top.deck_id>> <<if _top.action>><<set _rep_act to _top.action>><</if>> <</if>> <<weimar-v2-report _rep_deck _rep_act>> <</silently>>\ <<if _rep_deck neq "">>\ //你向魏玛报告了今天的事。// //「$weimar_report_line」// ''魏玛:''「$weimar_reply_line」 <<else>>\ //你向魏玛报告了今天的事。// //魏玛没有说话。//\ <</if>> <<set $dialogue_turn to $dialogue_turn + 1>>\ <<if $weimar.surface.fatigue gte 60 and $dialogue_turn gte 3>>\ //魏玛闭上了眼。// //「我需要一个人待会儿。」// <<link "离开" "Talk_Weimar_Dialogue_Leave">><</link>> <<else>>\ <<link "继续对话" "Talk_Weimar_Dialogue">><</link>> <<link "结束对话" "Talk_Weimar_Dialogue_Leave">><</link>> <</if>>
/* 主动对话 · 重塑类回应(P4 软化魏玛) 承接 Talk_Weimar_Dialogue 的重塑选项,调用 weimar-soften 改变自我认同 */ <<silently>> <<set _sdir to $soften_dir ? $soften_dir : "vague">> <<weimar-soften _sdir>> <<set $dialogue_turn to $dialogue_turn + 1>> <</silently>>\ //$weimar_soften_text// <<if $weimar.self_identity lte 40>>\ //他望着你,眼神空空的。过了一会儿,他往你这边挪了半步。//\ <<elseif $weimar.self_identity gte 75>>\ //他看得更清楚了一些。像一扇蒙了灰的窗,被你用手擦过一道。//\ <<else>>\ //他似懂非懂地点了点头。送你到门口的时候,他还在小声念着那句话。//\ <</if>> <<link "继续对话" "Talk_Weimar_Dialogue">><</link>> <<link "结束对话" "Talk_Weimar_Dialogue_Leave">><</link>>
/* 主动对话 · 结束语 + 清理对话状态(V2 告别语:状态×信任度七阶 + 阈值彩蛋) */ <<set $dialogue_turn to 0>>\ <<set $dialogue_recent to []>>\ <<if $weimar_cold_war gt 0>>\ <<if $weimar_cold_war is 1>>\ //你起身。他没有拦,也没有送。// //「……明天吧。」他说,声音闷闷的。//\ <<elseif $weimar_cold_war is 2>>\ //你起身。他始终没回头。// //门在你身后合拢时,你没有听见他说话。//\ <<else>>\ //你离开房间。魏玛坐在那里,像一尊石像。// //冷战里,连告别都显得多余。//\ <</if>>\ <<else>>\ <<weimar-v2-leave>>\ <<if $weimar_leave_line neq "">>\ $weimar_leave_line\ <<else>>\ //魏玛没有说话。//\ <</if>>\ <</if>> <<link "返回办公室" "Scene_Office">><</link>>
/* 姿态回执:读 $stance_last_id / $stance_last_result(持久变量,由 weimar-stance-apply 写入) */ <<silently>> <<set _st to $stance_last_id ? $stance_last_id : "silent">> <<set _result to $stance_last_result ? $stance_last_result : "success">> <<weimar-relation-state>> <<weimar-relation-line>> <</silently>>\ <<if _result eq "punish">>\ 魏玛看了你一眼,没有说话。那眼神不是失望,是更安静的东西——像一扇你本来可以推开的门,此刻从里面上了锁。 //(错了时机。张力 +5,信任 −3。)//\ <<elseif _result eq "invalid">>\ 你张了张嘴,却发现自己也不知道该说什么。同样的方式用了太多次,话到了嘴边,轻得像纸。 //(同类姿态用得太频繁,这次没有效果。)//\ <<elseif _result eq "release">>\ 你的质问像一根火柴,落进了已经太满的油桶。 $weimar_relation_line //(人格震荡已触发。)//\ <<elseif _result eq "special_release">>\ 你们对视了很久。没有人退让,但也没有人再往前一步。 $weimar_relation_line //(张力清空。信任大幅下降,自我认同上升。)//\ <<else>>\ <<silently>> <<set _tone_pool to []>> <<if _st eq "comfort">> <<set _tone_pool to ["你安慰我。我知道你是真心的——虽然这话听多了,我仍会当它是真的接住。","你说会好的。我信这一句。哪怕这信毫无根据,我也想先信着。","你把手搭在我肩上。你没说会好,就只是待在那儿。我忽然没来由地觉得,今天能撑到底。"]>> <<elseif _st eq "confront">> <<set _tone_pool to ["你质问我为什么软弱。问得好。我也问过自己,问得比你还狠。","你逼视着我,要我回答。我张了张嘴,却发现自己准备好的那些『形势所迫』,在你面前一个字都说不出口。","你直问我的软弱。这句话像一扇窗被推开,风灌进来,我一时站不稳。"]>> <<elseif _st eq "silent">> <<set _tone_pool to ["你什么都不说。有时候,沉默比话更重。你陪着我,我其实缺的就是这个。","你只是在我身边坐下,什么都没说。窗外的天黑下去,可屋里那盏灯,好像久违地暖了一回。","你不说话,只陪着我。就这样吧,这样挺好。"]>> <<elseif _st eq "probe">> <<set _tone_pool to ["你想听真话,还是想听该说的话?……你问了真话,我就说真话:今天我还撑得住。","我现在的感觉?像站在一扇没锁的门边,不知道门后是风还是墙。","感觉?今天没什么感觉。这大概就是我今天的感觉——没有感觉。"]>> <<elseif _st eq "confrontation">> <<set _tone_pool to ["你逼我到墙角。我不恨你,我只是……没想到你会这么做。","我们对视了很久。你眼里的东西我没见过,也许是愤怒,也许是别的。","你把我最后一块遮羞布扯掉了。好。至少现在,我们都看见了。"]>> <</if>> <<set _resp to _tone_pool[random(0, _tone_pool.length - 1)]>> <</silently>>\ 魏玛://「_resp」// $weimar_relation_line //(每轮对话魏玛疲惫 +2。)//\ <</if>>\ <hr> <<link "继续对话" "Talk_Weimar">><</link>> <<link "返回办公室" "Scene_Office">><</link>>
<<silently>> /* 开场一次:整场花 1 TP + 疲惫+3 */ <<if not $reception_started>> <<set $reception_started to true>> <<tp-spend 1 3>> <<set $reception_choices to []>> <<set $reception_round to 0>> <<set $reception_observations to 0>> <</if>> <<set $reception_pending to false>> <</silently>>\ //一月的风把威廉街的旗子吹得笔直。总理府大厅今晚亮着所有的灯。// //这是魏玛的主意。他说新年过了人还没到齐,把他们都请来,让他们看看共和国的状态。// //于是他们都来了。// <hr> //这里站着的是这个国家的全部颜色。// //SPD站在靠窗的位置,一半在屋里一半在人群边上。他看见了你的目光,点了点头没有举杯。// //KPD来得最早也站得最偏。他不喝酒,也不掩饰自己外套口袋露出的一角传单,纸边已经卷了。// //DDP和Zentrum凑在壁炉边聊着,声音不大,聊的是程序和条文。DDP看见你举了举杯,眼睛却越过你看了一眼大门。// //DVP站在酒桌附近,和每一个路过的人碰杯,碰完就低头看一眼对方的鞋。// //DNVP站在大厅另一头,背对着壁炉。旧军礼服熨得笔挺,肩线一丝不乱。// //NSDAP在人群里穿梭着,似乎有人在绕开他的行走路线。// //军方身着便装站在柱子后面。从那里能看到整个大厅的出入口。// //魏玛在人群中间,笑着寒暄着,他经过你身边的时候,脚步慢了半拍。// <span class="txt-calm">「大家都在。你可以去转转。不用想要讨好所有人,这点你做不到我也做不到。」</span> <hr> ''今晚你有时间走近三方。你走向:'' <<reception-menu>>
/* ---------- reception-menu:酒会社交菜单 ---------- 三轮社交。每轮可选八党之一(走 trust-capped+零和)或「躲角落观察全场」(情报+3)。 用 $reception_round 计数,选完三家进散场。 */ <<widget "reception-menu">>\ <<if $reception_round gte 3>>\ <<link "酒会散场了。等人都走得差不多——" "Scene_Reception_End">><</link>> <<else>>\ <<set _r_left to 3 - $reception_round>>\ //(还剩 _r_left 次交谈的机会。也可以不谈,只是看。)// <<capture _rp>>\ <<link "走向 SPD" "Scene_Reception_Talk">><<set $reception_target to "spd">><</link>> <<link "走向 KPD" "Scene_Reception_Talk">><<set $reception_target to "kpd">><</link>> <<link "走向 DDP" "Scene_Reception_Talk">><<set $reception_target to "ddp">><</link>> <<link "走向 DVP" "Scene_Reception_Talk">><<set $reception_target to "dvp">><</link>> <<link "走向Zentrum" "Scene_Reception_Talk">><<set $reception_target to "zentrum">><</link>> <<link "走向 DNVP" "Scene_Reception_Talk">><<set $reception_target to "dnvp">><</link>> <<link "走向NSDAP" "Scene_Reception_Talk">><<set $reception_target to "nsdap">><</link>> <<link "走向军方" "Scene_Reception_Talk">><<set $reception_target to "army">><</link>> <</capture>> <<link "不走向任何人。找个角落看全场。" "Scene_Reception_Observe">><</link>> <</if>>\ <</widget>>
<<silently>> <<set _rt to $reception_target>> /* 阶段:本场第几次走向同一党(1/2/3)——决定差分文本与信任量 */ <<set _rcount to 0>> <<for _ri to 0; _ri lt $reception_choices.length; _ri++>> <<if $reception_choices[_ri] eq _rt>><<set _rcount to _rcount + 1>><</if>> <</for>> <<set _rstage to _rcount + 1>> <<set $reception_round to $reception_round + 1>> /* 好感递减 3/2/1:酒会属一次性剧情,走大事通道(不吃每日上限);记仇按实际到账量算,随阶段自然递减 */ <<if _rstage eq 2>> <<trust-capped _rt 2 "big">> <<elseif _rstage gte 3>> <<trust-capped _rt 1 "big">> <<else>> <<trust-capped _rt 3 "big">> <</if>> <<set $reception_choices.push(_rt)>> /* 各党白描按阶段差分 + 对立党当场反应 */ <</silently>>\ <<if _rt eq "spd">>\ <<if _rstage eq 1>>\ //你走过去。SPD把杯子放下,朝你点了点头。// //他先问了一句今晚外面还冷吗,你答了,他顺着说了两句天气,然后自己把话带到了工人身上。面包的价格,房租的涨幅,哪个厂又裁了人。数字很具体,不像是在背材料。他没有这些问题抛给你,只是在陈述。// //讲完,他停了一下,像是等你先说点什么。//\ <<elseif _rstage eq 2>>\ //你又一次走过去。SPD看见你,把刚收起的杯子又拿了出来。// //「两次。」他说,不是责备。他往你这边让了半步,压低声音讲起了刚才没讲完的事:失业保险金的缺口,哪个厂里工人们自己凑的钱箱。数字还是那么具体。// //临了他补了一句:「你肯来第二次,我记住了。」//\ <<else>>\ //第三次走向SPD,他自己先开了口。// //「今晚你来得最勤的是我这里。」这句话不是得意,是提醒。他讲得很短,只留下一件最要紧的事:党的账撑不过这个月,他在等一个能签字的答复。// //「第三次就不多说了。你记在心里就行。」//\ <</if>>\ <<elseif _rt eq "kpd">>\ <<if _rstage eq 1>>\ //你走过去的时候KPD正在看墙上那幅画。你说了句客套话,他没接。// //他问你来这里做什么,语气很平静,目光却是要从你脸上读出别的答案。你说了一个不算回答的回答,他笑了一下。// //「下一个问题,我会再问的。」//\ <<elseif _rstage eq 2>>\ //你第二次走过去。KPD看着你,既不惊讶,也不客气。// //「又来了。」他把传单重新掏出来,这次没有折起,摊开给你看。「上次你躲了我的问题。现在周围没有别人,你可以答了。」// //你还是没答。他收起传单,点了点头,像把这笔账记在了心里。//\ <<else>>\ //第三次。KPD先看了看你身后,才看你。// //「一夜三次。」他说,「你是来谈的,还是来探的?」他不等回答,「革命不跟人寒暄。你什么时候准备好看我的东西,什么时候再来。今晚你欠我三个回答。」// //他转身回了墙角,背对着你。//\ <</if>>\ <<elseif _rt eq "ddp">>\ <<if _rstage eq 1>>\ //DDP是个好的谈话对象。他先聊天气,再聊报纸,然后才聊到宪法。// //他语速很平说话很轻,怕吵醒什么似的。「程序不是拖延手段,」他说,「程序可以让输了的人也认账。」// //他举杯的时候,用杯口碰你的杯身,低了半寸。//\ <<elseif _rstage eq 2>>\ //你又一次回到壁炉边。DDP朝你举了举杯,还是低了半寸的那种举法。// //「一晚上两回,这不合程序。」他说完自己先笑了,「不过我不反对例外——例外得有理由。」他接着上回的宪法往下聊,比上一次更具体:哪一条,哪一款,出过什么事。// //分别的时候他说:「第二次比第一次谈得好。这是个好趋势。」//\ <<else>>\ //第三次站到DDP面前,他脸上的笑淡了一些。// //「我说句可能不中听的话。」他声音放得很低,「你今晚的走动,别人都在看。来我这里三次,明天报纸会怎么写,你比我清楚。」// //他碰了碰你的杯。「我没有意见。我只是提醒你:程序之外的事,代价记在程序头上。」//\ <</if>>\ <<elseif _rt eq "dvp">>\ <<if _rstage eq 1>>\ //你走过去的时候,DVP正和旁边的人说笑。看见你他便把那人打发走了。// //你先聊了些别的,他应得很好,可没过几句话就拐到了价码上。你的政策值多少钱,稳定值多少钱。他说话的时候手指在敲桌面,一下一下,像在拨算盘。// //「你我之间不用再客套寒暄,」他说,「直接谈条件吧。将来有的是要谈的时候。」//\ <<elseif _rstage eq 2>>\ //DVP看见你又来了,笑容深了一层。// //「第二次,」他给你倒了半杯酒,「生意讲究回头客。你想要什么,开个价。」他这次谈得更细:你的哪项政策,他能在议事厅里替你数出多少票,代价是什么。// //「我们不做无本的买卖。但你的单子,我接。」//\ <<else>>\ //第三次走向DVP,他把旁边的人全部客气地请开了。// //「一晚上三回。」他低声说,「明天全柏林都会知道你偏向我这边。这对你我是好事,对你要办的那些事,未必。」他碰了碰你的杯,「所以第三次白送你一句:别让便宜的路,走成唯一的一条。」//\ <</if>>\ <<elseif _rt eq "zentrum">>\ <<if _rstage eq 1>>\ //Zentrum和你聊天了关于学校的话题。// //你原本只是随口寒暄,他答了两句,就把话带到了孩子身上。谁的孩子在哪里上学,教什么不教什么。听起来是小事,但他说得很慢。// //「国家管得太宽,教会会不安。但教会管得太宽,国家会不安。所以我在中间,」他指了指自己,「我不移动立场,大家就都安心。」// //他的杯子里是水。//\ <<elseif _rstage eq 2>>\ //你第二次走向Zentrum。他看了看你,又看了看壁炉边,往旁边挪了半步,把谈话挪到了更僻静的位置。// //「又来了。」他的声音比上回轻。「你来两次没关系,被人看见两次,就有关系。」他不再聊学校,聊起了更实际的事:哪几个选区的票怎么摆,教会的耐心还剩多少。// //「我能不动。你最好也想清楚。」//\ <<else>>\ //第三次,Zentrum没有再挪位置,也没有压低声音。// //「第三次了。」他直视着你。「我按兵不动,是因为我稳。你这样走动,是替我动,还是替你自己动?」他不等回答,自己点了点头,「罢了。你心里有秤就行。记住,秤砣别偏得太狠。」//\ <</if>>\ <<elseif _rt eq "dnvp">>\ <<if _rstage eq 1>>\ //DNVP没有挪地方。你走过去,是他允许你走进他的三步之内。// //他不喝酒,看着你,等你先开口。你说了句客气话。// //「客气话留着对法国人说,」他说,「跟我说有用的。这个国家欠的账,总要有人认。你认不认?」// //大厅那头,DVP放下了酒杯。//\ <<elseif _rstage eq 2>>\ //DNVP这次没有让你站满三步,他自己朝你这边欠了欠身。// //「回来得好。」他说,「说明你想通了一点什么。」他把上回的话头接着往下说,旧账讲得更细了:哪一年,哪一笔,谁签的字。// //「你认账,我就能跟你谈往后。这句话你可以带走。」//\ <<else>>\ //第三次走向DNVP,大厅里安静了一瞬。// //「三次。」他几乎笑了,那是他今晚最接近笑的一次。「我欣赏有耐心的人。但耐心要用在认账上,不是用在走来走去上。」// //他恢复了原来的站姿,重新变成那座背对壁炉的雕像。「下次再来,带一份你承认的东西。口头的不算。」//\ <</if>>\ <<elseif _rt eq "nsdap">>\ <<if _rstage eq 1>>\ //你走近的时候,NSDAP正和一个人讲得正起劲。// //看到你后他跟你握手,握得很用力。你刚开口他就把话接了过去,没几句就绕到了「他们」身上:他们卖了国家,他们占了位子,他们应该让开。// //「看看外面,」他朝窗外一摆手,「街上的人在等什么?在等一个敢说话的。我们就敢。」// //你注意到壁炉边安静了一拍。DDP和Zentrum交换了一个眼神。//\ <<elseif _rstage eq 2>>\ //你又一次走近,NSDAP二话不说把你拉进了他那一圈人中间。// //「他来了!」他朝那一圈人宣布,像你是什么战利品。「看见没有,连总理府的人都愿意听我们说话。」他的嗓门比上回更大,「你再站近一点,我给你讲讲他们是怎么卖掉这个国家的——一处一处讲。」// //壁炉那边,有人把酒杯放重了。//\ <<else>>\ //第三次,NSDAP几乎是大笑着迎上来的。// //「三回!你们看看,三回!」他揽住你的肩膀,力道大得不容拒绝。「你已经比他们中间谁都明白。差的就是最后一步——站过来。」他的声音沉下来,「门一直开着。什么时候来,什么位置,我都给你留。」// //他松开手的时候,你感觉到整个大厅都在看你们。//\ <</if>>\ <<elseif _rt eq "army">>\ <<if _rstage eq 1>>\ //军方在柱子后面看着你走过来,先扫了一眼你身后,才把目光落到你脸上。// //他说话短。你问了东边的事,他说了三句,句句有数字。// //最后一句是:「命令要清楚。别让部队猜。」// //然后就没了。他重新看回大厅门口,谈话结束。//\ <<elseif _rstage eq 2>>\ //军方的目光从大厅门口收回来,落到你脸上,停了一会儿。// //「第二次。」他说。没有问句,也没有别的意思流露。他这次说了五句,比上回多两句:东边的部队缺额多少,什么时候能补上,以及一句「日子不多了」。// //说完他又看回了门口。你还是不知道这算不算一次谈话。//\ <<else>>\ //第三次站在军方面前,他这次连你身后都没有看。// //「一晚上三次。」他的声音压得很低,「要么你有事要谈,要么你在给我看什么。是哪一种?」他等了两秒,没有等到答案,「那就等你想清楚。部队不喜欢被同一句话叫三次。」//\ <</if>>\ <</if>>\ <<trust-act-note>>\ <<if $rival_note and $rival_note neq "">>\ <span class="txt-severe">//($rival_note。)//</span> // //你没有回头。但你知道,刚才那几分钟,不止一个人在数。//\ <</if>>\ <<rival-cost-reset>>\ <hr> <<reception-menu>>
<<silently>> <<set $reception_round to $reception_round + 1>> <<set $reception_observations to $reception_observations + 1>> <<tag-add "知情者" "micro" 3 "观察" "weimar" "reception">> <<set $active_tags to $ret>> <</silently>>\ //你端着杯子退到靠墙的位置,没有人前来找你。看了一会儿,有些事就自己浮出来了。// //SPD和DVP隔着大厅互相点了点头,动作很快,谁也没往对方那边走。KPD仍然站在最偏的位置,他没有盯着在场的具体某个人看,口袋露出了传单的一角。DDP和Zentrum凑在壁炉边低声说话,偶尔飘过来几个词,是条文和程序,听起来像是在核对什么。// //DNVP和NSDAP站得不近,两人也没怎么交谈,但偶尔会看向同一个方向,大门那边,或者你这边。军方垂眸看着手里的酒杯,没有和任何人有视线接触,不过他站的位置刚好能看见整个大厅的进出。// //魏玛在人群里穿梭,每个人前都待一会儿,每个人报以笑容。只有转到背对人群的那一刻,笑会垮下来半秒,再捡起来。// //你感到置身事外的超脱,今晚什么都不会发生。// <span class="teaching-note">观察不需你支付任何代价也足够安全。但柏林不会记住只会远观的人。</span> <hr> <<reception-menu>>
<<silently>> /* 复盘文案:按玩家实际选择分型 */ <<set _rc to $reception_choices>> <<set _left_n to 0>> <<set _right_n to 0>> <<set _rad_n to 0>> <<for _ri to 0; _ri lt _rc.length; _ri++>> <<set _rp2 to _rc[_ri]>> <<if _rp2 eq "spd" or _rp2 eq "kpd">><<set _left_n to _left_n + 1>> <<elseif _rp2 eq "dnvp" or _rp2 eq "nsdap" or _rp2 eq "army">><<set _right_n to _right_n + 1>> <</if>> <<if _rp2 eq "kpd" or _rp2 eq "dnvp" or _rp2 eq "nsdap" or _rp2 eq "army">><<set _rad_n to _rad_n + 1>><</if>> <</for>> /* 解锁相处模式卡(柏林手记随时可查) */ <<set $party_modes_unlocked to true>> <<set $reception_done to true>> <</silently>>\ //人走得差不多了。杯子被轻轻地收拾着,像在复盘一场没说破的牌局。// //魏玛端着杯子向你走来。他今晚笑了很多次,现在终于不用笑了,脸上的疲惫反而看着真实一些。// <<if _rc.length eq 0>>\ <span class="txt-calm">「你一晚上都在角落里。」</span>他说,声音压得低。<span class="txt-calm">「不会出错。看清楚再动比动了再看好些。但你得知道他们也在看你。看了一晚上,他们也各有各的结论。」</span>\ <<elseif _left_n gt _right_n and _left_n gt 0>>\ <span class="txt-calm">「你往左边去了。」</span>他用的陈述句。<span class="txt-calm">「工人那边的人记住了你。右边那几位,」</span>他朝大厅那头抬了抬下巴,<span class="txt-calm">「也记住了。他们记住的东西不一样,所以麻烦往往就是从这儿开始的。」</span>\ <<elseif _right_n gt _left_n and _right_n gt 0>>\ <span class="txt-calm">「你往右边去了。」</span>他语气中没有疑问。<span class="txt-calm">「旧秩序的人愿意跟你说话,这之后会成为你的资本。但左边那边,」</span>他顿了顿,<span class="txt-calm">「工人党的记性也很好。」</span>\ <<else>>\ <span class="txt-calm">「你今晚谁都碰了一点。」</span>他点点头,<span class="txt-calm">「滴水不漏是本事,但谁都不得罪等于谁都可以不算数。以后你会明白的。」</span>\ <</if>>\ <<if $reception_observations gt 0 and _rc.length gt 0>>\ //他看了看你,又补了一句:<span class="txt-calm">「远观比入局安全。今晚走进你三步之内的人,明天还会记得你,可和你隔着一墙距离的人,记不了那么深。」</span>//\ <</if>> //他喝了一口,杯子转了半圈。// <span class="txt-calm">「记住今晚的样子。他们八个人八本账,你以后每天都要和他们打交道。」</span> //他从口袋里拿出你的笔记本,你都不记得什么时候落在他那里的。翻开是新的一页,他工整的字体落在上面。// //<span class="txt-calm">「与他们相处的方法,我替你起了个头。剩下的等你自己补吧。」</span>// <hr> ''他写下的八行(已收进柏林手记·政党意识体,随时可查):'' <div class="nb-gloss">''SPD'' //他需要你先听完他的话,再谈别的。相反,你越强硬,他越不肯让。// ''KPD'' //他遭受过背叛,所以最看重立场,社交与寒暄对他无用。至于你走向哪里,他迟早会再问。// ''DDP'' //他希望你和他一样遵守规则。若你破例,他并不会当面指责,但或许会默默记下许久。// ''DVP'' //他谈的始终是条件,不是交情。答应他的事最好兑现,否则下一次他开的价会更高。// ''Zentrum'' //他不希望你干涉他太多。你若稳他便稳;你若伸手,他也会把手伸向你这里。// ''DNVP'' //他记住了很多旧事。旧账没清之前跟他谈将来,他什么都不会信。// ''NSDAP'' //他永远无法满足。不止是利益,你的位置也在他渴求的范围。你给他一尺他便想要一丈。// ''军方'' //他需要清晰的命令。命令含糊他就自己解释,只是到那时,就轮不到你说话了。//</div>\ <span class="teaching-note">在这里你多看谁一眼,都有人在暗中观察。讨好一家就冷落了另一家,这是柏林的规则。</span> <hr>\ <<link "夜色已浓,回去吧。" "Scene_Office">><</link>>
<<silently>> /* ════════════════════════════════════════════════════════════ 统一事件呈现段(发牌制) 用 $file_target_idx 取玩家从列表选中的事件 ════════════════════════════════════════════════════════════ */ <<set _ev_idx to $file_target_idx ?? 0>> <<set _ev to $pending_events[_ev_idx]>> /* 按严重度定调:severe=历史巨浪 / warm=区域警报 / calm=日常 · 涟漪见闻 正文浅染 + 标题上色 + 徽章 共用同一档位 */ <<set _sev to "calm">> <<if _ev.level is "promise" or (_ev.deck_id and _ev.deck_id.indexOf("P") eq 0)>> <<set _sev to "severe">> <<set $this_promise_hint to "你答应过" + (_ev.party_name ? _ev.party_name : "对方") + "的事,还欠着。文件就摆在你桌上,像一句没说完的话。">> <<elseif _ev.source is "swell" or (_ev.deck_id and _ev.deck_id.indexOf("S") eq 0)>> <<set _sev to "dark">> <<set $this_swell_replaces to _ev.swell_replaces>> <<elseif _ev.deck_id and _ev.deck_id.indexOf("R") eq 0>> <<set _sev to "severe">> <<elseif _ev.source is "historical">> <<set _sev to "severe">> <<elseif _ev.deck_id and (_ev.deck_id.indexOf("A") eq 0 or _ev.deck_id.indexOf("Y") eq 0)>> <<set _sev to "warm">> <<elseif _ev.source is "tag-induced">> <<set _sev to "warm">> <</if>> <<set _body_class to "txt-" + _sev + "-body">> <<set _title_class to "ev-title-" + _sev>> <<set _site_pending_name to (_ev.site_pending and $regions[_ev.site_pending.region]) ? $regions[_ev.site_pending.region].name : "现场">> <</silently>>\ <<if _ev.template eq "filebasket">>\ <span class="badge badge-cyan">📄 呈报 · <<= _ev.fb_data.category >></span>\ <<elseif _ev.level is "promise" or (_ev.deck_id and _ev.deck_id.indexOf("P") eq 0)>>\ <span class="badge badge-purple">⚜ 许诺 · 必须处理</span>\ <<elseif _ev.source is "crisis" or (_ev.deck_id and _ev.deck_id.indexOf("C") eq 0)>>\ <span class="badge badge-red">⬛ 危机爆发 · 压不住了</span>\ <<elseif _ev.source is "swell" or (_ev.deck_id and _ev.deck_id.indexOf("S") eq 0)>>\ <span class="badge badge-swell">🌊 历史暗涌 · 历史在此偏转</span>\ <<elseif _ev.deck_id and _ev.deck_id.indexOf("R") eq 0>>\ <span class="badge badge-red">🔴 历史巨浪 · 必须处理</span>\ <<elseif _ev.deck_id and _ev.deck_id.indexOf("A") eq 0>>\ <span class="badge badge-orange">🟡 区域警报 · 建议处理</span>\ <<elseif _ev.deck_id and _ev.deck_id.indexOf("Y") eq 0>>\ <span class="badge badge-orange">🟡 区域警报 · 建议处理</span>\ <<elseif _ev.deck_id and _ev.deck_id.indexOf("W") eq 0>>\ <span class="badge badge-gray">⚪ 氛围见闻 · 可选</span>\ <<elseif _ev.source is "historical">>\ <span class="badge badge-red">🔴 历史巨浪 · 必须处理</span>\ <<elseif _ev.source is "tag-induced">>\ <span class="badge badge-orange">🟡 区域警报 · 建议处理</span>\ <<elseif _ev.source is "followup" and _ev.irreversible gte 3>>\ <span class="badge badge-red">📬 大事余波 · 必须处理</span>\ <<elseif _ev.intensity gte 25>>\ <span class="badge badge-cyan">🔵 日常涟漪 · 可选</span>\ <<else>>\ <span class="badge badge-gray">⚪ 氛围见闻 · 可选</span>\ <</if>> <<print '<span class="ev-title ' + _title_class + '">' + _ev.title + '</span>'>> <<if _sev is "dark" and $this_swell_replaces>>\ <div class="swell-hint">🌊 //风暴没有如期而至。你本该听到的,是另一场风暴的名字。可它没有来——历史的方向,在你撑住的这几个月里,偏转了一丝。//</div>\ <</if>>\ <<print '<span class="' + _body_class + '">' + _ev.description + '</span>'>> <<if _ev.deck_id and _ev.deck_id.indexOf("A_white") eq 0>>\ <span class="txt-muted">//你可以不去处理,这件事会自行解决。//</span>\ <</if>>\ <<if _ev.deck_id is "UE_76" or _ev.deck_id is "UE_77">>\ <div class="guide-box">//泄压阀门:这样的文件不会平白送上门——是某个压力烧到顶太久,才递到你案头的。泄,顶满的数字会被当场压下去,但每一笔都有代价;不泄,它继续烧。//</div>\ <</if>>\ <<if _ev.irreversible gte 3>>\ <span class="ev-warning">⚠ 该事件的后果可能影响未来多个阶段。</span>\ <</if>>\ <<if not $tutorial_done>>\ <div class="guide-box"> //每个选择都会消耗你的时间、改变这个国家。处理完,简报会告诉你具体改变了什么。// </div>\ <</if>>\ /* ── 行动力不足拦截(V0.9):本事件处理成本与结算页同一套(红3/生态2/白1)。 不足时整页只出拦截盒,选项不渲染、不扣点、零副作用;事件留在桌上。 ── */ <<silently>> <<set _guard_is_red to false>> <<if _ev.deck_id and (_ev.deck_id.indexOf("R") eq 0 or _ev.deck_id.indexOf("S") eq 0)>><<set _guard_is_red to true>> <<elseif _ev.source is "historical" or _ev.source is "swell">><<set _guard_is_red to true>> <<elseif _ev.source is "crisis">><<set _guard_is_red to true>> <</if>> <<set _guard_cost to 2>> <<if _guard_is_red>> <<set _guard_cost to 3>> <<elseif _ev.deck_id and _ev.deck_id.indexOf("W") eq 0>> <<set _guard_cost to 1>> <</if>> /* 已预付过"去现场"路费的文件,不再收第二道钱 */ <<if _ev.tp_paid>><<set _guard_cost to 0>><</if>> <<set _tp_block to false>> <<if _guard_cost gt 0>> <<tp-can _guard_cost>> <<set _tp_block to (not _tp_ok)>> <</if>> <</silently>>\ <<if _tp_block>>\ <div class="ev-divider"></div>\ <<tp-guard _guard_cost>>\ <<else>>\ <div class="ev-divider"></div>\ <<if _ev.site_pending>>\ /* 已选择"去现场":不再渲染批文选项,改为引导前往对应区域 */ <div class="scene-block"> //你没有在文件上签字。你把它推回桌角,站起身,拿起大衣。// //你准备前往「_site_pending_name」。这场风暴,你要亲眼去看。// <<set _sp_region to _ev.site_pending.region>>\ <<set _sp_days to _ev.site_pending.deadline_day - $session_day>>\ <<if _sp_days gte 0>>\ //它不会等你太久——还剩 _sp_days 天。//\ <<else>>\ //时限已经过了。你最好现在就走。//\ <</if>>\ </div> <<set _sp_passage to $regions[_sp_region].passage>>\ <<set _sp_paid to _ev.tp_paid ? _ev.tp_paid : false>>\ <<if _sp_paid>>\ <<link "立即前往「_site_pending_name」">><<goto _sp_passage>><</link>> <<else>>\ <<tp-can $regions[_sp_region].tp_cost>>\ <<if _tp_ok>>\ <<link "立即前往「_site_pending_name」">><<region-travel _sp_region>><<goto _sp_passage>><</link>> <<else>>\ <span class="rmap-lock">==立即前往「_site_pending_name」==(今天的力气不够走这一趟 · 需 _tp_need 点,剩 _tp_have 点)</span> <span class="txt-muted">//路上会耗掉你最后的精力。先歇了,明天一早再去。//</span>\ <</if>>\ <</if>>\ <<link "稍后前往(先回办公室)" "Scene_Office">><</link>> <<elseif _ev.template eq "followup">>\ <<set _fu_passage to _ev.followup_passage ? _ev.followup_passage : "Followup_Generic">>\ <<set $file_target_idx to _ev_idx>>\ <<link "前往「_ev.title」">><<goto _fu_passage>><</link>> <<link "稍后再处理(回办公室)" "Scene_Office">><</link>> <<elseif _ev.template eq "filebasket">>\ <<fb-render-options _ev>>\ <<else>>\ <<render-options _ev.template _ev>>\ <</if>> <</if>> /* ── 紧急权力出口:红色/暗涌/危机事件页,第48条可用时多一项。 放在行动力拦截之外——手上没有力气处理的时候,正是它该说话的时候。 ── */ <<if $a48 and $a48.held and $a48.ready and _guard_is_red and not _ev.site_pending and not (_ev.template eq "followup")>> <div class="ev-divider"></div> /* 第48条教学 · 第2拍:第一次见到这个出口时的一行提醒(事件页与开票页共用一个旗标,先到先显) */ <<if not $flags.a48_hint_done>>\ <span class="txt-muted">//第48条第一次摆上你的桌面。它不用开会,也不用表决——点进去,会先把这一签的全部代价一条条列给你,然后才要你落笔。//</span><br>\ <<set $flags.a48_hint_done to true>>\ <</if>>\ <span class="a48-choice"><<link "⚡ 动用紧急权力:让这件事整个停在纸上(第48条)">> <<set $a48_pm_asked to false>>\ <<set $a48_ctx to { mode: "suppress", event_id: _ev.event_id, title: _ev.title, return: "event" }>>\ <<goto "Scene_A48_Consent">>\ <</link>></span> //(不开会,不辩论,不给任何人递条子——受益方信任-8、DDP信任-4、中产信心-2、魏玛疲惫+5。每期60天限一次。)//\ <</if>>
/* ---------- red-settle-core:红色/暗涌事件共用结算核心(治理路线 v2) ---------- 用法:<<red-settle-core _ev "manual">> 手动结算(File_Result 用,提示直接打印) <<red-settle-core _ev "auto">> 托管结算(route-resolve 分支B 用,提示收进 _rr_notes) 管线:event-resolve → 政党立场计数 → 今日已办登记 → 区域解锁 → R07/R08/R09/R16/R17 专属处理 → P22 → 暗涌旗标 → S01 余波。 说明:母体事件(A/Y)的 world_effects 已改为发牌时生效(archetype-spawn 落地即伤), 结算层不再重复应用——否则选项层+结算层双重生效,之后长期滴灌也会翻倍。 */ <<widget "red-settle-core">>\ <<silently>> <<set _ev to $args[0]>> <<set _rs_mode to $args[1] ? $args[1] : "manual">> <<set _rs_notes to []>> <<event-resolve _ev.event_id>> /* 政党立场一致性计数:红色/暗涌事件根据玩家选择判定 */ <<set _rs_red to false>> <<if _ev.deck_id and (_ev.deck_id.indexOf("R") eq 0 or _ev.deck_id.indexOf("S") eq 0)>><<set _rs_red to true>> <<elseif _ev.source is "historical" or _ev.source is "swell">><<set _rs_red to true>> <<elseif _ev.source is "crisis">><<set _rs_red to true>> <</if>> <<if _rs_red>> <<party-aligned-map _ev.deck_id $file_action>> <</if>> /* 记录当天处理的事务(供夜晚向魏玛报告) */ <<set _handled_level to "white">> <<if _rs_red>><<set _handled_level to "red">> <<elseif _ev.deck_id and (_ev.deck_id.indexOf("A") eq 0 or _ev.deck_id.indexOf("Y") eq 0)>><<set _handled_level to "yellow">> <<elseif _ev.source is "historical">><<set _handled_level to "red">> <<elseif _ev.source is "tag-induced">><<set _handled_level to "yellow">> <</if>> <<set _rs_handled to {deck_id: _ev.deck_id, title: _ev.title, template: _ev.template, intensity: _ev.intensity, level: _handled_level, action: $file_action}>> <<if _rs_mode is "auto">><<set _rs_handled.auto to true>><</if>> <<set $today_handled.push(_rs_handled)>> /* 区域解锁:红色事件结算后,根据事件ID解锁对应区域 */ <<set _new_unlocks to []>> <<if _ev.deck_id eq "R01">> <<if not $regions.presidency.unlocked>><<set $regions.presidency.unlocked to true>><<set _new_unlocks.push("总统府")>><</if>> <<if not $regions.ruhr_essen.unlocked>><<set $regions.ruhr_essen.unlocked to true>><<set _new_unlocks.push("埃森·鲁尔区")>><</if>> <<if not $regions.foreign_office.unlocked>><<set $regions.foreign_office.unlocked to true>><<set _new_unlocks.push("外交部")>><</if>> <<elseif _ev.deck_id eq "R02">> <<if not $regions.reichstag.unlocked>><<set $regions.reichstag.unlocked to true>><<set _new_unlocks.push("国会大厦")>><</if>> <<elseif _ev.deck_id eq "R03">> <<if not $regions.brandenburg.unlocked>><<set $regions.brandenburg.unlocked to true>><<set _new_unlocks.push("勃兰登堡门")>><</if>> <<elseif _ev.deck_id eq "R11">> <<if not $regions.hamburg.unlocked>><<set $regions.hamburg.unlocked to true>><<set _new_unlocks.push("汉堡")>><</if>> <<elseif _ev.deck_id eq "R14">> <<if not $regions.munich.unlocked>><<set $regions.munich.unlocked to true>><<set _new_unlocks.push("慕尼黑")>><</if>> <<elseif _ev.deck_id eq "S01">> <<if not $regions.hamburg.unlocked>><<set $regions.hamburg.unlocked to true>><<set _new_unlocks.push("汉堡")>><</if>> <<if not $regions.ruhr_essen.unlocked>><<set $regions.ruhr_essen.unlocked to true>><<set _new_unlocks.push("埃森·鲁尔区")>><</if>> <<elseif _ev.deck_id eq "S02">> <<if not $regions.hamburg.unlocked>><<set $regions.hamburg.unlocked to true>><<set _new_unlocks.push("汉堡")>><</if>> <<if not $regions.ruhr_essen.unlocked>><<set $regions.ruhr_essen.unlocked to true>><<set _new_unlocks.push("埃森·鲁尔区")>><</if>> <<elseif _ev.deck_id eq "S03">> <<if not $regions.munich.unlocked>><<set $regions.munich.unlocked to true>><<set _new_unlocks.push("慕尼黑")>><</if>> <<elseif _ev.deck_id eq "S04">> <<if not $regions.brandenburg.unlocked>><<set $regions.brandenburg.unlocked to true>><<set _new_unlocks.push("勃兰登堡门")>><</if>> <<if not $regions.wedding.unlocked>><<set $regions.wedding.unlocked to true>><<set _new_unlocks.push("威丁")>><</if>> <<elseif _ev.deck_id eq "S05">> <<if not $regions.officers_club.unlocked>><<set $regions.officers_club.unlocked to true>><<set _new_unlocks.push("军官俱乐部")>><</if>> <<if not $regions.munich.unlocked>><<set $regions.munich.unlocked to true>><<set _new_unlocks.push("慕尼黑")>><</if>> <<elseif _ev.deck_id eq "S07">> <<if not $regions.ruhr_essen.unlocked>><<set $regions.ruhr_essen.unlocked to true>><<set _new_unlocks.push("埃森·鲁尔区")>><</if>> <<elseif _ev.deck_id eq "S09">> <<if not $regions.officers_club.unlocked>><<set $regions.officers_club.unlocked to true>><<set _new_unlocks.push("军官俱乐部")>><</if>> <<elseif _ev.deck_id eq "S11">> <<if not $regions.officers_club.unlocked>><<set $regions.officers_club.unlocked to true>><<set _new_unlocks.push("军官俱乐部")>><</if>> <<elseif _ev.deck_id eq "S12">> <<if not $regions.ruhr_essen.unlocked>><<set $regions.ruhr_essen.unlocked to true>><<set _new_unlocks.push("埃森·鲁尔区")>><</if>> <</if>> <<if _new_unlocks.length gt 0>> <<set _rs_notes.push("新区域已解锁:" + _new_unlocks.join("、") + "。地图上可以查看了。")>> <</if>> /* DVP派总理NPC & 消极抵抗flag 处理 */ <<if _ev.deck_id eq "R07">> /* DVP组阁:DVP派总理上台,激活NPC */ <<set $npcs.dvp_pm.active to true>> <<set $npcs.dvp_pm.trust to 25>> <<set _rs_notes.push("DVP的务实派已就任总理。状态栏可查看信任度。")>> <<elseif _ev.deck_id eq "R08">> /* 结束消极抵抗:清除flag */ <<set $flags.passive_resistance to "ended">> <<if $npcs.dvp_pm.active>> <<if $file_action eq "sign">><<set $npcs.dvp_pm.trust to Math.min(100, $npcs.dvp_pm.trust + 5)>> <<elseif $file_action eq "delay">><<set $npcs.dvp_pm.trust to Math.max(0, $npcs.dvp_pm.trust - 8)>> <</if>> <</if>> <<elseif _ev.deck_id eq "R09">> /* 第48条启用:紧急权力从这一天起由你调用(每期60天限一次) */ <<if $a48 and not $a48.held>> <<set $a48.held to true>> <<set $a48.ready to true>> <<set _rs_notes.push("紧急权力 · 第48条,从今天起由你调用。办公室可查看详情;本期(60天)可动用一次。")>> <</if>> <<elseif _ev.deck_id eq "R16">> /* 地租马克发行:DVP派总理的政绩 + 余波滴灌 */ <<if $npcs.dvp_pm.active and $file_action eq "sign">> <<set $npcs.dvp_pm.trust to Math.min(100, $npcs.dvp_pm.trust + 3)>> <</if>> <<set _r16_reg to null>> <<if $opt_label and $opt_label.includes("并行")>> <<set _r16_reg to {src_id:"R16", title:"地租马克·分步过渡", kind:"aftermath", band:"super", effects:{daily:{inflation:-0.15}, duration:90, decay:false}}>> <<elseif $opt_label and ($opt_label.includes("果断") or $opt_label.includes("补偿") or $opt_label.includes("央行"))>> <<set _r16_reg to {src_id:"R16", title:"地租马克·货币改革止血", kind:"aftermath", band:"super", effects:{daily:{inflation:-0.3}, duration:90, decay:false}}>> <</if>> <<if _r16_reg>> <<active-effect-register _r16_reg>> <<set _rs_notes.push("新的马克开始流通。止血不是一瞬间的事——往后九十天,通胀一天松一口。状态栏【持续生效】可见。")>> <</if>> <<elseif _ev.deck_id eq "R17">> /* 总理下台:DVP派总理转任外长 */ <<if $npcs.dvp_pm.active>> <<set $npcs.dvp_pm.trust to Math.max(0, $npcs.dvp_pm.trust - 5)>> <</if>> <</if>> /* 宪法之约(P22)兑现记录:履行=kept,违背=broken——这是第48条违约判定的依据 */ <<if _ev.deck_id eq "P22">> <<if $file_action eq "sign">> <<set $flags.ddp_covenant to "kept">> <<else>> <<set $flags.ddp_covenant to "broken">> <</if>> <</if>> /* 历史暗涌后续影响:处理完暗涌后,植入持久 flag(供报纸/后续事件/结局引用) */ <<if _ev.source eq "swell" or (_ev.deck_id and _ev.deck_id.indexOf("S") eq 0)>> <<set $flags["swell_" + _ev.deck_id] to true>> <<set $flags.swell_aftermath to ($flags.swell_aftermath || 0) + 1>> <<set _rs_notes.push("历史已偏转。「" + _ev.title + "」的余波,将写进接下来的报纸与岁月。")>> /* 历史偏移实感(93_drift_memory):账本记一笔,报纸/夜话/手记会记得他 */ <<drift-note-swell _ev.deck_id>> <</if>> /* 余波试点(S01):全国总动员处理完毕,余波逐日滴灌10天(短期) */ <<if _ev.deck_id eq "S01">> <<set _s01_reg to null>> <<if $opt_label and $opt_label.includes("镇压")>> <<set _s01_reg to {src_id:"S01", title:"总动员余波·镇压后的余温", kind:"aftermath", band:"short", effects:{daily:{social_anger:0.3, political_violence:0.15}, duration:10, decay:true}}>> <<elseif $opt_label and $opt_label.includes("谈判")>> <<set _s01_reg to {src_id:"S01", title:"总动员余波·谈判换来的安静", kind:"aftermath", band:"short", effects:{daily:{political_violence:-0.3}, duration:10, decay:true}}>> <<elseif $opt_label and $opt_label.includes("救济")>> <<set _s01_reg to {src_id:"S01", title:"总动员余波·救济的账单", kind:"aftermath", band:"short", effects:{daily:{social_anger:-0.3, inflation:0.2}, duration:10, decay:true}}>> <</if>> <<if _s01_reg>> <<active-effect-register _s01_reg>> <<set _rs_notes.push("这件事没有在文件里结束。它的余波会一天一天长出来——状态栏【持续生效】可见。")>> <</if>> <</if>> /* 余波(S07-S13,用户新增暗涌):同 S01 模式,逐日滴灌 */ <<if _ev.deck_id eq "S07">> <<set _sw_reg to null>> <<if $opt_label and $opt_label.includes("镇压")>> <<set _sw_reg to {src_id:"S07", title:"莱茵余波·枪口下的对峙", kind:"aftermath", band:"short", effects:{daily:{nationalism:0.2, political_violence:0.15}, duration:10, decay:true}}>> <<elseif $opt_label and $opt_label.includes("承认")>> <<set _sw_reg to {src_id:"S07", title:"莱茵余波·地图上缺角的疼", kind:"aftermath", band:"short", effects:{daily:{nationalism:0.1, gov_trust:-0.1}, duration:8, decay:true}}>> <<else>> <<set _sw_reg to {src_id:"S07", title:"莱茵余波·没有署名的钱", kind:"aftermath", band:"short", effects:{daily:{nationalism:0.15}, duration:8, decay:true}}>> <</if>> <<elseif _ev.deck_id eq "S08">> <<set _sw_reg to null>> <<if $opt_label and $opt_label.includes("取缔")>> <<set _sw_reg to {src_id:"S08", title:"遇刺余波·查封之后的暗账", kind:"aftermath", band:"short", effects:{daily:{political_violence:-0.2, social_anger:0.1}, duration:10, decay:true}}>> <<elseif $opt_label and $opt_label.includes("保护法")>> <<set _sw_reg to {src_id:"S08", title:"遇刺余波·变宽的权力", kind:"aftermath", band:"short", effects:{daily:{gov_trust:0.1, political_violence:-0.1}, duration:10, decay:true}}>> <<else>> <<set _sw_reg to {src_id:"S08", title:"遇刺余波·没拔根的仇恨", kind:"aftermath", band:"short", effects:{daily:{political_violence:-0.1}, duration:8, decay:true}}>> <</if>> <<elseif _ev.deck_id eq "S09">> <<set _sw_reg to null>> <<if $opt_label and $opt_label.includes("默许")>> <<set _sw_reg to {src_id:"S09", title:"影子部队余波·账外的操练", kind:"aftermath", band:"short", effects:{daily:{army_influence:0.2}, duration:12, decay:true}}>> <<elseif $opt_label and $opt_label.includes("收编")>> <<set _sw_reg to {src_id:"S09", title:"影子部队余波·见光的名册", kind:"aftermath", band:"short", effects:{daily:{army_influence:0.15, gov_trust:0.1}, duration:10, decay:true}}>> <<else>> <<set _sw_reg to {src_id:"S09", title:"影子部队余波·贴上封条的库房", kind:"aftermath", band:"short", effects:{daily:{army_influence:-0.2}, duration:10, decay:true}}>> <</if>> <<elseif _ev.deck_id eq "S10">> <<set _sw_reg to null>> <<if $opt_label and $opt_label.includes("征粮")>> <<set _sw_reg to {src_id:"S10", title:"粮仓余波·村口的圆木", kind:"aftermath", band:"short", effects:{daily:{social_anger:0.2}, duration:10, decay:true}}>> <<elseif $opt_label and $opt_label.includes("价格")>> <<set _sw_reg to {src_id:"S10", title:"粮仓余波·两头付账", kind:"aftermath", band:"short", effects:{daily:{inflation:0.15}, duration:10, decay:true}}>> <<else>> <<set _sw_reg to {src_id:"S10", title:"粮仓余波·走走停停的粮车", kind:"aftermath", band:"short", effects:{daily:{social_anger:0.15, economy:0.1}, duration:8, decay:true}}>> <</if>> <<elseif _ev.deck_id eq "S11">> <<set _sw_reg to null>> <<if $opt_label and $opt_label.includes("清洗")>> <<set _sw_reg to {src_id:"S11", title:"密谋余波·缝合的刀口", kind:"aftermath", band:"short", effects:{daily:{army_influence:-0.15, political_violence:-0.1}, duration:8, decay:true}}>> <<elseif $opt_label and $opt_label.includes("调离")>> <<set _sw_reg to {src_id:"S11", title:"密谋余波·正常轮换", kind:"aftermath", band:"short", effects:{daily:{army_influence:-0.1}, duration:8, decay:true}}>> <<else>> <<set _sw_reg to {src_id:"S11", title:"密谋余波·走针的时钟", kind:"aftermath", band:"short", effects:{daily:{army_influence:0.1}, duration:10, decay:true}}>> <</if>> <<elseif _ev.deck_id eq "S12">> <<set _sw_reg to null>> <<if $opt_label and $opt_label.includes("接受")>> <<set _sw_reg to {src_id:"S12", title:"通牒余波·往回拨的钟", kind:"aftermath", band:"short", effects:{daily:{gov_trust:-0.15, nationalism:0.15}, duration:10, decay:true}}>> <<elseif $opt_label and $opt_label.includes("拒绝")>> <<set _sw_reg to {src_id:"S12", title:"通牒余波·不会唱歌的报表", kind:"aftermath", band:"short", effects:{daily:{nationalism:0.2, economy:0.15}, duration:10, decay:true}}>> <<else>> <<set _sw_reg to {src_id:"S12", title:"通牒余波·没有表情的回电", kind:"aftermath", band:"short", effects:{daily:{inflation:0.1}, duration:10, decay:true}}>> <</if>> <<elseif _ev.deck_id eq "S13">> <<set _sw_reg to null>> <<if $opt_label and $opt_label.includes("审查")>> <<set _sw_reg to {src_id:"S13", title:"报馆余波·地下的油印", kind:"aftermath", band:"short", effects:{daily:{gov_trust:-0.1, social_anger:0.1}, duration:8, decay:true}}>> <<elseif $opt_label and $opt_label.includes("起诉")>> <<set _sw_reg to {src_id:"S13", title:"报馆余波·法庭的格子", kind:"aftermath", band:"short", effects:{daily:{political_violence:-0.1}, duration:8, decay:true}}>> <<else>> <<set _sw_reg to {src_id:"S13", title:"报馆余波·吵成的话题", kind:"aftermath", band:"short", effects:{daily:{social_anger:0.1}, duration:6, decay:true}}>> <</if>> <</if>> <<if _ev.deck_id eq "S07" or _ev.deck_id eq "S08" or _ev.deck_id eq "S09" or _ev.deck_id eq "S10" or _ev.deck_id eq "S11" or _ev.deck_id eq "S12" or _ev.deck_id eq "S13">> <<if _sw_reg>> <<active-effect-register _sw_reg>> <<set _rs_notes.push("这件事没有在文件里结束。它的余波会一天一天长出来——状态栏【持续生效】可见。")>> <</if>> <</if>> <</silently>>\ <<nobr>><<for _rsn to 0; _rsn lt _rs_notes.length; _rsn++>> <<if _rs_mode is "manual">> <<print '<span class="txt-sys"><em>(' + _rs_notes[_rsn] + ')</em></span><br>'>> <<else>> <<if not _rr_notes>><<set _rr_notes to []>><</if>> <<run _rr_notes.push(_rs_notes[_rsn])>> <</if>> <</for>><</nobr>>\ <</widget>>
<<silently>> /* 统一反馈段:TP消耗 + 抽签拼接反馈 + 叙事池回响 + event-resolve 结算 */ <<set _ev_idx to $file_target_idx ?? 0>> <<set _ev to $pending_events[_ev_idx]>> <<set _file_action to $file_action>> /* TP消耗:红色事件3TP/生态事件2TP/白色1TP */ <<set _is_red_ev to false>> <<if _ev.deck_id and (_ev.deck_id.indexOf("R") eq 0 or _ev.deck_id.indexOf("S") eq 0)>><<set _is_red_ev to true>> <<elseif _ev.source is "historical" or _ev.source is "swell">><<set _is_red_ev to true>> <<elseif _ev.source is "crisis">><<set _is_red_ev to true>> <</if>> <<set _tp_cost to 2>> <<set _tp_fatigue to 5>> <<if _is_red_ev>> <<set _tp_cost to 3>> <<set _tp_fatigue to 8>> <<elseif _ev.deck_id and _ev.deck_id.indexOf("W") eq 0>> <<set _tp_cost to 1>> <<set _tp_fatigue to 2>> <</if>> <<tp-spend _tp_cost _tp_fatigue>> /* 魏玛疲惫:只在事件结算时加,区域探索不影响魏玛 */ <<set $weimar.surface.fatigue to Math.min(100, $weimar.surface.fatigue + _tp_fatigue)>> <</silently>>\ /* 危机死亡判定(V0.8 给世界接牙):底子烂穿+最坏选项 -> 灭亡结局 */ <<crisis-death-check>>\ <<render-feedback _ev>> <<print _feedback_text>> <span class="txt-sys">//你选择了:$opt_label//</span> <<if $stance_feedback neq "">>\ <<print $stance_feedback>>\ <</if>>\ <<narrate-choice>> <<party-review-loop _ev.deck_id>>\ <<red-settle-core _ev "manual">>\ /* 第48条教学 · 第1拍:R09 解锁时结算页底部的一页轻教学(只给地图,不给数字——数字留在同意闸页) */ <<if _ev.deck_id eq "R09" and $a48 and $a48.held>>\ <div class="teaching-note">\ ''⚡ 紧急权力 · 第48条 —— 从今天起,由你调用''<br>\ 建国那年写进宪法的最后一件武器:国会来不及开会的时候,总统可以下令。过去它只是躺在纸上,今天起,它是你手里的一件工具。它能做三件事:<br>\ ①把案头压着的一件大事整件作废——不用处理,不用解释,不用开会。<br>\ ②否掉国会刚通过的一项法案——表决还没有散场,条文比表决快。<br>\ ③替一项没通过的法案强行生效——议长的槌还没落下,条文比槌快。<br>\ 每次动用都要有人签名。要么请总理副署——他可能拒绝,也可能开价;要么直接请总统签——他不说不,但他的信任就是价目。<br>\ 每用一次,共和国就矮一截。具体价目会在你落笔前一条条摆出来,到时候再决定也来得及。<br>\ 节奏是每期(60天)只够用一次。规矩全文随时可查:办公室「资料室」→「紧急权力·第48条」。 </div> <</if>>\ /* (结算核心已抽取为 red-settle-core:event-resolve→政党立场计数→今日已办登记 →区域解锁→R07/R08/R09/R16/R17专属处理→P22→暗涌旗标→S01余波。 手动处理与本页共用管线,跳天托管走 route-resolve 分支B 调用同一 widget。) */ /* 事件现场机制:带 scene 标记的黄事件,处理时给对应区域打上"现场待演"标记 玩家之后去该区域,会看到独家的事件现场演绎(而非普通随机小事件)。 现场带时限:deadline_day 内未去则超时,触发消极处理。 kind 由 scene 映射:anhalter=难民 / kreuzberg=工人占领 / kurfurstendamm=黑市 / tiergarten=军方密谋 / friedrichshain=抢粮 */ <<silently>> <<set _site_deadline to 3>> <<set _site_kind to "refugee">> <<if _ev.scene eq "kreuzberg">><<set _site_kind to "labor">> <<elseif _ev.scene eq "kurfurstendamm">><<set _site_kind to "market">> <<elseif _ev.scene eq "tiergarten">><<set _site_kind to "military">> <<elseif _ev.scene eq "friedrichshain">><<set _site_kind to "food">> <</if>> <</silently>>\ <<if _ev.scene and $regions[_ev.scene]>>\ <<set _sc_r to $regions[_ev.scene]>>\ <<if not _sc_r.active_event>>\ <<set _sc_r.active_event to { ev_id: _ev.event_id, title: _ev.title, kind: _site_kind, created_day: $session_day, deadline_day: $session_day + _site_deadline }>>\ <<set _sc_name to _sc_r.name>>\ <span class="txt-sys">//(这件事没有在文件里结束。你在「_sc_name」留下的涟漪,还要去那里亲眼看看--它不会等你太久。)//</span>\ <</if>>\ /* 允诺案:玩家"亲自到场处理"时,顺手写下一张承诺(对象随事件类型变化), 后续国会可升华成践诺案。红事件的 sign 与定制事件的援助首选(custom_aid)都算数。 */ <<if $file_action eq "sign" or ($file_action eq "custom" and $custom_aid)>>\ <<if _site_kind eq "labor">>\ <<promise-write "worker" "给占领工厂的工人发拖欠的工资" 60>>\ <span class="txt-sys">//(你当众允诺:结清拖欠的工资。这笔账写进了欠条簿,国会见。)//</span>\ <<elseif _site_kind eq "food">>\ <<promise-write "civil" "给抢粮的街区调拨救济粮" 60>>\ <span class="txt-sys">//(你当众允诺:调拨救济粮。这笔账写进了欠条簿,国会见。)//</span>\ <<elseif _site_kind eq "refugee">>\ <<promise-write "civil" "给难民发定期救济" 60>>\ <span class="txt-sys">//(你当众允诺:给难民一份定期救济。这笔账写进了欠条簿,国会见。)//</span>\ <</if>>\ <</if>>\ <</if>> <<tp-apply-bonus>> @@.txt-sys;font-size:0.85em;消耗 _tp_cost TP@@ <<if $choice_effects_summary neq "无显著变化">>\ @@.txt-sys;font-size:0.85em;效果:$choice_effects_summary@@\ <</if>>\ <<trust-act-note>>\ <<rival-note-show>>\ /* 现场前往选项:刚处理完带现场的事件,给玩家"立即前往 / 稍后前往"选择 */ <<if _ev.scene and $regions[_ev.scene] and $regions[_ev.scene].active_event>>\ <<set _sc_go_passage to $regions[_ev.scene].passage>>\ <<set _sc_go_key to _ev.scene>>\ <<set _sc_go_name to $regions[_ev.scene].name>>\ <<set _sc_go_days to $regions[_ev.scene].active_event.deadline_day - $session_day>>\ <div class="scene-block"> //这件事还悬在「_sc_go_name」,等你亲眼看。// <<if _sc_go_days gt 0>>\ //你不必立刻去,但别让它等太久--它只剩 _sc_go_days 天。//\ <<else>>\ //时限已经过了。你最好现在就去看看。//\ <</if>>\ </div> <<link "立即前往「_sc_go_name」">><<region-travel _sc_go_key>><<goto _sc_go_passage>><</link>> <<tp-can $regions[_sc_go_key].tp_cost>>\ <<if not _tp_ok>>\ <span class="txt-muted">(今天的力气不够走这一趟--需要 _tp_need 点,剩 _tp_have 点。可以歇了明天再去,现场不等人。)</span>\ <</if>>\ <<link "稍后前往(自己走地图过去)" "Scene_Office">><</link>> <</if>> <<if $pending_events.length gt 0>>\ <<link "继续处理下一件" "Scene_Files">><</link>> <<else>>\ //文件篮空了。// //你靠在椅背上,听见自己的脊椎咔嗒响了一声。// <<link "返回办公室" "Scene_Office">><</link>> <</if>> /* ════════════════════════════════════════════════════════════ 以下旧段落保留为兼容引用(Scene_Files 可能 include 它们) 但新流程统一走 File_Event -> File_Result ════════════════════════════════════════════════════════════ */
<<goto "File_Event">>
<<goto "File_Event">>
<<goto "File_Event">>
<<goto "File_Event">>
<<goto "File_Event">>
/* 完整柏林地图 · 按TP消耗从小到大排列 */ <<silently>><<set $rest_count to $rest_count + 1>><</silently>>\ <<tp-empty-bonus>><<tp-empty-hint>>\ //出门// 你穿好大衣,推开办公室的门。门外的柏林,是铅灰色的。 你展开一张地图。下笔的人把这座城市画得很清楚——西边宽、东边窄,北边是烟囱,南边是火车站。可当你把视线从纸上移开,抬头看真实的柏林时,那些线条就开始模糊了。 柏林的冬天是铅灰色的。它压在屋顶上,也压在人的眉毛上,一连许多天散不开。 <<if _empty_hint_text neq "">>\ //_empty_hint_text//\ <</if>> /* 待处理现场标记:统计所有打上 active_event 现场的区域 */ <<silently>> <<set _site_pending to []>>\ <<set _spk_keys to Object.keys($regions)>>\ <<for _spk_i to 0; _spk_i lt _spk_keys.length; _spk_i++>>\ <<set _spk to _spk_keys[_spk_i]>>\ <<if $regions[_spk].active_event>>\ <<set _site_pending.push({ key: _spk, name: $regions[_spk].name, passage: $regions[_spk].passage, ev: $regions[_spk].active_event })>>\ <</if>>\ <</for>>\ <</silently>>\ <<if _site_pending.length gt 0>>\ <div class="scene-block rmap-site-hint"> //你有 <b>_site_pending.length 件事</b> 需要亲眼看一看。// <<for _spl to 0; _spl lt _site_pending.length; _spl++>>\ <<set _sp to _site_pending[_spl]>>\ <<set _sp_days to _sp.ev.deadline_day - $session_day>>\ <<set _sp_days_abs to 0>>\ <<if _sp_days lt 0>><<set _sp_days_abs to 0 - _sp_days>><</if>>\ <<set _sp_tag to "◆">>\ <<if _sp_days lt 0>><<set _sp_tag to "⚠">><</if>>\ <> <b>_sp_tag 「_sp.name」</b>|_sp.ev.title <<if _sp_days gte 0>>\ (还剩 _sp_days 天)\ <<else>>\ (已超时 _sp_days_abs 天)\ <</if>>\ <</for>>\ //你可以现在过去,也可以晚点再来。但别让它们等太久。// </div>\ <</if>> <div class="rmap-group rmap-power">\ <span class="rmap-title">''权力走廊(0 TP)''</span> <<if $regions.chancellery.unlocked>><<region-link "总理府" "Region_Chancellery" "chancellery">> //威廉街77号。帝国的宫殿,共和国的办公室。//<<region-status "chancellery">><<else>><span class="rmap-lock">==总理府==(需要职务)</span><</if>>\ </div>\ <div class="rmap-group rmap-power">\ <span class="rmap-title">''权力走廊 · 近(0.3 TP)''</span> <<if $regions.presidency.unlocked>><<region-link "总统府" "Region_Presidency" "presidency">> //SPD出身的总统住在流亡皇帝卖掉的宫殿里。//<<region-status "presidency">><<else>><span class="rmap-lock">==总统府==(鲁尔危机后总统召见)</span><</if>> <<if $regions.reichstag.unlocked>><<region-link "国会大厦" "Region_Reichstag" "reichstag">> //玻璃穹顶下的角斗场。Zentrum的党部在走廊尽头的密谈室。//<<region-status "reichstag">><<else>><span class="rmap-lock">==国会大厦==(国会授权消极抵抗时开放)</span><</if>> <<if $regions.finance_ministry.unlocked>><<region-link "财政部" "Region_FinanceMinistry" "finance_ministry">> //账房。全德国的数字从这里过一遍,每一遍都比上一遍更难看。//<<region-status "finance_ministry">><<else>><span class="rmap-lock">==财政部==(锁定)</span><</if>> <<if $regions.foreign_office.unlocked>><<region-link "外交部" "Region_ForeignOffice" "foreign_office">> //威廉街另一头。法国人进了鲁尔之后,这里的灯就没熄过。//<<region-status "foreign_office">><<else>><span class="rmap-lock">==外交部==(法国人进鲁尔后开放)</span><</if>> <<if $regions.brandenburg.unlocked>><<region-link "勃兰登堡门" "Region_Brandenburg" "brandenburg">> //国家象征。抗议集会走的地方。DNVP的人常站在帝国旗旁。//<<region-status "brandenburg">><<else>><span class="rmap-lock">==勃兰登堡门==(埃森流血事件后开放)</span><</if>> <<if $regions.unter_den_linden.unlocked>><<region-link "菩提树下大街" "Region_UnterDenLinden" "unter_den_linden">> //最宏伟也最虚伪的一条街。//<<region-status "unter_den_linden">><<else>><span class="rmap-lock">==菩提树下大街==(锁定)</span><</if>> <<if $regions.tiergarten.unlocked>><<region-link "蒂尔加滕" "Region_Tiergarten" "tiergarten">> //林荫道上的旧帝国幽灵。国防军司令部就在本德勒大楼。//<<region-status "tiergarten">><<else>><span class="rmap-lock">==蒂尔加滕==(锁定)</span><</if>>\ </div>\ <div class="rmap-group rmap-city">\ <span class="rmap-title">''公共空间与枢纽 · 近(0.4 TP)''</span> <<if $regions.alexanderplatz.unlocked>><<region-link "亚历山大广场" "Region_Alexanderplatz" "alexanderplatz">> //Manoli香烟的霓虹灯转个不停。//<<region-status "alexanderplatz">><<else>><span class="rmap-lock">==亚历山大广场==(锁定)</span><</if>> <<if $regions.officers_club.unlocked>><<region-link "军官俱乐部" "Region_OfficersClub" "officers_club">> //烟雾缭绕的密谋之地。军装比西装多。//<<region-status "officers_club">><<else>><span class="rmap-lock">==军官俱乐部==(在蒂尔加滕与军官搭话)</span><</if>> <<if $regions.police_hq.unlocked>><<region-link "红堡·警察总局" "Region_PoliceHQ" "police_hq">> //红砖巨厦俯瞰着亚历山大广场。秩序从这里出发,也从这里折返。//<<region-status "police_hq">><<else>><span class="rmap-lock">==红堡==(锁定)</span><</if>>\ </div>\ <div class="rmap-group rmap-city">\ <span class="rmap-title">''新西部与波希米亚 · 中距(0.5 TP)''</span> <<if $regions.kurfurstendamm.unlocked>><<region-link "选帝侯大街" "Region_Kurfurstendamm" "kurfurstendamm">> //霓虹灯下的通胀暴富者。DVP的党部在商会大楼。//<<region-status "kurfurstendamm">><<else>><span class="rmap-lock">==选帝侯大街==(锁定)</span><</if>> <<if $regions.romanisches.unlocked>><<region-link "罗曼咖啡馆" "Region_Romanisches" "romanisches">> //左翼知识分子的桌子。DDP的人常在这里碰头,靠窗那桌是他们的老位置。//<<region-status "romanisches">><<else>><span class="rmap-lock">==罗曼咖啡馆==(锁定)</span><</if>> <<if $regions.kabarett.unlocked>><<region-link "卡巴莱" "Region_Kabarett" "kabarett">> //灯红酒绿。讽刺剧和秘密一样多。//<<region-status "kabarett">><<else>><span class="rmap-lock">==卡巴莱==(锁定)</span><</if>>\ </div>\ <div class="rmap-group rmap-worker">\ <span class="rmap-title">''工人与左翼 · 中距(0.5 TP)''</span> <<if $regions.kreuzberg.unlocked>><<region-link "克罗伊茨贝格" "Region_Kreuzberg" "kreuzberg">> //每平方公里塞六万人的蜂巢。SPD的党部就在工会楼上。//<<region-status "kreuzberg">><<else>><span class="rmap-lock">==克罗伊茨贝格==(锁定)</span><</if>> <<if $regions.moabit.unlocked>><<region-link "莫阿比特" "Region_Moabit" "moabit">> //灰墙和铁窗。监狱岛上的工人区。//<<region-status "moabit">><<else>><span class="rmap-lock">==莫阿比特==(在克罗伊茨贝格与工会接触)</span><</if>>\ </div>\ <div class="rmap-group rmap-city">\ <span class="rmap-title">''口岸与边缘 · 中距(0.5 TP)''</span> <<if $regions.anhalter.unlocked>><<region-link "安哈尔特火车站" "Region_Anhalter" "anhalter">> //柏林的南大门。鲁尔难民从这里进来。//<<region-status "anhalter">><<else>><span class="rmap-lock">==安哈尔特火车站==(锁定)</span><</if>> <<if $regions.potsdamer.unlocked>><<region-link "波茨坦火车站" "Region_Potsdamer" "potsdamer">> //南方门户。巴伐利亚来客的终点站。//<<region-status "potsdamer">><<else>><span class="rmap-lock">==波茨坦火车站==(锁定)</span><</if>>\ </div>\ <div class="rmap-group rmap-military">\ <span class="rmap-title">''旧精英与军方 · 中距(0.5 TP)''</span> <<if $regions.charlottenburg.unlocked>><<region-link "夏洛滕堡" "Region_Charlottenburg" "charlottenburg">> //军官居住区。军装在衣帽间里比西装多。//<<region-status "charlottenburg">><<else>><span class="rmap-lock">==夏洛滕堡==(在蒂尔加滕与军官搭话)</span><</if>>\ </div>\ <div class="rmap-group rmap-worker">\ <span class="rmap-title">''工人与左翼 · 远(0.6-0.7 TP)''</span> <<if $regions.friedrichshain.unlocked>><<region-link "弗里德里希斯海因" "Region_Friedrichshain" "friedrichshain">> //街垒和工厂烟囱。//<<region-status "friedrichshain">><<else>><span class="rmap-lock">==弗里德里希斯海因==(锁定)</span><</if>> <<if $regions.wedding.unlocked>><<region-link "威丁" "Region_Wedding" "wedding">> //红色威丁。KPD的铁票仓,党部就藏在米勒街的某扇门后。//<<region-status "wedding">><<else>><span class="rmap-lock">==威丁==(在克罗伊茨贝格与工会接触)</span><</if>>\ </div>\ <div class="rmap-group rmap-duty">\ <span class="rmap-title">''外景地 · 出差(2.0-2.5 TP)''</span> <<if $regions.ruhr_essen.unlocked>><<region-link "埃森·鲁尔区" "Region_Ruhr" "ruhr_essen">> //鲁尔危机现场。法军占领区。//<<region-status "ruhr_essen">><<else>><span class="rmap-lock">==埃森·鲁尔区==(鲁尔危机后可出差)</span><</if>> <<if $regions.munich.unlocked>><<region-link "慕尼黑" "Region_Munich" "munich">> //巴伐利亚。NSDAP在蠢蠢欲动,据点藏在啤酒馆里。//<<region-status "munich">><<else>><span class="rmap-lock">==慕尼黑==(啤酒馆暴动前夕开放)</span><</if>> <<if $regions.hamburg.unlocked>><<region-link "汉堡" "Region_Hamburg" "hamburg">> //港口城市。KPD的地盘。//<<region-status "hamburg">><<else>><span class="rmap-lock">==汉堡==(克姆尼茨会议后开放)</span><</if>>\ </div>\ <<link "返回办公室" "Scene_Office">><</link>>
<<silently>> <<set $current_region to "chancellery">>\ <<set $regions.chancellery.visit_count++>>\ <</silently>>\ <<set $regions.chancellery.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ //总理府// ''-- 此地此刻 --'' <<region-atmosphere "chancellery">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "chancellery">><<mini-event-render>>\ <div class="scene-block"> //你可以:// </div> <<link "回到办公室" "Chancellery_Office">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "去内阁会议室" "Chancellery_Cabinet">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "在走廊里走走" "Chancellery_Hall">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "绕到酒窖后门" "Chancellery_WineCellar">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<if $npcs.dvp_pm and $npcs.dvp_pm.active>><<link "求见总理" "Scene_Pm_Visit">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>><</if>> <<nearby "chancellery">>\ <<link "返回地图" "Scene_RegionSelect">><</link>>
/* 总理府 · 酒窖后门(隐蔽接头点) 固定描述文本,不剧透。只在走进总理府后能看到,不显示在小地图。 */ <<silently>> <<set $current_region to "chancellery">>\ <</silently>>\ ''酒窖后门。'' //从办公室后半段绕下去,有一段石阶。越往下,砖墙越旧,苔藓越厚。// //楼梯尽头是一扇半掩的铁门,门轴已经锈了,推开时发出很轻的一声。里面黑着,只有墙角一盏瓦数极低的灯,照亮几排蒙灰的酒架。酒瓶上落着厚厚一层灰,像很久没人动过。// //你站在这里,能听见头顶办公室传来的脚步声——隔着一层地板,像隔着另一个世界。// //(这地方安静,少有人来。适合等一个人,或不被看见地谈一件事。)// <<link "返回办公室" "Chancellery_Office">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "回到走廊" "Chancellery_Hall">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "返回地图" "Scene_RegionSelect">><</link>>
/* 总理府 · 2级:办公室(玩家日常所在) */ //办公室// //窗帘拉着,桌上堆着文件。墨水瓶的盖子开着--说明有人刚才还在这里。// //你可以:// <<link "走到办公桌前" "Chancellery_Desk">><</link>> <<link "去窗边看看" "Chancellery_Window">><</link>> <<link "翻文件柜" "Chancellery_Cabinet2">><</link>> <<nav "Region_Chancellery">>\
/* 总理府 · 3级:办公桌 */ //橡木桌。墨水瓶、钢笔、一摞没批的文件。// //桌子右侧有个抽屉,上了锁。// <<link "处理桌面文件" "Chancellery_Desk_Files">><</link>> <<link "试着打开抽屉" "Chancellery_Drawer">><</link>> <<link "起身" "Chancellery_Office">><</link>>
/* 总理府 · 3级延伸:桌面文件 */ //你翻了一遍桌面文件。大半是鲁尔来的报告,措辞越来越急。// //最下面压着一张电报纸,上面只有三个字:「撑不住。」// <<inline-gate "chanc_files">>\ <<if _io_ok>>\ <<tag-add "经济压力" "micro" 5 "经济" "weimar" "desk">>\ //(经济压力 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>> <<link "收起来" "Chancellery_Desk">><</link>>
/* 总理府 · 4级:上锁的抽屉(需钥匙) */ <<if $flags.has_drawer_key>>\ //你用钥匙打开了抽屉。// //里面只有一样东西:一封信。信封发黄,没有寄出。// //信封上写着「致继任者」,笔迹你认得--是前任总理的字。// <<link "拆开信" "Chancellery_Drawer_Letter">><</link>> <<link "放回去" "Chancellery_Desk">><</link>> <<else>>\ //抽屉上了锁。你试着拉了一下,纹丝不动。// //锁孔很小,是老式的。你需要找到钥匙。// //(也许走廊的秘书台那边会有线索。)// <<link "放弃" "Chancellery_Desk">><</link>> <</if>>
/* 总理府 · 5级:信里的秘密 */ //你抽出信纸。前任总理的字很小,很密,像是怕纸不够用。// //信的大部分是关于鲁尔抵抗的--他认为消极抵抗撑不过三个月,建议继任者「在八月之前找到退路」。// //但信的最后一段,笔迹变了--更急,更潦草:// //「有一个人,他知道谁在背后推了帝国下台。不是街上的人。是里面的人。我不能写下名字--他们会知道。但我把名字刻在了……」// //后面的字被涂掉了。用力地、反复地涂,直到纸破了一个洞。// //你翻过信纸,背面什么都没有。// //但你注意到:涂改的痕迹下面,隐约能辨认出一个字母的开头。像是「S」,又像是「G」。// <<if not $flags.kuno_letter_read>>\ <<set $flags.kuno_letter_read to true>>\ <<tag-add "知情者" "micro" 15 "玩家行为" "weimar" "drawer">>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 5)>>\ //(知情者 +15,偏执 +5。你发现了一个不该发现的东西。)//\ <<else>>\ @@color:gray;(信你已经读过了。字还是那些字,坑还是那个坑。)@@\ <</if>> <<link "把信放回抽屉" "Chancellery_Drawer">><</link>>
/* 总理府 · 3级:窗边 */ //你拉开窗帘。// //威廉街在下面。卖报童在跑,脚步比昨天快。远处的烟囱还在冒烟--至少还在冒。// //你能看到国会大厦的穹顶。在灰色的天里,它像半个月亮。// <<inline-gate "chanc_window">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 3 "玩家行为" "weimar" "window">>\ //(观察者 +3)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>> <<link "离开窗边" "Chancellery_Office">><</link>>
/* 总理府 · 3级:文件柜 */ //铁皮文件柜。三层,每层塞满了文件夹。// //标签上写着:「鲁尔」「赔款」「工会」「巴伐利亚」「……(标签掉了)」// <<link "翻「鲁尔」文件夹" "Chancellery_Cabinet_Ruhr">><</link>> <<link "翻「巴伐利亚」文件夹" "Chancellery_Cabinet_Bavaria">><</link>> <<link "关上柜子" "Chancellery_Office">><</link>>
/* 总理府 · 3级延伸:鲁尔文件夹 */ //鲁尔区的报告汇总。// //你翻了几页。大部分是数字--罢工人数、补贴金额、马克汇率。数字越来越大,意义越来越小。// //最后一页夹着一张照片:埃森的大工厂大门。门口站着法国兵。// <<inline-gate "chanc_cab_ruhr">>\ <<if _io_ok>>\ <<tag-add "民族屈辱" "micro" 5 "政治" "weimar" "cabinet">>\ //(民族屈辱 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>> <<link "合上文件夹" "Chancellery_Cabinet2">><</link>>
/* 总理府 · 3级延伸:巴伐利亚文件夹 */ //巴伐利亚邦的情报简报。// //措辞很谨慎,但意思很清楚:慕尼黑那边越来越不听话了。// //「巴伐利亚的保守派近日频繁与军方接触,内容不详。」// //「国家社会主义工人党(NSDAP)成员持续增长,班数已超三万。」// <<inline-gate "chanc_cab_bav">>\ <<if _io_ok>>\ <<tag-add "民族主义" "micro" 5 "政治" "weimar" "cabinet">>\ //(民族主义 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>> <<link "合上文件夹" "Chancellery_Cabinet2">><</link>>
//内阁会议室// //一张长桌,十二把椅子。每把椅子前面放着一只杯子和一沓文件。杯子是旧的,文件是新的。// //墙上挂着一张鲁尔区的地图,被红铅笔标满了。红色代表法军占领点。红色比你想象的多。// //你站在桌子的一端。这张桌子上决定了消极抵抗--号召鲁尔工人罢工,让法国人什么都拿不到。听起来很英勇。但补贴是用马克发的,马克正在变成废纸。//\ <<nav "Region_Chancellery">>\
//走廊// //走廊尽头有一部电话。它每隔七分钟响一次--你数过。// //秘书台前坐着一个年轻女人,正在用打字机敲一份什么文件。她看到你,点了点头,没说话。打字机的声音在走廊里回响,像一颗心脏在跳。// //电话又响了。// <<link "接电话" "Chancellery_Phone">><</link>> <<link "走向秘书台" "Chancellery_Secretary">><</link>> <<nav "Region_Chancellery">>\
/* 总理府 · 3级:秘书台 */ //秘书台。打字机旁摆着一排标了号的钥匙。// //年轻的秘书看到你在看钥匙,停下来。// //「哪间的?」// <<if not $flags.has_drawer_key>>\ //你扫了一眼钥匙编号。其中一把标着「办公桌·右·旧」--就是你桌上那个锁着的抽屉。// <<link "借办公桌抽屉的钥匙" "Chancellery_Secretary_Key">><</link>> <<else>>\ //你已经借过钥匙了。她没抬头,继续打字。//\ <</if>>\ <<link "和她聊几句" "Chancellery_Secretary_Talk">><</link>> <<link "走开" "Chancellery_Hall">><</link>>
//「那把啊。」//她从抽屉里翻出钥匙,递给你。//「前任总理走的时候忘了还。一直没人用。」// //她看了你一眼,像是想说些什么,但最终只是推了推眼镜。// <<set $flags.has_drawer_key to true>>\ //(你拿到了办公桌抽屉的钥匙。)// <<link "道谢" "Chancellery_Hall">><</link>>
//你靠在秘书台边。她打字的手没停。// //「今天又加了两份急件。」//她说,眼睛没离开纸面。//「鲁尔那边的。每次来急件,电话就响得更勤。」// //她停了一下。// //「上一任也这样。电话响得最勤的时候,他就走了。」// //你不知道她说的是前任总理还是更早的人。也许她自己也不确定。// <<trust-capped "weimar" 1>><<trust-act-note>><<rival-note-show>>\ <<link "走开" "Chancellery_Hall">><</link>>
//电话// //你拿起听筒。// //「这里是总理府。」// //电话那头是鲁尔来的声音。信号不好,断断续续,但你能听出那种疲惫。// //「……法军今天又搜了三个矿场……工人不肯配合……但补贴……补贴到手里已经不够买面包了……」// //你放下听筒。听筒还有余温。// <<inline-gate "chanc_phone">>\ <<if _io_ok>>\ <<tag-add "经济压力" "micro" 5 "经济" "weimar" "phone">>\ //(经济压力 +5)//\ <<else>>\ @@color:gray;(今天该接的电话都接完了。)@@\ <</if>> <<link "挂断" "Chancellery_Hall">><</link>>
<<silently>> <<set $current_region to "presidency">>\ <<set $regions.presidency.visit_count++>>\ <<set $regions.presidency.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //总统府// ''-- 此地此刻 --'' <<region-atmosphere "presidency">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "presidency">><<mini-event-render>>\ <div class="scene-block"> //威廉街73号。原施韦林宫。一个马鞍匠出身的总统,住在一个流亡皇帝卖掉的宫殿里。// //总统的办公室不大。桌上放着一只半满的烟灰缸和一副老花镜。SPD出身的总统见你进来,把眼镜摘了,揉了揉眼睛。// //「坐吧。」他说。声音沙哑,像砂纸磨过木头。「你来找我,说明事情已经到了我这里。」// </div> <<link "和总统谈话" "Presidency_Talk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "presidency">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//总统看着你,等你说。// //他的脸上有一种奇特的表情--不是疲倦,是习惯了疲倦之后的那种平静。一个从马鞍匠变成总统的人,见过的事情比这座宫殿的房间还多。// //「鲁尔的事,我知道。」他说。「消极抵抗是我的决定。我不后悔。但我也知道,马克会为此付出代价。」// //他顿了顿。// //「问题是:人民能忍受多久?」// //他没有等你回答。也许他不是在问你,是在问自己。// <<trust-capped "weimar" 2>><<trust-act-note>><<rival-note-show>>\ <<nav "Region_Presidency">>\
<<silently>> <<set $current_region to "reichstag">>\ <<set $regions.reichstag.visit_count++>>\ <<set $regions.reichstag.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //国会大厦// ''-- 此地此刻 --'' <<region-atmosphere "reichstag">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "reichstag">><<mini-event-render>>\ <div class="scene-block"> //玻璃穹顶下的角斗场。// //议事厅里空荡荡的--今天没有会议。但空气里还残留着上次投票的火药味。283票赞成消极抵抗,12票反对。那12个人像是旷野里的声音,没人听见,或者说,没人想听见。// //你可以站在旁听席往下看。从上面看,议事厅像一口井。议员们是井底的青蛙,只是这些青蛙穿着西装。// </div> <<link "站在旁听席往下看" "Reichstag_Gallery">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "去国会走廊" "Reichstag_Hall">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "去 Zentrum 党部" "Scene_Visit_Zentrum">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "reichstag">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
/* 国会 · 3级:旁听席 */ //你站在旁听席的栏杆边。// //从这里往下看,议事厅像一口井。议员座位排列成扇形,每个座位前都有麦克风--但大部分时候,麦克风只是摆设。真正的决定是在走廊和男厕里做的。// //你注意到政府席位的第一把椅子扶手上,有一道新鲜的划痕。也许是今天投票时留下的。// <<link "看看记者席" "Reichstag_Press">><</link>> <<nav "Region_Reichstag">>\
/* 国会 · 3级:记者席 */ //记者席。几排窄小的桌子,上面放着笔记本和铅笔。// //有个记者还没走。他在速写本上画着什么--不是字,是漫画。画的是一只鸭子,戴着皇冠,脚下踩着一堆纸币。鸭子的嘴很大,大到能塞进整个国徽。// //他看到你在看,合上了本子。// //「新闻画不来。漫画画得来。」他说。// <<inline-gate "rs_press">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 5 "玩家行为" "weimar" "press">>\ //(知情者 +5)//\ <<else>>\ @@color:gray;(今天该打听的都打听到了。)@@\ <</if>> <<link "返回旁听席" "Reichstag_Gallery">><</link>>
//国会走廊// //烟雾缭绕的交易场。// //走廊里没有人,但你能闻到雪茄的味道--那种只有真正密谈时才会点的好雪茄。// //男厕的门半开着。你推门进去。// //两个人立刻停了话。其中一个认出了你,点了点头,走了。另一个靠在洗手台边,点了一根烟。// //「你来得正好。」他说。「有些话在议事厅不能说。」// <<link "听他说什么" "Reichstag_Secret">><</link>> <<nav "Region_Reichstag">>\
//他吐出一口烟,声音压得很低。// //「消极抵抗撑不了多久。现政府在骗自己。」// //「你怎么知道?」// //「因为我在财政部的朋友告诉我,补贴的窟窿已经填不上了。印钞机在冒烟。不是比喻,是真的在冒烟。」// //他把烟摁灭在洗手台上。// //「你信也行,不信也行。但等到马克彻底崩的时候,别忘了今天。」// <<inline-gate "rs_secret">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 3 "玩家行为" "weimar" "reichstag">>\ //(知情者 +3)//\ <<else>>\ @@color:gray;(今天该说的,他已经说完了。明天再听吧。)@@\ <</if>>\ <<nav "Region_Reichstag">>\
<<silently>> <<set $current_region to "tiergarten">>\ <<set $regions.tiergarten.visit_count++>>\ <<set $regions.tiergarten.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //蒂尔加滕// /* 特殊事件·任务窗口:触发现场事件后,一进区域就醒目显示(在氛围文本之前) */\ <<site-prompt-render "tiergarten">>\ ''-- 此地此刻 --'' <<region-atmosphere "tiergarten">>\ <div class="atmo-note">$atmo_text</div> <<region-action-menu "tiergarten">>\ <<deep-region-text "tiergarten">>\ <<if $deep_text neq "">>//$deep_text//<</if>>\ <<weekly-slice "tiergarten">>\ <<if $slice_text neq "">>//$slice_text//<</if>>\ <<mini-event-roll "tiergarten">><<mini-event-render>>\ <<nearby "tiergarten">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你沿着林荫道往里走。落叶被脚步碾碎,声音很轻,几乎听不见。// //迎面来两个军官。你退了半步让路,他们朝你点了一下头,算是打过招呼,没停下来。// //蒂尔加滕的规矩是这样:有走近了才停下的对话,也有擦肩一个点头就过去的交情。今天,你们两边都没什么要停下来谈的。// <<inline-gate "tg_walk">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 1 "玩家行为" "weimar" "tiergarten">>\ //(观察者 +1)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<link "继续往下走" "Tiergarten_Walk_2">>继续<</link>>|<<link "原路折返" "Region_Tiergarten">>返回<</link>>
//再往里,林荫道更窄了,树影把午后的光切成一格一格。// //长椅上坐着两个人:一个穿貂皮大衣的女人,在看报;一个独腿的退伍兵,在看天。他们没说话,但坐得很近。// //在蒂尔加滕,这两种人常凑在一张椅子上坐——一个读报,一个看天,谁也不碍着谁。// <<link "继续往下走" "Tiergarten_Walk_3">>继续<</link>>|<<link "原路折返" "Region_Tiergarten">>返回<</link>>
//林荫道的尽头是施普雷河。河水比人低,也比人大。// //你站了一会儿,风从河面过来,把来时踩过的落叶又翻了一遍。// //前面没有路了。这一趟,走到这里也就够了。// <<link "顺原路折返" "Region_Tiergarten">>折返<</link>>
//你走向一个独自坐着的老军官。他的肩章已经褪色了,但脊背还是直的--那种三十年军旅生涯刻进骨头里的直。// //「坐吧。」他没看你,指了指旁边的位置。「腿脚不好的老人才邀请人坐。站着的人不需要同伴。」// //你坐下。// //「你想知道军队怎么想的。」这不是问句。「我告诉你。军队在想一件事:上一次我们保护共和国的时候,共和国差点杀了我们。」// //「卡普政变。」// //「你记性好。」他递给你一支烟。「1920年。军方扛着枪进了柏林。总统跑了。我们没跑。我们留下来了。然后呢?然后他们叫我们「叛徒」。」// <<if not $flags.tg_officer_met>>\ <<set $flags.tg_officer_met to true>>\ <<tag-add "军方接触" "micro" 8 "玩家行为" "军方" "tiergarten">>\ <<trust-capped "army" 5>><<trust-act-note>><<rival-note-show>>\ <<if not $weimar.historical_anxiety["威权幽灵"]>>\ <<set $weimar.historical_anxiety["威权幽灵"] to 0>>\ <</if>>\ //(军方信任 +5,威权幽灵恐惧被触碰)// <<set _new_unlocks to []>>\ <<if not $regions.charlottenburg.unlocked>><<set $regions.charlottenburg.unlocked to true>><<set _new_unlocks.push("夏洛滕堡")>><</if>>\ <<if not $regions.officers_club.unlocked>><<set $regions.officers_club.unlocked to true>><<set _new_unlocks.push("军官俱乐部")>><</if>>\ <<if _new_unlocks.length gt 0>>\ //(老军官临走时说了句:「如果你想来夏洛滕堡坐坐,报我的名字。俱乐部也行。」新区域已解锁:<<print _new_unlocks.join("、")>>。)//\ <</if>>\ <<else>>\ @@color:gray;(他见过你了。今天只是点了点头。)@@\ <</if>> <<link "问他怎么看未来" "Tiergarten_Officer_Future">><</link>> <<nav "Region_Tiergarten">>\
//他沉默了很久。久到你以为他不会回答了。// //「未来。」他终于开口,声音低了下来。「未来是一个年轻人。他穿着褐色的衬衫。他不喝酒,不抽烟,不吃肉。他素食。他准时。他从来不迟到。」// //「你在说谁?」// //「我在说未来。」他站起来,拍了拍大衣上的落叶。「一个不喝酒、不抽烟、准时的年轻人。你告诉我,这像不像德国的未来?」// //他走了。脊背还是直的。但你觉得他比刚才矮了一点。//\ <<nav "Region_Tiergarten">>\
//你找了张长椅坐下。// //这里的老人都有一种特别的本事:能让你觉得他们没在看你,同时把你从头到脚看了三遍。// //一个穿貂皮大衣的女人从你面前走过。在1923年的柏林,穿貂皮大衣意味着两种可能:要么她很有钱,要么她丈夫死了。也许两者都是。// //远处,两个年轻人在低声争论什么。其中一个比划了一个手势--你不认识,但那个动作有一种仪式感。// <<inline-gate "tg_bench">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 5 "玩家行为" "weimar" "tiergarten">>\ //(观察者 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Tiergarten">>\
/* 深访·来过两次才出现:老园丁 */ //扫落叶的老人在橡树底下干活,耙子拉过碎石路,一下,又一下。你第二次来,他抬眼看了看你,把身子往旁边让了半步,算是让你进树林。// //「树叶这东西,」他没等你开口,「今天扫干净了,明天又是一层。干这行的都知道,扫的不是叶子,是个习惯。」// //他指了指司令部那头的林子。「那边走动的人,从来不走小路。大路上有人看他们。」他往手心啐了口唾沫,接着耙。「看园子的什么都知道一点,什么也看不见。」// //你陪他站了一会儿。走的时候,他把你脚边那堆叶子拨开了,免得你踩脏鞋。// <<tag-add "知情者" "micro" 2 "玩家行为" "weimar" "tiergarten">>\ //(知情者 +2)//\ <<nav "Region_Tiergarten">>\
/* 深访·来熟了才出现(深耕):森林咖啡馆 */ //森林咖啡馆在林子深处,下午四点以后,这里一半的桌子坐着穿军便装的人。你进门,侍者朝你抬了抬下巴,把你往靠窗那张桌子引——那张桌子空着,像是给你留的。// //咖啡很淡,杯子很厚。邻桌两个参谋压着嗓子说话,谈的是马匹预算。你不需要听全,只需要知道他们今天关心的是马,不是坦克。// //窗外天色暗下去,路灯一盏一盏亮起来。侍者来收杯子的时候,顺手把账单压在了糖罐底下。「您坐着。」他说,「打烊前没人赶您。」// //你坐到打烊。出门时,看门的老头替你把门拉住了,没要小费。// <<tag-add "知情者" "micro" 2 "玩家行为" "军方" "tiergarten">>\ <<trust-capped "army" 1>>\ <<aff-note "army" 1>>\ <<set _tcf_note to $ret>>\ //(知情者 +2 · _tcf_note)//\ <<nav "Region_Tiergarten">>\
<<silently>> <<set $current_region to "charlottenburg">>\ <<set $regions.charlottenburg.visit_count++>>\ <<set $regions.charlottenburg.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //夏洛滕堡// ''-- 此地此刻 --'' <<region-atmosphere "charlottenburg">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "charlottenburg">><<mini-event-render>>\ <<region-action-menu "charlottenburg">>\ <<deep-region-text "charlottenburg">>\ <<if $deep_text neq "">>//$deep_text//<</if>>\ <div class="scene-block"> //刚被柏林吞并的富人城。街上的建筑比柏林市区新,也比柏林市区傲慢。// //军装在衣帽间里比西装多。这里是退役军官的养老地,也是技术大学学生政治化的温床。// //咖啡馆的窗户里透出暖光。你经过的时候,里面有人朝外看了一眼,然后拉上了窗帘。// </div> <<link "在街上走走" "Charlottenburg_Walk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "charlottenburg">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你沿着 Schloßstraße 走。// //夏洛滕堡宫的轮廓在暮色中显得格外庞大,像一个不肯退场的旧时代布景。// //一个技术大学的学生迎面走来,臂上别着一个你没见过的徽章。他看到你,微微点头,步伐没停。但他的眼睛在你身上多停了一秒--那种在「辨认」的停顿。// //你想回头看他,但没有。在夏洛滕堡,回头是危险的。不是身体上的危险,是政治上的--意味着你在意,而在这条街上,「在意」本身就是一种立场。// <<inline-gate "cb_walk">>\ <<if _io_ok>>\ <<tag-add "军队不满" "micro" 5 "军事" "军方" "charlottenburg">>\ //(军队不满 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Charlottenburg">>\
<<silently>> <<set $current_region to "kurfurstendamm">>\ <<set $regions.kurfurstendamm.visit_count++>>\ <<set $regions.kurfurstendamm.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //选帝侯大街// /* 特殊事件·任务窗口:触发现场事件后,一进区域就醒目显示(在氛围文本之前) */\ <<site-prompt-render "kurfurstendamm">>\ ''-- 此地此刻 --'' <<region-atmosphere "kurfurstendamm">>\ <div class="atmo-note">$atmo_text</div> <<region-action-menu "kurfurstendamm">>\ <<deep-region-text "kurfurstendamm">>\ <<if $deep_text neq "">>//$deep_text//<</if>>\ <<weekly-slice "kurfurstendamm">>\ <<if $slice_text neq "">>//$slice_text//<</if>>\ <<mini-event-roll "kurfurstendamm">><<mini-event-render>>\ <div class="scene-block"> //霓虹灯下的通胀暴富者。// //真咖啡和假咖啡在这里隔一条街。一边是Cabaret里的香槟,一边是街角的菊苣根。同一个晚上,同一条街,两个德国。// //一个穿着貂皮大衣的女人从一辆亮闪闪的汽车里走出来。她经过一个坐在路边的独腿退伍兵,没有看他。他也没看她。他们彼此看不见--在选帝侯大街,穷人是一种透明物质。// </div> <<nearby "kurfurstendamm">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你沿着选帝侯大街走。// //橱窗里摆着真丝衬衫和象牙梳子。标价每天都在变--不是在涨,是在被追赶。店员已经懒得换价签了,直接在旧价格上划一道,写新的。// //一个穿燕尾服的男人从Cabaret里出来,脚步踉跄。他打了个嗝,声音在安静的街上格外响亮。// //「好时光!」他对着空气喊了一句,然后被同伴拉走了。// //好时光。在1923年的柏林,这个词听起来像一句外语。// <<inline-gate "kd_walk">>\ <<if _io_ok>>\ <<tag-add "经济压力" "micro" 5 "经济" "weimar" "kudamm">>\ //(经济压力 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Kurfurstendamm">>\
/* 深访·来过两次才出现:唱片行 */ //唱片行夹在两家皮货店中间,门面窄,橱窗里立着几张新到的美国爵士唱片。你推门进去,铃铛响了一声。老板从柜台后面抬起头,认出你了:「又来?还是听到上半张就走?」// //他放下唱针。铜管一响,街上的霓虹灯好像退远了一点。// //「这玩意儿是美元计价的,」他一边换唱片一边说,「唱片行不涨价,进价天天涨。我卖一张,亏一张半,卖的是个习惯。」他看着旋转的唱片。「上礼拜有个客人拿两条香烟换走一套华尔兹。他说香烟比马克结实。」// //你把半张听完。出门时铃铛又响了一声,老板没抬头,说了句「下礼拜三到新货」。// <<tag-add "知情者" "micro" 2 "玩家行为" "weimar" "kudamm">>\ //(知情者 +2)//\ <<nav "Region_Kurfurstendamm">>\
<<silently>> <<set $current_region to "romanisches">>\ <<set $regions.romanisches.visit_count++>>\ <<set $regions.romanisches.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //罗曼咖啡馆// /* 特殊事件·任务窗口:触发现场事件后,一进区域就醒目显示(在氛围文本之前) */\ <<site-prompt-render "romanisches">>\ ''-- 此地此刻 --'' <<region-atmosphere "romanisches">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "romanisches">><<mini-event-render>>\ <div class="scene-block"> //推门进去的时候,铃铛响了一声--那种铜绿已经爬到一半的老铃铛。// //里面比外面暖和,但只是相对而言。咖啡的蒸汽和烟草的烟雾混在一起,形成一种灰黄色的雾。有人在角落里下棋,棋子落盘的声音比说话声还大。// //靠窗那桌坐着几个戴圆眼镜的人。其中一个正在用叉子戳着一块报纸,对同伴说:「这不是通胀。这是物理学--物质正在从有意义变成无意义。」// //他的同伴没抬头:「你喝多了。」// //「我没喝多。我只是在用经济学解释 metaphysics。」// </div> <<if $flags.ddp_office_unlocked>>\ //这里可以前往 DDP 党部。//\ <<elseif $npcs.ddp.trust gte 20>>\ //DDP 党部就在这附近。//\ <</if>> <<link "找个角落坐下,听周围人聊天" "Romanisches_Listen">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "主动和人攀谈" "Romanisches_Talk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<if $npcs.ddp.trust gte 20>>\ <<if not $flags.ddp_office_unlocked>>\ <<link "接受引荐,前往DDP党部" "Scene_Visit_DDP">><<set $flags.ddp_office_unlocked to true>><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<else>>\ <<link "前往DDP党部" "Scene_Visit_DDP">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <</if>>\ <<else>>\ @@color:gray;(你还没被DDP邀请到他们的党部。)@@\ <</if>>\ <<link "叫一杯咖啡(菊苣根的也行)" "Romanisches_Coffee">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "romanisches">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你找了个角落坐下,假装在读一份三天前的报纸。// <<if $active_tags.length gt 0 and $active_tags[0].intensity gt 10>>\ //邻桌两个记者在低声争论。其中一个说:「我告诉你,这不是偶然的。你看看过去三个月的物价曲线,再看看议会里谁在投什么票。」// //另一个不以为然:「你在编故事。有时候,混乱就只是混乱。」// //「在柏林?」第一个人笑了,「在柏林,混乱从来不是免费的。」// <<inline-gate "rm_listen">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 2 "玩家行为" "weimar" "romanisches">>\ //(知情者 +2)//\ <<else>>\ @@color:gray;(今天已经听过了。明天再来吧。)@@\ <</if>>\ <<else>>\ //今天的对话都是关于天气和房租的。有用,但不够刺激。// //一个老人在角落里自言自语:「1914年的时候,我也觉得一切会好起来的。」//\ <</if>>\ <<link "继续待着" "Romanisches_Listen">><</link>> <<nav "Region_Romanisches">>\
//你走向那个用叉子戳报纸的人。// //他抬头看你,镜片后面的眼睛带着一种学者特有的警惕--那种「我知道你想要什么,但我先看看你知不知道自己想要什么」的表情。// //「你是?」// //「不重要。」你说。「重要的是你刚才说的那句--物质从有意义变成无意义。这话有意思。」// //他放下叉子,第一次正眼看你。// //「你读过马克思?」// //「谁没读过。」// //「读过和读懂是两件事。」他往前倾了倾身子。「但你能说出这句话,说明你至少读懂了一半。坐吧。」// <<if not $flags.rm_scholar_met>>\ <<set $flags.rm_scholar_met to true>>\ <<trust-capped "spd" 2>><<trust-act-note>><<rival-note-show>>\ <<tag-add "学者接触" "micro" 5 "玩家行为" "spd" "romanisches">>\ //(获得接触:学者圈)//\ <<else>>\ @@color:gray;(你们已经认识了。他朝你这边点了点下巴。)@@\ <</if>> <<link "问他怎么看局势" "Romanisches_Talk_Politics">><</link>> <<nav "Region_Romanisches">>\
//他吐出一口烟,烟雾在灯光下盘旋。// //「你知道德国现在最危险的是什么?不是法国人,不是通胀,甚至不是那帮穿褐衫的。」// //他用烟指了指窗外。// //「是确定性。人们太想确定明天会发生什么了。他们愿意把自由交出去,换一个能告诉他们「一切都会好的」的人。」// //「哪怕那人在撒谎?」// //「尤其当那人在撒谎。」他笑了,「真话太贵了。在柏林,真话的标价已经超过了黄金。」//\ <<nav "Region_Romanisches">>\
/* 咖啡因系统:降疲惫升焦虑,日限2杯,连续饮用成瘾 */ <<silently>> <<set _real_coffee to true>>\ /* 通胀高时只有菊苣根 */ <<if $world.inflation gte 50>>\ <<set _real_coffee to false>>\ <</if>>\ /* 连续5日>=2杯:焦虑基线上调 */ <<set _addicted to ($coffee_streak gte 5)>>\ <</silently>>\ <<if $coffee_today gte 2>>\ //你已经喝了两杯了。再来一杯,你的手就要开始抖了。// //侍者看了你一眼,没有动。在柏林,侍者的沉默是一种建议。// <<if _addicted>>\ //太阳穴在跳。你发现自己不喝咖啡的时候,焦虑就像退潮后露出的礁石--一直都在,只是被盖住了。// //(连续饮用成瘾:焦虑基线已上调)//\ <</if>> <<else>>\ <<if _real_coffee>>\ //你叫了一杯咖啡。端上来的时候,你闻了闻--是真咖啡。// //在1923年的柏林,真咖啡是一种奇迹。你喝了一口。苦,但不是菊苣根那种苦。是一种有深度的苦,像在品尝什么东西的终结。//\ <<else>>\ //你叫了一杯咖啡。端上来的时候,你闻了闻。// //是菊苣根。当然是菊苣根。真咖啡的价格已经够买一辆自行车了。// //你喝了一口。苦。但至少是热的。在柏林,热的已经是一种奢侈品。//\ <</if>> <<silently>> <<set $coffee_today to $coffee_today + 1>>\ <<set $coffee_last_day to $session_day>>\ <<set $coffee_streak to $coffee_streak + 1>>\ <<if _real_coffee>>\ /* 真咖啡:疲惫-15,焦虑+8 */ <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - 15)>>\ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 8)>>\ <<else>>\ /* 菊苣根:疲惫-8(减半),焦虑+4 */ <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - 8)>>\ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 4)>>\ <<tag-add "经济压力" "micro" 3 "经济" "weimar" "coffee">>\ <<set $active_tags to $ret>>\ <</if>>\ <<if _addicted>>\ /* 成瘾:额外焦虑+5 */ <<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + 5)>>\ <</if>>\ <</silently>>\ <<if _real_coffee>>\ //(疲惫 -15,焦虑 +8)//\ <<else>>\ //(疲惫 -8,焦虑 +4。菊苣根的效力减半,但贫穷的观察力增加了。)//\ <</if>>\ <<if _addicted>>\ //(成瘾效应:额外焦虑 +5。你已经离不开这东西了。)//\ <</if>>\ <<if $coffee_today eq 2>>\ //第二杯了。侍者多看了你一眼。在柏林,喝两杯咖啡的人要么是有钱,要么是怕睡着。//\ <</if>>\ <</if>> //你也可以选择别的。// <<link "叫一杯白水" "Romanisches_Water">><</link>> <<nav "Region_Romanisches">>\
//你叫了一杯白水。// //侍者没有表情。在柏林,点白水的人要么是真穷,要么是在证明什么。// //水是凉的。你喝了。它什么也没给你,也什么都没拿走。// //有时候,这就够了。// <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - 2)>>\ //(疲惫微减)//\ <<nav "Region_Romanisches">>\
<<silently>> <<set $current_region to "kreuzberg">>\ <<set $regions.kreuzberg.visit_count++>>\ <<set $regions.kreuzberg.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //克罗伊茨贝格// /* 特殊事件·任务窗口:触发现场事件后,一进区域就醒目显示(在氛围文本之前) */\ <<site-prompt-render "kreuzberg">>\ ''-- 此地此刻 --'' <<region-atmosphere "kreuzberg">>\ <div class="atmo-note">$atmo_text</div> <<region-action-menu "kreuzberg">>\ <<deep-region-text "kreuzberg">>\ <<if $deep_text neq "">>//$deep_text//<</if>>\ <<weekly-slice "kreuzberg">>\ <<if $slice_text neq "">>//$slice_text//<</if>>\ <<mini-event-roll "kreuzberg">><<mini-event-render>>\ <<nearby "kreuzberg">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
/* 克罗伊茨贝格观察 · 多文本随机 + 每日一次限制 去掉"继续观察"跳回自身,防止无限刷标签 */ <<silently>> <<set _obs_key to "kreuzberg_observed_" + $session_day>>\ <<set _already to ($flags[_obs_key] ? true : false)>>\ <<if not _already>>\ <<set $flags[_obs_key] to true>>\ <</if>>\ <</silently>>\ <<if _already>>\ //你已经在这里逛过一圈了。再走也是同样的巷子,同样的脸。// //(今天已经观察过克罗伊茨贝格了。明天再来吧。)//\ <<else>>\ //你放慢脚步,让自己变成背景的一部分。// <<silently>> /* 三段观察文本随机抽一,避免每次相同 */ <<set _obs_variant to random(1, 3)>>\ <</silently>>\ <<if _obs_variant eq 1>>\ //一个孩子在巷口蹲着。他大概七岁,但眼神像是七十岁。他在用一根钉子在地上画画--画的是一匹马。马背上没有人。// //「马呢?」你问。// //「骑马的人饿死了。」孩子头也不抬。// //你不知道他是在开玩笑还是在陈述事实。在克罗伊茨贝格,这两者的区别已经模糊了。// //墙角贴着一张新海报。一个你不认识的男人留着小胡子,眼神里有一种奇怪的光--不是疯狂,是确信。确信比疯狂更危险。海报上写着:「德国,醒醒!」// <<tag-add "工人愤怒" "micro" 8 "社会" "spd" "observe">>\ <<tag-add "民族主义" "micro" 5 "政治" "dnvp" "observe">>\ //(工人愤怒 +8,民族主义 +5)//\ <<elseif _obs_variant eq 2>>\ //一列送葬队伍从巷口经过。没有棺材--太贵了。四个人抬着一个裹着布的木板。后面跟着一个女人,没有哭。不是不想哭,是哭不动了。// //你问旁边的人是谁死了。他耸耸肩:「昨天还活着的人。」// //街角的施粥所排着长队。队伍末尾有人在吵架--为了位置。在克罗伊茨贝格,位置就是一顿饭,一顿饭就是一天。// <<tag-add "工人愤怒" "micro" 6 "社会" "spd" "observe">>\ <<tag-add "社会绝望" "micro" 7 "社会" "kpd" "observe">>\ //(工人愤怒 +6,社会绝望 +7)//\ <<else>>\ //两个孩子在抢一个烟头。大的那个赢了,但小的咬了他的手。他们都不哭。在克罗伊茨贝格,哭是奢侈品。// //一面墙上有人用粉笔写了一行字:「面包。和平。工作。」三个词。字迹很新。但旁边有人划掉了「和平」,在下面写了一个词:「革命。」// //你站了一会儿。风把粉笔灰吹到你脸上。// <<tag-add "革命情绪" "micro" 6 "政治" "kpd" "observe">>\ <<tag-add "工人愤怒" "micro" 4 "社会" "spd" "observe">>\ //(革命情绪 +6,工人愤怒 +4)//\ <</if>>\ <</if>>\ <<nav "Region_Kreuzberg">>\
//你找到了工会的地方--一扇没有招牌的门,楼梯间里弥漫着煮卷心菜和油墨的气味。// //楼上一个壮实的男人在抽烟,手指粗得像香肠。他看到你,没有意外。// //「又来了一个想帮忙的。」他吐出一口烟。「坐吧。但先告诉我--你帮谁的忙?」// <<link "「工人的。」" "Kreuzberg_Union_Worker">><<set _union_choice to "worker">><</link>> <<link "「共和国的。」" "Kreuzberg_Union_Republic">><<set _union_choice to "republic">><</link>> <<link "「我自己的。」" "Kreuzberg_Union_Self">><<set _union_choice to "self">><</link>>
//他看了你很久。然后笑了,露出一颗金牙。// //「至少你不说谎。这年头,不说谎已经算美德了。」// //他站起身,从抽屉里掏出一张皱巴巴的纸。// //「鲁尔那边罢工了。消极抵抗,政府发的补贴。但你猜怎么着?补贴是用马克发的。工人拿到手的时候,已经不够买一顿午饭了。」// //「政府知道吗?」// //「政府就是发钱那个。」他把烟摁灭在窗台上。「他们知道。他们只是不知道该怎么办。或者说,他们知道,但不敢。」// <<tag-add "劳工同情" "micro" 8 "玩家行为" "spd" "union">>\ <<trust-capped "spd" 5>><<trust-act-note>><<rival-note-show>>\ //(获得标签:劳工同情)// <<set _new_unlocks to []>>\ <<if not $regions.wedding.unlocked>><<set $regions.wedding.unlocked to true>><<set _new_unlocks.push("威丁")>><</if>>\ <<if not $regions.moabit.unlocked>><<set $regions.moabit.unlocked to true>><<set _new_unlocks.push("莫阿比特")>><</if>>\ <<if _new_unlocks.length gt 0>>\ //临走时他说了一句:「你要是真想帮忙,去威丁看看。那边更需要人。莫阿比特也是--那边有我们的人在墙上写字。」新区域已解锁:<<print _new_unlocks.join("、")>>。//\ <</if>>\ <<nav "Region_Kreuzberg">>\
//他没笑。他把烟从嘴里拿出来,看了你一眼。// //「共和国。」他重复了一遍这个词,像在品尝它的味道。「你知道共和国给工人带来了什么吗?八小时工作日。然后通胀把它变成了十二小时--因为你得打两份工才买得起面包。」// //「那不是共和国的错。」// //「不是。但共和国也没有阻止它。」他重新点上一根烟。「你们这些说「共和国」的人,和说「德意志」的人,在我看来都是一样的--你们爱的是一个词。工人爱的是面包。」// <<weimar-tension-gain 1>>\ //(魏玛的张力微微上升)//\ <<nav "Region_Kreuzberg">>\
//他挑了挑眉。// //「至少诚实。」他说。「诚实的人在这条街上不多。大部分要么骗别人,要么骗自己。」// //他没有再说下去。但你注意到,他的态度松了一点--不是信任,是一种「你还没被归类」的悬置状态。// <<trust-capped "spd" 2>><<trust-act-note>><<rival-note-show>>\ //(他还在观察你)//\ <<nav "Region_Kreuzberg">>\
/* 深访·来过两次才出现:面包店 */ //面包店开在街角第二家,炉子的热气把橱窗熏出一层雾。你再来的时候,老板朝门口的麻袋抬了抬下巴:「会推车吗?后院到前头,推三趟。」// //你推了三趟。面粉不重,压手。// //最后一袋卸完,他从炉边抽出两个还烫手的面包卷,用纸一裹,塞给你。「工钱。」他说,「别在街上吃,巷子里有板凳。」// //巷子的板凳上坐着两个等面包的印刷工,在算一天的工钱够买几个面包卷。他们算得很慢,因为数字每天都不一样。你坐着没说话,把面包卷吃完了。// <<tag-add "知情者" "micro" 2 "玩家行为" "weimar" "kreuzberg">>\ //(知情者 +2)//\ <<nav "Region_Kreuzberg">>\
/* 深访·来熟了才出现(深耕):后院 */ //后院的铁门虚掩着,你推开的时候没人拦你——看门的老人抬头看了一眼,又低下头去修他的鸟笼。// //院子中间,四五个孩子在踢一只磨秃了的皮球,球门用两块砖头摆。晾衣绳横在半空,挂着的衬衫在球飞过来的时候集体晃了一下。几个女人坐在台阶上择菜,说的是楼里的水管和房租,声音不高,也没打算背着你。// //球滚到你脚边。你把它踢回去,一个孩子朝你喊了声什么,所有人都笑了。你也笑了一下。// //在这个院子里,物价是墙上的粉笔字,不是报纸上的数字。日子过得紧,但日子在过。// <<set $world.social_anger to Math.max(0, $world.social_anger - 1)>>\ <<set $regions.kreuzberg.stability to Math.min(100, Number($regions.kreuzberg.stability) + 1)>>\ //(社会愤怒 -1 · 稳定度 +1)//\ <<nav "Region_Kreuzberg">>\
//你站到一截断墙上。人群聚过来,不多,但足够。// //你开口了。// <<if $player.mental.fatigue gt 50>>\ //你说得不太好。嗓子干,词不达意。人群听了一会儿就开始散了。一个老人走之前摇了摇头:「又一个说完就走的。」// //(疲惫影响了你的表现)//\ <<else>>\ //你说了一些关于尊严的话。关于鲁尔,关于工人,关于不能跪下。// //有人鼓掌。有人冷笑。但所有人都听了。// //一个年轻工人挤到前面:「说得好听。可你能做什么?」// //你不知道。但你知道,能让人停下来听你说话,本身已经是一种力量。// <<tag-add "工人愤怒" "micro" 12 "社会" "spd" "speech">>\ <<tag-add "政府信誉" "micro" 5 "政治" "weimar" "speech">>\ //(工人愤怒 +12,政府信誉 +5)// <<if $npcs.police and $npcs.police.trust gte 40>>\ //人群外圈站着两个便衣,抱着胳膊,没动。红堡提前收过你的话。今天这条路,允许你说完。// <<tag-add "知情者" "micro" 2 "观察" "police" "speech">>\ //(知情者 +2)//\ <</if>>\ <</if>>\ <<nav "Region_Kreuzberg">>\
<<silently>> <<set $current_region to "wedding">>\ <<set $regions.wedding.visit_count++>>\ <<set $regions.wedding.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //威丁// ''-- 此地此刻 --'' <<region-atmosphere "wedding">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "wedding">><<mini-event-render>>\ <div class="scene-block"> //红色威丁。出租兵营的红砖迷宫。// //Schering药厂和Rotaprint厂的工人住在这里。六层楼围着一块泥地,泥地上晒着衣服和孩子。空气里有化工品的酸味和煮土豆的蒸汽。// //米勒街的拐角有人在卖《红旗》,共产党的机关报。卖报的人看你一眼,把报纸举高了些--不是威胁,是展示。// //这里的墙比柏林任何地方都红。// </div> <<link "在兵营里走走" "Wedding_Walk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "和卖报的人聊聊" "Wedding_Seller">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "去 KPD 党部" "Scene_Visit_KPD">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "wedding">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你走进兵营的院子。// //孩子们在泥地上踢一个破布做的球。一个老妇人从三楼的窗口探出头,把一盆水泼下来--不是泼你的,是泼晾衣绳上的灰。// //一个年轻人在楼梯口拦住你。他穿着工装,手上有机油。// //「你找谁?」// //「不找谁。看看。」// //「看看。」他重复了一遍,像在判断这个词有没有危险。「这里没什么好看的。穷不是风景。」// //他让开了路。但他的目光一直跟着你,像一盏探照灯。// <<inline-gate "wd_walk">>\ <<if _io_ok>>\ <<tag-add "工人愤怒" "micro" 5 "社会" "kpd" "wedding">>\ //(工人愤怒 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Wedding">>\
//你走到卖报人面前。// //他大概四十岁,脸上有刀疤,手指被油墨染黑了。他看你的方式像在读一份文件--逐字扫描,判断内容。// //「买一份?」他举着《红旗》。头版标题是:「打倒社会法西斯主义!」--「社会法西斯主义」是共产党对社民党的称呼。// //「你信这些吗?」你问。// //「信不信不重要。」他把报纸递给你。「重要的是,这上面写的东西,有人愿意为它死。你的报纸呢?」// //你不知道怎么回答。他也不等你回答。// <<inline-gate "wd_seller">>\ <<if _io_ok>>\ <<trust-capped "kpd" 3>><<trust-act-note>><<rival-note-show>>\ <<tag-add "左翼接触" "micro" 5 "玩家行为" "kpd" "wedding">>\ //(获得接触:左翼)//\ <<else>>\ @@color:gray;(报纸还是那份报纸。今天就聊到这儿。)@@\ <</if>>\ <<nav "Region_Wedding">>\
<<silently>> <<set $current_region to "friedrichshain">>\ <<set $regions.friedrichshain.visit_count++>>\ <<set $regions.friedrichshain.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //弗里德里希斯海因// /* 特殊事件·任务窗口:触发现场事件后,一进区域就醒目显示(在氛围文本之前) */\ <<site-prompt-render "friedrichshain">>\ ''-- 此地此刻 --'' <<region-atmosphere "friedrichshain">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "friedrichshain">><<mini-event-render>>\ <<region-action-menu "friedrichshain">>\ <<deep-region-text "friedrichshain">>\ <<if $deep_text neq "">>//$deep_text//<</if>>\ <div class="scene-block"> //街垒和工厂烟囱。// //人民公园是工人周末唯一能喘气的地方。但现在公园里没什么人喘气--他们都在喘气,但不是因为休息,是因为奔波。// //一排工厂的烟囱在远处冒着烟。烟是灰的,天也是灰的。分不清哪是烟哪是天。// </div> <<link "在人民公园走走" "Friedrichshain_Park">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "friedrichshain">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你走进人民公园。// //公园的长椅上坐着一个老人,膝盖上放着一个空饭盒。他在看湖。湖面结了薄冰。// //「以前这里有人在弹手风琴。」他没看你,像是在自言自语。「现在没人弹了。弹手风琴的人要么在工厂,要么在监狱。」// //你坐在他旁边。他没有再说话。你们一起看湖。冰面上有一道裂缝,像一条没有尽头的线。// <<inline-gate "fh_park">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 3 "玩家行为" "weimar" "friedrichshain">>\ //(观察者 +3)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Friedrichshain">>\
<<silently>> <<set $current_region to "alexanderplatz">>\ <<set $regions.alexanderplatz.visit_count++>>\ <<set $regions.alexanderplatz.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //亚历山大广场// /* 特殊事件·任务窗口:触发现场事件后,一进区域就醒目显示(在氛围文本之前) */\ <<site-prompt-render "alexanderplatz">>\ ''-- 此地此刻 --'' <<region-atmosphere "alexanderplatz">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "alexanderplatz">><<mini-event-render>>\ <div class="scene-block"> //Manoli香烟的霓虹灯转个不停,像一只永远不会停下来的眼睛。// //警察总局的红砖巨厦叫「红堡」,北角塔楼压着整个广场的天际线。它不是在看广场,是在俯瞰广场--俯瞰和看不一样,俯瞰是从上面往下,带着一种「我随时可以下来」的意思。// //广场上的人在流动。卖报的、卖烟的、卖身的、卖情报的。在亚历山大广场,一切都是商品,包括秘密。// </div> <<link "在广场上走走" "Alex_Walk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "看看警察总局" "Alex_Police">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "alexanderplatz">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你在广场上走。// //一个黑市贩子凑过来,压低声音:「要外汇吗?美元,荷兰盾。马克不要。」// //你没理他。他也没纠缠,转身去找下一个目标。在亚历山大广场,被拒绝不是侮辱,是概率。// //一个孩子拽着你的衣角:「先生,买份报吧。」// //你看了看报纸。头版:马克对美元的汇率又创新低。// //「这还算新闻?」// //孩子耸了耸肩:「这年头,什么算新闻?」// <<inline-gate "alex_walk">>\ <<if _io_ok>>\ <<tag-add "经济压力" "micro" 5 "经济" "weimar" "alex">>\ <<tag-add "知情者" "micro" 3 "玩家行为" "weimar" "alex">>\ //(经济压力 +5,知情者 +3)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Alexanderplatz">>\
//你抬头看「红堡」。// //警察总局的窗户像一排眼睛。你看不清里面有没有人在看你,但你知道--这种建筑的设计目的就是让你觉得「有人在看」。// //一个警察从门口走过,看了你一眼。不是怀疑,是例行。在亚历山大广场,「例行」是最常见的目光。// //你注意到布告栏上贴着一张告示:禁止未经批准的集会。告示下面,有人用炭笔写了一行字:「批准由谁来批?」//\ <<nav "Region_Alexanderplatz">>\
<<silently>> <<set $current_region to "brandenburg">>\ <<set $regions.brandenburg.visit_count++>>\ <<set $regions.brandenburg.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //勃兰登堡门// ''-- 此地此刻 --'' <<region-atmosphere "brandenburg">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "brandenburg">><<mini-event-render>>\ <div class="scene-block"> //1791年的城门。拿破仑走过,胜利游行走过,现在抗议集会也走。// //巴黎广场在门的西侧。石板被千万双脚磨得发亮。今天广场上没有集会,但你能看到地上残留的传单--被风刮到了墙角,像一堆落叶。// //门顶上的四马双轮战车雕塑俯瞰着柏林。马的头朝着东方。有人说过,如果马头朝西,帝国就会回来。// </div> <<link "在巴黎广场走走" "Brandenburg_Square">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "找 DNVP 的人" "Scene_Visit_DNVP">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "brandenburg">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你站在巴黎广场上。// //风很大。传单在脚边打转。你捡起一张--是号召抗议鲁尔占领的传单,上面印着:「德意志的领土不可分割!」// //落款是一个你不认识的组织。但措辞让你不舒服--不是因为它错了,是因为它太对了。在柏林,「太对」的东西往往是危险的。// //一个老人坐在广场边的石阶上,怀里抱着一面叠好的黑白红三色旗--帝国旗,不是共和旗。他闭着眼,像在等什么。// <<inline-gate "bb_square">>\ <<if _io_ok>>\ <<tag-add "民族主义" "micro" 5 "政治" "dnvp" "brandenburg">>\ //(民族主义 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Brandenburg">>\
<<silently>> <<set $current_region to "unter_den_linden">>\ <<set $regions.unter_den_linden.visit_count++>>\ <<set $regions.unter_den_linden.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //菩提树下大街// /* 特殊事件·任务窗口:触发现场事件后,一进区域就醒目显示(在氛围文本之前) */\ <<site-prompt-render "unter_den_linden">>\ ''-- 此地此刻 --'' <<region-atmosphere "unter_den_linden">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "unter_den_linden">><<mini-event-render>>\ <<region-action-menu "unter_den_linden">>\ <<deep-region-text "unter_den_linden">>\ <<if $deep_text neq "">>//$deep_text//<</if>>\ <div class="scene-block"> //最宏伟也最虚伪的一条街。// //腓特烈大帝的铜像立在中间,面朝东方。他看着柏林大学和军械库,看着洪堡和黑格尔的学生们走过,看着1914年的游行队伍从这里出发去打仗,也看着1918年他们残存的人回来。// //椴树(菩提树是误译,其实是椴树)排列在两侧,光秃秃的。冬天让这条路显得格外长。// </div> <<link "在街上走走" "Linden_Walk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "unter_den_linden">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你沿着菩提树下大街走。// //柏林大学门口,几个学生在辩论。声音很大,手势很大,但眼神是空的--那种年轻人的空,不是无知,是「我还没决定信什么」的空。// //一个学生举着一本小册子,上面印着一个你不认识的鹰徽。他喊:「德意志需要新的灵魂!」// //另一个反驳:「德意志需要的是面包,不是灵魂!」// //你从他们中间走过。他们没注意到你。在他们眼里,你不是主角,只是一个路过的大人。// <<inline-gate "ld_walk">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 3 "玩家行为" "weimar" "linden">>\ //(观察者 +3)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_UnterDenLinden">>\
<<silently>> <<set $current_region to "anhalter">>\ <<set $regions.anhalter.visit_count++>>\ <<set $regions.anhalter.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //安哈尔特火车站// /* 特殊事件·任务窗口:触发现场事件后,一进区域就醒目显示(在氛围文本之前) */\ <<site-prompt-render "anhalter">>\ ''-- 此地此刻 --'' <<region-atmosphere "anhalter">>\ <div class="atmo-note">$atmo_text</div> <<silently>><<set _anhalter_site to ($regions.anhalter.active_event ? $regions.anhalter.active_event.kind : "")>><</silently>>\ <<if _anhalter_site eq "">>\ <<mini-event-roll "anhalter">><<mini-event-render>>\ <</if>> <div class="scene-block"> //柏林的南大门。// //鲁尔难民、慕尼黑来的消息、汉堡来的逃亡者,都从这里进柏林。候车大厅变成了临时收容所--红十字的摊位前排着队,稀粥的蒸汽和机油的气味混在一起。// //站台上的广播喇叭坏了,没人修。时间表也是假的--火车到不到,什么时候到,全凭运气。// </div> <<link "去站台看看" "Anhalter_Platform">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "在候车大厅走走" "Anhalter_Hall">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "anhalter">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你走到站台上。// //一列从鲁尔方向来的列车刚靠站。车门打开,下来的人像是被倒出来的--脸色灰白,衣服皱巴巴的,提着各种不配套的行李。// //一个女人抱着孩子从你身边走过。孩子睡着了,头靠在母亲肩上。女人的眼睛是干的,但干得不正常--那种已经哭过太多次,哭干了之后的干。// //「鲁尔怎么样了?」你问。// //她停了一下,没回头。// //「没有鲁尔了。」她说,然后继续走了。// <<inline-gate "an_platform">>\ <<if _io_ok>>\ <<tag-add "民族屈辱" "micro" 8 "政治" "weimar" "anhalter">>\ //(民族屈辱 +8)//\ <<else>>\ @@color:gray;(今天到站的列车都看过了。)@@\ <</if>>\ <<nav "Region_Anhalter">>\
//候车大厅里弥漫着稀粥和绝望的气味。// //红十字摊位前排着长队。一个护士在搅一锅灰色的糊状物,脸上带着那种见过太多之后才会有的平静。// //你在长椅旁坐下。旁边一个男人在打盹,膝盖上放着一个空布袋。布袋上印着埃森一家大工厂的商标。// //一个招工佬凑过来:「要活儿吗?码头缺人。管饭。」// //「管什么饭?」// //「管饱。」他压低声音,「不管别的。」// //你不确定「别的」是什么。在安哈尔特火车站,「别的」可以意味着很多事。// <<inline-gate "an_hall">>\ <<if _io_ok>>\ <<tag-add "经济压力" "micro" 5 "经济" "weimar" "anhalter">>\ //(经济压力 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Anhalter">>\
<<silently>> <<set $current_region to "ruhr_essen">>\ <<set $regions.ruhr_essen.visit_count++>>\ <<set $regions.ruhr_essen.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //埃森·鲁尔区// ''-- 此地此刻 --'' <<region-atmosphere "ruhr_essen">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "ruhr_essen">><<mini-event-render>>\ <div class="scene-block"> //火车在埃森停下的时候,你从窗户里看到了法军的蓝色军装。// //车站的站牌被拆掉了--消极抵抗的一部分。没有站牌的车站,像一张没有名字的脸。// //埃森大工厂的大门前有法军哨卡。车间里的机器停转了,像死去的铁兽。烟囱不冒烟了,但空气里还残留着钢铁和煤灰的记忆。// //街上有罢工工人聚集。他们拿着政府发的补贴--一捆几乎透明的钞票。在鲁尔,消极抵抗不是口号,是日常。一个用废纸支撑的日常。// </div> <<link "在埃森街头走走" "Ruhr_Street">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "靠近法军哨卡" "Ruhr_Checkpoint">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "ruhr_essen">>\ <<link "离开鲁尔,回柏林" "Scene_RegionSelect">><</link>>
//你走在埃森的街上。// //一个工人靠在墙上,手里攥着一捆钞票。他看到你,苦笑了一下。// //「消极抵抗。」他把钞票举起来,对着光看。「你知道这捆钱今天值多少吗?三个土豆。明天可能两个。」// //「你为什么还待着?」// //「因为走了就什么都没了。待着至少还有补贴。三个土豆也是土豆。」// //他把钞票塞进口袋,从墙上直起身来。// //「你们在柏林开会,我们在鲁尔挨饿。但我不怪你们。至少你们还在。」// <<inline-gate "ruhr_street">>\ <<if _io_ok>>\ <<tag-add "经济压力" "micro" 10 "经济" "weimar" "ruhr">>\ <<tag-add "工人愤怒" "micro" 5 "社会" "spd" "ruhr">>\ //(经济压力 +10,工人愤怒 +5)//\ <<else>>\ @@color:gray;(今天到过的地方都到过了。)@@\ <</if>>\ <<nav "Region_Ruhr">>\
//你靠近法军哨卡。// //两个法国兵拦住了你。他们说法语,你听不太懂,但"papiers"(证件)这个词你认识。// //你掏出通行证。他们看了看,又看了看你。其中一个用德语说了一句,口音很重:// //「你是柏林来的?」// //「是。」// //「柏林。」他重复了一遍,把通行证还给你。嘴角有一丝笑意,不是友善的笑,是那种「我站在这片土地上而你在我的许可下经过」的笑。// //你走过去。背上的目光比正面更重。// <<inline-gate "ruhr_cp">>\ <<if _io_ok>>\ <<tag-add "民族屈辱" "micro" 15 "政治" "weimar" "ruhr">>\ //(民族屈辱 +15)//\ <<else>>\ @@color:gray;(哨卡的法国兵朝你摆了摆手:今天别再过来了。)@@\ <</if>>\ <<nav "Region_Ruhr">>\
<<silently>> <<set $current_region to "munich">>\ <<set $regions.munich.visit_count++>>\ <<set $regions.munich.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //慕尼黑// ''-- 此地此刻 --'' <<region-atmosphere "munich">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "munich">><<mini-event-render>>\ <div class="scene-block"> //巴伐利亚的空气和柏林不一样。更冷,更湿,也更躁。// //啤酒馆里有人在演讲。不是政治演讲,是那种巴伐利亚式的--声音大、手势多、内容模糊。但如果你仔细听,会发现模糊的表面下有暗流。// //有人在提「民族革命」。有人在提一个叫「国家社会主义工人党」的组织。名字很长,但人们已经开始简称它了。// </div> <<link "在街上走走" "Munich_Walk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "去 NSDAP 据点" "Scene_Visit_NSDAP">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "munich">>\ <<link "离开慕尼黑,回柏林" "Scene_RegionSelect">><</link>>
//你走在慕尼黑的街上。// //一面墙上贴着一张海报。一只鹰,爪子抓着一个卐字。下面写着:「慕尼黑大会」。// //你撕下海报的一个角,揣进口袋。不是为了什么,只是觉得应该留着。在历史里,有时候一张纸比一把枪更有用--也更危险。// <<inline-gate "mu_walk">>\ <<if _io_ok>>\ <<tag-add "民族主义" "micro" 10 "政治" "nsdap" "munich">>\ //(民族主义 +10)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Munich">>\
<<silently>> <<set $current_region to "hamburg">>\ <<set $regions.hamburg.visit_count++>>\ <<set $regions.hamburg.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //汉堡// ''-- 此地此刻 --'' <<region-atmosphere "hamburg">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "hamburg">><<mini-event-render>>\ <div class="scene-block"> //港口城市的空气里有咸味和鱼腥味。码头的起重机像一群不会动的铁鸟,停在那里,等着什么。// //汉堡是KPD的地盘。共产党的势力在这里比柏林更公开--不是因为更自由,是因为更绝望。码头工人的绝望是咸的,和海风一起灌进每一个巷子。// </div> <<link "在码头走走" "Hamburg_Docks">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "hamburg">>\ <<link "离开汉堡,回柏林" "Scene_RegionSelect">><</link>>
//你走在汉堡码头上。// //一个码头工人靠在绞盘上,嘴里嚼着烟。他看了你一眼,认出你不是本地人。// //「柏林来的?」// //「是。」// //「来干什么?」// //「看看。」// //「看什么?」他往地上吐了一口烟汁。「看我们怎么活?还是看我们怎么死?」// //你不知道怎么回答。他也不等你回答。// //「KPD说了,」他压低声音,「时候到了,柏林会收到消息。」// //他没说「什么消息」。但他的眼神里有一种你见过一次的东西--在克罗伊茨贝格那个演讲的年轻人眼里见过。那不是愤怒,是准备。// <<inline-gate "hh_docks">>\ <<if _io_ok>>\ <<trust-capped "kpd" 5>><<trust-act-note>><<rival-note-show>>\ <<tag-add "左翼接触" "micro" 8 "玩家行为" "kpd" "hamburg">>\ //(获得接触:汉堡左翼)//\ <<else>>\ @@color:gray;(他今天没再搭理柏林来的人。)@@\ <</if>>\ <<nav "Region_Hamburg">>\
<<silently>> <<set $current_region to "officers_club">>\ <<set $regions.officers_club.visit_count++>>\ <<set $regions.officers_club.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //军官俱乐部// ''-- 此地此刻 --'' <<region-atmosphere "officers_club">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "officers_club">><<mini-event-render>>\ <div class="scene-block"> //推开厚重的橡木门,一股雪茄烟雾扑面而来。这里是军官俱乐部的吸烟室。壁炉里的火映着铜纽扣的光。// //军装比西装多。这不是比喻--是统计事实。每三个人里有两个穿军装,第三个穿便服但脊背太直。// //角落里有人在低声争论。你听不清内容,但「第48条」和「必要时刻」两个词飘了过来。// </div> <<link "和军官喝一杯" "OfficersClub_Drink">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "听老兵聊天" "OfficersClub_Veterans">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "在角落观察" "OfficersClub_Observe">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "officers_club">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你坐到吧台边,叫了一杯白兰地。旁边的上校看了你一眼。// //「文官?」他闻了闻你的方向,像在闻一种他不常接触的物种。// //「坐吧。既然来了,就喝一杯。在柏林,拒绝喝酒的人和拒绝签字的人一样可疑。」// //白兰地很烈。但比他看你的目光温和。// <<inline-gate "oc_drink">>\ <<if _io_ok>>\ <<trust-capped "army" 2>><<trust-act-note>><<rival-note-show>>\ <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + 3)>>\ <<tag-add "军方接触" "micro" 5 "玩家行为" "军方" "officers_club">>\ //(军方接触 +5)//\ <<else>>\ @@color:gray;(今天已经喝过了。再喝,上校就该请你进醒酒室了。)@@\ <</if>>\ <<nav "Region_OfficersClub">>\
//壁炉旁的皮沙发上有几个老兵。他们的军装褪色了,但勋章还亮着。// //其中一个在讲故事。你听了一会儿。// //「……然后我们回来了。回来发现什么都没了。工作没了,积蓄没了,连荣誉都没了--他们用一张纸把荣誉收走了。凡尔赛。你签过凡尔赛吗?没有?那你不知道那种感觉。」// //另一个接话:「但共和国知道。共和国知道我们存在。他们只是选择忘记。」// <<inline-gate "oc_vets">>\ <<if _io_ok>>\ <<trust-capped "army" 2>><<trust-act-note>><<rival-note-show>>\ <<tag-add "军队不满" "micro" 8 "军事" "军方" "officers_club">>\ //(军队不满 +8)//\ <<else>>\ @@color:gray;(老兵的故事今天就讲到这里。)@@\ <</if>>\ <<nav "Region_OfficersClub">>\
//你找了个角落坐下,假装在读一份报纸。// //你注意到几个细节:// //一个人在角落里写东西,写完就烧。// //两个人在窗边低语,手指不停指向桌上的地图。// //侍者对军官们的态度比对文官客气三倍--但不是恭敬,是警惕。// <<inline-gate "oc_obs">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 5 "玩家行为" "weimar" "officers_club">>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 2)>>\ //(观察者 +5,偏执 +2)//\ <<else>>\ @@color:gray;(今天该看的都看过了。)@@\ <</if>>\ <<nav "Region_OfficersClub">>\
<<silently>> <<set $current_region to "kabarett">>\ <<set $regions.kabarett.visit_count++>>\ <<set $regions.kabarett.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //卡巴莱// ''-- 此地此刻 --'' <<region-atmosphere "kabarett">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "kabarett">><<mini-event-render>>\ <div class="scene-block"> //门口的霓虹灯拼出一个名字:"Kabarett der Komiker"。但有两个字母不亮了,看起来像"Kabarett der K"。// //里面烟雾和香水混在一起,形成一种让人头晕的甜腻。舞台上一个穿燕尾服的人在模仿总理的走路姿势。观众在笑。笑声里有酒精的味道。// //在卡巴莱,政治是一种娱乐。娱乐也是一种政治。// </div> <<if $kabarett_today gte 2>>\ //你今天已经在卡巴莱待得够久了。侍应看你一眼,没有再递酒单。//\ <<else>>\ <<link "看表演" "Kabarett_Show">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><<set $kabarett_today to $kabarett_today + 1>><</link>> <<link "和人攀谈" "Kabarett_Talk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><<set $kabarett_today to $kabarett_today + 1>><</link>> <<link "喝一杯" "Kabarett_Drink">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><<set $kabarett_today to $kabarett_today + 1>><</link>> <</if>> <<nearby "kabarett">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你在角落找了个位子坐下。舞台上的灯光暗了,又亮了。// //一个女歌手走上台。她唱的不是情歌--是一首关于面包价格的政治讽刺歌。每唱到价格涨了,观众就笑。笑着笑着就不笑了。// //因为价格真的涨了。// <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - 8)>>\ <<set $player.mental.idealism to Math.min(100, $player.mental.idealism + 2)>>\ <<tag-add "知情者" "micro" 3 "玩家行为" "weimar" "kabarett">>\ //(疲惫 -8,理想 +2)//\ <<nav "Region_Kabarett">>\
//吧台边有个戴圆眼镜的人在独自喝酒。你走过去。// //「你是做什么的?」他问。// //「政府。」你说。// //他笑了:「那你有福了。政府的人来卡巴莱,要么是来放松的,要么是来监视的。你像前者。但你不知道的是--前者更危险。」// //他喝了一口:「因为放松的人会说出真话。在柏林,真话是最大的危险品。」// <<trust-capped "ddp" 3>><<trust-act-note>><<rival-note-show>>\ <<tag-add "知情者" "micro" 5 "玩家行为" "ddp" "kabarett">>\ //(知情者 +5)//\ <<nav "Region_Kabarett">>\
//你叫了一杯杜松子酒。// //酒保倒酒的时候,你注意到他的手在抖。不是因为冷--是因为吧台下面有一张纸条,他刚才在写什么。// //你喝了酒。杜松子酒在喉咙里烧,但比外面的风暖和。// <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - 5)>>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 2)>>\ //(疲惫 -5,偏执 +2)//\ <<nav "Region_Kabarett">>\
<<silently>> <<set $current_region to "moabit">>\ <<set $regions.moabit.visit_count++>>\ <<set $regions.moabit.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //莫阿比特// ''-- 此地此刻 --'' <<region-atmosphere "moabit">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "moabit">><<mini-event-render>>\ <div class="scene-block"> //施普雷河在这里拐了个弯,把莫阿比特围成一个孤岛。岛上有两样东西:工厂和监狱。// //工厂在冒烟。监狱不冒烟--它沉默。但沉默比烟更重。// //工人们在街上走,脚步比克罗伊茨贝格的人更慢。不是累--是习惯了。习惯了一种沉重的东西压在头顶的感觉。// </div> <<link "在工人区走走" "Moabit_Walk">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "在监狱外围看看" "Moabit_Prison">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "和家属聊聊" "Moabit_Families">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "moabit">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你走在莫阿比特的街上。灰色的房子,灰色的天,灰色的脸。// //一个工人在门口修自行车。他看到你,点了点头。// //「你也来找人的?」他问。// //「什么人?」// //「被关进去的人。」他往监狱方向抬了抬下巴。「这里每个人都认识一个被关进去的人。」// <<inline-gate "mb_walk">>\ <<if _io_ok>>\ <<tag-add "工人愤怒" "micro" 5 "社会" "kpd" "moabit">>\ <<trust-capped "kpd" 2>><<trust-act-note>><<rival-note-show>>\ //(工人愤怒 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Moabit">>\
//你走到监狱的外墙边。墙很高,顶上有铁丝网。// //墙根下有人放了几束花。花已经枯了,但没人收走。// //一个老妇人站在墙边,手贴着墙。她不是在等什么人--她只是在摸那面墙。也许墙的另一边,有人在摸同一块砖。// //你没有说话。在莫阿比特,沉默比说话更合适。// <<inline-gate "mb_prison">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 8 "玩家行为" "weimar" "moabit">>\ <<set $player.mental.idealism to Math.max(0, $player.mental.idealism - 3)>>\ //(观察者 +8,理想 -3)//\ <<else>>\ @@color:gray;(墙还是那面墙。花也没换新的。)@@\ <</if>>\ <<nav "Region_Moabit">>\
//几个家属聚在监狱对面的茶摊边。茶是假的--菊苣根泡的。但她们喝得很认真。// //一个年轻女人在哭。旁边的大姐拍着她的背。// //「他不会有事的。」大姐说。// //「你怎么知道?」年轻女人问。// //「我不知道。」大姐说。「但在这条街上,不知道也得说知道。不然撑不下去。」// <<inline-gate "mb_families">>\ <<if _io_ok>>\ <<trust-capped "kpd" 3>><<trust-act-note>><<rival-note-show>>\ <<set $player.mental.isolation to Math.max(0, $player.mental.isolation - 3)>>\ <<tag-add "左翼接触" "micro" 5 "玩家行为" "kpd" "moabit">>\ //(左翼接触 +5,孤独 -3)//\ <<else>>\ @@color:gray;(该说的安慰话,今天都说过了。)@@\ <</if>>\ <<nav "Region_Moabit">>\
<<silently>> <<set $current_region to "potsdamer">>\ <<set $regions.potsdamer.visit_count++>>\ <<set $regions.potsdamer.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //波茨坦火车站// ''-- 此地此刻 --'' <<region-atmosphere "potsdamer">>\ <div class="atmo-note">$atmo_text</div> <<mini-event-roll "potsdamer">><<mini-event-render>>\ <div class="scene-block"> //波茨坦火车站比安哈尔特更旧,也更吵。这里的列车从南方来--巴伐利亚、符腾堡、萨克森。// //站台上的口音和柏林不一样。软一些,慢一些。但人的表情一样--疲惫、警惕、不确定。// //候车厅角落里有人在卖南德的报纸。头版上印着一个你不太熟悉的名字--但如果你仔细看,会发现他的胡子很有辨识度。// </div> <<link "在站台看看" "Potsdamer_Platform">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "在候车厅走走" "Potsdamer_Hall">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<link "和旅客聊聊" "Potsdamer_Travelers">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + random(1, 3))>><</link>> <<nearby "potsdamer">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
//你站在站台上。一列从慕尼黑来的火车刚停。// //下来的人不多。但有一个细节引起了你的注意:几个人穿着同样的褐色衬衫。他们不是成群结队--是故意分散下车。但你看得出来:同样的靴子,同样的步伐,同样的目光。// //他们没有喊口号。他们甚至没有说话。但他们在看人--那种在「辨认」的目光。// <<inline-gate "pd_platform">>\ <<if _io_ok>>\ <<tag-add "民族主义" "micro" 5 "政治" "nsdap" "potsdamer">>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 3)>>\ //(民族主义 +5,偏执 +3)//\ <<else>>\ @@color:gray;(今天到站的车都看过了。)@@\ <</if>>\ <<nav "Region_Potsdamer">>\
//候车厅比站台暖和。但暖和的空气里有一种说不清的不安。// //告示板上贴着一张告示:禁止未经批准的政治集会。告示旁边,有人用铅笔写了一行小字:「批准由谁来批?」// //一个小孩在长椅下捡到了一张传单。他看不懂,把它叠成纸飞机飞了出去。纸飞机落在一个穿褐色衬衫的人脚边。那人捡起来,看了一眼,叠好放进口袋。// <<inline-gate "pd_hall">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 5 "玩家行为" "weimar" "potsdamer">>\ //(观察者 +5)//\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Potsdamer">>\
//你在候车厅的长椅上坐下,旁边是一个从巴伐利亚来的商人。// //「柏林变了。」他没头没脑地说了一句。// //「怎么变了?」你问。// //「以前来柏林,觉得它是首都。现在来柏林,觉得它在发烧。」他看了看四周,压低声音:「我们那边也在变。慕尼黑有人在搞一个新东西。叫什么……国家社会主义。名字很长。但势头不短。」// <<inline-gate "pd_travel">>\ <<if _io_ok>>\ <<trust-capped "ddp" 2>><<trust-act-note>><<rival-note-show>>\ <<tag-add "知情者" "micro" 8 "玩家行为" "ddp" "potsdamer">>\ <<tag-add "民族主义" "micro" 3 "政治" "nsdap" "potsdamer">>\ //(知情者 +8,民族主义 +3)//\ <<else>>\ @@color:gray;(今天该聊的都聊过了。他赶车去了。)@@\ <</if>>\ <<nav "Region_Potsdamer">>\ /* ============================================================ 【本轮新增】权力走廊两部委 + 红堡(新区域场景页) ============================================================ */
<<silently>> <<set $current_region to "police_hq">>\ <<set $regions.police_hq.visit_count++>>\ <<set $regions.police_hq.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //红堡·警察总局// <<site-prompt-render "police_hq">>\ ''-- 此地此刻 --'' <<region-atmosphere "police_hq">>\ <div class="atmo-note">$atmo_text</div> <<region-action-menu "police_hq">>\ <<mini-event-roll "police_hq">><<mini-event-render>>\ <div class="scene-block"> //亚历山大广场东北角,红砖大楼沿街排开,四角立着塔楼。柏林人管它叫红堡,一半因为它砖的颜色,一半因为走到它门前,人自然会把嗓门放低。// //门口换了岗。交接的口令对得很响,响给街对面的人听。// //侧门开了一道缝,囚车倒进来,没有警笛。在这座城里,警笛是留给值得惊动的事的。// </div> <<nearby "police_hq">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
<<silently>> <<set $current_region to "foreign_office">>\ <<set $regions.foreign_office.visit_count++>>\ <<set $regions.foreign_office.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //外交部// <<site-prompt-render "foreign_office">>\ ''-- 此地此刻 --'' <<region-atmosphere "foreign_office">>\ <div class="atmo-note">$atmo_text</div> <<region-action-menu "foreign_office">>\ <<mini-event-roll "foreign_office">><<mini-event-render>>\ <div class="scene-block"> //威廉街的另一头。这栋楼比总理府安静,静得能听见电报机的嗒嗒声从门缝里漏出来。// //走廊的灯昼夜不关。电报房三班倒,值班室的沙发上放着两个枕头,谁的班谁用。// //墙上的世界地图插着小旗,插得最多的是德法边境那一小段。旗子太密,把那一段扎得像刺猬。// </div> <<nearby "foreign_office">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>>
<<silently>> <<set $current_region to "finance_ministry">>\ <<set $regions.finance_ministry.visit_count++>>\ <<set $regions.finance_ministry.last_visit to { year: $date.year, month: $date.month, day: $date.day }>>\ <</silently>>\ //财政部// <<site-prompt-render "finance_ministry">>\ ''-- 此地此刻 --'' <<region-atmosphere "finance_ministry">>\ <div class="atmo-note">$atmo_text</div> <<region-action-menu "finance_ministry">>\ <<mini-event-roll "finance_ministry">><<mini-event-render>>\ <div class="scene-block"> //财政部的走廊比别处窄。楼里的人贴着右边走,怀里抱着账册,像抱着病人。// //算盘声从一扇扇门里传出来,此起彼伏。// //地下印刷间的排气口冒着热气,纸和油墨的味道从铁栅栏里涌出来。这个国家眼下产量最大的东西,从这道栅栏底下出来。// </div> <<nearby "finance_ministry">>\ <<silently>><<set _leave_pool to ["街边等着总理府的车,你上了车","总理府的车已经在这儿等你好一会儿了","你站在街边等了一会儿,车来了","你招了招手,总理府的车停在你面前","车夫看见你出来,拉开了车门"]>><<set _leave_text to _leave_pool[random(0, _leave_pool.length - 1)]>><</silently>><<link "_leave_text" "Scene_RegionSelect">><</link>> /* ============================================================ 【本轮新增】六区行动子场景(region-action-menu 的 passage 目标) ============================================================ */
/* 常驻:红堡门前的广场 */ //你隔着铁栅栏站了一会儿,看台阶上的人进进出出。进门的人脱帽,出门的人扣上。台阶扫得像营房的地面。// //卖炒栗子的老太婆把炉子支在十步开外。再近就不行了,这是她在这条街上摆了十几年摊换来的分寸。// //一个穿便衣的人靠在灯柱上抽烟,抽得很慢。他的目光落在每一个走近台阶的人身上,从不过问,也不拦。// //你走开的时候,栗子的香味跟了你半条街。// <<inline-gate "ph_sq">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 3 "玩家行为" "weimar" "police">>\ <span class="txt-sys">//(观察者 +3)//</span>\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_PoliceHQ">>\
/* 常驻:求见警察总监 */ <<silently>> <<if not $npcs.police>><<set $npcs.police to { trust: 30, met: false, goals: ["秩序","预算"], alliance: {} }>>\ <</if>>\ <<set _ph_first to not $npcs.police.met>>\ <<set $npcs.police.met to true>>\ <</silently>>\ <<if _ph_first>>\ //会客室里有一股蜡和旧皮革的气味。警察总监进来时没穿大衣,肩章在灯下很亮。他把你的名片看了一眼,字面朝下扣在桌上。// //「威廉街的人来红堡,」他说,「一般没好事。」// //「也不一定。」你答。// //他看了你三秒,笑了一下,很短。他坐下,把桌上的案卷合起来推到一边,又把怀表搁在案卷上。这个动作的意思很清楚:今天这段工夫,他给你了。// //「我只有一条规矩,」他说,「街上的事归我,纸上的事归你。谁也别伸手拿对方那一份。」//\ <<elseif $npcs.police.trust gte 50>>\ //这次没有客套。勤务兵倒完咖啡就退了出去,门带得很轻。// //「上礼拜红堡收了两车请愿书,」他说,「一车要面包,一车要枪。你猜这两车最后归谁管?都归我管。」// //他看着你,等你接话。你没接。他自己点了点头,像是满意你没接。// //「你这种人不来的时候,我当威廉街把我们当扫帚使。你来了,至少说明有人记得,扫帚也是花钱买的。」//\ <<elseif $npcs.police.trust gte 30>>\ //还是那间会客室,还是那股蜡味。他请你在案卷对面坐下,谈了些治安的流水账:哪个广场的集会批了,哪条街的电车今晚停运。// //都是明天报纸就有的消息。他挑这些讲,是在告诉你分寸:你没被当外人,也还没被当自己人。//\ <<else>>\ //通报进去之后,你在会客室里等了七分钟。七分钟不算久,也不算短,是掐好了的。// //他进来,站着听你说完,没有坐。// //「威廉街要什么,写公文来,」他说,「红堡按公文办事。别的,我这里没有。」//\ <</if>>\ <<trust-capped "police" 2>><<trust-act-note>><<rival-note-show>>\ <<nav "Region_PoliceHQ">>\
/* 红堡信任≥25:治安周报 */ //勤务兵抱来一册油印周报,蓝色油墨,纸边毛糙。封面上没有抬头,只有星期数。// //三个栏目:集会备案,军械走失,夜里的事。第三栏最厚。// //你翻到第十一页,一行小字:某仓库夜间有车辆进出,未登记。你把那一页折了个角。旁边的副官看见了,装作没看见。// //「第三栏您可以带回去看,」副官说,「封面别带。」// <<tag-add "知情者" "micro" 3 "观察" "police" "police">>\ <span class="txt-sys">//(知情者 +3)//</span> <<nav "Region_PoliceHQ">>\
/* 社会愤怒≥45:打招呼——明天的游行别见血 */ //你把话讲得很直:工人区明天有一场大游行,火气已经到了顶。红堡要是照老规矩用水龙头和枪托开场,第二天报纸上的账,全城一起还。// //总监听完,手指在桌面上敲了两下。// //「路线我知道,批文就在我这里。」他说,「我可以让他们只走到三个路口为止。水龙车待命,不下水。」// //他从抽屉里抽出一张手绘的路线图,用铅笔改了两处,推给你。// //「这是给你面子,不是给他们。」他说,「下个月议预算的时候,记得红堡的马也吃草。」// <<set $world.political_violence to Math.max(0, Math.min(100, $world.political_violence - 2))>>\ <<trust-capped "police" 1>><<trust-capped "spd" -1>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(政治暴力 -2——工人们看见你从红堡里进进出出)//</span> <<nav "Region_PoliceHQ">>\
/* R09(第48条)之后:对执行细则 */ //一间没有窗的会议室,三面墙上都是柏林分区的地图。红堡来的人不多,但每人腋下都夹着皮包。// //细则一条一条过:哪些报馆,哪些会场,哪些名字画了圈。念到画圈的部分,念的人声音低了半格。// //「先说清楚,」总监用铅笔敲了敲地图,「总统的署令是纸。把纸变成街面上的秩序,靠的是红堡的名单。」// //名单推过来。字迹抄得工整,有几个名字后面画着问号。// //「问号是我不确定的。」他说,「您能核掉一个,我给您记一功。」// <<tag-add "知情者" "micro" 3 "观察" "police" "police">>\ <<trust-capped "police" 2>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(知情者 +3)//</span> <<nav "Region_PoliceHQ">>\
/* 来过两次:在押名册 */ //名册不给原件。勤务兵当着你的面抄了一份,抄得很慢。抄得慢是规矩,也是态度。// //政治类在押的两页半,多半是威丁和弗里德里希斯海因的年轻人:街头斗殴,藏传单,袭警。有几行末尾写着「待审」。// //「待审的意思是,」勤务兵把抄本递给你,按了按边角,「还没轮到法官,先轮到我们。审完的,有的就不再抄进来了。」// //你把两页半看完,还给他。他把抄本凑到炉口点了火,灰落进痰盂。// //「这一页在您脑子里了,」他说,「红堡没有。」// <<tag-add "知情者" "micro" 3 "观察" "police" "police">>\ <span class="txt-sys">//(知情者 +3)//</span> <<nav "Region_PoliceHQ">>\
/* 常驻:走廊与电报房 */ //你沿着走廊慢慢走。电报房的门开着一条缝,里面的人念电码,念得像念经。誊写员把电码翻成字,桌上贴着一张条子:错一个字,赔一个月薪水。// //一个年轻外交官抱着一摞照会迎面过来,认出你之后,把照会往怀里又拢了拢。// //走廊尽头的布告栏里钉着内部守则,第一条加了下划线:此地没有「随便说说」。// <<inline-gate "fo_cor">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 2 "观察" "weimar" "foreign">>\ <span class="txt-sys">//(知情者 +2)//</span>\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_ForeignOffice">>\
/* 常驻:听外交司过照会 */ //外交司的人把今天的照会摆成一排,像医生摆片子。法国的,英国的,比利时的,一份一份过。// //念到法国那份,他放慢了。那份的意思是:占领军需要一个新理由,请柏林自己给一个。// //「他们要什么?」你问。// //「要我们出错,」他合上照会,「最好拿着枪出错。」// //他把今天要发的三份回稿递给你过目。措辞讲究:软得让国内骂,硬得让巴黎骂。两边都骂的稿子,才活得下去。// <<inline-gate "fo_brf">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 2 "观察" "weimar" "foreign">>\ <<set $weimar.mid.intl_trust to Math.max(0, Math.min(100, ($weimar.mid.intl_trust || 0) + 1))>>\ <span class="txt-sys">//(知情者 +2 · 国际信任 +1)//</span>\ <<else>>\ @@color:gray;(照会今天已经过完了。)@@\ <</if>>\ <<nav "Region_ForeignOffice">>\
/* R01(鲁尔被占)后:口述抗议照会 */ //照会的框架两天前就拟好了,今天是填血肉。你坐在誊写员旁边,一句一句口述:占领违反和约第几款,柏林保留哪些权利,抗议报到什么层级。// //誊写员的手很稳。誊完最后一行,他把稿子举到灯下检查了一遍,才盖上外交司的骑缝章。// //「这份发出去,巴黎会炸,」他说,「柏林这边,民族党的报纸会夸我们,民主党的报纸会骂我们多事。」// //「你倒清楚。」// //「先生,我们誊写员都清楚。」他把稿子码齐,「清楚,是这份差事唯一的好处。」// <<inline-gate "fo_not">>\ <<if _io_ok>>\ <<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + 2))>>\ <<set $weimar.mid.intl_trust to Math.max(0, Math.min(100, ($weimar.mid.intl_trust || 0) + 1))>>\ <<trust-capped "dnvp" 1>><<trust-capped "ddp" 1>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(民族主义 +2 · 国际信任 +1)//</span>\ <<else>>\ @@color:gray;(这份照会今天已经发走了。)@@\ <</if>>\ <<nav "Region_ForeignOffice">>\
/* 知情者≥15:后楼梯口见外国记者 */ //楼里禁烟,他却站在后楼梯口抽。他拿得出手的是一封新闻司的介绍信,信是真的,来意不是。// //你告诉他三件事。第一件是真的,第二件半真半假,第三件是编的。他听着,不记。// //「我不问哪件是哪件,」他说,「我只保证,明天见报的只有第一件。」// //他磕了磕烟灰,又说:// //「我那边的读者以为柏林人在挨饿。您给的第一件事是真的——挨饿是真的,他们才肯信后面的话。这生意就这么做。」// <<inline-gate "fo_jou">>\ <<if _io_ok>>\ <<set $weimar.mid.intl_trust to Math.max(0, Math.min(100, ($weimar.mid.intl_trust || 0) + 2))>>\ <<tag-add "知情者" "micro" 2 "观察" "weimar" "foreign">>\ <span class="txt-sys">//(国际信任 +2 · 知情者 +2)//</span>\ <<else>>\ @@color:gray;(他今天赶别的稿子去了。)@@\ <</if>>\ <<nav "Region_ForeignOffice">>\
/* 经济压力≥55:陪银行代表团谈担保 */ //长桌上摆着两面小国旗。桌子底下,两个勤杂工在挪暖气片,水管冻了,会开到一半,冻得人人跺脚。// //银行代表团的问题只有一个:担保。他们不问鲁尔,不问和约,只问赔款拿什么作数。// //财政的人答得艰难。你递了一句过去:「担保的清单,会跟着谈判的清单一起长。」// //翻译翻过去。代表团里年纪最大的那位摘下眼镜擦了擦,笑了。// //「这句话我们听过,」他说,「1919年,一模一样的。」// //但他的笔记下了那句话。// <<inline-gate "fo_del">>\ <<if _io_ok>>\ <<set $weimar.mid.intl_trust to Math.max(0, Math.min(100, ($weimar.mid.intl_trust || 0) + 2))>>\ <<set $world.economy to Math.max(0, Math.min(100, $world.economy + 2))>>\ <<trust-capped "dvp" 2>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(国际信任 +2 · 经济 +2)//</span>\ <<else>>\ @@color:gray;(代表团明天才回柏林。)@@\ <</if>>\ <<nav "Region_ForeignOffice">>\
/* 常驻:走廊里等人 */ //你靠在走廊尽头的窗边等人。窗外是内政部的后墙,墙根堆着过期的公报,四块砖压着。// //你要等的人迟到了二十分钟,出来时手里多两份文件,头发乱了一圈。账房的人从走廊这头走到那头,就会多出两份文件。// //「抱歉,抱歉,」他把文件塞进公文包,「上一个会拖堂了。您知道部长室今天多忙吗?送进来的和烧掉的,一样多。」// <<inline-gate "fm_hal">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 2 "观察" "weimar" "finance">>\ <span class="txt-sys">//(知情者 +2)//</span>\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_FinanceMinistry">>\
/* 常驻:总账房看收支总账 */ //总账房的天花板很高,说话声要飞一会儿才落下来。管总账的是个白头发的老科员,他翻开本月的收支总账,用一把木尺压住页面。// //「先生,看这一栏。」他的指甲点在印花税上,「这个月印花税的进项,抵不上印钱的开销。印刷厂烧的煤钱,都是新欠的债。」// //他把总账合上,动作很轻,像怕惊动里面的数字。// //「我在这间屋子坐了三十年,」他说,「以前的账是两条线,收一条,支一条。现在是一条线追另一条线。追上了叫平衡,追不上,就叫危机。」// <<inline-gate "fm_led">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 3 "观察" "weimar" "finance">>\ <span class="txt-sys">//(知情者 +3)//</span>\ <<else>>\ @@color:gray;(老科员今天核账,不见客。)@@\ <</if>>\ <<nav "Region_FinanceMinistry">>\
/* 通胀≥60:银行家的陈情 */ //银行家坐了一屋子。他们来的理由各不相同,说的话一模一样:再这样下去,储蓄就没了;储蓄没了,银行就没了;银行没了——他们停在这里,让在场的人自己往下想。// //为首的那位年纪最大。他推过来一本小册子,里面是三条建议:停发,减政,借外债。三条都难,难的程度一条比一条重。// //「先生,马克不是我们的敌人,」临走时他说,「没有马克,我们这些年赚的钱才真的作废了。我们是想救它。请您也这么想。」// //他们走后,茶还没凉。你把小册子收进包里。// <<inline-gate "fm_ban">>\ <<if _io_ok>>\ <<trust-capped "dvp" 2>><<trust-act-note>><<rival-note-show>>\ <<set $world.economy to Math.max(0, Math.min(100, $world.economy + 1))>>\ <span class="txt-sys">//(经济 +1)//</span>\ <<else>>\ @@color:gray;(银行家们今天没来。)@@\ <</if>>\ <<nav "Region_FinanceMinistry">>\
/* R18(马克跌破万点)后:地下印刷间 */ //印刷间的门是双层的,隔音。机器昼夜不停,纸卷从一头进,钞票从另一头出,快得看不清版面。// //厂长扯着嗓子介绍:一天印两万亿。这个数字,一个月前还是全年的产量。// //「停过机吗?」你问。// //「停过。上礼拜换了三回版。」厂长说,「面额不够用了,版要重刻。」// //你盯着那卷纸看了一会儿。纸是好纸,油墨也是好油墨。坏的不是这两样东西。// <<inline-gate "fm_pri">>\ <<if _io_ok>>\ <<set $world.inflation to Math.max(0, Math.min(100, $world.inflation - 1))>>\ <<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + 1))>>\ <<trust-capped "dvp" -1>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(通胀 -1 · 政府信任 +1)//</span>\ <<else>>\ @@color:gray;(印刷间今天换版,不开门。)@@\ <</if>>\ <<nav "Region_FinanceMinistry">>\
/* R16(地租马克)后:盯住新货币的头一个月 */ //地租马克上岗一个月了。小会议室的黑板上抄着第一份兑换汇总:旧马克兑新马克,一万亿兑一。粉笔字比人高。// //「兑换是稳的,」财政司的人说,「不稳的是人心。有人拿到新马克,当天就去换美元;有人捏着旧马克等,等它涨回去。」// //你在汇总上批了三行字:硬币要足,工资要准,谣言要有人管。批完,你在「工资要准」四个字外面画了个圈。// //「这三个,哪个最难?」你问。// //「第三个,」他说,「前两个要钱。这个要人。」// <<inline-gate "fm_ren">>\ <<if _io_ok>>\ <<set $world.economy to Math.max(0, Math.min(100, $world.economy + 3))>>\ <<set $world.inflation to Math.max(0, Math.min(100, $world.inflation - 3))>>\ <<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + 2))>>\ <span class="txt-sys">//(经济 +3 · 通胀 -3 · 政府信任 +2)//</span>\ <<else>>\ @@color:gray;(今天的汇总已经批过了。)@@\ <</if>>\ <<nav "Region_FinanceMinistry">>\
/* 来过四次:节流清单过会 */ //会议室里坐了六个部的来人。节流清单过到第三页,吵起来的是卫生部的——你要减掉一批防疫站。// //「省下的钱不看病,」卫生部的来人说,「将来都花在病床涨出来的账上。」// //「把这句话写下来,」你把纸推回去,「写上日期。明年这个时候,我们对账。」// //散会后,财政部的人帮你把清单收好。他数了数:六个部,签了五个半。// //「半个是谁?」// //「财政部自己,」他说,「我签了一半,另一半得回去问我们部长舍不舍得。」// <<inline-gate "fm_aus">>\ <<if _io_ok>>\ <<set $world.economy to Math.max(0, Math.min(100, $world.economy + 2))>>\ <<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + 1))>>\ <<trust-capped "spd" -2>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(经济 +2 · 政府信任 +1——节流砍到的都在工人身上)//</span>\ <<else>>\ @@color:gray;(清单今天不过会。)@@\ <</if>>\ <<nav "Region_FinanceMinistry">>\
/* 常驻:厂门口看下班的队伍 */ //你站在工厂大门的斜对面,离得够近看得清,也够远不算碍事。// //汽笛响过第二遍,铁门才开。人流从门里涌出来,蓝工装,砖灰色的脸。没有人说话,几百双鞋底蹭过石子路,汇成一种低沉的沙沙声。// //门房认得你。他没赶你,只是把门关得比平时快了些。// //你数了数,队伍比去年短了至少三成。墙上挂工牌的格子空了一排。// <<inline-gate "fh_gat">>\ <<if _io_ok>>\ <<tag-add "工人愤怒" "micro" 4 "社会" "kpd" "friedrichshain">>\ <span class="txt-sys">//(工人愤怒 +4)//</span>\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Friedrichshain">>\
/* 常驻:1919年街垒旧地 */ //转过两个街口,房子矮下去。1919年1月,这条街被挖开过:铺路石掀起来垒成胸墙,仗打完,石头回了原位,只有一块还歪着,踩上去会晃。// //墙上有一排弹孔,后来用水泥补过。补丁比墙面新,也比墙面白,一个一个圆点,从街这头数到那头。// //一个拄拐的老人坐在门口晒太阳,看着你数。// //「数不过来的,」他说,「四十一个。剩下的在对面街上。」// //你谢过他。他摆摆手,继续晒他的太阳。// <<inline-gate "fh_bar">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 3 "玩家行为" "weimar" "friedrichshain">>\ <span class="txt-sys">//(观察者 +3)//</span>\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Friedrichshain">>\
/* 来过两次:工人食堂搭伙 */ //食堂在厂区侧门里,长条桌,长条凳。打菜的窗口今天有两样:大麦汤,掺萝卜的土豆。// //你端着盘子在长凳上坐下,旁边的人挪了挪,给你腾出半个位子。没有人问你是谁——来过两次之后,这里就默认你是个人,不是个官。// //汤是热的。就这么一件事,但是是真的。// //隔壁桌两个年轻工人争一本册子,争到面红耳赤,最后把册子从中间撕开,一人拿一半,接着看。// <<inline-gate "fh_can">>\ <<if _io_ok>>\ <<set $player.mental.fatigue to Math.max(0, $player.mental.fatigue - 4)>>\ <<trust-capped "spd" 1>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(疲惫 -4)//</span>\ <<else>>\ @@color:gray;(食堂过了饭点。)@@\ <</if>>\ <<nav "Region_Friedrichshain">>\
/* 经济压力≥55:人民公园的露天厨房 */ //人民公园的空地上支起两口大锅,锅底烧的是拆下来的板条箱。队排得很长,队尾的人踮着脚往锅那边看。// //管勺的是个肩很宽的女人。她看见你,把勺往锅沿一磕:「会削土豆吗?」// //你挽起袖子坐下。土豆皮堆成两座小山。你削了四十分钟,手上全是淀粉。// //收队的时候,她舀了勺锅底最稠的给你,算工钱。你把手在裤腿上擦干净,接了。// <<inline-gate "fh_kit">>\ <<if _io_ok>>\ <<trust-capped "spd" 2>><<trust-act-note>><<rival-note-show>>\ <<set $regions.friedrichshain.stability to Math.min(100, $regions.friedrichshain.stability + 2)>>\ <span class="txt-sys">//(弗里德里希斯海因稳定 +2)//</span>\ <<else>>\ @@color:gray;(露天厨房今天收得早。)@@\ <</if>>\ <<nav "Region_Friedrichshain">>\
/* 通胀≥60:楼道里听房客算房租 */ //一栋六层楼的楼道里,几个房客围着一根煤气管站着。领头的是个戴套袖的女人,手里捏着房租单。// //「上个月八百亿,」她把单子抖开,「这个月房东开口,两万亿。」// //「他怎么不上天呢。」一个老工人说。他没提高嗓门,像在核对一道工序。// //「上天的法子有的是,」女人把单子折好,「他下个月要收美元了。他说马克留着糊墙。」// //你站在楼梯口听完了整笔账。他们没有避你——这笔账,他们正盼着有人带出去。// <<inline-gate "fh_ren">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 3 "观察" "weimar" "friedrichshain">>\ <<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger + 1))>>\ <<trust-capped "kpd" 1>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(知情者 +3 · 社会愤怒 +1)//</span>\ <<else>>\ @@color:gray;(楼道里今天没人。)@@\ <</if>>\ <<nav "Region_Friedrichshain">>\
/* 知情者≥15:左翼周刊的编辑部 */ //编辑部在一栋后院的二楼,门上钉着一块铅笔写的牌子:编辑部。楼梯间的墙上贴满过期封面,海报上一只红色的手举着铅笔。// //主编是个瘦子,袖口磨得发亮。他没寒暄,把你带来的单子读了两遍,用铅笔敲了敲桌沿。// //「这条我能登。这条你再核实一遍。」他把单子推回来,「登错了,我掉脑袋。你掉什么?」// //你没答。他也没等答案,只把一个信封推过来——不是钱,是下一期的清样。// //「看完还我。看完你就知道,我们这里什么能写,什么写了也白写。」// <<inline-gate "fh_pre">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 3 "观察" "kpd" "friedrichshain">>\ <<trust-capped "kpd" 1>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(知情者 +3)//</span>\ <<else>>\ @@color:gray;(编辑部今天赶印刷。)@@\ <</if>>\ <<nav "Region_Friedrichshain">>\
/* 常驻:大学的公开课 */ //阶梯教室半满。老教授讲1813年的解放战争,嗓音沙哑,粉笔灰落满前襟。讲到补给线断了的那一个冬天,他停下来,说:那一年饿死的平民,比阵亡的士兵多。// //台下没人记笔记。窗外的雪压着椴树的枯枝。// //下课铃响,学生收拾东西走了。教授慢慢擦黑板,擦到一半,像是自言自语:// //「下节课讲赔款的账。都带算尺来。」// <<inline-gate "ul_lec">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 2 "观察" "weimar" "linden">>\ <<set $player.mental.idealism to Math.min(100, ($player.mental.idealism || 0) + 1)>>\ <span class="txt-sys">//(知情者 +2 · 理想 +1)//</span>\ <<else>>\ @@color:gray;(今天没有公开课。)@@\ <</if>>\ <<nav "Region_UnterDenLinden">>\
/* 常驻:学生布告栏 */ //主楼的布告栏又换了一层。最上面是舞会海报,中间是书包铺的转让启事,最底下钉着一张蜡纸印的告示,油墨蹭花了:// //「大学生的荣誉——十一月九日是谁的耻辱日?」// //一个戴圆眼镜的学生站在告示前抄那行字,抄得很慢。你站了一会儿,他察觉了,把本子合上。// //「先生也是学生?」// //「不是。」// //「哦。」他把本子收进大衣里,「那您慢走。」// //他走得很规矩。石板路上留下两行湿脚印,到街口才干。// <<inline-gate "ul_stu">>\ <<if _io_ok>>\ <<tag-add "观察者" "micro" 2 "玩家行为" "weimar" "linden">>\ <<tag-add "民族主义" "micro" 2 "政治" "nsdap" "linden">>\ <span class="txt-sys">//(观察者 +2 · 民族主义 +2)//</span>\ <<else>>\ @@color:gray;(布告栏前今天没人。)@@\ <</if>>\ <<nav "Region_UnterDenLinden">>\
/* 来过两次:旧图书馆里翻和约 */ //阅览室烧着两只铁炉,座位先到先得。管理员认出你了——第二次来的人他都认得。// //你要的那册和约从书库里取出来,放在绒布垫子上。凡尔赛,1919。第231条,战争责任。你一页一页翻,纸脆,得托着底翻。// //邻座一个戴夹鼻眼镜的研究生一直在看你的书脊。散馆时他追到门口:// //「先生,您研究哪一部分?」// //「都看看。」// //「那您别把231条看太多遍,」他竖起衣领,「看多了,那些字就不在纸上了。」// //他走进雪里。// <<inline-gate "ul_lib">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 2 "观察" "weimar" "linden">>\ <<set $player.mental.idealism to Math.min(100, ($player.mental.idealism || 0) + 1)>>\ <span class="txt-sys">//(知情者 +2 · 理想 +1)//</span>\ <<else>>\ @@color:gray;(阅览室的炉子今天没生。)@@\ <</if>>\ <<nav "Region_UnterDenLinden">>\
/* 知情者≥15:街角老咖啡馆听教授们聊 */ //这家咖啡馆靠窗那桌属于几位教授,二十年了。你要了杯不加糖的,坐在能听见他们的位子。// //他们在争赔款的数字。一个说数字本身就是羞辱,一个说数字是唯一能跟外国人讲道理的东西。争到后来谁也没说服谁,两个人同时扭头看窗外,看一个报童在雪里跺脚。// //年长的那个忽然回头:「先生,您觉得呢?」// //全桌的眼睛都过来了。你还没想好怎么答,他自己先笑了,摆摆手:// //「不用答。你们这些做官的,答了也不算数。」// //他给邻座续上咖啡。争论从头再来。// <<inline-gate "ul_caf">>\ <<if _io_ok>>\ <<trust-capped "ddp" 1>><<trust-act-note>><<rival-note-show>>\ <<tag-add "知情者" "micro" 3 "观察" "ddp" "linden">>\ <span class="txt-sys">//(知情者 +3)//</span>\ <<else>>\ @@color:gray;(教授们今天不开例会。)@@\ <</if>>\ <<nav "Region_UnterDenLinden">>\
/* 民族主义≥40:学生团体的集会 */ //礼堂挤满了人,椅子不够,靠墙站了一排。台上的人讲1918年的「背刺」,讲到激动处一拳砸在讲台上,粉笔盒跳起来。// //台下有节奏地跺脚。地板在震,吊灯在震,天花板的灰往下掉。// //你站在最后一排。没人查你的证件——他们只看脸生不生。// //散场的人流把你往外推。门口一个十六七岁的少年在发油印传单,发到一半发现不够了,急得翻书包。你走出十几步回头看,他还在翻。// <<inline-gate "ul_hal">>\ <<if _io_ok>>\ <<tag-add "民族主义" "micro" 3 "政治" "nsdap" "linden">>\ <<tag-add "知情者" "micro" 2 "观察" "weimar" "linden">>\ <span class="txt-sys">//(民族主义 +3 · 知情者 +2)//</span>\ <<else>>\ @@color:gray;(礼堂今天锁着门。)@@\ <</if>>\ <<nav "Region_UnterDenLinden">>\
/* 经济压力≥55:歌剧院门口看散场 */ //散场比演出好看。包厢里的人顺着大理石台阶下来,皮草和军大衣混在一起,汽车一辆接一辆排到街口。// //台阶下站着几个穿旧制服的老兵,抬着一只木箱募捐,为阵亡战友的孤儿。包厢里出来的人绕着木箱走,皮鞋跟敲在大理石上,笃,笃,笃。// //一个戴单片眼镜的老绅士往箱子里放了一张票子,票面很新。他放钱的时候看了你一眼,认出来了——在哪里见过不重要,重要的是他冲你点了点头。// //「国家总要有人管账。」他说完就上了车。// //老兵朝车尾敬了个礼。车开远了,木箱看着还是空的。// <<inline-gate "ul_ope">>\ <<if _io_ok>>\ <<trust-capped "dvp" 1>><<trust-act-note>><<rival-note-show>>\ <<tag-add "知情者" "micro" 2 "观察" "dvp" "linden">>\ <span class="txt-sys">//(知情者 +2)//</span>\ <<else>>\ @@color:gray;(今晚没有演出。)@@\ <</if>>\ <<nav "Region_UnterDenLinden">>\
/* 常驻:军官住宅区的林荫道 */ //林荫道两边的房子一层楼只有一个窗户朝街,窗里挂着厚帘。门牌擦得很亮,信箱上只写姓氏的首字母。// //一个男人牵着两条猎犬走过,狗比你先打量你。街角停着一辆漆得很旧的汽车——漆旧了,但每天擦过的痕迹是新的。// //一个老太太在扫自家门前的台阶。你经过时她直起腰,看你走远,又接着扫。她扫得慢,但一下没少。// <<inline-gate "cb_ave">>\ <<if _io_ok>>\ <<tag-add "军队不满" "micro" 3 "军事" "军方" "charlottenburg">>\ <span class="txt-sys">//(军队不满 +3)//</span>\ <<else>>\ @@color:gray;(今天到此为止。)@@\ <</if>>\ <<nav "Region_Charlottenburg">>\
/* 常驻:技术大学门口 */ //技术大学的门口没有菩提树下大街那种排场。学生抱着图纸进出,大衣口袋里插着计算尺。公告栏上贴着航模比赛启事,和一张讲座海报:动力燃料的新路子。// //一个高年级学生蹲在台阶上焊机翼模型,松香味飘出很远。你站了一会儿,他头也不抬:// //「先生找谁?」// //「随便看看。」// //「那您看这架。」他举起来给你看,眼睛难得亮了一下,「翼展一米二。油箱在机身里。国家要是有钱,我能做成三米的。」// //他又低下头去焊。焊枪的蓝火苗在冷空气里跳。// <<inline-gate "cb_tec">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 2 "观察" "weimar" "charlottenburg">>\ <span class="txt-sys">//(知情者 +2)//</span>\ <<else>>\ @@color:gray;(台阶上今天没人。)@@\ <</if>>\ <<nav "Region_Charlottenburg">>\
/* 来过两次:军官家的下午茶 */ //请柬是手写的,字很旧派。宅子里暖气烧得足,茶具是战前的瓷器,磕了口的地方用金漆描过——补得起,也舍不得扔。// //在座的是四五位退役军官和他们的太太。话题从狗说起,经过猎场的租约,最后停在谁都绕不开的地方:和约条款下的军队。// //说话最响的那位已经老了,胡子修剪得很齐。他给你续茶的时候压低了声音:// //「先生,您在里头,替我们递一句话。军队不挑事。军队只怕一件事,怕哪天真需要它了,它已经没了。」// //他直起身,声调恢复如常,问太太们蛋糕甜不甜。// <<inline-gate "cb_tea">>\ <<if _io_ok>>\ <<trust-capped "army" 2>><<trust-act-note>><<rival-note-show>>\ <<tag-add "知情者" "micro" 2 "观察" "army" "charlottenburg">>\ <span class="txt-sys">//(知情者 +2)//</span>\ <<else>>\ @@color:gray;(这个圈子今天不待客。)@@\ <</if>>\ <<nav "Region_Charlottenburg">>\
/* 来过三次:军官太太们的客厅 */ //这间客厅的男主人,1916年留在了凡尔登。墙上的照片如今擦得比镜子亮。客厅里坐着的,都是和他太太一样的女人。// //她们说抚恤金,说十二年前的账,说今年的煤价。说得很细,细到每一张配给券。有一位说到一半站起来去添茶,背对着大家,把话讲完。// //「先生别见笑,」女主人给你续茶,「我们不打仗。我们就是记性好。」// //你走的时候,她送到台阶下。台阶扫得很干净,雪扫进了砖缝。// <<inline-gate "cb_wid">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 3 "观察" "weimar" "charlottenburg">>\ <<trust-capped "army" 1>><<trust-act-note>><<rival-note-show>>\ <span class="txt-sys">//(知情者 +3)//</span>\ <<else>>\ @@color:gray;(客厅今天落了锁。)@@\ <</if>>\ <<nav "Region_Charlottenburg">>\
/* 军方信任≥25:退役军官的牌局 */ //牌局在俱乐部后厅,四个人,一盏绿灯罩。你坐下时没人客气,也没人把你当外人。牌桌的规矩是:进了门,就是一起坐到天亮的人。// //打的是斯卡特。叫牌,抓牌,出牌,桌上只谈牌。打到第三局,对面那位老上校忽然开口,眼睛看着手里的牌:// //「先生,北边的仓库,您听说过吗?」// //你放下牌。他从牌盒底下抽出一张纸条,推过来,又收回去,快得像没有发生过。// //「没听说过,」他说,「那这局当没打。继续。」// //那晚你赢了七马克。散场握手的时候,握得比来时用力。// <<inline-gate "cb_car">>\ <<if _io_ok>>\ <<trust-capped "army" 2>><<trust-act-note>><<rival-note-show>>\ <<tag-add "知情者" "micro" 3 "观察" "army" "charlottenburg">>\ <span class="txt-sys">//(知情者 +3)//</span>\ <<else>>\ @@color:gray;(后厅的牌桌今天散得早。)@@\ <</if>>\ <<nav "Region_Charlottenburg">>\
/* 民族主义≥45:技术大学里的新徽章 */ //下课时分,你在门廊里认出了他们:三个学生,大衣翻领上别着同一枚徽章——红底,白圆,黑心,做工比街头那种绶带精致得多。// //他们站在告示栏前低声说话。周围的学生绕着走,像绕开一块刚泼过水的地。// //其中一个发现你在看,没躲。他把手插回口袋,朝你抬了抬下巴。那不是挑衅,是确认:确认你看见了,而你不打算怎么样。// //铃响了,人流把他们冲散。告示栏上那张讲座海报的角被风掀起来,又自己贴了回去。// <<inline-gate "cb_bad">>\ <<if _io_ok>>\ <<tag-add "知情者" "micro" 3 "观察" "nsdap" "charlottenburg">>\ <<tag-add "民族主义" "micro" 2 "政治" "nsdap" "charlottenburg">>\ <span class="txt-sys">//(知情者 +3 · 民族主义 +2)//</span>\ <<else>>\ @@color:gray;(门廊里今天只有风。)@@\ <</if>>\ <<nav "Region_Charlottenburg">>\
/* ════════════════════════════════════════════════════════════ 区域动态行动系统(逐级解锁) 数据在 01_init.twee 的 $region_actions。 三个 widget: - region-tier-calc:算全局进度层级 $region_tier - region-lock-pass:求值一条行动的条件数组 → _rl_ok / _rl_failed - region-action-menu:渲染某区域的行动菜单 ════════════════════════════════════════════════════════════ */ /* ---------- region-tier-calc:全局进度层级 ---------- 层级 = 1 + floor(已处理红色事件数 / 3),封顶 4。 */ <<widget "region-tier-calc">>\ <<silently>> <<set _reddone to 0>> <<if $event_log>> <<for _ei to 0; _ei lt $event_log.length; _ei++>> <<set _e to $event_log[_ei]>> <<if _e.deck_id and (_e.deck_id.indexOf("R") eq 0 or _e.deck_id.indexOf("S") eq 0)>> <<set _reddone++>> <</if>> <</for>> <</if>> <<set $region_tier to 1 + Math.floor(_reddone / 3)>> <<if $region_tier gt 4>><<set $region_tier to 4>><</if>> <</silently>>\ <</widget>> /* ---------- region-lock-pass:求值条件数组 ---------- 用法:<<region-lock-pass 区域key 条件数组>> 输出:_rl_ok(全过=true)、_rl_failed(首个未过条件,用于提示)。 条件语法见方案;支持 always / world: / stab / danger / tag: / flag: / event: / trust: / visit / tier。 */ <<widget "region-lock-pass">>\ <<silently>> <<set _rl_key to $args[0]>> <<set _rl_conds to $args[1]>> <<set _rl_ok to true>> <<set _rl_failed to "">> <<for _ci to 0; _ci lt _rl_conds.length; _ci++>> <<set _c to _rl_conds[_ci]>> <<set _cpass to false>> <<if _c eq "always">> <<set _cpass to true>> <<elseif _c.indexOf("world:") eq 0>> <<set _wm to _c.substring(6).match(/^([a-z_]+)(>=|<=|>|<|==)(\d+)$/)>> <<if _wm>> <<set _wcur to Number($world[_wm[1]])>> <<set _wval to Number(_wm[3])>> <<if _wm[2] eq ">=">><<set _cpass to _wcur >= _wval>> <<elseif _wm[2] eq "<=">><<set _cpass to _wcur <= _wval>> <<elseif _wm[2] eq ">">><<set _cpass to _wcur > _wval>> <<elseif _wm[2] eq "<">><<set _cpass to _wcur < _wval>> <<elseif _wm[2] eq "==">><<set _cpass to _wcur == _wval>><</if>> <</if>> <<elseif _c.indexOf("stab") eq 0>> <<set _sm to _c.match(/^stab(>=|<=|>|<|==)(\d+)$/)>> <<if _sm>> <<set _scur to Number($regions[_rl_key].stability)>> <<set _sval to Number(_sm[2])>> <<if _sm[1] eq ">=">><<set _cpass to _scur >= _sval>> <<elseif _sm[1] eq "<=">><<set _cpass to _scur <= _sval>> <<elseif _sm[1] eq ">">><<set _cpass to _scur > _sval>> <<elseif _sm[1] eq "<">><<set _cpass to _scur < _sval>> <<elseif _sm[1] eq "==">><<set _cpass to _scur == _sval>><</if>> <</if>> <<elseif _c.indexOf("danger") eq 0>> <<set _dm to _c.match(/^danger(>=|<=|>|<|==)(\d+)$/)>> <<if _dm>> <<set _dcur to Number($regions[_rl_key].danger)>> <<set _dval to Number(_dm[2])>> <<if _dm[1] eq ">=">><<set _cpass to _dcur >= _dval>> <<elseif _dm[1] eq "<=">><<set _cpass to _dcur <= _dval>> <<elseif _dm[1] eq ">">><<set _cpass to _dcur > _dval>> <<elseif _dm[1] eq "<">><<set _cpass to _dcur < _dval>> <<elseif _dm[1] eq "==">><<set _cpass to _dcur == _dval>><</if>> <</if>> <<elseif _c.indexOf("tag:") eq 0>> <<set _tm to _c.match(/^tag:(.+?)(>=|<=|>|<|==)(\d+)$/)>> <<if _tm>> <<set _tname to _tm[1]>> <<set _tval to Number(_tm[3])>> <<set _tcur to 0>> <<if $active_tags>> <<for _ti to 0; _ti lt $active_tags.length; _ti++>> <<if $active_tags[_ti].name eq _tname and $active_tags[_ti].intensity gt _tcur>> <<set _tcur to $active_tags[_ti].intensity>> <</if>> <</for>> <</if>> <<if _tm[2] eq ">=">><<set _cpass to _tcur >= _tval>> <<elseif _tm[2] eq "<=">><<set _cpass to _tcur <= _tval>> <<elseif _tm[2] eq ">">><<set _cpass to _tcur > _tval>> <<elseif _tm[2] eq "<">><<set _cpass to _tcur < _tval>> <<elseif _tm[2] eq "==">><<set _cpass to _tcur == _tval>><</if>> <</if>> <<elseif _c.indexOf("flag:") eq 0>> <<set _fname to _c.substring(5)>> <<if $flags and $flags[_fname]>><<set _cpass to true>><</if>> <<elseif _c.indexOf("event:") eq 0>> <<set _eid to _c.substring(6)>> <<set _cpass to false>> <<if $event_log>> <<for _ei to 0; _ei lt $event_log.length; _ei++>> <<if $event_log[_ei].deck_id eq _eid>> <<set _cpass to true>> <</if>> <</for>> <</if>> <<elseif _c.indexOf("trust:") eq 0>> <<set _pm to _c.substring(6).match(/^([a-z_]+)(>=|<=|>|<|==)(\d+)$/)>> <<if _pm>> <<set _pcur to Number($npcs[_pm[1]].trust)>> <<set _pval to Number(_pm[3])>> <<if _pm[2] eq ">=">><<set _cpass to _pcur >= _pval>> <<elseif _pm[2] eq "<=">><<set _cpass to _pcur <= _pval>> <<elseif _pm[2] eq ">">><<set _cpass to _pcur > _pval>> <<elseif _pm[2] eq "<">><<set _cpass to _pcur < _pval>> <<elseif _pm[2] eq "==">><<set _cpass to _pcur == _pval>><</if>> <</if>> <<elseif _c.indexOf("visit") eq 0>> <<set _vm to _c.match(/^visit(>=|<=|>|<|==)(\d+)$/)>> <<if _vm>> <<set _vcur to Number($regions[_rl_key].visit_count)>> <<set _vval to Number(_vm[2])>> <<if _vm[1] eq ">=">><<set _cpass to _vcur >= _vval>> <<elseif _vm[1] eq "<=">><<set _cpass to _vcur <= _vval>> <<elseif _vm[1] eq ">">><<set _cpass to _vcur > _vval>> <<elseif _vm[1] eq "<">><<set _cpass to _vcur < _vval>> <<elseif _vm[1] eq "==">><<set _cpass to _vcur == _vval>><</if>> <</if>> <<elseif _c.indexOf("tier") eq 0>> <<set _tm2 to _c.match(/^tier(>=|<=|>|<|==)(\d+)$/)>> <<if _tm2>> <<set _tcur2 to Number($region_tier)>> <<set _tval2 to Number(_tm2[2])>> <<if _tm2[1] eq ">=">><<set _cpass to _tcur2 >= _tval2>> <<elseif _tm2[1] eq "<=">><<set _cpass to _tcur2 <= _tval2>> <<elseif _tm2[1] eq ">">><<set _cpass to _tcur2 > _tval2>> <<elseif _tm2[1] eq "<">><<set _cpass to _tcur2 < _tval2>> <<elseif _tm2[1] eq "==">><<set _cpass to _tcur2 == _tval2>><</if>> <</if>> <</if>> <<if not _cpass>> <<set _rl_ok to false>> <<if _rl_failed eq "">><<set _rl_failed to _c>><</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- region-action-menu:渲染区域行动菜单 ---------- 用法:<<region-action-menu 区域key>> 已解锁行动以链接卡片列出;未解锁行动灰化(开关 $show_locked_features)。 每个已解锁行动消耗 1 TP + 2 疲惫,并受每日一次上限约束 ($flags["region_act_<id>_<session_day>"],当天已做则灰化不可点)。 【景深系统】 - 深度分级:按 $regions[key].visit_count 分四档(初来乍到/混了个脸熟/常客/这里认得你), 菜单标题旁显示档位与一句「这里怎么看你的」白描。 - 按日轮换:带 rot 字段的行动按 (session_day+rot)%3 轮空,每 3 天隐 1 天—— 连续进出地图,能做的事会变;不带 rot 的「据点行动」(党部/司令部等)永远在场。 - 每周深耕额度:tier>=2 的「深耕行动」共用每周 2 次额度 ($flags["depq_<key>_<week>"]),用完灰化、下周自动恢复。 - 当日重访:同一天反复进同一区域,会显示「你今天第 N 次走进这里」。 */ <<widget "region-action-menu">>\ <<silently>> <<set _ram_key to $args[0]>> <<region-tier-calc>> /* 景深:按到访次数分四档 */ <<set _rd_vc to Number($regions[_ram_key].visit_count) || 0>> <<if _rd_vc gte 10>> <<set _rd_name to "这里认得你">> <<set _rd_line to "你一进门,看门人就把烟掐了。有些话,只有你在场时才有人肯说。">> <<elseif _rd_vc gte 6>> <<set _rd_name to "常客">> <<set _rd_line to "你是这里的熟面孔。人们当着你说话,不再刻意压低嗓子。">> <<elseif _rd_vc gte 3>> <<set _rd_name to "混了个脸熟">> <<set _rd_line to "门房开始向你点头。有几扇门虚掩着,等你推。">> <<else>> <<set _rd_name to "初来乍到">> <<set _rd_line to "你对这条街来说还是张新面孔。先把它走熟。">> <</if>> /* 当日重访计数 */ <<set _rvis_key to "rvis_" + _ram_key + "_" + $session_day>> <<set $flags[_rvis_key] to (Number($flags[_rvis_key]) || 0) + 1>> <<set _rvis_n to $flags[_rvis_key]>> /* 本周深耕额度(tier>=2 行动共用,每周 2 次) */ <<set _depq_key to "depq_" + _ram_key + "_" + Math.floor($session_day / 7)>> <<set $flags[_depq_key] to (Number($flags[_depq_key]) || 0)>> <<set _depq_used to $flags[_depq_key]>> <<set _depq_max to 2>> /* 行动分拣(先过轮换,再过解锁条件) */ <<set _ram_avail to []>> <<set _ram_locked to []>> <<set _ram_rot_hidden to 0>> <<set _ram_deep_any to false>> <<if $region_actions and $region_actions[_ram_key]>> <<for _ai to 0; _ai lt $region_actions[_ram_key].length; _ai++>> <<set _act to $region_actions[_ram_key][_ai]>> <<set _rot_skip to false>> <<if Object.keys(_act).indexOf("rot") neq -1>> <<if (($session_day + Number(_act.rot)) % 3) eq 2>> <<set _rot_skip to true>> <<set _ram_rot_hidden to _ram_rot_hidden + 1>> <</if>> <</if>> <<if not _rot_skip>> <<if _act.tier gte 2>><<set _ram_deep_any to true>><</if>> <<region-lock-pass _ram_key _act.cond>> <<if _rl_ok>> <<set _ram_avail.push(_act)>> <<else>> <<set _ram_locked.push(_act)>> <</if>> <</if>> <</for>> <</if>> <<set _ram_count to 0>> <<if $region_actions and $region_actions[_ram_key]>><<set _ram_count to $region_actions[_ram_key].length>><</if>> <<set _pty_cn to {spd:"SPD",kpd:"KPD",ddp:"DDP",dvp:"DVP",zentrum:"Zentrum",dnvp:"DNVP",nsdap:"NSDAP",army:"军方",police:"红堡"}>> <</silently>>\ <<if _ram_count gt 0>>\ <div class="region-menu">\ <details open>\ <summary class="rm-title">''此地能做的事''(_ram_avail.length)<span class="rm-depth">· 景深:_rd_name</span></summary>\ <span class="rm-hint">_rd_line</span>\ <<if _ram_deep_any>>\ <span class="rm-hint">深耕行动每周限 _depq_max 次 · 本周已用 _depq_used 次</span>\ <</if>>\ <<if _rvis_n gte 2>>\ <span class="rm-hint">(你今天第 _rvis_n 次走进这里。)</span>\ <</if>>\ <<if _ram_avail.length gt 0>>\ <<if $tp lt 1>>\ /* 行动力不足:整组锁死(V0.9 拦截) */ <div class="rm-action rm-locked">\ <span class="rm-action-label">今天的力气只够站着了</span>\ <span class="rm-hint">(这里的事每件要 1 点行动力,你一点不剩。回去休息,或先回办公室。)</span>\ </div>\ <<else>>\ <<for _ri to 0; _ri lt _ram_avail.length; _ri++>>\ <<set _actv to _ram_avail[_ri]>>\ <<set _done to false>>\ <<silently>><<if $flags and $flags["region_act_" + _actv.id + "_" + $session_day]>><<set _done to true>><</if>><</silently>>\ <<set _depq_full to false>>\ <<silently>><<if _actv.tier gte 2 and _depq_used gte _depq_max>><<set _depq_full to true>><</if>><</silently>>\ <<if _done>>\ <div class="rm-action rm-locked">\ <span class="rm-action-label">_actv.label</span>\ <span class="rm-hint">(今日已做过 · 消耗1 TP)</span>\ </div>\ <<elseif _depq_full>>\ <div class="rm-action rm-locked">\ <span class="rm-action-label">_actv.label</span>\ <span class="rm-hint">(本周深耕额度已用完 _depq_used/_depq_max · 下周恢复)</span>\ </div>\ <<else>>\ <div class="rm-action">\ <<capture _actv>>\ <<set _ria_passage to _actv.passage>>\ <<set _ria_id to _actv.id>>\ <<set _ria_depq to "">>\ <<silently>><<if _actv.tier gte 2>><<set _ria_depq to _depq_key>><</if>><</silently>>\ <<link "_actv.label" _ria_passage>><<tp-spend 1 2>><<set $flags["region_act_" + _ria_id + "_" + $session_day] to true>><<if _ria_depq neq "">><<set $flags[_ria_depq] to (Number($flags[_ria_depq]) || 0) + 1>><</if>><</link>>\ <</capture>>\ <<if _actv.hint neq "">>\ <span class="rm-hint">_actv.hint · 消耗1 TP</span>\ <</if>>\ <<if _actv.gain and _actv.gain.party and _actv.gain.amount gt 0>>\ <<affinity-party-blocked _actv.gain.party _actv.gain.amount>>\ <<if $apb_blocked>>\ <span class="rm-hint">(_pty_cn[_actv.gain.party]信任额度已尽 · 无收益)</span>\ <</if>>\ <</if>>\ </div>\ <</if>>\ <</for>>\ <</if>>\ <</if>>\ <<if _ram_rot_hidden gt 0>>\ <span class="rm-hint">(今天有些面孔不在。隔两天再来,这条街会换一副样子。)</span>\ <</if>>\ </details>\ <<if _ram_locked.length gt 0>>\ <details>\ <summary class="rm-title rm-locked-title">尚未开放(_ram_locked.length)</summary>\ <span class="rm-hint">(解锁相关事件后会展开该部分内容)</span>\ <<for _li to 0; _li lt _ram_locked.length; _li++>>\ <<set _actl to _ram_locked[_li]>>\ <div class="rm-action rm-locked">\ <span class="rm-action-label">_actl.label</span>\ <<if _actl.lock_hint neq "">>\ <span class="rm-hint">点击不可用 · _actl.lock_hint</span>\ <</if>>\ </div>\ <</for>>\ </details>\ <</if>>\ </div>\ <</if>>\ <</widget>> /* ---------- region-status:地图上的区域状态条 ---------- 用法:<<region-status 区域key>> 在已解锁区域行下方渲染「稳定度 / 危险度」两条彩色进度条, 复用柏林手记的 tc- 色阶:稳定度越高越绿、危险度越高越红。 */ <<widget "region-status">>\ <<silently>> <<set _rs_key to $args[0]>>\ <<set _rs_r to $regions[_rs_key]>>\ <<set _rs_stab to Math.round(Number(_rs_r.stability))>>\ <<set _rs_danger to Math.round(Number(_rs_r.danger))>>\ /* 稳定度档位 0-6:越高越绿 */ <<set _rs_si to Math.round(_rs_stab / 100 * 6)>>\ <<if _rs_si gt 6>><<set _rs_si to 6>><</if>>\ <<if _rs_si lt 0>><<set _rs_si to 0>><</if>>\ <<set _rs_s_fill to "tc-" + _rs_si + "-bg">>\ <<set _rs_s_txt to "tc-" + _rs_si>>\ <<set _rs_s_w to _rs_stab + "%">>\ /* 危险度档位 0-6:越高越红(色阶反向) */ <<set _rs_di to 6 - Math.round(_rs_danger / 100 * 6)>>\ <<if _rs_di gt 6>><<set _rs_di to 6>><</if>>\ <<if _rs_di lt 0>><<set _rs_di to 0>><</if>>\ <<set _rs_d_fill to "tc-" + _rs_di + "-bg">>\ <<set _rs_d_txt to "tc-" + _rs_di>>\ <<set _rs_d_w to _rs_danger + "%">>\ <</silently>>\ <div class="rmap-status">\ <<print '<span class="rmap-sb-row"><span class="rmap-sb-label">稳定</span><span class="rmap-sb-bar"><span class="rmap-sb-fill ' + _rs_s_fill + '" style="width:' + _rs_s_w + '"></span></span><b class="rmap-sb-val ' + _rs_s_txt + '">' + _rs_stab + '</b></span>'>>\ <<print '<span class="rmap-sb-row"><span class="rmap-sb-label">危险</span><span class="rmap-sb-bar"><span class="rmap-sb-fill ' + _rs_d_fill + '" style="width:' + _rs_d_w + '"></span></span><b class="rmap-sb-val ' + _rs_d_txt + '">' + _rs_danger + '</b></span>'>>\ </div>\ <</widget>> /* ---------- site-expiry-check:现场时限检查 ---------- 用法:<<site-expiry-check>>(在 daily-tick 里每日调用) 遍历所有区域,对超过 deadline_day 的现场做"消极处理": - 清除现场标记(active_event 置 null) - 施加负面后果(难民现场:社会愤怒+3 / 政府信任-3 / 民族主义+2) - 记录到 $site_neglect_log(当天新增超时,供次日晨报提示玩家代价) 消极处理一次即止,不重复触发。 注意:daily-tick 每天会先清空 $site_neglect_log,再调用本事件。 */ <<widget "site-expiry-check">>\ <<silently>> <<set _site_neglected to []>>\ <<set _sek_keys to Object.keys($regions)>>\ <<for _sek_i to 0; _sek_i lt _sek_keys.length; _sek_i++>>\ <<set _sek to _sek_keys[_sek_i]>>\ <<set _se_a to $regions[_sek].active_event>>\ <<if _se_a and $session_day gt _se_a.deadline_day>>\ <<set _se_name to $regions[_sek].name>>\ <<if _se_a.kind eq "refugee">>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 3)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 3)>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 2)>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你把「" + _se_name + "」的那批难民晾太久了。救济一拖再拖,愤怒在粥桶边慢慢攒起来--你失信的样子,比法国人更让柏林寒心。", cost: "社会愤怒+3 · 政府信任-3 · 民族主义+2" })>>\ <<elseif _se_a.kind eq "labor">>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 4)>>\ <<set $world.revolution to Math.min(100, $world.revolution + 3)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 3)>>\ <<set $npcs.spd.trust to Math.max(0, Math.min(100, $npcs.spd.trust - 3))>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "占领工厂的工人等了你三天。门上的红旗没有降,反而更多了--他们把你晾着他们的样子,当成了共和国本来的样子。欠薪的账,变成了占领的账。", cost: "社会愤怒+4 · 革命压力+3 · 政府信任-3 · SPD信任-3" })>>\ <<elseif _se_a.kind eq "market">>\ <<set $world.inflation to Math.min(100, $world.inflation + 4)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 3)>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "黑市的贩子没等到你,胆子更大了。选帝侯大街的汇率每天都在涨,你答应过的整顿,成了这条街最大的一个笑话。", cost: "通胀+4 · 政府信任-3" })>>\ <<elseif _se_a.kind eq "military">>\ <<set $npcs.army.trust to Math.max(0, Math.min(100, $npcs.army.trust + 3))>>\ <<set $world.army_influence to Math.min(100, $world.army_influence + 3)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 2)>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "军官们等了你好几天,没等到你。他们把你的沉默当成了默许--那张地图又在桌角摊开了一次,这一次,没有你挡在他们和选择之间。", cost: "军方信任+3 · 军方影响+3 · 政府信任-2" })>>\ <<elseif _se_a.kind eq "food">>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 4)>>\ <<set $world.political_violence to Math.min(100, $world.political_violence + 3)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 3)>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你答应调拨的救济粮一直没到。弗里德里希斯海因的粮店又被砸了一次,这一次没人再喊话,直接动手。饿着肚子的人,没有耐心听你解释。", cost: "社会愤怒+4 · 政治暴力+3 · 政府信任-3" })>>\ <<elseif _se_a.kind eq "strike">>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 5)>>\ <<set $world.revolution to Math.min(100, $world.revolution + 4)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 4)>>\ <<set $npcs.spd.trust to Math.max(0, Math.min(100, $npcs.spd.trust - 4))>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你答应去广场,却一直没有出现。罢工的人在寒风中等到天黑,没有人带来协议,也没有人带走火气。第二天,克鲁伊茨贝格的街垒多了三道--你失约的代价,正在变成街垒的砖。", cost: "社会愤怒+5 · 革命压力+4 · 政府信任-4 · SPD信任-4" })>>\ <<elseif _se_a.kind eq "veteran">>\ <<set $npcs.army.trust to Math.max(0, Math.min(100, $npcs.army.trust - 4))>>\ <<set $world.political_violence to Math.min(100, $world.political_violence + 3)>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 3)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 3)>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "老兵在市政厅台阶上等了你几天,没等到你。他们最终自己散了--但散之前,有人在墙上用白漆写下一行字:共和国欠我们的,什么时候还?那行字后来被擦了,可擦不掉的是老兵转头看向佩枪军官的眼神。", cost: "军方信任-4 · 政治暴力+3 · 民族主义+3 · 政府信任-3" })>>\ <<elseif _se_a.kind eq "housing">>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 4)>>\ <<set $world.political_violence to Math.min(100, $world.political_violence + 3)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 3)>>\ <<set $npcs.spd.trust to Math.max(0, Math.min(100, $npcs.spd.trust - 3))>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你答应去看危楼,却一直没去。危楼里的人在雨里等了一夜,等来的是又一场漏雨。有人把纸牌换成了砖头--你欠他们的屋顶,正在变成堵在街口的愤怒。", cost: "社会愤怒+4 · 政治暴力+3 · 政府信任-3 · SPD信任-3" })>>\ <<elseif _se_a.kind eq "refugeeflow">>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 4)>>\ <<set $world.intl_trust to Math.max(0, $world.intl_trust - 3)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 3)>>\ <<set $npcs.zentrum.trust to Math.max(0, Math.min(100, $npcs.zentrum.trust - 3))>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你答应扩充收容,却没有来。车站的难民在过道里挤了一夜,婴儿的哭声在铁架下回荡。护士看着空等的一切,没有再打电话给你--她开始自己安排,也把对政府的指望,从名单上划掉了。", cost: "社会愤怒+4 · 国际信任-3 · 政府信任-3 · Zentrum信任-3" })>>\ <<elseif _se_a.kind eq "university">>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 3)>>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 3)>>\ <<set $npcs.ddp.trust to Math.max(0, Math.min(100, $npcs.ddp.trust - 3))>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你答应去大学,却一直没有出现。学生们在寒风中等到天黑,那只举着课本的手慢慢放了下来。他们没等到你的承诺,只等到了失望--而失望,比愤怒更容易生根。第二天,地下刊物把这件事印在了更多年轻人手里。", cost: "政府信任-3 · 社会愤怒+3 · DDP信任-3" })>>\ <<elseif _se_a.kind eq "epidemic">>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 5)>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 4)>>\ <<set $world.inflation to Math.min(100, $world.inflation + 2)>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你答应处理疫情,却没有来。病菌没等任何人,顺着管道蔓延到了另一个工人区。隔离线外的人开始自己想办法--消毒水黑市成了一门生意,而你失约的消息,让每一个发烧的人都觉得被共和国抛下了。", cost: "社会愤怒+5 · 政府信任-4 · 通胀+2" })>>\ <<elseif _se_a.kind eq "justice">>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 4)>>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 3)>>\ <<set $npcs.spd.trust to Math.max(0, Math.min(100, $npcs.spd.trust - 3))>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你答应去法院,却一直没有出现。法官如期宣判。那个攥着合影的女人在广场上站到天黑,最后把照片收进怀里,转身走了。你错过的不仅是一场审判,是共和国一次自证清的机会--而它再也没有回来。", cost: "政府信任-4 · 社会愤怒+3 · SPD信任-3" })>>\ <<elseif _se_a.kind eq "culture">>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 2)>>\ <<set $npcs.ddp.trust to Math.max(0, Math.min(100, $npcs.ddp.trust - 2))>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 2)>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "你答应去画廊,却一直没出现。右翼的吵闹没有平息,画展最终还是撤了。那个年轻画家收画时,没有等你,也没有再抬头看门口。你错过的不是一场展览,是柏林愿意为「不同」亮起的那盏灯。", cost: "政府信任-2 · DDP信任-2 · 民族主义+2" })>>\ <<else>>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 2)>>\ <<set _site_neglected.push({ name: _se_name, title: _se_a.title, text: "「" + _se_name + "」的那件事,你一直没去。它自己烂掉了,像一道没人处理的伤口。", cost: "政府信任-2" })>>\ <</if>>\ <<set $regions[_sek].active_event to null>>\ <<site-pending-clear _se_a.ev_id>>\ <</if>>\ <</for>>\ <<if _site_neglected.length gt 0>>\ <<if not $site_neglect_log>><<set $site_neglect_log to []>><</if>>\ <<for _snl to 0; _snl lt _site_neglected.length; _snl++>>\ <<set $site_neglect_log.push(_site_neglected[_snl])>>\ <</for>>\ <<if not $last_event_roll>><<set $last_event_roll to []>><</if>>\ <<set $last_event_roll.push("⚠ 现场消极处理:" + _site_neglected.length + "件")>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- site-pending-clear:清除现场对应的待处理文件 ---------- 用法:<<site-pending-clear 事件id>> 当现场被处理(或超时)后,把 pending_events 里对应 site_pending 的文件移除, 使文件栏不再显示"已选去现场"的残留条目。 */ <<widget "site-pending-clear">>\ <<silently>> <<set _spc_id to $args[0]>>\ <<if _spc_id neq "">>\ <<set _spc_new to []>>\ <<for _spc_i to 0; _spc_i lt $pending_events.length; _spc_i++>>\ <<set _spc_e to $pending_events[_spc_i]>>\ <<if not (_spc_e.site_pending and _spc_e.event_id eq _spc_id)>>\ <<set _spc_new.push(_spc_e)>>\ <</if>>\ <</for>>\ <<set $pending_events to _spc_new>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- event-log-fu:轻量结算后续事件(入日志并移出待办) ---------- 用法:<<event-log-fu 索引>> 用于 followup 现场场景:把 pending_events 里对应索引的事件标记为 resolved, 移入 event_log,并从 pending 移除。不产标签/遗产(长线余波不重复发牌)。 */ <<widget "event-log-fu">>\ <<silently>> <<set _elf_idx to Number($args[0])>>\ <<if $pending_events[_elf_idx]>>\ <<set _elf_ev to $pending_events[_elf_idx]>>\ <<set _elf_ev.status to "resolved">>\ <<set _elf_ev.resolved_date to { year: $date.year, month: $date.month, day: $date.day }>>\ <<set $event_log to $event_log.concat([_elf_ev])>>\ <<set _tmp_newpending to []>>\ <<for _j to 0; _j lt $pending_events.length; _j++>>\ <<if _j neq _elf_idx>>\ <<set _tmp_newpending.push($pending_events[_j])>>\ <</if>>\ <</for>>\ <<set $pending_events to _tmp_newpending>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- site-followup-add:登记一个延迟后续事件(长线现场链) ---------- 用法:<<site-followup-add 事件标题 事件描述 延迟天数 后续kind 场景段落 [来源标注] [covert]>> 在某个现场被处理(或文件栏决策)后调用,登记一个将在 N 天后进入文件栏的后续事件。 登记 后该事件自动出现在长线记事本的「待约」区,玩家可见回访倒计时。 隐藏登记:第7参数 covert=true → 不显示当场提示、不进待约区(剧情保密的回访, 如对手不会事先让你察觉的动作);到期照常进文件栏。 delayed 类回访的 fb_data 引用经全局中转变量 $fu_src_fb 传入(widget 参数无法传对象)。 */ <<widget "site-followup-add">>\ <<silently>> <<set _sfa_title to $args[0]>>\ <<set _sfa_desc to $args[1]>>\ <<set _sfa_delay to $args[2] ? $args[2] : 5>>\ <<set _sfa_kind to $args[3] ? $args[3] : "generic">>\ <<set _sfa_passage to $args[4] ? $args[4] : "Followup_Generic">>\ <<set _sfa_src to $args[5] ? $args[5] : "">>\ <<set _sfa_covert to $args.length gt 6 and $args[6] eq true>>\ <<set $site_followups.push({ due_day: $session_day + _sfa_delay, title: _sfa_title, description: _sfa_desc, kind: _sfa_kind, passage: _sfa_passage, created_day: $session_day, src: _sfa_src, covert: _sfa_covert, chosen: ($fu_src_action ? $fu_src_action : ""), src_fb: ($fu_src_fb ? $fu_src_fb : null) })>> <<set $fu_src_fb to null>>\ <<set $fu_src_action to null>>\ <</silently>>\ <<if not _sfa_covert>>\ <span class="fu-notice">✒ 这件事没有就此了结——「_sfa_title」已记在你的本子上,约 _sfa_delay 天后会回到你的案头。</span>\ <</if>>\ <</widget>> /* ---------- site-followup-check:检查到期的后续事件并推入文件栏 ---------- 用法:<<site-followup-check>>(在 daily-tick 里每日调用) 把 due_day ≤ 当前天 的后续事件推入 pending_events,并从队列移除。 后续事件为独立场景(followup_passage),由 File_Event 渲染入口。 */ <<widget "site-followup-check">>\ <<silently>> <<set _sfc_remaining to []>>\ <<for _sfc_i to 0; _sfc_i lt $site_followups.length; _sfc_i++>>\ <<set _sfc_f to $site_followups[_sfc_i]>>\ <<if _sfc_f.due_day lte $session_day>>\ <<set $event_counter to $event_counter + 1>>\ <<set _sfc_passage to _sfc_f.passage ? _sfc_f.passage : "Followup_Generic">>\ /* delayed 类回访:src 存原事件 deck_id + 原 stage_id,供回访页找回 fb_data 与阶段 */ <<set _sfc_new_ev to { event_id: "EV_" + $event_counter, deck_id: "FU_" + _sfc_f.kind, source: "followup", lifecycle: "phase", irreversible: 2, intensity: 25, related_tag: "现场余波", tag: "现场余波", title: _sfc_f.title, description: _sfc_f.description, template: "followup", followup_passage: _sfc_passage, born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending", src: _sfc_f.src, fu_chosen: (_sfc_f.chosen ? _sfc_f.chosen : "") }>> <<if _sfc_f.kind eq "delayed" and _sfc_f.src_fb>>\ <<set _sfc_new_ev.fb_data to _sfc_f.src_fb>>\ /* 大事链继承:原事件是 major(如《密使的第二封信》),回访卡升到 3—— 置顶+「后果深远」徽章,且托管/冷处理/裁剪一律不碰(is-major-ev 认 fb_data.major) */ <<if _sfc_f.src_fb.major>><<set _sfc_new_ev.irreversible to 3>><</if>>\ <</if>>\ <<set $pending_events.push(_sfc_new_ev)>>\ <<if not $last_event_roll>><<set $last_event_roll to []>><</if>>\ <<set $last_event_roll.push("📬 后续:" + _sfc_f.title)>>\ <<else>>\ <<set _sfc_remaining.push(_sfc_f)>>\ <</if>>\ <</for>>\ <<set $site_followups to _sfc_remaining>>\ <</silently>>\ <</widget>> /* ---------- site-window-render:通用特殊事件·任务窗口 ---------- 用法:<<site-window-render 区域key>> 在区域页标题正下方调用。若该区域有 active_event 现场待办, 渲染一个醒目的任务窗口(含事件专属演绎 + 兑现/搁置选项 + 剩余时限)。 无现场则输出空(不显示任何内容)。 目前支持 kind:"refugee";后续新现场在此扩展。 */ <<widget "site-window-render">>\ <<silently>> <<if not $site_done>><<set $site_done to {}>><</if>>\ <<set _swr_key to $args[0]>>\ <<set $site_key to _swr_key>> /* 现场上下文·用故事变量持久化,供选项链接回调安全引用 */ <<set _swr_ev to ($regions[_swr_key] and $regions[_swr_key].active_event) ? $regions[_swr_key].active_event : null>>\ <<set $site_ev_id to (_swr_ev ? _swr_ev.ev_id : "")>>\ <<set _swr_kind to (_swr_ev ? _swr_ev.kind : "")>>\ <<set _swr_days to (_swr_ev ? _swr_ev.deadline_day - $session_day : 0)>>\ <</silently>>\ <<if _swr_ev>>\ <div class="site-window"> <span class="site-window-title">⚠ 特殊事件 · 你答应过的事 <<if _swr_days gte 0>><span class="site-window-deadline">剩 _swr_days 天</span>\ <<else>><span class="site-window-deadline site-window-deadline-urgent">已超时</span><</if>> </span> <div id="site_block"> <<if _swr_kind eq "refugee">>\ <div class="site-window-body"> //候车大厅的拱顶下,你以为在文件里处理完的那件事,正以另一种面目等着你。红十字的粥桶空了,一个护士蹲在桶边,用勺子在桶底刮出最后一点点米粒。// //一个老人把你的袖口攥住了。他的手很轻,像怕弄脏你。// //「上次来的那个……说会给我们一口吃的。」他说,「你认识他吗?」// //你认得。你记得自己答应过什么。// </div> <div class="site-window-options"> <<link "兑现承诺,发放定期救济">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人把救济的名单核了一遍,把桶重新填满。领到粥的人没有欢呼,只是安静地排着队--沉默比欢呼更重。//</span> <<silently><<set _cp_id to "">><<for _ci to 0; _ci lt $promise_ledger.length; _ci++>><<if $promise_ledger[_ci].target eq "civil" and $promise_ledger[_ci].status eq "open">><<set _cp_id to $promise_ledger[_ci].id>><<set _ci to $promise_ledger.length>><</if>><</for>><<if _cp_id neq "">><<promise-fulfill _cp_id>><<set _fulfilled to true>><</if>><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<if _fulfilled>><br><span style="color:#6a8a5a;">(承诺已兑现,写进欠条簿 → 国会可升华成践诺案)</span><</if>> <<tag-add "政府信誉" "micro" 5 "政治" "weimar" _swr_key>><<set $active_tags to $ret>> <br><span style="color:#8a8a8a;">(政府信誉+5)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:一笔定期救济的口粮账</span>\ <<link "先看看,不急着兑现">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你站在人群边缘,看着他们排队。你终究没有开口。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <br><span style="color:#8a8a8a;">(你把承诺留在了欠条簿上)</span> <</nobr>><</replace>>\ <</link>>\ <span class="site-cost">或需:不动开销,但失约记在心底</span> </div> <<elseif _swr_kind eq "labor">>\ /* 工人占领工厂 · 克罗伊茨贝格 */ <div class="site-window-body"> //工厂的铁门被从里面焊上了。围墙上挂了红旗,窗口露出几张年轻的脸,都不是来谈判的表情。// //一个中年男人隔着铁栅栏朝你喊://「工资拖了三个月了!今天不给个说法,这厂子就是我们的!」 //他身后的人群没有附和,只是静静地看着你。那种安静,比喊声更难对付。// //你答应过结清工资。那张欠条,此刻就焊在铁门后面。// </div> <div class="site-window-options"> <<link "亲自进厂谈判,现场结清欠薪">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你从侧门走进去的时候,人群让开了一条路。你站在车床之间,把一张支票放在一台没通电的机器上。//工人没有欢呼,只是有人把红旗收了半截。// //你走出大门,身后传来一声低沉的呜咽--是机器,也是人。//</span> <<silently><<set _cp_id to "">><<for _ci to 0; _ci lt $promise_ledger.length; _ci++>><<if $promise_ledger[_ci].target eq "worker" and $promise_ledger[_ci].status eq "open">><<set _cp_id to $promise_ledger[_ci].id>><<set _ci to $promise_ledger.length>><</if>><</for>><<if _cp_id neq "">><<promise-fulfill _cp_id>><<set _fulfilled to true>><</if>><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<if _fulfilled>><br><span style="color:#6a8a5a;">(承诺已兑现,写进欠条簿 → 国会可升华成践诺案)</span><</if>> <<apply-red-fx {spd:4, kpd:1, social_anger:-4, gov_trust:3, economy:3, fatigue:3} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:当场掏空一笔欠薪账</span>\ <<link "强令清场,恢复生产秩序">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你调来一队警察,隔着铁门喊话。没人动手,但红旗在铁门后抖了抖。// //门终于开了,工人一个个走出来,经过你身边时没人看你。你懂的:他们记住了这张脸。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:3, gov_trust:1, social_anger:5, political_violence:3, spd:-3, kpd:-2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:调警与民心之间的一道裂口</span>\ <<link "扶持工会上桌,把占领变成谈判">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你通过工会递了一张字条进去:与其占着没电的机器,不如占着谈判桌。// //门口的红旗收了,但窗口探出的脸变了表情--他们在商量。你给的,是一条能走的路。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {kpd:4, spd:3, social_anger:-3, revolution:2, gov_trust:-1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:给工会一张上桌的椅子</span>\ <<link "只答应一半,先稳住再说">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你隔着铁门,只说愿意先结一个月。人群骚动了一下,又被你身后警察的身影压住。// //你转身离开时,听见门后有人低声说://「他还会回来的。」你没法确定那是威胁,还是承诺。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {spd:2, social_anger:2, gov_trust:-2, fatigue:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>>\ <span class="site-cost">或需:先掏一半,余账悬着</span> </div> <<elseif _swr_kind eq "market">>\ /* 黑市投机 · 选帝侯大街 */ <div class="site-window-body"> //霓虹灯下,一个穿长风衣的男人朝你压低了声音://「先生,美元,要吗?」 //他的衣领里别着一张叠好的纸,上面是几串黑市叉不过的汇率。你认出了他--文件里那个「外汇贩子」,此刻就站在你面前,像一尾滑手的鱼。// //他以为你是来买卖的。你答应过整顿黑市。现在,这条街也知道你答应过。// </div> <div class="site-window-options"> <<link "当场拿下头目,查抄黑市">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你一个眼色,便衣从人群里贴了上来。贩子没来得及收纸,就被摁住了。霓虹灯闪了一下,像替这条街闭了一次眼。// //围观的人没有散,他们把这一幕记进了明天的汇率里。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {gov_trust:4, insider:3, inflation:-3, dvp:-2, economy:-2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:一场雷厉风行的清查</span>\ <<link "记下名单,暗中留着当情报">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你装作谈生意,把那张纸上的数字记进了心里,又记下了他的脸。他走的时候还在笑,以为今晚又谈成一单。// //你收好记忆。有些线,放得越长,越能钓上大鱼。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {insider:5, dvp:1} $site_key>> <br><span style="color:#8a8a8a;">(知情者+5 · DVP信任+1)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:不动声色,留着长线</span>\ <<link "借他的网,反查背后的金主">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你没有碰他,反而递过去一支烟,套出了他背后收马克的人。水越来越浑,但你摸到了底。// //他临走时低声说://「先生,你比那些只查街面的人,麻烦得多。」这是今晚最值钱的一句奉承。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {insider:4, gov_trust:1, inflation:1, dvp:-1} $site_key>> <br><span style="color:#8a8a8a;">(知情者+4 · 政府信任+1 · 通胀+1)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:把水搅浑,也把自己卷深</span>\ <<link "睁一只眼闭一只眼,放他走">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让开一步。他愣了一下,随即会意地点点头,消失在霓虹灯影里。// //你告诉自己这是「留着有用」。可你知道,这条街今晚少了一个被查的人,多了一个看穿你的人。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {insider:1, inflation:3, gov_trust:-3, dvp:2} $site_key>> <br><span style="color:#8a8a8a;">(知情者+1 · 通胀+3 · 政府信任-3 · DVP信任+2)</span> <</nobr>><</replace>>\ <</link>>\ <span class="site-cost">或需:今日网开一面,来日自会算账</span> </div> <<elseif _swr_kind eq "military">>\ /* 军方密谋 · 蒂尔加滕 */ <div class="site-window-body"> //军官俱乐部的偏厅里,几杯威士忌没动,桌角却压着一张地图。你进去时,声音戛然而止。// //一个上校把地图不紧不慢地卷起来://「总理先生,稀客。」 //他请你坐下,却没人给你倒酒。他们看你的眼神,像看一件还没定价的货物。你答应过要「看住他们」。现在,你正坐在他们摆开的棋盘上。// </div> <div class="site-window-options"> <<link "当面敲打,点破他们的密谋">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你端起那杯没人碰的威士忌,看着地图刚卷起的一角说://「共和国看着你们,和我一样清楚。」 //房间里安静得能听见冰块融化。上校重新倒了一杯酒,递给你--这一次,是平辈的敬酒,也是警告。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:-3, gov_trust:2, insider:3, political_violence:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:一句话结下一道梁子</span>\ <<link "拉拢他们,把密谋变成效忠">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你顺着他们的骄傲往下接话,许诺军费和「秩序优先」。地图重新摊开了--这一次,他们愿意让你看。// //你离开时,上校送出门外,语气恭敬了些。可你心里清楚:你买来的不是忠诚,是暂时不拆台。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:4, gov_trust:-1, political_violence:2, army_influence:3} $site_key>> <br><span style="color:#8a8a8a;">(军方信任+4 · 政府信任-1 · 政治暴力+2 · 军方影响+3)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:用许诺换一时不拆台</span>\ <<link "装作没看见,暗中记下人头">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你喝下那杯酒,聊了几句天气,然后起身告辞。身后众人都松了一口气--他们以为你什么都没看见。// //回来的路上,你在马车里写下一个个名字。没看见的那一面,才是看得最清楚的一面。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {insider:5, army:1, political_violence:1} $site_key>> <br><span style="color:#8a8a8a;">(知情者+5 · 军方信任+1 · 政治暴力+1)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:把忌恨写进不带字的账本</span>\ <<link "当场翻脸,把桌子掀了">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你把酒杯重重放下,看着上校的眼睛://「这张地图,我记住了。你们最好也记住,谁在替共和国看门。」 //你转身离去,身后传来关门的重响。你没回头。有些梁子,从今晚开始结下了。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:-5, gov_trust:3, political_violence:3, insider:2} $site_key>> <br><span style="color:#8a8a8a;">(军方信任-5 · 政府信任+3 · 政治暴力+3 · 知情者+2)</span> <</nobr>><</replace>>\ <</link>>\ <span class="site-cost">或需:彻彻底底撕破脸</span> </div> <<elseif _swr_kind eq "food">>\ /* 抢粮事件 · 弗里德里希斯海因 */ <div class="site-window-body"> //粮店的木板门被撞开了一半,地上滚着几袋被扯破的面粉。围过来的不是暴徒,是饿急了的人。他们手里攥着空粮袋,眼神比木板门更破。// //一个老人站在门口,声音发抖却很大://「你们库里堆着粮,我们锅里空着!这像话吗!」 //你答应过调拨救济粮。此刻,那些没到位的粮食,就夹在你和这群人之间。// </div> <div class="site-window-options"> <<link "当场调拨军粮,先救急">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人从军需库调来一批粮,当街开袋分下去。人群安静下来,排队领粮,像候鸟落回地面。// //老人接过一袋粮,没道谢,只说://「早该这样了。」你分不清那是责备,还是终于肯信你一回。//</span> <<silently><<set _cp_id to "">><<for _ci to 0; _ci lt $promise_ledger.length; _ci++>><<if $promise_ledger[_ci].target eq "civil" and $promise_ledger[_ci].status eq "open">><<set _cp_id to $promise_ledger[_ci].id>><<set _ci to $promise_ledger.length>><</if>><</for>><<if _cp_id neq "">><<promise-fulfill _cp_id>><<set _fulfilled to true>><</if>><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<if _fulfilled>><br><span style="color:#6a8a5a;">(承诺已兑现,写进欠条簿 → 国会可升华成践诺案)</span><</if>> <<apply-red-fx {spd:3, zentrum:2, social_anger:-4, gov_trust:4, economy:2, army:-1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:动用军需,少了一分安心</span>\ <<link "调警察镇压,保粮库">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//警察列队过来,人群被推着往后退,空粮袋落了一地。粮库的门重新关上了,关得很响。// //你听见人群里有孩子哭了一声,立刻被大人捂住了嘴。那声哭,比任何口号都让你睡不着。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:2, gov_trust:1, social_anger:5, political_violence:3, spd:-3, kpd:-2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:用枪杆子护住粮仓</span>\ <<link "现场记下名单,承诺配给制">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你没有开库,也没有赶人。你站在被撞破的门前,说:配给制,会有的,粮会有的,但得慢慢来。// //人群半信半疑。有人放下了粮袋,有人还攥着。你记下了他们的脸--这是你欠他们的,也是他们欠你的一句信任。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {gov_trust:2, social_anger:-2, insider:2, zentrum:2, economy:1} $site_key>> <br><span style="color:#8a8a8a;">(政府信任+2 · 社会愤怒-2 · 知情者+2 · Zentrum信任+2)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:许下一张还没落地的饼</span>\ <<link "只抓挑头的,其余遣散">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让警察只揪出喊得最响的几个,其余人散开。粮库保住了,人群也散了,像水退去。// //可你心里清楚:水退下去,不是没水了,是还憋着劲。下次涨潮,会更高。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {gov_trust:2, social_anger:2, political_violence:1, spd:-1} $site_key>> <br><span style="color:#8a8a8a;">(政府信任+2 · 社会愤怒+2 · 政治暴力+1 · SPD信任-1)</span> <</nobr>><</replace>>\ <</link>>\ <span class="site-cost">或需:压住这一次的水花</span> </div> <<elseif _swr_kind eq "strike">>\ /* 工人总罢工 · 克罗伊茨贝格(文件栏 UE_03 去现场) */ <div class="site-window-body"> //你走下马车时,广场上已经站满了人。没有一面旗是倒的,也没有一个人喊口号--他们只是站着,像一面沉默的墙。// //罢工委员会的人从人墙里走出来,他认出了你,没有让路://「你来了。文件上签了字,可我们没看见钱,也没看见车间的机器转起来。」 //他身后,工人的目光越过他,落在你身上。你答应过改善待遇。现在,你站在答应过的人中间。// </div> <div class="site-window-options"> <<link "当场签订协议,承诺全部三项要求">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人摊开协议,当众签了字。人群安静了一秒,然后没有欢呼,只是有人开始松动肩膀。// //罢工委员会的人接过协议,看了很久://「你签了,我就信一回。别让这纸上的字,变成下一场罢工的火种。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {spd:6, kpd:2, social_anger:-6, gov_trust:4, economy:4, dvp:-3, fatigue:4} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:全部答应,账先欠着</span>\ <<link "当众宣布复工令,调警察清场">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你站在一辆马车上,念完强制复工令。人群没有动。警察从两翼推进,像水漫过一道没有缝隙的堤。// //有人被推倒,有人回头看了你一眼。你记住了那个眼神--不是愤怒,是失望。失望比愤怒更难偿还。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {gov_trust:2, army:3, social_anger:6, political_violence:5, spd:-5, kpd:-3, fatigue:6} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:命令与警力并行的重手</span>\ <<link "当面斡旋,先恢复机器再谈条件">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你没有念文件,反而走进人群,站在罢工委员会旁边://「机器停了,谈判桌上才有人肯听。先让机器转起来,我保证条件上桌。」 //人群交头接耳。有人松动,有人还攥着拳头。你给了双方各自想要的台阶--但台阶只有一半。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {spd:4, ddp:2, social_anger:-3, gov_trust:2, economy:1, revolution:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <span class="site-cost">或需:两方各让半级台阶</span>\ <<link "只承诺一条,其余推到国会">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你只答应先解决工资,把八小时工作制和释放被捕者推到国会走程序。// //人群骚动了一下。罢工委员会的人看了你很久,最后说://「一条也行。但剩下的,我们记着。国会要是也推,我们就走回去。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {spd:3, social_anger:2, gov_trust:-2, dvp:2, fatigue:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>>\ <span class="site-cost">或需:只兑一半,剩下推给国会</span> </div> <<elseif _swr_kind eq "veteran">>\ /* 退伍军人占市政厅 · 亚历山大广场(文件栏 UE_33 去现场) */ <div class="site-window-body"> //市政厅的铁门从里面锁上了。台阶上坐着十几个退伍军人,军装洗得发白,眼神却硬得像铁。// //一个还剩一只手臂的老兵拦住你,声音哑://「抚恤金拖了五个月。我们在泥里替共和国挡过子弹,现在共和国连口饭都不肯给?」 //他身后的门缝里,有人低声应和。你答应过查清欠饷。此刻,你就站在欠他们的账本面前。// </div> <div class="site-window-options"> <<link "当场开放金库,补发全额抚恤金">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人抬来现金,当着老兵的面点清、发放。铁门开了,有人进来领钱,有人站着没动。// //独臂的老兵接钱时,手指在抖。他没道谢,只说了句://「你站在泥里过,就知道这钱有多重。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:5, spd:2, gov_trust:4, economy:5, dvp:-2, fatigue:3} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "调军队来,强令老兵撤离">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你调来了现役部队。当年轻的军服一字排开站在老兵面前时,你看见老兵们没有退,只是把仅剩的那只手握得更紧了。// //对峙了一刻钟,老兵散了。但你知道,他们不是被打散的--是把那口气咽进了肚子里。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:2, gov_trust:2, social_anger:3, political_violence:3, nationalism:2, fatigue:5} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "当场谈判,分期补发并承诺追责">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你走进被锁的铁门,坐在老兵中间,答应分期补发,并追查拖欠的金库账目。// //独臂老兵看着你,最后松了口://「分期也成。但账本,我们盯着。」你点头。有些承诺,是要放到人堆里才能兑现的。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:4, gov_trust:3, social_anger:-2, economy:3, insider:2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "只抓领头的,其余劝退">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人只拘了喊得最响的几个人,其余的老兵望着你,慢慢从台阶上退开。// //铁门重新锁上的时候,你听见有人低声说://「共和国给的,从来不是我们想要的。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:-2, gov_trust:2, social_anger:2, political_violence:2, spd:-2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>>\ </div> <<elseif _swr_kind eq "housing">>\ /* 柏林住房危机 · 弗里德里希斯海因(文件栏 UE_24 去现场) */ <div class="site-window-body"> //一片被围起来的危楼前,站着几十户举着纸牌的人。纸牌上写着房号、住址,和一句「我们没有别的屋檐了」。// //一个抱着孩子的女人走到你面前,纸牌上写着她家的地址://「我们要的不是体面,是一个能让孩子睡安稳的屋顶。」 //你答应过建公共住宅。现在,你站在那些等屋顶的人面前,身后是还没破土的空地。// </div> <div class="site-window-options"> <<link "当场宣布开工,划拨工人入住指标">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人在空地上打下第一根桩,当场宣布第一批工人优先入住。人群没有欢呼,只是有人把纸牌收了起来。// //抱孩子的女人转身时,孩子在你身后轻轻动了一下。你分不清那是满意,还是一句还没说出口的「早该如此」。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {spd:5, social_anger:-5, gov_trust:4, economy:4, dvp:-2, idealism:3, fatigue:3} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "强令腾退危楼,先堵住风险">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你下令强迁危楼住户。警察挨家敲门,纸牌散了一地。有人站在雨里,看着自己的家被贴上封条。// //抱孩子的女人最后走时,回头看了你一眼。你读懂了那眼神:你保住了安全,却把他们从家里赶进了更冷的风里。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:2, gov_trust:2, social_anger:5, political_violence:3, spd:-4, fatigue:5} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "召集开发商,逼他们让利配建">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你当着住户的面,把开发商叫到空地前,逼他们让出利润、配建廉价房。商人脸色铁青,但当着众人的面,不敢摇头。// //你给了住户一个屋顶,也给了开发商一个台阶以外的教训。可你知道,这个梁子,商人会记很久。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {dvp:4, spd:3, gov_trust:3, economy:2, political_violence:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "只登记不承诺,先稳住人心">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让工作人员当场登记每户的住房需求,承诺「会想办法」,但没有划地、没有开工。// //人们排着队登记。抱孩子的女人登记完,轻声问://「这名单,能当屋顶吗?」你没能回答。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {spd:2, social_anger:2, gov_trust:-2, insider:2, fatigue:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>>\ </div> <<elseif _swr_kind eq "refugeeflow">>\ /* 难民潮涌入 · 安哈尔特火车站(文件栏 UE_51 去现场) */ <div class="site-window-body"> //候车大厅变成了收容所。长椅上、地板上、柱子边,到处是靠墙坐着的人。他们没有行李,只有沉默。// //一个护士拦住你,声音压得很低://「收容中心满了。今晚还有两列从鲁尔方向来的车,坐的都是妇女和孩子。」 //她看着你手里的公文包。你答应过安排收容。现在,你站在装不下更多人的大厅里。// </div> <div class="site-window-options"> <<link "当场调拨兵营和粮仓,扩充收容">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人连夜腾出两座兵营、一座粮仓,当众宣布接收。护士送走你时,声音终于有了起伏://「谢谢。今晚总算有人能躺下了。」// //你走出大厅,身后是终于开始安顿下来的嘈杂。你分不清那是希望,还是把绝望推迟了一夜。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {spd:5, zentrum:3, social_anger:-5, gov_trust:4, economy:5, army:-2, fatigue:4} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "封锁车站,把难民挡在城外">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你下令封锁车站,增派警察把新到的列车挡在月台外。车厢里的人隔着车窗看你,眼神里没有怒火,只有一种让你心头发紧的平静。// //护士没有骂你,只是低声说://「车还会来的。堵得住一列,堵不住接下来的整个冬天。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {nationalism:3, gov_trust:-2, social_anger:4, intl_trust:-3, spd:-4, kpd:-2, fatigue:5} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "联系教会和慈善机构,协同安置">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你连夜召集教会、慈善组织,把收容、伙食、医疗分给各家去办。大厅被分成了几块,各自有了章法。// //一位神父站在人墙边,对你说://「政府出的是名义,我们出的是人手。只要名义不塌,人手就不会散。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {zentrum:4, spd:2, social_anger:-3, gov_trust:3, economy:1, idealism:2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "只处理眼前这批,其余等明天">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让护士先安顿厅里这批人,说明天再议新到列车。护士点头,但没有松气://「他们今晚能睡下,可明天、后天还有车。」 //你走出大厅时,身后最后一个空位也被占满了。你知道,明天,你又得从头面对一次。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {zentrum:2, social_anger:2, gov_trust:-2, fatigue:2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>>\ </div> <<elseif _swr_kind eq "university">>\ /* 文教·大学自治 · 菩提树下大街(文件栏 UE_72 去现场) */ <div class="site-window-body"> //你来到大学门口时,游行已经在那里了。// //学生们没有举着武器,只举着课本和讲义。一个年轻教授站在台阶上,把一张停印的课本封面举过头顶——封面上的字已经模糊了,但那只握书的手很稳。// //「我们不是要钱,」他说,声音不高,却传得很远,//「我们是要共和国还有一双看得见明天的眼睛。」 //你答应过「处理文教」。此刻,几百双眼睛都落在你身上。// </div> <div class="site-window-options"> <<link "当众承诺恢复文教经费">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你走上台阶,当众承诺恢复文教经费、重开停印的课本。人群没有立即散去,但那只举书的手,慢慢放了下来。// //年轻教授看了你很久,最后说://「我们记住你今天说的。别让它变成又一张空头支票。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "待后续", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {ddp:4, spd:3, gov_trust:3, idealism:2, economy:3, fatigue:3} $site_key>> <<promise-write "middle" "恢复大学文教经费" 50>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "承诺让学生代表上桌协商">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你没有许诺具体的钱,而是请学生代表进办公室谈。有人愿意谈,有人转身走了——但至少,门开了。// //你给了他们一张桌子。能不能谈出结果,取决于你,也取决于他们手里的课本。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {ddp:3, spd:2, gov_trust:2, insider:2, fatigue:2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "维持削减,下令清场">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人清场。警察围上来,学生们被推散,课本散了一地。那只举书的手,被一只警棍拨开。// //你转身离开时,听见身后有人低声说://「原来共和国看明天的眼睛,是闭着的。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {army:2, gov_trust:1, social_anger:5, political_violence:4, ddp:-4, spd:-3, fatigue:5} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "只派代表出面,自己不现身">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让一位助手出面。助手没有你的授权,只能反复说「政府会研究」。人群渐渐散去,但不是因为被说服,而是因为失望。// //你站在二楼的窗后,看着那条空了的街。你避开了一次对峙,也避开了一次承诺的机会。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {gov_trust:-2, ddp:-1, social_anger:2, fatigue:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>>\ </div> <<elseif _swr_kind eq "epidemic">>\ /* 医疗·霍乱疫情 · 弗里德里希斯海因(文件栏 UE_73 去现场) */ <div class="site-window-body"> //你来到工人区时,消毒水的味道已经盖过了煤烟。// //一个卫生员蹲在井边,往水里撒石灰,动作机械而疲惫。他身后,两个工人抬着一副担架,担架上的人被白布盖着。另一头,一个母亲抱着发烧的孩子,站在隔离线外,进不去,也不肯走。// //「井水查了,」卫生员抬头看你,声音沙哑,//「病菌在管道里。我们只能堵眼前这一口,堵不住下面那一片。」// </div> <div class="site-window-options"> <div class="site-option"> <<link "现场调拨消毒物资,扩大隔离" "Site_Result">> <<set $site_result_choice to "decon">><<set $site_result_label to "现场调拨消毒物资,扩大隔离">><<set $site_result_narrative to "你让人调来消毒水、石灰和床单,当场分发。隔离帐篷搭起来了,井口被围了起来。那个抱孩子的母亲终于被放了进来。卫生员看着空了的仓库,说:「够撑三天。三天后,得看你带来多少。」">>\ <</link>> \ <span class="site-cost">或需:调空一批应急物资,并当众许下卫生体系之诺</span>\ </div> <div class="site-option"> <<link "封锁病区,保护其余城区" "Site_Result">> <<set $site_result_choice to "block">><<set $site_result_label to "封锁病区,保护其余城区">><<set $site_result_narrative to "你下令封锁病区,出入凭条。隔离做起来了,可封锁线外的人开始恐慌——他们怕的不是瘟疫,是那道你划下的线。一个老太太隔着封锁线,把一袋土豆塞给里面的亲人,手抖得厉害:「你吃了,别饿着。」你没敢看太久。">>\ <</link>> \ <span class="site-cost">或需:一道封锁线,以及它割开的民心</span>\ </div> <div class="site-option"> <<link "追查管道源头,先堵病灶" "Site_Result">> <<set $site_result_choice to "source">><<set $site_result_label to "追查管道源头,先堵病灶">><<set $site_result_narrative to "你让工程师下井追查,找到了泄漏点。堵上它,比撒再多石灰都管用。工程师爬上来时浑身是泥,但眼睛是亮的:「堵住了。水能喝了——至少这一片。」你拍了拍他的肩,没说话。还有几口井没查完。">>\ <</link>> \ <span class="site-cost">或需:费时费力挖出真病灶,一时未必人人都喝得上水</span>\ </div> <div class="site-option"> <<link "只登记病例,不公开疫情" "Site_Result">> <<set $site_result_choice to "silence">><<set $site_result_label to "只登记病例,不公开疫情">><<set $site_result_narrative to "你压下疫情消息,只让卫生署内部登记。街上风平浪静,可消毒车在夜里驶过,铃声在雾里传得很远。你告诉自己这是「避免恐慌」。可你知道,捂住的每一例,都在暗处多积一分。">>\ <</link>> \ <span class="site-cost">或需:掩住消息,也埋下更大的恐慌种子</span>\ </div> </div> <<elseif _swr_kind eq "justice">>\ /* 司法·政治冤案 · 亚历山大广场(文件栏 UE_74 去现场) */ <div class="site-window-body"> //法院门外,广场上聚着两群人,被一道警戒线隔开。// //一边举着「还他清白」的标语,一边喊着「严惩叛徒」。一个头发花白的女人站在警戒线这一侧,手里攥着一张泛黄的合影——1919年,那个即将被定罪的工人,穿着工装站在街垒后面。// //律师从法院里走出来,脸色凝重://「法官顶压力顶了三天。今天要宣判。」他看你一眼,//「你的一句话,比他三年的申诉都重。」// </div> <div class="site-window-options"> <<link "当庭发声,推动重审">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让人传话给法官,要求暂缓宣判、重审卷宗。法院内安静了很久,最终宣布休庭。// //那个攥着合影的女人,隔着警戒线朝你鞠了一躬。你没敢接,只点了一下头。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {spd:4, ddp:4, gov_trust:3, dnvp:-3, fatigue:3} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "尊重司法独立,不干预">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你选择不干预。法官宣判了有罪。右翼的人群发出低低的欢呼,另一侧的人群沉默着散开。// //那个攥着合影的女人,最后看你一眼,没有恨意,只是失望://「原来共和国,也有看不见的冤。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {dvp:2, dnvp:2, gov_trust:1, spd:-4, ddp:-3, fatigue:2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "要求公开全部卷宗">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你要求公开卷宗,让证据见光。卷宗里的裂缝露了出来——证据链远不像判决书说的那么干净。法官答应重新核验。// //律师长长舒了口气://「至少,真相还有机会说一次话。」//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {ddp:5, gov_trust:3, insider:3, dnvp:-2, fatigue:2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "压下宣判,等风头过去">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让法院推迟宣判。两群人散去了一些,但没散的是那个攥着合影的女人,她站在黄昏里,一直没走。// //你告诉自己这是在「择机处理」。可你知道,有些审判延误之后,就再也不会重开。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {gov_trust:-2, insider:1, social_anger:2, fatigue:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>>\ </div> <<elseif _swr_kind eq "culture">>\ /* 文化·表现主义展览 · 罗曼咖啡馆(文件栏 UE_75 去现场) */ <div class="site-window-body"> //罗曼咖啡馆的二楼,一场表现主义画展正在举行。// //墙上挂着扭曲的线条、突兀的色彩、被拉长的影子——画的是废墟、饥饿、午夜的电车。一个年轻画家站在自己的画前,紧张地看着每一个驻足的人,像在等待审判。// //咖啡馆门口,几个右翼分子正与老板争执,扬言「这些堕落的东西必须撤下」。老板回头看你——他知道你是政府的人。// </div> <div class="site-window-options"> <<link "当众支持展览自由">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你走进咖啡馆,站在那幅最「乱」的画前,看了很久,然后对年轻的画家说://「画得不对,但画得真。留下。」 //右翼分子嘟囔着退开。画家的眼睛亮了一下,又像怕惊扰什么似的,低下头。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "待后续", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {ddp:4, spd:2, idealism:3, dnvp:-3, fatigue:2} $site_key>> <<promise-write "middle" "资助柏林先锋艺术" 50>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "劝老板撤下,息事宁人">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你劝老板先把画撤下,等风头过去再展。老板犹豫再三,还是同意了。// //年轻画家默默收画,没说什么。你经过时,他低声说://「撤下的是画,收起的是我们说话的胆子。」你没敢停下。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {dnvp:3, gov_trust:1, ddp:-4, idealism:-3, spd:-2, fatigue:2} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "居中调解,让双方各退一步">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你让老板保留展览,但把最「出格」的几幅移到偏厅,并让画家加一份说明。右翼勉强接受,画家也别扭地点头。// //双方都退了一步,谁也没赢。但至少,那盏灯还亮着。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {ddp:2, gov_trust:2, dnvp:1, fatigue:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>> \ <<link "暗中资助,不公开表态">> <<replace "#site_block">><<nobr>> <span class="site-window-body">//你没有当众表态,让人私下给画廊和画家送了一笔钱。他们靠这笔钱撑过了最难的几个月。// //几周后,一幅未署名的画被送到你办公室——画着风暴中的一盏灯柱。你把它挂在了最不起眼的角落。//</span> <<silently><<set $site_done[$site_key] to { title: $regions[$site_key].active_event.title, status: "已了结", at_day: $session_day }>><<set $regions[$site_key].active_event to null>><<site-pending-clear $site_ev_id>>><</silently>> <<apply-red-fx {insider:3, idealism:2, ddp:1, fatigue:1} $site_key>> <br><span style="color:#8a8a8a;">($choice_effects_summary)</span> <</nobr>><</replace>>\ <</link>>\ </div>\ <</if>>\ </div> </div>\ <</if>>\ <</widget>> /* ---------- site-prompt-render:现场待办·精简提示条 ---------- 用法:<<site-prompt-render 区域key>> 在区域页标题正下方调用。若该区域有 active_event 现场待办, 只渲染一行"现场:xxx(剩 N 天)",并提供唯一的「介入事件」入口, 点击后跳转独立段落 Site_Event 完整讲述与选择。 无现场则输出空。 */ <<widget "site-prompt-render">>\ <<silently>> <<if not $site_done>><<set $site_done to {}>><</if>>\ <<set _spr_key to $args[0]>>\ <<set _spr_ev to ($regions[_spr_key] and $regions[_spr_key].active_event) ? $regions[_spr_key].active_event : null>>\ <<set _spr_days to (_spr_ev ? _spr_ev.deadline_day - $session_day : 0)>>\ <<set _spr_name to ($regions[_spr_key] ? $regions[_spr_key].name : "")>>\ <<set _spr_done to ($site_done[_spr_key] and $site_done[_spr_key].at_day eq $session_day) ? $site_done[_spr_key] : null>>\ <</silently>>\ <<if _spr_ev>>\ <div class="site-prompt"> <span class="site-prompt-title">⚠ 现场 ·「_spr_name」— _spr_ev.title <<if _spr_days gte 0>><span class="site-prompt-deadline">剩 _spr_days 天</span>\ <<else>><span class="site-prompt-deadline site-prompt-deadline-urgent">已超时</span><</if>> </span> <span class="site-prompt-text">你在这里有一件答应过的事。你要走近它,才看得清它现在的样子。</span> <span class="site-prompt-cta"><<link "介入事件" "Site_Event">><<set $current_region to _spr_key>><</link>></span> </div>\ <<elseif _spr_done>>\ <div class="site-prompt"> <span class="site-prompt-title">✓ 现场 ·「_spr_name」— 今日已处理</span> <span class="site-prompt-text">_spr_done.title— <<if _spr_done.status eq "待后续">>已处置,欠条簿里记着一笔,待兑现。<</if>><<if _spr_done.status neq "待后续">>今天这一件,已经了结。<</if>></span> </div>\ <</if>>\ <</widget>>
/* 现场事件·独立讲述与选择段落 由区域页的 site-prompt-render「介入事件」跳转而来。 复用 site-window-render 渲染完整叙述 + 选项 + 结算; 结算后提供返回区域 / 地图出口。 */ <<set _site_key to $current_region>>\ <<if not $regions[_site_key].active_event>>\ //这里已经平静下来了。原来那件事,就在你不经意的时候落了幕。// <<link "返回地图" "Scene_RegionSelect">><</link>> <<else>>\ <<site-window-render _site_key>>\ <<set _site_return_name to $regions[_site_key].name>>\ <<set _site_return_page to $regions[_site_key].passage>>\ <div class="site-event-exit"> <<link "回到「<<= _site_return_name >>」" _site_return_page>><</link>> //|// <<link "返回地图" "Scene_RegionSelect">><</link>> </div>\ <</if>>
/* 现场结果·独立结果页 由现场选项(霍乱 UE_73 的 4 个专属选项)跳转而来,$site_result_choice 定位选了哪个。 在正常渲染上下文里:清除现场标记 + 应用该选项的数值/许诺,再展示「你做了 X + 影响」。 之后可「离开现场」回到 Site_Event(此时现场已清,显示"已经平静下来")。 */ <<silently>> <<set _sres_title to $regions[$site_key].active_event.title>>\ <<set $regions[$site_key].active_event to null>>\ <<site-pending-clear $site_ev_id>>\ <<set _sres_choice to $site_result_choice>>\ <<set _sres_label to $site_result_label>>\ <<set _sres_narr to $site_result_narrative>>\ /* 先在变量里构造真正的 JS 对象(SugarCube 宏参数里的对象字面量会被当字符串),再传给 apply-red-fx */ <<set _sres_fx to {}>>\ <<set _sres_promise to false>>\ <<if _sres_choice eq "decon">><<set _sres_fx to {spd:4,gov_trust:3,social_anger:-3,economy:4,fatigue:4}>><<set _sres_promise to true>>\ <<elseif _sres_choice eq "block">><<set _sres_fx to {army:3,gov_trust:1,social_anger:5,political_violence:3,spd:-4,fatigue:5}>>\ <<elseif _sres_choice eq "source">><<set _sres_fx to {ddp:3,gov_trust:2,economy:1,social_anger:-2,fatigue:3}>>\ <<elseif _sres_choice eq "silence">><<set _sres_fx to {insider:2,inflation:2,gov_trust:-3,social_anger:3,fatigue:2}>>\ <</if>>\ <<set $site_done[$site_key] to { title: _sres_title, status: (_sres_promise ? "待后续" : "已了结"), at_day: $session_day }>>\ <</silently>>\ <<apply-red-fx _sres_fx $site_key>>\ <<if _sres_promise>><<promise-write "worker" "建立城市公共卫生体系" 50>><</if>>\ <div class="site-result"> <span class="site-result-tag">现场终了 · 你选择了<<print _sres_label>></span> <div class="srp-body">//_sres_narr//</div> <div class="srp-effects">影响:<<print $choice_effects_summary>></div> <div class="site-result-foot"> <<link "离开现场" "Site_Event">><</link>> //|// <<link "返回地图" "Scene_RegionSelect">><</link>> </div> </div>
/* 经济压力≥55:参与工会救济物资分发 */ //工会的院子里堆着几袋发了潮的土豆和两条黑面包。// //一个手指粗得像香肠的男人看见你,愣了一下,然后指了指那堆东西:// //「你来了正好。人手不够。」// //他递给你一副磨得发亮的旧手套。你接过来,弯下腰,把土豆一袋一袋搬上木板车。// //搬到第三袋的时候,你听见身后有个女人在低声说:「总算是有人动了。」// //你直起腰,把最后一袋土豆码好。院子里安静了一瞬,然后有人递给你一杯还冒着热气的麦芽咖啡。// <<set $regions.kreuzberg.stability to Math.min(100, $regions.kreuzberg.stability + 4)>>\ <<trust-capped "spd" 3>>\ <<aff-note "spd" 3>>\ <span class="txt-sys">//(克罗伊茨贝格稳定度+4 · <<print $ret>>)//</span> <<rival-note-show>>\ <<link "回到克罗伊茨贝格" "Region_Kreuzberg">><</link>>
/* 社会愤怒≥50:站在集会边缘听演讲 */ //人群在街心聚集,像一锅烧到临界点的水。// //你站在外围,没有挤进去。台上的人声浪起伏,你听不清完整的句子,只抓住几个词:「面包」「共和国」「算账」// //一个年轻人回头看了你一眼,目光在你的西装上停了一秒,然后转了回去。// //你记住了他说话的方式——不是愤怒,是疲惫到了极点之后,逼出来的火。// //你没有说话,只是站在那里,把人群的轮廓记在心里。// <<tag-add "知情者" "micro" 3 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <span class="txt-sys">//(知情者+3)//</span> <<link "回到克罗伊茨贝格" "Region_Kreuzberg">><</link>>
/* 事件R01已处理:探望鲁尔来的难民 */ //火车站的方向涌进来一大群人。他们没带多少行李——有的只拎着一只破了边的箱子,有的空着手。// //一个瘦得颧骨突出的女人蹲在墙角,怀里抱着一个孩子在轻轻拍。孩子没哭,只是睁着眼睛看着一个方向,不知道在看什么。// //你走过去,蹲下来。她抬起眼,眼神里没有恐惧,只有一种你不想再细看的平静。// //「鲁尔那边,」她开口,声音很轻,//「他们说要保证赔款。保证到我们头上了。」 //你什么都没说。有些话,说了也盖不住她怀里那点微弱的呼吸声。// <<trust-capped "kpd" 2>>\ <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - 1)>>\ <<aff-note "kpd" 2>>\ <span class="txt-sys">//(<<print $ret>> · SPD信任-1)//</span> <<rival-note-show>>\ <<link "回到克罗伊茨贝格" "Region_Kreuzberg">><</link>>
/* 知情者≥15:在巷子里找黑市情报 */ //你拐进一条只有你这种经常来的人才知道的巷子。// //墙根蹲着一个人,帽檐压得很低。他没有抬头,只说了一个字://「价。」 //你报了三个词。他顿了顿,然后从怀里摸出一张折得发硬的纸,上面是几个数字和几个地名。// //「明天就作废,」他说,「就像昨天那张一样。」// //你收好纸。信息的保质期,和纸马克一样短。// <<tag-add "知情者" "micro" 4 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + 1))>>\ <span class="txt-sys">//(知情者+4 · 通胀+1)//</span> <<link "回到克罗伊茨贝格" "Region_Kreuzberg">><</link>>
/* 革命压力≥50:处理 KPD 街头煽动 */ //墙上的红漆标语又多了几行。一个年轻人站在箱子上,正在向围拢的人群喊话。// //你穿过人群,走到箱子前。你看清了他的脸——年轻,眼睛发亮,还没有经历过镇压的灰。// //「你叫什么?」你问。他愣了一下,然后报出一个名字。你记住了。// //「这些话,你留着到国会去说。」你压低了声音,不让身后的人群听见,//「在街上说,只会让街上的人先流血。」 //他盯着你看了很久,最后跳下箱子,没有说话。人群慢慢散了。街头的火,暂时没有点起来。// <<set $world.political_violence to Math.max(0, Math.min(100, $world.political_violence - 4))>>\ <<set $npcs.kpd.trust to Math.max(0, Math.min(100, $npcs.kpd.trust - 3))>>\ <span class="txt-sys">//(政治暴力-4 · KPD信任-3)//</span> <<link "回到克罗伊茨贝格" "Region_Kreuzberg">><</link>>
/* 到访≥3 且 SPD信任≥40:进入工会核心会议 */ //这一次,工会的人没有把你引到会客室,而是带着你穿过一道平时紧锁的门,进了里面的房间。// //长桌旁坐着几张你在外面从未见过的脸。他们没说话,只是看着你坐下的方式。// //一个年长的男人推过来一杯茶://「你来的次数够多了。我们决定,有些话,让你直接听。」 //你端起茶。杯子是温的,桌上是摊开的账目和罢工的筹备表。你终于走进了这个街区的核心。// <<trust-capped "spd" 4>>\ <<set $regions.kreuzberg.stability to Math.min(100, $regions.kreuzberg.stability + 3)>>\ <<aff-note "spd" 4>>\ <span class="txt-sys">//(<<print $ret>> · 克罗伊茨贝格稳定度+3)//</span> <<rival-note-show>>\ <<link "回到克罗伊茨贝格" "Region_Kreuzberg">><</link>>
/* 通胀≥60:找黑市兑换情报 */ //霓虹灯下,一个穿长风衣的男人向你走过来,压低声音://「先生,美元,要吗?」 //你没有看他手里的绿钞,而是问他今天的价。他报了一个数字,比昨天又高了一截。// //「你手里有消息吗?」你问。他眯起眼,打量了你几秒,然后从口袋里掏出半张纸,上面写着几个黑市通行的汇率。// //「明天作废。」他说完就消失在人群里。// //你收好那半张纸。在黑市,纸上的数字比钞票更值钱,也更短命。// <<tag-add "知情者" "micro" 4 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + 1))>>\ <span class="txt-sys">//(知情者+4 · 通胀+1)//</span> <<link "回到选帝侯大街" "Region_Kurfurstendamm">><</link>>
/* 经济压力≥55:与商会代表谈失业救济 */ //商会大楼的会议厅里,几个商人坐在长桌对面,领结打得一丝不苟,脸色却不好看。// //「失业救济?」一个年纪最大的商人敲了敲桌子,//「我们也不是铁打的。」 //你们谈了很久。最后达成了一个折中:商会凑一笔钱,买一批煤,分给工人区。// //「不是为了他们,」他补了一句,看着窗外,//「是为了那个倒霉的共和国,别再倒下去。」 //你点点头。务实,有时也是一种慈悲。// <<trust-capped "dvp" 3>>\ <<set $regions.kurfurstendamm.stability to Math.min(100, $regions.kurfurstendamm.stability + 3)>>\ <<aff-note "dvp" 3>>\ <span class="txt-sys">//(<<print $ret>> · 选帝侯大街稳定度+3)//</span> <<rival-note-show>>\ <<link "回到选帝侯大街" "Region_Kurfurstendamm">><</link>>
/* 知情者≥15:在咖啡馆窃听商人密谈 */ //你挑了一张能看清门口、又不太显眼的桌子坐下。// //邻桌坐着两个商人,声音压得很低。你端起咖啡,假装在看窗外,耳朵却贴着他们那边的空气。// //你听到几个数字、一个地名,还有一个你刚从黑市听来的汇率。他们对上了。// //你放下杯子,记住了他们谈话的尾音。有些密谈,不是秘密,只是还没到公开的时候。// <<tag-add "知情者" "micro" 3 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <span class="txt-sys">//(知情者+3)//</span> <<link "回到选帝侯大街" "Region_Kurfurstendamm">><</link>>
/* 政府信任≤25:安抚恐慌的存款人 */ //银行的铁门还没开,门口已经排起了一条长队。人们攥着存折,眼睛盯着那扇卷帘门,指节发白。// //一个老太太挤在你身边,声音发抖://「我的钱,我的钱会不会……」 //你站在队伍旁边,没有往里面挤。你只是对周围的人说,政府没有倒,银行不会关门。// //有人信了,松开了攥着存折的手。有人没信,依旧攥着。// //你做的,只是让今天早上排队的人里,少了一个被自己吓倒的人。// <<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + 3))>>\ <span class="txt-sys">//(政府信任+3)//</span> <<link "回到选帝侯大街" "Region_Kurfurstendamm">><</link>>
/* 事件R02已处理:处理消极抵抗的商人抗议 */ //商会的办公室里,几个商人正围着桌子争论。桌上摊着一份电报——国会通过了消极抵抗的授权。// //「罢工停工,谁来赔?」一个商人拍着桌子。另一个声音更大://「我们也是德国人!」 //你走进来,争论声停了一瞬。他们看着你,等你表态。// //你站在窗边,没有立刻说话。窗外,选帝侯大街的霓虹灯还在亮着,照着一座正在被掏空的共和国。// //你开口时,声音不高,但在安静的房间里足够清楚。// <<trust-capped "dvp" 2>>\ <<set $npcs.dvp.trust to Math.max(0, $npcs.dvp.trust - 1)>>\ <<aff-note "dvp" 2>>\ <span class="txt-sys">//(<<print $ret>> · DVP信任-1)//</span> <<rival-note-show>>\ <<link "回到选帝侯大街" "Region_Kurfurstendamm">><</link>>
//钟楼在晌午敲过了。流浪的人坐在台阶上,面前放着一顶帽子,帽子里只有几枚新硬币——地租马克,齿还新着。// //你从他们中间走过,有人喊住你打听哪里还在招工。你说了两个地方,他记下来,道了声谢——不是敷衍的那种。// //你转了一圈,什么也没做,只是把这一区还活着的人的样子看进了眼里。// <<set $player.mental.isolation to Math.max(0, Math.min(100, $player.mental.isolation - 1))>>\ <span class="txt-sys">//(孤立感-1)//</span> <<link "回到亚历山大广场" "Region_Alexanderplatz">><</link>>
/* 失业登记处·常设地景子图:下层痛苦可视化 → SPD·社会愤怒·精神负荷 */ //失业登记处的铁门外,队伍从清晨排到午后,像一条没人解开的绳结。// //窗口里的小职员盖章、抬眼、问话,词句都不超过五个字。轮到你面前时,他抬头看了你一眼——你是这里显然不该出现的人。// //你站在原地,没有催他的力气,也没有转身的余地。队伍缓慢往前挪,每挪一步,都有人把攥了一早上的证件又松了松。// //你看见了那座共和国最结实也最安静的账本——它不计录纸上的数字,记录的是每天从这里走出去、找不到方向的脚步。// <<trust-capped "spd" 1>>\ <<aff-note "spd" 1>>\ <<set _aa_n to $ret>>\ <<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger + 1))>>\ <<weimar-tension-gain 1>>\ <span class="txt-sys">(_aa_n · 社会愤怒+1 · 魏玛精神负荷+1)</span> <<rival-note-show>>\ <<link "回到亚历山大广场" "Region_Alexanderplatz">><</link>>
/* 队列传话人:知情者+ SPD(需消息灵通解锁) */ //你在队列里看久了,认出几个反复出现的老面孔——他们不是来登记失业的,是来听消息的。// //你挑了一个看起来最稳当的,塞给对方一包烟草,托他在工人区替你留意两件事。他点头,把烟草揣进怀里,像揣一份没有签字的契约。// <<silently>> <<tag-add "知情者" "micro" 2 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <<trust-capped "spd" 1>>\ <<aff-note "spd" 1>>\ <<set _ac_n to $ret>>\ <</silently>>\ <span class="txt-sys">(知情者+2 · _ac_n)</span> <<rival-note-show>>\ <<link "回到亚历山大广场" "Region_Alexanderplatz">><</link>>
//罗曼咖啡馆的蒸汽比外面的街还密。靠窗的人在高声谈议会,靠墙的在低声谈私奔。// //你端着一杯咖啡,坐到吧台边。临近的桌上,有人把报纸硬读完了头版,又从头读了一遍,像在找一处错字。// //你什么也没说,只是把这一屋子人的热与妄,原样看进眼里。// <<set $player.mental.isolation to Math.max(0, Math.min(100, $player.mental.isolation - 1))>>\ <span class="txt-sys">//(孤立感-1)//</span> <<link "回到咖啡馆" "Region_Romanisches">><</link>>
/* 报社编辑部·常设地景子图:把"立场"变成可选择的一版头条 */ //编辑部的排字桌是冷的,油墨味却冲。一个戴袖套的老编辑把一摞清样往你面前一推://「新的一版还空着半张。你说说,头条放哪边?」 //你明白他的意思——标题是白纸黑字,也是立场。这半张纸,够你在柏林为一件事情盖一次章。// <br> <<link "国际主义——呼吁与法国谈和,稳住汇率">> <<trust-capped "ddp" 2>>\ <<aff-note "ddp" 2>>\ <<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism - 1))>>\ <span class="txt-sys">(<<print $ret>> · 民族主义-1)</span> <<rival-note-show>>\ <</link>>\ <br> <<link "民族主义——痛斥凡尔赛,呼吁备战">> <<trust-capped "dvp" 2>>\ <<aff-note "dvp" 2>>\ <<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + 1))>>\ <span class="txt-sys">(<<print $ret>> · 民族主义+1)</span> <<rival-note-show>>\ <</link>>\ <br> <<link "只写事实,不站队">> <<tag-add "知情者" "micro" 1 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <span class="txt-sys">//(知情者+1 · 明哲保身)//</span> <</link>>\ <br> <<link "放下清样,离开编辑部" "Region_Romanisches">><</link>>
/* 值班记者换料:知情者+(需消息灵通解锁) */ //一个叼着烟的值班记者从口袋里抽出一张折了两折的纸,在你面前晃了晃://「我这条,换你上一条。」 //你斟酌着,把一条还没见报的内部消息递了过去。他慢吞吞地接住,把那张纸展开推到你手边。// //你只看了一眼。那上面的一行字,够你今晚多走一条街。// <<tag-add "知情者" "micro" 2 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <span class="txt-sys">//(知情者+2)//</span> <<link "回到咖啡馆" "Region_Romanisches">><</link>>
/* 军士食堂·常驻刷军方好感本营(tier1 always) */ //军士食堂的门帘外,热气和油味一起涌出来。退伍的上士们坐在条凳上,面前是半杯啤酒、一张皱的旧报。// //你推开帘子,把一张钞票搁在吧台上,说请这一圈。上士们看你一眼,没有推辞。行伍之人,请了就是认了。// //你坐下。没人问你是谁,但半杯酒递到你手边时,你算是这个屋子里的人了。// <<trust-capped "army" 1>>\ <<aff-note "army" 1>>\ <span class="txt-sys">(<<print $ret>>)</span> <<rival-note-show>>\ <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* 旁听军官饭后闲谈(trust:army>=25) */ //饭后,几个军官靠在食堂窗边,声音放低了。谈的不是练兵,是财政:军饷又迟了,西南那边还欠着多少。// //你坐在他们斜对面,不插话,只听。他们聊到某支志愿团的番号时,特意压低了半截——那是你不该听见的名字。// //你把那半截话记了下来。有些字眼,记下来比说出来更烫。// <<silently>> <<tag-add "知情者" "micro" 2 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <<trust-capped "army" 1>>\ <<aff-note "army" 1>>\ <<set _tg_note to $ret>>\ <</silently>>\ <span class="txt-sys">(知情者+2 · _tg_note)</span> <<rival-note-show>>\ <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* 黑色国防军·高风险改道线(trust:army>=40):签字站队军方 & 踩合法红线 */ //约定的地窖在蒂尔加滕边缘,一盏小灯照着一张方桌。临坐的是一名便装的中年人,声音很平:// //「共和国的军队有明面的一支,还有暗面的一支——绕过和约、没人敢存档的那种。」他把名单推过来,「上面这些名字,可靠吗?你替我把把关。」// //你明白了——这不再是请酒混脸熟,而是要你在军方的黑账上,亲手签一个字。// <<link "签字——替暗面军队的名单把关">> <<trust-capped "army" 3>>\ <<aff-note "army" 3>>\ <<set _sr_n1 to $ret>>\ <<trust-capped "dnvp" 1>>\ <<aff-note "dnvp" 1>>\ <<set _sr_n2 to $ret>>\ <<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + 1))>>\ <<weimar-tension-gain 2>>\ <<fate-shift +3>>\ <span class="txt-sys">(_sr_n1 · _sr_n2 · 民族主义+1 · 魏玛精神负荷+2 · 相位右偏)</span> <<rival-note-show>>\ <</link>>\ <br> <<link "放下名单,站起来离开">> <<set $npcs.army.trust to Math.max(0, $npcs.army.trust - 1)>>\ <span class="txt-sys">//(军方信任-1 · 你保持了干净的记录)//</span> <</link>>\ <br> <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* 军方影响力≥45:列席军官非正式晚宴 */ //军官俱乐部的长桌旁,坐着几个谈笑风生的男人。他们没穿军装,但坐姿都带着军队的刻度。// //一个上校看到你,推过来一杯单麦芽威士忌://「坐。今晚不谈公文。」 //你坐下。酒在嘴唇上烧着,话题在军官们之间流转——不是政变,只是关于「秩序」的种种忧虑。// //你听出了他们真正想说的那句话:这个共和国,还得有人替它看门。// //而你,居然坐进了看门人的桌子。// <<trust-capped "army" 4>>\ <<aff-note "army" 4>>\ <span class="txt-sys">(<<print $ret>>)</span> <<rival-note-show>>\ <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* 长线·文教:大学自治请愿的后续 —— 游行与学术自由之争 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <<set _ev_fu to _ev.fu_data ? _ev.fu_data : {}>>\ <div class="scene-block"> //游行没有停在大学门口。// //学生们的队伍沿着菩提树下大街走,经过废墟般的财政部,经过紧闭的博物馆,最后停在总理府外的警戒线前。他们举着的标语不是口号,是图书馆里被停印的课本、被解聘的教授照片。// //一个女生把一张纸递到警戒线前,纸上写着一行字://「我们可以挨饿,但共和国不能瞎。」 //你在二楼的窗后看着她。你答应过要「处理好文教」。现在,那条街在等你下楼。// </div> ''你如何处理这场游行:'' <<link "当众承诺恢复文教经费,解散队伍">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {ddp:4, spd:3, gov_trust:3, idealism:2, economy:3} _ev_idx>>\ <span class="txt-sys">//(DDP信任+4 · SPD信任+3 · 政府信任+3 · 理想+2 · 经济+3 · 欠条已写)//</span> <<promise-write "middle" "恢复大学文教经费" 60>>\ <span class="txt-sys">//(你当众允诺:恢复文教经费。这笔账写进了欠条簿,国会见。)//</span> <<site-followup-add "文教经费之争:保守派反扑" "你承诺恢复文教经费的消息传开后,右翼报刊开始攻击「共和国把钱花在乱涂乱画的学生身上」。议会里,你的盟友开始动摇。文教的火,烧到了你头上。" 9 "university2" "Followup_University2">>\ <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "强硬维持削减,让警察清场">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {army:2, gov_trust:1, social_anger:5, political_violence:4, ddp:-4, spd:-3} _ev_idx>>\ <span class="txt-sys">//(军队信任+2 · 政府信任+1 · 社会愤怒+5 · 政治暴力+4 · DDP信任-4 · SPD信任-3)//</span> <<site-followup-add "文教反噬:学生转入地下" "你清场的大学生没有散去,只是变换了阵地。地下刊物、街角演讲会、深夜的读书会——他们将不满渗进了更多年轻人的心里。下一次,他们不会再举着标语来。\nR20 你已关闭了学术的门,他们开始寻找别的窗。" 9 "university2" "Followup_University2">>\ <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "成立文教委员会,透明协商">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {ddp:3, spd:2, gov_trust:2, insider:2} _ev_idx>>\ <span class="txt-sys">//(DDP信任+3 · SPD信任+2 · 政府信任+2 · 知情者+2)//</span> <<site-followup-add "文教委员会首份报告" "你成立的文教委员会递交了首份报告:建议重开停印的课本、恢复被解聘教授的名誉,并设立透明的经费分配。报告写得克制,但每一页都在提醒你:文教不是预算表上的数字,是共和国能看见明天的那扇窗。" 9 "university2" "Followup_University2">>\ <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "只派代表出面,自己回避">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {gov_trust:-2, ddp:-1, social_anger:2} _ev_idx>>\ <span class="txt-sys">//(政府信任-2 · DDP信任-1 · 社会愤怒+2)//</span> <<site-followup-add "学生代表的心寒" "你派去的代表没有你的授权,谈不出任何承诺。学生代表离开时,在总理府外的台阶上站了很久。他没有喊口号,只是回头看了那扇窗一眼——你不在窗后。有些怯场,比拒绝更让学生心寒。" 9 "university2" "Followup_University2">>\ <<link "回到办公室" "Scene_Office">><</link>> <</link>>
/* 长线·文教 - 第二环:文教经费之争的结果 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <div class="scene-block"> //文教之争落到了国会的地板上。// //一份恢复文教经费的提案被摆上桌,右翼党团在背后游说,DVP 的态度暧昧。你上一次的选择,正决定这一场辩论的天平往哪边倒。// </div> ''这一场文教之争,你如何收场:'' <<link "坚持恢复经费,推动立法">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {ddp:4, spd:3, gov_trust:2, idealism:2, dnvp:-2, economy:2} _ev_idx>>\ <span class="txt-sys">//(DDP信任+4 · SPD信任+3 · 政府信任+2 · 理想+2 · DNVP信任-2)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "部分恢复,交换军费让步">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {ddp:2, dnvp:2, army:1, economy:2, idealism:-1} _ev_idx>>\ <span class="txt-sys">//(DDP信任+2 · DNVP信任+2 · 军队信任+1 · 理想-1)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "维持削减,文教让路军费">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {army:3, dnvp:3, ddp:-4, spd:-3, idealism:-2, social_anger:2} _ev_idx>>\ <span class="txt-sys">//(军队信任+3 · DNVP信任+3 · DDP信任-4 · SPD信任-3 · 理想-2)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>>
/* 长线·医疗:霍乱疫情的后续 —— 全城防疫 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <div class="scene-block"> //霍乱没有因为你的第一道命令而退去。// //它顺着看不见的管道,爬进了另一个工人区。消毒车在黎明前驶过空旷的街道,铃声在雾气里传得很远。市政医院的门诊排到了街角,床单不够,消毒水不够,连装尸体的麻袋都开始紧张。// //你上一次对疫情的处理,决定了今天你手里握着多少张牌。// </div> ''这场疫情,你如何决战:'' <<link "全国动员防疫,不惜一切代价">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {spd:5, gov_trust:4, economy:6, social_anger:-4, army:-1} _ev_idx>>\ <span class="txt-sys">//(SPD信任+5 · 政府信任+4 · 经济+6 · 社会愤怒-4)//</span> <<promise-write "worker" "建立城市公共卫生体系" 60>>\ <span class="txt-sys">//(你当众允诺:建立公共卫生体系。这笔账写进了欠条簿,国会见。)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "封锁重疫区,保护富区">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {army:3, gov_trust:1, social_anger:5, political_violence:3, spd:-4} _ev_idx>>\ <span class="txt-sys">//(军队信任+3 · 政府信任+1 · 社会愤怒+5 · SPD信任-4)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "公开透明,发动民间互助">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {zentrum:3, spd:3, gov_trust:3, idealism:2, economy:1} _ev_idx>>\ <span class="txt-sys">//(Zentrum信任+3 · SPD信任+3 · 政府信任+3 · 理想+2)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "继续封锁消息,等它自然过去">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {inflation:3, gov_trust:-4, social_anger:4, spd:-3} _ev_idx>>\ <span class="txt-sys">//(通胀+3 · 政府信任-4 · 社会愤怒+4 · SPD信任-3)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>>
/* 长线·司法:政治冤案的后续 —— 卷宗里的真相 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <div class="scene-block"> //那份卷宗没有被遗忘。// //你在办公室里反复翻过它,证据链的裂缝像一道细纹,越看越深。被告的律师送来一封信,没有署名,只夹着一张旧照片——1919年,那个工人站在街垒后面,护着一面黑红金的三色旗。照片背面写着一行字://「共和国靠我们守下,凭什么由你们定罪?」 //你上一次的选择,决定了这封信此刻落在你桌上,还是被扔进火炉。// </div> ''这份冤案,你如何了断:'' <<link "推动重审,还他清白">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {spd:4, ddp:4, gov_trust:3, dnvp:-3, idealism:2} _ev_idx>>\ <span class="txt-sys">//(SPD信任+4 · DDP信任+4 · 政府信任+3 · DNVP信任-3 · 理想+2)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "维持原判,司法的「威严」不可动摇">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {dvp:2, dnvp:2, gov_trust:1, spd:-4, ddp:-3} _ev_idx>>\ <span class="txt-sys">//(DVP信任+2 · DNVP信任+2 · 政府信任+1 · SPD信任-4 · DDP信任-3)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "公开卷宗,成立独立调查">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {ddp:5, gov_trust:3, insider:3, dnvp:-2} _ev_idx>>\ <span class="txt-sys">//(DDP信任+5 · 政府信任+3 · 知情者+3 · DNVP信任-2)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "私下调解,换取不公开">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {insider:2, gov_trust:-2, ddp:1} _ev_idx>>\ <span class="txt-sys">//(知情者+2 · 政府信任-2 · DDP信任+1)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>>
/* 长线·文化:表现主义展览的后续 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <div class="scene-block"> //那幅画没有随着展览结束而消失。// //表现主义的年轻画家们,把展览搬进了更多的咖啡馆、更多的阁楼、更多的地下空间。他们画废墟、画饥饿、画午夜的电车、画被生活碾碎的脸——画的都是这座共和国自己不敢看的东西。// //右翼的宣传队开始砸画展的门。你上一次的选择,决定了柏林今晚是亮着灯,还是熄了灯。// </div> ''这场文化之战,你站在哪边:'' <<link "拨款成立国立画廊,庇护先锋艺术">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {ddp:4, spd:2, idealism:3, dnvp:-3, economy:2} _ev_idx>>\ <span class="txt-sys">//(DDP信任+4 · SPD信任+2 · 理想+3 · DNVP信任-3)//</span> <<promise-write "middle" "资助柏林先锋艺术" 60>>\ <span class="txt-sys">//(你当众允诺:资助先锋艺术。这笔账写进了欠条簿,国会见。)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "下令禁展,向右翼让步">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {dnvp:3, gov_trust:1, ddp:-4, idealism:-3, spd:-2} _ev_idx>>\ <span class="txt-sys">//(DNVP信任+3 · 政府信任+1 · DDP信任-4 · 理想-3)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "保持沉默,让画廊自决">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {ddp:1, gov_trust:1, social_anger:1} _ev_idx>>\ <span class="txt-sys">//(DDP信任+1 · 政府信任+1 · 社会愤怒+1)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>> \ <<link "暗中资助,不公开身份">> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <<apply-red-fx {insider:3, idealism:2, ddp:1} _ev_idx>>\ <span class="txt-sys">//(知情者+3 · 理想+2 · DDP信任+1)//</span> <<link "回到办公室" "Scene_Office">><</link>> <</link>>
/* 通用后续占位 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <div class="scene-block"> //这件事的余波,比想象中更深远。你走进办公室,发现桌上多了一份你无法预料的报告。// </div> <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>>><</silently>> <span class="txt-sys">//(事件已了结)//</span> <<link "回到办公室" "Scene_Office">><</link>> <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* 政治暴力≥40:观察军官对时局的反应 */ //窗外传来一阵骚动,街道尽头的橱窗碎了一块。你站在军官俱乐部的窗边,没有动。// //身后的军官们也没有动。一个声音低低地说://「又开始了。」 //你没有回头,但听得出那种语气——不是愤怒,是厌倦,是见惯了之后的一种麻木。// //你记住了他们对「街头」这个词的态度。这比任何一份报告都更能说明,这个国家正在滑向哪里。// <<tag-add "知情者" "micro" 3 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <<set $npcs.army.trust to Math.max(0, Math.min(100, $npcs.army.trust + 1))>>\ <span class="txt-sys">//(知情者+3 · 军方信任+1)//</span> <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* 知情者≥15:从老兵口中套取前线消息 */ //长椅上的老兵裹着件旧军大衣,手里攥着一枚磨光的硬币。你在他身边坐下,什么也没说。// //过了很久,他先开口://「你也是从那边来的?」 //你摇了摇头,没有否认,也没有承认。他又看了你一会儿,然后低声说了几个地名、几个番号。// //那些话里没有数字,没有战报,只有一个人对另一段记忆的确认。// //你记住了。在柏林,老兵的沉默比任何人的谎言都可靠。// <<tag-add "知情者" "micro" 3 "观察" "weimar" "region">>\ <<set $active_tags to $ret>>\ <span class="txt-sys">//(知情者+3)//</span> <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* 事件R09已处理:试探军方对第48条的态度 */ //你端起酒杯,装作不经意地问://「总统用紧急法令清剿了那帮人,你们怎么看?」 //房间里安静了一瞬。然后一个军官放下杯子,声音很平稳://「法令,总比让街上那帮人自己立规矩强。」 //另一个军官补充://「秩序需要的手,我们从来赞成。」 //你没有追问。你听懂了他们话里的意思——不是赞成共和国,是赞成一个能维持秩序的人。// //这是个危险的信号,但你记下了。 // <<set $npcs.army.trust to Math.max(0, Math.min(100, $npcs.army.trust + 2))>>\ <<set $world.army_influence to Math.max(0, Math.min(100, $world.army_influence + 2))>>\ <span class="txt-sys">//(军方信任+2 · 军方影响力+2)//</span> <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* 到访≥4 且 军方信任≥50:进入本德勒大楼高层会面 */ //这一次,国防军司令部的人没有把你安排在会客室。一个副官引着你上了楼,穿过一道走廊,推开一扇厚重的门。// //门后是一张地图,和一屋子军装。他们看到你,没有敬礼,只是停下了交谈。// //墙上那幅地图,与你上次在楼下看到的那幅不同——多了几条你用铅笔也会觉得眼熟的线。// //有人推过来一把椅子://「你懂些分寸。坐吧。」 //你坐下。在1923年,能坐在这个房间里,本身就是一种信息。// <<trust-capped "army" 4>>\ <<aff-note "army" 4>>\ <span class="txt-sys">(<<print $ret>>)</span> <<rival-note-show>>\ <<link "回到蒂尔加滕" "Region_Tiergarten">><</link>>
/* ════════════════════════════════════════════════════════════ 地区拟人(旧王国 · 王座记忆) 数据在 01_init.twee 的 $region_npcs;文本池 $region_pp 见下。 - region-npc-line:按信任取档,输出该邦的会面对话语气 → $ret - region-npc-reply:输出召见回函/口信文本(发函当天显示) → $ret - region-npc-note:输出柏林手记条目(第二人称) → $ret - region-npc-trust:信任增减(0-100钳制),失败静默 ════════════════════════════════════════════════════════════ */ /* 文本池:三形态 × 六档(档位划分同政党) */ <<set $region_pp to { prussia: { dialogue: [ /* 会面对话:0-20 / 21-40 / 41-60 / 61-80 / 81-100 / 满信任 */ "他给你倒茶,倒得规矩,像完成流程。你说话时他礼貌地听着,注意力却一直放在门外那条走廊上。你走后,他多半会把茶原样倒掉。", "他坐下,但椅子拉得不近。他听完会点头,点头不是同意,是「收到」。他给中肯的判断,不多给一分。", "他会为你续第二杯茶,会留意你说了却没说完的部分。沉默后他问:「你打算让他们撑多久?」——他在意的是你的打算。", "他不再设防,会主动提起某件让他皱眉的军内传闻,像把半个阵营的顾虑摊到你面前。他信你的判断,胜过信流程。", "他很少用命令口气,更多是商量,在你疲惫时放慢话题,替你斟满杯。他对别人仍是壁垒,只在你面前,那扇门是开的。", "他几乎把「士兵」那层壳卸下来给你看,讲那些还没传回柏林的旧日许诺,讲得很慢。他说:「有些承诺,我守了一辈子。下一份,我愿守在你这儿。」" ], reply: [ /* 回音:arr=回函/口信(发函当天显示,不写具体天数,行期由系统另注),cls=会面结束收尾段落 */ { arr:"普鲁士的回函只有一行:「如约。」墨迹工整,纸上空落,连落款都压在几页以外。", cls:"" }, { arr:"普鲁士的回函照公文格式写就,除定下的行期外一字不多,落款盖得端端正正。", cls:"他不坐,站在窗边,手背在身后。你们把该谈的谈完后,他临行前回看了你一眼,补一句:「你的办公室比我想象的干净。」" }, { arr:"普鲁士的回函写:「届时到。另,随身有一套待签的命令,须当面呈。」", cls:"谈完,他把茶喝完了。走时,那套命令的落款处已经多了他的名。" }, { arr:"普鲁士的回函只有一行:「到时候见。」落款之下另有一行小字:「柏林最近的风向,到了再谈。」", cls:"他不催你,等你接话。走前他收了收衣领,像把话也一并收好了:「这话,我只在你面前说。」" }, { arr:"普鲁士的回函极短:「行期定下了。」末尾却多问一句——这两天,睡得可好。", cls:"这句不是寒暄,他在听。末了他点点头:「你把自己顾好,别的再说。」" }, { arr:"普鲁士的回函没走公文,是一张亲手写的便条:「定下了。到了先看看你,别的事都好说。」", cls:"他把一枚旧勋章放你桌上:「这是上一份承诺的凭证。现在的这份,我认你。」" } ], note: [ /* 柏林手记(第二人称) */ "普鲁士待你极疏。他对共和国的服役,只是一道没法违抗的命令。他看你,像看一道还没执行完的军令。", "普鲁士开始应召,但不肯多留。他信的不是你,是「程序」二字。你怕他把信任也当成一条待办。", "他愿意坐下来听完你说话,主动提「承诺」的次数变多了。他开始把你当半个可以托付的人,虽然他自己未必承认。", "普鲁士会先开口问你了。一个习惯了等待和服从的人开始主动,说明他把你放进了考量。这笔信任,比任何公文都重。", "他开始在你面前放松那副随时待命的站姿,问起你的近况。他知道你值得他拿「自己」来赌。", "普鲁士已把对旧承诺的那份执念交到你手里。他不再需要你记住普鲁士,他认你这个人。" ] }, bavaria: { dialogue: [ "他懒得维持坐相,把腿架到桌沿。你说正事,他听着,偶尔「嗯」一声,像在应一个远处的熟人。他递来的话,软绵绵,落不到实处。", "他请你坐下,给你倒酒,但酒倒得随他心意,并不问你要不要。他会应你几句,可话到关键处便绕开,像在逗一只北边的兔子。", "他愿意跟你碰杯了,不再单方面倒酒。他会跟你说起南方的秋天、旧王的草地,语气温软得像在回忆一个故人。", "他坐直了跟你说话,不再打量你。他会谈到他不轻易谈的、对柏林的怨,却是笑着说出的,像是已经不把你当外人。", "他会留你再多坐一会儿,说「不急着走」。他跟你说话时,眼睛看着你,不再时时飘向窗外那片看不见的南方。", "他几乎把你当成了常客。他给你斟酒时,会先问你今天累不累,会说「心烦的事,放放,明天总能顺」。他信的,是你在座的那个位置。" ], reply: [ /* arr=回函/口信(发函当天显示,不写具体天数),cls=会面结束收尾段落 */ { arr:"巴伐利亚的回函用的是旧式公文体,绕了半页纸,落到一句:「既然请了,来便是。」落款是「慕尼黑」。", cls:"" }, { arr:"巴伐利亚的回信只有一句:「去。算是给共和国一个面子。」", cls:"他坐得懒,但没走神。末了他把帽子重新扣上:「面子我给过了。往后就看共和国给不给南方体面。」" }, { arr:"巴伐利亚回信说:「来。自带一瓶像样的啤酒,北边的喝不成。」", cls:"他愿意跟你多聊几句慕尼黑的事,说着说着自己先笑了:「你这办公室,喝不出啤酒店里的人味。」他顿一下,「这话是夸你。」" }, { arr:"巴伐利亚的回信晚半日才发出,信上没先答应,先问:「听说柏林还是那股铁锈味?我倒要亲自来闻闻。」", cls:"他会提起一些只有本地人才知道的地名,像是给你递了把钥匙。走时他回头:「认得这些名字的,南方拿你当半个自己人看。」" }, { arr:"巴伐利亚的回信只有一句:「这就动身。到了,想喝你泡的。」", cls:"他坐下后,难得认真听你说完,才开口。末了他把杯子放下:「你泡的茶淡,可放得够久。我记你这份慢。」" }, { arr:"巴伐利亚没等公文走完,先捎来了口信:「别备酒,我带。老骨头认的是酒,不是椅子。」", cls:"他把那杯没喝完的酒推到你面前:「你递来的那杯,我记下了。」" } ], note: [ "巴伐利亚待你疏远,像待一个从不进南门的北客。他对共和国的态度,是礼貌里夹着一点不以为意。", "他开始应召,但仍把自己当客。他愿意来,却总说「是看在面子上」,好让你不指望他真心。", "他会主动跟你谈起慕尼黑了,酒越喝话越软。他开始把你当个「懂这边的」人来打量。", "他把本地人不轻易示人的地名和旧事讲给你听,像在告诉你——你已经被算作半个自己人了。", "他肯跟你交心了,不再用好看的客套话挡你。他信的,是你的这份慢,和你肯听他说话。", "巴伐利亚把家乡最看重的待客之道都给了你。他认你,不是因为你坐得近,是你说的话他愿意带回家乡去念叨。" ] }, saxony: { dialogue: [ "他给你倒咖啡,没放糖,也不问你喝不喝得惯。他谈事,像谈一台机器的参数,精确、冷淡、没有温度。你走时,他已经在看下一份图纸。", "他让你坐,但不看你的眼睛,盯着手里的活。他会应你,但每一句都像在计量,要算准哪句话该给到你。", "他会放下手里的工具专心听你说了。你提起一件事,他会问你「你要的是经用,还是要好看」——他认你的标准。", "他会把手上的活先收起来,把桌面腾给你。他说话时开始用「咱们」,像是把你算进了他这一伙计工的圈里。", "他像待一位老师傅那样待你,跟你商榷,而不是吩咐。他会说「你看看这样拧行不行」,听你的意见,真听。", "他把你当成了守着同一台机器的人。他给你倒咖啡,会先尝一口冷热,再递给你。他说:「经手的不能被糟蹋——这话,我对你讲,是认真的。」" ], reply: [ /* arr=应约到达显示,cls=对话结束收尾段落 */ { arr:"萨克森的回函是一张对折的纸,写着「会到」,没有日期,没有理由。", cls:"他迟了好些天才露面,说是机器运到一半,走不开。他坐下来只说正事,话不多。" }, { arr:"萨克森的回函只有一行:「行。手头这批活收个尾,就动身。」", cls:"他坐姿端正,但手指还像在拧一颗看不见的螺丝。末了他把机油在裤缝上抹了抹:「话我说了,活得当数。」" }, { arr:"萨克森回信说:「来。随身带份齿轮图纸,你看看顺不顺手。」", cls:"他愿意让你看见他摊开在做的东西了。走时他把图纸卷好:「你要是看懂了,咱们就是同一只手。」" }, { arr:"萨克森的回函比往常长了些,末尾多问一句:「最近还好?到了先说近况,再谈事。」", cls:"他说他觉得你「经得起」,所以多跟你说几句里面的话。末了他补一句:「外头的机器在跑,里头的账也有人记。」" }, { arr:"萨克森回信只有一句:「有个做了一半的零件,得搁你那儿——当面说。」", cls:"这是一份托付。他走时回头看了一眼那零件:「经手的不能被糟蹋——这话,我对你也算讲过了。」" }, { arr:"萨克森的回信来得极快,只有一行:「铣刀修好了,当面交你。」", cls:"他把铣刀放你手上:「这刀跟了我半辈子。往后你开的新活,我用它来切。」" } ], note: [ "萨克森待你像待一件出厂前还没检验的工件。他应召,但只给你他做得到的那部分,不肯多给。", "他开始应你,但仍不肯松开手上的活。他来的次数少了,可每次来,都带着一条能用的道理。", "他愿意给你看他在做的东西了,齿轮、图纸、半成件。他信你是「看得懂里面」的人。", "他肯把没做完的都放你桌上,也不再事事拆开检查你了。他开始当你是个经得住交底的人。", "他把最重要的手艺都摊给你看,也不怕你上手碰坏。他当你是能一起拧紧这颗螺丝的人。", "萨克森把吃饭的家伙都愿意交到你手里,信你不会糟蹋它。他认你,是认你「对得起材料」。" ] }, wurttemberg: { dialogue: [ "他给你倒黑咖啡,很烫,是端给你就等着它凉的那种。他谈事像读图,冰冷但精确,不给你留多余的暖。", "他请你坐,但把你的位置让在图纸对面,像隔着一道台面看你。他应的每一句,都在估算你值不值得多交代。", "他会把图纸转角给你,指着咬合处问你感想。他开始把你当个入门了的匠人,说给你听,也肯听你讲。", "他会为你备一块干净的桌布再摊图纸,像是待一位合作的老师傅。他说话带商量,不再全是吩咐。", "他待你像待一位经年合作的同门,图纸摊开,先问你意见。他信你的手,胜过信图纸他自己画的线。", "他把压箱底的样件都搬出来给你看,不藏一手。他说:「我愿意让你第一个碰它。因为你碰过的东西,我才信它能出来。」" ], reply: [ /* arr=应约到达显示,cls=对话结束收尾段落 */ { arr:"符腾堡的回函写得客气,绕了三行才落到一句:「无论如何,会到。」", cls:"他来了,也像是来做客的,谈完就起身。他把那杯咖啡喝凉了也没喝完。" }, { arr:"符腾堡回信说:「走开一下午,顶棚的事就得停半天——不过这趟,排得出来。」", cls:"他肯谈,但每一个目的都点到为止。末了他把图纸折好收进口袋:「北边的急,南边的炉,先各样顾一点。」" }, { arr:"符腾堡的回信附了一张图纸的副本,批注只有一行:「给你也看不碍事。」", cls:"他猜你懂行,想看看你怎么看。走前他看了你一眼:「你要是看得穿这条线,顶棚的事,或许能交给你。」" }, { arr:"符腾堡回信末尾问:「上次那处咬合,你想通没有?到了对一对。」", cls:"他把你当能一起磨图纸的人了。末了他把铅笔放下:「那条线,你磨得动。南边炉子我守着,北边的尺,你可以量。」" }, { arr:"符腾堡的回信写:「路上把两套方案再过一遍。你先挑,剩的我改。」", cls:"他信你挑得准。末了他把不打稿的那份留你桌上:「余料归你。看下得来,出得去东西不东西。」" }, { arr:"符腾堡随回函附了张字条:「你说要试的东西,连夜替你弄出来了,样件随行。」", cls:"那件样件磨得锃亮。字条背面还有一行小字:「成不成,看下得来的愿。」" } ], note: [ "符腾堡待你若即若离,客气里有距离。他把你看成北边一个来走动的客人,不坏,也不真心。", "他肯应你,但总留三分。你提的位子,他给得动,却不给足。他还在称量你的斤两。", "他愿意把图纸给你看了,把你当个懂工艺流程的同行。他开始认你的判断。", "他把没磨完的都摊给你,也肯听你劝哪一处焊哪一处留。他当你是能一起下料的人。", "他信你能挑出该磨的地方,肯把余料都交给你做主。你在他那儿,已经是握着同一把游标卡尺的人。", "符腾堡连样件都敢先打给你用,把你当成决定此事成败的那一双手。他认你,是认你会用东西。" ] }, baden: { dialogue: [ "他给你倒水,凉白开,端给你就自己看起书来。他说话客气、清晰,但每句都在画一条你暂时跨不过去的线。", "他给你让座,但自己坐在窗边,一半脸迎着风的来向。他答你,答得完整,却像在回答一份问卷。", "他会合上书听你说话,偶尔纠正你一两个用词。他开始把你当成「愿意把话说清楚」的人,不再糊你。", "他会把书签移开,翻到某页推给你看,「不是要你记住,是要你想」。他信你读得进去。", "他待你像待一位可以长谈的同侪,会跟你争,也会听你争。他知道你不是来敷衍共和的人。", "他把手边常读的书合上,整段话都留给你。他说:「共和要的东西,有些还没人翻。我想跟你一起翻完它。」" ], reply: [ /* arr=应约到达显示,cls=对话结束收尾段落 */ { arr:"巴登的回函是亲笔写的,字迹工整,只有一句:「应下。行期另复。」", cls:"他来了,也像隔着一扇开着的窗望你。他谈得不深,临走仍把那扇窗留着:「你若有章程要理,随时来抄。」" }, { arr:"巴登的回信只有一句:「该开开窗了,透透气。」", cls:"他肯谈,却不肯深谈。末了他把窗重新关好:「话该说的说,不该急着下的结论,再放一晚。」" }, { arr:"巴登的回信难得没先提开窗,只说:「书里那几条,到了念给你听。」", cls:"他开始把你当个「愿意听真话」的人,跟你说几句书里没有的判断。走前他添了句:「能听进去的,才算读过书。」" }, { arr:"巴登回信说:「寻着一本翻旧的小册子,你拿去翻翻,看哪条能用。」", cls:"他信你是会去读书的人。末了他把书签留给你:「翻到哪一页,你告诉我。剩下那几页,等你。」" }, { arr:"巴登的回信只有一行,字比往常急:「那件事,想清楚没有?到了要听你说。」", cls:"他把你当能一起捋章程的人。末了他点点头:「想清楚就好。章程是死的,用它的人是活的。」" }, { arr:"巴登的回函送到后,过了一阵又追来一封亲笔信,字比往常乱,像是没等墨干就送出了。", cls:"信末只有一行:「我把门给你留着。有些章程,等你好。」" } ], note: [ "巴登待你客气而疏,像待一个不会久留的访客。他信共和,却还拿不准你信不信得过。", "他开始应你,但仍隔着一段距离,像窗还开着,风还不肯停。他给的,是你能读懂的那部分。", "他肯跟你谈书里和公文里都不写的判断了。他信你是愿意弄清「章程为什么这么写」的人。", "他把翻旧的册子递到你手里,像把一扇他认为你会推开的门留给你。他当你是同读旧法典的人。", "他把你当能一起捋共和章法的人了,说话不再绕,也不再只讲给你听你喜欢听的。", "巴登把门给你留着,把你当真正可以一起守共和章程的人。他信的是你那颗想弄明白的心。" ] }, hamburg: { dialogue: [ "他给你倒咖啡,机油味混着便宜豆子,连杯子都没洗利索。他嘴上客气,眼睛盯着账本,你说的话,他听着一半,另一半在算钱。", "他让你看码头的船,却把你的位置安排在窗前,像看客。他跟你说的每一句,都标好了它能值多少钱。", "他会倒第二杯咖啡给你,开始跟你聊「风声」、聊「哪条道好走」。他把你当能互通消息的常客,不再当一次性主顾。", "他会先听完你说完,再翻开账给你看能挪出多少。他开始跟你做「不图当天结清」的买卖,把你当长期往来的主顾。", "他招呼你像招呼老买家,先问你这次缺什么周转,再谈利头。他信你,信你不会让这笔长生意破产。", "他把最上心的那条航线都肯分给你走,账本摊开不避你。他说:「这一单,我不跟你计较价。咱图的是往后的来往值当。」" ], reply: [ /* arr=应约到达显示,cls=对话结束收尾段落 */ { arr:"汉堡的回函写在一张货运单背面,只有两个字:「能来。」", cls:"他要真来了,也像是来谈一笔跟你无关的生意。谈完把单据收回去,拍了两下口袋。" }, { arr:"汉堡的回信只有一行:「拨个空,顺路到。」", cls:"他谈事,像谈运费,每一项都标好了价。末了他把账合上:「顺路的便宜,我记一次。不记第二次。」" }, { arr:"汉堡回信问:「最近码头风声,听没听到?到了细说。」", cls:"他把你当个能互通消息的人。走时他把帽子扣低:「风声这东西,听见了不算有。捂住才值钱。」" }, { arr:"汉堡回信说:「有一页账,你用得上,我带来。」", cls:"他肯跟你做「不是一次性的」买卖了。末了他把那页账折进你手里:「这笔往来,我不图当天结清。」" }, { arr:"汉堡回信没提自己的账,只问:「最近缺不缺周转?」", cls:"他把你当成了愿意长期来往的主顾。走时他笑了笑:「债账慢慢来,路得常走。咱这条,我不让它断。」" }, { arr:"汉堡的口信当天就转了回来:「你要走的那条道,我给铺平了。」", cls:"末了他补一句:「咱这笔,来往得值。以后的事,以后再算利头。」" } ], note: [ "汉堡待你像待一个临时的买主,谈完就走,账清两讫。他信的是当天能结清的数目,不信你。", "他开始跟你谈成长期生意,但要先把每一条标清楚。他信「来往」二字,但每一笔都要立字为据。", "他肯把没标价的账也跟你共享几条了,把你当个「懂行情」的常客。", "他愿意为你下垫一笔、铺一条道,不再事事求立竿见影。他把你当成「来往得久」的人。", "他把压箱底的行市都愿意递给你看,也不怕你抢他一根航线。他信你不会糟蹋这份交情。", "汉堡把你当成了最稳固的合作伙伴,账目随时给你看,路子随时给你铺。他认你,是认你这笔「长期往来」。" ] } }>> /* ---------- region-npc-trust:地区拟人信任增减(0-100钳制) ---------- 用法:<<region-npc-trust "prussia" 2>> 或 <<region-npc-trust "bavaria" -3>> 正向增与经 region-trust-capped 预算闸门;负向直接、不受限(沿用原语义)。 */ <<widget "region-npc-trust">>\ <<silently>> <<set _rnt_key to $args[0]>>\ <<set _rnt_delta to Number($args[1]) || 0>>\ <<if $region_npcs[_rnt_key]>>\ <<if _rnt_delta gte 0>>\ <<region-trust-capped _rnt_key _rnt_delta>>\ <<else>>\ <<set $region_npcs[_rnt_key].trust to Math.max(0, Math.min(100, (Number($region_npcs[_rnt_key].trust) || 0) + _rnt_delta))>>\ <</if>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- affinity-cycle-sync:好感预算周期同步(跨天/跨周重置) ---------- 用法:<<affinity-cycle-sync>> 用当前 session_day 检查 $affinity_budget 是否跨天/跨周,是则清空对应预算槽。 在可重复渠道触碰好感前调用(各 widget 内联自愈,也由 daily-tick 周期调用)。 */ <<widget "affinity-cycle-sync">>\ <<silently>> <<if not $affinity_budget or not $affinity_budget.party>><<set $affinity_budget to { day: $session_day, week: $session_day - ($session_day % 7), party: {}, region: {} }>><</if>>\ <<set _w0 to $session_day - ($session_day % 7)>>\ <<if $affinity_budget.day != $session_day>>\ <<for _cp range Object.keys($affinity_budget.party)>>\ <<set $affinity_budget.party[_cp].d to 0>>\ <</for>>\ <<for _cr range Object.keys($affinity_budget.region)>>\ <<set $affinity_budget.region[_cr].d to 0>>\ <</for>>\ <<set $affinity_budget.day to $session_day>>\ <</if>>\ <<if $affinity_budget.week != _w0>>\ <<for _cp2 range Object.keys($affinity_budget.party)>>\ <<set $affinity_budget.party[_cp2].w to 0>>\ <</for>>\ <<for _cr2 range Object.keys($affinity_budget.region)>>\ <<set $affinity_budget.region[_cr2].w to 0>>\ <</for>>\ <<set $affinity_budget.week to _w0>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- affinity-party-blocked:政党信任是否已无可加额度 ---------- 用法:<<affinity-party-blocked "spd" 3>> → $apb_blocked(true=该正增量当前完全无法生效) 复刻 trust-capped 正向分支的预算判定:每日/每周额度耗尽,或该势力信任已满 100。 供 region-action-menu 在玩家点选前标注「信任额度已尽 · 无收益」。 负向或零增量不做判定(负向不受预算限制)。 */ <<widget "affinity-party-blocked">>\ <<silently>> <<set _apb_key to $args[0]>>\ <<set _apb_amt to Number($args[1]) || 0>>\ <<set $apb_blocked to false>>\ /* <<return>> 是导航宏不是提前返回,改用 if 包裹(2026-09-21 根治) */ <<if $npcs and $npcs[_apb_key] and _apb_amt gt 0>>\ <<affinity-cycle-sync>>\ <<if not $affinity_budget.party[_apb_key]>><<set $affinity_budget.party[_apb_key] to {d:0, w:0}>><</if>>\ <<set _apb_d to Math.max(0, $affinity_caps.daily - $affinity_budget.party[_apb_key].d)>>\ <<set _apb_w to Math.max(0, $affinity_caps.weekly - $affinity_budget.party[_apb_key].w)>>\ <<set _apb_actual to Math.min(_apb_amt, _apb_d, _apb_w)>>\ <<set _apb_maxed to ((Number($npcs[_apb_key].trust) || 0) gte 100)>>\ <<set $apb_blocked to (_apb_actual lte 0 or _apb_maxed)>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- aff-note:按实际增量生成信任反馈文字 ---------- 用法:<<trust-capped "army" 1>><<aff-note "army" 1>> → $ret("军方信任+1" 或 "军方信任已到今日额度上限 · 此次无增益") 必须紧跟在 trust-capped 之后调用(读取 $trust_act_log 最后一条)。 修复"额度耗尽仍显示+N"的假反馈:显示的数字永远等于真实入账; 被每日上限裁剪时顺带说明;调用后销掉该条日志,防止跨页滞留到别的事件页。 */ <<widget "aff-note">>\ <<silently>> <<set _afn_key to $args[0]>>\ <<set _afn_e to ($trust_act_log and $trust_act_log.length gt 0) ? $trust_act_log[$trust_act_log.length - 1] : null>>\ <<set _afn_actual to _afn_e ? Number(_afn_e.got) : (Number($affinity_actual) || 0)>>\ <<set _afn_trimmed to _afn_e and (Number(_afn_e.got) lt Number(_afn_e.wanted))>>\ <<set _afn_names to {spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方", weimar:"魏玛", police:"红堡"}>>\ <<set _afn_name to _afn_names[_afn_key] ? _afn_names[_afn_key] : _afn_key>>\ <<if _afn_actual gt 0 and _afn_trimmed>>\ <<set $ret to _afn_name + "信任+" + _afn_actual + "——他今天已听够了类似的话,只收下一部分">>\ <<elseif _afn_actual gt 0>>\ <<set $ret to _afn_name + "信任+" + _afn_actual>>\ <<else>>\ <<set $ret to _afn_name + "信任已到今日额度上限 · 此次无增益">>\ <</if>>\ <<if _afn_e and _afn_e.tier_to>>\ <<set $ret to $ret + ";" + _afn_e.tier_to>>\ <</if>>\ <<if _afn_e>><<set $trust_act_log.splice($trust_act_log.length - 1, 1)>><</if>>\ <</silently>>\ <</widget>> /* ---------- affinity-region-blocked:州邦拟人信任是否已无可加额度 ---------- 用法:<<affinity-region-blocked "prussia" 2>> → $arb_blocked(true=该正增量当前完全无法生效) 语义同上,作用于 $region_npcs(region 闸门)。 */ <<widget "affinity-region-blocked">>\ <<silently>> <<set _arb_key to $args[0]>>\ <<set _arb_amt to Number($args[1]) || 0>>\ <<set $arb_blocked to false>>\ /* <<return>> 是导航宏不是提前返回,改用 if 包裹(2026-09-21 根治) */ <<if $region_npcs and $region_npcs[_arb_key] and _arb_amt gt 0>>\ <<affinity-cycle-sync>>\ <<if not $affinity_budget.region[_arb_key]>><<set $affinity_budget.region[_arb_key] to {d:0, w:0}>><</if>>\ <<set _arb_d to Math.max(0, $affinity_caps.daily - $affinity_budget.region[_arb_key].d)>>\ <<set _arb_w to Math.max(0, $affinity_caps.weekly - $affinity_budget.region[_arb_key].w)>>\ <<set _arb_actual to Math.min(_arb_amt, _arb_d, _arb_w)>>\ <<set _arb_maxed to ((Number($region_npcs[_arb_key].trust) || 0) gte 100)>>\ <<set $arb_blocked to (_arb_actual lte 0 or _arb_maxed)>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- trust-rival-cost:零和记仇(讨好一家,对立面记仇) ---------- 用法:<<trust-rival-cost "nsdap" 6>> 记仇结果**累加**进 $rival_costs(数组,每项 {party, delta}) 规则(激进党记仇制): - 讨好激进党(kpd/dnvp/nsdap/army)时,与该党立场距离远的党扣分; - 讨好温和党(spd/ddp/dvp/zentrum)最多象征性 -1(温和党之间不翻脸,保住大联盟玩法); - 扣分不占预算、不受闸门限制(负向直接生效); - 已扣到 0 的党不再扣。army 无 lean(不入 party_profile),按右翼 0.8 记。 $rival_note 存一句话摘要(如「DNVP信任-2」),空串=无记仇。 注意:本 widget 只累加不清空。每批选择开始时用 <<rival-cost-reset>> 清账, 展示处用 <<rival-note-show>> 渲染并销账,避免跨批残留。 */ <<widget "trust-rival-cost">>\ <<silently>> <<set _trc_pid to $args[0]>>\ <<set _trc_amt to Number($args[1]) || 0>>\ /* <<return>> 是导航宏不是提前返回,改用 if 包裹(2026-09-21 根治) */ <<if _trc_amt gt 0 and $npcs and $npcs[_trc_pid]>>\ <<if not $rival_costs>><<set $rival_costs to []>><</if>>\ <<if $rival_note eq null>><<set $rival_note to "">><</if>>\ <<set _trc_radical to ["kpd","dnvp","nsdap","army"]>>\ <<set _trc_all to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]>>\ <<set _trc_lean to {}>>\ <<for _trc_i to 0; _trc_i lt _trc_all.length; _trc_i++>>\ <<set _trc_p to _trc_all[_trc_i]>>\ <<set _trc_lean[_trc_p] to 0>>\ <<if _trc_p eq "army">>\ <<set _trc_lean[_trc_p] to 0.8>>\ <<elseif $party_profile and $party_profile[_trc_p] and $party_profile[_trc_p].lean>>\ <<set _trc_lean[_trc_p] to $party_profile[_trc_p].lean>>\ <</if>>\ <</for>>\ <<set _trc_is_rad to _trc_radical.includes(_trc_pid)>>\ <<for _trc_j to 0; _trc_j lt _trc_all.length; _trc_j++>>\ <<set _trc_q to _trc_all[_trc_j]>>\ <<if _trc_q eq _trc_pid>><<continue>><</if>>\ <<if not $npcs[_trc_q]>><<continue>><</if>>\ <<set _trc_dist to Math.abs(_trc_lean[_trc_pid] - _trc_lean[_trc_q])>>\ <<set _trc_cost to 0>>\ <<if _trc_is_rad>>\ /* 讨好激进党:按立场距离扣 1~3 */ <<if _trc_dist gte 1.5>><<set _trc_cost to Math.min(3, Math.ceil(_trc_amt * 0.5))>>\ <<elseif _trc_dist gte 0.9>><<set _trc_cost to Math.min(2, Math.ceil(_trc_amt * 0.4))>>\ <<elseif _trc_dist gte 0.5>><<set _trc_cost to 1>>\ <</if>>\ <<else>>\ /* 讨好温和党:只有立场很远的激进党象征性 -1 */ <<if _trc_radical.includes(_trc_q) and _trc_dist gte 1.5>><<set _trc_cost to 1>><</if>>\ <</if>>\ <<if _trc_cost gt 0 and $npcs[_trc_q].trust gt 0>>\ <<set _trc_cost to Math.min(_trc_cost, $npcs[_trc_q].trust)>>\ <<set $npcs[_trc_q].trust to $npcs[_trc_q].trust - _trc_cost>>\ /* 同党多次记仇合并为一条(跨调用累加语义) */ <<set _trc_found to -1>>\ <<for _trc_m to 0; _trc_m lt $rival_costs.length; _trc_m++>>\ <<if $rival_costs[_trc_m].party eq _trc_q>><<set _trc_found to _trc_m>><</if>>\ <</for>>\ <<if _trc_found gte 0>>\ <<set $rival_costs[_trc_found].delta to $rival_costs[_trc_found].delta - _trc_cost>>\ <<else>>\ <<set $rival_costs.push({ party: _trc_q, delta: -_trc_cost })>>\ <</if>>\ <</if>>\ <</for>>\ <<if $rival_costs.length gt 0>>\ <<set _trc_names to {spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方"}>>\ <<set _trc_parts to []>>\ <<for _trc_k to 0; _trc_k lt $rival_costs.length; _trc_k++>>\ <<set _trc_parts.push(_trc_names[$rival_costs[_trc_k].party] + "信任" + $rival_costs[_trc_k].delta)>>\ <</for>>\ <<set $rival_note to _trc_parts.join(",")>>\ <</if>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- trust-capped:政党信任统一闸门(唯一入口) ---------- 用法:<<trust-capped "army" 3>> 日常经营通道(每党每日+4/每周+12 预算) <<trust-capped "army" 6 "big">> 国家大事通道(红色事件/国会法案/一次性剧情,不设每日上限) 实际增量存 $affinity_actual,请求量存 $affinity_wanted。 正增量:日常通道经 daily/weekly 双重预算(partial 裁剪);大事通道全额生效; 两者都钳制 0-100 + 零和记仇(trust-rival-cost)。负向直接不受限。 每次调用把 {pid, wanted, got} 累加进 $trust_act_log(本批选择的「实际到账」账本), 供结果页 trust-act-note 渲染真实数值;被裁剪时另记 $affinity_cap_log 供晨报去重摘要。 口诀:日常经营有每日上限,国家大事没有。 */ <<widget "trust-capped">>\ <<silently>> <<set _tcp to $args[0]>>\ <<set _tca to Number($args[1]) || 0>>\ <<set _tcbig to ($args[2] eq "big")>>\ <<set $affinity_actual to 0>>\ <<set $affinity_wanted to _tca>>\ /* 注意:SugarCube 的 <<return>> 是「回到上一段」导航宏,不是 widget 提前返回, 在这里不会中断执行(会贯穿到后面的分支)。分支一律用 if/elseif 结构(2026-09-21 根治)。 */ <<if $npcs and $npcs[_tcp] and _tca neq 0>>\ /* 时间漂移记账:任何信任往来刷新「最后往来日」,关系冷却从这天重新数起 */ <<set $npcs[_tcp].touch_day to $session_day>>\ <<set $npcs[_tcp].drift_applied to 0>>\ /* 态度档位:进档/掉档时把新档位句带进账本(结果页顺带显示一档) */ <<attitude-tier-idx _tcp $npcs[_tcp].trust>>\ <<set _tier_from to _tier_idx>>\ <<if not $trust_act_log>><<set $trust_act_log to []>><</if>>\ <<set $trust_act_log.push({ pid: _tcp, wanted: _tca, got: 0 })>>\ <<set _tlog_idx to $trust_act_log.length - 1>>\ <<if _tca lt 0>>\ <<set _tcp_old to $npcs[_tcp].trust>>\ <<set $npcs[_tcp].trust to Math.max(0, Math.min(100, _tcp_old + _tca))>>\ /* 实际到账:被 0/100 边界截掉的部分不算数(大事通道触底同样适用) */ <<set _actual to $npcs[_tcp].trust - _tcp_old>>\ <<set $affinity_actual to _actual>>\ <<set $trust_act_log[_tlog_idx].got to _actual>>\ <<attitude-tier-idx _tcp $npcs[_tcp].trust>>\ <<if _tier_idx neq _tier_from>><<set $trust_act_log[_tlog_idx].tier_to to _tier_text>><<cross-queue-push _tcp "down">><</if>>\ /* 记忆回响:重挫(≤-6)他会记着,下次见面提旧事 */ <<if _tca lte -6>><<memory-register _tcp "trust_shock_down" "">><</if>>\ <<else>>\ <<set _actual to _tca>>\ <<if not _tcbig>>\ <<affinity-cycle-sync>>\ <<if not $affinity_budget.party[_tcp]>><<set $affinity_budget.party[_tcp] to {d:0, w:0}>><</if>>\ <<set _remain_d to $affinity_caps.daily - $affinity_budget.party[_tcp].d>>\ <<set _remain_w to $affinity_caps.weekly - $affinity_budget.party[_tcp].w>>\ <<set _actual to Math.min(_tca, _remain_d, _remain_w)>>\ <</if>>\ <<if _actual gt 0>>\ <<set _tcp_old to $npcs[_tcp].trust>>\ <<set $npcs[_tcp].trust to Math.min(100, _tcp_old + _actual)>>\ /* 实际到账:信任顶在100时,多出来的部分收不进(大事通道顶格同样适用), 预算/记仇/摘要一律按实际到账记 */ <<set _actual to $npcs[_tcp].trust - _tcp_old>>\ <<if not _tcbig>>\ <<set $affinity_budget.party[_tcp].d to $affinity_budget.party[_tcp].d + _actual>>\ <<set $affinity_budget.party[_tcp].w to $affinity_budget.party[_tcp].w + _actual>>\ <</if>>\ /* 零和:讨好一家,对立面记仇 */ <<trust-rival-cost _tcp _actual>>\ <</if>>\ <<set $affinity_actual to _actual>>\ <<set $trust_act_log[_tlog_idx].got to _actual>>\ <<attitude-tier-idx _tcp $npcs[_tcp].trust>>\ <<if _tier_idx neq _tier_from>><<set $trust_act_log[_tlog_idx].tier_to to _tier_text>><<cross-queue-push _tcp "up">><</if>>\ /* 记忆回响:大恩(≥+8)他会记着,下次见面提旧事 */ <<if _actual gte 8>><<memory-register _tcp "trust_shock_up" "">><</if>>\ <<if _actual lt _tca>>\ <<set _cap_reason to _tcbig ? "cap" : "weekly">>\ <<if not _tcbig and _remain_d lte 0>><<set _cap_reason to "daily">><</if>>\ <<if not $affinity_cap_log>><<set $affinity_cap_log to []>><</if>>\ <<set $affinity_cap_log.push({ day: $session_day, party: _tcp, wanted: _tca, got: _actual, reason: _cap_reason })>>\ <</if>>\ <</if>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- affinity-drift:关系冷却/回温(时间漂移,2026-09-21 用户定稿) ---------- 用法:<<affinity-drift>> daily-tick 每天调用,tick-cycle 60天快进批结算(公式按 idle 天数算,天然幂等)。 规则: - 冷却不是惩罚:7天没有任何往来才开始漂移,累计每10天向「常温线 30」回移 1 点(起步先回 1 点)。 高于 30 的往回落(逐渐冷却),低于 30 的往回升(差到谷底反而回温)——大家回到各自的位置上,局势如此。 - 冷却跨过档位线会推「降温」金框卡;回温跨档不推金卡——金卡只留给玩家的主动行为,回温只在汇报里提一句。 - 豁免:剧情链进行中(arc_state offered/pulling)、有未兑现承诺($promise_ledger status open)的对象。 - 魏玛不参与漂移:他有自己的疲惫/张力系统表达冷热,信任另有专门剧情链管。 - 变动记 $drift_log({pid,name,delta}),drift-report-render 读后清空。 */ <<widget "affinity-drift">>\ <<silently>> <<set _afd_anchor to 30>>\ <<set _afd_ids to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]>>\ <<set _afd_names to {spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方"}>>\ <<if not $drift_log>><<set $drift_log to []>><</if>>\ /* 未兑现承诺 → 豁免(worker→spd military→army middle→ddp foreign→dvp civil→zentrum) */ <<set _afd_promised to {}>>\ <<if $promise_ledger and $promise_ledger.length gt 0>>\ <<set _afd_map to {worker:"spd", military:"army", middle:"ddp", foreign:"dvp", civil:"zentrum"}>>\ <<for _afdp to 0; _afdp lt $promise_ledger.length; _afdp++>>\ <<set _afdl to $promise_ledger[_afdp]>>\ <<if _afdl.target and _afd_map[_afdl.target] and _afdl.status is "open">>\ <<set _afd_promised[_afd_map[_afdl.target]] to true>>\ <</if>>\ <</for>>\ <</if>>\ <<for _afdi to 0; _afdi lt _afd_ids.length; _afdi++>>\ <<set _afd_id to _afd_ids[_afdi]>>\ <<if $npcs and $npcs[_afd_id]>>\ /* 懒初始化:旧存档第一次跑,从当天开始计冷 */ <<if $npcs[_afd_id].touch_day is undefined>><<set $npcs[_afd_id].touch_day to $session_day>><</if>>\ <<set _afd_idle to $session_day - $npcs[_afd_id].touch_day>>\ <<set _afd_exempt to false>>\ <<if $party_milestones and $party_milestones[_afd_id] and ($party_milestones[_afd_id].arc_state is "offered" or $party_milestones[_afd_id].arc_state is "pulling")>><<set _afd_exempt to true>><</if>>\ <<if _afd_promised[_afd_id]>><<set _afd_exempt to true>><</if>>\ <<if not _afd_exempt and _afd_idle gte 7>>\ <<set _afd_target to 1 + Math.floor(_afd_idle / 10)>>\ <<if $npcs[_afd_id].drift_applied is undefined>><<set $npcs[_afd_id].drift_applied to 0>><</if>>\ <<set _afd_delta to _afd_target - $npcs[_afd_id].drift_applied>>\ <<if _afd_delta gt 0>>\ <<set $npcs[_afd_id].drift_applied to _afd_target>>\ <<set _afd_before to $npcs[_afd_id].trust>>\ <<if _afd_before gt _afd_anchor>>\ <<set $npcs[_afd_id].trust to Math.max(_afd_anchor, _afd_before - _afd_delta)>>\ <<elseif _afd_before lt _afd_anchor>>\ <<set $npcs[_afd_id].trust to Math.min(_afd_anchor, _afd_before + _afd_delta)>>\ <</if>>\ <<set _afd_moved to $npcs[_afd_id].trust - _afd_before>>\ <<if _afd_moved neq 0>>\ <<set $drift_log.push({ pid: _afd_id, name: _afd_names[_afd_id], delta: _afd_moved })>>\ /* 冷却跨档 → 降温金卡;回温跨档不出金卡(留给玩家主动行为) */ <<if _afd_moved lt 0>>\ <<attitude-tier-idx _afd_id _afd_before>>\ <<set _afd_t0 to _tier_idx>>\ <<attitude-tier-idx _afd_id $npcs[_afd_id].trust>>\ <<if _tier_idx neq _afd_t0>><<cross-queue-push _afd_id "down">><</if>>\ <</if>>\ <</if>>\ <</if>>\ <</if>>\ <</if>>\ <</for>>\ <</silently>>\ <</widget>> /* ---------- drift-report-render:「在你不来的日子里」 ---------- 用法:<<drift-report-render>>(办公室,紧凑一行) / <<drift-report-render "full">>(跳天汇报,整节)。 读 $drift_log 汇总冷却/回温名单,配一句局势解释(不是惩罚,是局势推着人走), 渲染后清空日志。无变动时什么都不输出。 */ <<widget "drift-report-render">>\ <<silently>> <<set _drr_mode to $args[0] ? $args[0] : "">>\ <<set _drr_txt to "">>\ <<set _drr_cool_txt to "">>\ <<set _drr_warm_txt to "">>\ <<if $drift_log and $drift_log.length gt 0>>\ <<set _drr_cool to []>>\ <<set _drr_warm to []>>\ <<for _drri to 0; _drri lt $drift_log.length; _drri++>>\ <<set _drre to $drift_log[_drri]>>\ <<if _drre.delta gt 0>><<set _drr_warm.push(_drre.name)>><<else>><<set _drr_cool.push(_drre.name)>><</if>>\ <</for>>\ <<set _drr_cool_pool to [ "{names}那边安静了下来。你们之间没有发生任何事——问题恰恰就在这里。", "{names}的回函照常到了,只是抬头又换回了全称。", "{names}那边没有翻脸,也没有让步——只是再没人提你们上次说好的事。" ]>>\ <<set _drr_warm_pool to [ "{names}那边托人带了句没头没尾的问候,问你近况。像是顺口一提。", "{names}把上次不欢而散的事,自己拣起来接着办了。没有人提为什么。" ]>>\ <<if _drr_cool.length gt 0>>\ <<set _pool to _drr_cool_pool>>\ <<pool-pick "drift_cool">>\ <<set _drr_t to $pool_pick>>\ <<set _drr_cool_txt to _drr_t.replace("{names}", _drr_cool.join("、"))>>\ <</if>>\ <<if _drr_warm.length gt 0>>\ <<set _pool to _drr_warm_pool>>\ <<pool-pick "drift_warm">>\ <<set _drr_t to $pool_pick>>\ <<set _drr_warm_txt to _drr_t.replace("{names}", _drr_warm.join("、"))>>\ <</if>>\ <<set _drr_parts to []>>\ <<if _drr_cool_txt neq "">><<set _drr_parts.push(_drr_cool_txt)>><</if>>\ <<if _drr_warm_txt neq "">><<set _drr_parts.push(_drr_warm_txt)>><</if>>\ <<set _drr_txt to _drr_parts.join(" ")>>\ <<set $drift_log to []>>\ <</if>>\ <</silently>>\ <<if _drr_mode is "full">>\ <<if _drr_txt neq "">>\ ''-- 在你不来的日子里 --'' //_drr_txt// //没人做错什么。局势推着所有人往前走,没有谁停在原地——日子久了,近的会变远,远的反而会变近。// <</if>>\ <<else>>\ <<if _drr_txt neq "">>@@.txt-muted;(_drr_txt)@@<br><</if>>\ <</if>>\ <</widget>> /* ---------- rival-cost-reset:清空本批记仇账(每批选择效果开始时调用) ---------- */ <<widget "rival-cost-reset">>\ <<silently>> <<set $rival_costs to []>>\ <<set $rival_note to "">>\ <</silently>>\ <</widget>> /* ---------- trust-act-note:渲染本批信任「实际到账」并销账 ---------- 用法:<<trust-act-note>> 在结果页调用一次。 读取 $trust_act_log,输出如「(SPD信任+1,军方信任-2——他今天已听够了类似的话,只收下一部分)」, 渲染后清空账本(同批只显示一次)。无记录时什么都不输出。 2026-10-09 记仇并账:同一党若有记仇减分($rival_costs),先并入直接增减显示净值 (净值为 0 则整行不显示);对不上号的党留给 rival-note-show 照旧显示。 */ <<widget "trust-act-note">>\ <<silently>> <<set _tan_text to "">>\ <<if $trust_act_log and $trust_act_log.length gt 0>>\ <<set _tan_names to {spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方", weimar:"魏玛", police:"红堡"}>>\ /* 裁剪标记先记(并账前):只有直接增减被预算/顶格裁掉才算「只收下一部分」,记仇减分不算 */ <<set _tan_trim to []>>\ <<for _tani to 0; _tani lt $trust_act_log.length; _tani++>>\ <<set _tan_trim.push($trust_act_log[_tani].got lt $trust_act_log[_tani].wanted)>>\ <</for>>\ /* 记仇并账:同一党的记仇减分并进直接增减那一行,只显示净值;对不上号的留给 rival-note-show */ <<if $rival_costs and $rival_costs.length gt 0>>\ <<set _tan_left to []>>\ <<for _tanr to 0; _tanr lt $rival_costs.length; _tanr++>>\ <<set _tan_hit to -1>>\ <<for _tanm to 0; _tanm lt $trust_act_log.length; _tanm++>>\ <<if $trust_act_log[_tanm].pid eq $rival_costs[_tanr].party>><<set _tan_hit to _tanm>><</if>>\ <</for>>\ <<if _tan_hit gte 0>>\ <<set $trust_act_log[_tan_hit].got to $trust_act_log[_tan_hit].got + $rival_costs[_tanr].delta>>\ <<else>>\ <<set _tan_left.push($rival_costs[_tanr])>>\ <</if>>\ <</for>>\ <<set $rival_costs to _tan_left>>\ <<set _tan_rn to "">>\ <<for _tanr to 0; _tanr lt _tan_left.length; _tanr++>>\ <<set _tan_rn to _tan_rn + (_tan_rn eq "" ? "" : ",") + (_tan_names[_tan_left[_tanr].party] ? _tan_names[_tan_left[_tanr].party] : _tan_left[_tanr].party) + "信任" + _tan_left[_tanr].delta>>\ <</for>>\ <<set $rival_note to _tan_rn>>\ <</if>>\ <<set _tan_parts to []>>\ <<set _tan_trimmed to []>>\ <<for _tani to 0; _tani lt $trust_act_log.length; _tani++>>\ <<set _tane to $trust_act_log[_tani]>>\ <<if _tane.got neq 0>>\ <<set _tan_nm to (_tan_names[_tane.pid] ? _tan_names[_tane.pid] : _tane.pid)>>\ <<set _tan_v to _tane.got>>\ <<set _tan_parts.push(_tan_nm + "信任" + (_tan_v gt 0 ? "+" : "") + _tan_v + (_tane.tier_to ? " · " + _tane.tier_to : ""))>>\ <<if _tan_trim[_tani]>><<set _tan_trimmed.push(_tan_nm)>><</if>>\ <</if>>\ <</for>>\ <<if _tan_parts.length gt 0>>\ <<set _tan_text to _tan_parts.join(",")>>\ /* 档位评语是整句(自带句号),拼进列表时收掉「。,」 */ <<set _tan_text to _tan_text.replace(/。,/g, "。")>>\ <<if _tan_trimmed.length gt 0>>\ <<set _tan_text to _tan_text + "——" + _tan_trimmed.join("、") + "今天已听够了类似的话,只收下一部分">>\ <</if>>\ <</if>>\ <</if>>\ <<set $trust_act_log to []>>\ <</silently>>\ <<if _tan_text neq "">>@@.txt-muted;(_tan_text)@@<br><</if>>\ <<cross-tier-flush>>\ <</widget>> /* ---------- trust-trim-note:只报「被每日上限裁剪」的差额 ---------- 用法:<<trust-trim-note>> 在结果页调用一次,渲染后清空账本。 适用场合:设计值已另行显示(如政党会面的灰字预告),只需在裁剪发生时补一句真话。 全部足额到账时什么都不输出;有裁剪时输出如「(SPD只收下了+2——他今天已听够了类似的话,剩下的明日再谈)」。 */ <<widget "trust-trim-note">>\ <<silently>> <<set _ttn_text to "">>\ <<if $trust_act_log and $trust_act_log.length gt 0>>\ <<set _ttn_names to {spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方", weimar:"魏玛"}>>\ <<set _ttn_parts to []>>\ <<for _ttni to 0; _ttni lt $trust_act_log.length; _ttni++>>\ <<set _ttne to $trust_act_log[_ttni]>>\ <<if _ttne.got lt _ttne.wanted>>\ <<set _ttn_nm to (_ttn_names[_ttne.pid] ? _ttn_names[_ttne.pid] : _ttne.pid)>>\ <<set _ttn_parts.push(_ttn_nm + "只收下了" + (_ttne.got gt 0 ? "+" : "") + _ttne.got)>>\ <</if>>\ <</for>>\ <<if _ttn_parts.length gt 0>>\ <<set _ttn_text to _ttn_parts.join(",") + "——他今天已听够了类似的话,剩下的明日再谈">>\ <</if>>\ <</if>>\ <<set $trust_act_log to []>>\ <</silently>>\ <<if _ttn_text neq "">>@@.txt-muted;(_ttn_text)@@<br><</if>>\ <</widget>> /* ---------- rival-note-show:渲染本批「记仇」并销账 ---------- 用法:<<rival-note-show>> 在结果页调用一次。 有记仇时输出如「(此事传开:DNVP信任-2)」,渲染后清空。 */ <<widget "rival-note-show">>\ <<silently>> <<set _rns_text to ( $rival_note and $rival_note neq "" ? "此事传开:" + $rival_note : "" )>>\ <<set $rival_costs to []>>\ <<set $rival_note to "">>\ <</silently>>\ <<if _rns_text neq "">>@@.txt-muted;(_rns_text)@@<br><</if>>\ <</widget>> /* ---------- region-trust-capped:州邦拟人信任渠道预算闸门 ---------- 用法:<<region-trust-capped "prussia" 3>> 实际增量存 $affinity_actual 语义同 trust-capped,作用于 $region_npcs。 */ <<widget "region-trust-capped">>\ <<silently>> <<set _rtq to $args[0]>>\ <<set _rta to Number($args[1]) || 0>>\ <<set $affinity_actual to 0>>\ /* <<return>> 是导航宏不是提前返回,负/正分支改 if/else(2026-09-21 根治) */ <<if $region_npcs and $region_npcs[_rtq] and _rta neq 0>>\ <<if _rta lt 0>>\ <<set $region_npcs[_rtq].trust to Math.max(0, Math.min(100, (Number($region_npcs[_rtq].trust) || 0) + _rta))>>\ <<set $affinity_actual to _rta>>\ <<else>>\ <<affinity-cycle-sync>>\ <<if not $affinity_budget.region[_rtq]>><<set $affinity_budget.region[_rtq] to {d:0, w:0}>><</if>>\ <<set _rrem_d to $affinity_caps.daily - $affinity_budget.region[_rtq].d>>\ <<set _rrem_w to $affinity_caps.weekly - $affinity_budget.region[_rtq].w>>\ <<set _ract to Math.min(_rta, _rrem_d, _rrem_w)>>\ <<if _ract gt 0>>\ <<set $region_npcs[_rtq].trust to Math.min(100, (Number($region_npcs[_rtq].trust) || 0) + _ract)>>\ <<set $affinity_budget.region[_rtq].d to $affinity_budget.region[_rtq].d + _ract>>\ <<set $affinity_budget.region[_rtq].w to $affinity_budget.region[_rtq].w + _ract>>\ <</if>>\ <<set $affinity_actual to _ract>>\ <<if _ract lt _rta>>\ <<set _rreason to "weekly">>\ <<if _rrem_d lte 0>><<set _rreason to "daily">><</if>>\ <<if not $affinity_cap_log>><<set $affinity_cap_log to []>><</if>>\ <<set $affinity_cap_log.push({ day: $session_day, party: _rtq, wanted: _rta, got: _ract, reason: _rreason })>>\ <</if>>\ <</if>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- region-npc-line:取档会面对话语气 ---------- 用法:<<region-npc-line "prussia">> → $ret */ <<widget "region-npc-line">>\ <<silently>> <<set _rn_key to $args[0]>>\ <<set _rn_t to Number($region_npcs[_rn_key].trust) || 0>>\ <<set _rn_pool to $region_pp[_rn_key].dialogue>>\ <<set _rn_idx to 0>>\ <<if _rn_t gte 100>><<set _rn_idx to 5>>\ <<elseif _rn_t gte 81>><<set _rn_idx to 4>>\ <<elseif _rn_t gte 61>><<set _rn_idx to 3>>\ <<elseif _rn_t gte 41>><<set _rn_idx to 2>>\ <<elseif _rn_t gte 21>><<set _rn_idx to 1>>\ <</if>>\ <<set $ret to _rn_pool[_rn_idx]>>\ <</silently>>\ <</widget>> /* ---------- region-npc-reply:取档召见响应 ---------- 用法:<<region-npc-reply "prussia">> 结果:$ret = 回函/口信文本(发函当天显示,不含具体天数);$region_npc_closing = 会面结束收尾段落 */ <<widget "region-npc-reply">>\ <<silently>> <<set _rry_key to $args[0]>>\ <<set _rry_t to Number($region_npcs[_rry_key].trust) || 0>>\ <<set _rry_pool to $region_pp[_rry_key].reply>>\ <<set _rry_idx to 0>>\ <<if _rry_t gte 100>><<set _rry_idx to 5>>\ <<elseif _rry_t gte 81>><<set _rry_idx to 4>>\ <<elseif _rry_t gte 61>><<set _rry_idx to 3>>\ <<elseif _rry_t gte 41>><<set _rry_idx to 2>>\ <<elseif _rry_t gte 21>><<set _rry_idx to 1>>\ <</if>>\ <<set $ret to _rry_pool[_rry_idx].arr>>\ <<set $region_npc_closing to _rry_pool[_rry_idx].cls>>\ <</silently>>\ <</widget>> /* ---------- region-npc-note:取档柏林手记条目(第二人称) ---------- 用法:<<region-npc-note "prussia">> → $ret */ <<widget "region-npc-note">>\ <<silently>> <<set _rn2_key to $args[0]>>\ <<set _rn2_t to Number($region_npcs[_rn2_key].trust) || 0>>\ <<set _rn2_pool to $region_pp[_rn2_key].note>>\ <<set _rn2_idx to 0>>\ <<if _rn2_t gte 100>><<set _rn2_idx to 5>>\ <<elseif _rn2_t gte 81>><<set _rn2_idx to 4>>\ <<elseif _rn2_t gte 61>><<set _rn2_idx to 3>>\ <<elseif _rn2_t gte 41>><<set _rn2_idx to 2>>\ <<elseif _rn2_t gte 21>><<set _rn2_idx to 1>>\ <</if>>\ <<set $ret to _rn2_pool[_rn2_idx]>>\ <</silently>>\ <</widget>> /* ---------- region-npc-arrival:依信任与稳定度结算召见行期 ---------- 用法:<<region-npc-arrival "prussia">> → $ret(天数) 规则:正常 5-7 天;高信任更快(2-3天/隔日);低信任很慢或婉拒(8-14/不出席)。 稳定度越低走得越慢,稳定度越高动身越快。 */ <<widget "region-npc-arrival">>\ <<silently>> <<set _rna_key to $args[0]>>\ <<set _rna_t to Number($region_npcs[_rna_key].trust) || 0>>\ <<set _rna_stab to Number($weimar.stability) || 50>>\ /* 基础行期(天):信任越高越快 */ <<set _rna_days to 7>>\ <<if _rna_t gte 81>><<set _rna_days to 2>>\ <<elseif _rna_t gte 61>><<set _rna_days to 3>>\ <<elseif _rna_t gte 41>><<set _rna_days to 5>>\ <<elseif _rna_t gte 21>><<set _rna_days to 7>>\ <<elseif _rna_t gte 10>><<set _rna_days to 12>>\ <</if>>\ /* 稳定度修正:越低越慢,越高越快 */ <<if _rna_stab lt 30>><<set _rna_days to _rna_days + 4>>\ <<elseif _rna_stab lt 50>><<set _rna_days to _rna_days + 2>>\ <<elseif _rna_stab gte 75>><<set _rna_days to _rna_days - 1>>\ <</if>>\ <<if _rna_days lt 1>><<set _rna_days to 1>><</if>>\ <<set $ret to _rna_days>>\ <</silently>>\ <</widget>> /* ---------- region-npc-pending-arrival:查找「已到访但尚未会面」的拟人 ---------- 用法:<<region-npc-pending-arrival>> 结果:$ret = 待见之人的 key;无人待见则 $ret = "" */ <<widget "region-npc-pending-arrival">>\ <<silently>> <<set _rpa_found to "">>\ <<set _rpa_keys to ["prussia","bavaria","saxony","wurttemberg","baden","hamburg"]>>\ <<for _rpa_i to 0; _rpa_i lt _rpa_keys.length; _rpa_i++>>\ <<set _rpa_k to _rpa_keys[_rpa_i]>><<set _rpa_nd to $region_npcs[_rpa_k]>><<set _rpa_t to Number(_rpa_nd.trust)||0>>\ <<if _rpa_found eq "" and _rpa_t gte 10 and _rpa_nd.arrive_day gte 0 and _rpa_nd.arrive_day lte $session_day and (not _rpa_nd.met_last_arrival)>><<set _rpa_found to _rpa_k>><</if>>\ <</for>>\ <<set $ret to _rpa_found>>\ <</silently>>\ <</widget>> /* ---------- region-npc-summon-panel:办公室召见各地面板 ---------- 办公室调用。列出六位拟人当前可召见/在途/待见的处理位。 */ <<widget "region-npc-summon-panel">>\ <<silently>> <<set _rsp_keys to ["prussia","bavaria","saxony","wurttemberg","baden","hamburg"]>>\ <</silently>>\ <details class="dash-card dash-sec" open title="召见各地诸侯;行期受信任与共和国稳定度影响">\ <summary class="dash-chip">召见各地(点此收合)</summary>\ <<for _rsp_i to 0; _rsp_i lt _rsp_keys.length; _rsp_i++>>\ <<set _rsp_k to _rsp_keys[_rsp_i]>><<set _rsp_nd to $region_npcs[_rsp_k]>><<set _rsp_t to Number(_rsp_nd.trust)||0>>\ <<set _rsp_days_left to _rsp_nd.arrive_day - $session_day>>\ <<set _rsp_cooled to 12>><<set _rsp_cool_left to 0>>\ <<if _rsp_nd.last_meet_day gte 0>><<set _rsp_cool_left to _rsp_cooled - ($session_day - _rsp_nd.last_meet_day)>><</if>>\ <<if _rsp_cool_left lt 0>><<set _rsp_cool_left to 0>><</if>>\ <<if _rsp_t lt 10>>\ <span class="rm-hint">''$region_npcs[_rsp_k].short_name''(信任 _rsp_t)· 婉拒召见</span>\ <<elseif _rsp_cool_left gt 0>>\ <span class="rm-hint">''$region_npcs[_rsp_k].short_name''(信任 _rsp_t)· 休整中,还有 _rsp_cool_left 天可再召见</span>\ <<elseif _rsp_nd.arrive_day gte 0 and _rsp_days_left gt 0>><span class="rm-hint">''$region_npcs[_rsp_k].short_name''(信任 _rsp_t)· 在途,约 _rsp_days_left 天到</span>\ <<elseif _rsp_nd.arrive_day gte 0 and _rsp_days_left lte 0>>\ <span class="rm-hint">''$region_npcs[_rsp_k].short_name''(信任 _rsp_t)· </span>\ <<capture _rsp_k>>\ <<link "已在待客厅等你" "Scene_RegionNpcMeet">><<set $region_npc_target to _rsp_k>><<set $region_npcs[_rsp_k].met_last_arrival to true>><<set $region_npc_chat to {}>><</link>>\ <</capture>>\ <<else>>\ <<region-npc-arrival _rsp_k>>\ <span class="rm-hint">''$region_npcs[_rsp_k].short_name''(信任 _rsp_t)· </span>\ <<capture _rsp_k>>\ <<link "发函召见" "Scene_RegionNpcSummon">><<set $region_npc_target to _rsp_k>><<region-npc-arrival _rsp_k>><<set $region_npcs[_rsp_k].arrive_day to $session_day + $ret>><</link>> <<print $ret>> 天\ <</capture>>\ <</if>>\ <br>\ <</for>>\ </details>\ <</widget>> /* ---------- 会面聊天文本池 $region_chat_pp ---------- 结构:每人一个话题数组 topics[],each { label, dep: [3层] } 每层 dep[i] = { text, req };req 为该层所需最低信任。 规则:抽中话题后,显示「当前信任能到达的最高层」; 「继续聊」→ 若信任>=下一层 req 则加深,否则对方打住; 「换话题」→ 短期内不重复;「结束」→ 退出。 TP:一个话题一次 TP;换话题重新消耗。 去具象化:只写语气/用词/内容,动作用最泛的(倒茶/沉默/递东西/看窗外)。 */ <<set $region_chat_pp to { prussia: [ { label:"问他如何看待眼前的权力", dep:[ { text:"他先给你倒茶,倒得很慢,像在等你想清楚才肯落座。他谈权力时不用大词,只说「那是一种要背多久都不会放下来的东西」。", req:0 }, { text:"他话里多了一层「守」字。他说如今这些坐在位子上的人,多半不懂「答应过的事」四个字的分量,可那东西不能散。", req:45 }, { text:"他忽然低下去,说有些诺言是拿整代人签的,签的时候那批人还在;如今人都不在了,纸还留着,等着有人重新认得字。", req:75 } ] }, { label:"顺着他,谈谈旧日的王国", dep:[ { text:"他说起从前,像在念一段别人家的家谱。讲得很平,可收尾总落在一句「那地方,如今还叫旧名字」。", req:0 }, { text:"他不辩解,只说王冠也好、铁十字也好,都是样子;真正要紧的是底下那根脊梁,有没有人还替它撑着。", req:45 }, { text:"他说那句「有些事,签了就是一辈子」,说得极慢。窗外起了风,他连头也没抬,仿佛早听过很多回。", req:75 } ] }, { label:"问他真正所求", dep:[ { text:"他肯说了,却仍是绕着话走:他说他不求位子,只求别让人把「该记得的」从纸上划掉。", req:0 }, { text:"他说他最怕的不是败,是被人忘。一个愿意服从了一辈子的人,最怕的不再是得不到令,而是再没人下令。", req:45 }, { text:"他把话说到了底:「我不等谁来复位。我等的是,有人想起来,我们早就答应了什么,还把它当真。」他望着窗外,那句话像是说给他自己听的。", req:75 } ] } ], bavaria: [ { label:"问他如何看待眼前的权力", dep:[ { text:"他笑说柏林的把式他学不会,也懒得学。他谈权力,用的是「那东西远,远得像南边的天气」,软绵绵,却有了距离。", req:0 }, { text:"他说南方自有一套过日子的法子,不必事事听北边的。话还是软,可你已经听得出一根不肯弯的骨头。", req:45 }, { text:"他说他念的从来不是谁的治理,是那块地能不能按自己慢的节奏活下去。他不想争,可也从没打算让。", req:75 } ] }, { label:"顺着他,谈谈旧日的王国", dep:[ { text:"他说王冠丢了也就丢了,反正那东西戴着沉。可他还记得,地从前是会自己往上走的,如今的人把它当成了常年停工的铺子。", req:0 }, { text:"他讲起从前,语气像在讲一个没走远的故人,笑着,却不敢回头细看。他说有些东西,不是人夺走的,是慢慢不被人记得了。", req:45 }, { text:"他声音低下去,说他最怕有一天连自己也忘了,这块地原本可以叫一个更好的名字。话到这儿,他不再往下讲。", req:75 } ] }, { label:"问他真正所求", dep:[ { text:"他说他不求什么,只盼多两句南边过活的闲话。可你听得出,那闲话背后压着一句没出口的话。", req:0 }, { text:"他说他想问一句:这地还认不认得自己人。每个人都在忙,忙到没人记得问一句「你还过得好吗」。", req:45 }, { text:"他到底说了:「我只怕哪天连我自己也忘了,我本可以不叫这个名。」那句话他说得很快,快得像不想让自己听清。", req:75 } ] } ], saxony: [ { label:"问他如何看待眼前的权力", dep:[ { text:"他不大谈位子,谈的是东西经不经用。他说权力也一样,看着光鲜,实不实得看底下那架机器转不转得动。", req:0 }, { text:"他说柏林近来那些是是非非,多半是「只顾着好看,不顾经用」。他说话仍是师傅量活的口吻,实、稳、不绕。", req:45 }, { text:"他说他信的不是谁坐那把椅子,是那件活儿到底有没有人认真经手。活儿散久了,椅子再好看也是空架子。", req:75 } ] }, { label:"顺着他,谈谈旧日的王国", dep:[ { text:"他说从前那儿也是要出货的,只是如今出货换成了出话。他不念旧,只念东西得有人经手到完。", req:0 }, { text:"他提起德累斯顿那些银器,说那才是经得住用的东西,不是摆着好看的。「共和国,也该是件经得住用的东西。」他说这话时,眼睛没抬,手上也没停。", req:45 }, { text:"他说那顶旧王冠摆着好看,可经手的是人心里的那杆秤。秤平不平,跟坐不坐得高没有关系。", req:75 } ] }, { label:"问他真正所求", dep:[ { text:"他说他不怕活多,怕的是没人接。有些手艺,等到没人传的时候,才有人想起它是可以一直传下去的。", req:0 }, { text:"他说他求的不多,只盼这件活别在他手里断了线。他一辈子守着台机器,图的就是它别停。", req:45 }, { text:"他说得郑重:「我怕的不是下不来,是有天覆水难收,人才开始想起,有些事本可以不发生。」他到这儿就没再往下说。", req:75 } ] } ], wurttemberg: [ { label:"问他如何看待眼前的权力", dep:[ { text:"他给你递了张图纸,说柏林那把尺量得太急。他谈权力,谈的是「经得住下传」四个字,急出来都不长久。", req:0 }, { text:"他说他见过那些急着定下的规矩,用着用着就磨坏了。「好东西是磨出来的,不是抢出来的。」", req:45 }, { text:"他说如今这个德国,最缺的不是一把新尺,是肯慢慢把它校准的人。他说的慢,是一种沉。", req:75 } ] }, { label:"顺着他,谈谈旧日的王国", dep:[ { text:"他说他家一向讲「经得住」。王座也好,作坊也好,都得是件能传下去的东西,才配叫东西。", req:0 }, { text:"他谈起从前,谈的不是荣耀,是「东西得有人接手」。他说一个空了太久的位子,内里会先空塌下去。", req:45 }, { text:"他低声道 —— 有些传了多年的规矩,如今没人接了。他不等旧的回来,只怕将来连怎么接,也一并被人忘了。", req:75 } ] }, { label:"问他真正所求", dep:[ { text:"他说他只问一句:眼下的德国,经不经得住下传。不求谁回头,只求活往下还有得接。", req:0 }, { text:"他说他放心不下一件还没做完的活。那块铁还没掐出形状,他不知道是该继续打,还是就此放着。", req:45 }, { text:"他把那份心思端到你面前,像端一杯仍烫着的黑咖啡:「有些东西,凉了就只配谈过去。我巴不得它还烫着。」", req:75 } ] } ], baden: [ { label:"问他如何看待眼前的权力", dep:[ { text:"他给你倒了杯凉白开,说清醒要紧。他谈权力,谈的是章程,条条都是能让人夜里睡稳的线。", req:0 }, { text:"他说共和要的不是一时痛快,是几条真正写得成又守得住的规矩。他说这话时,声音平得像在念条文,却格外笃定。", req:45 }, { text:"他说他不怕共和慢,怕的是没人肯为它写那几行长久的东西。他望着窗外,说风总会把旧事吹散的。", req:75 } ] }, { label:"顺着他,谈谈旧日的王国", dep:[ { text:"他说他不恋那把旧椅子,他自己本就是被共和请出来的。他说那不是降格,是搬了一次家。", req:0 }, { text:"他想起从前那座城的图书馆,那些没人读的旧法典。他不怀旧,只可惜那些字,如今没人肯去翻。", req:45 }, { text:"他说共和要的章程,有些其实早就写在老地方——只是现在,已经没人记得去哪儿找了。", req:75 } ] }, { label:"问他真正所求", dep:[ { text:"他说他求的是「有人肯把话说清楚」。他不喜模棱两可,那会让他睡不着。", req:0 }, { text:"他说他想要一根干干净净的线,让后来的人顺着它走,不必再猜。他信共和,就是信那根线拉得直。", req:45 }, { text:"他说得平静:「我想跟人一起,把那些还没人翻完的章程,一项一项翻完。哪怕只翻完一页也好。」", req:75 } ] } ], hamburg: [ { label:"问他如何看待眼前的权力", dep:[ { text:"他不谈谁坐那把椅子,他谈船。他说权力像个港,谁是船都得来停一停,可别把港当作自己的家。", req:0 }, { text:"他说这几年港里的风向变来变去,可船还得开。谁谈理念不重要,重要的是货别砸在手里。", req:45 }, { text:"他说他要的一直很简单:往来顺畅,账目明白。他信的是能过手的实在,不是高高在上的说辞。", req:75 } ] }, { label:"顺着他,谈谈旧日的王国", dep:[ { text:"他说他这儿从来不是王国,也没当过。他的荣光是「成为所有人经过的地方」。这话里有一种不争的骄傲。", req:0 }, { text:"他说自由港的好处,是谁都能来,也都能走,可都得从他这儿过。他不上台,可谁上台都得跟他打交道。", req:45 }, { text:"他说他记得每一处老码头的深浅,也记得哪条航路是几代人走出来的。那些比任何旗号都牢。", req:75 } ] }, { label:"问他真正所求", dep:[ { text:"他说他求的简单:货通、账清、路别断。他不做亏本买卖,也不跟老朋友计较那点零头。", req:0 }, { text:"他说他怕的不是风浪,是港里没人来往了。一个没人经过的地方,叫什么名字都只是白写。", req:45 }, { text:"他说到底:「我盼的,是这条路谁都走得,也都记得是从我这儿过的。来往得久,比一次赚得多要紧。」", req:75 } ] } ] }>>
/* 召见某位邦国拟人,展示对方的回应与预计行期 */ <<silently>>\ <<set _k to $region_npc_target>>\ <<region-npc-reply _k>>\ <</silently>>\ //你差人把请柬送往$region_npcs[_k].short_name。// //远在$region_npcs[_k].base_city的他,给出了回音:// //$ret// <<silently>><<set _days to $region_npcs[_k].arrive_day - $session_day>><</silently>>\ //(预计 <<print _days>> 天后到访)// <<link "回到办公室" "Scene_Office">><</link>>
/* 会面聊天:玩家从话题列表主动选择;每个话题按信任取所能及的最高层; 可沿话题加深;最多换 2 次话题;每个新话题耗 1 TP;结束退出。 */ <<silently>>\ <<set _mk to $region_npc_target>>\ <<set $region_npcs[_mk].visit_count to ((Number($region_npcs[_mk].visit_count) || 0) + 1)>>\ <<if (not $region_npc_chat) or ($region_npc_chat.key neq _mk)>>\ <<set $region_npc_chat to { key:_mk, topic:null, depth:0, used:[], switches:0 }>>\ <</if>>\ <<set _mtrust to Number($region_npcs[_mk].trust)||0>>\ <<set _mtopics to $region_chat_pp[_mk]>>\ <</silently>>\ //你见到了$region_npcs[_mk].short_name。// <<if $region_npc_chat.topic is null>>\ <<if $tp lt 1>>\ //你有些疲惫,今日怕是谈不成了。// <<link "起身告辞" "Scene_Office">><</link>>\ <<else>>\ ''你想聊点什么:''\ <<for _mi to 0; _mi lt _mtopics.length; _mi++>>\ <<if not $region_npc_chat.used.includes(_mi)>>\ <<capture _mi _mtopics _mtrust>>\ <<link "_mtopics[_mi].label" "Scene_RegionNpcMeet">><<set $region_npc_chat.topic to _mi>><<set $region_npc_chat.depth to 0>><<set $region_npc_chat.used.push(_mi)>><<for _ml to 0; _ml lt _mtopics[_mi].dep.length; _ml++>><<if _mtrust gte _mtopics[_mi].dep[_ml].req>><<set $region_npc_chat.depth to _ml>><</if>><</for>><<set $tp to Math.max(0, $tp - 1)>><</link>> <span class="txt-sys">(1 TP)</span>\ <</capture>>\ <br>\ <</if>>\ <</for>>\ <<if $region_npc_chat.used.length gte _mtopics.length>>\ <span class="rm-hint">//他想了想:「想聊的都聊过了。」//</span>\ <br>\ <</if>>\ <<link "结束这次谈话" "Scene_RegionNpcEnd">><</link>>\ <</if>>\ <<else>>\ <<set _mt to _mtopics[$region_npc_chat.topic]>><<set _md to $region_npc_chat.depth>>\ <<set _can_deep to _md + 1 lt _mt.dep.length and _mtrust gte _mt.dep[_md + 1].req>>\ <span class="rm-hint">''话题:_mt.label''</span>\ //_mt.dep[_md].text// <br> ''你怎么接:'' <br> <<if _can_deep>>\ <<link "继续聊下去">><<set $region_npc_chat.depth to _md + 1>><<goto "Scene_RegionNpcMeet">><</link>> <span class="txt-sys">(聊得更深一层)</span>\ <<else>>\ <span class="rm-hint">//他说:「今天就到这儿吧。」//</span>\ <</if>>\ <br> <<if $tp gte 1 and $region_npc_chat.switches lt 2 and $region_npc_chat.used.length lt _mtopics.length>>\ <<link "换个话题">><<set $region_npc_chat.switches to $region_npc_chat.switches + 1>><<set $region_npc_chat.topic to null>><<set $region_npc_chat.depth to 0>><<goto "Scene_RegionNpcMeet">><</link>> <span class="txt-sys">(重置选题,新话题 1 TP)</span>\ <br>\ <</if>>\ <<link "结束这次谈话" "Scene_RegionNpcEnd">><</link>>\ <</if>>
/* 会面收尾幕:展示该次召见的结束段落(cls),随信任档位变化 */ <<silently>>\ <<set _rne_k to $region_npc_target>>\ <<region-npc-reply _rne_k>>\ <<set $region_npc_chat to {}>><<set $region_npcs[_rne_k].met_last_arrival to true>><<set $region_npcs[_rne_k].last_meet_day to $session_day>><<set $region_npcs[_rne_k].arrive_day to -1>>\ <</silently>>\ //话说到这儿,你们各自收住了声音。他端起面前的杯子,喝尽最后一口,像是把这场谈话也一并咽下去。// <<if $region_npc_closing neq "">>\ //$region_npc_closing//\ <<else>>\ //他把话讲完,起身告辞。//\ <</if>>\ <br> <<link "目送他离开,回到办公室" "Scene_Office">><</link>>
/* ============================================================ 区域氛围生成器 根据地点×时段×魏玛状态,抽取1-2条氛围句拼接 结构:主干句(地点×时段)+ 状态后缀(可选) 复用现有 pool-draw,不新增变量 ============================================================ */ /* ---------- region-atmosphere:生成区域氛围文字 ---------- 用法:<<region-atmosphere "kreuzberg">> 输出存入 $atmo_text */ <<widget "region-atmosphere">>\ <<silently>> <<set _region to $args[0]>> <<set _phase to $tp_phase>> /* 1上午 2下午 3傍晚 4夜晚 */ <<set $atmo_text to "">> /* 1. 主干句:按地点×时段选池子,池子不存在则回退到morning */ <<set _phase_name to "morning">> <<if _phase eq 2>><<set _phase_name to "afternoon">> <<elseif _phase eq 3>><<set _phase_name to "evening">> <<elseif _phase eq 4>><<set _phase_name to "night">> <</if>> <<set _main_pool to "atmo_" + _region + "_" + _phase_name>> /* 回退:如果该时段池子不存在,用morning */ <<if not $pools[_main_pool]>> <<set _main_pool to "atmo_" + _region + "_morning">> <</if>> <<pool-draw _main_pool 1>> <<if $pool_result.length gt 0>> <<set $atmo_text to $pool_result[0].text>> <</if>> /* 2. 状态后缀:根据魏玛状态选池子,50%概率追加 */ <<set _suffix_pool to "">> <<if $weimar.surface.anxiety gte 40>> <<set _suffix_pool to "atmo_suffix_anxiety">> <<elseif $weimar.surface.fatigue gte 60>> <<set _suffix_pool to "atmo_suffix_fatigue">> <<elseif $weimar.mid.democracy_trust gte 70>> <<set _suffix_pool to "atmo_suffix_hope">> <</if>> <<if _suffix_pool neq "" and random(1, 100) lte 50>> <<pool-draw _suffix_pool 1>> <<if $pool_result.length gt 0>> <<set $atmo_text to $atmo_text + " " + $pool_result[0].text>> <</if>> <</if>> /* 3. 玩家感知后缀:根据玩家自身状态(疲惫/多疑/理想/孤立)追加一句 复用 echo_perception 池(条件已绑定 player.mental.xxx) 40%概率触发,让同一区域对不同状态的玩家呈现不同文字 */ <<if random(1, 100) lte 40>> <<pool-draw "echo_perception" 1>> <<if $pool_result.length gt 0>> <<set $atmo_text to $atmo_text + " " + $pool_result[0].text>> <</if>> <</if>> /* 4. 世界状态变体句:35%概率,从分级文本里抽一句追加 根据当前最高的世界变量,选择对应维度的感官描写 */ <<if random(1, 100) lte 35 and $world_feedback>> <<set _wf_keys to []>> <<if $world.economy gte 50>><<run _wf_keys.push("economy")>><</if>> <<if $world.social_anger gte 40>><<run _wf_keys.push("social_anger")>><</if>> <<if $world.political_violence gte 30>><<run _wf_keys.push("political_violence")>><</if>> <<if $world.inflation gte 50>><<run _wf_keys.push("inflation")>><</if>> <<if $world.nationalism gte 40>><<run _wf_keys.push("nationalism")>><</if>> <<if $world.gov_trust lt 30>><<run _wf_keys.push("gov_trust")>><</if>> <<if _wf_keys.length gt 0>> <<set _wf_pick to _wf_keys[random(0, _wf_keys.length - 1)]>> <<if $world_feedback[_wf_pick]>> <<for _wfi to 0; _wfi lt $world_feedback[_wf_pick].range.length; _wfi++>> <<if $world[_wf_pick] lte $world_feedback[_wf_pick].range[_wfi].max>> <<set $atmo_text to $atmo_text + " " + $world_feedback[_wf_pick].range[_wfi].text>> <<set _wfi to $world_feedback[_wf_pick].range.length>> <</if>> <</for>> <</if>> <</if>> <</if>> /* 季节环境层:按当前月份给地区氛围文最前面加一句季节开头(不绑定任何事件,纯环境) */ <<set $season to "winter">> <<if $date.month gte 3 and $date.month lte 5>><<set $season to "spring">> <<elseif $date.month gte 6 and $date.month lte 8>><<set $season to "summer">> <<elseif $date.month gte 9 and $date.month lte 11>><<set $season to "autumn">> <</if>> <<set _season_line to "">> <<if $season is "winter">><<set _season_line to "隆冬。寒气从窗缝里渗进来,屋檐下挂着成排的冰棱,配给券上的墨迹被冻得发脆。">> <<elseif $season is "spring">><<set _season_line to "残雪在檐角化尽,白昼一寸寸变长,街上的人重新能分清白天和黑夜。">> <<elseif $season is "summer">><<set _season_line to "暑气正盛。柏油路上浮着一层热浪,遮阳棚的影子短得几乎不存在。">> <<elseif $season is "autumn">><<set _season_line to "风里开始带着干枯与铁锈的气味,天色比上星期暗得更早。">> <</if>> <<if _season_line neq "">><<set $atmo_text to ($atmo_text and $atmo_text.length gt 0 ? _season_line + "\n\n" + $atmo_text : _season_line)>><</if>> <</silently>>\ <</widget>> /* ---------- deep-region-text:深耕区三段式文本 ---------- 用法:<<deep-region-text "kreuzberg">> 根据区域 stability 显示不同文字: - stability < 40:危机状态 - stability 40-65:动荡状态(玩家投入后改善) - stability > 65:稳定状态,30%概率触发大片段奖励 输出存入 $deep_text */ <<widget "deep-region-text">>\ <<silently>> <<set _dr to $args[0]>> <<set _stab to $regions[_dr].stability>> <<set $deep_text to "">> <<if _dr eq "kreuzberg">> <<if _stab lt 40>> <<set $deep_text to "克罗伊茨贝格的早晨从罢工哨声开始。你走过结冰的街道,面包店门口的队伍已经拐了两个弯,人们呼出的白气和煤烟混在一起。\n\n墙上的红漆字迹还没干透:饥饿即暴力。下面有人补了一句:暴力即面包。\n\n一个穿工装的男人盯着你看了很久。他的眼神不是辨认你是谁,而是在评估你能换多少斤土豆。">> <<elseif _stab lte 65>> <<set $deep_text to "你再次来到克罗伊茨贝格时,发现那面涂着红漆的墙被刷成了白色。不是政府派的清洁工,是工人们自己干的,刷痕粗糙,边角还留着没盖住的红。\n\n工会门口站着一个手指粗得像香肠的男人。他认出了你,没有敬礼,只是点了点头,把一杯还冒着热气的麦芽咖啡推到你面前。杯子缺了个口,但里面是满的。">> <<else>> <<set $deep_text to "傍晚的克罗伊茨贝格有一种奇怪的宁静。你坐在工会二楼的窗前,看着下面放学的孩子在结冰的路面上打滑,笑声传得很远。\n\n远处传来手风琴声,不是政治歌曲,只是一首古老的柏林民谣,关于一个水手和一只猫。楼下,一个手指粗得像香肠的男人在和年轻人争论,声音很大,但没有砸东西,没有人拔刀,没有人喊口号。">> <<if random(1, 100) lte 30>> <<set $deep_text to $deep_text + "\n\n你知道这种宁静是借来的。全德国的经济仍在崩溃,威丁区今晚大概又有冲突,纸马克在印刷厂里还在疯狂增殖。但在这个街区,在这个时刻,人们选择相信某种秩序。\n\n你想起上周从这里离开时,一个女工塞给你一块用报纸包着的肥皂。报纸上是昨天的股价,已经作废了,但肥皂是真的,能洗出手上的煤烟味,也能洗掉一点那种总是跟着你的焦虑。\n\n这就是克罗伊茨贝格给你的礼物:不是胜利,不是历史的转向,而是一个还能坐下来的地方,一杯苦但热的咖啡,一块包在废纸里的肥皂。">> <</if>> <</if>> <<elseif _dr eq "kurfurstendamm">> <<if _stab lt 40>> <<set $deep_text to "选帝侯大街的夜晚是不真实的。霓虹灯管在潮湿的空气中嗡嗡作响,把雨水照成粉红色。\n\n你走过一家皮草店,橱窗里的模特穿着貂皮大衣,标价牌上的数字长得让店员懒得更新。街角的咖啡馆里,有人用美元付账,侍应生接过钞票时弯了弯腰,不是礼貌,是汇率。\n\n黑市商人站在电影院门口,压低声音兜售法国巧克力和鲁尔煤炭。他们的皮包里装的不是商品,是信任。">> <<elseif _stab lte 65>> <<set $deep_text to "你再次来到选帝侯大街时,发现皮草店的橱窗空了。不是卖完了,是店主主动撤下了那些刺激神经的标价牌,换上了一张手写告示:今日面包,每人限两公斤。\n\n街角那个卖法国巧克力的黑市商人还在,但他现在站在一家合法杂货铺门口,和店老板分着一根烟。你上周牵线的那笔城市食品调配协议生效了。\n\n咖啡馆的侍应生不再对美元弯腰,因为今天马克暂时还能用。">> <<else>> <<set $deep_text to "深夜的选帝侯大街有一种奇怪的秩序感。你坐在街角那家咖啡馆的露天座位上,看着雨水顺着遮阳棚的边缘滴成一道透明帘幕。\n\n霓虹灯还亮着,但不再刺眼,像是给这条街戴上了一副柔和的眼镜。驼色大衣的女人坐在你对面,她今天没带皮包,只带了一叠文件,不是黑市单据,是正经的商业注册申请。">> <<if random(1, 100) lte 30>> <<set $deep_text to $deep_text + "\n\n远处传来有轨电车的叮当声,不是罢工日的空驶,是满载着夜班工人的正常班次。咖啡馆里有人在读报纸,不是用报纸包土豆,是真的在读。\n\n你忽然反应过来:街上的人不是为理想活着的,是为了明天的早餐活着的。而明天,这里还会有早餐。这份秩序说不清好坏,但此刻是真的。">> <</if>> <</if>> <<elseif _dr eq "tiergarten">> <<if _stab lt 40>> <<set $deep_text to "蒂尔加滕的冬天是沉默的,白、空、硬。你走进林地的深处,皮靴踩在落叶上的声音太响,响到你不由自主放轻了脚步。\n\n林荫道两旁的桦树挂着经年的霜,像一排站定了的哨兵。远处,一队士兵在整理装备,动作没有多余,也不看你。你绕开他们,绕开那片被踩实的空地。\n\n空气里有雪、有皮靴的油味,还掺着一种更冷的东西:评估。这片林地没有门,却比任何房子都更让人知道——谁该走进来,谁该绕道走。">> <<elseif _stab lte 65>> <<set $deep_text to "这是你第六次在蒂尔加滕的林荫道上和他并肩走过。今天他没有急着散开,而是在一张空长椅边停了半步。\n\n鲁尔的事,他说,眼睛看着前面而不是你,你比国会那帮人处理得干净。这不是赞美,是记账。\n\n他从口袋里摸出一支烟递过来,风把烟丝吹散了一点。在蒂尔加滕的林荫道上,接不接这一支烟,就是这场谈话能走到多远的刻度。">> <<else>> <<set $deep_text to "雨夜。蒂尔加滕的林荫道在雨中黑成一整片。你撑着伞走过那排平时不亮灯的侧屋时,有一扇窗里透出昏黄——不是灯忘了关,是有人在等你。\n\n军官隔着窗台推过来一杯威士忌。下个月,他说,会有调动。不是政变,只是预防性部署。他看着你,眼神里没有试探,只有确认。\n\n雨顺着屋檐坠下来,在杯沿上敲出细碎的声响。你隔着那段距离握着那杯酒,握着一个提前知道的日期。在1923年,这就是权力。">> <<if random(1, 100) lte 30>> <<set $deep_text to $deep_text + "\n\n你知道这是一种契约:他不问你来从哪儿来,你不问他到哪儿去。你们共享的不是理想,是对失控的恐惧。\n\n窗外,蒂尔加滕的树木在雨中黑成一片,像一支沉默的军队。你想起克罗伊茨贝格那杯缺了口的麦芽咖啡,想起选帝侯大街那个倾斜十五度的咖啡杯,想起这里单麦芽威士忌的泥煤味。三个世界,三种秩序,三种互不理解但暂时共存的生存方式。\n\n你手里没有军队,但今晚,你手里有这张椅子,这杯酒,和一句提前知道的调动日期。在1923年,这就是权力。">> <</if>> <</if>> <<elseif _dr eq "friedrichshain">> <<if _stab lt 40>> <<set $deep_text to "弗里德里希斯海因的黄昏从汽笛开始。汽笛响过,街就换了内容:人行道上全是往家走的人,工具袋敲着腿。\n\n露天市场收摊了。烂掉的土豆没有人捡,捡不动,也吃不完。一个孩子蹲在收摊的菜架下面,把漏出来的土豆一个一个装进网兜。">> <<elseif _stab lte 65>> <<set $deep_text to "你再来的时候,工厂的烟囱多冒了几根。不多,但食堂的队短了一点,长凳上的饭盒有荤腥味了。\n\n夜校的窗户亮到九点。窗纸上映着一排一排的脑袋,听识字课的,也有听算术的。楼下卖热麦芽咖啡的摊子生意不好不坏,摊主认得你,没招呼,只把火拨旺了些。">> <<else>> <<set $deep_text to "傍晚的人民公园有了人声。工会的乐队在凉亭里排练,铜管走了调,没有人喝倒彩。\n\n长椅上坐着一对年轻人,分吃一包纸包的炸鱼。湖水没有全化,冰碴子贴着岸边。你走过的时候,凉亭里的曲子换了一支,换成一支很老的,几乎是摇篮曲。">> <</if>> <<elseif _dr eq "unter_den_linden">> <<if _stab lt 40>> <<set $deep_text to "菩提树下大街刮着过堂风。大学门口的布告栏钉满了,一层摞一层,最底下那层已经看不清日期。\n\n军械库门前站岗的换了新兵,靴子擦得很亮。街上的教授和学生各自低头走路,谁也不看谁。这条街的体面是硬撑着的,风一吹,就听见它在响。">> <<elseif _stab lte 65>> <<set $deep_text to "你再走这条街时,旧书店的橱窗换了陈列——和约的册子收起来了,摆上歌德和席勒,烫金的,摆得很正。\n\n大学门口有人在发音乐会的传单,巴赫,教堂版。接传单的人不少。你也接了一张,纸很薄,字是排印的,比街头的油印体面。">> <<else>> <<set $deep_text to "傍晚的街亮了灯。歌剧院的柱廊下停着马车和汽车,马打着响鼻。咖啡馆里传出钢琴声,弹的是练习曲,弹的人不熟练,但没有停。\n\n大学的老看门人扫着台阶,看见你,把扫帚立住,点了点头。他记得每一张常来的脸。">> <</if>> <<elseif _dr eq "charlottenburg">> <<if _stab lt 40>> <<set $deep_text to "夏洛滕堡的夜晚安静得有分量。住宅区的窗户不透光,街上没有摊贩,连狗叫都隔着院子。\n\n一个穿旧军大衣的男人在路灯下站了很久,看着自家窗户。窗里有灯,人没有下来。你走过的时候,他立正了——不是对你,是对街对面飘来的一段军歌。">> <<elseif _stab lte 65>> <<set $deep_text to "军官住宅区的院墙里传出锅铲声。粮价稳了一点,太太们敢在门口站着聊天了,聊的都是儿子们什么时候能补上缺。\n\n技术大学的灯亮到很晚。门口的自行车多了几辆,车把上挂着图纸筒。一个学生在路灯下背书,背的是化学公式,一页一页翻得很急。">> <<else>> <<set $deep_text to "茶会后的人流散在街上,笑声隔着院墙传出来。猎犬趴在门房边上,见了生人只抬一下眼皮。\n\n俱乐部里的牌局散得晚。你路过时门开了,牌桌的热气涌出来,混着雪茄味。有人送客到台阶上,说的是:下周还来。">> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weekly-theme:周主题氛围文 ---------- */ <<widget "weekly-theme">>\ <<silently>> <<set $weekly_text to "">> <<if $skip_info eq null>> <<set _week to Math.ceil($session_day / 7)>> <<if _week lt 1>><<set _week to 1>><</if>> <<if _week gt 9>><<set _week to 9>><</if>> <<if _week neq $last_weekly_week>> <<set $last_weekly_week to _week>> <<if $weekly_themes[_week - 1] and $weekly_themes[_week - 1].global neq "(待填充)">> <<set $weekly_text to $weekly_themes[_week - 1].global>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weekly-slice:区域微观切片 ---------- */ <<widget "weekly-slice">>\ <<silently>> <<set $slice_text to "">> <<if $skip_info eq null>> <<set _ws_region to $args[0]>> <<set _ws_week to Math.ceil($session_day / 7)>> <<if _ws_week lt 1>><<set _ws_week to 1>><</if>> <<if _ws_week gt 9>><<set _ws_week to 9>><</if>> <<if $weekly_themes[_ws_week - 1] and $weekly_themes[_ws_week - 1].slices[_ws_region]>> <<set _ws_slice to $weekly_themes[_ws_week - 1].slices[_ws_region]>> <<if _ws_slice neq "(待填充)">> <<set $slice_text to _ws_slice>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>>
/* ============================================================ 区域随机事件系统("世界活过来") 玩家进入区域时,根据地点+标签+世界状态,有概率触发随机小事件 设计(DoL式内联交互): 1. 每个区域有专属事件池(atmo_event_地点) 2. 事件带条件(标签强度/世界变量/时段/疲惫) 3. 进入区域时50%概率触发1个 4. 事件文字+回应/无视选项内联显示在当前页面 5. 点击后用 <<link>>+<<replace>> 原地展开结果,不跳转页面 6. 回应文本根据事件 tags 关键词动态生成(不再千篇一律) ============================================================ */ /* ---------- region-event-roll:区域随机事件检定 ---------- */ <<widget "region-event-roll">>\ <<silently>> <<set $region_event to null>> <<set _region to $args[0]>> <<set _pool_name to "atmo_event_" + _region>> <<if not $pools[_pool_name]>> <<set _pool_name to "atmo_event_street">> <</if>> <<if not $pools[_pool_name]>> <<set $region_event to null>> <<else>> /* 知情者数值影响触发概率:基础30%,知情者每+1增加3%,最高80% */ <<set _trigger_chance to 30>> <<for _ti to 0; _ti lt $active_tags.length; _ti++>> <<if $active_tags[_ti].name eq "知情者">> <<set _trigger_chance to Math.min(80, _trigger_chance + $active_tags[_ti].intensity * 3)>> <</if>> <</for>> <<if random(1, 100) lte _trigger_chance>> <<pool-draw _pool_name 1>> <<if $pool_result.length gt 0>> <<set $region_event to $pool_result[0]>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- region-event-render:内联渲染区域随机事件 ---------- 选项旁标注后果提示,回应文本根据事件 tags 动态生成 */ <<widget "region-event-render">>\ <<if $region_event neq null>>\ <hr> <<if $region_event.tags.includes("encounter")>>\ //⚠ 街头遭遇//\ <<elseif $region_event.tags.includes("rumor")>>\ //💬 你听到一些消息//\ <<elseif $region_event.tags.includes("scene")>>\ //👁 你注意到了什么//\ <<else>>\ // ⚪ //\ <</if>> $region_event.text <<silently>> /* 根据事件类型生成后果提示和回应文本 */ <<set _respond_hint to "">> <<set _respond_text to "">> <<set _respond_effect to "">> <<set _ignore_text to "">> /* 随机代价:根据事件内容判断加疲惫还是焦虑,0-3随机 */ <<set _cost_type to "">> <<set _cost_val to 0>> <<if $region_event.tags.includes("encounter")>> <<set _respond_hint to "(可能改变你的一点状态)">> <<set _respond_effect to "encounter">> /* 根据 tags 关键词生成不同的回应文本和代价类型 */ <<if $region_event.tags.includes("child")>> <<set _respond_text to "你蹲下来,和孩子平视。孩子的眼睛很亮--那种还没学会灰心的亮。你聊了几句。他说的东西比大人的报纸真实。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("officer")>> <<set _respond_text to "你走过去,在老军官身边站了一会儿。他没有赶你走。你们沉默地看了同一条街。沉默比寒暄更有效。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("worker") or $region_event.tags.includes("union")>> <<set _respond_text to "你走近那个工人。他看了你一眼,没停手。你等他干完手里的活,他才开口。他说的话很短,但每个字都像是从牙缝里挤出来的--带着铁锈味。">> <<set _cost_type to "fatigue">> <<elseif $region_event.tags.includes("elderly")>> <<set _respond_text to "你弯腰帮她捡起散落的面包。她的手在抖--不是冷,是老了。她说了声谢谢,然后多看了你一眼。「现在连弯腰的人都少了。」她说。那种看法让你觉得,她在用最后一口气记住你的脸。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("veteran")>> <<set _respond_text to "你在退伍兵面前停下。他举了举火柴盒。你买了一盒。不需要火柴--但买他的东西比给钱体面。他数钱的时候,手比他讲故事的时候稳。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("student") or $region_event.tags.includes("intellectual")>> <<set _respond_text to "你走过去。学生看到你,迟疑了一下,然后像找到了观众一样开始说。他说得很快,怕你走。你听完了。他说的东西一半是道理,一半是荷尔蒙。但道理那一半确实有道理。">> <<set _cost_type to "fatigue">> <<elseif $region_event.tags.includes("recruiter")>> <<set _respond_text to "你停下来听他讲。码头缺人,管饭。他说得很实在--实在到你分不清这是机会还是陷阱。机会和陷阱穿同一件外套。">> <<set _cost_type to "fatigue">> <<elseif $region_event.tags.includes("nurse")>> <<set _respond_text to "你接过那碗灰色的糊。她看着你喝完,眼神里有职业性的关切。你问她从哪来。她说了一个你不想再听第二遍的地名。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("blackmarket")>> <<set _respond_text to "你凑过去。黑市贩子的眼睛扫了你一遍--在估价。不是估你的钱,是估你值不值得信任。他决定值得。他压低声音报了三个价。你一个都没记住,但你记住了一个词:美元。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("fishmonger")>> <<set _respond_text to "你在鱼摊前停下。鱼贩的嗓门震得你耳朵疼。你问他今天什么好。他说什么都好,什么都贵。你买了条小鱼。他多搭了你一把葱。搭葱是一种最高级别的善意。">> <<set _cost_type to "fatigue">> <<elseif $region_event.tags.includes("sailor")>> <<set _respond_text to "你在水手旁边坐下。他把最后的朗姆酒晃了晃,没分给你。但他说了一句话:最后的酒要留给最后一个出发的人。你问他去哪。他指了指海。">> <<set _cost_type to "anxiety">> <<else>> <<set _respond_text to "你走上前去。对方看了你一眼--那种柏林式的打量:不信任,但不拒绝。你们交换了几句话。不多,但够了。几句话有时候比一份报告管用。">> <<set _cost_type to "fatigue">> <</if>> <<set _ignore_text to "你从旁边走过。路过本身就是一种回答。">> <<elseif $region_event.tags.includes("rumor")>> <<set _respond_hint to "(可能改变你的一点状态)">> <<set _respond_effect to "rumor">> <<if $region_event.tags.includes("journalist")>> <<set _respond_text to "你竖起耳朵。记者们争论的声音越来越清楚。他们用的词你在报纸上见过,但在口语里听到是另一种感觉--像看一把刀从刀鞘里拔出来。你记住了一个名字和一个数字。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("economy")>> <<set _respond_text to "你停下来听。有人在说汇率。不是官方汇率--是街头的。街头的汇率比官方的快三个小时。你记住了今天的数字。明天它就过时了。但三个小时的提前量有时候就是一条命。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("politics") or $region_event.tags.includes("conspiracy")>> <<set _respond_text to "你放慢脚步,假装在看橱窗。两个军官的声音飘过来。你只听清了几个词,但那几个词让你脊背发凉。不是恐怖--是确认。你早就猜到了,只是不想确认。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("deal")>> <<set _respond_text to "你注意到两个议员在交换烟。不是烟--是承诺。交易不需要合同,只需要一个眼神和一盒雪茄。你记住了他们的脸。">> <<set _cost_type to "anxiety">> <<else>> <<set _respond_text to "你仔细听了几句。消息也许有用,也许没有。信息本身就是一种货币--而货币每天都在贬值。但多听一句总比少听一句强。">> <<set _cost_type to "fatigue">> <</if>> <<set _ignore_text to "你加快了脚步。有些话不听比听了好。无知有时候是一种自我保护。">> <<elseif $region_event.tags.includes("scene")>> <<set _respond_hint to "(可能改变你的一点状态)">> <<set _respond_effect to "scene">> <<if $region_event.tags.includes("poster") or $region_event.tags.includes("flyer")>> <<set _respond_text to "你停下来,仔细看那张海报。浆糊还没干。鹰、爪子、符号。你在脑子里记下了设计元素--颜色、排版、措辞。这些细节以后会有用。宣传都是有套路的,看多了就能预判。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("protest") or $region_event.tags.includes("slogan")>> <<set _respond_text to "你站在人群边缘观察。没有加入,也没有离开。你注意到几个细节:谁在喊,谁在看,谁在拍照。集会不只是集会--它是一张权力关系的X光片。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("dog") or $region_event.tags.includes("cat")>> <<set _respond_text to "你看着那只动物走远。它有自己的方向,自己的节奏。连畜生都有自己的日程表。你突然觉得好笑--然后觉得不好笑。因为人还不如它自在。">> <<set _cost_type to "fatigue">> <<elseif $region_event.tags.includes("coin")>> <<set _respond_text to "你弯腰看了看那枚硬币。面额已经买不了任何东西了。你捡起来,翻过来看了看背面。共和国的鹰徽。你把它放回地上。也许下一个人会捡。也许不会。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("tram")>> <<set _respond_text to "你看着电车驶过。车窗里是一张张脸。每一张都疲惫,每一张都不同。你数了数--十二个人,十二种沉默。电车是最便宜的剧场。">> <<set _cost_type to "fatigue">> <<elseif $region_event.tags.includes("canal")>> <<set _respond_text to "你在运河边站了一会儿。水很黑。花漂在上面,已经蔫了。你想起了1919年。也许花是为他们放的。也许不是。花不问原因。你站了一会儿,然后走了。">> <<set _cost_type to "anxiety">> <<elseif $region_event.tags.includes("sound") or $region_event.tags.includes("tension")>> <<set _respond_text to "你停下来,感受空气。不是温度变了--是密度。像暴风雨前的那种沉重。你环顾四周。一切看起来正常。但看起来正常本身就是不正常的信号。">> <<set _cost_type to "anxiety">> <<else>> <<set _respond_text to "你多看了两眼。细节在脑子里留了下来--也许有用,也许没有。多看两眼有时候比说话有用。看,是一种不留下痕迹的参与。">> <<set _cost_type to "fatigue">> <</if>> <<set _ignore_text to "你移开目光。不是每件事都值得记住。有些事看了反而成了负担。">> <<else>> <<set _respond_hint to "(可能改变你的一点状态)">> <<set _respond_text to "你做出了回应。回应本身已经是一种立场。">> <<set _cost_type to "fatigue">> <<set _ignore_text to "你转过头。">> <</if>> /* 随机生成代价值 0-3 */ <<set _cost_val to random(0, 3)>> /* 预先生成代价显示文本 */ <<set _cost_text to "">> <<if _cost_val gt 0>> <<if _cost_type eq "fatigue">> <<set _cost_text to ",疲惫 +" + _cost_val>> <<else>> <<set _cost_text to ",焦虑 +" + _cost_val>> <</if>> <</if>> <</silently>>\ <span id="region_event_block"><<link "[回应] _respond_hint">> <<replace "#region_event_block">>\ <<nobr>>//_respond_text//<</nobr>> <<if _respond_effect eq "encounter">>\ <<run $active_tags = $active_tags.map(function(t){ if(t.name==="知情者" && t.level==="micro"){ return Object.assign({},t,{intensity:Math.min(30,t.intensity+5)}); } return t; })>> //(知情者 +5_cost_text)// <<if _cost_val gt 0 and _cost_type eq "fatigue">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + _cost_val)>><</if>>\ <<if _cost_val gt 0 and _cost_type eq "anxiety">><<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + _cost_val)>><</if>>\ <<elseif _respond_effect eq "rumor">>\ <<run $active_tags = $active_tags.map(function(t){ if(t.name==="知情者" && t.level==="micro"){ return Object.assign({},t,{intensity:Math.min(30,t.intensity+8)}); } return t; })>> //(知情者 +8_cost_text)// <<if _cost_val gt 0 and _cost_type eq "fatigue">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + _cost_val)>><</if>>\ <<if _cost_val gt 0 and _cost_type eq "anxiety">><<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + _cost_val)>><</if>>\ <<elseif _respond_effect eq "scene">>\ <<run $active_tags = $active_tags.map(function(t){ if(t.name==="观察者" && t.level==="micro"){ return Object.assign({},t,{intensity:Math.min(15,t.intensity+5)}); } return t; })>> //(观察者 +5_cost_text)// <<if _cost_val gt 0 and _cost_type eq "fatigue">><<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + _cost_val)>><</if>>\ <<if _cost_val gt 0 and _cost_type eq "anxiety">><<set $weimar.surface.anxiety to Math.min(100, $weimar.surface.anxiety + _cost_val)>><</if>>\ <</if>>\ <<set $region_event to null>>\ <</replace>>\ <</link>> <<link "[无视](没有后果)">> <<replace "#region_event_block">>\ <<nobr>>//_ignore_text//<</nobr>> <<set $region_event to null>>\ <</replace>>\ <</link>></span> <</if>>\ <</widget>>
/* ============================================================ 意识体政治生命演示(状态矩阵 · 概念验证) ------------------------------------------------------------ 核心公式: 意识体说的话 = 意识体的政治生命状态 + 世界状态 + 玩家关系 本文件用 SPD 做示例,演示"同一个意识体,随历史说话"。 政治生命状态(V0.5-B 三层): - 核心立场 core_stance(几乎不变) - 策略倾向 strategy(中期可变:激进/温和/观望/破坏) - 即时情绪 mood(短期可变:信任/怀疑/焦虑/傲慢/疲惫/愤怒) ============================================================ */ /* ---------- npc-life-update:刷新意识体的政治生命状态 ---------- 用法:<<npc-life-update>> 根据世界状态 + 玩家关系,重算 SPD 的策略倾向与即时情绪。 这是"状态矩阵"的关键:情绪不是写死的,是随世界变的。 */ <<widget "npc-life-update">>\ <<silently>> <<set _npc to $npcs.spd>> /* --- 策略倾向:世界越紧张,SPD 越激进 --- */ <<set _npc.strategy to "温和">> <<if $world.social_anger gte 55 or $world.revolution gte 45>> <<set _npc.strategy to "激进">> <<elseif $world.economy gte 60>> <<set _npc.strategy to "观望">> <</if>> /* --- 即时情绪:由世界状态 + 玩家关系共同决定 --- */ <<set _npc.mood to "平静">> <<if $world.inflation gte 60>> <<set _npc.mood to "焦虑">> <<elseif $world.social_anger gte 50>> <<set _npc.mood to "愤怒">> <<elseif $npcs.spd.trust lt 20>> <<set _npc.mood to "怀疑">> <<elseif $npcs.spd.trust gte 70>> <<set _npc.mood to "信任">> <</if>> <</silently>>\ <</widget>> /* ---------- npc-speak-spd:生成 SPD 的对话 ---------- 用法:<<npc-speak-spd>> 结果写入 $spd_line 三段式拼接: 第1段 情绪开场(由 mood 决定) 第2段 核心陈述(由世界状态决定) 第3段 关系收尾(由 trust 决定) */ <<widget "npc-speak-spd">>\ <<silently>> <<npc-life-update>> <<set _npc to $npcs.spd>> <<set _line to "">> /* === 第1段:情绪开场 === */ <<if _npc.mood eq "焦虑">> <<set _line to _line + "SPD的书记在窗边来回踱步。他停下来,看着你,手指在桌沿上敲。\n\n「你看到了吗?马克又跌了。工人今天领的工资,明天就买不起面包。」">> <<elseif _npc.mood eq "愤怒">> <<set _line to _line + "SPD的书记没有起身。他盯着你,眼里的火压得很低。\n\n「街上的人在流血,而我们在讨论数字。你告诉我,这算哪门子共和国?」">> <<elseif _npc.mood eq "怀疑">> <<set _line to _line + "SPD的书记靠在椅背上,双手交叉。他没有先开口,只是看着你,等你先说话。\n\n「你上次对军方的让步,我还没忘。」">> <<elseif _npc.mood eq "信任">> <<set _line to _line + "SPD的书记给你倒了杯茶。他难得地笑了一下。\n\n「你来了就好。我们一直站在同一边。」">> <<elseif _npc.mood eq "疲惫">> <<set _line to _line + "SPD的书记坐在桌后,手撑着额头。他抬眼看了你一下,又垂下。\n\n「我累了。不是今天累,是这五年,一天比一天累。」">> <<else>> <<set _line to _line + "SPD的书记坐在桌后,面前摊着一叠文件。他抬头看见你,点了点头。\n\n「坐吧。今天想谈什么?」">> <</if>> /* === 第2段:核心陈述(由世界状态决定) === */ <<if $world.inflation gte 60>> <<set _line to _line + "\n\n「工人快撑不住了。如果共和国连工人的面包都保不住,工人凭什么保卫共和国?」">> <<elseif $world.economy gte 55>> <<set _line to _line + "\n\n「工厂在停,失业在涨。我们支持罢工,但补贴必须到位。工人不能饿着肚子保卫共和国。」">> <<elseif $world.revolution gte 40>> <<set _line to _line + "\n\n「左翼在鼓动,右翼在密谋。我们夹在中间,像夹在两块石头之间的手。你打算怎么抽出来?」">> <<elseif $world.gov_trust lte 25>> <<set _line to _line + "\n\n「人民不再信这个政府了。不是不信你,是不信『共和国』这三个字。这比任何政敌都危险。」">> <<else>> <<set _line to _line + "\n\n「局势还算稳。但稳不是常态,是暴风雨前的安静。我们得趁现在做点什么。」">> <</if>> /* === 第3段:关系收尾(由 trust 决定) === */ <<if $npcs.spd.trust gte 70>> <<set _line to _line + "\n\n「不管怎样,我们信你。你只要别让我们失望。」">> <<elseif $npcs.spd.trust gte 40>> <<set _line to _line + "\n\n「我们愿意谈。但谈之前,你得先让我们看到诚意。」">> <<elseif $npcs.spd.trust gte 20>> <<set _line to _line + "\n\n「你说了很多,但工人记住的是你做了什么。先做了,再说。」">> <<else>> <<set _line to _line + "\n\n「你走吧。等你想清楚要站在哪一边,再来。」">> <</if>> <<set $spd_line to _line>> <</silently>>\ <</widget>> /* ---------- Scene_Visit_SPD:访问 SPD 的场景 ---------- 演示"意识体随历史说话"。每次进入都重新生成对话。 */
<<party-dialogue "spd">> //你走进 SPD 的办公室。// $party_line <hr> ''SPD 对你的信任:<<bar $npcs.spd.trust 100>>'' ''当前世界状态'' - 通胀:<<bar $world.inflation 100>> - 经济压力:<<bar $world.economy 100>> - 社会愤怒:<<bar $world.social_anger 100>> <<party-chat2 "spd">> <<link "返回办公室" "Scene_Office">><</link>> /* ============================================================ 其他政党意识体党部会面场景 每个场景:氛围开场 + 该意识体对魏玛(代理人)的态度 + 世界状态 代词一律用「他」。 ============================================================ */ /* ---------- Scene_Visit_KPD:威丁 · KPD 党部 ---------- 态度:敌对(要革命)。半地下,警惕。 */
<<party-dialogue "kpd">> //威丁的《红旗》卖报人带你七拐八拐,进了一间没有门牌的屋子。// //屋里烟雾很重。墙上的马克思像被烟熏得发黄。// $party_line <<spd-region-watch "kpd">>\ <<if $spd_note_line neq "">>\ <div class="spd-note"><span class="spd-note-tag">SPD 的声音</span>$spd_note_line</div>\ <</if>>\ <hr> ''KPD 对你的信任:<<bar $npcs.kpd.trust 100>>'' ''当前世界状态'' - 革命压力:<<bar $world.revolution 100>> - 社会愤怒:<<bar $world.social_anger 100>> <<party-chat2 "kpd">> <<link "返回威丁" "Region_Wedding">><</link>> /* ---------- Scene_Visit_DDP:DDP 真正的党部 ---------- 态度:支持但批判。正式,办公室。 入口:罗曼咖啡馆接触(ddp信任≥20)后,被引荐到这里。 */
<<party-dialogue "ddp">> //罗曼咖啡馆的人带你穿过几条街,进了一栋不起眼的办公楼。// //门牌上只有一行小字:德意志民主党 · 柏林支部。// //戴圆眼镜的人请你坐下,给你倒了杯咖啡。// $party_line <hr> ''DDP 对你的信任:<<bar $npcs.ddp.trust 100>>'' ''当前世界状态'' - 政府信任:<<bar $world.gov_trust 100>> - 通胀:<<bar $world.inflation 100>> <<party-chat2 "ddp">> <<link "返回罗曼咖啡馆" "Region_Romanisches">><</link>> /* ---------- Scene_Visit_DVP:选帝侯大街 · DVP 党部 ---------- 态度:务实合作。公开,体面。 */
<<party-dialogue "dvp">> //选帝侯大街的商会大楼。门厅的大理石地板擦得能照出人影。// //DVP的人穿着考究的西装,领带系得一丝不苟。他请你坐下,亲自给你倒了杯真咖啡。// $party_line <hr> ''DVP 对你的信任:<<bar $npcs.dvp.trust 100>>'' ''当前世界状态'' - 通胀:<<bar $world.inflation 100>> - 经济压力:<<bar $world.economy 100>> <<party-chat2 "dvp">> <<link "返回选帝侯大街" "Region_Kurfurstendamm">><</link>> /* ---------- Scene_Visit_Zentrum:国会大厦 · Zentrum 党部 ---------- 态度:中间摇摆。正式,走廊密谈。 */
<<party-dialogue "zentrum">> //国会大厦的走廊。雪茄的烟雾在灯下盘旋。// //Zentrum的人站在窗边,手里夹着一支没点的雪茄。他看见你,点了点头。// $party_line <hr> ''Zentrum 对你的信任:<<bar $npcs.zentrum.trust 100>>'' ''当前世界状态'' - 政治暴力:<<bar $world.political_violence 100>> - 政府信任:<<bar $world.gov_trust 100>> <<party-chat2 "zentrum">> <<link "返回国会大厦" "Region_Reichstag">><</link>> /* ---------- Scene_Visit_DNVP:勃兰登堡门 · DNVP 党部 ---------- 态度:敌视(要复辟)。公开,象征性,冷。 */
<<party-dialogue "dnvp">> //勃兰登堡门下。DNVP的人站在帝国旗旁边,没有请你进去。// //他让你站在外面,感受「谁才是这片土地的主人」。// $party_line <<spd-region-watch "dnvp">>\ <<if $spd_note_line neq "">>\ <div class="spd-note"><span class="spd-note-tag">SPD 的声音</span>$spd_note_line</div>\ <</if>>\ <hr> ''DNVP 对你的信任:<<bar $npcs.dnvp.trust 100>>'' ''当前世界状态'' - 民族主义:<<bar $world.nationalism 100>> - 政府信任:<<bar $world.gov_trust 100>> <<party-chat2 "dnvp">> <<link "返回勃兰登堡门" "Region_Brandenburg">><</link>> /* ---------- Scene_Visit_NSDAP:慕尼黑 · NSDAP 据点 ---------- 态度:颠覆。地下,危险。 */
<<party-dialogue "nsdap">> //慕尼黑的啤酒馆。人声鼎沸,烟雾和麦芽味混在一起。// //一个穿褐衫的人把你引到角落的桌子。他说话声音不大,但每个字都像钉进木头里。// $party_line <<spd-region-watch "nsdap">>\ <<if $spd_note_line neq "">>\ <div class="spd-note"><span class="spd-note-tag">SPD 的声音</span>$spd_note_line</div>\ <</if>>\ <hr> ''NSDAP 对你的信任:<<bar $npcs.nsdap.trust 100>>'' ''当前世界状态'' - 民族主义:<<bar $world.nationalism 100>> - 经济压力:<<bar $world.economy 100>> <<party-chat2 "nsdap">> <<link "返回慕尼黑街头" "Region_Munich">><</link>> /* ---------- Scene_Visit_Army:蒂尔加滕 · 国防军司令部 ---------- 态度:若即若离(危险)。半公开,军装,压迫感。 */
<<party-dialogue "army">> //蒂尔加滕的本德勒大楼。军装比西装多。// //接待你的军官脊背挺直,像一把没出鞘的刀。他请你坐下,但你没有放松的感觉。// $party_line <<spd-region-watch "army">>\ <<if $spd_note_line neq "">>\ <div class="spd-note"><span class="spd-note-tag">SPD 的声音</span>$spd_note_line</div>\ <</if>>\ <hr> ''国防军对你的信任:<<bar $npcs.army.trust 100>>'' ''当前世界状态'' - 军方影响:<<bar $world.army_influence 100>> - 政治暴力:<<bar $world.political_violence 100>> <<party-chat2 "army">> <<link "返回蒂尔加滕" "Region_Tiergarten">><</link>>
/* ============================================================ 政党会面对话选项(party-chat) ------------------------------------------------------------ 每次会面可进行一次对话,每天限一次。 每个选项下方用灰色字标注数值变化(如「SPD信任+5,疲惫+2」)。 选择后跳转 Scene_Party_Talk,NPC 按新的信任档位当场回应。 ============================================================ */ /* ---------- party-chat:渲染会面对话选项 ---------- 用法:<<party-chat2 "spd">> 在对应 Scene_Visit_XX 中调用 */ <<widget "party-chat">>\ <<silently>> <<set _pk to $args[0]>> <<set $talk_key to "party_chat_" + _pk + "_" + $date.year + "_" + $date.month + "_" + $date.day>> <<set $talk_pid to _pk>> <<set _pc_done to false>> <<if $flags[$talk_key]>> <<set _pc_done to true>> <</if>> <</silently>>\ <<if _pc_done>>\ //你今天已经和他谈过了。有些话不必每天重复,明天再来。//\ <<elseif $tp lt 1>>\ //你今天已经很累了,说不动话了。真正有用的谈话需要时间--而你没有。// <span class="txt-muted">(谈一次要 1 点行动力 · 你一点不剩。话明天还在。)</span>\ <<else>>\ ''你想和他说什么:'' <<if _pk eq "spd">>\ <<link "谈工人处境,表示你在听" "Scene_Party_Talk">> <<set $talk_label to "谈工人处境,表示你在听">>\ <<set $talk_effects to "SPD信任+5,疲惫+2">>\ <<set $talk_delta to 5>>\ <<set $talk_pname to "SPD">>\ <<set $talk_back to "Scene_Visit_SPD">>\ <<trust-capped "spd" 5>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|SPD信任+5,疲惫+2)// <<link "交换对当前危机的看法" "Scene_Party_Talk">> <<set $talk_label to "交换对当前危机的看法">>\ <<set $talk_effects to "SPD信任+3">>\ <<set $talk_delta to 3>>\ <<set $talk_pname to "SPD">>\ <<set $talk_back to "Scene_Visit_SPD">>\ <<trust-capped "spd" 3>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|SPD信任+3)// <<link "要他配合你的步调" "Scene_Party_Talk">> <<set $talk_label to "要他配合你的步调">>\ <<set $talk_effects to "SPD信任-4">>\ <<set $talk_delta to -4>>\ <<set $talk_pname to "SPD">>\ <<set $talk_back to "Scene_Visit_SPD">>\ <<trust-capped "spd" -4>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(SPD信任-4)//\ <<elseif _pk eq "kpd">>\ <<link "承认工人的现实困境" "Scene_Party_Talk">> <<set $talk_label to "承认工人的现实困境">>\ <<set $talk_effects to "KPD信任+6">>\ <<set $talk_delta to 6>>\ <<set $talk_pname to "KPD">>\ <<set $talk_back to "Scene_Visit_KPD">>\ <<trust-capped "kpd" 6>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|KPD信任+6)// <<link "试探他对时局的判断" "Scene_Party_Talk">> <<set $talk_label to "试探他对时局的判断">>\ <<set $talk_effects to "KPD信任+3,偏执+2">>\ <<set $talk_delta to 3>>\ <<set $talk_pname to "KPD">>\ <<set $talk_back to "Scene_Visit_KPD">>\ <<trust-capped "kpd" 3>>\ <<tp-spend 1 2>>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 2)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|KPD信任+3,偏执+2)// <<link "以政府身份命令他" "Scene_Party_Talk">> <<set $talk_label to "以政府身份命令他">>\ <<set $talk_effects to "KPD信任-5">>\ <<set $talk_delta to -5>>\ <<set $talk_pname to "KPD">>\ <<set $talk_back to "Scene_Visit_KPD">>\ <<trust-capped "kpd" -5>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(KPD信任-5)//\ <<elseif _pk eq "ddp">>\ <<link "谈宪法与制度" "Scene_Party_Talk">> <<set $talk_label to "谈宪法与制度">>\ <<set $talk_effects to "DDP信任+5,政府信誉+3">>\ <<set $talk_delta to 5>>\ <<set $talk_pname to "DDP">>\ <<set $talk_back to "Scene_Visit_DDP">>\ <<trust-capped "ddp" 5>>\ <<tp-spend 1 2>>\ <<set $world.gov_trust to Math.min(100, $world.gov_trust + 3)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|DDP信任+5,政府信誉+3)// <<link "交换对舆论的看法" "Scene_Party_Talk">> <<set $talk_label to "交换对舆论的看法">>\ <<set $talk_effects to "DDP信任+3">>\ <<set $talk_delta to 3>>\ <<set $talk_pname to "DDP">>\ <<set $talk_back to "Scene_Visit_DDP">>\ <<trust-capped "ddp" 3>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|DDP信任+3)// <<link "暗示他该站队了" "Scene_Party_Talk">> <<set $talk_label to "暗示他该站队了">>\ <<set $talk_effects to "DDP信任-4">>\ <<set $talk_delta to -4>>\ <<set $talk_pname to "DDP">>\ <<set $talk_back to "Scene_Visit_DDP">>\ <<trust-capped "ddp" -4>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(DDP信任-4)//\ <<elseif _pk eq "dvp">>\ <<link "谈一笔实在的交易" "Scene_Party_Talk">> <<set $talk_label to "谈一笔实在的交易">>\ <<set $talk_effects to "DVP信任+5">>\ <<set $talk_delta to 5>>\ <<set $talk_pname to "DVP">>\ <<set $talk_back to "Scene_Visit_DVP">>\ <<trust-capped "dvp" 5>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|DVP信任+5)// <<link "听他说生意场的困境" "Scene_Party_Talk">> <<set $talk_label to "听他说生意场的困境">>\ <<set $talk_effects to "DVP信任+3,孤立感-2">>\ <<set $talk_delta to 3>>\ <<set $talk_pname to "DVP">>\ <<set $talk_back to "Scene_Visit_DVP">>\ <<trust-capped "dvp" 3>>\ <<tp-spend 1 2>>\ <<set $player.mental.isolation to Math.max(0, $player.mental.isolation - 2)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|DVP信任+3,孤立感-2)// <<link "施压要他出力" "Scene_Party_Talk">> <<set $talk_label to "施压要他出力">>\ <<set $talk_effects to "DVP信任-4">>\ <<set $talk_delta to -4>>\ <<set $talk_pname to "DVP">>\ <<set $talk_back to "Scene_Visit_DVP">>\ <<trust-capped "dvp" -4>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(DVP信任-4)//\ <<elseif _pk eq "zentrum">>\ <<link "谈教会与国家的边界" "Scene_Party_Talk">> <<set $talk_label to "谈教会与国家的边界">>\ <<set $talk_effects to "Zentrum信任+5">>\ <<set $talk_delta to 5>>\ <<set $talk_pname to "Zentrum">>\ <<set $talk_back to "Scene_Visit_Zentrum">>\ <<trust-capped "zentrum" 5>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|Zentrum信任+5)// <<link "交换中间路线的看法" "Scene_Party_Talk">> <<set $talk_label to "交换中间路线的看法">>\ <<set $talk_effects to "Zentrum信任+3">>\ <<set $talk_delta to 3>>\ <<set $talk_pname to "Zentrum">>\ <<set $talk_back to "Scene_Visit_Zentrum">>\ <<trust-capped "zentrum" 3>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|Zentrum信任+3)// <<link "逼他明确表态" "Scene_Party_Talk">> <<set $talk_label to "逼他明确表态">>\ <<set $talk_effects to "Zentrum信任-4">>\ <<set $talk_delta to -4>>\ <<set $talk_pname to "Zentrum">>\ <<set $talk_back to "Scene_Visit_Zentrum">>\ <<trust-capped "zentrum" -4>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(Zentrum信任-4)//\ <<elseif _pk eq "dnvp">>\ <<link "听他对秩序的论述" "Scene_Party_Talk">> <<set $talk_label to "听他对秩序的论述">>\ <<set $talk_effects to "DNVP信任+4">>\ <<set $talk_delta to 4>>\ <<set $talk_pname to "DNVP">>\ <<set $talk_back to "Scene_Visit_DNVP">>\ <<trust-capped "dnvp" 4>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|DNVP信任+4)// <<link "谈一笔交易" "Scene_Party_Talk">> <<set $talk_label to "谈一笔交易">>\ <<set $talk_effects to "DNVP信任+3,民族主义-1">>\ <<set $talk_delta to 3>>\ <<set $talk_pname to "DNVP">>\ <<set $talk_back to "Scene_Visit_DNVP">>\ <<trust-capped "dnvp" 3>>\ <<tp-spend 1 2>>\ <<set $world.nationalism to Math.max(0, $world.nationalism - 1)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|DNVP信任+3,民族主义-1)// <<link "驳斥他的旧帝国立场" "Scene_Party_Talk">> <<set $talk_label to "驳斥他的旧帝国立场">>\ <<set $talk_effects to "DNVP信任-4,民族主义+1">>\ <<set $talk_delta to -4>>\ <<set $talk_pname to "DNVP">>\ <<set $talk_back to "Scene_Visit_DNVP">>\ <<trust-capped "dnvp" -4>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 1)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(DNVP信任-4,民族主义+1)//\ <<elseif _pk eq "nsdap">>\ <<link "安静地听他说" "Scene_Party_Talk">> <<set $talk_label to "安静地听他说">>\ <<set $talk_effects to "NSDAP信任+4,民族主义+2">>\ <<set $talk_delta to 4>>\ <<set $talk_pname to "NSDAP">>\ <<set $talk_back to "Scene_Visit_NSDAP">>\ <<trust-capped "nsdap" 4>>\ <<tp-spend 1 2>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 2)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|NSDAP信任+4,民族主义+2)// <<link "试探他的底线" "Scene_Party_Talk">> <<set $talk_label to "试探他的底线">>\ <<set $talk_effects to "NSDAP信任+3,偏执+2">>\ <<set $talk_delta to 3>>\ <<set $talk_pname to "NSDAP">>\ <<set $talk_back to "Scene_Visit_NSDAP">>\ <<trust-capped "nsdap" 3>>\ <<tp-spend 1 2>>\ <<set $player.mental.paranoia to Math.min(100, $player.mental.paranoia + 2)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|NSDAP信任+3,偏执+2)// <<link "警告他收敛" "Scene_Party_Talk">> <<set $talk_label to "警告他收敛">>\ <<set $talk_effects to "NSDAP信任-5,政治暴力-1">>\ <<set $talk_delta to -5>>\ <<set $talk_pname to "NSDAP">>\ <<set $talk_back to "Scene_Visit_NSDAP">>\ <<trust-capped "nsdap" -5>>\ <<set $world.political_violence to Math.max(0, $world.political_violence - 1)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(NSDAP信任-5,政治暴力-1)//\ <<elseif _pk eq "army">>\ <<link "表态尊重军队" "Scene_Party_Talk">> <<set $talk_label to "表态尊重军队">>\ <<set $talk_effects to "军方信任+5">>\ <<set $talk_delta to 5>>\ <<set $talk_pname to "国防军">>\ <<set $talk_back to "Scene_Visit_Army">>\ <<trust-capped "army" 5>>\ <<tp-spend 1 2>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|军方信任+5)// <<link "谈秩序与授权" "Scene_Party_Talk">> <<set $talk_label to "谈秩序与授权">>\ <<set $talk_effects to "军方信任+3,军方影响+1">>\ <<set $talk_delta to 3>>\ <<set $talk_pname to "国防军">>\ <<set $talk_back to "Scene_Visit_Army">>\ <<trust-capped "army" 3>>\ <<tp-spend 1 2>>\ <<set $world.army_influence to Math.min(100, $world.army_influence + 1)>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|军方信任+3,军方影响+1)// <<link "要求他听命于文官" "Scene_Party_Talk">> <<set $talk_label to "要求他听命于文官">>\ <<set $talk_effects to "军方信任-4">>\ <<set $talk_delta to -4>>\ <<set $talk_pname to "国防军">>\ <<set $talk_back to "Scene_Visit_Army">>\ <<trust-capped "army" -4>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(军方信任-4)//\ <</if>>\ <</if>>\ <</widget>> /* ---------- Scene_Party_Talk:会面对话结果 ---------- 两层回应:先回「你这句话本身」(party-respond),再回「他此刻的样子」(party-personality)。 若是「问他一直想问的事」(talk_ask),则改由档案回应+正文呈现。 */
<<silently>> <<if not $talk_pid>> <<set $talk_pid to "spd">> <</if>> <<if not $talk_depth>> <<set $talk_depth to "chat">> <</if>> <<if not $talk_ask>> <<set $talk_ask to "">> <</if>> /* 话题对话缺话题 id 时(异常直入)退回寒暄 */ <<if $talk_depth eq "topic" and not $talk_topic>> <<set $talk_depth to "chat">> <</if>> <<party-personality-show $talk_pid>> <<set _talk_response to $ret>> <<party-milestone-check $talk_pid>> <<set _ms_reached to $ret>> /* 专属回应:回应你这句话本身(非档案询问时;话题对话走分档话题回应) */ <<set _talk_specific to "">> <<if $talk_ask eq "">> <<if $talk_depth eq "topic">> <<party-topic-respond $talk_pid $talk_topic $talk_tier>> <<else>> <<party-respond $talk_pid $talk_depth $talk_tier>> <</if>> <<set _talk_specific to $ret>> <</if>> /* 档案回应:问他一直想问的事 */ <<set _talk_archive_text to "">> <<if $talk_ask neq "">> <<party-respond-init>> <<if $pc_archive_respond[$talk_pid] and $pc_archive_respond[$talk_pid][$talk_ask]>> <<set _talk_archive_text to $pc_archive_respond[$talk_pid][$talk_ask]>> <</if>> <</if>> <</silently>>\ ''你选择了:$talk_label'' //($talk_effects)// <<trust-trim-note>>\ /* 跨档瞬间卡:会面是最常用的信任来源,就地冲刷(办公室兜底会被强制跳转丢弃) */ <<cross-tier-flush>>\ <<if $rival_note and $rival_note neq "">>\ <span class="txt-severe">//($rival_note。你多看他一眼,另一些人在数。)//</span>\ <</if>>\ <<rival-cost-reset>>\ <hr> <<if $talk_ask neq "">>\ _talk_archive_text <<if $talk_ask eq "fear">><<party-fear $talk_pid>>//$ret//<</if>> <<if $talk_ask eq "want">><<party-want $talk_pid>>//$ret//<</if>> <<if $talk_ask eq "memory">><<party-memory $talk_pid>>//$ret//<</if>> <hr> //他说完,没有催你走。屋里静了一会儿,谁都没有先开口。//\ <<else>>\ _talk_specific <hr> //他此刻的样子:// _talk_response\ <</if>>\ <hr> ''$talk_pname 对你的信任:<<bar $npcs[$talk_pid].trust 100>>'' <<if $talk_delta gte 0>>\ //他的语气比刚才近了一些。你注意到,有些门正在慢慢打开。//\ <<else>>\ //空气冷了半度。他再开口时,你清楚地感觉到距离。//\ <</if>>\ <<if _ms_reached eq "peak">>@@.party-peak;·巅峰·@@ 你们之间的墙,在今晚全部塌了。他看你的眼神,变了。<<elseif _ms_reached eq "voice">>@@.party-peak;·心声·@@ 他第一次在你面前,把没说完的那半句话,补完了。<<elseif _ms_reached eq "ally">>@@.party-peak;·同盟·@@ 从这一刻起,他不再把你当外人。你成了他这边的人。<</if>> <<link "回到 $talk_pname 那里" $talk_back>><</link>> /* ════════════════════════════════════════════════════════════ 满信任 · DNVP 复辟邀约(旗舰试点) 触发:DNVP 信任满 100 → arc_state=pulling → 办公室出现「邀你密谈」。 光谱达标(左/右轴>=33 且 激进/保守轴>=33,即偏右+偏保守)→ 直接给抉择; 否则先过 3 道「立场试炼」,把玩家光谱往右/保守方向拉。 ============================================================ */
<<silently>> <<if not $party_milestones.dnvp>> <<set $party_milestones.dnvp to { ally:false, voice:false, peak:false, arc_offered:false, arc_state:"none" }>> <</if>> <<if not $dnvp_trials>> <<set $dnvp_trials to { a:false, b:false, c:false }>> <</if>> <<if not $dnvp_pull>> <<set $dnvp_pull to 0>> <</if>> <<if $party_milestones.dnvp.arc_state eq "none">> <<set $party_milestones.dnvp.arc_state to "pulling">> <</if>> <<set _qualify to ($spectrum.left_right gte 33 and $spectrum.radical_conservative gte 33)>> <<if _qualify and $party_milestones.dnvp.arc_state eq "pulling">> <<set $party_milestones.dnvp.arc_state to "offered">> <</if>> /* 确定当前未完成的试炼 */ <<set _current_trial to "">> <<if not $dnvp_trials.a>><<set _current_trial to "a">> <<elseif not $dnvp_trials.b>><<set _current_trial to "b">> <<elseif not $dnvp_trials.c>><<set _current_trial to "c">><</if>> /* 时间门控:是否已过上一次试炼之日(一天只做一关) */ <<set _trial_ready to false>> <<if not $dnvp_last_trial_day or $session_day gt $dnvp_last_trial_day>> <<set _trial_ready to true>> <</if>> /* 三道全过的判定:若光谱够格 → 正式邀约;否则进入额外立场试炼链 */ <<if _current_trial eq "" and $party_milestones.dnvp.arc_state eq "pulling">> <<if _qualify>> <<set $party_milestones.dnvp.arc_state to "offered">> <<elseif $dnvp_extra_step gte 3>> /* 额外链也已做完,仍不够格 → DNVP 勉强接受,进入正式邀约 */ <<set $party_milestones.dnvp.arc_state to "offered">> <</if>> <</if>> <</silently>>\ ''一间没有招牌的屋子'' //DNVP 没有约你到党部。他让副手把一张纸条夹在你今晚的报纸里,纸条上只有一个地址。你到的时候,灯已经为他亮着。// //他站在一张旧桌后面,墙上挂着一幅褪色的帝国军旗。他看你坐下,目光越过你落在旗上。他没有寒暄。// <<if $party_milestones.dnvp.arc_state eq "offered">>\ //「你终于走到了这一步。」他说,「你的立场,已经够格谈那件事了。坐下吧。」// //他把你带到窗前。窗外是柏林——那座曾属于一位皇帝的城市。他指着它,没有回头。// ''—— 复辟,还是不要。 ——'' //「这艘共和国,是被建成又拆掉的。你手里有舵。你打算把它,交还给谁?」// <<link "「答应他。把共和国,交还给它应该的主人。」">> <<set $party_milestones.dnvp.arc_state to "accepted">>\ <<set $party_milestones.dnvp.arc_offered to true>>\ <<set $dnvp_arc to "accepted">>\ <<set $weimar_night_talk to true>>\ <<set $weimar_pending_convert to "party_dnvp">>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 25)>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 15)>>\ <<set $world.revolution to Math.min(100, $world.revolution + 5)>>\ <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - 15)>>\ <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - 10)>>\ <<set $npcs.zentrum.trust to Math.max(0, $npcs.zentrum.trust - 12)>>\ <<legacy-create "LG_DNVP_RESTORE" {政府信任:-25, 民族主义:15} "dnvp" "trauma" "复辟的暗流重新抬头">>\ <<goto "Scene_DNVP_Accepted">>\ <</link>> <<link "「拒绝他。共和国不该向旧旗低头。」">> <<set $party_milestones.dnvp.arc_state to "refused">>\ <<set $party_milestones.dnvp.arc_offered to true>>\ <<set $dnvp_arc to "refused">>\ <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - 30)>>\ <<goto "Scene_DNVP_Refused">>\ <</link>> <<link "「不公开。我只在暗处,为你办事。」(秘密结盟)">> <<secret-establish "dnvp">>\ <<set $party_milestones.dnvp.arc_state to "secret">>\ <<set $party_milestones.dnvp.arc_offered to true>>\ <<set $secret_pact_pid to "dnvp">>\ <<goto "Scene_SecretPact">>\ <</link>> <<link "「再想想。」">> <<goto "Scene_Office">>\ <</link>> <<elseif $party_milestones.dnvp.arc_state eq "pulling">>\ <<if _current_trial neq "" and _trial_ready>>\ //他没有说你坐得离他太近,也没有说太远。他只是把灯又拧亮了一点,让光把你们之间的桌面照得清清楚楚。// <div class="dnvp-speech">「你走到这一步,值得一句实话。」他说,「可你的立场,还没站到能谈那件事的地方。帝国不会为一个含糊的人,掀开棺材板。」</div> //他看了你片刻,没有催。他伸手,向抽屉。// <<link "「继续」" "Scene_DNVP_TrialIntro">><</link>> <<elseif _current_trial neq "" and not _trial_ready>>\ //「你来了。」他放下手里的东西,看着你。// <div class="dnvp-speech">「今天先到这里。你该回去想想。你若还愿意来,我们改日再谈。」</div> //他起身,替你拉开那扇没挂招牌的门。// <<link "请回吧" "Scene_Office">><</link>> <<elseif _current_trial eq "" and $dnvp_extra_step lt 3 and _trial_ready>>\ //三道都过了。他却没有松口。他看你的目光,比先前深了一分。// <div class="dnvp-speech">「你做了三件事,可我看得出,你的心还没真正站过来。你是在替我办事,不是在信我。」</div> //他沉默片刻。门外,有人低声咳了一下,像在提醒什么。// //「还差一点。」他说,「你若愿意,我们再试几回。」// <<link "「继续」" "Scene_DNVP_Extra">><</link>> <<elseif _current_trial eq "" and $dnvp_extra_step lt 3 and not _trial_ready>>\ //「你来了。」他放下手里的东西,看着你。// <div class="dnvp-speech">「今天先到这里。你该回去想想。你若还愿意来,我们改日再谈。」</div> //他起身,替你拉开那扇没挂招牌的门。// <<link "请回吧" "Scene_Office">><</link>> <</if>>\ <<else>>\ //(这条线已经走完。你带着答案离开,屋子里的灯在你身后熄灭。)// <<link "返回办公室" "Scene_Office">><</link>> <</if>> /* ---------- Scene_DNVP_TrialIntro:他挑出当前这份文件 ---------- 只展示「他挑出文件」的动作,选择放下一场景。一天只做一关。 */
<<silently>> <<set _current_trial to "">> <<if not $dnvp_trials.a>><<set _current_trial to "a">> <<elseif not $dnvp_trials.b>><<set _current_trial to "b">> <<elseif not $dnvp_trials.c>><<set _current_trial to "c">><</if>> <<if _current_trial eq "">> <<set $party_milestones.dnvp.arc_state to "offered">> <<goto "Scene_DNVP_Offer">> <</if>> <</silently>>\ ''他挑出一份。'' <<switch _current_trial>>\ <<case "a">>\ //他推过第一份。封皮上没有字,只有一只压出来的雄鹰,旧军部的章,印口还很新。他没有翻开。他只是把手臂撑在桌沿上,让灯的光正好落在你这一侧。// <<case "b">>\ //他推过一张照片。照片里,有人把共和国那面黑红金的三色旗扯下来,踩在脚底。他把照片转了个方向,让你正对着看。他没有说话。// //你注意到,他身后墙上那面旗,是黑、白、红。黑在上,白居中,红在下。和照片里被踩的那面,颜色正好反着。// <<case "c">>\ //他推过一份名单。名单上是一串名字,姓和名都旧了,像是从一本落灰的家谱里誊出来的。他没有解释那些人是谁。// <</switch>> <<link "「继续」" "Scene_DNVP_Trial">><</link>> /* ---------- Scene_DNVP_Trial:当前这份文件的抉择 ---------- */
<<silently>> <<set _current_trial to "">> <<if not $dnvp_trials.a>><<set _current_trial to "a">> <<elseif not $dnvp_trials.b>><<set _current_trial to "b">> <<elseif not $dnvp_trials.c>><<set _current_trial to "c">><</if>> <<if _current_trial eq "">> <<set $party_milestones.dnvp.arc_state to "offered">> <<goto "Scene_DNVP_Offer">> <</if>> <</silently>>\ <<switch _current_trial>>\ <<case "a">>\ //「步兵预算,要涨三成。」他的声音很平,平得像在念一本背熟了的账簿,「东边不太平。柏林有人觉得,共和国的手,太软了。」// <<link "翻开卷宗,在末页签下名字。">> <<set $dnvp_trials.a to true>>\ <<set $dnvp_pull to $dnvp_pull + 1>>\ <<set $spectrum.left_right to Math.min(100, $spectrum.left_right + 15)>>\ <<set $spectrum.radical_conservative to Math.min(100, $spectrum.radical_conservative + 10)>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 3)>>\ <<dnvp-betray-penalty 3>>\ <<set $dnvp_promise to "a">>\ <<promise-event-write "P11" "许诺:让军费真正到账" "DNVP" "dnvp" "你答应过,让那份步兵预算真正落到军部手里。现在,有一份拨款单摆在你桌上。要不要如约,批下去?" 2>>\ <<set $npcs.dnvp.trust to Math.min(100, $npcs.dnvp.trust + 4)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<set $trial_done_label to "你签了字。">>\ <<set $trial_done_feedback to "军费从共和国账上划走。你往右偏了一寸,也让共和国的钱流向了旧的枪口。几天后,会有一份拨款单,等你兑现这句话。">>\ <<goto "Scene_DNVP_Leave">>\ <</link>>\ <<link "把卷宗推回去:共和国不靠喂饱军靴站稳。">> <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - 8)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<set $trial_done_label to "你把卷宗推了回去。">>\ <<set $trial_done_feedback to "DNVP 把它收进抽屉,什么都没说。">>\ <<goto "Scene_DNVP_Leave">>\ <</link>>\ <<case "b">>\ //他看着照片,又看着你。「撕那个旗的人,让人抓了;可那面该挂的旗,却没人敢挂。」// <<link "撕旗的人,一并抓了。共和国旗不容人踩。">> <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - 8)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<set $trial_done_label to "你替共和国挡了一下。">>\ <<set $trial_done_feedback to "可他要的不是这个。他缓缓收起了照片。">>\ <<goto "Scene_DNVP_Leave">>\ <</link>>\ <<link "撕就撕了。共和国不是靠一面旗活着的。">> <<set $dnvp_trials.b to true>>\ <<set $dnvp_pull to $dnvp_pull + 1>>\ <<set $spectrum.left_right to Math.min(100, $spectrum.left_right + 15)>>\ <<set $spectrum.radical_conservative to Math.min(100, $spectrum.radical_conservative + 8)>>\ <<dnvp-betray-penalty 2>>\ <<set $dnvp_promise to "b">>\ <<promise-event-write "P12" "许诺:不追究撕旗的人" "DNVP" "dnvp" "你放任过共和国旗被踩在脚底。现在,有人把那份抓到撕旗者的报告递了上来,要你处置。要不要如约,高抬贵手?" 2>>\ <<set $npcs.dnvp.trust to Math.min(100, $npcs.dnvp.trust + 4)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<set $trial_done_label to "他慢慢把照片收了起来。">>\ <<set $trial_done_feedback to "像收一件他终于等到的东西。你放任共和国被羞辱了一回,他看你的眼神暖了半度。几天后,会有一份抓人报告,等你决定放不放。">>\ <<goto "Scene_DNVP_Leave">>\ <</link>>\ <<case "c">>\ //「帝国散了这些年。」他开口,声音放轻了些,「活下来的人,还在等一句公道。」他抬眼看你,没有催,只等。// <<link "给名单上的遗属,发一份抚恤。">> <<set $dnvp_trials.c to true>>\ <<set $dnvp_pull to $dnvp_pull + 1>>\ <<set $dnvp_pension to true>>\ <<set $spectrum.radical_conservative to Math.min(100, $spectrum.radical_conservative + 12)>>\ <<set $spectrum.left_right to Math.min(100, $spectrum.left_right + 6)>>\ <<dnvp-betray-penalty 3>>\ <<set $dnvp_promise to "c">>\ <<promise-event-write "P13" "许诺:按月发遗属抚恤" "DNVP" "dnvp" "你答应过,让名单上那些旧名字的遗属,按月领到抚恤。现在,第一笔拨款单摆在你桌上。要不要如约,批下去?" 2>>\ <<set $npcs.dnvp.trust to Math.min(100, $npcs.dnvp.trust + 4)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<set $trial_done_label to "他把名单收进怀里。">>\ <<set $trial_done_feedback to "抚恤是笔长账。从今往后,共和国每个月都要为这些旧名字,持续付钱。你用共和国的血,养帝国的孤。几天后,会有一笔抚恤款,等你批下去。">>\ <<goto "Scene_DNVP_Leave">>\ <</link>>\ <<link "把名单推回去。共和国不养旧账。">> <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - 8)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<set $trial_done_label to "你推回了名单。">>\ <<set $trial_done_feedback to "他沉默了很久,把名单折起来放回抽屉,没再提起。">>\ <<goto "Scene_DNVP_Leave">>\ <</link>>\ <</switch>> /* ---------- Scene_DNVP_Leave:无论满意与否,都请你回 ---------- 一天只做一关,做完即走。 */
<<if not $trial_done_label>><<set $trial_done_label to "他没有什么表情。">><</if>>\ <<if not $trial_done_feedback>><<set $trial_done_feedback to "">><</if>> $trial_done_label //$trial_done_feedback// <hr> //他站起身,替你拉开那扇没挂招牌的门。// //「今天就到这里。你该回去想想。」他说,「你若还愿意来,改日再谈。」// //(改日再来,才能继续谈下一件。)// <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_DNVP_Extra:额外立场试炼链(光谱不够格时) ---------- 三道普通试炼全过后,若光谱仍不到 33/33,DNVP 再给 3 个立场小事件。 做完即进正式邀约(保底)。 */
<<silently>> <<if not $dnvp_extra_step>><<set $dnvp_extra_step to 0>><</if>> <</silently>>\ ''他给你开了另一扇门。'' <<switch $dnvp_extra_step>>\ <<case 0>>\ //他把你带到一间更小的房间。房里只有一张长桌,桌上摊着一叠审阅到一半的公文。他指了指最上面那份。// //「街上有家报纸,总在骂帝国当年的人。」他说,「他们印得越多,信共和国的人就越糊涂。你打算怎么处置?」// <<link "签下封禁令。有些话不该印。">> <<set $dnvp_extra_step to $dnvp_extra_step + 1>>\ <<set $spectrum.left_right to Math.min(100, $spectrum.left_right + 15)>>\ <<set $spectrum.radical_conservative to Math.min(100, $spectrum.radical_conservative + 15)>>\ <<dnvp-betray-penalty 2>>\ <<set $npcs.dnvp.trust to Math.min(100, $npcs.dnvp.trust + 3)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<goto "Scene_DNVP_Extra_Leave">>\ <</link>>\ //(你封了那家报纸的嘴。你往右偏了一大步,也往守旧偏了一大步。可有一根舌头,被你掐掉了。)// <<link "驳回。共和国不封报馆。">> <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - 6)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<goto "Scene_DNVP_Extra_Leave">>\ <</link>>\ //(他合上公文,没接话。)// <<case 1>>\ //他约你在一家老咖啡馆见。你到的时候,他正和一位退役的老军官说话。老军官起立,向你行军礼。// //「他在鲁尔替帝国守过煤矿。」他介绍完,看着你,「如今赋闲在家,想替共和国再做点事。你看,该给他什么位置?」// <<link "让他回军队,官复原职。">> <<set $dnvp_extra_step to $dnvp_extra_step + 1>>\ <<set $spectrum.left_right to Math.min(100, $spectrum.left_right + 15)>>\ <<set $spectrum.radical_conservative to Math.min(100, $spectrum.radical_conservative + 15)>>\ <<set $world.army_influence to Math.min(100, $world.army_influence + 4)>>\ <<dnvp-betray-penalty 3>>\ <<set $npcs.dnvp.trust to Math.min(100, $npcs.dnvp.trust + 3)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<goto "Scene_DNVP_Extra_Leave">>\ <</link>>\ //(老军官又行了一次礼。你把一支旧枪,重新放回了军队的手里。)// <<link "给他一个文职,别再碰兵权。">> <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - 6)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<goto "Scene_DNVP_Extra_Leave">>\ <</link>>\ //(他端起咖啡,没喝,也没说话。)// <<case 2>>\ //最后一次,他带你来到一座旧营房。炉火边围坐着几个老兵,桌上摆着酒,墙上挂着一面磨损的旧旗。// //「这些人,替帝国流过血。」他说,「他们只想知道,还有人记得那面旗没有。」他递给你一杯酒,看着你。// <<link "接过酒,敬那面旧旗。">> <<set $dnvp_extra_step to $dnvp_extra_step + 1>>\ <<set $spectrum.left_right to Math.min(100, $spectrum.left_right + 15)>>\ <<set $spectrum.radical_conservative to Math.min(100, $spectrum.radical_conservative + 15)>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 4)>>\ <<dnvp-betray-penalty 3>>\ <<set $npcs.dnvp.trust to Math.min(100, $npcs.dnvp.trust + 3)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<goto "Scene_DNVP_Extra_Leave">>\ <</link>>\ //(老兵们起了身,向你举杯。你敬的不是酒,是一面早已不存在的旗。)// <<link "放下酒杯。共和国不敬后退的旗。">> <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - 6)>>\ <<set $dnvp_last_trial_day to $session_day>>\ <<goto "Scene_DNVP_Extra_Leave">>\ <</link>>\ //(炉火映着他的脸,他什么也没说。)// <</switch>> /* ---------- Scene_DNVP_Extra_Leave:额外试炼做完,当天请回 ---------- */
//他起身,替你拉开门。// <<if $dnvp_extra_step gte 3>>\ //「够了。」他说,「你愿为了我,走进这些屋子。够不够格,我说了算。我们改日谈正事。」//\ <<else>>\ //「今天先到这里。」他说,「你若还愿意来,我们改日再谈。」//\ <</if>> //(改日再来,才能继续。)// <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_DNVP_Accepted:接受复辟 ---------- */
''一扇门,被重新推开。'' //你说了「好」。那个字出口的一瞬间,DNVP 的脊背挺直了。他走到墙边,把那面褪色的旗从墙上取下来,抖开,灰尘在灯下飘起来。// //「你做了一个选择。」他说,「你的名字,会记在那面旗上——不是作为共和国的总理,而是作为把旗重新挂回去的人。」// //你走出那间屋子的时候,柏林还是那座柏林。但你清楚:有些东西已经在暗处重新苏醒了。灯下,有人开始传唱一首旧歌。// //(政府信任大幅下降,民族主义抬头。党内与左翼的信任,正在流失。)// ''DNVP 对你的信任:<<bar $npcs.dnvp.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_SecretPact:秘密结盟达成(共享结果页) ---------- 触发:在 KPD/DNVP 邀约场景里选择「秘密结盟」。 只在暗处办事,不公开站队;信任不掉,但暴露度从此开始累积。 */
<<silently>> <<set _sp_pid to $secret_pact_pid ? $secret_pact_pid : "kpd">> <<set _sp_party to $party_names[_sp_pid]>> <<secret-tier-name _sp_pid>> <<set _sp_tier to _tier_name>> <</silently>>\ ''灯,被压暗了一格。'' //你说了「不公开」。空气安静了一瞬。他没有笑,也没有失望,只是把手里那份原本要当场签的东西,缓缓收进抽屉,又抽出另一张没有抬头的纸。// //「聪明。」他说,「公开的,是给外面看的。你和我之间,不需要那些。」// //他递过一支笔。纸面上没有名字,没有机构,只有一句再简单不过的话。你签下的时候,没有抬头看他——有些字的重量,是注定要一个人扛的。// //走出那间屋子,柏林还是那座柏林。没有横幅,没有掌声,没有第二个人知道。但你知道:从今晚起,你与 _sp_party 之间,多了一条别人的目光落不进来的线。// //(你与 _sp_party 的秘密结盟成立了。关系起步于「_sp_tier」。信任没有掉,但''暴露度''从此会随每一个日子、每一次接触,悄悄累积——纸终究包不住火。)// ''民主党与温和派并未察觉。但暗处,已经开始有人记下你的名字。'' <<link "返回办公室" "Scene_Office">><</link>> /* ════════════════════════════════════════════════════════════ 满信任 · DDP 宪法之约(保宪线) 触发:DDP 信任满 100 → arc_state=offered → 办公室出现「邀你立约」。 DDP 不设光谱门槛/试炼(他是宪法与法治的守护者,与 SPD 同属民主中间派, 但守的是「宪法与法治」而非「工人与共和国形态」)。 直接邀你确立「宪法之约」:承诺不绕过宪法行事、不以权越法。 落地成紫色许诺事件:履行→DDP信任+、违背→DDP信任大幅跌 (背弃宪法,比背弃一个人更让他痛)。 之后持续监督你的文件篮与国会表决(ddp-supervise / ddp-supervise-review)。 ============================================================ */
<<silently>> <<if not $party_milestones.ddp>> <<set $party_milestones.ddp to { ally:false, voice:false, peak:false, arc_offered:false, arc_state:"none" }>> <</if>> <<if $party_milestones.ddp.arc_state eq "none">> <<set $party_milestones.ddp.arc_state to "offered">> <</if>> <</silently>>\ ''一间关了灯的书店。'' //DDP 没有约你去党部。他让助手递来一张纸条,约你在那家老书店见面。你到的时候,店门虚掩,灯已经为你亮了。他站在最里间,面前摊着一本批注到页边发白的宪法。// //他听见你的脚步声,没有抬头。他把那本宪法翻到某一页,手指在字迹上停了一下,才抬眼。// <div class="ddp-speech">「你愿意读它。」他开口,语气平得像在陈述一件已经确认过的事,「多数人看宪法,翻到第二页就放下了。你不一样。所以我需要向你确认——当你掌管着权力,你会先翻看宪法,还是直接绕过它?」</div> //他把那本宪法转了个方向,指着扉页一行批注。// <div class="ddp-speech">「我不需要你加入我们。我需要你想清楚——如果多数人都觉得绕开宪法办事更加省力的那一天到来,你是否会记得它仍在这里。」他合上书,「你愿意和我一起捍卫它吗?」</div> ''—— 宪法之约,还是不要。 ——'' <<link "「答应他。权力之外,先有宪法。」">> <<set $party_milestones.ddp.arc_state to "accepted">>\ <<set $party_milestones.ddp.arc_offered to true>>\ <<set $ddp_arc to "accepted">>\ <<set $weimar_night_talk to true>>\ <<set $weimar_pending_convert to "party_ddp">>\ <<set $world.gov_trust to Math.min(100, $world.gov_trust + 8)>>\ <<set $npcs.ddp.trust to Math.min(100, $npcs.ddp.trust + 5)>>\ <<set $ddp_covenant to true>>\ <<set $ddp_promise to "a">>\ <<promise-event-write "P22" "宪法之约:不绕宪行事" "DDP" "ddp" "你向 DDP 承诺过,不绕过宪法行事。现在,有一份可以走第48条捷径的紧急处置方案递到了你桌上。要不要如约,走议会程序?" 2>>\ <<goto "Scene_DDP_Accepted">>\ <</link>> <<link "「抱歉。宪法是别人的规矩。」">> <<set $party_milestones.ddp.arc_state to "refused">>\ <<set $party_milestones.ddp.arc_offered to true>>\ <<set $ddp_arc to "refused">>\ <<set $npcs.ddp.trust to Math.max(0, $npcs.ddp.trust - 15)>>\ <<goto "Scene_DDP_Refused">>\ <</link>> <<link "「再想想。」">> <<goto "Scene_Office">>\ <</link>> /* ---------- Scene_DDP_Accepted:接受宪法之约 ---------- */
''宪法之约,立下了。'' //你向他允诺。DDP 没有立刻说话。他把那本宪法重新翻开,在扉页上,用笔添了一行字,然后推到你面前。// //「你做了一个决定。」他说,「我把它记在这一页。往后你若越过它,这一行字会一直在这里,提醒我,也提醒你。」// //他合上书,郑重地推到你的方向。你伸出手,隔着一本书,和他握了握。// //(政府信任上升。DDP 信任上升。几天后,会有一份可以走捷径的紧急处置方案,等你兑现宪法之约。)// <<covenant-sync>>\ <<if $covenant_just_active>>\ ''—— 大联合政府,成立了。 ——'' //由 SPD、DDP、DVP、Zentrum 组成的大联合政府,成立了。这让你对于共和国的未来有了更多乐观的看法。//\ <</if>>\ ''DDP 对你的信任:<<bar $npcs.ddp.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_DDP_Refused:拒绝宪法之约 ---------- */
''那盏灯,在你身后暗了一下。'' //你说了「不」。DDP 没有发怒。他只是把那本宪法放回书架,动作很慢,像在确认它放得稳。// //「你有自己的路。」他重复了一遍你的话,没有讽刺,只有一种了然。「只是别让共和国,在你去那条路的半路上,把宪法也弄丢了。」// //他站在那里,没有再送你。// //(DDP 对你的信任下降。宪法之约没有成立,但他仍会看着你的手——看你有没有越过那条线。)// ''DDP 对你的信任:<<bar $npcs.ddp.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ════════════════════════════════════════════════════════════ 温和盟约 · DVP 治国之约(保繁荣线) 触发:DVP 信任 >= 80 → arc_state=offered → 办公室出现「邀你立约」。 DVP 是以数字/务实为信仰的现实主义者;盟约 = 你愿意和他一起, 扛下那些「怎么算都算不进账本」的责任。 之后持续监督你的文件篮与国会表决(dvp-supervise / dvp-supervise-review)。 ============================================================ */
<<silently>> <<if not $party_milestones.dvp>> <<set $party_milestones.dvp to { ally:false, voice:false, peak:false, arc_offered:false, arc_state:"none" }>> <</if>> <<if $party_milestones.dvp.arc_state eq "none">> <<set $party_milestones.dvp.arc_state to "offered">> <</if>> <</silently>>\ ''一间深夜还亮着灯的办公室。'' //DVP 没有去党部。他让人在深夜给你递了一张字条,约你到那间他还亮着灯的办公室。你到的时候,桌上摊着一本没合上的账本,旁边压着一支用秃的笔。// //他没有抬头,直到你在他对面坐下。他把你来之前一直盯着的那页,翻到最上面——那页上有一行数字,他用笔算了很多遍,却始终没敢落笔。// <div class="dvp-speech">「我怕的不是算错。」他说,「是有些东西,怎么算,都算不进这一页。从前我谁都不信,只信数字。」他抬起眼,把笔横着推向你的方向,「现在,我想试试,信一个能陪我把算不清的部分,一起扛下来的人。」</div> ''—— 治国之约,还是不要。 ——'' <<link "「答应他。我和你一起,扛那些算不清的。」">> <<set $party_milestones.dvp.arc_state to "accepted">>\ <<set $party_milestones.dvp.arc_offered to true>>\ <<set $dvp_arc to "accepted">>\ <<set $weimar_night_talk to true>>\ <<set $weimar_pending_convert to "party_dvp">>\ <<set $world.gov_trust to Math.min(100, $world.gov_trust + 6)>>\ <<set $world.economy to Math.max(0, Math.min(100, $world.economy - 4))>>\ <<set $npcs.dvp.trust to Math.min(100, $npcs.dvp.trust + 5)>>\ <<set $dvp_covenant to true>>\ <<set $dvp_promise to "a">>\ <<promise-event-write "P31" "治国之约:不滥印钞" "DVP" "dvp" "你向 DVP 承诺过,不让印钞机再开下去。现在,有一份赤字预算草案递到了你桌上,上面请求增发一轮紧急货币。要不要如约,驳回它?" 2>>\ <<goto "Scene_DVP_Accepted">>\ <</link>> <<link "「拒绝他。数字救不了共和国。」">> <<set $party_milestones.dvp.arc_state to "refused">>\ <<set $party_milestones.dvp.arc_offered to true>>\ <<set $dvp_arc to "refused">>\ <<set $npcs.dvp.trust to Math.max(0, $npcs.dvp.trust - 20)>>\ <<goto "Scene_DVP_Refused">>\ <</link>> <<link "「再想想。」">> <<goto "Scene_Office">>\ <</link>> /* ---------- Scene_DVP_Accepted:接受治国之约 ---------- */
''治国之约,立下了。'' //你拿起那支笔。他没有立刻松开,指腹在笔杆上停了一瞬,像在确认你真的接住了。你想了想,在那行没敢落笔的数字下面,签下了自己的名字。// //他看了很久,没有说话。最后他把那页纸折好,锁进抽屉最里面一层。// //「你知道我刚才在想什么吗?」他忽然问,「我在想,这页纸,从前只有我一个人敢看。现在,多了一个人,愿意和我一起看它。」// //(政府信任上升。经济压力缓解。几天后,会有一份赤字预算案,等你兑现治国之约。)// <<covenant-sync>>\ <<if $covenant_just_active>>\ ''—— 大联合政府,成立了。 ——'' //由 SPD、DDP、DVP、Zentrum 组成的大联合政府,成立了。这让你对于共和国的未来有了更多乐观的看法。//\ <</if>>\ ''DVP 对你的信任:<<bar $npcs.dvp.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_DVP_Refused:拒绝治国之约 ---------- */
''那支笔,没有动。'' //你说了「不」。DVP 没有生气。他只是把笔从桌上拿起来,放回笔筒里,动作很轻。// //「你有你的路。」他说,「只是别让共和国,在走那条路的半路上,连账都记不明白了。」// //他重新低下头,看向那本账本。你离开的时候,那盏灯还亮着,替他一个人亮着。// //(DVP 对你的信任下降。治国之约没有成立,但他仍会看着你的手——看你有没有把国家的账,算明白。)// ''DVP 对你的信任:<<bar $npcs.dvp.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ════════════════════════════════════════════════════════════ 满信任 · SPD 守护盟约(保共和线) 触发:SPD 信任满 100 → arc_state=offered → 办公室出现「邀你盟约」。 SPD 不设光谱门槛/试炼(他是守护共和国的中间派), 直接邀你确立「守护共和国盟约」,并给出一条守护承诺, 落地成紫色许诺事件:履行→SPD信任+、违背→SPD信任大幅跌 (你亲手毁了你要守护的东西,比背叛更坏)。 之后持续监督你的文件篮与国会表决(spd-supervise / spd-supervise-review)。 ============================================================ */
<<silently>> <<if not $party_milestones.spd>> <<set $party_milestones.spd to { ally:false, voice:false, peak:false, arc_offered:false, arc_state:"none" }>> <</if>> <<if $party_milestones.spd.arc_state eq "none">> <<set $party_milestones.spd.arc_state to "offered">> <</if>> <</silently>>\ ''一间亮着灯的工会办公室。'' //SPD 没有约你去党部。他让秘书递来一张便条,约你在工会图书馆见面。你到的时候,他正站在一排书架前,手里捧着一本翻旧了的宪法。// //他听见你的脚步声,没有立刻回头。他把那本宪法放回书架,手指在书脊上停了一下,才转过身。// <div class="spd-speech">「你让我相信,你是真正的共和国守护者。」他说,「不是因我,也不是因别的什么,只是守着『共和国』这三个字,和它底下的那点内涵。你我都知道——并不是所有人都想看着它活着。」</div> //「我不求你站在我这边。」他抬起眼,「但我求你能一直站在共和国身侧。你愿意,和我一起,守护民主吗?」// ''—— 守护盟约,还是不要。 ——'' <<link "「答应他。我和你一起,守住共和国。」">> <<set $party_milestones.spd.arc_state to "accepted">>\ <<set $party_milestones.spd.arc_offered to true>>\ <<set $spd_arc to "accepted">>\ <<set $weimar_night_talk to true>>\ <<set $weimar_pending_convert to "party_spd">>\ <<set $world.gov_trust to Math.min(100, $world.gov_trust + 8)>>\ <<set $npcs.spd.trust to Math.min(100, $npcs.spd.trust + 5)>>\ <<set $spd_covenant to true>>\ <<set $spd_promise to "a">>\ <<promise-event-write "P21" "盟约:不许军队坐大" "SPD" "spd" "你向 SPD 承诺过,不让军队越过宪法。现在,有一份军部扩编申请递到了你桌上。要不要如约,驳回它?" 2>>\ <<goto "Scene_SPD_Accepted">>\ <</link>> <<link "「抱歉。我有自己的路。」">> <<set $party_milestones.spd.arc_state to "refused">>\ <<set $party_milestones.spd.arc_offered to true>>\ <<set $spd_arc to "refused">>\ <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - 15)>>\ <<goto "Scene_SPD_Refused">>\ <</link>> <<link "「再想想。」">> <<goto "Scene_Office">>\ <</link>> /* ---------- Scene_SPD_Accepted:接受守护盟约 ---------- */
''盟约,立下了。'' //你说了「好」。那个字出口的一瞬间,SPD 的脊背挺直了。他把那本宪法从书架上重新抽出来,翻开,放在你们之间。// //「你做了一个选择。」他说,「我看重的不是今晚你和我站在了一处,而是你站到了共和国这边。」// //他合上书,郑重地推到你面前。你伸出手,在那盏灯下,隔着一本书,和他握了握。// //(政府信任上升。SPD 信任上升。几天后,会有一份军部扩编申请,等你兑现盟约。)// ''SPD 对你的信任:<<bar $npcs.spd.trust 100>>'' <<covenant-sync>>\ <<if $covenant_just_active>>\ ''—— 大联合政府,成立了。 ——'' //由 SPD、DDP、DVP、Zentrum 组成的大联合政府,成立了。这让你对于共和国的未来有了更多乐观的看法。//\ <</if>>\ <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_SPD_Refused:拒绝守护盟约 ---------- */
''那盏灯,在你身后暗了一下。'' //你说了「不」。SPD 没有发怒。他只是把那本宪法放回书架,动作很慢,像在确认它放得稳。// //「你有自己的路。」他重复了一遍你的话,没有讽刺,只有一种了然。「只是别让共和国,在你去那条路的半路上,替你倒下。」// //他站在那里,没有再送你。// //(SPD 对你的信任下降。盟约没有成立,但监督并未停止——他仍会看着你。)// ''SPD 对你的信任:<<bar $npcs.spd.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ════════════════════════════════════════════════════════════ 温和盟约 · Zentrum 守门之约(保秩序线) 触发:Zentrum 信任 >= 80 → arc_state=offered → 办公室出现「邀你立约」。 Zentrum 是替共和国守门的人;盟约 = 你愿意和他一起,守着 「还有人会进来」这件事。之后持续监督文件篮与国会表决。 ============================================================ */
<<silently>> <<if not $party_milestones.zentrum>> <<set $party_milestones.zentrum to { ally:false, voice:false, peak:false, arc_offered:false, arc_state:"none" }>> <</if>> <<if $party_milestones.zentrum.arc_state eq "none">> <<set $party_milestones.zentrum.arc_state to "offered">> <</if>> <</silently>>\ ''一座小教堂的侧厅。'' //Zentrum 没有约你去办公室。他托人递了话,约你在城西一座小教堂的侧厅等他。你到的时候,他正站在烛台前,手里不是念珠,是一把钥匙。// //他听见你进来,没有回头,只是把那把钥匙放在烛火旁,然后转过身。烛光在他脸上晃,看得清他眼角的纹路。// <div class="zentrum-speech">「我这一生,替共和国守了很多门。」他说,「守门的人,最怕的不是门被撞开,是有一天,他发现门里的人早就走光了,只剩他一个人,还点着灯。」他抬起眼,「你今晚来了。灯下,多了一个人。」</div> ''—— 守门之约,还是不要。 ——'' <<link "「答应他。我替你守着,还有人会进来。」">> <<set $party_milestones.zentrum.arc_state to "accepted">>\ <<set $party_milestones.zentrum.arc_offered to true>>\ <<set $zentrum_arc to "accepted">>\ <<set $weimar_night_talk to true>>\ <<set $weimar_pending_convert to "party_zentrum">>\ <<set $world.gov_trust to Math.min(100, $world.gov_trust + 6)>>\ <<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger - 4))>>\ <<set $npcs.zentrum.trust to Math.min(100, $npcs.zentrum.trust + 5)>>\ <<set $zentrum_covenant to true>>\ <<set $zentrum_promise to "a">>\ <<promise-event-write "P41" "守门之约:不纵容暴力" "Zentrum" "zentrum" "你向 Zentrum 承诺过,不让街头暴力越过共和国的门槛。现在,有一份准予警察扩大镇压权限的请示递到了你桌上。要不要如约,驳回它?" 2>>\ <<goto "Scene_Zentrum_Accepted">>\ <</link>> <<link "「拒绝他。门该由共和国自己看着。」">> <<set $party_milestones.zentrum.arc_state to "refused">>\ <<set $party_milestones.zentrum.arc_offered to true>>\ <<set $zentrum_arc to "refused">>\ <<set $npcs.zentrum.trust to Math.max(0, $npcs.zentrum.trust - 20)>>\ <<goto "Scene_Zentrum_Refused">>\ <</link>> <<link "「再想想。」">> <<goto "Scene_Office">>\ <</link>> /* ---------- Scene_Zentrum_Accepted:接受守门之约 ---------- */
''守门之约,立下了。'' //你伸手,接过了那把钥匙。他没有立刻松手,指节在钥匙上一紧,又缓缓松开。// //「这扇门,从前只有我守着。」他说,「从今晚起,多了一双眼睛,替『还有人会进来』这件事留神。」// //他引你走到侧厅的窗边,窗外是柏林的夜。他忽然问:「你猜,门里的人,现在还有多少是醒着的?」他没有等你回答,「不管多少,只要还有一盏灯亮着,这扇门就还值得守。」// //(政府信任上升。社会愤怒缓解。几天后,会有一份警察扩权请示,等你兑现守门之约。)// ''Zentrum 对你的信任:<<bar $npcs.zentrum.trust 100>>'' <<covenant-sync>>\ <<if $covenant_just_active>>\ ''—— 大联合政府,成立了。 ——'' //由 SPD、DDP、DVP、Zentrum 组成的大联合政府,成立了。这让你对于共和国的未来有了更多乐观的看法。//\ <</if>>\ <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_Zentrum_Refused:拒绝守门之约 ---------- */
''那盏烛火,晃了一下。'' //你说了「不」。Zentrum 没有生气。他只是把那把钥匙从烛火旁拿起来,收回怀里,动作很慢。// //「你有你的路。」他说,声音里没有责备,「只是别让共和国,在走那条路的半路上,连一盏守门的灯都没有了。」// //他重新面向烛火。你离开的时候,那盏灯还亮着,替他一个人亮着。// //(Zentrum 对你的信任下降。守门之约没有成立,但他仍会看着你的手——看你有没有让那扇门,一直有人守着。)// ''Zentrum 对你的信任:<<bar $npcs.zentrum.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Talk_SPD_Distrust:SPD 信任低时主动找你 ---------- 触发:SPD 信任 <=20 且玩家曾让他失望(违背某件 SPD 相关的事/往敌对走)。 他不来质问,他只是来,坐一会儿,像确认你还在。 */
<<set $spd_distrust_talk_done to true>> ''SPD 在门口等你。'' //你推门时,他正站在走廊尽头,靠着墙,手里攥着一顶旧帽。他没有上前,只是看着你,像在等一个已经知道答案的问题。// <div class="spd-note"><span class="spd-note-tag">SPD 的声音</span>「我不知道自己是不是还认得出你。」他说,声音很轻,「你替他签军费的时候,我认不出你。你走进那间屋子的时候,我也认不出你。可我知道,认不出你的,不只是我。」</div> //他停了一下,把那顶旧帽攥得更紧。// <div class="spd-note"><span class="spd-note-tag">SPD 的声音</span>「我不是来责问你的。」他说,「我只是想来确认一下——你心里,还有没有那个,曾经想守护共和国的人。如果还有,我们都还有机会。如果没有……」他没有说完,转身就走了。</div> //他走的时候,没有回头。你在他背影里,看不清他是不是在等你说什么。// <<link "「站住。我心里还有。」">> <<set $npcs.spd.trust to Math.min(100, $npcs.spd.trust + 8)>>\ <<set $world.gov_trust to Math.min(100, $world.gov_trust + 3)>>\ <<goto "Scene_Office">>\ <</link>>\ //(他停住了脚步。过了一会儿,他说:「……那好。我等你,把那个自己,找回来。」)// <<link "沉默。你没有回答。">> <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - 5)>>\ <<goto "Scene_Office">>\ <</link>>\ //(他的背影顿了一下,然后消失在走廊尽头。)// /* ════════════════════════════════════════════════════════════ 满信任 · KPD 革命邀约(旗舰试点·左翼) 触发:KPD 信任满 100 → arc_state=pulling → 办公室出现「邀你密谈」。 光谱达标(左/右轴 <=-33 且 激进/保守轴 <=-33,即偏左+偏激进)→ 直接给抉择; 否则先过 3 道「革命试炼」,把玩家光谱往左/激进方向拉。 接受 = 推动革命推翻共和国;拒绝 = 关系破裂。 ============================================================ */
<<silently>> <<if not $party_milestones.kpd>> <<set $party_milestones.kpd to { ally:false, voice:false, peak:false, arc_offered:false, arc_state:"none" }>> <</if>> <<if not $kpd_trials>> <<set $kpd_trials to { a:false, b:false, c:false }>> <</if>> <<if not $kpd_pull>> <<set $kpd_pull to 0>> <</if>> <<if $party_milestones.kpd.arc_state eq "none">> <<set $party_milestones.kpd.arc_state to "pulling">> <</if>> <<set _kqualify to ($spectrum.left_right lte -33 and $spectrum.radical_conservative lte -33)>> <<if _kqualify and $party_milestones.kpd.arc_state eq "pulling">> <<set $party_milestones.kpd.arc_state to "offered">> <</if>> /* 确定当前未完成的试炼 */ <<set _k_current to "">> <<if not $kpd_trials.a>><<set _k_current to "a">> <<elseif not $kpd_trials.b>><<set _k_current to "b">> <<elseif not $kpd_trials.c>><<set _k_current to "c">><</if>> /* 时间门控:一天只做一关 */ <<set _k_ready to false>> <<if not $kpd_last_day or $session_day gt $kpd_last_day>> <<set _k_ready to true>> <</if>> /* 三道全过的判定:光谱够格 → 正式邀约;否则额外革命试炼链 */ <<if _k_current eq "" and $party_milestones.kpd.arc_state eq "pulling">> <<if _kqualify>> <<set $party_milestones.kpd.arc_state to "offered">> <<elseif $kpd_extra_step gte 3>> <<set $party_milestones.kpd.arc_state to "offered">> <</if>> <</if>> <</silently>>\ ''一间没有招牌的屋子。'' //常年在街头发《红旗》报的那个报童,在你手里偷偷塞进一张纸条,上面只有一个地址。你推门进去时,屋里只有一盏灯,和桌边一个坐着的人。// //他抬起头。灯把他的影子拉得很长。他没有叫你坐下,他只是看着你,像在重新确认,你是不是那个他以为的人。// <<if $party_milestones.kpd.arc_state eq "offered">>\ //「你终究走到了这里。」他说,声音不高,「不是因为你听懂了,是因为你看见了。」// //「很多人看见,但他们把目光转开。你看见了,还站住了。」// ''—— 革命,还是不革命。 ——'' //「共和国已经死了,只是还没埋。」他说,「你手里有它的钥匙。你打算,把它交给谁?」// <<link "「答应他。把钥匙,交给革命。」">> <<set $party_milestones.kpd.arc_state to "accepted">>\ <<set $party_milestones.kpd.arc_offered to true>>\ <<set $kpd_arc to "accepted">>\ <<set $weimar_night_talk to true>>\ <<set $weimar_pending_convert to "party_kpd">>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 25)>>\ <<set $world.revolution to Math.min(100, $world.revolution + 20)>>\ <<set $world.political_violence to Math.min(100, $world.political_violence + 10)>>\ <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - 15)>>\ <<set $npcs.zentrum.trust to Math.max(0, $npcs.zentrum.trust - 12)>>\ <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - 10)>>\ <<set $npcs.army.trust to Math.max(0, $npcs.army.trust - 10)>>\ <<legacy-create "LG_KPD_REVOLUTION" {政府信任:-25, 革命压力:20} "kpd" "trauma" "革命的暗流重新抬头">>\ <<goto "Scene_KPD_Accepted">>\ <</link>> <<link "「拒绝他。共和国还没到该埋的时候。」">> <<set $party_milestones.kpd.arc_state to "refused">>\ <<set $party_milestones.kpd.arc_offered to true>>\ <<set $kpd_arc to "refused">>\ <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - 30)>>\ <<goto "Scene_KPD_Refused">>\ <</link>> <<link "「不公开。我只在暗处,为你办事。」(秘密结盟)">> <<secret-establish "kpd">>\ <<set $party_milestones.kpd.arc_state to "secret">>\ <<set $party_milestones.kpd.arc_offered to true>>\ <<set $secret_pact_pid to "kpd">>\ <<goto "Scene_SecretPact">>\ <</link>> <<link "「再想想。」">> <<goto "Scene_Office">>\ <</link>> <<elseif $party_milestones.kpd.arc_state eq "pulling">>\ <<if _k_current neq "" and _k_ready>>\ //他没有催你坐下。他只是把灯又拧亮了一点,让光落在你们之间的桌面上。他看你的目光,不像在看一位总理,更像在看一扇还没撬开的门。// <div class="kpd-speech">「你走到这一步,我信你有胆量。可胆量不是立场。」他说,「革命留给你的时间,和我留着命等你的时间,都不多了。」</div> //他伸手,向桌下,像早就为你备好了什么。// <<link "「继续」" "Scene_KPD_TrialIntro">><</link>> <<elseif _k_current neq "" and not _k_ready>>\ //「你来了。」他放下手里的传单,看着你。// <div class="kpd-speech">「今天先到这里。你该回去想想。你若还愿意来,我们改日再谈。」</div> //他屈起手指,在桌沿敲了两下。// <<link "请回吧" "Scene_Office">><</link>> <<elseif _k_current eq "" and $kpd_extra_step lt 3 and _k_ready>>\ //三道都过了。他却没有松口。他看你的目光,比先前深了一分。// <div class="kpd-speech">「你做了三件事,可我看得出,你的心还没真正站过来。你是在替我办事,不是在信革命。」</div> //「还差一点。」他说,「你若愿意,我们再试几回。」// <<link "「继续」" "Scene_KPD_Extra">><</link>> <<elseif _k_current eq "" and $kpd_extra_step lt 3 and not _k_ready>>\ //「你来了。」他放下手里的传单,看着你。// <<link "请回吧" "Scene_Office">><</link>> <</if>>\ <<else>>\ //(这条线已经走完。你带着答案离开,屋里的灯在你身后熄灭。)// <<link "返回办公室" "Scene_Office">><</link>> <</if>> /* ---------- Scene_KPD_TrialIntro:他挑出当前这份 ---------- */
<<silently>> <<set _k_current to "">> <<if not $kpd_trials.a>><<set _k_current to "a">> <<elseif not $kpd_trials.b>><<set _k_current to "b">> <<elseif not $kpd_trials.c>><<set _k_current to "c">><</if>> <<if _k_current eq "">> <<set $party_milestones.kpd.arc_state to "offered">> <<goto "Scene_KPD_Offer">> <</if>> <</silently>>\ ''他推过一件。'' <<switch _k_current>>\ <<case "a">>\ //他推过一份档案,牛皮纸封,边角磨得发白。封面上没有抬头,只压着警察局政治部的章。他抽开系绳,让你看见里面一页页的名字、住址、和什么时候被谁买通的记录。// //他没有解释这堆纸从哪来。他只是把档案转了个方向,正对着你。// <<case "b">>\ //他推过一张通行证。白纸,黑字,盖着你的总理府印。印油还新,像是照着你平时用的样子,连夜仿出来的。他把它平放在你面前,没有碰它,像怕碰坏了。// <<case "c">>\ //他推过一份名单。名单上是一串名字,姓和名都旧了,像是从牢房里誊出来的。但这一次,他开口了,声音压得很低:「这些人,能替我们打开一扇门。」// <</switch>> <<link "「继续」" "Scene_KPD_Trial">><</link>> /* ---------- Scene_KPD_Trial:当前这份的抉择 ---------- */
<<silently>> <<set _k_current to "">> <<if not $kpd_trials.a>><<set _k_current to "a">> <<elseif not $kpd_trials.b>><<set _k_current to "b">> <<elseif not $kpd_trials.c>><<set _k_current to "c">><</if>> <<if _k_current eq "">> <<set $party_milestones.kpd.arc_state to "offered">> <<goto "Scene_KPD_Offer">> <</if>> <</silently>>\ <<switch _k_current>>\ <<case "a">>\ //「这上面的名字,都是你们政治部养的狗。」他开口,声音很轻,却咬得很清,「他们每天把工人说了什么,记下来,报上去。工人们不知道。他们还以为身边那些陪他喝酒、帮他带信的人,是兄弟。」// //「你不用做别的。你只要,别让这份档案被烧掉。」他向前倾了倾身,「让它在,它就在。」// <<link "把档案推回去。我不能把共和国的人,交给街头。">> <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - 8)>>\ <<set $kpd_last_day to $session_day>>\ <<set $ktrial_label to "你把档案推了回去。">>\ <<set $ktrial_feedback to "他看了那份档案很久,把它重新系上,收回怀里,再没提起。">>\ <<goto "Scene_KPD_Leave">>\ <</link>>\ <<link "默许这份档案留在你见不到的地方。">> <<set $kpd_trials.a to true>>\ <<set $kpd_pull to $kpd_pull + 1>>\ <<set $spectrum.left_right to Math.max(-100, $spectrum.left_right - 15)>>\ <<set $spectrum.radical_conservative to Math.max(-100, $spectrum.radical_conservative - 10)>>\ <<kpd-betray-penalty 3>>\ <<set $kpd_promise to "a">>\ <<promise-event-write "P01" "许诺:让线人档案消失" "KPD" "kpd" "你答应过,不让那份警察局政治部的线人档案被烧掉。它现在还在暗处。要不要如约,让它彻底消失?" 2>>\ <<set $npcs.kpd.trust to Math.min(100, $npcs.kpd.trust + 4)>>\ <<set $kpd_last_day to $session_day>>\ <<set $ktrial_label to "你没有烧它。你只是,没有看见它。">>\ <<set $ktrial_feedback to "他收好档案,起身时在你肩头按了一下,没有说谢。你清楚那些名字的结局,你只是选择不去想。你往左偏了一寸,也让共和国的狗,第一次没了主人。几天后,会有一份文件,需要你兑现这句话。">>\ <<goto "Scene_KPD_Leave">>\ <</link>>\ <<case "b">>\ //「明天夜里,有一批东西要出城。」他说这话时,没有看通行证,他看的是你,「不是武器。是几台印刷机,和三个人。他们要去外地,把火种带过去。」// //「我知道你签个字,明天就会有人来问你。」他顿了顿,「所以我不求你真签。我只要你,明天别在文件上多看一眼。」// <<link "把通行证推回去。我不能在夜里放东西出城。">> <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - 8)>>\ <<set $kpd_last_day to $session_day>>\ <<set $ktrial_label to "你把通行证推了回去。">>\ <<set $ktrial_feedback to "他接过那张伪造的纸,慢慢撕掉,拢在手心,没让你看见他眼里的东西。">>\ <<goto "Scene_KPD_Leave">>\ <</link>>\ <<link "留下通行证,明天不去追问那批货。">> <<set $kpd_trials.b to true>>\ <<set $kpd_pull to $kpd_pull + 1>>\ <<set $spectrum.left_right to Math.max(-100, $spectrum.left_right - 15)>>\ <<set $spectrum.radical_conservative to Math.max(-100, $spectrum.radical_conservative - 8)>>\ <<kpd-betray-penalty 2>>\ <<set $kpd_promise to "b">>\ <<promise-event-write "P02" "许诺:别追问那批出城的货" "KPD" "kpd" "你答应过,不去追问那三台印刷机和三个人。现在,有人把一问记载递到了你桌上。要不要如约,按下不表?" 2>>\ <<set $npcs.kpd.trust to Math.min(100, $npcs.kpd.trust + 4)>>\ <<set $kpd_last_day to $session_day>>\ <<set $ktrial_label to "你留下了通行证。">>\ <<set $ktrial_feedback to "那夜,三台印刷机和三个人,在共和国眼皮底下离开了柏林。你躺在自己的床上,想象着它们在某个黑暗的仓库里,吐出明天会印在墙上的字。几天后,会有人来问你这批货。你往左偏了一寸。">>\ <<goto "Scene_KPD_Leave">>\ <</link>>\ <<case "c">>\ //「这名单上,有一个人,还在你手里。」他压低声音,「不是政治犯。是你们内部的一个,老熟人。他手里握着一条线,能通到军部。」// //「我不求你放谁。我只求你,别挡那条线。」他抬眼看你,目光里没有试探,只有一种近乎恳求的急切,「革命等不起。你等得起,它等不起。」// <<link "把名单推回去。我谁也不会放。">> <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - 8)>>\ <<set $kpd_last_day to $session_day>>\ <<set $ktrial_label to "你把名单推了回去。">>\ <<set $ktrial_feedback to "他握住那份名单,指节发白,很久没有松开。他最后说:「你选了。别后悔。」">>\ <<goto "Scene_KPD_Leave">>\ <</link>>\ <<link "松开那条线,让名单上的人走。">> <<set $kpd_trials.c to true>>\ <<set $kpd_pull to $kpd_pull + 1>>\ <<set $spectrum.left_right to Math.max(-100, $spectrum.left_right - 6)>>\ <<set $spectrum.radical_conservative to Math.max(-100, $spectrum.radical_conservative - 12)>>\ <<kpd-betray-penalty 3>>\ <<set $kpd_promise to "c">>\ <<promise-event-write "P03" "许诺:让那条线保持畅通" "KPD" "kpd" "你答应过,不让名单上那个人手上的线断掉。现在,有人要把那条线剪了。要不要如约,让它接着通向军部?" 2>>\ <<set $npcs.kpd.trust to Math.min(100, $npcs.kpd.trust + 4)>>\ <<set $kpd_last_day to $session_day>>\ <<set $ktrial_label to "你松开那条线。">>\ <<set $ktrial_feedback to "名单上那个人,从你的视线里消失了。你知道他去了哪里,也知道那意味着什么。几天后,会有人试探那条线还在不在。你往左偏了一大步,也让共和国的门,第一次为一个将要拆掉它的人,打开了一道缝。">>\ <<goto "Scene_KPD_Leave">>\ <</link>>\ <</switch>> /* ---------- Scene_KPD_Leave:无论满意与否,都请你回 ---------- */
<<if not $ktrial_label>><<set $ktrial_label to "他没有什么表情。">><</if>>\ <<if not $ktrial_feedback>><<set $ktrial_feedback to "">><</if>> $ktrial_label //$ktrial_feedback// <hr> //他站起身,替你拉开那扇没挂招牌的门。// //「今天就到这里。你该回去想想。」他说,「你若还愿意来,改日再谈。」// //(改日再来,才能继续谈下一件。)// <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_KPD_Extra:额外革命试炼链(光谱不够格时) ---------- */
<<silently>> <<if not $kpd_extra_step>><<set $kpd_extra_step to 0>><</if>> <</silently>>\ ''他给你开了另一扇门。'' <<switch $kpd_extra_step>>\ <<case 0>>\ //他把你带进一间更小的屋子。桌上摊着一卷刚印好的传单,油墨还是热的,整齐地码着,像一摞还没散出去的火。他指着最上面那张。// //「街上的工人要罢工。政府说,不准。」他说,「你不需要批准。你只要告诉他们,你不会拦。」// <<link "默许罢工的传单,散出去。">> <<set $kpd_extra_step to $kpd_extra_step + 1>>\ <<set $spectrum.left_right to Math.max(-100, $spectrum.left_right - 15)>>\ <<set $spectrum.radical_conservative to Math.max(-100, $spectrum.radical_conservative - 15)>>\ <<kpd-betray-penalty 2>>\ <<set $npcs.kpd.trust to Math.min(100, $npcs.kpd.trust + 3)>>\ <<set $kpd_last_day to $session_day>>\ <<goto "Scene_KPD_Extra_Leave">>\ <</link>>\ //(那摞热油墨的纸,散进了街头的风里。你往左偏了一大步。)// <<link "让人拦下传单。国家不能乱。">> <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - 6)>>\ <<set $kpd_last_day to $session_day>>\ <<goto "Scene_KPD_Extra_Leave">>\ <</link>>\ //(他合上传单,没接话。)// <<case 1>>\ //他约你在工人食堂见。你到的时候,他正和几个工人围坐在一起。他给你留了一个位置。// //「他们在问,共和国会不会替他们说话。」他看着你,「你怎么答?」// <<link "答应他们,我会替工人说话。">> <<set $kpd_extra_step to $kpd_extra_step + 1>>\ <<set $spectrum.left_right to Math.max(-100, $spectrum.left_right - 15)>>\ <<set $spectrum.radical_conservative to Math.max(-100, $spectrum.radical_conservative - 15)>>\ <<set $world.social_anger to Math.min(100, $world.social_anger + 4)>>\ <<kpd-betray-penalty 3>>\ <<set $npcs.kpd.trust to Math.min(100, $npcs.kpd.trust + 3)>>\ <<set $kpd_last_day to $session_day>>\ <<goto "Scene_KPD_Extra_Leave">>\ <</link>>\ //(工人们看着你。你把一支怒火,递到了他们手里。)// <<link "告诉他们,增产才是帮国家。">> <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - 6)>>\ <<set $kpd_last_day to $session_day>>\ <<goto "Scene_KPD_Extra_Leave">>\ <</link>>\ //(他端起那碗汤,没喝,也没说话。)// <<case 2>>\ //最后一次,他带你来到一座旧仓库。灯下,几个人围着一张地图,地图上画着街道和工厂。他们停下来,看着他,也看着你。// //「他们说,如果有一天要动手,你会站在谁那边。」他递给你一支铅笔,看着你。// <<link "接过铅笔,在地图画上记号。">> <<set $kpd_extra_step to $kpd_extra_step + 1>>\ <<set $spectrum.left_right to Math.max(-100, $spectrum.left_right - 15)>>\ <<set $spectrum.radical_conservative to Math.max(-100, $spectrum.radical_conservative - 15)>>\ <<set $world.revolution to Math.min(100, $world.revolution + 4)>>\ <<kpd-betray-penalty 3>>\ <<set $npcs.kpd.trust to Math.min(100, $npcs.kpd.trust + 3)>>\ <<set $kpd_last_day to $session_day>>\ <<goto "Scene_KPD_Extra_Leave">>\ <</link>>\ //(你在那幅地图上,画下了第一道记号。)// <<link "放下铅笔。我不画这个。">> <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - 6)>>\ <<set $kpd_last_day to $session_day>>\ <<goto "Scene_KPD_Extra_Leave">>\ <</link>>\ //(灯下的人静静看着你。他什么也没说。)// <</switch>> /* ---------- Scene_KPD_Extra_Leave:额外试炼做完,当天请回 ---------- */
//他起身,替你拉开门。// <<if $kpd_extra_step gte 3>>\ //「够了。」他说,「你愿为了我,走进这些屋子。够不够格,我说了算。我们改日谈正事。」//\ <<else>>\ //「今天先到这里。」他说,「你若还愿意来,我们改日再谈。」//\ <</if>> //(改日再来,才能继续。)// <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_KPD_Accepted:接受革命 ---------- */
''一扇门,从里面被推开。'' //你说了「好」。那个字出口的一瞬间,KPD 的脊背挺直了。他走到墙边,把那盏灯吹灭,又点亮,像完成一个仪式。// //「你做了一个选择。」他说,「从今晚起,你不再是那个守着共和国的人,而是那个选择放下它的人。」// //你走出那间屋子的时候,柏林还是那座柏林。但你知道,有些东西已经在暗处重新苏醒了。// //(政府信任大幅下降,革命压力抬头。你与共和国的距离,又远了一分。)// ''KPD 对你的信任:<<bar $npcs.kpd.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_KPD_Refused:拒绝革命 ---------- */
''一扇门,在你身后关上。'' //你说了「不」。空气安静了一瞬。KPD 没有发怒,他只是把桌上那份宣言慢慢收起来,叠好。// //「可惜。」他说,「我原以为你和他们不一样。原来你也是捧着共和国的薪水,对它跪下的人。」// //他没有送你。你走到门口回头看时,他已经重新坐回桌前,背对着你,像一尊被放回原处的石像。// //(KPD 对你的信任大幅下降。这份邀约不会再次发生。)// ''KPD 对你的信任:<<bar $npcs.kpd.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_DNVP_Refused:拒绝复辟 ---------- */
''一扇门,在你身后关上。'' //你说了「不」。空气安静了一瞬。DNVP 没有发怒,他只是把桌上那三份文件慢慢收起来,叠好。// //「可惜。」他说,「我原以为你和他们不一样。原来你也是拿着共和国的薪水,学会了对旧旗转过身去的人。」// //他没有送你。你走到门口回头看时,他已经重新坐回桌前,背对着你,像一尊被放回原处的石像。// //(DNVP 对你的信任大幅下降。这份邀约不会再次发生。)// ''DNVP 对你的信任:<<bar $npcs.dnvp.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ════════════════════════════════════════════════════════════ 激进邀约 · NSDAP 运动邀约(右翼极端) 触发:NSDAP 信任满 100 → arc_state=offered → 办公室出现「邀你夜谈」。 公开接受 = 站到运动一边;拒绝 = 关系破裂;秘密结盟 = 暗处办事。 简化版激进邀约:直接进抉择,无试炼(对标 KPD 的正式邀请分支)。 ============================================================ */
<<silently>> <<if not $party_milestones.nsdap>> <<set $party_milestones.nsdap to { ally:false, voice:false, peak:false, arc_offered:false, arc_state:"none" }>> <</if>> <<if $party_milestones.nsdap.arc_state eq "none">> <<set $party_milestones.nsdap.arc_state to "offered">> <</if>> <</silently>>\ ''一间啤酒馆的后屋。'' //陷进沙发的那个人,没有起身迎你。他隔着桌子看你,目光像在称量一件早就在称的东西。// //桌上一杯啤酒,没动。他伸手,把杯沿转了半圈,杯底在桌面上划出一道浅浅的弧。// <div class="nsdap-speech">「你走到这里,不是因为信,是因为你开始知道,这共和国的日子,数到头了。」他说,「我不指望你信我。我只想你在日子到头的那一天,记得站在哪一边。」</div> ''—— 运动,还是共和国。 ——'' //「你现在站的位置,决定了你以后会站在哪儿。」他说,「你选。」// <<link "「答应他。我跟你走。」">> <<set $party_milestones.nsdap.arc_state to "accepted">>\ <<set $party_milestones.nsdap.arc_offered to true>>\ <<set $nsdap_arc to "accepted">>\ <<set $weimar_night_talk to true>>\ <<set $weimar_pending_convert to "party_nsdap">>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 25)>>\ <<set $world.nationalism to Math.min(100, $world.nationalism + 20)>>\ <<set $world.political_violence to Math.min(100, $world.political_violence + 10)>>\ <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - 15)>>\ <<set $npcs.ddp.trust to Math.max(0, $npcs.ddp.trust - 12)>>\ <<set $npcs.dvp.trust to Math.max(0, $npcs.dvp.trust - 10)>>\ <<set $npcs.zentrum.trust to Math.max(0, $npcs.zentrum.trust - 10)>>\ <<legacy-create "LG_NSDAP_MOVEMENT" {政府信任:-25, 民族主义:20} "nsdap" "trauma" "极右运动的暗流重新抬头">>\ <<goto "Scene_NSDAP_Accepted">>\ <</link>> <<link "「拒绝他。共和国还没到该交出去的时候。」">> <<set $party_milestones.nsdap.arc_state to "refused">>\ <<set $party_milestones.nsdap.arc_offered to true>>\ <<set $nsdap_arc to "refused">>\ <<set $npcs.nsdap.trust to Math.max(0, $npcs.nsdap.trust - 30)>>\ <<goto "Scene_NSDAP_Refused">>\ <</link>> <<link "「不公开。我只在暗处,为你办事。」(秘密结盟)">> <<secret-establish "nsdap">>\ <<set $party_milestones.nsdap.arc_state to "secret">>\ <<set $party_milestones.nsdap.arc_offered to true>>\ <<set $secret_pact_pid to "nsdap">>\ <<goto "Scene_SecretPact">>\ <</link>> <<link "「再想想。」">> <<goto "Scene_Office">>\ <</link>> /* ---------- Scene_NSDAP_Accepted:接受运动邀约 ---------- */
''那半圈水渍,在桌面上干得很慢。'' //你说了「好」。他没有立刻笑,他只是把没动过的那杯啤酒,往你面前推了推。// //「你做了一个选择。」他说,「我们会记住这个夜晚。不是作为一个政客,而是作为一个把共和国踩在脚下的人。」// //你走出那间后屋的时候,街上正有人举着旗子走过。你分不清,那是欢呼,还是送葬。// //(政府信任大幅下降,民族主义抬头。你与共和国的距离,又远了一分。)// ''NSDAP 对你的信任:<<bar $npcs.nsdap.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_NSDAP_Refused:拒绝运动邀约 ---------- */
''那杯啤酒,始终没有喝。'' //你说了「不」。他没有发怒,只是把杯子拉回自己面前,端起来,喝了一口。// //「可惜。」他说,「我原以为你和他们不一样。原来你也是捧着共和国的薪水,对那面旗低下头的人。」// //他没有送你。你走的时候,他正用指腹,一圈一圈地擦着桌上那半圈干了的水渍。// //(NSDAP 对你的信任大幅下降。这份邀约不会再次发生。)// ''NSDAP 对你的信任:<<bar $npcs.nsdap.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ════════════════════════════════════════════════════════════ 激进邀约 · 军方 效忠邀约(掌握武力者) 触发:军方信任满 100 → arc_state=offered → 办公室出现「邀你夜谈」。 公开接受 = 与军方结盟;拒绝 = 关系破裂;秘密结盟 = 暗处办事。 ============================================================ */
<<silently>> <<if not $party_milestones.army>> <<set $party_milestones.army to { ally:false, voice:false, peak:false, arc_offered:false, arc_state:"none" }>> <</if>> <<if $party_milestones.army.arc_state eq "none">> <<set $party_milestones.army.arc_state to "offered">> <</if>> <</silently>>\ ''蒂尔加滕深处的军官俱乐部。'' //壁炉烧得很旺。他坐在那张长桌的主位,没有让你坐到对面,而是让你坐到他右侧。桌上没有文件,只有那枚戴了二十三年、刚刚解下来的勋章,搁在他手边。// <div class="army-speech">「我这人只会站队,站在一个值得站的人身后。」他说,「从前我站在皇帝身后,后来我站在共和国身后。可它到底值不值得,我心里没底。」他抬起眼,「你让我头一回想丢开『奉命』两个字,凭自己站到你身后。」</div> ''—— 效忠,还是共和国。 ——'' //「你选哪儿?」他问,「是一次性押上全部,还是像我一样,先站到值得的人身后?」// <<link "「答应他。我值得你的信任。」">> <<set $party_milestones.army.arc_state to "accepted">>\ <<set $party_milestones.army.arc_offered to true>>\ <<set $army_arc to "accepted">>\ <<set $weimar_night_talk to true>>\ <<set $weimar_pending_convert to "party_army">>\ <<set $world.gov_trust to Math.max(0, $world.gov_trust - 20)>>\ <<set $world.army_influence to Math.min(100, $world.army_influence + 20)>>\ <<set $world.political_violence to Math.min(100, $world.political_violence + 8)>>\ <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - 12)>>\ <<set $npcs.ddp.trust to Math.max(0, $npcs.ddp.trust - 10)>>\ <<set $npcs.zentrum.trust to Math.max(0, $npcs.zentrum.trust - 8)>>\ <<legacy-create "LG_ARMY_ALIGN" {政府信任:-20, 军方影响:20} "army" "trauma" "军方影响力的暗流重新抬头">>\ <<goto "Scene_Army_Accepted">>\ <</link>> <<link "「拒绝他。军队属于共和国,不属于任何人。」">> <<set $party_milestones.army.arc_state to "refused">>\ <<set $party_milestones.army.arc_offered to true>>\ <<set $army_arc to "refused">>\ <<set $npcs.army.trust to Math.max(0, $npcs.army.trust - 30)>>\ <<goto "Scene_Army_Refused">>\ <</link>> <<link "「不公开。我只在暗处,为你办事。」(秘密结盟)">> <<secret-establish "army">>\ <<set $party_milestones.army.arc_state to "secret">>\ <<set $party_milestones.army.arc_offered to true>>\ <<set $secret_pact_pid to "army">>\ <<goto "Scene_SecretPact">>\ <</link>> <<link "「再想想。」">> <<goto "Scene_Office">>\ <</link>> /* ---------- Scene_Army_Accepted:接受效忠邀约 ---------- */
''那枚勋章,始终没有收回去。'' //你点头无言。他没有笑,你感觉他的身体绷紧了。他伸出手,把那枚勋章从桌上拿起,又放下了,放在了靠近你的一侧。// //「你做了一个选择。」他说,「我们会记住这个夜晚。不是作为一个政客,而是作为一个把共和国押在直觉上的人。」// //你走出俱乐部的时候,壁炉的火还在烧。你回头,他仍坐在原地,那枚勋章搁在靠近你的那侧,像一句没说完的话。// //(政府信任下降,军方影响抬头。你与共和国的权力重心,又偏移了一分。)// ''军方对你的信任:<<bar $npcs.army.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>> /* ---------- Scene_Army_Refused:拒绝效忠邀约 ---------- */
''那枚勋章,始终搁在桌上。'' //你说了「不」。他没有发怒,只是把那枚勋章拿起来,慢慢系回胸前。动作很慢,像在系回一段旧日的忠诚。// //「可惜。」他说,「我原以为你会是不同的那一个。原来你也是学了共和国的规矩,就对枪口转过身去的文官。」// //他没有送你。你走的时候,壁炉的火光在他身后投下一个长长的影子。// //(军方对你的信任大幅下降。这份邀约不会再次发生。)// ''军方对你的信任:<<bar $npcs.army.trust 100>>'' <<link "返回办公室" "Scene_Office">><</link>>
/* ---------- party-converse-init:初始化选项库与回应库(幂等) ---------- */ <<widget "party-converse-init">>\ <<if not $pc_options>>\ <<set $pc_options to { /* ═══ SPD ═══ */ spd: { chat: { 1:{label:"先听他讲工会的事,不打断", effects:"SPD信任+3", delta:3, extra:{}}, 2:{label:"先听他讲工会的事,不打断", effects:"SPD信任+3", delta:3, extra:{}}, 3:{label:"先听他讲工会的事,不打断", effects:"SPD信任+4", delta:4, extra:{}}, 4:{label:"先听他讲工会的事,不打断", effects:"SPD信任+4", delta:4, extra:{}}, 5:{label:"先听他讲工会的事,不打断", effects:"SPD信任+4", delta:4, extra:{}} }, deep: { 2:{label:"问他:你怕的到底是什么", effects:"SPD信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 3:{label:"问他:你怕的到底是什么", effects:"SPD信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 4:{label:"问他:你真正想要的是什么", effects:"SPD信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"want"}, 5:{label:"问他:你忘不掉的是哪件事", effects:"SPD信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"memory"} }, push: { 1:{label:"要他配合你的步调", effects:"SPD信任-4", delta:-4, extra:{}}, 2:{label:"要他配合你的步调", effects:"SPD信任-4", delta:-4, extra:{}}, 3:{label:"要他配合你的步调", effects:"SPD信任-4", delta:-4, extra:{}}, 4:{label:"要他配合你的步调", effects:"SPD信任-4", delta:-4, extra:{}}, 5:{label:"要他配合你的步调", effects:"SPD信任-4", delta:-4, extra:{}} } }, /* ═══ KPD ═══ */ kpd: { chat: { 1:{label:"不谈立场,先递一根烟", effects:"KPD信任+3", delta:3, extra:{}}, 2:{label:"不谈立场,先递一根烟", effects:"KPD信任+3", delta:3, extra:{}}, 3:{label:"不谈立场,先递一根烟", effects:"KPD信任+3", delta:3, extra:{}}, 4:{label:"不谈立场,先递一根烟", effects:"KPD信任+4", delta:4, extra:{}}, 5:{label:"不谈立场,先递一根烟", effects:"KPD信任+4", delta:4, extra:{}} }, deep: { 2:{label:"问他:你怕的到底是什么", effects:"KPD信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 3:{label:"问他:你怕的到底是什么", effects:"KPD信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 4:{label:"问他:你真正想要的是什么", effects:"KPD信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"want"}, 5:{label:"问他:你忘不掉的是哪件事", effects:"KPD信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"memory"} }, push: { 1:{label:"以政府身份命令他", effects:"KPD信任-5", delta:-5, extra:{}}, 2:{label:"以政府身份命令他", effects:"KPD信任-5", delta:-5, extra:{}}, 3:{label:"以政府身份命令他", effects:"KPD信任-5", delta:-5, extra:{}}, 4:{label:"以政府身份命令他", effects:"KPD信任-5", delta:-5, extra:{}}, 5:{label:"以政府身份命令他", effects:"KPD信任-5", delta:-5, extra:{}} } }, /* ═══ DDP ═══ */ ddp: { chat: { 1:{label:"陪他聊天气与报纸,不急着谈事", effects:"DDP信任+3", delta:3, extra:{}}, 2:{label:"陪他聊天气与报纸,不急着谈事", effects:"DDP信任+3", delta:3, extra:{}}, 3:{label:"陪他聊天气与报纸,不急着谈事", effects:"DDP信任+4", delta:4, extra:{}}, 4:{label:"陪他聊天气与报纸,不急着谈事", effects:"DDP信任+4", delta:4, extra:{}}, 5:{label:"陪他聊天气与报纸,不急着谈事", effects:"DDP信任+4", delta:4, extra:{}} }, deep: { 2:{label:"问他:你怕的到底是什么", effects:"DDP信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 3:{label:"问他:你怕的到底是什么", effects:"DDP信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 4:{label:"问他:你真正想要的是什么", effects:"DDP信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"want"}, 5:{label:"问他:你忘不掉的是哪件事", effects:"DDP信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"memory"} }, push: { 1:{label:"暗示他该站队了", effects:"DDP信任-4", delta:-4, extra:{}}, 2:{label:"暗示他该站队了", effects:"DDP信任-4", delta:-4, extra:{}}, 3:{label:"暗示他该站队了", effects:"DDP信任-4", delta:-4, extra:{}}, 4:{label:"暗示他该站队了", effects:"DDP信任-4", delta:-4, extra:{}}, 5:{label:"暗示他该站队了", effects:"DDP信任-4", delta:-4, extra:{}} } }, /* ═══ DVP ═══ */ dvp: { chat: { 1:{label:"先听他算这个月的账", effects:"DVP信任+3", delta:3, extra:{}}, 2:{label:"先听他算这个月的账", effects:"DVP信任+3", delta:3, extra:{}}, 3:{label:"先听他算这个月的账", effects:"DVP信任+3", delta:3, extra:{}}, 4:{label:"先听他算这个月的账", effects:"DVP信任+4", delta:4, extra:{}}, 5:{label:"先听他算这个月的账", effects:"DVP信任+4", delta:4, extra:{}} }, deep: { 2:{label:"问他:你怕的到底是什么", effects:"DVP信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 3:{label:"问他:你怕的到底是什么", effects:"DVP信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 4:{label:"问他:你真正想要的是什么", effects:"DVP信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"want"}, 5:{label:"问他:你忘不掉的是哪件事", effects:"DVP信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"memory"} }, push: { 1:{label:"施压要他出力", effects:"DVP信任-4", delta:-4, extra:{}}, 2:{label:"施压要他出力", effects:"DVP信任-4", delta:-4, extra:{}}, 3:{label:"施压要他出力", effects:"DVP信任-4", delta:-4, extra:{}}, 4:{label:"施压要他出力", effects:"DVP信任-4", delta:-4, extra:{}}, 5:{label:"施压要他出力", effects:"DVP信任-4", delta:-4, extra:{}} } }, /* ═══ Zentrum ═══ */ zentrum: { chat: { 1:{label:"先聊孩子和学校,不碰立场", effects:"Zentrum信任+3", delta:3, extra:{}}, 2:{label:"先聊孩子和学校,不碰立场", effects:"Zentrum信任+3", delta:3, extra:{}}, 3:{label:"先聊孩子和学校,不碰立场", effects:"Zentrum信任+4", delta:4, extra:{}}, 4:{label:"先聊孩子和学校,不碰立场", effects:"Zentrum信任+4", delta:4, extra:{}}, 5:{label:"先聊孩子和学校,不碰立场", effects:"Zentrum信任+4", delta:4, extra:{}} }, deep: { 2:{label:"问他:你怕的到底是什么", effects:"Zentrum信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 3:{label:"问他:你怕的到底是什么", effects:"Zentrum信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 4:{label:"问他:你真正想要的是什么", effects:"Zentrum信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"want"}, 5:{label:"问他:你忘不掉的是哪件事", effects:"Zentrum信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"memory"} }, push: { 1:{label:"逼他明确表态", effects:"Zentrum信任-4", delta:-4, extra:{}}, 2:{label:"逼他明确表态", effects:"Zentrum信任-4", delta:-4, extra:{}}, 3:{label:"逼他明确表态", effects:"Zentrum信任-4", delta:-4, extra:{}}, 4:{label:"逼他明确表态", effects:"Zentrum信任-4", delta:-4, extra:{}}, 5:{label:"逼他明确表态", effects:"Zentrum信任-4", delta:-4, extra:{}} } }, /* ═══ DNVP ═══ */ dnvp: { chat: { 1:{label:"不谈政事,先敬他三分旧礼", effects:"DNVP信任+3", delta:3, extra:{}}, 2:{label:"不谈政事,先敬他三分旧礼", effects:"DNVP信任+3", delta:3, extra:{}}, 3:{label:"不谈政事,先敬他三分旧礼", effects:"DNVP信任+3", delta:3, extra:{}}, 4:{label:"不谈政事,先敬他三分旧礼", effects:"DNVP信任+4", delta:4, extra:{}}, 5:{label:"不谈政事,先敬他三分旧礼", effects:"DNVP信任+4", delta:4, extra:{}} }, deep: { 2:{label:"问他:你怕的到底是什么", effects:"DNVP信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 3:{label:"问他:你怕的到底是什么", effects:"DNVP信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 4:{label:"问他:你真正想要的是什么", effects:"DNVP信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"want"}, 5:{label:"问他:你忘不掉的是哪件事", effects:"DNVP信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"memory"} }, push: { 1:{label:"驳斥他的旧帝国立场", effects:"DNVP信任-4,民族主义+1", delta:-4, extra:{w:{nationalism:1}}}, 2:{label:"驳斥他的旧帝国立场", effects:"DNVP信任-4,民族主义+1", delta:-4, extra:{w:{nationalism:1}}}, 3:{label:"驳斥他的旧帝国立场", effects:"DNVP信任-4,民族主义+1", delta:-4, extra:{w:{nationalism:1}}}, 4:{label:"驳斥他的旧帝国立场", effects:"DNVP信任-4,民族主义+1", delta:-4, extra:{w:{nationalism:1}}}, 5:{label:"驳斥他的旧帝国立场", effects:"DNVP信任-4,民族主义+1", delta:-4, extra:{w:{nationalism:1}}} } }, /* ═══ NSDAP ═══ */ nsdap: { chat: { 1:{label:"安静地听他说", effects:"NSDAP信任+4,民族主义+2", delta:4, extra:{w:{nationalism:2}}}, 2:{label:"安静地听他说", effects:"NSDAP信任+4,民族主义+2", delta:4, extra:{w:{nationalism:2}}}, 3:{label:"安静地听他说", effects:"NSDAP信任+4,民族主义+2", delta:4, extra:{w:{nationalism:2}}}, 4:{label:"安静地听他说", effects:"NSDAP信任+4,民族主义+2", delta:4, extra:{w:{nationalism:2}}}, 5:{label:"安静地听他说", effects:"NSDAP信任+4,民族主义+2", delta:4, extra:{w:{nationalism:2}}} }, deep: { 2:{label:"问他:你怕的到底是什么", effects:"NSDAP信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 3:{label:"问他:你怕的到底是什么", effects:"NSDAP信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 4:{label:"问他:你真正想要的是什么", effects:"NSDAP信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"want"}, 5:{label:"问他:你忘不掉的是哪件事", effects:"NSDAP信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"memory"} }, push: { 1:{label:"警告他收敛", effects:"NSDAP信任-5,政治暴力-1", delta:-5, extra:{w:{political_violence:-1}}}, 2:{label:"警告他收敛", effects:"NSDAP信任-5,政治暴力-1", delta:-5, extra:{w:{political_violence:-1}}}, 3:{label:"警告他收敛", effects:"NSDAP信任-5,政治暴力-1", delta:-5, extra:{w:{political_violence:-1}}}, 4:{label:"警告他收敛", effects:"NSDAP信任-5,政治暴力-1", delta:-5, extra:{w:{political_violence:-1}}}, 5:{label:"警告他收敛", effects:"NSDAP信任-5,政治暴力-1", delta:-5, extra:{w:{political_violence:-1}}} } }, /* ═══ 军方 ═══ */ army: { chat: { 1:{label:"不谈政治,先问东边的防务", effects:"军方信任+3", delta:3, extra:{}}, 2:{label:"不谈政治,先问东边的防务", effects:"军方信任+3", delta:3, extra:{}}, 3:{label:"不谈政治,先问东边的防务", effects:"军方信任+3", delta:3, extra:{}}, 4:{label:"不谈政治,先问东边的防务", effects:"军方信任+4", delta:4, extra:{}}, 5:{label:"不谈政治,先问东边的防务", effects:"军方信任+4", delta:4, extra:{}} }, deep: { 2:{label:"问他:你怕的到底是什么", effects:"军方信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 3:{label:"问他:你怕的到底是什么", effects:"军方信任+4,偏执+2", delta:4, extra:{p:{paranoia:2}}, ask:"fear"}, 4:{label:"问他:你真正想要的是什么", effects:"军方信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"want"}, 5:{label:"问他:你忘不掉的是哪件事", effects:"军方信任+5,偏执+2", delta:5, extra:{p:{paranoia:2}}, ask:"memory"} }, push: { 1:{label:"要求他听命于文官", effects:"军方信任-4", delta:-4, extra:{}}, 2:{label:"要求他听命于文官", effects:"军方信任-4", delta:-4, extra:{}}, 3:{label:"要求他听命于文官", effects:"军方信任-4", delta:-4, extra:{}}, 4:{label:"要求他听命于文官", effects:"军方信任-4", delta:-4, extra:{}}, 5:{label:"要求他听命于文官", effects:"军方信任-4", delta:-4, extra:{}} } } }>>\ <</if>>\ <</widget>> /* ---------- party-respond-init:回应库(回应你这句话的专属文本) ---------- */ <<widget "party-respond-init">>\ <<if not $pc_respond>>\ <<set $pc_respond to { spd: { chat: { 1:["他没接你的话,先把手里那份工会报表翻完。翻完了,才抬起头:「你坐。」语气算不上热络,但也没赶你。","他听着,嗯了一声,算是应你。应完又低头看他那叠纸,纸边已经卷了。","他没让你走,也没留你。只是你说到第三句的时候,他放下了笔。"], 2:["他给你拉了张凳,让你坐,自己却没坐。你说话的时候他在听,间或点头,点得很慢。","他应着你的话,顺手把桌上的火柴盒摆正了。「嗯。」他说,「接着说。」","他听着,目光从你脸上移开,落到窗外。但你知道他在听。"], 3:["他放下笔,给你递了杯水。「先喝。」他说,然后才接你的话头。","他听着,这次没有翻文件。你说完,他隔了几秒才开口,先重复了一遍你刚才说的最后两个字。","他往椅背上靠了靠,示意你坐近些。「慢慢说,我听着。」"], 4:["他把你让到桌子同一边坐下。「站那边说话,听着生分。」","他给你续了水,听你讲完,才把他那份没念完的报告推过来,「你看这个,我们一起看。」","他听你说完,点了点头,这次点得快。「你今天来,是好事。」"], 5:["他把椅子往你这边挪了挪。「你说,我不打断。」说到做到,你真说完了他才开口。","他把你晾的水先推给你,温度刚好。「先润润嗓子。你的话,值这个工夫。」","他听完,难得没立刻接话。停了一会儿他说:「你肯先来听我讲,这就够了。」"] }, deep: { 2:["他愣了一下,像是没料到你会这么问。他没立刻答,先把门掩上了一半。","他盯着你看了两秒,像在掂量这个问题值不值得答。「你问这个做什么。」不是质问,是真的想知道。","他放下手里的东西。「你问得倒直接。」他没有躲开你的目光,但也没有马上说。"], 3:["他沉默了几秒,把你刚才递过来的水又往你那边推了推,像是要先把场子稳住。「你确定你想听这个?」","他看着你,很久。「这种问题,我不常答。」他说,「但既然是你问,我答一半。」","他没有立刻开口。窗外的电车过去了一趟,他才慢慢开始说。"], 4:["他没有回避。他把椅子拉近了一点,声音压低了半档。「你问到了点子上。」","他看着你,眼神比刚才松了些。「我没想到你会问这个。」他说,「那我跟你讲实话。」","他先把桌上的文件合上了,像是给这个问题腾地方。「好,你问,我说。」"], 5:["他没有犹豫。他把椅子拖到你旁边坐下,声音放得很轻。「这个问题,我只答给你听。」","他看着你,目光比刚才更近。「你既然问到了,说明你已经走到这一步了。那我不瞒你。」","他把门掩严了些,回过身来。「问吧。你问什么,我答什么。」"] }, push: { 1:["他把手里的笔放下了,声音冷了下来。「你让我配合你的步调?」他重复了一遍,像是没听懂,「我配合的是工人,不是你。」","他往后靠,拉开了距离。「你这是在命令我。」他说,「那我也把话放这儿:我不听这个。」","他盯着你,没有退让。「你要我配合,可以。先说说你这步调,往哪儿走。」"], 2:["他脸色沉了下来,把凳子往后挪了半尺。「你这是在给我下命令。」他说,「那我也把话放这儿:我不吃这一套。」","他没动,但目光冷了。「你让我配合,」他说,「你也不先问问,我凭什么配合。」","他站起身,居高临下看着你。「话说到这份上,那就没什么好谈的了。」"], 3:["他把手里的文件往桌上一放。「你要我配合,」他说,「你拿什么让我配合?」他没有动怒,只是很平静地问。","他往后退了半步,拉开了距离。「你这是在压我。」他说,「那我也告诉你,压不住。」","他看着你,眼神冷了几分。「话我记下了。下次你来之前,想清楚再开口。」"], 4:["他没有立刻发作,只是把手里的东西放下了。「你这是在命令我。」他说,声音不高,但很重,「我提醒你,我不是你的下属。」","他盯着你看了很久,目光比刚才冷。「你要我配合,」他说,「你先拿出让我配合的东西来。」","他往后退了一步,重新拉开距离。「这话,我就当你没说过。但这是最后一次。」"], 5:["他没有发火,只是很平静地看着你,平静得让你心里发毛。「你让我配合你,」他说,「你拿什么换?」","他把手里的东西放下了,动作很慢。「你这是在命令我。」他说,「那我也把话说明白:我不是你能命令的人。」","他盯着你,很久没说话。最后他说:「今天这话,到此为止。你走吧。」"] } }, kpd: { chat: { 1:["他没接你的烟,也没让你收回去。他看着你,像在判断这烟里有没有别的意思。","他盯着你递烟的手,没有动。「你这是什么意思。」他问,但语气里没有那么硬了。","他没有道谢,但也没有赶你走。他只是往旁边挪了半步,给你腾出一点站的地方。"], 2:["他接过烟,没有点,夹在手里转了一圈。「你今天来,是想通了,还是没想通。」","他让你站在三步之内,但自己仍然靠墙站着。「说。」他只说了一个字。","他没让你坐,但也没让你站着。他自己蹲下来,示意你也蹲。这是他能给的最大的客气。"], 3:["他接过烟,这次点上了。烟雾里他看你一眼。「你倒沉得住气。」","他让你坐到他旁边的矮凳上,自己仍然站着。「坐。」他说,「我看着你说。」","他把你的话听完,没有打断。这对KPD来说,已经是给足了面子。"], 4:["他接过烟,就着你的手点上了。「坐。」他指了指自己旁边的位置,这次让你坐在桌子同一边。","他给你让出半张凳,自己却往边上挪了挪,给你腾出足够的地方。「说你的,我听着。」","他把你的话听完,难得点了点头。「你今天说的,有点意思。」"], 5:["他让你坐到他桌子同一边,把一份没发出去的传单推给你看。「你先看看这个。」","他接过烟,点上了,深深吸了一口。吐出来的时候,他的语气松了些。「你今天来,是来对了。」","他把你让到更僻静的角落,声音压低了。「有些话,人多了不能说。」"] }, deep: { 2:["他眯起眼看你。「你问这个做什么。」他把烟摁灭了,「这种问题,你配问吗。」","他盯着你,很久没有移开。「你想知道,」他说,「可我为什么要告诉你。」","他没有立刻答。他把身子往墙上靠得更实了些,像在给自己找支撑。「你问得倒轻巧。」"], 3:["他盯着你看了很久,像在判断你问这话的用意。「你真想听?」他问,「还是想拿这个当把柄。」","他没有立刻答。他走到窗边,背对着你站了一会儿。「这种问题,我不常答。」","他沉默了很久,久到你以为他不会答了。他才开口,声音压得很低。"], 4:["他没有回避。他转过身来,正对着你,目光比刚才亮。「你问到了。」","他看着你,眼神变了,变得像在掂量你值不值得。「好。」他说,「我告诉你一半。」","他把声音压得更低,往你这边靠了半步。「这个问题,我只说给你一个人听。」"], 5:["他没有犹豫。他把你拉到更僻静的地方,声音压得极低。「这个问题,我只答给你。」","他看着你,目光比刚才更近。「你既然问到了这一步,说明你已经不是外人了。」","他把声音放得很轻,轻得像在耳语。「问吧。你问的,我答。」"] }, push: { 1:["他冷笑了一声。「政府身份?」他重复了一遍,「你以为那张纸,在我这儿算数?」","他往前逼了一步。「你命令我?」他说,「你也不看看,你脚下踩的是谁的地盘。」","他盯着你,没有退让。「你的政府,」他说,「在我这儿,一文不值。」"], 2:["他把脸沉了下来。「你敢命令我。」他说,声音压得很低,「你再说一遍试试。」","他往前逼了半步,目光像刀。「政府身份,」他说,「你拿这个压我,压错了人。」","他冷笑。「你以为你是谁。」他说,「滚。趁我还让你走。」"], 3:["他盯着你,很久没有说话。最后他从牙缝里挤出一句:「你敢命令我。」","他把烟摁灭了,动作很重。「政府身份,」他说,「在我这儿,不好使。」","他往前逼了一步,几乎贴到你脸上。「你再说一遍。」他说,「我让你说完。」"], 4:["他没有立刻发作,只是把你从头到脚重新看了一遍。「你胆子不小。」他说,「敢在我这儿,摆官架子。」","他冷笑,笑得很冷。「政府,」他说,「你的政府,在我眼里什么都不是。」","他往前逼近,目光像钉子。「你命令我?」他说,「你再命令一次试试。」"], 5:["他没有喊,只是很平静地看着你,平静得吓人。「你命令我,」他说,「你凭什么。」","他把脸凑近了些,声音压得极低。「你的政府,」他说,「在我这儿,连一张传单都不如。」","他盯着你,很久没移开。最后他说:「滚。别让我再看见你这张脸。」"] } }, ddp: { chat: { 1:["他礼数周全地应着你的话,把钢笔摆正了,才接你的话头。接得很稳,没有一丝破绽。","他听着,时不时点头,点得恰到好处。你分不清他是在认同,还是在记录。","他给你续了水,听你讲完。讲完他说:「你远道而来,辛苦了。」客气,但隔着一层。"], 2:["他合上手里的书,专心听你说话。听完他推了推眼镜。「你这个开头,有点意思。」","他应着你的话,顺手在笔记本上记了一行。记完抬头:「请继续。」","他听你聊天气聊报纸,聊到第三句,他才把话题轻轻往回带了带。"], 3:["他把书反扣在桌上,专心听你说。「你接着说。」他说,「我听着。」","他给你续了咖啡,听你讲完,才把你的话头接过去,接得很自然。","他听你聊完,点了点头。「你今天谈的这个,值得记一笔。」他说着,真的记了一笔。"], 4:["他把书签抽出来,合上书,专心听你说话。「你今天来,是来对了。」","他给你续了咖啡,听你讲完,把面前的笔记转向你。「你看,我刚才记的,是不是这个意思。」","他听你说完,难得露出点笑意。「跟你聊天,不费力气。」"], 5:["他把书推到一边,把面前的椅子往你这边让了让。「坐近些。」他说,「你说话,我爱听。」","他给你续上咖啡,听你讲完,把笔记本合上。「今天这些,不用记了。记在心里的,更牢靠。」","他听你说完,把面前的杯子往你那边推了推。「你难得来,多坐一会儿。」"] }, deep: { 2:["他愣了一下,推了推眼镜,像是在重新打量你。「你问这个,」他说,「是想论证,还是想了解。」","他没有立刻答。他把笔记本往回收了收。「这种问题,我需要先想清楚再答。」","他看着你,目光里带着审视。「你问得很直接。」他说,「直接得让我得先想想,该不该答。」"], 3:["他沉默了几秒,把眼镜摘下来擦了擦。这个动作他做得很慢,像是在争取时间。「你问的这个,」他说,「值得我认真答。」","他没有立刻开口。他翻了一页笔记,又合上。「好。」他说,「我答你一半。」","他看着你,很久。「这种问题,我不常答。」他说,「但既然是你问,我试着答一答。」"], 4:["他没有回避。他把笔记本合上,正面朝你。「你问到了点子上。」他说,「我跟你讲讲我的想法。」","他看着你,眼神比刚才松了些。「我没想到你会问这个。」他说,「那我把我的推演讲给你听。」","他把身子往前倾了倾。「这个问题,我愿意答。」他说,「你听着。」"], 5:["他没有犹豫。他把椅子拉近,把面前的笔记推过来。「这个问题,我只跟你一个人推演。」","他看着你,目光比刚才更近。「你既然问到了,说明你已经想到这一层了。那我把底牌亮给你。」","他把声音放得很轻,像是怕被隔墙听见。「问吧。你问的,我知无不言。」"] }, push: { 1:["他放下笔,表情严肃起来。「站队,」他说,「我站的是宪法这边。你要我站你那边,得先过宪法这一关。」","他推了推眼镜,语气冷了几分。「你这是在逼我表态。」他说,「那我告诉你,我的表态就是:按程序来。」","他往后靠了靠,拉开了距离。「你让我站队,」他说,「我站的队,从来不跟人。」"], 2:["他把笔记本合上了,动作不重,但很坚决。「站队,」他说,「我站了,站在法的那一边。你还要我站哪儿。」","他看着你,目光比刚才冷。「你这是在给我下最后通牒。」他说,「那我也把话放这儿:我不吃这一套。」","他站起身,居高临下。「话说到这份上,我看今天就到这儿吧。」"], 3:["他没有动怒,只是很平静地看着你。「你让我站队,」他说,「我站了。我站在对的那一边。至于是不是你那一边,得看你是不是对的。」","他把钢笔摆正了,动作很慢。「你这是在逼我。」他说,「逼我,没用。我只认条文。」","他看着你,很久。「站队,」他说,「我站定了。你请回吧。」"], 4:["他没有发火,只是把你的话当成了需要驳斥的论点。「你要我站队,」他说,「我反问一句:你这个队,站的是什么。」","他推了推眼镜,语气冷得像在宣读。「你让我站队,」他说,「我站的那一队,叫『程序』。你跟不跟。」","他把笔记本收进抽屉,像是谈话已经结束。「今天到这儿吧。」他说,「你请回。」"], 5:["他没有喊,只是很平静地看着你,平静得像在念条文。「你让我站队,」他说,「我站定了。站的是共和国,不是你。」","他把眼镜摘下来,慢慢擦着。「你这是在逼我。」他说,「那我也把话说明白:我这条队,谁也逼不动。」","他看着你,很久没移开。最后他说:「请回吧。今天,到此为止。」"] } }, dvp: { chat: { 1:["他扫了一眼手表,但听你把账算完。算完他指尖点了点桌面。「你的数,我听见了。」","他一边听,一边在心里过数。你讲到关键处,他抬了抬手,示意你停一下。「这个数,再说一遍。」","他没打断你。等你说完,他把面前的账本翻过一页。「你说的,我记下了。」"], 2:["他给你倒了半杯水,听你算账。算到一半,他点了点头。「你这个算法,」他说,「有点意思。」","他把账本往你这边推了半寸,让你能看见一角。「你看,」他说,「这一笔,是这么回事。」","他听你讲完,难得没有看表。「你今天这个账,算得清楚。」"], 3:["他给你续了水,听你算账。算完他往后一靠,「你的数,我认一半。」他说,「另一半,我们再谈。」","他把你算的那笔账在心里过了一遍,然后点头。「行。」他说,「这笔,能谈。」","他听你讲完,把账本合上了。「你今天来,是来对了。这笔账,值得一算。」"], 4:["他把账本翻到最底下那页,推给你看。「你看这个。」他说,「这页,我算了很久。」","他给你续上水,听你讲完,把面前的报表转向你。「你替我看看,这一栏,缺了什么。」","他听你说完,难得露出点真心实意。「跟你算账,不吃亏。」"], 5:["他把最底下那页账翻上来,推到你面前。「这一页,」他说,「我只给你一个人看。」","他给你续上水,听你讲完,把椅子往你这边挪了挪。「你的账,」他说,「我帮你盯着。」","他听你说完,把账本合上,动作很轻。「往后,你的账,我包了。」"] }, deep: { 2:["他愣了一下,随即恢复了那副精明相。「你问这个,」他说,「是想跟我谈条件,还是想摸我的底。」","他没有立刻答。他端起茶杯,呷了一口,才放下。「这种问题,」他说,「得看问的人是谁。」","他打量着你,像在评估你的来意。「你问得倒直接。」他说,「直接得让我得先算一算,答了划不划算。」"], 3:["他沉默了几秒,把茶杯放下了。「你问的这个,」他说,「值一个条件。」","他没有立刻开口。他翻开账本,看了一眼,又合上。「好。」他说,「我答你。但你得先答我一个问题。」","他看着你,很久。「这种问题,我不白答。」他说,「但既然是你,我可以破个例。」"], 4:["他没有回避。他把账本合上了,正面朝你。「你问到了点子上。」他说,「我跟你交个底。」","他看着你,眼神比刚才松了些。「我没想到你会问这个。」他说,「那我把我的难处,跟你摆一摆。」","他把身子往前倾了倾,声音压低了。「这个问题,我愿意答。」他说,「你听着。」"], 5:["他没有犹豫。他把账本收进抽屉,把椅子拉近。「这个问题,我只跟你一个人说。」","他看着你,目光比刚才更近。「你既然问到了,说明你够格知道。那我把底牌亮给你。」","他把声音放得很轻,像是怕被外人听见。「问吧。你问的,我都说。」"] }, push: { 1:["他把茶杯放下了,脸色沉了下来。「施压?」他说,「你也不看看,我是干什么的。」","他往后一靠,拉开了距离。「你让我出力,」他说,「你拿什么换。」","他冷笑。「施压,」他说,「我天天被人施压。你算老几。」"], 2:["他把账本合上了,动作很重。「你让我出力,」他说,「你先看看你自己的本钱。」","他盯着你,目光比刚才冷。「施压,」他说,「你也配。」","他站起身,居高临下。「今天这单生意,」他说,「我看是谈不成了。」"], 3:["他没有动怒,只是很平静地看着你。「你让我出力,」他说,「我出力,你出什么。」","他把茶杯往桌上一放。「施压,」他说,「我见得多了。你这套,不灵。」","他看着你,很久。「今天这笔,」他说,「就到这儿吧。你请回。」"], 4:["他没有发火,只是把你的话当成了一笔不划算的买卖。「你让我出力,」他说,「这笔账,怎么算都是我亏。」","他把账本收进抽屉,像是谈话已经结束。「施压,」他说,「你找错人了。」","他看着你,很久没移开。最后他说:「请回吧。今天,不谈了。」"], 5:["他没有喊,只是很平静地看着你,平静得像在盘点。「你让我出力,」他说,「你拿什么抵押。」","他把账本合上了,动作很轻,但很坚决。「施压,」他说,「我这条命,就是被人压出来的。你压不动。」","他看着你,很久。最后他说:「请回吧。这单,不做了。」"] } }, zentrum: { chat: { 1:["他没有接你的话,只是看着你,像在判断你的来意。「你今天来,」他说,「是为谁来的。」","他给你拉开椅子,但没有坐下。「你先说,」他说,「你说完了,我再决定要不要坐。」","他听着,目光很平,平得看不出任何倾向。「嗯。」他说,「我在听。」"], 2:["他给你拉开椅子,这次自己也在旁边坐下了。「你慢慢说,」他说,「我不急。」","他应着你的话,目光很温和,但也很谨慎。「你说的,我记下了。」","他听你聊孩子聊学校,聊到第三句,他才把话题轻轻往回带了带。"], 3:["他给你递了杯水,听你说话。「你说的,」他说,「我都听见了。」","他坐在你旁边,不远不近,刚好隔着一个人的距离。「你接着说。」他说,「我听着。」","他听你讲完,点了点头。「你今天谈的这个,」他说,「我会记在心里。」"], 4:["他给你留出椅边,让你坐得离他更近些。「你上次让的那一步,」他说,「我们都记得。」","他听你讲完,把你的话在心里过了一遍。「你说的,」他说,「我信。」","他难得露出点笑意。「你今天来,」他说,「我心里踏实。」"], 5:["他让你与他并肩坐下,中间不再留空隙。「往后,」他说,「你就站在我身边。」","他给你续上水,听你讲完,把手轻轻放在你手背上,很快又收回来。「你的话,」他说,「我记一辈子。」","他听你说完,看着你,很久没有移开。最后他说:「有你在,我就放心。」"] }, deep: { 2:["他愣了一下,垂下眼帘。「你问这个,」他说,「是想搭桥,还是想拆桥。」","他没有立刻答。他看着自己交握的双手。「这种问题,」他说,「我得先想想,能不能答。」","他看着你,目光里带着审视。「你问得很直接。」他说,「直接得让我得先掂量掂量。」"], 3:["他沉默了几秒,缓缓吐出一口气。「你问的这个,」他说,「我可以答一半。」","他没有立刻开口。他在胸前提了提手,像是在默祷。「好。」他说,「我试着答一答。」","他看着你,很久。「这种问题,我不常答。」他说,「但既然是你问,我答。」"], 4:["他没有回避。他转过身,正对着你。「你问到了点子上。」他说,「我跟你讲讲我的心里话。」","他看着你,眼神比刚才松了些。「我没想到你会问这个。」他说,「那我把我的难处,跟你讲讲。」","他把声音放得很轻。「这个问题,我愿意答。」他说,「你听着。」"], 5:["他没有犹豫。他把手轻轻放在你肩上。「这个问题,我只跟你说。」","他看着你,目光比刚才更近。「你既然问到了,说明你已经走进我心里了。那我不瞒你。」","他把声音放得很轻,轻得像在耳语。「问吧。你问的,我都说。」"] }, push: { 1:["他垂下眼帘,没有立刻答。「你让我表态,」他说,「可我站的地方,就是不表态的地方。」","他缓缓摇头。「你逼我表态,」他说,「那我告诉你,我的表态就是:不动。」","他看着你,目光很平。「你让我选边,」他说,「我选的边,叫『中间』。」"], 2:["他把手交握在一起,握得很紧。「你逼我,」他说,「可我逼不得。我一动,两边都得塌。」","他看着你,目光比刚才沉。「你让我表态,」他说,「我表了。我的态,就是稳。」","他缓缓站起身。「今天,」他说,「我看就到这儿吧。」"], 3:["他没有动怒,只是很平静地看着你。「你让我表态,」他说,「我的态,早就表了。表在『不动』上。」","他缓缓摇头。「你逼我,」他说,「逼不动的。我站的地方,就是逼不动的地方。」","他看着你,很久。「今天,」他说,「你请回吧。」"], 4:["他没有发火,只是把你的话当成了一阵风。「你让我表态,」他说,「我表了。我表态的方式,就是不表态。」","他把手放在胸口。「你逼我,」他说,「可我心里的秤,逼不动。」","他看着你,很久没移开。最后他说:「请回吧。今天,到此为止。」"], 5:["他没有喊,只是很平静地看着你,平静得像一潭深水。「你让我表态,」他说,「我站定了。站在中间,哪边也不倒。」","他缓缓摇头。「你逼我,」他说,「我这一辈子,就没被人逼动过。」","他看着你,很久。最后他说:「请回吧。我替这个国家,守着中间。」"] } }, dnvp: { chat: { 1:["他没有接你的礼,只是端详着你,像在鉴定一件旧物的成色。「你这套礼数,」他说,「是跟旧人学的,还是装的。」","他受了你的礼,但没有还礼。他只是点了点头,点得很矜持。「你倒懂规矩。」","他打量着你,很久。「你比那些毛头小子,」他说,「懂事一点。」"], 2:["他受了你的礼,这次微微颔首,算是还了半分。「你倒有旧派人的样子。」","他让你站得离他近了些,但仍隔着三步。「你有礼,」他说,「这我认。」","他端详着你,目光缓和了些。「你这种礼数,」他说,「如今不多见了。」"], 3:["他受了你的礼,这次还了一个标准的旧礼。「你懂礼,」他说,「那我就以礼待你。」","他让你坐到他旁边,但仍保持着旧式的距离。「你有教养,」他说,「这很难得。」","他难得露出点赞许。「你这样的年轻人,」他说,「不多了。」"], 4:["他受了你的礼,这次主动朝你走近了一步。「你的礼数,」他说,「我认。你的人,我也认一半。」","他让你坐到他近旁,把一把旧椅推给你。「你坐,」他说,「这把椅子,认人。」","他难得露出点真心的缓和。「你能懂旧礼,」他说,「说明你心里有根。」"], 5:["他受了你的礼,郑重地还了一个全套的旧礼。「你的礼,」他说,「我受。你这个人,我收。」","他让你站到他身边,不再隔任何距离。「往后,」他说,「你就站在我这一侧。」","他看着你,很久没有移开。最后他说:「你这样的,我很多年没遇过了。」"] }, deep: { 2:["他眯起眼打量你。「你问这个,」他说,「是想探我的底,还是想看我的笑话。」","他没有立刻答。他转过身,背着手。「这种问题,」他说,「你还不配问。」","他盯着你,目光很凉。「你问得倒轻巧。」他说,「你拿什么来换这个答案。」"], 3:["他沉默了很久,才缓缓开口。「你问的这个,」他说,「我可以答一半。」","他没有立刻开口。他望着窗外,望了很久。「好。」他说,「我答你。但你得记住今天。」","他看着你,目光里带着审视。「这种问题,我不常答。」他说,「答了,你就欠我一笔。」"], 4:["他没有回避。他转过身,正对着你。「你问到了点子上。」他说,「我跟你讲讲,什么叫真正的账。」","他看着你,眼神比刚才缓和了些。「我没想到你会问这个。」他说,「那我把我的旧账,跟你算一算。」","他把声音放得很低。「这个问题,我愿意答。」他说,「你听着。」"], 5:["他没有犹豫。他把你让到他身边,声音压得极低。「这个问题,我只跟你说。」","他看着你,目光比刚才更近。「你既然问到了,说明你够格。那我把底牌亮给你。」","他把声音放得很轻,像是怕被外人听见。「问吧。你问的,我都说。说完,你就是我的人了。」"] }, push: { 1:["他的脸沉了下来。「你驳斥我?」他说,「你也不看看,你站在什么地方。」","他转过身,背对着你。「旧帝国,」他说,「那是我这一辈子的根。你驳它,就是驳我。」","他盯着你,目光像冰。「你再说一遍,」他说,「我让你出不了这个门。」"], 2:["他猛地转过身,目光如刀。「你敢驳斥我。」他说,「你算什么东西。」","他把脸凑近了些,声音压得很低。「旧帝国,」他说,「你懂什么。你也配提。」","他指着门。「滚。」他说,「趁我还让你走。」"], 3:["他没有立刻发作,只是把你从头到脚重新看了一遍。「你驳斥我,」他说,「你拿什么驳。」","他冷笑。「旧帝国,」他说,「那是德意志的魂。你驳它,你就是在卖国。」","他盯着你,很久。「今天,」他说,「我就当你没来过。你走吧。」"], 4:["他没有发火,只是很平静地看着你,平静得吓人。「你驳斥我,」他说,「你这条命,够驳几回。」","他把手背到身后,握得很紧。「旧帝国,」他说,「是我的命。你驳它,就是要我的命。」","他看着你,很久没移开。最后他说:「滚。别让我再看见你。」"], 5:["他没有喊,只是很平静地看着你,平静得像在看一个死人。「你驳斥我,」他说,「你驳的是德意志。」","他把手背到身后,一字一句地说:「旧帝国,」他说,「是我的信仰。你驳它,你我之间,就没什么好说的了。」","他看着你,很久。最后他说:「滚。从今往后,你我再无瓜葛。」"] } }, nsdap: { chat: { 1:["他盯着你,没有接你的话。「你听,」他说,「你最好真的在听。」","他往前倾了倾身,逼近你。「你听,」他说,「听完了,你就该知道站哪边。」","他没有让你走,但也没让你坐。他只是把你从头到脚看了一遍。「你听着,」他说,「我只说一遍。」"], 2:["他难得没有打断你,让你把话听完。听完他点了点头。「你在听,」他说,「这就对了。」","他把你让到近旁,声音压低了。「你肯听,」他说,「说明你跟他们不一样。」","他听你讲完,拍了拍你的肩,力道很大。「你听着,」他说,「这就够了。」"], 3:["他给你拉了一把硬椅,让你坐下。「你坐,」他说,「坐着听。」","他听你讲完,难得露出点赞许。「你肯听,」他说,「说明你还有救。」","他把你让到更近的地方,声音压得更低。「你听着,」他说,「我只跟你讲。」"], 4:["他把你拉进他那一圈人中间。「你听,」他说,「跟我们一起听。」","他听你讲完,揽住你的肩膀。「你肯听,」他说,「说明你已经半只脚踏进来了。」","他把声音压得很低,凑到你耳边。「你听着,」他说,「听完了,你就明白了。」"], 5:["他让你站到他身边,看向同一个方向。「你听,」他说,「听这声音。」","他把手按在你肩上,力道很大。「你肯听,」他说,「说明你已经是我们的人了。」","他看着你,很久没有移开。最后他说:「你听着,」他说,「往后,你跟我一起听。」"] }, deep: { 2:["他眯起眼打量你。「你问这个,」他说,「是想探我的底,还是想入我的伙。」","他没有立刻答。他盯着你,眼睛一眨不眨。「这种问题,」他说,「你配问吗。」","他往前逼了一步。「你问得倒大胆。」他说,「大胆得让我得先想想,留不留你。」"], 3:["他盯着你看了很久,像在判断你的来意。「你问的这个,」他说,「我可以答一半。」","他没有立刻开口。他点了根烟,缓缓吐字。「好。」他说,「我答你。但你得记住今天。」","他看着你,目光里带着压迫。「这种问题,我不常答。」他说,「答了,你就得跟我走。」"], 4:["他没有回避。他把你拉到近旁,声音压低了。「你问到了点子上。」他说,「我跟你讲讲,什么叫真正的德国。」","他看着你,眼神比刚才更亮。「我没想到你会问这个。」他说,「那我把我的抱负,跟你讲一讲。」","他把声音放得很低,像是怕被外人听见。「这个问题,我愿意答。」他说,「你听着。」"], 5:["他没有犹豫。他把你拉到最僻静的角落,声音压得极低。「这个问题,我只跟你说。」","他看着你,目光比刚才更近。「你既然问到了,说明你已经是半个自己人了。那我不瞒你。」","他把声音放得很轻,像是怕被全世界听见。「问吧。你问的,我都说。说完,你就回不去了。」"] }, push: { 1:["他的脸沉了下来。「你警告我?」他说,「你也不看看,这是谁的地盘。」","他往前逼了一步,几乎贴到你脸上。「收敛,」他说,「你让我收敛?你让我怎么收敛。」","他盯着你,目光像火。「你再说一遍,」他说,「我让你出不了这个门。」"], 2:["他猛地凑近你,唾沫几乎喷到你脸上。「你敢警告我。」他说,「你算什么东西。」","他把脸凑得更近,声音像从牙缝里挤出来。「收敛,」他说,「我偏不。你能把我怎么样。」","他指着门。「滚。」他说,「趁我还让你走。」"], 3:["他没有立刻发作,只是把你从头到脚重新看了一遍。「你警告我,」他说,「你拿什么警告。」","他冷笑,笑得很冷。「收敛,」他说,「我等的就是这一天。你让我收敛,做梦。」","他盯着你,很久。「今天,」他说,「我就当你没来过。你走吧。」"], 4:["他没有发火,只是很平静地看着你,平静得吓人。「你警告我,」他说,「你这条命,够警告几回。」","他把手攥成拳头,攥得很紧。「收敛,」他说,「我等的就是爆发。你让我收敛,就是要我的命。」","他看着你,很久没移开。最后他说:「滚。别让我再看见你。」"], 5:["他没有喊,只是很平静地看着你,平静得像在宣判。「你警告我,」他说,「你警告的是历史。」","他把手攥成拳头,一字一句地说:「收敛,」他说,「我这辈子,就没学过这两个字。」","他看着你,很久。最后他说:「滚。从今往后,你就是我的敌人。」"] } }, army: { chat: { 1:["他没有抬头,继续看他的地图。「说。」他只说了一个字。","他抬眼扫了你一下,又低下头。「东边的防务,」他说,「你问这个做什么。」","他没有接你的话,只是往旁边挪了半步,给你腾出一点站的地方。「说。」"], 2:["他抬手一让,示意你坐。「坐。」他说,随即问,「要什么。」","他听了你两句防务,才抬起头。「你懂行。」他说,「接着说。」","他把地图往你这边挪了半寸,让你能看见一角。「你看,」他说,「这一线,是重点。」"], 3:["他示意你坐近些。「坐。」他说,「你问防务,是懂行的。」","他听你讲完防务,难得点了点头。「你懂,」他说,「那我们就有的谈。」","他把地图收起来一半,看着你。「你问的这些,」他说,「问到点子上了。」"], 4:["他把地图收起来,专心听你说话。「你懂防务,」他说,「那我就跟你交个底。」","他让你坐到他对面,把一张更详细的地图摊开。「你看,」他说,「这一线,我最担心。」","他听你讲完,难得露出点赞许。「你懂行,」他说,「跟你谈,不费劲。」"], 5:["他把最机密的那张地图摊开给你看。「你看,」他说,「这张,我只给你看。」","他让你坐到他旁边,把防务的难处一五一十讲给你听。「你懂,」他说,「那我不瞒你。」","他听你讲完,看着你,很久没有移开。最后他说:「往后,防务的事,我跟你说。」"] }, deep: { 2:["他抬眼打量你。「你问这个,」他说,「是公事,还是私事。」","他没有立刻答。他继续看他的地图,看了一会儿才抬头。「这种问题,」他说,「不在公务范围内。」","他盯着你,目光很平。「你问得倒直接。」他说,「直接得让我得先想想,该不该答。」"], 3:["他沉默了几秒,把地图卷起来了。「你问的这个,」他说,「我可以答一半。」","他没有立刻开口。他站起身,走到窗边,背对着你。「好。」他说,「我答你。但你得记住,今天这话,出了这个门就不算数。」","他看着你,很久。「这种问题,我不常答。」他说,「答了,你就得替我守口如瓶。」"], 4:["他没有回避。他转过身,正对着你。「你问到了点子上。」他说,「我跟你讲讲,什么叫真正的防线。」","他看着你,眼神比刚才缓和了些。「我没想到你会问这个。」他说,「那我把我的难处,跟你摆一摆。」","他把声音放得很低。「这个问题,我愿意答。」他说,「你听着。出了门,烂在肚子里。」"], 5:["他没有犹豫。他把你让到最里间,声音压得极低。「这个问题,我只跟你说。」","他看着你,目光比刚才更近。「你既然问到了,说明你够格。那我把底牌亮给你。」","他把声音放得很轻,像是怕被外人听见。「问吧。你问的,我都说。说完,这件事,天知地知。」"] }, push: { 1:["他把地图往桌上一拍。「文官?」他说,「你让我听命于文官。」","他站起身,居高临下。「我这一辈子,」他说,「只听命于国家。文官,算什么东西。」","他盯着你,目光像铁。「你再说一遍,」他说,「我让你出不了这个门。」"], 2:["他猛地站起来,把椅子带倒了。「你敢。」他说,「你让我听命于文官。」","他把脸凑近了些,声音压得很低。「文官,」他说,「你们懂什么叫服从。」","他指着门。「滚。」他说,「趁我还让你走。」"], 3:["他没有立刻发作,只是把你从头到脚重新看了一遍。「你让我听命于文官,」他说,「你拿什么让我听。」","他冷笑。「文官,」他说,「我见得多了。真正打起仗来,他们在哪儿。」","他盯着你,很久。「今天,」他说,「我就当你没来过。你走吧。」"], 4:["他没有发火,只是很平静地看着你,平静得像在军法宣判。「你让我听命于文官,」他说,「你这条命,够命令几回。」","他把手背到身后,握得很紧。「文官,」他说,「我这条命,是国家的。不是你们的。」","他看着你,很久没移开。最后他说:「滚。别让我再看见你。」"], 5:["他没有喊,只是很平静地看着你,平静得像在行刑。「你让我听命于文官,」他说,「你让我听的,是死命令。」","他把手背到身后,一字一句地说:「文官,」他说,「我这辈子,就没学过这两个字。」","他看着你,很久。最后他说:「滚。从今往后,你我之间,只有命令,没有服从。」"] } } }>>\ <</if>>\ <<if not $pc_archive_respond>>\ <<set $pc_archive_respond to { spd: { fear:"他沉默了一会儿,把你让到更近些的位置,声音放低了。", want:"他难得露出点真正的热望,把椅子往你这边挪了挪。", memory:"他的目光一下子远了,像穿过了这间屋子,落到了很多年前。" }, kpd: { fear:"他盯着你看了很久,才把你拉到更僻静的角落,声音压得极低。", want:"他的眼睛亮了一下,像是被你的话点着了什么。", memory:"他沉默了很久,久到你以为他不会答了,他才缓缓开口。" }, ddp: { fear:"他推了推眼镜,把你的话当成了一道需要认真推演的题。", want:"他难得放下那副精明相,目光变得有些远。", memory:"他放下手里的笔,像是被你的话带回了很多年前的某个下午。" }, dvp: { fear:"他端起茶杯呷了一口,才缓缓放下,像是下了很大的决心。", want:"他难得不算账了,目光有些松动。", memory:"他盯着手里的茶杯,很久没有说话,像是沉进了旧事里。" }, zentrum: { fear:"他垂下眼帘,缓缓吐出一口气,像是卸下了什么。", want:"他难得露出点真正的心绪,声音放得很轻。", memory:"他的目光变得很柔,像想起了很久以前的事。" }, dnvp: { fear:"他转过身,背着手,沉默了很久才开口。", want:"他难得收起那副居高临下,声音沉了下来。", memory:"他的目光一下子变得很远,像穿过了这间屋子。" }, nsdap: { fear:"他眯起眼,把你拉到最僻静的角落,声音压得极低。", want:"他的眼睛亮得吓人,像是被你的话点燃了。", memory:"他沉默了很久,才缓缓开口,声音里带着一种你从未听过的东西。" }, army: { fear:"他把地图卷起来,沉默了半晌,才缓缓开口。", want:"他难得放下那副公事公办,声音放得很低。", memory:"他望着窗外,望了很久,像是沉进了很远的旧事里。" } }>>\ <</if>>\ <</widget>> /* ---------- party-respond:取一条「回应你这句话」的专属文本 ---------- 用法:<<party-respond _pid _depth _tier>> 输出 $ret */ <<widget "party-respond">>\ <<silently>> <<party-respond-init>> <<set _pid to $args[0]>> <<set _depth to $args[1]>> <<set _tier to $args[2]>> <<set $ret to "">> <<if $pc_respond[_pid] and $pc_respond[_pid][_depth] and $pc_respond[_pid][_depth][_tier]>> <<set _pool to $pc_respond[_pid][_depth][_tier]>> <<pool-pick "pres_" _pid "_" _depth "_" _tier>> <<set $ret to $pool_pick>> <</if>> <</silently>>\ <</widget>> /* ---------- party-topics-init:正事话题库(每党 3 个专属话题,回应按信任分档) ---------- $pc_topics[pid] = [ {id, label, effects, delta, extra, resp:{lo:[冷·敌意疏离], mid:[中·中立], hi:[热·信任], top:[盟·同盟]}} ×3 ] 档位映射:tier1-2→lo,3→mid,4→hi,5→top。话题为常青议题,不锁年代。 */ <<widget "party-topics-init">>\ <<if not $pc_topics>>\ <<set $pc_topics to { /* ═══ SPD ═══ */ spd: [ { id:"spd_hours", label:"问问他,八小时工作制还守不守得住", effects:"SPD信任+4", delta:4, extra:{}, resp:{ lo:["他眼皮都没抬。「八小时。」他把这三个字在嘴里过了一遍,笑了一下,笑得没什么温度。「纸上的东西,问纸去。你先去数数,厂门口谁的人多。」","他没抬头,手里的笔没停。「这个问题,我一天要答八遍。」他把一摞报表往桌角墩齐。「真想知道,就去登记处门口站一个钟头。比我讲得清楚。」"], mid:["他把烟摁灭了。「纸面上还是八小时。厂子里早就不是了——两班倒的空子,一钻一个准。」他顿了顿,「这话我只说到这儿。再往下,得先让我看看你的诚意。」","「守不守得住,不取决于我。」他抬眼看你,「取决于国会里那一票。你手里要真有数,先告诉我你打算怎么投。我再告诉你实情。」"], hi:["他从抽屉里抽出两页纸,推到你面前。「西里西亚几家大厂,上个月起改两班倒。名义八小时,人在机器边站十二个。」他指着页脚一行小字,「这一页,柏林没有一家报纸敢印。」","「去年这时候,稽查还下厂。今年,稽查的名册少了一半——不是不想查,是查不过来。」他往椅背上靠了靠,「八小时还活着,活得跟重症号一样。你要肯接,工会那边的底细我都给你。」"], top:["他站起来把门掩上,回来时声音放得很低。「实话:八小时在纸面上活着,在车间里快死了。谁先把它写进法令再下厂去查,谁就得罪半个企业主协会。」他盯着你,「你敢,我就把工会所有的名单交给你。」","「我等这句话等了两年了。」他把椅子拖到你旁边坐下,「你要动真格的,我这边有三件事要先办:稽查加编、罚则落地、工会进厂。一件都绕不开你那支笔。」他说,「今晚就把第一件写出来。」"] } }, { id:"spd_dole", label:"问问他,断了救济的人家怎么过", effects:"SPD信任+4", delta:4, extra:{}, resp:{ lo:["「断了救济的人家怎么办?」他重复了一遍,像在确认自己没听错。「他们站在登记处门口,站在雨里。你隔着车窗玻璃看一眼,就来问我怎么办。」","他把手里的活停了。「这个问题不用问我。你去问发救济的窗口,这个月还开几天。」他说完又低下头,没再看你。"], mid:["他叹了口气,把桌上的登记簿翻过来给你看了一眼,又合上。「救济金发到这个月见底。再往后,就得看财政部肯不肯松手。」他说,「你是政府的人。这笔账,你的分量比我重。」","「登记处的长队,一半是没活干的,一半是救济断了来补登的。」他看着你,「两头的数我都有。你要,我可以给你——但我得知道,你要拿去做什么。」"], hi:["他开了上锁的抽屉,取出一本薄册子。「这是三个区的实际发放数。账面上的和发到手里的,差了一截。」他把册子放在你手边,「差的那一截去哪儿了,你我心里都有几个名字。你要查,我陪你查到底。」","「最难的那一个月,工会自己贴了钱。」他说得很平,「不是我们要替政府办事,是等不了。」他抬眼看你,「你的钱要是能按月到位,我立刻把工会的钱撤回来。我等的就是这一天。」"], top:["「我把最实的数给你。」他压低声音,「柏林城内,断了救济的人家,四千七百户上下。这个数不在任何官方册子上,是我们的人一户一户敲出来的。」他盯着你,「你拿去用。但用的时候,别提是哪儿来的。」","「救济这条线,我替你盯着。」他说,「哪个月断了档,工会的先顶上;哪一笔被截了留,我先报给你。」他顿了顿,「只有一条:那份名单,你得亲自过目。你连看都不看,我顶得再勤也是白顶。」"] } }, { id:"spd_army", label:"问问他,国防军到底站在哪一边", effects:"SPD信任+4", delta:4, extra:{}, resp:{ lo:["他的脸一下子沉了。「这个问题,1919 年就该有人答。」他一字一顿,「那时候答得慢了,街上躺了多少人,你我都数过。现在你来问我?去问该答的人。」","他没说话,走到窗边站了一会儿。「军官团屋里挂着谁的像,你去看看就知道。」他背对着你,「我们问了好几年,问出来的都是这一个答案。」"], mid:["「站在哪一边?」他冷笑了一下,「站在能保住他们军饷的那一边。」他把手里的笔放下,「共和国在一天,他们忍一天。你听懂了这句,就知道该往哪儿防。」","他压低了声音。「我能告诉你的是:他们在数。」他说,「数我们的工人纠察,数我们的枪,数共和国哪里最软。」他看着你,「你要是也有一本账,我们对一对。」"], hi:["他从书后抽出一个牛皮纸袋,没打开,只是按在手底下。「东部几个邦的驻军调动,这半年的路线都在这里。」他看着你,「合法调动,一步一步,全合规矩——拼起来看,就不是那么回事了。你肯往国会递,我就把它给你。」","「每个月,国防军和我们都有一次例会。桌上客客气气,桌底下各记各的。」他说,「他们报上来的兵员数,和我们自己数出来的,总差那么几千。差在哪儿,谁也说不破。」他看着你,「你的位子比我高。这句话,我只在你这儿说。」"], top:["「1919 年欠的账,不能再欠第二回。」他把纸袋推到你面前,手没松开,「他们的动员令,离签发永远只差一个名字。你答应我一件事——真到那一天,先通知我,别先通知他们。」他松开手,「这份底细,从今晚起就是你的。」","「我信不过他们,你也一样。」他说得极慢,「但我更怕的是我们先乱。」他站起来,把手按在地图上,「工人组织的名册、各区联络的暗号、出事的钟点——这些我全交给你。条件只有一个:动起来的时候,工人不单独上街。」"] } } ], /* ═══ KPD ═══ */ kpd: [ { id:"kpd_unemployed", label:"问问他,街上的失业者靠什么活下去", effects:"KPD信任+4", delta:4, extra:{}, resp:{ lo:["他从鼻子里哼出一声。「政府的人,问失业的人怎么活?」他终于正眼看你,「这个问题问反了。该是他们问你:把人逼上街之前,还打算让人忍多久。」","他把烟在鞋底摁灭了。「你数过没有,亚历山大广场早上蹲着多少人。」他站起来,「数完你再来。那时候你问什么,我都答。」"], mid:["「靠什么活?」他把烟点上,「一半靠救济,救济断了就靠典当;典当完了,就靠组织。」他吐出一口烟,「最后一个词你听不懂也没关系。反正你也不会替我们说。」","他盯着你看了很久。「我们的食堂,一天开两顿,一顿一碗汤。」他说,「汤是哪儿来的,你别问。你要真想知道失业的人怎么活,明天早上五点,来排队帮着发一次。」他说完转身,「来了,就算数。」"], hi:["他从怀里掏出一个卷了角的簿子,在手里掂了掂,没给你。「城东十一个街区,八千三百口人,断了救济的占四成。」他把簿子收回怀里,「数目我记得比你们的官册还清。你肯拿它做事,我抄一份给你。做什么,你先说。」","「天不亮就去码头蹲活。蹲不着,晌午到我们的棚子里领一份汤。」他忽然停住,看着你,「这些话我从来不对你们这号人说。今天说了,因为你在听,没打断。」"], top:["他把你拉到里屋,门带上。「断粮的街,我们列了单子;能顶上的灶,我们也列了单子。」他压低声音,「两份单子都在我这儿。你能从官仓里划出一批粮,划到哪儿、怎么落地,我们的人一夜就能铺开。」他盯着你,「做不做?」","「我不跟你讲虚的。」他把手按在桌上,「八千三百口,这个数你拿去,救济能落地就落;落不了,我们自己安排。你只要记住一件事:人是我们一个一个数出来的。别拿官册上那个假数,糊弄他们。」"] } }, { id:"kpd_prisoners", label:"问问他,被判了刑的自己人怎么办", effects:"KPD信任+4", delta:4, extra:{}, resp:{ lo:["「判刑的?」他冷笑,「你们的法官判我们的人,判得比谁都快。现在倒来问怎么办。」他把脸转开,「条文在你们手里。怎么办,问条文去。」","他盯着你,很久。「莫阿比特的墙上,每个月多几个名字。」他说,「你去数。数完还问得出这句话,我就认你是个心硬的。」"], mid:["「名单我有。」他说,「三十七个人,刑期加起来一百多年。」他把那张纸压在手掌底下,没给你,「你要大赦,去推动。推成了,名单给你核对。推不成,这张纸就不存在。」","「牢里的人,我们一个月探一回。」他看着你,「探视带出来的话,比带进去的多。」他顿了顿,「你想知道他们怎么样——先告诉我,你的大赦案,卡在哪个环节。」"], hi:["他把名单推过来,指腹压在最上面一行。「这个人,上个月转去了别的牢,家里人到现在不知道。」他说,「转监的手令,要内政那条线签字。你肯查,我告诉你哪一天、哪一班车。」","「三十七个人里有四个是病的,肺上的病。」他声音低下来,「牢里不给药。药是我们从外头一包一包带进去的,带一次,冒一次险。」他抬起头,「你的位子里能递一句话,递进去。递到了,这几个人的名字,我从名单上划掉。」"], top:["「名单给你,三十七个,一个不多一个不少。」他把纸按在你面前,「但你记住:这是信任,不是交易。哪天你的国会把大赦案搅黄了,这纸上的每一个名字,都会变成街上传单上的标题。」他直起身,「别让我的名单,变成你的把柄。」","「转监那个人的下落,我只告诉了你。」他说,「案子你走程序,人我们等着。两头的钟都得走得准:你那边一拖,我这边就按最坏的打算办。」他看着你,「我说清楚了?」"] } }, { id:"kpd_parliament", label:"问问他,他信不信议会这张桌子", effects:"KPD信任+4", delta:4, extra:{}, resp:{ lo:["他笑了,笑得很短。「你问我信不信议会?」他敲了敲桌面,「这张桌子上,摆过镇压我们的每一道令。你让我信这张桌子?」他把椅子往后一推,「回去吧。」","「传单上有答案。」他把一张折好的纸拍在桌上,「拿回去,念给你们那位部长听。一个字都不用改。」"], mid:["「桌子就是桌子。」他说,「桌子掀不掀,不取决于桌子。」他看着你,「你们的桌子现在还坐得下说话的人,我们就还派人来坐。哪天坐不下了——」他没说完,摆了摆手。","「信不信,你看我们派不派人,就知道了。」他难得没有针锋相对,「来了,说明街上还需要这几天;不来,你别问为什么。」他看着你,「这句话,你已经比大多数人听得多了一层。」"], hi:["「我跟你说实话。」他往前凑了凑,「上回党内议这件事,我投了『进议会』。为什么?因为街上那八千口人,靠喊话填不饱肚子。」他坐回去,「这不是信仰,是算术。你的桌子要是连算术都装不下,那才是真的麻烦。」","「议会里能拿到的东西,三样:麦克风,记录,豁免权。」他一样一样扳着指头,「三样都用完了,还拿不到东西,那就是桌子的问题,不是我们的问题。」他看着你,「这句话,我们党内也不许说。你听见了,烂在肚子里。」"], top:["「我只对你一个人说这个。」他声音压得极低,「只要桌子上还能替那八千口人要到东西,我们就坐下去。要不到的那天——你提前一个月告诉我,我保证人从大门走,不从街上走。」他直起身,「这个承诺,你们整个内阁买不到。」","「信不信桌子,你不用再问了。」他难得露出一点近似笑的东西,「我把『进议会』这一票的底细交给你:哪次投配合,哪次投拆台,我心里有一本账。你要用这张桌子办成事,先来跟我对账。」"] } } ], /* ═══ DDP ═══ */ ddp: [ { id:"ddp_constitution", label:"问问他,宪法里哪一条最经不起折腾", effects:"DDP信任+4", delta:4, extra:{}, resp:{ lo:["他推了推眼镜,打量你。「这个问题,」他说,「该问你自己的党团——他们的每一次表决,都是我的答案来源。」他把书重新翻开。「你先回去数一数,再来问我。」","「最经不起折腾的条文?」他握着钢笔想了想,「是『你以为最结实』的那一条。」他不再看你,「回去把宪法通读一遍。读到哪一条心里发虚,那就是答案,不必来问我。」"], mid:["他摘下眼镜擦了擦,像是在拖延时间。「第四十八条。」他终于开口,「紧急状态的门开得太宽,闩得太松。」他看着你,「这话我在党团里说过八回。你今天来听,算第九回。」","「不是哪一条的问题。」他把笔记本翻到某一页,「是『谁有权解释』的问题。条文是死的,解释是活的。」他看着你,「你要真关心,下次开会,注意听每一票的『依据』两个字是怎么念的。」"], hi:["「我给你看样东西。」他从抽屉里取出一页写满批注的宪法条文,指着一处折角,「第四十八条第二款,『除暴安邦所需』——这六个字,谁都能往里填自己的东西。」他把那页纸推过来,「我的批注都在上面。你肯在委员会里念出来,我不介意署名。」","「写得最结实的条文,也防不住人。」他难得叹了口气,「能拦住人的只有一样东西:每一次动用权力,都留一份说得出口的理由。」他看着你,「你的办公室每天签那么多字。签之前先想想哪张报纸会登,宪法就多活一天。」"], top:["「我把压箱底的话告诉你。」他声音放得很轻,「第四十八条,迟早有人要用。用的那天,别拦——拦不住。你能做的是记录:谁提的,什么理由,几票。」他盯着你,「记录在,往后就翻得了案。这是宪法最后的骨头。」","「书给你。」他把那本批注发白的宪法推到你面前,「我的批注全在里面,攒了三十年。」他把手按在封皮上没松,「借你一个条件——你签任何字之前,翻一遍我划了线的那些页。翻完了还敢签,那就是你的判断。我认。」"] } }, { id:"ddp_bureaucracy", label:"问问他,官厅里的老班子还靠不靠得住", effects:"DDP信任+4", delta:4, extra:{}, resp:{ lo:["「官厅里的老班子?」他笑了,笑得很客气,「他们靠得住——靠得住地等。等共和国自己散架,好把钥匙还给旧主人。」他把文件收拢,「这话你自己记住就行。」","他往椅背上一靠。「这个问题在官厅里问,得到的答案就是官厅的。你换个人问吧。」他推了推眼镜,重新低头看他的材料。"], mid:["「可靠的一半,靠不住的一半。」他伸出一根手指,「可靠的那一半,认的是俸禄和规矩;靠不住的那一半,认的是上一个朝代。」他看着你,「分清这两半,是我这些年干的最要紧的事。」","「你要用他们,就用他们的规矩。」他说,「文官认程序,你就把程序给足。绕过程序的事出一件,他们的心就凉一寸。」他顿了顿,「凉了的心,比反对派还难热回来。」"], hi:["「我给你看一份名单。」他从档案袋里抽出来,「三个部,四十一个位置,坐着的都是旧历的脑子。不动他们,是怕乱;不动的结果,是每道令出去都拐个弯。」他把名单放在你手边,「你要动,我从旁递材料。要不动,这页纸今晚就烧掉。」","「上礼拜有个司长来备案,顺口念了句旧年的祝词。」他看着你,「在场的人都没接话。这就是官厅——他们不说,不等于忘了。」他把茶杯端起来又放下,「你要盯的是这种小地方。大地方的话,都是排练过的。」"], top:["「靠得住的少数人,我列在这张纸上,十九个。」他压低声音,「哪些部能放心交给他们,哪些部你每道令都得留副本,都在上头。」他把纸推过来,「这张纸要是传出去,我这条命就得搭进去。所以,它只放在你这儿。」","「官僚认的不是国旗,是章程。」他摘下眼镜,「章程攥在谁手里,他们就跟谁走。所以别急着换人——先把章程攥紧。」他把那叠材料按在你手边,「攥紧了,那四十一个旧脑子,自己会服帖。」"] } }, { id:"ddp_center", label:"问问他,中间派还剩几个人", effects:"DDP信任+4", delta:4, extra:{}, resp:{ lo:["「还剩几个?」他重复了一遍,像是被问到了疼处,偏不让你看出来。「够开一次会,凑不满一间屋子。」他把笔帽扣上,「话我答了。你满意了?」","「你数过面包店门口的队伍吗?」他反问,「队伍里每一个人,从前都算中间派。」他不再往下说,重新戴上眼镜,「去数吧。数字比国会诚实。」"], mid:["「选票上还能看到,队伍里已经看不到了。」他难得说了句不带条文的话,「中产在往两边搬——怕乱的往右搬,饿的往左搬。留下来的,是搬不动的老骨头。」他看着你,「我就是老骨头之一。」","「人数我说了不算。」他翻开笔记本,「但上个月的入党申请,退了三成;退掉的三成里,一半去了右边。」他把本子合上,「这个走向你要也看不见,那我提醒你一句:等看得见的时候,就晚了。」"], hi:["「我给你三个数。」他压低声音,「党员名册,四万一千;上过街跟左翼并肩游行的,八百;敢在报上公开骂两边极端的,两位数。」他看着你,「第三个数最要命。中间派不是没人了,是不敢出声了。你给一个安全的场合,声音就回来。」","「昨天散会,两个党团的干事在走廊里拦住我,问我『还折腾什么』。」他把材料叠好,「我当场答不上来。夜里想出来了:不折腾,两头就都觉得中间是块空地,谁的旗都可以插进来。」他抬眼看你,「你能让中间不空,我就还折腾。」"], top:["「我把党内真实的底给你。」他声音很低,「能跟我一条心走到底的,十一个人。再多,要看形势。」他盯着你,「你要组什么局,这十一个人随你调。条件一个:别让我们再去替两边挡枪。挡够了。」","「中间派还剩多少,取决于共和国还有多少可信。」他把手按在那本宪法上,「你每守一次程序,我的人心里就稳一分;你每绕一次,就散一片。」他看着你,「这笔账,没人替你算。我算了十年了。从今往后,算给你看。」"] } } ], /* ═══ DVP ═══ */ dvp: [ { id:"dvp_reparations", label:"问问他,赔款的账眼下怎么平", effects:"DVP信任+4", delta:4, extra:{}, resp:{ lo:["他扫了你一眼。「赔款怎么平?」他把账本往回收了收,「这个问题,问遍整个内阁,也问不出一个付得起的数。你一个外行,凑什么热闹。」","「我给你个建议。」他皮笑肉不笑,「下回见外国代表,你先去问问他们的账房。我的账房得出的答案,你的位子听不起。」"], mid:["「平不了,只能拖。」他伸出一根手指,「拖的期限,看外国的政局;拖的本钱,看我们的出口。」他把一页数字转过来给你看,「这两个月出口掉了多少,你自己看。掉到底,拖的本钱就没了。」","「账不能光看赔款那一栏。」他把报表翻过一页,「运费、关税、实物抵偿,三笔捆在一起算,才看得出亏在哪儿。」他看着你,「你的办公室要肯听我把这三笔讲完,比听十个顾问管用。」"], hi:["他把账本翻到夹着纸条的那一页。「实物抵偿这条线,三年亏了十一亿金马克,账面上记的是『偿付』。」他指尖敲着那行字,「实际是拿我们的煤,去换人家不要的债。你肯把这一页带进谈判,我给你全套的底账。」","「我跟外国的代表吃了十一顿饭,只谈成一件事:延期三个月。」他放下笔,「三个月的利息,够发半个鲁尔的工资。你别嫌这数小——现在这年头,能拖就是赚。你要能帮我拖到年底,厂子那边我给你压住。」"], top:["「我把最实的一页给你。」他压低声音,「赔款总账我们私下重算过三遍,能付的上限,就是这个数——」他在纸上写了一行,推给你,「超一分,厂子就关门。厂子一关门,你要的税、我要的利、工人要的饭,全没。」他把笔搁下,「谈判桌上,你替我守住这个数。」","「从今晚起,你我一本账。」他把那本最厚的册子推过来,「赔款、税卡、出口,三本合一。我在页边做了记号:哪笔能让,哪笔让了就伤筋动骨。」他看着你,「你的代表团带它去。记住——让步可以,让步要留字据。」"] } }, { id:"dvp_orders", label:"问问他,厂子里这季度的订单怎么样", effects:"DVP信任+4", delta:4, extra:{}, resp:{ lo:["「订单?」他抬了抬眉毛,「你办公的桌上会有订单吗?不会。所以这个问题,你问不到点子上。」他重新低头看他的信,「回去忙你的预算吧。」","「厂子里的事,比你的国会热闹。」他不咸不淡地来了一句,「热闹完了,剩下的都是裁人通知。你要听这个做什么。」"], mid:["「这个季度还能撑,靠的是先前订出去的旧单子。」他把手炉往身边挪了挪,「新单子,十家有九家在观望。观望什么?观望马克。你的币再这么跌,观望就变成收摊。」","「订单这个东西,一半看价,一半看信心。」他难得讲得慢,「价,我压得下来;信心,是你的衙门给的。」他看着你,「你签的每一份公告,厂主们都当行情读。读出乱子,单子就飞了。」"], hi:["他抽出一份货单,推到桌角。「鲁尔停工这几个月,老客户转手给了英比两家三成。」他声音沉下来,「客户这个东西,送出去容易,请回来要加倍的折扣。这页数字你拿去看。看完你就明白,厂主们为什么一提『抵抗』两个字就变脸。」","「上礼拜,埃森两家厂的东家来找我,开口第一句是『还能撑多久』。」他把茶杯推开,「我答不出。第二句是『要不要趁还在的时候卖』。」他看着你,「我劝住了。第二回,我未必劝得住。你的时局再坏一成,厂主们就自己拿主意了。」"], top:["「厂界的事,我给你通个底。」他压低声音,「三家大厂在悄悄凑一笔钱,做什么用,我不问。我只知道,钱凑齐那天,他们就不必再听柏林的了。」他盯着你,「你手头要能给订单、给贷款、给一句准话——随便一样,这笔钱就散。散了,对大家都好。」","「订单的难处,往后直接递到你桌上。」他说,「我替你筛:能撑的厂,报给你;撑不住的,我自己想办法吞下去,不惊动市面。」他顿了顿,「我图什么?图你记住:工业没垮的那几年,是谁替你守的门。」"] } }, { id:"dvp_capital", label:"问问他,往外跑的钱他拦不拦得住", effects:"DVP信任+4", delta:4, extra:{}, resp:{ lo:["「拦不拦得住?」他把怀表掏出来看了一眼,又合上。「钱长着腿,先生。腿长在一个怕字上。你把怕字拦住了,钱就站住了。」他把表收回兜里,「你拦得住吗?」","「这个问题,荷兰和瑞士的国库比你清楚。」他皮笑肉不笑,「人家的账房这半年添了多少新客户,你去问问。问回来,记得谢谢人家替我答了。」"], mid:["「跑的分三种。」他伸手指头,「真怕的,是买命钱;投机的,是赚快钱;还有一半,是只信马克的人,改信了别的东西。」他看着你,「前两种你管不着。最后一种,你本来养得住。怎么养跑的,你自己想。」","「拦的法子无非两样:管住兑换,或者稳住币。」他把报表往你那边推了半寸,「管兑换是杀鸡取卵——钱管住了,生意死了。剩下一件事你能做。」他指了指自己的太阳穴,「把这里头的怕字换掉。」"], hi:["「我给你看个东西,看完烧掉。」他从内袋抽出一张名单,「六个名字,握着全德三成的流动资本,这半年全在往阿姆斯特丹搬家。」他把名单按在你手边,「名单上的人,现在还肯听劝。再过两个月,就只肯听行情了。你要约谁谈,我递话。」","「上个月,我自己家族里也挪了一笔,挪到一半,停了。」他盯着你,把这句话说得很平,「为什么?因为我在你的衙门里,还看得到一个讲理的人。」他往椅背上一靠,「这话说出去掉脑袋——半个柏林的资本都在等我改主意。你就是我的主意。」"], top:["「六个名字给你,加上我还压着没走的那些。」他声音压得极低,「条件:你组一张非正式的桌,一星期一次,我带他们的人来,你带你的货币办法来。谈成了,钱回来;谈不成——」他站起来,「钱和人都一起走。这是你能拿到的最后一次机会。」","「跑出去的钱,我能叫回一半。」他说,「另一半,生了病,叫不回。叫回来那一半的药引子只有一味:币要稳。」他把那份底账推给你,「你那边每稳一个月,我这边回流一成。咱们一分一成地对账,年底看总账。」"] } } ], /* ═══ Zentrum ═══ */ zentrum: [ { id:"zentrum_school", label:"问问他,教会学校的事教会让不让步", effects:"Zentrum信任+4", delta:4, extra:{}, resp:{ lo:["他垂下眼帘。「学校的事,」他说,「你们的文化部三个月前答过一次,答得很好听。我记性好,还记着。」他把茶杯往里挪了挪,「换个问题吧。」","「你问教会让不让步。」他缓缓摇头,「教会让了一千年了。让到今天,还剩一间屋子、一座钟、一堂课。」他看着你,「再让,就该问让剩的东西姓什么了。」"], mid:["「学校这一条,写在宪法的哪一章,你回去查。」他不紧不慢地说,「查完了你就明白:这不是恩典,是约定。」他给你续了水,「约定的事,一方先伸手,另一方才好伸手。你们先伸手,我担保教会的门开得比你想的宽。」","「信众看学校,比看国会亲。」他把双手交叠放在膝上,「学校里少一间祈祷室,乡下讲道台上一个礼拜能讲三个月。」他看着你,「你要动这一条,先给我半年——我去把信众的心思铺平了,你再动。硬来,塌的是两边。」"], hi:["「我给你透个底。」他压低声音,「主教们私下的底线我知道:学校可以归国家,要一样东西换——宗教课的钟点,写死进法条。」他把茶杯放下,「这个交换,教会里一半人反对。你肯接,我去做那反对的一半的工作。接不接?」","「上礼拜乡下来了个老神父,为学校的事等了我两个钟头。」他看着你,「我送他出门的时候,他说:孩子们认字认得再快,心里没个怕字,长大了谁管得住。」他说这话时没有笑,「你听听——这就是我要替你铺平的那种心思。铺得平,但你得让我铺。」"], top:["「学校这一仗,我替你打。」他把身子坐直了,「我在主教们的会上替你争:国家管校政,教会留钟点和节日。条件是你签字的时候,把宗教课那一款写死——写死,不是写活。」他把手按在桌上,「我做得了主。这句话,教会里没有第二个人敢说。」","「你和教会之间,往后我就是那座桥。」他说,「桥要两头都踩得实:你这边守约,我那边压得住老派。」他顿了顿,「只有一样我帮不了你——你哪天要是让军方的人去碰学校,桥就塌了。别叫我塌第二次。」"] } }, { id:"zentrum_middle", label:"问问他,两边吵架的时候他站在哪儿", effects:"Zentrum信任+4", delta:4, extra:{}, resp:{ lo:["「站在哪儿?」他几乎笑了,「站在你叫做中间的地方。」他看着你,「你的问题本身就站了队。回去改一改,再来问我。」","他沉默了一会儿。「1918 年,有人也这么问我。」他缓缓地说,「我答了。答完,两边都记恨了我十年。」他把茶杯端起来,没喝,「这个问题,别急着要答案。」"], mid:["「哪边都不站,站规矩。」他说,「规矩向着谁,我就向着谁。」他看着你,「你要嫌这个答案旧——那我问你:哪一回塌台,不是从『规矩可以先放一放』开始的?」","「我站的地方,两边都骂。」他难得苦笑了一下,「左边的骂我护右边的财,右边的骂我惯左边的工。」他把茶杯放下,「骂声停了那天,你就该担心了——那说明我倒向了哪一边,天平就歪了。」"], hi:["「我跟你说句掏心窝的。」他往前倾了倾,「我信的是这个:国家这杆秤,秤星不能装在军队的口袋里,也不能装在街垒上。」他看着你,「你手里握着秤。我站你这边,不是站你——是站那杆秤。你哪天把秤换了地方,我们再重新谈。」","「两边吵架,我手里有一样他们都要的东西:我的票。」他把话放得很慢,「谁把规矩踩了,我停谁的票。十年了,就靠这一手,天平没塌。」他看着你,「你要学这一手,我教你。学费是:你得先做到,票在你手里的时候,也不动心。」"], top:["「我把票箱的底细交给你。」他声音放得很低,「党团里七十几票,软的硬的,谁的票跟谁走,全在这页纸上。」他把纸推过来,「往后你做事,先来对一对这页纸。你守规矩,我替你把七十几票码得整整齐齐。」","「站哪儿,我现在可以答你了。」他难得露出一点笑意,「站在你那杆秤旁边。」他把椅子挪近了些,「丑话在后头:秤歪一寸,我挪半步;秤要是搬进了军队或者街垒的口袋——」他直起身,「那你就当没认识过我。」"] } }, { id:"zentrum_workers", label:"问问他,天主教工人他要不要管", effects:"Zentrum信任+4", delta:4, extra:{}, resp:{ lo:["「天主教工人?」他抬了抬眼,「你倒问得新鲜。他们不上你们的街,不念你们的报,所以你们就当他们不存在。」他把茶杯放下,「存在。四百万口。记下了?」","「他们归谁管,教会里吵了一百年了。」他缓缓摇头,「你一个局外人插进来问——这问题本身,就够他们再吵十年。」"], mid:["「要管,就一条:别把他们当 SPD 的替补。」他把话放得很清楚,「他们要的是自己的工会、自己的节日、自己的学校。三样里给一样,心就向过来一半。」他看着你,「三样都许又不兑现,那就一颗心也拿不回来。」","「科隆和上西里西亚的工人区,我每年都走。」他说,「他们不问主义,问的是三句话:主日休不休息,孩子念什么书,伤了谁管。」他给你续上水,「你答得上这三句,比开十次大会管用。」"], hi:["「我给你递过一次话,没递成——这回递成。」他压低声音,「工会里的天主教那一支,一直怕被两边吞掉。你若肯公开认他们是一支——不算 SPD 的,也不算我们的,是他们自己的,」他看着你,「这句话由你在国会说出来,他们记你十年。」","「去年矿上的事,天主教工会没跟总罢工走,被左边的骂了半年。」他把话说得很慢,「他们不是怕,是在等一个说法:跟着共和国走,共和国认不认?」他看着你,「你把说法给出来。明年春天矿区的票,你数不过来。」"], top:["「天主教工会九个区的底细,我给你。」他把手按在那叠纸上,「谁当家,多少人,跟 SPD 的旧怨结在哪儿,都写在上头。」他盯着你,「他们入局那天起,就是独立的一支,谁的附庸都不做。你答应这个,我立刻给你搭线。」","「四百万口人,我替你牵着。」他说,「牵线的绳子只有一根:他们要被当成正经的一支力量,不当票仓,不当替补。」他顿了顿,「你哪天把他们当票仓了——不用你说,我自己先把绳子剪了。」"] } } ], /* ═══ DNVP ═══ */ dnvp: [ { id:"dnvp_flag", label:"问问他,旧皇帝的旗子他收在哪儿", effects:"DNVP信任+4", delta:4, extra:{}, resp:{ lo:["「旗子收在哪儿?」他重复了一遍,目光冷下来,「收在每一个还记得它的人心里。这个答案,你搜不走。」他转过身去,「还有别的事吗。」","他打量你很久。「你们把旗子禁了,把名字改了,把年份换了。」他缓缓地说,「然后你来问我,旗子在哪儿。」他难得露出点讥诮,「禁令管得了布,管不了念想。」"], mid:["「我不讳言。」他把手背到身后,「复辟这条路,我走了十年。走得慢,是因为我知道——抬旗容易,抬完那天早上,军队听谁的,谁说了算。」他看着你,「你怕的其实不是旗子,是抬旗的人。这个你想明白了,我们才谈得下去。」","「你想知道旗子的事,先答我一个问题。」他坐直了,「共和国这十年,给了德意志什么?你答得上来,我就告诉你,旗子在等什么。」"], hi:["「我把话说明白,因为你是少数听得懂的。」他压低声音,「旗子不是给那些啤酒馆暴徒备的——他们连旗子的规矩都不懂。真到那一天,旗子得从体面人手里升起来。」他盯着你,「问题是:如今的体面人,还剩几个敢伸手。」","「去年冬天,鲁尔区有家老厂挂出了旧年的徽记,没人去摘。」他把话说得很慢,「警察看见了,装没看见。工人看见了,也装没看见。」他看着你,「一个国家连摘旗的力气都没了——你自己想想,那算什么。」"], top:["「我只对你一个人说这个。」他声音压得极低,「我等的那一天,不一定要那面旗回来。要的只是:谁下台,都能体面地下,不被拉到街上去。」他把手按在桌上,「你能给德意志这个——旗子收在心里还是挂在杆上,我可以等。等不完,还有我的儿子。」","「旗子的事,你不用再探了。」他难得放松了坐姿,「我老了,等得动,也等不起。这样吧——共和国若能守住体面二字,我这条命替你压住党内那些急脾气。守不住,别怪旗子,先怪你自己。」"] } }, { id:"dnvp_estate", label:"问问他,东边的庄园如今怎么样", effects:"DNVP信任+4", delta:4, extra:{}, resp:{ lo:["「庄园怎么样?」他的脸沉下来,「教士的地、贵族的地,一年年被拆着卖。这就是你们的新德国。」他站起来走到窗边,「去看一眼再回来问。看完你会闭嘴的。」","「东边的地,俄国人惦记了一百年,你们的财政部惦记了十年。」他不紧不慢,「惦记的手法不一样,心是一样的。」他把报纸折起来,「你回去吧。」"], mid:["「庄园在死,死法很文雅。」他伸出手指头数,「利息涨一分,长工走一批;典到银行,银行再切成小块卖。」他看着你,「每一步都合法。合法的死,最没救。」","「你要听实话?东边的庄园是共和国的伤口,不是共和国的错处。」他难得说得不带刺,「伤口是战争割的,包扎的手法是财政部选的。手法再换两回,人也死完了。」"], hi:["他从卷宗里抽出一页地图的抄件,按在桌上。「东普鲁士,三年,易手一百七十家。买主一半是投机商,地契转得比牲口还快。」他把抄件转过来,「再买下去,边境上就没有守地的人了,只剩收租的人。这一页,你的农业部不敢印。我替你印过一回。」","「我自家那份产业,去年典出去了东翼。」他说得极平,「钱到哪儿去了?还利息。利息欠谁的?国家的银行。」他看着你,忽然笑了一下,笑得没什么温度,「共和国用我家的房子,收我家的利息。这笔账我认了。认,不等于忘。」"], top:["「东边的事,我给你指一条路。」他压低声音,「东部救济那一摊,我们党里管了十年,账目、人手、每家庄园的死活,全在我脑子里。」他盯着你,「你要真想救东边,别经农业部——他们只会切块卖。跟我私下搭一条线,我给你指哪几家救得活。」","「庄园的账,往后你来对。」他把那本旧册子推过来,「哪块地能救,哪块地救了也是填坑,我替你标好了。」他顿了顿,「我不要你的谢。我要你记住:东边要是烂透了,烂泥里长出来的东西,不会是共和国想要的。」"] } }, { id:"dnvp_treaty", label:"问问他,和约哪一条他最想撕", effects:"DNVP信任+4", delta:4, extra:{}, resp:{ lo:["「哪一条?」他冷笑,「你以为和约是一页一页撕的?它是整匹布,从你头上剪下来的。」他把茶杯推开,「撕一页,剩下的照样裹着你。回去吧。」","他盯着你看了很久。「这个问题,每一个签字的人都在问我。」他缓缓地说,「连他们自己签的字,都不好意思念出声。你还问。」"], mid:["「要撕,先撕那一条写着『罪在我们』的。」他一字一顿,「字是笔写的,笔是手握的。谁的手握着笔,撕的就是谁的手。」他看着你,「这一条不撕,别的撕了也白撕。」","「第几条不要紧。」他摆摆手,「要紧的是撕的手法。掀桌子谁都会。」他往前倾了倾,「我要的是:一条一条,坐回桌子那边谈回来,谈到对面自己念不出口为止。这才是德意志的做法。」"], hi:["「撤销那一条,我算过账。」他从抽屉里取出一叠批注,「法理上站得住的路径有三条,每条要走几年、赔上什么,我全标好了。」他把批注推过来,「你的外交部不敢用——用了,就是承认以前的部长们都签错了。所以我给你:你年轻,错得起。」","「去年日内瓦那一场,我在旁听席坐了四天。」他说,「第四天,对面那位次长私下跟我说了一句:条款是死的,执行的人是活的。」他看着你,「这句话是个口子。口子有了,差的是往里递东西的人。你递,我教你怎么递。」"], top:["「批注全给你,三条路径,连每一步要压住谁、要拉拢谁,都写了。」他把手按在纸上没松,「条件一个:撕要撕得体面——照规矩谈回来,不许上街,不许流血。谁要借撕条约的事闹事,我第一个不答应。」他松开手,「这是我跟你做的唯一一笔买卖。」","「和约的事,从今晚起你我一条船。」他说,「你在桌上撕,我在底下按住那些要掀桌子的。」他顿了顿,「记住分工。你要是嫌撕得慢,自己上了街——那我按的,就是你。」"] } } ], /* ═══ NSDAP ═══ */ nsdap: [ { id:"nsdap_rally", label:"问问他,他的集会打算开到多大", effects:"NSDAP信任+4", delta:4, extra:{}, resp:{ lo:["他盯着你,忽然笑了。「你怕了。」他往前倾身,「你问集会开多大,说明你夜里在数我们的人。数得不错吧?比你国会里的人多。」他直起身,「接着数。」","「开到多大,不看我,看你。」他张开手,「你们每关一张报,禁一次会,我下个月就大一圈。你们要是装聋,我就一直喊到你们耳朵疼。」"], mid:["「上个月三场,最大的那场四千人。」他随口说,像报账,「坐不下就站着,站着站着就站齐了。」他看着你,「人站齐了是什么样子,你该来看看。看完了你就明白,为什么大老板们开始给我寄钱。」","「规模是算出来的。」他敲了敲太阳穴,「一个点养三百人,一年翻一番。」他看着你,「你算算,翻到哪一年,就不用我替你算了。」"], hi:["他把一份油印的单子推过来。「下季度的排期,十四个城市。」他指尖点着其中三个,「这三个,各配一支纠察队。你看,我不是在办会,我是在铺网。」他盯着你的眼睛,「这张网铺到头的那天,你希望我坐在桌子的哪一边?」","「你问这个,是想要我的准数。」他把身子凑近,「好,给你准数:再给我两年不松手的年头,我的人就能填满任何一座会场——包括你那个国会。」他直起身,「这两年,你我最好谈得拢。」"], top:["「排期表给你看,是因为我要你早做打算。」他压低声音,声音里却压着兴奋,「十四个城市走完,我就是全国数得上的一支力量。到那天,我给你的不是威胁,是价码。」他盯着你,「现在就想想,你要什么价。」","「集会的账我对你实说。」他说,「人、场地、钱,三样我都够了,只缺一样:一个肯把门开条缝的对手。」他看着你,「你可以不开门。但门关死了,里外都得塌。你我都不想塌。这话你带回去,慢慢想。」"] } }, { id:"nsdap_street", label:"问问他,街头打架算不算章程的一部分", effects:"NSDAP信任+4", delta:4, extra:{}, resp:{ lo:["他把椅子往前拖了半尺。「打架?」他几乎凑到你脸上,「你们的水炮在冬天浇过我们的人,你们的棍子也没闲着。」他直起身,「现在你管这叫打架?我管这叫上课。」","「章程?」他笑了,「章程在他们的口袋里——共产党的、社会民主党的,一人一本。就我们没有。」他把手按在桌上,「所以街上谁动手,全看谁先忍不住。」"], mid:["「纠察队是我立的规矩:不许先动手。」他难得讲得像回事,「但规矩管不住挨了打的人。你让我的人挨打不还手——」他摊开手,「你来当这个家试试。」","「上个月伤了多少人,双方的数我都有。」他从怀里摸出个小本,晃了晃,「我不给你看。我只告诉你一句:先动手的那一边,数目对不上你们报上的。」他合上本子,「谁在撒谎,你自己想。」"], hi:["他把小本翻开,推过来。「左边三个区,红方先动手七次,我们两次。」他指给你看,「这两次,是我下的令——因为再忍下去,人会散。」他把本子收回去,「你记下这一天:我管得住街上的人,也管得住他们不动。这个本事,全柏林只有我有。」","「你要禁我的人,禁得掉——你们试过。」他看着你,「禁完一个月,街还是那条街,人还是那些人,只是没了管的人。」他往前凑了凑,「街上那口气散不掉,只换罐子。我至少是个结实的罐子。这话你品品。」"], top:["「我把话放在明处。」他压低声音,「街上的事,我一封信能停,一封信也能起。你要的秩序,我可以替你买,价签你自己写。」他直起身,「但价签要公道。公道的价签,比十个警察分局都管用。」","「打不打,从今往后先问你一句。」他说得极慢,「你不许,我就停——停得住,因为我说了数。」他盯着你,「但你也记着:我停我的,共产党停他们的吗?停不住。停不住的那部分,别算在我头上。」"] } }, { id:"nsdap_money", label:"问问他,那些钱是从哪儿来的", effects:"NSDAP信任+4", delta:4, extra:{}, resp:{ lo:["他眯起眼,笑意从嘴角爬上来。「你在查我的账?」他把椅子拉得更近,「好兴致。你们的警察查了三年,查出来的账比我的还干净。」他直起身,「要不要我借你两个调查员?」","「钱?」他摊开手,「工人的马克,店主的马克,还有一位不愿露名的老先生的马克。」他笑得很慢,「你不也收财团的捐吗?你收得,我收不得?」"], mid:["「账目我不给你看,看了你更睡不着。」他半真半假地说,「我只能告诉你结构:会费打底,报纸养人,大户的捐做急用。」他看着你,「三根柱子,倒一根,我还站着。你倒一根试试。」","「你的意思是,我的钱脏。」他盯着你,忽然笑了,「对,有脏的。你的呢?鲁尔那笔特别费,走的是哪本账?」他不等回答,摆摆手,「算了。这世道,干净的钱办不成事。你我办的,都是事。」"], hi:["「我给你三个来路,听完就忘。」他压低声音,「啤酒馆的铜盘,一天一千二百处;党报的发行,自己滚自己;再就是几个怕红色的厂主,按月打过来,比会费还准时。」他看着你,「第三路最粗。哪天他们觉得我不好用了,就细了。所以我不靠它吃饭。」","「你在打听我的钱,我也在打听你的。」他忽然说,语气平常得吓人,「你的特别经费走国防军的账,国防军的账再走谁的账,我都有个大约数。」他把小本收进兜里,「咱们俩,谁也别去动谁的账。这才叫懂事。」"], top:["「账目给你看一个数就够了。」他伸出三根手指,「一年,三百万。够养三份报、两千个全职、一支纠察队。」他把手收回去,「这个数会涨。涨到哪天你受不住了,咱们再谈怎么分桌上坐——记住,是分桌,不是并桌。」","「我的钱路,全德没有人比我更清楚。你是第二个。」他盯着你,「这份知道,值钱,也掉脑袋。」他顿了顿,「往后你查别人,先来问我一声——我给你指哪本账是死的,哪本账后头站着人。」"] } } ], /* ═══ 军方 ═══ */ army: [ { id:"army_east", label:"问问他,东边的边境如今怎么守", effects:"军方信任+4", delta:4, extra:{}, resp:{ lo:["他抬眼看了你一下,又回到地图上。「东边的防务,」他说,「是国家机密。」他用尺子在地图上划了一道线,「你签你的字,我守我的线。」","「你问防务。」他终于抬头,「你的国防部今年的预算案,砍了我们要塞保养费的四成。先把这个签回去,再来谈东边。」"], mid:["他把地图卷起一角。「东边现在守的是纸。」他说,「界桩、海关、警察,再加一道口头抗议。」他看着你,「纸后面什么时候换成兵,取决于你什么时候肯把裁军案的墨水收一收。」","「波兰人的动员令,从签发到部队,要十一天。」他伸出一根手指,「我的,只要四天。中间差的七天,就是要塞、铁路和你的拨款。」他把尺子放下,「这三样,一样都别再砍。」"], hi:["他把另一张地图摊开,比刚才那张细得多。「东线三个要塞群,两个是空壳。炮位浇了水泥,炮是木头画的。」他指给你看,「你不是要实话吗?这就是实话。填实它,要两年、一笔专门款项、国会里没人喊。」他看着你,「三样你都能给,我给你看下一张图。」","「东部边境的哨所,冬天有一半烧不上煤。」他说得很平,「士兵在界桩边上跺脚,对面在看。」他顿了顿,「你问怎么守——先把煤发了。士气这个东西,烧的不是汽油。」"], top:["他把门掩上,回来从最里层的抽屉取出一卷图。「真正的部署,只在这张图上:三道防线,两支机动兵力,决战线在这里。」他的手按在图上,「这张图,从今晚起你有一份副本。条件:你的办公室每换一个主人,这张图就得多一分小心。别让它在烂手里。」","「东边的守法,我早想好了,一直没人可讲。」他把图收起来,「你既然问到了这个深度——每月第一个星期二,你来,我把图摊开,给你讲一个钟头。」他看着你,「军队等一个懂图的文官,等了五年。」"] } }, { id:"army_quota", label:"问问他,十万人够不够用", effects:"军方信任+4", delta:4, extra:{}, resp:{ lo:["「十万够不够?」他从鼻腔里出了一点气音,「这个问题,凡尔赛那张桌子替你答过了。你签的字。」他重新低头,「去问他们。」","「够不够,看打谁。」他抬眼,「打波兰,够三天;打法国,够半天;打自己人——」他停了一下,「1919 和 1920 年,你们已经试过了。」"], mid:["「十万人的架子,装的是四十万人的魂。」他难得解释了一句,「军官、军士,都在这十万里头。架子在,扩起来就快;架子散了,给你四十万也是溃兵。」他把钢笔摆正,「所以裁哪里都可以,别裁骨架。」","「账是这么算的。」他抽出一页纸,「十万现役,十万警察,十万准军事——三笔账分开看,每一笔都合法。合起来看——」他把纸转过来推给你,「你自己合起来看看。看完,你就懂我为什么夜里有会。」"], hi:["「我给你交个底。」他把声音压下来,「十万的兵员额底下,还挂着一本不领饷的册子。三个月前测过,能拉出六万人。」他盯着你,「这本册子存在一天,凡尔赛的监察就睁一只眼闭一只眼。哪天它死在纸面上,那才是真危险。」","「你要问的不是够不够,是像不像样。」他说,「现在的陆军是个只剩骨架的病人——穿得体面,跑不动。」他把一页数字推过来,「一年三千名新军官的名额,批慢了,骨架也要老。你的签字,比我的命令好使。」"], top:["「骨架的底细都在这里,包括那本不领饷的册子。」他把一册蓝皮簿按在你手边,「你拿着。从今往后,扩到哪一步、藏在哪儿——你知道,我知道,再没有第三个人全知道。」他看着你,「护住它。护住了,德国就有明天。」","「十万人是地上的事,地上听你调。」他说,「天上的课、天上的图,还有那本册子——从今晚起,也算你一份。」他把肩章扶了扶,「这份分量,你的前任一个都没接过。接稳了。」"] } }, { id:"army_fund", label:"问问他,那笔说不清来路的经费在养什么", effects:"军方信任+4", delta:4, extra:{}, resp:{ lo:["他的脸一点没变。「什么经费?」他把地图翻了一页,「你的问题不存在。」他翻过下一页,「下一个问题。」","「说不清来路的钱,」他重复了一遍你的话,第一次正眼看你,「养得清去路的东西。」他等了两秒,「这个答案,你敢往会上带吗?不敢。所以这个问题,你从来问不得。」"], mid:["「你真想知道,还是想知道到能签字的深度?」他把钢笔搁下,「两个深度,两个答案,两个后果。」他看着你,「想清楚,再选。」","「那笔钱养的东西,名字你在报上都见过:驻外武官的客饭,试验场的租约,不领饷的讲师。」他把一页没有抬头的清单推过来半寸,「每一项都合法——单独看。连起来看的那本账,不存在。你也别去问它存在不存在。」"], hi:["他起身把窗帘拉严。「账目分七路进来,五路出去。」他的声音压到最低,「进来的五路,经手人的名单在这里。」他把一页纸按在桌上,手没有松,「出去的,一半是那本不领饷的册子,一半在东边。你现在退出去,还来得及当没看过。」","「这笔钱替你挡过事,也替你埋过事。」他坐回去,语气平得像在报天气,「1920 年那夜,开进城的队伍在市郊停了两个钟头。那两个钟头,就是拿这笔钱买下来的。」他看着你,「不买的话,你的共和国当晚就换了门庭。这笔账怎么记,是你的事。」"], top:["「七路的账全在这里,连经手人的代号都有。」他把那册簿子按在你手边,「从今晚起,你是唯一看得全的文官。」他站起身,「记住两件事:这册子不许出你的保险柜;这钱的事,永远不存在第二次审计。」","「你要签字的每一笔,我提前一天送到。」他说,「看不懂的标记,问我;不放心的人,换。钱不干净,我用干净的法子花它——这是我能给你的全部坦白。」他把门打开,「条件谈完了。回吧,明天开始。」"] } } ] }>>\ <</if>>\ <</widget>> /* ---------- party-topic-respond:取一条话题回应(按信任档映射冷/中/热/盟) ---------- 用法:<<party-topic-respond _pid _tid _tier>> 输出 $ret */ <<widget "party-topic-respond">>\ <<silently>> <<party-topics-init>> <<set _tr_pid to $args[0]>> <<set _tr_tid to $args[1]>> <<set _tr_tier to $args[2]>> <<set $ret to "">> <<if $pc_topics[_tr_pid]>> <<for _tri to 0; _tri lt $pc_topics[_tr_pid].length; _tri++>> <<if $pc_topics[_tr_pid][_tri].id eq _tr_tid>> <<set _tr_resp to $pc_topics[_tr_pid][_tri].resp>> <<set _tr_band to "top">> <<if _tr_tier lte 2>><<set _tr_band to "lo">> <<elseif _tr_tier eq 3>><<set _tr_band to "mid">> <<elseif _tr_tier eq 4>><<set _tr_band to "hi">> <</if>> <<if _tr_resp and _tr_resp[_tr_band]>> <<set _pool to _tr_resp[_tr_band]>> <<pool-pick "ptop_" _tr_pid "_" _tr_tid "_" _tr_band>> <<set $ret to $pool_pick>> <</if>> <</if>> <</for>> <</if>> <</silently>>\ <</widget>> /* ---------- party-chat2:会面对话分层选项渲染器 ---------- 用法:<<party-chat2 "spd">> 在 Scene_Visit_XX 中调用(替代旧 party-chat)。 按当前信任档生成选项:chat/push 各档都有;deep(谈私事)二档起解锁; 谈正事($pc_topics 每党 3 个专属话题)各档都有,渲染在 push 之前。 */ <<widget "party-chat2">>\ <<silently>> <<party-converse-init>> <<party-topics-init>> <<set _pk to $args[0]>> <<set $talk_key to "party_chat_" + _pk + "_" + $date.year + "_" + $date.month + "_" + $date.day>> <<set $talk_pid to _pk>> <<set _pc_done to false>> <<if $flags[$talk_key]>> <<set _pc_done to true>> <</if>> /* 信任档(用实时 trust,未点选项时即当前档) */ <<set _pc_trust to ($npcs[_pk] and $npcs[_pk].trust) ? $npcs[_pk].trust : 0>> <<set _pc_tier to 3>> <<if _pc_trust lte 20>><<set _pc_tier to 1>> <<elseif _pc_trust lte 40>><<set _pc_tier to 2>> <<elseif _pc_trust lte 60>><<set _pc_tier to 3>> <<elseif _pc_trust lte 80>><<set _pc_tier to 4>> <<else>><<set _pc_tier to 5>><</if>> /* 党显示名(备用,避免依赖外部映射) */ <<set _pc_names to { spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"国防军" }>> <<set _pc_pname to _pc_names[_pk]>> <<set _pc_back to "Scene_Visit_" + (_pk eq "army" ? "Army" : (_pk.charAt(0).toUpperCase() + _pk.slice(1))) >> <<if _pk eq "zentrum">><<set _pc_back to "Scene_Visit_Zentrum">><</if>> <<if _pk eq "nsdap">><<set _pc_back to "Scene_Visit_NSDAP">><</if>> <<if _pk eq "kpd">><<set _pc_back to "Scene_Visit_KPD">><</if>> <<if _pk eq "ddp">><<set _pc_back to "Scene_Visit_DDP">><</if>> <<if _pk eq "dvp">><<set _pc_back to "Scene_Visit_DVP">><</if>> <<if _pk eq "dnvp">><<set _pc_back to "Scene_Visit_DNVP">><</if>> <<if _pk eq "spd">><<set _pc_back to "Scene_Visit_SPD">><</if>> /* 决定 deep 档是否可用及其档位:二档起解锁,档位=min(当前档,5)。 deep 内容按解锁到的深度走:2-3档=fear,4档=want,5档=memory。 但既然 deep 选项文本已按档写好,这里直接取当前档(2-5)的 deep 条目。 */ <<set _pc_depths to ["chat","deep","push"]>> <</silently>>\ <<if _pc_done>>\ //你今天已经和他谈过了。有些话不必每天重复,明天再来。//\ <<elseif $tp lt 1>>\ //你今天已经很累了,说不动话了。真正有用的谈话需要时间——而你没有。// <span class="txt-muted">(谈一次要 1 点行动力 · 你一点不剩。话明天还在。)</span>\ <<else>>\ /* 记忆回响:他先提起旧事(兑现的承诺/违约的账/大恩大怨),然后才是选项 */ <<memory-flush _pk>>\ ''你想和他说什么:'' <<for _di to 0; _di lt _pc_depths.length; _di++>>\ <<set _pc_depth to _pc_depths[_di]>>\ /* deep 仅在二档及以上解锁 */ <<if _pc_depth eq "deep" and _pc_tier lt 2>>\ /* 不解锁:显示一句钩子 */ //(他还没有把你当成可以说心里话的人。)//\ <<else>>\ /* 谈正事:push 选项之前,先渲染本党 3 个专属话题 */ <<if _pc_depth eq "push">>\ <<set _pc_tlist to ($pc_topics and $pc_topics[_pk]) ? $pc_topics[_pk] : []>>\ <<if _pc_tlist.length gt 0>>\ ''谈正事:'' <<for _ti to 0; _ti lt _pc_tlist.length; _ti++>>\ <<set _tpc to _pc_tlist[_ti]>>\ <<capture _tpc>>\ <<link _tpc.label "Scene_Party_Talk">> <<set $talk_pid to _pk>>\ <<set $talk_depth to "topic">>\ <<set $talk_topic to _tpc.id>>\ <<set $talk_tier to _pc_tier>>\ <<set $talk_label to _tpc.label>>\ <<set $talk_effects to _tpc.effects>>\ <<set $talk_delta to _tpc.delta>>\ <<set $talk_pname to _pc_pname>>\ <<set $talk_back to _pc_back>>\ <<set $talk_ask to "">>\ /* 信任结算:走低语道(吃每日/每周上限),话题固定为正增量 */ <<trust-capped _pk _tpc.delta>>\ <<tp-spend 1 2>>\ /* 世界/心理/政府信誉副作用(当前话题 extra 均为空,保留通路) */ <<if _tpc.extra and _tpc.extra.w>>\ <<for _wk, _wv range _tpc.extra.w>>\ <<set $world[_wk] to Math.max(0, Math.min(100, $world[_wk] + _wv))>>\ <</for>>\ <</if>>\ <<if _tpc.extra and _tpc.extra.p>>\ <<for _pk2, _pv range _tpc.extra.p>>\ <<set $player.mental[_pk2] to Math.max(0, Math.min(100, $player.mental[_pk2] + _pv))>>\ <</for>>\ <</if>>\ <<if _tpc.extra and _tpc.extra.gov>>\ <<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + _tpc.extra.gov))>>\ <</if>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|_tpc.effects)// <</capture>>\ <</for>>\ <</if>>\ <</if>>\ <<set _pc_entry to ($pc_options[_pk] and $pc_options[_pk][_pc_depth]) ? $pc_options[_pk][_pc_depth][_pc_tier] : null>>\ <<if _pc_entry>>\ <<capture _pc_depth _pc_entry _pc_tier>>\ <<link _pc_entry.label "Scene_Party_Talk">> <<set $talk_pid to _pk>>\ <<set $talk_depth to _pc_depth>>\ <<set $talk_tier to _pc_tier>>\ <<set $talk_label to _pc_entry.label>>\ <<set $talk_effects to _pc_entry.effects>>\ <<set $talk_delta to _pc_entry.delta>>\ <<set $talk_pname to _pc_pname>>\ <<set $talk_back to _pc_back>>\ <<set $talk_ask to (_pc_entry.ask ? _pc_entry.ask : "")>>\ /* 信任结算:走低语道(吃每日/每周上限),逼问除外(负值不限) */ <<if _pc_entry.delta lt 0>>\ <<trust-capped _pk _pc_entry.delta>>\ <<else>>\ <<trust-capped _pk _pc_entry.delta>>\ <</if>>\ <<tp-spend 1 2>>\ /* 世界变量副作用 */ <<if _pc_entry.extra and _pc_entry.extra.w>>\ <<for _wk, _wv range _pc_entry.extra.w>>\ <<set $world[_wk] to Math.max(0, Math.min(100, $world[_wk] + _wv))>>\ <</for>>\ <</if>>\ /* 心理变量副作用 */ <<if _pc_entry.extra and _pc_entry.extra.p>>\ <<for _pk2, _pv range _pc_entry.extra.p>>\ <<set $player.mental[_pk2] to Math.max(0, Math.min(100, $player.mental[_pk2] + _pv))>>\ <</for>>\ <</if>>\ /* 政府信誉副作用 */ <<if _pc_entry.extra and _pc_entry.extra.gov>>\ <<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + _pc_entry.extra.gov))>>\ <</if>>\ /* 主动问档案:计数 +1(不碰事件线的 party_affinity_count) */ <<if _pc_entry.ask>>\ <<if not $party_asked>><<set $party_asked to {}>><</if>>\ <<if not $party_asked[_pk]>><<set $party_asked[_pk] to {fear:0, want:0, memory:0}>><</if>>\ <<set $party_asked[_pk][_pc_entry.ask] to $party_asked[_pk][_pc_entry.ask] + 1>>\ <</if>>\ <<set $flags[$talk_key] to true>>\ <</link>>\ //(花费1行动力|_pc_entry.effects)// <</capture>>\ <</if>>\ <</if>>\ <</for>>\ <</if>>\ <</widget>>
/* ============================================================ 魏玛对话系统 V2(状态 × 信任度 十档矩阵) ------------------------------------------------------------ 核心:四状态(平静/焦虑/麻木/裂变)× 信任度十档(0-100) 信任度 = $npcs.weimar.trust(魏玛对玩家的信任) 状态判定(weimar-v2-state): - 裂变:张力 >= 阈值*0.8 - 麻木:疲惫 >= 70 - 焦虑:焦虑 >= 30 - 平静:其余 信任档位(weimar-v2-tier):tier = ceil(trust/10),钳制 1-10 代词一律用「他」。 ============================================================ */ /* ---------- weimar-v2-init:初始化全部文本数据 ---------- 用法:<<weimar-v2-init>>(在对话入口调用,幂等) */ <<widget "weimar-v2-init">>\ <<silently>> <<if not $weimar_v2>> <<set $weimar_v2 to { /* ═══ 平静 · 十档 ═══ */ calm: { 1: [ "椅子是冷的,我坐了一整天也没暖起来。你坐吧,冷的话就站着说。", "文件我看了,没签。不签和签的区别,我还在想。", "窗外有只灰鸟,它停了一会儿,看了我一眼,然后飞走了。它看我的时候我有点不舒服。", "你进来的时候我在数墙上的砖,数到七十三就忘了。数乱倒没有,我就是不想数了。你来了我就停了。" ], 2: [ "你签完了?那支笔看起来有点沉,你手不酸吗?", "这几天有会议,我会去。谈不上想去,只是「不去」比「去」更麻烦。我不想解释。", "有人让我表个态,我说了,他们也点了头。那就行了,本来也没人当真。", "墨水瓶快见底了,我一直在想,等它干了之后,会不会有人递新的来。我还在等。" ], 3: [ "刚才走廊里有人走过去,脚步声比以前快了不少。你觉得那是什么意思?我没问,我在等你先说。", "报纸上有一行字被划掉了,不知道是谁划的。印出来的部分我都读完了,划掉的那段我还在想。", "你今天说话的语气和昨天不太一样。我说不上来哪里不一样,你进门的时候我就感觉到了。" ], 4: [ "今天可能会不一样。我不确定,只是还愿意等几个小时看看。你不会笑我吧。", "我猜到你会来。你来了之后我又在想,你是为了某件事来的,还是只是习惯了。", "窗台上那盆花,我总觉得它早就死了。它还在那儿,叶子没掉,也没长出新的。我差不多也是这样。", "我在想,如果今天什么都不做,明天会不会反而轻一点。还是说,什么都不做本身就是一种很重的事。" ], 5: [ "今天的消息我大概能猜到是什么。我不抱希望,还是会看完,总归要看完的。", "走廊里有人笑了一声,很短,一下没忍住的那种。我听见了,没有跟着笑,那一声在我脑子里停了一会儿。", "窗玻璃上有水痕,不知道是雨还是雾。它们一直在那儿,没离开过。我也一样。", "你走了之后我还是会把窗关上。开着的时候,总觉得外面有人在听。" ], 6: [ "今天有一件事,算不上好也算不上坏,我记下来了。最近我开始记一些小事了,不知道是好是坏。", "窗帘被拉开了一些,不知道是谁拉的。我注意到了,这种细节我很久没注意到了。", "你刚才说话的时候停了一下,我以为你会改口,结果你没有。这让我觉得安心,比你想的更安心。", "窗外有人喊了一声,我没听清内容,那种声音很久没听到了。有人在路上走着走着就喊了出来,没有理由。" ], 7: [ "我想告诉你一件事。不是什么重要的,也不急。等我想好怎么说了,我再告诉你。", "今天我坐在椅子上什么也没做,也没有觉得不安。听起来不算什么,我已经很久没有这样了。", "我们之间,今天好像比昨天安静了一点。叫人不舒服的那种安静过去了,现在是另一种。", "你下次来的话不用敲门,我没有在等别人。" ], 8: [ "我昨晚做了一个梦。梦见我在一个我没去过的房间里,我不知道自己为什么会在那儿,却没有害怕。醒来之后我坐了很久,一直在想那个房间的样子。", "今天翻到一份旧文件,看到去年写的一行字,我盯着看了很久,不记得自己写过那些。那行字比我想象的更像我。", "你刚才说的那些话,我没有需要补充的。我想到的你都说到了,再开口就是重复。" ], 9: [ "我外面走了一圈。没什么理由,就是想走。走了很久,天黑了才回来,回来的时候你还在。挺好的。", "我最近睡得比以前好一些。外面没有变安静,只是我睡前不再去检查门锁了。我不知道这算不算好消息,反正我没那么累了。", "那个人今天又站在走廊里了。我没去问他等谁。他大概只是在等一个不需要理由的东西,跟我也差不多。" ], 10: [ "你来的时候我在想,如果有一天我什么都不用想了,那我大概还会记得今天这个下午。不是发生了什么,是你来了。", "我现在看窗外,不为看外面。我要确认自己还在屋里,还有一扇可以关的窗。你来了之后,这个确认没那么重要了。", "你走以后我还是会把窗留一条缝。不为等谁。我知道你明天还会来敲门。这件事我想过很多次了,我还是这么觉得。", "我知道这个国家会走到哪里去,你也看得出来。我不怕了。说不上有了答案,只是不再一个人等了。" ] }, /* ═══ 焦虑 · 十档 ═══ */ anxious: { 1: [ "你来了。你听见了吗?我总觉得走廊里有人在拖东西,每次开门都没有。你觉得是我想多了吗?", "马克又跌了,你不用告诉我数字,我每次都能感觉到,骨头被拧紧了一下。", "我今天坐在椅子上,椅子在晃。地板没有问题,是我。", "你说话的时候我听见了,脑子里还有另一个声音在同时说,我分不清哪个是你说的。" ], 2: [ "我签了,签名是直的,我确认了三遍。签字的时候手在抖。", "我感到窗外有人站着,不知道站了多久。我不敢看,能感觉到他还在。", "今天的报纸我翻了三遍,头版看了三遍,我不记得我读了什么。你读了吗?告诉我。", "你注意到今天的灯比昨天暗了一点吗?你没有看错,它是真的暗了。" ], 3: [ "窗台上有一道裂纹,上次看还没有这么长。它是什么时候变长的,我说不清。", "你刚才敲门的声音和昨天不一样,快了一点,也重了一点。你在急什么?", "我拧开墨水瓶的时候手滑了一下,洒了几滴。墨水在桌面上渗开的形状不太对,纸底下像有什么东西在动。", "我没睡好。睡不着倒还好。睡着了之后做的梦,比醒着的时候更吵。" ], 4: [ "我今天已经数了七次窗外的鸽子了,每次都是四只。我总觉得第五只会在什么时候突然出现。", "你昨晚来过吗?半夜我听见有脚步声,没敢开门确认。", "办公室的那盆花的叶子开始卷了,我浇过水。记不清是今天浇的还是昨天浇的。", "我试着闭眼休息了一会儿,一闭上眼就看到门缝底下透进来的那条光,觉得它在动。" ], 5: [ "我们之间是不是隔了点什么?我说不清。今天你说话的时候,我总觉得声音传过来之前被人接了一下。", "街角有人喊了一声,我马上站起来走到窗边,外面什么也没有。我的反应太过了?我知道。", "我刚刚一直在想,如果我今天什么都不做,明天会不会不同?这个问题我已经想了三周了。", "什么最让我累?不是有事做,是等待。" ], 6: [ "我今天一直在等一个电话,电话没响。我不知道我是在等好消息还是坏消息。没响比响了更让人不安。", "我试着整理桌上的文件,理了三遍还是乱的。问题出在我眼睛上,看不清了。", "你刚才说到一半停了一下,我以为你要说什么重要的,结果你没有。我一直在想你那半句话。", "我感觉我在被什么东西追着,回头的时候什么也看不见。这种感觉比看得见更可怕。" ], 7: [ "我昨晚做了一个梦,梦见自己在跑,脚落下去的时候地面是软的,跑不快,我醒了之后腿还在抖。", "我今天在走廊里站了一会儿,一个人都没有经过。我以前会为此松一口气,现在不会了。", "你下次来的时候能稍微大声一点吗?脚步声太轻,我会以为是别人。", "我试着把窗关紧,总觉得风还是能渗进来。风没有问题,是我。" ], 8: [ "我今天做了一件很蠢的事,反复检查了三次墨水瓶有没有拧紧。我知道它是紧的,还是去检查了。", "我不确定我是在焦虑事情本身,还是在焦虑我感知到的事情的样子。", "你在的时候我稍微好一点。不是说你不在了我就不好了,你在,我会少看一次门缝。", "我最近开始注意别人看我的时间长短了。你上次看了我五秒,不是三秒。" ], 9: [ "我今天握笔握得很紧,松开的时候指节是白的。这是不是很不正常?", "我在想,我这种状态你会不会觉得烦。你烦的话可以直接告诉我,我不怕听真话,我怕的是你假装没事。", "我试着深呼吸了几次,每次吸到一半就开始想接下来那一半会不会不够。这听起来是不是很傻?", "你来了之后我的焦虑没有消失。它变得可以说了。" ], 10: [ "我今天在走廊里又听到了那种声音,这次我没有去确认。我想让它留在那里,我不过去。", "我握着笔的时候,手还是会抖。我已经不会因为手抖而停下来等它不抖了。", "这件事我没有告诉过任何人:我最近在睡前会把门打开一条缝。不为听什么。我要确认自己还能决定开或关。", "你在这里的时候,我就不太想去看窗台了。因为我知道,你在看的那个方向是我愿意看的。" ] }, /* ═══ 麻木 · 十档 ═══ */ numb: { 1: [ "你来了。门开了我才知道是你。", "我坐了很久,没看窗外,没看文件,也没看自己的手。", "你说什么都可以,我不太确定自己还能接住多少。" ], 2: [ "桌子上的那杯水我忘了喝,它也没少。", "今天的报纸我拿起来了,又放下了。字还能认,读不进去。", "有人敲门,我没问是谁。过了很久我才想起来,我忘了去问。" ], 3: [ "你上次来是什么时候?我不太记得了。说没多久也行,说过很久也行。", "我坐了一会儿,以为是一会儿,结果天已经暗了。", "昨天和今天,我分不太清。它们叠在一起,像没晾干的纸。" ], 4: [ "窗台上有灰,我看见了。也想着擦,拿起布之后又放下了。", "我想想有没有什么高兴的事。想了,没有。也许有,只是我碰不到它们。", "我在跟一种很安静的东西待在一起。它不吵,也不走。" ], 5: [ "水管一直在滴水,滴了很久了,我从来没找到过那个水龙头在哪里。现在也不想找了。", "窗外的天是灰的。我想不起上个月是什么颜色了,可能上个月也是灰的。", "我试着去回忆「生气」是什么感觉,想了半天,想不起来。" ], 6: [ "昨天有一件什么事,我应该记着的。我想了想,想不起来。应该不重要吧。", "我刚才想跟你说一件事,开口了,忘了要说什么。你帮我记一下吧,我回头再问你。", "我开始用「忘了」来替代一些别的词了。我也不知道这算不算进步。" ], 7: [ "我累了。今天的疲惫是旧账,今天只是把它说出来了。", "我坐在这里,偶尔会觉得自己不在这里。人还坐着,某种东西已经走了。", "你来的时候我听到门响了。我还没有准备好确认那是不是你。" ], 8: [ "你来了之后我会说话。不是你要我说什么。是你来了之后,我还能感觉到「你在」和「你不在」是有区别的。", "我今天擦了一下窗台。不因为它脏,是我看了它一眼,心里动了一下。很久没有过了。", "我跟自己说过很多次「明天会不一样」,这句话被我嚼得太久了,已经不像话了。" ], 9: [ "我刚才看了一眼窗外,发现雪停了。我不知道它是什么时候停的。", "我本来想跟你说「今天没什么好说的」。这句话说出来的时候,我已经说了点什么了。", "你坐过的地方,椅子上还有一点温度。我伸手碰了一下,还能感觉到。你还没走太远。" ], 10: [ "我今天在窗边站了一会儿,不为出去,想看看自己还想不想出去。答案是还想。", "你来了我才发现,我刚才一直在等你来。", "我不知道我还能不能变成以前那个什么都感觉得到的人。你在这里的时候,我觉得我在慢慢地、很慢地,变成一个人。" ] }, /* ═══ 裂变 · 十档 ═══ */ fracture: { 1: [ "走廊里有人说话,我听了一会儿才发现,是我自己在说。", "我分不清现在和1918年的声音了。它们在同一个地方响,叠在一起。", "有人喊了一个名字,我回头。身后没有人。" ], 2: [ "窗玻璃上有一张脸,我盯着看了很久。不是我自己的脸,我认识它。", "地板上有水,我不知道从哪来的。它在往门缝那边渗,势头不对。", "我听见钟声了。我不知道它想告诉我什么。" ], 3: [ "我坐在椅子上。我不确定坐的是这把椅子,还是别的什么地方的一把。", "我看见了1919年那天。它和现在的光叠在一起,我不确定哪一层是真的。", "有一件事我记得很清楚,就是不确定那件事有没有真的发生过。" ], 4: [ "我在跟自己说话。我不确定那个「自己」是谁。他说的有些事我从来没告诉过别人。", "我翻了一下桌上的文件,上面的字我能认,连起来之后说的像是另一件事。", "我试着站起来,站到一半忘了自己要做什么。" ], 5: [ "我在房间里,能听到外面的声音。以前的那些声音。它们从墙里面渗出来。", "窗帘被风吹起来,我盯着看了一会儿。我觉得风里有什么东西在看我。", "我数了一下房间里的影子。比应该有的多了一个。" ], 6: [ "我昨天做了一个梦。我不确定那是梦,还是我今天忘了的事情。", "我伸出手去拿笔,笔离我很远,手已经伸过去了,伸到一半的时候我停了,因为我不知道我是在拿笔还是别的什么东西。", "我看了一眼窗外,我记得刚才不是这样的。" ], 7: [ "走廊尽头站着什么。我没看它,我知道它在。它没有走,也没有走近。", "我试着让自己别去想那个方向,视线自己往那边移。", "我今天没有去确认那扇门有没有锁,因为我怕确认完了发现它本来就是开的。" ], 8: [ "我在跟你说话的时候,还有另一个声音在说别的事。它在说我听不见的事。", "你能帮我确认一下吗,我是不是还在这个房间里?我有时候不确定。", "我不害怕那个走廊里的东西。我怕我开始习惯他在那里。" ], 9: [ "你在这里的时候,声音会小一点。没有真的变小,是我能分出哪个是你的声音。", "我握住笔的时候,手是凉的。我分不清那是我自己的温度,还是别的什么温度。", "我试着记住你刚才说的话。我在记,怕我记的和你说的不是同一句。" ], 10: [ "我还在。我知道我在。我不确定「在」是什么意思了。你告诉我吧,你说了我就信。", "我握着椅子扶手,确认它还是硬的。你站在那里,确认你还是你。我靠着这两件事坐在这里。", "走廊里的那个东西还在。我不怕了。你在这里的时候,他站着的地方,不再是我唯一能看见的地方了。" ] }, /* ═══ 玩家汇报文本库(R01-R19,按选择)═══ */ reports: { R01: {sign:"法军进鲁尔了。我签了罢工令。", delegate:"法军进鲁尔了。我还在想怎么处理。", oppose:"法军进鲁尔了。我没有签罢工令。"}, R02: {sign:"消极抵抗在国会过了。我投了支持票。", delegate:"那项授权在国会过了。我没有表态。", oppose:"消极抵抗在国会过了,我没投那一票。"}, R03: {sign:"埃森那边死了人。我打算强硬回应。", delegate:"埃森那边死了人。我还没想好。", oppose:"埃森那边死了人。我想先观望。"}, R04: {sign:"鲁尔那边抓了个军官。我打算介入。", delegate:"被捕的那个人,我还没决定怎么办。", oppose:"鲁尔抓军官的事,我不打算介入。"}, R05: {sign:"他被法军枪决了。我谴责了这件事。", delegate:"他被法军枪决了。我另外做了点事。", oppose:"他被法军枪决了。我没有表态。"}, R06: {sign:"柏林总罢工了。我认为工人有道理。", delegate:"柏林总罢工了。我没有站队。", oppose:"柏林总罢工了。我不同意这种方式。"}, R07: {sign:"DVP组阁了。我支持他。", delegate:"DVP组阁了。我想先看看。", oppose:"DVP组阁了。我不太看好他。"}, R08: {sign:"消极抵抗结束了。我同意了。", delegate:"消极抵抗结束了。我没有明确表态。", oppose:"消极抵抗结束了。我不同意。"}, R09: {sign:"我支持启用第48条。", delegate:"我签字了。心里不太确定。", oppose:"我不支持启用第48条。"}, R10: {sign:"巴伐利亚自作主张戒严了。我承认了。", delegate:"慕尼黑先斩后奏。我没说话。", oppose:"巴伐利亚先斩后奏,我没有承认。"}, R11: {sign:"克姆尼茨那边在开会。我在关注。", delegate:"那边的会还在开。我还在等。", oppose:"克姆尼茨在开会,我不太关心。"}, R12: {sign:"汉堡起义了。我认为他们有自己的理由。", delegate:"汉堡起义了。我没有表态。", oppose:"汉堡起义了。我反对这种方式。"}, R13: {sign:"萨克森的州政府被清掉了。我支持。", delegate:"军队进了萨克森。我没说话。", oppose:"萨克森的事,我反对。"}, R14: {sign:"慕尼黑暴动了。我支持强硬镇压。", delegate:"慕尼黑暴动了。我没决定。", oppose:"慕尼黑暴动了。我觉得可以温和一些。"}, R15: {sign:"统帅堂交火了。我谴责了暴力。", delegate:"统帅堂交火了。我另外做了点事。", oppose:"统帅堂交火了。我没有表态。"}, R16: {sign:"地租马克发了。我觉得是对的。", delegate:"地租马克发了。我想先看看效果。", oppose:"地租马克发了。我不太信。"}, R17: {sign:"他走了。我觉得可惜。", delegate:"他走了。我没说什么。", oppose:"他走了。我觉得还行。"}, R18: {sign:"马克破万了。我在关注这件事。", delegate:"马克破万了。我还在看。", oppose:"马克破万了。我觉得在意也没用。"}, R19: {sign:"通胀失控了。我很担心。", delegate:"通胀失控了。我在想办法。", oppose:"通胀失控了。我已经没什么感觉了。"} }, /* ═══ 历史事件回复(R01-R19,四状态)═══ */ events: { R01: { calm:"他们跨过边境了。我收到消息的时候,外面在下雨。我能感觉到那片土地在疼,不是比喻,那种沉闷的、持续的压力。你的选择,我不确定这是对的还是错的,我只确定这是我们唯一能做的事。", anxious:"他们进去了。我一直在等这个消息,真的听到的时候还是没准备好。消极抵抗,这个词听着像计划,其实是闭上眼睛往前走。法军不会因为工人罢工就走,他们只会更用力。我担心的是,工人能撑多久?钱能撑多久?", numb:"鲁尔。他们进去了。我听到这个消息的时候,觉得自己应该有什么感觉才对,结果什么都没有。工人会罢工,法军不会走,这件事会拖很久,然后结束,然后被忘掉。", fracture:"鲁尔……我好像听过这个词,在另一个时间里。我分不清那是真的记忆还是别的什么东西。法军跨过边境的时候,我感觉有什么东西也跟着跨过来了。我不确定那是什么。关于你的选择……我看见你的手停了一下。" }, R02: { calm:"283比12。大多数人投了赞成票,鼓掌的声音不算响。大概每个人都知道,他们刚批准的是一台印钞机。这是我能想到的最昂贵的武器。钱从哪来?从明天来。明天的马克今天已经不那么值钱了。", anxious:"我反复看了投票结果,283比12。这比我想的多。那些鼓掌的人是不是真的知道自己鼓的是什么?消极抵抗听着像一个计划,其实是把未来抵押了出去。你确定我们撑得住吗?我不知道该问谁,只能问你。", numb:"283比12。我看了数字,然后放下了。消极抵抗这个说法在我耳朵里已经没有形状了。国会做了决定,那就这样吧。", fracture:"我还记得另一种投票,很久以前的,不一样的人数,不一样的结果。掌声很像。消极抵抗,这个说法太轻了,听着像一件可以被撤销的事。有些事撤销不掉的。这你清楚。" }, R03: { calm:"埃森。法军开枪了。我收到消息的时候天还没黑,光线已经不太对了。工人们只是站在那里,手里没有武器。现在他们躺在那里了。你打算怎么回应?做决定不用急在现在,可是很快。消息已经传开了。", anxious:"埃森。工人死了。我看了电报三遍,数字没有变。他们只是站在那里,没有武器,没有防御。然后法军开了枪。我坐在桌前,不知道该写什么。谴责?抗议?我甚至不知道这些词还有没有用。你打算说什么?还是什么都不说?", numb:"埃森。我读到那个词的时候,没有特别的感觉。工人死了,法军开的枪。这种事发生得太频繁了,我已经不太能分得清哪一次是哪一次。你看着办吧。", fracture:"埃森。那画面我见过,不止一次,在别的地方,别的时间。工人站在那里,然后倒下。法军开的枪,穿的是另一种制服。时间有点乱,我记得倒下去的那个人,我记得他的表情。他还不知道发生了什么。" }, R04: { calm:"他们抓了一个人。前军官,在鲁尔搞破坏的时候被法军带走的。他会变成英雄,不是因为他做了什么。他被抓了,这就够了。在柏林,被敌人抓住的人比打了胜仗的人更好用。我没说你该救他,我只是说,你注意一下这个名字。", anxious:"他们抓了一个人,前军官。我听到消息的时候第一反应是:法军不会只抓一个人就走。他们会在他身上做文章,然后更多的事情会跟着来。我担心的是,他的名字会被记住,然后被变成别的东西……你最好也记住他。", numb:"他们抓了一个军官。我不太记得是上个月还是上周了,时间有点叠在一起。我没想太多,只知道他会被带到某个地方,然后被关起来。这种事情发生得太频繁了。", fracture:"那个人我见过,在另一个场景里。穿的是另一种颜色的制服,手里拿着东西。他们抓的不是他,抓的是一个名字。名字会在墙上停留一段时间,然后被另一个名字覆盖。我在想,我们会记得哪一个。" }, R05: { calm:"法军枪决了他。现在他不再是一个人了,他是一个旗帜,一个符号。右翼会把他举起来,举得很高,让所有人都能看到。我总觉得,活着的人的重量比死了的人更重,历史却总是先看到旗帜……你看着它升起来的时候,在想什么?", anxious:"他死了,法军动的手。我听到消息之后一直在想,他会不会知道自己会变成什么?他死了之后会变成一个名字,一个被反复念出来的名字,念到后来大家都忘了他是谁。我在担心的是,这个符号会不会被用来做我们不想看到的事。", numb:"枪决了。我听到的时候没有太多感觉。事情走到了这一步,然后他死了。接下来还会有更多的人死,也会有更多的人被记住。过一段时间,大家都会忘记他,跟以前的人一样。", fracture:"那个场景我见过。他没有站在那里被枪决,是在某条街上被带走的,然后消失了。我分不清那是我看到过的还是从别人那里听来的。时间在重复,面孔换了。我不确定我还能认出哪一张是哪一张。" }, R06: { calm:"柏林停了,没有电车,没有工厂的汽笛声,没有面包店开门的声音。我在走廊里走了一圈,一个人都没有。这种安静很贵。我不确定你该做什么。你站在空荡荡的街上的时候,会听到这个城市在说话,只是说得很慢。", anxious:"柏林停了。我走到窗口看了三遍,街上没有人,没有声音。这种安静跟平常不一样,是那种「所有人都停下来」的安静。他们在等什么?在等我们说点什么。你打算说什么?还是说,你打算走过去?", numb:"柏林停了。我最近会站在窗边看一会儿,街上确实没人……他们总会回来的,或者不会。我分不太清哪种更有可能了。", fracture:"柏林?我记得它以前不是这样的。它以前有另一种声音,另一种节奏。现在它停了。我站在走廊里,呼吸声听起来像另一个人的。我不知道是我变了还是它变了。" }, R07: { calm:"他们让DVP的人接了这个位置。我见过他几次,他说话的方式,每一步的落脚点都算好了。务实的人能活得久一些……我不知道他是在保护这个国家,还是在教我怎么在缝隙里呼吸。我希望他能证明我的怀疑是错的。", anxious:"DVP组阁了。一个我以为他不会这么快上台的人。他说话很流利,流利的东西有时候会滑掉。我不确定他能不能稳住局面,你最好看着他。他会做很多决定,每一个决定都会改变我们之间的位置。我有点不安,也不确定这是不是多余的。", numb:"DVP上台了。我看报纸上照片的时候记住了他的脸。接下来一段时间他会做一些事,然后离开。之前那些人都是这么走的。我甚至不太记得上一个是谁了。", fracture:"DVP。这个名字我见过,在另一份报纸上,在另一张桌上。也是这个人,穿着不同的衣服。他在说话,说的话我好像以前听过。不是内容,是节奏。我想起来了,是另一个人的声音。他们都在用同样的节奏说话。" }, R08: { calm:"消极抵抗结束了,是我们该跪下了。我听见膝盖落地的声音,它没有响得很重。可能大家早就知道会这样。我担心的是,站起来的人里面,还有多少愿意继续往下走。我看到你签了字,也知道你签的时候在想什么。", anxious:"消极抵抗没了,鲁尔的工人会回去上班,法军也不会走。我一直在想,这个决定是对的,这个对能撑多久?会不会让更多人觉得这个国家已经没力气了?我不知道该不该把这些话说出来。现在你看,我还是说出来了。", numb:"消极抵抗结束了。这不过是一件需要被了结的事,你做了,我也看了。那就这样吧。", fracture:"结束了。那种抵抗,那个词,那个想法。我总觉得我见过这个场景,在别的国家,别的时间。有些事结束了,剩下的部分却不是新的开始,算另一种延续。我分不太清我在说的是这件事,还是别的事。" }, R09: { calm:"用紧急法令保护共和国。共和国用紧急法令保护自己的时候,就已经在变了。我没有说你做得不对,只是要记住:每一次先例都在变轻。今天你用它来保护一些东西,明天别人就会用它来做别的事。", anxious:"这个法令一旦被写进文件里,就很难再收回去了。我知道这是为了保护现在的局面。以后的人会怎么用它?我担心的是,如果紧急成了常态,还有什么不是紧急的?你做决定的时候,手有没有抖一下?", numb:"第48条。当时我读了那一段,然后翻了过去。我不确定我还能不能判断什么是保护、什么是越界了。你决定吧。我没什么意见了。", fracture:"48。有一个数字我记得很清楚,是另一个年代的某种编号。紧急状态,我曾经听过这个词被念出来,在一个大厅里。我坐得很远,看不清说话的人的脸,我记得他的声音。那声音和你很像。" }, R10: { calm:"巴伐利亚在走自己的路。柏林的命令到了慕尼黑就变成废纸。我有时候不知道,这个国家还剩下多少个州是听指挥的,还有没有人愿意听。这件事不只是巴伐利亚的问题,是一道正在变宽的裂缝。", anxious:"巴伐利亚宣布戒严了。他们说自己管自己,不需要柏林点头。我听到消息的时候在想,如果每个州都开始自己做决定,国会还剩下什么?你打算怎么处理?强硬一点还是先放着?我不知道该怎么建议你,只希望你已经想过了。", numb:"巴伐利亚。我听到这个词的次数越来越多了,没觉得他离我近了还是远了。他只是在那里,一个不说话的人站在门口。我不确定该不该让他进来。", fracture:"巴伐利亚。那个地方,我去过,在梦里,或者在一张旧地图上。他们宣布了什么东西。我一直觉得他跟柏林之间有一段距离,不只是铁轨上的距离,还有别的什么东西。我分不太清那是什么。" }, R11: { calm:"KPD在克姆尼茨开会了。他们讨论武装起义,最后否决了。可是否决本身也是一种决定,它意味着有人在等。我一直在想、等和做,哪个更危险。他们选择了等。我不知道这是对的,还是只是比另一个选项慢一些。", anxious:"KPD开会了?我收到这个消息了,没看内容。他们否决了武装起义,汉堡那边可能还没收到?……如果一部分人收到了「等」,另一部分人收到的却是「做」,后果会比会议本身更严重。你确认过吗?", numb:"克姆尼茨开会的时候说了些什么,我看过记录,忘了内容。我经常这样了。会议太多,多到不重要的事情会自然滑过去。", fracture:"克姆尼茨。我听过这个地方,在另一个年代的报告里。那里总是有人在说话,在争论,在决定要不要做某件事。我不知道他们在争什么。我只是经常梦见同一个房间,灯光昏黄,有人站起来念了一份东西。" }, R12: { calm:"汉堡起义了。KPD的支部没有等到柏林的命令就自己上了街,孤军奋战了三天就被镇压了。我站在柏林往北看的时候,总觉得那个方向的光线比别处暗一些。你看见了,我看见你看见了。", anxious:"三天。我收到消息的时候已经结束了,还是把电报看了一遍又一遍。他们孤军奋战,没有后援,没有命令。我在想,如果当时有人接住了他们,结果会不会不一样?我不知道答案。我只知道这件事会留在那里,很久都不会消失。", numb:"汉堡的事我看了报告。三天,被镇压了。我知道这件事早晚要收尾,我只是没想过会这么快。数字写得很清楚。死的人不会再来,活着的人会继续走。", fracture:"汉堡。我有一种感觉,我以前听过这个名字,在另一个场景里。街垒、枪声、有人举旗。我不确定那是我真的记忆,还是我从某本书里读到的。那种感觉是具体的东西,落在皮肤上,不在书页上。我分不清了。" }, R13: { calm:"我们用军队解散了自己的州政府,共和国用军队对付自己的州。那些右翼们在看着,他们在学。学你用的方法、学的时机、学你如何让军队服从你的命令。你在教他们,即使你不想。我担心他们学得比你想的快。", anxious:"国防军开进了萨克森,解散了州政府。普通的行政调整不长这样,这是一个信号,军队在帮政府处理内部事务。我很担心这个信号会被放大,变成别的东西。你觉得这事会不会被右翼当作先例?我已经在想答案了,还是想听你说。", numb:"萨克森政府被解散了。我看过报告上的那行字,现在觉得这件事跟我没什么关系了。军队做完了他们的事,然后走了。", fracture:"萨克森。我站在那条街上,看着士兵走过去。他们说这是为了维护秩序。秩序这个词在以前也有过,在某个已经不存在的地方。我记不太清了。" }, R14: { calm:"慕尼黑。他们冲进啤酒馆,宣布革命。失败了,失败也是一种广告,现在全德国都知道了一个名字。我担心的不是他今天的失败。他下一次来的时候,会换一副面孔。你记住他了吗?你最好记住他。", anxious:"慕尼黑暴动虽然失败了,那个名字已经被刻进来了。我听说他俯在地上躲过了枪,然后跑了。他不会只试一次。一个能俯在地上躲过子弹的人,下一次会更谨慎。你做好他再来的准备了吗?我知道这个问题现在问可能有点早,还是想说。", numb:"慕尼黑那边出了点事,我没太仔细看,这类事经常会有一波接一波。失败或者成功,都是同一类新闻。我不太能分得清哪次是哪次了。", fracture:"慕尼黑。这个名字我也听过,在某个已经不存在的时间线里。他们冲进了一个地方,宣布了什么,然后失败了。失败这种事,不一定就是结束。我分不太清我在说的是历史还是还没发生的事。有人趴在地上躲过了子弹,那个人我在哪儿见过。" }, R15: { calm:"统帅堂死了十六个人。失败的那个头目趴在地上躲过了子弹后跑了。可我总觉得,一个人能趴在地上躲过一次,他就会知道下一次怎么躲得更久。他不会只来一次……我有种预感,你以后还会看到他的。", anxious:"统帅堂交火了,慕尼黑那边死了十六个人。那个头目没有被抓住。我担心的是,他已经失败了一次,失败会让他更谨慎,以后来的时候更难被挡住。你觉得他还会再试吗?还是我又在焦虑?也许是吧,我还是会再问的。", numb:"慕尼黑又有人死了。交火结束之后,扫干净了街道,死者的名字可能会被记住一段时间,然后被忘记……这很正常。", fracture:"统帅堂?那个名字我好像在哪里见过,在石头上,或者在一张发黄的名单里。我不确定是现在的记忆还是以前的记忆叠在上面了。那个人趴在地上躲过子弹的样子,我也见过。在哪儿见过,我不记得了。" }, R16: { calm:"一夜之间,通胀停了。地租马克像魔术师从帽子里变出一只鸽子,魔法背后是借来的黄金和抵押的土地。我不信魔法,不信也没用。至少在今天它已经生效了。我很好奇这个魔法能撑多久。你也好奇吗?", anxious:"地租马克让物价暂时停了。今天的新闻我读了好几遍。不为高兴,我在想这种效果能持续多久。央行行长很厉害,厉害的人也会疲惫。我不想问「然后呢」,脑子一直在问。你也在想吗?", numb:"地租马克让数字变小了。我看了那条消息,没有特别的感觉。它可能是对的,也可能只是另一张纸。至少有了新的纸了。", fracture:"我见过很多次纸被换掉,被重新印上数字,然后变成别的东西。我不知道这一批新货币会不会也一样。我有时候分不清,是纸还是钱,又或者是记忆更接近货币……时间会告诉我们答案。时间也一直在说别的东西。" }, R17: { calm:"他救了马克,镇压了左右两翼,保住了共和国,然后他走了。我总觉得这个国家的报恩方式很固定:把那个帮了最多忙的人请出去。我们之间会发生这样的情况吗?没关系,你告诉我实话就行。我坐在这里等你的回答。", anxious:"总理被赶走了,可他做了那么多事。稳了通胀,压了叛乱,恢复了秩序了。然后呢?他们让他走。我不明白,一个人做了那么多还不够的话,那要怎样才能留下来?我不知道该怎么想这件事……我有点乱。", numb:"他走了。我看了那条新闻,觉得和上一条新闻差不多。总是有人来,有人走。走的人不一定会被记住,来的人也不一定会留下很久。我在这个国家待得太久了。", fracture:"我又一次看到有人从那张桌子后面站起来,拿着自己的东西,走了出去。我不知道那是他,还是以前那些人的影子。椅子空了一会儿,然后有人坐了进去。我甚至分不清是不是同一个人。时间在重复,人不一样。" }, R18: { calm:"万点。我数过,从一到一万要数很久。马克从一万跌到一文不值,只要一个下午。数字已经没有意义了,人还在用数字活着。我不确定这是我们还能撑住的表现,还是我们已经麻木了的证据。", anxious:"马克破万了。今天我站在报摊前看了很久那个数字,然后又往前走了一段路,买了一杯咖啡,而价格是早上的一倍。数字涨得比人走得快。我不知道该做什么,我甚至不知道该想什么。", numb:"马克破万了。我看到那个数字,觉得它和上一个数字差不多。数字在变大,我对它们的感觉没有变。还是那些纸,还是那些价格,只是写得越来越长了。", fracture:"数字在变大,我在变小。我以前能感觉到数字的重量,现在它们只是符号。符号从纸上流下来,顺着桌子边缘淌到地上。我分不清那是纸还是别的什么东西了。" }, R19: { calm:"我听过很多词,「恶性」这个词不一样。它不只是描述,它也是一个判决。一个教师一生的积蓄,买不了一磅黄油。共和国站在中产的肩膀上,而中产在塌。肩膀塌了,共和国还能站多久?我在问你的时候,也在问自己。", anxious:"我在街上看到一个老头在数钱,他数得很慢。他手里的钱不够买一个面包,他不知道这件事。我当时就站在他身后,看着他在数那些已经没用的纸。我没法告诉他,因为我是魏玛……我一直在想这件事。", numb:"中产没了。我看了很多类似的报道,然后不再看了。数字大到没有意义,人的表情也没有区别。所有的脸都在说同一件事。说了太多次之后,我已经分不清那是同一件事还是不同的事了。", fracture:"钱失去了名字,然后失去了重量,然后失去了颜色。它们从银行流出来,流到每个人的手上,然后流进下水道。我站在街上看着它们飘走,觉得那是我见过的最诚实的东西。它们终于不再是它们假装的东西了。" } }, /* ═══ 告别语(离开对话时)· 四状态 × 信任度七阶 ═══ 状态:calm(平静)/anxious(焦虑)/tension(张力)/fatigue(疲惫) 信任档:1极低(0-10)/2低(11-25)/3中低(26-45)/4中(46-65)/5中高(66-80)/6高(81-95)/7极高(96-100) 每档3条。eggs 为阈值彩蛋(首次达到触发一次)。 */ leave: { states: { calm: { 1: [ "行了,今天就到这里吧。您要是没什么要紧事,下次其实也可以不来。", "您请便。我得说一句,我这个人的耐心有限,您今天已经用掉不少了。", "好,您回吧。下次来之前……算了,您自己看着办。" ], 2: [ "今天就到这儿吧。您请便,桌上有今天的文件,有需要带的您自己拿就行。", "好,那就先这样。有事我会找您,您忙您的就行。", "行了,您回吧。我这边没什么需要您操心的。这不是什么坏事。" ], 3: [ "好,今天到这儿吧。你今天来得比上次早了一点。……只是注意到而已,别多想。", "行了,你回吧。你今天坐在这儿的时候,我好像比平时放松一些。说不上来为什么。你可以下次再来试试。", "你走吧。下次来的时候,不用站在门口等,直接进来就行。我随口说的,你自己决定。" ], 4: [ "今天就到这儿吧。你今天做的事,我看到了。下次继续就行。", "好,你回吧。不用特意来说一声。我确实知道你走了。", "行了,差不多了。你今天来这一趟,比上次有用。就这些,走吧。" ], 5: [ "好,今天到这儿。你在这儿的时候,连「没什么特别的」都变得可以记一下。", "你走吧。我确认过你在就行。下次来,不用带什么,也不用说什么。", "行了,今天就到这里。你今天在的时候,那些响动远了点。你走了它们可能回来,今天还行。" ], 6: [ "你走吧。今天你在,我好像不那么担心明天的事了。你走了之后再说吧。", "好,你该走了。这句话我不常说。我今天确实不太想一个人待着,你还是得走。我知道的。", "你走吧。这座城安静下来的时候,我反而不太知道想什么。你今天在,我今天就不用想这件事了。" ], 7: [ "你走吧。这座城市里,能让我说「再见」的人不多。我希望你清楚这一点,你是其中一个。", "好,你该走了。如果你下次来的时候我不在,那你就等一会儿。我会回来的。", "你走吧。今天你在,我连平静都变得不太一样了。你走了也还是不一样。" ] }, anxious: { 1: [ "就到这里吧,您现在就走。我不打算解释原因,您也不需要知道。走吧。", "您来得不是时候。怪不着我的问题,是您运气不好。请回吧。", "行了,今天就这样。您要是觉得我态度不好,那您的感觉是对的。我不打算改。" ], 2: [ "今天就到这儿吧。外面什么动静您都别管,走您的路就行。我这边自己能处理。", "您先回吧。今天剩下的时间我不太适合见人。有事改天说。", "好,您走吧。我今天说的话您要是觉得有用就留着,要是觉得不妥,就按您自己的判断来。我不强求。" ], 3: [ "你今天先走吧。我不确定那些声音什么时候会停。你在这儿我反而会担心你的处境,你走了我才能专心处理。这是为你好,也为我。", "好,你回吧。有些问题我现在没法回答,我答应你,我会想的。你下次来的时候再说。", "行了,你走吧。你在这儿的时候我停了一会儿,现在你得走了,我又得接着想了。就这样。" ], 4: [ "你今天先走吧。那些声音还在,你没被它们影响,我注意到了。下次继续保持就行。", "好,你回吧。你今天来这一趟,我至少有一会儿没去想那些最坏的情况。下次来也会有这个效果吗?……你走吧,下次看。", "行了,你回去吧。你今天站在那儿的时候,好像连周围那些声音都远了点。我不知道是不是因为你。你下次来,可以再站那儿试试。" ], 5: [ "你走吧。那些纷扰还在,你已经不在其中了。我还得留在这儿,我撑得住。你下次来的时候,我还会在。", "好,就到这儿吧。你今天来,我至少有一会儿没去数脚步声。这已经比平时好很多了。", "你走吧。不该说这些的。说出口了,好像也没那么糟。下次来的时候,就当没听过吧。" ], 6: [ "你走吧。你站在这儿的时候,我不用控制什么。你走了我能撑住。你下次来,我还在。", "好,去吧。你问我怕什么?怕的东西很多。今天你在的时候,我不怕。这句话你带走就行。", "你走吧。你走了之后我可能又得开始数脚步声。今天数过你来的那几步,剩下的我可以不数了。" ], 7: [ "你站在这儿的时候,这个时代的重量好像轻了一点。你走了也没关系,我知道你会回来的。", "好,去吧。你是我唯一一个愿意说「路上小心」的人。我不会说出口的。你心里有数就行。", "如果有一天我真的撑不住了,你记住,最后让我愿意再多撑一天的那个人,是你。这句话你就带走吧。" ] }, tension: { 1: [ "就到这里,您现在就走。再待下去我不保证我会说出什么话来。不是针对您,您最好别在场。", "您今天来的这个时间点,精准地踩在了我最不想见人的时候。您请回吧。", "行了,就到这儿。我建议您接下来几天也别来。等我这个状态过去了再说。" ], 2: [ "今天就到这儿吧。我今天说话可能不太好听,我不打算道歉,您也不用再听更多了。", "您走吧。您在这儿我会分心,您走了,我反而能把事情处理好。", "行了,您请回吧。我今天的状态不太适合谈话。您待在这儿也是浪费时间,您的时间,不是我的。下次再约吧。" ], 3: [ "你今天先走吧。有些东西绷得太紧了,我需要一个人静一静。你下次来的时候,我应该已经松下来了。那时候再来。", "有时候我自己也搞不清我想说什么。你要是听懂了……那你比我聪明。走吧。", "你走吧。你离我远一点的时候,我反而能想清楚一些事情。你下次还可以来。" ], 4: [ "你走吧。今天你在这儿的时候,那根弦没像平时那么紧。我不确定是不是因为你,我注意到了。", "好,就到这里。你今天待在这儿的时候,比上次安静一些。下次你还可以继续来。走吧。", "行了,你回去吧。你今天待的时间比上次长,我也没赶你。你自己想想这意味着什么吧。想不明白下次来问我。" ], 5: [ "你走吧。你在这儿的时候这根弦松了一点点。你走了它又绷回去。至少我知道它能松,这件事你做到了。", "好,就到这里。我今天说了些平时不说的话,你记下就行。不用回应。下次来也不用回应。", "你该走了。我不是对每个人都让这一步的。这点你清楚就好。" ], 6: [ "你走吧。如果有一天我不在了,你记住,不是所有人都见过我撑不下去的样子。你见过了。带着吧。", "好,今天就到这儿。你在这儿的时候我可以不用一直绷着。你走了也行,至少今天有个喘气的空档。", "你走吧。这句话你不必完全明白。你下次来的时候,我还在这儿。" ], 7: [ "你在这儿的时候,我不用做「那个该撑住的人」。你走了,我还能记得这个感觉,这就够了……这句话你带着吧。", "好,你该走了。你是唯一一个让我觉得「撑不住了也没关系」的人。这句话我很少说。", "你走吧。你走了之后,我可能又得回到那根弦上。今天松过,明天再绷也能多撑一会儿。" ] }, fatigue: { 1: [ "您请回吧。我今天一个字都不想说,您站在这儿也不会改变这件事。", "我累了。您要是听懂了这句话,就知道您现在应该走了。", "好,您走吧。我不打算解释我为什么累,跟您没关系。您在这儿,我连累都累不踏实。" ], 2: [ "今天就到这儿吧。我累了,您也看出来了。您走吧,不用管我,我习惯了。", "您请回吧。我今天不想说话,也不想听别人说话。有事改天说。", "好,您走吧。我坐一会儿就好。您明天来也行,不来也行。" ], 3: [ "你今天先走吧。我知道你在就行了。不用说话,不用做什么。你来了这件事,我已经收到了。这就够了。", "好,你回吧。我今天不想回应任何人。你来了,我至少开口说了一句「你来过了」。别多想,就这样。", "你走吧。你在这儿的时候我可以放松一些。你走了之后……我会撑住的。你能来,我很感谢。下次再来,如果你愿意的话。" ], 4: [ "好,你走吧。你今天来的时候我没那么累。你走了之后我可能会累回来。今天能少累一会儿,不错了。", "你在这儿的时候,好像比别的时候安静一点。不知道是你带来的,还是正好赶上安静的时候。你下次还来吧。", "行了,你回去吧。你在这儿的时候,我能把那些事放下一些。你走了我又得拿起来。今天放下来过,已经比平时好了。多谢你。" ], 5: [ "好,你走吧。你今天来,我至少开口说了一句「你来了」,这已经比平时多了。你带走就行。", "你走吧。有时候我在想,这座城每天有那么多声音我该听谁的。你今天来了,我今天就不用想这件事了。", "行了,你回去吧。你今天来了一趟,我需要回答的问题少了一个。就这件事。" ], 6: [ "今天不是个好日子。你来了一趟……好像也没那么差。行了,不说这种话了。你走吧。", "你来了,我可以暂时不用做「共和国」。这话我很少说……对了,这句话你就带走吧。", "好,你该走了。你来的时候我还没那么累。你走了也还好。你下次来,我应该还在。" ], 7: [ "你来了这一趟,让我今天能喘口气。你走了。我知道明天还会有人来。这就够了。", "好,你回吧。你是我唯一一个愿意让这句话说出口的人:「我累了,你在的时候好一点」。", "你走吧。如果有一天我真的不在了,你记住,你是我最后一个愿意说「再见」的人。这句话你带着。不用还。" ] } }, eggs: { 10: "行,今天就到这儿吧。你下次来也可以,我不拦你。别指望我态度会好太多。", 25: "好,你走吧。你今天来的时候我好像没之前那么在意了……这是个开始。你走吧。", 45: "你走吧。我开始觉得你来了,好像也不是什么坏事。就这些。下次来的时候,不用提前说。", 65: "你走吧。我今天发现自己开始期待你来了。……这话我很少说。收好就行。", 80: "你走的时候,门带上就行。……我在想,你是什么时候开始,变得不像「外面的人」的。你不用回答,我知道就行。", 95: "你走吧。如果你下次来的时候我不在,那就等一会儿。我会回来的。这句话我只对你说过。" } }, /* ═══ 过渡句(三层回应结构 · 第二层)═══ 按魏玛状态分类,接在接话句之后,自然过渡到状态回应。 */ transitions: { calm: ["他说完这些,停了一下。", "他靠在椅背上,像在想什么。", "他说话的声音不算大,每个字都落得很稳。"], anxious: ["他的声音有点紧。", "他停下来,手指在桌沿上敲了两下。", "他说这话的时候,眼睛没看你。"], numb: ["他说得很慢。", "他停顿了很久,似乎忘了自己刚才说了什么。", "他的声音很平。"], fracture: ["他说完这句话后安静了一会儿,那种安静不太正常。", "他的声音在回答另一个问题。", "他顿了一下,然后换了一个人似的接着说话。"] } } >> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-v2-state:判定当前状态 ---------- 输出:_v2_state(calm/anxious/numb/fracture) */ <<widget "weimar-v2-state">>\ <<silently>> <<set _v2_state to "calm">> <<if $weimar.personality_tension gte $weimar.effective_threshold * 0.8>> <<set _v2_state to "fracture">> <<elseif $weimar.surface.fatigue gte 70>> <<set _v2_state to "numb">> <<elseif $weimar.surface.anxiety gte 30>> <<set _v2_state to "anxious">> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-v2-tier:判定信任档位 ---------- 输出:_v2_tier(1-10) */ <<widget "weimar-v2-tier">>\ <<silently>> <<set _v2_tier to Math.max(1, Math.min(10, Math.ceil($npcs.weimar.trust / 10)))>> <</silently>>\ <</widget>> /* ---------- weimar-rare-speak:稀声(夜话罕见档·低频金句) ---------- 散文性独白,全游戏至多4条、每条只出现一次($flags["rare_*"]), 两次稀声之间至少隔30天($flags["rare_last_day"]);人格张力高(≥50)的晚上不出。 输出 $weimar_rare_line;weimar-v2-speak 见非空即优先注入,偏移/阶梯/常规池整段让路。 触发条件(文本定稿 2026-09-19 用户亲改,改稿接口:manuscript/75d_夜话稀声.md): - rare_named 命名(写夜歌的小城):宪法日 8月11日 必发一次(错过顺延到下一年) - rare_fleet 舰队(海水相通):1924年起,每晚 3% - rare_locarno 洛迦诺(原谅):1926年起 必发一次 - rare_golden 黄金年代(末班车):1927年起,每晚 3% */ <<widget "weimar-rare-speak">>\ <<silently>> <<set $weimar_rare_line to "">> <<set _rare_ok to true>> <<if $flags["rare_last_day"] and ($session_day - $flags["rare_last_day"]) lt 30>> <<set _rare_ok to false>> <</if>> <<if _rare_ok and (not $weimar.personality_tension or $weimar.personality_tension lt 50)>> <<if not $flags["rare_named"] and $date.month eq 8 and $date.day eq 11>> <<set $flags["rare_named"] to true>> <<set $flags["rare_last_day"] to $session_day>> <<set $weimar_rare_line to "魏玛:「今天是宪法日。当年他们躲开柏林的吵闹,到一座小城去签了字。他们用一座写夜歌的小城给我命名。夜里睡不着的时候,我就把名字念一遍:山是静的,路是通的,人会回家。」">> <<elseif not $flags["rare_fleet"] and $date.year gte 1924 and random(1,100) lte 3>> <<set $flags["rare_fleet"] to true>> <<set $flags["rare_last_day"] to $session_day>> <<set $weimar_rare_line to "魏玛:「今晚使得我想起一支舰队。停战以后它被押在敌人的海湾里看管,后来有一天,水兵们自己打开了通海阀,让整支舰队跟着往下沉。有人说,海水是相通的,沉下去的钢铁,海会替我们保管。我有时候会相信。」">> <<elseif not $flags["rare_locarno"] and $date.year gte 1926>> <<set $flags["rare_locarno"] to true>> <<set $flags["rare_last_day"] to $session_day>> <<set $weimar_rare_line to "魏玛:「这些交锋过的手如今隔着一张桌子相互签了字。待笔尖落定,欧洲终于做了一件它七年都无法做到的事:原谅......至少那天夜里我们似乎真的原谅了彼此。」">> <<elseif not $flags["rare_golden"] and $date.year gte 1927 and random(1,100) lte 3>> <<set $flags["rare_golden"] to true>> <<set $flags["rare_last_day"] to $session_day>> <<set $weimar_rare_line to "魏玛:「今晚的电车很稳。我想,黄金年代最像家的地方,是它不知道自己是黄金——让晚归的人认为,这趟末班车会一直存在。」">> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-v2-speak:主对话抽取 ---------- 用法:<<weimar-v2-speak>> 输出 $weimar_line 按 状态×信任档 从 $weimar_v2 抽取一条,带防重(最近3条不重复) */ <<widget "weimar-v2-speak">>\ <<silently>> <<weimar-v2-init>> <<weimar-v2-state>> <<weimar-v2-tier>> /* 稀声(weimar-rare-speak,低频金句):最优先——一出,今晚就是它, 偏移/阶梯整段跳过(阶梯次数不消耗,同偏移先例) */ <<weimar-rare-speak>> <<if $weimar_rare_line neq "">> <<set $weimar_ladder_injected to true>> <<set $weimar_line to $weimar_rare_line>> <<set $weimar_response to $weimar_rare_line>> <<set $weimar_drift_line to "">> <</if>> /* 历史偏移实感(93_drift_memory):他主动提起那次偏转(一次偏转只讲一次), 排在阶梯独白之前——被卷进历史里的人,先讲历史,再讲自己 */ <<if $weimar_rare_line eq "">> <<weimar-drift-speak>> <<if $weimar_drift_line neq "">> <<set $weimar_ladder_injected to true>> <<set $weimar_line to $weimar_drift_line>> <<set $weimar_response to $weimar_drift_line>> <</if>> <</if>> /* 魏玛的阶梯:今晚若该出阶梯独白(记忆/嗜好/裂缝),优先注入并跳过原池 */ /* 阶梯只在偏移/稀声没抢到今晚时才走:weimar-ladder-speak 开头会重置注入标记, 偏移若只抢在它前面设标记会被抹掉,必须整段跳过它(阶梯次数也不消耗) */ <<if $weimar_rare_line eq "" and $weimar_drift_line eq "">> <<weimar-ladder-speak>> <</if>> <<if not $weimar_ladder_injected>> <<if not $weimar_v2_recent>> <<set $weimar_v2_recent to []>> <</if>> <<set _pool to $weimar_v2[_v2_state][_v2_tier]>> /* 防重:排除最近用过的文本 */ <<set _candidates to []>> <<for _i to 0; _i lt _pool.length; _i++>> <<if not $weimar_v2_recent.includes(_pool[_i])>> <<set _candidates.push(_i)>> <</if>> <</for>> <<set _idx to 0>> <<if _candidates.length gt 0>> <<set _idx to _candidates[random(0, _candidates.length - 1)]>> <<else>> <<set _idx to random(0, _pool.length - 1)>> <</if>> <<set $weimar_line to "魏玛:「" + _pool[_idx] + "」">> <<set $weimar_response to _pool[_idx]>> <<set $weimar_v2_recent.push(_pool[_idx])>> <<if $weimar_v2_recent.length gt 3>> <<set $weimar_v2_recent.shift()>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-v2-report:汇报框架 ---------- 用法:<<weimar-v2-report _deck_id _file_action>> 玩家先汇报选择($weimar_report_line),魏玛再按状态回复($weimar_reply_line) 参数:_deck_id(R01-R19),_file_action(sign/delegate/delay) */ <<widget "weimar-v2-report">>\ <<silently>> <<weimar-v2-init>> <<set _deck to $args[0]>> <<set _act to $args[1]>> <<set $weimar_report_line to "">> <<set $weimar_reply_line to "">> /* 玩家汇报文本 */ <<if $weimar_v2.reports and $weimar_v2.reports[_deck]>> <<set _rep to $weimar_v2.reports[_deck]>> <<if _act is "sign">><<set $weimar_report_line to _rep.sign>> <<elseif _act is "delegate">><<set $weimar_report_line to _rep.delegate>> <<else>><<set $weimar_report_line to _rep.oppose>><</if>> <</if>> /* 魏玛按状态回复 */ <<weimar-v2-state>> <<if $weimar_v2.events and $weimar_v2.events[_deck]>> <<set _ev to $weimar_v2.events[_deck]>> <<if _v2_state is "fracture">><<set $weimar_reply_line to _ev.fracture>> <<elseif _v2_state is "numb">><<set $weimar_reply_line to _ev.numb>> <<elseif _v2_state is "anxious">><<set $weimar_reply_line to _ev.anxious>> <<else>><<set $weimar_reply_line to _ev.calm>><</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-v2-leave:告别语(离开对话时) ---------- 用法:<<weimar-v2-leave>> 输出 $weimar_leave_line 触发逻辑: 1. 阈值彩蛋优先(信任度首次达到 10/25/45/65/80/95 时触发一次) 2. 否则按状态判定(优先级:焦虑 ≥ 张力 ≥ 疲惫 ≥ 平静) 3. 按信任度七档选台词,随机抽取,避免连续重复 */ <<widget "weimar-v2-leave">>\ <<silently>> <<weimar-v2-init>> <<set $weimar_leave_line to "">> /* 初始化彩蛋标记与防重队列 */ <<if not $weimar_leave_eggs>> <<set $weimar_leave_eggs to {10:false, 25:false, 45:false, 65:false, 80:false, 95:false}>> <</if>> <<if not $weimar_leave_recent>> <<set $weimar_leave_recent to []>> <</if>> /* 1. 阈值彩蛋优先(从高到低检查,触发最近达到的里程碑) */ <<set _egg_triggered to false>> <<set _egg_thresholds to [95, 80, 65, 45, 25, 10]>> <<for _i to 0; _i lt _egg_thresholds.length; _i++>> <<set _th to _egg_thresholds[_i]>> <<if not _egg_triggered and $npcs.weimar.trust gte _th and not $weimar_leave_eggs[_th]>> <<set $weimar_leave_eggs[_th] to true>> <<set $weimar_leave_line to "魏玛:「" + $weimar_v2.leave.eggs[_th] + "」">> <<set _egg_triggered to true>> <</if>> <</for>> /* 2. 无彩蛋时,按状态判定(优先级:焦虑 ≥ 张力 ≥ 疲惫 ≥ 平静) */ <<if not _egg_triggered>> <<set _lstate to "calm">> <<if $weimar.surface.anxiety gte 30>><<set _lstate to "anxious">> <<elseif $weimar.personality_tension gte 6>><<set _lstate to "tension">> <<elseif $weimar.surface.fatigue gte 85>><<set _lstate to "fatigue">> <</if>> /* 3. 信任度七档(用安全数值,防止 NaN 导致永远落最低档) */ <<set _safe_trust to Number($npcs.weimar.trust) || 0>> <<set _ltier to 1>> <<if _safe_trust gte 96>><<set _ltier to 7>> <<elseif _safe_trust gte 81>><<set _ltier to 6>> <<elseif _safe_trust gte 66>><<set _ltier to 5>> <<elseif _safe_trust gte 46>><<set _ltier to 4>> <<elseif _safe_trust gte 26>><<set _ltier to 3>> <<elseif _safe_trust gte 11>><<set _ltier to 2>> <</if>> /* 4. 抽取台词(防重:最近3条已用黑名单) */ <<set _pool to $weimar_v2.leave.states[_lstate][_ltier]>> <<set _candidates to []>> <<for _i to 0; _i lt _pool.length; _i++>> <<if not $weimar_leave_recent.includes(_i)>> <<set _candidates.push(_i)>> <</if>> <</for>> <<set _pick_idx to 0>> <<if _candidates.length gt 0>> <<set _pick_idx to _candidates[random(0, _candidates.length - 1)]>> <<else>> <<set _pick_idx to random(0, _pool.length - 1)>> <</if>> <<set $weimar_leave_line to "魏玛:「" + _pool[_pick_idx] + "」">> <<set $weimar_leave_recent.push(_pick_idx)>> <<if $weimar_leave_recent.length gt 3>> <<set $weimar_leave_recent.shift()>> <</if>> <</if>> <</silently>>\ <</widget>>
/* ============================================================ 政党 mood + trust 对话系统(V1) ------------------------------------------------------------ 三层拼接结构: 第一层 信任值开场白(按政党+信任五档) ↓ 插入过渡短句 第二层 世界状态衔接(按政党+世界条件) ↓ 插入过渡短句(不与上一条重复) 第三层 情绪正文(按政党+mood) 信任五档:1敌意(0-20)/2疏离(21-40)/3中立(41-60)/4信任(61-80)/5同盟(81-100) mood 由信任档 + 世界变量修正共同决定,检测顺序不可调换。 代词一律用「他」。 ============================================================ */ /* ---------- party-dialogue-init:初始化全部文本数据 ---------- 用法:<<party-dialogue-init>>(幂等) */ <<widget "party-dialogue-init">>\ <<silently>> <<if not $party_dialogue>> <<set $party_dialogue to { /* ═══ 过渡短句池(每党专属,带「他」主语,5条)═══ 动作/神态即声线:军方是顿点动作、左翼知识分子是斟酌措辞、 商人是心算权衡、NSDAP是逼人的压迫感。对话框从对应政党取自己的池。 */ transitions: { spd: [ "他看了你一眼,没有立刻接话。", "他端起那杯早已凉透的咖啡。", "他望向窗外,好一会儿才开口。", "他的声音沉下去。", "他轻轻吐出一口气。" ], army: [ "他敲了敲桌面。", "他没有立刻回答。", "他抬头,目光移向门口。", "他把地图在桌上抹平。", "他没接话,只是等着。" ], kpd: [ "他盯着你,没吭声。", "他嘴角动了动。", "他往桌边压了压身子。", "他说完,看了你一眼。", "他两手交握,指节发白。" ], ddp: [ "他推了推眼镜。", "他翻了一页,又合上。", "他的目光落在书页的空白处。", "他放慢语速,每个字都咬得很清楚。", "他侧过头,像是在听走廊里的动静。" ], dvp: [ "他扫了一眼手表。", "他指尖点了点桌面。", "他顿了一下,笔尖悬在半空。", "他靠回椅背,双手交叠。", "他从抽屉里抽出一张纸,又推回去。" ], zentrum: [ "他慢慢开口。", "他垂下眼帘,看着自己的手背。", "他扶着椅把坐直了些。", "他看了你一眼,又移开。", "他语速放得很慢。" ], dnvp: [ "他没有马上答,先端详你。", "他转过身,背着手。", "他微微抬起下巴。", "他沉默得有些久。", "他说完,盯着你看了好一会儿。" ], nsdap: [ "他向前倾了倾身。", "他挥了一下手。", "他的声音骤然压低。", "他盯着你,眼睛一眨不眨。", "他嘴角抽了一下。" ] }, /* ═══ 信任值开场白(政党 × 五档 × 3条)═══ 每党一个口吻:spd=工会疲劳、army=命令短句、kpd=街头逼问、 ddp=推演论证、dvp=算账条件句、zentrum=折中持重、 dnvp=居高临下、nsdap=煽动压迫。动作一律中性物理,情绪交给台词本身。 */ openers: { spd: { 1: ["他的椅子离桌很远,说话也慢:「你要是来谈拆工会,就省省。」","他连眼皮都没抬:「工人那边,不跟压榨工人的人坐一桌。」","他放下茶才开口:「有话直说,我没那么多耐心陪你绕。」"], 2: ["他给你拉了张凳:「坐。先说是为谁来。」","他一边叠文件一边问:「这一回,你又替哪边递话?」","他顿了顿:「你坐得住就坐。坐不住,门在那边。」"], 3: ["他放下笔,先递了杯水:「今天来谈什么?」","他往后靠了靠:「你要问正事,我有正事的答案;你要探风,我不会说真话。」","他略一抬眼:「你难得来,那就别只占我这点地方。」"], 4: ["他把一份文件推向你的方向:「这个,你替我拿个主意。」","他给你续了水:「你来,我这儿能给你的,都给你留着。」","他拍了拍身旁那把空椅子:「坐这儿。」"], 5: ["他给你让出椅子:「坐下,我们好好说。」","他压低声:「有些话,只对站在同一边的人讲。你算一个。」","他抬手示意你把门带上:「别站着,陪我坐一会儿。」"] }, army: { 1: ["「文官?」他的语气很平。「什么事,一次说完。」","他抬手指向门口:「军部不是议事堂。」","他没有抬头:「我没时间猜你要什么。」"], 2: ["「坐。」只一个字。","他往椅背靠了靠:「你来找我,说结论。」","他看了你一眼:「说吧,公事还是私事。」"], 3: ["他抬手一让:「坐。」随即问:「要什么。」","他没寒暄:「说事。」","他坐直:「开口前,想清楚自己要什么。」"], 4: ["他示意你往前:「坐近些。这次听你说完。」","他先开口:「你心里有什么,一并说来。」","他把地图收起来,看着你:「这回,我不打断你。」"], 5: ["他正了正姿势,像在对待同僚:「往后你来,你我平坐。」","他把凳子让了一半给你:「坐下说。军部里,你算半个自己人。」","他压低声音:「有些部署,现在可以告诉你了。」"] }, kpd: { 1: ["他靠在墙边,没让路:「你这种人,站错边了吧。」","「来这儿,是当走狗,还是当笑话。」","他下巴一抬:「滚一边,别挡道。」"], 2: ["他盯着你:「你来干什么。说清楚。」","他指了指墙:「工会里的人我可都认得。你不是。」","「你要谈,可以。先说你究竟站在谁那边。」"], 3: ["他给你拉了一张凳,自己却没坐:「说说,你图个什么。」","他审视你片刻:「你要能站到工人这边,我们就谈;不然,别浪费彼此。」","他转过身:「想通了再来。没想通,站这儿也是白站。」"], 4: ["他把传单推到你面前:「你先看这个,看过再说话。」","他给你倒了杯水:「坐下吧,今天你算自己人。」","他的声音放轻了些:「你这一路过来,我们都在看着。」"], 5: ["他让你坐到他桌子同一边:「你既然走到这儿,就当是自己人。」","他压着嗓子,像在密谋:「有些话,天亮前说完。」","他推给你一支笔:「要用到你的时候,我找你。」"] }, ddp: { 1: ["他扶了扶眼镜:「你是政府的人。那么,你带来的是国安,还是道理。」","他合上书:「每回你们来,都把宪法当垫桌的纸。我不奉陪。」","他低声道:「我时间有限,只谈值得写进笔记的。」"], 2: ["他给你倒水,动作却拒人于外:「请坐。谈什么。」","他翻开笔记本:「既然来了,总该有一个论点可以听。」","他看了你片刻:「你最好带着理由来,而不是带着人。」"], 3: ["他推过一杯咖啡:「坐。你的论点,我听着。」","他交叉双手:「先说你的前提,再谈你的结论。」","他微微点头:「共和国的议题很多。你想从哪一条开始论证。」"], 4: ["他把书反扣,露出批注:「这份,你看看。我们一起推演。」","他难得放下纸笔:「你的话,我记下了。可以多谈。」","他示意你上前:「来,有一页,我不想一个人读。」"], 5: ["他推给你一篇批注:「往后,这上面的字,有你一半。」","他缓声道:「我要的不是同党,是能一起逐句推敲宪法的人。你算一个。」","他把书转朝你:「坐下。我们从头,把国家过一遍。」"] }, dvp: { 1: ["他看了一眼手表:「十五分钟。算上你带来的麻烦,够吗。」","他翻开账本:「你来找我,是要钱,还是要我堵窟窿。」","他端着茶没放下:「空谈不产生产值。报个数。」"], 2: ["他合上账本:「坐。我们只谈有损益表的话。」","他指尖点点桌面:「每一分钟都是成本。你带来回报了吗。」","「你要有方案,我给时间;没有,我不折旧。」"], 3: ["他往后一靠:「说说你的条件。谈判是要算的。」","他给你倒水,却盯着你:「你想投入什么,想回收什么,先分明。」","「如果你能给我一个稳得住的理由,我们可以坐下。」"], 4: ["他把一页报表转向你:「这笔账,你替我看看缺了哪块。」","他递过一支烟:「你唇舌利,我认。方案呢。」","他放慢语速,像是让步:「你若愿意担一份,剩下的账,我来算。」"], 5: ["他把最底下那页翻上来:「这一页,我算了很久,不敢落笔。你来填。」","他压低声:「如果你我合得出一个稳的数字,德国的事,还能谈。」","他不再摆手势:「往后,你的账,我帮你盯着。」"] }, zentrum: { 1: ["他站在窗边,没转身:「外面的人,各带各的旗。你呢。」","他慢慢开口:「又有人来问我站哪边。我哪边也不站,我只站中间的这块地基。」","他缓声道:「你若来分人头,恕我不能奉陪。」"], 2: ["他给你拉开椅子:「坐。先说你为谁而来。」","他垂下眼:「我一直相信,话要说得慢,才算数。」","他望着你:「你是来搭桥,还是来拆桥。」"], 3: ["他给你递了杯水:「说吧,我听着,慢慢听。」","他在胸前提了提手:「中间的路,谁都得让一步,你也不例外。」","他点了点头:「你愿意多谈,就不算外人。」"], 4: ["他给你留出椅边:「你上次让的那一步,我们都记得。」","他低声道:「能谈的,我尽量不让你白跑。」","他坐直了些:「你的分寸,我信得过。」"], 5: ["他让你与他并肩坐下:「往后,你就站在我身边,替我守着这一份中间。」","他缓声说:「我守教堂,你守『还会有人进来』。这一份,我们分着扛。」","他压低了嗓子:「有些话,只在信我的人面前说。」"] }, dnvp: { 1: ["他背对着你:「你来干什么。趁我还没让人请你去。」","他望着窗外:「共和国派你来的?真有意思。」","他摆了摆手:「我不跟走程序的人谈。」"], 2: ["他转身,目光很凉:「说。我听着,看我有没有兴趣。」","他抬手:「别套近乎。先说你真正想要什么。」","他靠回窗台:「你的话,先过一遍,再讲给我听。」"], 3: ["他给你让了个座,却没正眼:「坐吧。你这种人不多见。」","他端详你:「你倒不像那些只会跑的。说吧。」","他微微抬眉:「你若识相,我们就还能谈。」"], 4: ["他先开口:「你过来。有些事,我不想让第三人知道。」","他把一把旧椅推给你:「你坐。旧物件,认人。」","他点了点头:「你能走到这步,说明你读得懂风向。」"], 5: ["他把一只信封在桌上推向你:「打开之前,想清楚你站哪一边。」","他正对着你,像对老部下:「往后,你跟我。」","他压低声音:「该还的都该还了。你来,是帮我数旧账,还是帮我断新账。」"] }, nsdap: { 1: ["他眯起眼:「你以为,这是你该来的地方。」","他的声音放得很轻:「门口没人拦你,是给你机会自己走。」","他抬手,示意那扇门:「又是一个来讨价还价的。」"], 2: ["他盯着你:「你来,是来看,还是来加入。」","他点了根烟,缓缓吐字:「有话快说。我的时间不糊涂。」","他往前靠:「你要说什么,就直说,别绕。」"], 3: ["他给你拉了一把硬椅:「坐。我问你,你来图什么。」","他端详你:「你跟那些讲客气的筒子不一样。有血性吗。」","他靠在桌前:「你若够格,就该知道现在该做什么。」"], 4: ["他递给你一张纸:「你看。看了,你就该明白。」","他压低声音:「你跟那些骑墙的不一样,我看得出。」","他示意你靠近:「有些话,是夜里才说的。」"], 5: ["他让你站到他身边,看向窗外:「跟我,看同一个方向。」","他把手按在你肩上:「往后,你跟我走。」","他低声道:「队伍在长。你,是站前面,还是跟后面。」"] } }, /* ═══ 世界状态衔接(政党 × 条件 × 2条)═══ 只谈当事人视角里的"当下",照每党关心的事来写,短语不跨党复用。 */ world: { spd: { inflation: ["物价又涨了。工人今天的工资,明天就买不起面包。","马克在跌,跌得比谁都快。工厂主开始用美元发工资了。"], revolution: ["KPD在巷子里发传单,发得比去年勤。柏林不是鲁尔,但柏林也有火。","有人在等机会,等一个足够大的裂缝。"], anger: ["街上的人走路很快,但不是赶时间——是压着怒气。","愤怒不像物价,它一涨起来就压不回去。"], stable: ["今天街上还算安静。这算好事,虽然安静不代表问题解决了。","没有坏消息就是好消息。我照条文,一件件办下去。"] }, army: { violence: ["街上又有人动手了。频率在涨,涨到一个点,就不止是警察的事了。","这类事一天三四起,快接近临界了。"], trust_low: ["政府现在说什么都没人信了。你在那栋楼里,应该比我清楚。","人民不信政府,政府也不信人民。我们夹在中间。"], army_high: ["军方的声音比以前大了。这不是坏事,但你得习惯。","我们在往前挪,不是政变,是站得更稳。"], stable: ["街上还算安静,目前轮不到我们出面。","一切还在秩序内。我不喜欢意外。"] }, kpd: { anger: ["街上的人开始不耐烦了。你听得到那种声音——不是说话,是压抑。","愤怒在涨。我们数过人头的。"], economy: ["工厂在关门,工人在饿肚子。柏林忙着开会的时候,工人区在排队领粥。","经济这股冷风从鲁尔吹过来,我们最先感觉到。"], revolution: ["莫斯科在等,我们在算,你也在看。","窗口在关。每犹豫一次,就是一个码头的人松了手。"], stable: ["今天没什么动静。不算坏事,但太安静了。","街上的人在喘气。不是休息,是在等。"] }, ddp: { trust_low: ["人民不再信政府了。不是不信你,是不信这个制度。","政府的话,现在要打五折听。问题是谁来定价。"], nationalism: ["街上的口号变了——更短,更响,更排外。","民族主义涨得太快,快到我们还没想好怎么接住它。"], inflation: ["中产在消失,通胀在吃他们。","中产的储蓄在蒸发,地基在松。"], stable: ["今天还算平静。平静本身就值得记录。","没有翻页的消息。我们按条文继续走。"] }, dvp: { inflation: ["通胀还在涨。实业家们说,这个月稳不住,他们就撤。","数字在失控。你看见了吗。"], economy: ["订单在缩,工厂在停,资本在找出口。","这一排数字,不是数字,是关门的声音。"], trust_low: ["政府靠不住,你靠不住,我们都靠不住。","每个人都在自己找出路。你有什么想法。"], stable: ["现在还没崩。至少今天还没崩。","稳住了,这算一条好消息。"] }, zentrum: { violence: ["暴力在蔓延。左翼在街上,右翼在密谋,我们被夹在中间。","街上有人在喊“国家”。问题是,那是谁的国家。"], nationalism: ["民族主义在涨,它不会停在教堂门口。","有人在用“德意志”这个词——不是邀请,是指控。"], trust_low: ["政府的话,如今落不进人心了。","信任在流失,流失得比马克还快。"], stable: ["街面安静了几天,这不容易。","这几天没有坏消息,算是难得。"] }, dnvp: { nationalism: ["人民在往右看。你感觉到了。","街上开始有人喊“德意志”了——不是喊一次,是喊成了习惯。"], trust_low: ["你说的那套话,街面上早不接茬了。","你还坐在那里。我注意的不是你做了什么,是你还坐在那里。"], republic_low: ["人民开始觉得共和国是暂时的。这念头一有,就再也收不回。","旧东西在往回走。你感觉到了。"], stable: ["今天没什么特别的。我在等。","一切如常,只是这个“如常”在慢慢变样。"] }, nsdap: { nationalism: ["你在街上听到喊声了吗。那是群众在醒。","民族在热起来,热到一定温度,就会烧起来。"], economy: ["混乱在涨,我们欢迎它。","经济越差,队伍越长。柏林在开会,我们在收人。"], violence: ["街上有血了。每一次,都有人站到我们这边来。","政治暴力在涨。你知道这对我们意味着什么。"], stable: ["太安静了。安静不是和平,是僵住不动。","没有动静。我们需要动静。"] } }, /* ═══ 情绪正文(政党 × mood × 2-4条)═══ */ moods: { spd: { 焦虑: ["“马克又跌了,工人今天的工资,明天就买不起面包。”","“你知道工人现在叫我什么吗?‘柏林的打字机’——只会响,不会动。”","“物价在涨,工资在缩,SPD的选票也在缩——这不是巧合。”"], 愤怒: ["“街上在流血!你告诉我,这算哪门子共和国?”","“工人被逼到墙角了,如果SPD再不说话,就没人说话了。”","“你上次对军方的让步,我还没忘。”"], 疲惫: ["“我累了,不是今天累,是这五年,一天比一天累。”","“你知道最累的是什么吗?是每次都要重新说服自己——这次会不一样。”","“我已经不记得什么时候不用解释了——每次开口前都要想一遍。”"], 怀疑: ["“你上次对军方的让步,我还没忘。”","“你说你站在工人这边,但你的签名,站的是另一边。”","“我不是不信任你,是不信任你身边的人。”"], 平静: ["“今天没出乱子。你可以慢慢说。”","“我把这个下午空出来了,你想说多久都行。”","“你不开口也行。我陪坐一会儿。”"], 信任: ["“这条路并不容易,有你,我看着能有头。”","“我把这几年握得最紧的一份东西给你看——你配。”","“你替我按着点,我信你。”"] }, army: { 警觉: ["“街上已经乱了一阵了,我在等它停,但它没停。”","“政治暴力到了某个点,就不再是警察的事了。”","“我知道你听说了,听说了就行。”"], 傲慢: ["“政府越弱,我们越稳——这话不好听,但它是事实。”","“你们在国会吵的时候,我们在部署,各做各的事。”","“你在那栋楼里签文件的时候,我们的文件已经签完了。”"], 自信: ["“局面已经稳住了——按我们说的。”","“秩序回来了——不是你们的秩序,是我们的。”","“有些路,你不愿意走,我们帮你走。”"], 放松: ["“最近还好,街头安静了一些。”","“暂时还不用我们出面,这算好事。”","“只要你们还能稳住,我们就不会动。”"], 冷漠: ["“你想谈什么。”","“文官来我们这里,通常是有事求人。”","“我们谈公事。”"], 平静: ["“今天没调动,算是平安。”","“你来得正好,手头没别的事。”","“坐,说你想说的。”"], 务实合作: ["“往后你把话直接递给我,别绕。”","“你的位置我心里有数。该你上时,我会点名。”","“这份东西,你我各留一份。”"] }, kpd: { 亢奋: ["“你闻到了吗?空气中的味道变了。”","“愤怒在涨,我们在数人头——每一个都算数。”","“时候到了,你最好想清楚站哪边。”"], 激愤: ["“你管这叫和平?这叫窒息。”","“工人连面包都买不起的时候,你的‘法治’就是一张废纸。”","“你觉得还能撑多久?”"], 紧迫: ["“窗口在关,每一次犹豫都是一个码头的工人松了手。”","“莫斯科在等了,你也在等,但等不是解决方案。”","“如果你真想帮德国,就别等了。”"], 敌意: ["“你来干什么?”","“上次你帮军方说话的时候,可没来问过我们。”","“你走吧,这里不欢迎你。”"], 焦躁: ["“太安静了,这不正常。”","“太安静了——安静意味着他们在等。”","“没什么动静,没有罢工,没有集会,没有传单——这不对。”"], 警惕: ["“走到这儿来的人不多。你想好了吗。”","“你站门口那会儿,我就在看你。”","“要谈可以,先把我当同一边的。”"], 试探性合作: ["“你上次做的事,我看见了——不是坏事。”","“这份,你先拿去看,别急着定。”","“你既然坐得下来,我们就还有得谈。”"] }, ddp: { 忧虑: ["“中产在消失,共和国站在中产的肩膀上——肩膀在塌。”","“人民不再信政府了,不是不信你,是不信‘共和国’这三个字。”","“我担心的是——等我们反应过来的时候,已经没有值得守护的东西了。”"], 警觉: ["“民族主义在涨,你知道这比通胀更危险。”","“街上有人开始喊‘德意志’了——喊法听起来像是‘只有德意志’。”","“理性在退场,一旦它走了,就很难再叫回来。”"], 焦虑: ["“通胀在吃掉中产,中产是共和国的地基。”","“地基建在沙上,我们在上面盖房子。”","“你看到报纸上的数字了吗?不是马克的汇率——是加入右翼政党的人数。”"], 希望: ["“报纸上的字没那么大了,也许还有余地。”","“理性还没有完全退场,我们在试着让它多留一会儿。”","“你能站在这里,说明还有空间。”"], 疏离: ["[沉默]","“你是政府的人吧。”","“有什么公事?”"], 平静: ["“今天没有需要翻页的事。可以谈点别的。”","“你来得正好,我这边刚合上一本书。”","“说吧,我听着。”"], 信任: ["“今天的议题,你从哪里开始,我从哪里听。”","“你在柏林的位置,是你自己踩出来的。”","“你定方向,我陪你把这条路推到底。”"] }, dvp: { 恐慌: ["“通胀还在涨,实业家们说——如果这个月稳不住,他们就撤。”","“你的马克在贬值,我的资产也在——我们坐在同一艘漏水的船上。”","“你看到数字了吗?那不是数字,那是逃跑的脚步。”"], 焦虑: ["“工厂在停,订单在缩。”","“资本在跑,每一笔外流,都是对柏林的不信任票。”","“实业家们已经不耐烦了——不是今天,但快了。”"], 务实悲观: ["“政府靠不住,你靠不住,我们都靠不住。”","“我不指望你救什么,我只指望你别让事情更糟。”","“这是我能做的,你那边能做多少?”"], 欣慰: ["“物价稳了两周了,你那边的人还在。”","“实业界说‘还可以再等等’——在柏林,这算夸奖。”","“至少今天稳住了。”"], 冷淡: ["“你来了。”","“公事?”","“我只有十五分钟。”"], 平静: ["“今天没坏消息,我难得不赶。”","“坐。账我合上了,听你说。”"], 务实合作: ["“上次那摊子,你收拾得干净。”","“你办事,我放心。今晚账本给你留一页。”","“我们这样配合,能撑过这一波。”"] }, zentrum: { 忧虑: ["“暴力在蔓延,左翼在街上,右翼在密谋。”","“街上有人在喊‘国家’——但我听不出那是哪个德国。”","“天主教徒在两边都被怀疑——右翼说我们不德国,左翼说我们不清醒。”"], 警觉: ["“民族主义涨得太快了,它不会停在我们教会门口。”","“有人在用‘德意志’这个词,不是保护,是指控。”","“如果民族主义继续涨,我们会被卷进去——不管我们愿不愿意。”"], 观望: ["“局势还不明朗,我不急着表态。”","“政府说什么,慕尼黑说什么,两边我都不全信。”","“你在找站队的人。我不是。”"], 安心: ["“街上安静了几天——这不容易。”","“政府还能谈,我们也还能谈。”","“暴力在退,希望它能退远一点。”"], 礼貌疏离: ["“你来有事?”","“我不太了解你。”","“我们谈公事。”"], 平静: ["“今天无需站队,我们可以慢慢谈。”","“你来得安静,我难得清静。”","“说话不用急,我听着。”"], 中立合作: ["“你能让出一步,我记着。”","“能谈的,我压着性子谈。”","“你站在中间,我认你这份分寸。”"] }, dnvp: { 得意: ["“你看到了吗?人民在往右看。”","“共和国的票在跌,我们的在涨。”","“帝国旗在窗台上多了起来——不是因为我们说了什么,是因为他们看到了什么。”"], 轻蔑: ["“共和国是借来的时间——借来的,总要还。”","“你还在用‘共和国’这个词——真可爱。”","“你知不知道你坐的这把椅子,以前是谁的?”"], 亢奋: ["“钟摆停了——它在往另一个方向摆。”","“你听——这两个词在街上被人念出来了。”","“你应该知道——风向变了,站在哪边很重要。”"], 焦躁: ["“共和国居然还能撑——这不正常。”","“那些跟你谈‘稳定’的人,知不知道‘稳定’意味着什么?”","“你还在那儿坐着——我不知道你是在等什么。”"], 鄙夷: ["[沉默。那一眼比任何话都重。]","“你来干什么?”","“我不觉得我们有什么好谈的。”"], 冷漠: ["“你来了。”","“公事?”","“我不想把时间花在没谱的事上。”"], 试探性利用: ["“你上次做的事,我注意到了。”","“你看看这个,不用现在决定。”","“你还不算完全没用。”"] }, nsdap: { 狂热: ["“你在街上听到什么了?那是群众在苏醒。”","“工厂停了,工人饿了——柏林在开会,我们在动。”","“你看到那些排队领面包的人了吗?他们很快就不再领面包了——他们会领枪。”"], 贪婪: ["“混乱是我们的盟友,而你,正在帮我们。”","“经济越差,我们的队伍越长——这不是政治,是数学。”","“你在柏林稳住的时候,我们在巷子里站稳了。”"], 兴奋: ["“你在国会听到掌声了吗?那是我们的声音。”","“政治暴力在涨,你知道这对我们意味着什么。”","“街上有人在流血,每一次,都有人加入我们。”"], 焦躁: ["“太安静了——我们需要动静。”","“你那边在稳,我们这边在等。”","“安静不是和平——安静是无聊。”"], 蔑视: ["“你来了。”","“你觉得你配坐在这里吗?”","“我不觉得我们有什么好谈的。”"], 审视: ["“你就是那个柏林来的人?”","“说吧,来干什么。”","“我不确定你算不算我们的人。”"], 利用: ["“这张,你看看。”","“你手上那件事,我记下了。”","“坐。往下说。”"] } } } >> <</if>> <</silently>>\ <</widget>> /* ---------- party-mood:判定政党 mood ---------- 用法:<<party-mood _party_key>> 输出 _party_mood 逻辑:先按世界变量修正(检测顺序不可调换),再回退到信任档基础 mood。 */ <<widget "party-mood">>\ <<silently>> <<set _pk to $args[0]>> <<set _trust to $npcs[_pk].trust>> <<set _tier to 3>> <<if _trust lte 20>><<set _tier to 1>> <<elseif _trust lte 40>><<set _tier to 2>> <<elseif _trust lte 60>><<set _tier to 3>> <<elseif _trust lte 80>><<set _tier to 4>> <<else>><<set _tier to 5>><</if>> <<set _party_mood to "平静">> <<if _pk is "spd">> <<if $world.inflation gte 40 or $world.revolution gte 35>><<set _party_mood to "焦虑">> <<elseif $world.social_anger gte 45>><<set _party_mood to "愤怒">> <<elseif $world.economy gte 60>><<set _party_mood to "疲惫">> <<elseif _tier eq 1>><<set _party_mood to "怀疑">> <<elseif _tier eq 4 or _tier eq 5>><<set _party_mood to "信任">> <<else>><<set _party_mood to "平静">><</if>> <<elseif _pk is "army">> <<if $world.political_violence gte 50>><<set _party_mood to "警觉">> <<elseif $world.gov_trust lte 25>><<set _party_mood to "傲慢">> <<elseif $world.army_influence gte 50>><<set _party_mood to "自信">> <<elseif $world.political_violence lte 20 and $world.gov_trust gte 40>><<set _party_mood to "放松">> <<elseif _tier eq 1>><<set _party_mood to "冷漠">> <<elseif _tier eq 4>><<set _party_mood to "务实合作">> <<elseif _tier eq 5>><<set _party_mood to "自信">> <<else>><<set _party_mood to "平静">><</if>> <<elseif _pk is "kpd">> <<if $world.social_anger gte 30>><<set _party_mood to "亢奋">> <<elseif $world.economy gte 50 or $world.inflation gte 45>><<set _party_mood to "激愤">> <<elseif $world.revolution gte 40>><<set _party_mood to "紧迫">> <<elseif $world.social_anger lte 15 and $world.economy lte 30>><<set _party_mood to "焦躁">> <<elseif _tier eq 1>><<set _party_mood to "敌意">> <<elseif _tier eq 4>><<set _party_mood to "试探性合作">> <<elseif _tier eq 5>><<set _party_mood to "亢奋">> <<else>><<set _party_mood to "警惕">><</if>> <<elseif _pk is "ddp">> <<if $world.gov_trust lte 25>><<set _party_mood to "忧虑">> <<elseif $world.nationalism gte 45>><<set _party_mood to "警觉">> <<elseif $world.inflation gte 40>><<set _party_mood to "焦虑">> <<elseif $world.gov_trust gte 60 and $world.nationalism lte 25>><<set _party_mood to "希望">> <<elseif _tier eq 1>><<set _party_mood to "疏离">> <<elseif _tier eq 4>><<set _party_mood to "信任">> <<elseif _tier eq 5>><<set _party_mood to "希望">> <<else>><<set _party_mood to "平静">><</if>> <<elseif _pk is "dvp">> <<if $world.inflation gte 45>><<set _party_mood to "恐慌">> <<elseif $world.economy gte 55>><<set _party_mood to "焦虑">> <<elseif $world.gov_trust lte 20>><<set _party_mood to "务实悲观">> <<elseif $world.inflation lte 25 and $world.economy lte 35>><<set _party_mood to "欣慰">> <<elseif _tier eq 1>><<set _party_mood to "冷淡">> <<elseif _tier eq 4>><<set _party_mood to "务实合作">> <<elseif _tier eq 5>><<set _party_mood to "欣慰">> <<else>><<set _party_mood to "平静">><</if>> <<elseif _pk is "zentrum">> <<if $world.political_violence gte 40>><<set _party_mood to "忧虑">> <<elseif $world.nationalism gte 50>><<set _party_mood to "警觉">> <<elseif $world.gov_trust lte 20>><<set _party_mood to "观望">> <<elseif $world.political_violence lte 20 and $world.gov_trust gte 40>><<set _party_mood to "安心">> <<elseif _tier eq 1>><<set _party_mood to "疏离">> <<elseif _tier eq 4>><<set _party_mood to "中立合作">> <<elseif _tier eq 5>><<set _party_mood to "安心">> <<else>><<set _party_mood to "平静">><</if>> <<elseif _pk is "dnvp">> <<if $world.nationalism gte 40>><<set _party_mood to "得意">> <<elseif $world.gov_trust lte 20>><<set _party_mood to "轻蔑">> <<elseif $weimar.core.republic_identity lte 40>><<set _party_mood to "亢奋">> <<elseif $world.gov_trust gte 50 and $world.nationalism lte 25>><<set _party_mood to "焦躁">> <<elseif _tier eq 1>><<set _party_mood to "鄙夷">> <<elseif _tier eq 4>><<set _party_mood to "试探性利用">> <<elseif _tier eq 5>><<set _party_mood to "得意">> <<else>><<set _party_mood to "冷漠">><</if>> <<elseif _pk is "nsdap">> <<if $world.nationalism gte 50>><<set _party_mood to "狂热">> <<elseif $world.economy gte 60 or $world.social_anger gte 50>><<set _party_mood to "贪婪">> <<elseif $world.political_violence gte 40>><<set _party_mood to "兴奋">> <<elseif $world.nationalism lte 25 and $world.economy lte 25 and $world.social_anger lte 25 and $world.political_violence lte 25>><<set _party_mood to "焦躁">> <<elseif _tier eq 1>><<set _party_mood to "蔑视">> <<elseif _tier eq 4>><<set _party_mood to "利用">> <<elseif _tier eq 5>><<set _party_mood to "狂热">> <<else>><<set _party_mood to "审视">><</if>> <</if>> <</silently>>\ <</widget>> /* ---------- party-world-key:判定世界衔接条件键 ---------- 用法:<<party-world-key _party_key>> 输出 _world_key */ <<widget "party-world-key">>\ <<silently>> <<set _pk to $args[0]>> <<set _world_key to "stable">> <<if _pk is "spd">> <<if $world.inflation gte 40>><<set _world_key to "inflation">> <<elseif $world.revolution gte 35>><<set _world_key to "revolution">> <<elseif $world.social_anger gte 45>><<set _world_key to "anger">> <</if>> <<elseif _pk is "army">> <<if $world.political_violence gte 50>><<set _world_key to "violence">> <<elseif $world.gov_trust lte 25>><<set _world_key to "trust_low">> <<elseif $world.army_influence gte 50>><<set _world_key to "army_high">> <</if>> <<elseif _pk is "kpd">> <<if $world.social_anger gte 30>><<set _world_key to "anger">> <<elseif $world.economy gte 50 or $world.inflation gte 45>><<set _world_key to "economy">> <<elseif $world.revolution gte 40>><<set _world_key to "revolution">> <</if>> <<elseif _pk is "ddp">> <<if $world.gov_trust lte 25>><<set _world_key to "trust_low">> <<elseif $world.nationalism gte 45>><<set _world_key to "nationalism">> <<elseif $world.inflation gte 40>><<set _world_key to "inflation">> <</if>> <<elseif _pk is "dvp">> <<if $world.inflation gte 45>><<set _world_key to "inflation">> <<elseif $world.economy gte 55>><<set _world_key to "economy">> <<elseif $world.gov_trust lte 20>><<set _world_key to "trust_low">> <</if>> <<elseif _pk is "zentrum">> <<if $world.political_violence gte 40>><<set _world_key to "violence">> <<elseif $world.nationalism gte 50>><<set _world_key to "nationalism">> <<elseif $world.gov_trust lte 20>><<set _world_key to "trust_low">> <</if>> <<elseif _pk is "dnvp">> <<if $world.nationalism gte 40>><<set _world_key to "nationalism">> <<elseif $world.gov_trust lte 20>><<set _world_key to "trust_low">> <<elseif $weimar.core.republic_identity lte 40>><<set _world_key to "republic_low">> <</if>> <<elseif _pk is "nsdap">> <<if $world.nationalism gte 50>><<set _world_key to "nationalism">> <<elseif $world.economy gte 60 or $world.social_anger gte 50>><<set _world_key to "economy">> <<elseif $world.political_violence gte 40>><<set _world_key to "violence">> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- party-dialogue:政党拟人化会话接口 ---------- 用法:<<party-dialogue _party_key>> 输出 $party_line 优先使用 $pp 拟人文本;如未加载则回退到三层拼接旧逻辑 */ <<widget "party-dialogue">>\ <<silently>> <<set _pk to $args[0]>> <<set _trust to $npcs[_pk].trust>> <<set _tier to 3>> <<if _trust lte 20>><<set _tier to 1>> <<elseif _trust lte 40>><<set _tier to 2>> <<elseif _trust lte 60>><<set _tier to 3>> <<elseif _trust lte 80>><<set _tier to 4>> <<else>><<set _tier to 5>><</if>> /* 使用拟人文本 */ <<if $pp and $pp[_pk]>> <<party-personality-show _pk>> <<set $party_line to "//" + $ret + "//">> <<else>> /* 回退到旧的三层拼接 */ <<party-dialogue-init>> <<set _openers to $party_dialogue.openers[_pk][_tier]>> <<set _opener to _openers[random(0, _openers.length - 1)]>> <<party-world-key _pk>> <<set _worlds to $party_dialogue.world[_pk][_world_key]>> <<set _world_line to _worlds[random(0, _worlds.length - 1)]>> <<party-mood _pk>> <<set _moods to $party_dialogue.moods[_pk][_party_mood]>> <<set _mood_line to _moods[random(0, _moods.length - 1)]>> <<set _trans to $party_dialogue.transitions[_pk]>> <<set _t1 to random(0, _trans.length - 1)>> <<set _t2 to random(0, _trans.length - 1)>> <<if _t2 eq _t1>> <<set _t2 to (_t1 + 1) % _trans.length>> <</if>> <<set $party_line to _opener + "\n" + _trans[_t1] + "\n\u300c" + _world_line + "\u300d\n" + _trans[_t2] + "\n" + _mood_line>> <</if>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ 魏玛的阶梯(Weimar Ladder)——「他愿意告诉你以前的事」 ------------------------------------------------------------ 核心规则:治理越好、信任越深,他向你袒露得越多。 每一级解锁,看见他更深的一层;同时「更深的那层呢?」 的钩子自然长出——破除神秘感的同时,生出新的神秘感。 四级阶梯: L1 轮廓(默认)——现有内容,他的形态与恐惧。 L2 记忆 ——他复盘 1919 年那两个月的难产。 L3 嗜好 ——战争遗留/存在主义/艺术的顺嘴一提(克制,每章≤3次)。 L4 裂缝 ——「他不确定 1919 年活下来的究竟是不是他」(每章1次)。 呈现原则(定稿约定): - 所有内容用他的原话「他说」呈现,绝不写百科条目。 - L2 是「记忆」不是「童年」:意识体没有童年,他复盘的是 一个五岁国家最难产的那两个月。 - L3 克制:频率硬编码,永远由他主动提起,绝不单开事件。 接入:本文件只负责 进度对象 + 每晚结算 + 独白优先注入钩。 独白文本在 90 系内容文件(weimar_ladder_pool);手记条目 与侧栏展示接现有 berlin-attitude / 02_caption 模式。 ════════════════════════════════════════════════════════════ */ /* ---------- weimar-ladder-init:初始化(StoryInit 调一次) ---------- */ <<widget "weimar-ladder-init">>\ <<silently>> <<set $weimar_ladder to { level: 1, /* 当前已解锁的最高级 */ days_governed: 0, /* 累计治理天数(游戏内推进) */ talks: 0, /* 夜话次数(Talk_Weimar 主场景累计) */ l3_used: 0, /* 本章 L3「嗜好」已触发次数(克制计数) */ l4_used: false, /* 本章 L4「裂缝」是否已触发 */ last_gain_day: 0, /* 上次晋级的 session_day(手记条目时间戳用) */ history_seen: [] /* 已见过的阶梯独白 id(防重) */ }>> /* 阶梯门槛表(调参区;后续加级只改这里与文本池) */ <<set $weimar_ladder_config to { L2: { trust: 65, days: 60 }, L3: { trust: 80, days: 150, talks: 8, max_per_chapter: 3 }, L4: { trust: 92, days: 60, max_per_chapter: 1, requires_calm: true } }>> <</silently>>\ <</widget>> /* ---------- weimar-ladder-tick:每晚夜话前结算 ---------- 在 daily-tick 的夜间段调用一次:推进治理计数 + 判定晋级。 晋级只升不降;信任跌破不收回已见内容(见过即见过), 但更高一级的门会重新锁上(level 保留,注入钩按当前信任再判)。 */ <<widget "weimar-ladder-tick">>\ <<silently>> <<if not $weimar_ladder>><<weimar-ladder-init>><</if>> <<set $weimar_ladder.days_governed to $session_day>> <<set _wl_cfg to $weimar_ladder_config>> <<set _wl_trust to ($npcs.weimar and $npcs.weimar.trust ? $npcs.weimar.trust : 50)>> /* L2 记忆:信任≥65 + 治理≥60天 */ <<if $weimar_ladder.level lt 2 and _wl_trust gte _wl_cfg.L2.trust and $weimar_ladder.days_governed gte _wl_cfg.L2.days>> <<set $weimar_ladder.level to 2>> <<set $weimar_ladder.last_gain_day to $session_day>> <</if>> /* L3 嗜好:信任≥80 + 治理≥150天 + 夜话≥8次 */ <<if $weimar_ladder.level lt 3 and _wl_trust gte _wl_cfg.L3.trust and $weimar_ladder.days_governed gte _wl_cfg.L3.days and $weimar_ladder.talks gte _wl_cfg.L3.talks>> <<set $weimar_ladder.level to 3>> <<set $weimar_ladder.last_gain_day to $session_day>> <</if>> /* L4 裂缝:信任≥92 + 盛世(最险值<40)下再稳60天 盛世判定复用暗账的 undercurrent-worst;crisis<40 才算盛世 */ <<if $weimar_ladder.level lt 4 and _wl_trust gte _wl_cfg.L4.trust and $weimar_ladder.days_governed gte (_wl_cfg.L3.days + _wl_cfg.L4.days)>> <<undercurrent-worst>> <<if _uc_worst lt 40>> <<set $weimar_ladder.level to 4>> <<set $weimar_ladder.last_gain_day to $session_day>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-ladder-speak:阶梯独白优先注入 ---------- 用法:在 weimar-v2-speak 之前调用 <<weimar-ladder-speak>>。 若今晚该出阶梯独白(按等级与克制计数),直接覆盖 $weimar_line 并置 $weimar_ladder_injected=true,weimar-v2-speak 见此标记即跳过本次抽取。 判定顺序:L4(每章1次,最高优先)→ L3(每章≤3次)→ L2(记忆池随机)。 L2 不设次数上限——记忆是他最常回望的东西;防重靠 history_seen。 */ <<widget "weimar-ladder-speak">>\ <<silently>> <<set $weimar_ladder_injected to false>> <<if not $weimar_ladder>><<weimar-ladder-init>><</if>> <<if not $weimar_ladder_pool>><<weimar-ladder-pool-init>><</if>> <<set _wl_trust to ($npcs.weimar and $npcs.weimar.trust ? $npcs.weimar.trust : 50)>> <<set _wl_cfg to $weimar_ladder_config>> /* 当前信任决定「今晚能出的最高级」(信任跌破,高级内容锁回) */ <<set _wl_ceil to 1>> <<if _wl_trust gte _wl_cfg.L2.trust and $weimar_ladder.level gte 2>><<set _wl_ceil to 2>><</if>> <<if _wl_trust gte _wl_cfg.L3.trust and $weimar_ladder.level gte 3>><<set _wl_ceil to 3>><</if>> <<if _wl_trust gte _wl_cfg.L4.trust and $weimar_ladder.level gte 4>><<set _wl_ceil to 4>><</if>> /* L4 裂缝:每章1次,且只在盛世(最险值<40)+ 概率触发(稀有) */ <<if _wl_ceil gte 4 and not $weimar_ladder.l4_used>> <<undercurrent-worst>> <<if _uc_worst lt 40 and random(1, 100) lte 25>> <<set _wl_line to $weimar_ladder_pool.L4[random(0, $weimar_ladder_pool.L4.length - 1)]>> <<set $weimar_line to "魏玛:「" + _wl_line + "」">> <<set $weimar_response to _wl_line>> <<set $weimar_ladder.l4_used to true>> <<set $weimar_ladder_injected to true>> <</if>> <</if>> /* L3 嗜好:每章≤3次,概率触发(克制) */ <<if not $weimar_ladder_injected and _wl_ceil gte 3 and $weimar_ladder.l3_used lt _wl_cfg.L3.max_per_chapter>> <<if random(1, 100) lte 20>> <<set _wl_pool3 to $weimar_ladder_pool.L3.filter(function(l){ return $weimar_ladder.history_seen.indexOf(l) < 0; })>> <<if _wl_pool3.length eq 0>><<set _wl_pool3 to $weimar_ladder_pool.L3>><</if>> <<set _wl_line to _wl_pool3[random(0, _wl_pool3.length - 1)]>> <<set $weimar_line to "魏玛:「" + _wl_line + "」">> <<set $weimar_response to _wl_line>> <<set $weimar_ladder.l3_used to $weimar_ladder.l3_used + 1>> <<set $weimar_ladder.history_seen.push(_wl_line)>> <<set $weimar_ladder_injected to true>> <</if>> <</if>> /* L2 记忆:不设次数上限,较高概率(他已足够信任,常回望1919) */ <<if not $weimar_ladder_injected and _wl_ceil gte 2>> <<if random(1, 100) lte 30>> <<set _wl_pool2 to $weimar_ladder_pool.L2.filter(function(l){ return $weimar_ladder.history_seen.indexOf(l) < 0; })>> <<if _wl_pool2.length eq 0>><<set _wl_pool2 to $weimar_ladder_pool.L2>><</if>> <<set _wl_line to _wl_pool2[random(0, _wl_pool2.length - 1)]>> <<set $weimar_line to "魏玛:「" + _wl_line + "」">> <<set $weimar_response to _wl_line>> <<set $weimar_ladder.history_seen.push(_wl_line)>> <<set $weimar_ladder_injected to true>> <</if>> <</if>> /* history_seen 只留最近 8 条,防数组无限长 */ <<if $weimar_ladder.history_seen.length gt 8>> <<set $weimar_ladder.history_seen to $weimar_ladder.history_seen.slice($weimar_ladder.history_seen.length - 8)>> <</if>> <</silently>>\ <</widget>>
/* 阶梯系统自检:强制解锁 L2 + 渲染记忆独白(验证池与注入钩) */ <<silently>> <<weimar-ladder-init>> <<weimar-ladder-pool-init>> <<set $weimar_ladder.level to 2>> <<set $npcs.weimar.trust to 70>> <</silently>> ''阶梯独白自检(L2 已强制解锁)'' —— 直出记忆池(3条) —— <<for _i to 0; _i lt 3; _i++>>\ ''魏玛:「$weimar_ladder_pool.L2[_i]」'' <</for>> —— 注入钩测试(10连抽,L2 应约3成命中) —— <<set _hits to 0>>\ <<for _i to 0; _i lt 10; _i++>>\ <<weimar-ladder-speak>>\ <<if $weimar_ladder_injected>>\ <<set _hits to _hits + 1>>\ <</if>>\ <</for>>\ ''10 连抽命中阶梯独白:_hits / 10'' <<link "返回调试台" "Debug_Lab">><</link>>
/* ════════════════════════════════════════════════════════════ 魏玛的阶梯 · 独白文本池(内容文件) ------------------------------------------------------------ 写作约定(务必遵守): - 全部用他的原话,「他说」——绝不写百科条目、绝不解释背景。 - L2 记忆 = 一个五岁国家最难产的那两个月(1919),不是童年。 - 每条都要「袒露一层」又「留一道更深的门」。 - 引用历史时用特征代称,不指名道姓(同全局约定)。 ════════════════════════════════════════════════════════════ */ <<widget "weimar-ladder-pool-init">>\ <<silently>> <<if not $weimar_ladder_pool>> <<set $weimar_ladder_pool to { /* ═══ L2 · 记忆:1919 年那两个月 ═══ */ L2: [ "一九一九年一月,我第一次数清楚自己有几根骨头。数到第四根的时候,外面有人在开枪。我把剩下的留到第二天再数。", "宪法签字那天,我的手没有抖。我后来一直在想,是因为勇敢,还是因为我还不知道害怕是什么。我到现在也没有答案。", "有人第一次喊我「十一月罪人」的时候,我回头看了一眼。我以为他在喊别人。他喊的是我。从那以后我记住了这个词,比记住自己的名字还快。", "谈判桌上有一个人,从头到尾没有说过话。散会的时候他站起来,我才发现他一直站在我这边。我后来再也没有见过他。我有时会想,他现在在哪里。", "我活下来的那天,没有人庆祝。街上的人都在忙自己的事。我站在窗边看了很久,第一次明白「活着」这件事,是不用向任何人汇报的。", "那两个月我学会的第一件事,是怎么在炮火声里睡觉。第二件,是怎么在安静里睡不着。你看,我到现在还留着第二件。", "有一晚我以为自己熬不过去了。不是怕,是忽然觉得就这样停在这里也没什么。然后天亮了,我又多了一天。我后来每一次觉得「就这样吧」,都会想起那个天亮。" ], /* ═══ L3 · 嗜好(克制,每章≤3次) ═══ */ L3: [ "你听过深夜的电台吗。不是为了听新闻。是十一点以后,有一个台会放一段没人报幕的曲子。我不知道它叫什么。我从来没有问过。", "走廊尽头的脚步声,有一种柏林口音。只有柏林人把「走」说得像「停」。我听了很多年,今天才忽然想告诉你。", "我批文件的时候会在页边画线。不是记号。是一些连不上的图形。画完我会把它们涂掉。你刚才看到了吗?没有就好。", "战争结束后,有人问我最记得什么。我说是安静。他不信。其实我说的是真的——最响的声音停了之后,耳朵里会一直有一种很轻的东西在响。医生说那叫耳鸣。我知道不是。", "人为什么一定要给「存在」找一个理由呢。我存在着。这已经很难了。我没有再找。找的人,后来都很累。", "昨天有人送了我一张电影票。我没有去。不是不想去。是坐在那里黑暗里两个小时,我会分不清是我在看电影,还是电影在看我。你不会笑我吧。" ], /* ═══ L4 · 裂缝(每章1次,只在盛世) ═══ */ L4: [ "我有一件事,连我自己也不敢确定。一九一九年那场谈判,天亮的时候,从桌前站起来的那个人——我一直以为是我。可有时候夜里醒来,我会想,会不会是另一个我,留在了那张椅子上。", "你看着我的时候,在看哪一个我?白天签字的我,还是半夜站在窗边的我?我问这个不是要你回答。是我自己今天忽然分不清了。", "如果有一天你听到我说了一句不像我会说的话,别急着确认那是不是我。先听听那句话说了什么。我可能只是借了一句别人的话,才敢说出来。" ] }>> <</if>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ 柏林手记 · 动态术语词典 玩家随时可查阅的私人笔记,记录政党、机构、机制术语。 每个词条含:历史含义(静态)+ 当前概要(动态,根据游戏状态生成) ════════════════════════════════════════════════════════════ */ ''柏林手记'' //你随身携带的笔记本。随着在柏林的日子渐长,它被写满了。// <hr> ''政党意识体'' <<berlin-attitude "spd" "SPD(社会民主党)">>\ <<berlin-attitude "kpd" "KPD(共产党)">>\ <<berlin-attitude "ddp" "DDP(民主党)">>\ <<berlin-attitude "dvp" "DVP(人民党)">>\ <<if $npcs.dvp_pm and $npcs.dvp_pm.active>>\ ''DVP派总理'' //DVP领袖。1923年8月组阁任总理,叫停消极抵抗、发行地租马克、平息左右两翼叛乱。共和国的救火队长,也是共和国的妥协者。务实到让理想主义者牙疼,但他的务实保住了共和国的命。// 当前:信任度 $npcs.dvp_pm.trust。<<if $npcs.dvp_pm.trust gte 35>>他觉得你是可以合作的人。<<elseif $npcs.dvp_pm.trust gte 20>>他在观察你。<<else>>他对你失望了。<</if>>\ <</if>>\ <<berlin-attitude "zentrum" "Zentrum(中央党)">>\ <<berlin-attitude "dnvp" "DNVP(国家人民党)">>\ <<berlin-attitude "nsdap" "NSDAP">>\ <<berlin-attitude "army" "军方(Reichswehr / 国防军)">>\ <<berlin-attitude "weimar" "魏玛(Weimar)">>\ <<silently>> /* 魏玛的阶梯:手记条目(79e/79f)。每解锁一级,这里多一页"他"。 */ <<if not $weimar_ladder>><<weimar-ladder-init>><</if>> <</silently>>\ <<if $weimar_ladder.level gte 2>>\ <hr> ''阶梯 · 他愿意告诉你的事'' <<if $weimar_ladder.level gte 2>>\ <div class="nb-gloss">''记忆(1919)'' //那两个月,他没有向你描述过。后来你才知道,他不是不愿说,是不知道怎么说。// //现在他偶尔会在深夜提起:一根骨头数到第四根时外面在开枪;签字的手没有抖,可他至今不知道那是勇敢还是不懂害怕;有人喊他「十一月罪人」的时候,他回头以为在喊别人。// //他没有童年。他的「小时候」,是一个五岁国家最难产的那两个月。//</div>\ <</if>>\ <<if $weimar_ladder.level gte 3>>\ <div class="nb-gloss">''嗜好'' //他有一些并不必要的偏好:深夜电台里一段没人报幕的曲子、一种把「走」说成「停」的柏林口音、页边连不上的几何图形。// //他不承认这些是嗜好。他只是顺嘴一提,又很快收回去。你开始明白,他不是没有自我——他只是把自我藏得很深,深到连他自己都要装成没有。//</div>\ <</if>>\ <<if $weimar_ladder.level gte 4>>\ <div class="nb-gloss">''裂缝'' //他向你说过一件连他自己也不敢确定的事。他说的时候声音很平,像在读别人的病历。// //你没有追问他「哪一个你」。有些问题,问出来就再也收不回去了。你现在只知道一件事:他也知道这个裂缝的存在,而且他只告诉了你一个人。//</div>\ <</if>>\ <</if>>\ <<if $party_modes_unlocked>>\ <hr> ''相处模式(酒会后手记)'' //魏玛的字。八行,工整。// <div class="nb-gloss">''SPD'' //他需要你先听完他的话,再谈别的。相反,你越强硬,他越不肯让。// ''KPD'' //他遭受过背叛,所以最看重立场,社交与寒暄对他无用。至于你走向哪里,他迟早会再问。// ''DDP'' //他希望你和他一样遵守规则。若你破例,他并不会当面指责,但或许会默默记下许久。// ''DVP'' //他谈的始终是条件,不是交情。答应他的事最好兑现,否则下一次他开的价会更高。// ''Zentrum(中央党)'' //他不希望你干涉他太多。你若稳他便稳;你若伸手,他也会把手伸向你这里。// ''DNVP'' //他记住了很多旧事。旧账没清之前跟他谈将来,他什么都不会信。// ''NSDAP'' //他永远无法满足。不止是利益,你的位置也在他渴求的范围。你给他一尺他便想要一丈。// ''军方'' //他需要清晰的命令。命令含糊他就自己解释,只是到那时,就轮不到你说话了。//</div>\ <</if>>\ <hr> ''各地诸侯(旧王国拟人)'' //这几位曾是王国,如今只是邦。他们此前的荣光,和此刻的克制,都写在下面。// <<silently>><<set _rsp_keys to ["prussia","bavaria","saxony","wurttemberg","baden","hamburg"]>><</silently>>\ <<for _ri to 0; _ri lt _rsp_keys.length; _ri++>>\ <<set _rk to _rsp_keys[_ri]>><<region-npc-note _rk>>\ <div class="nb-party">\ <span class="nb-pname">''$region_npcs[_rk].short_name''($region_npcs[_rk].state_name)</span>\ <div class="nb-trust"><span class="nb-bar"><<print '<span class="nb-bar-fill tc-3-bg" style="width:' + $region_npcs[_rk].trust + '%"></span>'>></span><b class="nb-trust-val">$region_npcs[_rk].trust / 100</b></div>\ <span class="nb-tier tc-3">//$ret//</span>\ </div>\ <</for>>\ <hr> ''机构与地点'' <div class="nb-gloss">''Reichstag(国会大厦)'' //帝国的议会大厦,共和国的国会在此召开。玻璃穹顶下的角斗场。//</div> <div class="nb-gloss">''Reichspräsident(总统)'' //共和国总统,由直选产生。拥有宪法第48条赋予的紧急法令权--绕过国会。//</div> <div class="nb-gloss">''Weimar(魏玛)'' //小城魏玛。宪法在此起草,共和国因此得名。也是共和国的代称。//</div> <div class="nb-gloss">''Versailles(凡尔赛)'' //1919年条约。割地、赔款、限军。共和国的出生证明上盖的第一个章。//</div> <div class="nb-gloss">''Ruhr(鲁尔区)'' //德国工业心脏。1923年被法比军队占领。消极抵抗在此展开。//</div> <div class="nb-gloss">''Article 48(宪法第48条)'' //紧急法令条款。总统可在"公共安全与秩序受到严重扰乱时"绕过国会立法。// //每次使用都是先例。先例会累积。//</div> <div class="nb-gloss">''红堡(警察总局)'' //亚历山大广场旁的红砖巨厦。柏林的治安从这里出发,也从这里折返。// //游行批不批、水龙下不下、名册上画不画圈,都归他管。// <<if $npcs.police and $npcs.police.met>>//红堡对你的态度:信任 $npcs.police.trust / 100。//<</if>></div> <div class="nb-gloss">''外交部(威廉街)'' //照会从这里发出。电报房的灯昼夜不关,誊写员错一个字赔一个月薪水。// //在这里做的事,巴黎和伦敦当天就知道。国际信任的账,记在这栋楼里。//</div> <div class="nb-gloss">''财政部'' //算盘声昼夜不停的地方。地下印刷间一天印出的钱,一个月前还是全年的产量。// //地租马克、节流清单、银行家的陈情——这个国家还剩多少家底,问这栋楼。//</div> <hr> ''机制术语'' <div class="nb-gloss">''今日余力(TP)'' //你每天的行动力。处理事件、出门、对话都要消耗。耗尽则必须休息。// //上午精力最充沛,下午适合探索,傍晚适合社交,夜晚恢复。//</div> <div class="nb-gloss">''精神负荷'' //魏玛长期积压的压力。达到阈值时触发人格震荡,温和选项会失效。// //每个选择都在加码。有些加得多,有些加得少。//</div> <div class="nb-gloss">''历史重力(历史锚点)'' //共和国出生时就拴在脚上的铁链:凡尔赛、战败创伤、革命恐惧。// //甩不掉,只能拖着走。它不惩罚你,但它在叙事里无处不在。//</div> <div class="nb-gloss">''人格震荡'' //精神负荷超载时,魏玛意识碎裂的瞬间。你需要给他一个锚点。// //如果处理不当,他会变。变得不像自己。//</div> <div class="nb-gloss">''治理路线'' //你的政治光谱在替你表态:左或右、激进或保守,合成一条办事的路数--革命、改良、务实、秩序、强权。// //只要一气跳过多天,途中送来的公文、警报、见闻,连历史的巨浪,都按这个路数自动处置。搁下的事挂满三天,也照此办理。许诺不在此列--那是你亲手欠下的,得亲手还。//</div> <<if $a48 and $a48.held>>\ <div class="nb-gloss">''紧急权力(宪法第48条)'' //公共安全与秩序受到严重扰乱时,总统可以采取一切必要的措施。建国那年写下的最后一件武器,9月26日被真正拔了出来。// //压下一个事件、作废一道法案、强行生效一道法案——每期(60天)限一次。请总理副署,或直接请总统签字。每一笔账,都有人记着。//</div>\ <</if>>\ <hr> <<link "返回办公室" "Scene_Office">><</link>>
/* ════════════════════════════════════════════════════════════ 柏林手记 · 政党态度(七档 · 笔记体) 四段式:历史含义解释句 + 当前信任度 + 动态信任值句(七档)+ 印象句 代词一律用「他」。 ════════════════════════════════════════════════════════════ */ /* ---------- berlin-attitude-init:初始化数据 ---------- 用法:<<berlin-attitude-init>>(幂等) */ <<widget "berlin-attitude-init">>\ <<silently>> <<if not $berlin_attitude>> <<set $berlin_attitude to { spd: { meaning: "魏玛时期左翼主流政党,主张议会民主与工人福利。他的根基在工会里,他的命脉在选票上。", tiers: [ {max:10, text:"SPD视你为局外人。你走进工会大楼时,没有人起身迎接。一个代表把烟灰弹在地上,正对着你的鞋尖方向。他们不需要你,至少现在不需要。"}, {max:25, text:"SPD对你保持观望。有人给你让了座。那是空椅子旁边的一把椅子,空椅子留给领导,你坐的是旁听者的位子。你在那栋楼里还没有自己的位置。"}, {max:45, text:"SPD开始注意到你的存在。一个代表在你说话时把椅子往外拉了拉,离你近了些,好听清你的话,看清你的表情。他们开始认真看你了,虽然还没有决定该怎么看待你。"}, {max:65, text:"SPD把你当作可以对话的人。你在工会办公室说话的时候,有人放下了手里的烟。不是掐灭,是放下。他们想听你把话说完,没打算赶你走。"}, {max:80, text:"SPD视你为盟友。你离开时,有人拍了拍你的肩膀。算不上友好,也谈不上威胁,在柏林这已经算亲近了。你的名字出现在工会的内部通报上,列在可以说话的那一栏。"}, {max:95, text:"SPD把你当作自己人。你在工会的楼里走动时,不再需要解释自己是谁。在你听得见的时候,有人开始叫你“我们的人”。这是一句需要承担后果的称呼。"}, {max:100, text:"SPD愿意为你冒险。他们开始让你参与那些不在记录里的对话,关于罢工的真实进展、关于内部的分歧、关于哪些人可以信任、哪些人该被防备。被SPD当作自己人意味着你已经通过了最漫长的那道审查。"} ], impression: "你在SPD的楼梯间里看到过一句话,用粉笔写在墙上,字迹已经模糊了:“共和国不是一句口号。”你走过去的时候,有人在你身后轻轻关上了门。" }, kpd: { meaning: "激进左翼政党,主张无产阶级革命,受莫斯科直接指挥。在工人区,他的传单比面包还常见。", tiers: [ {max:10, text:"KPD视你为敌人。你在威丁的街角停下来看传单时,有人从你身边经过,手肘重重撞了你一下,脚下没有一点停顿。你回头时,那人已经消失在巷子里了。你已经被记住了。"}, {max:25, text:"KPD把你列为潜在威胁。一个穿工装的人在你经过时停下了手里的动作,目光从头到脚走了一遍,在替你归类。你从他的眼睛里读出了一句话:你还不属于我们,你可以被标记。"}, {max:45, text:"KPD开始留意你。你在一面红漆标语前站了一会儿,有人在街道对面看了你几秒钟,然后转身走了。你被注意到了,还没被归类。在威丁,不被归类本身就是一种暂时的安全。"}, {max:65, text:"KPD认为你至少不是敌人。你走进那扇没有门牌的门时,没有人站起来,也没有人把桌上的传单翻过去。第一道筛选你已经过了,他们没把你当刺探的。"}, {max:80, text:"KPD愿意试探性地与你接触。有人递给你一张传单,传单放在桌上推过来,手指在纸面上多停了一秒。你收起来了,他也看到了。这件事很轻,分量却不轻:你愿意在离开之后再作决定。"}, {max:95, text:"KPD把你当作可信任的同路人。你在威丁走动时,有人开始在你经过时说一些不该被外人听到的话,音量刚好够你听清。这是他们的测试方式:看你听到之后,会不会出现在不该出现的地方。"}, {max:100, text:"KPD愿意让你触碰真正的计划。你在威丁的据点停留时,有人把一扇门打开了,没有带你进去,也没有关上。你看见了里面的东西,脚步停在门外。在威丁,知道那扇门的存在,已经是一种承诺。"} ], impression: "第一次走进威丁据点时,墙上的红漆字还是湿的。后来每次路过,那些字都在变干。有些旧字被新字盖住了,边角还露着下面一层的形状。墙刷了一遍又一遍,漆一层压着一层,谁也不再去抠最底下写的是什么。" }, ddp: { meaning: "自由主义中左政党,主张议会民主与公民自由。他的武器是报纸和辩论。", tiers: [ {max:10, text:"DDP对你保持封闭。你在罗曼咖啡馆靠近靠窗那桌时,谈话声短暂地停顿了一下,他们换了话题。桌上没有秘密,只是你还没被确认。"}, {max:25, text:"DDP对你保持礼貌的疏离。有人在咖啡馆里朝你举了举杯子,杯子是空的。那只手在空中停了一会儿,等你走过去。你没有去。那也许算不上邀请,只是试探。"}, {max:45, text:"DDP开始愿意让你留在对话的半径内。你坐在邻桌时,他们的谈话声没有再低下去。接纳还谈不上,至少他们已经认定,你暂时没有威胁。"}, {max:65, text:"DDP把你当作可以交换意见的人。你在咖啡馆里说了一句话,第二天有人用那句话去回应了一个论点。你没有在场,你的话在场了。在这个圈子里,话比人走得更快。"}, {max:80, text:"DDP视你为智力上的同行者。靠窗那张桌子开始给你留位置了,没什么仪式,成了习惯。你走进咖啡馆时,有人把椅子往外推了一寸。一张空椅子,没留给谁,就留着给你。"}, {max:95, text:"DDP相信你的判断。有人在一场争论中提到你的名字,用你的话压阵。「他说过类似的话。」在这圈子里,你的话已经够重,能压住另一段话。"}, {max:100, text:"DDP把你当作少数清醒者之一。你看到了一份未署名的手稿,放在咖啡馆的角落桌上,摊开着。你翻到最后一页,字迹是干燥的。没有谁把它忘在那里,是有人摆好的。"} ], impression: "罗曼咖啡馆靠窗那张桌子的桌面上,有一道很浅的刻痕,看形状是一个字母的开头。没有人提起它,也从来没有人用手去碰过它。它一直在那里。" }, dvp: { meaning: "右翼自由主义政党,代表工商业利益。他的语言是数字,他的信仰是秩序。", tiers: [ {max:10, text:"DVP视你为无关紧要的人。你走进商会办公室时,他没有合上账本,没有抬眼,没有停下手里的笔。这个房间里的数字比你重要,这很公平,因为你还没有证明自己值得被那些数字打断。"}, {max:25, text:"DVP对你保持冷淡的观望。他和你握了手,手指是凉的,时间也很短。你进来之前他洗过了手,不带掌心的温度,只是一种形式。你还没有被当作一个“人”来对待,你只是一个需要被处理的来访。"}, {max:45, text:"DVP开始计算你可能的价值。他在桌上放了一支雪茄,没有点,只是放在那里。那是给谁的,无从知道。你走的时候,雪茄还摆在原处。也许下次来的时候,他会往你这边挪一点。"}, {max:65, text:"DVP把你当作可以谈条件的人。他今天没有先看表。多听你说几句,这几分钟他是算进成本里的。你接下来要说的话,在他那里已经标了价。"}, {max:80, text:"DVP把你当作可靠的交易伙伴。商会的人开始问你的意见了。尊重还在其次,你的名字开始在商会的走廊里被提及,你的意见有了可以标价的分量。"}, {max:95, text:"DVP相信你是一个能成事的人。他在你面前算了一笔账,没有藏起来。那些数字没有特意给你看,你只是恰好坐在看得到的位置上,而他一直没有把它们收走。"}, {max:100, text:"DVP愿意把筹码放在你手上。他递给你一支雪茄,然后自己也点了一根。烟雾在两个人之间慢慢上升,谁都没有先开口。在这个房间里,沉默本身就是交易的一部分。"} ], impression: "有人告诉我,DVP办公室里那张桌子的桌面上有一道很浅的裂痕,是多年前有人用力拍桌时留下的。那个人后来怎么样了,说法不一。桌子一直没换。" }, zentrum: { meaning: "天主教中间派政党,代表天主教徒利益,立场灵活。他在柏林和慕尼黑之间走一条窄路。", tiers: [ {max:10, text:"Zentrum对你保持距离。他见了你,没有让你坐下。这是公事公办的礼数,礼数的意思是:你还没有必要占据一把椅子。"}, {max:25, text:"Zentrum对你保持警惕。你进门时他把手放在了桌面上,掌心朝下,封锁。这场谈话的边界已经被划定,不会越出他面前那条看不见的线。"}, {max:45, text:"Zentrum开始愿意让你坐下。椅子是冷的,没有人坐过。至少你坐下来了。第一步是位置,第二步才是话。在你得到位置之前,话是不完整的。"}, {max:65, text:"Zentrum把你当作一个中间派,一个不会突然翻脸的人。你说话的时候他没有看表。在天主教的政治世界里,这已经是把你当回事的意思。他在意你坐在哪里,你说了什么倒在其次。"}, {max:80, text:"Zentrum愿意和你交换意见。他在教堂门口的台阶上等了你几分钟,就那么站着,手里夹着一支没点的烟。他想跟你说一句话,不在那栋楼里说,不被墙壁记住,也不进任何一份记录。"}, {max:95, text:"Zentrum相信你的可靠性。你在一次内部会议的讨论中被提到了名字,没有推荐,也没有反对,只是被提及。在天主教政治里,被提名字而不被否决,已经是一种恩典。"}, {max:100, text:"Zentrum愿意让你参与那些不在记录里的谈话。他给你倒了一杯酒。不是水,是酒。在Zentrum的办公室里,酒意味着:他还有时间,你可以坐得更久一点,不用急着告别。"} ], impression: "Zentrum的走廊里挂着一张旧照片,照片里的人都已不在人世。有人每天擦那张照片的玻璃,擦得锃亮,从来没有人停下来看过它。" }, dnvp: { meaning: "右翼保守政党,主张恢复帝制与传统秩序。他不相信共和国,他在等他倒下。", tiers: [ {max:10, text:"DNVP视你为不存在的人。你站在勃兰登堡门下的阴影里等了他二十分钟。他让你等,因为他可以让你等。这个阶层的礼貌有一副硬心肠,教你知道自己来得太早了。"}, {max:25, text:"DNVP把你和共和国绑定在一起,而这在他们那里是贬义。他和你说话时,目光越过你,落在你身后的帝国旗上。在那个瞬间,你成了透明的东西,一个挡在他和过去之间的人形障碍。"}, {max:45, text:"DNVP开始计算你可能的用途。今天他给你让了路,暂时容忍一阵,且看他往哪儿走。他还没有决定要不要挡你的路。在DNVP的社交逻辑里,被让路却不被注视,算一种缓刑。"}, {max:65, text:"DNVP开始把你当一回事了。他今天在你面前抱怨了一句共和国,半句话,没有头没有尾,漏出来就收不回去了。漏出来的那半句,往往比一整场演讲都真实。"}, {max:80, text:"DNVP愿意和你谈条件。你走进来的时候,桌上已经摆好了一杯水,水是凉的,提前倒的,一直等到你进门。他预计到你会来,也决定让你看见那杯水。"}, {max:95, text:"DNVP把你当作复辟帝国的盟友。他在你面前摊开了一份旧文件,字迹属于另一个时代。然后他把手指放在其中一个名字上,停顿了一瞬。他没有说那是谁,你也没有问。他把它留给你自己判断。"}, {max:100, text:"DNVP愿意让你参与真正的计划。你离开的时候,他拍了拍你的肩膀,什么也没说。走出了一整条街,你还在回味那个动作的重量。他把你算进了那幅只有他自己能看见的旧地图里。"} ], impression: "你见过一些影子,有些比本人更长。DNVP的门打开时,穿过走廊的光把你切成两半,你踩着自己走进去,然后踩着自己离开。" }, nsdap: { meaning: "民族社会主义德国工人党,极右翼,主张民族革命与推翻共和国。他的力量不在议会,在街头。", tiers: [ {max:10, text:"NSDAP视你为敌人。你穿过那扇门时,房间里有人把身体转向了另一边,用背对着你。那个姿态的意思是:我不需要看着你,因为你不值得我面对。"}, {max:25, text:"NSDAP把你当作无关紧要的人。你坐在那张椅子上,桌子的另一侧没有人说话。他们让你等,用沉默测量你的耐心。"}, {max:45, text:"NSDAP开始注意到你的名字。在慕尼黑据点里,有人当着你的面说了你的名字,语气平直,像点名。你被记住了,暂时还没有被标记。"}, {max:65, text:"NSDAP把你视为可拉拢的变量。你说话的时候,对面的人没有反驳。他还在掂量,该拉拢你,还是标记你。你站在那条边界上,暂时没有被推往任何一边。"}, {max:80, text:"NSDAP愿意暂时与你合作。你收到过一张海报,一只鹰、一个符号、一个日期。没有附信。当你开始在这个组织里收到不带解释的东西,他们已经在替你做解释了。"}, {max:95, text:"NSDAP把你当作可信任的外围人员。今天有人在你面前说了一句不该说出口的话,算不上机密,是那种一旦听到就再也无法假装没听过的话。让你听见的这一步,经过了挑选。"}, {max:100, text:"NSDAP愿意让你知道真正的日期。一张桌子,四个方向,其中一把椅子的位置微微偏向了门。你坐下的时候那个偏角消失了。他们校准过,而你是被算进去的那一个。"} ], impression: "你走的时候,门在你身后留下了很长的影子。那阴影的形状你见过,在慕尼黑那间啤酒馆的墙上,在某个你没能看清的人的脸上。" }, army: { meaning: "凡尔赛条约限制下的十万人军队,表面中立,实则有独立的政治意志。他的沉默分量比说话的时候更重。", tiers: [ {max:10, text:"军方视你为多余的文官。你推开门时,有人把脚从另一把椅子边上收走了。那双脚占着的位置留给椅子,椅子留给空处。这个房间拒绝的是一把多余的椅子,你顺带也被划在门外。"}, {max:25, text:"军方对你保持警惕。一个年轻军官站起来迎接你,站得太快了,操典里练出来的动作。他的手没有伸出来,欢迎还没有被批准。"}, {max:45, text:"军方开始觉得你不构成威胁。今天有人给你倒了一杯酒,最便宜的那种威士忌,杯子倒是满的。在军方的社交语法中,杯子里有液体,已经是一种信号了。"}, {max:65, text:"军方把你当作可以沟通的人。你走进来时,墙上那张地图没有被收起来。他们没有忘,他们在等你盯着看多久。你只看了一眼,没有过问。他们注意到了这一点。"}, {max:80, text:"军方愿意与你交换情报。一个上校在你说话时坐下了,不是坐到对面,是坐到了你旁边。位置从「对面」变成了「同侧」。在军方的空间逻辑里,坐在同一侧意味着:你们暂时面向同一个方向。"}, {max:95, text:"军方把你当作可以信任的文官。今天有人在你面前摊开了一张地图,用铅笔在某条线路上划了一道,没有解释。那道铅笔线悬在那里,等一个还没有说出口的计划。"}, {max:100, text:"军方愿意让你提前知道动向。你在壁炉边听到了自己的名字被提起,语气平缓,没有通报的腔调,也没有评价的意味,默认你本来就会在场。你没有回头。在这个空间里,能被当作背景音,说明你已经不是来客了。"} ], impression: "那张地图上的铅笔痕迹越来越多了。有些线被擦掉过,又画上了。旧的从来擦不干净,总有一点灰留在纸上,等着下一次被描深。" }, weimar: { meaning: "共和国本身。宪法和议会只是他的骨架,撑起他的是一群人同意一起活。", tiers: [ {max:10, text:"他还不知道该怎么定义你。你坐在他对面时,他看了你一眼,那目光落得很快,只够确认你真实存在。在这个间隙里,你们谁都没有先开口。"}, {max:25, text:"他保持着礼貌的距离。他跟你说话时,目光偶尔落在你身后的某一点上,那里没有东西,他在放空。你们的对话维持着一种精确的温度,不会太热,也不会凉到结冰。"}, {max:45, text:"他开始习惯你的存在了。你走进来时,他没有抬头。你的脚步声和他的呼吸慢慢靠到了一起。他还没有承认这件事。"}, {max:65, text:"他开始认真地听你说话。今天他问了你一个问题,而你在开口之前停顿了几秒。他没有催促你,也没有移开目光。那个等待的间隙里,窗外的电车正好过去。"}, {max:80, text:"他把你看作自己人。你准备离开时,他说了一声「明天见」。那是他已经确信不会落空的判断,客套用不着这么笃定。他已经开始预设你的到来了。"}, {max:95, text:"他愿意在你面前卸下防备。他今天在你面前停下来了,坐在那里,什么也没做,也不出声。那样的时刻他通常在扮演什么,这一次他忘了。他忘了关门,你也忘了提醒他。"}, {max:100, text:"他相信你会一直在他身边。你问他今天过得怎么样,他没有回答,只是看了你一眼:你还在,所以今天不算太差。你们之间已经不需要再用多余的语言来确认这件事了。"} ], impression: "你关上身后的门之前回头看了一眼。他没有看向你这边,但他的肩膀比你来之前低了那么一点。你把门轻轻带上了。" } } >> <</if>> <</silently>>\ <</widget>> /* ---------- berlin-attitude:渲染一个政党的四段式 ---------- 用法:<<berlin-attitude _party_key _party_name>> 输出四段:历史含义 + 当前信任度 + 动态句 + 印象句 */ <<widget "berlin-attitude">>\ <<silently>> <<berlin-attitude-init>> <<set _ba_key to $args[0]>> <<set _ba_name to $args[1]>> <<set _ba_data to $berlin_attitude[_ba_key]>> <<set _ba_trust to $npcs[_ba_key].trust>> <<set _ba_tier_text to "">> <<set _ba_tier_idx to 0>> <<for _ba_i to 0; _ba_i lt _ba_data.tiers.length; _ba_i++>> <<if _ba_trust lte _ba_data.tiers[_ba_i].max>> <<set _ba_tier_text to _ba_data.tiers[_ba_i].text>> <<set _ba_tier_idx to _ba_i>> <<set _ba_i to _ba_data.tiers.length>> <</if>> <</for>> <<set _ba_fill_cls to "tc-" + _ba_tier_idx + "-bg">> <<set _ba_txt_cls to "tc-" + _ba_tier_idx>> <<set _ba_width to Math.round(_ba_trust) + "%">> <</silently>>\ <div class="nb-party">\ <span class="nb-pname">''_ba_name''</span>\ <span class="nb-meaning">//_ba_data.meaning//</span>\ <div class="nb-trust"><span class="nb-bar"><<print '<span class="nb-bar-fill ' + _ba_fill_cls + '" style="width:' + _ba_width + '"></span>'>></span><b class="nb-trust-val">_ba_trust / 100</b></div>\ <<print '<span class="nb-tier ' + _ba_txt_cls + '">' + _ba_tier_text + '</span>'>>\ <span class="nb-imp">//印象:_ba_data.impression//</span>\ <<if $party_archive_unlocked and $party_archive_unlocked[_ba_key] and $party_archive_unlocked[_ba_key].fear and $pp[_ba_key] and $pp[_ba_key].fear>>\ <div class="nb-archive">\ <hr> ''档案:他害怕什么'' <<party-fear _ba_key>>\ //$ret//\ </div>\ <</if>>\ <<if $party_archive_unlocked and $party_archive_unlocked[_ba_key] and $party_archive_unlocked[_ba_key].want and $pp[_ba_key] and $pp[_ba_key].want>>\ <div class="nb-archive">\ <hr> ''档案:他想要什么'' <<party-want _ba_key>>\ //$ret//\ </div>\ <</if>>\ <<if $party_archive_unlocked and $party_archive_unlocked[_ba_key] and $party_archive_unlocked[_ba_key].memory and $pp[_ba_key] and $pp[_ba_key].memory>>\ <div class="nb-archive">\ <hr> ''档案:他忘不掉的事'' <<party-memory _ba_key>>\ //$ret//\ </div>\ <</if>>\ /* 档案预告钩子:尚未解锁的三段,给一个可预期的钩子句 */\ <<if not ($party_archive_unlocked and $party_archive_unlocked[_ba_key] and ($party_archive_unlocked[_ba_key].fear or $party_archive_unlocked[_ba_key].want or $party_archive_unlocked[_ba_key].memory))>>\ <div class="nb-archive-hook">\ //你还不真正了解他。多去和他谈谈,谈得越深,他越愿意把心里的事交给你。//\ </div>\ <</if>>\ /* 历史偏移实感(93_drift_memory):他记得的事,记在这本手记的每一条页脚 */\ <<drift-ledger-embed>>\ </div>\ <</widget>>
/* ════════════════════════════════════════════════════════════ 区域小事件池(43事件 · 完整版) 每个事件:适用区域分类 + 排除分类 + 时段 + 文本 + 3选项(反馈+数值变化) 触发:40%概率,去重(最近3次/当日),经济每日2次、通胀每日1次上限 代词一律用「他」。 ════════════════════════════════════════════════════════════ */ /* ---------- mini-event-init:初始化数据 ---------- 用法:<<mini-event-init>>(幂等) */ <<widget "mini-event-init">>\ <<silently>> <<if not $region_mini_events>> <<set $region_mini_events to [ /* ═══ 通用事件 ═══ */ {id:"E08", cats:["public","newwest"], exclude:["rich","power"], time:["day"], text:"路边有人在地上摊了一块布,上面放着十几本书。你在其中看到了一本1915年的普法读物,封面已经卷了。", options:[ {label:"A. 蹲下来翻一翻", fb:"你翻开一本旧书,扉页上有一个人名和一行日期。你把书买下来了。", fx:{ddp:1,疲惫:-1}}, {label:"B. 问摊主这些书从哪来的", fb:"他说是从倒闭的图书馆收来的。你挑了一本,他少收了半价。", fx:{理想:1}}, {label:"C. 看了一眼,走过去", fb:"你瞥了一眼那本书的封面,然后继续走了。", fx:{}} ]}, {id:"E10", cats:["worker"], exclude:["rich","power","newwest"], time:["day"], text:"一个女人在街角摆了一块牌子,上面写着“收旧衣——换一日餐。”她的脚边放着两个麻袋。你路过时,她正在把一件磨破的男士外套叠好放进去,动作很轻。", options:[ {label:"A. 看了她一眼,继续走", fb:"你从她身边走过,她的手指还在叠那件外套。", fx:{}}, {label:"B. 走过去问她为什么收旧衣", fb:"她停下手里的动作,抬头看了你一眼:“丈夫在鲁尔,两个月没寄钱回来了。”", fx:{spd:1,社会愤怒:1}}, {label:"C. 把零钱放在她的麻袋旁边", fb:"你弯腰把零钱放在她的麻袋旁边,她没有抬头,但手指停了一下。", fx:{}} ]}, {id:"E13", cats:["all"], exclude:[], time:["morning"], text:"一座教堂门口排起了队。有人正在分发热粥。你站在远处看到那口锅很大,但里面似乎只剩小半锅了。", options:[ {label:"A. 走过去帮忙盛粥", fb:"你接过勺,盛了十几碗。你的手被蒸汽烫红了。", fx:{spd:1,zentrum:1,疲惫:2}}, {label:"B. 站在旁边看了一会儿", fb:"你站在街对面看着那口锅慢慢见底,最终什么也没有做。", fx:{zentrum:1,孤立感:1}}, {label:"C. 从旁边经过,不停留", fb:"你从教堂门口走过,没有停下脚步。", fx:{}} ]}, {id:"E16", cats:["all"], exclude:[], time:["day"], text:"你路过一个院子时看到一个女人在给一个孩子试鞋。孩子穿着明显太大了,但他在笑。女人低头把鞋带紧了紧。", options:[ {label:"A. 站在院门口看了一会儿", fb:"你看着那个孩子穿着大了一截的鞋在院子里跑了两步。", fx:{理想:1,疲惫:-1}}, {label:"B. 走过去问从哪里买的鞋", fb:"女人说是从旧货摊捡的:“不合适就不合适,总比没有好。”", fx:{}}, {label:"C. 经过时看了一眼,继续走", fb:"你瞥了一眼院子里的人影,没有停下脚步。", fx:{}} ]}, {id:"E17", cats:["port"], exclude:[], time:["day"], text:"你路过安哈尔特火车站时,看到门口站着一个穿灰大衣的人在分发传单。领的人不多,但每一个都低头看了。一张传单被风吹到路边,没有人捡。", options:[ {label:"A. 弯腰捡起那张传单", fb:"你弯腰捡起那张被风吹到路边的传单,上面印着“赔偿不是债务,是劫持”。", fx:{民族主义:2}}, {label:"B. 走过去和发传单的人搭话", fb:"你走过去问他是什么组织的,他看了你一眼:“你觉得这个国家还有几年?”你没回答,他也没再追问。", fx:{民族主义:1,知情者:1}}, {label:"C. 从旁边走过,没有停下来", fb:"你从车站门口走过,没有停下脚步。", fx:{}} ]}, {id:"E18", cats:["tiergarten","kreuzberg"], exclude:["power","rich"], time:["evening"], text:"施普雷河边坐着一个老人,手里握着一根钓竿。桶里是空的。他已经在那里坐了很久。", options:[ {label:"A. 走过去问他在钓什么", fb:"“什么也钓不到,”他说,“但坐着总比站着强。”", fx:{疲惫:-2}}, {label:"B. 在他旁边的位置坐下来", fb:"你在他旁边坐下,水面没有动静。你们谁都没有开口。", fx:{}}, {label:"C. 经过时看了一眼,继续走", fb:"你瞥了一眼河边的人影,没有停下脚步。", fx:{}} ]}, {id:"E23", cats:["all"], exclude:[], time:["evening"], text:"一个穿旧大衣的女人站在路灯下,胸前挂着一个铁盒。盒子上写着“鲁尔工人基金”。她看着来往的人,没有开口要钱。", options:[ {label:"A. 走过去,把口袋里找零放进去", fb:"铁盒发出金属碰撞的声音。她轻声说了句“谢谢”。", fx:{spd:1}}, {label:"B. 停下和她聊了一会儿", fb:"她告诉你她丈夫在鲁尔,两个月没有寄钱回来了。你说不上什么有用的话。", fx:{spd:1,社会愤怒:1}}, {label:"C. 看了一眼铁盒,没有驻足", fb:"你看了一眼那个铁盒,然后继续走了。", fx:{}} ]}, {id:"E28", cats:["all"], exclude:[], time:["day"], text:"一个没留名字的人,把一枚小铜币放在了一户人家的门槛上。你不知道那户人是谁,你只是刚好路过看到。", options:[ {label:"A. 停下来看了看那枚硬币", fb:"你低头看了几秒,那枚硬币被门槛的阴影遮了一半。", fx:{}}, {label:"B. 弯腰把硬币捡起来,放在窗台上", fb:"你把它从门槛移到了窗台——这样开门的时候它不会滚落。", fx:{}}, {label:"C. 路过时看了一眼,没有停下来", fb:"你瞥了一眼门槛上的硬币,没有停下脚步。", fx:{}} ]}, {id:"E33", cats:["all"], exclude:[], time:["evening"], text:"你听到有人在哼一支你祖父辈才熟悉的旧歌。你转头时,那人已经走远了,只留下一个模糊的背影。歌声很轻,旋律却落得很准。", options:[ {label:"A. 停下脚步听了几秒", fb:"你停下脚步,听了几秒,然后继续走了。", fx:{dnvp:1}}, {label:"B. 循着歌声的方向看了一眼", fb:"你看到一个穿灰大衣的背影,已经走远了。", fx:{理想:-1}}, {label:"C. 继续走,没有停留", fb:"你继续走,没有停留。", fx:{}} ]}, {id:"E35", cats:["worker","newwest","port"], exclude:["rich","power"], time:["evening"], text:"一个老人坐在自家门前的台阶上,用一块旧布在擦一双旧靴子。他擦得很慢——不是认真,是那种一辈子都在擦、已经不需要看就能擦好的动作。", options:[ {label:"A. 放慢脚步看着他", fb:"你放慢脚步,看着他擦完了一只靴子,然后换另一只。", fx:{}}, {label:"B. 走过去在他旁边坐下", fb:"你在他旁边的台阶上坐下,看他擦完了整双靴子。", fx:{}}, {label:"C. 经过时看了一眼,继续走", fb:"你瞥了一眼台阶上坐着的人,没有停下脚步。", fx:{}} ]}, /* ═══ 权力走廊专属 ═══ */ {id:"E37", cats:["power"], exclude:[], time:["night"], text:"你路过一间亮着灯的办公室,打字机的声音断断续续,像在和谁对话。灯光透过门缝漏出来,在地上切出一条窄窄的亮线。", options:[ {label:"A. 敲门", fb:"打字机停了。你听到有人说:“请进。”你推开门,看到一个人坐在桌前,稿纸被台灯照得发白。他说:“我注意到你还醒着。”你走进去,坐下,什么都没带,但那个夜晚被印在了你们共同的时间线上。", fx:{}}, {label:"B. 在门口站了一会儿,然后走开", fb:"你站在门口听了一会儿打字机的声音,然后转身走了。", fx:{}}, {label:"C. 直接路过,不停留", fb:"你从亮着灯的办公室门口快步走过。", fx:{}} ]}, /* ═══ 富人区专属 ═══ */ {id:"E38", cats:["rich"], exclude:[], time:["day","evening"], text:"一张绿色钞票放在桌上,服务生直接收了,没有找零。旁边有人看了一眼,没有抬头。在这个街区,美元不是秘密,是另一种语言。", options:[ {label:"A. 观察用美元付账的人", fb:"你坐在邻桌看了他一会儿,他没有注意到你在看他。", fx:{dvp:1,知情者:1}}, {label:"B. 默默离开", fb:"你站起来,放下钱,离开了咖啡馆。", fx:{}}, {label:"C. 坐在附近听了一会儿他们的谈话", fb:"你听到他们提到了某笔外汇交易。你没有转头,默默听着。", fx:{通胀:1,dvp:1}} ]}, {id:"E39", cats:["rich"], exclude:[], time:["day"], text:"裁缝店里挂着一件做好的大衣,已经挂了两个星期,没有人来取。店主说:“料子是进口的,客人说要赶在冬天之前穿。但冬天已经到了。”", options:[ {label:"A. 问店主客人是谁", fb:"店主摇头:“不是熟人,是现金结账的。”你看着那件大衣。它挂在那里,等待着永远不会来的人。", fx:{经济:2}}, {label:"B. 看了那件大衣一眼,没有说话", fb:"你看了那件大衣一眼,然后离开了裁缝店。", fx:{}}, {label:"C. 拿起那件大衣的标签看了一眼——上面写着一个姓氏", fb:"你读了那个姓氏,记住了它,然后把标签放回了原来的位置。", fx:{记住了一个名字:1}} ]}, /* ═══ 公共空间专属 ═══ */ {id:"E42", cats:["alexanderplatz","brandenburg"], exclude:[], time:["day"], text:"牌子上写着“谁还记得1918?”来往的人不多,但每一个经过的人都多看了一眼。举牌的人没有说话,只是站在那儿,等着有人停下来。", options:[ {label:"A. 停下来,站在他旁边", fb:"你站在他旁边,什么都没有说。你们一起看着人群走过,有人停下了,有人没有。你知道那行字不是问句,是一道还留在桌上的证据。", fx:{spd:1}}, {label:"B. 快步走过,但记住了那句话", fb:"你从他身边走过,记住了牌子上写的那句话。", fx:{}}, {label:"C. 走过去和他聊了几句", fb:"他声音很平:“大多数人已经忘了。但你应该记得。”", fx:{理想:1,ddp:1}} ]}, {id:"E43", cats:["alexanderplatz"], exclude:[], time:["day"], text:"一个五六岁的孩子在广场上掰面包喂鸽子——面包看起来很干,可能是他自己的午饭。鸽子聚在他脚边,他蹲在那儿,一块一块地掰。", options:[ {label:"A. 走过去,把自己口袋里的面包给他", fb:"你蹲下来,把面包放在他手里。他接过去,继续掰碎喂鸽子。你在他旁边蹲了一会儿。孩子没有问你叫什么,鸽子也没有问。", fx:{spd:1,疲惫:-1}}, {label:"B. 站在远处看了一会儿", fb:"你站在远处看了一会儿,鸽子聚在他脚边,他把面包掰得很小。", fx:{}}, {label:"C. 从广场边缘绕过,没有打扰他", fb:"你从广场边缘绕过,没有打扰他喂鸽子。", fx:{}} ]}, /* ═══ 蒂尔加滕扩充(第一刀:丰富+软化,数值收敛±1~±2)═══ */ {id:"E44", cats:["tiergarten"], exclude:[], special:true, time:["day"], text:"蒂尔加滕的桦树枝被风压得很低。公园长椅上坐着一个穿灰大衣的人,帽檐遮住半张脸,膝盖上摊着一本翻旧的法文书。他看见你了,但没抬头。风把一片错落的叶子吹到你们之间。", options:[ {label:"A. 在旁边空长椅坐下,各自安静", fb:"你在三米外的长椅上坐下。谁也没开口。风过去之后,他翻了一页。", fx:{}}, {label:"B. 走过去,问他读的是什么", fb:"他把书扣在膝盖上,露出书名。是一本波德莱尔。他问你是不是也读诗,你说不一定。", fx:{理想:1}}, {label:"C. 从长椅旁走过,不去打扰", fb:"你从他身边走过,鞋底碾过一片枯叶。他始终没有抬头。", fx:{}} ]}, {id:"E45", cats:["tiergarten"], exclude:[], special:true, time:["day"], text:"胜利大道上那尊骑马雕像的基座上,有人放了小小一束花,逆着一整个区的冷清。没有人知道是谁放的。花已经很枯了,但还在那儿。", options:[ {label:"A. 停下来看了一会儿", fb:"你看了一眼基座上那束枯花。胜利女神的翅膀上积了灰。", fx:{民族主义:1}}, {label:"B. 去找管理员问是谁放的", fb:"管理员说不知道:“前几天下雨,第二天就有一束了。”", fx:{}}, {label:"C. 经过,扫了一眼", fb:"你瞥见了那束枯花,然后继续走。", fx:{}} ]}, {id:"E46", cats:["tiergarten"], exclude:[], special:true, time:["morning"], text:"清晨的蒂尔加滕还很空。一个穿旧制服的老骑兵在桦木间蹓跚,时而停下来看一棵树的树皮,像在认一位老邻居。他慢了半拍才意识到你在看他。", options:[ {label:"A. 上前聊两句", fb:"他识字不多,但记得每一年树的样子。“公园记得比树多。”他说。", fx:{dvp:1}}, {label:"B. 隔着一排树走开,不打扰", fb:"你绕到另一排桦树后,他重新低下头,审视那棵树的树皮。", fx:{}}, {label:"C. 停下来看了一会儿,然后走", fb:"你看了一会儿,没有上前。", fx:{}} ]}, {id:"E47", cats:["tiergarten"], exclude:[], special:true, time:["night"], cooldown:3, text:"夜里的蒂尔加滕黑得很快。一个穿着便装但脊背笔直的人在路灯下抽烟,烟头一亮一暗,照不亮他的脸。他看到你,把烟按灭,转身往林深处走。空气里有一瞬的凝滞——随即恢复如常,像什么都没发生过。", options:[ {label:"A. 跟上去看看", fb:"你跟了几步,他停在黑暗边缘,没回头:“今天不是你的日子。”你没再往前。", fx:{知情者:2,孤立感:1}}, {label:"B. 停在原地等他消失", fb:"你站在原地,看着那点烟头的光在树影里熄灭。", fx:{}}, {label:"C. 转身走开,不同路", fb:"你反而先走了。脚步声在夜里显得格外清楚。", fx:{孤立感:1}} ]}, /* ═══ 地缘特殊事件(二):选帝侯大街 / 亚历山大广场 ═══ */ {id:"E48", cats:["kurfurstendamm"], exclude:[], special:true, time:["evening"], text:"选帝侯大街的夜,一间下午六点才开门的小酒馆里,几个穿长风衣的人占着靠窗的卡座。他们不谈正事,只传话。你在窗玻璃外站了片刻,有人看见了,冲你举了举杯。", options:[ {label:"A. 进去坐到邻桌听完", fb:"你在邻桌坐下。他们没赶你,也没停。结账前,有人把一张字条折好推到你面前的杯垫下。", fx:{dvp:2,知情者:1}}, {label:"B. 隔着窗回举了一下,没进去", fb:"你隔着玻璃举了举手中的东西,转身走进夜色。", fx:{}}, {label:"C. 转身走开", fb:"你走开了。身后那扇窗的光,很快被街灯混成一片。", fx:{}} ]}, {id:"E49", cats:["alexanderplatz","worker"], exclude:[], special:true, time:["night"], text:"深夜的亚历山大广场几乎空了。一个戴着工人帽的年轻人在电话亭里打电话,声音压得很低,但玻璃挡不住。他挂了电话,抬头,冲你的方向顿了片刻。", options:[ {label:"A. 走近,认出是工会的人", fb:"你近了才认出他。他没说穿,只点了下头:“明天见分晓。”", fx:{spd:2,社会愤怒:1}}, {label:"B. 保持距离,记住他的脸", fb:"你把他的脸记了下来,没有上前。", fx:{知情者:1}}, {label:"C. 若无其事走开", fb:"你装作路过,从电话亭前走过,没有停。", fx:{}} ]}, /* ═══ 地缘特殊事件(三):弗里德里希斯海因 / 菩提树下大街 / 夏洛滕堡 / 红堡 ═══ */ {id:"E50", cats:["friedrichshain"], exclude:[], special:true, time:["day"], text:"工厂侧门的小窗口前排着队,那是给夜班工人发工资牌的窗口。一个年轻女工数了两遍手里的牌子,又数了一遍,从窗口退回去一张。管钱的在里面说了什么,她摇头,把牌子又推了回去。", options:[ {label:"A. 排在队尾等她数完", fb:"你等了十分钟。她终于数对了,把工牌按原数收好。你走的时候她冲你点了一下头——不认识,但点了。", fx:{spd:1}}, {label:"B. 看了一眼,走开", fb:"你从队伍旁边走过去。身后又数错了一遍。", fx:{}}, {label:"C. 问管钱的差多少", fb:"他隔着小窗说:「数目对的,牌子少。」你没再问。", fx:{知情者:1}} ]}, {id:"E51", cats:["unter_den_linden"], exclude:[], special:true, time:["day"], text:"旧书店里,老板正把一排册子从橱窗里撤下来。撤下来的书脊上印着同一年份:1919。一个学生站在旁边问为什么收,老板说:「不是不卖。是这两个月,买它们的脸越来越熟,熟得我害怕。」", options:[ {label:"A. 也买一本", fb:"你买下了一本。老板用旧报纸包好,报纸上是今天的汇率。他多包了一层。", fx:{民族主义:1,知情者:1}}, {label:"B. 劝他别多想", fb:"你说生意归生意。他把剩下的册子抱回柜台底下:「先生,生意归生意,脸归脸。」", fx:{}}, {label:"C. 在诗歌架子前翻了翻", fb:"你在诗歌架子前翻了十分钟。结账的时候老板少收了你十马克,说是老主顾的价。", fx:{理想:1}} ]}, {id:"E52", cats:["charlottenburg"], exclude:[], special:true, time:["evening"], text:"一栋宅子的院墙外停着一辆黑色的车,不熄火,尾气在冷空气里积成一小团。你走过时,院门开了一条缝,一个穿制服的年轻人递出一个信封。接信的人没有下车。", options:[ {label:"A. 放慢脚步看一眼", fb:"车灯没有照你。信封从门缝到车窗,只有两步路。你走过去了,身后的院门关得很轻。", fx:{知情者:1}}, {label:"B. 快步走过去", fb:"你没有放慢脚步。石板路上的脚步声替你表明了态度。", fx:{}}, {label:"C. 靠在对面的墙边等车走", fb:"你点了一支烟。车没有走,烟抽完了车也没有走。你先走了。", fx:{知情者:1}} ]}, {id:"E53", cats:["police_hq","power"], exclude:[], special:true, time:["morning"], text:"换岗的时刻。红堡台阶上的岗哨交接,两个年轻人对齐靴跟,互相报数。交接完,新岗站在原地不动了,旧岗绕过台阶往兵营走,走的时候把大衣领子立了起来——他也怕冷。", options:[ {label:"A. 看完换岗再走", fb:"你看完了。整段交接用了四分钟,没有多余的动作。台阶对面,卖栗子的老太婆开始生炉子。", fx:{知情者:1}}, {label:"B. 路过时递给新岗一支烟", fb:"他摆手,指了指身后的门。「在岗不抽。」他把话压得很低,「下了岗,那头儿的摊上有。」", fx:{知情者:1}}, {label:"C. 从台阶侧面过", fb:"你从台阶侧面过。站岗的眼睛跟着你转了半圈,又转回正前方。", fx:{}} ]} ]>> <</if>> <</silently>>\ <</widget>> /* ---------- mini-event-region-cats:区域→分类映射 ---------- 用法:<<mini-event-region-cats _region>> 输出 _region_cats(数组) */ <<widget "mini-event-region-cats">>\ <<silently>> <<set _rc to $args[0]>> <<set _region_cats to []>> <<if _rc is "reichstag" or _rc is "brandenburg" or _rc is "unter_den_linden" or _rc is "officers_club">><<set _region_cats.push("power")>><</if>> <<if _rc is "kurfurstendamm" or _rc is "charlottenburg">><<set _region_cats.push("rich")>><</if>> <<if _rc is "kurfurstendamm">><<set _region_cats.push("kurfurstendamm")>><</if>> <<if _rc is "kreuzberg" or _rc is "moabit" or _rc is "friedrichshain" or _rc is "wedding">><<set _region_cats.push("worker")>><</if>> <<if _rc is "alexanderplatz" or _rc is "tiergarten" or _rc is "romanisches" or _rc is "kabarett">><<set _region_cats.push("public")>><</if>> <<if _rc is "anhalter" or _rc is "potsdamer">><<set _region_cats.push("port")>><</if>> <<if _rc is "kurfurstendamm" or _rc is "charlottenburg" or _rc is "romanisches" or _rc is "kabarett">><<set _region_cats.push("newwest")>><</if>> <<if _rc is "romanisches">><<set _region_cats.push("romanisches")>><</if>> <<if _rc is "kreuzberg">><<set _region_cats.push("kreuzberg")>><</if>> <<if _rc is "tiergarten">><<set _region_cats.push("tiergarten")>><</if>> <<if _rc is "alexanderplatz">><<set _region_cats.push("alexanderplatz")>><</if>> <<if _rc is "brandenburg">><<set _region_cats.push("brandenburg")>><</if>> <<if _rc is "friedrichshain">><<set _region_cats.push("friedrichshain")>><</if>> <<if _rc is "unter_den_linden">><<set _region_cats.push("unter_den_linden")>><</if>> <<if _rc is "charlottenburg">><<set _region_cats.push("charlottenburg")>><</if>> <<if _rc is "police_hq">><<set _region_cats.push("police_hq")>><</if>> <</silently>>\ <</widget>> /* ---------- mini-event-roll:检定并抽取一个小事件 ---------- 用法:<<mini-event-roll _region>> 输出 $mini_event(或 null) 逻辑:40%概率 → 按区域分类+时段过滤 → 去重(最近3次/当日)→ 每日上限 */ <<widget "mini-event-roll">>\ <<silently>> <<mini-event-init>> <<if not $mini_recent>><<set $mini_recent to []>><</if>> <<if not $mini_today>><<set $mini_today to []>><</if>> <<set $mini_event to null>> <<set _mr to $args[0]>> <<if not $region_event_day>><<set $region_event_day to {}>><</if>> <<if not $region_ev_cooldown>><<set $region_ev_cooldown to {}>><</if>> /* 每区每日上限:同一地区当天最多出 1 个小事件(跨天用 session_day 比对即可) */ <<if $region_event_day[_mr] eq $session_day>> <<set $mini_event to null>> <<else>> <<mini-event-region-cats _mr>> <<set _now_time to "day">> <<if $date.hour lt 6>><<set _now_time to "night">> <<elseif $date.hour lt 12>><<set _now_time to "morning">> <<elseif $date.hour lt 18>><<set _now_time to "day">> <<else>><<set _now_time to "evening">><</if>> /* 触发概率 40% */ <<set _chance to 40>> <<if random(1, 100) gt _chance>> <<set $mini_event to null>> <<else>> /* 过滤:区域分类 + 时段 + 排除 + 去重 + 冷却(C:拆特殊/通用两层候选) */ <<set _sp_cands to []>> <<set _gen_cands to []>> <<for _ei to 0; _ei lt $region_mini_events.length; _ei++>> <<set _ev to $region_mini_events[_ei]>> <<set _ok to false>> <<if _ev.cats.includes("all") or _ev.cats.some(function(c){ return _region_cats.includes(c); })>> <<set _ok to true>> <</if>> <<if _ok and _ev.exclude and _ev.exclude.some(function(c){ return _region_cats.includes(c); })>> <<set _ok to false>> <</if>> <<if _ok and not _ev.time.includes(_now_time)>> <<set _ok to false>> <</if>> <<if _ok and $mini_recent and $mini_recent.includes(_ev.id)>> <<set _ok to false>> <</if>> <<if _ok and $mini_today and $mini_today.includes(_ev.id)>> <<set _ok to false>> <</if>> <<if _ok and $region_ev_cooldown and $region_ev_cooldown[_ev.id] gt $session_day>> <<set _ok to false>> <</if>> <<if _ok>> <<set _w to (_ev.weight ? _ev.weight : 1)>> <<if _ev.special>> <<set _sp_cands.push({ev:_ev, w:_w})>> <<else>> <<set _gen_cands.push({ev:_ev, w:_w})>> <</if>> <</if>> <</for>> /* C-保底:专门来刷必得——本地区访问没出特殊则记数,达4后强制触发一条 */ <<if not $region_sp_due>><<set $region_sp_due to {}>><</if>> <<set _due to ($region_sp_due[_mr] ? $region_sp_due[_mr] : 0)>> <<set _force_sp to false>> <<if _due gte 4 and _sp_cands.length gt 0>> <<set _force_sp to true>> <</if>> <<if _force_sp>> <<set $mini_event to _sp_cands[random(0, _sp_cands.length - 1)].ev>> <<set $region_sp_due[_mr] to 0>> <<else>> /* C-加权抽取:特殊事件原权重;通用事件权重打对折(k=2),让特殊更易被看见 */ <<set _pool to []>> <<set _total_w to 0>> <<for _si to 0; _si lt _sp_cands.length; _si++>> <<set _pool.push(_sp_cands[_si])>> <<set _total_w to _total_w + _sp_cands[_si].w>> <</for>> <<for _gi to 0; _gi lt _gen_cands.length; _gi++>> <<set _gew to {ev:_gen_cands[_gi].ev, w:_gen_cands[_gi].w / 2}>> <<set _pool.push(_gew)>> <<set _total_w to _total_w + _gew.w>> <</for>> <<if _pool.length gt 0>> <<set _roll to Math.random() * _total_w>> <<set _acc to 0>> <<set _picked to _pool[0]>> <<for _pi to 0; _pi lt _pool.length; _pi++>> <<set _acc to _acc + _pool[_pi].w>> <<if _roll lt _acc>> <<set _picked to _pool[_pi]>> <<set _pi to _pool.length>> <</if>> <</for>> <<set $mini_event to _picked.ev>> <<if $mini_event.special>> <<set $region_sp_due[_mr] to 0>> <<else>> <<set $region_sp_due[_mr] to _due + 1>> <</if>> <</if>> <</if>> <<if $mini_event neq null>> <<set $region_event_day[_mr] to $session_day>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- mini-event-apply(已废除) ---------- 旧版效果应用(党信任直写、绕开闸门)。现所有结算统一内联在 mini-event-render 的选项回调里:先走 trust-capped 闸门、再按实际到账值显示。此 widget 无调用方, 仅留注释占位防止旧命名被复用。 */ /* ---------- mini-event-render:渲染小事件(3选项) ---------- 用法:<<mini-event-render>> 渲染 $mini_event 关键:用 <<capture _opt>> 在创建时捕获每个选项的值,避免 <<for>> 循环里 <<link>> 回调在点击时读到最后一个选项的闭包问题。 效果应用内联在 <<link>> 回调里,确保持久化到历史 moment。 */ <<widget "mini-event-render">>\ <<if $mini_event neq null>>\ <hr>\ //你注意到了什么。// $mini_event.text <span id="mini_event_block"> <<for _oi to 0; _oi lt $mini_event.options.length; _oi++>>\ <<set _opt to $mini_event.options[_oi]>>\ <<capture _opt>>\ <<link "_opt.label">> <<replace "#mini_event_block">>\ <<nobr>> //_opt.fb// /* 反刷闸(B递减 + A挂钩TP):带党派信赖的事件,选前先 1) A:消耗 2TP(深入往来成本) 2) B:信赖收益按"桶"卡点——通用事件卡 2 点/天; 地缘特殊事件(special:true)独立一个更宽松的桶(5 点/天), 两者不共用额度,避免"做完一个特殊事件就把通用桶填爆"。 做法:直接盖写 _opt.fx,使下方"显示/结算"共用同一份被压后的值。 V0.9 拦截:要深入往来(2TP)但行动力不足 → 只出拦截文案, 不扣点、不动信赖桶、不落任何效果,话留到明天。 */ <<set _trust_cost to false>> <<set _mini_blocked to false>> <<if _opt.fx.spd or _opt.fx.kpd or _opt.fx.ddp or _opt.fx.dvp or _opt.fx.zentrum or _opt.fx.dnvp or _opt.fx.nsdap>> <<set _trust_cost to true>> <<if $tp lt 2>><<set _mini_blocked to true>><</if>> <</if>> <<if _mini_blocked>> //你的手已经抬不起来了。这些话值得清醒着说——明天再来。// <br><span style="color:#c8b87a;">(深入往来需要 2 点行动力 · 你还剩 $tp 点)</span> <<else>> <<if _trust_cost>><<tp-spend 2>><</if>> <<rival-cost-reset>> /* 先结算:党信任统一走 trust-capped 闸门(每党每日+4/每周+12,单一预算), 实际到账记入 _act,杜绝「双重裁剪」与「显示值≠实际值」。 */ <<set _act to {}>> <<set _trimmed to []>> <<if _opt.fx.spd>><<trust-capped "spd" _opt.fx.spd>><<set _act.spd to $affinity_actual>><<if $affinity_actual lt _opt.fx.spd>><<set _trimmed.push("SPD")>><</if>><</if>> <<if _opt.fx.kpd>><<trust-capped "kpd" _opt.fx.kpd>><<set _act.kpd to $affinity_actual>><<if $affinity_actual lt _opt.fx.kpd>><<set _trimmed.push("KPD")>><</if>><</if>> <<if _opt.fx.ddp>><<trust-capped "ddp" _opt.fx.ddp>><<set _act.ddp to $affinity_actual>><<if $affinity_actual lt _opt.fx.ddp>><<set _trimmed.push("DDP")>><</if>><</if>> <<if _opt.fx.dvp>><<trust-capped "dvp" _opt.fx.dvp>><<set _act.dvp to $affinity_actual>><<if $affinity_actual lt _opt.fx.dvp>><<set _trimmed.push("DVP")>><</if>><</if>> <<if _opt.fx.zentrum>><<trust-capped "zentrum" _opt.fx.zentrum>><<set _act.zentrum to $affinity_actual>><<if $affinity_actual lt _opt.fx.zentrum>><<set _trimmed.push("Zentrum")>><</if>><</if>> <<if _opt.fx.dnvp>><<trust-capped "dnvp" _opt.fx.dnvp>><<set _act.dnvp to $affinity_actual>><<if $affinity_actual lt _opt.fx.dnvp>><<set _trimmed.push("DNVP")>><</if>><</if>> <<if _opt.fx.nsdap>><<trust-capped "nsdap" _opt.fx.nsdap>><<set _act.nsdap to $affinity_actual>><<if $affinity_actual lt _opt.fx.nsdap>><<set _trimmed.push("NSDAP")>><</if>><</if>> /* 其余效果照常应用(世界变量/标签/心绪) */ <<if _opt.fx["经济"]>><<set $world.economy to Math.max(0, Math.min(100, $world.economy + _opt.fx["经济"]))>><</if>> <<if _opt.fx["通胀"]>><<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + _opt.fx["通胀"]))>><</if>> <<if _opt.fx["社会愤怒"]>><<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger + _opt.fx["社会愤怒"]))>><</if>> <<if _opt.fx["政治暴力"]>><<set $world.political_violence to Math.max(0, Math.min(100, $world.political_violence + _opt.fx["政治暴力"]))>><</if>> <<if _opt.fx["民族主义"]>><<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + _opt.fx["民族主义"]))>><</if>> <<if _opt.fx["革命"]>><<set $world.revolution to Math.max(0, Math.min(100, $world.revolution + _opt.fx["革命"]))>><</if>> <<if _opt.fx["知情者"]>><<tag-add "知情者" "micro" _opt.fx["知情者"] "观察" "weimar" "mini">><<set $active_tags to $ret>><</if>> <<if _opt.fx["观察者"]>><<tag-add "观察者" "micro" _opt.fx["观察者"] "观察" "weimar" "mini">><<set $active_tags to $ret>><</if>> <<if _opt.fx["理想"]>><<set $player.mental.idealism to Math.max(0, Math.min(100, $player.mental.idealism + _opt.fx["理想"]))>><</if>> <<if _opt.fx["疲惫"]>><<set $player.mental.fatigue to Math.max(0, Math.min(100, $player.mental.fatigue + _opt.fx["疲惫"]))>><</if>> <<if _opt.fx["孤立感"]>><<set $player.mental.isolation to Math.max(0, Math.min(100, $player.mental.isolation + _opt.fx["孤立感"]))>><</if>> /* 后显示:全部用实际到账值(党信任来自 _act,被预算裁剪时如实显示) */ <<set _bonus to []>> <<if _opt.fx["经济"]>><<set _bonus.push("经济压力" + (_opt.fx["经济"] gt 0 ? "+" : "") + _opt.fx["经济"])>><</if>> <<if _opt.fx["通胀"]>><<set _bonus.push("通胀" + (_opt.fx["通胀"] gt 0 ? "+" : "") + _opt.fx["通胀"])>><</if>> <<if _opt.fx["社会愤怒"]>><<set _bonus.push("社会愤怒" + (_opt.fx["社会愤怒"] gt 0 ? "+" : "") + _opt.fx["社会愤怒"])>><</if>> <<if _opt.fx["政治暴力"]>><<set _bonus.push("政治暴力" + (_opt.fx["政治暴力"] gt 0 ? "+" : "") + _opt.fx["政治暴力"])>><</if>> <<if _opt.fx["民族主义"]>><<set _bonus.push("民族主义" + (_opt.fx["民族主义"] gt 0 ? "+" : "") + _opt.fx["民族主义"])>><</if>> <<if _opt.fx["革命"]>><<set _bonus.push("革命" + (_opt.fx["革命"] gt 0 ? "+" : "") + _opt.fx["革命"])>><</if>> <<if _act.spd>><<set _bonus.push("SPD信任" + (_act.spd gt 0 ? "+" : "") + _act.spd)>><</if>> <<if _act.kpd>><<set _bonus.push("KPD信任" + (_act.kpd gt 0 ? "+" : "") + _act.kpd)>><</if>> <<if _act.ddp>><<set _bonus.push("DDP信任" + (_act.ddp gt 0 ? "+" : "") + _act.ddp)>><</if>> <<if _act.dvp>><<set _bonus.push("DVP信任" + (_act.dvp gt 0 ? "+" : "") + _act.dvp)>><</if>> <<if _act.zentrum>><<set _bonus.push("Zentrum信任" + (_act.zentrum gt 0 ? "+" : "") + _act.zentrum)>><</if>> <<if _act.dnvp>><<set _bonus.push("DNVP信任" + (_act.dnvp gt 0 ? "+" : "") + _act.dnvp)>><</if>> <<if _act.nsdap>><<set _bonus.push("NSDAP信任" + (_act.nsdap gt 0 ? "+" : "") + _act.nsdap)>><</if>> <<if _opt.fx["知情者"]>><<set _bonus.push("知情者+" + _opt.fx["知情者"])>><</if>> <<if _opt.fx["观察者"]>><<set _bonus.push("观察者+" + _opt.fx["观察者"])>><</if>> <<if _opt.fx["理想"]>><<set _bonus.push("理想" + (_opt.fx["理想"] gt 0 ? "+" : "") + _opt.fx["理想"])>><</if>> <<if _opt.fx["疲惫"]>><<set _bonus.push("疲惫" + (_opt.fx["疲惫"] gt 0 ? "+" : "") + _opt.fx["疲惫"])>><</if>> <<if _opt.fx["孤立感"]>><<set _bonus.push("孤立感" + (_opt.fx["孤立感"] gt 0 ? "+" : "") + _opt.fx["孤立感"])>><</if>> <<if _trust_cost>><<set _bonus.push("深入往来·消耗TP2")>><</if>> <<if _trimmed.length gt 0>><<set _bonus.push(_trimmed.join("、") + "今天已听够了类似的话,只收下一部分")>><</if>> <<if _bonus.length gt 0>><br><span style="color:#8a8a8a;">(<<print _bonus.join(",")>>)</span><</if>> <<rival-note-show>> <<set $trust_act_log to []>> <<set $mini_recent.push($mini_event.id)>> <<if $mini_recent.length gt 3>><<set $mini_recent.shift()>><</if>> <<set $mini_today.push($mini_event.id)>> <<set _ev_cd to ($mini_event.cooldown ? $mini_event.cooldown : 2)>> <<set $region_ev_cooldown[$mini_event.id] to $session_day + _ev_cd>> <<set $mini_event to null>> <</if>> <</nobr>>\ <</replace>>\ <</link>>\ <</capture>>\ <<if _oi lt $mini_event.options.length - 1>><br><</if>>\ <</for>>\ </span>\ <</if>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ 文件篮事件系统(60件 · 独立事件层) 以正式公文/简报/信函形式呈现的可选择事件,玩家作为决策者回应。 与区域小事件(街头见闻)、区域事件(区域警报)是不同性质与玩法的独立层。 选项光谱体系(6轴): GM 温和改良 / SM 国家强势 / LE 左翼激进 / RE 右翼激进 / OP 机会主义 / AP 消极逃避 效果键名映射(fb-apply-effects 统一应用): 政党信任:spd kpd ddp dvp zentrum dnvp nsdap army 世界变量:economy inflation social_anger political_violence nationalism revolution gov_trust middle_confidence intl_trust(国际信任→$weimar.mid.intl_trust) 玩家状态:idealism fatigue isolation insider(知情者) observer(观察者) 事件结构: { id, title, category, description, available, base_intensity, tag, stages: [ { options:[{label,axis,effects,narrative,next_stage,trigger}] }, { id, trigger_text, trigger, options:[...] } ] } ════════════════════════════════════════════════════════════ */ /* ---------- fb-apply-effects:应用单个选项的效果 ---------- 用法:<<fb-apply-effects _effects>> 在 <<link>> 回调内联调用,确保持久化。 */ <<widget "fb-apply-effects">>\ <<silently>> <<set _fx to $args[0]>> /* 全派系增量捕获(跨分段累加,供结算页 party-review-loop 点评) */ <<if not $file_party_deltas>><<set $file_party_deltas to {}>><</if>> <<if _fx.spd>><<trust-capped "spd" _fx.spd>><<set $file_party_deltas.spd to ($file_party_deltas.spd ? $file_party_deltas.spd : 0) + _fx.spd>><</if>> <<if _fx.kpd>><<trust-capped "kpd" _fx.kpd>><<set $file_party_deltas.kpd to ($file_party_deltas.kpd ? $file_party_deltas.kpd : 0) + _fx.kpd>><</if>> <<if _fx.ddp>><<trust-capped "ddp" _fx.ddp>><<set $file_party_deltas.ddp to ($file_party_deltas.ddp ? $file_party_deltas.ddp : 0) + _fx.ddp>><</if>> <<if _fx.dvp>><<trust-capped "dvp" _fx.dvp>><<set $file_party_deltas.dvp to ($file_party_deltas.dvp ? $file_party_deltas.dvp : 0) + _fx.dvp>><</if>> <<if _fx.zentrum>><<trust-capped "zentrum" _fx.zentrum>><<set $file_party_deltas.zentrum to ($file_party_deltas.zentrum ? $file_party_deltas.zentrum : 0) + _fx.zentrum>><</if>> <<if _fx.dnvp>><<trust-capped "dnvp" _fx.dnvp>><<set $file_party_deltas.dnvp to ($file_party_deltas.dnvp ? $file_party_deltas.dnvp : 0) + _fx.dnvp>><</if>> <<if _fx.nsdap>><<trust-capped "nsdap" _fx.nsdap>><<set $file_party_deltas.nsdap to ($file_party_deltas.nsdap ? $file_party_deltas.nsdap : 0) + _fx.nsdap>><</if>> <<if _fx.army>><<trust-capped "army" _fx.army>><<set $file_party_deltas.army to ($file_party_deltas.army ? $file_party_deltas.army : 0) + _fx.army>><</if>> <<if _fx.economy>><<set $world.economy to Math.max(0, Math.min(100, $world.economy + _fx.economy))>><</if>> <<if _fx.inflation>><<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + _fx.inflation))>><</if>> <<if _fx.social_anger>><<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger + _fx.social_anger))>><</if>> <<if _fx.political_violence>><<set $world.political_violence to Math.max(0, Math.min(100, $world.political_violence + _fx.political_violence))>><</if>> <<if _fx.nationalism>><<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + _fx.nationalism))>><</if>> <<if _fx.revolution>><<set $world.revolution to Math.max(0, Math.min(100, $world.revolution + _fx.revolution))>><</if>> <<if _fx.fiscal>><<set $world.fiscal to Math.max(0, Math.min(100, ($world.fiscal ?? 30) + _fx.fiscal))>><</if>> <<if _fx.gov_trust>><<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + _fx.gov_trust))>><</if>> <<if _fx.middle_confidence>><<set $world.middle_confidence to Math.max(0, Math.min(100, ($world.middle_confidence ?? 32) + _fx.middle_confidence))>><</if>> <<if _fx.army_influence>><<set $world.army_influence to Math.max(0, Math.min(100, $world.army_influence + _fx.army_influence))>><</if>> <<if _fx.paranoia>><<set $player.mental.paranoia to Math.max(0, Math.min(100, $player.mental.paranoia + _fx.paranoia))>><</if>> <<if _fx.intl_trust>><<set $weimar.mid.intl_trust to Math.max(0, Math.min(100, $weimar.mid.intl_trust + _fx.intl_trust))>><</if>> <<if _fx.idealism>><<set $player.mental.idealism to Math.max(0, Math.min(100, $player.mental.idealism + _fx.idealism))>><</if>> <<if _fx.fatigue>><<set $player.mental.fatigue to Math.max(0, Math.min(100, $player.mental.fatigue + _fx.fatigue))>><</if>> <<if _fx.isolation>><<set $player.mental.isolation to Math.max(0, Math.min(100, $player.mental.isolation + _fx.isolation))>><</if>> <<if _fx.insider>><<tag-add "知情者" "micro" _fx.insider "观察" "weimar" "filebasket">><<set $active_tags to $ret>><</if>> <<if _fx.observer>><<tag-add "观察者" "micro" _fx.observer "观察" "weimar" "filebasket">><<set $active_tags to $ret>><</if>> <</silently>>\ <</widget>> /* ---------- fb-bonus-text:生成选项效果的可读摘要 ---------- 用法:<<fb-bonus-text _effects>> 结果存入 _fb_bonus_text */ <<widget "fb-bonus-text">>\ <<silently>> <<set _fx to $args[0]>> <<set _parts to []>> <<set _names to { spd:"SPD信任", kpd:"KPD信任", ddp:"DDP信任", dvp:"DVP信任", zentrum:"Zentrum信任", dnvp:"DNVP信任", nsdap:"NSDAP信任", army:"军方信任", economy:"经济压力", inflation:"通胀", social_anger:"社会愤怒", political_violence:"政治暴力", nationalism:"民族主义", revolution:"革命压力", gov_trust:"政府信任", middle_confidence:"中产信心", army_influence:"军方影响", intl_trust:"国际信任", fiscal:"财政赤字", idealism:"理想", fatigue:"疲惫", isolation:"孤立感", paranoia:"偏执", insider:"知情者", observer:"观察者" }>> <<for _k range Object.keys(_fx)>> <<set _v to _fx[_k]>> <<set _label to _names[_k] ?? "">> <<if _label neq "">> <<if _v gt 0>><<set _parts.push(_label + " +" + _v)>> <<elseif _v lt 0>><<set _parts.push(_label + " " + _v)>> <</if>> <</if>> <</for>> <<set _fb_bonus_text to _parts.length gt 0 ? _parts.join(",") : "(无显著数值变化)">> <</silently>>\ <</widget>> /* ---------- fb-available:判断事件是否满足可用条件 ---------- 用法:<<fb-available _ev>> 结果存入 _fb_ok */ <<widget "fb-available">>\ <<silently>> <<set _ev to $args[0]>> <<set _fb_ok to true>> <<if not _ev.available>> <<set _fb_ok to false>> <<else>> <<set _av to _ev.available>> <<if _av.requires_event>> <<for _ri to 0; _ri lt _av.requires_event.length; _ri++>> <<set _rid to _av.requires_event[_ri]>> <<set _found to false>> <<for _li to 0; _li lt $event_log.length; _li++>> <<if $event_log[_li].deck_id eq _rid>><<set _found to true>><</if>> <</for>> <<if not _found>><<set _fb_ok to false>><</if>> <</for>> <</if>> <<if _av.requires_state>> <<for _sk range Object.keys(_av.requires_state)>> <<if $world[_sk] lt _av.requires_state[_sk]>><<set _fb_ok to false>><</if>> <</for>> <</if>> /* requires_state_below:世界变量 ≤ 门槛才可用(信任越低越爆丑闻类) */ <<if _av.requires_state_below>> <<for _sk range Object.keys(_av.requires_state_below)>> <<if $world[_sk] gt _av.requires_state_below[_sk]>><<set _fb_ok to false>><</if>> <</for>> <</if>> <<if _av.requires_flag>> <<for _fk range Object.keys(_av.requires_flag)>> <<set _fv to _av.requires_flag[_fk]>> <<if _fk eq "covenant_active">> <<set _flag_now to ($covenant and $covenant.active) ? true : false>> <<if _flag_now neq _fv>><<set _fb_ok to false>><</if>> <</if>> <</for>> <</if>> <<if _av.excludes_event>> <<for _ei to 0; _ei lt _av.excludes_event.length; _ei++>> <<set _eid to _av.excludes_event[_ei]>> <<for _li to 0; _li lt $event_log.length; _li++>> <<if $event_log[_li].deck_id eq _eid>><<set _fb_ok to false>><</if>> <</for>> <</for>> <</if>> <<if _av.excludes_state>> <<for _sk range Object.keys(_av.excludes_state)>> <<if $world[_sk] gte _av.excludes_state[_sk]>><<set _fb_ok to false>><</if>> <</for>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- fb-get-available:获取可用事件池 ---------- 用法:<<fb-get-available _exclude_seen _exclude_cooling>> 结果存入 $tmp_pool */ <<widget "fb-get-available">>\ <<silently>> <<set _exclude_seen to $args[0] ? $args[0] : false>> <<set _exclude_cooling to $args[1] ? $args[1] : false>> <<set _pool to []>> <<if $file_basket_events and $file_basket_events.length gt 0>> <<for _i to 0; _i lt $file_basket_events.length; _i++>> <<set _ev to $file_basket_events[_i]>> <<fb-available _ev>> <<if _fb_ok and _exclude_seen and ($event_pool.seen_count[_ev.id] || 0) gt 0>> <<set _fb_ok to false>> <</if>> <<if _fb_ok and _exclude_cooling and ($event_pool.cooling_until[_ev.id] || -1) gt $session_day>> <<set _fb_ok to false>> <</if>> <<if _fb_ok>> <<set _pool.push(_ev)>> <</if>> <</for>> <</if>> <<set $tmp_pool to _pool>> <</silently>>\ <</widget>> /* ---------- fb-pick:加权随机选一件(出现越少权重越高) ---------- 用法:<<fb-pick _pool>> 结果存入 $tmp_picked */ <<widget "fb-pick">>\ <<silently>> <<set _pool to $args[0]>> <<set $tmp_picked to null>> <<if _pool.length gt 0>> <<set _weights to []>> <<set _total to 0>> <<for _i to 0; _i lt _pool.length; _i++>> <<set _seen to $event_pool.seen_count[_pool[_i].id] || 0>> <<set _w to 10 - Math.min(_seen, 9)>> /* 紧迫值权重:世界状态越接近该事件的对口压力,权重越高 */ <<urgency-mult _pool[_i].weight_condition>> <<set _w to _w * $tmp_urgency>> /* 来源冷却:同类事件还在生效期/尾冷却(持续效果表)→ 权重归零,不再触发 */ <<if $effect_cool and $effect_cool[_pool[_i].id] and $session_day lt $effect_cool[_pool[_i].id]>> <<set _w to 0>> <</if>> <<set _weights.push(_w)>> <<set _total to _total + _w>> <</for>> <<set _roll to Math.random() * _total>> <<set _acc to 0>> <<for _i to 0; _i lt _pool.length; _i++>> <<set _acc to _acc + _weights[_i]>> <<if _roll lt _acc>> <<set $tmp_picked to _pool[_i]>> <<set _i to _pool.length>> <</if>> <</for>> <</if>> <</silently>>\ <</widget>> /* ---------- fb-record:记录事件出现(seen/last_seen/cooling) ---------- 用法:<<fb-record _ev>> */ <<widget "fb-record">>\ <<silently>> <<set _ev to $args[0]>> <<set $event_pool.seen_count[_ev.id] to ($event_pool.seen_count[_ev.id] || 0) + 1>> <<set $event_pool.last_seen[_ev.id] to $session_day>> <<set _cooling_days to 5 + Math.floor(Math.random() * 3)>> <<set $event_pool.cooling_until[_ev.id] to $session_day + _cooling_days>> <<set $last_event_day to $session_day>> <<set $days_without_event to 0>> <</silently>>\ <</widget>> /* ---------- fb-roll:每日刷新主流程 ---------- 用法:<<fb-roll>> 将选中的文件篮事件加入 $pending_events 逻辑:保底(3天无事件强制1件)→ 正常概率(60%±,红色日折半,保底后15%)→ 冷却重试 */ <<widget "fb-roll">>\ <<silently>> <<set _red_event to null>> <<for _i to 0; _i lt $event_deck.length; _i++>> <<set _card to $event_deck[_i]>> <<if _card.level eq "red" and not _card.dealt and _card.date.m eq $date.month and _card.date.d eq $date.day>> <<set _red_event to _card>> <</if>> <</for>> /* 累积保底概率:按连续无文件篮事件天数递增(单日不刷新,避免每天刷) 第1天(0天)50% → 第2天(1天)60% → 第3天(2天)80% → 第4天(3天)80% → 第5天起(≥4天)100% 世界压力调制:压力越大(player_modifier 0.8~1.5),越容易出事件 */ <<set _fb_gap to $days_without_event>> <<set _base_chance to 0.50>> <<if _fb_gap gte 1>><<set _base_chance to 0.60>><</if>> <<if _fb_gap gte 2>><<set _base_chance to 0.80>><</if>> <<if _fb_gap gte 3>><<set _base_chance to 0.80>><</if>> <<if _fb_gap gte 4>><<set _base_chance to 1.00>><</if>> <<set _base_chance to _base_chance * $player_modifier>> <<if _red_event>> <<set _base_chance to _base_chance * 0.50>> <</if>> <<set _base_chance to Math.min(1.0, _base_chance)>> <<set _normal_event to null>> <<if Math.random() lte _base_chance>> <<fb-get-available true true>> <<if $tmp_pool.length eq 0>> <<fb-get-available false true>> <</if>> <<if $tmp_pool.length gt 0>> <<fb-pick $tmp_pool>> <<set _normal_event to $tmp_picked>> <</if>> <</if>> /* 冷却重试(最多5次) */ <<if _normal_event>> <<for _attempts = 0; _attempts < 5 and ($event_pool.cooling_until[_normal_event.id] || -1) > $session_day; _attempts++>> <<fb-get-available true true>> <<if $tmp_pool.length eq 0>> <<fb-get-available false true>> <</if>> <<if $tmp_pool.length eq 0>> <<set _normal_event to null>> <<set _attempts to 5>> <<else>> <<fb-pick $tmp_pool>> <<set _normal_event to $tmp_picked>> <</if>> <</for>> <<if _attempts gte 5 and _normal_event and ($event_pool.cooling_until[_normal_event.id] || -1) gt $session_day>> <<set _normal_event to null>> <</if>> <<if _normal_event>> <<fb-record _normal_event>> /* 编号必须先加一再用(其余发牌器都这么写):后缀 ++ 会先取旧值, 撞上先发的红事件编号,出现两个同号事件、结算张冠李戴 */ <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _normal_event.id, source: "filebasket", lifecycle: "instant", /* 大事(major)卡面提到 3:文件栏置顶排序 + 「⚠ 后果深远」徽章(红色巨浪为 4) */ irreversible: (_normal_event.major ? 3 : 1), intensity: _normal_event.base_intensity || 12, related_tag: _normal_event.tag || "general", title: _normal_event.title, description: _normal_event.description, template: "filebasket", fb_data: _normal_event, fb_stage: 0, born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending", is_normal: true })>> <</if>> <</if>> /* 无事件日计数 */ <<if not _red_event and not _normal_event>> <<set $days_without_event to $days_without_event + 1>> <</if>> <</silently>>\ <</widget>> /* ---------- valve-check:泄压阀门检查(顶格数值的强制出口) ---------- 用法:<<valve-check>>(daily-tick 每日调用;tick-cycle 快进后补检一次) 试点:经济压力(economy)、社会愤怒(social_anger)。 世界变量 ≥90 连续满 4 天且冷却已过 → 强制投递对应泄压文件(UE_76/UE_77)。 泄压=大幅降温但带代价;不泄=继续烧。冷却30天,防止同一阀门连着刷。 UE_76/77 不带 available 字段 → fb-available 恒 false → 绝不进随机池, 只有这里能投递。major:true → ⚠ 后果深远徽章 + 治理路线不代签 + 禁冷处理。 */ <<widget "valve-check">>\ <<silently>> /* 防旧档缺键:旧存档没有 $valve_state 或缺某个键时补齐 */ <<if not $valve_state>><<set $valve_state to {}>><</if>> <<if not $valve_state.economy>><<set $valve_state.economy to { days: 0, cooldown: 0 }>>>><</if>> <<if not $valve_state.social_anger>><<set $valve_state.social_anger to { days: 0, cooldown: 0 }>>>><</if>> <<for _vk range ["economy", "social_anger"]>> <<if $world[_vk] gte 90>> <<set $valve_state[_vk].days to $valve_state[_vk].days + 1>> <<else>> <<set $valve_state[_vk].days to 0>> <</if>> <<if $valve_state[_vk].days gte 4 and $session_day gte $valve_state[_vk].cooldown>> <<set _vid to (_vk eq "economy") ? "UE_76" : "UE_77">> <<set _vev to null>> <<for _vfi to 0; _vfi lt $file_basket_events.length; _vfi++>> <<if $file_basket_events[_vfi].id eq _vid>><<set _vev to $file_basket_events[_vfi]>><</if>> <</for>> <<if _vev>> /* 编号先加一再用(与 fb-roll 同规矩,防同号撞车) */ <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: _vev.id, source: "filebasket", lifecycle: "instant", irreversible: 3, intensity: _vev.base_intensity || 35, related_tag: _vev.tag || "经济压力", title: _vev.title, description: _vev.description, template: "filebasket", fb_data: _vev, fb_stage: 0, born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending", is_normal: true })>> <<set $valve_state[_vk].cooldown to $session_day + 30>> <</if>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- fb-trigger-ok:判断阶段触发条件是否满足 ---------- 用法:<<fb-trigger-ok _trigger>> 结果存入 _fb_trig_ok */ <<widget "fb-trigger-ok">>\ <<silently>> <<set _trig to $args[0]>> <<set _fb_trig_ok to true>> <<if _trig>> /* 裸单条件 {stat,op,val} 归一化成 OR:[{...}] 复用下方解析。 解析只认 OR 包裹与 option_chosen,裸 stat 若不归一会被静默跳过恒为真, 局势/信任不够的回访与转场也会照常上门 */ <<if _trig.stat and not _trig.OR>><<set _trig to {OR:[_trig]}>><</if>> <<if _trig.option_chosen>> /* option_chosen 比对优先用 $args[1](延迟回访登记时记下的原始选项): 全局 $file_action 会被后续任何事件的选择覆盖(sign/delegate/delay…), 延迟回访若直接比对全局值必然错判成「安静收场」 */ <<set _fb_chosen to ($args[1] ? $args[1] : $file_action)>> <<if _fb_chosen neq _trig.option_chosen>><<set _fb_trig_ok to false>><</if>> <</if>> <<if _trig.OR>> <<set _any to false>> <<for _ci to 0; _ci lt _trig.OR.length; _ci++>> <<set _c to _trig.OR[_ci]>> <<set _cv to 0>> <<if _c.stat eq "world.economy">><<set _cv to $world.economy>> <<elseif _c.stat eq "world.inflation">><<set _cv to $world.inflation>> <<elseif _c.stat eq "world.social_anger">><<set _cv to $world.social_anger>> <<elseif _c.stat eq "world.nationalism">><<set _cv to $world.nationalism>> <<elseif _c.stat eq "npcs.army.trust">><<set _cv to $npcs.army.trust>> <<elseif _c.stat eq "npcs.nsdap.trust">><<set _cv to $npcs.nsdap.trust>> <<elseif _c.stat eq "npcs.ddp.trust">><<set _cv to $npcs.ddp.trust>> <<elseif _c.stat eq "world.intl_trust">><<set _cv to $weimar.mid.intl_trust>> <<elseif _c.stat eq "player.mental.知情者">> <<set _cv to 0>> <<if $active_tags>> <<for _zti to 0; _zti lt $active_tags.length; _zti++>> <<if $active_tags[_zti] and $active_tags[_zti].name eq "知情者">> <<set _cv to $active_tags[_zti].intensity>> <</if>> <</for>> <</if>> <</if>> <<if _c.op eq "gte" and _cv gte _c.val>><<set _any to true>> <<elseif _c.op eq "lte" and _cv lte _c.val>><<set _any to true>> <<elseif _c.op eq "eq" and _cv eq _c.val>><<set _any to true>> <</if>> <</for>> <<if not _any>><<set _fb_trig_ok to false>><</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- fb-render-options:渲染文件篮事件当前阶段的选项 ---------- 用法:<<fb-render-options _ev>> 每个选项用 <<capture>> 捕获,避免闭包问题。 有 next_stage 的选项 → File_Event_Stage;否则 → File_Result_FB 有 delay_next 的选项 → 当场结算本选项效果,下一阶段按 days 登记为隐藏延迟回访 (covert 后续),到期以独立文件回到文件栏,走 File_Event_Stage_Delayed。 情报分层预兆:选项可带 omen:{mid:"…", high:"…"},按「知情者」强度显示 (<15 无 / 15-39 mid / ≥40 high),显示在选项下方 intel-forecast 行。 */ <<widget "fb-render-options">>\ <<silently>> <<set _ev to $args[0]>> <<set _stage to _ev.fb_data.stages[_ev.fb_stage]>> /* 当前知情者强度(预兆分档用) */ <<set _fb_zhi to 0>> <<if $active_tags and $active_tags.length gt 0>> <<for _zbi to 0; _zbi lt $active_tags.length; _zbi++>> <<if $active_tags[_zbi] and $active_tags[_zbi].name eq "知情者">> <<set _fb_zhi to $active_tags[_zbi].intensity>> <</if>> <</for>> <</if>> <</silently>>\ ''你的决定:'' <<nobr>><<for _oi to 0; _oi lt _stage.options.length; _oi++>> <<set _opt to _stage.options[_oi]>> <<capture _opt _fb_zhi>> <<link "_opt.label">> <<set $file_action to _opt.label>> <<set $opt_label to _opt.label>> <<set $fb_narrative to _opt.narrative>> <<set $file_spd_delta to _opt.effects.spd ? _opt.effects.spd : 0>> <<set $file_ddp_delta to _opt.effects.ddp ? _opt.effects.ddp : 0>> <<set $file_dvp_delta to _opt.effects.dvp ? _opt.effects.dvp : 0>> <<fb-apply-effects _opt.effects>> <<if _opt.next_stage>> <<set $fb_next_stage to _opt.next_stage>> <<goto "File_Event_Stage">> <<elseif _opt.delay_next>> /* 延迟阶段:本选项效果已结算,下一阶段登记为隐藏后续,N 天后回来 注意:widget 参数不能写括号表达式(踩坑23),也不能传对象引用(第8参数方案废弃)—— fb_data 经全局中转变量 $fu_src_fb 传递,site-followup-add 内消费。 玩家此刻选的选项经 $fu_src_action 一并登记——回访页的 option_chosen 触发条件要比对它,全局 $file_action 到那时早被别的选择覆盖了 */ <<set _dn to _opt.delay_next>> <<set _dn_days to _dn.days ? _dn.days : 3>> <<set _dn_idx to $file_target_idx ?? 0>> <<set $pending_events[_dn_idx].status to "resolved">> <<set $fu_src_fb to $pending_events[_dn_idx].fb_data>> <<set $fu_src_action to $file_action>> <<site-followup-add _dn.title _dn.desc _dn_days "delayed" "File_Event_Stage_Delayed" _dn.stage_id true>> <<set $fu_src_fb to null>> <<set $fu_src_action to null>> <<goto "File_Result_FB">> <<else>> <<goto "File_Result_FB">> <</if>> <</link>> <<fb-bonus-text _opt.effects>> <div class="intel-forecast">(_fb_bonus_text)</div> <<if _opt.omen>> <<if _fb_zhi gte 40 and _opt.omen.high>><div class="intel-forecast">(<em>预感</em>:_opt.omen.high)</div> <<elseif _fb_zhi gte 15 and _opt.omen.mid>><div class="intel-forecast">(<em>预感</em>:_opt.omen.mid)</div> <</if>> <</if>> <</capture>> <<if _oi lt _stage.options.length - 1>><br><</if>> <</for>><</nobr>> /* 去现场选项:仅第一层、且有 site_region 标记的事件出现。 选中后不立即结算,而是给对应区域打现场标记、文件保留并标记 site_pending, 玩家之后点击该文件或去对应区域,都能进入现场路线。 */ <<if _ev.fb_stage eq 0 and _ev.fb_data.site_region>>\ <<set _site_go_region to _ev.fb_data.site_region>>\ <<set _site_go_kind to _ev.fb_data.site_kind ? _ev.fb_data.site_kind : "generic">>\ <<set _site_go_deadline to 3 + random(0, 2)>>\ <<set _site_go_cost to $regions[_site_go_region].tp_cost>>\ <<set _site_go_fat to $regions[_site_go_region].tp_fatigue>>\ <<tp-can _site_go_cost>>\ <<if _tp_ok>>\ <br><span class="red-choice"><<link "F. 亲自去现场看看">> <<set $file_action to "去现场">>\ <<set $opt_label to "亲自去现场看看">>\ <<set _sg_idx to $file_target_idx ?? 0>>\ <<set $pending_events[_sg_idx].site_pending to { region: _site_go_region, kind: _site_go_kind, deadline_day: $session_day + _site_go_deadline, created_day: $session_day }>> <<set $pending_events[_sg_idx].fb_stage to 0>>\ <<set $pending_events[_sg_idx].tp_paid to true>>\ <<set _sg_r to $regions[_site_go_region]>>\ <<if not _sg_r.active_event>>\ <<set _sg_r.active_event to { ev_id: _ev.event_id, title: _ev.title, kind: _site_go_kind, created_day: $session_day, deadline_day: $session_day + _site_go_deadline }>>\ <</if>>\ <<tp-spend _site_go_cost _site_go_fat>>\ <<goto "File_Event">>\ <</link>></span> @@.red-choice-note;去现场:放弃公文路线,亲自前往局面中心。反馈更激烈,风险与收益都更高。消耗 _site_go_cost TP · 疲惫 _site_go_fat · 期限 _site_go_deadline 天@@ //(去现场是另一条路:你放下了笔,走进风暴。这算一次外出,代价写在上面。)//\ <<else>>\ <br><span class="rmap-lock">==F. 亲自去现场看看==(今天的力气不够走这一趟 · 需 _tp_need 点,剩 _tp_have 点)</span> @@.red-choice-note;这条路明天还开着:你放下了笔,但风暴没走。需 _site_go_cost TP。@@\ <</if>>\ <</if>>\ <</widget>> /* ---------- 文件篮事件数据池(60件) ---------- 用 widget 包裹,由 StoryInit 调用 <<fb-init-data>> 初始化, 确保 $file_basket_events 在游戏开始时可用。 */ <<widget "fb-init-data">>\ <<set $file_basket_events to [ /* ═══ 事件01:财政部报告:马克汇率持续暴跌(三层) ═══ */ {id:"UE_01", title:"财政部报告:马克汇率持续暴跌", category:"经济", description:"财政部呈报:美元兑马克已突破8,000大关。央行建议紧急外汇管制。若不干预,预计月底突破10,000。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{inflation:50}}, base_intensity:30, tag:"经济压力", stages:[ {options:[ {label:"A. 批准外汇管制,冻结资本流动", axis:"SM", effects:{gov_trust:4, inflation:-3, dvp:-2}, narrative:"你用铁腕按住了汇率,曲线暂时缓和了。但资本比人诚实,它已经开始恐慌。", omen:{mid:"管制越紧,水渗得越快。", high:"钱不会停在国境线上——它正在找新的缝。"}, delay_next:{stage_id:"fx_2_capital_flight", title:"资本外逃的密报", desc:"一份加密报告被放进你桌上的文件堆里,压在最下面。封口的火漆没有拆过。", days:21}}, {label:"B. 拒绝管制,让市场自行调节", axis:"OP", effects:{dvp:5, inflation:3, gov_trust:-1}, narrative:"你相信市场会找到平衡。市场确实找到了——马克跌得更快。"}, {label:"C. 秘密动用外汇储备干预,不公开承认", axis:"OP", effects:{inflation:-2, insider:4, gov_trust:1}, narrative:"你做了一件正确的事,但选择不让任何人知道。"}, {label:"D. 发表全国讲话,公开宣布“马克坚挺”", axis:"RE", effects:{nationalism:3, gov_trust:2, inflation:1}, narrative:"你说服了部分人。但懂行的人知道你在说谎。"}, {label:"E. 什么都不做,等鲁尔局势明朗", axis:"AP", effects:{inflation:5, gov_trust:-3, dvp:-2}, narrative:"你合上文件夹,把它放回待办堆最底层。窗外有人喊了一嗓子报价,你没有起身。"} ]}, {id:"fx_2_capital_flight", trigger_text:"外汇管制生效三周后,秘密报告送来:资本外逃比管制之前更快。企业主把马克拆成小额,经荷兰和瑞士的壳公司换成外币,就像水渗过砖缝。央行行长深夜到访:“我们管住了明面上的钱,但暗处的钱在逃跑。照这个速度,外汇储备会在两个月内耗尽。”", trigger:{OR:[{stat:"world.economy",op:"gte",val:50},{stat:"world.inflation",op:"gte",val:60}]}, options:[ {label:"A. 扩大管制范围——包括私人账户和贸易结算", axis:"SM", effects:{gov_trust:2, dvp:-4, inflation:-2}, narrative:"你收紧了口子。但每一次收紧,都有更多人在砖缝里寻找新的缝隙。"}, {label:"B. 放弃管制,承认失败,寻求国际贷款", axis:"GM", effects:{intl_trust:3, dvp:2, gov_trust:-2}, narrative:"你承认自己错了。这需要勇气——只是在柏林,愿意认错的人不多。"}, {label:"C. 秘密逮捕一批最大的资本外逃者,杀鸡儆猴", axis:"RE", effects:{gov_trust:1, political_violence:4, dvp:-3}, narrative:"你抓了人,杀鸡儆猴。外逃确实停了,因为最会跑的那批人,正在牢里数日子。"}, {label:"D. 让央行行长背锅,公开解职以安抚市场", axis:"OP", effects:{gov_trust:-1, insider:2, dvp:1}, narrative:"你把他推了出去。市场满意了,但走廊里的人,开始检查自己的椅子有没有被做上记号。"} ]} ]}, /* ═══ 事件02:总统府关于第48条的法律意见书(单层) ═══ */ {id:"UE_02", major:true, title:"总统府关于第48条的法律意见书", category:"政治", description:"总统府转来一份宪法学者备忘录,逐条讨论《魏玛宪法》第48条紧急法令的宪法边界与历史先例。文末附着一行小字:此条若启用,总统可在紧急状态下采取非常措施,并暂时中止部分基本权利;也正因如此,它最好永远只停留在纸上。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"政府信誉", stages:[ {options:[ {label:"A. 仔细阅读并归档,作为未来参考", axis:"GM", effects:{insider:3, ddp:2}, narrative:"你读完了,没有批注,也不打算用它。归档时,你却把它放进了抽屉最上层——为了让它在伸手可及的地方。"}, {label:"B. 标注“紧急时可用”,要求起草启用预案", axis:"SM", effects:{gov_trust:1, army:3, spd:-2}, narrative:"你在为“必要时”做准备。启用预案起草完毕,放进抽屉最上层,没有编号,没有日期,也没有写明由谁签发。"}, {label:"C. 公开批评第48条,主张废除或严格限制", axis:"LE", effects:{spd:4, ddp:4, gov_trust:-2}, narrative:"你认为紧急权力是民主的坟墓。趁它还没有被滥用,你要先给它上锁,即使锁上之后钥匙也会变成一种诱惑。"}, {label:"D. 匿名将此备忘录泄露给右翼报纸", axis:"OP", effects:{dnvp:3, nsdap:2, political_violence:2, gov_trust:-2}, narrative:"你把备忘录抄了一份,匿名寄给右翼报纸。你想借舆论逼国会讨论第48条,不管国会想不想谈,也不管他们会从哪一页开始读。"} ]} ]}, /* ═══ 事件03:柏林工人总罢工倡议书(双层) ═══ */ {id:"UE_03", title:"柏林工人总罢工倡议书", category:"社会", description:"工会联合会递交请愿书,要求政府在七日内改善工资与工作条件。若逾期未答复,将发动柏林总罢工。请愿书末尾附有各工厂代表签名,而这个人数仍在增加。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{social_anger:50}, excludes_event:["R06"]}, base_intensity:30, tag:"工人愤怒", site_region:"kreuzberg", site_kind:"strike", stages:[ {options:[ {label:"A. 接受谈判,承诺改善待遇", axis:"GM", effects:{spd:5, social_anger:-3, gov_trust:2}, narrative:"你请工会代表来会客室,答应就工资和工作条件重新谈判。尽管桌上没有保证,但门没有关上。你让他们先回去,把罢工日期往后压一压。", next_stage:"strike_2_talks"}, {label:"B. 拒绝请愿,准备强制复工", axis:"SM", effects:{dvp:4, gov_trust:3, social_anger:5, political_violence:3}, narrative:"你拒绝请愿,命令警察准备强制复工。广场清空了,拘留车停在街角。次日早晨,工厂汽笛响了,但车间里没有人开动机器。", next_stage:"strike_2_crackdown"}, {label:"C. 秘密联络工会激进派,支持其扩大罢工", axis:"LE", effects:{kpd:6, spd:-3, social_anger:5, revolution:4}, narrative:"你没有见工会主席,而是派人秘密联络激进派。口信很短:柏林若停,鲁尔也可以停。传话的人记下日期,从后门离开。"}, {label:"D. 暗中资助右翼团体,在罢工中制造暴力冲突", axis:"RE", effects:{nsdap:4, dnvp:3, political_violence:6, gov_trust:-4}, narrative:"你要让罢工中出现暴力,再把它说成「秩序问题」。钱通过中间人交给右翼团体。你知道一旦流血,警察就有理由进场。"}, {label:"E. 拖延,说“等局势稳定再说”", axis:"AP", effects:{social_anger:4, gov_trust:-2, spd:-2}, narrative:"你让秘书回复:等局势稳定再说。请愿书被放进待办堆。工会没有再催,只在工厂门口贴出新的集会时间。"} ]}, {id:"strike_2_talks", trigger_text:"工会代表坐在了谈判桌前。他们提了三项要求:工资上涨20%、八小时工作制立法、释放被捕的罢工组织者。工会主席把一份签满名字的请愿书推到桌子中央,说:「签名已经够多了。一周内你若不签,我们也没有再签的必要,因为那时我们都在街上。」", trigger:{option_chosen:"A. 接受谈判,承诺改善待遇"}, options:[ {label:"A. 全盘接受——立刻签署协议", axis:"LE", effects:{spd:5, social_anger:-4, gov_trust:2, dvp:-3}, narrative:"你当场签了。笔尖在纸上停了一下,但名字还是写完。工会代表收走一份,你留一份。走廊另一头,右翼报纸的记者已经记下时间。"}, {label:"B. 部分接受——工资涨10%,八小时制试点推行", axis:"GM", effects:{spd:2, dvp:2, social_anger:-2}, narrative:"你同意工资涨一成,八小时制先在少数工厂试行。工会代表没鼓掌可也没离席。他们把文件折好,说下周再谈。"}, {label:"C. 接受条款,但附加条件——工会必须公开谴责暴力行为", axis:"OP", effects:{spd:1, gov_trust:3, social_anger:-1}, narrative:"你同意条款,但要求工会先公开谴责罢工中的暴力。他们商量了几分钟,点头。协议签完,双方各收一份,没有人握手。"}, {label:"D. 拖延谈判——要求工会先复工再谈", axis:"SM", effects:{spd:-3, social_anger:2, gov_trust:-1}, narrative:"你要求工会先让工人复工,再谈条件。工会代表收起文件,起身离开。他们离开时门关上的声音比他们进来时重。"} ]}, {id:"strike_2_crackdown", trigger_text:"你签署了强制复工令。警察开始清场,警棍和盾牌推过广场。傍晚,清场的报告送到桌上:七人受伤,两人重伤,一名警察被砖块击中头部。办公室门上夹着一封没有邮票和署名的信,里面是一张医院伤者名单,名单背面有一行淡字:「这次不是意外。」", trigger:{option_chosen:"B. 拒绝请愿,准备强制复工"}, options:[ {label:"A. 升级镇压——宣布紧急状态,调军队", axis:"RE", effects:{political_violence:6, gov_trust:2, spd:-5}, narrative:"你宣布紧急状态,调军队进城。街上的火被扑灭,路障拆掉。第二天夜里,另一个街角升起烟,烧焦的味道借此飘了过来。"}, {label:"B. 撤回强制令,恢复谈判", axis:"GM", effects:{spd:3, gov_trust:-2, social_anger:-3}, narrative:"你撤回强制复工令,重新请工会谈判。工会代表回来了,坐得比上次靠后,提出的数字却比上次高。你面前的茶杯没有人碰。"}, {label:"C. 撤换警察局长,把责任推给下级", axis:"OP", effects:{gov_trust:1, insider:2, spd:1}, narrative:"你解除了警察局长职务,把清场责任推给命令执行层。新局长上任的制服没有变,街角的警车也没有少。"}, {label:"D. 继续镇压,但不升级——保持现有强度,等对方先退", axis:"SM", effects:{political_violence:2, social_anger:3, gov_trust:-1}, narrative:"你命令保持现有警力,不增援也不撤走,你这是在等工会先撑不住。柏林很大,街道很多,尸体和传单都还来得及被清扫。"} ]} ]}, /* ═══ 事件04:国防军预算案争议(三层) ═══ */ {id:"UE_04", major:true, title:"国防军预算案争议", category:"军事", description:"国防部提交预算修正案:因装备老化与东部边境局势紧张,申请追加15%经费。军方非正式渠道表示,若该案未获通过,将「难以保证内部稳定」。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{army_influence:40}}, base_intensity:30, tag:"军队不满", stages:[ {options:[ {label:"A. 全盘批准——军队需要什么就给什么", axis:"SM", effects:{army:6, dvp:2, economy:3}, narrative:"你批准全部追加款项。军方至少在目前成为你的盟友。", omen:{mid:"军方不会把胃口只留在预算里。", high:"批了钱,他们会觉得你能批更多。"}, delay_next:{stage_id:"military_2_demand", title:"军方的口头请求", desc:"国防部来电话,说有位将军想当面汇报「东部局势」,没有预约。", days:7}}, {label:"B. 部分批准,附带透明监督条款", axis:"GM", effects:{army:2, ddp:4, gov_trust:2}, narrative:"你批准部分经费,同时附加透明监督条款。军方对此不满,但仍予接受。"}, {label:"C. 拒绝,将资金转拨给劳工就业项目", axis:"LE", effects:{spd:5, army:-5, social_anger:-2}, narrative:"你拒绝追加军费,将资金转拨劳工就业项目。军方怨恨你,工人则记住了你的这笔钱。"}, {label:"D. 批准预算,但要求军方承诺不介入国内政治", axis:"OP", effects:{army:3, gov_trust:1, observer:3}, narrative:"你批准预算,但要求军方承诺不介入国内政治。承诺写在纸上,至于它在柏林有多少分量,你还无法确定。"}, {label:"E. 搁置不议,等明年再说", axis:"AP", effects:{army:-3, gov_trust:-2}, narrative:"你让秘书把预算案放回待批的文件夹。文件搁置后,无人再提。"} ]}, {id:"military_2_demand", trigger_text:"距签字后不到一周,军方再次来访。这次他们没有递交文件,只提出口头请求:向东普鲁士「增调驻军」,理由为「防范苏联渗透」。你清楚这不在原预算之内,也清楚军方并非在征求许可,而是在试探你是否会阻拦。", trigger:{stat:"npcs.army.trust",op:"gte",val:55}, options:[ {label:"A. 批准增调——军队知道他们在做什么", axis:"SM", effects:{army:4, nationalism:3, gov_trust:1, political_violence:2}, narrative:"你批准增调。命令下达,地图室更换新图,旧图卷起收柜。", omen:{mid:"先例一开,下一步就不由你了。", high:"批准的数目会被他们当成底线,而不是上限。"}, delay_next:{stage_id:"military_3_Eastern", title:"超额的调令", desc:"边防观察哨的例行周报里多了一行批注:东部铁路军列频次,高于调令数字。批注用的铅笔,不是情报处的制式铅笔。", days:7}}, {label:"B. 拒绝——军队不能拿预算当筹码", axis:"SM", effects:{army:-4, gov_trust:3, spd:2}, narrative:"你答复军方:经费可以批准,但不能以此索取权力。这一回合你占了上风,但军方不会停止寻找新的理由。"}, {label:"C. 有条件批准——增调可以,但需报告国会", axis:"GM", effects:{army:1, ddp:4, gov_trust:2}, narrative:"你批准增调,但要求向国会报告。国会获知此事,军方每一步都将被记录。"}, {label:"D. 利用此机会与军方建立更紧密的私人关系", axis:"OP", effects:{army:3, insider:5, observer:3}, narrative:"你关上办公室的门,与军方代表私下会面。你告诉对方,你们之间不需要文件。"} ]}, {id:"military_3_Eastern", trigger_text:"七天后,一份未署名情报报告出现在你桌上。国防军在东部边境的增调规模远超你批准数目,实际调动比报告数字多出近一倍。你核对三遍,数字没有变化。桌上放着一枚不属于你的领针。", trigger:{stat:"npcs.army.trust",op:"gte",val:30}, options:[ {label:"A. 公开调查——这已经越界了", axis:"SM", effects:{army:-6, gov_trust:4, political_violence:3}, narrative:"你下令彻查。三日后收到报告,所有签字合规,所有数字吻合。你将报告锁入抽屉,未再打开。"}, {label:"B. 默许——现在不是翻脸的时候", axis:"OP", effects:{army:2, gov_trust:-2, nationalism:3}, narrative:"你将情报锁入抽屉,不签字,不记入备忘。你选择等待他们自己显露破绽。"}, {label:"C. 秘密接触军方,要求他们尊重边界——但不必公开承认", axis:"OP", effects:{army:1, insider:4, gov_trust:-1}, narrative:"你在没有证人和记录的夜间与军方代表会面。你告诉对方:可以做你们想做的事,但不要再让我看到相关文件。"} ]} ]}, /* ═══ 事件05:法国大使馆抗议照会(双层) ═══ */ {id:"UE_05", major:true, title:"法国大使馆抗议照会", category:"外交", description:"法国大使馆递交照会,抗议德国媒体持续进行反法宣传,称其影响鲁尔区稳定。照会附有要求:限时纠正相关报道,否则法方将采取相应措施。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R01"]}, base_intensity:25, tag:"民族屈辱", stages:[ {options:[ {label:"A. 道歉并限制媒体", axis:"GM", effects:{intl_trust:3, nationalism:-3}, narrative:"你选择道歉,并下令限制相关报道。法国方面表示接受。国内有报纸在社论中称你退让,对此你没有回应。"}, {label:"B. 否认并驳斥,称言论自由不可侵犯", axis:"SM", effects:{nationalism:4, intl_trust:-2, gov_trust:1}, narrative:"你公开驳斥法方照会,强调德国言论自由不受外国干涉。法国方面表示不满,但柏林有部分舆论对你表示支持。", omen:{mid:"法国人不会不回应。", high:"你动了赔款的盘子,巴黎的账算得比谁都快。"}, delay_next:{stage_id:"french_2_retaliation", title:"巴黎的回敬", desc:"外交部转来一份巴黎的官方照会副本,页边有人用铅笔圈了三处。", days:14}}, {label:"C. 私下与法国使馆接触,承诺换一个温和的总编辑", axis:"OP", effects:{intl_trust:2, insider:3, ddp:-2}, narrative:"你通过私下渠道与法国使馆接触,承诺更换一家报社的总编辑。法方满意,但此举在报界引起议论。"}, {label:"D. 煽动媒体加大反法宣传,把外交抗议变成民族主义运动", axis:"RE", effects:{dnvp:4, nationalism:5, intl_trust:-4}, narrative:"你授意媒体加大反法宣传,将外交抗议转为民族主义动员。事态扩大,你以此争取更多政治筹码。"}, {label:"E. 不回应,让外交部拖着", axis:"AP", effects:{intl_trust:-2, gov_trust:-1}, narrative:"你命外交部暂不回应,观察法方下一步动作。数日后,法方将此事提交日内瓦。"} ]}, {id:"french_2_retaliation", trigger_text:"两周后,法国官方宣布暂停德国部分工业品对法出口许可,理由为「原产地证明核验流程调整」,这比制裁更难应对。几列满载货物的火车停在边境铁轨上,没有拉响警报更没给出期限。驻法商务参赞的电报只有一行字:「他们不是在报复,是在等我们眨眼。而我们的眼皮已经开始发酸了。」", trigger:{option_chosen:"B. 否认并驳斥,称言论自由不可侵犯"}, options:[ {label:"A. 以牙还牙——限制法国商品进口", axis:"SM", effects:{nationalism:4, intl_trust:-3, economy:3}, narrative:"你下令限制法国商品进口。柏林有舆论叫好,商会则开始计算损失。"}, {label:"B. 让步——撤回强硬表态,恢复对话", axis:"GM", effects:{intl_trust:3, nationalism:-2, gov_trust:-1}, narrative:"你撤回强硬表态,恢复与法方对话。法方表示满意,但国内舆论开始称你为「退让的人」。"}, {label:"C. 通过英国从中斡旋——把双边问题变成多边问题", axis:"OP", effects:{intl_trust:2, ddp:2, nationalism:-1}, narrative:"你请英国出面斡旋,将双边争端转为多边议题。法方不便拒绝,英方也不便推辞。你在棋盘上多放了一颗棋。"}, {label:"D. 什么都不做——等法国先撑不住", axis:"AP", effects:{economy:3, intl_trust:-1}, narrative:"你选择等待,希望法方先行退让。但等待期间,工厂继续停工,工人继续离岗。"} ]} ]}, /* ═══ 事件06:英国关于赔款的调解提议(双层) ═══ */ {id:"UE_06", major:true, title:"英国关于赔款的调解提议", category:"外交", description:"英国外交部非正式提议:愿意在伦敦主持新一轮赔款谈判,目标为减轻德国短期财政压力。提议未附具体条件,但英方表示,谈判范围可以讨论。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 接受调解,开放谈判", axis:"GM", effects:{intl_trust:4, ddp:3}, narrative:"你接受英方调解,同意开放谈判。赔款数字是固定的,但你认为国家还有回旋余地。", next_stage:"reparations_2_talks"}, {label:"B. 有条件接受——要求先讨论总赔款额减少", axis:"SM", effects:{dnvp:2, nationalism:2, intl_trust:1}, narrative:"你接受调解,但提出先讨论总赔款额减少。你愿意谈,但底线不退。"}, {label:"C. 拒绝——坚持维持原约", axis:"RE", effects:{intl_trust:-3, economy:3, dnvp:4}, narrative:"你拒绝调解,坚持维持原约。尊严得以保全,但赔款账单不会因此消失。"}, {label:"D. 接受调解,但秘密与英方商讨军事合作作为交换", axis:"OP", effects:{intl_trust:2, army:3, dvp:2}, narrative:"你接受调解,同时通过秘密渠道与英方商讨军事合作。英方关注欧洲稳定,你关注军队是否生变。"}, {label:"E. 搁置——等美国表态再回应", axis:"AP", effects:{intl_trust:-1, gov_trust:-1}, narrative:"你暂缓回应,等待美国表态。美方是最后的变数,但英方的耐心也在等待中消耗。"} ]}, {id:"reparations_2_talks", trigger_text:"伦敦谈判开始。英国代表措辞礼貌,条件却并不宽松。首轮会议后,他私下告诉你:「我们愿意帮你,但英国国内舆论不支持直接减轻德国压力。如果我们真让步,必须在别处得到补偿。」他递来一杯威士忌,在你接过时补了一句:「比如波罗的海的某种默契,或者东欧那条线的调整。」", trigger:{option_chosen:"A. 接受调解,开放谈判"}, options:[ {label:"A. 接受英国的条件——用东欧利益换赔款减免", axis:"OP", effects:{intl_trust:3, nationalism:2, ddp:-1}, narrative:"你接受英方条件,以东部利益换取赔款减免。交易足够务实,也足够危险。"}, {label:"B. 拒绝——不拿主权换金钱", axis:"SM", effects:{nationalism:3, intl_trust:-2, gov_trust:2}, narrative:"你拒绝以主权换取金钱,英方没有挽留。你失去一次机会,但保住了自己的立场。"}, {label:"C. 拖——用谈判争取时间,等国内局势好转", axis:"OP", effects:{insider:2, intl_trust:-1, economy:1}, narrative:"你选择拖延谈判,以时间换取国内局势好转。英方开始催促,你仍按自己的节奏推进。"}, {label:"D. 部分接受——在象征性议题上让步,但不触及核心利益", axis:"GM", effects:{intl_trust:2, ddp:2, nationalism:-1}, narrative:"你在象征性议题上作出让步,核心利益未动。英方认为有所收获,你也认为自己没有输。这大概就是外交的真面目。"} ]} ]}, /* ═══ 事件07:巴伐利亚邦自治要求(双层) ═══ */ {id:"UE_07", major:true, title:"巴伐利亚邦自治要求", category:"政治", description:"巴伐利亚邦政府正式来函,要求扩大财政自主权与警察管辖权。函件末尾附有一句:若中央不予回应,邦政府将依据「紧急需要」采取相应措施。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R10"]}, base_intensity:25, tag:"民族主义", stages:[ {options:[ {label:"A. 同意部分财政自主,换取忠诚承诺", axis:"GM", effects:{zentrum:3, nationalism:1, gov_trust:-1}, narrative:"你同意给予部分财政自主,换取巴伐利亚的忠诚承诺。在柏林,这已算得上可接受的交易。", omen:{mid:"给了钱,他们会要更多的东西。", high:"财政自主这条口子一开,就合不上了。"}, delay_next:{stage_id:"bavaria_2_chain", title:"巴伐利亚的第二次到访", desc:"慕尼黑的电报先到一步:巴伐利亚财政部长将再度到访,「议题敏感,不宜书面汇报」。", days:21}}, {label:"B. 坚决拒绝——维护中央权威,准备以武力威慑", axis:"SM", effects:{gov_trust:2, political_violence:3, spd:-2}, narrative:"你明确拒绝,强调中央权威不容分割,并命军方做好威慑准备。巴伐利亚方面未再回函。"}, {label:"C. 秘密支持巴伐利亚内部反对派,削弱邦政府", axis:"OP", effects:{insider:4, observer:3, political_violence:2}, narrative:"你通过秘密渠道支持巴伐利亚内部反对派。此路耗时较长,但更干净。", omen:{mid:"密使的事不会一封信就完。", high:"反对派开了价,他们等着回音。"}, delay_next:{stage_id:"bavaria_2_opposition", title:"密使的第二封信", desc:"密使的第二封信到了,字比上封更小,纸是从笔记本上撕下来的。", days:10}}, {label:"D. 搁置——不回应,等对方先行动", axis:"AP", effects:{gov_trust:-3, nationalism:2}, narrative:"你暂不回应,等待对方先行动。函件留在抽屉里,如同未拆封的地雷。"} ]}, {id:"bavaria_2_chain", trigger_text:"你批准了部分财政自主。三周后,巴伐利亚财政部长再次到访,姿态比上次更靠前:巴伐利亚需要的不是钱,而是决定权,尤其是「公共秩序」的定义权。他将手掌按在桌面上,缓缓下压,说:「如果我们能得到这个,就不需要第三方的帮助了——你知道我们说的『第三方』是谁。」", trigger:{option_chosen:"A. 同意部分财政自主,换取忠诚承诺"}, options:[ {label:"A. 进一步让步——给巴伐利亚更多自治权以换取明确忠诚", axis:"GM", effects:{zentrum:2, gov_trust:-2, nationalism:3}, narrative:"你进一步让步,以更多自治权换取巴伐利亚的明确忠诚。对方作出承诺,但承诺本身仍可被重新计算。"}, {label:"B. 收回之前的让步,重新回到强硬立场", axis:"SM", effects:{zentrum:-3, political_violence:2, gov_trust:1}, narrative:"你收回此前让步,重回强硬立场。这比一开始拒绝更为艰难,也更为危险。"}, {label:"C. 公开指责巴伐利亚“要挟中央”,争取舆论支持", axis:"RE", effects:{nationalism:3, zentrum:-2, gov_trust:2}, narrative:"你公开指责巴伐利亚要挟中央,争取全国舆论支持。柏林反应积极,慕尼黑方面则加强了内部动员。"}, {label:"D. 与巴伐利亚谈判——财政自主可以,但警察权必须保留", axis:"GM", effects:{zentrum:1, gov_trust:1, nationalism:1}, narrative:"你你与巴伐利亚谈判,同意财政自主,但保留警察权。对方不满,但未退出谈判。"} ]}, {id:"bavaria_2_opposition", trigger_text:"密使带回消息:巴伐利亚内部反对派愿意合作,但提出条件——需要资金和武器。联络人称:「不是很多。但如果柏林连这个都不愿意出,他们就不会继续留在桌边。」这些人自称「忠诚的异议者」。在当前语境下,忠诚更像一种选项,选项则是可被修改的。", trigger:{option_chosen:"C. 秘密支持巴伐利亚内部反对派,削弱邦政府"}, options:[ {label:"A. 提供资金和武器——彻底颠覆巴伐利亚邦政府", axis:"OP", effects:{insider:4, political_violence:3, gov_trust:-2}, narrative:"你提供资金和武器,押注于彻底颠覆巴伐利亚邦政府。若成功,巴伐利亚将重回柏林掌控;若失败,那里会有比你更恨你自己的人记着你的名字。"}, {label:"B. 只提供资金,不提供武器——给钱但不给血", axis:"OP", effects:{insider:3, zentrum:1, political_violence:1}, narrative:"你只提供资金,不提供武器。表面上你未直接介入,但桌子底下的事仍会被看见。"}, {label:"C. 拒绝——不介入巴伐利亚内政", axis:"GM", effects:{gov_trust:1, zentrum:-2}, narrative:"你拒绝介入巴伐利亚内政。此后柏林寄往慕尼黑的公文,得到回复得比以往更慢。"}, {label:"D. 将情报转交给警方,等反对派自己行动", axis:"AP", effects:{observer:3, insider:2}, narrative:"你将情报转交警方,未直接动手,不需要承认参与,沉默本身已经表明立场。"} ]} ]}, /* ═══ 事件08:冲锋队武装升级情报(双层) ═══ */ {id:"UE_08", major:true, title:"冲锋队武装升级情报", category:"军事", description:"秘密报告指出:NSDAP下属冲锋队(SA)正在大规模购置武器。情报显示,其数量已超出「自卫需要」,疑似为武装行动做准备。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R14"]}, base_intensity:30, tag:"政治暴力增加", stages:[ {options:[ {label:"A. 立即搜查NSDAP据点,收缴武器", axis:"SM", effects:{nsdap:-5, gov_trust:3, political_violence:2}, narrative:"你下令立即搜查NSDAP据点,收缴武器。行动力度很大,NSDAP会对你怀恨在心,但大部分武器已被缴获。", next_stage:"sa_2_raid"}, {label:"B. 加强监视,暂不行动——等他们犯更大的错", axis:"GM", effects:{insider:3, nsdap:1, political_violence:1}, narrative:"你加强监视,暂不采取行动,等待他们犯下更大的错误。他们以为你没有在看,但你的人在记录每一次调动。"}, {label:"C. 秘密与NSDAP接触,警告他们不要越线", axis:"OP", effects:{nsdap:2, observer:3, gov_trust:-1}, narrative:"你通过秘密渠道与NSDAP接触,警告他们不要越线。对方表示理解,至少暂时如此。"}, {label:"D. 向媒体泄露情报,制造公众压力", axis:"RE", effects:{nsdap:-3, political_violence:2, gov_trust:1}, narrative:"你将情报泄露给媒体,制造公众压力。你不需要亲自出手,舆论会替你推动这件事。"}, {label:"E. 不处理——认为他们成不了气候", axis:"AP", effects:{nsdap:4, political_violence:3, gov_trust:-3}, narrative:"你判断他们不足以构成威胁,将报告放入抽屉。"} ]}, {id:"sa_2_raid", trigger_text:"搜查取得成功,缴获大量武器。地下室里找到一份名单,上面除冲锋队成员外,还有几名柏林警察的名字。名单倒数第三个位置是空的,只写了一行日期。你查过之后发现,那天你刚签过搜查令。你将名单收进文件夹,没有批字。", trigger:{option_chosen:"A. 立即搜查NSDAP据点,收缴武器"}, options:[ {label:"A. 扩大调查——查警察队伍中的内鬼", axis:"SM", effects:{gov_trust:3, political_violence:3, nsdap:-2}, narrative:"你下令扩大调查,追查警察队伍中的内鬼。既然警察里有人站在他们那边,那这份名单还值得在地下室等你继续翻阅。"}, {label:"B. 保密名单——暂时不动警察,避免内部恐慌", axis:"OP", effects:{insider:3, gov_trust:-1, observer:2}, narrative:"你将名单锁进抽屉,钥匙挂回腰带,暂不处理警察,以免内部恐慌。只不过许久以后你再翻出来看这封名单,那些名字一个没少。"}, {label:"C. 秘密约谈名单上的警察——给他们“第二次机会”", axis:"GM", effects:{observer:3, gov_trust:1, nsdap:1}, narrative:"你秘密约谈名单上的警察,给他们第二次机会。他们宣称选择回来。你给他们倒水时,记住了他们的手放在桌上哪一侧。"}, {label:"D. 利用名单向NSDAP施压,换取他们停止武装扩张", axis:"OP", effects:{nsdap:-3, insider:4, gov_trust:-2}, narrative:"你让NSDAP知道名单在你手里,以此换取他们停止武装扩张。他们停手了。你将名单收进抽屉,没有销毁。这些名字还在,就够你再用一次。"} ]} ]}, /* ═══ 事件09:失业救济金申领激增(三层) ═══ */ {id:"UE_09", title:"失业救济金申领激增", category:"社会", description:"劳工部呈报:上月失业救济金申请量增长45%,资金缺口已达30%。若不采取措施,下月将无款可发。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{economy:55}}, base_intensity:30, tag:"经济压力", stages:[ {options:[ {label:"A. 大幅增加拨款,保障民生底线", axis:"LE", effects:{spd:5, economy:3, social_anger:-3}, narrative:"你命令财政部立即增拨款项,保障救济金发放。这是共和国对失业者应尽的义务。", next_stage:"relief_2_funding"}, {label:"B. 缩短领取期限,倒逼就业", axis:"SM", effects:{dvp:4, social_anger:4, gov_trust:-2}, narrative:"你决定缩短领取期限,迫使失业者尽快重返就业市场。救济不能成为长期依赖。"}, {label:"C. 以工代赈——筑路、修渠、市政工程", axis:"GM", effects:{spd:2, idealism:3, economy:1}, narrative:"你批准以工代赈方案,款项拨付筑路、修渠与市政工程。次日清晨,报纸刊登了招工告示。"}, {label:"D. 下放地方,各邦自行筹措", axis:"OP", effects:{dvp:1, social_anger:2, gov_trust:-1}, narrative:"你将筹措责任下放各邦,由州政府自行解决。柏林暂时清静了,地方则怨声不断。"}, {label:"E. 什么都不做,等经济自行恢复", axis:"AP", effects:{social_anger:5, gov_trust:-4, spd:-3}, narrative:"你未采取任何措施,等待经济自行恢复。失业登记处的队伍排到街角,救济金仍按下月发放。你合上报告,未作批示。"} ]}, {id:"relief_2_funding", trigger_text:"你批准了拨款。当天下午,财政部长推门进来,手里攥着账本,脸色发灰:「钱从哪里来?国库已经空了。」", trigger:{OR:[{stat:"world.economy",op:"gte",val:50},{stat:"world.inflation",op:"gte",val:40}]}, options:[ {label:"A. 提高富人税——他们撑得住", axis:"LE", effects:{spd:4, dvp:-5, economy:-1}, narrative:"你决定向富人加税。他们会因此怨恨你,但工人会记住这笔钱来自何处。"}, {label:"B. 印钞——通胀是明天的麻烦", axis:"OP", effects:{inflation:5, gov_trust:-2, spd:2}, narrative:"你指示央行增发货币。今天的问题今天解决,明天的后果留待明天处理。"}, {label:"C. 削减军费来填窟窿", axis:"SM", effects:{army:-5, spd:3, economy:-2}, narrative:"你削减军费,将资金转用于救济。军方不会满意,但工人暂时不会挨饿。", omen:{mid:"这件事不会简单收场。", high:"军方的账本被动过的人,迟早会找上门来对账。"}, delay_next:{stage_id:"relief_3_military", title:"军费账本的对账人", desc:"一份来自国防部的会客申请摆在你的日程表上——没有署名,只写了军衔。你没有批准,也没有拒绝。", days:3}}, {label:"D. 发行国债,慢慢还", axis:"GM", effects:{dvp:3, economy:2, gov_trust:-1}, narrative:"你发行国债,以未来收入解决当前问题。利息由后人偿还,但至少今天他们还能活下去。"} ]}, {id:"relief_3_military", trigger_text:"距调拨军费给民生决策下放的数日后,一位将军未经预约便出现在你办公室门口。他把一封辞呈放在桌上,然后坐下,双腿交叠,膝盖几乎碰到桌沿。他安静地看着你,房间里没有威胁,只有一种不言自明的分量。你清楚,能签署命令的人不止你一个。辞呈是假的。他真正带来的只有一个问题:你选哪边?", trigger:{stat:"npcs.army.trust",op:"gte",val:20}, options:[ {label:"A. 强硬回应——军费必须让位给民生", axis:"SM", effects:{army:-5, spd:4, gov_trust:2}, narrative:"你站起身,告诉他:我是民选总理,军队的账本归我管。他起身离开,没有再提军费。次日,国防部照常递来新预算,比你砍掉的那份多了一个零。你没有签字,将其退回。"}, {label:"B. 安抚军方,承诺明年补回", axis:"GM", effects:{army:3, spd:-2, gov_trust:-1}, narrative:"你给他倒了一杯水,告诉他这只是暂时安排,明年军费会更高。他接过水,喝了一口,放回桌上,既未同意,也未反对。"}, {label:"C. 秘密与军方交易——削减部分预算,但给他们更多行动自由", axis:"OP", effects:{army:2, insider:4, political_violence:2}, narrative:"你关上办公室的门,告诉他:经费可以减少,但你可以用我的名义去做那些没有记录的事。他沉默片刻,然后伸出手。你握住了。"} ]} ]}, /* ═══ 事件10:外国资本收购德国企业(双层) ═══ */ {id:"UE_10", title:"外国资本收购德国企业", category:"经济", description:"经济部报告:美国、荷兰和瑞士财团正以低于市场价30%的价格大量收购鲁尔区钢铁和机械企业。总交易额已超过2000万金马克,收购仍在继续", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{inflation:45}}, base_intensity:25, tag:"经济压力", stages:[ {options:[ {label:"A. 立法限制外资收购,保护本土产业", axis:"RE", effects:{dnvp:4, nationalism:3, dvp:-3}, narrative:"你推动立法限制外资收购。德国产业应由德国人掌握,外国资本不得买走其根基。", next_stage:"foreign_2_legislation"}, {label:"B. 默许收购——以换取急需的外汇和技术", axis:"OP", effects:{dvp:5, economy:-3, nationalism:-2}, narrative:"你默许收购继续进行,以换取急需的外汇与技术。工人暂时保住了岗位。"}, {label:"C. 暗中支持本土资本联合收购,把外资挤出去", axis:"SM", effects:{dvp:3, gov_trust:2, insider:3}, narrative:"你暗中支持本土资本联合收购,以外资收购的价格反过来竞购。工厂仍在原地,只是换了主人。", next_stage:"foreign_2_counterbuy"}, {label:"D. 利用收购案煽动反外情绪,制造政治筹码", axis:"RE", effects:{nsdap:4, dnvp:3, nationalism:4, political_violence:2}, narrative:"你利用收购案煽动反外情绪,将经济问题转为政治动员。工厂只是由头,选票才是目的。"}, {label:"E. 要求收购方附加就业和技术转让条件", axis:"GM", effects:{spd:2, dvp:2, economy:-1}, narrative:"你允许收购,但要求附加就业保障与技术转让条件。这是一种更为务实的妥协"} ]}, {id:"foreign_2_legislation", trigger_text:"你提交外资限制法案。国会一读时,DVP党鞭私下告诉你:「法案走不远。商会已经动员了人。如果你非要推动,他们会用程序手段把它拖到死。」他给你倒了一杯酒,推到你面前,又说:「我们也可以换一种方式。不是禁止外资,是让它『不方便』。行政指导、审批延迟、地方优先通知。钱不会走,但会按我们的规矩走。", trigger:{option_chosen:"A. 立法限制外资收购,保护本土产业"}, options:[ {label:"A. 强行推动立法——不惜与商会正面冲突", axis:"SM", effects:{gov_trust:3, dvp:-5, nationalism:3}, narrative:"你在国会讲台上强行推动法案,不惜与商会正面冲突。商会怨恨你,但全国人民看到了你的态度。"}, {label:"B. 撤回法案,改用行政手段“劝导”外资", axis:"OP", effects:{dvp:2, insider:3, nationalism:1}, narrative:"你撤回法案,改用行政手段加以劝导。审批放慢,程序拉长,外资等待成本上升。不必正面交锋也能达到目的。"}, {label:"C. 妥协——允许收购,但要求外资必须与本土企业合资", axis:"GM", effects:{dvp:3, spd:1, nationalism:-1}, narrative:"你允许收购,但要求外资必须与本土企业合资。外资进来了,但未能完全按自身意愿行事,你守住了门槛。"}, {label:"D. 搁置法案——等更有利的政治时机", axis:"AP", effects:{economy:2, gov_trust:-1}, narrative:"你暂缓推动法案,先行处理通胀问题。秘书问何时再提,你答:等马克稳住再说。"} ]}, {id:"foreign_2_counterbuy", trigger_text:"你暗中联系了三个本土财团。他们凑齐了资金,但要求你在税收和信贷政策上给予配套支持。其中一位实业家把烟按在烟灰缸里,不紧不慢地说:「我们可以买,可以管。但我们要确保,买了之后不会再被别人买走。」你注意到他说“别人”的时候,眼睛没有看你而是落在名单最后一个名字上。那个名字属于一家与你关系密切的银行。你知道他在问你什么。", trigger:{option_chosen:"C. 暗中支持本土资本联合收购,把外资挤出去"}, options:[ {label:"A. 全力支持——提供税收优惠和低息贷款", axis:"SM", effects:{dvp:4, economy:-2, gov_trust:2}, narrative:"你全力支持,提供税收优惠与低息贷款。他们赢了,你也赢了。签字时,财政部长的笔在账单旁边停了一下,又落下去。你知道那一下意味着什么。"}, {label:"B. 部分支持——给政策,但不给资金", axis:"GM", effects:{dvp:2, gov_trust:1, economy:-1}, narrative:"你给政策,不给资金。他们拿到一扇门,却没有钥匙。进门之后能否锁好,是他们自己的事。"}, {label:"C. 不提供支持——让他们自行竞争", axis:"AP", effects:{dvp:-1, nationalism:1}, narrative:"你告诉他们:这是自由市场。他们是商人,知道这意味着什么。"}, {label:"D. 提供支持,但要求他们与你共享所有谈判信息", axis:"OP", effects:{insider:4, dvp:1, observer:3}, narrative:"你提供资金,同时要求共享全部谈判信息。你坐在棋盘边缘,不参与游戏,但能看到所有人的牌。"} ]} ]}, /* ═══ 事件11:普鲁士邦财政危机(双层) ═══ */ {id:"UE_11", title:"普鲁士邦财政危机", category:"经济", description:"普鲁士邦财政部长紧急来函:因税收锐减与鲁尔区补贴支出激增,邦政府面临破产风险。请求中央政府紧急贷款。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{economy:50}}, base_intensity:25, tag:"经济压力", stages:[ {options:[ {label:"A. 批准紧急贷款——普鲁士不能倒", axis:"GM", effects:{spd:3, zentrum:2, economy:3}, narrative:"你批准紧急贷款。普鲁士是最大的邦,若其财政崩溃,柏林也难以独善其身。", omen:{mid:"钱只给普鲁士,别的邦不会看着。", high:"邦国盯着普鲁士的那份拨款,一笔一笔都记着。"}, delay_next:{stage_id:"prussia_2_funding", title:"邻座的账单", desc:"三位财政部长的到访登记表被秘书处同时送了进来。", days:3}}, {label:"B. 拒绝——普鲁士必须自己解决问题", axis:"SM", effects:{dvp:3, gov_trust:-2, economy:1}, narrative:"你拒绝提供贷款,要求普鲁士自行解决财政问题。柏林不是无限提款机。"}, {label:"C. 贷款,但要求普鲁士接受财政监管", axis:"OP", effects:{gov_trust:2, spd:-1, insider:2}, narrative:"你批准贷款,但要求普鲁士接受中央财政监管。普鲁士对此不满,但账目确实比此前清楚。"}, {label:"D. 让普鲁士自行发行邦债,中央政府不担保", axis:"AP", effects:{dvp:1, economy:2, gov_trust:-1}, narrative:"你允许普鲁士自行发行邦债,中央不予担保。利息与风险均由邦政府承担。"}, {label:"E. 建议普鲁士出售国有资产筹资", axis:"RE", effects:{dvp:2, nationalism:1, spd:-2}, narrative:"你建议普鲁士出售铁路或矿山以筹集资金。财政大臣问能否卖得动,你答:先把清单拟出来。只是清单此后未再送到。"} ]}, {id:"prussia_2_funding", trigger_text:"钱拨出去了。普鲁士暂时稳住了。但三天后,巴伐利亚、萨克森、符腾堡的财政部长几乎同时出现在你的候客室。他们未发一言,每人手里都拿着一份格式几乎相同的文件。对普鲁士的救援成了其他邦的参照。你刚刚打开了一个尚未准备好面对的先例:若柏林救了一个邦,就必须解释为何不救另一个。柏林的资金不足以救助所有邦,但每一封拒绝信都可能变成另一份独立宣言。", trigger:{stat:"world.economy",op:"gte",val:55}, options:[ {label:"A. 设立联邦紧急救助基金——所有邦都能申请", axis:"GM", effects:{zentrum:3, spd:2, economy:5}, narrative:"你建了一个系统。不再是每封求助信单独回答——你给了所有人一张表格。邦长们安静了。表格归档之后,财政部的复核函拖了三天才到,只有一行字:资金分配需再议。"}, {label:"B. 拒绝其他邦——普鲁士是特殊情况", axis:"SM", effects:{gov_trust:2, zentrum:-4, political_violence:2}, narrative:"你关上了门。其他邦的财政部长回去了——他们的门也关上了。你关掉的那扇门留下一道缝。有人已经开始在那道缝里塞信了。"}, {label:"C. 召开各邦财政会议——制定统一规则", axis:"GM", effects:{ddp:3, insider:3, gov_trust:1}, narrative:"你把他们拉到了同一张桌子前。会议开了三天,各邦都坚持自己那份的算法。第三天的记录翻到最后一页,“地方财政自主权”几个字下面多了一条线。没有人认领。"} ]} ]}, /* ═══ 事件12:央行独立性质疑(单层) ═══ */ {id:"UE_12", title:"央行独立性质疑", category:"经济", description:"部分国会议员联名提案:要求央行接受财政部直接监督,理由是“央行对通胀失控负有责任”。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"政府信誉", stages:[ {options:[ {label:"A. 捍卫央行独立性——政府不应干预货币发行", axis:"GM", effects:{ddp:4, dvp:2, insider:3}, narrative:"你告诉议员们:央行就是央行。政治的归政治,货币的归货币。提案没有通过,但反对票只比赞成票少了七票。"}, {label:"B. 支持提案——央行必须对政府负责", axis:"SM", effects:{gov_trust:3, dvp:-3, inflation:2}, narrative:"你把央行拉进了内阁的阴影里。短期内政府有了更多工具,但货币开始学会看风向——而风向是常常变的东西。"}, {label:"C. 折中——设立联合监督委员会,但不改变央行法定地位", axis:"OP", effects:{ddp:2, dvp:1, gov_trust:1}, narrative:"你给了他们一个座位。他们坐下了。椅子在央行大楼里,但门朝两个方向开着。"}, {label:"D. 搁置提案——不讨论,不投票", axis:"AP", effects:{gov_trust:-2, insider:1}, narrative:"你把提案放进了文件柜,锁了,钥匙在你抽屉里。会议散了,你路过走廊,听见有人在低声说那几个字。你没回头。"} ]} ]}, /* ═══ 事件13:电价暴涨与工业抗议(双层) ═══ */ {id:"UE_13", title:"电价暴涨与工业抗议", category:"经济", description:"因煤炭短缺,电力公司申请上调电价30%。工业联合会警告:若批准,将引发工厂大规模停工。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{inflation:45}}, base_intensity:25, tag:"经济压力", stages:[ {options:[ {label:"A. 批准涨价——能源公司也要生存", axis:"SM", effects:{dvp:3, economy:3, social_anger:2}, narrative:"你签了字。电费涨了——工厂的烟囱还在冒烟。但工人开始数家里亮着的灯了。", omen:{mid:"电价令压了工人,总得有人开口。", high:"涨电价的钱从工人钱包里出,他们会来算这笔账。"}, delay_next:{stage_id:"electricity_2_protest", title:"工会门口的名单", desc:"总理府门房的登记簿上多了一行:工会代表团,无预约,在门口等候。", days:3}}, {label:"B. 拒绝涨价,由政府补贴电力公司", axis:"LE", effects:{spd:4, economy:4, gov_trust:2}, narrative:"你告诉电企:涨价不行,我补你。钱从国库来——但冬天还没有结束。"}, {label:"C. 部分批准——涨价10%,其余由财政补贴", axis:"GM", effects:{spd:2, dvp:2, economy:2}, narrative:"你让每个人都分担一点:工厂多付一点,政府多贴一点,工人少用一点。没有人满意,但也没有人死。"}, {label:"D. 要求电力公司提高效率,暂不调价", axis:"SM", effects:{gov_trust:1, dvp:-1, insider:2}, narrative:"你告诉他们:先把自己的账本理清楚,再谈涨价。他们把账本送来了,但页码顺序有点不对。"}, {label:"E. 任由市场决定——不干预电价", axis:"AP", effects:{dvp:2, social_anger:3, gov_trust:-2}, narrative:"你相信市场会找到平衡。市场找到了——工人关掉了灯。"} ]}, {id:"electricity_2_protest", trigger_text:"你签了电价令。三天后,工业联合会没有来——来的是工会。他们站在总理府门口,人数不多,但很安静。领头的把一份名单递给了门口的卫兵,然后转身走了。那份名单上不是名字——是地址。每一个地址后面都写着:停。", trigger:{stat:"world.social_anger",op:"gte",val:50}, options:[ {label:"A. 会见工会代表——重新谈判电价", axis:"GM", effects:{spd:4, social_anger:-3, gov_trust:2}, narrative:"你让他们进来了。谈判持续到午夜——电价降了一些,没有完全回到原点,但足够让排队的工人渐渐散去。你在最后的备忘录里写了一句备注:“让步是有预谋的,不是被逼迫的。”——然后划掉了。"}, {label:"B. 维持原价——用补贴安抚工人", axis:"OP", effects:{spd:2, gov_trust:1, economy:2}, narrative:"你补了钱,没有改价。工人满意了——但你在读到那份补贴方案的时候,发现最后一笔钱是从路灯维护的预算里挪过来的。"}, {label:"C. 宣布紧急状态——禁止抗议", axis:"SM", effects:{gov_trust:3, political_violence:4, spd:-5}, narrative:"你召了警察。他们散开了——没有喊口号。等你回到办公室,桌上放着一封信,没有抬头,字写得很淡。信上说:电价的事,我们记着。"} ]} ]}, /* ═══ 事件14:海关税收锐减报告(双层) ═══ */ {id:"UE_14", title:"海关税收锐减报告", category:"经济", description:"海关总署呈报:因鲁尔区被占与边境走私激增,本季度关税收入同比下降55%。财政部要求严查走私。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"经济压力", stages:[ {options:[ {label:"A. 加强边境巡逻与缉私力量", axis:"SM", effects:{gov_trust:3, economy:2, dvp:-1}, narrative:"你加了人手。边境线上的铁网更密了,走私少了,但每一个被拦下的包裹里都有一条你还没听到的线索。"}, {label:"B. 降低关税以刺激合法贸易", axis:"GM", effects:{dvp:4, economy:-2, gov_trust:-1}, narrative:"你降低了门槛。合法贸易多了——但每一车合法货物里都藏着一个你已知但不想追究的名字。"}, {label:"C. 不增加投入,要求海关提高效率", axis:"AP", effects:{gov_trust:-1, insider:2}, narrative:"你告诉他们:用更少的人做更多的事。他们没回答你,但走廊尽头多了三盏彻夜不灭的灯。"}, {label:"D. 建立特别调查组,严查内部腐败", axis:"SM", effects:{insider:4, gov_trust:2, dvp:-2}, narrative:"你从内部开始拆。你知道走私需要内应——而内应通常坐在离你不到二十米的地方。", omen:{mid:"走私的网比案卷里写的大。", high:"查得越深,网就越大——除非你停手。"}, delay_next:{stage_id:"customs_2_investigation", title:"走私网的加密报告", desc:"一份加密报告走的是情报渠道,绕过了常规公文流转,直接放进你的收件格。", days:28}} ]}, {id:"customs_2_investigation", trigger_text:"调查组成立四周后,你收到一份加密报告。走私通道比预想的大——不只通往荷兰和瑞士,还通往一个你三个月前刚批准了海关扩建合同的私人码头。承包商的姓氏和财政部某位官员的姓氏一致。一个人不可能在两份不同的文件里同时出现两次——除非他一直就在那里。", trigger:{stat:"player.mental.知情者",op:"gte",val:30}, options:[ {label:"A. 扩大调查——追查到底", axis:"SM", effects:{gov_trust:4, dvp:-5, insider:3}, narrative:"你一路追了上去。有人辞职了,有人失踪了,海关大楼换了一把锁。你在抽屉最底层找到了一份没有盖章的合同——它比你追查的任何一个名字都重。"}, {label:"B. 私下警告相关官员——换取内部信息", axis:"OP", effects:{insider:5, gov_trust:-2}, narrative:"你见了那个人。他给了你名单——你很想知道,他删掉的那些名字是谁。"}, {label:"C. 低调处理——不公开,不扩大", axis:"AP", effects:{gov_trust:-2, observer:2}, narrative:"你把报告封了。码头还在运转,走私还在继续——但那些被涂黑的名字,你知道它们落在纸上时是能看清的。只是你选择了不再回看。"} ]} ]}, /* ═══ 事件15:房地产崩盘预警(单层) ═══ */ {id:"UE_15", title:"房地产崩盘预警", category:"经济", description:"柏林房产中介协会报告:受通胀影响,商业地产价格已下跌40%,多家开发商濒临破产。请求政府注资托市。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{inflation:50}}, base_intensity:20, tag:"经济压力", stages:[ {options:[ {label:"A. 注资托市——房地产不能崩", axis:"SM", effects:{dvp:4, economy:3, gov_trust:2}, narrative:"你托住了房子。每一块砖的重量都写着政府的名字。从你接手那一刻起,抵押文书上第一顺位债权人的栏,已经换成了政府。"}, {label:"B. 不干预——让市场出清", axis:"AP", effects:{dvp:-2, gov_trust:-2, social_anger:2}, narrative:"你让市场自己处理。拍卖目录开始印出来,几处抵押的房产挂了上去。报纸登了半版,第二天没人再提。"}, {label:"C. 选择性救助——只救住宅项目,不救商业地产", axis:"GM", effects:{spd:3, dvp:1, economy:2}, narrative:"你告诉银行家:住宅贷款我可以保——写字楼你们自己扛。工人有地方住就够了,办公室空着就空着吧。"}, {label:"D. 将破产开发商收归国有,转为公共住房", axis:"LE", effects:{spd:5, dvp:-4, idealism:3}, narrative:"你把房子从银行家手里拿走,给了工人。他们欢呼——但开发商在走廊里留下了写着数字的账单,上面没有一个缺角。"} ]} ]}, /* ═══ 事件16:选举法改革提案(双层) ═══ */ {id:"UE_16", major:true, title:"选举法改革提案", category:"政治", description:"内政部提交报告:现行比例代表制导致极端政党获得与其影响力不符的议会席位。建议引入5%门槛条款。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 支持5%门槛——限制极端政党", axis:"GM", effects:{ddp:5, spd:2, nsdap:-4}, narrative:"你修了门槛。他们在门槛外跺脚、喊叫、砸门——但你站在门内,觉得门锁又加了一层。", next_stage:"election_2_reaction"}, {label:"B. 反对——比例代表制是民主基石", axis:"LE", effects:{spd:3, kpd:2, ddp:-1}, narrative:"你认为每一张选票都应该算数。即使是最遥远的声音也有权利被听见——即使你不喜欢它说的内容。"}, {label:"C. 折中——将门槛设为3%", axis:"OP", effects:{ddp:3, zentrum:2, nsdap:-1}, narrative:"你降低了门槛。小党还能进来——但他们进来的脚步比你想象中更有节奏。"}, {label:"D. 搁置——不讨论选举改革", axis:"AP", effects:{gov_trust:-2, political_violence:2}, narrative:"你告诉国会:现在不是时候。但他们离开后,走廊里有三个人开始压低嗓音说话。"}, {label:"E. 引入多数制替代比例制", axis:"SM", effects:{dnvp:4, spd:-4, gov_trust:1}, narrative:"你换了整个游戏规则。选票换了颜色,计票换了数字——但投票的人没有换。他们只是开始从另一个方向排队了。"} ]}, {id:"election_2_reaction", trigger_text:"门槛法通过了。你本以为NSDAP会被挡在国会之外——但他们没走。他们在报纸上写了一封公开信,落款是一个你不认识的地址,字迹很干净:“我们不需要走进国会——国会自己会走出来。” 一周后,柏林的布告栏上出现了一张海报:一只鹰,没有文字,只有日期。你不知道那是什么意思——但你注意到,海报被贴在了所有党派办公室门口。", options:[ {label:"A. 无视——他们认为自己是在虚张声势", axis:"SM", effects:{gov_trust:1, nsdap:2, political_violence:2}, narrative:"你没有回应。他们把公开信收了回去,但海报还在贴,日期越换越近。你路过布告栏的时候,没有停下来。"}, {label:"B. 修改法律——将门槛降至3%,分化极端阵营", axis:"GM", effects:{ddp:2, nsdap:-1, spd:1}, narrative:"你降了门槛。他们骂你怕了——但没有再贴海报。走廊里,副官问新选举的日期怎么定。你说:年底前。他记在本子上,走了。"}, {label:"C. 公开谴责——把NSDAP定性为反民主势力", axis:"LE", effects:{spd:3, ddp:3, nsdap:-3, political_violence:3}, narrative:"你站在国会讲台上说了那些话。第二天,那张海报被涂改了——日期旁边多了一个新词:不是日期,是名字。而那个名字你不知道是站在你这边,还是站在海报那一边。"} ]} ]}, /* ═══ 事件17:内阁成员腐败举报(单层) ═══ */ {id:"UE_17", title:"内阁成员腐败举报", category:"政治", description:"匿名举报:某内阁部长涉嫌收受企业贿赂,为特定公司获取政府合同。附有银行转账记录复印件。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state_below:{gov_trust:32}}, base_intensity:25, tag:"政府信誉", stages:[ {options:[ {label:"A. 立即立案调查——无论涉及到谁", axis:"SM", effects:{gov_trust:4, ddp:3, dvp:-5}, narrative:"你签了调查令。秘书拿去登记时问了一句:要不要抄送新闻处。你说不用。下午,涉事的部长收到了约谈通知。"}, {label:"B. 私下警告部长,要求其辞职", axis:"OP", effects:{gov_trust:1, insider:3, dvp:1}, narrative:"你给了他一条退路。他走了。没有新闻,没有庭审——但走廊里有三个人学会了怎么在辞职信里藏名字。"}, {label:"C. 不做公开调查,调整部长分工", axis:"AP", effects:{gov_trust:-3, insider:2, political_violence:1}, narrative:"你换了一个部门。他还在内阁——只是手里没有那支笔了。但笔在你不知道的地方,被另一个人捡起来了。"}, {label:"D. 用举报材料向该党派施压,换取政策让步", axis:"OP", effects:{insider:4, gov_trust:-1, dvp:-2}, narrative:"你没有查他——你把那份材料的复印件放进了下次谈判的文件夹。第二天会面,对方先开口问了条件。"} ]} ]}, /* ═══ 事件18:新内阁组建方案(单层) ═══ */ {id:"UE_18", major:true, title:"新内阁组建方案", category:"政治", description:"因前任内阁倒台,总统委托你提出新内阁组建方案。各方党派均提出部长人选要求。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R17"]}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 组建大联合政府——包容所有主流党派", axis:"GM", effects:{spd:3, ddp:3, dvp:2, gov_trust:2}, narrative:"你把所有党派拉到了同一张桌子上。座位排了两天——每家都要靠前,最后按席位数排的。"}, {label:"B. 组建少数派政府——只靠核心支持者", axis:"SM", effects:{dvp:4, spd:-3, gov_trust:1}, narrative:"你选了少数人。内阁小了,决策快了——但坐在你对面的人开始数你走了几步。"}, {label:"C. 组建专家内阁——不分配党派席位", axis:"OP", effects:{ddp:4, insider:3, spd:-2, dvp:-2}, narrative:"你把政客赶出去,换成了专家。没有人喜欢这样——但文件上多了几个字:执行日期。"}, {label:"D. 拖延——等更好的时机", axis:"AP", effects:{gov_trust:-3, spd:-1, dvp:-1}, narrative:"你什么都不做。椅子空着,公文堆着,电话响着——你伸手去接的时候,那边已经挂断了。"} ]} ]}, /* ═══ 事件19:地方自治权扩张请愿(单层) ═══ */ {id:"UE_19", title:"地方自治权扩张请愿", category:"政治", description:"多个邦政府联名请愿:要求扩大地方财政与司法自主权,减少中央政府干预。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"民族主义", stages:[ {options:[ {label:"A. 同意——给地方更多自主权", axis:"GM", effects:{zentrum:4, nationalism:2, gov_trust:-2}, narrative:"你松了手。他们开始自己走路——有些走得很稳,有些摔倒了,然后抬头看着柏林的方向。"}, {label:"B. 拒绝——中央权力不可分割", axis:"SM", effects:{gov_trust:3, zentrum:-3, political_violence:2}, narrative:"你画了一条线:柏林说了算。他们在线上画了一个问号。然后你发现线又往外移了两寸。"}, {label:"C. 同意财政自主,但保留司法控制", axis:"OP", effects:{zentrum:2, gov_trust:1, insider:3}, narrative:"你给了钱,但留下了法槌。他们可以用钱建路,但路的尽头必须通向柏林的法院——而法院的墙上挂着你的签名。"}, {label:"D. 设立委员会研究,不立即回应", axis:"AP", effects:{gov_trust:-2, zentrum:-1}, narrative:"你成立了一个研究小组。他们在开会——会议记录有一百页,但结论是:再议。"} ]} ]}, /* ═══ 事件20:总统职权争议(单层) ═══ */ {id:"UE_20", major:true, title:"总统职权争议", category:"政治", description:"法律界争论总统是否拥有超越国会立法权的“固有权力”。宪法学者提交两份对立意见书。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"政府信誉", stages:[ {options:[ {label:"A. 支持总统固有权力——紧急时必须有决断", axis:"SM", effects:{gov_trust:2, army:3, spd:-3}, narrative:"你站在总统那边:紧急时,总统说了算。国会反对,但总统的笔比他们的口号快。"}, {label:"B. 反对——总统必须受国会约束", axis:"LE", effects:{spd:4, ddp:4, gov_trust:-2}, narrative:"你站在国会这边:法律高于一切。总统收回了伸出去的手——但他看了你一眼,那种眼神比任何文件都更长。"}, {label:"C. 不表态——让法律界自行争论", axis:"AP", effects:{gov_trust:-1, insider:2}, narrative:"你说这是学术问题。他们继续争论——但走廊里多了一扇没有装锁的门。"}, {label:"D. 起草新法律明确总统职权边界", axis:"GM", effects:{ddp:4, gov_trust:1, army:-2}, narrative:"你让法律处起草了一份边界说明。秘书把它送去印刷,回来问你:要不要发给各部部长?"} ]} ]}, /* ═══ 事件21:公务员系统政治化举报(单层) ═══ */ {id:"UE_21", title:"公务员系统政治化举报", category:"政治", description:"匿名举报:部分高级公务员涉嫌加入极端政党并利用职权影响政策制定。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 全面清查——开除涉事公务员", axis:"SM", effects:{gov_trust:4, nsdap:-4, dnvp:-4, political_violence:2}, narrative:"你扫了办公室。文件不见了,椅子空了,电话不再响——但你知道他们会换一种方式回来。"}, {label:"B. 警告但不开除——防止内部反弹", axis:"OP", effects:{gov_trust:1, insider:3, nsdap:-1}, narrative:"你让他们留下来了。人事处发了一份备忘,措辞含糊,只说“遵守岗位纪律”。没有人来问,也没有人解释。"}, {label:"C. 不处理——避免与公务员系统冲突", axis:"AP", effects:{gov_trust:-3, observer:2}, narrative:"你把举报信放进了碎纸机。没有约谈,没有调职。纸屑倒进废纸篓,混在一起,再也分不出哪张是谁的。"}, {label:"D. 秘密建立忠诚度档案,长期观察", axis:"OP", effects:{insider:5, observer:3, gov_trust:-1}, narrative:"你没有动手——你把每个人的名字记在了一个本子里,名字后面空着三栏,全写着问号。"} ]} ]}, /* ═══ 事件22:柏林市政选举舞弊举报(单层) ═══ */ {id:"UE_22", title:"柏林市政选举舞弊举报", category:"政治", description:"社会团体举报:柏林市政选举中存在大规模舞弊行为——包括虚假选票与恐吓选民。要求中央介入调查。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 中央直接介入调查——接管选举委员会", axis:"SM", effects:{gov_trust:3, spd:-2, political_violence:3}, narrative:"你派了人。选票箱被打开了——清点出来的票数,比登记的选民少了四成。"}, {label:"B. 要求柏林市政府自行调查", axis:"GM", effects:{gov_trust:1, spd:1}, narrative:"你让他们自己查自己。他们交了一份报告——很干净,干净到你觉得你拿到的是一张新刷过的墙。"}, {label:"C. 不介入——地方事务由地方解决", axis:"AP", effects:{gov_trust:-3, social_anger:3}, narrative:"你说这不是你的问题。后来别人也这么说了——但椅子已经换过两个人了。"}, {label:"D. 派人观察,但不公开干预", axis:"OP", effects:{insider:3, observer:3, gov_trust:-1}, narrative:"你派了人,但没有让他们亮出身份。他们坐了三天,记了几本笔记。报告交上来时,装订是新的,页码却是乱序。"} ]} ]}, /* ═══ 事件23:童工调查报告(单层) ═══ */ {id:"UE_23", title:"童工调查报告", category:"社会", description:"劳工部调查报告:柏林及周边工厂中,14岁以下童工人数较去年增长35%。多数来自鲁尔区难民家庭。报告建议立法禁止童工。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{economy:45}}, base_intensity:25, tag:"工人愤怒", stages:[ {options:[ {label:"A. 立即立法禁止童工,并对违规工厂处以重罚", axis:"LE", effects:{spd:5, idealism:4, dvp:-3}, narrative:"你签了法,条文写的是“禁止雇佣十四岁以下童工”。劳工部的文件里附了一张工厂的登记表,其中一栏“学徒”下面的名字,最小的出生年份是一九一〇年。你合上文件时,桌角还压着昨天那封请愿信。"}, {label:"B. 不立法,但要求工厂改善工作条件", axis:"OP", effects:{dvp:2, spd:1, observer:2}, narrative:"你没有禁止——你只是加了要求。工厂墙上贴了新告示,工时缩短了半小时。你绕到后门,工头屋里挂着另一份排班表,上面的名字和告示上的不一样。"}, {label:"C. 设定年龄下限(12岁),不全面禁止", axis:"GM", effects:{zentrum:3, spd:2, economy:1}, narrative:"你把年龄线往上抬了一寸。孩子们失去了六岁到十二岁之间的日子,但当你看到那些被拦在工厂门外的孩子抬头看你的时候,你忽然不确定你做的事是在关上一扇门还是在打开一条缝。"}, {label:"D. 不干预——经济困难时期需要劳动力", axis:"RE", effects:{dvp:3, economy:-1, social_anger:3}, narrative:"你告诉他们:这是生存问题,不是道德问题。国会有人反对,但你注意到他没有站起来——他有一个孩子在鲁尔区。"} ]} ]}, /* ═══ 事件24:柏林住房危机(双层) ═══ */ {id:"UE_24", title:"柏林住房危机", category:"社会", description:"市政厅报告:柏林住房短缺已达8万套,工人家庭平均居住面积不足8平方米。建议政府出资建设公共住宅。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:25, tag:"工人愤怒", site_region:"friedrichshain", site_kind:"housing", stages:[ {options:[ {label:"A. 大规模建设公共住宅——政府出资,工人入住", axis:"LE", effects:{spd:5, idealism:3, economy:4}, narrative:"你划了地,打了桩。柏林多了十六栋灰色的楼——不算好看,但每一扇窗户后面都有人把灯点亮了。", next_stage:"housing_2_construction"}, {label:"B. 减免建筑税,鼓励私人开发商建设", axis:"OP", effects:{dvp:4, economy:-1, spd:-1}, narrative:"你给了开发商优惠。楼建起来了——租金没有降。租户协会在办公室门口放了一摞抗议信,被秘书收进了储物间。"}, {label:"C. 征用空置房产,分配给工人家庭", axis:"SM", effects:{spd:4, dvp:-4, political_violence:3}, narrative:"你把钥匙从锁里拔出来,递给了另一个人。被拿走房子的人在楼下骂了一下午。拿到钥匙的那家搬进去那天,什么都没说。"}, {label:"D. 不干预——由市场自行调节", axis:"AP", effects:{dvp:1, social_anger:3, gov_trust:-2}, narrative:"你相信市场会调节。住房办公室的报表照常送来,你翻过几页,入住的人数没变——只是名单上的住址换了一批。"}, {label:"E. 设立租金管制,限制房租上涨", axis:"GM", effects:{spd:3, social_anger:-2, dvp:-2}, narrative:"你锁住了价格。房东们不高兴,但他们没有离开柏林——他们只是开始撕掉招租启事,换成只租给熟人。"} ]}, {id:"housing_2_construction", trigger_text:"十六栋楼的地基打好了。然后混凝土供应商送来了账单——不是一份,是三份,来自三个不同的供货商。建设部长把三张发票并排放在你桌上的时候,有一个地址是相同的。而且日期栏里的墨迹有两种深浅——不细看,发现不了。", trigger:{stat:"world.economy",op:"gte",val:50}, options:[ {label:"A. 追查供应商——拆除虚假合同", axis:"SM", effects:{gov_trust:3, dvp:-4, observer:3}, narrative:"你拆了合同,重新招标。工地停了一个月,然后复工。验收那天你去了现场,工程处的人跟着你走了一圈。地基和图纸一致。你在验收单上签了字。"}, {label:"B. 接受高价——继续施工", axis:"OP", effects:{spd:1, economy:2, gov_trust:-2}, narrative:"你付了钱。楼建起来了,但你在计算每平方米成本的时候发现,那些多出来的钱足够再盖两栋楼——而你永远不知道它们去了哪里。"}, {label:"C. 找军方借调工程兵——绕过民间承包商", axis:"SM", effects:{army:3, economy:-1, observer:2}, narrative:"你让军队来盖房子。地基打得更快,墙壁更直,也没有人送来三份金额不同的发票。但你在检查落成签字的时候,发现签字栏里有一行你没有授权过的手写字迹。"} ]} ]}, /* ═══ 事件25:妇女运动请愿(单层) ═══ */ {id:"UE_25", title:"妇女运动请愿", category:"社会", description:"多个妇女组织联名递交请愿:要求废除限制妇女工作的法律条款,包括禁止妇女夜间工作与从事某些职业的规定。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"工人愤怒", stages:[ {options:[ {label:"A. 废除限制条款——妇女有权选择工作", axis:"LE", effects:{spd:4, idealism:4, zentrum:-2}, narrative:"你删掉了那几行字。修正案通过的那天,请愿书上的签名又多了三百个。"}, {label:"B. 有限修改——仅废除夜间工作禁令,保留职业限制", axis:"GM", effects:{spd:2, zentrum:2, observer:2}, narrative:"你只拆了一半的墙。她们跨过了你留下的那道门槛——但跨过之后发现墙的另一侧还站着不肯后退的另一些人。"}, {label:"C. 不修改——现有法律保护妇女", axis:"RE", effects:{zentrum:3, spd:-3, social_anger:2}, narrative:"你认为法律是在“保护”她们。她们认为你是在替她们决定什么算保护。"}, {label:"D. 将请愿转交各邦自行决定", axis:"OP", effects:{gov_trust:-1, insider:2}, narrative:"你把问题推给了州长们。有四个州改了,两个州没改——你坐在中间,点了点头,心里知道这种平衡维持不了多久。"} ]} ]}, /* ═══ 事件26:知识分子联名公开信(双层) ═══ */ {id:"UE_26", title:"知识分子联名公开信", category:"社会", description:"二十余位学者、作家联名发表公开信:警告极端主义势力的崛起,呼吁政府“捍卫共和国的精神基础”。信中未点名具体政党。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"政府信誉", stages:[ {options:[ {label:"A. 公开支持——与知识分子站在一起", axis:"GM", effects:{ddp:4, idealism:3, nsdap:-2}, narrative:"你签了回信。你站在了他们那边——在书脊被折断之前,在词语被更换之前。", next_stage:"intellectuals_2_response"}, {label:"B. 私下感谢,但不公开表态", axis:"OP", effects:{insider:2, gov_trust:1}, narrative:"你见了他们的代表,握了手,说了几句没有记录的话。临走时,走在最后的那个人把一份名单忘在了桌上。你看了,又放回原处。"}, {label:"C. 批评知识分子“制造恐慌”", axis:"SM", effects:{dnvp:3, nsdap:2, ddp:-4}, narrative:"你在报纸上公开回应了那封联名信。你告诉他们:不要煽动恐慌。但读过你回应的人比读过信的人多出三倍——信里的名字被更多人记住了。"}, {label:"D. 不回应", axis:"AP", effects:{gov_trust:-1, ddp:-2}, narrative:"你选择了沉默。他们等了一周,然后散了——有些人回家继续写书,有些人翻过窗户去了另一条街。"} ]}, {id:"intellectuals_2_response", trigger_text:"你的回信当天见报。傍晚,一位教授——你认识他,战时他翻译过一本法国诗集——出现在你的办公室门口。他没有坐下。他站在那里,说了一句话:“您支持了我们的信,但您知道信上没有签名的那个名字是谁吗?”然后他递给你一张纸。纸上是那封联名信的初稿,签字栏最下面有一行被涂掉的字——你拿台灯照了一下,那是一个年份,而不是名字。你还想知道上面写的到底是什么——但你还没来得及开口,他已经转身走出了那扇门。", trigger:{stat:"npcs.ddp.trust",op:"gte",val:40}, options:[ {label:"A. 找到那个未签名者——公开其立场", axis:"GM", effects:{insider:4, ddp:2, political_violence:1}, narrative:"你找到了他。他住在城外,在一个没有门牌号的房间里。他说的最后一句话是:“我不是不想签名——是我不能签。”门框内侧有一道浅淡的印记,是个数字。你问他是什么意思,他没有回答。"}, {label:"B. 不追究——保护匿名者的安全", axis:"GM", effects:{idealism:3, ddp:1, observer:2}, narrative:"你把那张初稿放进了抽屉。你已经知道了你想知道的那一部分,至于你没问的那部分——你决定不去查。有些事你选择不再追问,因为你还没准备好面对答案。"}, {label:"C. 利用这个信息——在幕后做文章", axis:"OP", effects:{insider:5, gov_trust:-2}, narrative:"你收起了那张纸。下一次见到另一个教授,是在楼道里。你提到这件事,他的笔停了一下,又继续写——那一停,够你记住了。"} ]} ]}, /* ═══ 事件27:街垒日纪念冲突(单层) ═══ */ {id:"UE_27", title:"街垒日纪念冲突", category:"社会", description:"警方报告:在“十一月革命”五周年纪念活动期间,极左与极右团体在柏林多处发生冲突,共24人受伤。建议禁止未来的纪念集会和游行的开展,理由是不能以“纪念历史”为名再次撕裂现在正在呼吸的街道。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{political_violence:35}}, base_intensity:20, tag:"政治暴力增加", stages:[ {options:[ {label:"A. 禁止所有纪念活动", axis:"SM", effects:{gov_trust:2, kpd:-4, nsdap:-3, political_violence:-2}, narrative:"你锁住了街道。安静了两周。第三周,墙脚又出现了粉笔字,这次是一个人名。没有日期。"}, {label:"B. 有条件允许——需提前申报并接受警方监督", axis:"GM", effects:{spd:2, ddp:2, observer:3}, narrative:"你给了他们许可证。每一张纸上都有你的签名——他们走在纸上,你站在纸的另一面。"}, {label:"C. 不干预——言论自由包括纪念自由", axis:"LE", effects:{kpd:3, spd:2, political_violence:2}, narrative:"你说他们有权纪念。他们纪念了——但纪念结束之后,地面上留下了不是花瓣的碎片。"}, {label:"D. 只允许官方的纪念活动", axis:"SM", effects:{gov_trust:1, political_violence:1, spd:-1, kpd:-1}, narrative:"你主持了官方纪念。献了花,宣读了名单,钟声响起——然后在钟声沉下去的时候,你听到了十七公里外另一段没有报备的沉默。"} ]} ]}, /* ═══ 事件28:美国记者专访请求(单层) ═══ */ {id:"UE_28", title:"美国记者专访请求", category:"外交", description:"《芝加哥论坛报》记者申请专访,主题为“德国对凡尔赛条约的态度”。国务院建议接受,以改善德国在美国公众中的形象。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:10, tag:"政府信誉", stages:[ {options:[ {label:"A. 接受专访——传递温和理性的声音", axis:"GM", effects:{intl_trust:4, ddp:3}, narrative:"你坐在了镜头前。采访稿是三页纸,你照着念完。一周后,外交部剪报里有一篇巴黎的评论,引了你第三段的一句话,只引了前半句。"}, {label:"B. 接受专访——但表达强硬立场", axis:"SM", effects:{nationalism:3, dnvp:2, intl_trust:-1}, narrative:"你在美国记者面前没有让步。他记了满满三页——你说了你想说的,但他写下来的只有一半。"}, {label:"C. 婉拒——避免被国际媒体曲解", axis:"AP", effects:{intl_trust:-1, insider:1}, narrative:"你拒绝了。你的话留在了会议室里——但第二天,你的名字出现在一份你没看到的报纸上。"}, {label:"D. 安排下级官员受访", axis:"OP", effects:{gov_trust:-1, observer:2}, narrative:"你派了别人去。他们说得很好——但记者在告别时问了一句:他代表谁?"} ]} ]}, /* ═══ 事件29:与苏联的秘密接触(单层) ═══ */ {id:"UE_29", major:true, title:"与苏联的秘密接触", category:"外交", description:"外交部密报:苏联方面通过非正式渠道表示,愿意就经济合作与德国进行接触。军方对此持谨慎欢迎态度,但外交部警告可能影响与西方国家的关系。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{revolution:45}}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 同意秘密接触——探索经济合作", axis:"OP", effects:{army:3, intl_trust:-2, insider:4}, narrative:"你在晚上见了他们的人。没有记录,没有翻译——只有杯子碰撞的声音和纸页翻动的寂静。"}, {label:"B. 拒绝——不与布尔什维克政权谈判", axis:"RE", effects:{dnvp:3, ddp:-2, intl_trust:1}, narrative:"你关上了门。莫斯科没有敲门——他们只是在门缝里塞了一张纸条,而你读完之后没有扔掉。"}, {label:"C. 有条件接触——仅限于经济议题,不涉及政治", axis:"GM", effects:{dvp:2, ddp:1, observer:3}, narrative:"你划了一条线:钱可以谈,话不能签。他们都来了,都坐下了——但你注意到他们带来的文件有两份。"}, {label:"D. 将消息转告英法,测试反应", axis:"OP", effects:{intl_trust:1, gov_trust:2, insider:3}, narrative:"你把消息放到了英法的桌上,然后站在一旁看他们是怎么谈论你的——那个下午,你学会了读他们的点头速度。"} ]} ]}, /* ═══ 事件30:国际红十字会人道主义请求(单层) ═══ */ {id:"UE_30", title:"国际红十字会人道主义请求", category:"外交", description:"国际红十字会来函:请求德国开放东部边境,允许国际救援物资进入,并协助难民过境。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"政府信誉", stages:[ {options:[ {label:"A. 同意开放边境——人道主义优先", axis:"LE", effects:{intl_trust:4, idealism:4, social_anger:2}, narrative:"你打开了门。他们进来了——带着箱子、孩子、和一段你不知道该怎么写进报告里的故事。"}, {label:"B. 有条件同意——必须接受德国监督", axis:"SM", effects:{gov_trust:2, intl_trust:1, observer:2}, narrative:"你让他们进来了,但你的人在每一个关卡都站着。他们以为这是协助——实际上,每一箱标注的物资都在你的名单上有一个编号。"}, {label:"C. 拒绝——德国自身困难无力接收", axis:"RE", effects:{intl_trust:-3, nationalism:2}, narrative:"你告诉他们:德国自己也在饿。他们收回了请求——但你看到那份文件在退回去之前,被人折了一下。"}, {label:"D. 同意接收,但将难民分流到各邦自行安置", axis:"OP", effects:{zentrum:1, gov_trust:-1, economy:1}, narrative:"你签了同意,但把安置的账单寄给了州长们。十六封公文的落款是你的名字——回信里有十二封是问句。"} ]} ]}, /* ═══ 事件31:奥地利边境纠纷(单层) ═══ */ {id:"UE_31", title:"奥地利边境纠纷", category:"外交", description:"外交部报告:奥地利方面就两国边境的几处“历史归属模糊”的地段提出主权主张。奥方未公开表态,但在外交照会中提及“可能需要国际仲裁”。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"民族主义", stages:[ {options:[ {label:"A. 接受国际仲裁——和平解决争议", axis:"GM", effects:{intl_trust:3, ddp:2}, narrative:"你把地图放在了中立的桌子上。画线的人不是你们——但你们都得接受线画完之后的结果。"}, {label:"B. 拒绝仲裁——宣称德国主权", axis:"SM", effects:{nationalism:3, dnvp:2, intl_trust:-2}, narrative:"你告诉维也纳:这是德国领土,没有谈判余地。维也纳沉默了——但他们开始在别的地方画圈了。"}, {label:"C. 秘密与奥地利谈判——绕过国际仲裁", axis:"OP", effects:{insider:3, intl_trust:1}, narrative:"你绕过了仲裁庭。你在一个没有记者的房间里谈了一个小时——最后,你们都收回了地图,并且都复印了对方的版本。"}, {label:"D. 搁置不议——不承认争议存在", axis:"AP", effects:{gov_trust:-1, nationalism:1}, narrative:"你告诉外交部:这不算问题,先搁置。你把那份照会收进档案。搁置的口吻定了下来,可地址栏里,那几个地段的名字没有消失。"} ]} ]}, /* ═══ 事件32:外国使节集体表达关切(双层) ═══ */ {id:"UE_32", title:"外国使节集体表达关切", category:"外交", description:"英、美、法、意四国驻德大使联合拜会,对“德国国内暴力升级”和“极端势力抬头”表达关切,暗示若局势失控,可能影响国际贷款和投资。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 承诺恢复秩序——争取国际信任", axis:"SM", effects:{intl_trust:4, gov_trust:2, political_violence:-1}, narrative:"你坐在了他们面前。你说的每一个承诺都是一个时间点——而你还没有给每个时间点都填上行动。", omen:{mid:"对大使许下的承诺,会被记住。", high:"他们相信你——他们在等你让国会也相信。"}, delay_next:{stage_id:"ambassadors_2_commitment", title:"大使的备忘录", desc:"一份美国大使馆的内部备忘录经非正式渠道送进来,封面上没有抬头。", days:7}}, {label:"B. 反驳——称外国无权干涉内政", axis:"RE", effects:{nationalism:4, dnvp:3, intl_trust:-3}, narrative:"你告诉他们:德国的内部事务由德国自己解决。他们没有反驳,也没有点头。送走他们之后,走廊里安静了很久。你坐回桌前,把那叠贷款文件往抽屉里推了推。"}, {label:"C. 私下安抚——公开不表态", axis:"OP", effects:{intl_trust:1, insider:3}, narrative:"你私下见了他们的大使,给了他们一些答案——但没有给任何文件。那些答案不需要签名,因为他们没有忘记,也永远不会承认。"}, {label:"D. 不回应——等国际社会自己淡忘", axis:"AP", effects:{intl_trust:-2, gov_trust:-2}, narrative:"你选择了沉默。他们没有再追问,也没有再约见。你等了一周,又等了一周,电话没有响。你把话筒放回叉簧,没有拨回去。"} ]}, {id:"ambassadors_2_commitment", trigger_text:"你做出了承诺。一周后,美国大使私下送来一份备忘录,里面夹着一张手写的纸条,两行字:“我们相信您。但您需要让国会也相信您。”纸条边缘被折了很多道,像是被反复看过。你把它放进了抽屉。", trigger:{stat:"world.intl_trust",op:"gte",val:40}, options:[ {label:"A. 在国会发表讲话——公开承诺改革", axis:"GM", effects:{intl_trust:3, gov_trust:2, spd:2}, narrative:"你站在讲台上说了那番话。掌声不多——你注意到有几排座位是空的。会议结束后,你在走廊里看到一个你认识的大使,他朝你点了点头。你想起那张备忘录的边角,在他的口袋里碾过三次。"}, {label:"B. 私下向大使提供政策草案", axis:"OP", effects:{intl_trust:2, insider:3, gov_trust:-1}, narrative:"你给了他一份文件。他没有看——他把它放在桌上。然后说了一句没有写在备忘录里的话:“我会等。”你意识到他等的不是文件,是你真正放手的那一天。"}, {label:"C. 不公开表态——仅通过外交渠道回应", axis:"AP", effects:{intl_trust:-1, gov_trust:-1}, narrative:"你回了信,措辞温和,没有承诺。他没有再写信来。此后两国的往来照会,只谈贸易和汇率,不再提德国内政。你把这看作是答复,没有追问。"} ]} ]}, /* ═══ 事件33:退伍军人占领市政厅(单层) ═══ */ {id:"UE_33", title:"退伍军人占领市政厅", category:"军事", description:"紧急报告:一群退伍军人占领了布雷斯劳市政厅,要求政府补发拖欠五个月的抚恤金。他们宣称如果不得到答复,将继续停留。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{political_violence:50}}, base_intensity:25, tag:"军队不满", site_region:"alexanderplatz", site_kind:"veteran", stages:[ {options:[ {label:"A. 派警察清场——占领不可容忍", axis:"SM", effects:{gov_trust:2, army:-2, political_violence:3}, narrative:"你派了警察。门被踢开了,人被捕了。但你在新闻稿里没有提到那些站在街对面的老兵的妻子——她们手里攥着信封,没有地址。"}, {label:"B. 支付抚恤金——解决根本问题", axis:"GM", effects:{spd:3, army:3, economy:4}, narrative:"你打开了金库。钱送到了他们手里——但你数了一下,这还不到他们应得的一半。"}, {label:"C. 派谈判代表——承诺分期支付", axis:"GM", effects:{army:2, gov_trust:1, social_anger:-1}, narrative:"你派了人去谈。他们同意撤出,条件是白纸黑字。你在那张纸上签了字。抚恤金排在下一个月的预算里,财政部的批复还没有下来。"}, {label:"D. 不回应——让他们自己疲倦离开", axis:"AP", effects:{army:-3, gov_trust:-3, social_anger:3}, narrative:"你告诉他们:这是非法占领。你关上了办公室的门,也关上了电话——三天后他们走了,但布雷斯劳的墙上多了一行你不会去读的字。"} ]} ]}, /* ═══ 事件34:国防军东部换防申请(双层) ═══ */ {id:"UE_34", major:true, title:"国防军东部换防申请", category:"军事", description:"国防部提交计划:将两个师调往东部边境,理由是“应对苏联可能采取的压力”。外交部对此表示担忧,认为此举可能被苏联视为挑衅。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R01"]}, base_intensity:25, tag:"军队不满", stages:[ {options:[ {label:"A. 批准换防——军队知道自己在做什么", axis:"SM", effects:{army:4, nationalism:3, intl_trust:-2}, narrative:"你同意了。军队开始向东移动——你收到一份外交照会,时间比火车出发晚了一天。", omen:{mid:"东边的调动,苏联不会只回一份照会。", high:"你动了边境,对面就在重新读你。"}, delay_next:{stage_id:"east_deployment_2_reaction", title:"边境观察周报", desc:"边境观察员的周报比平时厚了一页,另外附了一张手绘的部署略图。", days:7}}, {label:"B. 拒绝——避免刺激苏联", axis:"GM", effects:{intl_trust:3, ddp:2, army:-3}, narrative:"你压住了调令。军队没动。参谋长第二天送来一份地图,没有折叠,上面画着一条路线。你把它夹进文件堆里,没有再看。"}, {label:"C. 批准换防,但提前知会苏联", axis:"OP", effects:{army:2, intl_trust:1, insider:3}, narrative:"你给了莫斯科一个电话。他们知道你要调兵了——所以你的邻居在知道的同时也知道你提前通知了他。"}, {label:"D. 拖延——等局势更明朗再决定", axis:"AP", effects:{army:-1, gov_trust:-1}, narrative:"你把文件放进了“待定”文件夹。三个星期后你再看它,调令的页边多了几行批注。你问过办公室的人,都说不是自己写的。"} ]}, {id:"east_deployment_2_reaction", trigger_text:"部队开始移动了。你预先通知了苏联——他们回了一份外交照会,措辞标准:注意到了,会相应调整。一周后,你的边境观察员报回来一条消息:苏联境内靠近边境的铁路,货运量在增加,但没有一件是民用物资。观察员没有下结论,只把数字列在电报末尾。", trigger:{stat:"world.intl_trust",op:"gte",val:35}, options:[ {label:"A. 暂停换防——撤回部队", axis:"GM", effects:{intl_trust:2, army:-4, gov_trust:-1}, narrative:"你叫停了火车。军队退了回来。地图上边境处的虚线还在——地图室的人问要不要擦掉,你说先留着。后来没人再提这件事。"}, {label:"B. 加速换防——抢占有利位置", axis:"SM", effects:{army:4, nationalism:3, intl_trust:-3}, narrative:"你下令加速了。火车连夜出发,边境线绷紧——你站在地图前,发现苏联的那条虚线在你加速的第二天晚上往前移了一格。"}, {label:"C. 换防继续——但秘密与苏联沟通", axis:"OP", effects:{army:2, insider:4, intl_trust:1}, narrative:"你打了另一个电话。他们回了一句话:“我们在看。”你挂了电话后,给参谋长打了一个电话,告诉他:“保持这个位置,但不再往前推。”他在电话那头沉默了三秒——然后说:“收到了。”那三秒里,你听到他翻了一页纸。"} ]} ]}, /* ═══ 事件35:军工企业国有化提案(单层) ═══ */ {id:"UE_35", major:true, title:"军工企业国有化提案", category:"军事", description:"部分国会议员提案:将主要军工企业收归国有,理由是“战争物资的生产不应掌握在私人手中”。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"军队不满", stages:[ {options:[ {label:"A. 支持国有化——武器属于国家", axis:"LE", effects:{spd:4, army:2, dvp:-5}, narrative:"你把工厂钥匙收进了保险柜。工人觉得你在保护他们,银行家觉得你在拿走他们——武器图纸还是那些图纸,但签名变了。"}, {label:"B. 反对——军工企业可以私有", axis:"RE", effects:{dvp:4, army:2, spd:-3}, narrative:"你说私人经营更有效率。董事会通过了决议,维持私有。你列席了第一次会议,议程比你想的短——资本、订单、扩张计划,半小时讲完。没有人提到战争物资这四个字。"}, {label:"C. 折中——国家对军工企业控股51%", axis:"OP", effects:{gov_trust:2, dvp:1, observer:3}, narrative:"你把国家的手放在了桌上——没有完全握住,但足够让任何人知道它随时可以收紧。"}, {label:"D. 搁置提案——不讨论", axis:"AP", effects:{gov_trust:-2, army:-1}, narrative:"你把提案留在了国会。没有投票,没有辩论——工厂继续生产,工人继续组装,唯一不同的是,门口那个穿军装的人换了一个。"} ]} ]}, /* ═══ 事件36:海军重建争议(单层) ═══ */ {id:"UE_36", major:true, title:"海军重建争议", category:"军事", description:"海军部提交提案:请求拨款建造两艘新型巡洋舰,理由是“波罗的海防御能力严重不足”。国防部支持,财政部反对,称“造一艘巡洋舰的钱可以建一百所学校”。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"军队不满", stages:[ {options:[ {label:"A. 批准建造——海军需要现代化", axis:"SM", effects:{army:5, nationalism:3, economy:4}, narrative:"你签了字。龙骨在船坞里铺下。工头说,船要两年才能下水。你站在船坞边,看着那根龙骨,站了很久。"}, {label:"B. 拒绝——钱应该用在民生上", axis:"LE", effects:{spd:5, idealism:3, army:-5}, narrative:"你把那笔钱拨给了学校。一百所学校——但你出海的时候发现,邻国的船比你的渔船大。"}, {label:"C. 折中——先造一艘,另一艘暂缓", axis:"GM", effects:{army:2, dvp:2, economy:2}, narrative:"你给了他们半条船。他们接受了——但船坞里多了一把空椅子,造船的人说那是留给第二艘船的。"}, {label:"D. 批准建造,但要求海军承担部分资金来源", axis:"OP", effects:{army:1, gov_trust:1, observer:2}, narrative:"你告诉他们:船可以造,但海军自己也要出一部分钱。他们卖了旧船、削减了训练预算——但龙骨还是铺下去了,而且比原来计划更深。"}, {label:"E. 将提案提交国会公开辩论,不预先表态", axis:"AP", effects:{gov_trust:-1, insider:1}, narrative:"你把问题交给了国会。他们吵了两个月——最后通过的预算只够造半艘船。船坞里先铺了龙骨,剩下的一半等明年的拨款。"} ]} ]}, /* ═══ 事件37:退役将军组建议修改国防政策(单层) ═══ */ {id:"UE_37", major:true, title:"退役将军组建议修改国防政策", category:"军事", description:"一群退役高级将领联名致函:批评现行国防政策“过于软弱”,建议废止凡尔赛条约军事限制,并公开重建总参谋部。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{army_influence:45}}, base_intensity:25, tag:"军队不满", stages:[ {options:[ {label:"A. 公开支持——与国家利益一致", axis:"SM", effects:{army:5, nationalism:4, intl_trust:-4}, narrative:"你站在了他们那边。总参谋部的大门重新打开了——但打开的时候,你看到门槛上有三道很深的划痕,不是靴子留下的。"}, {label:"B. 拒绝——凡尔赛条约必须遵守", axis:"GM", effects:{intl_trust:3, ddp:3, army:-4}, narrative:"你告诉他们:德国承诺了,德国就要遵守。他们走了,没有带走文件。第二天你翻那份文件,信纸背面的空白处多了一个问号。"}, {label:"C. 不公开支持,但默许军方私下研究", axis:"OP", effects:{army:2, insider:4, gov_trust:-1}, narrative:"你没有签字,也没有说话。但在某个晚上,你看到有人从后门走进大楼,手里拿着一个写满了箭头和日期的文件夹——你的目光没有追问他的名字。"}, {label:"D. 谴责——称其“不负责任的冒险主义”", axis:"RE", effects:{ddp:3, spd:2, army:-3}, narrative:"你公开谴责了那封信。第二天早上,有七份辞职信放在你的桌上——它们的墨水颜色完全相同,时间是同一天凌晨。"} ]} ]}, /* ═══ 事件38:情报部门权限争议(双层) ═══ */ {id:"UE_38", major:true, title:"情报部门权限争议", category:"军事", description:"内政部与国防部就国内情报工作的管辖权发生严重分歧。国防部主张军队应拥有独立的情报收集权,内政部认为这侵犯了文官政府的监督权。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 支持国防部——军队需要自己的情报", axis:"SM", effects:{army:4, gov_trust:-1, insider:2}, narrative:"你给了他们独立权。他们开始收集情报——但你不知道他们收集了多少关于你的笔记。", omen:{mid:"军方有了自己的耳目,他们不会只用在自己人身上。", high:"军队开始自己收集情报了——你早晚会在里面看到自己的名字。"}, delay_next:{stage_id:"intelligence_2_military", title:"无头衔的报告", desc:"一份报告混在常规公文的末尾:没有抬头,没有日期,没有签名。", days:90}}, {label:"B. 支持内政部——情报必须受文官监督", axis:"GM", effects:{ddp:4, gov_trust:2, army:-3}, narrative:"你把情报锁在了文官手里。军队不服——但在你确定那张办公桌的抽屉没有被打开过的痕迹之前,你永远不会完全相信自己是第一个读到这份文件的人。"}, {label:"C. 折中——建立联合情报委员会", axis:"GM", effects:{ddp:2, army:1, observer:3}, narrative:"你让两边各派了三个人。他们坐在同一张桌子前——但你看得出来,他们带来的纸来自不同的库房。"}, {label:"D. 搁置不议——维持现状", axis:"AP", effects:{gov_trust:-2, insider:1}, narrative:"你告诉他们:先这样。会议散了,你把三个字写进会议记录,存档。文件柜合上的时候,你听见自己把那口气咽了回去。"} ]}, {id:"intelligence_2_military", trigger_text:"你给了军队独立情报权。三个月后,你收到一份来自“非正式渠道”的报告——封面没有抬头,没有日期,没有签名。内容是关于一名文职官员的财务记录。这个人你认识,他每天早晨八点经过你的办公室门口。你翻开最后一页,看到报告里有一个银行账号,尾号和你的私人账户相差两个数字——而这两个数字的差距,不足以排除是一次偶然的排字错误。", trigger:{stat:"npcs.army.trust",op:"gte",val:45}, options:[ {label:"A. 召见军方情报负责人——当面质问", axis:"SM", effects:{gov_trust:2, army:-2, insider:3}, narrative:"你让他坐在了你对面。他把那份报告收回去了,然后给你看了一份新的——这一次,尾号是对的。他离开后,你打开办公桌右边的抽屉,看到一张信封,背面写着一串数字——正是那个银行账号的前半部分。"}, {label:"B. 不追究——保持关系", axis:"OP", effects:{army:3, gov_trust:-2, observer:2}, narrative:"你把报告锁进了抽屉。没有当面问过任何人。但那个早晨之后,你开始留意那个走廊里经过的每一双眼睛——那段时间里,有两双眼睛会在同一条走廊里出现得比你更规律。"}, {label:"C. 向文官部门通报——制衡军方情报力量", axis:"GM", effects:{ddp:3, gov_trust:1, army:-3}, narrative:"你把报告转给了文官监督机构。他们调查了三个月,没有找到证据——没有找到证据的意思,是你让他们查的那份档案已经不在原来的位置了。那段时间走廊里少了一个人的脚步声。你不知道是他换了办公室,还是决定不再经过你的门口。"} ]} ]}, /* ═══ 事件39:边境军事演习通报(单层) ═══ */ {id:"UE_39", major:true, title:"边境军事演习通报", category:"外交", description:"波兰外交部正式照会:抗议德国在东部边境举行的军事演习“靠近波兰领土”。波兰称其为“挑衅行为”,要求立即停止。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R01"]}, base_intensity:20, tag:"民族主义", stages:[ {options:[ {label:"A. 停止演习——避免外交冲突", axis:"GM", effects:{intl_trust:3, army:-2, ddp:2}, narrative:"你叫停了演习。士兵收起了装备——但你在收队令上签字的时候,铅笔在日期栏里停了一下。"}, {label:"B. 继续演习——德国领土上的德国事务", axis:"SM", effects:{nationalism:3, army:3, intl_trust:-3}, narrative:"你告诉华沙:这是德国领土。炮声响了三天,最后一声炮响比前面任何一声都长——那是你在发出另一份不对外公开的指令。"}, {label:"C. 继续演习,但提前通知波兰", axis:"GM", effects:{intl_trust:1, army:1, observer:2}, narrative:"你给了华沙一个提前量。他们不赞成,但也没有中断外交关系。华沙的沉默和炮火一样长,而你把两者都收进了同一天的日志里。"}, {label:"D. 不回应照会", axis:"AP", effects:{intl_trust:-2, gov_trust:-1}, narrative:"你把照会放进了外交部一个你不太常经过的柜子。波兰人等了三个星期,然后换了一个方式问你——那个问题写在另一张纸上,而那张纸没有被折过。"} ]} ]}, /* ═══ 事件40:秘密武器研发报告(单层) ═══ */ {id:"UE_40", major:true, title:"秘密武器研发报告", category:"军事", description:"国防部密报:军方正在资助一项“新型远程火炮”的秘密研发项目,已超出凡尔赛条约允许范围。若被国际监督机构发现,可能引发严重外交后果。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{army_influence:45}}, base_intensity:25, tag:"军队不满", stages:[ {options:[ {label:"A. 叫停项目——销毁所有研发资料", axis:"GM", effects:{intl_trust:4, ddp:3, army:-5}, narrative:"你下令烧掉了图纸。灰烬落进炉膛的最后一个小时,你在椅子上坐了很久——直到你发现炉膛深处还有一角没有被火焰碰到的纸边露在外面,你没有伸手去够它。"}, {label:"B. 继续研发——但更加保密", axis:"SM", effects:{army:4, insider:3, intl_trust:-3}, narrative:"你告诉军方:继续做,但别让任何人看到。他们把项目搬出了柏林。此后你只在每季度的简报里见到它,代号换过两次,地址一栏写着‘另行通知’。你没有问下去。"}, {label:"C. 将研发转为国际合作——规避凡尔赛条款", axis:"OP", effects:{army:2, intl_trust:1, observer:4}, narrative:"你找到了一个不签字的盟友。图纸分成了两份,生产分成了两地——签收记录上只留下两个不同国家的印章,和一个你从未见过的签名。"}, {label:"D. 不表态——既不叫停也不支持", axis:"AP", effects:{army:1, gov_trust:-2}, narrative:"你没有签署任何文件,也没有出席任何会议。项目照常推进,你既没叫停,也没拦。有些文件会自己找到你的名字,只是这次,你没有抬头看。"} ]} ]}, /* ═══ 事件41:物价管控提案(单层) ═══ */ {id:"UE_41", title:"物价管控提案", category:"经济", description:"经济部长提交提案:对基本生活物资实施最高限价,以遏制通胀对民生的冲击。商会警告此举将导致物资短缺与黑市泛滥。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{inflation:40}}, base_intensity:20, tag:"经济压力", stages:[ {options:[ {label:"A. 批准限价——民生优先", axis:"LE", effects:{spd:4, social_anger:-3, economy:2}, narrative:"你锁住了价格。面包不再涨了——但面包店的货架开始空了。"}, {label:"B. 拒绝——市场由供需决定", axis:"OP", effects:{dvp:4, inflation:2, social_anger:1}, narrative:"你拒绝了限价,把经济部的报告打了回去。下一周,菜价又涨了一成。救济站门口排队的人比上周多了一截。"}, {label:"C. 限价+配给制并行", axis:"SM", effects:{spd:2, gov_trust:2, economy:3}, narrative:"你既锁了价格,又锁了供应。系统很复杂——但至少每个人都有东西吃。"}, {label:"D. 不表态——让经济部自行研究", axis:"AP", effects:{gov_trust:-2, social_anger:2}, narrative:"你把提案打回了经济部。他们还在研究。与此同时,物价又涨了一轮。"} ]} ]}, /* ═══ 事件42:农业歉收预警(单层) ═══ */ {id:"UE_42", title:"农业歉收预警", category:"经济", description:"农业部报告:因持续干旱与化肥短缺,今年谷物收成预计下降30%。建议提前启动粮食进口计划。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{economy:45}}, base_intensity:20, tag:"经济压力", stages:[ {options:[ {label:"A. 启动大规模粮食进口", axis:"GM", effects:{intl_trust:2, economy:4, gov_trust:2}, narrative:"你去国外买了粮食。船在海上——而你在码头上等着,数着天数。"}, {label:"B. 征收国内粮食储备", axis:"SM", effects:{gov_trust:2, spd:-2, social_anger:3}, narrative:"你收了农民的粮。他们骂你——但城市里的人有面包了。"}, {label:"C. 呼吁民众节约粮食", axis:"AP", effects:{gov_trust:-1, social_anger:1}, narrative:"你发了一份倡议书,印了两万份,发到各区。回执收上来三百份,大多是机关和学校的。居民区的邮筒里,倡议书摞在旧报纸上面。"}, {label:"D. 向国际社会请求援助", axis:"LE", effects:{intl_trust:3, nationalism:-2, idealism:2}, narrative:"你让外交部拟了请求援助的照会。草稿来回改了三遍——“请求”改成“呼吁”,“呼吁”又改回“请求”。最后还是用了“请求”。"} ]} ]}, /* ═══ 事件43:银行体系重组提案(单层) ═══ */ {id:"UE_43", title:"银行体系重组提案", category:"经济", description:"央行提交提案:建议对柏林多家濒临破产的私人银行进行重组,由政府注资并接管坏账。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{inflation:50}}, base_intensity:25, tag:"经济压力", stages:[ {options:[ {label:"A. 批准重组——拯救银行体系", axis:"SM", effects:{dvp:4, economy:3, gov_trust:2}, narrative:"你填了窟窿。银行恢复了营业,门口排队的人拿到了存款。注资文件盖了章——审计那边的复核报告还没有交上来。"}, {label:"B. 拒绝——让破产银行倒闭", axis:"RE", effects:{dvp:-3, gov_trust:-1, social_anger:2}, narrative:"你让银行倒下了。储户的钱没了——他们开始学习另一种金融:信任邻居。"}, {label:"C. 国有化问题银行", axis:"LE", effects:{spd:3, dvp:-4, observer:3}, narrative:"你把银行收归国有。柜台后面换人了——但柜台前面排队的人没有少。"}, {label:"D. 提供贷款担保,不直接注资", axis:"GM", effects:{dvp:2, gov_trust:1, economy:2}, narrative:"你给了承诺,没有给钱。银行暂时稳住了——但你看到行长的抽屉比上周多上了一把锁。"} ]} ]}, /* ═══ 事件44:国债发行计划(单层) ═══ */ {id:"UE_44", title:"国债发行计划", category:"经济", description:"财政部提出:发行新一轮政府债券以填补财政赤字,利率定为8%。金融界反应冷淡,认为利率不足以吸引投资者。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"经济压力", stages:[ {options:[ {label:"A. 提高利率至12%以吸引投资", axis:"SM", effects:{dvp:3, economy:2, gov_trust:1}, narrative:"你把利率抬高了。钱进来了——但每张债券都在提醒你:利息不会自己消失。"}, {label:"B. 保持8%——不增加债务负担", axis:"GM", effects:{spd:2, ddp:2, economy:2}, narrative:"你保守了。债券卖得慢。国库的进账表不会说谎——它比去年同期短了一截。"}, {label:"C. 强制金融机构认购", axis:"SM", effects:{gov_trust:3, dvp:-3, economy:1}, narrative:"你告诉银行:买。他们买了——但他们的律师已经开始为下一次选举准备文件了。"}, {label:"D. 搁置——暂不发债", axis:"AP", effects:{economy:4, gov_trust:-2}, narrative:"你把计划放进了抽屉。钱先欠着——欠着意味着你还能看到空出来的前一日历页。"} ]} ]}, /* ═══ 事件45:宪法解释权争议(单层) ═══ */ {id:"UE_45", major:true, title:"宪法解释权争议", category:"政治", description:"最高法院和国会之间就宪法解释权的归属发生分歧。最高法院认为其拥有最终解释权,国会则认为立法权应高于司法解释权。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"政府信誉", stages:[ {options:[ {label:"A. 支持最高法院——法律必须统一", axis:"GM", effects:{ddp:4, gov_trust:2}, narrative:"你站在了法官那边。他们开始释法——而你注意到,第一个被解释的词是“权力”。"}, {label:"B. 支持国会——人民代表说了算", axis:"LE", effects:{spd:3, ddp:-2, political_violence:1}, narrative:"你站在了议员那边。他们欢呼——但他们没有告诉你,他们要解释哪条法律。"}, {label:"C. 设立宪法委员会——三方共议", axis:"GM", effects:{ddp:2, zentrum:2, observer:3}, narrative:"你建了一座桥。两边都来了——但桥有承重限制。"}, {label:"D. 不表态——等判例自然形成", axis:"AP", effects:{gov_trust:-2, insider:1}, narrative:"你告诉两边:先判几个案子再说。他们判了——而你在每个判决书上看到的解释都不一样。"} ]} ]}, /* ═══ 事件46:联邦制改革辩论(单层) ═══ */ {id:"UE_46", major:true, title:"联邦制改革辩论", category:"政治", description:"多个小邦提出:现行联邦制下各邦权利不平等,建议改革邦代表权分配。普鲁士对此表示强烈反对。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"民族主义", stages:[ {options:[ {label:"A. 支持改革——让各邦更平等", axis:"GM", effects:{zentrum:3, spd:2, dnvp:-3}, narrative:"你让联邦议会重新划了座位。普鲁士觉得少了——但你觉得这才是刚刚开始。"}, {label:"B. 反对——维持现行体制", axis:"SM", effects:{dnvp:4, gov_trust:1, zentrum:-3}, narrative:"你告诉小邦:位置不够了。他们退回去了——但普鲁士没有退。"}, {label:"C. 折中——增加小邦席位但不减少普鲁士", axis:"OP", effects:{dnvp:1, zentrum:2, gov_trust:1}, narrative:"你加了几把椅子。房间没有变大——但多出来的椅子让人坐得很挤。"}, {label:"D. 搁置不议", axis:"AP", effects:{gov_trust:-2, zentrum:-1}, narrative:"你把它变成了“长期研究项目”。研究还在继续——但有些邦已经开始用行动表达不满了。"} ]} ]}, /* ═══ 事件47:地方选举舞弊举报(单层) ═══ */ {id:"UE_47", title:"地方选举舞弊举报", category:"政治", description:"多个地方选举被举报存在舞弊行为,包括选民名单作假与投票站暴力威胁。举报者要求中央介入。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 中央全面介入调查", axis:"SM", effects:{gov_trust:4, spd:-4, political_violence:2}, narrative:"你派了调查员。他们带回的报告有三十页——但你注意到,第一页和最后一页的字体颜色差了一度。"}, {label:"B. 只调查最严重的案件", axis:"GM", effects:{gov_trust:2, observer:2}, narrative:"你选了三个最严重的。他们查了,处理了——但另外七个案子没有人再问过。"}, {label:"C. 不介入——地方事务地方解决", axis:"AP", effects:{gov_trust:-3, social_anger:3}, narrative:"你说这是地方的事。地方的报纸说你不管——但你也在等着看谁能解决。"}, {label:"D. 秘密获取举报信息——用于政治操作", axis:"OP", effects:{insider:5, gov_trust:-2}, narrative:"你没有调查——你把举报信放进了另一个抽屉。有人用它换了位置,有人用它换了沉默。"} ]} ]}, /* ═══ 事件48:公职人员行为准则争议(单层) ═══ */ {id:"UE_48", title:"公职人员行为准则争议", category:"政治", description:"公务员联合会抗议政府拟推出的“公职人员政治中立准则”,认为其限制了公务员的基本政治权利。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"政府信誉", stages:[ {options:[ {label:"A. 强制执行准则", axis:"SM", effects:{gov_trust:3, ddp:-2, observer:2}, narrative:"你告诉公务员:在岗的时候,你不是党员。有些人照做了,有些人把党员证换成了另一个——但办公桌抽屉里的那本证还在发烫。"}, {label:"B. 撤回提案", axis:"LE", effects:{spd:3, ddp:2, gov_trust:-2}, narrative:"你退了一步。公务员赢了——但你在走廊里听到有人低声说“他退了”。"}, {label:"C. 折中——允许政治参与但禁止利用职权", axis:"GM", effects:{ddp:2, spd:1, observer:2}, narrative:"你画了一条线。他们在线上走——但走的时候,脚没有碰线。"}, {label:"D. 不制定准则——维持现状", axis:"AP", effects:{gov_trust:-1, insider:1}, narrative:"你觉得不需要规则。后来你发现有人用办公桌下的抽屉整理了一份不属于他的会议记录。"} ]} ]}, /* ═══ 事件49:医疗系统崩溃预警(单层) ═══ */ {id:"UE_49", title:"医疗系统崩溃预警", category:"社会", description:"卫生部长紧急报告:柏林主要医院药品储备仅够维持两周,护士罢工要求加薪。若不干预,医院将在月底前瘫痪。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{economy:55}}, base_intensity:25, tag:"工人愤怒", stages:[ {options:[ {label:"A. 紧急拨款+谈判护士薪资", axis:"LE", effects:{spd:5, idealism:3, economy:4}, narrative:"你给了钱,也给出了承诺。药来了,护士回去了——但你在巡视病房的时候,看到她们看你的眼神和上周不一样了。"}, {label:"B. 宣布医疗紧急状态——调军队协助", axis:"SM", effects:{gov_trust:2, army:2, spd:-3}, narrative:"你让军医进了病房。护士回到了岗位,药也送到了——但你不知道她路过你的那两秒钟里,有没有把病历本翻到最后一页。"}, {label:"C. 不干预——让医院自行解决", axis:"AP", effects:{social_anger:4, gov_trust:-4}, narrative:"你相信医院能自己挺过去。他们也挺过来了——但他们挺过来的方式是把三张床并成了一张。"}, {label:"D. 向国际红十字会请求援助", axis:"GM", effects:{intl_trust:3, idealism:2, social_anger:-1}, narrative:"你打了电话。他们会来——但他们到达之前,你已经数过了走廊里每一个空药瓶。"} ]} ]}, /* ═══ 事件50:教育经费裁减争议(单层) ═══ */ {id:"UE_50", title:"教育经费裁减争议", category:"社会", description:"财政部建议削减教育经费15%,以缓解财政赤字。教师联合会强烈抗议,称此举将导致数千名教师失业。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"工人愤怒", stages:[ {options:[ {label:"A. 批准裁减——财政优先", axis:"SM", effects:{dvp:3, spd:-4, gov_trust:1}, narrative:"你砍了教育经费。财政部核减的数字下来了。教育局把裁员名单报送上来,第一页是三十七个教师的名字,最短的教龄是三年。"}, {label:"B. 拒绝裁减——教育不可妥协", axis:"LE", effects:{spd:5, idealism:4, economy:3}, narrative:"你保住了学校。课堂的灯还亮着。会开完,财政局长的笔在减支表上顿了一下,没有画下去。你走出门,回头看了一眼,灯还亮着。"}, {label:"C. 裁减但延迟执行", axis:"OP", effects:{spd:1, gov_trust:-1}, narrative:"你给了他们缓冲期。他们回去继续教书了——但你知道你在翻课表的时候,已经看到了他们准备裁掉的那几个名字。"}, {label:"D. 通过增加大学学费来弥补", axis:"GM", effects:{dvp:2, spd:-2, social_anger:1}, narrative:"你把负担转给了大学生。他们没走——但他们开始在教室里点蜡烛抗议了。"} ]} ]}, /* ═══ 事件51:难民潮涌入报告(单层) ═══ */ {id:"UE_51", title:"难民潮涌入报告", category:"社会", description:"内政部报告:因鲁尔区冲突与东欧动荡,近一个月涌入柏林的难民超过5,000人。市政设施不堪重负。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R01"]}, base_intensity:20, tag:"工人愤怒", site_region:"anhalter", site_kind:"refugeeflow", stages:[ {options:[ {label:"A. 设立临时收容中心——政府拨款", axis:"LE", effects:{spd:4, idealism:3, economy:4}, narrative:"你搭了帐篷。他们住进去了——但帐篷不够。你站在空地上,看着他们排队,直到第三顶帐篷立起来,你才回过神。"}, {label:"B. 严格限制入境——关闭边境", axis:"SM", effects:{nationalism:3, nsdap:2, intl_trust:-3}, narrative:"你关上了门。他们还在外面——而你在窗前看着天色越来越深,直到分不清那是你关上的门还是天黑。"}, {label:"C. 将难民分流到各邦", axis:"OP", effects:{zentrum:1, gov_trust:-1}, narrative:"你把他们分给了各邦。每个州都拿到了几个——他们以为你分的是数字,但你心里知道,你分的是“谁来负责”。"}, {label:"D. 鼓励民间机构收容", axis:"GM", effects:{zentrum:2, idealism:2}, narrative:"你让教会和慈善机构接手了。他们做得比你能想到的更好——但也更快地被撑到了极限。"} ]} ]}, /* ═══ 事件52:武器走私网络破获报告(单层) ═══ */ {id:"UE_52", major:true, title:"武器走私网络破获报告", category:"军事", description:"警方报告:破获一个跨国武器走私网络,缴获大量军用步枪与弹药。初步调查显示,部分武器可能流向国内激进组织。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{political_violence:40}}, base_intensity:25, tag:"政治暴力增加", stages:[ {options:[ {label:"A. 扩大调查——追查买家网络", axis:"SM", effects:{gov_trust:4, nsdap:-3, insider:3}, narrative:"你追到了他们的仓库和他们的名单。名单很长,而你在翻到最后一页时看到了一个你认识的名字——铅笔写上去的,没有擦。"}, {label:"B. 低调处理——防止引发恐慌", axis:"OP", effects:{gov_trust:1, observer:3}, narrative:"你压下了新闻。没人在公共场合讨论这件事——但你知道,那些武器已经被转移到了另一个你查不到的地址。"}, {label:"C. 不处理——认为已缴获足够", axis:"AP", effects:{political_violence:3, gov_trust:-3}, narrative:"你说已经缴获了主要部分。你在箱子上贴了封条,撕掉封条时会发出声响——但你没有打开过,所以你不知道那些声响是从哪里来的。"}, {label:"D. 利用查获武器交换情报", axis:"OP", effects:{insider:5, intl_trust:1}, narrative:"你用武器换了名字。那些名字比武器本身更锋利——但你知道,它们也更容易被替换。"} ]} ]}, /* ═══ 事件53:兵源不足报告(单层) ═══ */ {id:"UE_53", title:"兵源不足报告", category:"军事", description:"国防部报告:受经济困难与厌战情绪影响,征兵人数连续三个月低于指标。建议放宽体检标准。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"军队不满", stages:[ {options:[ {label:"A. 放宽标准——扩大兵源", axis:"SM", effects:{army:4, economy:1}, narrative:"你降低了门槛。他们进来了——但你看到体检室的长椅上坐着的人越来越年轻。"}, {label:"B. 提高待遇吸引志愿兵", axis:"GM", effects:{spd:2, army:2, economy:3}, narrative:"你加了钱。来的人多了——但你知道,为钱来的人和为国来的人,走的路线不一样。"}, {label:"C. 缩短服役期", axis:"GM", effects:{spd:2, army:-1}, narrative:"你告诉他们:你少待一年。他们走了——但军营里空下来的床铺还没来得及撤掉。"}, {label:"D. 不调整——维持现有标准", axis:"AP", effects:{army:-3, gov_trust:-1}, narrative:"你坚持标准。标准留下来了——但军营的人数也留在了标准以下。"} ]} ]}, /* ═══ 事件54:军官团政治分裂报告(单层) ═══ */ {id:"UE_54", major:true, title:"军官团政治分裂报告", category:"军事", description:"情报部门密报:国防军军官团内部因政治立场分歧正在分裂,部分年轻军官同情NSDAP,年长军官倾向DNVP。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{army_influence:55}}, base_intensity:20, tag:"军队不满", stages:[ {options:[ {label:"A. 调查并清除极端分子", axis:"SM", effects:{gov_trust:3, army:-3, nsdap:-2}, narrative:"你清了一批人。军官团安静了——但在他们离开的那个晚上,你在走廊里听到了军靴的声音,脚步声比平时更慢。"}, {label:"B. 不干预——让军官团自行消化", axis:"AP", effects:{political_violence:2, gov_trust:-2}, narrative:"你觉得时间会解决这个问题。军官团照常开会,报告照常归档。你让秘书把最近两份都收起来,没有批示——两份的结论,正好相反。"}, {label:"C. 加强政治教育——强化军官忠诚", axis:"GM", effects:{gov_trust:2, army:1, observer:2}, narrative:"你开了一门课。军官来上课了——但课后有人把自己的笔记折成了某种标志的形状。"}, {label:"D. 利用分裂——分化控制", axis:"OP", effects:{insider:4, army:-2}, narrative:"你把一边告诉另一边,把另一边告诉这边。军官团内部分裂得更深了——但你知道,裂缝两边的人都在检查对方桌上的纸。"} ]} ]}, /* ═══ 事件55:美国贷款谈判(单层) ═══ */ {id:"UE_55", major:true, title:"美国贷款谈判", category:"外交", description:"美国国务院非正式表示:愿意考虑向德国提供长期低息贷款,条件是德国必须在赔款问题上“展现诚意”。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R16"]}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 接受贷款条件", axis:"GM", effects:{intl_trust:4, economy:-3, nationalism:-2}, narrative:"你接受了美国人的条件。他们在美元上签了字——而你也签了字的另一侧。"}, {label:"B. 拒绝——不拿主权换贷款", axis:"RE", effects:{nationalism:3, intl_trust:-2}, narrative:"你告诉美国人:德国不卖。他们收回了贷款——但你看到华尔街的报纸上,你的名字被圈了起来。"}, {label:"C. 有条件接受——承诺改革但不涉及赔款", axis:"OP", effects:{intl_trust:2, ddp:2}, narrative:"你接了钱,但没松口。美国人说欣赏你的分寸。贷款协议的条款里加了一条:改革方案需在六个月内提交。你签了字。"}, {label:"D. 拖延——等更好时机", axis:"AP", effects:{intl_trust:-1, economy:1}, narrative:"你告诉美国人:再等等。他们等了——但桌上那封未签字的信,你每次走进去都会看到它还在那里。"} ]} ]}, /* ═══ 事件56:法国撤军信号情报(单层) ═══ */ {id:"UE_56", major:true, title:"法国撤军信号情报", category:"外交", description:"情报部门报告:法军内部出现撤军讨论,可能因财政压力而减少鲁尔区驻军。建议趁此时机推动外交突破。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R08"]}, base_intensity:20, tag:"民族主义", stages:[ {options:[ {label:"A. 主动外交接触——促成撤军", axis:"GM", effects:{intl_trust:4, ddp:3, nationalism:-1}, narrative:"你派人去了巴黎。谈判持续了三周——你每封回信上都只有一个词,但你的意思是:你愿意让。"}, {label:"B. 不主动——让法国自己决定", axis:"AP", effects:{intl_trust:1, observer:2}, narrative:"你等着法国人自己撤。他们撤了——但你等了太久,撤军的速度比你的回应还快。"}, {label:"C. 公开宣传“法国被迫撤军”——提升国内士气", axis:"RE", effects:{nationalism:4, gov_trust:2, intl_trust:-2}, narrative:"你在报纸上写:法国人退了。他们退了很多个星期——但你注意到,撤退令上盖着的是巴黎的印章。"}, {label:"D. 秘密与法国谈判——交换其他利益", axis:"OP", effects:{intl_trust:2, insider:3}, narrative:"你找了一个中间人。法方给了你两个承诺——你收下了第一个,然后把第二个装进了信封,寄给了华沙。"} ]} ]}, /* ═══ 事件57:奥地利关税同盟提议(单层) ═══ */ {id:"UE_57", major:true, title:"奥地利关税同盟提议", category:"外交", description:"奥地利外交部提议:与德国建立关税同盟,以促进两国经济复苏。但此举可能违反凡尔赛条约中“德奥不得合并”的条款。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:15, tag:"民族主义", stages:[ {options:[ {label:"A. 接受——经济优先", axis:"GM", effects:{dvp:3, economy:-2, intl_trust:-1}, narrative:"你接受了维也纳的邀请。关税降了,商品在边境处不再停下——但你知道,边境之外的人也在看着你们是怎么走到一起的。"}, {label:"B. 拒绝——避免国际纠纷", axis:"SM", effects:{intl_trust:2, dnvp:-2}, narrative:"你拒绝了他们。奥地利人失望——但你看到他们在关掉电报机后,没有把煤油灯熄灭。"}, {label:"C. 秘密推进——不公开表态", axis:"OP", effects:{insider:3, intl_trust:-1}, narrative:"你们在私下谈。没有协议,没有签字——但海关开始给某些货物打折了。"}, {label:"D. 建议奥地利加入德国经济区——更广的框架", axis:"GM", effects:{ddp:2, intl_trust:1}, narrative:"你把双边变成了区域。奥地利人觉得这是个好主意——但你注意到他们签完字之后多看了你一眼,像是确认你在场。"} ]} ]}, /* ═══ 事件58:媒体自由法案争议(单层) ═══ */ {id:"UE_58", major:true, title:"媒体自由法案争议", category:"外交", description:"内政部提交法案:要求所有报纸在刊发“国家安全相关内容”前接受审查。记者协会强烈反对,称其违背宪法。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:20, tag:"政府信誉", stages:[ {options:[ {label:"A. 支持法案——安全优先", axis:"SM", effects:{gov_trust:3, ddp:-4, observer:2}, narrative:"你签署了审查令。报纸删掉了六行字,油墨在那些行数上留下了一道新的裂痕。"}, {label:"B. 反对——保护新闻自由", axis:"LE", effects:{ddp:5, spd:3, gov_trust:-2}, narrative:"你站在了记者那边。他们继续写——而你读到的每一个字,都像是有人把笔放到了你桌上。"}, {label:"C. 折中——自愿审查,政府不强制", axis:"GM", effects:{ddp:3, gov_trust:1}, narrative:"你换了一种方式——让他们自己判断。报纸没有删掉任何字,但你注意到其中一篇的标题多了一个问号。"}, {label:"D. 不立法——维持现状", axis:"AP", effects:{gov_trust:-2, insider:1}, narrative:"你没有推动立法。报纸继续写,你的副官每天把剪报放在你桌上。有一天,一篇没有署名的社论把你和‘沉默’两个字放在同一行。你读完了,没有批示,让副官把它收进档案。"} ]} ]}, /* ═══ 事件59:鲁尔煤矿复工冲突(单层) ═══ */ {id:"UE_59", title:"鲁尔煤矿复工冲突", category:"社会", description:"劳工部报告:鲁尔区部分煤矿在消极抵抗结束后开始复工,但工人与矿主就工资与工作条件发生严重分歧,威胁再次罢工。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_event:["R08"]}, base_intensity:25, tag:"工人愤怒", stages:[ {options:[ {label:"A. 强制仲裁——政府介入调解", axis:"GM", effects:{spd:3, dvp:2, social_anger:-2}, narrative:"你派了调解员。他们谈了四天,签了一份没有人完全满意的协议,然后各自回到了自己那边的沉默中。"}, {label:"B. 支持矿主——维持生产", axis:"SM", effects:{dvp:3, spd:-3, economy:1}, narrative:"你告诉他们:继续挖。煤出来了——但矿工在交接班的时候,有人在你经过时转身背对了你。"}, {label:"C. 支持工人——提高工资", axis:"LE", effects:{spd:4, dvp:-3, economy:3}, narrative:"你站在了矿工那边。工资涨了——但账单不会跟着煤一起涨价。"}, {label:"D. 不介入——让他们自行协商", axis:"AP", effects:{social_anger:3, gov_trust:-2}, narrative:"你让他们自己解决。他们谈到了天黑——你在天黑后收到了一份没有签字的妥协方案。"} ]} ]}, /* ═══ 事件60:地方暴动预警(单层) ═══ */ {id:"UE_60", title:"地方暴动预警", category:"社会", description:"警方密报:某工业城镇因失业与饥饿爆发骚乱,人群冲击市政厅。当地政府已请求州级干预。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{social_anger:40}}, base_intensity:25, tag:"政治暴力增加", stages:[ {options:[ {label:"A. 派遣州警察镇压", axis:"SM", effects:{gov_trust:2, political_violence:3, spd:-2}, narrative:"警察到了,人群散了——但你在新闻稿里没有提到他们离开的方向。"}, {label:"B. 派遣调解员与发放紧急救济", axis:"LE", effects:{spd:4, social_anger:-3, economy:3}, narrative:"你给了钱和对话。骚乱停了,工厂恢复了上工。失业登记处的人说,下个月还有一批人到期。你把这句话记在备忘录边上。"}, {label:"C. 宣布该地区进入紧急状态", axis:"SM", effects:{gov_trust:3, political_violence:2, spd:-3}, narrative:"你派了军队,宣布了戒严。镇子安静了——但你开始频繁收到来自那个地区的手写信件,寄件人一栏写着同一个姓氏。"}, {label:"D. 不干预——让地方政府自行应对", axis:"AP", effects:{gov_trust:-3, social_anger:2}, narrative:"你觉得地方能解决。他们拖了几天——然后你在报纸上看到了一张模糊的照片,照片里的人群和你办公室窗外的天气一样灰。"} ]} ]}, /* ═══ 事件61:大联盟·工人救济与财政紧缩之争(内部矛盾) ═══ */ {id:"UE_61", major:true, title:"大联盟之争:救济金还是紧缩", category:"政治", description:"大联合政府内部起了裂痕。SPD 主张为失业工人增发救济金,DVP 则要求立刻削减开支稳定马克。两党代表都把你的办公室当成了仲裁庭——你表哪边的态,另一边都会记下。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:20, tag:"政府信誉", weight_condition:{economy:1.5, social_anger:1.0, middle_confidence:-1.0}, stages:[ {options:[ {label:"A. 支持 SPD——增发救济金", axis:"LE", effects:{spd:4, dvp:-4, economy:3, social_anger:-3, middle_confidence:-1}, narrative:"你站到了工人那边。救济金发下去了,街头的声音软了一些。可 DVP 走的时候把账本摔在了桌上——他说,这页纸,从今晚起你一个人自行解决。"}, {label:"B. 支持 DVP——削减开支", axis:"SM", effects:{dvp:4, spd:-4, economy:-3, social_anger:3, middle_confidence:2}, narrative:"你站到了数字那边。马克稳住了,可工厂门口的队伍又长了一截。SPD 没有说话,他只是把工会的名单推到你面前,名单上的人数,比上周多。"}, {label:"C. 各让一步——削减一半,救济一半", axis:"GM", effects:{spd:1, dvp:1, economy:-1, social_anger:-1, middle_confidence:1}, narrative:"你让两边各退半步。救济金发了一半,开支也砍了一半。两头都不得罪,也两头都不满意——但至少,这桌子没散。你暂时保住了它。"}, {label:"D. 压而不发——把方案搁置", axis:"AP", effects:{spd:-2, dvp:-2, gov_trust:-2, middle_confidence:-1}, narrative:"你把两份方案都压进了抽屉。没有救,也没有砍。办公室安静了三天——然后你发现,两份方案都被人翻过,页码动了。"} ]} ]}, /* ═══ 事件62:大联盟·铁路国有化之争(内部矛盾) ═══ */ {id:"UE_62", major:true, title:"大联盟之争:铁路归谁", category:"政治", description:"就铁路是否收归国有,大联合政府内部起了分歧。SPD 主张国有化保障工人权益,DVP 与 DDP 则担心扩大国家垄断。三派目光都落在你身上——这桌子的平衡,系于你这一笔。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:18, tag:"政府信誉", weight_condition:{economy:1.0}, stages:[ {options:[ {label:"A. 支持国有化——归国家所有", axis:"LE", effects:{spd:4, dvp:-3, ddp:-2, nationalism:2}, narrative:"你把铁路交给了国家。汽笛声没有停,只是换了主人。SPD 点头,DVP 摇头——你听见那声摇头,隔着一整条走廊都能听清。"}, {label:"B. 反对国有化——保持私有", axis:"SM", effects:{dvp:4, ddp:2, spd:-4, economy:-2}, narrative:"你让铁路留在私人手里。资本满意了,工人那边却传开了话。SPD 深夜来找你,他问的不是铁路,是这桌子还能不能坐下去。"}, {label:"C. 折中——国有控股,私人经营", axis:"GM", effects:{spd:1, dvp:1, ddp:1}, narrative:"你让国家控股,私人经营。两边都算赢了一点,也都没全赢。至少这一晚,谁都没有摔门。你把这当成大联盟的胜利——虽然你自己都不太信。"}, {label:"D. 移交议会表决——不自己裁决", axis:"OP", effects:{gov_trust:-1, spd:-1, dvp:-1}, narrative:"你把烫手山芋丢给了议会。表决拖了六天,票数咬得死紧。最终通过的版本,两边都不满意——但你松了口气,因为至少,这回摔门的不是他们。"} ]} ]}, /* ═══ 事件63:大联盟·警察扩权之争(内部矛盾) ═══ */ {id:"UE_63", major:true, title:"大联盟之争:镇压还是克制", category:"政治", description:"一处罢工现场升级为冲突,警方请求扩大镇压权限。SPD指责镇压工人,Zentrum主张维持秩序、防止街头失控,DDP则提醒你注意宪法与公民权利。三位盟党立场各异,均要求你作出裁断。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:22, tag:"政治暴力增加", weight_condition:{political_violence:1.5, social_anger:0.8}, stages:[ {options:[ {label:"A. 批准扩权——让警察压下去", axis:"SM", effects:{zentrum:4, spd:-4, ddp:-2, political_violence:3}, narrative:"你批准扩大权限。街头的横幅在当天下午被进场的警察收走。Zentrum表示认可,SPD此后未再主动与你接触,他托人送来一句话:「在这个联盟里,今天你又站在谁那边?」"}, {label:"B. 拒绝扩权——退回宪法程序", axis:"LE", effects:{spd:4, ddp:3, zentrum:-3, political_violence:-2}, narrative:"你驳回警察的扩权请求,将处置程序退回宪法框架。DDP对此表示宽慰,称你守住的不只是一条街道,还有共和国最后的体面。Zentrum离开时未发一言,但你注意到他摸了摸胸口的十字。"}, {label:"C. 折中——扩权但限期并设审查", axis:"GM", effects:{zentrum:1, spd:1, ddp:1}, narrative:"你批准扩权,但附加期限与事后审查。三方均有所保留也均未完全达到目的。至少当晚的会议仍可继续,尽管与会者面色都不好看。"}, {label:"D. 拖——让警察部长自己拿主意", axis:"OP", effects:{gov_trust:-2, spd:-1, zentrum:-1, political_violence:2}, narrative:"你将决定权交由警察部长。他未作推辞,次日即动用权限。你事后才从报纸上得知此事。三位盟党则对你桌上的总钥匙看得更紧了一些。"} ]} ]}, /* ═══ 事件64:大联盟·教会学校拨款之争(内部矛盾) ═══ */ {id:"UE_64", major:true, title:"大联盟之争:哪边的学校", category:"社会", description:"Zentrum推动为教会学校增加拨款,SPD与DDP则坚持教育应世俗化,经费应投向公立学校。原本只在议会争论的议题,如今被摆到了大联合政府的会议桌上。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:16, tag:"社会", weight_condition:{gov_trust:1.0}, stages:[ {options:[ {label:"A. 支持 Zentrum——给教会学校拨款", axis:"SM", effects:{zentrum:4, spd:-3, ddp:-3}, narrative:"你选择支持教会学校,批准增加拨款。Zentrum在走廊里向你点头致意。SPD则在食堂当众将预算案推回并称:「这份文件喂不饱一个孩子。」"}, {label:"B. 支持公立——教育世俗化", axis:"LE", effects:{spd:4, ddp:3, zentrum:-3}, narrative:"你将经费拨给公立学校。教室里添了一批书也多了几道不满的目光。Zentrum没有发作,只将教会学校的申请收回怀中。"}, {label:"C. 折中——按生源比例分配", axis:"GM", effects:{zentrum:1, spd:1, ddp:1}, narrative:"你按各校学生人数分配经费。无人拿到全部,也无人能指出明显不公。至少这顿午餐,你仍坐在四张笑脸之间。你清楚那些笑容下各有各的账。"}, {label:"D. 拨给紧急救济——谁都不给", axis:"OP", effects:{zentrum:-2, spd:-1, ddp:-1, social_anger:-2}, narrative:"你将这笔钱转去购买过冬煤炭。三方先是错愕,随后沉默,无人能说发煤是错的。但你心里清楚这桌上的信任又薄了一层。"} ]} ]}, /* ═══ 事件65:大联盟·关税与物价之争(内部矛盾) ═══ */ {id:"UE_65", major:true, title:"大联盟之争:保护还是民生", category:"经济", description:"DVP主张提高进口关税以保护本国工业,SPD则担心关税将推高穷人的面包价格。两党代表在你面前摆出两份相互矛盾的数据,均坚持只有自己的算法才站得住脚。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:20, tag:"经济压力", weight_condition:{economy:1.5}, stages:[ {options:[ {label:"A. 支持关税——保护工业", axis:"SM", effects:{dvp:4, spd:-4, economy:2, social_anger:2}, narrative:"你批准提高关税。工厂机器运转时间延长,但面包铺前的队伍也更长了。SPD代表将一张面包价签按在你桌上:「这就是你那页关税换来的。」"}, {label:"B. 反对关税——保民生价格", axis:"LE", effects:{spd:4, dvp:-4, economy:-2, social_anger:-2}, narrative:"你压下关税未予提高。穷人暂时松了一口气,资本方面则开始流露不满。DVP代表深夜来访,没有发火,只留下一句话:「我们凑的硬币,是让你替每个人算账,不是只算一边。」"}, {label:"C. 折中——对必需品免税,工业品收税", axis:"GM", effects:{dvp:1, spd:1}, narrative:"你决定对面包和煤炭等必需品免税,对奢侈品与工业品加税。两边都算赢了一点。DVP称这是妥协,SPD称这是糊弄。不过目前看来,谈判桌两边都还坐得住。"}, {label:"D. 维持现状——什么都不改", axis:"AP", effects:{dvp:-2, spd:-2, gov_trust:-2}, narrative:"你决定维持现状,关税未变,物价也未变。你并不知道文件在最后被谁收走,但你清楚桌子两边都在等你先开口。"} ]} ]}, /* ═══ 事件66:大联盟·宪法方案之争(内部矛盾) ═══ */ {id:"UE_66", major:true, title:"大联盟之争:守宪还是变通", category:"政治", description:"DVP提出一项绕开宪法条款的紧急处置方案,认为非常时期应采取变通手段。DDP坚决反对,认为哪怕一次绕行,也会为后人留下绕行的先例。两人均望向你,等你作出裁断。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:18, tag:"政府信誉", weight_condition:{political_violence:1.0, gov_trust:1.0}, stages:[ {options:[ {label:"A. 支持变通——紧急处置优先", axis:"SM", effects:{dvp:4, ddp:-4, gov_trust:2}, narrative:"你批准该方案。措施落地,问题暂时解决。DDP未发一言,将宪法翻至相关条款,用笔圈住你签名的位置。你忽然觉得,那个圈已经把该说的话都说完了。"}, {label:"B. 支持守宪——坚决不走捷径", axis:"LE", effects:{ddp:4, dvp:-4, gov_trust:-1}, narrative:"你将方案退回。DDP难得地松了一口气,称你守住的不只是条文,还有共和国日后可以援引的先例。DVP则淡淡回应:「等出事了,希望你还记得今天的干净。」"}, {label:"C. 折中——保留方案但加宪法审查", axis:"GM", effects:{dvp:1, ddp:1}, narrative:"你批准方案,但附加宪法审查程序。两边都不满意也都没有继续争执。至少这张桌子还在,你清楚那道审查程序迟早会被真正动用。"}, {label:"D. 搁置——等国会正式讨论", axis:"OP", effects:{dvp:-2, ddp:-1, gov_trust:-1}, narrative:"你将方案提交国会程序。绕行被无限期搁置,宪法暂时占了上风。但那份方案仍在抽屉里并未消失,只是等待下一次被翻出来。"} ]} ]}, /* ═══ 事件67:大联盟·八小时工作制之争(内部矛盾) ═══ */ {id:"UE_67", major:true, title:"大联盟之争:八小时还是产量", category:"经济", description:"工业界代表(DVP)要求放宽八小时工作制以挽救产量,认为死守工时只会让工厂继续停工。SPD则将八小时制视为工人唯一的底牌,宁可不谈也不松口。两人都站在你门前,等你替这个联盟做决定。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:22, tag:"经济压力", weight_condition:{economy:1.5, social_anger:1.0}, stages:[ {options:[ /* 试点:结构性部分(经济压力)转为逐日滴灌(短期10天),政党/愤怒反应仍在选项层即时生效 */ {label:"A. 支持 DVP——放宽工时恢复生产", axis:"SM", effects:{dvp:4, spd:-4, social_anger:3}, narrative:"你批准延长工时。机器重新轰鸣,产量在报表上回升。SPD在工会讲话后,将你那纸批文放在讲台上,没有折也没有盖。他说,他会替十万双手记下这页纸。"}, {label:"B. 支持 SPD——守住八小时", axis:"LE", effects:{spd:4, dvp:-4, social_anger:-2}, narrative:"你把工业界的请愿压了回去,八小时保住了,工人那边松了口气。DVP离开时丢下一句话:「产量不会等共和国的善意。」你望着他的背影没有接话。"}, {label:"C. 折中——恢复生产但重开谈判", axis:"GM", effects:{spd:1, dvp:1}, narrative:"你批准工时先恢复至九小时,前提是由政府牵头重开劳资谈判。双方都让了半步也都认为让步的是自己。至少这桌人还能坐在一起吃晚饭,尽管刀叉都握得很紧。"}, {label:"D. 搁置——等产量数据说话", axis:"OP", effects:{dvp:-2, spd:-1, gov_trust:-1}, narrative:"你说再等等,让数字先跑一个月。两边都沉默地走了。可你心里清楚,那一个月里,机器不会等人,话也不会。"} ]} ]}, /* ═══ 事件68:大联盟·外债之争(内部矛盾) ═══ */ {id:"UE_68", major:true, title:"大联盟之争:借债还是硬扛", category:"经济", description:"DDP在阁外促成一项外国贷款意向,认为只有引入外汇才能托住持续下跌的马克。SPD对此表示激烈反对,担心债权人一旦介入,共和国财政命脉便会受制于人。两党各将数据与方案摆上你的桌面,等你作出最后决定。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:24, tag:"经济压力", weight_condition:{economy:1.5, inflation:1.0, middle_confidence:-1.0}, stages:[ {options:[ {label:"A. 支持 DDP——接受贷款稳住货币", axis:"GM", effects:{ddp:4, spd:-4, economy:-2, nationalism:-2, middle_confidence:2}, narrative:"你在贷款协议上签字。外汇到账当天,马克汇率暂时回稳。SPD盯着还债表看了很久,随后说:「这利息会把共和国今后的预算一点点吃掉。」你未能找到反驳的话。"}, {label:"B. 支持 SPD——拒绝贷款硬扛", axis:"LE", effects:{spd:4, ddp:-4, economy:3, nationalism:2, middle_confidence:-3}, narrative:"你将意向书退回。你表示德国不做债主,也不做任何人的佃户。此话传出后街头有人鼓掌。但柏林每日开支仍在增加。DDP只留下一句:「硬扛就是在拿共和国仅剩的家底去抵。」"}, {label:"C. 折中——小规模贷款+设还款上限", axis:"GM", effects:{ddp:1, spd:1, economy:-1, middle_confidence:1}, narrative:"你只接受一小笔贷款,并设定还款上限。资金足以支撑一段时期,主权也保住了大半。两边都点头,也都撇嘴。你将其视为又一次勉强的平衡,同时也明白下一次谈判不会这么轻松下去了。"}, {label:"D. 移交给央行——撇清自己", axis:"OP", effects:{gov_trust:-1, ddp:-1, spd:-1, middle_confidence:-1}, narrative:"你将此事移交央行。账由央行计算,债也由央行签署。但汇款单上印着的仍是本届政府的名字。你避得开会议室,避不开那行字。"} ]} ]}, /* ═══ 事件69:大联盟·消极抵抗去留之争(内部矛盾) ═══ */ {id:"UE_69", major:true, title:"大联盟之争:抗不抵抗下去", category:"外交", description:"鲁尔的消极抵抗已耗尽国库最后一笔余款。DVP主张停止抵抗,保住仅存家底;Zentrum与SPD则担心一旦停止,便等于承认占领。此问题没有标准答案,只有立场。而你被推到争论正中央。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}, requires_event:["R02"], excludes_event:["R08"]}, base_intensity:26, tag:"民族主义", weight_condition:{nationalism:1.5, economy:1.2}, stages:[ {options:[ {label:"A. 支持 DVP——停止抵抗止损", axis:"SM", effects:{dvp:4, zentrum:-3, spd:-3, economy:-2, nationalism:-3}, narrative:"你下令停止抵抗。罢工工人放下工具,鲁尔恢复安静,国库也少了一笔支出。Zentrum在走廊里站了很久,最后说:「我们停下的那一刻,占领就成了既成事实。」你没有接话。"}, {label:"B. 支持 Zentrum/SPD——继续抵抗", axis:"LE", effects:{zentrum:2, spd:3, dvp:-4, economy:2, nationalism:3}, narrative:"你让抵抗继续。鲁尔没有低头,报纸上满是壮语。夜里你翻开财政报表,那些数字可要比口号们诚实。DVP没有发火,只将报表轻轻推回你面前。"}, {label:"C. 有限抵抗——减少烧钱但保留姿态", axis:"GM", effects:{dvp:1, zentrum:1, spd:1}, narrative:"你让抵抗降低强度,仅维持象征性姿态。账目好看了些,脸面也勉强保住。三方都不满意也都没有退出。你知道这只是把问题往后推,但有时往后推,就是共和国得以喘息的一点空间。"}, {label:"D. 让鲁尔人自己决定", axis:"OP", effects:{gov_trust:-2, dvp:-1, spd:-1}, narrative:"你将决定权交给鲁尔。他们争论的那几天风向一天三变。最终你从报告中读到冰冷的结论:无论他们如何选择,资金都不再够用。"} ]} ]}, /* ═══ 事件70:大联盟·邦权之争(内部矛盾) ═══ */ {id:"UE_70", major:true, title:"大联盟之争:邦权还是中央", category:"政治", description:"一场公共危机后,DVP与SPD主张将更多权力收归柏林,以统一全国步调。Zentrum坚决反对,担心中央扩权会侵蚀各邦,尤其是天主教邦的自治传统。三方同时看向你,等你决定权力应落在哪一边", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:18, tag:"政府信誉", weight_condition:{nationalism:1.0, gov_trust:1.0}, stages:[ {options:[ {label:"A. 支持中央——收权保全国一致", axis:"SM", effects:{dvp:3, spd:2, zentrum:-4, nationalism:1}, narrative:"你选择将权力向柏林集中。命令下达更为迅速,各地不再各行其是。Zentrum离席前,将手按在宪法中邦权条款那一页上,他说:「你今天收走的,明天再也要不回来。」"}, {label:"B. 支持 Zentrum——守住邦权", axis:"LE", effects:{zentrum:4, dvp:-3, spd:-2}, narrative:"你选择守住邦权,阻止中央进一步伸手。各邦自治得以保留,南方教堂与市镇松了一口气。DVP则冷淡地说:「等下一次危机,你就会明白,你挡住的是共和国自己的病。」"}, {label:"C. 折中——只收危机必需之权", axis:"GM", effects:{zentrum:1, dvp:1, spd:1}, narrative:"你只收走危机所必需的那几项权力,其余仍留各邦。三方都觉得自己让了半步也都被拿走了半步。谈判桌尚未散,只是权力收走容易归还困难。"}, {label:"D. 交各邦协商——不拍板", axis:"OP", effects:{gov_trust:-1, zentrum:-1, dvp:-1}, narrative:"你将难题交回各邦协商,不亲自裁断。他们谈出一份无人满意的折中稿后又束之高阁。你松了一口气,至少这一次摔门翻桌的不是你。"} ]} ]}, /* ═══ 事件71:大联盟·住房管制之争(内部矛盾) ═══ */ {id:"UE_71", title:"大联盟之争:屋檐归谁", category:"社会", description:"DVP与DDP主张放开房租管制,由市场自行调节住房,以吸引建设资本。SPD则坚持继续管制,担心一旦放开,工人家庭将被迫迁出。争论已从议会扩展至每一处亮灯的住宅。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_flag:{covenant_active:true}}, base_intensity:16, tag:"社会", weight_condition:{social_anger:1.5, economy:1.0, middle_confidence:-1.2}, stages:[ {options:[ /* 试点:结构性部分(愤怒/中产信心)转为逐日滴灌(中期40天),政党反应仍在选项层即时生效 */ {label:"A. 支持放开——让市场说了算", axis:"SM", effects:{dvp:3, ddp:2, spd:-4}, narrative:"你批准放开房租。资本重新进入建设市场,街区里响起起重机的声音。SPD将一叠迁出通知放在你桌上,说:「这些名字,明天都会变成街上的影子。」你没有翻开那叠薄薄的纸。"}, {label:"B. 支持 SPD——守住管制", axis:"LE", effects:{spd:4, dvp:-3, ddp:-2}, narrative:"你决定保留房租管制。工人的住所暂时得以保全,不必担心被立即迁出。DVP在电话中说:「你护住的是一潭无法流动的水。」你望着窗外未竣工的楼房,没有回答。"}, {label:"C. 折中——管制新宅,放开旧宅", axis:"GM", effects:{spd:1, dvp:1, ddp:1}, narrative:"你决定对新建住房放宽管制,同时保留旧宅租户的租住权。双方都取得部分成果也都未完全满意。这一晚没有家庭被赶出住所就够了。你将其视为共和国的一次胜利,尽管它只是众多日子里最不起眼的一天。"}, {label:"D. 责令各区自查——不表态", axis:"OP", effects:{gov_trust:-2, spd:-1, dvp:-1, middle_confidence:-1}, narrative:"你将问题交由各区自行处理。各区根据自身情况采取措施,有的放开,有的维持管制。结果,同一条街的两端出现了两种住房制度。你翻阅那份混乱的报告,忽然不确定自己究竟在维护什么。"} ]} ]}, /* ═══ 事件72:大学自治请愿(文教·现场长线) ═══ */ {id:"UE_72", title:"大学自治请愿:学生要上街", category:"社会", description:"柏林大学学生自治会递交请愿书,抗议政府削减文教经费并干预学术自由,并声明若一周内未获答复,将组织全城学生游行。教授委员会亦联名附署,但措辞较学生温和。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{social_anger:45}}, base_intensity:22, tag:"政府信誉", site_region:"unter_den_linden", site_kind:"university", stages:[ {options:[ {label:"A. 拨款安抚,承诺暂缓削减", axis:"GM", effects:{ddp:3, spd:2, gov_trust:2, economy:2}, narrative:"你批准拨付一笔款项,并承诺暂缓削减文教经费。教授方面表示宽慰,学生游行也暂时取消。这笔钱来自其他项目的调剂,后续仍会产生新的财政缺口。"}, {label:"B. 强硬拒绝,坚持削减红线", axis:"SM", effects:{dvp:3, gov_trust:1, ddp:-3, social_anger:2}, narrative:"你答复大学:共和国财政紧张,文教经费必须削减。学生未得到让步,游行按期举行。你站在办公室窗前,看着一条安静的长街,知道明天不会平静。"}, {label:"C. 交由教授委员会自行裁量", axis:"OP", effects:{ddp:1, gov_trust:-1}, narrative:"你将此事交由教授委员会自行裁量。他们讨论许久最终提出一份折中方案,既未保住经费,也未能安抚学生。你看着这份两边都不满意的文件,意识到仅凭文件难以平息事态。"}, {label:"D. 秘密接触学生领袖,分化请愿", axis:"OP", effects:{insider:3, ddp:-2, social_anger:1}, narrative:"你派人私下接触学生领袖,以个别前程为条件,试图分化请愿。部分人动摇,更多人拒绝。你获得一些情报,但大学中也多了一道提防你的目光。"} ]} ]}, /* ═══ 事件73:霍乱疫情(医疗·现场长线) ═══ */ {id:"UE_73", title:"霍乱疫情:工人区告急", category:"社会", description:"卫生署报告:弗里德里希斯海因区出现霍乱病例。污水倒灌已污染地下水,两座供水井中检出病菌。市政医院收治能力接近上限,隔离病房告急。若无法控制,疫情可能蔓延全城。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{economy:55, social_anger:40}}, base_intensity:25, tag:"工人愤怒", site_region:"friedrichshain", site_kind:"epidemic", stages:[ {options:[ {label:"A. 紧急拨款,建隔离病房", axis:"GM", effects:{spd:4, gov_trust:3, economy:4, social_anger:-2}, narrative:"你批准紧急拨款,征用一座仓库改建为隔离病房。病人被送入隔离区,两座水井贴上封条。这只是应急措施,你知道问题仍在供水管道深处。"}, {label:"B. 封锁病区,强制隔离", axis:"SM", effects:{army:2, gov_trust:2, social_anger:4, political_violence:2}, narrative:"你下令封锁病区,出入须凭通行条。病人被隔离,封锁线外却出现恐慌。除了瘟疫,人们担心的还有你手中的封条。"}, {label:"C. 只登记病例,不公开", axis:"OP", effects:{insider:2, gov_trust:-2, social_anger:2}, narrative:"你决定不公开消息,仅由卫生署内部登记病例。白天街上平静,夜里消毒车的气味仍飘过整条街。你知道疫情难以长期隐瞒。"}, {label:"D. 追查水源,先堵源头", axis:"LE", effects:{ddp:3, gov_trust:2, economy:1}, narrative:"你派工程师追查供水管道,找到泄漏点并完成封堵。此举比增建病房更能遏制疫情。你暂时松了口气,但另有两座水井尚未查完,仍不能放松。"} ]} ]}, /* ═══ 事件74:政治冤案开庭(司法·现场长线) ═══ */ {id:"UE_74", title:"政治冤案:被告将被重判", category:"政治", description:"法院呈报:一名曾于1919年参与护宪战斗的工人,被控「阴谋颠覆国家」,即将开庭审理。工会与中左报刊指其系政治加害,右翼方面则要求重判以儆效尤。社会舆论已经撕裂。", available:{date_from:"1923-01-01", date_to:"1923-12-31", requires_state:{political_violence:40}}, base_intensity:22, tag:"政府信誉", site_region:"alexanderplatz", site_kind:"justice", stages:[ {options:[ {label:"A. 干预复查,推动减刑", axis:"LE", effects:{spd:4, ddp:3, gov_trust:2, dnvp:-3}, narrative:"你命司法部长过问此案,推动重审。被告刑期获减,中左报刊对此表示欢迎。右翼在街头公开指责,称共和国在袒护叛徒。你听到了那些话,没有下令封嘴。"}, {label:"B. 尊重判决,不干预司法", axis:"SM", effects:{dvp:2, dnvp:2, gov_trust:1, spd:-3}, narrative:"你选择不干预。法官维持原判。右翼表示满意。工会则将原告姓名列入黑名单。你告诉自己这是司法独立,但你也清楚,独立与冷漠有时只隔着一层纸。"}, {label:"C. 要求公开全部卷宗", axis:"GM", effects:{ddp:4, gov_trust:2, insider:2}, narrative:"你要求公开全部卷宗,让真相见光。卷宗中部分内容令你皱眉,证据链远不如判决书所述那样完整。你将卷宗放入抽屉,没有立即表态"}, {label:"D. 压下此案,等舆论平息", axis:"OP", effects:{gov_trust:-2, insider:1, social_anger:2}, narrative:"你命法院推迟开庭,等舆论平息。风向不会因等待而改变,只会越积越沉。你望着窗外广场上渐多的人群,切实感受到有些审判不是你想延就能延的。"} ]} ]}, /* ═══ 事件75:表现主义展览风波(文化·现场长线) ═══ */ {id:"UE_75", title:"表现主义展览:被唾弃的先锋", category:"文化", description:"罗曼咖啡馆所在画廊将举办一场表现主义画展,展出柏林年轻画家的作品。右翼报刊讥讽其为「乱涂乱画」,称其为「堕落的艺术」;新一代知识分子则视之为被压抑灵魂的呐喊。请愿者要求禁止展出。", available:{date_from:"1923-01-01", date_to:"1923-12-31"}, base_intensity:18, tag:"政府信誉", site_region:"romanisches", site_kind:"culture", stages:[ {options:[ {label:"A. 保护展览,支持艺术自由", axis:"LE", effects:{ddp:3, spd:2, idealism:3, dnvp:-3}, narrative:"你公开表态支持展览自由。画家们松了口气,咖啡馆里有人举杯相庆。右翼报纸已备好通栏标题:「共和国在为堕落撑腰。」你端起咖啡,没有退缩。"}, {label:"B. 迎合右翼,下令禁展", axis:"SM", effects:{dnvp:3, gov_trust:1, ddp:-3, idealism:-2}, narrative:"你下令禁止展出,以平息右翼怒火。画作被撤下,年轻画家看你的眼神让你想起自己曾放弃的某些主张。你告诉自己这是顾全大局,却没有再看那幅被撤下的画。"}, {label:"C. 让画廊自行决定,不干预", axis:"OP", effects:{gov_trust:1, ddp:1}, narrative:"你将决定权交回画廊。画廊方权衡再三照常开展。参观人数不多,但每个驻足的人都停留很久。你在门口站了一会儿,最终没有进去。"}, {label:"D. 暗中资助年轻画家", axis:"OP", effects:{insider:2, idealism:1, ddp:1}, narrative:"你安排匿名资助这些画家,以免他们因贫困而停笔。他们没有道谢,只将一幅画送到你的办公室。画未署名,画的是风暴中的灯柱。你把它挂在办公室最不起眼的角落。"} ]} ]}, /* ═══ 事件76:国际过渡贷款的试探(泄压阀门·经济压力) ═══ 泄压文件:不带 available 字段 → fb-available 恒 false → 永远不会被随机抽到, 只能由 valve-check 在经济压力顶格(≥90 连续4天)时强制投递。 */ {id:"UE_76", major:true, title:"国际过渡贷款的试探", category:"经济", description:"一家美国银行的私人代表经海牙转来口信:愿意牵头一笔两亿金马克的过渡贷款,帮德国的财政喘一口气。条件写在附页——对方要派人进驻铁路账房和海关稽核,贷款没还清之前,人不撤。", base_intensity:35, tag:"经济压力", stages:[ {options:[ {label:"A. 接下贷款,条件照单全收", axis:"GM", effects:{economy:-30, intl_trust:4, nationalism:6, dnvp:-4, army:-2}, narrative:"你签了字。第一批款子两周后到账,库房里那个窟窿当场补上了一块。海牙来的稽核员第二天上午就进了铁路账房,账本上多了外文的签条。右翼报纸只登了一行字:债权人住进来了。"}, {label:"B. 讨价还价:钱可以谈,人不进来", axis:"OP", effects:{economy:-14, intl_trust:1, gov_trust:-2, dnvp:-2}, narrative:"你回了个价:数目可以商量,人一个不进。对方拖了十天才答复,钱砍了一半还多。库房的窟窿能缓一口气,新贷款的利息也比原先的条款高出一截。"}, {label:"C. 原信退回,分文不借", axis:"SM", effects:{economy:3, nationalism:3, dnvp:3, army:2}, narrative:"你把口信原样退了回去,没有留一句回话。财政部的次日报表比前一天厚了一倍。右翼报纸难得没有骂你。"} ]} ]}, /* ═══ 事件77:米店与指数化(泄压阀门·社会愤怒) ═══ 泄压文件:同 UE_76,由 valve-check 在社会愤怒顶格时强制投递。 */ {id:"UE_77", major:true, title:"米店风波与指数化的传话", category:"社会", description:"三天里,柏林和鲁尔接连出了四起冲击米店的事。工会递来一句话:只要你公开承诺工资随物价指数化,他们就负责让街头安静下来。附页是各省粮站的缺货清单,日期都是这个礼拜的。", base_intensity:35, tag:"工人愤怒", stages:[ {options:[ {label:"A. 公开承诺工资随物价指数化", axis:"GM", effects:{social_anger:-28, spd:4, dvp:-4, inflation:3, gov_trust:1}, narrative:"你第二天上午在电台把承诺念了出去,中午,粮站门口的人就撤了。物价照涨,工资单跟着涨——财政部的打字机响了一整夜,重算下半年的账。"}, {label:"B. 只挑采矿冶金两个行业先试", axis:"OP", effects:{social_anger:-13, spd:1, kpd:-2, dvp:-1, inflation:1}, narrative:"你答应先在采矿和冶金两个行业试行,别的行业以后再议。粮站门口的人少了一半,另一半在等「以后」是哪一天。"}, {label:"C. 拒绝承诺,给各省粮站加岗", axis:"SM", effects:{social_anger:3, political_violence:4, dvp:3, spd:-3, gov_trust:1}, narrative:"你把工会的传话压了下去,给各省粮站加了岗。冲击米店的事停了几天,传单开始代替人出现在粮站门口。"} ]} ]} ]>>\ <</widget>> /* ============================================================ V0.6-A 文件栏机制:加权负荷 · 行政瘫痪 · 到期预警 · 钝刀工具箱 ============================================================ */ /* ---------- backlog-score:只读计算加权文牍负荷 ---------- 用法:<<backlog-score>> 结果存入 $backlog_score 权重:白/低档=1;黄/许诺=2;历史不计(由 deck_id/source 判定) */ <<widget "backlog-score">>\ <<silently>> <<set $backlog_score to 0>> <<if $pending_events>> <<for _bsi to 0; _bsi lt $pending_events.length; _bsi++>> <<set _bsev to $pending_events[_bsi]>> <<set _w to 0>> <<if _bsev.deck_id and _bsev.deck_id.indexOf("R") eq 0>> <<set _w to 0>> <<elseif _bsev.deck_id and _bsev.deck_id.indexOf("S") eq 0>> <<set _w to 0>> <<elseif _bsev.source is "historical" or _bsev.source is "swell">> <<set _w to 0>> <<elseif _bsev.level is "promise" or (_bsev.deck_id and _bsev.deck_id.indexOf("P") eq 0)>> <<set _w to 2>> <<elseif _bsev.deck_id and _bsev.deck_id.indexOf("Y") eq 0>> <<set _w to 2>> <<elseif _bsev.level is "yellow">> <<set _w to 2>> <<else>> <<set _w to 1>> <</if>> <<set $backlog_score to $backlog_score + _w>> <</for>> <</if>> <</silently>>\ <</widget>> /* ---------- backlog-settle:行政瘫痪每日落档与四层阶梯结算 ---------- 用法:<<backlog-settle>>(daily-tick 调用;快进期间不调用) 先算 score→判瘫痪/档位→瘫痪天数→T2 直接伤害→T3 党信任+晨报短条→T4 不可逆剧情 */ <<widget "backlog-settle">>\ <<silently>> <<backlog-score>> <<set _new_tier to 0>> <<if $backlog_score gte 15>><<set _new_tier to 4>> <<elseif $backlog_score gte 13>><<set _new_tier to 3>> <<elseif $backlog_score gte 10>><<set _new_tier to 2>> <<elseif $backlog_score gte 8>><<set _new_tier to 1>> <</if>> <<set $paralysis_tier to _new_tier>> <<set $admin_paralysis to (_new_tier gte 1)>> /* 瘫痪天数:逐日瘫痪 +1、脱离归 0 */ <<if $admin_paralysis>> <<set $paralysis_days to $paralysis_days + 1>> <<else>> <<set $paralysis_days to 0>> <</if>> /* T2 直接伤害:逐日在第2档及以上给一次性 id="backlog-scene" 的消极后果(不重复堆叠,按当天一次记入报告) */ <<if _new_tier gte 2>> <<set $world.social_anger to Math.min(100, ($world.social_anger || 0) + 1)>> <<set $world.gov_trust to Math.max(0, ($world.gov_trust || 0) - 1)>> <<set $backlog_daily_active to true>> <</if>> /* T3 声誉侵蚀:第3档触发一次(用 $paralysis_tier3_done 防每日重复扣信任) */ <<if _new_tier gte 3 and not $paralysis_tier3_done>> <<set $paralysis_tier3_done to true>> <<set _t3_target to "dnvp">> <<set $_win_lowest to 999>> <<if $npcs>> <<set _t3_parts to ["spd","ddp","dvp","zentrum","dnvp"]>> <<for _t3i to 0; _t3i lt _t3_parts.length; _t3i++>> <<set _t3k to _t3_parts[_t3i]>> <<if $npcs[_t3k] and $npcs[_t3k].trust lt $_win_lowest>> <<set $_win_lowest to $npcs[_t3k].trust>> <<set _t3_target to _t3k>> <</if>> <</for>> <</if>> <<set $npcs[_t3_target].trust to Math.max(0, $npcs[_t3_target].trust - 1)>> <<if not $paralysis_tier_log>><<set $paralysis_tier_log to []>><</if>> <<set $paralysis_tier_log.push("文牍积压让态度的党派愈发不满(" + _t3_target.toUpperCase() + " 信任 -1)")>> <<set $paralysis_news_line to "内政部流出一句牢骚:公文在案头成山,无人问津。反对派在走廊大声念着几个被搁置的案名,像念一份讣告。">> <</if>> <<if _new_tier gte 3 and not $paralysis_tier3_done and not $npcs[_t3_target]>> <<set $paralysis_tier3_done to true>> <<set $paralysis_news_line to "内政部流出一句牢骚:公文在案头成山,无人问津。">> <</if>> /* T4 不可逆剧情:≥15 或 瘫痪≥5 天(一次性,$paralysis_t4_done 防重复) */ <<if not $paralysis_t4_done and (_new_tier gte 4 or $paralysis_days gte 5)>> <<set $paralysis_t4_done to true>> <<set _oldest_idx to -1>> <<set _oldest_day to 999999>> <<set _oldest_name to "">> <<if $pending_events>> <<for _t4i to 0; _t4i lt $pending_events.length; _t4i++>> <<set _t4ev to $pending_events[_t4i]>> <<if not _t4ev.irreversible and not _t4ev.site_pending>> <<if _t4ev.born_day and _t4ev.born_day lt _oldest_day>> <<set _oldest_idx to _t4i>> <<set _oldest_day to _t4ev.born_day>> <<set _oldest_name to _t4ev.title>> <</if>> <</if>> <</for>> <</if>> <<if _oldest_idx gte 0>> <<set $pending_events[_oldest_idx].irreversible to 3>> <<set $pending_events[_oldest_idx].paralysis_failed to _oldest_name>> <<if not $paralysis_tier_log>><<set $paralysis_tier_log to []>><</if>> <<set $paralysis_tier_log.push("「" + _oldest_name + "」因久拖成疾,演成不可逆的剧情。")>> <<set $paralysis_news_line to "一份被晾在案头最底层的公文,终于变成了它自己的报应:被搁置的《" + _oldest_name + "》,已在无人过问中自行发酵。">> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- file-expiry-warn:T-3/T-1 到期预警(每日日清重算) ---------- 用法:<<file-expiry-warn>>(daily-tick 调用) 对每件白(3)/黄(7)算 _days_left,==3 / ==1 时写入 $file_expiry_warn_log; 开头清空,防残留污染晨报/展示。 */ <<widget "file-expiry-warn">>\ <<silently>> <<set $file_expiry_warn_log to []>> <<if $pending_events>> <<for _ewi to 0; _ewi lt $pending_events.length; _ewi++>> <<set _ewev to $pending_events[_ewi]>> <<set _ew_win to 0>> <<if _ewev.deck_id and _ewev.deck_id.indexOf("A_white") eq 0>> <<set _ew_win to 3>> <<elseif (_ewev.deck_id and _ewev.deck_id.indexOf("Y") eq 0) or (_ewev.level is "yellow")>> <<set _ew_win to 7>> <</if>> <<if _ew_win gt 0 and _ewev.born_day>> <<set _ew_left to _ew_win - ($session_day - _ewev.born_day)>> <<if _ew_left eq 3 or _ew_left eq 1>> <<set $file_expiry_warn_log.push({ title: _ewev.title, days_left: _ew_left })>> <</if>> <</if>> <</for>> <</if>> <</silently>>\ <</widget>> /* ---------- file-tool-cold:冷处理(钝刀,低档廉价) ---------- 用法:入口链接先把 $tool_target 设为待办下标,再 <<file-tool-cold>>(消费1资本,当天限1件) 仅低档(权重1)且未到期可用;后果 social_anger +1 / gov_trust 0 后移除。 */ <<widget "file-tool-cold">>\ <<silently>> <<set $tool_note to "">> <<set _ti to Number($tool_target ?? -1)>> <<set $tool_target to null>> <<if _ti gte 0 and _ti lt $pending_events.length>> <<set _tev to $pending_events[_ti]>> <<set _is_low to true>> <<if _tev.deck_id and (_tev.deck_id.indexOf("Y") eq 0 or _tev.deck_id.indexOf("R") eq 0 or _tev.deck_id.indexOf("S") eq 0 or _tev.deck_id.indexOf("P") eq 0)>> <<set _is_low to false>> <</if>> <<if _tev.level is "promise" or _tev.level is "yellow">> <<set _is_low to false>> <</if>> <<if _tev.source is "historical" or _tev.source is "swell">> <<set _is_low to false>> <</if>> /* 剧情级大事(is-major-ev)不可冷处理——密使信晾不出结果,必须玩家拍板(2026-09-26 用户定) */ <<is-major-ev _tev>> <<if _ev_is_major>> <<set _is_low to false>> <</if>> <<set _cold_used to false>> <<if $today_handled and $today_handled.indexOf("cold") gte 0>><<set _cold_used to true>><</if>> <<if _is_low and not _cold_used>> <<cap-calc>> <<set _avail to Math.max(0, ($pc_total || 0) - ($pc_pool_spent || 0))>> <<if _avail gte 1>> <<set $pc_pool_spent to ($pc_pool_spent || 0) + 1>> <<set $world.social_anger to Math.min(100, ($world.social_anger || 0) + 1)>> <<set $today_handled.push("cold")>> <<set $event_counter to $event_counter + 1>> <<set _tmp_idx to _ti>> <<set _new_p to []>> <<for _ci to 0; _ci lt $pending_events.length; _ci++>> <<if _ci neq _ti>><<set _new_p.push($pending_events[_ci])>><</if>> <</for>> <<set $pending_events to _new_p>> <<set $tool_note to "你把" + _tev.title + "冷处理了。它翻了个身,没掀起浪,也没沉。没有你,它也在自己了结。">> <<else>> <<set $tool_note to "政治资本不足(需 1,现有 " + _avail + ")。">> <</if>> <<elseif _is_low and _cold_used>> <<set $tool_note to "今天你已经冷处理过一件了。剩下的,要么办,要么让它自己发酵。">> <<else>> <<set $tool_note to "这件不能冷处理。它不是可以晾晾就过去的东西。">> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- file-tool-pr:紧急公关(黄/许诺,费用6资本) ---------- 用法:入口链接先把 $tool_target 设为待办下标,再 <<file-tool-pr>> 仅黄/许诺(权重2)且到期前可用;缓和结算后移除。 */ <<widget "file-tool-pr">>\ <<silently>> <<set $tool_note to "">> <<set _ti to Number($tool_target ?? -1)>> <<set $tool_target to null>> <<if _ti gte 0 and _ti lt $pending_events.length>> <<set _tev to $pending_events[_ti]>> <<set _is_heavy to false>> <<if _tev.level is "promise" or (_tev.deck_id and _tev.deck_id.indexOf("P") eq 0)>> <<set _is_heavy to true>> <<elseif (_tev.deck_id and _tev.deck_id.indexOf("Y") eq 0) or _tev.level is "yellow">> <<set _is_heavy to true>> <</if>> <<if _is_heavy>> <<cap-calc>> <<set _avail to Math.max(0, ($pc_total || 0) - ($pc_pool_spent || 0))>> <<if _avail gte 6>> <<set $pc_pool_spent to ($pc_pool_spent || 0) + 6>> <<set $world.social_anger to Math.min(100, ($world.social_anger || 0) + 1)>> <<set $world.gov_trust to Math.max(0, ($world.gov_trust || 0))>> <<set $event_counter to $event_counter + 1>> <<set _new_p to []>> <<for _ci to 0; _ci lt $pending_events.length; _ci++>> <<if _ci neq _ti>><<set _new_p.push($pending_events[_ci])>><</if>> <</for>> <<set $pending_events to _new_p>> <<set $tool_note to "你紧急公关,把" + _tev.title + "的火压了下去。代价是一笔看不见的人情。官僚体系的机器还在转,只是断了一根没人在意的齿轮。">> <<else>> <<set $tool_note to "政治资本不足(需 6,现有 " + _avail + ")。">> <</if>> <<else>> <<set $tool_note to "这件用不上紧急公关——不过是小事,你自己就能办。">> <</if>> <</if>> <</silently>>\ <</widget>>
<<silently>> /* 文件篮事件 · 第二/三层阶段呈现 由 fb-render-options 中带 next_stage 的选项跳转而来。 检查触发条件:满足则显示触发文本 + 下一阶段选项;不满足则直接结算。 */ <<set _ev_idx to $file_target_idx ?? 0>> <<set _ev to $pending_events[_ev_idx]>> <<set _stage to null>> <<set _stage_idx to -1>> <<for _si to 0; _si lt _ev.fb_data.stages.length; _si++>> <<if _ev.fb_data.stages[_si].id eq $fb_next_stage>> <<set _stage to _ev.fb_data.stages[_si]>> <<set _stage_idx to _si>> <</if>> <</for>> <<if _stage and _stage.trigger>> <<fb-trigger-ok _stage.trigger>> <<if not _fb_trig_ok>> <<goto "File_Result_FB">> <</if>> <</if>> <</silently>>\ <<if _stage>>\ <<set $pending_events[_ev_idx].fb_stage to _stage_idx>>\ <<set _ev to $pending_events[_ev_idx]>>\ //<<= _stage.trigger_text>>//\ <hr> <<fb-render-options _ev>>\ <<else>>\ <<goto "File_Result_FB">>\ <</if>>
/* ---------- fb-deck-fx:文件栏专属结算副作用(UE_69 旗标 / UE_67·UE_71 滴灌) ---------- 用法:<<fb-deck-fx _ev _mode>> _mode "manual"=灰色注记直接打印(手动结算页 File_Result_FB 用) _mode "auto"=注记收进调用方的 _rr_notes(治理路线托管 route-resolve 用,调用前须先建 _rr_notes 数组) 手动与托管共用同一份旗标/滴灌逻辑,保证殊途同归。 */ <<widget "fb-deck-fx">>\ <<silently>> <<set _fdf_ev to $args[0]>> <<set _fdf_mode to $args[1] ? $args[1] : "manual">> <<set _fdf_notes to []>> <<if _fdf_ev.deck_id eq "UE_69">> /* 联动手记:事件69(消极抵抗去留)改写通胀走向 在 R02 授权后、R08 结束前可能出现;选"停"真正切断印钞养罢工的连锁 */ <<if $file_action.includes("停止")>> <<set $flags.passive_resistance to "ended">> <<set _fdf_notes.push("你叫停了消极抵抗。印钞养罢工的链条断了——通胀失去了一个推手。")>> <<elseif $file_action.includes("继续")>> <<set $flags.passive_resistance to "full">> <<set _fdf_notes.push("你让消极抵抗继续。印钞机照常轰鸣,通胀的推力不减。")>> <<elseif $file_action.includes("有限")>> <<set $flags.passive_resistance to "limited">> <<set _fdf_notes.push("你把消极抵抗降了火。印钞的势头缓了一些,但还没停。")>> <</if>> <</if>> /* 试点:文件栏结构性决策转长期滴灌——八小时之争(短期10天)/ 住房之争(中期40天)。 结构性部分改为逐日滴灌(总量≈原一次性值),政党反应仍在选项层即时生效。 */ <<if _fdf_ev.deck_id eq "UE_67" or _fdf_ev.deck_id eq "UE_71">> <<set _fb_drip to null>> <<if _fdf_ev.deck_id eq "UE_67">> <<if $file_action.includes("折中")>> <<set _fb_drip to {src_id:"UE_67", title:"八小时之争·劳资各让一步", kind:"file", band:"short", effects:{daily:{economy:-0.2}, duration:10, decay:true}}>> <<elseif $file_action.includes("放宽")>> <<set _fb_drip to {src_id:"UE_67", title:"八小时之争·工时放宽", kind:"file", band:"short", effects:{daily:{economy:-0.4}, duration:10, decay:true}}>> <<elseif $file_action.includes("守住")>> <<set _fb_drip to {src_id:"UE_67", title:"八小时之争·工时死守", kind:"file", band:"short", effects:{daily:{economy:0.4}, duration:10, decay:true}}>> <</if>> <<else>> <<if $file_action.includes("折中")>> <<set _fb_drip to {src_id:"UE_71", title:"住房之争·新宅松绑", kind:"file", band:"mid", effects:{daily:{middle_confidence:0.05}, duration:40, decay:true}}>> <<elseif $file_action.includes("放开")>> <<set _fb_drip to {src_id:"UE_71", title:"住房之争·市场放开", kind:"file", band:"mid", effects:{daily:{social_anger:0.15, middle_confidence:0.05}, duration:40, decay:true}}>> <<elseif $file_action.includes("守住")>> <<set _fb_drip to {src_id:"UE_71", title:"住房之争·管制死守", kind:"file", band:"mid", effects:{daily:{social_anger:-0.1, middle_confidence:-0.05}, duration:40, decay:true}}>> <</if>> <</if>> <<if _fb_drip>> <<active-effect-register _fb_drip>> <<set _fdf_notes.push("这不是一天的决定——它的后果会一天一天长出来。状态栏【持续生效】可见。")>> <</if>> <</if>> <</silently>>\ <<if _fdf_mode is "auto">>\ <<silently>><<for _fdfi range _fdf_notes>><<set _rr_notes.push(_fdfi)>><</for>><</silently>>\ <<else>>\ <<for _fdfi range _fdf_notes>><span class="txt-sys">//_fdfi//</span><</for>>\ <</if>>\ <</widget>>
<<silently>> /* 文件篮事件 · 延迟阶段回访(delay_next 选项登记的隐藏后续到期后,从文件栏点进来) followup 事件的 src 字段存的是原阶段 id(stage_id),据此在 fb_data.stages 里 找回延迟阶段:满足其 trigger → 显示 trigger_text + 阶段选项; 不满足 → 安静收场(事情没发生,给一句有余味的白描,不留死线)。 兼容:followup 事件没有 fb_data(site-followup-check 不带),此时走安静收场。 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <<set _fud_stage to null>>\ <<set _fud_idx to -1>>\ <<set _fud_fb to (_ev and _ev.fb_data and _ev.fb_data.stages) ? _ev.fb_data : null>>\ <<set _fud_sid to (_ev and _ev.src) ? _ev.src : (_ev ? _ev.kind : "")>>\ <<if _fud_fb>>\ <<for _fsi to 0; _fsi lt _fud_fb.stages.length; _fsi++>>\ <<if _fud_fb.stages[_fsi].id eq _fud_sid>>\ <<set _fud_stage to _fud_fb.stages[_fsi]>>\ <<set _fud_idx to _fsi>>\ <</if>>\ <</for>>\ <</if>>\ <<if _fud_stage>>\ <<set _fud_chosen to (_ev.fu_chosen ? _ev.fu_chosen : "")>>\ <<if _fud_stage.trigger>>\ <<fb-trigger-ok _fud_stage.trigger _fud_chosen>>\ <<else>>\ <<set _fb_trig_ok to true>>\ <</if>>\ <</if>>\ <</silently>>\ <<if _fb_trig_ok>>\ <<set $pending_events[_ev_idx].fb_stage to _fud_idx>>\ <<set _ev to $pending_events[_ev_idx]>>\ <<set $pending_events[_ev_idx].fb_data to _fud_fb>>\ //<<= _fud_stage.trigger_text>>//\ <hr> <<fb-render-options _ev>>\ <<else>>\ /* 触发条件不满足:预感的事没有发生 */ <<set $pending_events[_ev_idx].status to "resolved">>\ <<event-log-fu _ev_idx>>\ //<<= _ev.description>>//\ <</if>>\ <<if not _fud_stage or not _fb_trig_ok>>\ <div class="scene-block"> //那件悬着的事,最后没有落到你头上。有些预感,只是预感而已。// </div> <<link "回到办公室" "Scene_Office">><</link>> <</if>>
<<silently>> /* 文件篮事件 · 结算反馈 效果已在选项链接中通过 fb-apply-effects 应用,这里只做 TP 消耗 + 叙事 + 结算。 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <<set _tp_cost to 2>>\ <<set _tp_fatigue to 5>>\ <<if _ev>>\ <<tp-spend _tp_cost _tp_fatigue>>\ <<set $weimar.surface.fatigue to Math.min(100, $weimar.surface.fatigue + _tp_fatigue)>>\ <</if>>\ <</silently>>\ @@.fb-seg-cite;font-size:1em;$fb_narrative@@ @@color:#666;font-size:0.85em;消耗 _tp_cost TP@@ <<if not _ev>>\ /* 兜底:文件已结算过(罕见:同页二次渲染/旧档错位),不重复扣数,直接退场 */ //那件文件已经不在桌上了。// <<link "返回办公室" "Scene_Office">><</link>> <<else>>\ <<trust-act-note>>\ <<rival-note-show>>\ <<party-review-loop _ev.deck_id>>\ <<fb-deck-fx _ev "manual">>\ <<event-resolve _ev.event_id>>\ <<set $today_handled.push({deck_id: _ev.deck_id, title: _ev.title, template: _ev.template, intensity: _ev.intensity, level: "yellow", action: $file_action})>>\ <<if $pending_events.length gt 0>>\ <<link "继续处理下一件" "Scene_Files">><</link>> <<else>>\ //文件篮空了。// //你靠在椅背上,听见自己的脊椎咔嗒响了一声。// <<link "返回办公室" "Scene_Office">><</link>> <</if>>\ <</if>>
/* ============================================================ 报纸系统 —— 每周一自动生成叙事化周报 注意:中文引号直接用「」书写,不要在字符串里用 \" 转义(SugarCube 不解析) ============================================================ */ /* ---------- newspaper-init-pools ---------- */ <<widget "newspaper-init-pools">>\ <<set $np_pools to {}>> /* === 头条:红色事件 === */ <<set $np_pools.headlines_red to { R01: { title: "法比军队越过莱茵河:鲁尔被占领", summary: "1月11日,法比军队开进鲁尔区。理由是“保证赔款支付”。鲁尔的矿井、工厂和铁路在这一天落入外国军队之手。德国政府已向法国政府提出正式抗议。柏林的街道上,人群聚集在威廉广场,要求政府采取行动。这是凡尔赛条约以来,德国领土第一次被外国军队以武力占领。" }, R02: { title: "国会以压倒性多数通过消极抵抗决议", summary: "国会以283票赞成、12票反对的结果,授权政府对鲁尔占领实施消极抵抗。这意味着鲁尔区的工人将停止为占领者工作,铁路、矿山和工厂将以“不合作”的方式回应法国的占领。这是德国第一次以这种方式面对外敌。" }, R18: { title: "马克对美元汇率跌破万点大关", summary: "本周,马克对美元汇率跌破10,000。战后以来,德国的货币从未如此不值钱。经济学家警告,如果局势无法逆转,德国马克可能继续下跌。许多德国家庭已经开始用外币或实物作为日常交易的媒介。物价委员会宣布将采取紧急措施。" }, R03: { title: "法国军队向鲁尔罢工工人开火", summary: "在埃森,法国占领军向聚集的罢工工人开火。伤亡人数尚未公布。德国政府已要求法国政府对此事做出解释。鲁尔区的工人委员会发表声明,称将继续抵抗。柏林多个工人区举行了抗议集会。" }, R04: { title: "一名德国人在鲁尔被法国军事法庭逮捕", summary: "一名德国男子因在鲁尔区从事破坏活动被法国军事当局逮捕。据称他曾多次破坏铁路设施。德国外交部已通过外交渠道向法国政府提出交涉,要求保障该公民的法律权利。" }, R05: { title: "法国军事法庭执行枪决:一名德国公民在鲁尔遇难", summary: "法国军事法庭判处一名在鲁尔从事破坏活动的德国公民死刑。判决已在埃森执行。德国政府强烈谴责这一判决。多个城市的教堂为遇难者鸣钟哀悼。外交部表示将继续通过国际渠道处理此事。" }, R19: { title: "马克汇率跌破十万:恶性通胀吞噬德国经济", summary: "马克对美元汇率本周跌破十万。这是德国历史上从未出现过的货币贬值速度。中产阶级的储蓄在一夜之间化为乌有,面包店和杂货店的价签每天都在更换。德国统计局的数据显示,物价在过去一个月内上涨了超过400%。财政部表示正在研究货币改革的方案。" }, R06: { title: "柏林陷入停滞:工人、电车和工厂同时停摆", summary: "柏林今天全面停工。电车停驶,工厂停产,街道上几乎看不到行人。罢工是由多个工人联合会发起的,目的是抗议物价上涨和政府无力控制通胀。政府已呼吁各方通过对话解决争端。" }, R07: { title: "国会批准新内阁:DVP组建联合政府", summary: "国会批准了DVP提出的新内阁名单。新总理在就职演说中表示,恢复货币稳定是政府的第一要务。他强调,德国必须面对现实,但也绝不能放弃尊严。新内阁将于下周开始工作。" }, R08: { title: "政府宣布结束消极抵抗政策", summary: "政府正式宣布,鲁尔区的消极抵抗政策即日起终止。这意味着工人们将重返工作岗位。法国占领当局已表示对此表示欢迎。德国政府将继续通过外交途径寻求鲁尔问题的解决。" }, R09: { title: "总统签署紧急法令:全国进入紧急状态", summary: "总统依据宪法第48条签署紧急法令,宣布全国进入紧急状态。多项公民权利被暂时限制。政府表示这是为了维护公共秩序,但也强调这只是临时措施。" }, R10: { title: "巴伐利亚宣布戒严:邦政府接管全部行政权力", summary: "巴伐利亚邦政府宣布进入戒严状态,授予邦委员独揽行政权。柏林的命令在慕尼黑已不再有效。巴伐利亚正在走自己的路——那条路的方向,和柏林指向的越来越不一样。" }, R11: { title: "左翼政党在克姆尼茨召开全国会议", summary: "左翼政党在克姆尼茨召开全国代表会议,讨论当前政治局势。会议期间通过了多项决议,呼吁工人团结起来,反对政府的现行政策。与会代表宣布将向柏林派遣代表团,递交请愿书。" }, R12: { title: "汉堡发生武装冲突:国防军已控制局势", summary: "汉堡市发生武装起义。起义者占领了多处警察局和公共建筑。国防军奉命进入汉堡,经过三天交火,已重新控制市区。官方公布的伤亡数字为:警察17人死亡,平民61人死亡,起义者21人死亡。" }, R13: { title: "国防军开进萨克森:州政府被解散", summary: "国防军奉命开进萨克森州和图林根州,解散了当地的左翼州政府。柏林方面称,这是为了防止局势进一步恶化。新的过渡政府已经成立,将在下一次州选举前暂行管理职能。" }, R14: { title: "慕尼黑发生武装暴动:暴动已被镇压", summary: "慕尼黑发生武装暴动。暴动者试图推翻当地政府,但已被警方和国防军联合镇压。暴动领导者已被逮捕。慕尼黑局势已恢复平静。司法部门将对暴动参与者提起公诉。" }, R15: { title: "慕尼黑统帅堂发生交火:多人死亡", summary: "慕尼黑统帅堂附近发生交火。暴动者与国防军发生冲突。官方公布的数字是:16名暴动者死亡,多名参与者受伤。暴动的主要领导者已被拘留。慕尼黑当局表示,将继续追查其他参与者。" }, R16: { title: "新货币地租马克正式发行", summary: "新货币地租马克正式发行。旧马克将以一万亿比一的汇率兑换。这意味着旧的纸币将在未来几周内逐步退出流通。多家银行已开始兑换服务,政府表示这是稳定经济的必要措施。" }, R17: { title: "国会通过不信任案:总理辞职", summary: "国会通过了对总理的不信任案,总理解职。他在任期间,结束了消极抵抗、发行了地租马克、镇压了汉堡起义和慕尼黑暴动。现在他走了。国会的下一次选举将在法定时间内举行。他的继任者尚未公布。" } }>> /* === 头条:UE 事件 === */ <<set $np_pools.headlines_ue to { UE_01: { title: "马克跌势不止:德国货币的黄昏", summary: "马克对美元汇率再度下跌,已突破历史性的整数关口。财政部正在考虑干预措施,但央行的外汇储备已所剩不多。许多企业已开始以美元计价结算。马克是否还能挽回,正在成为本周德国最大的问号。" }, UE_11: { title: "普鲁士告急:德国最大的邦面临破产", summary: "普鲁士邦政府本周向柏林发出紧急求助。鲁尔区被占后的补贴支出和税收锐减,已经将这个占德国一半以上人口的邦推到了财政悬崖的边缘。如果普鲁士倒下,整个德国的财政体系将面临连锁崩溃。财政部正在紧急评估救援方案。" }, UE_12: { title: "央行独立性受到挑战:货币政策的十字路口", summary: "国会议员联名提案,要求央行接受财政部直接监督,理由是“央行对通胀失控负有责任”。支持者认为在当前的紧急状态下,货币发行权不应独立于民选政府之外。反对者警告,一旦央行丧失独立性,马克将失去最后的信用支柱。" }, UE_13: { title: "电价暴涨引发工业界强烈抗议", summary: "电力公司申请上调电价,涨幅最高达30%。工业联合会警告,如果获批将导致大范围停工。能源短缺正在从煤延伸到电。政府尚未做出最终决定。能源部长表示将在“保障供应”和“控制成本”之间寻找平衡。" }, UE_15: { title: "商业地产价格暴跌:中产阶级的储蓄正在消失", summary: "受通胀影响,柏林商业地产价格已下跌40%。多家开发商濒临破产。数千个家庭的投资正在缩水。中产阶级——共和国曾经最稳固的基石——正在被通胀和资产贬值双重夹击。政府正在就是否“托市”进行内部讨论。" }, UE_16: { title: "选举法改革提案提交国会:5%门槛能否挡住极端势力?", summary: "内政部提交报告,建议引入5%议会门槛。目前的比例代表制让众多小党进入国会,极端政党获得与其影响力不符的议席。本周国会将就此展开辩论。如果法案通过,下一届选举的格局将发生根本性变化。" }, UE_24: { title: "柏林住房短缺已达8万套:一场正在酝酿的社会危机", summary: "超过8万个家庭缺少合适的住房。工人家庭平均居住面积不足8平方米。市政厅的报告称,如果不立即采取行动,这场危机将在冬季进一步恶化。市政府呼吁联邦政府提供紧急资金。" }, UE_29: { title: "柏林与莫斯科之间的非正式接触引发关注", summary: "外交部证实,德国与苏联之间存在“非官方层面的接触”,内容涉及经济合作可能性。军方对此持谨慎欢迎态度,但外交部警告这可能影响德国与西方国家的关系。目前尚不清楚这是试探性的接触还是更大规模外交转向的前奏。" }, UE_32: { title: "四国大使联合拜会:国际社会对德国局势表示担忧", summary: "英、美、法、意四国驻德大使本周联合拜会德国外交部,对“德国国内暴力升级”和“极端势力抬头”表达关切。大使们暗示,如果局势持续恶化,国际贷款和投资可能受到影响。外交部表示已收到相关意见,将在适当时机予以回应。" }, UE_35: { title: "军工企业国有化提案引发激烈争论", summary: "部分议员提案将主要军工企业收归国有,理由是“战争物资的生产不应掌握在私人手中”。支持者称这是“保障国家安全”,反对者称这是“走向国家社会主义的第一步”。国会下周将就此举行特别听证会。" }, UE_41: { title: "政府拟对基本物资实施限价:能挡住通胀吗?", summary: "经济部长提交提案,拟对基本生活物资实施最高限价。目的是遏制通胀对民生的冲击。但商会警告,此举将导致物资短缺与黑市泛滥。类似的措施曾在战后的1919年尝试过,最终因执行不力而失效。" }, UE_42: { title: "干旱与化肥短缺:德国面临粮食危机", summary: "农业部警告,今年谷物收成预计下降30%。持续的干旱和化肥短缺正在摧毁这个国家的农业基础。如果秋季收成不如预期,德国将不得不大量进口粮食——但外汇储备已经不足以支付大规模的粮食进口。" }, UE_43: { title: "央行提案重组银行业:系统风险在逼近", summary: "央行本周提交提案,拟对柏林多家濒临破产的私人银行进行重组,由政府注资并接管坏账。金融业发出了尖锐的警告:如果不干预,整个支付体系将面临中断风险;如果干预,纳税人的钱将填进一个深不见底的洞里。" }, UE_49: { title: "药品储备仅够两周:柏林医疗系统告急", summary: "卫生部长紧急报告,柏林主要医院药品储备仅够维持两周。护士罢工要求加薪,医院人手严重不足。如果不立即干预,柏林将在月底前面临医疗系统局部瘫痪。政府正在与工会谈判。" }, UE_55: { title: "华盛顿伸出援手?美国考虑向德国提供贷款", summary: "美国政府非正式表示,愿意考虑向德国提供长期低息贷款。条件是德国必须在赔款问题上“展现诚意”。如果这笔贷款成行,将极大缓解德国的外汇危机。但这也意味着德国将在经济上更加依赖美国。" }, UE_56: { title: "情报显示法国可能减少鲁尔驻军", summary: "据情报部门报告,法军内部出现撤军讨论,可能因财政压力而减少鲁尔区驻军。如果这一情报得到证实,将是鲁尔危机以来第一个真正的转机。但外交界普遍持谨慎态度:“想撤”和“会撤”之间还有一段不确定的距离。" }, UE_57: { title: "奥地利提议关税同盟:德国会接受吗?", summary: "奥地利外交部提议与德国建立关税同盟,以促进两国经济复苏。但这可能违反凡尔赛条约中“德奥不得合并”的条款。维也纳方面辩称关税同盟是“经济合作而非政治合并”,但法国方面已表示关切。" } }>> /* === 通用头条 === */ <<set $np_pools.headlines_generic to [ { title: "柏林:平静的一周", summary: "本周没有重大事件发生。国会休会,街头平静,马克汇率保持稳定。这种平静在柏林并不常见——它值得被记录,也值得被警惕。" }, { title: "德国在等待:局势未发生明显变化", summary: "本周全国局势未出现明显波动。经济数据基本持平,社会情绪保持稳定。在经历了数周的动荡后,这短暂的间歇或许正是各方所需要的一次呼吸。" }, { title: "没有消息的一周", summary: "本周没有重大事件发生。鲁尔局势仍然僵持,马克汇率没有新的变化,国会在休会中。对于柏林的读者来说,这可能是最值得读的一行字。" }, { title: "一切如常——但这本身就是新闻", summary: "本周全国局势未出现明显变化,经济数据保持稳定,没有重大政治事件发生。在1923年,“一切如常”本身就是头条。" }, { title: "鲁尔局势未出现新变化", summary: "本周鲁尔局势未出现新的变化,法国驻军无新的举动,德国政府未发布新的声明。对于已经习惯了每周都有新危机的读者来说,这或许是最不寻常的消息。" }, { title: "冬日的柏林:在动荡与平静之间", summary: "本周没有发生重大事件。马克汇率保持稳定,议会休会,街头没有抗议,没有枪声。对于柏林的居民来说,这种平静也许是最值得珍惜的奢侈品。" }, { title: "国会在休会中,社会情绪趋于平稳", summary: "本周国会休会,各党派正在准备下阶段的立法工作。社会情绪相较前几周有所缓和。这或许只是一个间歇期——但间歇期也是历史的一部分。" }, { title: "没有爆炸性新闻的一周", summary: "本周没有重大事件发生。我们没有新的头条可以报道——没有鲁尔的新进展,没有马克的新低,没有国会的激烈辩论。这让我们的工作变得简单,但这也意味着国家正在等待。" } ]>> /* === 头条:历史暗涌(S事件) === */ <<set $np_pools.headlines_swell to { S01: { title: "全国总动员:罢工越过柏林,蔓延德国", summary: "柏林的总罢工没有停在柏林。汉堡、科隆、鲁尔的工人在同一周放下工具。KPD 喊出全国总罢工。政府与工人之间的那道裂缝,从一座城裂开到了整个国家。铁路停摆,工厂静默——共和国的一整块表皮正在脱落。" }, S02: { title: "多城同时举旗:起义洪流漫过街垒", summary: "汉堡的街垒没有像以往那样孤军奋战。鲁尔、萨克森、莱茵的工人同一天举起同一面旗。共和国派出的每一道平叛令,都要同时面对好几条街。这不是一场起义,是一场遍地起火。政府正试图在火堆之间寻找一条能走的路。" }, S03: { title: "慕尼黑易帜:巴伐利亚宣布脱离共和国", summary: "慕尼黑卫戍部队倒戈,巴伐利亚宣布脱离德意志共和国。独裁者向柏林发出最后通牒。军队站到了暴动者一边——他们太恨柏林了。德意志的土地上,第一次真正裂开了一道从内部写到外部的缝。" }, S04: { title: "萨克森武装抵抗:国防军遭遇顽强阻击", summary: "国防军奉命开进萨克森,却遭遇了工人政府支持者的武装抵抗。街垒、矿灯、猎枪——共和国用军队对付自己的州,而这一次,军队咬到了一块硬骨头。伤亡数字正在上升,柏林的声音在萨克森的枪声中显得苍白。" }, S05: { title: "巴伐利亚与军方密使握手:共和国埋下裂痕", summary: "情报证实,巴伐利亚的邦独裁者与国防军高层之间存在着秘密接触。边境小站的一次握手,让慕尼黑得到了军队的默许,让共和国得到了一道从内部裂到外部的缝。柏林的命令,在慕尼黑和总参谋部之间,正在变得可有可无。" }, S06: { title: "地租马克失效:通胀继续吞噬共和国", summary: "新印起来的货币没有止住狂澜。市场推开了一张抵押在纸上的承诺——它已经上过太多当。旧通胀从每一个裂缝里继续渗出来。共和国的货币心脏,第一次真正停止了跳动。财政部承诺再想办法,但人们已经不再相信承诺。" }, S07: { title: "莱茵兰宣布自治:占领区升起另一面旗", summary: "科布伦茨的一纸布告,把莱茵兰从共和国的地图上撕了下来。分离派宣称自治,占领军的哨线成了他们的院墙。柏林的命令过了莱茵河就成了废纸——共和国第一次失去了国土上的名字,而不仅是土地。" }, S08: { title: "外长遇刺:子弹穿透了和约的签字桌", summary: "一声枪响,带走了一位在和约上签过字的人。凶手属于右翼团体,街上传单连夜印了出来。刺杀者要的不是一条命——是要让每一支准备签字的手,都记住发抖是什么感觉。政府的回应,将决定恐惧往哪个方向生长。" }, S09: { title: "账外的军团:国防军影子部队曝光", summary: "一份泄露的密报证实:在协约国委员会查不到的仓库里,藏着一支不属于名册的军队。农具的账面下是步枪,农场工人的名册下是班长。它效忠的不是宪法——共和国从此有了两支军队,一支宣誓护宪,一支只效忠握它的人。" }, S10: { title: "粮仓上锁:农民不再向城市卖粮", summary: "城里面粉涨价,乡下粮仓却上了锁。纸币买不来信任,粮贩子空车进村、空车出村。城市和乡村,第一次隔着粮价互相打量。饿着肚子的工人和守着粮的农民,正在替这个共和国预演一场内战的排练。" }, S11: { title: "军营夜谈:密谋渗进了军官俱乐部", summary: "情报部门的报告一周厚过一周:密谋不再是酒馆里的牢骚,它有了名册,有了联络线,有了日程。军官俱乐部的灯熄得比平时晚。共和国的枪口还朝着外面的敌人——但夜里,有人听见它在校准转向的角度。" }, S12: { title: "最后通牒:巴黎的电报限期答复", summary: "协约国的照会摆上了总理府的桌子,期限印在第一行。接受,签字桌就变成审判席;拒绝,占领区再沉一寸。伦敦的电报机响到深夜——共和国的每一个小时,都在被别人计时。" }, S13: { title: "报馆的灯亮着,排字工的手停了", summary: "煽动性的版面一版接一版,泄密的稿子上了外国报纸。查封的章在政府的抽屉里,起诉的传票在法院的格子里——选哪个,共和国就先在纸面上死一块,或者先在纸面上学会规矩。报界在等,全城都在等。" } }>> /* === 头条:大事件后果(flag 触发一次) === 大事件定制选项点选后落的 $flags 标志位,若 true 则本周报纸据此出头条(出过一次置 "used")。 */ <<set $np_pools.headlines_chain to [ { flag:"chain_art48_used", title:"政府动用第48条:宪法与紧急权之争再起", summary:"政府在未经议会表决的情况下援引宪法紧急条款直接下令。支持者说这是守住国家的唯一办法,反对者警告这是把共和国往独裁的秤上挪。司法与议会都盯着这一纸命令——它救得了眼前,也改写了未来。" }, { flag:"chain_coup_checked", title:"橱窗政变被扼制:军事政变传言发酵", summary:"针对柏林的军事政变传闻一度甚嚣尘上,总参谋部人心浮动。政府连夜换防、公开斥责,才把风声压了下去。可军营里的怨气没有消散,只是暂时换了张脸。传闻平息了,裂痕依然在。" }, { flag:"chain_officer_pacted", title:"总理与军官俱乐部的密约:一场危险的拉拢", summary:"政府与右翼军官之间达成了一种心照不宣的默契。军费与「秩序优先」换来了军队暂时的臣服——但臣服是一种可以随时撤走的东西。共和国用许诺买来的安定,正被记在另一本账上。" }, { flag:"chain_army_defied", title:"军令搁浅:参谋部扣押调令", summary:"一道调令被国防军参谋部扣下,理由是「时机不对」。强制与收回之间,政府最终选择了低头。军令的份量由此轻了一截:命令可以违抗,只要违抗得足够坚决。" }, { flag:"chain_press_shut", title:"报馆被查封:舆论哗然", summary:"一家批评政府的报馆被勒令停刊。街面上少了骂声,却也少了声音。「政府怕报纸」这句话,比查封令传得更快——一些原本中立的报纸,开始琢磨自己哪天会被点名。" } ]>> /* === 变量文本池 === */ <<set $np_pools.variables to { inflation: { worsening_severe: [ "物价持续上涨,食品价格在过去一周内上涨逾两成。多个城市的面包供应出现紧张。", "马克汇率再次下跌,进口商品价格进一步攀升。部分地区已出现囤积现象。", "统计局今日公布的数据显示,本周通胀率较上周继续走高。货币改革方案的必要性再次被提上议程。" ], worsening_moderate: [ "物价涨势虽未停止,但涨幅较前一周有所收窄。当局表示正在密切关注。", "本周消费品价格小幅上涨。政府强调目前供应充足,无需过度担忧。", "马克汇率温和走低。央行表示当前的波动仍在可监测范围内。" ], stable: [ "本周物价整体保持稳定,部分商品价格略有回落。这是近两月来的首次。", "马克汇率本周没有出现明显波动。消费者信心略有回升。", "多个城市的面包价格停止上涨。民众排队的长度比上周短了。" ] }, economy: { worsening_severe: [ "经济数据持续恶化。鲁尔区多家工厂本周宣布无限期停产。", "失业率再度攀升。劳动局公布的登记失业人数已连续数周增加。", "工业生产指数下降,建筑业几乎停滞。经济复苏的前景仍然遥远。" ], worsening_moderate: [ "经济数据显示,工业产出仍在下降,但速度有所放缓。", "多个行业协会报告称,订单量继续减少,企业正在缩减产能。", "尽管经济形势仍然严峻,但部分企业已开始调整策略,试图渡过难关。" ], stable: [ "本周经济数据未进一步恶化。部分工业指标出现企稳迹象。", "鲁尔区若干工厂宣布恢复生产,虽然产能有限,但已释放出积极信号。", "商业景气指数本周止跌。经济界人士表示,最糟糕的时刻或许正在过去。" ] }, social_anger: { worsening_severe: [ "多地爆发抗议活动。民众对经济状况的不满正在转化为公开的集会与示威。", "多个城市本周报告了集会事件,警方称已部署相应力量维持秩序。", "社会情绪持续紧张。工会领导人在多场集会上发表演说,呼吁政府回应民众诉求。" ], worsening_moderate: [ "社会矛盾仍处于高位。虽未爆发大规模冲突,但小规模摩擦时有发生。", "工会在多个城市组织了集会,要求政府改善民生。警方称集会总体和平。", "民众的不满情绪仍在积聚。当局呼吁各方保持克制,通过对话解决问题。" ], stable: [ "本周社会情绪有所缓和。多场计划中的抗议活动已自行取消。", "街头的紧张气氛略有缓解。警方报告称,本周集会数量和参与人数均有所下降。", "工会与政府的接触频率有所增加,双方均表示愿意寻求共识。" ] }, political_violence: { worsening_severe: [ "政治暴力事件本周显著增加。多地报告了集会冲突和袭击事件。", "警方通报,本周多起政治集会以冲突告终,数十人受伤。", "暴力行为正在从边缘走向中心。多座城市的夜间治安状况恶化,当局已加强巡逻。" ], worsening_moderate: [ "本周全国报告了多起政治暴力事件。警方已逮捕多名涉案人员。", "部分城市的集会现场发生冲突。官方呼吁各方克制。", "政治暴力仍持续存在。虽然规模有所减小,但并未完全消失。" ], stable: [ "本周政治暴力事件显著减少。警方通报称,主要城市局势基本平稳。", "政治集会本周均在和平气氛中进行。没有重大冲突的报告。", "治安状况有所改善,夜间街道的秩序正在恢复。" ] }, gov_trust: { worsening_severe: [ "最新民调显示,政府支持率已降至新低。民众对当局的信心正在减弱。", "国会在本周的辩论中多次出现对政府的不信任表态。反对党已提交质询。", "多个社会组织发表联合声明,呼吁政府正视民众诉求,恢复对公共机构的信任。" ], worsening_moderate: [ "民众对政府的信任度继续下滑。虽然幅度不大,但趋势已引起各方关注。", "本周民调显示,政府支持率小幅下降。分析人士认为与经济形势持续恶化有关。", "公众对政府处理经济危机的满意度较低。部分议员呼吁内阁调整政策方向。" ], stable: [ "政府支持率本周小幅回升。民众对当局近期采取的措施表示谨慎认可。", "最新民调显示,政府的信任度没有进一步恶化,部分指标略有改善。", "公众对政府表现的负面评价略有减少。分析人士指出,这或许是一个转向信号。" ] }, nationalism: { worsening_severe: [ "民族主义情绪持续升温。多个城市举行了大规模爱国集会。", "“恢复德意志尊严”的口号在多座城市的集会上被反复呼喊。", "全国多地出现了针对外国商品的抵制呼声,民族主义团体正在扩大活动范围。" ], worsening_moderate: [ "多个城市本周举行了爱国集会,参与者众多,集会过程总体和平。", "民族主义团体的公开活动频率明显增加,政府已对其进行密切关注。", "要求“恢复德意志”的呼声正在蔓延。集会规模比前一周有所扩大。" ], stable: [ "本周爱国集会的数量和规模均有所减少,社会氛围趋于平静。", "民族主义团体的公开活动有所收敛,公开演讲的频率降低。", "街头集会者的数量明显减少。那些曾经被反复呼喊的口号,现在只能零星听到。" ] }, revolution: { worsening_severe: [ "革命言论正在从地下的印刷物蔓延到公开的墙壁上,多个城市报告了激进的传单和标语。", "工人运动持续升温。多个城市的工会组织已发出动员令。", "政府正密切关注左翼团体的活动。情报部门称,近期的集会规模和频率均有显著增长。" ], worsening_moderate: [ "左翼工人团体的活动继续增加。传单和标语的覆盖范围已从工厂扩大到社区。", "多个城市发生了抗议集会,参与者呼吁“推翻现有体制”。", "工会和左翼组织的公开活动频率上升,政府已加派警力进行监控。" ], stable: [ "本周左翼团体的活动明显减少。公开集会次数和参与人数均有所下降。", "激进声音在减弱。虽然仍有零散活动,但整体强度已不如前几周。", "柏林的墙上的传单少了一层。不是没有新的贴上去,是那些旧的被雨水冲淡之后,没有人再去覆盖它们。" ] }, army_influence: { worsening_severe: [ "国防军近期在多地进行了公开的军事调动和演习。官方称此为年度计划的一部分。", "军官的身影开始出现在更多国会听证会现场,这引起了一些议员的不安。", "国防部本周宣布扩编东部驻军。外交部表示已通知邻国,这是正常的防御性调整。" ], worsening_moderate: [ "国防军本周在东部边境进行了例行演习。演习规模较往年有所扩大。", "军官参与公共事务的频率有所增加。军方表示,这只是正常的信息沟通。", "国防部的预算提案本周在国会进行了第一轮审议。军方代表出席了听证会。" ], stable: [ "国防军的公开活动本周显著减少。士兵们回到了军营,街道上再次恢复到往日的安静。", "军方本周没有进行任何重大演习。国防部的声明也明显减少。", "军官们从公众视线中消失。他们回到了地图和沙盘前。" ] } }>> /* === 国会动态 === */ <<set $np_pools.congress to [ "国会本周就经济问题展开辩论。多个党派要求政府提出明确的复苏计划。", "新一届国会会期开始,各党派已提交多项立法提案。", "国会通过了一项关于财政支出的决议。反对党表示,这远远不够。", "国会本周辩论激烈,多名议员在发言中援引了宪法第48条。", "国会批准了政府提交的预算调整方案。投票结果为247票赞成、189票反对。", "国会内部分歧依旧。在多个议题上,执政联盟与反对党无法达成一致。", "国会议员要求政府就鲁尔局势提供详细报告。", "国会本周休会。各党派将在休会期协商下阶段的立法重点。" ]>> /* === 政党动态 === */ <<set $np_pools.parties to { spd: [ "社会民主党呼吁通过对话解决当前危机,拒绝采取极端手段。", "SPD 地方党部在多个城市组织了民众集会,强调工人的基本权益。", "SPD 在国会提案,要求扩大对失业工人的救助范围。" ], kpd: [ "共产党宣布将在多个城市举行“反对饥饿与战争”的集会。", "KPD 在传单中批评当前政府的政策,称其为“资产阶级专政”。", "共产党本周末在柏林组织了约三千人参加的群众大会。" ], ddp: [ "民主党要求政府就当前经济政策做出公开解释。", "DDP 发布声明,呼吁在保持秩序的同时继续推进民主改革。", "民主党批评政府滥用第48条,担心这将为未来的威权统治埋下隐患。" ], dvp: [ "人民党重申经济稳定是当前一切政策的核心。", "DVP 领导人呼吁民众保持冷静,称政府正在尽最大努力缓解危机。", "人民党议员在国会发言,强调恢复马克信用的紧迫性。" ], zentrum: [ "Zentrum表示支持政府稳定经济的努力,但强调应兼顾社会公正。", "Zentrum 呼吁各方保持克制,避免鲁尔局势进一步升级。", "Zentrum在本周国会辩论中扮演了调和角色。" ], dnvp: [ "国家人民党发表声明,批评政府的外交软弱,强调德国不应屈服于外部压力。", "DNVP 在多个城市组织了爱国集会,呼吁复兴德意志精神。", "国家人民党要求政府重新审视凡尔赛条约中的军事限制条款。" ], nsdap: [ "国家社会主义工人党在慕尼黑组织了大规模集会。", "NSDAP 发表声明,指责政府为“凡尔赛的帮凶”。", "国家社会主义工人党的宣传力度本周明显增加,街头传单数量显著上升。" ], army: [ "国防军发言人表示,军队将继续忠于国家,不介入政治斗争。", "军方本周在东部边境完成了预定演习。国防部称,演习未针对任何特定国家。", "国防军高层在内部会议上重申了对宪法的忠诚。" ], weimar: [ "魏玛本周沉默不语。没有声明,没有讲话,只有一份来自总统府的简短通报,语气比上一次更克制。", "共和国似乎在用安静来测试他自己——看他在没有人替他说话的时候,还能不能继续站着。", "这周没有听到魏玛的声音。不是因为他不想说,是因为他在等别人先问。" ] }>> /* === 社会动态 === */ <<set $np_pools.social to [ "多地工会呼吁罢工,要求政府改善工人待遇。", "工人委员会在鲁尔区组织了多次集会,呼吁全国团结抵抗占领。", "知识分子界发表公开信,谴责政治暴力,呼吁对话与妥协。", "柏林多个社区的居民自发组织了互助组织,以应对物价上涨。", "宗教团体呼吁在鲁尔冲突中保持克制,为各方祈祷和平。", "多个行业协会发表联合声明,要求政府尽快恢复经济秩序。", "大学生团体在柏林大学门口发起集会,反对日益增长的民族主义情绪。", "市民自发在勃兰登堡门前举行烛光守夜,以悼念各地冲突的受害者。" ]>> /* === 评论结语 === */ <<set $np_pools.commentary to { GM: [ "政府本周再次选择了谈判桌而不是战场。有人说这太慢——但有些人走不了太快,他们需要的是不被落下。", "德国本周的决定仍然是“在法理框架内”。国会的掌声和走廊里的脚步声一样多。", "妥协仍在继续。不是每一个选择都能让所有人满意,但它至少让所有人都能留在同一张桌子前。" ], SM: [ "政府本周展示了强硬的一面。不是所有人都喜欢他,但所有人都记住了他。", "行政权力的使用频率在增加。有人称其为“果断”,有人称其为“过度”——但没有人敢假装它不存在。", "政府在多个场合动用了强制力。他让那些在阴影里移动的东西开始放慢速度。" ], LE: [ "工人区的呼声本周被听到了。政府对工会的诉求做出了回应。", "社会民主党本周在国会中取得了进展。工人阶层的声音正在比以前更接近那些曾说不必听它的人。", "左翼的主张在本周占据了上风。不是赢了,是它的声音终于大到不需要重复第二遍。" ], RE: [ "民族主义的声音本周再次占据报纸头条。有人欢呼,有人沉默。", "右翼主张在本周获得了更多支持。它从街道的一角走到了中心。", "本周的政策偏向强硬。有人形容那是“底线”,另一些人则在试图辨认那究竟是底线还是起点。" ], OP: [ "政府本周在多个问题上保持了灵活性。有人说这是智慧,有人说这是犹豫。", "德国本周没有做出任何不可逆的决定。这意味着它还有回旋的余地——也意味着它还没有决定要往哪个方向走。", "本周的选择既不是左也不是右——它是实用主义的。" ], AP: [ "政府本周没有做出任何重大决定。问题是:不做决定本身,也是一种决定。", "本周的德国在等待。等什么?没有人说——但那种等待本身已经成了一种比决定更响亮的信号。", "拖延本周被当作一种策略使用。但时间不会等人——尤其是在1923年的德国。" ] }>>\ <</widget>> /* ---------- np-rand ---------- */ <<widget "np-rand">>\ <<silently>> <<set _arr to $args[0]>> <<if _arr and _arr.length gt 0>> <<set $ret to _arr[Math.floor(Math.random() * _arr.length)]>> <<else>> <<set $ret to "">> <</if>> <</silently>>\ <</widget>> /* ---------- np-color-class ---------- */ <<widget "np-color-class">>\ <<silently>> <<set _delta to $args[0]>> <<if _delta gte 5>> <<set $ret to "np-worsening-severe">> <<elseif _delta gte 1>> <<set $ret to "np-worsening-moderate">> <<elseif _delta lte -5>> <<set $ret to "np-improving-significant">> <<elseif _delta lte -1>> <<set $ret to "np-improving-moderate">> <<else>> <<set $ret to "np-stable">> <</if>> <</silently>>\ <</widget>> /* ---------- np-delta-sign ---------- 角标数值量化(与 np-color-class / np-var-text 的语义档位对齐): - |变化| < 1 → 显示 0(稳定;颜色=灰、正文=稳定,三者一致) - |变化| ≥ 1 → 向上取整到整数(0.134→+1 / 2.1→+3 / 4.9→+5) - 封顶 ±10(超过按 10 显示,标注极端) 只改变角标数字的显示形态,不改颜色/正文(它们各自用原始值判定)。 */ <<widget "np-delta-sign">>\ <<silently>> <<set _d to $args[0]>> <<set _av to Math.abs(_d)>> <<if _av lt 1>> <<set $ret to "0">> <<elseif _d gt 0>> <<set _qi to Math.min(10, Math.ceil(_av))>> <<set $ret to "+" + _qi>> <<elseif _d lt 0>> <<set _qi to Math.min(10, Math.ceil(_av))>> <<set $ret to "-" + _qi>> <<else>> <<set $ret to "0">> <</if>> <</silently>>\ <</widget>> /* ---------- np-var-text ---------- */ <<widget "np-var-text">>\ <<silently>> <<set _var_name to $args[0]>> <<set _delta to $args[1]>> <<set _pool to $np_pools.variables[_var_name]>> <<if not _pool>> <<set $ret to "(数据暂缺)">> <<else>> <<if _delta gte 5>> <<set _tier to _pool.worsening_severe>> <<elseif _delta gte 1>> <<set _tier to _pool.worsening_moderate>> <<else>> <<set _tier to _pool.stable>> <</if>> <<if not _tier or _tier.length eq 0>> <<set $ret to "(数据暂缺)">> <<else>> <<set _idx to Math.floor(Math.random() * _tier.length)>> <<set $ret to _tier[_idx]>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- newspaper-generate ---------- */ <<widget "newspaper-generate">>\ <<silently>> /* 注意:SugarCube 的 <<return>> 在 StoryInit/daily-tick 等无 passage 上下文里会报 「cannot find passage」(既有 bug,见 2026-08-25 记录)。改用 _np_skip 标志短路。 */ <<set _np_skip to false>> <<if $session_day eq $np_last_gen_day>> <<set _np_skip to true>> <</if>> /* 只在真实的周一出版。 1923-1-1 为周一 -> S3 的 (session_day - 0) % 7 == 0 即周一; 1920-1-1 为周四(V0.9 S2)-> 周一落在 (session_day - 4) % 7 == 0。 按章节起点星期偏移统一计算,两章各自正确。 */ <<set _np_wday_off to 0>> <<if $stage and $stage.id eq "S2">> <<set _np_wday_off to 4>> <</if>> <<if not _np_skip and ($session_day - _np_wday_off) % 7 neq 0>> <<set _np_skip to true>> <</if>> /* 计算距上一次生成之后的下一个周一(用与上面同一星期偏移) */ <<if not _np_skip>> <<set _next_monday to $np_last_gen_day - (($np_last_gen_day - _np_wday_off) % 7) + 7>> <<if _next_monday lte $np_last_gen_day>> <<set _next_monday to _next_monday + 7>> <</if>> /* 还没到下一个周一,不生成 */ <<if $session_day lt _next_monday>> <<set _np_skip to true>> <</if>> <</if>> <<if not _np_skip>> <<set _week_events to []>> <<if $event_log and $event_log.length gt 0>> <<set _safe_start to Math.max(0, $np_last_log_idx || 0)>> <<for _j to _safe_start; _j lt $event_log.length; _j++>> <<set _week_events.push($event_log[_j])>> <</for>> <</if>> <<set _wc to {}>> <<if $np_last_world>> <<set _wc.economy to ($world.economy || 0) - ($np_last_world.economy || 0)>> <<set _wc.inflation to ($world.inflation || 0) - ($np_last_world.inflation || 0)>> <<set _wc.social_anger to ($world.social_anger || 0) - ($np_last_world.social_anger || 0)>> <<set _wc.political_violence to ($world.political_violence || 0) - ($np_last_world.political_violence || 0)>> <<set _wc.nationalism to ($world.nationalism || 0) - ($np_last_world.nationalism || 0)>> <<set _wc.gov_trust to ($world.gov_trust || 0) - ($np_last_world.gov_trust || 0)>> <<set _wc.revolution to ($world.revolution || 0) - ($np_last_world.revolution || 0)>> <<set _wc.army_influence to ($world.army_influence || 0) - ($np_last_world.army_influence || 0)>> <<else>> <<set _wc.economy to 0>> <<set _wc.inflation to 0>> <<set _wc.social_anger to 0>> <<set _wc.political_violence to 0>> <<set _wc.nationalism to 0>> <<set _wc.gov_trust to 0>> <<set _wc.revolution to 0>> <<set _wc.army_influence to 0>> <</if>> <<set _headline_title to "">> <<set _headline_summary to "">> <<set _events_this_week to []>> <<for _k to 0; _k lt _week_events.length; _k++>> <<set _ev to _week_events[_k]>> <<if _ev.deck_id>> <<set _events_this_week.push(_ev.deck_id)>> <</if>> <</for>> <<set _found_headline to false>> <<set _review_used_headline to false>> <<for _k to 0; _k lt _events_this_week.length; _k++>> <<set _eid to _events_this_week[_k]>> <<if not _found_headline and $np_pools.headlines_red[_eid]>> <<set _headline_title to $np_pools.headlines_red[_eid].title>> <<set _headline_summary to $np_pools.headlines_red[_eid].summary>> <<set _found_headline to true>> <</if>> <</for>> <<if not _found_headline>> <<for _k to 0; _k lt _events_this_week.length; _k++>> <<set _eid to _events_this_week[_k]>> <<if not _found_headline and ($np_pools.headlines_swell and $np_pools.headlines_swell[_eid])>> <<set _headline_title to $np_pools.headlines_swell[_eid].title>> <<set _headline_summary to $np_pools.headlines_swell[_eid].summary>> <<set _found_headline to true>> <</if>> <</for>> <</if>> <<if not _found_headline>> <<for _k to 0; _k lt _events_this_week.length; _k++>> <<set _eid to _events_this_week[_k]>> <<if not _found_headline and $np_pools.headlines_ue[_eid]>> <<set _headline_title to $np_pools.headlines_ue[_eid].title>> <<set _headline_summary to $np_pools.headlines_ue[_eid].summary>> <<set _found_headline to true>> <</if>> <</for>> <</if>> <<if not _found_headline>> <<for _hc to 0; _hc lt $np_pools.headlines_chain.length; _hc++>> <<set _hc_item to $np_pools.headlines_chain[_hc]>> <<if not _found_headline and $flags[_hc_item.flag] eq true>> <<set _headline_title to _hc_item.title>> <<set _headline_summary to _hc_item.summary>> <<set _found_headline to true>> <<set $flags[_hc_item.flag] to "used">> <</if>> <</for>> <</if>> <<if not _found_headline and $review_news_pending and $review_news_title neq "">> /* 本期无更重红事件头条 → 国会决议接管头条 */ <<set _headline_title to $review_news_title>> <<set _headline_summary to $review_news_line>> <<set _found_headline to true>> <<set _review_used_headline to true>> <</if>> <<if not _found_headline>> <<set _gi to Math.floor(Math.random() * $np_pools.headlines_generic.length)>> <<set _headline_title to $np_pools.headlines_generic[_gi].title>> <<set _headline_summary to $np_pools.headlines_generic[_gi].summary>> <</if>> /* 历史偏移实感(93_drift_memory):世界记得他。有余波可出时,追加进本期摘要。 */ <<drift-echo-insert>> <<if _drift_echo_body neq "">> /* 踩坑31:<<set>> 表达式里不能用正则字面量(// 会被当除法解析),用 split/join 去掉斜体标记 */ <<set _headline_summary to _headline_summary + " 「" + _drift_echo_body.split("//").join("") + "」">> <</if>> <<set _tone to "neutral">> <<if ($world.gov_trust || 50) lt 20>> <<set _tone to "sarcastic">> <<elseif ($world.gov_trust || 50) lt 40>> <<set _tone to "alarmed">> <<elseif ($world.gov_trust || 50) lt 60>> <<set _tone to "cautious">> <</if>> <<set _stance to "GM">> <<if $player and $player.stance>><<set _stance to $player.stance>> <<elseif $flags and $flags.stance>><<set _stance to $flags.stance>> <</if>> <<set _ds to $date.year + "\u5e74" + $date.month + "\u6708" + $date.day + "\u65e5">> <<set _wd_names to ["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"]>> <<set _wd_obj to new Date($date.year, $date.month - 1, $date.day)>> <<set _issue_weekday to _wd_names[_wd_obj.getDay()]>> <<set $newspaper_issue_count to $newspaper_issue_count + 1>> <<set _issue to { issue: $newspaper_issue_count, date: _ds, weekday: _issue_weekday, headline: _headline_title, summary: _headline_summary, tone: _tone, events_this_week: _events_this_week, world_changes: _wc, player_highlight: _headline_summary, stance_this_week: _stance, archive_index: $newspaper_archive.length }>> /* 国会决议(V0.5-D/S4 完善):未当头条则追加为摘要短条,并清理 pending */ <<if $review_news_pending>> <<if not _review_used_headline and $review_news_line neq "">> /* 国会条目自带「国会通过:…」开头,不再加【国会】前缀以免叠词 */ <<set _issue.summary to _issue.summary + " 「" + $review_news_line + "」">> <</if>> <<set $review_news_pending to false>> <</if>> /* T3 行政瘫痪晨报短条(V0.6-A):并入 summary,不另建专版,规避 .np-del 截断 */ <<if $paralysis_tier gte 3 and $paralysis_news_line and $paralysis_news_line neq "">> <<set _issue.summary to _issue.summary + " 「" + $paralysis_news_line + "」">> <<set $paralysis_news_line to "">> <</if>> <<set $newspaper_archive.push(_issue)>> <<set $newspaper_current to _issue>> <<set $np_last_world to { economy: $world.economy, inflation: $world.inflation, social_anger: $world.social_anger, political_violence: $world.political_violence, nationalism: $world.nationalism, gov_trust: $world.gov_trust, revolution: $world.revolution, army_influence: $world.army_influence }>> <<set $np_last_log_idx to $event_log.length>> <<set $np_last_gen_day to $session_day>> <<set $np_has_new to true>> <</if>> <</silently>>\ <</widget>> /* ---------- newspaper-catchup:补发错过的周一(2026-10-10,试玩报告修复) ---------- 旧的快进补发只在「落点恰好是周一」时出一份——按周推进永远落在同一个星期几, 第一次不在周一,之后整月都见不到报。这里把上一期之后、今天之前错过的每个周一 各补一份:回拨日历到当天出版(日期/星期按当天渲染),事件栏按 $np_last_log_idx 切片(快进整段积攒的事件会落在第一份补发刊里,后续补发刊为薄刊); 世界变化栏取当前快照差(世界状态无法倒带,跨期合并显示)。今天若是周一也在补发之列。 */ <<widget "newspaper-catchup">>\ <<silently>> <<set _nc_wday_off to 0>>\ <<if $stage and $stage.id eq "S2">><<set _nc_wday_off to 4>><</if>>\ <<set _nc_today_day to $session_day>>\ <<set _nc_saved_date to { year: $date.year, month: $date.month, day: $date.day }>>\ /* 上一期之后的第一个周一(与 newspaper-generate 的星期偏移同式) */ <<set _nc_m to $np_last_gen_day - (($np_last_gen_day - _nc_wday_off) % 7) + 7>>\ <<if _nc_m lte $np_last_gen_day>><<set _nc_m to _nc_m + 7>><</if>>\ <<for _nc_guard to 0; _nc_guard lt 400; _nc_guard++>>\ <<if _nc_m lte _nc_today_day>>\ /* 回拨日历与天数到这个周一,让生成体按当天出版 */ <<run (function(){ var tv = State.temporary, sv = State.variables; var back = tv.nc_today_day - tv.nc_m; var md = [31,28,31,30,31,30,31,31,30,31,30,31]; var d = sv.date, day = d.day, month = d.month, year = d.year; for (var i = 0; i < back; i++) { day--; if (day < 1) { month--; if (month < 1) { month = 12; year--; } day = md[month - 1]; if (month === 2 && year % 4 === 0) day = 29; } } d.day = day; d.month = month; d.year = year; sv.session_day = tv.nc_m; })()>>\ <<newspaper-generate>>\ /* 恢复到今天,供下一个周一与后续正常流程使用 */ <<run (function(){ var tv = State.temporary, sv = State.variables; sv.date = { year: tv.nc_saved_date.year, month: tv.nc_saved_date.month, day: tv.nc_saved_date.day }; sv.session_day = tv.nc_today_day; })()>>\ <</if>>\ <<set _nc_m to _nc_m + 7>>\ <</for>>\ <</silently>>\ <</widget>> /* ---------- newspaper-render ---------- */ <<widget "newspaper-render">>\ <<silently>> <<set _issue to $args[0]>> <</silently>>\ /* <<return>> 是导航宏不是提前返回;无报纸时整个渲染体都不跑(2026-09-21 根治) */ <<if _issue>>\ <<silently>> <<if not _issue.weekday>><<set _issue.weekday to "\u661f\u671f\u4e00">><</if>> <<set _wc to (_issue.world_changes || {})>> <<set _var_labels to { inflation: "\u901a\u80c0\u6076\u5316\u5ea6", economy: "\u7ecf\u6d4e\u538b\u529b", social_anger: "\u793e\u4f1a\u6124\u6012", political_violence: "\u653f\u6cbb\u66b4\u529b", nationalism: "\u6c11\u65cf\u4e3b\u4e49\u70ed\u5ea6", gov_trust: "\u653f\u5e9c\u4fe1\u4efb", revolution: "\u9769\u547d\u538b\u529b", army_influence: "\u519b\u65b9\u5f71\u54cd\u529b" }>> <<set _var_keys to ["inflation","economy","social_anger","political_violence","gov_trust","nationalism","revolution","army_influence"]>> <<set _party_labels to { spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"\u4e2d\u592e\u515a", dnvp:"DNVP", nsdap:"NSDAP", army:"\u519b\u65b9", weimar:"\u9b4f\u739b" }>> <<set _party_keys to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army","weimar"]>> <</silently>>\ <div class="newspaper"> <div class="np-masthead"> ═══════════════════════════════════════════════════<br><br> 共和国周报<br> REPUBLIK WOCHENBLATT<br><br> ═══════════════════════════════════════════════════<br><br> 第 _issue.issue 期 · _issue.date · _issue.weekday<br><br> ═══════════════════════════════════════════════════ </div> <div class="np-section np-headline"> <div class="np-section-title">【头条 · 本周要闻】</div><br> <div class="np-headline-title">_issue.headline</div><br> <div class="np-headline-body">_issue.summary</div> </div> <div class="np-divider">───────────────────────────────────────────────</div> <div class="np-section np-national-status"> <div class="np-section-title">【国家状况】</div><br> <<for _vi to 0; _vi lt _var_keys.length; _vi++>>\ <<set _vk to _var_keys[_vi]>>\ <<set _vd to (_wc[_vk] || 0)>>\ <<silently>> <<np-delta-sign _vd>> <<set _dsign to $ret>> <<np-color-class _vd>> <<set _cclass to $ret>> <<np-var-text _vk _vd>> <<set _vtext to $ret>> <</silently>> <span class="np-var-label">_var_labels[_vk]</span> <span class="np-delta _cclass">[_dsign]</span> <span class="np-var-text">_vtext</span><br> <</for>>\ </div> /* ═══ 本周脉络(V0.9 引导):记者口吻的一周复盘 ═══ 把上面那排数字翻译成人话:本周世界往哪边走了、走到哪了。 写进 _issue.threads 生成期,渲染期只读。 */ <<silently>> <<set _threads to []>> <<set _tk_inf to (_wc.inflation || 0)>> <<set _tk_upr to ((_wc.political_violence || 0) + (_wc.revolution || 0) + (_wc.social_anger || 0)) / 3>> <<set _tk_rgt to ((_wc.nationalism || 0) + (_wc.army_influence || 0)) / 2>> <<set _tk_gv to (_wc.gov_trust || 0)>> /* 货币 */ <<if _tk_inf gte 3>> <<set _threads.push("本周马克又跌了。面包铺开始按小时改价,有人上午存的钱,下午就买了半袋面粉。")>> <<elseif _tk_inf gte 1>> <<set _threads.push("马克还在跌,只是跌得慢了些。兑换所门口的队伍没有散。")>> <<elseif _tk_inf lte -3>> <<set _threads.push("马克这周竟然稳住了。有人在兑换所门口站了很久,不敢相信牌价没换。")>> <</if>> /* 民变(暴力/革命/愤怒取均值) */ <<if _tk_upr gte 3>> <<set _threads.push("街上的火药味浓了。左翼和右翼都在招人,招的人用的都是同一句话:日子过不下去了。")>> <<elseif _tk_upr gte 1>> <<set _threads.push("街头多了几次口角,少了几次斗殴。工会和爱国会都在各自积蓄。")>> <<elseif _tk_upr lte -3>> <<set _threads.push("本周街面平静得出奇。巡逻的警察闲得抄手,报摊的老板说这是这个月卖得最差的一周。")>> <</if>> /* 右翼(民族+军方取均值) */ <<if _tk_rgt gte 3>> <<set _threads.push("军营和民族协会本周都活跃。将军们的话少了,调动多了。")>> <<elseif _tk_rgt gte 1>> <<set _threads.push("军方的演习公告和民族团体的集会告示,本周各多了一张。")>> <</if>> /* 政府 */ <<if _tk_gv lte -3>> <<set _threads.push("政府在街上听到的骂声,比在国会里听到的多。")>> <</if>> /* 兜底:哪边都没动静 */ <<if _threads.length eq 0>> <<set _threads.push("本周没有值得一提的大事。报纸希望下周也能这样写。")>> <</if>> /* 与三条命线对应的全局判断(放在脉络末尾,一句收束) */ <<set _gw_inf to $world.inflation>> <<set _gw_upr to ($world.political_violence + $world.revolution + $world.social_anger) / 3>> <<set _gw_rgt to ($world.nationalism + $world.army_influence) / 2>> <<set _gw_worst to Math.max(_gw_inf, _gw_upr, _gw_rgt)>> <<if _gw_worst gte 85>> <<set _threads.push("(编辑按:本周各版编辑一致认为,这是共和国成立以来最难写报的一周。)")>> <<elseif _gw_worst gte 70>> <<set _threads.push("(编辑按:本期付印前,编辑部又核了一遍所有数字。)")>> <</if>> <</silently>>\ <div class="np-section np-threads"> <div class="np-section-title">【本周脉络】</div><br> <<for _th_i to 0; _th_i lt _threads.length; _th_i++>>\ _threads[_th_i]<br><br> <</for>>\ </div> <div class="np-divider">───────────────────────────────────────────────</div> <div class="np-section np-politics"> <div class="np-section-title">【政治与社会】</div><br> <div class="np-subsection"> <<silently>> <<np-rand $np_pools.congress>> <<set _cong_text to $ret>> <</silently>> _cong_text<br><br> </div> <div class="np-subsection"> <<silently>> <<set _picked_parties to []>> <<set _party_count to Math.floor(Math.random() * 2) + 2>> <<for _pi to 0; _pi lt _party_count; _pi++>> <<set _ridx to Math.floor(Math.random() * _party_keys.length)>> <<if _picked_parties.indexOf(_party_keys[_ridx]) eq -1>> <<set _picked_parties.push(_party_keys[_ridx])>> <</if>> <</for>> <</silently>> <<for _pi to 0; _pi lt _picked_parties.length; _pi++>>\ <<set _pk to _picked_parties[_pi]>>\ <<silently>> <<set _p_texts to $np_pools.parties[_pk]>> <<np-rand _p_texts>> <<set _ptext to $ret>> <</silently>> _party_labels[_pk]:_ptext<br> <</for>>\ <br> </div> <div class="np-subsection"> <<silently>> <<np-rand $np_pools.social>> <<set _soc_text to $ret>> <</silently>> _soc_text </div> </div> <div class="np-divider">───────────────────────────────────────────────</div> <div class="np-section np-commentary"> <div class="np-section-title">【评论】</div><br> <<silently>> <<set _st to _issue.stance_this_week>> <<set _com_pool to $np_pools.commentary[_st]>> <<if not _com_pool>> <<set _com_pool to $np_pools.commentary.GM>> <</if>> <<np-rand _com_pool>> <<set _com_text to $ret>> <</silently>> _com_text </div> <div class="np-divider">═══════════════════════════════════════════════════</div> <div class="np-footer"> *《共和国周报》每周一出版 · 编辑部保留所有权利*<br> ═══════════════════════════════════════════════════ </div> </div>\ <</if>>\ <</widget>>
''共和国周报'' <<silently>> <<set _arch_idx to $np_view_idx ? $np_view_idx : -1>> <<set $np_view_idx to null>> <<if not $newspaper_archive or $newspaper_archive.length eq 0>> <<set _display_issue to null>> <<elseif _arch_idx lt 0 or _arch_idx gte $newspaper_archive.length>> <<set _display_idx to $newspaper_archive.length - 1>> <<set _display_issue to $newspaper_archive[_display_idx]>> <<else>> <<set _display_idx to _arch_idx>> <<set _display_issue to $newspaper_archive[_display_idx]>> <</if>> <</silently>> <<if not _display_issue>>\ //报纸还没有出版。等周一再来吧。// <<link "回到办公室" "Scene_Office">><</link>> <<else>>\ <<newspaper-render _display_issue>> <div class="np-nav"> <<if _display_idx gt 0>>\ <<link "← 上一期">><<set $np_view_idx to _display_idx - 1>><<goto "Scene_Newspaper">><</link>> <<else>>\ <span class="np-nav-disabled">← 上一期</span>\ <</if>> <<if _display_idx lt $newspaper_archive.length - 1>>\ <<link "下一期 →">><<set $np_view_idx to _display_idx + 1>><<goto "Scene_Newspaper">><</link>> <<else>>\ <span class="np-nav-disabled">下一期 →</span>\ <</if>>\ </div> <div class="np-back"> <<link "回到办公室" "Scene_Office">><</link>> </div>\ <</if>>
/* ───── 政党拟人 · 按信任度分档的叙事文本 ───── */ /* ─── party-personality-init:StoryInit 中调用,填充 $pp ─── */ <<widget "party-personality-init">>\ /* ─── 先为所有政党初始化空对象 ─── */ <<set $pp to { spd: {}, kpd: {}, ddp: {}, dvp: {}, zentrum: {}, dnvp: {}, nsdap: {}, army: {}, weimar: {} }>> /* ─── SPD · 社会民主党 ─── */ <<set $pp.spd.trust_0_20 to "SPD坐在你对面,椅子往后挪了半尺。他说话慢,每句之间留出空,等你自己决定要不要填进来。你话说完了,他先应一声,再往下接。你想再凑近些,他把桌上的火柴盒往你那边推了推,人没有动。窗外有电车铛铛过去,他看了一眼,又把目光收回到桌上。" >> <<set $pp.spd.trust_21_40 to "SPD招呼你坐,这回不用隔着桌角。他提起1918年,说他头一回在人堆里讲话,嗓子哑了三天。讲到他和KPD的分岔,他不抬高声音,只把那几年翻来覆去讲了一遍又一遍,讲到你自己都能替他接上下一句。" >> <<set $pp.spd.trust_41_60 to "他开口说「我们」了,说得比说「德国」顺口。他把工会的报告推到你面前,手指点在其中一栏,等你的目光落到那一栏,他才继续讲下去。他当着你的面拆信,拆完先折好收进内袋。信纸他还没给你看。给你看的,是他不再背着你拆信。" >> <<set $pp.spd.trust_61_80 to "SPD把你叫住,只说了四个字:「你来了就行。」你坐下时发现,他的椅子比上回往前挪了一寸。他当着你的面叹气,叹得不重,也不背着你。他把报纸上圈好的段落递过来,圈到一半的地方笔迹断了,那一段他也没能读完。他看着你,等你先说第一句。水他已经替你晾到能入口的温度。" >> <<set $pp.spd.trust_81_100 to "他当着你的面把表摘下来,扣放在桌角。文件一摞一摞码整齐,推到桌沿外,屋里只剩下你们两个人。他问你最近睡得怎么样。这个问题他斟酌了一路,从门口斟酌到坐下,才问出口。" >> <<set $pp.spd.fear to "SPD怕1918年那声吆喝,一年比一年远,远到教科书里只剩半行。他怕人们改口说「那时候」,不再说「我们」。输,他经历过,不怕。他怕的是哪天翻开名册,发现带头签名的那个名字底下,再没有第二个签名补上来。连他自己,也开始想不起那年冬天炉子里的火是什么颜色。" >> <<set $pp.spd.want to "SPD想被记住。名字倒在其次;他要人们记得,他信的那套东西确实把人的一日三餐托住了。他想让工资单上的数目经得起追问,让工棚里的孩子在名册上有个正经的学籍。他盼着有一天,人们听完他的主张,不再回一句「太理想了」,而是把凳子搬过来,问他下一步怎么干。" >> <<set $pp.spd.memory to "他忘不掉1918年11月那个上午。窗玻璃结着薄霜,他用袖口擦出一块巴掌大的亮,往街上望。火车顶上、路灯杆上、橱窗沿上都站着人。有人朝他这扇窗举了举帽子。他往后退了半步,后腰抵住暖气片,铁皮是烫的。那块烫他记到今天。他当时想的是:这回得讲出点配得上这么多双眼睛的话。" >> /* ─── KPD · 共产党 ─── */ <<set $pp.kpd.trust_0_20 to "KPD不坐。他靠墙站着,把你从头到脚看一遍。第一句问立场,第二句问出身,第三句他不给。问完他就转开脸,什么时候答、答什么,都算你的事。" >> <<set $pp.kpd.trust_21_40 to "他让你看传单。油墨未干的那面朝下,压在桌沿,你伸手就够得着的位置。印了什么,他不解释。提起那位没能活到1919年之后的领导者,他把声音压低半档,字与字隔得更开,说完便低头继续捆传单,不再抬头。" >> <<set $pp.kpd.trust_41_60 to "KPD允许你坐在三步之内。纸仍然不许碰。他当着你的面清点传单,一沓五十,数完用皮筋一勒,动作没有一下是多余的。他提了一次汉堡。头一个字说出来了,后半句咽了回去。说完他停两秒,看你怎么接。" >> <<set $pp.kpd.trust_61_80 to "他头一回在你面前没有站直。肩塌了半寸,话还是硬的,只是每句结尾不再钉死。他开始说「也许」。这个词从他嘴里出来,称不上让步,算一次试探。他得先弄明白,你知不知道他背后站着什么,再决定往外迈几步。" >> <<set $pp.kpd.trust_81_100 to "KPD指了指自己这一侧。你绕过桌角,在他旁边坐下。文件他不递,手指停在某一行底下,停着不动,等你读完。他问:「如果有一天我不在了,你还会记住我是谁吗?」问的时候他没看文件,看的是你。三秒之后他低头回到纸上。那个问题留在桌子中间,收不走了。" >> <<set $pp.kpd.fear to "KPD怕自己将来缩成一行脚注。不是怕输,他见过输。他怕后人写定案词,落笔是「错了」,不肯多写半句「他站在过那边」。发黄的卷宗一份份传下去,他一份也夺不回来。走在街上他会突然停住,站一小会儿,再接着走。他等的那道命令,早些年就停发了。" >> <<set $pp.kpd.want to "KPD要「有一天」。今天不行,明天不行,最迟后天。他要一座城彻底静下来,静到他人还没开口,满街的人已经知道他要说什么。他不在乎赢一场辩论,他在乎历史最后落笔站在哪一边。他搭的每一样东西,都得比他本人活得久。" >> <<set $pp.kpd.memory to "他忘不掉1919年,那条运河。那天水面很静。有人喊他的名字,他转头,看见光平平地铺在水面上,一直铺到对岸的墙根。水花起来了又落下去,水面重新合拢。身后的人一个个走了,他在岸边站到天黑。后来他总在梦里回到那条水边:光还是那一束,落在他永远没能迈出的那一步上。" >> /* ─── DDP · 德国民主党 ─── */ <<set $pp.ddp.trust_0_20 to "DDP礼数周全。倒水,拉椅,然后等。你不开口,他也只是把钢笔摆正。你的话他一一收好,不评价,收进桌边那份手写备忘录。你起身时他已经把话头换到天气上了,备忘录上却多了一行:你想要的,和他给得出的,中间隔着几页纸。" >> <<set $pp.ddp.trust_21_40 to "他当着你的面读到书签处,抽出书签,合上,起身接了个电话。回来接着听你说。你讲完一段,他隔几秒说:「这是一条路径。」对错他不下判断,只说「一条」,然后看向你,等你决定走不走。" >> <<set $pp.ddp.trust_41_60 to "DDP当着你的面翻开笔记本。你说话,他记,笔走得比你的话慢半拍,赶上你换气的空当。他学会了用「假设」开头,那两个字就是他的请柬。本子摊开的角度正好让你看得见页边。他默认你愿意和他一起画线,其次才防着你在他的纸上乱划。" >> <<set $pp.ddp.trust_61_80 to "他开始和你对读宪法了。他念上句,等你接下句。你说到他没想过的分岔,他把钢笔搁下,正了正椅子,重新翻开那一页。谈完他把那本常带的书合上,手掌按住封面,在桌沿放平。" >> <<set $pp.ddp.trust_81_100 to "DDP把书翻到夹书签的那页,转过来对着你。他念出一句你很久以前随口说过的话,你自己都忘了。他说:「我一直在想这个。」隔了一会儿又补:「我还没认定它对,也没停止想它。」说完他把钢笔搁在书脊上,笔尖朝向你。" >> <<set $pp.ddp.fear to "DDP怕理性到头来落个无人收尸。他把自己整个押给了讲道理这门手艺,讲道理却从来不记得报答谁。他更怕哪天坐下来,忽然发现自己听不懂这个世界了。最怕那些码得整整齐齐的笔记,某个夜里被人从书架上整摞搬走。没烧。只是从此不再有人需要翻开它们来弄懂任何事。" >> <<set $pp.ddp.want to "DDP要一种纸做的秩序:能折叠,能批注,能重新装订,页边永远留着改错的地方。铁的秩序他见过,铸出来那天就开始生锈。他要有人在他开口前就先把耳朵借给他。他要这个国家有足够多的人翻开同一本书的同一边,为的是确认大家还坐在同一张桌子前。" >> <<set $pp.ddp.memory to "他忘不掉在图书馆读完那本书最后一页时,窗外斜进来的那道光。他找不到词形容,只记得句子边缘忽然变清晰了,标点都看得清楚。他合上书,在座位上坐到闭馆铃响。管理员来收椅子时,他在借书卡背面写下一行小字:有些东西还没被造出来,可它已经在纸上等着了。" >> /* ─── DVP · 德国人民党 ─── */ <<set $pp.dvp.trust_0_20 to "DVP让你等了。水位线精确停在杯沿下方两指宽处。桌上只有一杯水,一支笔,都不朝你。他开口不带一个废字,用「可以」代替「是」,用「不便」代替「不」。你起身时他送到门口,点头的幅度刚好在礼数之内,手没有伸出来。" >> <<set $pp.dvp.trust_21_40 to "他开始当着你的面开抽屉了。拉开,放一份文件进去,推上。他提起「数字」这个词的时候会顿半拍,把那个词留在空气里。他在给你递话头:有些账目你知道有,他还知道数目。先问,先得。" >> <<set $pp.dvp.trust_41_60 to "他给你看了几笔账。电费、纸张、印刷,数字念得不快,让你听清维持一个党一个月要烧掉多少。他讲话开始带手势了,手掌朝上,摊给你看。他仍然不说自己在想什么,他开始告诉你他为什么先不说。他信时间:很多东西搁着搁着,就自己归了位。" >> <<set $pp.dvp.trust_61_80 to "他给你看了一笔账。数数的时候,指腹沿着纸边划过去。「我们能承受这个。」说到「我们」,他的笔停了半拍。他抬起眼看你,用看账目的眼神。那一眼之后,你已经被记进他下一页的核算里了。" >> <<set $pp.dvp.trust_81_100 to "DVP在没有约见的日子放你进来。账本摊在桌上,文件散着,没有叠。他当着你的面合上账本,封皮压平,说他今天不看账。他说:「你来了。」重音落在「你」上。说完他就坐着,看你接不接得住这段空白。" >> <<set $pp.dvp.fear to "DVP怕天下万物都进得了他的账本,唯独历史进不去。他怕哪天对上总账,出现一个他填不上的缺口:停顿、解释、没签字的纸,这些都标不出价。他更怕所有人都来问他「会不会好」,他翻遍全套等式,找不出一个能用的答案。" >> <<set $pp.dvp.want to "DVP要稳定,别的都往后排。他要一种能提前三个月排进日程的生活:到期该付的付得出,该到的货到得了,谈好的约不作废。他算过的变量,下一轮核算之前不许反弹。这个国家四处都在解体,他要守住至少一处他说得准的角落。" >> <<set $pp.dvp.memory to "他忘不掉那张纸币。面额记不清了,递过来的方式记得:捏在指尖,两根手指,隔着柜台推过来,谁都清楚它买不来什么。他捏着它在空荡荡的柜台前坐到天黑,街上没有车声,银行大门早锁了。灯灭了之后他还捏着,纸比面额沉。" >> /* ─── Zentrum · 中央党 ─── */ <<set $pp.zentrum.trust_0_20 to "Zentrum坐在窗边,光从侧面来。他看了你一眼,没有让开,也没有请你坐。你说话,他的目光落在你和桌面之间那截空隙上,落得很稳。末了他把茶续上,说了句「时候不早了」。他还没有拒绝,他只是把拒绝往后放了放。" >> <<set $pp.zentrum.trust_21_40 to "他开始在你面前提他的信仰了。不为劝你,为让你知道他站在哪根柱子底下。他说话有一种磨平了的稳,棱角早被这些年磨圆了。你说完,他隔一拍才应,让每句话都先在屋里停一停,确认它落过地。" >> <<set $pp.zentrum.trust_41_60 to "他开始用\u201c我们\u201d了。他在你面前说的时候会顿一下,听一下,像在确认这个词的发音。他会问你\u201c你觉得这个国家应该向哪个方向走\u201d,你刚说出答案,他就已经接住了。你分不清那是在提问,还是在确认你会不会说出他希望听到的那句话。等你真说出来了,那句话才算被他听见。" >> <<set $pp.zentrum.trust_61_80 to "他开始在会面结束时多留你一会儿。他拿起手边那杯水,慢慢喝一口,让沉默悬在屋里。你等着他打破,他等着你适应,看谁先开口把这段空白填上。末了他说:「你能走到我能确认你身份的地方了。坐下谈,还早一步。」" >> <<set $pp.zentrum.trust_81_100 to "他当着你的面摘下眼镜,捏在手里,决定不再隔着任何东西看你。他说:「我这一生都在等一种不需要解释的共识。我以前以为它不会来。」他看了你很久,然后把眼镜戴回去,站起身,没有送你。你走到门口,他还在窗边站着,窗玻璃上映着他的影子,影子一直朝着门的方向。" >> <<set $pp.zentrum.fear to "Zentrum怕他托付给上帝兜底的东西,有一天会轻得拿不住。他怕自己一直走在中间,两边的路却都塌了,只剩「选边」这一件事。他怕哪天推开门,发现他信的那些被他自己忘干净了。教堂还开着灯,长椅空着。" >> <<set $pp.zentrum.want to "Zentrum要一级说得出口的台阶:他站在上面说话,谁也不用把他推开。他要得不多,他清楚「不多」也会被拒。他要这个国家学会承认:有些东西用不着选中才成立,摆在那就该有人护着。他求的甚至不叫被记住,叫被错过。事情还没发生,他已经把结尾想到了。" >> <<set $pp.zentrum.memory to "他忘不掉那座更小更旧的教堂。他进去时里面空无一人,钟声却从某座他知道并不存在的钟楼上传出来。他坐在最后一排,坐了很久。出来的时候,周围那圈脚步声比来时慢。后来他很多年没有再进去。路过时他数过门口的石阶,一级没少。" >> /* ─── DNVP · 德国国家人民党 ─── */ <<set $pp.dnvp.trust_0_20 to "DNVP站在窗边,背对着你。他转身的动作慢,慢出一种惯例:他知道你等得起。他开口先谈天气,一句,两句。谈完,他看了一眼座钟。那是明确的信号:他还没打算把你当成一个政治存在来对待。" >> <<set $pp.dnvp.trust_21_40 to "他开始让你看到他的侧脸了。说话时肩膀偏过来一点,角度不大。他仍旧不坐,靠在窗台上,双手交叉。你说话的时候,他会用指节叩一下窗框,一下,只一下。那表示听见了。仅此而已。" >> <<set $pp.dnvp.trust_41_60 to "他让你坐下了。这回坐的是办公室里那把椅子的对面,又进了半步。他不发话让你坐,只指了指椅子。他提起「旧帝国」四个字,语气跟报账目一个样:不怀旧,只陈述。他在确认一件事:听完这四个字,你没有误解他的意思。" >> <<set $pp.dnvp.trust_61_80 to "他坐下了,坐直,双手放在膝上。他看你的次数多了起来,每回停留也比先前长一点。「我们」这个词,他用来指他自己那一派人了,语气平平,不含敌意。他说:「我们已经等了很久了。值得等的东西,从来不会在短时间内到来。」说这话时他没有看窗户。" >> <<set $pp.dnvp.trust_81_100 to "他在你面前翻开一本旧相册。他翻到某一页,停住,看了很久,合上。那里是谁,他不解释。他说:「有一天你会明白为什么我让你看到这个。」说完他起身,没走向窗户,朝你走过来,把相册放在你手边,然后回到自己的位子。他不再看窗外了。" >> <<set $pp.dnvp.fear to "DNVP怕时间走得比他慢。他早已活在他那套不需要改动的秩序里,只等世界回过头来重新认他。他怕的是:等他终于等到那个时刻,扶着拐杖迎不上去。等得太久,久到有人问他究竟在等什么,他自己也答不上来。" >> <<set $pp.dnvp.want to "DNVP要回的东西得摆回今天的桌面上:被拿走的重量,一件一件,放回原位。皇冠他不要,他要一根还握得住的扶手。他要后人提起他,说他是历史的遗迹,谁也不敢说他是幻觉。他要被证明,其次才轮得到被承认。他想要的东西说穿了只有一件:在他离开之前,看见自己走过的那条路重新有人走一遍。" >> <<set $pp.dnvp.memory to "他忘不掉1918年的那个晚上。有人把旗从旗杆上降下来,他不知道是谁。旗落地,声音很小。他在原地站了很久,没有弯腰。后来有人把旗捡起来,叠好了。他听着那些脚步声从他身边过去,等着它们慢下来。没有慢下来。" >> /* ─── NSDAP · 国家社会主义工人党 ─── */ <<set $pp.nsdap.trust_0_20 to "NSDAP不接待。没有椅子,没有水,门都是关着的。他让你站在楼梯间,不赶你,不让你坐。等到你开始怀疑该不该继续等,他来了,手扶着栏杆看你,语速不快:「时间站在我们这边。你耗得起吗?」" >> <<set $pp.nsdap.trust_21_40 to "他让你走进来一步。走廊尽头有间空屋子,他站在门口,手搭在门框上,没有坐下的意思。他说话很快,快得你在记上一句时就漏掉下一句。他叫你「你」,可你听得出来,那个「你」指的是「你们所有人」。你什么时候成了「所有人」的一员,他没问过你。" >> <<set $pp.nsdap.trust_41_60 to "他让你坐下了。椅子很硬,朝着窗户,他自己坐在对面的阴影里。他描述他向往的那个世界,词是模糊的,手势是清楚的。「他们」这个词出现的间隔越来越短,「我们」越来越长。他偶尔在一个句子末尾放轻声音,停一拍,让下一句自己走进屋里。他谈起「旧世界」,语气笃定,那个结构他早在心里拆过一遍了。" >> <<set $pp.nsdap.trust_61_80 to "他关了灯。屋里只剩窗外的光。他说:「你可以走。你走了,就永远无法确定今天是最后一天。」声音没有起伏。他陈述这个事实的方式,跟报天气预报一个调子。" >> <<set $pp.nsdap.trust_81_100 to "他没让你坐。他让你站到窗边,和他一起看外面那条街。他说:「你会记得这一刻的。」说完,目光已经越过你的头顶,落在街尽头,落在某个你还看不见、他已经看见的东西上。你站在窗边,没有离开,也没有开口。" >> <<set $pp.nsdap.fear to "NSDAP怕来不及。他怕这个世界在他准备停当之前就先塌了。他怕自己输在时机上:时机过去了,台子搭好了,台底下空了。死他不怕,他怕缺席。他怕他那些话被听见的时刻,他人不在场。话还在,席位空着,坐在那个位置上的是别人。" >> <<set $pp.nsdap.want to "NSDAP要被记住。被爱排在后面,很远。他说的每一个字都要落地生根:他造的词,别人接着用;他起的口号,酒馆里有人跟着喊;他指的方向,多年以后还有人朝那边看。他要自己成为一个不用解释的符号,人人看见都认得。他要的是时间停下时,站着的那个人是他。" >> <<set $pp.nsdap.memory to "他忘不掉那个晚上的啤酒馆。他站在台上,灯光从他身后打过来。门被推开,光照进来,满屋的脸齐刷刷转向门口。就是那一刻他要的东西:一张屋子里所有的脸,朝着同一个方向。他记的不是演讲内容。他记的是那些脖子转动的弧度,整齐得让人起鸡皮疙瘩。" >> /* ─── 军方 · Reichswehr ─── */ <<set $pp.army.trust_0_20 to "军方坐在桌子另一侧。坐姿和说话一样,没有多余的动作。回答比你预想的短,短到沉默比句子长。他不看你,看你身后某扇窗。你还没说完,他已经知道你要说什么了。他在等你走完他算好的那条路线。" >> <<set $pp.army.trust_21_40 to "他开始让你看到他的手了。讲进度的时候,他敲桌报数,一下是一下。你停顿,他等。他开始用「秩序」这个词,不加修饰,直接当结论用。桌上有一份摊开的文件,朝你那面是空白的。空白页朝你,这本身就是话。" >> <<set $pp.army.trust_41_60 to "他开始给你倒水了,用另一只杯子。提起1918年,他的语气平直,报告完一段往事就该那样平直,只是端杯子的手在半空停了停,又放下。他让你坐近些。椅子没换,他把桌上的文件往旁边挪了一格,腾出一块桌面。" >> <<set $pp.army.trust_61_80 to "他给你看了一张地图。过时的版本,边角起毛。他说:「这是我们已经走完的路。」语速均匀,背条令的语速。「我们」这个词他说出口了,分量比从前轻。身后那些名字,他没打算让你一个一个记住。" >> <<set $pp.army.trust_81_100 to "他在你面前摘下一枚勋章,放在桌面上,推到两人中间。动作很慢,一步一步。他说:「这个东西我已经戴了二十三年。」说完他看着它,过了一会儿,把它又拿起来,收进抽屉。抽屉上锁的声音很轻。" >> <<set $pp.army.fear to "军方怕他服从的东西有一天不再值得服从。他怕自己那声「是」,喊出去响亮,收回来是空的。他怕等他终于看清自己捍卫的到底是什么,已经太晚。战争他不怕。他怕的是站在一个只能接受指挥、辨认不出方向的位置上,一声令下就得动身。" >> <<set $pp.army.want to "军方要的东西报得出来:下一道命令什么时候来,从谁手里来。和平排在确定后面。他的每一步都要经得起复述:何时、何地、奉谁之命。他要站在一个不会让他后悔的人身后。他要的秩序只此一条:命令可以被质疑,质疑完了,照样执行。" >> <<set $pp.army.memory to "他忘不掉1920年卡普政变那天。他站在路口,一边喊他过去,一边喊他停下。两个方向他都没去,他站在原地,站到天黑。后来他一直无法确定:要是当时走了呢。他忘不掉的是路口的风,两边的旗,被同一阵风吹动。" >> /* ─── 魏玛 · 共和国本身 ─── */ <<set $pp.weimar.trust_0_20 to "魏玛在走廊尽头,靠着窗。你走近,他侧过身来,没有迎上来。他问:「你是来做什么的?」问完他等着,等一个他还没听过的新答案。你回答之后他没接话,转回去继续看窗外,看的位置比你想象的低。" >> <<set $pp.weimar.trust_21_40 to "他开始在你有约的日子出现在办公室里。不等谁,他自己也有个位置。他站在窗边,偶尔转头,目光在你身上停一停。他看什么,不再背着你。你说完一句话,他接得很慢,接过一个曾经听过又忘了的调子,一个音一个音往回找。" >> <<set $pp.weimar.trust_41_60 to "他开始在你说完话之后轻轻点一下头。点头归点头,他没说同意。他会在你离开时比你先站起来。理由他没讲过:他想确认自己还站得起来。他开始提一些以前不提的名字。有一次他摊开双手,掌心朝上,指尖朝你。那双手的皮肤比你的薄,薄得能看见底下走了多少年。" >> <<set $pp.weimar.trust_61_80 to "他开始喊你的名字了,用短的那个。你说话的时候他看着你的眼睛,看到完。你沉默,他也沉默,两个人都不觉得需要填。他在你面前放下一本书,书脊朝你。那本书他还在读。他在等你问讲的是什么。" >> <<set $pp.weimar.trust_81_100 to "魏玛坐在你身边了。他指着窗外:「那边有一棵树,冬天的时候我还以为它死了。」他坐了一会儿,又开口:「我已经很久没跟人说起这棵树的颜色了。我甚至不确定我跟谁说过。」他笑了一下,很短。然后他起身去添了茶,两杯。" >> <<set $pp.weimar.fear to "魏玛怕有一天醒来,任何声音都叫不醒他了。崩塌他不怕,崩塌有响动。他怕慢慢变薄,薄成一扇不再有人敲的门。他怕真的被遗忘的那天到来时,他连那个词都认不出来。他怕自己站在窗边,外面有光,他朝光走了两步,又退回来坐下。" >> <<set $pp.weimar.want to "魏玛想要有人在他开口之前,就知道他要说的哪一句。他害怕的时候,想听到「我知道你在害怕」。这句话他等了一辈子,还没等到过。他想要一个人坐在他身边,什么都不说,坐到他不再需要解释自己为什么还留在那里。他想要一个转身之后还会回来的人。回来的时候,会顺手把门带上。" >> <<set $pp.weimar.memory to "他忘不掉1918年11月9日那个下午。窗被推开,风进来,掀动了桌上的纸。他还没有名字。有人喊了一声,喊的是一个名字,那个名字还没有落到任何人头上。纸被翻到一页空白,风停了,他伸手把纸压住。那是他唯一一次觉得自己想好了要成为什么。然后有人关上窗。理由填在公文里:工作。" >>\ <</widget>> /* ─── party-personality-show:根据信任值输出文本 ─── */ <<widget "party-personality-show">>\ <<silently>> <<set _pid to $args[0]>> <<set _trust to 0>> <<if $npcs[_pid] and $npcs[_pid].trust>> <<set _trust to $npcs[_pid].trust>> <</if>> <<if _trust gte 100 and $pp[_pid].trust_100>> <<set _key to "trust_100">> <<elseif _trust lte 20>> <<set _key to "trust_0_20">> <<elseif _trust lte 40>> <<set _key to "trust_21_40">> <<elseif _trust lte 60>> <<set _key to "trust_41_60">> <<elseif _trust lte 80>> <<set _key to "trust_61_80">> <<else>> <<set _key to "trust_81_100">> <</if>> <<set $ret to $pp[_pid][_key]>> <</silently>>\ <</widget>> /* ─── party-fear / party-want / party-memory ─── */ <<widget "party-fear">>\ <<silently>> <<set $ret to ($pp[$args[0]] and $pp[$args[0]].fear) ? $pp[$args[0]].fear : "">> <</silently>>\ <</widget>> <<widget "party-want">>\ <<silently>> <<set $ret to ($pp[$args[0]] and $pp[$args[0]].want) ? $pp[$args[0]].want : "">> <</silently>>\ <</widget>> <<widget "party-memory">>\ <<silently>> <<set $ret to ($pp[$args[0]] and $pp[$args[0]].memory) ? $pp[$args[0]].memory : "">> <</silently>>\ <</widget>> /* ─── party-archive-unlock:检查档案解锁状态并更新 ─── */ <<widget "party-archive-unlock">>\ <<silently>> <<set _pid to $args[0]>> <<if not $party_archive_unlocked>> <<set $party_archive_unlocked to {}>> <</if>> <<if not $party_archive_unlocked[_pid]>> <<set $party_archive_unlocked[_pid] to { fear: false, want: false, memory: false }>> <</if>> <<if not $party_affinity_count>> <<set $party_affinity_count to {}>> <</if>> <<if not $party_aligned_count>> <<set $party_aligned_count to {}>> <</if>> <<set _af to $party_affinity_count[_pid] ? $party_affinity_count[_pid] : 0>> <<set _al to $party_aligned_count[_pid] ? $party_aligned_count[_pid] : 0>> <<if _af gte 3 and _al gte 2>> <<set $party_archive_unlocked[_pid].fear to true>> <</if>> <<if _af gte 5 and _al gte 4>> <<set $party_archive_unlocked[_pid].want to true>> <</if>> <<if _af gte 8 and _al gte 6>> <<set $party_archive_unlocked[_pid].memory to true>> <</if>> <</silently>>\ <</widget>> /* ─── party-affinity-count:事件结算后增加亲和度 ─── */ <<widget "party-affinity-count">>\ <<silently>> <<set _pid to $args[0]>> <<if not $party_affinity_count>> <<set $party_affinity_count to {}>> <</if>> <<if not $party_affinity_count[_pid]>> <<set $party_affinity_count[_pid] to 1>> <<else>> <<set $party_affinity_count[_pid] to $party_affinity_count[_pid] + 1>> <</if>> <<party-archive-unlock _pid>> <</silently>>\ <</widget>> /* ─── party-aligned-map:根据事件ID+动作映射到对应政党 ─── 用法:<<party-aligned-map deck_id action>> 在内联调用后直接 <<party-aligned-count>> 映射逻辑:红色事件的动作(sign/delegate/delay)与政党立场对应关系 */ <<widget "party-aligned-map">>\ <<silently>> <<set _pid to $args[0]>> <<set _act to $args[1]>> <<set _parties to []>> /* R01: 法比军队占领鲁尔 - sign=强硬民族主义→dnvp, delegate=外交→dvp, delay=观望→spd */ <<if _pid eq "R01">> <<if _act eq "sign">><<set _parties to ["dnvp","nsdap"]>> <<elseif _act eq "delegate">><<set _parties to ["dvp","ddp"]>> <<else>><<set _parties to ["spd"]>><</if>> /* R02: 国会授权消极抵抗 - sign=政府强硬→dvp, delegate=合作→spd, delay=观望→ddp */ <<elseif _pid eq "R02">> <<if _act eq "sign">><<set _parties to ["dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["spd"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* R03: 埃森流血事件 - sign=工人路线→kpd, delegate=谈判→spd */ <<elseif _pid eq "R03">> <<if _act eq "sign">><<set _parties to ["kpd"]>> <<elseif _act eq "delegate">><<set _parties to ["spd"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* R04/R05: 鲁尔破坏者 - sign=民族主义→dnvp, delegate=法理→ddp */ <<elseif _pid eq "R04" or _pid eq "R05">> <<if _act eq "sign">><<set _parties to ["dnvp","nsdap"]>> <<elseif _act eq "delegate">><<set _parties to ["ddp"]>> <<else>><<set _parties to ["spd"]>><</if>> /* R06: 柏林总罢工 - sign=强制→dvp, delegate=谈判→spd, delay=放任→kpd */ <<elseif _pid eq "R06">> <<if _act eq "sign">><<set _parties to ["dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["spd"]>> <<else>><<set _parties to ["kpd"]>><</if>> /* R07: DVP组阁 - sign=支持→dvp, delegate=折中→zentrum */ <<elseif _pid eq "R07">> <<if _act eq "sign">><<set _parties to ["dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["zentrum"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* R08: 结束消极抵抗 - sign=现实主义→dvp, delegate=外交→ddp */ <<elseif _pid eq "R08">> <<if _act eq "sign">><<set _parties to ["dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["ddp"]>> <<else>><<set _parties to ["spd"]>><</if>> /* R09: 全国紧急状态 - sign=军方路线→army, delegate=议会→ddp, delay=中间→zentrum */ <<elseif _pid eq "R09">> <<if _act eq "sign">><<set _parties to ["army","dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["ddp"]>> <<else>><<set _parties to ["zentrum"]>><</if>> /* R10: 巴伐利亚独裁 - sign=强硬→army, delegate=协商→ddp */ <<elseif _pid eq "R10">> <<if _act eq "sign">><<set _parties to ["dnvp","nsdap"]>> <<elseif _act eq "delegate">><<set _parties to ["zentrum"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* R11: 克姆尼茨会议 - sign=工人→kpd, delegate=中间→spd */ <<elseif _pid eq "R11">> <<if _act eq "sign">><<set _parties to ["kpd"]>> <<elseif _act eq "delegate">><<set _parties to ["spd"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* R12: 汉堡起义 - sign=镇压→army/dvp, delegate=谈判→spd */ <<elseif _pid eq "R12">> <<if _act eq "sign">><<set _parties to ["army","dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["spd"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* R13: 清除萨克森政府 - sign=军方→army */ <<elseif _pid eq "R13">> <<if _act eq "sign">><<set _parties to ["army"]>> <<elseif _act eq "delegate">><<set _parties to ["ddp"]>> <<else>><<set _parties to ["spd"]>><</if>> /* R14: 啤酒馆暴动 - sign=镇压→army, delegate=法理→ddp */ <<elseif _pid eq "R14">> <<if _act eq "sign">><<set _parties to ["army"]>> <<elseif _act eq "delegate">><<set _parties to ["ddp"]>> <<else>><<set _parties to ["dvp"]>><</if>> /* R15: 统帅堂交火 - sign=军方→army */ <<elseif _pid eq "R15">> <<if _act eq "sign">><<set _parties to ["army"]>> <<elseif _act eq "delegate">><<set _parties to ["ddp"]>> <<else>><<set _parties to ["zentrum"]>><</if>> /* R16: 地租马克发行 - sign=经济保守→dvp, delegate=中间→zentrum */ <<elseif _pid eq "R16">> <<if _act eq "sign">><<set _parties to ["dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["zentrum"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* R17: 总理下台 - sign=务实→dvp, delegate=议会→ddp */ <<elseif _pid eq "R17">> <<if _act eq "sign">><<set _parties to ["dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["ddp"]>> <<else>><<set _parties to ["spd"]>><</if>> /* S01: 全国总动员 - sign=镇压→army/dvp, delegate=谈判/救济→spd */ <<elseif _pid eq "S01">> <<if _act eq "sign">><<set _parties to ["army","dvp"]>> <<else>><<set _parties to ["spd"]>><</if>> /* S02: 多城响应 - sign=戒严/镇压→army, delegate=承认→spd/kpd */ <<elseif _pid eq "S02">> <<if _act eq "sign">><<set _parties to ["army"]>> <<else>><<set _parties to ["spd","kpd"]>><</if>> /* S03: 慕尼黑变色 - sign=镇压→army, delegate=周旋/默认→dvp/zentrum */ <<elseif _pid eq "S03">> <<if _act eq "sign">><<set _parties to ["army"]>> <<else>><<set _parties to ["dvp","zentrum"]>><</if>> /* S04: 萨克森抵抗 - sign=强攻→army, delegate=谈判→spd */ <<elseif _pid eq "S04">> <<if _act eq "sign">><<set _parties to ["army"]>> <<else>><<set _parties to ["spd","kpd"]>><</if>> /* S05: 军方结盟 - sign=清洗→dvp/zentrum, delegate=周旋→dvp */ <<elseif _pid eq "S05">> <<if _act eq "sign">><<set _parties to ["dvp","ddp"]>> <<else>><<set _parties to ["zentrum","dvp"]>><</if>> /* S06: 地租马克失效 - sign=救市→dvp, delegate=有限担保→spd */ <<elseif _pid eq "S06">> <<if _act eq "sign">><<set _parties to ["dvp"]>> <<else>><<set _parties to ["spd","zentrum"]>><</if>> /* S07: 莱茵分离 - sign=镇压→army/dvp, delegate=不承认/资助→dvp/dnvp */ <<elseif _pid eq "S07">> <<if _act eq "sign">><<set _parties to ["army","dvp"]>> <<else>><<set _parties to ["dvp","dnvp"]>><</if>> /* S08: 外长遇刺 - sign=取缔右翼/扩权→spd/ddp, delegate=只惩凶→ddp/zentrum */ <<elseif _pid eq "S08">> <<if _act eq "sign">><<set _parties to ["spd","ddp"]>> <<else>><<set _parties to ["ddp","zentrum"]>><</if>> /* S09: 黑色国防军 - sign=默许→army/dnvp, delegate=叫停/收编→ddp/zentrum */ <<elseif _pid eq "S09">> <<if _act eq "sign">><<set _parties to ["army","dnvp"]>> <<else>><<set _parties to ["ddp","zentrum"]>><</if>> /* S10: 农民拒售 - sign=征粮→spd, delegate=提价→zentrum/dvp, delay=不介入→ddp */ <<elseif _pid eq "S10">> <<if _act eq "sign">><<set _parties to ["spd"]>> <<elseif _act eq "delegate">><<set _parties to ["zentrum","dvp"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* S11: 军内密谋 - sign=清洗→spd/ddp, delegate=调离→zentrum, delay=密探→army */ <<elseif _pid eq "S11">> <<if _act eq "sign">><<set _parties to ["spd","ddp"]>> <<elseif _act eq "delegate">><<set _parties to ["zentrum","ddp"]>> <<else>><<set _parties to ["army"]>><</if>> /* S12: 协约国通牒 - sign=接受/拒绝→zentrum/spd, delegate=反方案→dvp */ <<elseif _pid eq "S12">> <<if _act eq "sign">><<set _parties to ["zentrum","spd"]>> <<else>><<set _parties to ["dvp"]>><</if>> /* S13: 新闻审查 - sign=查封→dnvp/army, delegate=起诉→ddp/zentrum, delay=不干预→ddp/spd */ <<elseif _pid eq "S13">> <<if _act eq "sign">><<set _parties to ["dnvp","army"]>> <<elseif _act eq "delegate">><<set _parties to ["ddp","zentrum"]>> <<else>><<set _parties to ["ddp","spd"]>><</if>> /* C01: 内战边缘 - sign=铁腕->army/dnvp, delegate=对话->spd/ddp */ <<elseif _pid eq "C01">> <<if _act eq "sign">><<set _parties to ["army","dnvp"]>> <<elseif _act eq "delegate">><<set _parties to ["spd","ddp"]>> <<else>><<set _parties to ["ddp"]>><</if>> /* C02: 总起义前夜 - sign=戒严镇压->army, delegate=让步->spd/kpd */ <<elseif _pid eq "C02">> <<if _act eq "sign">><<set _parties to ["army","dnvp"]>> <<elseif _act eq "delegate">><<set _parties to ["spd","kpd"]>> <<else>><<set _parties to ["zentrum"]>><</if>> /* C03: 政变前夜 - sign=默许->army/dnvp, delegate=抵抗->spd/ddp */ <<elseif _pid eq "C03">> <<if _act eq "sign">><<set _parties to ["army"]>> <<elseif _act eq "delegate">><<set _parties to ["spd","ddp"]>> <<else>><<set _parties to ["zentrum"]>><</if>> /* C04: 货币崩溃关口 - sign=强硬稳定->dvp, delegate=管制->spd */ <<elseif _pid eq "C04">> <<if _act eq "sign">><<set _parties to ["dvp"]>> <<elseif _act eq "delegate">><<set _parties to ["spd","zentrum"]>> <<else>><<set _parties to ["ddp"]>><</if>> <</if>> <<if _parties.length gt 0>> <<for _pi2 to 0; _pi2 lt _parties.length; _pi2++>> <<party-aligned-count _parties[_pi2]>> <</for>> <</if>> <</silently>>\ <</widget>> /* ─── party-aligned-count:玩家选择与政党立场一致时增加 ─── */ <<widget "party-aligned-count">>\ <<silently>> <<set _pid to $args[0]>> <<if not $party_aligned_count>> <<set $party_aligned_count to {}>> <</if>> <<if not $party_aligned_count[_pid]>> <<set $party_aligned_count[_pid] to 1>> <<else>> <<set $party_aligned_count[_pid] to $party_aligned_count[_pid] + 1>> <</if>> <<party-archive-unlock _pid>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ 满信任里程碑系统(V1) 分档:60 同盟 / 80 心声 / 100 巅峰。第一波只做 SPD 与 DNVP 内容。 ============================================================ */ /* ---------- party-trust100-init:填充各党的 100 档专属文本 ---------- 用法:StoryInit 中 party-personality-init 之后调用(幂等) */ <<widget "party-trust100-init">>\ <<set $pp.spd.trust_100 to "SPD把门关上了。门里这屋的声音,今晚只留给屋里的人。他坐到你对面,把那叠一直护着的纸推到一边。那叠纸他护了很多年,这是头一回在你面前放手。他说:「你来了。」这句话他说过千百遍,这一回是收尾。他等了那么多年,才等到这一句。他把一杯茶摆在你们中间,没有推到你手里,就放在桌上。茶凉了,他起身续水。" >> <<set $pp.dnvp.trust_100 to "DNVP抬起头,目光越过你,落在墙上那幅褪色的帝国军旗上。他没有说话,先站起来,走到窗前,把帘子拉开一道缝。然后他转过身,用那种打量老部下的目光看着你:「你走到了这里。」他把手边一个信封推到你面前,没有劝,没有求,只说:「打开之前,先想清楚你站在哪一边。是站在这份文件里,还是站在它对面。」" >> <<set $pp.kpd.trust_100 to "KPD让你坐在了他桌子的同一边。他没有递文件给你,他只是把传单推到你们中间,油墨还没干,他伸手在上面按了一下,指腹沾了点黑。他摊开手,让你看见那道墨痕。他说:「你走到这里,靠的不是想,是你亲眼看见了。」他接着把声音放轻,比任何时候都轻:「如果有一天我不在了,你还会记得你自己看见了什么吗?」他把手收回去。那道墨痕留在纸上,没干。" >> <<set $pp.ddp.trust_100 to "DDP没有约你到党部。他约你在一家旧书店见面,等你到时,他已经把店门从里面落了锁。他领你走到最里一间,桌上摊开一本批注到页边发白的宪法,每一处空白都写满了他的字。他没有推给你,只是把书稍稍转了个角度,让你看清那些字。「我一直缺一个人,肯跟我一起读它。」他说,「宪法不嫌旧,缺的是第二双读它的手。」他抬起眼,「你愿意,往后和我一起,往上面添字吗?」他没有催你回答。他重新看向那本书,指腹把下一页的空白压平了。" >> <<set $pp.dvp.trust_100 to "DVP把你让进那间深夜还亮着灯的办公室。桌上摊着一本没合上的账本,旁边压着一支用秃的笔。他没有藏,也没有合上,只是在你面前,把最底下那页翻到最上面。那页上有一行他算了很多遍、却始终不敢落笔的数字。他看了你很久,才把笔横着推到你的方向。「算错我不怕。」他说,「我怕有些东西,怎么算都算不进这一页。从前我谁都不信,只信数字。」他顿了顿,「现在,我想试试,信一个能陪我把算不清的部分,一起扛下来的人。」他没有催。那支笔,就搁在那里,等你拿。" >> <<set $pp.zentrum.trust_100 to "Zentrum没有约你在办公室见面。他让你在一座小教堂的侧厅等他。你到的时候,他正站在烛台前,手里不是念珠,是一把钥匙。他听见你进来,没有回头,只是把那把钥匙放在烛火旁,然后转过身看你。「我这一生,替共和国守了很多门。」他说,「守门的人,最怕哪一天门还好好的,门里的人走光了,只剩他一个,还点着灯。」他看着你,目光穿过烛火,「你今晚来了。灯下,多了一个人。」他把那把钥匙推向你,「这把,你留着。我守着门,你替我守着『还有人会进来』这件事。」" >> <<set $pp.nsdap.trust_100 to "NSDAP没有让你坐。他让你和他一起站到窗边,看下面那条街。天快黑了,街上的人影一个个被拉长。他没有看你,只把一只手按在你的肩上。「你会记得这一刻。」他说这句话的时候,声音没有起伏,那件事在他嘴里早就发生过了。片刻后,他松开手,指着街尽头的一个方向。「从前,我让所有人看向同一个方向。」他说,「现在我身边,多了一个人,愿意和我一起看那个方向。」他没有回头确认你还在不在。他只是站在那里,笃定你会留下。" >> <<set $pp.army.trust_100 to "军方没有让你坐在会议桌对面。他让你坐到他那张桌子的一侧,然后当着你面,把胸前那枚戴了二十三年的勋章解下来,放在你和他之间的桌面上。那个动作很慢,一步一步,像一场交接。「我这一辈子,只会做一件事:站在一个值得我站的身后。」他说,「从前我站在皇帝身后。后来我站在共和国身后,一直没敢问自己,他值不值得。」他抬起眼,「你,让我头一回想不用『奉命』两个字,凭自己站到你身后。」那枚勋章没有收回去,摆在桌面上,正对着你。" >> <<set $pp.weimar.trust_100 to "魏玛没有坐在你对面。他让你坐到他那张长椅的边上,自己坐在另一端,留出一段既不疏远、也不拥挤的距离。他指了窗外的树:「那棵,去年冬天我以为它死了。春天一到,它又发了芽。」他没有再说什么,就那么坐着。过了很久,他开口,声音很轻:「我已经很久,没有跟人说起过它了。」他转过头,看了你一眼,又移开,「你今晚没有走。我忽然觉得,那棵树的事,好像可以慢慢说。」他没有说完整件事。他只是让那扇门,在你面前,开着。" >>\ <</widget>> /* ---------- party-milestone-check:判定某党刚跨过的里程碑 ---------- 用法:<<party-milestone-check pid>> $ret=刚跨过的档名(ally/voice/peak)或空 为「once」语义:跨过即置 true,之后信任回落再升不重复触发。 */ <<widget "party-milestone-check">>\ <<silently>> <<set _pid to $args[0]>> <<set $ret to "">> <<if not $party_milestones>><<set $party_milestones to {}>><</if>> <<if not $party_milestones[_pid]>> <<set $party_milestones[_pid] to { ally: false, voice: false, peak: false, arc_offered: false, arc_state: "none" }>> <</if>> <<set _t to 0>> <<if $npcs[_pid] and $npcs[_pid].trust>><<set _t to $npcs[_pid].trust>><</if>> <<if _t gte 60 and not $party_milestones[_pid].ally>> <<set $party_milestones[_pid].ally to true>> <<set $ret to "ally">> <</if>> <<if _t gte 80 and not $party_milestones[_pid].voice>> <<set $party_milestones[_pid].voice to true>> <<if $ret eq "">><<set $ret to "voice">><</if>> <</if>> <<if _t gte 100>> <<if not $party_milestones[_pid].peak>> <<set $party_milestones[_pid].peak to true>> <<if $ret eq "">><<set $ret to "peak">><</if>> <</if>> /* DNVP 巅峰 → 进入复辟邀约状态机(拉拢/邀请) */ <<if _pid eq "dnvp" and not $party_milestones.dnvp.arc_offered and $party_milestones.dnvp.arc_state eq "none">> <<set $party_milestones.dnvp.arc_state to "pulling">> <</if>> /* KPD 巅峰 → 进入革命邀约状态机(拉拢/邀请) */ <<if _pid eq "kpd" and not $party_milestones.kpd.arc_offered and $party_milestones.kpd.arc_state eq "none">> <<set $party_milestones.kpd.arc_state to "pulling">> <</if>> /* SPD 巅峰 → 进入守护盟约(直接 offered,无光谱门槛/试炼,之后持续监督) */ <<if _pid eq "spd" and not $party_milestones.spd.arc_offered and $party_milestones.spd.arc_state eq "none">> <<set $party_milestones.spd.arc_state to "offered">> <</if>> /* DDP 巅峰 → 进入宪法之约(直接 offered,无光谱门槛/试炼,之后持续监督) */ <<if _pid eq "ddp" and not $party_milestones.ddp.arc_offered and $party_milestones.ddp.arc_state eq "none">> <<set $party_milestones.ddp.arc_state to "offered">> <</if>> /* NSDAP 巅峰 → 进入激进邀约(直接 offered,简化版无试炼,含秘密结盟) */ <<if _pid eq "nsdap" and not $party_milestones.nsdap.arc_offered and $party_milestones.nsdap.arc_state eq "none">> <<set $party_milestones.nsdap.arc_state to "offered">> <</if>> /* 军方巅峰 → 进入激进邀约(直接 offered,简化版无试炼,含秘密结盟) */ <<if _pid eq "army" and not $party_milestones.army.arc_offered and $party_milestones.army.arc_state eq "none">> <<set $party_milestones.army.arc_state to "offered">> <</if>> <</if>> /* 温和党 DVP/Zentrum:信任>=80 即进入温和盟约邀约(对标 SPD/DDP,但门槛降到80) */ <<if _pid eq "dvp" and not $party_milestones.dvp.arc_offered and $party_milestones.dvp.arc_state eq "none" and _t gte 80>> <<set $party_milestones.dvp.arc_state to "offered">> <</if>> <<if _pid eq "zentrum" and not $party_milestones.zentrum.arc_offered and $party_milestones.zentrum.arc_state eq "none" and _t gte 80>> <<set $party_milestones.zentrum.arc_state to "offered">> <</if>> <</silently>>\ <</widget>> /* ---------- party-milestone-scan:daily-tick 调用,扫描全部政党 ---------- 捕获非 party-chat 入口(审议/文件篮/区域)跨过的里程碑。 */ <<widget "party-milestone-scan">>\ <<silently>> <<set _ids to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army"]>> <<for _mdx to 0; _mdx lt _ids.length; _mdx++>> <<party-milestone-check _ids[_mdx]>> <</for>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ SPD 监督评议(先只做 SPD · 共和守护者) 信任满 100 解锁监督;解锁后信任 >=60 保持,掉到 60 以下才消失。 每天至多结算一次信任变化($spd_supervise_<y>_<m>_<d>)。 ============================================================ */ /* ---------- spd-supervise:红色事件/文件篮结果页调用 ---------- 用法:<<spd-supervise 事件ID>> (可选,红色事件传 _ev.deck_id) 依赖 $file_spd_delta(选项对 SPD 的信任增量,在 fb-render-options / apply-red-fx 捕获)。 命中 $spd_reviews[事件ID][选项文字] 则用专属评价,否则回退通用三段。 输出 $spd_review_text / $spd_review_delta。 */ <<widget "spd-supervise">>\ <<silently>> <<set _sup_evid to $args[0] ? $args[0] : "">> <<set $spd_review_text to "">> <<set $spd_review_delta to 0>> <<set _sup_key to "spd_supervise_" + $date.year + "_" + $date.month + "_" + $date.day>> <<set _spd to 0>> <<if $npcs and $npcs.spd and $npcs.spd.trust>><<set _spd to $npcs.spd.trust>><</if>> <<if _spd gte 100 and $party_milestones and $party_milestones.spd>><<set $party_milestones.spd.peak to true>><</if>> <<if $party_milestones and $party_milestones.spd and $party_milestones.spd.arc_state eq "accepted" and _spd gte 60 and not $flags[_sup_key]>> <<set _d to $file_spd_delta ? $file_spd_delta : 0>> <<set _sup_special to "">> <<if _sup_evid neq "" and $spd_reviews and $spd_reviews[_sup_evid] and $spd_reviews[_sup_evid][$opt_label]>> <<set _sup_special to $spd_reviews[_sup_evid][$opt_label]>> <</if>> <<if _sup_special neq "">> <<set $spd_review_text to _sup_special>> <<if _d gt 0>> <<set $npcs.spd.trust to Math.min(100, _spd + 1)>> <<set $spd_review_delta to 1>> <<elseif _d lt 0>> <<set $npcs.spd.trust to Math.max(0, _spd - 4)>> <<set $spd_review_delta to -4>> <</if>> <<elseif _d gt 0>> <<set $spd_review_text to "你站到了工人一边。他把这份文件压在最上面,用红笔在页边划了一道勾。他没说一个字。今晚他那里有一盏灯,是为你留的。">> <<set $npcs.spd.trust to Math.min(100, _spd + 1)>> <<set $spd_review_delta to 1>> <<elseif _d lt 0>> <<set $spd_review_text to "你背对了他。他把文件翻到背面,用铅笔写了一行很轻的字,又擦掉了。他没有开口。那句话你猜得到:「我不要你听话。我要你站在共和国这边。」">> <<set $npcs.spd.trust to Math.max(0, _spd - 4)>> <<set $spd_review_delta to -4>> <<else>> <<set $spd_review_text to "他看了这份文件很久,最后把它放在一旁。不赞成,也不反对。门留了一条缝,等你下次走进来。">> <</if>> <<set $flags[_sup_key] to true>> <</if>> <</silently>>\ <</widget>> /* ---------- ddp-supervise-review:国会开票结果页调用 ---------- 按玩家对每张他党提案的表态,与 DDP 期望方向(effects.ddp 正负)比对。 */ <<widget "ddp-supervise-review">>\ <<silently>> <<set $ddp_review_text to "">> <<set $ddp_review_delta to 0>> <<set _sup_key to "ddp_supervise_" + $date.year + "_" + $date.month + "_" + $date.day>> <<set _ddp to 0>> <<if $npcs and $npcs.ddp and $npcs.ddp.trust>><<set _ddp to $npcs.ddp.trust>><</if>> <<if _ddp gte 100 and $party_milestones and $party_milestones.ddp>><<set $party_milestones.ddp.peak to true>><</if>> <<if $party_milestones and $party_milestones.ddp and $party_milestones.ddp.arc_state eq "accepted" and _ddp gte 60 and not $flags[_sup_key]>> <<set _obey to 0>> <<set _disobey to 0>> <<for _si2 to 0; _si2 lt $session_review.opp_bills.length; _si2++>> <<set _ob to $session_review.opp_bills[_si2]>> <<set _ddpv to _ob.effects.ddp ? _ob.effects.ddp : 0>> <<set _st to $session_review.player_stances[_ob.id] ? $session_review.player_stances[_ob.id] : "abstain">> <<if _ddpv gt 0>> <<if _st eq "yes">><<set _obey to _obey + 1>> <<elseif _st eq "no">><<set _disobey to _disobey + 1>><</if>> <<elseif _ddpv lt 0>> <<if _st eq "no">><<set _obey to _obey + 1>> <<elseif _st eq "yes">><<set _disobey to _disobey + 1>><</if>> <</if>> <</for>> <<if _disobey gt 0 and _disobey gt _obey>> <<set $ddp_review_text to "散场时他站在廊柱边,没有走过来。他看你投下的每一票,一票一票地数。最后他说:「我原以为你会和宪法站在一起。原来,你只是还没找到绕开它的理由。」他转身,把那本没合上的书,轻轻带走了。">> <<set $npcs.ddp.trust to Math.max(0, _ddp - 4)>> <<set $ddp_review_delta to $npcs.ddp.trust - _ddp>> <<elseif _obey gt 0>> <<set $ddp_review_text to "散会时他在出口等你。他没有提你投的票,只说:「今晚的议会,愿意让宪法过一手的票,比我想象的多。」他递给你一支笔。往后,他把你记进那本他愿意一起批注的名单。">> <<set $npcs.ddp.trust to Math.min(100, _ddp + 1)>> <<set $ddp_review_delta to $npcs.ddp.trust - _ddp>> <</if>> <<set $flags[_sup_key] to true>> <</if>> <</silently>>\ <</widget>> /* ---------- party-supervise:通用红色事件/文件篮监督评议 ---------- 用法:<<party-supervise 派系ID 事件ID>> 如 <<party-supervise "spd" "R01">> 派系ID:spd/kpd/ddp/dvp/zentrum/dnvp/nsdap/army/weimar(九势力)。 信任增量来源:$file_party_deltas[派系ID](apply-red-fx/fb-apply-effects 全派系捕获), 回退旧字段 $file_<派系>_delta。 2026-10-02 用户定稿(声音治理): - 【只有盟约势力开口】($party_milestones.arc_state=accepted 且信任≥60); 未立约势力一律沉默(信任变化只在数值行与侧边栏体现)。 - 【红色/暗涌事件(deck 以 R/S 开头)只走专属评价表】:命中则用专属评价并微调 信任(+1/-4);未命中(含该势力根本没有评价表)不开口,绝不落通用三段。 - 非红色事件(文件篮等):盟约势力按通用三段(赞成/反对/中立)点评并微调信任; (2026-10-02 复读治理扩池:每势力每方向 4 条,pool-pick 轮转取句防连刷; weimar 没有里程碑条目、此路暂不会开口,池仅存原句备用。) 输出 $party_review_text / $party_review_delta(text 空串=本次不开口)。 每日一次限制:非红色事件共用一个当日 flag,一天只点评一次; 红色事件不受当日额度限制(单结算页上限由 party-review-loop 控制)。 */ <<widget "party-supervise">>\ <<silently>> <<set _ps_pid to $args[0] ? $args[0] : "spd">> <<set _ps_evid to $args[1] ? $args[1] : "">> <<set _ps_exception to (_ps_evid.indexOf("R") eq 0 or _ps_evid.indexOf("S") eq 0)>> <<set $party_review_text to "">> <<set $party_review_delta to 0>> <<set _ps_key to _ps_pid + "_supervise_" + $date.year + "_" + $date.month + "_" + $date.day>> <<set _ps_trust to 0>> <<if $npcs[_ps_pid] and $npcs[_ps_pid].trust>><<set _ps_trust to $npcs[_ps_pid].trust>><</if>> <<if _ps_trust gte 100 and $party_milestones and $party_milestones[_ps_pid]>><<set $party_milestones[_ps_pid].peak to true>><</if>> /* 本次事件对该势力的信任增量(全派系捕获,回退旧单派系字段) */ <<set _ps_d to ($file_party_deltas and $file_party_deltas[_ps_pid]) ? $file_party_deltas[_ps_pid] : 0>> <<if _ps_d eq 0>> <<set _ps_df to "file_" + _ps_pid + "_delta">> <<if State.variables[_ps_df]>><<set _ps_d to State.variables[_ps_df]>><</if>> <</if>> <<set _ps_arc to ($party_milestones and $party_milestones[_ps_pid] and $party_milestones[_ps_pid].arc_state eq "accepted" and _ps_trust gte 60)>> /* 出口一(唯一):盟约势力按规则点评;未立约势力一律沉默(2026-10-02 用户定) */ <<if _ps_arc and (not $flags[_ps_key] or _ps_exception)>> <<set _ps_reviews to State.variables[_ps_pid + "_reviews"]>> <<set _ps_special to "">> <<if _ps_evid neq "" and _ps_reviews and _ps_reviews[_ps_evid] and _ps_reviews[_ps_evid][$opt_label]>> <<set _ps_special to _ps_reviews[_ps_evid][$opt_label]>> <</if>> /* 通用三段声音池(2026-10-02 复读治理扩池):每势力每方向 pool[0]=原句,后接新句; 取句用 pool-pick 轮转(打完一圈才重复)。weimar 无里程碑条目、此路暂不开口,池仅存原句。 */ <<if _ps_pid eq "ddp">> <<set _ps_pos_pool to ["你守住了宪法。他把那本批注得发白的书,在你面前翻开,用手指轻敲了一行字。他没有说破。这条线他等你守,等了很多年。","「程序没破。」他把那页纸举到灯下看了看,像验一枚成色十足的金币。","「今天这一步,我替你记进判例里了。」他说,「往后谁想抄近道,我就翻给他们看。」","他把批复誊抄了一份,压进那摞最厚的卷宗。「程序站住脚的次数越多,它就越结实。」"]>> <<set _ps_neg_pool to ["你越过了那条线。他没有开口,只是把宪法合上,放回书架最高一层。动作很轻。他把国家最后的指望,也一起收起来了。","他把条例翻到折角的那一页,推给你。「你自己看。你嫌它慢的时候,别人正嫌它碍事。」","「先例是你开的。」他把笔帽扣上,「第二个越过线的人,会踩着你签的字。」","那天他把办公室的窗帘拉上了一半。他想借给你的那半边光,暂时收了回去。"]>> <<set _ps_neu_pool to ["他看了你很久,最后把书签夹回去,合上书。不赞许,也不责备。那条待你守住的分界,他又默念了一遍。","「我记下了。」他说。他的记性,比任何抗议都长。","他把文件放在字典上压了一夜。第二天还你的时候,页是平的,话也是平的。","他指了指页边那行小字:依据。两个字他念得很轻,像是怕惊动它。"]>> <<elseif _ps_pid eq "dvp">> <<set _ps_pos_pool to ["你走得稳。他把面前那份文件往里推了推,给你留出位置。他没说褒奖的话,只说了句「国家经不起你再走错一步了」。这话从他嘴里出来,比任何夸奖都重。","他难得倒了杯酒,推到你面前。「这一单,做得不亏心。」","他签了字,又多签了一份副本。「这份我带走,给账房们看。他们该学学什么叫止损。」","「照这个走法,」他把报表翻过来给你看,「到年底,账面上还能剩下个国家。」"]>> <<set _ps_neg_pool to ["他听完,没说话,只是低头把翻到一半的账本合上。过了好一会儿,才开口:「我以为你至少算得清,这一步会推倒多少。」他没有发火。那盏灯,明晚不一定还为你亮。","「赤字是会走路的。」他说,「你现在领着它,正往我们家门口走。」","他只问了一句「几时回本」。你答不上来。他也不再问,只把怀表合上了。","「又透支。」他把文件推回来,指尖点在落款处,「这一页,用的是谁的本钱?」"]>> <<set _ps_neu_pool to ["他看了你一眼,没打算多说。只是把那份文件折了折,放回抽屉。既没盖章,也没撕掉。他还在等一个更稳妥的你。","他把数字从头到尾核了一遍,一个叉没画。没画叉,在他那里就是还没定论。","「这笔账我先挂着。」他说。挂着的账,是生意人给一个体面人留的余地。","他起身告辞时说了句「再看看」。生意人说再看看,就是在等价码自己落下来。"]>> <<elseif _ps_pid eq "kpd">> <<set _ps_pos_pool to ["你替工人争了一寸。他把传单折好收进兜里。他不谢你,他记下了这一寸。","他朝你偏了一下头,算是行礼。「你以为你只是让了一步。街上的工人知道,那是他们赢的一步。」","他把你的名字用铅笔写在一份名单的边上。那上面记的从来不是好人,是肯干活的人。","「工人们今晚多了半顿饭。」他说。说完他把帽子扣上,回街里去了。"]>> <<set _ps_neg_pool to ["「资产者的书记员。」他把传单拍在桌上,转身走了。门没摔,比摔了更响。","他隔着桌子看你,像看一份过期的判决书。「字改得再体面,印章还是那一个。」","「改良的甜头,」他说,「是绳套上系的糖。」他把文件还回来,纸角捏得发潮。","他站起来就走,一路没回头。走廊里那句「下次也这样吗」,是从隔壁屋里传出来的。"]>> <<set _ps_neu_pool to ["他扫了文件一眼,什么也没说。在他那里,不骂已经是克制。","他坐满了整段会面的时间,一个字没说。能坐到底,算是他给过的台阶。","他走之前把你桌上的文件码齐了。齐得像在操练。你说不好这是好意还是习惯。","「我带回去了。」他没说带回哪里。有些去处,说出来就没了用处。"]>> <<elseif _ps_pid eq "zentrum">> <<set _ps_pos_pool to ["他把文件收好,声音不高:「稳妥。愿这稳当能多走几年。」","他画了一个很小的十字,落在页边。「但愿这一步走得直。」","「两头都还稳着。」他朝教堂的方向抬了抬下巴,又朝总理府,「愿它一直这样。」","他起身时把椅子往桌下推齐了。「屋子里各归各位,日子就还过得下去。」"]>> <<set _ps_neg_pool to ["他摘下眼镜,擦了很久。「你急了。这栋房子经不起谁急。」","「房子在晃,你还在往上加层。」他把公文包扣上,搭扣响得很重。","他没说重话。只是那晚的晚祷,比平时长了一刻钟。","「有人夜里睡不着了。」他说。说的是谁,他没讲,讲了你更睡不着。"]>> <<set _ps_neu_pool to ["他把文件看了两遍,放下,不置可否。","「我看见了。」他只说了这三个字。在他们那里,看见本身就意味着记下了。","他把文件搁在案头那本厚书旁边,让它们各待各的位置。","他起身告辞,走到门口又回头补了一句:「天主看得见,人也要看得见。」"]>> <<elseif _ps_pid eq "dnvp">> <<set _ps_pos_pool to ["「勉强像个样子。」他从鼻子里出了口气。在他的字典里,这已经是嘉奖。","他把文件压进那摞最旧的公文底下。「字还算写得规矩。」","他难得站着听完了。「你的祖父若在,大概不会骂这页纸。」","「今日之举,尚存几分旧家的体面。」他说完这句,便端起茶来,不再多话。"]>> <<set _ps_neg_pool to ["他连文件都没接。他看你的眼神,像看一件放错了地方的家具。","他转身之前,用指尖掸了掸袖口。那里并没有灰。","「共和的算术。」他只说了这四个字,像念一个死对头的名字。","「祖上的田庄,就是这么一亩一亩典出去的。」他指了指文件,「也是这样开始的。」"]>> <<set _ps_neu_pool to ["他扫了一眼,哼了一声,没有看第二眼。","他让副官代收。副官的手比他的软,他站在原地看着那只手接完。","他把文件搁在窗台上,压上一枚旧帝国的鹰徽。何时取,看他何时高兴。","「留着吧。」他说。留下来的东西,在他的屋子里分两种:迟早用的,和懒得扔的。"]>> <<elseif _ps_pid eq "nsdap">> <<set _ps_pos_pool to ["他把文件抄了一份塞进怀里。他只抄对他有用的那半页。","「很聪明。」他说。这句话既是夸奖,也像是提前点名。","他要把这一页带回去念给自己的集会听。他念的时候不会提你的名字,只提那句对他有用的话。","「等着瞧,」他收起文件的时候说,「下一个讲台,会比这个大得多。」"]>> <<set _ps_neg_pool to ["他当着你的面把文件撕了。「旧国家的纸,擦不净旧国家的血。」","他在你的名字旁边画了一道很轻的线。他们的名单,都是从这样一道线开始的。","他笑着听你讲完,然后问了一个和内容无关的问题:「你家里,几口人?」","「写得多认真。」他把手在文件上按了按,「将来抄证词的时候,这一页会很好用。」"]>> <<set _ps_neu_pool to ["他盯着你看了三秒,笑了。那笑不达眼底。","他走的时候朝你抬了抬帽檐。礼数给得越足,后头的账磨得越利。","他把你的文件对光看了看,像看钞票的真伪。看完还给你,连折痕都对得整整齐齐。","「你还会再见我的。」他说。这不是威胁,是日程。"]>> <<elseif _ps_pid eq "army">> <<set _ps_pos_pool to ["他看完全文,只说了两个字:「可以。」对军方而言,这是担保。","他签得又快又重。「这一页纸,比国会一星期的吵嚷都管用。」","他起身时朝你行了个短礼。「先生,这份文件配得上肩章。」","「命令清楚,责任清楚。」他把文件对折收好,「这样的纸,部队认。」"]>> <<set _ps_neg_pool to ["他把文件推回来,压得很平。「秩序不是这么维护的,先生。」","「先生,」他只叫了你一声先生。军礼行得一丝不苟,门在你身后合得很轻。","他从头到尾没有碰那份文件。军官的手,不碰不打算执行的命令。","「后备方案。」他临走时留了三个字。内容没有说,他也没打算说。"]>> <<set _ps_neu_pool to ["他看完,点了一下头,走了。军靴声比话多。","他站着听完全程,一个字没说。走的时候,腰上的钥匙串响了一下。","他在日程本上记下一个时间,没写事由。没写事由的时间,通常是留给大事的。","「记录在案。」他说。军方说这四个字的时候,语气和盖印差不多。"]>> <<elseif _ps_pid eq "weimar">> <<set _ps_pos_pool to ["那天晚上,办公室的灯多亮了一小时。你听见他在里屋翻纸的声音,轻快了一点。"]>> <<set _ps_neg_pool to ["他没说什么。只是那天晚上的报纸,他读得特别慢。"]>> <<set _ps_neu_pool to ["他把文件收进卷宗。第十一份了,他数着。"]>> <<else>> <<set _ps_pos_pool to ["你站到了工人一边。这份文件他压在了最上面,页边用红笔划了一道勾。他没说一个字。今晚他那里,有一盏灯是为你留的。","你把最重的那副担子接了过去。他没道谢,只是那晚的会散得比平时早——工人们回去得早,吃得上一口热的。","他把你签的那一页念给了工友听。不加一个字,不减一个字。在他那里,这比任何握手都郑重。","「这一步,多少工人在看着。」他把帽子往桌上一放,「他们不问你怎么想的,只问你把他们放在哪。」"]>> <<set _ps_neg_pool to ["你背对了他。他把文件翻到背面,用铅笔写了一行很轻的字,又擦掉了。那句话他咽回去了:「我不要你听话。我要你站在共和国这边。」","他把当天的党报折成一整版,压在你的文件底下。「群众要问的。你最好想好,哪一版给报纸,哪一版给街上。」","「又是忍。」他说。这个字他说得又轻又平,像在念一份念过太多遍的讣告。","那天他没来办公室。送来一张字条:工人们在问,共和国欠下的那一页,几时翻过去。"]>> <<set _ps_neu_pool to ["他把这份文件看了很久,放在一旁。不赞成,也不反对。门给他留了条缝,等你哪天自己走进来。","他读完了全部,连页脚的小字也没放过。读完,抬眼看你,等你自己先开口。","「我记下了。」他把文件码进那一摞最厚的卷宗里。那一摞,谁的事都在里面。","临走时他把椅子摆正了。像是替你收拾屋子,也像是在提醒你,屋子里还住着别人。"]>> <</if>> <<if _ps_special neq "">> <<set $party_review_text to _ps_special>> <<if _ps_arc>> <<if _ps_d gt 0>> <<set $npcs[_ps_pid].trust to Math.min(100, _ps_trust + 1)>> <<set $party_review_delta to $npcs[_ps_pid].trust - _ps_trust>> <<elseif _ps_d lt 0>> <<set $npcs[_ps_pid].trust to Math.max(0, _ps_trust - 4)>> <<set $party_review_delta to $npcs[_ps_pid].trust - _ps_trust>> <</if>> <</if>> <<elseif (not _ps_exception) and _ps_d gt 0>> <<set _pool to _ps_pos_pool>> <<pool-pick "voice_" _ps_pid "_pos">> <<set $party_review_text to $pool_pick>> <<if _ps_arc>> <<set $npcs[_ps_pid].trust to Math.min(100, _ps_trust + 1)>> <<set $party_review_delta to $npcs[_ps_pid].trust - _ps_trust>> <</if>> <<elseif (not _ps_exception) and _ps_d lt 0>> <<set _pool to _ps_neg_pool>> <<pool-pick "voice_" _ps_pid "_neg">> <<set $party_review_text to $pool_pick>> <<if _ps_arc>> <<set $npcs[_ps_pid].trust to Math.max(0, _ps_trust - 4)>> <<set $party_review_delta to $npcs[_ps_pid].trust - _ps_trust>> <</if>> <<elseif not _ps_exception>> <<set _pool to _ps_neu_pool>> <<pool-pick "voice_" _ps_pid "_neu">> <<set $party_review_text to $pool_pick>> <</if>> /* 红色/暗涌事件未命中专属表:以上分支全不命中 → text 保持空串 = 开不了口 */ <<if not _ps_exception>><<set $flags[_ps_key] to true>><</if>> <</if>> <</silently>>\ <</widget>> /* ---------- party-review-loop:结算页统一点评循环(九势力) ---------- 用法:<<party-review-loop _ev.deck_id>> 2026-10-02 声音治理: - 只有盟约势力会开口(门槛在 party-supervise 内部:arc accepted + 信任≥60); - 红色/暗涌事件只走专属评价表,无台词不开口; - 【单页上限 2 块】:有话的势力按 |信任增量| 从大到小取前 2 块全文, 其余压成一行「旁听席」灰字摘要(不引原文;信任微调已各自生效)。 SPD/DDP 沿用各自既有配色,其余势力用通用 .party-note 样式; 声音块折叠(2026-10-02 用户定):details/summary 默认收起成一行, 只露「势力名 的声音(信任±N)」,点开展开全文;旁听席摘要行保持原样。 */ <<widget "party-review-loop">>\ <<silently>> <<set _prl_evid to $args[0] ? $args[0] : "">> <<set _prl_ids to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap","army","weimar"]>> <<set _prl_names to {spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方", weimar:"魏玛"}>> <<set _prl_texts to {}>> <<set _prl_rdeltas to {}>> <<set _prl_cands to []>> <<set _prl_picked to {}>> /* 第一遍:逐势力跑 party-supervise(内部自行把关),有话的记为候选 */ <<for _prl_i to 0; _prl_i lt _prl_ids.length; _prl_i++>> <<set _prl_id to _prl_ids[_prl_i]>> <<set _prl_d to ($file_party_deltas and $file_party_deltas[_prl_id]) ? $file_party_deltas[_prl_id] : 0>> <<if _prl_d neq 0>> <<party-supervise _prl_id _prl_evid>> <<if $party_review_text neq "">> <<set _prl_texts[_prl_id] to $party_review_text>> <<set _prl_rdeltas[_prl_id] to $party_review_delta>> <<set _prl_cands.push(_prl_id)>> <</if>> <</if>> <</for>> /* 第二遍:按 |信任增量| 取前 2 名进全文 */ <<for _prl_round to 0; _prl_round lt 2; _prl_round++>> <<set _prl_best to "">> <<set _prl_bestv to 0>> <<for _prl_k to 0; _prl_k lt _prl_cands.length; _prl_k++>> <<set _prl_c to _prl_cands[_prl_k]>> <<if (not _prl_picked[_prl_c]) and Math.abs($file_party_deltas[_prl_c]) gt _prl_bestv>> <<set _prl_bestv to Math.abs($file_party_deltas[_prl_c])>> <<set _prl_best to _prl_c>> <</if>> <</for>> <<if _prl_best neq "">><<set _prl_picked[_prl_best] to true>><</if>> <</for>> /* 摘要名单:候选里没挤进前 2 的 */ <<set _prl_rest to "">> <<for _prl_k to 0; _prl_k lt _prl_cands.length; _prl_k++>> <<set _prl_c to _prl_cands[_prl_k]>> <<if not _prl_picked[_prl_c]>> <<set _prl_rest to _prl_rest + (_prl_rest eq "" ? "" : "、") + _prl_names[_prl_c]>> <</if>> <</for>> <</silently>>\ <<nobr>><<for _prl_i to 0; _prl_i lt _prl_ids.length; _prl_i++>> <<capture _prl_i>> <<set _prl_id to _prl_ids[_prl_i]>> <<if _prl_picked[_prl_id]>> <<set _prl_cls to (_prl_id eq "spd" or _prl_id eq "ddp") ? _prl_id : "party">> <<set _prl_h to '<details class="' + _prl_cls + '-note voice-fold"><summary><span class="' + _prl_cls + '-note-tag">' + _prl_names[_prl_id] + ' 的声音</span>'>> <<if _prl_rdeltas[_prl_id] neq 0>> <<set _prl_h to _prl_h + '<span class="' + _prl_cls + '-note-delta">(' + _prl_names[_prl_id] + '信任' + (_prl_rdeltas[_prl_id] gt 0 ? '+' : '') + _prl_rdeltas[_prl_id] + ')</span>'>> <</if>> <<set _prl_h to _prl_h + '</summary><div class="voice-body">' + _prl_texts[_prl_id] + '</div></details>'>> <<print _prl_h>> <</if>> <</capture>> <</for>> <<if _prl_rest neq "">> <div class="party-note"><span class="party-note-tag">旁听席</span>_prl_rest 也在场。反应各自收下了,没有说出口。</div> <</if>><</nobr>>\ /* 点评已展示,清空增量账本,防残留漏进下一个无关结算页 */ <<set $file_party_deltas to {}>>\ <</widget>> /* ---------- party-reviews-rekey:专属评价表按位重挂(启动时跑一次) ---------- 2026-10-02 用户定「红色事件全部定制」后,表键必须与现行选项文字严格一致。 实测:改稿润色过选项文字后三份表 46/95 键已漂移(如「全面消极抵抗」→「实施全面消极抵抗」)。 本 widget 在启动时把每份表的键按 $red_opts 现行顺序重挂—— 【按位】的依据(已验证):147 处命中键全部与选项同位;46 处漂移键全部为原地改词 (同位字符相似度恒为最优,无一串位)。此后改稿再润色选项文字,表键自动跟随,无需手工同步。 用法:<<party-reviews-rekey>>(15_init_parties 在三份 reviews-init 之后调用) */ <<widget "party-reviews-rekey">>\ <<silently>> <<set _rk_parties to ["spd","ddp","dvp"]>> <<for _rk_i to 0; _rk_i lt _rk_parties.length; _rk_i++>> <<set _rk_id to _rk_parties[_rk_i]>> <<set _rk_table to State.variables[_rk_id + "_reviews"]>> <<if _rk_table>> <<set _rk_rids to Object.keys($red_opts)>> <<for _rk_j to 0; _rk_j lt _rk_rids.length; _rk_j++>> <<set _rk_rid to _rk_rids[_rk_j]>> <<set _rk_entry to _rk_table[_rk_rid]>> <<if _rk_entry>> <<set _rk_opts to $red_opts[_rk_rid]>> <<set _rk_keys to Object.keys(_rk_entry)>> <<if _rk_keys.length eq _rk_opts.length>> <<set _rk_new to {}>> <<for _rk_k to 0; _rk_k lt _rk_opts.length; _rk_k++>> <<set _rk_new[_rk_opts[_rk_k].label] to _rk_entry[_rk_keys[_rk_k]]>> <</for>> <<set _rk_table[_rk_rid] to _rk_new>> <</if>> <</if>> <</for>> <</if>> <</for>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ SPD 阶段性监督点评(金色独立段落,办公室显示) SPD 信任高时会根据共和国/外部数值的极端,周期性地冒一句。 每个方向只触发一次(once),数值回落再升不重复。 ============================================================ */ /* ---------- spd-monitor:计算 SPD 阶段性点评 ---------- 用法:<<spd-monitor>> 输出 $spd_note_line(空串则不显示) 触发条件(信任满 100 解锁,解锁后 >=60 保持;每次只触发一次): - 国际信任极低(<15)或极高(>85) - 民主信任极低(<25) - 军队依赖极高(>70) - 某敌对党(右/左极端)信任极高(>80) - 共和国 gov_trust 极低(<20) */ <<widget "spd-monitor">>\ <<silently>> <<set $spd_note_line to "">> <<if not $spd_notes>><<set $spd_notes to {}>><</if>> <<set _spdm_spd to 0>> <<if $npcs and $npcs.spd and $npcs.spd.trust>><<set _spdm_spd to $npcs.spd.trust>><</if>> <<if _spdm_spd gte 100 and $party_milestones and $party_milestones.spd>><<set $party_milestones.spd.peak to true>><</if>> <<if $party_milestones and $party_milestones.spd and $party_milestones.spd.arc_state eq "accepted">> <<if $party_milestones.spd.peak and _spdm_spd gte 60 and $weimar.mid.intl_trust lte 15 and not $spd_notes.intl_low>> <<set $spd_notes.intl_low to true>> <<set $spd_note_line to "「外面的人,越来越不信我们了。国债跌、法郎谈判僵、报纸上尽是冷话。」他顿了顿,「我不是要你讨好他们。我只是要你记住,共和国欠着这个世界,也欠着自己。」">> <</if>> <<if $party_milestones.spd.peak and _spdm_spd gte 60 and $weimar.mid.intl_trust gte 85 and not $spd_notes.intl_high>> <<set $spd_notes.intl_high to true>> <<set $spd_note_line to "「国际上的信任,难得地缓了一口气。别浪费它。」他说,「这一口气,是拿来还债、修路、让工人有口饭吃的,不是拿来给谁脸上贴金。」">> <</if>> <<if $party_milestones.spd.peak and _spdm_spd gte 60 and $weimar.mid.democracy_trust lte 25 and not $spd_notes.dem_low>> <<set $spd_notes.dem_low to true>> <<set $spd_note_line to "「民主的信,正在从共和国身上抽走。」他低声道,「敌人没偷。是我们自己一点点吓走的。每签一道绕过议会的令,共和国的曾孙就少一分。」">> <</if>> <<if $party_milestones.spd.peak and _spdm_spd gte 60 and $weimar.mid.army_dependence gte 70 and not $spd_notes.army_high>> <<set $spd_notes.army_high to true>> <<set $spd_note_line to "「你越来越靠军队了。」他说这话时没有责备,只有疲惫,「军队那盏灯,是共和国在黑夜里借来的,天亮前就得还。你打算,什么时候还?」">> <</if>> <<if $party_milestones.spd.peak and _spdm_spd gte 60 and $world.gov_trust lte 20 and not $spd_notes.gov_low>> <<set $spd_notes.gov_low to true>> <<set $spd_note_line to "「共和国在很多柏林人眼里,已经是一张旧饭票了。」他望着窗外,「我不是要你救他。我是要你,别让他死在你看得见的地方。」">> <</if>> <<if $party_milestones.spd.peak and _spdm_spd gte 60 and $npcs.dnvp.trust gte 80 and not $spd_notes.dnvp_high>> <<set $spd_notes.dnvp_high to true>> <<set $spd_note_line to "「你最近,和 DNVP 走得很近。」他语气平静,平静得反常,「他是要拆共和国的人。你站在他身边的时候,是打算替他扶梯子,还是打算拦他?」">> <</if>> <<if $party_milestones.spd.peak and _spdm_spd gte 60 and $npcs.kpd.trust gte 80 and not $spd_notes.kpd_high>> <<set $spd_notes.kpd_high to true>> <<set $spd_note_line to "「你往 KPD 那边去了。」他说,「他们要烧掉的是整栋楼。你同他们一起站在楼下的时候,是想救火,还是想看着共和国塌?」">> <</if>> <</if>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ DDP 阶段性监督点评(冷蓝紫独立段落,办公室显示) DDP 信任满 100 解锁;解锁后 >=60 保持,掉到 60 以下才消失。 他会根据共和国/宪法相关的极端数值,周期性地冒一句。 每个方向只触发一次(once)。 ============================================================ */ /* ---------- ddp-monitor:计算 DDP 阶段性点评 ---------- 用法:<<ddp-monitor>> 输出 $ddp_note_line(空串则不显示) 触发条件(信任满 100 解锁,解锁后 >=60 保持;每次只触发一次): - 民主信任极低(<25):宪法正当性被掏空 - 军队依赖极高(>70):军队越权干政 - 政府信任极低(<20):法治信用崩塌 - 某敌对党(右/左极端)信任极高(>80):图谋废法 - 国际信任回落(<30):共和国失信于外 */ <<widget "ddp-monitor">>\ <<silently>> <<set $ddp_note_line to "">> <<if not $ddp_notes>><<set $ddp_notes to {}>><</if>> <<set _ddpm_ddp to 0>> <<if $npcs and $npcs.ddp and $npcs.ddp.trust>><<set _ddpm_ddp to $npcs.ddp.trust>><</if>> <<if _ddpm_ddp gte 100 and $party_milestones and $party_milestones.ddp>><<set $party_milestones.ddp.peak to true>><</if>> <<if $party_milestones and $party_milestones.ddp and $party_milestones.ddp.arc_state eq "accepted">> <<if $party_milestones.ddp.peak and _ddpm_ddp gte 60 and $weimar.mid.democracy_trust lte 25 and not $ddp_notes.dem_low>> <<set $ddp_notes.dem_low to true>> <<set $ddp_note_line to "「民主的信,正在从共和国身上抽走。」他低声道,「敌人没偷。是我们自己一点点吓走的。每签一道绕过议会的令,宪法就薄一分。你听见了吗,那翻书的声音,快比翻墙的声音小了。」">> <</if>> <<if $party_milestones.ddp.peak and _ddpm_ddp gte 60 and $weimar.mid.army_dependence gte 70 and not $ddp_notes.army_high>> <<set $ddp_notes.army_high to true>> <<set $ddp_note_line to "「军队的分量,在你的案头一天天变重。」他说这话时没有责备,只有疲惫,「军队那盏灯,是共和国借来的,天亮前就得还。我怕的是你一直不还,等他数清了门锁,就以为自己是主人。」">> <</if>> <<if $party_milestones.ddp.peak and _ddpm_ddp gte 60 and $world.gov_trust lte 20 and not $ddp_notes.gov_low>> <<set $ddp_notes.gov_low to true>> <<set $ddp_note_line to "「街上的人提起共和国,语气已经像在提一件过期的租约。」他望着窗外,「面子你不必救。我要你守住他那本还没被撕完的宪法。只要宪法还在,就还有人愿意信他。」">> <</if>> <<if $party_milestones.ddp.peak and _ddpm_ddp gte 60 and $npcs.dnvp.trust gte 80 and not $ddp_notes.dnvp_high>> <<set $ddp_notes.dnvp_high to true>> <<set $ddp_note_line to "「你最近,和 DNVP 走得很近。」他语气平静,「他想要的是拆掉整间屋子的梁,再换一根更粗的。你若站在他身边,是打算替他扶,还是打算拦?」">> <</if>> <<if $party_milestones.ddp.peak and _ddpm_ddp gte 60 and $npcs.kpd.trust gte 80 and not $ddp_notes.kpd_high>> <<set $ddp_notes.kpd_high to true>> <<set $ddp_note_line to "「你往 KPD 那边去了。」他说,「他们要烧的是整栋屋子的地基。你同他们站在楼下,是想救火,还是想看着共和国塌了,再从头砌一栋?」">> <</if>> <<if $party_milestones.ddp.peak and _ddpm_ddp gte 60 and $weimar.mid.intl_trust lte 30 and not $ddp_notes.intl_low>> <<set $ddp_notes.intl_low to true>> <<set $ddp_note_line to "「外面的人,正一个一个把弦从共和国身上解下来。」他说,「条约、赔款、法郎,都写在纸上,都是规矩。你守得住国内的法,守不住国外一场又一场的失信。我怕的是,有一天连我们自己,也觉得守法是件过时的事。」">> <</if>> <</if>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ SPD 敌对地盘提醒(金色独立段落) 玩家去激进/威权党派地盘(DNVP/KPD/军方/NSDAP)时, SPD 在远处跳一句提醒,像一个在路口看着你走错方向的人。 只触发一次(once)。 ============================================================ */ /* ---------- spd-region-watch:敌对地盘提醒 ---------- 用法:<<spd-region-watch "dnvp">> 输出 $spd_note_line(空串则不显示) 在 Scene_Visit_XX 中调用。信任满 100 解锁,解锁后 >=60 保持。 */ <<widget "spd-region-watch">>\ <<silently>> <<set $spd_note_line to "">> <<set _spdr_zone to $args[0]>> <<if not $spd_region_notes>><<set $spd_region_notes to {}>><</if>> <<set _spdr_spd to 0>> <<if $npcs and $npcs.spd and $npcs.spd.trust>><<set _spdr_spd to $npcs.spd.trust>><</if>> <<set _spdr_key to _spdr_zone + "_" + $date.year + "_" + ($date.month * 2 + Math.floor($date.day / 15))>> <<if _spdr_spd gte 100 and $party_milestones and $party_milestones.spd>><<set $party_milestones.spd.peak to true>><</if>> <<if $party_milestones and $party_milestones.spd and $party_milestones.spd.arc_state eq "accepted" and _spdr_spd gte 60 and not $spd_region_notes[_spdr_zone]>> <<set $spd_region_notes[_spdr_zone] to true>> <<if _spdr_zone eq "dnvp">> <<set _spdr_text to "你站在帝国旗旁边的时候,我就在街对面看着。你听他问「谁是这片土地的主人」的时候,有没有想过,他嘴里那块土地,没有你。」他顿了顿,「也没有工人。」">> <<elseif _spdr_zone eq "kpd">> <<set _spdr_text to "你走进那间没挂牌子的屋子的时候,我在威丁的街角看着你。他们是要烧掉共和国的人。你进去,是想救火,还是想看着他塌?」这话他没说出口,但你出《红旗》报社时,他就在报摊旁,把一份传单折了起来。">> <<elseif _spdr_zone eq "army">> <<set _spdr_text to "你走进军部大门的时候,他就在蒂尔加滕的树荫下站着。你没看见他,但他看见你了。后来有人告诉我,他站了很久,才转身离开。">> <<elseif _spdr_zone eq "nsdap">> <<set _spdr_text to "你进那间啤酒馆的时候,他就在街对面,隔着一条马路看着那扇门。他没有跟进去。他只是把帽子压低了,像不想让任何人,把你也认成那一边的人。">> <</if>> <<set $spd_note_line to _spdr_text>> <</if>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ DNVP 投名状 · 背叛代价(自断后路) 走 DNVP 复辟线 = 出卖共和国利益换取右翼关注。 按程度扣魏玛信任、扣保共和各党信任、牺牲共和数值。 ============================================================ */ /* ---------- dnvp-betray-penalty:应用投名状的背叛代价 ---------- 用法:<<dnvp-betray-penalty N>> N=程度(1轻 2中 3重) 统一扣:魏玛信任 -4N、SPD -3N、DDP/KPD/Zentrum -2N、 共和 gov_trust -2N、政治暴力 +2N、玩家理想 -3N */ <<widget "dnvp-betray-penalty">>\ <<silently>> <<set _bp_sev to $args[0] ? $args[0] : 1>> <<set _bp_wei to 4 * _bp_sev>> <<set _bp_spd to 3 * _bp_sev>> <<set _bp_mid to 2 * _bp_sev>> <<set $npcs.weimar.trust to Math.max(0, $npcs.weimar.trust - _bp_wei)>> <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - _bp_spd)>> <<set $npcs.ddp.trust to Math.max(0, $npcs.ddp.trust - _bp_mid)>> <<set $npcs.kpd.trust to Math.max(0, $npcs.kpd.trust - _bp_mid)>> <<set $npcs.zentrum.trust to Math.max(0, $npcs.zentrum.trust - _bp_mid)>> <<set $world.gov_trust to Math.max(0, $world.gov_trust - _bp_mid)>> <<set $world.political_violence to Math.min(100, $world.political_violence + _bp_mid)>> <<set $player.mental.idealism to Math.max(0, $player.mental.idealism - 3 * _bp_sev)>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ KPD 革命线 · 背叛代价(自断后路) 走 KPD 革命线 = 推动推翻共和国,换取革命力量信任。 按程度扣魏玛信任、扣保共和各党信任、牺牲共和数值、增革命压力。 ============================================================ */ /* ---------- kpd-betray-penalty:应用革命线的背叛代价 ---------- 用法:<<kpd-betray-penalty N>> N=程度(1轻 2中 3重) 统一扣:魏玛信任 -4N、SPD/DDP/Zentrum -2N、DNVP/军方 -1N、 共和 gov_trust -2N、革命压力 +3N */ <<widget "kpd-betray-penalty">>\ <<silently>> <<set _bp_sev to $args[0] ? $args[0] : 1>> <<set _bp_wei to 4 * _bp_sev>> <<set _bp_spd to 2 * _bp_sev>> <<set _bp_mid to 2 * _bp_sev>> <<set _bp_rev to 3 * _bp_sev>> <<set $npcs.weimar.trust to Math.max(0, $npcs.weimar.trust - _bp_wei)>> <<set $npcs.spd.trust to Math.max(0, $npcs.spd.trust - _bp_spd)>> <<set $npcs.ddp.trust to Math.max(0, $npcs.ddp.trust - _bp_mid)>> <<set $npcs.zentrum.trust to Math.max(0, $npcs.zentrum.trust - _bp_mid)>> <<set $npcs.dnvp.trust to Math.max(0, $npcs.dnvp.trust - _bp_sev)>> <<set $npcs.army.trust to Math.max(0, $npcs.army.trust - _bp_sev)>> <<set $world.gov_trust to Math.max(0, $world.gov_trust - _bp_mid)>> <<set $world.revolution to Math.min(100, $world.revolution + _bp_rev)>> <</silently>>\ <</widget>> /* ════════════════════════════════════════════════════════════ 许诺事件系统(promise-event) 玩家向某势力承诺后,隔天文件篮必然出现该事件,不可跳过。 履行 → 该势力信任涨幅;违背 → 大幅下跌(比直接拒绝更坏)。 由一系列玩家操作触发,几天后出现;无法跳过。 ============================================================ */ /* ---------- promise-event-write:写入一个许诺事件 ---------- 用法:<<promise-event-write "P01" "许诺:让线人档案消失" "KPD" "kpd" "对方握着你的承诺,等你的行动。" 2>> 参数:id(deck_id) / title / 势力名 / trust_key / desc / days(几天后出现) */ <<widget "promise-event-write">>\ <<silently>> <<set _pe_id to $args[0]>> <<set _pe_title to $args[1]>> <<set _pe_party_name to $args[2]>> <<set _pe_trust_key to $args[3]>> <<set _pe_desc to $args[4]>> <<set _pe_days to $args[5] ? $args[5] : 1>> <<set _pe_due to $session_day + _pe_days>> <<if not $promise_pending>><<set $promise_pending to []>><</if>> <<set $promise_pending.push({ event_id: "PE_" + _pe_id, deck_id: _pe_id, /* P 前缀:标记为许诺事件,不可跳过 */ level: "promise", title: _pe_title, description: _pe_desc, tag: "许诺", template: "promise", intensity: 70, irreversible: 4, /* 高不可逆,保证排序靠前 */ due_day: _pe_due, /* 到期日:当天才"必现" */ party_name: _pe_party_name, trust_key: _pe_trust_key })>> <</silently>>\ <</widget>> /* ---------- promise-event-promote:daily-tick 调用,到期日把许诺事件移入待办 ---------- 玩家承诺后不立即出现,到 due_day 当天才进入文件篮(必现、不可跳过)。 */ <<widget "promise-event-promote">>\ <<silently>> <<if $promise_pending and $promise_pending.length gt 0>> <<set _pe_kept to []>> <<for _pe_i to 0; _pe_i lt $promise_pending.length; _pe_i++>> <<set _pev to $promise_pending[_pe_i]>> <<if _pev.due_day lte $session_day>> <<set $pending_events.push(_pev)>> <<else>> <<set _pe_kept.push(_pev)>> <</if>> <</for>> <<set $promise_pending to _pe_kept>> <</if>> <</silently>>\ <</widget>> /* ---------- promise-event-resolve:结算许诺事件 ---------- 用法:<<promise-event-resolve _ev fulfill/break>> 履行:该势力信任+8;违背:该势力信任大降。 */ <<widget "promise-event-resolve">>\ <<silently>> <<set _pev to $args[0]>> <<set _pe_act to $args[1]>> <<set _pe_tk to _pev.trust_key ? _pev.trust_key : "kpd">> <<if _pe_act eq "fulfill">> <<set $npcs[_pe_tk].trust to Math.min(100, ($npcs[_pe_tk].trust ? $npcs[_pe_tk].trust : 0) + 8)>> <<else>> <<set $npcs[_pe_tk].trust to Math.max(0, ($npcs[_pe_tk].trust ? $npcs[_pe_tk].trust : 0) - 20)>> <<if not $player.tags.includes("失信者")>><<set $player.tags.push("失信者")>><</if>> <</if>> <</silently>>\ <</widget>> /* ---------- spd-supervise-review:国会开票结果页调用 ---------- 按玩家对每张他党提案的表态,与 SPD 期望方向(effects.spd 正负)比对。 */ <<widget "spd-supervise-review">>\ <<silently>> <<set $spd_review_text to "">> <<set $spd_review_delta to 0>> <<set _sup_key to "spd_supervise_" + $date.year + "_" + $date.month + "_" + $date.day>> <<set _spd to 0>> <<if $npcs and $npcs.spd and $npcs.spd.trust>><<set _spd to $npcs.spd.trust>><</if>> <<if _spd gte 100 and $party_milestones and $party_milestones.spd>><<set $party_milestones.spd.peak to true>><</if>> <<if $party_milestones and $party_milestones.spd and $party_milestones.spd.arc_state eq "accepted" and _spd gte 60 and not $flags[_sup_key]>> <<set _obey to 0>> <<set _disobey to 0>> <<for _si2 to 0; _si2 lt $session_review.opp_bills.length; _si2++>> <<set _ob to $session_review.opp_bills[_si2]>> <<set _spdv to _ob.effects.spd ? _ob.effects.spd : 0>> <<set _st to $session_review.player_stances[_ob.id] ? $session_review.player_stances[_ob.id] : "abstain">> <<if _spdv gt 0>> <<if _st eq "yes">><<set _obey to _obey + 1>> <<elseif _st eq "no">><<set _disobey to _disobey + 1>><</if>> <<elseif _spdv lt 0>> <<if _st eq "no">><<set _obey to _obey + 1>> <<elseif _st eq "yes">><<set _disobey to _disobey + 1>><</if>> <</if>> <</for>> <<if _disobey gt 0 and _disobey gt _obey>> <<set $spd_review_text to "他站在走廊尽头,没有走下台阶。他看你投下的每一票,目光像在数一个他不愿相信的总数。最后他说:「我原以为我们会一起把共和国扶稳。原来你要的是别的东西。」他转身走了,脚步声比来时轻。">> <<set $npcs.spd.trust to Math.max(0, _spd - 4)>> <<set $spd_review_delta to $npcs.spd.trust - _spd>> <<elseif _obey gt 0>> <<set $spd_review_text to "散会时他在出口等你。他没有提你投的票,只说:「今晚的议会,有你一个声音,比空荡的走廊好得多。」他递给你一支好笔。往后,他把你当成同一边的人。">> <<set $npcs.spd.trust to Math.min(100, _spd + 1)>> <<set $spd_review_delta to $npcs.spd.trust - _spd>> <</if>> <<set $flags[_sup_key] to true>> <</if>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ SPD 红色事件专属评价(V1) 19 个红色事件 × 5 选项 = 95 条 + 13 个暗涌事件 × 3 选项 = 39 条,共 134 条。SPD 以共和守护者身份, 对玩家在每个重大历史事件中的选择,各说一句他的看法。 结构:$spd_reviews[Rxx][选项文字] = 评价文本 由 party-supervise 按 _ev.deck_id + $opt_label 查表(2026-10-02 声音治理): 命中则用专属文本并微调信任;红色/暗涌未命中不开口,绝不回退通用三段。 本文件在 StoryInit 中通过 <<spd-reviews-init>> 初始化。 ============================================================ */ <<widget "spd-reviews-init">>\ <<silently>> <<set $spd_reviews to {}>> /* ─── R01 鲁尔占领 ─── */ <<set $spd_reviews.R01 = { "签署动员令,全面消极抵抗": "他认真地看了你很久。「消极抵抗,四个字,落在纸上是民族,落在街上就是工人的命。」他说,「你用民族的旗号借了工人的力气,可这口气,是要拿他们往后两年的日子去还的。我只愿你记得,是谁在替你扛这道旗。」", "召见法国大使,当面强硬抗议": "「你站得很直,这我看见了。」他说,「可共和国不是靠腰板撑起来的,是靠面包和法郎。你对着法国人抬了脸,国内的工人看着你掏空了国家的口袋。我怕的不是你怯,是你硬得忘了自己是谁。」", "起草照会,走外交谈判": "「这条路最不好走,你偏走了。」他难得地松了松眉头,「谈判不是投降,是把架的力气省下来,用在造面包上。议会里那群人骂你软,可我知道,软里藏着共和国最硬的骨头。」", "秘密联络工会,组织鲁尔罢工": "「你把手伸给了工人。」他说,声音里有一丝暖,「可也请你伸得稳些。罢工是把双刃剑——工人用它争取尊严,也用它割自己的手。你既然挑起了这团火,就得预备着,别让它烧到你自己的人民。」", "压住不表态,等局势明朗": "「你合上文件夹的那一下,我听见了。」他低声道,「等,是政治家最省力的动作。可鲁尔的煤等着挖,工人的家等着米下锅——你的板凳能等,他们的日子不等。有时候,沉默比拍板更贵。」" }>> /* ─── R02 国会授权消极抵抗 ─── */ <<set $spd_reviews.R02 = { "全力推行,印钞补贴工人": "「印钞机开动的那天,工人领到了钱,可钱的脊梁断了。」他说,「你用明天的马克喂今天的工人,喂得越勤,明天越空。我不是要你饿着他们,我是要你想清楚——这钱,究竟是从哪里来的。」", "有限抵抗,控制补贴规模": "「你给了一半。」他点了点头,像在掂量你手里那半分的分量,「一半,两边都不满意,可我觉得,这恰恰是它还活着的样子。共和国就是在这么窄的缝里,一天天撑过来的。」", "只援助工人,不承认是政策": "「你做了好事,却让它见不得光。」他说,「工人领到了钱,可他们不知道是谁给的。共和国最怕的不是穷,是让人以为它不存在。你帮了他们,为什么不肯让他们知道,是共和国在帮他们?」", "拒绝抵抗,直接谋求谈判": "「你被骂成『投降派』的那天,我替你数过,议会里有多少假拳头。」他说,「谈判是疼,可不谈判是死。右翼骂你,是因为他们要的是滚烫的民族,不是能住人的国家。你选的这条冷路,我陪你走。」", "拖延表决,让国会自己吵": "「你把球踢了回去,国会滚了三天,没人接得住。」他叹了口气,「共和国的病,从来不是没人会做决定,是太多人抢着不做决定。你多等一天,街上的报价牌就多换一次吓人的数。」" }>> /* ─── R03 埃森流血 ─── */ <<set $spd_reviews.R03 = { "追加补贴,安抚工人人心": "「每一笔补偿,都是印钞机上的新伤口。」他说,「可死者的债,总要有人拿活人的日子去还。你愿意还,这我没有怨言——我只求你记着,银子喂得了一时,喂不了一世的理。」", "调军队进驻,维持秩序": "「军靴踏进工人区的那一刻,我就知道,你选了另一条路。」他声音很沉,「埃森的血还没干,你又让铁去踩它。秩序是稳住了,可工人记住的,是共和国的鞋底,不是共和国的手。」", "派调查团,查清真相": "「真相很贵,你付了。」他说,「这年头肯为真相付钱的人不多了。查清是谁开了枪,比压下是谁开了枪,要难得多——你选了难的,我记下了。」", "扶持工会,升级抗争": "「你把罢工攥成了武器。」他目光一凝,「可武器捅向法国人之前,先捅破的是工人自己的日子。你让火更旺了,可我问你——那团火,你攥得住吗?还是最后连你一起烧进去?」", "压住消息,暂不回应": "「消息压得住,血压不住。」他低声道,「埃森的死,你捂住一次,它就会在你不知道的地方,再醒一次。你以为自己站在岸上,可水已经开始漫向你的脚了。」" }>> /* ─── R04 法军拘留所人质 ─── */ <<set $spd_reviews.R04 = { "官方声援,把他树成民族英雄": "「你接过右翼的火把,亲手挂上去了。」他说,「那个人还没死,你就先把他供成了旗帜。你以为是你在用他——可我看着,像是他在用你。民族英雄的桂冠,往往是套在共和国脖子上的绳。」", "秘密外交营救,低调向法国施压": "「你走暗门,没人鼓掌,也没人流血。」他说,「这届共和国,最缺的就是这种不声张的硬气。他们不会把功劳记给你,可我知道——你救了人,也护住了共和国最后一分体面。」", "冷处理,不让它成为全国焦点": "「你想让时间冲淡他。」他说,「可在这个国家,一个人的死,比一群人的活更有分量。你等,他们也等——等的人,往往比等不来的人更有耐心。我怕你等来的,不是淡,是更浓。」", "借中间人传话,暗中安抚右翼": "「你给右翼递了话,他们收下了,刀没放下。」他说,「安抚一只要咬人的狼,你总要喂它点什么。你喂了它共和国的骨气——这一口,我怕它记你一辈子。」", "抢在右翼前面,把他写成共和国的受难者": "「你想用共和国的叙事,盖过右翼的枪。」他说,「可一个砸共和国的人,不会因为你的名义,就变成共和国的。你抢他们的旗,抢回来的可能是空杆子——而他,早就不在乎谁举着它了。」" }>> /* ─── R05 人质被枪决 ─── */ <<set $spd_reviews.R05 = { "宣布全国哀悼,亲自出席葬礼": "「你给符号添了火,也把自己塞进了右翼的炉子。」他说,「他的死你已经救不回来了,可你让那一面旗,从共和国的肩膀上,飘到了别人手里。哀悼是应该的——可共和国不该为此,替别人抬棺。」", "只发官方声明,不参与任何纪念": "「你守在红线之内,不添油,也不泼水。」他说,「这不容易。可你我都知道,那面旗,总会有人替他扯起来的。你压得住今天的仪式,压不住明天的名字——火种,从来不在会场里。」", "压制右翼借此煽动的集会": "「你压住了这天的集会。」他沉默片刻,「可殉道者最好的土壤,正是被压住的东西。你越压,他越亮。我不拦你压——我只是怕,你压的每一只手,都成了他墓碑上的一撇。」", "暗中资助遗属,安抚人心": "「你帮了他的家人,却不敢挂名。」他说,「在柏林,好人做事往往见不得光,因为光会照亮太多手。你这份不敢,我懂。可我更盼着有一天,共和国敢堂堂正正地,接住自己的人民。」", "把他收编为共和国的民族象征": "「你想用共和国的名义,盖住右翼的章。」他说,「可一个砸共和国的人,不会因为你的名义,就变成共和国的。你把他收进来,等于把一颗还冒着烟的弹,请进了自己怀里——它迟早在你心口炸。」" }>> /* ─── R06 柏林总罢工 ─── */ <<set $spd_reviews.R06 = { "宣布戒严,强制复工": "「你用威权重开了工厂的门。」他说,「门开了,人心没开。街上的人记住了那股铁锈味——那是共和国第一次,用枪杆对着自己工人的背影。你镇住了今天,可明天的工人,会记得你今天的背影。」", "与工会谈判,承诺改善待遇": "「你坐下来了,这就是最难的一步。」他说,「谈成了,城市动了,工人还记得你。可我也得提醒你——承诺是要兑现的。钱包空了,拿什么填?你许给工人的,得从你自己的权力里,一点点割出来还。」", "压住不动,等罢工自己散": "「你等它自己烧完。」他说,「火会灭,可烧掉的东西不会回来。机床上的灰,是工人积攒的力气,也是共和国欠下的账。你等得起,他们等不起——他们的胃,不比你的椅子有耐心。」", "秘密给工会领袖递好处,分化罢工": "「你收买了楼上的人,楼下的人还在街上。」他说,「裂了的工会,比罢工更难收拾。你以为分化能省事,可你拆掉的是工人最后那点抱团的信——那东西,比马克值钱。」", "借罢工危机,宣布第48条紧急状态": "「你借一场罢工,给自己的手松了绑。」他声音低了下去,「紧急状态是条绳——你越用它,它越缠在你的脖子上。我见过绳子是怎么把人的呼吸,一点点勒没的。你用它开了头,往后,就再也回不了头。」" }>> /* ─── R07 DVP派组阁 ─── */ <<set $spd_reviews.R07 = { "放手支持,把印信交给他": "「你扶他坐上那把椅子。」他说,「他伸手稳,眼光远——可我说不清,这是共和国的救星,还是另一个过客。你把他推上去的那一刻,我多希望,你也记得把他按在共和国这条线上。」", "有条件支持,派人进内阁监督": "「你给了他权力,也给了他一条够得着的缰绳。」他说,「好。权力不怕给,就怕没人看着。可你也得留神——缰绳在国会,不在你手里。你系的那根绳,得有人天天去拽,才算数。」", "压着不签,再等等其他人选": "「你多等一天,报价牌就多换一次。」他说,「愿意接这个烂摊子的人本就不多,你还能等到谁?我理解你想挑个可靠的人——可共和国的椅子上,从来只坐得起敢坐下的人,坐不起挑三拣四的人。」", "要求他先承诺不碰地租马克方案": "「你给他的就任加了一道锁。」他说,「他笑着答应了——可锁是防小人的,挡不住要救的人往回走。你防他能防住,可你防不住这通胀,它不吃诺言。」", "公开支持他,但坚持共治": "「你把他推上台,也把各党拉上了桌。」他说,「共和国最需要的,就是这根能拴住所有人的绳——哪怕它勒手。我最怕的不是你拉他,是你哪天松了这根绳,让谁一个人,把桌子掀了。」" }>> /* ─── R08 消极抵抗收场 ─── */ <<set $spd_reviews.R08 = { "果断终止,接受法国条件": "「你停了机器,通胀喘过气来。」他说,「可鲁尔工人,被你留在了原地。你救了马克,我承认这是对的——可对的事,往往要拿人的心去付账。你最好记得,他们现在有多需要共和国,长长地看他们一眼。」", "逐步收缩,给工人安置善后": "「你慢慢拔针,同时按住伤口。」他说,「见效慢,可工人还记得,你最后没把他们扔下。这条路又慢又贵,可它是共和国唯一能走完的长线——我陪你走。」", "拖着,让抵抗自己断气": "「你不说停,也不说继续,机器还在转,钱还在烧。」他说,「你告诉自己这是策略——可马克不这么想,工人也不这么想。拖,是政治家最体面的残忍。你省下了决定,却让所有人替你背着决定。」", "把结束的决定甩给国会表决": "「你把烫手山芋扔给国会,他们表决了,通过了。」他说,「可街头不会因为一张表决就原谅你。你把责任推给一百个人,等于一百个人都不负责——而共和国,最付不起的就是这份『不负责』。」", "宣布抵抗胜利,体面收场": "「你给这场没有赢家的仗,找了个胜利的结语。」他说,「面子保住了——可里子呢?法国人拿走了煤,工人走了人。你安慰了人民,也安慰了自己。可真相,从来不会因为你体面,就放过你。」" }>> /* ─── R09 第48条紧急状态 ─── */ <<set $spd_reviews.R09 = { "签署,并扩大紧急权力": "「你灌下这剂猛药。」他说,「病暂时压住了,可共和国从此得了『靠药续命』的瘾。我见过药越用越多、人越吃越虚的样子。你开了这个头,往后每一次,都有人劝你再开一次——你打算喂到什么时候?」", "签署,但限定三个月期限": "「你给紧急状态上了个闹钟。」他说,「闹钟会响——可权力最喜欢做的事,就是关掉闹钟。你设的三月之期,是给共和国留的一线。我只求你记着,那根线,得是你自己亲手去拽,别等别人替你拽断。」", "拒绝签署,坚持议会路线": "「你守住了宪法的门。」他说,声音里有一分不易察觉的郑重,「可外面的火不认宪法。你保住了原则,可能没保住这座城市。我懂你的倔——可我也怕,倔到最后,是连门一起烧给你看。」", "签署,但把监督权交给国会": "「你让紧急权力在国会眼皮底下慢跑。」他说,「监督是根绳子——可绳子也会被权力一点点磨断。你交给国会的那只眼,得一直睁着。我怕的不是你签,是你签了之后,忘了还有人在看着谁。」", "签署,借机整顿各州": "「你借着紧急法,把不听话的州挨个捋了一遍。」他说,「联邦的弦紧了——勒得越紧,断得越快。你收拾了巴伐利亚,可你忘了,共和国是许多只手一起托起来的。你把一只手按下去,别的手,会记得你按过它。」" }>> /* ─── R10 巴伐利亚戒严 ─── */ <<set $spd_reviews.R10 = { "调兵施压,逼巴伐利亚就范": "「你把枪口对准了国内的『自己人』。」他说,「巴伐利亚缩回去了,可它记住了这个梁子。我懂你想按住它——可共和国不是靠枪杆子拼起来的,是靠各邦那点勉强还肯坐在一起的信任。你会用枪,可枪不会替你谈。」", "发温和照会,寻求协商": "「你递过去一根橄榄枝。」他说,「慕尼黑接了,没回话。沉默在柏林和慕尼黑之间,是一封完整的信。你不开第一枪,这很难得——我怕的是,你这边递了枝,那边却已经在磨刀了。」", "默认放任,不承认也不反对": "「你把手缩了回来。」他说,「巴伐利亚把它当成软弱——而它从没打算把吞下去的东西还回来。你不想激化,可有时候,你的沉默本身就是一张票,投给了最不想投的那一边。」", "暗中支持巴伐利亚里的反对派": "「你在慕尼黑的墙脚埋了根引线。」他说,「可引线那头连着什么,连你自己也看不清。你借刀,刀会记住你。暗处的事,往往比明处的枪,更先咬到共和国。」", "公开把巴伐利亚定性为叛乱": "「你喊出『叛乱』两个字。」他说,「喊醒了一部分人,也把巴伐利亚彻底推到了对面。你用了最重的词,就收不回了——共和国的裂痕,从来不是用高音能补上的,是用一次次坐下来谈的耐心。」" }>> /* ─── R11 克姆尼茨KPD会议 ─── */ <<set $spd_reviews.R11 = { "派警察包围,抓人拿证据": "「你抓了人,会开不成了。」他说,「可被你逼到地下的革命,下一次更狠。我不替他们辩护——可我也想问你一句:你用枪压下去的火,是靠枪就能一直压下去的吗?」", "按兵不动,监视他们": "「你让密探记下每个名字。」他说,「可你知道,会散得掉,火种散不掉。你想看清楚他们,这个我懂——可看,也得记得,有些东西是不该只看不碰的。你让它们攒着,迟早攒成你压不住的那把火。」", "透过工会警告他们别乱动": "「你借工会传话,有人听进去了,有人没有。」他说,「你用了工人自己的地方去劝——很好。可传话的人,是在替你传,还是在替工人传?你要分清,哪句话是共和国的,哪句话是你自己的。」", "公开谴责,逼他们放弃": "「你把阴谋摊在阳光下。」他说,「曝光让他们犹豫了一瞬——可犹豫的人,往往更想证明自己不犹豫。你当众骂了他们,是把他们逼到墙角;墙角里的人,最容易不管不顾地,冲出来。」", "把消息漏给右翼报纸,借刀杀人": "「你让右翼替你咬人。」他说,「KPD被咬得缩了——可借来的刀,早晚也会架到你脖子上。你今天借右翼的笔,明天他就会用这支笔,写你。你递出去的每一下,都是在教别人怎么咬你。」" }>> /* ─── R12 汉堡起义 ─── */ <<set $spd_reviews.R12 = { "调国防军与警察,果断镇压": "「你下令开火,三天后街垒被推平。」他说,「你救了共和国一次——用的是它自己青年人的血。我闭上眼,还能听见那天的枪声在共和国的墙上弹。你赢下了汉堡,可那一枪,也开在了你自己的良心上。」", "让工会与SPD去劝降,避免流血": "「你让工人兄弟去劝降,不想让军队再沾血。」他说,「这条路最难,也最像我认识的那个你。可我也得说——劝降的话,他们听不进去,他们已经举起了枪。你派去的人,是去当朋友,还是去挡子弹?」", "不调军队,交给汉堡警方自己处理": "「你想避免国防军介入的先例。」他说,「可警察挡不住街垒。你省下的那个先例,是用更多条命填的。我懂你怕军队——可你怕错了地方,你该怕的,是让火在没人管的街角,烧得更久。」", "承认起义根源,善后并改善待遇": "「你把人从街垒上拉回来,用面包而不是子弹。」他说,「见效慢,可这是共和国唯一的长线。你肯认起义的根源,这比一千句口号都重——我向你保证,工人会记住,是你先低下了头。」", "借机清算,取缔共产党": "「你灭了左翼的枪,也埋下了右翼模仿你的种子。」他说,「方法是会传染的——这个国家总会有人学会。你让『取缔』成了手段,那明天,就有人敢用同一个词,对付你。你挖的坑,迟早会有人替你填上。」" }>> /* ─── R13 萨克森国防军 ─── */ <<set $spd_reviews.R13 = { "默许军队解散萨克森政府": "「你让军队跨过了州界的线。」他说,「共和国第一次用军队,拆了自己政府的台——右翼在鼓掌。你教了军队一个道理:政府是可以被子弹换掉的。你埋下的这一课,总有一天,会有人拿来教给你。」", "阻止军队,让议会解决": "「你拦住了军靴。」他说,「可你在赌:议会来得及,还是枪来得快。我陪你把这场赌下完——可你我都清楚,议会那根慢吞吞的笔,比不过军靴落地的声音。你得让议会跑得比枪快一次。」", "下令军队撤出,避免流血": "「你把手收了回来,枪没响。」他说,「可军队记住了一个『不敢用他们』的政府。你避开了这一场血,却让军队记下了你的软。这账,今天不还,改天连本带利。」", "只解散KPD阁员,保留SPD": "「你砍掉共产主义的枝条,留下民主的树身。」他说,「可刀砍过的树,会长出什么样的新芽,没人知道。你保住了我,我谢你——可我也怕,有朝一日,那把刀会指着保你的这只手。」", "公开谴责军队越权": "「你当众绳住军政府的手。」他说,「你喊的是越权,军人们记住的是——政府竟然敢骂他们。你说了该说的话,可声音进了墙,能不能传出去,要看你的枪,还是他的枪。」" }>> /* ─── R14 啤酒馆暴动 ─── */ <<set $spd_reviews.R14 = { "调军镇压,追捕暴动头目": "「你下令开火,暴动一天就散了。」他说,「可那个趴在地上的人,会记住该往哪里跑。你赢了今天,却把一个受伤的名字,放进了他的心里捂着——那东西,比枪还难对付。」", "让巴伐利亚警方自行处理": "「你把刀交给巴伐利亚。」他说,「他们处理了——可『处理』这个词,在慕尼黑和柏林不是一个意思。你省了自己的手,也松了共和国的缰绳。有些刀,交给别人,就再也收不回来了。」", "等它自己垮掉,不介入": "「你旁观了一天,它确实垮了。」他说,「可站起来的那个,学会了穿西装、走国会,而不是冲啤酒馆。你等垮了一个闹剧,却养大了一个更懂规则的对头——这才是最让我睡不着的地方。」", "借机整肃全国右翼武装": "「你借着这晚的由头,把全国的枪都搜了个遍。」他说,「可国会大厅里,还有人在等那把枪。你搜的是明面上的铁,搜不掉人心里的火。你能卸下他们的枪,卸不下他们胸口那口『下一次』的气。」", "利用暴动,向军队示好结盟": "「你借这颗火星,靠近了军队这团火。」他说,「他帮你按住了跳动的烛火——可火,从不听蜡烛的。你向军队示好,是把共和国的命门,交到了一只看不太清的手里。你赌他护你——我怕他反过来,用你。」" }>> /* ─── R15 统帅堂进发 ─── */ <<set $spd_reviews.R15 = { "下令军队开火,镇压到底": "「统帅堂前的枪声停了,16个人倒在广场上。」他说,「你保住了共和国,也造出了16个符号。你赢下了这一仗,可那16个名字,会成为你心里最沉的账——也是别人手里最亮的旗。」", "只让警察拦截,不调军队": "「你让警察去挡,挡是挡住了。」他说,「可慕尼黑的街上,警察的枪声和军队的枪声一样响。你不想让军队沾这份血,可血已经沾了——区别只是,从谁的手上流下来的。」", "压住消息,不让它传开": "「你拦住了报纸。」他说,「可枪声和死亡瞒不住——被你压下去的消息,早晚在别处长出来。你压得住今天的头条,压不住明天的传说。有些事,越是捂着,越像在替它打广告。」", "公开谴责,把头目送上法庭": "「你把他送上被告席。」他说,「法庭成了他的舞台——你本想关住他,却给他发了一张传单。你我都见过,最会讲演的人,不怕站上被告席,就怕没人听他讲。你这一送,是关他,还是捧他?」", "处理善后,安抚遇难者家属": "「你给死者收了尸,给遗属递了钱。」他说,「可16个名字,已经被有心人刻成了碑。你安抚了活着的人,安抚不了那座碑——它会长在他们心里,越刻越深。你做了对的事,可对的对面,站着更长的影子。」" }>> /* ─── R16 货币改革 ─── */ <<set $spd_reviews.R16 = { "果断改革,立即发行地租马克": "「你按下了止血的手,通胀停了,像魔法。」他说,「可中产一辈子的积蓄,在一夜之间归了零。你救了马克,也抛弃了那些信了共和国一辈子的人。我懂你不得不做——可我希望你记得,是谁替你付了这笔账。」", "新旧并行,分步过渡": "「你给旧马克留了退路。」他说,「市场更乱,可人摔得轻一点。只是,通胀不给你慢慢来的时间。你这份心,我领——可在这座城市里,慢,往往等于输。」", "压住方案,再等等看": "「你多想了一天,就这一天,又有几亿马克变成了废纸。」他说,「改革不是你想不想,是马克替你决定。你等来的不是稳妥,是更贵的小麦。有些决定,拖一天,就是拿无数人的明天去填。」", "改革之外,补偿储蓄受损者": "「你一边止血,一边给被冲走的人递救生圈。」他说,「这很贵,可共和国需要有人记得他们。你做尽了能做的——我信你。可我也怕,这份补偿,会变成你往后日子里,最常被人提起的软肋。」", "借机把央行收归政府,垄断金融权": "「你借着救命的机会,把印钞机攥进了自己手里。」他说,「银行家们皱眉,可没人敢在这时候反对救命恩人。你抓住了钱,也就抓住了这个国家的命门——可命门这东西,攥得越紧,越像攥着一颗不响的雷。」" }>> /* ─── R17 总理不信任案 ─── */ <<set $spd_reviews.R17 = { "为他辩护,逆转不信任案": "「你站到了他那边,他留下来了。」他说,「可你为救一个人,压退了半个议会。他救过共和国,这我认——可你为了还他一个人情,把一整个议会都得罪了。这账,我怕你日后还不起。」", "保他留任外长,退下总理": "「你给他留了一道退场的门。」他说,「他保住了体面,可椅子已经换了主人。你让一个救过共和国的人,体面地退下来——这比硬把他按在椅子上,更护得住共和国。你做得对。」", "顺应议会,让他下台": "「你让议会的票自己走,他走了。」他说,「桌上那支没人收的钢笔,你看见了。我看着你也看见了——那就好。共和国不是靠一个人撑的,可也不能让救过它的人,连个台阶都没有就掉下去。」", "借机改组,自己更多掌权": "「你借他的走,稳了自己的坐。」他说,「可权力越攥越紧的手,会让自己也被攥住。你趁人落难时接过了他的椅子——我看见了。这不丢人,可你得记住,下一次,别人也会用同样的方法,来够你的椅子。」", "公开为他说话,落个义气": "「你替他讲了几句公道话,话不重。」他说,「可总有人在最冷的地方,记你的这点暖。你救过共和国的人,也肯为他在最难的时候开口——这份义气,我记下了。共和国缺的,往往就是这一句公道话。」" }>> /* ─── R18 马克破万 ─── */ <<set $spd_reviews.R18 = { "宣布紧急外汇管制": "「你按住了汇率的手,数字暂时稳了。」他说,「可逃出去的钱,正从荷兰和瑞士绕路回来。你堵的是明面上的口子,堵不住人心里的门。外汇管制是堵墙——可墙,总是有人翻得过去。」", "约束物价,限制囤积": "「你给面包定了价,排队的人松了一口。」他说,「可架子上很快又空了,因为货不进来。你管住了价签,管不住货源的脚。我知道你尽力了——可尽力这两个字,在空架子上,显得那么轻。」", "承认救不了,坦诚面对": "「你说了实话:救不了。」他说,「诚实很贵——可至少没人能再骗自己。我谢你没演那场『可控』的戏。共和国最缺的,就是敢对人民说真话的人。你说出来了,我就不怕它了。」", "发声明安抚,说局势可控": "「你让部长们说『可控』。」他说,「懂行的人不听——可街上的人需要一句话撑着。我明白你这是为稳人心。可你我都知道,这句话会反噬的。等他们发现不可控的那天,恨你的,正是今天信你的。」", "偷偷请外国资本帮忙": "「你向外汇递了手,钱来了,可条件也来了。」他说,「你欠的每一分,都长着嘴。我理解你走投无路——可你递出去的那根绳,往后会一直拽着共和国。你请进来的不是钱,是债。」" }>> /* ─── R19 中产破产 ─── */ <<set $spd_reviews.R19 = { "承认中产破产,承诺补偿": "「你承认了那句没人敢说的话:他们的积蓄,没了。」他说,「安抚了人心,也往自己账上添了债。你肯认,这很难得——可一个只靠承诺撑着的中产,撑不住下一个冬天的。你得让他们信,共和国真的会补偿。」", "宣布币制改革在即": "「你放出『新钱要来』的风,市场信了一半。」他说,「可这一天,旧钱还在烧。你给了他们一个盼头,也给了他们一根悬着的线。怕的是,新钱没来,旧钱先烧完了——那一半信你的人,会第一个反目。」", "咬死不认,说数字会好": "「你让官员们嘴硬。」他说,「可一张张空存折,比任何声明都诚实。你骗得了一时,骗不了他们手里那点烧成灰的纸。共和国最大的敌人,不是敌人,是让人信不起来的自己。」", "追责印钞的官员,平息民怨": "「你推一个人出去背锅,民愤缓了。」他说,「可谁都明白,印钞的不是那一只手。你让一个替罪羊平了这口气,可你亲手教会了他们:共和国的错,是可以找个人来顶的。这个道理,比通胀更毒。」", "发起储蓄救济,政府出资补底": "「你发起储蓄救济,给中产垫了底。」他说,「这很贵,贵到你可能赔上自己的政治前程——可你做了。共和国欠中产一份交代,你替它还了。也许明天没人记得你的名字,但那份存折里的底气,会有人记得。」" }>> /* ════════════════ S01-S13 暗涌事件专属评价(2026-10-02 补齐) ════════════════ 声音治理后红色/暗涌只走专属表,暗涌没台词=盟约势力在结算页沉默,故补齐。 13 件暗涌 × 3 选项 = 39 条。键=现行选项文字(与 $red_opts 一致, party-reviews-rekey 启动按位兜底)。 */ /* ─── S01 总罢工升级为全国总动员 ─── */ <<set $spd_reviews.S01 = { "倾力镇压,封锁铁路线": "「你封了铁路线。」他说,「罢工是工人最后一句要紧的话,你用军列把它堵了回去。汉堡、科隆、鲁尔——他们放下工具,是信这个国家还肯听。你今天让他们信的,是站台上的军靴。这口气,工人会记很多年。」", "分批谈判,分化各城": "「你把谈判拆开,一座城一座城地谈。」他说,「肯谈,比封锁强。可我把丑话说在前头:工人不是牌桌上的牌,不能挑那张好说话的先打。分化是手腕,用一次可以,用久了,他们就明白你是拿他们互相当刀。」", "顺应部分诉求,增发救济": "「你接了诉求,还发了救济。」他说,「这是这几天里第一件对的事。可你记住今天是为什么——是他们放下工具,这张桌子才重新开了口。别让领救济的人忘了自己争来了什么,也别让发救济的人,把它当成恩赐。」" }>> /* ─── S02 汉堡起义点燃多城响应 ─── */ <<set $spd_reviews.S02 = { "援引第48条,全国戒严": "「你把第48条拿出来,最先撞上的是谁的门,你清楚。」他说,「戒严令下来,工厂的纠察队先被缴械,工人的报纸先被查封。起义是要平,可这一刀下去,全国工人都看得见刀口朝哪。共和国欠他们的那个说法,你今天赖掉了。」", "集中打击汉堡,其余怀柔": "「你只打了汉堡,别的城没动。」他说,「比起把军队撒向全国,这总归少流些工人的血。可汉堡也是工人。你精确地砸下去,别的城都看得懂这是示范。示范做完,记得把话收好——别让人只剩恐惧可选。」", "承认部分工人政府": "「你让了一块地方,给他们挂自己的牌子。」他说,「我懂,你想用最小的地换最大的太平。可共和国的招牌一旦开了能摘的先例,工人们明天就会想:与其等你给,不如自己拿。你想买和平,我恐怕你买回的是一张催货单。」" }>> /* ─── S03 啤酒馆暴动得逞:慕尼黑变色 ─── */ <<set $spd_reviews.S03 = { "调兵平叛,收复慕尼黑": "「你调兵去收慕尼黑。」他说,「该收,一邦不能就这么走了。可我提醒一句:你让国防军头一回把炮口对准自己的邦。今天它替你打叛军,明天它就知道,军队进城是能做成事的。这支枪请出来容易,请回去难。」", "谈判周旋,拖延时间": "「你在跟慕尼黑拖时间。」他说,「拖不是不行,可你拖的每一天,那边的讲台都在长高。他们天天说:柏林软弱,柏林不敢来。拖延在这些听客耳朵里,就是承认。你拖可以,手里得有真牌,别拖到他们把南边说成了自己的。」", "默认现状,稳住其他邦": "「你把慕尼黑先搁下了。」他说,「我懂,稳住其他邦比夺回一座城要紧。可工人今天在问:共和国连自己的一个邦都保不住,它还保得住面包吗?你搁下的是一座城,街上搁下的是对你的信。」" }>> /* ─── S04 萨克森武装抵抗:国防军遇阻 ─── */ <<set $spd_reviews.S04 = { "增兵强攻,彻底清剿": "「你下令强攻了。」他说,「街垒后面不是外敌,是萨克森的工人,是上个月还在给你投票的人。『彻底清剿』落在纸上四个字,落在地上就是一条街一条街的人命。这场仗赢得越干净,共和国在他们心里,就死得越干净。」", "谈判解散政府,避免流血": "「你跟萨克森谈,让他们自己散伙。」他说,「不流血地把工人政府请下台,这是你做的最难也最对的一件事。右翼会骂你软——让他们骂。你保下的是几百条命,还有工人对共和国最后一点念想:原来不必开枪,是可以谈的。」", "只清首脑,其余赦免": "「你抓头头,放下面的人。」他说,「宽大是真的宽大,工人们领情。可我问一句:『首脑』两个字由谁圈定、凭什么圈定?名单若是军情的人拟的,那你赦免的恩典,也是从枪口里发出来的。恩要施得明白,工人才敢接。」" }>> /* ─── S05 巴伐利亚与军方结盟:共和国裂痕 ─── */ <<set $spd_reviews.S05 = { "清洗军方,整肃总参谋部": "「你敢查军方,这话我等了四年。」他说,「共和国头上那把枪,早该有人去碰一碰。可你听着:外科刀下去,不能只割一半——你要么治好这条胳膊,要么就别惊动它。清到一半停下来,比不清更危险:那等于告诉他们,你怕了,又记下了他们的名字。」", "公开谴责,施压巴伐利亚": "「你把话说明白了,公开地骂。」他说,「骂是第一步,可骂完呢?慕尼黑听见谴责,只会把袖子挽得更紧。我理解你想先站稳道义——道义是空的,除非它后面跟着第二道命令。工人会问:柏林骂完了,然后呢?」", "默许结盟,换取时间": "「你看见了那场密会,装作没看见。」他说,「我知道你想用南边的沉默换几天喘气。可你借的不是时间,是高利贷——慕尼黑和将军们今天拿你的默许,明天就收利息:先是地方的事你别管,再是柏林的事他们要管。共和国的债主,不能是这两家。」" }>> /* ─── S06 地租马克失效:通胀持续失控 ─── */ <<set $spd_reviews.S06 = { "追加担保,强行救市": "「你把担保又加了一层。」他说,「压下去这口气是要还的——我说的不是钱,是信用。共和国的担保一层押着一层,押到最后还能拿什么担保?工人领新钞的时候会问:这张,是最后一张吗?你答得上吗?」", "有限担保,只保工人储蓄": "「你先保了工人的存折。」他说,「这一步对,多少人的工钱在里面。可保了今天这本,明天小商贩的、手艺人的本子就会排在门口问:为什么他们不算?救得了一半人的钱,救不了另一半人的心。下一句怎么答,你得先想好。」", "放弃担保,听任市场": "「你把手抽走了,让市场自己收拾。」他说,「市场收拾人是有次序的:先收拾存折最薄的。工人的最后一笔积蓄,从今天起没人担保。你说这是让规律办事——规律不认人,可国家认人;认不了人的,就别叫国家。这一天,工人们会记很久。」" }>> /* ─── S07 莱茵共和国分离运动 ─── */ <<set $spd_reviews.S07 = { "宣布分离为叛国,派兵镇压": "「你把分离定成叛国,要出兵。」他说,「人心上我站你这边——德国的地,不能贴着外国的旗另立门庭。可你把兵往莱茵兰开,是往法国人的枪口底下开,他们等的就是这个借口。你打的是叛徒,也可能替他们把战火引回家。这一步,比嘴上喊的难十倍。」", "不予承认,但避免与法国直接冲突": "「你说了不承认,然后停在那里。」他说,「不承认是对的,那块牌子本来就不该有。可你不理它,它就自己长——铁路员工听了新政权的,邮局换了他们的告示。不承认不能只是不说话,柏林的声音得到莱茵的街上去,哪怕只去贴一张告示。」", "秘密资助当地反分离团体": "「你在暗处给那边的人递钱。」他说,「我懂,明面上不能动,只能走暗的。可政府的手一旦伸进这种口袋就收不回来了:今天给反分离的,明天就敢给别的。钱在暗处走,账在明处爆——哪天这笔钱见了报,共和国就成了一起丑闻的主角。」" }>> /* ─── S08 外交部长遇刺余波 ─── */ <<set $spd_reviews.S08 = { "借刺杀案取缔右翼组织": "「你把取缔令签了。」他说,「他们杀了人,你合上了他们的门。这一天我等得太久——政党的拳头伸进街面,总有一天攥成杀人的。右翼会喊迫害,让他们喊。活着的工人们听得见:原来杀共和国的人,共和国是敢办的。」", "只惩凶,不扩大打击面": "「你说只办拿枪的,不动别的。」他说,「罪归罪,组织归组织,这个道理我认。可我告诉你街上的人怎么想:凶手后面站着的那些讲台,一个没动。杀部长的手被铐走了,教他开枪的嘴还在台上讲。你办的案子,堵不住下一个案子。」", "强化共和国保护法,扩大政府权限": "「你要给政府加锁扣。」他说,「防身是真的需要——部长说杀就杀,国家确实太软了。可我把话放这儿:条款一旦写宽,头一个挨着它效力的不会是右翼,是罢工的工人、办报的工会。你扩权的时候多想一层:这把伞,下雨时先罩谁?」" }>> /* ─── S09 黑色国防军与秘密动员 ─── */ <<set $spd_reviews.S09 = { "默许军方秘密准备,以备不时之需": "「你听见了,然后转过身去。」他说,「他们在林子里操练,在猎场里藏枪——你该知道那些枪造出来是打谁的。这支看不见的队伍,今天对外,明天就敢对内。你默许的每一支枪,将来都可能抵着你自己办公室的门。」", "要求军方停止,避免外交危机": "「你叫他们停了。」他说,「命令是对的,秘密队伍养大了就是狼。可我说句实话:军里那批人对柏林的命令,向来是挑着听的。这道命令下去,他们会停下来给你看——然后换个林子接着练。你盯得住一张名单,盯不住全国的猎场。」", "将秘密组织收编为政府控制下的准军事力量": "「你说收编——把他们的名册换成政府的。」他说,「听着是收了权,其实是发了执照。私兵进了编制,有了饷、有了名分,往后裁谁?裁的那天你就知道,这队伍到底是谁的。共和国不该有编外的枪;编进来的枪,也还是那杆枪。」" }>> /* ─── S10 农民运动与粮食拒售 ─── */ <<set $spd_reviews.S10 = { "强制征粮,稳定城市供应": "「你派了征粮队下乡。」他说,「城里人等米下锅,这不假。可限价的粮,配涨价的农具——农民这一年的账你也该翻翻。强力征来的粮,吃到嘴里都带铁味。今天乡下的怨,明天就是集市上的乱。把粮运进城的办法有一百种,你别挑最伤人的那种。」", "提高农产品价格,安抚农民": "「你给粮抬了价。」他说,「乡下松了口气,城里的面包房开始抹脖子——涨出来的每一芬尼,最后都压在工人的篮子里。农民该养,这我认。可你抬价之前,得先给城里的工资找条路。两头都疼的时候,你不能只疼一头。」", "允许地方自行协商,中央不介入": "「你说让地方自己商量。」他说,「商量是好事——可现在的乡下,谁手里有秤,谁手里就有枪。中央不管,先坐上桌的就是他们。城里等米的工人不认识什么乡绅,他们只知道柏林说了一句:自己想办法。这句话工人记性好,能记到冬天。」" }>> /* ─── S11 国防军内部政变密谋 ─── */ <<set $spd_reviews.S11 = { "立即清洗涉嫌军官": "「你清了。」他说,「该清!他们嘴里的『进军柏林』,进的是你家门。我只有一句嘱咐:这一刀要当着全国的面落下去——审,公开审;罪,一条条念。让每个营房都听见:枪口对柏林,是要上法庭的。悄悄办了,别人只当你怕。」", "只调离核心人物,避免震荡": "「你把头几名调走了,队伍没动。」他说,「我知道你怕震荡。可调走的人带着俸禄体面地走,留下的全看在眼里:谋事没有成本。今天他们知道谋事最多挪个地方,明天进军的路线上,就多几个敢签字的。震荡是疼,可根子烂着,疼在后头。」", "派密探渗透,搜集更多证据": "「你往里头派人了。」他说,「多攒些证据,稳。可密探每多待一天,那边就多练一天。我担心的不是证据不够,是证据凑齐的那天,人家已经从密谋走到了起跑线上。你等的这张状纸,别写成讣告。」" }>> /* ─── S12 协约国最后通牒与赔款重谈 ─── */ <<set $spd_reviews.S12 = { "全盘接受,换取占领结束": "「你把通牒接了,一个字一个字地接。」他说,「明天满街都会骂你卖国——我把话放这儿:骂声我担一半,你担一半。止了血的国家才谈得上别的。可你得把时限抠死:占领哪天撤、军队哪天走,一个日期都不能含糊。忍这一回,要忍得有名有据。」", "拒绝接受,坚持抵抗": "「你把通牒撕了。」他说,「台下会有掌声,民族这面旗你今天举得很稳。可你回答我一个问题:抵抗的账,谁扛?是失业的工人,是领半价面包的母亲。你说不清谁扛、扛多久,这声『拒绝』就是把工人按在火线上,你自己站后面。」", "提出反方案,争取英国支持": "「你递了个反方案,还找了英国人。」他说,「好。桌子上的每一页纸,都比街上的每一句口号管用。我只添一句:反方案里替德国人争的,别光争给外国人看的名目——赔款怎么摊、工人怎么不受连带苦,写细一点,那才是给国内的人看的。」" }>> /* ─── S13 新闻界与政府审查冲突 ─── */ <<set $spd_reviews.S13 = { "加强新闻审查,查封煽动性报纸": "「你封了几家报纸。」他说,「封的多半是骂你的右翼,我看着不冤。可你开的是一台机器——今天它烧右翼的报馆,明天换个管机器的人,它就烧工会的传单。你把『谁掌权谁封报』教会了所有人,往后工人的报纸,也得看掌权人的脸色。」", "依法起诉个别报纸,不全面管制": "「你说一条一条地告,不一把抓。」他说,「告,比封强——法庭上两家把话摆开,输的服、看的服。我只求一样:起诉的尺子要一把,右翼骂你的告,工会骂你的也得照这把尺来。工人认这个理:法是同一把尺,别让人看出两副面孔。」", "不干预,任由舆论自行争论": "「你说不管了,让他们吵。」他说,「吵是报纸的本分,这话我爱听。可你听见的不是吵,是围猎——天天教人恨这个国家。沉默是美德,可掌权者的沉默,报纸会替你写成『默认』。你可以不出手,但你得出声。」" }>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ DDP 红色事件专属评价(V1) 19 个红色事件 × 5 选项 = 95 条 + 13 个暗涌事件 × 3 选项 = 39 条,共 134 条。DDP 以「宪法与法治守护者」身份, 对玩家在每个重大历史事件中的选择,各说一句他的看法。 结构:$ddp_reviews[Rxx][选项文字] = 评价文本 角度:是否守住宪法 / 是否越权 / 是否让法治让位于强权、捷径、民粹。 由 party-supervise 按 _ev.deck_id + $opt_label 查表(2026-10-02 声音治理): 命中则用专属文本并微调信任;红色/暗涌未命中不开口,绝不回退通用三段。 本文件在 StoryInit 中通过 <<ddp-reviews-init>> 初始化。 ============================================================ */ <<widget "ddp-reviews-init">>\ <<silently>> <<set $ddp_reviews to {}>> /* ─── R01 鲁尔占领 ─── */ <<set $ddp_reviews.R01 = { "签署动员令,全面消极抵抗": "他听完你的决定,没有立刻说话,只是把面前那本宪法翻到很小的一页。「消极抵抗,靠的是印钞机,而印钞机,是绕过财政预算开起来的。」他说,「你让国家违了一次法,来替民族撑腰,可法这东西,破例一次,就不值钱了。」", "召见法国大使,当面强硬抗议": "「你召见大使,是外交程序,我不拦你。」他说,「我只想提醒你一点:你今天的强硬,是站在这本宪法后面说的。若哪一天你习惯了『我一句话就能让国家挺起来』,你就未必还想得起,自己当初是站在哪本东西后面开口的。」", "起草照会,走外交谈判": "「你选了谈判,选了照会,选了程序。」他说,语气里有一丝难得的松快,「这年头,肯把争端放进纸面、放进条款、放进可被复核的规则里的人,越来越少了。你这一步,走得守规矩,我记下了。」", "秘密联络工会,组织鲁尔罢工": "「你借工会组织罢工,用的是工人组织,不是法令。」他说,「可罢工一旦被国家默许为对抗占领的手段,『国家不组织人民对抗法令』这条界线就模糊了。我不反对工人,我提醒你别把国家,也一并算进街垒那头。」", "压住不表态,等局势明朗": "「等局势明朗,是政治上最省事的姿态。」他说,「可宪法不认『等』,该由程序裁决的事,你压着不让它进程序,本身就是一次搁置的越权。你多押一天,程序就空转一天。」" }>> /* ─── R02 国会授权消极抵抗 ─── */ <<set $ddp_reviews.R02 = { "全力推行,印钞补贴工人": "「你拿到了国会授权,程序上站得住。」他说,「可印钞机每开一天,都在透支『国家得对得起它的钱』这点信用。你合法地做了一件动摇法治根基的事,合法给了它一件外衣,可外衣挡不住它往里亏的那部分。」", "有限抵抗,控制补贴规模": "「你给了一半,也在国会框子里留了半只脚。」他说,「有限,意味着你还记得那条线。我担心的不是你把控不住,是你哪天连『给自己设限』这件事,都懒得做了。」", "只援助工人,不承认是政策": "「你做了好事,却让它躲在你个人权威背后,不进任何条例。」他说,「一件事若不落纸面,就没有可以复核的根据。你越是不肯让它进程序,程序就越是被你架空,哪怕你出于好心。」", "拒绝抵抗,直接谋求谈判": "「你被叫成投降派,可你走的是谈判,是条约,是字面上的规则。」他说,「右翼骂你,是因为谈判意味着让步,而让步意味着承认自己有所不能。可谈判不是认输,是把自己承受不起的代价,摆到能谈的地方去谈。」", "拖延表决,让国会自己吵": "「你把球踢回国会,这本身没错,表决该由他们来。」他说,「可你把一份需要他们拍板的事,拖到他们吵完为止,等于把『什么时候决断』也攥进了自己手里。你该做的,是逼他们决断,不是替他们决定要不要决断。」" }>> /* ─── R03 埃森流血 ─── */ <<set $ddp_reviews.R03 = { "追加补贴,安抚工人人心": "「你安抚了人,用的还是印钞机。」他说,「这笔账我不反对,安抚该做,可你得知道它记在谁头上。银子喂得了一时,喂不了一世;你补的是工人的眼下,欠的是国家的以后。」", "调军队进驻,维持秩序": "「你让军队进工人区维持『秩序』。」他说,「可我要先问清楚:军队维持的秩序,是宪法的秩序,还是枪的秩序。一旦这两样开始混着用,『秩序』这个词,就会慢慢站到枪那一边去。」", "派调查团,查清真相": "「你派了调查团,让真相进程序、进记录、进可以复核的卷宗。」他说,「这是我最愿意看见的一种反应,不捂、不压、不抢先定性,而是让规则自己说话。你这一手,守住了法治的体面。」", "扶持工会,升级抗争": "「你把埃森的事,接成了工会升级的由头。」他说,「你让工人组织去对抗占领,可也把『由谁来组织对抗』这件事,从宪法的手里交了出去。你分得清,是谁在替工人主张,是谁在借工人张势吗?」", "压住消息,暂不回应": "「你压住消息,不让它进程序、进公众、进法律该管的地方。」他说,「埃森的真相被捂住了,可法治的第一口气,就是真相得能见光。你捂住的不是丑闻,是法律本该有的眼睛。」" }>> /* ─── R04 法军拘留所人质 ─── */ <<set $ddp_reviews.R04 = { "官方声援,把他树成民族英雄": "「你把他写进官方声援,等于把国家的印,盖在了一个还没定论的人身上。」他说,「英雄由谁定,法由谁判?你让一个人不经任何程序就定型成民族的脸,这印子,改天也会用来盖在别人身上。」", "秘密外交营救,低调向法国施压": "「你走外交暗门,守住了程序。」他说,「不树英雄、不煽舆论、不越司法,只在一个国家该伸手的地方伸手。方式上,我没意见;我只提醒你,这条路不能让更多人看见,否则它就不是暗门,是后门。」", "冷处理,不让它成为全国焦点": "「你想让时间冲淡这件事。」他说,「冷处理本身守住了秩序,可冷,不等于不处理。你若不给他一个程序上的交代,这口悬着的气,迟早会从别处冒出来。」", "借中间人传话,暗中安抚右翼": "「你借中间人传话,绕过一切公开契约。」他说,「暗处的话,是不落纸的承诺,它不认宪法,宪法也认不了它。你安抚了右翼,可你造出的那套『事上可以不走程序』的惯例,将来会反过来缠住你自己。」", "抢在右翼前面,把他写成共和国的受难者": "「你想抢在右翼前面,把他写成共和国的受难者。」他说,「可你也是在替一个人,预先定下『受难者』的定性,这定性,该由事实和程序来下,不该由政治需要来下。你在抢右翼的笔,同时也在抢司法的笔。」" }>> /* ─── R05 人质被枪决 ─── */ <<set $ddp_reviews.R05 = { "宣布全国哀悼,亲自出席葬礼": "「你出席葬礼,是人之常情。」他说,「可你让官方哀悼,替一个遇难者定了『英雄』的性,这定性,该有程序,最少也该有事实。你给了他哀荣,也给了后来人一个先例:哀荣,是可以无凭给的。」", "只发官方声明,不参与任何纪念": "「你守住分寸,只发声明,不越界定性。」他说,「这很难得。一个政府最难守住的,不是不表态,是表态时不替法律抢话。你这句话,说得克制。」", "压制右翼借此煽动的集会": "「你压了集会,用的是『安定』的名义。」他说,「可你压的时候,有没有给自己留一条『集会自由受宪法保护』的口子?我怕你压顺了手,以后凡是不合你意的声,都成了该压的。」", "暗中资助遗属,安抚人心": "「你帮了遗属,却让这笔账落在暗处。」他说,「善事不怕做,怕的是做得见不得光。你资助遗属是好的,可你让共和国的好,都躲进暗处,那法治的明处,就只剩下一张空桌了。」", "把他收编为共和国的民族象征": "「你收编他,等于替共和国认领一笔还没结清的账。」他说,「他的死因,该由调查和法庭去定,不该由『民族需要一个象征』去定。你把他供起来,可也把『真相可以绕过程序』供起来了。」" }>> /* ─── R06 柏林总罢工 ─── */ <<set $ddp_reviews.R06 = { "宣布戒严,强制复工": "「戒严,是宪法留给极端时刻的最后一道闸。」他说,「你用它对付一场罢工——罢工不是叛乱,工人在宪法里有说话的资格。你动用了最重的闸,去挡一扇本可以推开的门。你赢了今天,输了闸的含金量。」", "与工会谈判,承诺改善待遇": "「你坐下来谈,把争端放进谈判桌这个『程序』里。」他说,「这是法治该有的样子——不靠枪,也不靠蛮,让双方在规则里讨价还价。你选了最难走、也最该走的那条路。」", "压住不动,等罢工自己散": "「你等它自己散,看似不干涉。」他说,「可你不提供谈判程序,也不动用法定调停,等于让这场冲突在没有规则的地方自己烧。规则缺位的地方,烧完的,总是最讲道理的那头。」", "秘密给工会领袖递好处,分化罢工": "「你收买工会领袖,绕过了谈判桌。」他说,「你让一场本可以摆在明面上的分歧,变成了暗处的交易。你今天买得动一个领袖,明天就有人学你的样,买你的对手。暗箱,是会繁衍的。」", "借罢工危机,宣布第48条紧急状态": "「第48条,是宪法给共和国留的一扇紧急逃生门。」他说,「你用它来趁火打劫自己的权力——你越是把它当常备工具,这门就越廉价,直到有一天,谁都能一脚踹开它。你亲手,把宪法挖薄了一层。」" }>> /* ─── R07 DVP派组阁 ─── */ <<set $ddp_reviews.R07 = { "放手支持,把印信交给他": "「你把印信交出去,程序上无可指摘。」他说,「我只提醒一句:权力交接可以痛快,但接的人,得被宪法拴着。你痛快地给了印,也得让他痛快地知道,他那把椅子,是宪法允许他坐的那把。」", "有条件支持,派人进内阁监督": "「你派人进内阁,等于给权力上了个看得见的绳套。」他说,「这是最接近法治的做法——权力可以给,但必须有人看着。你守住了『看的职责』,这比给什么人更重要。」", "压着不签,再等等其他人选": "「你压着不签,总理的位置却空悬着。」他说,「权力空悬,本身就是一种越权——你让一个该由宪法程序落定的位置,悬在你的『再等等』里。空椅子的主人不是别人,是你每日的犹豫。」", "要求他先承诺不碰地租马克方案": "「你给就任加了条件,这很好——把『地租马克』写进他的承诺,等于把它纳入可追责的契约。」他说,「可承诺若非契约、不落纸、不追责,就只是声音。你最好让它,变成会咬人的条款。」", "公开支持他,但坚持共治": "「你坚持共治,把各党拉上桌,让权力在多方监督下运行。」他说,「这是共和国最健康的姿势——谁也不能一个人说了算。你守住的不是一个人,是『没有人能凌驾于程序之上』这件事。」" }>> /* ─── R08 消极抵抗收场 ─── */ <<set $ddp_reviews.R08 = { "果断终止,接受法国条件": "「你停了印钞机,让财政回到受约束的轨道。」他说,「终止抵抗,是让国家回到里外都守规矩的位置。你救了马克,也救了『国家不能无限透支自己』这条底线——只是这份代价,落在了工人肩上。」", "逐步收缩,给工人安置善后": "「你慢慢收,同时给工人善后,把退场也做成了有程序的事。」他说,「终止一场政策,最难的不是停,是让受影响的人有处可去。你这一步,让共和国的退场也守了规矩。」", "拖着,让抵抗自己断气": "「你拖着不决断,让它在半死不活里烂掉。」他说,「政策不是该放任自流的东西——它要么被程序正式终止,要么被程序正式延续。你的『拖』,等于让一个不合法的状态,偷偷续了命。」", "把结束的决定甩给国会表决": "「你把决定交给国会,让程序来拍板。」他说,「这是最守宪的做法——该由谁负的责,就放到谁的桌上。你不替国会决断,也不替自己免责,你只是把它放回了它该在的地方。」", "宣布抵抗胜利,体面收场": "「你给一场没有赢的仗,找了个『胜利』的结语。」他说,「你让国家体面地撒了手——可这结语不是由事实下的,是由需要下的。你教了人民一课:共和国的结论,是可以被『需要』改写的。」" }>> /* ─── R09 第48条紧急状态 ─── */ <<set $ddp_reviews.R09 = { "签署,并扩大紧急权力": "「你签了第48条,还扩大了它。」他说,「这是宪法留的逃生门,不是宅子的正门。你把它当正门用,还要把门框拆大——你请进来的不是秩序,是一个『总统可以绕过议会』的先例。这先例,会活过你。」", "签署,但限定三个月期限": "「你签了,却给它上了期限——你在紧急权力脖子上,拴了根能拽断的绳。」他说,「期限是宪法最好的朋友。你肯给自己设限,说明你还记得:权力越大,越该戴表。」", "拒绝签署,坚持议会路线": "「你拒签,坚持走议会。」他说,「这是最难走的一步——当街上的火烧起来,几乎所有手都想去拧那根紧急开关。你守住了闸,哪怕可能守不住城。可只要闸还在,城就还有重新立起来的骨头。」", "签署,但把监督权交给国会": "「你签了,却把监督权交给国会——你让行使权力的人,和看住权力的人,分开了。」他说,「这是制衡该有的样子。你给了自己权力,也给了共和国一只盯着你的眼睛。我宁可你多戴一副镣铐,也不愿你少一只眼。」", "签署,借机整顿各州": "「你用第48条整顿各州,等于把总统的令,凌驾于联邦制之上。」他说,「联邦制是写进宪法的——你借紧急之名,拆的是宪法的骨架。你今天能不听话的州攒顺了,明天就有总统,拿着你的先例,攒不顺的他。」" }>> /* ─── R10 巴伐利亚戒严 ─── */ <<set $ddp_reviews.R10 = { "调兵施压,逼巴伐利亚就范": "「你用军队压一个邦,等于把『邦与中央的分歧』,从宪法法庭搬到了兵营。」他说,「联邦制下,分歧有它的去处——法庭、议会、谈判桌。你让枪先去,等于告诉所有邦:规矩,是枪说了算。」", "发温和照会,寻求协商": "「你发照会,走协商,把联邦争端放进外交与程序。」他说,「这是处理邦际分歧最该有的样子——不咆哮,不动枪,让双方在纸面规则里找台阶。你这一手,守住了联邦制的体面。」", "默认放任,不承认也不反对": "「你放任巴伐利亚,不置可否。」他说,「宪法的事,不表态也是一种表态——你让违宪的状态,在没有反对票的情况下悄悄坐实。法律的沉默,比法律的错误更伤法治。」", "暗中支持巴伐利亚里的反对派": "「你在巴伐利亚埋反对派,绕过一切公开宪政渠道。」他说,「你让一个邦的合法政府,在你的暗手底下摇摇欲坠——这比军队弹压更隐蔽,也更毒。你越是不用宪法,就越是在教人也不用宪法。」", "公开把巴伐利亚定性为叛乱": "「你喊『叛乱』,用的是政治定性,不是司法定性。」他说,「叛乱,该由事实和法庭来认定,不该由总理一句话来宣判。你给一个邦贴了最重的标签——这标签一旦是政治发的,就再也撕不干净。」" }>> /* ─── R11 克姆尼茨KPD会议 ─── */ <<set $ddp_reviews.R11 = { "派警察包围,抓人拿证据": "「你让警察包围,抓人取证,走的是侦查程序。」他说,「抓人本身守规矩,我只问你一句:你抓了,有没有留给他们主张权利、请律师、上法庭的机会?法治的成色,不在抓得有多快,在放得有多讲理。」", "按兵不动,监视他们": "「你监视,不抓,让『犯罪意图』在证据不足时先悬着。」他说,「这是法治该有的耐心——不因怀疑就定罪,不因恐惧就动手。你让程序先跑,让证据说话,这比冲进去抓一百个人都更守宪。」", "透过工会警告他们别乱动": "「你借工会传话,用工人组织这座『程序之桥』去劝。」他说,「你让国家的声音,通过合法的工人渠道抵达他们——这比派警察闯门得体得多。可传话归传话,你最好也准备好,让他们享有法律的答辩机会。」", "公开谴责,逼他们放弃": "「你公开谴责,把『武装起义』四个字钉在公开处。」他说,「可谴责是政治表态,不是司法结论。你替还没审判的意图先定了罪——你让政治抢在法庭前面,对想遵守法治的国家,是危险的第一步。」", "把消息漏给右翼报纸,借刀杀人": "「你把情报漏给右翼报纸,借舆论的刀去杀。」他说,「你绕过了司法、警察、一切程序,让一份未经确认的指控,先被报纸定了性。你借的不是刀,是让法治彻底失语——你亲手教右翼,报纸比法庭更管用。」" }>> /* ─── R12 汉堡起义 ─── */ <<set $ddp_reviews.R12 = { "调国防军与警察,果断镇压": "「你调军队镇压起义。」他说,「共和国在自身存亡时动军队,法理上站得住——可站得住,不代表你不需要交代。你开了火,就得让这场镇压,事后能进得了调查、进得了追责。最怕的不是开枪,是开了枪,程序却哑了。」", "让工会与SPD去劝降,避免流血": "「你让工会和 SPD 去劝降,用谈判代替子弹。」他说,「这是法治最想看见的结局——分歧在规则和对话里化解,而不是在瓦砾里。你给起义者留了一条下台阶的路,也留给共和国一根不崩的弦。」", "不调军队,交给汉堡警方自己处理": "「你让警察处理,把军队留在兵营里。」他说,「你守住了『军队该对外、警察该对内』的宪法界线——这很重要。你怕的正是那个先例。可我也提醒你:警察若挡不住,你会不会坚持得住,不把枪口调回来?」", "承认起义根源,善后并改善待遇": "「你承认起义的根源,并且用善后去处理它。」他说,「你把『镇压』做成了『正本清源』——你把起义放回它诞生的社会成因里去解决,而不是只把它当叛乱来剿。这是最接近宪法精神的一片苦心。」", "借机清算,取缔共产党": "「你借镇压之名,取缔一个合法存在的政党。」他说,「取缔政党,是宪法最重的手术——它必须有明白的法定依据,不能是『因为他煽动』这种借来的理由。你让一个可以参与议会的党,被你的命令一夜除名。你今天取缔他,明天就有权力取缔你。」" }>> /* ─── R13 萨克森国防军 ─── */ <<set $ddp_reviews.R13 = { "默许军队解散萨克森政府": "「你默许军队解散一个邦的合法政府。」他说,「这是宪法最大的伤口之一——军队越过了『不干预民事』的线,而你是默许的人。你让一个州政府,死在军靴下而不是程序里。这一刀,割的是整个联邦制的动脉。」", "阻止军队,让议会解决": "「你拦住了军队,把争端交回议会。」他说,「这是宪法写的答案——各邦的分歧,该在议会和法庭里解,不该在兵营里解。你守住了『谁也不能用枪换政府』这条底线,我没什么可多说的,只郑重谢你。」", "下令军队撤出,避免流血": "「你把军队撤出来,让枪停在开火之前。」他说,「你避开了血,也避开了『军队决定政局』的恶例。可你撤的时候,大约也明白——军队记住了你这一次的『不敢』。你守住了宪法,却为自己在兵营里,树了一个敌人。」", "只解散KPD阁员,保留SPD": "「你只解散 KPD 阁员,留 SPD,看似折中。」他说,「可你让『解散』的依据,变成了党派而非法律——凭什么 KPD 的阁员该走,SPD 的该留?你给『按党派清洗』开了个先例。宪法不认党色,只认程序。」", "公开谴责军队越权": "「你公开谴责军队越权,把『军队不该管政治』这句话,摆到了台面上。」他说,「你喊得对——可光喊不够。你得让这句话,落成一条能被执行的规矩,让下一次,军队不敢再先斩后奏。谴责是声音,制度化才是宪法。」" }>> /* ─── R14 啤酒馆暴动 ─── */ <<set $ddp_reviews.R14 = { "调军镇压,追捕暴动头目": "「你镇压了暴动,追捕头目,让这场叛乱进了司法流程。」他说,「叛乱该镇压,头目该审——这是法治的底线。我只是提醒你:镇压之后,那双手必须交到法庭手里,让审判代替私刑。你只要守住『镇压完交给法律』,这件事就还能算干净。」", "让巴伐利亚警方自行处理": "「你把暴动交给巴伐利亚警方,守住了『地方事务归地方』的联邦界线。」他说,「可联邦制不等于放任——你得确认,巴伐利亚的警察会按法律办,而不是按邦里的情绪办。你放权了,也得让法律跟着。」", "等它自己垮掉,不介入": "「你旁观它垮掉,不介入。」他说,「你省了手,也省了让这场叛乱进程序的交代。可它垮了,头目却可能溜走——没有逮捕、没有审判,一次叛乱就这么不了了之。法治最怕的,不是乱,是乱过之后没人被追责。」", "借机整肃全国右翼武装": "「你借暴动之名,整肃全国武装。」他说,「整肃武装本可以走法定途径——可你用的是『借机』,是趁乱扩大权力。你收拾了右翼的枪,也收拾了『非法战时扩张权力』的戒心。你让共和国的整顿,沾了紧急的腥味。」", "利用暴动,向军队示好结盟": "「你借暴动向军队示好,把国家的安全保障,做成了与军方的私下结盟。」他说,「你让军队从『国家机器』,变成了『你的盟友』——这模糊了宪法最要紧的分界:军队属于国家,不属于任何一个人。你递出的橄榄枝,是系在宪法上的。」" }>> /* ─── R15 统帅堂进发 ─── */ <<set $ddp_reviews.R15 = { "下令军队开火,镇压到底": "「你下令开火,16个人倒在统帅堂前。」他说,「共和国面对叛乱,动用武力,法理上无可退避。可你我都该记住数字后面的事——这16条命,需要一个程序去交代,需要一个调查去回答『为何非开火不可』。镇压之后的法治,比镇压本身更难。」", "只让警察拦截,不调军队": "「你让警察去拦,不调军队。」他说,「你守住了『军队不轻易对内开火』的宪法闸门——这是对的。可警察的枪声,和军队的枪声,在受伤的人耳里是一样的。你选了节制,也得让这节制,事后经得起一条一条的追问。」", "压住消息,不让它传开": "「你压住统帅堂的消息。」他说,「你让一场死了人的冲突,从公众眼前消失——可真相有自己的腿。你越压,它越会从法庭、从报纸、从追责的请求里,自己走出来。法治不靠捂,靠敢把真相交给程序。」", "公开谴责,把头目送上法庭": "「你公开谴责,且把暴动头目送上法庭。」他说,「这是叛乱的正确归宿——谴责是政治,审判是法律,你让两者各归其位。共和国最漂亮的一仗,不是打赢了街上的枪,是让剩下的事,交给法庭收尾。」", "处理善后,安抚遇难者家属": "「你处理善后,安抚遗属。」他说,「你让一场镇压,有了『人』的收尾——这是对的。可善后是安抚,不是交代。遗属要的,除了抚恤,还有一句『为什么』。你得让这16条命,拥有一份它们配得上的程序。」" }>> /* ─── R16 货币改革 ─── */ <<set $ddp_reviews.R16 = { "果断改革,立即发行地租马克": "「你发行地租马克,按下了通胀——这是救命的决定。」他说,「可我问的不是要不要改革,是你有没有让改革走完该走的程序——国会的授权、央行的章程、法律的修订。你救了一个国家,但别让『救』本身,成为绕过一切规矩的理由。」", "新旧并行,分步过渡": "「你新旧并行,分步过渡,给市场留了缓冲。」他说,「改革最怕的不是慢,是从天而降。你让规则有过渡期,让旧马克有退路——这是法治式的改革:改了,但改得让人够得着新的规矩。」", "压住方案,再等等看": "「你压住改革方案,再多等一天。」他说,「你让『到底改不改』,悬在程序和决断之间——这一悬,又有几亿马克成了废纸。改革拖的不是时间,是无数人的命。你越迟让规则落地,越是在替混乱续命。」", "改革之外,补偿储蓄受损者": "「你改革之外,补偿储蓄受损者——你把『经济手术』和『对人的交代』放在一起做了。」他说,「改革最难的,不是让马克值钱,是让信了共和国一世的人,不至于一辈子的积蓄打了水漂。你这一笔补偿,是法治给人留的体面。」", "借机把央行收归政府,垄断金融权": "「你借改革之名,把央行收归政府。」他说,「央行本该独立于政府,这是宪法和金融的信条——你借着救命的机会,把金融的命门攥进了自己手里。你救国的同时,也在把国家的钱,变成你的手。这两件事,得分开看。」" }>> /* ─── R17 总理不信任案 ─── */ <<set $ddp_reviews.R17 = { "为他辩护,逆转不信任案": "「你为总理辩护,逆转了议会的不信任。」他说,「你用的是议会的程序,赢了议会的结果——这本身合法。我只提醒:你压退的是半个议会,是一个『总理可以对不起议会』的先例。你救了一个人,也把议会的话,压轻了一分。」", "保他留任外长,退下总理": "「你让他退下总理,留任外长——你既给了议会一个交代,也给人留了台阶。」他说,「这是最守程序也最体面的解:不硬顶议会的票,也不让一个救过共和国的人,连个去处都没有。政治的手腕里,难得见你这么遵规矩。」", "顺应议会,让他下台": "「你顺应议会的票,让他下台。」他说,「议会信不信任,是宪法给的程序——你让程序落地,不恋栈,不用总理位置做交易。共和国的体面,往往就藏在『敢让程序说了算』里。」", "借机改组,自己更多掌权": "「你借他下台改组,把权力往自己手里收。」他说,「议会的空缺,是共和国的机会,不是你的机会。你让一次本该属于宪法的更替,变成了一次个人权力的扩张——你赢了内阁,输了那句话:权力属于程序,不属于谁。」", "公开为他说话,落个义气": "「你公开为他说话,不为私利,只为那一句公道。」他说,「政治里最缺的,就是敢在风口上替人讲一句程序之外但良心上该讲的话。你这份义气,不伤宪法——倒让共和国,多了几分人味。」" }>> /* ─── R18 马克破万 ─── */ <<set $ddp_reviews.R18 = { "宣布紧急外汇管制": "「你宣布外汇管制。」他说,「管制若走法定程序、有期限、有监督,是合法的应急;若只是你一句话的命令,那就和总裁令没两样。我问的不是该不该管,是你管的时候,有没有让规则先替你踩一脚刹车。」", "约束物价,限制囤积": "「你约束物价,限制囤积。」他说,「这可以用价格法、用反囤积的法定条文来做——可你若只是用行政令压价,那市场的价格信号就被你掐住了喉咙。你管得住价签,管不住『价格该由什么定』这条法的底线。」", "承认救不了,坦诚面对": "「你承认救不了,坦诚面对。」他说,「这是最难的诚实——一个政府敢对人民说『我救不了』,说明它还没打算用谎言和法令去遮羞。诚实不违法,也不违宪。你这份坦白,比一百道救市令都难得。」", "发声明安抚,说局势可控": "「你让部长们说『可控』。」他说,「安抚不是谎言,可『可控』若与事实不符,就是拿国家信用去赌。你让共和国对它的公民撒了一个『局势可控』的谎——这谎,比通胀更伤法治的根基,因为法治的第一课,是国家不能骗自己的公民。」", "偷偷请外国资本帮忙": "「你请外国资本,走的是暗门。」他说,「外援不是坏事,可你让它不进议会、不进条约、不进任何公开契约——那它就成了见不得光的交易。你欠外国资本什么条件,共和国就得替你还什么。越暗的援,越是绕过程序的债。」" }>> /* ─── R19 中产破产 ─── */ <<set $ddp_reviews.R19 = { "承认中产破产,承诺补偿": "「你承认中产破产,并承诺补偿——你把一句没人敢说的话,放进了公开交代里。」他说,「认,是法治的第一步:国家得敢认它对公民造成的损失。承诺补偿,是给这损失一个程序上的出路。你这一步,让共和国欠的账,有了可追的方向。」", "宣布币制改革在即": "「你宣布币制改革在即,给了市场一个『新规则将至』的预期。」他说,「可预期若迟迟不落地,就只是画饼。改革该有明确的日期、授权、法律依据——你要么兑现,要么让这句话,成为共和国又一张到期不兑的支票。」", "咬死不认,说数字会好": "「你咬死不认,让他们信数字会好。」他说,「空存折比任何声明都诚实。你让共和国对破产的中产撒了一个『会好』的谎——这谎骗不了懂行的人,只骗得了那些最信共和国的人。法治最伤的,莫过于让最信它的人,先失望。」", "追责印钞的官员,平息民怨": "「你找了印钞官员背锅。」他说,「可印钞的决策,是集体做的、程序批的——你让一个人替整套程序顶罪,等于告诉公民:共和国的错,是可以找个人来担的。你平息了民怨,却让『追责』这个词,失去了它该有的分量。」", "发起储蓄救济,政府出资补底": "「你发起储蓄救济,政府出资补底。」他说,「这是共和国对信了它一世的中产,最实在的一次交代。你把它做成成文的救济、走程序的拨款、可追责的账——你让一次补偿,也长成了法治该有的样子。」" }>> /* ════════════════ S01-S13 暗涌事件专属评价(2026-10-02 补齐) ════════════════ 13 件暗涌 × 3 选项 = 39 条。键=现行选项文字(与 $red_opts 一致, party-reviews-rekey 启动按位兜底)。 */ /* ─── S01 总罢工升级为全国总动员 ─── */ <<set $ddp_reviews.S01 = { "倾力镇压,封锁铁路线": "他把你签的封锁令看了两遍,才开口。「罢工是宪法护着的行为,镇压它的每一道命令,都得回答依据哪一条。你今天拿军法去对工人,明天就有人拿它去对别人。这道口子一开,就再没有合上的先例。」", "分批谈判,分化各城": "「分批谈,是把乱局放回程序里,一处一处了结。」他说,「这比一道总动员令体面得多。只是『分而治之』这四个字,历史上没几个人用得干净。你谈的是诉求,不是人头——这条线守住,我就不说话。」", "顺应部分诉求,增发救济": "「你答应增发救济,我担心的从来不是钱,是程序。」他说,「这笔钱若进预算、过审议、可追查,那是国家该有的样子;若是你在办公室一句话拨出去,再体面的善举,也是一次绕开议会的开支。你把钱给对了人,也把它放进对的地方去。」" }>> /* ─── S02 汉堡起义点燃多城响应 ─── */ <<set $ddp_reviews.S02 = { "援引第48条,全国戒严": "「第48条是我最怕的一页。」他说,「不是我怕用它,是怕你用顺手。这是宪法给自己留的最后一道缝,你今天为几座城的骚乱就把它整个撑开——往后每一个不想走程序的掌权者,都会翻到这一页,指给你看。」", "集中打击汉堡,其余怀柔": "「你把打击收在一座城里,说明你还记得国家机器该有多长。」他说,「权力这东西撒出去容易,收回来难。你今天肯给它画个圈,我就还敢跟你讲程序。圈里那座城,也别忘了让法庭开着——戒严不是免检。」", "承认部分工人政府": "「你这一让,让出去的不是几座城,是宪法里『政权只有一个』那一行。」他说,「自治可以谈,让步可以谈,任何写进条文的安排我都陪你谈——可『承认』两个字一落纸,等于共和国亲口说:另立政权是可以谈成的事。这句话,你收不回来了。」" }>> /* ─── S03 啤酒馆暴动得逞:慕尼黑变色 ─── */ <<set $ddp_reviews.S03 = { "调兵平叛,收复慕尼黑": "「出兵收复一邦,是共和国能下的最重的命令。」他说,「我反对任何邦拿走自己,所以这一仗我不拦。可我要问清楚:动员令走的什么程序,由谁签、对谁负责?用最重的手段时若程序最含糊,赢下来的就不是共和国的胜利,是军队的胜利。」", "谈判周旋,拖延时间": "「谈判、周旋、拖延——这些不是宪法里的词,是手腕。」他说,「我不反对手腕,危机里没有手腕的政府活不长。可你每拖一天,就欠一条要兑现的说法。权宜之计最怕拖成惯例:今天没理由出兵,明天就更没理由。」", "默认现状,稳住其他邦": "「你在告诉全国:宪法今天管不到慕尼黑。」他说,「暂时的默许不是承认,这个分寸我也懂。可纸是记仇的——你今天放一邦出走,等于把『宪法效力到哪为止』写成了先例。往后每一邦不高兴,都会翻到这一天。」" }>> /* ─── S04 萨克森武装抵抗:国防军遇阻 ─── */ <<set $ddp_reviews.S04 = { "增兵强攻,彻底清剿": "「增兵强攻,是把政治问题交给刺刀去批。」他说,「我不替街垒辩护——动武抗法就是动武抗法。可国家动刀之前,得先穷尽法律的手段:谈判、让步、司法,一样没用过就开火,等于承认共和国的字典里只剩最薄的那一页。」", "谈判解散政府,避免流血": "「你没有用军队解决一个政治问题,你用政治解决了它。」他说,「政权更替走谈判,不走冲锋——这正是共和国该有的样子。他们散伙的那天,宪法没破一个洞。这一条,我记下了。」", "只清首脑,其余赦免": "「赦免可以,赦免也是宪法的字。」他说,「可赦免若是换取安稳的价码——名单私下拟、条件私下谈——那它就不是宽恕,是交易。共和国可以宽恕人,不可以拿宽恕做买卖。你把赦免状签得有根有据,我才认这是仁慈。」" }>> /* ─── S05 巴伐利亚与军方结盟:共和国裂痕 ─── */ <<set $ddp_reviews.S05 = { "清洗军方,整肃总参谋部": "「总参谋部不姓任何党派,它姓宪法。」他说,「军官私通一邦、瞒报柏林——查,该查,条文都是现成的。可『清洗』这个词我不爱听:查办走军法,撤职有名目,一间屋子一间屋子地清。你若凭一时怒气圈人,今天你清他们,明天别人就敢清你。」", "公开谴责,施压巴伐利亚": "「你把这件事放到太阳底下说。」他说,「这比密令好一百倍。秘密施压养的是交易,公开谴责立的是规矩——全国都听见了:邦不能私通军头。道义这东西,你今天存了一笔。可道义也是债,全国都在等它兑成行动。」", "默许结盟,换取时间": "「你知道,并且默认——这两件事加在一起,就是你的签字。」他说,「宪法管不了你心里怎么盘算,可它管得了知情不办的总理。你不是在换时间,你是在给一个体制外的同盟发执照。它一开张,就不认你的宪法。」" }>> /* ─── S06 地租马克失效:通胀持续失控 ─── */ <<set $ddp_reviews.S06 = { "追加担保,强行救市": "「追加担保,等于又开一张空白票据。」他说,「我不反对救市,我反对没写上限的救市。担保到哪一档、由哪个机关批、花到什么时候——三样写进条例,救市才是国家的行为;不写,它就是你一个人的赌注,而赌注是国家。」", "有限担保,只保工人储蓄": "「只保工人储蓄,是一个标准。」他说,「标准就是法律——你按什么划的这条线,工钱、数额、还是行业?划线得有条文。今天你按好心划,明天别人就敢按私怨划。保谁不保谁,让纸上说,别让嘴上说。」", "放弃担保,听任市场": "「你说『不担保』——不担保也是一个决定,也得有人为它负责。」他说,「我最不能接受的,是这个决定连个正式说法都没有:不出面、不签字、不解释,让它看起来像『本来如此』。国家可以败,不可以躲。你要放弃,就站出来放弃。」" }>> /* ─── S07 莱茵共和国分离运动 ─── */ <<set $ddp_reviews.S07 = { "宣布分离为叛国,派兵镇压": "「分离是不是叛国,不由政府一句话定,由法庭定。」他说,「我同意亚琛那帮人踩了线——可你把『叛国』当军令的理由用,而不是当罪名去起诉,宪法帮不了你。要办,就公审、公诉、有辩护。让全世界看见共和国用法办人,不是用兵。」", "不予承认,但避免与法国直接冲突": "「不承认,是把问题先搁在法律这一侧。」他说,「可你要记着:『不予承认』是个法律姿态,不是政策。政权可以不认,电报还得通,粮还得过河,公民还是公民。你把政治的门关了,法律的门不能也关上。」", "秘密资助当地反分离团体": "「你绕开了账本。」他说,「给钱可以,可这笔钱走的哪个科目、议会批没批?我守的宪法里,没有『政府的私房钱』这一页。暗账最大的坏处不在花,在于它一开,往后每一笔不能见光的开支,都会学它的样子走。」" }>> /* ─── S08 外交部长遇刺余波 ─── */ <<set $ddp_reviews.S08 = { "借刺杀案取缔右翼组织": "「取缔一个组织,法律里有这条路:危害共和国。」他说,「我只要一件:取缔必须因为他们组织本身违法,不因为他们碍事。你若借着满城悲愤,把讨厌的对手一并装进去——这个先例,迟早轮到别人拿来取缔我们。」", "只惩凶,不扩大打击面": "「只惩凶——这才是法庭该有的样子。」他说,「不是我冷,是程序就长这样:证据指向谁,审判谁。借一桩血案去清算一百个对手,看着解气,其实是拿法律当棍子。你今天守住这条线,共和国的法才还像个法。」", "强化共和国保护法,扩大政府权限": "「你提议扩权——这是我最难回答的问题。」他说,「杀部长的人证明这个国家手太软,可硬起来的那只手,不会只打该打的。要扩权,就把期限、范围、监督一并写死在条文里,一样不能少。不然今天救国的法,就是明天盖住宪法的布。」" }>> /* ─── S09 黑色国防军与秘密动员 ─── */ <<set $ddp_reviews.S09 = { "默许军方秘密准备,以备不时之需": "「秘密动员是宪政的事——军队对议会藏着一支武装。」他说,「你『以备不时之需』——我问你,『不时之需』由谁定义?军队说需要的时候,问过你吗?你今天不问,明天它就是既成事实:写在账外,长在墙里。」", "要求军方停止,避免外交危机": "「你要求他们停——这是内阁该有的第一次亮牌。」他说,「停不停得下来另说,要紧的是你亮了态度。军队对文官政府藏事,你第一次说要查、要停,这一步比结果重。宪法在军队面前是不是空话,就看这次他们怎么回话。」", "将秘密组织收编为政府控制下的准军事力量": "「收编不是口谕,是一场改编。」他说,「它归哪个部、经费走哪个科目、对谁宣誓——这三问没有书面回答之前,你做的不是收编,是给一支非法武装换了身合法的皮。要收,就立法来收:名册、饷源、军纪,一样一样写清楚。」" }>> /* ─── S10 农民运动与粮食拒售 ─── */ <<set $ddp_reviews.S10 = { "强制征粮,稳定城市供应": "「征用不是抢,宪法里有征用的条款——有偿、有据、可申诉。」他说,「你按条款来,我无话可说;你让队伍拿着枪去拉粮,那叫抄。农民护粮是护自己的血汗。你把『征』字写成公文,别把『抢』字写成行动。」", "提高农产品价格,安抚农民": "「你调了价,好过强征一百倍。」他说,「我只问范围:哪些品种、涨到哪条线、管多久?若是临时令,就写上期限——临时价格最怕临时变常年。价钱可以谈,规矩得先立。」", "允许地方自行协商,中央不介入": "「你把桌子留给地方,自己退到边上。」他说,「我不反对地方协商,联邦的架子本该如此。可我提醒你:他们谈崩的那天,找的还是中央。你今天不介入,就得先想好——谈崩之后,宪法给你的那几样工具,还在不在手里。」" }>> /* ─── S11 国防军内部政变密谋 ─── */ <<set $ddp_reviews.S11 = { "立即清洗涉嫌军官": "「证据够,就查办;不够,就再查。」他说,「我不劝你手软,我劝你手稳。政变密谋这种案子最怕两样:办漏了,和办错了凑数。名单外的同谋要追,名单上无辜的不能凑——这场审判是共和国给全军上的第一课,课本不能有错字。」", "只调离核心人物,避免震荡": "「你挑了最轻的一档,这不是纵容,是留有余地。」他说,「只是调离要有案底、有说法,归档在案。今日轻办是为了稳,可这笔账记下了——密谋若再有第二次,就不是调离能交代的了。」", "派密探渗透,搜集更多证据": "「派人进去,听可以,记可以。」他说,「可密探的手不能伸进去搅——若哪天为了钓大鱼递过一把火,你搜集的每一页纸,在法庭上都是烫手的。国家的密探只带眼睛和耳朵,别带手。你把他们圈在这一条里,这份证据才干净。」" }>> /* ─── S12 协约国最后通牒与赔款重谈 ─── */ <<set $ddp_reviews.S12 = { "全盘接受,换取占领结束": "「通牒照单全收,是国家的决定,不是你私人的认输。」他说,「这样的字,不能你一个人签——送国会,走表决,让宪法替你分担这份骂名。有国会印的屈辱,将来翻案才有凭据;你私人签的,将来连翻案的资格都是你的罪。」", "拒绝接受,坚持抵抗": "「你有权拒绝——条约没规定德国必须跪着活。」他说,「可拒绝之后,你把国家的命运重新押上了桌。我要两件事:抵抗的每一项措施都过内阁、过议会,别让『抵抗』两个字成了无限授权;二是给人民交底——抗多久,靠什么,实话实说。」", "提出反方案,争取英国支持": "「你把拳头收回去,重新递了纸。」他说,「这是我最愿意看见的:争端回到文字、条款和期限里。英国人愿意斡旋,那就走公开外交,别走密约——你要的是背书,不是把国家的事,换成对某个国家的私许。」" }>> /* ─── S13 新闻界与政府审查冲突 ─── */ <<set $ddp_reviews.S13 = { "加强新闻审查,查封煽动性报纸": "「你拿起的这把刀,先切的是宪法里最薄的那一页。」他说,「泄密有泄密的法律,煽动有煽动的罪名,都有现成的路走。你嫌慢,另开一条审查的快路——往后每个嫌法庭慢的掌权者,都走你这条。报纸可以吵死人,可报纸死光了,共和国连喊疼的地方都没有。」", "依法起诉个别报纸,不全面管制": "「逐案起诉——这就是我想让你说的那句话。」他说,「具体的报道、具体的罪、具体的法庭,不设审查,不列名单。今天骂你的报纸上了被告席,靠的是法律,不是你的怒气。法要这样用,新闻才会骂出分寸。」", "不干预,任由舆论自行争论": "「你把手收回来了。」他说,「骂政府骂得再凶,也是共和国该受得住的。『不干预』三个字从你嘴里说出来,我记下一笔,记在好账上。只有一样:泄密归司法管——你的『不干预』,别连法律也一起不干预了。」" }>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ DVP 红色事件专属评价(V1) 19 个红色事件 × 5 选项 = 95 条 + 13 个暗涌事件 × 3 选项 = 39 条,共 134 条。DVP 以「现实主义者」身份, 对玩家在每个重大历史事件中的选择,各说一句他的看法。 结构:$dvp_reviews[Rxx][选项文字] = 评价文本 角度:是否扛得住后果 / 是否走到走不通的死路 / 是否让国家 在谈得拢的地方动了手、在保得住命的地方烧了钱。 他不要德国变成瑞士,他要德国重新像个人,能坐下来,被人开门迎接。 由 party-supervise 按 _ev.deck_id + $opt_label 查表(2026-10-02 声音治理): 命中则用专属文本并微调信任;红色/暗涌未命中不开口,绝不回退通用三段。 本文件在 StoryInit 中通过 <<dvp-reviews-init>> 初始化。 ============================================================ */ <<widget "dvp-reviews-init">>\ <<silently>> <<set $dvp_reviews to {}>> /* ─── R01 鲁尔占领 ─── */ <<set $dvp_reviews.R01 = { "签署动员令,全面消极抵抗": "他合上文件,手指在桌面上停了一下。「动员令三个字好写,印钞机三台也好开。」他说,「可你算过没有,这一趟下来,国家要背多少?我见过为了争口气,把一辈子的家底都搭进去的人。你站得很直,可站直的人,也得吃饭。」", "召见法国大使,当面强硬抗议": "「你把他叫来,拍桌子,他回去照样驻军。」他说,「抗议是好东西,它不花钱。可你我都知道,这口气咽下去,法国人才肯谈。你对着他抬了脸,他转头就会把价码再抬一档。政务不是比嗓门,是比谁先掂清自己手里有什么。」", "起草照会,走外交谈判": "「这条路走得对。」他难得地松了眉头,「照会落到纸面,话就长脚了,能传出去,能被人一句句反驳,也能一句句改。谈判不是认输,是先把话摆齐了,再论输赢。你肯把力气花在这上头,我就还信这国家有人会算账。」", "秘密联络工会,组织鲁尔罢工": "「你把手伸进工人的口袋,借他们的手去戳法国人。」他说,「罢工起来容易,收尾难。工人停一天工,厂里少一天货,账却不会少记一笔。你动员的是他们的人心,可人心这种东西,借出去,是要连本带利还的。」", "压住不表态,等局势明朗": "「等局势明朗。」他重复了一遍这四个字,像在掂它的分量,「明朗是等来的吗?你不动,法国人可不等人。他今天多占一天,明天就多要一个说法。你手里那点余地,是闲坐能攒出来的吗?」" }>> /* ─── R02 国会授权消极抵抗 ─── */ <<set $dvp_reviews.R02 = { "全力推行,印钞补贴工人": "「印钞机开足马力那天,我就知道,这国家要拿未来还现在了。」他说,「工人领到的马克,是印的,不是挣的。你让它开一天,明天就得开两天。你堵的是眼前的口子,可你放出去的水,回头会淹到你自己头上。」", "有限抵抗,控制补贴规模": "「你留了半只手在刹车杆上。」他说,语气里有一丝不易察觉的认可,「不是我不想停,是怕你停不下来。你肯设个限度,说明你还没被那口气冲昏头。记住这个限度,别让明天的人劝你把它拆了。」", "只援助工人,不承认是政策": "「你做了事,却不肯给它个名分。」他说,「名分不是虚荣,是账。一件事下了文件,就好算钱,好追责,好喊停。你让它悬在口头,钱从这里漏出去,连个追查的地方都没有。越不肯落纸,越容易拖成烂账。」", "拒绝抵抗,直接谋求谈判": "「你被骂成投降派的日子,我替你数过。」他说,「骂你的人,不替你付印钞的债。谈判是疼,可疼完还能站起来。你选了这条挨骂的路,是因为你算得清,哪条路能走到头。这一趟,我跟你走。」", "拖延表决,让国会自己吵": "「你把球踢回国会,让它滚两天。」他说,「国会吵,是它的本分。可你等得起,马克等不起,工人也等不起。你每拖一天,报价牌就多跳一次。该让国会拍板的事,你该逼它今天拍,不是等它吵够。」" }>> /* ─── R03 埃森流血 ─── */ <<set $dvp_reviews.R03 = { "追加补贴,安抚工人人心": "「你又开了印钞机。」他说,「安抚是应该的,可你得知道,这笔钱是借来的,借的是国家的以后。你喂饱了埃森的今天,别让明天的人,替你还到抬不起头。」", "调军队进驻,维持秩序": "「你派兵进了工人区。」他说,「军靴一落地,账就不好算了。秩序是稳住了,可工人的气,会记在这一天。我懂你想按住局面,可你按下去的,往往会在别处再冒起来。能谈的时候,别急着动枪。」", "派调查团,查清真相": "「你派人去查,把真相摆到桌面上。」他说,「有人怕查,因为查出来要担责。你不怕,说明你愿意为这件事负责。这一趟查清,钱花得值——至少下次,没人敢再拿人命当借口。」", "扶持工会,升级抗争": "「你把埃森的火,接成了工会升级的引线。」他说,「火是烧起来了,可你想过没有,烧到最后,是法国人走,还是工人先受不住?你借工人张势,工人在一线流血,你在后方数人头。这账,你最好算清楚。」", "压住消息,暂不回应": "「你捂住了埃森。」他说,「消息是压住了,可人没压住。你越不回应,外面传的越玄。与其让它变成流言,不如你把话说明白。真相贵,可谣言更贵——谣言会连本带利,从你手里收回去。」" }>> /* ─── R04 法军拘留所人质 ─── */ <<set $dvp_reviews.R04 = { "官方声援,把他树成民族英雄": "「你把他捧起来了。」他说,「英雄是杆旗,能聚人也烧人。你这一捧,他没准就在法国人的牢里,被看得更紧了。你给的荣誉,他隔着一堵墙,未必领得到。可你要付的代价,这会儿已经写进法国人的条件里了。」", "秘密外交营救,低调向法国施压": "「你选了暗处那条路。」他说,语气里有一丝赞许,「不喊口号,不树旗,只在一个国家该使力的地方使力。抢救一个人,最要紧的不是让他听见你在喊,是让对面的人松手。你这条路,走得实在。」", "冷处理,不让它成为全国焦点": "「你想让这件事冷下去。」他说,「冷处理有个好处,不激化。可冷,也得有个温度——你不能让他一个人在牢里凉透了。你少喊一句,也许是在救他,也许是在放弃他。这里头的分寸,你得自己掂量。」", "借中间人传话,暗中安抚右翼": "「你给右翼递了话。」他说,「传话是门手艺,话传得准,两边都松手;传得歪,两边都记恨你。你走了中间人,就得指望他真把你的意思带过去。可你我都懂,暗处的话,不落纸,也就没人认账。」", "抢在右翼前面,把他写成共和国的受难者": "「你想抢在右翼前头,把旗先攥住。」他说,「可你抢的这面旗,是用人质的命做的。你把他写进共和国的叙事里,他就不是你的人了,是共和国的符号。符号是好用,可符号会替你做决定,你未必拦得住。」" }>> /* ─── R05 人质被枪决 ─── */ <<set $dvp_reviews.R05 = { "宣布全国哀悼,亲自出席葬礼": "「你去送他,是人之常情。」他说,「可你让全国哀悼一个死在法国人手里的人,等于把这件事,从一桩外交事件,做成了民族伤口。你给了哀荣,法国人记下了这笔账。哀恸是真的,可账,也是真的。」", "只发官方声明,不参与任何纪念": "「你发了声明,没添火。」他说,「这很难得。你守住了分寸——不把一个人的死,拿来当民族的柴烧。可你也得知道,你不烧,右翼会烧。你留的那份克制,挡不住他们手里的火把。」", "压制右翼借此煽动的集会": "「你压了集会。」他说,「集会一压,火是压下去了,可灰还在。你越压,右翼越会说政府怕人听见哭声。你该做的,不是只压,是把话讲清楚——是人都会死,但不能让一个死人,拖垮整个国家。」", "暗中资助遗属,安抚人心": "「你帮了他的家人,却不愿挂名。」他说,「帮人是好事,可钱一旦进了暗处,就没法认领,也没法算账。你做得对,可你为什么不肯让共和国,堂堂正正担下这份人情?好事不见光,久了,人心就凉了。」", "把他收编为共和国的民族象征": "「你把他供成了象征。」他说,「可象征是要人供养的。你把他收进来,往后每次外交让步,都会有人拿他压你——『你连他都能卖,还有什么是不能卖的?』你请进来的不是一面旗,是一个甩不掉的债主。」" }>> /* ─── R06 柏林总罢工 ─── */ <<set $dvp_reviews.R06 = { "宣布戒严,强制复工": "「你动了戒严令。」他说,「戒严是重锤,砸下去,秩序回来了,可工人记住的是那一锤。我懂你想让城市转起来——可你转起来的,是机器,不是人心。你赢回一天的生产,输掉的是往后许多天。」", "与工会谈判,承诺改善待遇": "「你坐下来谈了。」他说,「这是最难的一步,也是唯一能走到底的一步。谈成了,城市动了,工人也还记得你。可我得提醒你——承诺是要兑现的。你许给工人的,得从别处省出来还,别又去开印钞机。」", "压住不动,等罢工自己散": "「你等它自己散。」他说,「火会灭,可烧掉的东西不回来。工人停一天,厂里空一天,账却照记。你省下了谈判的麻烦,可你省下的,终归要连本带利还回去。等,不是办法,是拖延。」", "秘密给工会领袖递好处,分化罢工": "「你收买了楼上的人,楼下的人还在路上。」他说,「裂了的工会,比铁板一块更难谈。你拆散了他们,也拆掉了自己谈判的对桌——往后你想跟工人谈,找谁?你省了眼前的麻烦,断了往后的路。」", "借罢工危机,宣布第48条紧急状态": "「你借一场罢工,把第48条请了出来。」他说,「紧急状态是条绳子,你越用它,越顺手,越放不下。你用它对付一场罢工,下次就有人用它对付别的。你掀开的这个口子,往后谁也堵不上。」" }>> /* ─── R07 DVP派组阁 ─── */ <<set $dvp_reviews.R07 = { "放手支持,把印信交给他": "「你把印信交出去了。」他说,「他接得住,是好事。可你放手的这一刻,得想清楚——他接的是责任,不是功劳。你推他上台容易,可往后他做的每个决定,账都记在共和国头上。你扶他,也得看着他。」", "有条件支持,派人进内阁监督": "「你给他权力,也拴了根绳。」他说,「绳子绑得松紧,得看人。可你也得明白,绳子在国会,不在你手里。你派去监督的人,得真能看得住他,而不是去替他撑腰。权力这东西,没人看着,就会自己长。」", "压着不签,再等等其他人选": "「你多等一天,报价牌就多跳一次。」他说,「愿意接这个烂摊子的人,本就不多。你挑三拣四,是在跟时间过不去。共和国的椅子,坐得起敢坐下的人,坐不起挑三拣四的人。你等来的,未必比误过的强。」", "要求他先承诺不碰地租马克方案": "「你给他的就任,加了道锁。」他说,「他点头答应了。可你我都懂,承诺是锁,锁得住君子,锁不住救急的人。你防他,不如把方案写进章程,让白纸黑字替你看住他。口头的话,风一吹就没了。」", "公开支持他,但坚持共治": "「你把他推上台,也把各党拉上了桌。」他说,「共治是最稳的姿势——谁也不能一个人说了算。可也最慢,最磨人。你选了稳,就得受得住慢。共和国眼下最缺的,就是一根能拴住所有人的绳。」" }>> /* ─── R08 消极抵抗收场 ─── */ <<set $dvp_reviews.R08 = { "果断终止,接受法国条件": "「你停了印钞机。」他说,语气里有一丝疲惫,「这一刀下去,你大概是共和国里第一个敢说『我们撑不住』的人。停,是疼,可不当断则断,国家就替你断。你救了马克,也救了『国家不能拿将来还现在』这条理。」", "逐步收缩,给工人安置善后": "「你慢慢收针,还按住伤口。」他说,「见效慢,可工人还记得,你没把他们扔在半路。这条路又慢又贵,可它是唯一能走完的长线。你肯这么收,说明你心里有这本账,也有这几口人。」", "拖着,让抵抗自己断气": "「你不说停,也不说继续。」他说,「机器还在印,钱还在烧。你告诉自己这是策略,可马克不这么想,工人也不这么想。拖,是最体面的残忍——你省下了决定,让所有人替你背着决定。」", "把结束的决定甩给国会表决": "「你把烫手山芋扔给国会。」他说,「国会拍了板,通过了。可街头的火,不会因为一张表决就灭。你把责任摊给一百个人,等于一百个人都不负责——而共和国,最付不起的就是『不负责』。」", "宣布抵抗胜利,体面收场": "「你给没有赢的仗,找了『胜利』的结语。」他说,「面子保住了,里子呢?法国人拿走了煤,工人空着手回家。你安慰了人民,也安慰了自己。可账不会因为你体面就不来收——它只是晚一点来。」" }>> /* ─── R09 第48条紧急状态 ─── */ <<set $dvp_reviews.R09 = { "签署,并扩大紧急权力": "「你签了第48条,还把它掰大了。」他说,「紧急权力是灭火器,不是常备工具。你用它一次,就有人想用它一百次。你请进来的不是秩序,是一个『总统可以绕过议会』的先例。这个先例,会活得比你久。」", "签署,但限定三个月期限": "「你给它上了个闹钟。」他说,「闹钟会响,可权力最擅长的,就是关闹钟。你设的三月之期,是给共和国留的一口窗。可你最好自己记着去开——别等谁替你把它焊死。」", "拒绝签署,坚持议会路线": "「你拒签了。」他说,语气里有一分郑重,「难。当街上的火烧起来,几乎所有手都想去拧那根紧急开关。你守住了闸。可你也得明白,光守闸不够——你得让议会快起来,快过那把火,闸才守得住。」", "签署,但把监督权交给国会": "「你让紧急权力在国会眼皮底下跑。」他说,「监督是根绳子,可绳子会慢慢磨断。你交出去的那只眼,得一直睁着。最怕的不是你签,是你签了之后,连你自己都忘了还有人在看着。」", "签署,借机整顿各州": "「你借着紧急法,把不听话的州捋了一遍。」他说,「联邦的弦紧了。勒得越紧,断得越快。你收拾了巴伐利亚,可你忘了,共和国是许多只手托起来的。你按下一只手,别的手会记得,你按过它。」" }>> /* ─── R10 巴伐利亚戒严 ─── */ <<set $dvp_reviews.R10 = { "调兵施压,逼巴伐利亚就范": "「你把枪口对准了国内的自己人。」他说,「巴伐利亚缩回去了,可它记住了这个梁子。我懂你想按住它——可共和国不是靠枪杆子拼起来的,是靠各邦那点还肯坐在一起的信任。你会用枪,枪不会替你谈。」", "发温和照会,寻求协商": "「你递了根橄榄枝。」他说,「慕尼黑接了,没回话。沉默在柏林和慕尼黑之间,是一封完整的信。你不先开第一枪,这很难得。可你递了枝,那边也可能在磨刀——你得留神,别让橄榄枝成了靶子。」", "默认放任,不承认也不反对": "「你把手缩了回去。」他说,「巴伐利亚会把你的沉默,当成默许。你不想激化,可有时候,你的沉默本身就是一票,投给了最不想投的那边。你不表态,等于替它开了绿灯。」", "暗中支持巴伐利亚里的反对派": "「你在慕尼黑的墙脚埋了根引线。」他说,「可引线那头连着什么,你自己也看不清。你借刀,刀会记住你。暗处的事,往往比明处的枪,更先咬到共和国。你能借它一次,就有人学你,借它第二次。」", "公开把巴伐利亚定性为叛乱": "「你喊出『叛乱』两个字。」他说,「喊醒了一部分人,也把巴伐利亚彻底推到了对面。你用了最重的词,就收不回了。共和国的裂痕,不是用高音补的,是用一次次坐下来谈的耐心补的。」" }>> /* ─── R11 克姆尼茨KPD会议 ─── */ <<set $dvp_reviews.R11 = { "派警察包围,抓人拿证据": "「你抓了人,会开不成了。」他说,「可被你逼到地下的火,下一次会更猛。我不替他们说话——可我也想问你:你用枪压下去的火,是靠枪能一直压下去的吗?你能抓一次,抓得了几次?」", "按兵不动,监视他们": "「你让密探记下每个名字。」他说,「会散得掉,火种散不掉。你想看清楚他们,我懂。可看清之后呢?光看着不碰,火会越攒越旺。你盯了一屋子人,屋子塌的时候,你手里的名单,救不了你。」", "透过工会警告他们别乱动": "「你借工会传话。」他说,「有人听进去了,有人没有。你用了工人自己的地方去劝——这比警察闯门得体。可你得想清楚,传话的人,是在替你传,还是在替工人传。你手里的线,得牵着你自己这边的针。」", "公开谴责,逼他们放弃": "「你把阴谋摊在阳光下。」他说,「曝光让他们犹豫了一瞬。可犹豫的人,往往更想证明自己不犹豫。你当众骂了他们,是把他们逼到墙角——墙角里的人,最容易不管不顾冲出来。」", "把消息漏给右翼报纸,借刀杀人": "「你让右翼替你咬人。」他说,「KPD被咬得缩了——可借来的刀,早晚会架到你脖子上。你今天借右翼的笔,明天他就用这支笔写你。你递出去的每一下,都是在教别人怎么咬你。」" }>> /* ─── R12 汉堡起义 ─── */ <<set $dvp_reviews.R12 = { "调国防军与警察,果断镇压": "「你下令开了火。」他说,「三天后街垒被推平。你救了共和国一次——用的是它自己青年人的血。你赢下了汉堡,可那一枪,也开在了你自己的账上。往后还有人闹事,你都得问自己:还要再开几次?」", "让工会与SPD去劝降,避免流血": "「你让工人兄弟去劝,不想让军队再沾血。」他说,「这条路最难,也最像我认识的那个你。可我也得说——他们已经举了枪,劝降的话,未必听得进去。你派去的人,是去当朋友,还是去挡子弹?」", "不调军队,交给汉堡警方自己处理": "「你想避开国防军介入的先例。」他说,「可警察挡得住街垒吗?你省下的那个先例,是用更多条命填的。我懂你怕军队——可你怕错了地方。你该怕的,是让火在没人管的街角,烧得更久。」", "承认起义根源,善后并改善待遇": "「你把人从街垒上拉下来,用面包,不是子弹。」他说,「见效慢,可这是共和国唯一能走完的长线。你肯认起义的根源,这比一千句口号都重。工人会记住,是你先低了头——这一低头,值。」", "借机清算,取缔共产党": "「你灭了左翼的枪,也种下了右翼模仿你的念头。」他说,「方法会传染。你让『取缔』成了手段,明天就有人敢用同一个词对付你。你挖的坑,迟早会有人替你填上——填的土,是共和国的。」" }>> /* ─── R13 萨克森国防军 ─── */ <<set $dvp_reviews.R13 = { "默许军队解散萨克森政府": "「你让军队跨过了州界的线。」他说,「共和国第一次用军队,拆了自己政府的台——右翼在鼓掌。你教了军队一个道理:政府是可以被子弹换掉的。你埋下的这一课,总有一天会有人拿来教给你。」", "阻止军队,让议会解决": "「你拦住了军靴。」他说,「可你在赌:议会来得及,还是枪来得快。我陪你把这场赌下完——可你我都清楚,议会那根慢笔,比不过军靴落地。你得让议会跑得比枪快一次,就这一次,可能就够。」", "下令军队撤出,避免流血": "「你把手收了回来,枪没响。」他说,「可军队记住了一个『不敢用他们』的政府。你避开了这一场血,却也欠下了这笔账。这账今天不还,改天连本带利。你守住了规矩,可规矩不会替你挡枪。」", "只解散KPD阁员,保留SPD": "「你砍了共产主义的枝,留下民主的根。」他说,「可刀砍过的树,长出什么新芽,没人知道。你保住了我,我谢你。可我也怕,有朝一日,那把刀会指向保你的这只手。」", "公开谴责军队越权": "「你当众绳住了军政府的手。」他说,「你喊的是越权,军人们记住的是——政府竟然敢骂他们。你说了该说的话,可话进了墙,能不能传出去,要看你的枪,还是他的枪。光靠一句谴责,挡不住军靴。」" }>> /* ─── R14 啤酒馆暴动 ─── */ <<set $dvp_reviews.R14 = { "调军镇压,追捕暴动头目": "「你下令开了火,暴动一天就散了。」他说,「可那个趴在地上的人,会记住往哪跑。你赢了今天,却把一个受伤的名字,放进了他心里捂着——那东西,比枪还难对付。你抓得住他,抓不下他心里的那口气。」", "让巴伐利亚警方自行处理": "「你把刀交给巴伐利亚。」他说,「『处理』这个词,在慕尼黑和柏林不是一个意思。你省了自己的手,也松了共和国的缰绳。有些刀,交给别人,就再也收不回来了。」", "等它自己垮掉,不介入": "「你旁观一天,它确实垮了。」他说,「可站起来的那个,学会了穿西装、走国会,而不是冲啤酒馆。你等垮了一个闹剧,却养大了一个更懂规则的对头——这才是最让我睡不着的地方。」", "借机整肃全国右翼武装": "「你借着这晚的由头,把全国的枪搜了个遍。」他说,「可国会大厅里,还有人等着那把枪。你搜的是明面上的铁,搜不掉人心里的火。你能卸下他们的枪,卸不下他们胸口那口『下一次』的气。」", "利用暴动,向军队示好结盟": "「你借这颗火星,靠近了军队这团火。」他说,「他帮你按住了烛火——可火,从不听蜡烛的。你向军队示好,是把共和国的命门,交到一只看不清的手里。你赌他护你,我怕他反过来用你。」" }>> /* ─── R15 统帅堂进发 ─── */ <<set $dvp_reviews.R15 = { "下令军队开火,镇压到底": "「统帅堂前的枪声停了,16个人倒在广场上。」他说,「你保住了共和国,也造出了16个符号。你赢下了这一仗,可这16个名字,会成为你心里最沉的账,也会成为别人手里最亮的旗。你挡得住一时的火,挡不住这个名字。」", "只让警察拦截,不调军队": "「你让警察去挡。」他说,「可慕尼黑的街上,警察的枪声和军队的枪声一样响。你不想让军队沾血,可血已经沾了——只是从谁手上流的,不一样。你选了节制,可节制,也得经得起追问。」", "压住消息,不让它传开": "「你拦住了报纸。」他说,「可枪声和死亡瞒不住。被你压下去的消息,早晚在别处长出来。你压得住今天的头条,压不住明天的传说。有些事,越捂,越像在替它做广告。」", "公开谴责,把头目送上法庭": "「你把他送上被告席。」他说,「法庭成了他的舞台——你本想关住他,却给他发了一张传单。最会讲演的人,不怕站上被告席,就怕没人听他讲。你这一送,是关他,还是捧他?」", "处理善后,安抚遇难者家属": "「你给死者收了尸,给遗属递了钱。」他说,「可这16个名字,已经被有心人刻成了碑。你安抚了活人,安抚不了那座碑——它会长在他们心里,越刻越深。你做了对的事,可对的对面,站着更长的影子。」" }>> /* ─── R16 货币改革 ─── */ <<set $dvp_reviews.R16 = { "果断改革,立即发行地租马克": "「你按下了止血的手,通胀停了。」他说,「像变魔术。可中产一辈子的积蓄,一夜归了零。你救了马克,也抛弃了那些信了共和国一辈子的人。我懂你不得不做——可你得记得,是谁替你付了这笔账。」", "新旧并行,分步过渡": "「你给旧马克留了退路。」他说,「市场更乱,可人摔得轻一点。只是,通胀不给你慢慢来的时间。你这份心,我领——可在这座城里,慢,往往等于输。你赌的是时间站在你这边,可它未必。」", "压住方案,再等等看": "「你多想了一天,就这一天,又有几亿马克变成废纸。」他说,「改革不是你想不想,是马克替你决定。你等来的不是稳妥,是更贵的小麦。有些决定,拖一天,就是拿无数人的明天去填。」", "改革之外,补偿储蓄受损者": "「你一边止血,一边给被冲走的人递救生圈。」他说,「这很贵,可共和国需要有人记得他们。你做尽了能做的——我信你。可我也怕,这份补偿,会变成你往后日子里,最常被人提起的软肋。」", "借机把央行收归政府,垄断金融权": "「你借着救命的机会,把印钞机攥进了自己手里。」他说,「银行家们皱眉,可没人敢在这时候反对救命恩人。你抓住了钱,也就抓住了国家的命门——可命门这东西,攥得越紧,越像攥着一颗不响的雷。」" }>> /* ─── R17 总理不信任案 ─── */ <<set $dvp_reviews.R17 = { "为他辩护,逆转不信任案": "「你站到他那边,他留下来了。」他说,「可你为救一个人,压退了半个议会。他救过共和国,这我认——可你为了还他一个人情,把一整个议会都得罪了。这账,我怕你日后还不起。」", "保他留任外长,退下总理": "「你给他留了一道退场的门。」他说,「他保住了体面,椅子已经换了主人。你让一个救过共和国的人体面地退下来——这比硬按着他强。你做得对。可你也得想好,谁来接那把椅子。」", "顺应议会,让他下台": "「你让议会的票自己走,他走了。」他说,「共和国不是靠一个人撑的。可也不能让救过它的人,连个台阶都没有就掉下去。你放他走,是守了程序——可程序之外,还有一点人情,你留住了。」", "借机改组,自己更多掌权": "「你借他的走,稳了自己的坐。」他说,「权力越攥越紧的手,会让自己也被攥住。你趁人落难时接了他的椅子——我看见了。这不丢人,可你得记住,下一次,别人也会用同样的方法,来够你的椅子。」", "公开为他说话,落个义气": "「你替他讲了几句公道话,话不重。」他说,「可总有人在最冷的地方,记你的这点暖。你肯为他在最难的时候开口——这份义气,我记下了。共和国缺的,往往就是这一句公道话。」" }>> /* ─── R18 马克破万 ─── */ <<set $dvp_reviews.R18 = { "宣布紧急外汇管制": "「你按住了汇率的手,数字暂时稳了。」他说,「可逃出去的钱,正从荷兰和瑞士绕路回来。你堵的是明面上的口子,堵不住人心里的门。外汇管制是堵墙——可墙,总是有人翻得过去。」", "约束物价,限制囤积": "「你给面包定了价,排队的人松了一口。」他说,「可架子上很快又空了,因为货不进来。你管住了价签,管不住货源的脚。我知道你尽力了——可『尽力』两个字,在空架子上,显得那么轻。」", "承认救不了,坦诚面对": "「你说了实话:救不了。」他说,「诚实很贵——可至少没人再骗自己。我谢你没演那场『可控』的戏。共和国最缺的,就是敢对人民说真话的人。你说出来了,我就不怕它了。」", "发声明安抚,说局势可控": "「你让部长们说『可控』。」他说,「懂行的人不听——可街上的人需要一句话撑着。我明白你这是为稳人心。可你我都知道,这句话会反噬。等他们发现不可控的那天,恨你的,正是今天信你的。」", "偷偷请外国资本帮忙": "「你向外汇递了手,钱来了,条件也来了。」他说,「你欠的每一分,都长着嘴。我理解你走投无路——可你递出去的那根绳,往后会一直拽着共和国。你请进来的不是钱,是债。」" }>> /* ─── R19 中产破产 ─── */ <<set $dvp_reviews.R19 = { "承认中产破产,承诺补偿": "「你承认了那句没人敢说的话:他们的积蓄,没了。」他说,「安抚了人心,也往自己账上添了债。你肯认,这很难得——可一个只靠承诺撑着的中产,撑不住下一个冬天。你得让他们信,共和国真的会补偿。」", "宣布币制改革在即": "「你放出『新钱要来』的风,市场信了一半。」他说,「可这一天,旧钱还在烧。你给了他们一个盼头,也给了他们一根悬着的线。怕的是,新钱没来,旧钱先烧完了——那一半信你的人,会第一个反目。」", "咬死不认,说数字会好": "「你让官员们嘴硬。」他说,「可一张张空存折,比任何声明都诚实。你骗得了一时,骗不了他们手里那点烧成灰的纸。共和国最大的敌人,不是敌人,是让人信不起来的自己。」", "追责印钞的官员,平息民怨": "「你推一个人出去背锅,民愤缓了。」他说,「可谁都明白,印钞的不是那一只手。你让一个替罪羊平了这口气,可你亲手教会了他们:共和国的错,是可以找个人来顶的。这个道理,比通胀更毒。」", "发起储蓄救济,政府出资补底": "「你发起储蓄救济,给中产垫了底。」他说,「这很贵,贵到你可能赔上自己的政治前程——可你做了。共和国欠中产一份交代,你替它还了。也许明天没人记得你的名字,但那份存折里的底气,会有人记得。」" }>> /* ════════════════ S01-S13 暗涌事件专属评价(2026-10-02 补齐) ════════════════ 13 件暗涌 × 3 选项 = 39 条。键=现行选项文字(与 $red_opts 一致, party-reviews-rekey 启动按位兜底)。 */ /* ─── S01 总罢工升级为全国总动员 ─── */ <<set $dvp_reviews.S01 = { "倾力镇压,封锁铁路线": "「你封了铁路,货停在路上,厂停在城市里。」他说,「秩序恢复了,账单也就来了:运不走的货,开不了的工,全记在这个月。我不拦你动兵——我只提醒你,兵能平一天的事,平不了一个月的账。」", "分批谈判,分化各城": "「你一座城一座城地谈,像商人清账。」他说,「先收小额的,再谈大额的,次序对。我不怕你谈,我怕你谈出个高价——一座城开的价,别的城第二天照抄。你跟谁谈都行,价码得你自己定。」", "顺应部分诉求,增发救济": "「救济是息事的钱。」他说,「息事的钱也要还,还带利息。你今天多印的那一摞,明天就是面包价签上多出的一行。先稳住人,我懂——稳住之后你得回头按住通胀那只手,不然今天的救济,就是明天的火。」" }>> /* ─── S02 汉堡起义点燃多城响应 ─── */ <<set $dvp_reviews.S02 = { "援引第48条,全国戒严": "「全国戒严,港口先停,订单先跑。」他说,「英美商人已经在问:货到了汉堡还算不算数。我不反对你用重手——可重手一落,保险费、船运价码全要重算。你平的是起义,赔的是信用,这两笔账得一起算。」", "集中打击汉堡,其余怀柔": "「打一个,稳一片,这是算得过来的打法。」他说,「遍地开火是把钱扔进水里。你挑了祸源下手,其余的安抚——这话像行话了。我只多一句:汉堡打完,账目要清楚,别让平叛的钱变成说不清的烂账。」", "承认部分工人政府": "「你把一块地方签给了另一面旗。」他说,「从今天起,那片地上的厂、矿、铁路,都换了一套算法。商人最怕的不是乱,是不知道跟谁签合同。你省下镇压的子弹,赔出去一张完整的地图——地图撕开容易,拼回去要几十年。」" }>> /* ─── S03 啤酒馆暴动得逞:慕尼黑变色 ─── */ <<set $dvp_reviews.S03 = { "调兵平叛,收复慕尼黑": "「巴伐利亚走了,带走南边的税、厂和铁路。」他说,「出兵收回来是应该的——可你是往自己的国土上开战。铁路要修,桥梁要补,打坏的铺面没人敢接手。我算的不是伤亡,是账:收复一邦的造价,你报得上数吗?」", "谈判周旋,拖延时间": "「你在等价码落下来。」他说,「这我懂——买卖里最贵的是着急。慕尼黑那几个急人撑不久:他们喊得响,可面包要钱,枪也要钱。你拖住,让外汇和粮价先替你说话。这手不算软,算稳。」", "默认现状,稳住其他邦": "「你保住了其他邦,就是保住了还能做生意的七成德国。」他说,「慕尼黑丢了,骂名你背;剩下的地界不乱,日子还能过。商人做事,先保住开着的店,再想关了门的那间。你做的是这笔账,不是漂亮话。」" }>> /* ─── S04 萨克森武装抵抗:国防军遇阻 ─── */ <<set $dvp_reviews.S04 = { "增兵强攻,彻底清剿": "「强攻是最贵的做法。」他说,「炮弹、抚恤、重建,还有打完之后萨克森的厂子多久开工——你清剿的不是人,是你自己的税源。我不反对平乱,我反对用最贵的平法:能围,别攻;能困,别打。」", "谈判解散政府,避免流血": "「谈判收场,商场上的说法叫好聚好散。」他说,「没打的仗是不花钱的仗。工厂没停工,铁路没炸,这比什么胜利都实惠。军方会有意见——让他们来找我,我陪他们算:打了多少钱,谈了多少钱。他们算得清。」", "只清首脑,其余赦免": "「留下面干活的人,抓上面说话的人,这是裁员的规矩。」他说,「厂里出了事,没见过把整条流水线都抓起来的——真那么干,活就停了。你保住萨克森的开工率,只办为首的。军方嫌你手软?把这个月萨克森的产值拿给他们看。」" }>> /* ─── S05 巴伐利亚与军方结盟:共和国裂痕 ─── */ <<set $dvp_reviews.S05 = { "清洗军方,整肃总参谋部": "「你把手伸进总参谋部了。」他说,「我不替将军们说话——瞒着柏林干活,他们理亏。可你想清楚:眼下东边不安生,法国人还在看着。军心一散,最先动身的不是将军,是外国使馆。清洗的名单,能不能等边境安稳了再念?」", "公开谴责,施压巴伐利亚": "「公开谴责,一分钱不花。」他说,「做买卖的都懂:声明是成本最低的商品,也最不禁用。慕尼黑不会因为一纸声明把军头退回去。先说,我不反对——说完了,后手是什么?没后手的谴责,讲的人丢分。」", "默许结盟,换取时间": "「你在暗处做了一笔买卖,没有合同的那种。」他说,「没落纸的交易,头三个月是情面,之后全是把柄。慕尼黑握着你今天的沉默,想什么时候翻就什么时候翻。要谈就把条件写死;不写,你不是买时间,你是当铺。」" }>> /* ─── S06 地租马克失效:通胀持续失控 ─── */ <<set $dvp_reviews.S06 = { "追加担保,强行救市": "「你把最后一点家底又押上去了。」他说,「这步棋我不是没见过——公司快沉的时候,老板把房子押出去,有时真能挺过来。可你跟我讲实话:押完这一把,还有没有下一把?有,就押;没有,这一把就是替全体国民签的借据。」", "有限担保,只保工人储蓄": "「你挑着保。」他说,「工人的钱保住了,中产的、小店主的本子没保,他们明天就会去找你的对头。存款这种事,保一半等于没保——人人都在猜自己算不算那一半。要保就写清楚保到哪一档,别让人猜。猜,比亏钱更伤银行。」", "放弃担保,听任市场": "「你把担保撤了,让市场自己清账。」他说,「这一手搁在商场上叫割肉——疼,可是干净。烂账拖着,把好账也拖烂;现在割了,剩下的才养得活。我认这个做法,虽然明天满街都会骂你。」" }>> /* ─── S07 莱茵共和国分离运动 ─── */ <<set $dvp_reviews.S07 = { "宣布分离为叛国,派兵镇压": "「你要出兵,先算外交这本账。」他说,「莱茵兰在占领区里,你的兵一进去,条约、赔款、撤军时间表全要重谈——重谈的价码只在法国人手里涨。分离的人该办,可办他们的时机和工具,得挑不赔本的那种。」", "不予承认,但避免与法国直接冲突": "「你不承认,也不动作,就是晾着。」他说,「做生意最怕这种局面:货在对方手里,对方换了招牌,你又不认新招牌。莱茵的商人今天就在问:税交给谁?合同认哪边的章?你晾一年,他们就自己选一个章盖。沉默是选项里最贵的。」", "秘密资助当地反分离团体": "「你在暗处投资了一个团体,没有合同,没有对赌。」他说,「这种钱十个里九个打水漂,第十个回头咬你。我不主张政府做这种生意:做砸了没人认账,做成了功劳是别人的。真要投,先让人评估他们拿了钱干什么。」" }>> /* ─── S08 外交部长遇刺余波 ─── */ <<set $dvp_reviews.S08 = { "借刺杀案取缔右翼组织": "「你把几家右翼的门封了。」他说,「杀人的组织早该封,我不替他们喊冤。可你封一个,他们地下化一个,街上的子弹不会少,只会更没准头。还有:外国投资人看着呢——政党说封就封,他们要重新给『风险』标价。名单只圈真杀人的。」", "只惩凶,不扩大打击面": "「只办凶手,不惊动旁人。」他说,「这个分寸,商场叫就事论事。案子进法庭,报上热闹两天,投资人的心就放回去了。就这么办——快审,重判,让外国人看见德国的法庭是管用的。」", "强化共和国保护法,扩大政府权限": "「政府要更大的权限。」他说,「对做生意的来说不一定是坏事——只要他们管的是街上的枪,不是柜台上的账。你扩权我不拦,只求把边界写清楚:治安归治安,经济归经济。别让新的权力长出管生意的胳膊。」" }>> /* ─── S09 黑色国防军与秘密动员 ─── */ <<set $dvp_reviews.S09 = { "默许军方秘密准备,以备不时之需": "「他们瞒着内阁练兵,你替他们捂着。」他说,「捂得住吗?法国人的密探不是摆设。哪天照片登了报,赔款谈判桌上你拿什么脸坐下?丢的不是军方的脸,是德国的信用。暗账,迟早爆。」", "要求军方停止,避免外交危机": "「你把暗的事摆上了桌,法国人那边松了口气。」他说,「谈判桌上你的座稳了。可军里的账是另一本:你现在多了一个记你名字的圈子。做官的最怕两头——外头夸你,里头恨你。这道命令你得有后手,不然他们换个林子接着干,你还蒙在鼓里。」", "将秘密组织收编为政府控制下的准军事力量": "「散在林子里的枪,不如收进册子里的枪让人放心。」他说,「至少发饷的、领饷的,都进了国家的账。我认这个做法——只有一条:收编的队伍得是政府的,不是军方私库的。名册给我看一眼,钱从哪出,我替你把账理顺。」" }>> /* ─── S10 农民运动与粮食拒售 ─── */ <<set $dvp_reviews.S10 = { "强制征粮,稳定城市供应": "「你用征的,我劝你用买的。」他说,「农民不卖,不是囤,是亏——限价限到成本以下,谁卖谁赔。你把征粮的劲头拿去把收购价抬半成,粮车自己就进城了。征来的粮只管今天,价钱管一年。硬来,明年没人种。」", "提高农产品价格,安抚农民": "「你把价抬了。」他说,「这才像句行话——粮价归粮价,行情有人认,农人肯种,城里才有饭。通胀的账难看,断粮的账更难看,两害相权你挑了轻的。下一步盯住收购价,别让中间商把钱吃掉:钱进了口袋,粮还在乡下。」", "允许地方自行协商,中央不介入": "「你让乡里跟城里自己谈。」他说,「这省事:价钱是两下里认的,怨气也怨不着柏林。底下能自己了结的事,别拿到总账房来。你就盯一样——别让哪条路断粮断得太久。真饿出乱子,还是你的事。」" }>> /* ─── S11 国防军内部政变密谋 ─── */ <<set $dvp_reviews.S11 = { "立即清洗涉嫌军官": "「你把名单上的名字划掉了。」他说,「划得对。可你想过没有:清完这批,剩下的军官往后怎么看你?军队这东西,怕的不是它恨你,是它不怕你。清洗之后你得马上给一套新的人事,让军里知道柏林还是中枢。」", "只调离核心人物,避免震荡": "「外科手术挑了最小的刀口。」他说,「军队没乱,办公桌没翻,生意照做——这个局面我认。可留下看戏的那几位,心里都在称量柏林的手劲。调人可以,调完你得让人看见你另有一手,不然下次他们连名册都不给你看了。」", "派密探渗透,搜集更多证据": "「你把眼睛放进去了,这一手叫尽职调查。」他说,「查清楚再动手,办砸的概率小一半。我只提两件事:一是线人要养,别省这笔小钱;二是查实之前,一张纸都别落到报上——情报泄露出去,比密谋本身还贵。」" }>> /* ─── S12 协约国最后通牒与赔款重谈 ─── */ <<set $dvp_reviews.S12 = { "全盘接受,换取占领结束": "「你把这笔割肉的买卖做了。」他说,「做买卖的都懂:行情烂到底的时候,成交就是胜利。全盘接受是难听,可制裁一扩大,现在的价就是明天的折上折。你签的时候把撤军和分期锁死——这份屈辱好歹换回一个日期。骂名,我陪你听几天。」", "拒绝接受,坚持抵抗": "「你把门关了,火气是出了。」他说,「可对方的价码明天就涨,汇率今晚先给你个下马威。我不拦你硬气——你数数家底:外汇、存粮,够撑几轮制裁?撑不住的拒绝不是骨气,是赊账。」", "提出反方案,争取英国支持": "「你找英国人搭桥,递了反案。」他说,「这才叫谈判——通牒是开价,反案是还价,中间的才是生意。英国人怕法国人独吞,你正好借这个缝。还价不能太软,也不能虚:条件要谈得动、付得起。这一手走成了,比十个声明值钱。」" }>> /* ─── S13 新闻界与政府审查冲突 ─── */ <<set $dvp_reviews.S13 = { "加强新闻审查,查封煽动性报纸": "「你查封了几家报馆。」他说,「明天的骂声是小了。可投资人看着:德国的新闻说停就停,那工厂的报表、银行的公告,哪天也可以『缓发』?市场靠消息走得通。封报可以,别让外面的世界觉得德国的消息都过了滤纸。」", "依法起诉个别报纸,不全面管制": "「一条一条告,是打官司的规矩。」他说,「诉讼要钱要时间,报馆不怕,拖得起。我不反对你先这么办——可真到泄军机、乱行情那种报道,你就没工夫一条一条来了。先把这条慢路走通;快路的钥匙,握在手里别用。」", "不干预,任由舆论自行争论": "「你让报纸自己去吵。」他说,「行情会替你说话——真泄了密、真乱了套,读者自己会用退订教他们做人。政府下场越少,报纸之间越讲规矩。你留一只眼睛:哪家报馆后面站着外国钱。有这个,再谈别的。」" }>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ 地区事件库(第一阶段 · 短名单四区) 定位:给每个地区准备一批「有得解决的事」——既有反复出现的固定要事, 也有少量机动状况;玩家到一个地区,有具体的事可做、可被卷入, 而不是每天都换一张新的脸。 kind: "要事" 固定特征物品/事务,反复出现、可被玩家处理(如军官俱乐部门口的老兵抚恤)。 "状况" 机动状况,带冷却,不天天冒出来(负面/正面都在此,调控频率)。 avail:条件对象(op 比较 world/party 值),与 fb 事件一致的判定思路。 effects:键名一律走下方 re-apply-effects,命名同文件栏库: 政党信任 spd kpd ddp dvp zentrum dnvp nsdap army 世界变量 economy inflation social_anger political_violence nationalism revolution gov_trust army_influence intl_trust 玩家状态 idealism fatigue isolation insider observer 刷新/按冷却调度、如何挂到地区页(区域警报/场景内嵌)——留到后续任务, 本文件只负责「库」的数据与结构。 地区主关联: tiergarten 蒂尔加滕 → 军方 / DNVP kurfurstendamm 选帝侯大街 → DDP / DVP kreuzberg 克罗伊茨贝格 → SPD alexanderplatz 亚历山大广场 → 中立 / 中央党 · 信息枢纽 ════════════════════════════════════════════════════════════ */ /* ---------- re-apply-effects:应用单个地区事件选项的效果 ---------- 用法:<<re-apply-effects _effects>> 在 <<link>> 回调内联调用 */ <<widget "re-apply-effects">>\ <<silently>> <<set _fx to $args[0]>> <<if _fx.spd>><<trust-capped "spd" _fx.spd>><</if>> <<if _fx.kpd>><<trust-capped "kpd" _fx.kpd>><</if>> <<if _fx.ddp>><<trust-capped "ddp" _fx.ddp>><</if>> <<if _fx.dvp>><<trust-capped "dvp" _fx.dvp>><</if>> <<if _fx.zentrum>><<trust-capped "zentrum" _fx.zentrum>><</if>> <<if _fx.dnvp>><<trust-capped "dnvp" _fx.dnvp>><</if>> <<if _fx.nsdap>><<trust-capped "nsdap" _fx.nsdap>><</if>> <<if _fx.army>><<trust-capped "army" _fx.army>><</if>> <<if _fx.economy>><<set $world.economy to Math.max(0, Math.min(100, $world.economy + _fx.economy))>><</if>> <<if _fx.inflation>><<set $world.inflation to Math.max(0, Math.min(100, $world.inflation + _fx.inflation))>><</if>> <<if _fx.social_anger>><<set $world.social_anger to Math.max(0, Math.min(100, $world.social_anger + _fx.social_anger))>><</if>> <<if _fx.political_violence>><<set $world.political_violence to Math.max(0, Math.min(100, $world.political_violence + _fx.political_violence))>><</if>> <<if _fx.nationalism>><<set $world.nationalism to Math.max(0, Math.min(100, $world.nationalism + _fx.nationalism))>><</if>> <<if _fx.revolution>><<set $world.revolution to Math.max(0, Math.min(100, $world.revolution + _fx.revolution))>><</if>> <<if _fx.gov_trust>><<set $world.gov_trust to Math.max(0, Math.min(100, $world.gov_trust + _fx.gov_trust))>><</if>> <<if _fx.army_influence>><<set $world.army_influence to Math.max(0, Math.min(100, $world.army_influence + _fx.army_influence))>><</if>> <<if _fx.intl_trust>><<set $weimar.mid.intl_trust to Math.max(0, Math.min(100, $weimar.mid.intl_trust + _fx.intl_trust))>><</if>> <<if _fx.idealism>><<set $player.mental.idealism to Math.max(0, Math.min(100, $player.mental.idealism + _fx.idealism))>><</if>> <<if _fx.fatigue>><<set $player.mental.fatigue to Math.max(0, Math.min(100, $player.mental.fatigue + _fx.fatigue))>><</if>> <<if _fx.isolation>><<set $player.mental.isolation to Math.max(0, Math.min(100, $player.mental.isolation + _fx.isolation))>><</if>> <<if _fx.insider>><<tag-add "知情者" "micro" _fx.insider "观察" "weimar" "region">><<set $active_tags to $ret>><</if>> <<if _fx.observer>><<tag-add "观察者" "micro" _fx.observer "观察" "weimar" "region">><<set $active_tags to $ret>><</if>> <</silently>>\ <</widget>> /* ---------- region-event-init:初始化地区事件库 ---------- 用法:<<region-event-init>>(幂等;由 StoryInit 调用) 写入 $region_events(短名单四区) */ <<widget "region-event-init">>\ <<silently>> <<set $region_events to [ /* ════════════════ 蒂尔加滕 · 旧精英与军方 ════════════════ */ { id: "tier_01", region: "tiergarten", kind: "要事", title: "军官俱乐部台阶上的老兵", avail: { stat: "world.army_influence", op: "gte", val: 30 }, desc: "老兵的军服洗得发白,袖口的扣子换过不止一回。他站在台阶下,没上来,也不走。//「我们这样的人,排了多少年的队?问一声,你们打算怎么处置那些比利时人。」", options: [ { label: "当面应承,说会给个说法", effects: { army: +2, gov_trust: -1, idealism: -1 }, narrative: "你答应得干脆。他点了一下头,像是早就知道是这个答案,只是需要有人亲口再说一遍。" }, { label: "只安抚,不承诺具体日子", effects: { gov_trust: +1, army: +1, fatigue: +1 }, narrative: "你没有把话说死,只让他相信有人记着这件事。台阶上的那截烟头按进雪里,算是默认。" }, { label: "说这是军事辖区的事,与他无关", effects: { army: -3, social_anger: +1 }, narrative: "他站在那里,半晌没接话,最后自己转过身走开。你没看清他的脸,看清了也没用。" } ], cooldown: 3 }, /* ═══ 蒂尔加滕 · 要事 · 军官议(反负面的固定出口) ═══ */ { id: "tier_02", region: "tiergarten", kind: "要事", title: "军官俱乐部的晚宴桌", desc: "长桌只摆了六副刀叉,坐着的却只有三个人。话题总绕着一个问题转://«秩序还要不要人守?»// 有人把一支雪茄横放在桌布上,像把尺子,量着你的沉默应该多长。", options: [ { label: "听,不表态", effects: { insider: +1, fatigue: +1 }, narrative: "你只听。烟灰缸里的烟一根接一根灰化,你一个字也没落进谁的把柄里。" }, { label: "暗示可以谈条件", effects: { army: +3, dnvp: +2, idealism: -2 }, narrative: "你没答应什么,但也没否认什么。桌布上那支雪茄被收走了,像是尺子量过了、又放回去了。" }, { label: "把话题岔到不该扯的薪水帐上", effects: { army: -2, ddp: +2 }, narrative: "话题被你四两拨千斤地挪走。有人低头看餐盘,有人看你,席间那点热络稀了一些。" } ], cooldown: 2 }, /* ═══ 蒂尔加滕 · 状况 · 军方密报(机动,负面向但低频) ═══ */ { id: "tier_03", region: "tiergarten", kind: "状况", title: "一张没署名的纸条", avail: { stat: "world.political_violence", op: "gte", val: 40 }, desc: "门缝里递进来一张叠得很小的纸条,没抬头,只有两行字://«摩泽尔河畔的仓库,半夜有军车进出。没人登记。»// 字迹很生,像是用左手写的。", options: [ { label: "查这条线", effects: { insider: +2, fatigue: +2 }, narrative: "你顺着纸条去查。仓库门锁着,锁孔是新的。你记下几个车牌的轮廓,把它锁进抽屉。" }, { label: "压下去,不当回事", effects: { army: -1, political_violence: +1 }, narrative: "你把纸条压在公文下面。也许该查,也许不该。总之它先躺着,和别的没办完的事一起躺着。" } ], cooldown: 5 }, /* ════════════════ 选帝侯大街 · 新西部与波希米亚 ════════════════ */ { id: "kud_01", region: "kurfurstendamm", kind: "要事", title: "交易所门口的一叠催单", avail: { stat: "world.economy", op: "gte", val: 35 }, desc: "交易所的橱窗玻璃上贴着当天的牌价,数字比昨天又厚了一截。门口有人把一叠催单递给你,都是供货商写的://«要不今天结一笔,要不中旬别见面。»//", options: [ { label: "先结一笔,稳住商户", effects: { economy: -2, dvp: +2, gov_trust: +1 }, narrative: "你批了一笔款子下去。催单的主顾拿到回执,脸色没变,但手腕松了。" }, { label: "拖几日,看汇率再说", effects: { economy: +2, dvp: -1, inflation: +1 }, narrative: "你把催单归到「不急」那一摞。桌角的牌价还在往上走,你赌它先替你付一部分。" } ], cooldown: 2 }, { id: "kud_02", region: "kurfurstendamm", kind: "要事", title: "咖啡馆里的那种安静", desc: "午后那家咖啡馆比平时静。只有一桌还坐得满,桌上是摊开的报纸和没喝动的咖啡。有人在等人,等的人不是你,但你落座时,他的眼睛抬了一下,又低下去。", options: [ { label: "问一句他在等谁", effects: { insider: +1, ddp: +1 }, narrative: "他没说座位留给了谁,只说人到得比约定的晚,这种事最近越来越多。" }, { label: "什么也不问,喝完就走", effects: { ideal: +0, fatigue: +1 }, narrative: "你喝完那杯就起身。那桌的安静仍在,像递给谁的、一直没人接的一句话。" } ], cooldown: 3 }, /* ════════════════ 克罗伊茨贝格 · 工人与左翼 ════════════════ */ { id: "kre_01", region: "kreuzberg", kind: "要事", title: "工会院子里那袋发潮的土豆", desc: "工会的院角堆着几袋土豆,有几袋已经发潮,隐隐有股味道。管事的男人用拇指顶着袋角看了你一眼://«发下去是救济,堆着是烂。你说了算。»//", options: [ { label: "发下去,先顾这批人", effects: { spd: +3, social_anger: -2, economy: -1 }, narrative: "你点头。男人没多话,招呼人把袋子扛走。街角排队的队伍往前挪了一截。" }, { label: "留下当种子,秋后再算", effects: { economy: +1, spd: -2, social_anger: +1 }, narrative: "你说先留种子。院里静了一瞬,那男人把袋口重新捆好,什么也没说。有些决定,做的人不会立刻听见回声。" } ], cooldown: 2 }, { id: "kre_02", region: "kreuzberg", kind: "要事", title: "墙上的那行白漆", desc: "一面旧墙上新刷了一行白漆,句子已经被人擦了一半://«面包……或……»// 剩下的字在夜里被路灯照得很清楚,白天看,就是一道白印子。有人在旁边用炭笔补了三个字:别问。", options: [ { label: "让人照原样留着", effects: { observer: +1, social_anger: +1 }, narrative: "留着的墙是一句没写完的话,也是一扇没关严的窗。记下它,等它自己补全。" }, { label: "让人刷掉", effects: { social_anger: -1, kpd: -1 }, narrative: "白漆很快盖住了。街角有人朝这边看了一眼,没出声,走开了。" } ], cooldown: 3 }, /* ════════════════ 亚历山大广场 · 公共枢纽 ════════════════ */ { id: "ale_01", region: "alexanderplatz", kind: "要事", title: "报亭前比面包店还长的队伍", desc: "报亭前排的队伍拐了个弯。也不是人人都买报纸,有些只是借着抬头看头条的工夫,把脸转向别处这半分钟。今天的头条又换了一个时间,没人问你买不买。", options: [ { label: "买一份,站在街角看完", effects: { insider: +1, fatigue: +1 }, narrative: "你付了钱,站在街角把那份报纸看完。数字、地名、一个又一个的「呼吁」。看完你就把它折好夹进怀里。" }, { label: "让秘书每天来抄头条归档", effects: { insider: +1, gov_trust: +1 }, narrative: "你说,每天的头条抄一份送到你桌上。报亭前排队的队伍没变,但从此斜对面的楼上天天多一个正在等人的人。" } ], cooldown: 2 }, { id: "ale_02", region: "alexanderplatz", kind: "要事", title: "广场东南角那辆不动的电车", desc: "一辆电车停在广场东南角,很久没动,轮子下垫着砖头。车门开着半扇,没有人上下。远处有人拿它当约会的地标://«就在电车站找你,保准认得出。»//", options: [ { label: "过问一句这车为何停着", effects: { gov_trust: +1, fatigue: +1 }, narrative: "线路工说煤不够,暂时跑不了。你听了,没接话。有些停滞不问也罢,可人总爱盯着一句开头。" }, { label: "不管,留给那截电车站当路标", effects: {}, narrative: "你让它继续停着。广场上总得有个不动的参照,人才好往别处走。" } ], cooldown: 3 } ]>>\ <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ 秘密结盟系统(结盟系统设计 v2 §2/§3) P1:数据模型 + 暴露值递增 + 四级判定 - alias: 玩家当前光谱($spectrum.left_right 归一化) - secret-exposure-compute:按对立差算 base exposure - secret-establish:建立一条秘密结盟(设初始 exposure) - secret-contact-add:去该党地盘/接触一次 +1(影响递增) - secret-exposure-tick:每3天递增 exposure + 四级判定 四级:安全(<30) / suspect疑(30-60) / flagged风声(60-80) / 暴露(>=80) 自我认同 self_identity 越低 → 判定阈值整体上移(更难暴露) 知情者越高 → exposure 递增越慢(越会藏) ============================================================ */ /* ---------- secret-lean:玩家当前政治lean(-1~1) ---------- 从 $spectrum.left_right(-100~100)归一化。 */ <<widget "secret-lean">>\ <<silently>> <<set _player_lean to $spectrum ? ($spectrum.left_right / 100) : 0>> <</silently>>\ <</widget>> /* ---------- secret-ideology-dist:玩家与某党意识形态距离(0~2) ---------- 用法:<<secret-ideology-dist "kpd">> 输出 _ideology_dist */ <<widget "secret-ideology-dist">>\ <<silently>> <<set _sid_pid to $args[0]>> <<set _sid_player_lean to 0>> <<if $spectrum and $spectrum.left_right>><<set _sid_player_lean to $spectrum.left_right / 100>><</if>> <<set _sid_party_lean to 0>> <<if $party_profile and $party_profile[_sid_pid] and $party_profile[_sid_pid].lean>> <<set _sid_party_lean to $party_profile[_sid_pid].lean>> <</if>> <<set _ideology_dist to Math.abs(_sid_player_lean - _sid_party_lean)>> <</silently>>\ <</widget>> /* ---------- secret-exposure-thresholds:当前判定阈值 ---------- 输出 _thr_suspect / _thr_flagged / _thr_expose 基准 30/60/80,自我认同越低阈值整体上移(更难暴露)。 */ <<widget "secret-exposure-thresholds">>\ <<silently>> <<set _sid2 to 80>> <<if $weimar and $weimar.self_identity>><<set _sid2 to $weimar.self_identity>><</if>> <<set _thr_shift to (100 - _sid2) * 0.3>> <<set _thr_suspect to 30 + _thr_shift>> <<set _thr_flagged to 60 + _thr_shift>> <<set _thr_expose to 80 + _thr_shift>> <</silently>>\ <</widget>> /* ---------- secret-intel:当前知情者值(0~30) ---------- 知情者越高越会藏 → exposure 递增越慢。 */ <<widget "secret-intel">>\ <<silently>> <<set _intel_now to 0>> <<for _ti to 0; _ti lt $active_tags.length; _ti++>> <<if $active_tags[_ti] and $active_tags[_ti].name eq "知情者">> <<set _intel_now to Math.min(30, $active_tags[_ti].intensity)>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- secret-establish:建立一条秘密结盟 ---------- 用法:<<secret-establish "kpd">> 设 established_day=当前、初始 exposure=20+对立差*1.0、 重置 suspect/flagged/broken。 */ <<widget "secret-establish">>\ <<silently>> <<set _se_pid to $args[0]>> <<if $secret_ledger and $secret_ledger[_se_pid]>> /* 第0天立约时 session_day=0,会与「未立约」状态混淆导致暴露永不递增,故至少记为1 */ <<set $secret_ledger[_se_pid].established_day to Math.max(1, $session_day)>> <<secret-ideology-dist _se_pid>> <<set $secret_ledger[_se_pid].exposure to Math.min(100, 20 + _ideology_dist * 1.0)>> <<set $secret_ledger[_se_pid].suspect to false>> <<set $secret_ledger[_se_pid].flagged to false>> <<set $secret_ledger[_se_pid].broken to false>> <</if>> <</silently>>\ <</widget>> /* ---------- secret-contact-add:公开接触计数 +1 ---------- 用法:<<secret-contact-add "kpd">> 去该党地盘/或其接触一次,暴露递增加快。 */ <<widget "secret-contact-add">>\ <<silently>> <<set _sc_pid to $args[0]>> <<if $secret_ledger and $secret_ledger[_sc_pid] and $secret_ledger[_sc_pid].established_day gt 0 and not $secret_ledger[_sc_pid].broken>> <<set $secret_contact[_sc_pid] to ($secret_contact[_sc_pid] ? $secret_contact[_sc_pid] : 0) + 1>> <</if>> <</silently>>\ <</widget>> /* ---------- secret-party-lean:该党败治 lean(-1~1) ---------- 用法:<<secret-party-lean "kpd">> 输出 _party_lean_now */ <<widget "secret-party-lean">>\ <<silently>> <<set _p_lpid to $args[0]>> <<set _party_lean_now to 0>> <<if $party_profile and $party_profile[_p_lpid] and $party_profile[_p_lpid].lean>> <<set _party_lean_now to $party_profile[_p_lpid].lean>> <</if>> <</silently>>\ <</widget>> /* ---------- secret-exposure-tick:每3天递增 exposure + 四级判定 ---------- 用法:<<secret-exposure-tick>> (daily-tick 每日调用,内部按3天节拍结算) 单线基础:exposure += 接近度*0.4 + 接触*0.8 + 时间磨损3 - 知情者*0.4 接近度 = 1 - |玩家lean - 该党lean|(越接近越易被认出) 多线负担:同时结多线且彼此对立 → 每条线额外 + Σ|lean差|*0.3 自我认同低 → 阈值上移(见 secret-exposure-thresholds)。 ★ 节奏目标:正常玩家(知情者≈5、偶尔办事)约60天到风声、120天到暴露。 */ <<widget "secret-exposure-tick">>\ <<silently>> <<set _sexp_day to $secret_tick_day ? $secret_tick_day : 0>> <<set _sexp_day to _sexp_day + 1>> <<set $secret_tick_day to _sexp_day>> <<if _sexp_day % 3 eq 0>> <<secret-intel>> <<secret-exposure-thresholds>> <<set _sexp_pids to []>> <<if $secret_ledger>><<set _sexp_pids to Object.keys($secret_ledger)>><</if>> <<set _player_lean to 0>> <<if $spectrum and $spectrum.left_right>><<set _player_lean to $spectrum.left_right / 100>><</if>> /* 第一遍:单线基础暴露 */ <<for _si to 0; _si lt _sexp_pids.length; _si++>> <<set _spid to _sexp_pids[_si]>> <<set _rec to $secret_ledger[_spid]>> <<if _rec.established_day gt 0 and not _rec.broken>> <<secret-party-lean _spid>> <<set _prox to Math.max(0, 1 - Math.abs(_player_lean - _party_lean_now))>> <<set _contact to $secret_contact[_spid] ? $secret_contact[_spid] : 0>> <<set _incr to _prox * 0.4 + _contact * 0.8 + 3 - _intel_now * 0.4>> /* 红堡态度:警察总监信你 → 递增放缓;不信 → 递增加快 */ <<if $npcs.police>> <<if $npcs.police.trust gte 50>> <<set _incr to _incr - 1>> <<elseif $npcs.police.trust lte 20>> <<set _incr to _incr + 1>> <</if>> <</if>> <<set $secret_ledger[_spid].exposure to Math.max(0, Math.min(100, _rec.exposure + _incr))>> <</if>> <</for>> /* 第二遍:多线负担(双面矛盾) */ <<for _si to 0; _si lt _sexp_pids.length; _si++>> <<set _spid to _sexp_pids[_si]>> <<set _rec to $secret_ledger[_spid]>> <<if _rec.established_day gt 0 and not _rec.broken>> <<set _burden to 0>> <<for _sj to 0; _sj lt _sexp_pids.length; _sj++>> <<set _spid2 to _sexp_pids[_sj]>> <<set _rec2 to $secret_ledger[_spid2]>> <<if _spid2 neq _spid and _rec2.established_day gt 0 and not _rec2.broken>> <<secret-party-lean _spid>> <<set _l1 to _party_lean_now>> <<secret-party-lean _spid2>> <<set _l2 to _party_lean_now>> <<set _burden to _burden + Math.abs(_l1 - _l2) * 0.3>> <</if>> <</for>> <<if _burden gt 0>> <<set $secret_ledger[_spid].exposure to Math.max(0, Math.min(100, $secret_ledger[_spid].exposure + _burden))>> <</if>> <</if>> <</for>> /* 第三遍:四级判定 */ <<for _si to 0; _si lt _sexp_pids.length; _si++>> <<set _spid to _sexp_pids[_si]>> <<set _rec to $secret_ledger[_spid]>> <<if _rec.established_day gt 0 and not _rec.broken>> <<if $secret_ledger[_spid].exposure gte _thr_expose>> <<set $secret_ledger[_spid].flagged to true>> <<set $secret_ledger[_spid].suspect to true>> <<if not $secret_exposed_queue.includes(_spid)>><<set $secret_exposed_queue.push(_spid)>><</if>> <<elseif $secret_ledger[_spid].exposure gte _thr_flagged>> <<set $secret_ledger[_spid].flagged to true>> <<set $secret_ledger[_spid].suspect to true>> <<elseif $secret_ledger[_spid].exposure gte _thr_suspect>> <<set $secret_ledger[_spid].suspect to true>> <</if>> <</if>> <</for>> /* 第四遍:起疑阶段生成附加要求(P2) 任一 suspect 且未暴露、且当前无待处理要求、且距上次给要求>10天 → 随机挑一个 susst 的党,生成一条要求。 */ <<if $secret_demand eq null>> <<set _dem_pool to []>> <<for _si to 0; _si lt _sexp_pids.length; _si++>> <<set _spid to _sexp_pids[_si]>> <<set _rec to $secret_ledger[_spid]>> <<if _rec.established_day gt 0 and not _rec.broken and _rec.suspect and _rec.exposure lt _thr_expose>> <<set _last_d to $secret_demand_history[_spid] ? $secret_demand_history[_spid] : 0>> <<if $session_day - _last_d gt 10>> <<set _dem_pool.push(_spid)>> <</if>> <</if>> <</for>> <<if _dem_pool.length gt 0>> <<set _chosen to _dem_pool[Math.floor(Math.random() * _dem_pool.length)]>> <<set $secret_demand_history[_chosen] to $session_day>> <<secret-demand-gen _chosen>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- secret-tier-name:该党隐藏进度档位名 ---------- 用法:<<secret-tier-name "kpd">> 输出 _tier_name 涉水 → 交好 → 共犯 → 深陷 → 同舟 */ <<widget "secret-tier-name">>\ <<silently>> <<set _tn_pid to $args[0]>> <<set _tn_tier to $secret_ledger[_tn_pid].tier ? $secret_ledger[_tn_pid].tier : 0>> <<set _tn_names to ["涉水","交好","共犯","深陷","同舟"]>> <<set _tier_name to _tn_names[Math.min(_tn_tier, 4)]>> <</silently>>\ <</widget>> /* ---------- secret-tier-incr:推进该党隐藏进度一格 ---------- 用法:<<secret-tier-incr "kpd">> 每做一件脏活/应下要求,关系深化 */ <<widget "secret-tier-incr">>\ <<silently>> <<set _ti_pid to $args[0]>> <<if $secret_ledger[_ti_pid].tier lt 4>> <<set $secret_ledger[_ti_pid].tier to $secret_ledger[_ti_pid].tier + 1>> <</if>> <</silently>>\ <</widget>> /* ---------- secret-demand-gen:生成一条起疑附加要求 ---------- 用法:<<secret-demand-gen "kpd">> 写入 $secret_demand 脏活类型(魏玛代理人视角·权力层面滥用): plant(安插) / shelve(放水) / fund(供血) / back(背书) / file(交底) */ <<widget "secret-demand-gen">>\ <<silently>> <<set _dg_pid to $args[0]>> <<set _dg_party to $secret_ledger[_dg_pid].partner>> <<set _dg_pool to ["plant","shelve","fund","back","file"]>> <<set _dg_type to _dg_pool[Math.floor(Math.random() * _dg_pool.length)]>> <<set _dg_text to "">> <<if _dg_type eq "plant">> <<set _dg_text to _dg_party + " 要你把他的人安进柏林警局一个空出来的位置。一份任命没有名字,缺一个签字人。" + "(风险:暴露+8,白纸黑字是你批的)">> <<elseif _dg_type eq "shelve">> <<set _dg_text to _dg_party + " 要你把一桩本该追查的案子压下去——一份稽查报告已经起草好,只差没人签发「结案」。" + "(风险:暴露+8,可那案子从此烂在抽屉里)">> <<elseif _dg_type eq "fund">> <<set _dg_text to _dg_party + " 要你绕过预算,把一笔国家资金导进他控制的组织账上。钱从公账走,去向却见不得光。" + "(风险:经济压力+3、魏玛信任−5,每一笔都有你的签名兜底)">> <<elseif _dg_type eq "back">> <<set _dg_text to _dg_party + " 要你在公开场合替他站台,或让官方喉舌软化一段对他的报道。话从你嘴里出去,就收不回来了。" + "(风险:暴露+8,可你的立场从此烙上了他)">> <<else>> <<set _dg_text to _dg_party + " 要你把一份机密的线人档案交给他。卷宗厚厚一叠,封皮上印着「机密」,但缺一个递出去的手。" + "(风险:暴露+8,可那些人从此在你的签名下暴露)">> <</if>> <<set $secret_demand to { pid:_dg_pid, type:_dg_type, text:_dg_text, issue_day:$session_day }>> <</silently>>\ <</widget>> /* ---------- secret-demand-render:渲染当前待处理要求 ---------- 用法:<<secret-demand-render>> 输出 $secret_demand_text(空=无要求) 办公室入口显示的警告条。 */ <<widget "secret-demand-render">>\ <<silently>> <<set $secret_demand_text to "">> <<if $secret_demand>> <<set $secret_demand_text to "⚠ " + $secret_demand.text>> <</if>> <</silently>>\ <</widget>> /* ---------- secret-demand-resolve:处理一条起疑要求 ---------- 用法:<<secret-demand-resolve "accept"/"refuse">> accept:exposure−15,该党信任+2,demands+1,推进档位+累积把柄, 代价=理想↓ + 政治光谱向该党偏移 refuse:exposure+10,该党信任−1 */ <<widget "secret-demand-resolve">>\ <<silently>> <<set _dr_act to $args[0]>> <<if $secret_demand>> <<set _dr_pid to $secret_demand.pid>> <<if _dr_act eq "accept">> /* 直觉代价:干脏活本身就增风险——暴露上升;供血还让经济压力涨、魏玛下信任 */ <<set $secret_ledger[_dr_pid].exposure to Math.min(100, $secret_ledger[_dr_pid].exposure + 8)>> <<if $secret_demand.type eq "fund">> <<set $world.economy to Math.min(100, $world.economy + 3)>> <</if>> <<if $npcs.weimar and $npcs.weimar.trust>> <<set $npcs.weimar.trust to Math.max(0, $npcs.weimar.trust - 5)>> <</if>> <<set $secret_ledger[_dr_pid].demands to $secret_ledger[_dr_pid].demands + 1>> <<if $npcs[_dr_pid] and $npcs[_dr_pid].trust>><<set $npcs[_dr_pid].trust to Math.min(100, $npcs[_dr_pid].trust + 2)>><</if>> /* 应下脏活的代价三件套:理想↓ + 光谱向该党偏移 + 把柄累积 */ <<if $player and $player.mental and $player.mental.idealism>> <<set $player.mental.idealism to Math.max(0, $player.mental.idealism - 4)>> <</if>> <<secret-party-lean _dr_pid>> <<if $party_lean_now gt 0>> <<set $spectrum.left_right to Math.min(100, Math.max(-100, $spectrum.left_right + 3))>> <<elseif $party_lean_now lt 0>> <<set $spectrum.left_right to Math.max(-100, Math.min(100, $spectrum.left_right - 3))>> <</if>> /* 把柄:记录这件脏活,leverage 累积(不露数值,只作内部计数) */ <<if not $secret_ledger[_dr_pid].deeds>><<set $secret_ledger[_dr_pid].deeds to []>><</if>> <<set $secret_ledger[_dr_pid].deeds.push($secret_demand.type)>> <<set $secret_ledger[_dr_pid].leverage to $secret_ledger[_dr_pid].leverage + 1>> /* 推进隐藏进度档位(涉水→同舟) */ <<secret-tier-incr _dr_pid>> /* 记录本次结果,供「遮掩」反馈场景单独展示 */ <<set $secret_demand_resolved_pid to _dr_pid>> <<set $secret_demand_resolved_type to $secret_demand.type>> <<else>> <<set $secret_ledger[_dr_pid].exposure to Math.min(100, $secret_ledger[_dr_pid].exposure + 10)>> <<if $npcs[_dr_pid] and $npcs[_dr_pid].trust>><<set $npcs[_dr_pid].trust to Math.max(0, $npcs[_dr_pid].trust - 1)>><</if>> <</if>> <<set $secret_demand to null>> <</if>> <</silently>>\ <</widget>>
/* 起疑附加要求:处理该党递来的条件(P2) */ <<silently>> <<set $secret_weimar_note to "">> <<if $secret_demand and $weimar and $weimar.self_identity gte 60>> <<set $secret_weimar_note to "魏玛在走廊尽头看了你一眼。他没有说话,但你知道,他看见你接过了那份东西。">> <</if>> <<if $secret_demand>> <<secret-tier-name $secret_demand.pid>> <<set $secret_demand_party to $secret_ledger[$secret_demand.pid].partner>> <</if>> <</silently>>\ ''一扇没挂牌子的门。'' <<if $secret_demand>> //一道影子把一张条子塞进你手里。条子上没有署名,只压着一枚湿印章的角。你展开,看清了那行字。// //$secret_demand.text// <<if $secret_weimar_note neq "">>\ //$secret_weimar_note//\ <</if>> //(你与 $secret_demand_party 的关系,正在水没到底之前,一级一级地往下沉。你还能回到岸上吗?)// ''—— 应下,还是推掉? ——'' <<link "「应下。」">> <<secret-demand-resolve "accept">>\ <<goto "Scene_SecretDemand_Shield">>\ <</link>> <<link "「推掉。」">> <<secret-demand-resolve "refuse">>\ <</link>> //你婉拒了。那人没有纠缠,只是把条子收回怀里,转身走了。你没有回头,但你知道——他记住了这一次。// <<else>> //没有条子。那扇门虚掩着,屋里没有人。你等了一会儿,还是走了。// <<link "返回办公室" "Scene_Office">><</link>> <</if>>
/* 应下脏活后的「遮掩」反馈:该党对你办事很满意,单独一段对话告诉你他替你抹平了风声, 然后暴露度才回落。把「直觉代价」与「遮掩收益」分两步呈现,避免玩家觉得反直觉。 */ <<silently>> <<set _sh_pid to $secret_demand_resolved_pid ? $secret_demand_resolved_pid : "kpd">> <<set _sh_party to $party_names[_sh_pid]>> /* 遮掩判定:该党对你的信任够高(>=50),或你的立场与他够接近(lean 差 <0.35)→ 他肯替你遮掩; 否则他默许风声去烧,不替你挡。 */ <<secret-party-lean _sh_pid>> <<set _sh_player_lean to $spectrum and $spectrum.left_right ? ($spectrum.left_right / 100) : 0>> <<set _sh_lean_dist to Math.abs(_sh_player_lean - _party_lean_now)>> <<set _sh_trusted to ($npcs[_sh_pid] and $npcs[_sh_pid].trust >= 50)>> <<set _sh_aligned to (_sh_lean_dist < 0.35)>> <<set _sh_shielded to (_sh_trusted or _sh_aligned)>> <<set _sh_line to "">> <<if $secret_demand_resolved_type eq "plant">> <<set _sh_line to "那个空出来的位子,很快就有了主人。没有人问那段履历是从哪递进来的——就像没有人在意,那枚公章底下压着谁的名字。"> <<elseif $secret_demand_resolved_type eq "shelve">> <<set _sh_line to "那份稽查报告,从此安静地躺在抽屉最底下。你偶尔会想起它,但也就只是想起。有些案子,烂了比结了更干净。"> <<elseif $secret_demand_resolved_type eq "fund">> <<set _sh_line to "那笔钱从公账上划走,去向不知。魏玛信任你,没有追问;可你每晚合眼,都看见那串数字在账本边缘,像一排没点名的脚印。"> <<elseif $secret_demand_resolved_type eq "back">> <<set _sh_line to "你替他说了那句话。话一出口就收不回来,可他也替你兜住了后果——街上的声音被压了下去,就像那句话从没被人记得。"> <<else>> <<set _sh_line to "那份机密卷宗交了出去。他看完,没有多问,只是把卷宗锁进自己那口铁柜。你走出门时想:有些秘密,现在不归你一个人看着了。"> <</if>> <<secret-tier-name _sh_pid>> <<set _sh_tier to _tier_name>> /* 遮掩与否,决定暴露是否回落:遮了 → 暴露−15;没遮 → 暴露不动(保持脏活带来的+8) */ <<if _sh_shielded>> <<set $secret_ledger[_sh_pid].exposure to Math.max(0, Math.min(100, $secret_ledger[_sh_pid].exposure - 15))>> <</if>> <</silently>>\ ''门,在你身后轻轻合上。'' //你把条子处理完,正要走,那人却在你踏出门槛前,从阴影里递来一句话。// <<if _sh_shielded>>\ //「办得干净。」他说,「没有第三个人会知道这件事。往后,你签你的字,我认我的账。」// //他顿了顿,像在掂量那句话的分量。「风头过了,谁也不会记得你做过什么。我会替你看着后面。」// //你走出那间屋子。夜风灌进来,你忽然意识到——刚才那一下,他替你抹平了。风声起了又落,像从没来过。// ''—— 但在暗处,多了一双替你遮掩的手,也多了一把攥着你的柄。 ——''\ <<else>>\ //「办得干净。」他把话放在桌上,没有多余的应承。你等了一会儿,他没有再说别的。// //你走出那间屋子时回头,他已经背过身去,像不认识你。风声没有停——你替他的事,没人替你按住。// ''—— 他接受了你的投名状,却没有接住你的风声。 ——''\ <</if>> //_sh_line// <<if _sh_shielded>>\ //(你与 _sh_party 的关系,又深了一层,到了「_sh_tier」。他替你扛下了这一次——暴露度回落了,可你欠他的,也更深了。)//\ <<else>>\ //(这件事没有留下把柄的人情,只留下没被抹平的风声。暴露度没有回落——你给他的越多,烧在你身上的线就越长。)//\ <</if>> <<link "返回办公室" "Scene_Office">><</link>>
/* ---------- secret-confronter-pick:选出质问者 ------------------- 用法:<<secret-confronter-pick>> 输出 $secret_conf_front 优先从已立约、未破裂、非被暴露的另一条合伙党里随机挑一位; 若只结了一条线,则回退为一位温和党(SPD/DDP/DVP/中央党)来质问。 */ <<widget "secret-confronter-pick">>\ <<silently>> <<set _fl_sec to ["kpd","dnvp","nsdap","army"]>> <<set _fl_pool to []>> <<for _fl_i to 0; _fl_i lt _fl_sec.length; _fl_i++>> <<set _fl_p to _fl_sec[_fl_i]>> <<if _fl_p neq $secret_conf_pid and $secret_ledger[_fl_p].established_day gt 0 and not $secret_ledger[_fl_p].broken>> <<set _fl_pool.push(_fl_p)>> <</if>> <</for>> <<if _fl_pool.length gt 0>> <<set $secret_conf_front to _fl_pool[Math.floor(Math.random() * _fl_pool.length)]>> <<else>> <<set _fl_mod to ["spd","ddp","dvp","zentrum"]>> <<set $secret_conf_front to _fl_mod[Math.floor(Math.random() * _fl_mod.length)]>> <</if>> <</silently>>\ <</widget>> /* ---------- secret-exposed-render:暴露待处理提示 ---------- 用法:<<secret-exposed-render>> 输出 $secret_exposed_text(空=无) 当 $secret_exposed_queue 有未处理线时,显示「【质问者】约你在酒窖见面」 */ <<widget "secret-exposed-render">>\ <<silently>> <<set $secret_exposed_text to "">> <<if $secret_exposed_queue and $secret_exposed_queue.length gt 0>> <<set $secret_conf_pid to $secret_exposed_queue[0]>> <<if not $secret_conf_front>><<secret-confronter-pick>><</if>> <<set _se_front_party to $party_names[$secret_conf_front]>> <<set $secret_exposed_text to _se_front_party + " 约你在酒窖见面">> <</if>> <</silently>>\ <</widget>> /* ---------- secret-confront-resolve:处理投名状三选一 ---------- 用法:<<secret-confront-resolve "loyal_front"/"loyal_exposed"/"deny">> loyal_front:向质问者(你的另一条合伙党/温和党)表忠心,他信任+、被暴露党信任怒跌、exposure 回落 loyal_exposed:站在被暴露党那边,他信任+、质问者信任怒跌、exposure 回落 deny:各方都扣一点,exposure 不降,留隐患 魏玛双反应:自我认同高→质问;认同低但信任高→轻声问下一步。 */ <<widget "secret-confront-resolve">>\ <<silently>> <<set _cf_act to $args[0]>> <<if not $secret_conf_pid and $secret_exposed_queue and $secret_exposed_queue.length gt 0>> <<set $secret_conf_pid to $secret_exposed_queue[0]>> <</if>> <<if not $secret_conf_front>><<secret-confronter-pick>><</if>> <<if $secret_conf_pid and $secret_conf_front>> <<set _cf_pid to $secret_conf_pid>> /* 被暴露的合伙党 */ <<set _cf_front to $secret_conf_front>> /* 质问者 */ <<set $secret_conf_party to $secret_ledger[_cf_pid].partner>> <<set $secret_conf_front_party to $party_names[_cf_front]>> <<set _cf_weimar_react to "">> <<if _cf_act eq "loyal_front">> /* 对质问者表忠心:质问者信任+,被暴露党信任怒跌,被暴露线exposure回落 */ <<if $npcs[_cf_front] and $npcs[_cf_front].trust>><<set $npcs[_cf_front].trust to Math.min(100, $npcs[_cf_front].trust + 5)>><</if>> <<if $npcs[_cf_pid] and $npcs[_cf_pid].trust>><<set $npcs[_cf_pid].trust to Math.max(0, $npcs[_cf_pid].trust - 30)>><</if>> <<set $secret_ledger[_cf_pid].exposure to Math.max(30, $secret_ledger[_cf_pid].exposure - 40)>> <<if not $player.tags.includes("双面")>><<set $player.tags.push("双面")>><</if>> <<elseif _cf_act eq "loyal_exposed">> /* 站在被暴露党那边:他信任+,质问者信任怒跌,被暴露线exposure回落 */ <<if $npcs[_cf_pid] and $npcs[_cf_pid].trust>><<set $npcs[_cf_pid].trust to Math.min(100, $npcs[_cf_pid].trust + 5)>><</if>> <<if $npcs[_cf_front] and $npcs[_cf_front].trust>><<set $npcs[_cf_front].trust to Math.max(0, $npcs[_cf_front].trust - 30)>><</if>> <<set $secret_ledger[_cf_pid].exposure to Math.max(30, $secret_ledger[_cf_pid].exposure - 40)>> <<if not $player.tags.includes("双面")>><<set $player.tags.push("双面")>><</if>> <<else>> /* 死不承认:双方都扣一点,exposure 不降 */ <<if $npcs[_cf_pid] and $npcs[_cf_pid].trust>><<set $npcs[_cf_pid].trust to Math.max(0, $npcs[_cf_pid].trust - 12)>><</if>> <<if $npcs[_cf_front] and $npcs[_cf_front].trust>><<set $npcs[_cf_front].trust to Math.max(0, $npcs[_cf_front].trust - 10)>><</if>> <<set $secret_ledger[_cf_pid].exposure to Math.min(100, $secret_ledger[_cf_pid].exposure + 5)>> <</if>> /* 魏玛双反应 */ <<if _cf_act neq "deny">> <<set $weimar.personality_tension to $weimar.personality_tension + 3>> <</if>> <<if $weimar and $weimar.self_identity gte 60>> <<set $secret_conf_react to "当夜,魏玛在书房里叫住你。他问得很轻,却像一根针:「你到底想干什么?」你没答。他望着你,像望着一个他认不出的人。">> <<elseif $weimar and $weimar.self_identity lt 60 and $npcs.weimar and $npcs.weimar.trust gte 50>> <<set $secret_conf_react to "当夜,魏玛像往常一样坐在窗边。他没有质问,只是轻声问:「你下一步,打算怎么走?」这问题太轻了,轻得让你心里发沉。">> <<else>> <<set $secret_conf_react to "那一晚你很晚才睡。走廊尽头的灯,一直亮着。">> <</if>> /* 移除已处理的暴露线 */ <<set _sq_new to []>> <<for _si to 0; _si lt $secret_exposed_queue.length; _si++>> <<if $secret_exposed_queue[_si] neq _cf_pid>><<set _sq_new.push($secret_exposed_queue[_si])>><</if>> <</for>> <<set $secret_exposed_queue to _sq_new>> /* 记录本次选择,供结果页显示 */ <<set $secret_conf_act to _cf_act>> <</if>> <</silently>>\ <</widget>>
/* 投名状事件(P3):某条合伙线暴露≥80(全城风传你与他走得近), 你的另一条秘密合伙党(无则回退温和党)闻风,约你在总理府酒窖碰头对质,逼你选边。 */ <<silently>> <<if $secret_exposed_queue and $secret_exposed_queue.length gt 0>> <<set $secret_conf_pid to $secret_exposed_queue[0]>> <<set $secret_conf_party to $secret_ledger[$secret_conf_pid].partner>> <<if not $secret_conf_front>><<secret-confronter-pick>><</if>> <<set $secret_conf_front_party to $party_names[$secret_conf_front]>> <<secret-tier-name $secret_conf_pid>> <<set $secret_conf_tier to _tier_name>> <<set $secret_conf_leverage to $secret_ledger[$secret_conf_pid].leverage>> <<else>> <<goto "Scene_Office">> <</if>> <</silently>>\ ''总理府 · 酒窖。'' <<if $secret_conf_pid and $secret_conf_front>> //铁门半掩着。你滑进去,$secret_conf_front_party 的人已经站在酒架后面,只露出半张脸。他手里没有酒,只有一叠纸——是你的笔迹。// //「$secret_conf_party 的事,我知道了。」他没有绕弯,「你在我这儿签的字,一桩桩,都数得清。现在全城都在传,你和他走得太近。你告诉我——你到底站谁?」// //(你与 $secret_conf_party 的关系,已经走到「$secret_conf_tier」。他握着你做过的事;而眼前这位,也握着一半。你被夹在两个人中间了。)// ''—— 他逼你在两个人之间,只能选一个。 ——'' <<link "「我跟你走。」(向 $secret_conf_front_party 表忠心)">> <<secret-confront-resolve "loyal_front">><<goto "Scene_SecretConfront_Result">>\ <</link>> <<link "「我一直站的是 $secret_conf_party。」(向 $secret_conf_party 表忠心)">> <<secret-confront-resolve "loyal_exposed">><<goto "Scene_SecretConfront_Result">>\ <</link>> <<link "「我什么都没做过。」(死不承认)">> <<secret-confront-resolve "deny">><<goto "Scene_SecretConfront_Result">>\ <</link>> <<else>> //这里空无一人。// <<link "返回办公室" "Scene_Office">><</link>> <</if>>
/* 投名状结果页:显示魏玛反应 + 选择后果的文学化收束 */ <<silently>> <<set _co_text to "">> <<if $secret_conf_act eq "loyal_front">> <<set _co_text to "你把手按到他那一叠纸上。他笑了,笑里带着三分如释重负。「还算识相。」他说。你欠他的,从今晚起,不再是人情,是选择。">> <<elseif $secret_conf_act eq "loyal_exposed">> <<set _co_text to "你看着他,一字一句:「我站的是 $secret_conf_party。」他脸上的笑慢慢冷下去。你选了,也就等于把另一个人,推到了对面。">> <<else>> <<set _co_text to "你把话咽了回去,说从没签过。他笑了,笑得很轻——像在说:你我都知道那不是真的。">> <</if>> <</silently>>\ ''你走出那间酒窖。'' //_co_text// //$secret_conf_react// <<link "返回办公室" "Scene_Office">><</link>>
/* covenant-sync/covenant-active-text/covenant-chaperone-text 三个大联合 widget 必须是独立的 [widget] passage 才能被 SugarCube 注册。 之前误放在 Scene_SecretConfront_Result [scene] 里导致注册失败。 */ /* ---------- covenant-sync:同步大联合政府成员与活性 ---------- 用法:<<covenant-sync>> (温和党 accepted 后、daily-tick 调用) 扫描温和党(SPD/DDP/DVP/Zentrum)arc_state == "accepted" 的成员, 写入 $covenant.members;>=3 时 $covenant.active=true 并应用奖励。 奖励:魏玛张力每周-1(在 daily-tick 结算)、国会支持率+10%(在 party-stance 接入)。 返回 $covenant_just_active(本 tick 是否刚激活,供提示用)。 */ <<widget "covenant-sync">>\ <<silently>> <<set $covenant_just_active to false>> <<if not $covenant>><<set $covenant to { members: [], active: false, bonus_applied: false }>><</if>> <<set _cm_prev_active to $covenant.active>> <<set _cm_members to []>> <<set _cm_warm to ["spd","ddp","dvp","zentrum"]>> <<for _ci to 0; _ci lt _cm_warm.length; _ci++>> <<set _cp to _cm_warm[_ci]>> <<if $party_milestones and $party_milestones[_cp] and $party_milestones[_cp].arc_state eq "accepted">> <<set _cm_members.push(_cp)>> <</if>> <</for>> <<set $covenant.members to _cm_members>> <<if _cm_members.length gte 3>> <<if not _cm_prev_active>> <<set $covenant.active to true>> <<set $covenant_just_active to true>> <<set $covenant.bonus_applied to true>> /* 随机抽一位说话人作为大联盟代言人:从当前温和党成员 + 魏玛 中抽(说通用模板) */ <<if not $covenant.spokesman>> <<set _cm_pool to _cm_members.slice()>> <<set _cm_pool.push("weimar")>> <<set _cm_ch to _cm_pool[Math.floor(Math.random() * _cm_pool.length)]>> <<set $covenant.spokesman to _cm_ch>> <</if>> <</if>> <<else>> <<set $covenant.active to false>> <</if>> <</silently>>\ <</widget>> /* ---------- covenant-active-text:当前大联盟状态文案 ---------- 用法:<<covenant-active-text>> 输出 $covenant_active_text */ <<widget "covenant-active-text">>\ <<silently>> <<set $covenant_active_text to "">> <<if $covenant and $covenant.active>> <<set _ca_names to []>> <<for _ci to 0; _ci lt $covenant.members.length; _ci++>> <<set _cp to $covenant.members[_ci]>> <<if $party_names and $party_names[_cp]>><<set _ca_names.push($party_names[_cp])>><<else>><<set _ca_names.push(_cp)>><</if>> <</for>> <<set $covenant_active_text to "大联合政府:[" + _ca_names.join("、") + "]">> <</if>> <</silently>>\ <</widget>> /* ---------- covenant-chaperone-text:大联盟陪护通用模板 ---------- 用法:<<covenant-chaperone-text>> 输出 $covenant_chaperone_text 大联盟激活后,从「四位温和党 + 魏玛」中随机抽一位作为陪护, 说同一段通用模板的话(不再逐党写不同措辞)。 */ <<widget "covenant-chaperone-text">>\ <<silently>> <<set $covenant_chaperone_text to "">> <<if $covenant and $covenant.active and $covenant.spokesman>> <<set _cc_name to "">> <<if $covenant.spokesman eq "weimar">> <<set _cc_name to "魏玛">> <<elseif $party_names and $party_names[$covenant.spokesman]>> <<set _cc_name to $party_names[$covenant.spokesman]>> <<else>> <<set _cc_name to $covenant.spokesman>> <</if>> <<set $covenant_chaperone_text to _cc_name + " 走进来,替这场大联合政府说了句话。他讲得很平,像在陈述一件已经定下的事:『我们四个,再加上你,坐到了同一张桌子前。这桌子不是谁一个人的,是共和国的。我们能坐在一起,不是因为我们彼此信得过,是因为我们都还信这个共和国值得守。』他顿了顿,『你握得住它,我们四个就都还在。你松了手,这桌子,也就散了。』">> <</if>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════ 世界大事件 · 定制选项系统 给 archetype 大事件(A 前缀)与旧黄色事件(Y 前缀)写专属的 3 个定制选项, 替代原来的通用 observe/action/stance/decision 模板。 数据表 $world_custom_options 按「事件 title」索引,每个事件含 prompt + 3 个选项: { label, fx:{…}, cost:"……", msg:"……" } 渲染组件 render-world-custom-options 由 render-options 对 A/Y 事件调用。 ════════════════════════════════════════════════════════════ */ <<widget "world-event-custom-init">>\ <<silently>> <<if not $world_custom_options_ready>> <<set $world_custom_options to { /* ═══════ 经济 · 经济危机 arch_econ_crisis ═══════ */ "物价飞涨": { prompt:"柏林市物价局呈报:过去十日,夏洛滕堡区与弗里德里希斯海因区的面包、土豆和煤油价格涨幅不一,最低一成,最高三成。有商户举报邻区囤积,但各区上报口径互相矛盾。局里请示是否派员核查。", options:[ { label:"颁布限价令,硬压民生价目", axis:"GM", fx:{spd:2,social_anger:-3,gov_trust:2,economy:2,inflation:-2}, cost:"在争议区试行限价,压住牌价", shift:{lr:-3,rc:-1}, msg:"你命物价局在夏洛滕堡区试行限价。头几天,面包价签停住。第四天,几家铺子提前关门,说没货。排队的人转到隔壁区,那里的价又高了些。" }, { label:"暂不管价,先保证配给的量", axis:"AP", fx:{gov_trust:1,inflation:1,social_anger:-1,economy:1}, cost:"先保配给量,暂不碰价", shift:{lr:-1,rc:1}, msg:"你让配给处先往那几个区多调面粉和土豆。队短了些,可票证窗口前排的人还是多。物价局的人私下说,量能撑两周,可价撑不住。" }, { label:"放任自流,等市场自己回稳", axis:"AP", fx:{inflation:3,social_anger:3,gov_trust:-2}, cost:"暂不干预,只做记录", shift:{lr:3,rc:2,authoritarian:2}, msg:"你让物价局只记录,不干预。之后报告送来:价还在涨,但涨幅比上周小。没有人说得清这是回稳,还是没人买得起。" } ]}, "黑市扩大": { prompt:"警察局呈报:亚历山大广场及周边街道黑市摊位增加,部分摊主与区议会个别议员有往来。警力不足,且有人提前得到风声。局里请求指示:是清查,还是继续监视。", options:[ { label:"端掉几个窝点,杀鸡儆猴", axis:"OP", fx:{gov_trust:2,insider:1,inflation:-1,economy:1}, cost:"清查数处摊位,拘捕若干", msg:"你命警察夜间清查。摊位收了,人也拘走了几个。第二天广场干净,巷子里多了几张新面孔,价照旧。" }, { label:"任其流,暗中记下货主网", axis:"OP", fx:{insider:3,gov_trust:-1}, cost:"暂不取缔,记录货主与接应", longline:{key:"black_market_net", tag:"经济压力", title:"黑市背后的区议会线", due:12, reveal:"你让警察只记不抓。一个月后,名单上出现好些重复的供货人,其中一个地址在区议会附近。你让人把这条线单独抄了一份。"}, msg:"你让警察照常巡逻,只在暗处记下谁供货、谁收钱、谁放风。" }, { label:"把黑市收编成官配渠道", axis:"OP", fx:{dvp:1,gov_trust:2,social_anger:1,inflation:-2}, cost:"将部分摊位纳入官配", msg:"你让市政在广场边划出一块官配区,给几个摊主发临时执照。摊子摆到了明处,价没有降,但至少不再用暗号交易。" } ]}, "工厂倒闭": { prompt:"劳工部呈报:柏林一家中型机械厂因订单取消,厂主已递交解雇名单,涉及工人约四百名。工人代表要求政府介入,厂主则表示除非得到贷款,否则月底关厂。", options:[ { label:"紧急注资,保住这座厂", axis:"GM", fx:{spd:3,social_anger:-1,economy:2,gov_trust:1}, cost:"从就业基金拨一笔紧急贷款", shift:{lr:-2}, msg:"你从就业基金拨出一笔贷款,厂子暂时保住。厂主签了延期关厂协议,工人回到机台。劳工部的人提醒你:这笔钱本来是要发失业救济的。" }, { label:"让它倒,把工人转去别厂", axis:"OP", fx:{social_anger:2,spd:-1,gov_trust:-2}, cost:"关厂,转遣工人到公共工程", shift:{rc:1}, msg:"你同意关厂,把工人转往公共工程。四百人里,一百多人去了工地,剩下的名字留在失业登记册上。" }, { label:"让它倒,顺势整合同业", axis:"OP", fx:{dvp:2,economy:3,social_anger:3}, cost:"关厂,由同业收购设备", shift:{lr:3,rc:3}, msg:"你让厂子关停,默许同业收购设备。大厂收走了机器,工人拿到遣散费,只是这个数目只够撑几周。" } ]}, "银行挤兑": { prompt:"央行柏林分行呈报:过去三日,夏洛滕堡区一家私人银行被提取存款约四十万马克,占其存款总额三成。该行已向央行申请临时周转,并请求政府表态。储户仍在门外排队。", options:[ { label:"政府担保,稳住存款", axis:"OP", fx:{gov_trust:3,inflation:1,social_anger:-2}, cost:"以政府名义为该行担保", shift:{lr:-1}, msg:"你让央行以政府名义为该行担保,并命其照常开门。头两天,队伍短了一半。第三天,附近两家银行也开始排队,但规模不大。" }, { label:"严查挤兑,抓带头的人", axis:"SM", fx:{army:1,social_anger:3,gov_trust:-2}, cost:"拘捕带头提款者,查明有无煽动", shift:{lr:2,rc:2,authoritarian:2}, msg:"你命警察拘捕几个带头喊话的人,查明是否有人煽动。队伍停下,储户散去,但该行门口多了一辆警车,也多了几张记下来的脸。" }, { label:"任由挤兑,趁机查账目", axis:"OP", fx:{insider:3,ddp:2,social_anger:2}, cost:"暂不干预,调阅该行账目", shift:{lr:1}, longline:{key:"bank_ledger", tag:"经济压力", title:"该行账目里的三家公司", due:10, reveal:"你让央行调阅该行账目。一周后,报告送来:有几笔大额贷款流向三家已停业的公司,其中一家的注册地址在区议会附近。挤兑不是全部,账目才是。"}, msg:"你不拦储户,只让央行查账。存款流出时,你摸到了资金流向的第一段。" } ]}, /* ═══════ 经济 · 通胀恶化 arch_inflation ═══════ */ "大面额马克遭拒收": { prompt:"经济部呈报:柏林部分市场与店铺开始拒收大面额马克,或要求以物易物。有商户反映,一张面值一万马克的钞票已买不到一袋土豆。报告建议暂不干预,继续观察。", options:[ { label:"承诺汇率锚定,稳住人心", axis:"OP", fx:{gov_trust:3,inflation:1}, cost:"公开承诺稳定币值,暂不兑现", shift:{lr:-1}, msg:"你公开发表声明,承诺稳定币值。市场短暂停顿,部分商铺恢复收马克。经济部提醒你:承诺没有实物支撑,只能撑几天。" }, { label:"加印更多,先应付眼前", axis:"SM", fx:{inflation:3,gov_trust:-2}, cost:"增印钞票,应付眼前支付", shift:{lr:2,rc:2,authoritarian:2}, msg:"你命央行增印钞票。工资和救济照发,市面货币增多,每张钞票的实际购买力继续下降。拒收范围从几个市场扩大到街角小店。" }, { label:"干脆让币值归零重来", axis:"SM", fx:{inflation:-4,economy:2,social_anger:4,gov_trust:-3}, cost:"暂不救旧币,准备币制改革", shift:{lr:-2,rc:4,authoritarian:3}, msg:"你让财政部秘密研究币制改革,暂不救旧马克。报告结论明确:旧币作废只是时间问题。至于作废后以何物替代,报告未给出方案。" } ]}, "外汇黑市": { prompt:"警察局呈报:柏林市中心几家咖啡馆出现固定外汇交易点,美元兑马克的暗价已高出官价数倍。交易多在午后,参与者包括商人、公务员和几个穿军装的人。", options:[ { label:"严打外汇黑市", axis:"SM", fx:{gov_trust:2,inflation:-1,insider:1}, cost:"突查交易点,拘捕若干人", shift:{lr:2,rc:2,authoritarian:2}, msg:"你命警察突查几家咖啡馆。摊位撤了,人拘了几个。一周后,交易转到一家书店后屋,汇价照旧。" }, { label:"让官方汇率追平黑市", axis:"OP", fx:{dvp:2,inflation:-2,social_anger:2}, cost:"上调官方汇率,贴近暗价", shift:{lr:-1}, msg:"你命央行上调官方汇率,向暗价靠拢。汇差缩小,黑市交易减少,但进口成本上升,商会已有抱怨。" }, { label:"记下外汇流向,守账不守价", axis:"OP", fx:{insider:2,inflation:1,gov_trust:1}, cost:"不压价,记录外汇流向", shift:{lr:-1}, msg:"你不压汇价,只让人记录每一笔大额外币的去向。几周后,名单上出现几个熟悉的名字,其中一个与某位议员有亲属关系。" } ]}, "工资谈判破裂": { prompt:"劳工部呈报:柏林五金业务工工资谈判第三轮破裂,资方仅同意上浮百分之五,工会坚持百分之十五。双方均已向政府递交声明,请劳工部「作出裁断」。工会代表在门外候着,资方代表已先行离场。", options:[ { label:"加大支出,先让工资跟上物价", axis:"GM", fx:{spd:3,social_anger:-2,economy:2}, cost:"由就业基金补足差额,令工资追平物价", shift:{lr:-3,rc:-1}, msg:"你命劳工部出面调停,由就业基金补贴资方一部分,使工资上浮至接近物价涨幅。工会接受,资方勉强签字。补贴从就业基金列支,本月账目已经偏紧。" }, { label:"压工会,让他们忍着", axis:"SM", fx:{spd:-2,army:1,social_anger:2}, cost:"劝工会接受低幅加薪,以稳生产", shift:{lr:2,rc:2,authoritarian:1}, msg:"你召见工会代表,要求其接受现有条件。工会代表没有当场反驳,只把一份签满名字的请愿书放在桌上,转身离开。谈判暂停,五金业的怨气暂时压在车间里。" }, { label:"立仲裁,定一个折中的数", axis:"GM", fx:{ddp:2,gov_trust:1,economy:1,social_anger:-1}, cost:"由劳工部设立仲裁,裁定折中方案", shift:{lr:-1}, msg:"你命劳工部设仲裁庭,裁出百分之九的加薪方案。资方接受,工会表示保留意见。双方均未庆祝,但机器照常开工。" } ]}, "中产储蓄归零": { prompt:"柏林储蓄银行协会呈报:因马克持续贬值,数千个中小储户的存款实际购买力已接近于零。协会收到大量询问与投诉,部分储户已联合请愿,请求政府给予补偿或减税。协会建议政府尽快表态。", options:[ { label:"补贴储蓄家庭,止血", axis:"GM", fx:{gov_trust:3,idealism:2,spd:1}, cost:"从财政拨款,向中小储户发放一次性补贴", shift:{lr:-1,rc:-2}, msg:"你批了一笔专项补贴,按存款余额分档发放。储蓄银行门口贴出通知,有人领到了钱,有人发现自己的存款折算后只够买几斤面包。补贴发完了,请愿的人少了一半。" }, { label:"补贴工商业,放长线回魂", axis:"GM", fx:{dvp:2,economy:3,spd:-2}, cost:"将资金转投工商业,暂不直接补偿储户", shift:{lr:3,rc:2}, msg:"你把资金拨给工商业,指望生产恢复后带动就业。几家工厂重新开工,但储户的存折仍是一堆废纸。储蓄银行协会没有再递请愿书,只把一份统计表留在了你的秘书处。" }, { label:"什么都不发,公开承认归零", axis:"SM", fx:{idealism:-3,gov_trust:-3,social_anger:3}, cost:"公开承认存款购买力已无法恢复", shift:{rc:1,authoritarian:1}, msg:"你命财政部公开声明,承认存款购买力已无法恢复。声明发出后,储蓄银行门口安静下来。没有抗议,也没有人再来请愿。协会在报告中写道:「政府已作答复,会员反应平静。」" } ]}, /* ═══════ 经济 · 失业潮 arch_unemployment ═══════ */ "码头工人失业": { prompt:"劳工部呈报:柏林港区码头因货运量下降,已裁减装卸工约三百名。港务局建议将这些工人转入市政工程,但市政方面表示暂无足够岗位。工人代表已向港务局递交请愿。", options:[ { label:"开建公共工程,吸纳码头工", axis:"GM", fx:{spd:3,social_anger:-2,economy:2,gov_trust:1}, cost:"从市政工程款中拨出部分,先行吸纳", shift:{lr:-2}, msg:"你批了一小段道路和排水工程,先将一百多名码头工安排进去。余下的人仍在港区等消息。市政工程处的人说,这笔钱只够干到入秋。" }, { label:"补贴失业金,先稳住家", axis:"GM", fx:{social_anger:-2,spd:1,economy:1}, cost:"由失业基金按月发放补贴", shift:{lr:-1,rc:-1}, msg:"你让失业基金按月发放补贴。工人家里暂时没断炊,但基金账目已经偏紧。劳工部提醒你:若码头货运量再不恢复,补贴只能撑一个季度。" }, { label:"不干预,让码头自己清场", axis:"AP", fx:{social_anger:3,revolution:2,gov_trust:-2}, cost:"暂不介入,等港务局自行处理", shift:{lr:3,rc:2}, msg:"你暂不介入。港务局自行处理,一部分人去了外地,一部分人留在港区等零工。劳工部的报告最后一页写着:「该处失业情况未再上报。」" } ]}, "白领阶层沦落": { prompt:"柏林救济协会呈报:近月来申请救济的人员中,出现为数不少的前职员、文书和低级公务员。协会指出,这批人过去多有储蓄,因马克贬值与裁员同时发生,现已无处告贷。报告建议政府考虑专项救助。", options:[ { label:"发专项补助,保中产体面", axis:"GM", fx:{ddp:2,idealism:2,gov_trust:1}, cost:"设立专项补助,面向原白领失业者", shift:{lr:-1,rc:-2}, msg:"你批了一笔专项补助,按原职级分档发放。有人领到钱后还清了旧债,有人用补助买了去外地的车票。救济协会的登记簿上,这一类申请者没有减少。" }, { label:"压缩冗员,逼着转型", axis:"OP", fx:{dvp:2,economy:2,social_anger:3}, cost:"裁撤冗余职位,引导转入实业", shift:{lr:2,rc:3}, msg:"你命各部裁撤冗员,同时引导他们转入工厂和码头。一部分人去了,一部分人不愿去。救济协会的报告里多了一行:「原公务员失业者,部分已转业,部分下落不明。」" }, { label:"不作安排,任其沉浮", axis:"AP", fx:{gov_trust:-2,idealism:-2}, cost:"暂不设立专项,维持现有救济标准", shift:{rc:1}, msg:"你暂不设立专项。救济协会继续按普通标准发放。穿西装的人开始出现在普通救济站,排在工人和老人后面。协会没有再递交报告。" } ]}, "乞讨者增多": { prompt:"警察局呈报:市中心各主要街道乞讨人员明显增多,其中一部分为失业工人,另一部分为外来难民。有商户投诉影响生意,也有路人反映曾遭强行索要。局里请示是否加强清理,或另作安置。", options:[ { label:"建收容所,安置无家者", axis:"GM", fx:{spd:2,gov_trust:1,social_anger:-1}, cost:"利用空闲市政建筑,设临时收容所", shift:{lr:-2}, msg:"你腾出两处空闲市政建筑,设临时收容所。部分乞讨者住了进去。街上仍有伸手的人,但比上周少了一些。收容所的人说,床位还够,饭只够到月底。" }, { label:"严管乞讨,恢复市容", axis:"SM", fx:{army:1,social_anger:2,gov_trust:-1}, cost:"加强街面巡查,劝离乞讨者", shift:{lr:2,rc:2,authoritarian:2}, msg:"你命警察加强巡查,将乞讨者劝离主要街道。街面整洁了,但背街小巷里多了些蜷缩的身影。商户的投诉停了,警察的报告里多了一句:「劝离后去向不明。」" }, { label:"暗访乞讨来源,查清链条", axis:"OP", fx:{insider:2,revolution:1}, cost:"派员暗访乞讨者来源与背后组织", shift:{lr:-1}, longline:{key:"beggar_net", tag:"社会愤怒", title:"乞讨背后的组织者", due:10, reveal:"暗访人员顺藤摸瓜,发现一部分乞讨者背后有固定组织者,负责安排位置、收取分成。组织者的落脚点集中在两三个街区,其中一个地址与某区议员办公室在同一栋楼。"}, msg:"你派便衣暗访乞讨者来源。数日后报告送来:一部分是自发,一部分有人安排。安排者的名字和地址已经记下,等下一步处理。" } ]}, /* ═══════ 经济 · 投机横行 arch_speculation ═══════ */ "暴发户炫耀": { prompt:"柏林警察局呈报:近期市中心饭店、剧院与马车行出现一批新富,消费引人注目。有市民投书报社,指责其「在饥饿旁炫耀」。警方询问是否对此类消费作适当约束。", options:[ { label:"开征超额利得税,削平炫耀", axis:"OP", fx:{gov_trust:3,social_anger:1,economy:1}, cost:"对暴利行业开征附加税", shift:{lr:-2}, msg:"你命财政部对投机性行业开征附加税。几家商行递来申诉,报纸上有人称你「向成功者开刀」。新贵的马车照旧在街上跑,只是车夫开始绕开穷人区。" }, { label:"拉拢新贵,让他们出钱修城", axis:"OP", fx:{dvp:2,economy:2,social_anger:-1}, cost:"邀新富出资,参与市政建设", shift:{lr:2,rc:1}, msg:"你让市政出面,邀一批新富出资修路、修影院、修公园。有人出钱换名声,有人出钱换批文。市内多了几处工地,也多了几场觥筹交错的晚宴。" }, { label:"纵容他们买走一切", axis:"SM", fx:{inflation:2,social_anger:3,gov_trust:-2}, cost:"暂不约束,维持现有秩序", shift:{lr:3,rc:3,authoritarian:1}, msg:"你暂不介入。新贵继续在饭店和剧院一掷千金,马车继续穿过穷人区。警察局的报告末页写道:「未接到新的投诉。」" } ]}, "外汇贩子活跃": { prompt:"央行呈报:柏林市中心咖啡馆与旅店周边,外汇贩子数量明显增多,交易时段集中在午后至傍晚。贩子多为独立经营,但也有少数人使用统一暗号,疑有组织。央行请示是否由警方协同处理。", options:[ { label:"打掉贩子,护住官价", axis:"SM", fx:{gov_trust:2,inflation:-1,insider:1}, cost:"警方突查贩子聚集点", shift:{lr:2,rc:2,authoritarian:2}, msg:"你命警方突查几处聚集点。贩子散了,暗号换了新的。官价暂时稳住,央行的人提醒你:这只是暂时的。" }, { label:"立专柜,官方代办外汇", axis:"OP", fx:{dvp:2,gov_trust:1,inflation:-2}, cost:"由央行开设官方外汇代办窗口", shift:{lr:-1}, msg:"你让央行开设官方外汇代办窗口。一部分贩子转做合法代理,一部分转入更深的暗处。汇价规矩了一些,手续费照旧进了别人口袋。" }, { label:"跟进贩子,摸清汇率网", axis:"OP", fx:{insider:3,inflation:1,revolution:1}, cost:"派人跟随贩子,记录资金往来", shift:{lr:-1}, longline:{key:"fx_cash_net", tag:"经济压力", title:"外汇贩子的资金线", due:12, reveal:"跟踪数月,贩子背后的金主与资金路线逐渐清晰。名单上有几个名字,与商会、报馆和一家外国银行有关。央行收到这份名单后没有立即回复,只说「建议谨慎使用」。"}, msg:"你不打他们,只派人跟。贩子的金主、搬钱路线、暗号更换规律,一条条记入卷宗。" } ]}, "资本外逃": { prompt:"财政部呈报:近月来,柏林部分工商业者通过荷兰、瑞士等地转移资金,涉及金额较大。已有数起在边境被查获,但更多未申报的资金仍在流出。报告建议考虑外汇管制或加强边境检查。", options:[ { label:"设外汇管制,卡住流出", axis:"SM", fx:{economy:2,fatigue:2}, cost:"在边境设外汇申报与抽查", shift:{lr:-1,authoritarian:1}, msg:"你命财政部在边境设申报与抽查。几笔大额资金被拦下,更多资金转向更隐蔽的路线。财政部报告写道:「管制有效,但逃逸方式同步更新。」" }, { label:"任它流,留住人就够了", axis:"GM", fx:{idealism:1,gov_trust:-1,economy:1}, cost:"暂不设管制,只做统计", shift:{lr:2,rc:1}, msg:"你不设管制,只让财政部继续统计。资金继续外流,但几家主要企业仍在柏林营业。财政部的人在报告边角写了一句:「人未走,厂未关。」" }, { label:"公开点名,吓阻外逃", axis:"SM", fx:{gov_trust:2,social_anger:2}, cost:"公开部分外逃者名单", shift:{lr:3,rc:2,authoritarian:2}, msg:"你命财政部公开一批外逃者名单。有人撤回资金,有人转移得更快。报纸上出现争议,商会递来抗议书。名单上的人开始避免出现在公开场合。" }, { label:"不追查,暗中录政商通话", axis:"OP", fx:{insider:3,gov_trust:-1}, cost:"不立案,记录政商往来通话", longline:{key:"phone_tap", tag:"政治暗流", title:"电话线那头的政商往来", due:8, reveal:"接线室留下的副本里,有几段对话格外清晰。一方是工业联合会某位理事,另一方你听得出是谁。谈话内容不是订单,是「下次议会表决时怎么站」。你把这几段单独抄了一份。"}, msg:"你不立案,只让接线室留一份副本。有些话,说的时候以为只有两个人在听。" } ]}, /* ═══════ 社会 · 劳工动荡 arch_labor_unrest ═══════ */ "罢工蔓延": { prompt:"劳工部呈报:柏林五金业罢工已蔓延至相邻两家工厂,参与工人约一千二百名。资方拒绝让步,工会要求政府出面调停。罢工尚未发生暴力,但已有工厂停工。", options:[ { label:"责令资方让利,先复机", axis:"GM", fx:{spd:3,social_anger:-2,economy:2}, cost:"由劳工部出面,责令资方让步", msg:"你命劳工部出面,责令资方接受部分条件。机器重新开动,罢工暂时停止。资方在会后留下一句:「这次的让步,总有一天会要回来。」" }, { label:"增派警力,压住通道", axis:"SM", fx:{spd:-2,army:2,social_anger:3,political_violence:2}, cost:"增派警察,控制工厂周边通道", msg:"你命警察控制工厂周边通道。罢工声势下降,但工人转入了夜间串联。警察局报告里多了一行:「白天秩序正常,夜间活动增加。」" }, { label:"牵线上谈判桌,分步谈", axis:"GM", fx:{ddp:2,gov_trust:1,social_anger:-1}, cost:"由劳工部牵线,分项谈判", msg:"你让劳工部牵线,将工资、工时、遣散分项谈判。罢工暂时缓解,桌面上还悬着几项未决条款。工会代表离场时说:「下一轮,我们带着名单来。」" } ]}, "工会请愿": { prompt:"工会联合会向总理府递交请愿书,要求政府就工资、工时与失业救济作出回应。请愿书附有各行业工会签名,人数仍在增加。联合会代表请求当面递交。", options:[ { label:"当面接下请愿,逐条处理", axis:"GM", fx:{spd:3,gov_trust:2,social_anger:-1}, cost:"当面接收请愿,逐条转交各部", msg:"你当面接下请愿书,命各部逐条研究。工会代表离场时表示满意。几周后,各部递回回复,多数条款以「正在研究」结案。" }, { label:"收下但拖延,缓办", axis:"AP", fx:{social_anger:1,spd:-1,fatigue:1}, cost:"接收请愿,暂缓正式答复", msg:"你收下请愿,转交秘书处存档。工会代表以为已经递交,回去等待答复。数周后,秘书处才将请愿书送到相关各部。" }, { label:"退回请愿,要求走程序", axis:"OP", fx:{gov_trust:-1,spd:-2,social_anger:2}, cost:"退回请愿,要求由工会正式递交相关部", msg:"你命秘书处退回请愿,要求工会按程序递交相关各部。工会代表接过请愿书,没有争论。程序走完了,人也被程序冷了一回。" }, { label:"不干预,暗中查工会大额转账", axis:"OP", fx:{insider:2,social_anger:1}, cost:"不介入请愿,调查工会资金来源", longline:{key:"union_transfer", tag:"社会愤怒", title:"工会账目里的匿名汇款", due:10, reveal:"工会账上有一笔来源不明的罢工基金,汇款单上的签名你认得,是一位在议会里常投反对票的议员。工人的诉求是真的,但有人为它付了钱。"}, msg:"你不拦请愿,只让人查工会的资金来源。会费凑不出那样的数字。" } ]}, "街头冲突": { prompt:"警察局呈报:柏林某区发生两派工人街头冲突,双方各有数十人,已有数人受伤。冲突双方分属不同工会,此前已在工厂内发生争执。局里请求指示:是隔离双方,还是另有处置。", options:[ { label:"隔离双方,各回各阵", axis:"SM", fx:{army:1,social_anger:1,political_violence:-2}, cost:"派人隔离双方,划定分界", msg:"你命警察隔离双方,划定街区边界。冲突暂时停止,双方各自返回本区。警察局报告末页写道:「隔离有效,未发生新的冲突。」" }, { label:"严惩挑头的几个", axis:"SM", fx:{army:2,political_violence:1,gov_trust:1}, cost:"拘捕双方主要挑动者", msg:"你命警察拘捕几名主要挑动者。冲突暂停,但被拘者所在工会已向法院递交申诉。警察局内部提醒你:这几个人在工会里都有一定影响。" }, { label:"任它打尽心火,再谈", axis:"OP", fx:{political_violence:3,social_anger:1}, cost:"暂不干预,任冲突自行平息", msg:"你不介入,任双方自行消解。冲突在第二日夜间自行平息。警察局报告只写了一句:「双方均未再作进一步动作。」" } ]}, "工人占领工厂": { prompt:"警察局呈报:柏林一家机械厂被工人占领,工厂大门被封,厂内挂起工会旗帜。占领者要求厂主结清欠薪并承认工会代表权。厂主已向警方请求恢复厂区。", options:[ { label:"进厂谈判,结清旧账", axis:"GM", fx:{spd:3,social_anger:-3,gov_trust:2}, cost:"进入厂区谈判,结清欠薪", msg:"你命劳工部进厂谈判,由厂方先结清欠薪。工人撤出厂区,旗帜收起。厂主在会后提交了一份抗议信,措辞克制。" }, { label:"限令撤离,调警恢复", axis:"SM", fx:{army:3,gov_trust:1,social_anger:4,political_violence:2}, cost:"限期撤离,由警方恢复厂区", msg:"你命警察限期恢复厂区。工人撤离,厂门重新锁上。警察局报告里记下了参与者的姓名与所属工会,以备后续查阅。" }, { label:"承认工人代表,纳入谈判", axis:"LE", fx:{kpd:2,spd:2,social_anger:-2,revolution:1}, cost:"承认工会代表权,纳入正式谈判", msg:"你命劳工部承认工人代表权,纳入正式谈判。工人撤出厂区,旗帜收起。「代表权」这一条被写入会议记录,厂主在签字前停顿了片刻。" } ]}, /* ═══════ 社会 · 革命暗流 arch_revolution ═══════ */ "传单散发": { prompt:"警察局呈报:近一周内,柏林多个街区出现油印传单,内容号召工人「拒绝为共和国生产」。传单用纸与油墨质量不一,疑出自不同印刷点。局里请示是否追查印刷来源。", options:[ { label:"收缴传单,查印刷所", axis:"SM", fx:{army:2,revolution:-2,gov_trust:1}, cost:"收缴传单,追查印刷来源", msg:"你命警察收缴传单,顺纸源查到两处小型印刷点。一处已空,一处还在运转。警察局报告写道:「印刷点已封,油墨来源未明。」" }, { label:"置之不理,任它飘", axis:"OP", fx:{revolution:2,insider:1}, cost:"暂不收缴,继续观察", msg:"你不去碰那些传单。它们继续出现在电线杆和工厂围墙上。警察局的记录里多了一句:「未采取行动。」" }, { label:"暗查传单来源与网络", axis:"OP", fx:{insider:3,revolution:1}, cost:"暗中追查传单印刷与分发网络", longline:{key:"flyer_net", tag:"革命暗流", title:"传单的地下印刷线", due:10, reveal:"顺着纸张、油墨和送稿人,一条线逐渐清晰。源头是一间不挂牌的印刷厂,厂主与某工会理事有亲属关系。这条线比你预想的要长。"}, msg:"你不散传单,只查传单从哪来。印刷机、送稿人、接头点,一条线浮出水面。" } ]}, "地下集会": { prompt:"警察局呈报:近日接到线报,称柏林某区有多处地下室在夜间举行集会,内容涉及「推翻现行秩序」。集会人数不多,但地点分散、时间固定。局里请示是否采取行动。", options:[ { label:"包围集会,一网打尽", axis:"SM", fx:{spd:-3,army:3,revolution:-3,political_violence:2}, cost:"包围集会地点,拘捕参与者", msg:"你命警察包围一处集会地点。人拘了,材料收了。但线报显示,其他几处集会地点在当晚换了地方,人更多了。" }, { label:"派卧底盯紧,暂不动", axis:"OP", fx:{insider:3,revolution:1}, cost:"派卧底潜入,暂不行动", longline:{key:"rev_infil", tag:"革命暗流", title:"卧底地下党", due:12, reveal:"卧底递回第一批消息:他们在筹钱、攒枪,名单是活的,接头点在城东一家当铺。这条线终于向你吐了东西。"}, msg:"你不惊动他们,只让卧底进去坐。想听的全听见了,只是还没听够。" }, { label:"分化集会者,各自保位", axis:"OP", fx:{ddp:1,revolution:-2,insider:1}, cost:"分化集会参与者,各自为政", msg:"你命警察在集会内部制造分歧。几处集会自行解散。警察局报告末页写着:「集会已散,成员之间互不信任。」" } ]}, "武装训练": { prompt:"军方情报处呈报:柏林城外一处仓库附近,近期夜间有人进行操练,人数约数十人,使用旧式步枪。训练时间规律,装备来源不明。情报处请示是否移交警察局或军方处理。", options:[ { label:"突袭缴械,解散武装", axis:"SM", fx:{army:3,revolution:-3,political_violence:2}, cost:"突袭训练点,收缴武器", msg:"你命军方趁夜突袭。枪收了,人散了。情报处报告里多了一句:「该处已无活动,周边暂无新点。」" }, { label:"收编,改名民兵团", axis:"LE", fx:{army:2,revolution:1}, cost:"收编为地方民兵团", msg:"你命军方将其收编为民兵团。枪归了编制,训练照旧。情报处提醒你:这些人日后的调动和忠诚,需要另行掌握。" }, { label:"登记在案,听之任之", axis:"OP", fx:{insider:2,revolution:2}, cost:"登记在案,暂不处理", msg:"你不惊动他们,只让情报处把地点、人数和训练规律记下。枪还在练,你的名单也在一天天长。" } ]}, "告密者": { prompt:"总理府秘书处呈报:昨夜有一名自称知情人到访,递交一份名单,列出若干涉嫌参与地下活动的人员。此人要求政府保证其人身安全,并给予一定安排。", options:[ { label:"收下名单,兑现其请求", axis:"OP", fx:{insider:3,ddp:-1}, cost:"收下名单,兑现告密者要求", msg:"你收下名单,给了他要的安排。此人此后又递来两批消息。秘书处提醒你:卖名字的人一旦尝到甜头,就会为更小的利卖更多。" }, { label:"备案存证,暂不采信", axis:"OP", fx:{insider:2,spd:1}, cost:"备案存证,暂不采信", msg:"你把纸条存档,不采信也不透露。那人以为你收了,其实你只收了他的把柄。" }, { label:"当众揭穿他告密", axis:"SM", fx:{gov_trust:2,insider:-2,kpd:-3}, cost:"当众揭穿告密者", msg:"你命人当众揭了他的底。告密者从此绝迹,可肯给你递消息的人也少了。" } ]}, /* ═══════ 社会 · 粮食短缺 arch_food_shortage ═══════ */ "面包店排队": { prompt:"柏林市政厅呈报:夏洛滕堡区与弗里德里希斯海因区多家面包店门前排队时间明显延长,部分店铺面包在午前即售罄。市政尚未收到囤积举报,但已提醒各店登记供货情况。", options:[ { label:"开仓放粮,平价供应", axis:"GM", fx:{spd:3,social_anger:-3,gov_trust:2,economy:1}, cost:"从市仓调粮,平价供应", msg:"你命市政从市仓调粮,在几个区平价供应。队伍松动了一些,可市仓存粮薄了一层。市政的人说,只能撑到月底。" }, { label:"限量配给,公平为先", axis:"OP", fx:{gov_trust:2,social_anger:1}, cost:"在该区试行限量配给", msg:"你让市政在夏洛滕堡区试行限量配给。每户按人头领票,面包不再断供。公平了,可谁都笑不出来。" }, { label:"暗中屯而不发,济贵不济贫", axis:"OP", fx:{dvp:1,economy:2,social_anger:3}, cost:"暂不投放,优先供应高价渠道", msg:"你暂不投放市仓粮食,优先供应高价渠道。账面好看,街角的队伍却更长、更冷了。市政报告末页写道:「平价店排队人数未减。」" } ]}, "抢粮事件": { prompt:"警察局呈报:柏林某区一家粮店被数十人冲击,店门被撞开,部分面粉与土豆被搬走。现场无人受伤,粮店损失约数百马克。局里请示是否当场补粮,或另行处理。", options:[ { label:"当场发粮,先救眼下", axis:"GM", fx:{spd:3,social_anger:-2,gov_trust:2}, cost:"当场发放粮食,平息事态", msg:"你命警察协助粮店当场发粮。人散了,粮分完了。店主领到一张欠据,警察局报告写道:「事态平息,余粮另行调拨。」" }, { label:"调警护粮,严办带头", axis:"SM", fx:{army:2,social_anger:2,political_violence:2}, cost:"调警护粮,拘捕带头者", msg:"你命警察护住粮店,拘捕带头的人。粮保住了,可被拘者的邻居开始向警察局写信。" }, { label:"查清缺粮根源,再调配", axis:"OP", fx:{insider:2,ddp:2}, cost:"查清缺粮根源,再行调配", msg:"你先查粮去哪了。账是清了,可排队的人等不起那本账。市政报告末页写着:「粮源已查明,调配方案待批。」" } ]}, "配给制讨论": { prompt:"内政部呈报:近期报刊上关于配给制的争论增多,有主张全面配给者,有主张维持市场者。部分市政官员建议先在个别区试行。部里请示是否表态。", options:[ { label:"推行配给,均分口粮", axis:"GM", fx:{spd:2,gov_trust:1,social_anger:-2}, cost:"在个别区推行配给制", msg:"你命内政部在夏洛滕堡区先行试点。每户按票领粮,饭是匀了,可屋檐下多了一张票证,也多了道账。" }, { label:"反对配给,维护市场", axis:"OP", fx:{dvp:2,economy:2,gov_trust:-1}, cost:"暂不推行配给,维持市场供应", msg:"你暂不推行配给。粮贵的人能吃饱,粮贱的人只能看。内政部报告写道:「配给之议暂缓,各区自行掌握。」" }, { label:"折中:配给+自由买卖", axis:"GM", fx:{ddp:1,gov_trust:1}, cost:"配给保底,余量自由买卖", msg:"你让内政部取中间方案:票证保底,余量自由买卖。有人嫌捆,有人嫌乱,两头都没全满意。" } ]}, /* ═══════ 社会 · 难民涌入 arch_refugee ═══════ */ "鲁尔难民到柏林": { prompt:"内政部呈报:近一周有数批鲁尔区难民抵达柏林,人数约数百,多数为工人家庭。市政收容设施已接近满载。部里请示是否扩建收容,或限制入境。", options:[ { label:"扩建收容,供粮供水", axis:"GM", fx:{spd:2,zentrum:2,social_anger:-1}, cost:"扩建收容所,保障食水", msg:"你命市政扩建收容,供应食水。烟囱冒出热气,可队伍还在往这赶。收容所的人说,床位还够,饭只够到月底。" }, { label:"劝返原籍,管控入城", axis:"OP", fx:{gov_trust:-1,social_anger:2}, cost:"劝返原籍,管控入城", msg:"你命警察在城门口设卡劝返。有人掉头了,有人绕小路爬过墙根。内政部报告末页写着:「劝返有效,但仍有零散进入。」" }, { label:"登记造册,分批安置工作", axis:"OP", fx:{insider:2,spd:1,ddp:1}, cost:"登记造册,分批安置工作", msg:"你命内政部给难民上名册、找工位。队伍散了,名字却留在了纸上。内政部报告里多了一行:「部分难民已安置,其余待后续调拨。」" }, { label:"不限制,暗中查迁居名单", axis:"OP", fx:{insider:2,revolution:1}, cost:"不限制入境,暗中记录迁居名单", longline:{key:"migration_list", tag:"革命暗流", title:"州际迁居名单", due:10, reveal:"迁居名单上有规律:同一批人,从同一批地址,搬到同一批地址。那些地址是读书会、工人夜校、和一个不挂牌的印刷厂。人走了,网还在。"}, msg:"你不限制迁居,只让人口处多印一份名单。有些搬家,是整批整批的。" } ]}, "占领区儿童撤离": { prompt:"外交部呈报:占领区方面提出,可将一批儿童送到柏林临时安置,人数约百余名,多为工人家庭子女。外交部请示是否接收,或与占领区当局另行协商。", options:[ { label:"全面接收,供养安置", axis:"GM", fx:{zentrum:2,spd:2,idealism:2}, cost:"全面接收,供养安置", msg:"你命外交部全面接收,安排吃住。名字条折进布袋里。外交部报告写道:「首批儿童已安置,后续批次待定。」" }, { label:"就近分散到教会与农户", axis:"GM", fx:{zentrum:2,gov_trust:1}, cost:"就近分散到教会与农户", msg:"你命外交部将孩子分送到教会和农户。锅是不缺了,可每个孩子心里都缺一个名字的来处。" }, { label:"只接受最小一批,余者劝回", axis:"RE", fx:{nationalism:1,idealism:-2}, cost:"只接受最小一批,余者劝回", msg:"你命外交部只留下最小的孩子,其余劝回。名单上划掉的名字,夜里会自己浮起来。" } ]}, "边境流民": { prompt:"内政部呈报:东部边境铁路沿线聚集一批流民,人数约数百,多为边境地区农户与工人。他们既无法入境,也不愿返回原籍。部里请示是否开临时口岸,或另行处理。", options:[ { label:"开临时口岸,分批放行", axis:"GM", fx:{spd:2,social_anger:-2,gov_trust:1}, cost:"开临时口岸,分批放行", msg:"你命内政部开临时口岸分批放行。人潮缓了缓,可后面的队还望不到头。" }, { label:"联合他国,设立缓冲区", axis:"OP", fx:{intl_trust:1,gov_trust:1}, cost:"联合邻国,设立缓冲区", msg:"你命外交部与邻国协商设缓冲区。边界暂稳,可缓冲区的帐篷比承诺先住进去人。" }, { label:"暂不动,勒令原地等待", axis:"AP", fx:{social_anger:2,revolution:1}, cost:"暂不开放,勒令原地等待", msg:"你命内政部让他们原地等。人蹲在铁路边,蹲久了,腿会替嘴先表态。" }, { label:"不拦截,暗中记边检放行的车", axis:"OP", fx:{insider:2}, cost:"不拦截,暗中记录边检放行车辆", longline:{key:"border_cars", tag:"军方异动", title:"边检放行名单", due:14, reveal:"你记下的车牌里,有几辆属于军官俱乐部成员的亲属。他们运的「私人行李」,在海关申报单上写的是「家具」,重量却不对。边境的线,连着城里的网。"}, msg:"你让边检照常盖章,只把车牌抄了一份。有些路,是双向的。" } ]}, /* ═══════ 政治 · 民族主义躁动 arch_nationalism ═══════ */ "右翼集会": { prompt:"警察局呈报:柏林某区广场近日举行右翼集会,参加者数百人,有统一旗帜与口号。集会未发生暴力,但参与者中有人携带棍棒。局里请示是否准许继续集会。", options:[ { label:"准许集会,但派警监视", axis:"RE", fx:{gov_trust:1,dnvp:1,nationalism:1}, cost:"准许集会,派警监视外围", msg:"你命警察准许集会,只在外围监视。口号响亮,火气没散,只把雷埋得深了些。" }, { label:"以扰乱秩序为由解散", axis:"SM", fx:{spd:-1,army:2,social_anger:2,political_violence:2}, cost:"以扰乱秩序为由解散集会", msg:"你下令解散集会。人群散了,可黑红白的旗,从广场散进了更多扇窗。" }, { label:"借势表态,安抚民族情绪", axis:"RE", fx:{nationalism:2,dnvp:2,gov_trust:-1,idealism:-2}, cost:"借势表态,安抚民族情绪", msg:"你顺势讲了几句民族的话。掌声是有了,可你也把共和国往那面旗上靠了半步。" } ]}, "殉道者崇拜": { prompt:"警察局呈报:某区一名在冲突中死亡的右翼成员,近日被其同伙奉为「殉道者」,街头出现画像与鲜花,人数虽少但逐日增多。局里请示是否予以制止。", options:[ { label:"压制悼念,禁止集会", axis:"SM", fx:{army:2,social_anger:2,political_violence:2}, cost:"压制悼念,禁止集会", msg:"你下令撤掉画像、禁止悼念。花是清了,可那人的脸印进了更多人心里。" }, { label:"冷处理,不争抢烈士", axis:"AP", fx:{gov_trust:1}, cost:"冷处理,不予争抢", msg:"你不回应,不争论,任它凉下去。热度总要退,可退之前又烧旺了几分。" }, { label:"谁捧他,就查谁的背后", axis:"OP", fx:{insider:2,dnvp:-1}, cost:"追查捧场者背后的组织", msg:"你不看画像,只查谁在印画像。造神的人一旦现形,神像自己就矮了三分。" } ]}, "复仇主义宣传": { prompt:"新闻检查处呈报:近日几家报刊连续刊发复仇主义社论,主张「对凡尔赛条约不予承认」。文章措辞激烈,读者反应热烈。检查处请示是否干预。", options:[ { label:"倡导和平,公开反宣传", axis:"GM", fx:{spd:3,intl_trust:2,dnvp:-2}, cost:"公开倡导和平,反驳社论", msg:"你亲自写文反驳,告诉百姓真正的账在哪。笔尖烫,可总得有人先把火往旁边拨一拨。" }, { label:"安抚国内,不作正面回应", axis:"GM", fx:{gov_trust:1,fatigue:1}, cost:"暂不回应,静观其变", msg:"你不回应头条,让热度自己回落。火没烧起来,可柴也没挪开。" }, { label:"借势转向,引导至对外强硬", axis:"SM", fx:{nationalism:2,army:2,intl_trust:-1}, cost:"借势转向对外强硬", msg:"你顺水推舟,把火头转向国外。仇是报给外头看了,可擦枪的声音也变得平常。" } ]}, "排外情绪": { prompt:"警察局呈报:某区发生针对外来移民商铺的排外事件,有人投掷石块,围观者未加阻止。店主已向警方报案。局里请示如何处理。", options:[ { label:"制止暴力,保护移民", axis:"GM", fx:{gov_trust:2,ddp:2,social_anger:1}, cost:"制止暴力,保护移民商铺", msg:"你派人护住移民的铺子。砖头是拦下了,可街坊看你的眼神也冷了一度。" }, { label:"限制移民,顺应民意", axis:"RE", fx:{nationalism:2,dnvp:1,gov_trust:-1}, cost:"限制移民,顺应民意", msg:"你出台限制,让骂声有了回音。民意是舒坦了,可你也把偏见写成了法令。" }, { label:"介入调解,约法三章", axis:"GM", fx:{zentrum:1,ddp:1,social_anger:-1}, cost:"介入调解,约法三章", msg:"你把两边的火头都按住,立几条规矩。街面暂时平了,可锅底那点火还在。" } ]}, /* ═══════ 政治 · 政府危机 arch_gov_crisis ═══════ */ "不信任动议": { prompt:"国会秘书处呈报:部分议员已联名提出不信任动议,要求内阁就近期政策作出说明。动议尚未进入表决程序,各党团正在私下协商。", options:[ { label:"抢在表决前改组,换掉人手", axis:"OP", fx:{dvp:2,gov_trust:1,economy:1}, cost:"抢在表决前改组内阁", msg:"你在表决前动刀改组,换下几个旧人。动议撤了,可你背后的椅子也跟着松了松。" }, { label:"正面迎接表决,搏一票", axis:"GM", fx:{spd:2,gov_trust:1,fatigue:3}, cost:"正面迎接表决", msg:"你不闪不避,把话说透。表决过了,你赢回一口气,也欠了票仓几份人情。" }, { label:"答应当局成立调查,换时间", axis:"OP", fx:{fatigue:2,insider:1}, cost:"答应当局成立调查委员会", msg:"你答应成立调查委员会,先换几天太平。刀悬着没落,可你自己交给了谁处置,心里清楚。" } ]}, "内阁改组": { prompt:"总统府呈报:因近期政策分歧,部分部长已提出辞呈或表示不愿留任。总统请你提出改组方案,各党团亦已递交人选意见。", options:[ { label:"大刀改组,安插自己人", axis:"OP", fx:{dvp:2,fatigue:2,gov_trust:-1}, cost:"大刀改组,安插亲信", msg:"你把关键位子换上亲信。牌局重新洗过,你手里的牌更厚,也更烫。" }, { label:"小范围调整,稳住旧班底", axis:"OP", fx:{gov_trust:1,fatigue:1}, cost:"小范围调整,稳住旧班底", msg:"你只做小调整,保旧班底安稳。桌上风平浪静,可裂缝又往里爬了半寸。" }, { label:"大换血,引入新人新政策", axis:"GM", fx:{ddp:2,idealism:2,fatigue:3}, cost:"大换血,引入新人新政策", msg:"你全面换血,让新人上来。空气是换了,可旧人留下的坑,新人也未必填得上。" } ]}, "示威倒阁": { prompt:"警察局呈报:总理府前广场聚集示威人群,人数约数百,口号要求内阁下台。示威尚未发生暴力,但已有部分商铺提前关门。局里请示是否清场。", options:[ { label:"强硬压场,宣布戒严", axis:"SM", fx:{army:3,gov_trust:2,political_violence:3}, cost:"强硬压场,宣布戒严", shift:{lr:5,rc:5,authoritarian:5}, msg:"你宣布戒严,命人清场。口号沉下去了,可那道缝在广场上划开了就合不上。" }, { label:"让步,答应重新组阁", axis:"GM", fx:{spd:2,social_anger:-2,gov_trust:-1}, cost:"让步,答应重新组阁", shift:{lr:-2,rc:-1}, msg:"你答应重新组阁,先下台阶。口号是停了,可下台两个字被喊顺了口。" }, { label:"不回应,熬过焦灼", axis:"AP", fx:{social_anger:2,fatigue:2,revolution:1}, cost:"不回应,熬过焦灼", shift:{rc:1,authoritarian:1}, msg:"你不露面,任它喊。广场上的火没处发,一点点攒进更深的夜里。" } ]}, "第48条讨论": { prompt:"总统府法律顾问呈报:因国会僵局持续,部分幕僚建议援引宪法第48条紧急条款,以总统令方式绕开议会。顾问提醒,此举虽有先例,但可能引发宪法争议。", options:[ { label:"签署,动用紧急权力", axis:"SM", fx:{army:3,gov_trust:1,political_violence:1,ddp:-1}, cost:"签署紧急令,援引第48条", shift:{lr:6,rc:5,authoritarian:6}, msg:"你签下第48条,绕开议会直接下令。命令发出去了,可笔尖离开纸面的那一瞬,会议室里安静得能听见自己的心跳。\n\n第二天,司法界有人放话:这违反宪法。议会的火,烧到了你办公桌边。宪法这页纸,被你自己掀开了一道缝。", chain:{flag:"chain_art48_used", followup:[{title:"第48条的代价:宪法危机回响", desc:"你援引紧急条款十来天后,一场关于「总统能否绕过议会治国」的争辩席卷政界。报纸分成两派,律师协会烧掉一半讲稿又接过了另一半。\n\n紧急令救得了眼前,却给共和国刻下新伤:当「例外」变得顺手,「常态」就开始松动。下一次,还会有谁等着你伸手去够那条条款?", delay:9}]} }, { label:"拒绝,走正常议会程序", axis:"GM", fx:{ddp:2,spd:1,fatigue:1}, cost:"拒绝紧急令,走正常议会程序", shift:{lr:-2,rc:-1}, msg:"你按程序走议会。事情慢了些,可你的手没有越过宪法的线。激进的声音骂你优柔,但你清楚:有些线一旦越过,就再也没人记得它本该在哪里。" }, { label:"留作后手,郑重警告", axis:"SM", fx:{gov_trust:1,ddp:1,fatigue:1}, cost:"留作后手,仅作警告", shift:{lr:1,rc:1,authoritarian:1}, msg:"你不签,只把第48条举给议会看。没人真的动手,可所有人的眼睛都停在那页纸上。你让这条条款成了一根悬着的弦——它没有伤人,却让在场每个人都记住了它的份量。" } ]}, /* ═══════ 政治 · 分离主义 arch_separatism ═══════ */ "巴伐利亚对抗柏林": { prompt:"内政部呈报:巴伐利亚邦政府近期在财政与警务权限上多次自行其是,并公开表示「柏林管不了巴伐利亚的事」。邦政府尚未采取正式对抗措施,但态度日趋强硬。", options:[ { label:"严正警告,底线不让", axis:"SM", fx:{army:2,nationalism:2,gov_trust:1}, cost:"严正警告,底线不让", msg:"你回电强硬,划下底线。电报线两端都绷紧了,谁也不先松手。" }, { label:"谈判让步,换邦内安稳", axis:"RE", fx:{dnvp:1,nationalism:1,gov_trust:-1}, cost:"谈判让步,换邦内安稳", msg:"你派人和谈,让出一些管辖权。慕尼黑缓了,可「柏林管不了」这念头也坐实了。" }, { label:"单方面宣布邦令无效", axis:"SM", fx:{army:2,political_violence:2,nationalism:2}, cost:"单方面宣布邦令无效", msg:"你宣布他们的命令无效。纸是废了,可他们的心脱离得更远了些。" } ]}, "莱茵分离主义": { prompt:"内政部呈报:莱茵地区出现分离主义活动,有人在地方报刊上主张「莱茵自治」,并已举行小规模集会。活动尚未构成武装对抗,但已引起当地驻军注意。", options:[ { label:"派官员安抚,重建联系", axis:"GM", fx:{zentrum:2,gov_trust:1,nationalism:-1}, cost:"派官员安抚,重建联系", msg:"你派人下去安抚,重修与莱茵的联系。桥是架起来了,可水还是往自己的方向流。" }, { label:"强硬划一,武力威慑", axis:"SM", fx:{army:2,nationalism:2,political_violence:2}, cost:"强硬划一,武力威慑", msg:"你调兵威慑莱茵。划界的石头收了,可人心已经先划好了一条线。" }, { label:"承认地方利益,给足自治", axis:"GM", fx:{ddp:1,nationalism:-1}, cost:"承认地方利益,给足自治", msg:"你给莱茵自治,换它留下。权是让出去了,可国还在,算输得起。" } ]}, "地方武装集结": { prompt:"军方情报处呈报:某邦乡下出现地方民兵集结,人数约百余人,使用旧式步枪,训练规律。该邦政府未向中央报备。情报处请示是否强令解散。", options:[ { label:"强令解散,收缴武器", axis:"SM", fx:{army:3,social_anger:2,political_violence:2}, cost:"强令解散,收缴武器", msg:"你强令解散地方民兵。枪是交了,可「我们要自卫」这话传得更远了。" }, { label:"收编为国家预备役", axis:"SM", fx:{army:2,nationalism:1}, cost:"收编为国家预备役", msg:"你把民兵收进预备役,化野为兵。枪不算地方的了,可握枪的手还是那些。" }, { label:"监控集结,暂按兵不动", axis:"OP", fx:{insider:2,army:1}, cost:"监控集结,暂按兵不动", msg:"你不惊动他们,只布眼线记下集结的地点、人马。枪和人心一起记进了本子。" } ]}, /* ═══════ 政治 · 舆论战 arch_media_war ═══════ */ "报纸攻击政府": { prompt:"新闻检查处呈报:柏林一家晨报连续数日刊发社论,批评政府财政与外交政策,措辞尖锐。该报发行量不大,但读者多为政界与商界人士。检查处请示是否作出回应。", options:[ { label:"发专电反驳,摆事实", axis:"GM", fx:{gov_trust:2,ddp:1}, cost:"发专电逐条澄清", msg:"你命新闻处发专电逐条澄清。该报次日刊出半栏回应,批评照旧。新闻处报告写道:「澄清已发,舆论未见转向。」" }, { label:"查办报社,堵住喉咙", axis:"OP", fx:{gov_trust:-1,social_anger:2}, cost:"查办该报,限制发行", msg:"你命检查处查办该报,限制其发行。该报沉默数日,同业公会递来申诉。新闻处提醒你:封住一家小报,别家会看见。", chain:{flag:"chain_press_shut", followup:[{title:"查封之后:同业公会的申诉", desc:"该报被限制发行后,同业公会连夜开会,律师递来申诉。街面新闻安静了数日,安静得反常。检查处报告末页写道:「舆论表面平稳,同业动向待察。」", delay:3}]} }, { label:"拉拢主编,改换口径", axis:"OP", fx:{insider:2,gov_trust:1}, cost:"私下接触主编,疏通关系", msg:"你命人私下接触该报主编。次日社论语气放缓。新闻处报告里多了一行:「该报近期无尖锐评论。」" }, { label:"不回应,暗中查报馆账目", axis:"OP", fx:{insider:2}, cost:"不回应,调查报馆资金来源", longline:{key:"press_ledger", tag:"政治暗流", title:"报馆背后的金主", due:9, reveal:"你让人翻查该报半年账目。有几笔广告费来自同一家空壳公司,注册地址在一位阁员的郊外别墅。报纸上的字,是有人付过钱的。"}, msg:"你不还嘴,只让人去翻报馆的账。广告栏里的数字,比社论更诚实。" } ]}, "谣言扩散": { prompt:"警察局呈报:近日柏林坊间流传政府将废止纸马克、另发新币的消息,部分商铺已开始拒收大额钞票。消息来源不明,局里请示是否公开澄清。", options:[ { label:"连夜辟谣,公开澄清", axis:"OP", fx:{gov_trust:1,intl_trust:1}, cost:"公开澄清,稳定市场", msg:"你命财政部与央行联合发布声明,否认废止旧币。市场短暂恢复收钞,但警察局报告写道:「谣言已缓,疑虑未消。」" }, { label:"查源头,钉死造谣的", axis:"OP", fx:{insider:2,gov_trust:1,ddp:-1}, cost:"追查谣言来源", msg:"你命警察追查谣言源头。几处小印刷点被查,消息暂时停歇。警察局报告里多了一句:「源头已断,类似消息仍可能再起。」" }, { label:"不理会,任谣言自行腐烂", axis:"AP", fx:{social_anger:2,revolution:1}, cost:"暂不回应,静观其变", msg:"你不回应,让它自行消退。谣言没有酿成大波,但商铺的拒收范围略有扩大。警察局报告末页写着:「未采取公开措施。」" } ]}, "报馆被冲击": { prompt:"警察局呈报:柏林一家报馆昨夜遭人投掷石块,玻璃破损,无人受伤。该报主编已向警方报案,怀疑与近日社论有关。局里请示是否立案严查。", options:[ { label:"严查冲击,保护报馆", axis:"GM", fx:{gov_trust:2,ddp:2}, cost:"立案严查,派警保护", msg:"你命警察立案严查,并派员在报馆附近守夜。玻璃补上了,主编写字的手仍有些凉。" }, { label:"调节双方,各打五十板", axis:"RE", fx:{dnvp:1,ddp:-1,fatigue:1}, cost:"调解双方,各责其过", msg:"你命警察调解双方,指出报馆言论亦有不当。无人赔偿玻璃,主编也不再追问。警察局报告写道:「事态平息。」" }, { label:"借势压制报馆锋芒", axis:"RE", fx:{dnvp:2,gov_trust:1,ddp:-2}, cost:"借势敲打该报", msg:"你借这起冲击敲打该报,命其收敛评论。报纸锋芒减弱,警察局报告里多了一句:「该报近期未刊尖锐社论。」" } ]}, /* ═══════ 军事 · 军方异动 arch_military ═══════ */ "军官密谋": { prompt:"军方情报处呈报:柏林某军官俱乐部近期夜间聚会频繁,参加者多为中高级军官。聚会内容涉及部队调动与「秩序」议题,未发现明确政变计划。情报处请示是否介入。", options:[ { label:"当面点破,立住威严", axis:"OP", fx:{army:-3,gov_trust:2,insider:2}, cost:"当面点破,表明立场", shift:{lr:-1}, msg:"你命人安排与俱乐部成员会面,当面点破其聚会内容。对方表示只是同僚闲谈。情报处报告写道:「聚会规模缩小,内容趋于日常。」" }, { label:"拉拢,把密谋变效忠", axis:"SM", fx:{army:4,gov_trust:-1,army_influence:2}, cost:"拉拢军官,许以军费与秩序", shift:{lr:4,rc:4,authoritarian:2}, msg:"你通过中间人向俱乐部成员示好,许以军费与「秩序优先」的口头承诺。聚会暂时平息,情报处提醒你:买来的只是暂时不拆台。", chain:{flag:"chain_officer_pacted", followup:[{title:"军官俱乐部的回礼", desc:"俱乐部回你一桌酒席,话比上次更亲热。军费、编制、「秩序优先」被写进一份不成文的默契。你买来军队数月的安静,可每一个字日后都可能以另一种方式来找你结账。", delay:25}]} }, { label:"暗中记人名,暂不挑破", axis:"OP", fx:{insider:3,army:1}, cost:"暗中记录人名,暂不挑破", shift:{rc:1}, longline:{key:"officer_list", tag:"军方异动", title:"军官俱乐部的那页名单", due:14, reveal:"那张名单你记下了。眼下他们没动作,但每个人的去向你都在看。风声再起时,你会知道先找谁。"}, msg:"你命情报处记下与会者姓名与频率,暂不惊动。情报处报告末页写道:「名单已录,活动待察。」" } ]}, "志愿团集结": { prompt:"军方情报处呈报:某地乡间出现退伍军人集结,自称志愿团,人数约百余人,使用旧式步枪,操练规律。该团体未向当地驻军报备,情报处请示是否处置。", options:[ { label:"核准编制,纳为国家力量", axis:"SM", fx:{army:2,dnvp:2,nationalism:1}, cost:"核准编制,纳入国家力量", msg:"你命军方核准志愿团编制,纳入预备役。枪归国家管,可那股劲也一并收进来了。" }, { label:"取缔,收缴武装", axis:"SM", fx:{army:1,social_anger:2,political_violence:2}, cost:"取缔团体,收缴武器", msg:"你命军方取缔志愿团,收缴武器。人散了,可他们转头就进了别的更隐蔽的名目。" }, { label:"备案监视,暂不禁", axis:"OP", fx:{insider:2,army_influence:1}, cost:"备案监视,暂不取缔", msg:"你不禁他们,只命情报处备案盯防。枪还在乡野操练,你的名单也一夜夜加厚。" } ]}, "政变传言": { prompt:"军方情报处呈报:近日有传言称总参谋部部分军官计划采取行动,日期未明。情报处未获确证,但已注意到部分部队调动异常。请示是否加强戒备。", options:[ { label:"连夜换防,交出军权心腹", axis:"SM", fx:{army:3,gov_trust:-1}, cost:"连夜换防,交由心腹掌握", shift:{lr:2,rc:3,authoritarian:3}, msg:"你连夜调换关键部队,将军权收进信得过的人手里。风声压住了,总参的怨也记下了。情报处报告写道:「调动完成,传言暂缓。」", chain:{flag:"chain_coup_checked", followup:[{title:"风声过后:军营里的暗涌", desc:"换防调令在兵营里传了一圈。表面风平浪静,私下的酒馆里关于「谁该握枪」的争论未停。你扼制了一场政变,也让自己站到了某个军官团的对立面。", delay:12}]} }, { label:"公开斥责,稳住军心", axis:"SM", fx:{gov_trust:2,army:1,political_violence:1}, cost:"公开斥责传言,稳住军心", shift:{rc:1}, msg:"你公开斥责政变传言,向全军喊话。军心定了大半,可喊话的人自己心里也打鼓。" }, { label:"私下威慑元凶,密保君位", axis:"OP", fx:{insider:2,army:-1,fatigue:2}, cost:"私下威慑元凶,保守秘密", shift:{lr:3,rc:2,authoritarian:2}, msg:"你逐个威慑可能的元凶,许以保全。风声停了,可你也把自己交进了秘密的手里。" } ]}, "国防军抗命": { prompt:"国防部呈报:一份调令被参谋部扣下,理由是「时机不对」。相关部队未按令行动,参谋部亦未正式回复。部里请示如何处理。", options:[ { label:"撤换抗命军官,立威", axis:"SM", fx:{army:2,gov_trust:1,army_influence:-2}, cost:"撤换抗命军官,立威", shift:{lr:3,rc:3,authoritarian:3}, msg:"你撤了一批违令军官。命令执行了,可你在军中的根也被一并拔松了。" }, { label:"收回成命,改令则行", axis:"OP", fx:{dvp:1,fatigue:2}, cost:"收回成命,改签可接受命令", shift:{lr:-1,rc:-1}, msg:"你收回那道令,改签一份他们肯接的。事办了,可军令的份量在你手里轻了一回。", chain:{flag:"chain_army_defied", followup:[{title:"调令的代价:军纪松动", desc:"那纸被扣下的调令,成了军中茶余饭后的谈资。军官们说话的语气变了,不是更恭敬,是更笃定:有些令,不必听。你保住了这次的脸面,可下一次讨价还价的筹码会握在那只扣下文件的手里。", delay:8}]} }, { label:"彻查抗命,整肃军纪", axis:"SM", fx:{ddp:1,social_anger:1,fatigue:2}, cost:"彻查抗命,整肃军纪", shift:{lr:2,rc:2,authoritarian:2}, msg:"你下令彻查抗命。牵出来的线越拉越长,直往总参谋部深处绕。" } ]}, /* ═══════ 军事 · 政治暴力 arch_political_violence ═══════ */ "街头斗殴": { prompt:"警察局呈报:柏林某区街头发生两派年轻人斗殴,涉及数十人,使用棍棒与旗杆。数人受伤,无人死亡。局里请示是否拘捕主要参与者。", options:[ { label:"调警拆散,各回各家", axis:"SM", fx:{gov_trust:1,social_anger:1,political_violence:-1}, cost:"调警拆散,各回各家", msg:"你命警察拆散双方,令其各自返回。火灭了一阵,可各自回营后怎么记,谁也拦不住。" }, { label:"拘下闹得最凶的几个", axis:"SM", fx:{army:1,political_violence:1,social_anger:1}, cost:"拘捕主要参与者", shift:{lr:2,rc:2,authoritarian:1}, escalate:{title:"巷战", tag:"政治暴力增加", delay:4, fu_title:"火过街巷:街头斗殴升级为巷战", fu_desc:"你当初拘下的那几人,成了另一群人的引信。数日后,两条街的人带着棍棒和自制武器,把一场斗殴打成了巷战。警察的警棍在砖墙之间显得单薄。卷宗在你桌上,已经从「治安小事」换成了「政治事件」。"}, msg:"你命警察拘捕动手最狠的几人。街面清了,可被拘者回去会把怨气讲给整条街听。" }, { label:"约谈双方头目,划红线", axis:"OP", fx:{social_anger:-1,insider:1}, cost:"约谈双方头目,划定红线", msg:"你命警察把双方头目叫来立规矩。台上握手,台下各自把牙咬得更紧。" } ]}, "暗杀事件": { prompt:"警察局呈报:清晨有人在柏林某报摊前遭枪击,伤重不治。死者为一名地方政界人士,凶手在逃。局里请示是否全城缉凶,或低调处理。", options:[ { label:"全城缉凶,限期破案", axis:"SM", fx:{gov_trust:2,political_violence:1,fatigue:2}, cost:"全城缉凶,限期破案", msg:"你立下限期全城缉凶。凶手迟早落网,可暗杀这口锅,全城都在往外推。" }, { label:"低调处理,淡化影响", axis:"OP", fx:{gov_trust:-1,insider:1}, cost:"低调处理,淡化影响", msg:"你命警察低调善后。街面假装无事,可那摊血在许多人心里没擦。" }, { label:"公开承诺严查,安抚舆论", axis:"GM", fx:{gov_trust:2,social_anger:-1}, cost:"公开承诺严查,安抚舆论", msg:"你公开承诺限期严查。民心稳了一点,可你的每句话从此都要兑现,否则都算出尔反尔。" } ]}, "冲锋队挑衅": { prompt:"警察局呈报:一队穿褐衫的冲锋队成员列队经过工人区,高喊口号,未发生暴力。工人区居民反应紧张,局里请示是否制止游行。", options:[ { label:"制止游行,收缴旗帜", axis:"SM", fx:{army:2,social_anger:1,political_violence:1}, cost:"制止游行,收缴旗帜", msg:"你命警察拦下这次游行。旗是收了,可褐衫的影子在夜里又练了几回。" }, { label:"任其过,严密盯防", axis:"OP", fx:{insider:2,army:1}, cost:"任其通过,严密盯防", msg:"你不拦,只命警察跟随。队伍走完了,可它踩出的那几步,有人记成了路。" }, { label:"叫停双方,协商划区", axis:"OP", fx:{social_anger:-1,insider:1}, cost:"叫停双方,协商划区", msg:"你命警察把双方的街区划开,各退半条街。暂时不打照面,可火药横在两区之间。" } ]}, "警方镇压": { prompt:"警察局呈报:某区集会人群与警方对峙,警方已列队施压,水枪与警棍备妥。人群后退,口号未停。局里请示是否授权进一步行动。", options:[ { label:"支持警力,坚决维持秩序", axis:"SM", fx:{army:3,gov_trust:1,social_anger:2}, cost:"支持警力,维持秩序", shift:{lr:3,rc:3,authoritarian:3}, msg:"你赞赏警方压场。街面稳了,可人群退回巷子里的脸越来越冷。" }, { label:"约束警方,避免流血", axis:"GM", fx:{spd:2,social_anger:-1,gov_trust:1}, cost:"约束警方,避免流血", shift:{lr:-2}, msg:"你命警察收着点手。没见血,可两边的火都还旺着,只是没烧到明处。" }, { label:"开特别法庭审判滋事者", axis:"SM", fx:{ddp:1,fatigue:2}, cost:"开特别法庭审判滋事者", shift:{lr:2,rc:2,authoritarian:2}, msg:"你把带头闹事的送上特别法庭。案是断了,可法律这道门也成了双方的战场。" } ]}, /* ═══════ 军事 · 准军事组织 arch_paramilitary ═══════ */ "冲锋队扩编": { prompt:"内政部呈报:NSDAP下属冲锋队近期在柏林及周边地区扩编,登记人数较上月增加约两成。新成员多为失业青年与退伍军人。该组织尚未被认定为非法,但已引起部分区警察局注意。", options:[ { label:"立法限制,禁止携械械斗", axis:"GM", fx:{gov_trust:2,ddp:1,nsdap:-2}, cost:"立法限制准军事组织携械", msg:"你命内政部起草限制准军事组织携械的法令。纸是立了,可冲锋队的队伍还在变长,只是换了说法。" }, { label:"视为寻常,听之任之", axis:"AP", fx:{nationalism:1,nsdap:1,army_influence:1}, cost:"暂不干预,视为寻常团体", msg:"你不当回事,任其扩编。街上的褐衫多起来。内政部报告末页写道:「该组织活动未受限制。」" }, { label:"收编注册,纳入秩序", axis:"SM", fx:{army:1,nsdap:1,fatigue:2}, cost:"要求登记注册,纳入管理", msg:"你命其登记注册,纳入某种秩序。名义上是你的了,可那股劲早已扎进街头。" } ]}, "红色阵线活动": { prompt:"警察局呈报:柏林工人区近期出现红色阵线活动,成员列队训练,张贴标语,规模不大但组织严密。局里请示是否取缔。", options:[ { label:"同理镇压,解散武装", axis:"SM", fx:{army:3,kpd:-3,social_anger:2}, cost:"取缔组织,解散武装", msg:"你命警察取缔红色阵线,解散其武装。街面静了,可工人区的火气转进了地缝。" }, { label:"对话改造成工会合法组织", axis:"GM", fx:{spd:2,ddp:1}, cost:"引导纳入工会合法组织", msg:"你命劳工部引导其纳入工会体系。武装散了,可那份劲顺着合法的口子又流了出来。" }, { label:"监视其活动,不拆台", axis:"OP", fx:{insider:2,kpd:1}, cost:"监视活动,暂不拆台", msg:"你不碰红色阵线,只命警察盯住。脚步和口号你记下了,可这线越放越长。" } ]}, "街头巡逻": { prompt:"警察局呈报:近期柏林多个街区出现准军事组织自行巡逻,成员着统一制服,列队行走,路人避让。该组织声称「协助维持治安」,但未获任何官方授权。局里请示是否取缔。", options:[ { label:"取缔巡逻,收回街面", axis:"SM", fx:{gov_trust:2,army:2,nsdap:-2}, cost:"取缔巡逻,收回街面", msg:"你命警察取缔街头巡逻,命其撤走。街面是收回来了,可他们的账记在了别处。" }, { label:"默许,借其维持治安", axis:"OP", fx:{army_influence:1,gov_trust:-1}, cost:"默许巡逻,借其维持治安", msg:"你默许他们巡逻,图个表面太平。街面安稳了,可那些脚步声渐渐像了主人。" }, { label:"纳入联防,明配编制", axis:"OP", fx:{insider:1,gov_trust:1,fatigue:1}, cost:"纳入联防,给予编制", msg:"你把巡逻并入联防,给编制给名义。步子是齐了,可那股替你巡逻的心也进了国家。" } ]}, /* ═══════ 旧黄色事件 Y01-Y08 ═══════ */ "鲁尔罢工补贴不足": { prompt:"劳工部呈报:鲁尔区罢工工人补贴已连续数周按原标准发放,因物价上涨,实际购买力明显下降。工会代表请求追加补贴,否则部分工人将被迫复工。部里请示是否调整。", options:[ { label:"追加补贴,撑住罢工", axis:"LE", fx:{kpd:2,spd:2,inflation:2,economy:-1}, cost:"追加补贴,维持罢工", msg:"你把补贴再抬上去。人撑住了,可印钞票的手也越张越开。" }, { label:"压缩补贴,尽快谈和", axis:"RE", fx:{spd:-2,dnvp:1,economy:1}, cost:"压缩补贴,推动复工谈判", msg:"你压减补贴,逼他们早点收场。工人凉了半截心,复工也埋下了下次的火。" }, { label:"补贴改成以工代赈", axis:"GM", fx:{spd:2,ddp:2,economy:-2}, cost:"补贴改以工代赈", msg:"你把补贴转成发活计。钱用在修路通水上了,罢工渐渐散进工地里。" } ]}, "马克跌破万亿": { prompt:"央行呈报:马克兑美元汇率已跌破万亿关口,市场交易近乎停顿。部分商铺拒收大额钞票,改用实物交换。央行请示是否公开承诺币制改革。", options:[ { label:"承诺货币改革,稳住预期", axis:"OP", fx:{dvp:2,gov_trust:2,inflation:-1}, cost:"公开承诺货币改革", msg:"你公开承诺货币改革。市场抖了一下,可谁都在等那张真金凭信。" }, { label:"强制结算旧币,以物易物过渡", axis:"SM", fx:{spd:1,inflation:-2,social_anger:2}, cost:"强制结算旧币,过渡以物易物", msg:"你放开以物易物,停发大额票。数字僵住了,可街上的交易先乱了阵脚。" }, { label:"静观其变,等币值自然触底", axis:"AP", fx:{inflation:2,social_anger:2,gov_trust:-2}, cost:"暂不干预,等币值触底", msg:"你什么也不做,任它跌到底。恐慌不是等来的,是多跌一晚就多一分。" } ]}, "埃森工厂冲突": { prompt:"外交部呈报:埃森一家工厂发生法军与德国工人对峙事件,双方在警戒线两侧僵持,已有人受伤。法方称工人阻碍占领区管理,德方工人要求改善待遇。部里请示是否介入调停。", options:[ { label:"调停谈判,斡旋双方", axis:"GM", fx:{spd:1,intl_trust:1,economy:-1}, cost:"调停谈判,斡旋双方", msg:"你派人斡旋,让双方各退一步。伤了的人和刚燃的怨,暂时压在警戒线两边。" }, { label:"声援工人,对外强硬", axis:"LE", fx:{kpd:2,nationalism:2,intl_trust:-2}, cost:"声援工人,对外强硬", msg:"你公开声援工人,向法军摆强硬。民心热了,可对外这张脸也僵了。" }, { label:"保持克制,呼吁冷静", axis:"OP", fx:{gov_trust:1,intl_trust:1,fatigue:1}, cost:"保持克制,呼吁冷静", msg:"你呼吁双方冷静。字老一辈,火没散,可至少没在这夜里烧起来。" } ]}, "巴伐利亚右翼集会": { prompt:"内政部呈报:巴伐利亚邦近期右翼集会频繁,参加人数逐次增多,公开喊口号、公开造势。邦政府未予制止。部里请示是否由中央介入。", options:[ { label:"派员监视,记名造册", axis:"OP", fx:{insider:2,nationalism:1}, cost:"派员监视,记名造册", msg:"你派人盯住集会,记下名字。名单越记越长,可他们喊口号的胆子也越喊越大。" }, { label:"约谈地方,施加压力", axis:"OP", fx:{dnvp:-1,gov_trust:1,fatigue:1}, cost:"约谈邦政府,施加压力", msg:"你约谈巴伐利亚,施加压力。集会停了几天,可慕尼黑看你更疏了一层。" }, { label:"暂不过问,冷处理", axis:"AP", fx:{nationalism:1,revolution:1}, cost:"暂不过问,冷处理", msg:"你暂时不碰。集会照常,人心在火堆边一盏盏点起来,你隔着柏林看得清清楚楚。" } ]}, "法国驱逐鲁尔官员": { prompt:"外交部呈报:法军近日将一批鲁尔区德国官员就地驱逐,理由为「不合作」。被逐官员及家属正向柏林方向转移。部里请示是否接收安置,或向法方提出抗议。", options:[ { label:"接收安置,公开抗议", axis:"RE", fx:{spd:2,nationalism:2,intl_trust:-2}, cost:"接收安置,公开抗议", msg:"你安置被逐官员,并向法国照会抗议。民声很高,国际回音却只淡淡一声。" }, { label:"低调接人,不公开声张", axis:"GM", fx:{intl_trust:1,spd:1}, cost:"低调接人,不公开声张", msg:"你悄悄接收,不作声张。人安顿下了,可这口气在百姓嘴里憋得慌。" }, { label:"由地方自行安置", axis:"GM", fx:{gov_trust:1,spd:1}, cost:"由地方自行安置", msg:"你让地方自行安置。公文署名不经你手,可被赶出来的人,记住的仍是共和国。" } ]}, "工会抗议物价": { prompt:"警察局呈报:总工会在柏林市中心组织抗议物价集会,参加者数百人,口号针对食品与燃料价格。集会未发生暴力,但已影响部分街区交通。局里请示是否介入。", options:[ { label:"接见工会,答应研究降价", axis:"GM", fx:{spd:3,gov_trust:1,social_anger:-1}, cost:"接见工会,答应研究", msg:"你接见工会,答应研究。火暂时缓了,可「研究」两个字一旦落地为虚,就再来一次。" }, { label:"派警维持,不予理睬", axis:"SM", fx:{spd:-2,army:1,social_anger:2}, cost:"派警维持,不予理睬", msg:"你只派警维持秩序,不发话。牌是守住了,可抗议的诉求堆在门口没处着。" }, { label:"顺势承诺价格巡查", axis:"GM", fx:{ddp:2,gov_trust:2}, cost:"顺势承诺价格巡查", msg:"你答应物价由官方巡查。口号弱了,可纸上的承诺若不兑现,比不曾承诺更伤。" } ]}, "学生政治集会": { prompt:"警察局呈报:柏林大学学生近期多次举行政治集会,左右两派均有参与,走廊内已发生肢体冲突。校方请求警方协助维持秩序。局里请示是否介入。", options:[ { label:"约谈校长,责令管束", axis:"GM", fx:{ddp:1,gov_trust:1,fatigue:1}, cost:"约谈校长,责令管束", msg:"你约校长管束,校园表面安静了。可书桌底下交换的观念,比走廊上的口号跑得更远。" }, { label:"任其论辩,不介入", axis:"AP", fx:{ddp:2,idealism:2}, cost:"任其论辩,不介入", msg:"你不介入,任他们在课堂上争。争论是活的,你只是把火留在它该在的炉膛里。" }, { label:"查办激进分子,抓典型", axis:"SM", fx:{spd:-2,army:1,social_anger:2}, cost:"查办激进分子,抓典型", msg:"你抓了几个激进的学生。校园是静了,可那股不平,在更年轻的心里烧得更快。" } ]}, "黑市猖獗": { prompt:"警察局呈报:亚历山大广场及周边黑市活动近期明显增加,交易品类包括外汇、食品、香烟及情报。部分摊主与区议员有往来,警方多次清查未见成效。局里请示是否继续清查或另作处置。", options:[ { label:"彻查黑市,端掉窝点", axis:"SM", fx:{gov_trust:2,insider:2,inflation:-1}, cost:"彻查黑市,端掉窝点", msg:"你彻查并端掉几个窝点。摊子塌了一角,可天黑后又在别处支起来了。" }, { label:"收编黑市,官方代办", axis:"OP", fx:{dvp:2,gov_trust:1}, cost:"收编黑市,官方代办", msg:"你把黑市收编成官办渠道。价是规矩了,可暗处的走私换了个壳,还在流。" }, { label:"暗线追踪,摸清网", axis:"OP", fx:{insider:3,revolution:1}, cost:"暗线追踪,摸清网络", msg:"你不端摊子,只顺着货和钱跟下去。黑市的网越摸越深,直通进你没料到的地方。" } ]}, /* ═══════ 新增组 · 财政危机 arch_fiscal ═══════ */ "财政黑洞": { prompt:"年底的账本摊开,赤字像一张合不上的嘴。财政部递来的数字,比你预想的多出两个零。", options:[ { label:"举债填补,先过眼前", axis:"OP", fx:{dvp:2,economy:1}, cost:"国债利滚利,账越欠越厚", shift:{lr:3}, msg:"你靠在借上,先把窟窿盖上。财政部报表好看了一天,可那些债会在更紧的时候回来。\n\n银行家们嘴上没说不借,可那套账,他们已经替你排好了迟早要还的日子。", chain:{flag:"chain_debt_mounting", followup:[{title:"债台高筑:财政部的第二份账单", desc:"新国债陆续被银行接走,换来的是一张张到期日。财政部的人私下说,这只是把今天的疼,挪到明天更疼的地方。\n\n你已经踩上这条由欠条铺成的路。下一步,要么增税,要么压缩——你看着那张越来越厚的账单,清楚知道它不会自己消失。", delay:10}]} }, { label:"压缩开支,砍掉补贴", axis:"GM", fx:{spd:-2,social_anger:2,economy:2}, cost:"省下的钱,是各处的怨", shift:{lr:2,rc:2}, msg:"你命令各处预算收紧,砍掉最肥的补贴。账本薄了一截,可每一刀下去,都有人捏着剪下来的那张纸,记在心上。\n\n省钱省出来的,往往不是感激,是一句句压低声音的「凭什么」。" }, { label:"开征新税,向富人转嫁", axis:"OP", fx:{dvp:-2,social_anger:-1,economy:2,gov_trust:2}, cost:"得罪新钱,讨一点公道", shift:{lr:-3}, msg:"你推出新税,把额度压在富人头上。商会骂你,街上的穷人却松了半口气。\n\n公道从不会白给——你从富人的口袋里掏出来的每一马克,他们都会在别处变着法子算计回去。" } ]}, "增税与抗税": { prompt:"税改令一贴出去,街上的反应比预想快。小店合伙罢市,商会递来抗议书。", options:[ { label:"压住抗税,限期取缔罢市", axis:"SM", fx:{army:2,social_anger:3,economy:1}, cost:"警棍换不来认账", shift:{lr:4,rc:4,authoritarian:3}, msg:"你下令限期复市,派警盯着。店是开了,可帘子后面的账,都换成了更隐蔽的写法。\n\n抗税压下去的是行动,压不下的,是那口「凭什么加我们」的气。" }, { label:"谈判,给商会一个缓税区", axis:"GM", fx:{dvp:2,social_anger:-1,economy:1}, cost:"缓一年,账还记账上", shift:{lr:2}, msg:"你与商会坐下来,给出一条缓税的路。罢市撤了,商会欠你一次。\n\n缓税不是免税——那笔钱没消失,只是跟我一样,被推迟到了下次的账单上。" }, { label:"加重富人税,安抚小店主", axis:"GM", fx:{spd:2,dvp:-2,social_anger:-2}, cost:"向富人伸手,向小店主递枣", shift:{lr:-3,rc:-1}, msg:"你把重头压在富人身上,给小店主留了条缝。抗议声小了,可富人那头的恨意,会被写在更无声的地方。\n\n你讨好了一条街,也就让另一条街,把你记进了黑账。" } ]}, "国债无人认购": { prompt:"新一批国债发出去,认购的人寥寥。银行家推脱,市场用沉默投票。", options:[ { label:"强令银行认购", axis:"SM", fx:{dvp:-3,economy:2,social_anger:1}, cost:"用命令买账,买不来情愿", shift:{lr:2,rc:2,authoritarian:2}, msg:"你勒令各大银行吃下这批债。账面上过了,可银行家们把债券捏着,像捏着一叠烧手的热度。\n\n强按牛头喝水,牛不喝,只是不敢当着你的面说不。" }, { label:"提高利率,加厚甜头", axis:"OP", fx:{dvp:2,economy:2,inflation:2}, cost:"用明天的通胀,换今天的认购", shift:{lr:2}, msg:"你把利率抬上去,让钱流向国库。认购有了,可答应出去的那点甜头,迟早从物价里找回来。\n\n你在为今天借明天的账,而明天,会在某个弯腰的价签上等你。" }, { label:"暂停发债,另寻门路", axis:"OP", fx:{insider:1,economy:-1,gov_trust:1}, cost:"停一停借债,也放下了颜面", shift:{lr:-1}, msg:"你叫停发债,转走别的门路。市场愣了一下又回过神,多少人是暗地里松了一口气。\n\n承认借不动,也是一种体面的坦白——至少在还有人信你诚实之前。" } ]}, "军费挤占民生": { prompt:"军部的预算又涨了,可救济处的粥桶在见底。两边的账单摆在你桌上。", options:[ { label:"维持军费,民生往后", axis:"SM", fx:{army:3,social_anger:3,gov_trust:-1}, cost:"喂饱军队,饿瘦民心", shift:{lr:3,rc:3,authoritarian:2}, msg:"你把这笔钱拨给军部。军营里士气稳了,可救济处长接过账单时,眼神凉了一截。\n\n你优先了一把枪,却在身后留了一份更长的队。" }, { label:"削减军费,挪给救济", axis:"GM", fx:{army:-3,spd:2,social_anger:-2}, cost:"低头向军方,抬头对民心", shift:{lr:-2}, msg:"你砍下军费,挪去填粥桶。民生喘了口,军官们却把这一次「削减」,记成了账。\n\n你给穷人的一碗粥,会以某种方式,在军中的酒桌上变成一次敬而远之的目光。" }, { label:"两边各砍一点,维持平衡", axis:"SM", fx:{army:1,spd:1,social_anger:1}, cost:"两头都少,两头都不满", shift:{rc:1}, msg:"你在军费和救济之间各撤半刀。谁都没得到想要的,也谁都不至于掀桌。\n\n平衡这种东西,维持得住是艺术,维持不住,就是两头都欠。" } ]}, /* ═══════ 军方线 · 政变之夜(摊牌抉择)═══════ */ "政变之夜": { prompt:"军营里传来马靴声,铁灰色的队列在月光下列队。今夜,不是你说话,就是他们动手。总参谋部的密使递来最后通牒:要么交出内阁,要么交出这个国家。", options:[ { label:"强硬镇压,调国防军平叛", axis:"SM", fx:{army:-4,army_influence:4,political_violence:6,gov_trust:3}, cost:"用枪对枪,共和国第一次把枪口对准自己人", shift:{lr:8,rc:8,authoritarian:8}, line_resolve:"清理", chain:{flag:"mil_coup_crushed"}, msg:"你调来效忠的部队,把叛军钉在军营外。天亮时,枪声停了,街上的血被水冲进下水道——共和国用同一把枪,既守住了自己,也第一次亲手染了血。\n\n政变被清算了。可你心里清楚:今晚的忠诚与今晚的背叛,只隔着一次未遂的功亏一篑。" }, { label:"谈判收编,给军方台阶", axis:"OP", fx:{army:4,army_influence:4,gov_trust:-2,political_violence:2}, cost:"买来几个月的安静,也买来一次默认的纵容", shift:{lr:-1,rc:2,authoritarian:1}, line_resolve:"蛰伏", chain:{flag:"mil_coup_dormant"}, msg:"你深夜召见军方代表,许以军费与「秩序优先」的口头承诺。叛军的名单在灯下被一页页合上。政变撤了,可那页名单被他们自己收进了贴身的口袋。" }, { label:"拉一派压一派,以夷制夷", axis:"OP", fx:{army:1,army_influence:5,political_violence:5,gov_trust:-4}, cost:"分化军内派系,以夷制夷", shift:{lr:3,rc:4,authoritarian:4}, line_resolve:"裂痕", chain:{flag:"mil_republic_cracked"}, msg:"你在军内挑出两派,暗许一派去制衡另一派。政变的枪口被暂时调转,可裂痕从军营裂到了整个国家。你用一派制住了另一派,也亲手把共和国垫进了军队的内斗之下。" } ]}, /* ═══════ 小案变大案 · 巷战 ═══════ */ "巷战": { prompt:"警察局急报:柏林两条街的冲突已升级为巷战,双方在街垒两侧对峙,使用砖块、旗杆与自制火把。警察力量不足,局里请求调派正规军或授权谈判。此事已不是治安问题,而是一道横在共和国街心的伤。", options:[ { label:"调正规军,戒严清剿", axis:"SM", fx:{army:3,army_influence:3,political_violence:4,social_anger:4}, cost:"调正规军,戒严清剿", shift:{lr:4,rc:4,authoritarian:4}, chain:{flag:"esc_renchang_lie_down"}, msg:"你调来正规军戒严。枪响后,街垒被拆,人被押走,街头静得反常。共和国用军队对平民开了枪,这桩「赢了」的战事,会以某种方式在账本的另一页等回来。" }, { label:"斡旋停火,划出界线", axis:"GM", fx:{ddp:2,gov_trust:2,political_violence:-2,social_anger:-1}, cost:"斡旋停火,划出界线", shift:{lr:-2}, msg:"你派出中间人去斡旋,划清两边的界线。火最终按你的口气熄了,可界线一旦存在,就总有被一脚跨过去的一天。" }, { label:"只派警察拉人墙,不足不越", axis:"OP", fx:{gov_trust:1,social_anger:2}, cost:"只派警察拉人墙,不调军队", shift:{lr:1,rc:1}, msg:"你只让警察顶上去拉人墙,不调军队。火没烧到不可收拾,可警察举着盾的背影,被两边都记成了「你偏袒另一头」。" } ]}, /* ═══════ 白色事件(日常·低数值·多维) ═══════ */ "歌剧院新季揭幕": { tier:"white", prompt:"国家歌剧院呈报:新季首演在即,票房惨淡。院方请示政府是否补贴票价,并提到——若柏林不办,维也纳方面已表示愿接手首演。文化处附注:此事已引起几家大报关注。", options:[ { label:"拨款补贴,放低票价", axis:"GM", fx:{spd:2,gov_trust:1,economy:-1}, cost:"由国库补贴,压低票价", shift:{lr:-1}, msg:"你批下补贴,命歌剧院压低票价。首演那晚,场子暖了一半。维也纳方面没有再提接手的事。文化处在报告末页写道:「柏林保住了首演。」" }, { label:"维持原价,艺术不迁就", axis:"AP", fx:{dvp:1,ddp:-1}, cost:"维持原价,不补贴", msg:"你回绝补贴,票价留在原地。歌剧院灯还亮着,厅里空得能听见回声。维也纳方面随后宣布接手首演。文化处的报告里多了一句:「首演已转维也纳。」" }, { label:"让赞助人出资包场", axis:"OP", fx:{dvp:2}, cost:"由赞助人出资包场", msg:"你让几位赞助人包下几场,名义上是「献给柏林」。首演热闹了,账也有主了。文化处提醒你:赞助人名单里,有两位与反对党关系密切。" } ]}, "包豪斯教授解聘争议": { tier:"white", prompt:"教育部呈报:一所国立艺术学院的校方拟解聘一位激进派建筑教授,理由为「教学有争议」。教师联名上书,艺术界意见分裂。图林根邦政府已表示关注,认为中央不应干预邦内学府事务。", options:[ { label:"支持留任", axis:"GM", fx:{ddp:2,idealism:1}, cost:"支持教授留任,表明中央立场", shift:{lr:-2}, msg:"你让教育部表态支持留任。教授未被解聘,校方收回成命。图林根邦政府没有正面回应,但邦教育部的公文从此回得慢了半拍。" }, { label:"照办,默许解聘", axis:"RE", fx:{dnvp:1}, cost:"默许校方处置,不介入", shift:{lr:1,rc:2}, msg:"你默许校方处置。多数人点了头,教授抱着图纸离开。艺术学院走廊恢复安静。教育部报告末页写道:「此事已了,图林根未再提异议。」" }, { label:"设委员会仲裁", axis:"GM", fx:{zentrum:1,ddp:1}, cost:"设委员会仲裁,暂不表态", msg:"你把案子交给委员会。开会、取证、再开会。事情悬在半空。图林根邦政府趁这段时间公开表示「尊重学院自治」,先把立场占了。" } ]}, "铁路货运调度积压": { tier:"white", prompt:"交通部呈报:货运站积压煤与粮数车,调度室称车皮被军方征用,周转不畅。军方则称调动属东部边境防务需要,不便让出车皮。两部互不相让,积压已影响部分工厂与市政供应。", options:[ { label:"加夜班调运", axis:"OP", fx:{economy:-2,fatigue:1}, cost:"令军方让出部分车皮,优先民用", msg:"你命军方让出部分车皮,优先运送煤粮。积压开始松动,站台上的灯亮了一宿。国防部没有正式抗议,但在次日简报里把「东部防务延迟」记了一笔。" }, { label:"暂缓,等旺季过去", axis:"AP", fx:{economy:1}, cost:"维持军方优先,民用暂缓", msg:"你维持军方优先。煤在原处,粮在原处,等着它们的人和工厂也在原处。交通部报告末页写着:「民用积压待军方调度完成后处理。」" }, { label:"抽检车队查低效", axis:"OP", fx:{insider:1,army:1}, cost:"抽检车队,查低效环节", msg:"你派人抽查车队,揪出几趟虚报的空车。账面上紧了紧,可那些真被耽搁的货,依旧在风里压着。军方与交通部都没有再递新报告。" } ]}, "小国外长约见": { tier:"white", prompt:"外交部呈报:波罗的海某国外长途经柏林,请求拜会总理,时间约十分钟。该国外长近期在里加与莫斯科均有活动。礼宾司请示是否接见。", options:[ { label:"接见", axis:"OP", fx:{intl_trust:1,gov_trust:1,fatigue:1}, cost:"亲自接见", msg:"你抽出十分钟见了他。他说的话不多,握手很有力。外交部事后在备忘中写道:「对方提及莫斯科近期的调动,未提具体要求。」" }, { label:"派副手代见", axis:"OP", fx:{fatigue:-1}, cost:"派副手代见", msg:"你让副手代见。礼数周全,只是那十分钟里递出去的暖意,隔了一只手。外交部备忘里多了一句:「对方表示理解,未再约见。」" }, { label:"婉拒,另约后日", axis:"AP", fx:{intl_trust:-1}, cost:"婉拒,另约后日", msg:"你婉拒今日,另约后天。他没说什么。外交部收到的回电里,只有一句「柏林很忙」。此后该国外长再未提出拜会。" } ]}, "军营卫生巡查报告": { tier:"white", prompt:"军医处呈报:巡查发现个别兵营厕所失修,痢疾有抬头迹象。军医处请求批拨修缮经费。国防部附注:此事不宜外传,以免影响士气。", options:[ { label:"批拨修缮", axis:"SM", fx:{army:1,gov_trust:1}, cost:"批拨修缮经费", msg:"你批了修缮。军医处松口气,士兵们的日子好过一点。国防部在简报里只写了四个字:「卫生已办。」" }, { label:"记下,稍后处理", axis:"OP", fx:{fatigue:1}, cost:"记下,稍后处理", msg:"你说记下稍后办。卷宗上添了一行批示,终归没变成砖和水泥。痢疾这种东西,不识字,只看你批得快不快。" }, { label:"责成军方自查", axis:"OP", fx:{army:-1}, cost:"责成军方自查", msg:"你让军方自己查。报告转了一圈又回到原处,军医处的附页上多了几行无可奈何的注。" } ]}, "某邦请求中央批准河流疏浚": { tier:"white", prompt:"内政部呈报:某邦请求中央批准一项河流疏浚工程,但不愿让中央工程师参与勘测,称「邦内事务邦内办」。部里请示是否派员介入。", options:[ { label:"派员介入", axis:"GM", fx:{spd:1,gov_trust:1}, cost:"派中央工程师参与勘测", msg:"你命内政部派工程师参与勘测。工程如期推进,邦政府没有公开反对,但在下一次邦长会议上,该邦代表发言明显减少。" }, { label:"交由邦政府自办", axis:"OP", fx:{fatigue:-1}, cost:"交由邦政府自办,中央不介入", msg:"你让邦政府自办。工程照常推进,邦政府在内政部报告上盖了章,附注一行:「中央未派员,邦内自行解决。」" }, { label:"暂缓批复", axis:"AP", fx:{economy:-1}, cost:"暂缓批复,等邦政府再递申请", msg:"你把申请放一放。邦政府没有再催,工程也没有开工。内政部报告末页写着:「该案暂缓,邦方未再递件。」" } ]}, "副刊作家逆评": { tier:"white", prompt:"宣传部呈报:一位知名作家在副刊撰文,点名批评某位部长的财政政策,措辞刻薄。几家报纸转载,部里请示是否「处理」。被点名的那位部长已私下表达不满。", options:[ { label:"不作回应,由他写", axis:"GM", fx:{ddp:2,gov_trust:-1}, cost:"不作回应,由他写", shift:{lr:-1,rc:-1}, msg:"你压下了「处理」两个字。文章照常见报,骂归骂,可骂人的人没有被捂住。被点名的部长在次日会议上没有提这件事,但椅子挪得离你远了半寸。" }, { label:"约谈规劝", axis:"OP", fx:{insider:1,fatigue:1}, cost:"约谈规劝", msg:"你让宣传部约他喝了杯茶,旁敲侧击。他文章里收敛了些,可那句没写出来的话,比写出来的更响。被点名的部长没有再追问。" }, { label:"让笔杆子回敬", axis:"RE", fx:{dnvp:1,social_anger:1}, cost:"让笔杆子回敬", shift:{lr:1,rc:2}, msg:"你让政府的笔杆子回敬一篇。两边在副刊上打得有来有回,读者看得热闹。宣传部提醒你:被点名的部长已经把这笔账记在了自己名下。" } ]}, "农业协会请求降低农业税": { tier:"white", prompt:"农业部呈报:某邦农业协会递交请愿书,请求降低农业税。协会同时邀请总理出席该邦丰收节,称「若总理亲临,请愿可当面递交」。部里请示是否出席。", options:[ { label:"出席并当面接请愿", axis:"OP", fx:{gov_trust:1,nationalism:-1,fatigue:1}, cost:"出席丰收节,当面接请愿", msg:"你去了,接了请愿书,在丰收节上讲了话。农业部随后收到该协会正式函件,要求将减税列入下季度议程。" }, { label:"派副手代接", axis:"OP", fx:{fatigue:-1}, cost:"派副手代接请愿", msg:"你让副手代接。请愿书按程序转交农业部,协会没有再提当面递交的事。农业部报告里多了一句:「该协会未再要求面见。」" }, { label:"批示祝贺,不出席", axis:"OP", fx:{gov_trust:1}, cost:"批示祝贺,不出席", msg:"你批了道贺电。请愿书由协会直接寄到农业部,未再附邀请。农业部报告末页写着:「贺电已发,请愿另行处理。」" } ]}, "电台直播音乐会": { tier:"white", prompt:"国家电台呈报:拟直播一场交响音乐会,向公众播送。节目单中含一首被右翼报刊称为「堕落音乐」的现代作品。宣传部请示是否照播,或要求更换曲目。", options:[ { label:"拨款直播", axis:"GM", fx:{idealism:1,spd:1}, cost:"照原单直播,不作删改", msg:"你让电台照原单直播。买不起票的人在炉子边听完了整场,包括那首「堕落音乐」。次日右翼报刊发文抨击,宣传部把剪报放在了你桌上。" }, { label:"拉赞助,不花国库", axis:"OP", fx:{dvp:1}, cost:"由赞助人出资,照原单直播", msg:"你让几位实业家凑了一笔赞助,电台照原单直播,国库分文未出。买不起票的人在炉子边听完了整场,包括那首「堕落音乐」。宣传部把两份剪报并排放在你桌上:一份骂那首曲子,一份夸那笔赞助。" }, { label:"暂缓", axis:"AP", fx:{fatigue:-1}, cost:"暂缓直播", msg:"你说先缓一缓。音乐会没播成,多少人家的夜晚又还给了沉默。宣传部在报告末页写道:「直播取消,各方均未再提。」" } ]}, "汉堡与不来梅港口管辖权争议": { tier:"white", prompt:"交通部呈报:汉堡与不来梅两港就易北河下游疏浚费用分摊发生争执,双方均拒绝承担更多份额,并各自向中央递交陈情书。部里请示是否由中央裁决。", options:[ { label:"中央裁决分摊比例", axis:"OP", fx:{dvp:1,economy:1}, cost:"中央裁决,定分摊比例", msg:"你命交通部定出分摊比例。两港均表示接受,但汉堡在裁决后递交了一份附函,要求「下次类似争议由两港自行协商」。" }, { label:"交由两港自行协商", axis:"AP", fx:{economy:-1}, cost:"交由两港自行协商", msg:"你让两港自己谈。谈判持续数周,最终达成一份临时协议,双方均未向中央再递陈情。交通部报告写道:「两港已自行解决。」" }, { label:"暂不裁决", axis:"GM", fx:{ddp:1}, cost:"暂不裁决,等双方再递材料", msg:"你把两份陈情书都压着。疏浚工程没有动工,两港继续各自清淤。交通部报告末页写着:「该案待决。」" } ]}, "德语拼写之争": { tier:"white", prompt:"教育部呈报:学界就德语拼写改革争执不下,双方均已递交意见书。普鲁士邦教育部表示,若中央强行推行改革,邦内学校将不予执行。部里请示是否表态。", options:[ { label:"维持旧拼写", axis:"RE", fx:{dnvp:1}, cost:"维持旧拼写,不改革", shift:{lr:1,rc:2}, msg:"你让旧拼写维持下去。普鲁士邦教育部表示满意。改革派在报上发文批评,但未能推动任何实质改变。" }, { label:"支持改革", axis:"GM", fx:{ddp:1,idealism:1}, cost:"支持改革,推行新拼写", shift:{lr:-2}, msg:"你点头支持改革。普鲁士邦教育部随即表示「邦内学校暂不执行」,并称此举「尊重各邦文化自主」。改革派与保守派在报上对骂,教育部夹在中间。" }, { label:"设委员会研究", axis:"GM", fx:{zentrum:1}, cost:"设委员会研究,暂不表态", msg:"你把它交给委员会。开会、表决、再开会。拼写还原样躺着。普鲁士邦教育部趁这段时间把「邦自主」的立场又写进了一份新备忘录。" } ]}, "国家图书馆请求转移手稿": { tier:"white", prompt:"文化部呈报:国家图书馆请求将一批珍贵手稿从某邦转移至柏林保存,该邦表示反对,称手稿属邦内文化遗产,不应外移。部里请示是否由中央裁定。", options:[ { label:"中央裁定转移", axis:"GM", fx:{zentrum:1,spd:1,economy:1}, cost:"中央裁定,转移至柏林", msg:"你命文化部裁定转移。手稿运抵柏林,该邦在邦议会上提出抗议,称「中央无视邦权」。文化部报告里多了一句:「该邦后续借阅申请暂未回复。」" }, { label:"维持原址,中央不介入", axis:"OP", fx:{gov_trust:1,spd:-1}, cost:"维持原址,中央不介入", msg:"你让手稿留在原邦。国家图书馆撤回了申请,该邦没有再提此事。文化部报告末页写着:「手稿仍存原址。」" }, { label:"暂缓裁定", axis:"AP", fx:{fatigue:-1,gov_trust:-1}, cost:"暂缓裁定,等双方再递意见", msg:"你把两边的申请都压着。手稿还在原处,国家图书馆的调阅申请也还悬着。文化部报告里多了一句:「该案待决。」" } ]}, "邮政部与某邦邮政管辖争议": { tier:"white", prompt:"邮政部呈报:某邦邮政以纸张涨价为由自行调整邮票面值,未报中央批准。邮政部认为此举违反全国统一邮资规定,该邦则称「邦内邮政邦内管」。部里请示是否纠正。", options:[ { label:"责令邦邮政收回调价", axis:"OP", fx:{gov_trust:1,spd:-1}, cost:"责令邦邮政收回调价", msg:"你命邮政部责令该邦收回调价。邦邮政照办,但在回函中附了一句:「今后邦内邮政事务,请中央先与邦政府协商。」" }, { label:"默许邦邮政自行调整", axis:"OP", fx:{economy:1,dvp:-1}, cost:"默许邦邮政自行调整", msg:"你不纠正。该邦邮政维持新面值,其他邦未跟进。邮政部报告里多了一句:「全国统一邮资出现缺口。」" }, { label:"暂不表态", axis:"AP", fx:{ddp:1,fatigue:1}, cost:"暂不表态,观察其他邦反应", msg:"你不表态。该邦邮政照常执行新面值,其他邦均未跟进。邮政部报告末页写着:「该案暂悬,邮资标准不一。」" } ]}, "某邦拟将前皇室园林改为建筑用地": { tier:"white", prompt:"内政部呈报:某邦拟将一处前皇室园林改为建筑用地,当地文物保护团体与居民联名反对,请求中央介入。邦政府称该地块属邦内事务。部里请示是否干预。", options:[ { label:"中央出面干预", axis:"GM", fx:{gov_trust:1,spd:1,economy:1}, cost:"中央出面,要求暂缓改建", msg:"你命内政部要求该邦暂缓改建。邦政府照办,但在一份内部备忘中写道:「中央干预邦内土地事务,开了先例。」" }, { label:"交由邦政府自行决定", axis:"OP", fx:{gov_trust:1,spd:-1}, cost:"交由邦政府自行决定", msg:"你让邦政府自行决定。改建计划继续推进,文物保护团体向中央递交了第二封请愿书,未获回应。" }, { label:"暂不介入", axis:"OP", fx:{fatigue:-1,gov_trust:-1}, cost:"暂不介入,观察事态", msg:"你不介入。改建与抗议同时进行,内政部报告末页写着:「该案未决,邦方未再请示中央。」" } ]}, "柏林电车公司与工会夜班津贴争议": { tier:"white", prompt:"劳工部呈报:柏林电车公司与工会就夜班津贴发生争议,资方拒绝增加津贴,工会威胁自下周起夜班停运。公司请求政府调停。部里请示是否介入。", options:[ { label:"由劳工部出面调停", axis:"OP", fx:{gov_trust:1,spd:-1}, cost:"由劳工部出面调停", msg:"你命劳工部调停。双方各让一步,夜班津贴小幅上调。工会取消了停运威胁,资方在会后递交了一份关于「调停程序」的质询函。" }, { label:"暂不介入", axis:"AP", fx:{spd:1,ddp:1,economy:1}, cost:"暂不介入,等双方自行协商", msg:"你不介入。双方谈判未果,夜班停运如期开始。劳工部报告里多了一句:「该公司未再请求调停。」" }, { label:"交由柏林市政处理", axis:"AP", fx:{fatigue:-1,gov_trust:-1}, cost:"交由柏林市政处理", msg:"你把案子转给柏林市政。市政调停后达成临时协议,夜班停运取消。劳工部报告末页写着:「该案已转市政,中央未再介入。」" } ]}, "莱茵河某段堤坝年久失修": { tier:"white", prompt:"水利局呈报:莱茵河某段堤坝年久失修,某邦请求中央拨款修缮,但不愿让中央派员监督工程。部里请示是否拨款并派员。", options:[ { label:"拨款并派员监督", axis:"GM", fx:{gov_trust:1,spd:1,economy:1}, cost:"拨款并派员监督", msg:"你批了款,并派员监督。工程如期推进,该邦在收到拨款后未再提出异议,但在邦议会上有人提出「中央监督侵犯邦权」。" }, { label:"拨款但不派员", axis:"OP", fx:{fatigue:-1,gov_trust:-1}, cost:"拨款但不派员监督", msg:"你批了款,不派员。该邦自行组织修缮,水利局报告里多了一句:「工程进度由邦方自报,中央未核实。」" }, { label:"暂缓拨款", axis:"AP", fx:{economy:1,gov_trust:-1}, cost:"暂缓拨款,等邦方再递材料", msg:"你把申请压着。堤坝没有动工,该邦没有再递材料。水利局报告末页写着:「该案待决。」" } ]}, "工人夜校筹办": { tier:"white", prompt:"工会联合会呈报:拟办工人夜校,教授识字与算账,请求政府承认其学历,并拨给部分经费。教育部表示夜校学历不宜由中央承认,建议由各邦自行处理。", options:[ { label:"资助办学", axis:"GM", fx:{spd:1,idealism:1,economy:1}, cost:"承认夜校学历,拨给经费", msg:"你命教育部承认夜校学历,并拨给一笔经费。工会在几个区同时开课,下工后有人坐下来识字。教育部提醒你:已有两个邦表示「暂不适用」。" }, { label:"只提供校舍", axis:"GM", fx:{zentrum:1,spd:-1}, cost:"只拨经费,不承认学历", msg:"你只给钱,不给名分。夜校办起来了,可学员拿到的那张纸,在求职时派不上用场。工会代表在下次会面时提了一句:「钱管用,纸也管用。」" }, { label:"不掺和", axis:"AP", fx:{fatigue:-1,spd:-1}, cost:"交由各邦自行处理", msg:"你把它推给各邦。有几个邦批了,有几个邦没批。工会拿着不同的答复回到工人区,工人收到的信号也不一样。" } ]}, "各邦流动商贩执照规定不一": { tier:"white", prompt:"贸易部呈报:各邦对流动商贩执照规定不一,商贩跨邦经营时常受阻。有商贩联名请愿,要求中央统一规定。部里请示是否介入。", options:[ { label:"制定统一执照规定", axis:"GM", fx:{gov_trust:1,spd:1,economy:1}, cost:"制定全国统一执照规定", msg:"你命贸易部制定统一规定。多数邦表示接受,两个邦表示「需邦议会审议」。商贩请愿团撤回请愿,贸易部报告里多了一句:「统一规定待各邦反馈。」" }, { label:"交由各邦自行协商", axis:"GM", fx:{ddp:1,spd:-1}, cost:"交由各邦自行协商", msg:"你让各邦自己谈。协商持续数月,未达成一致。商贩请愿团再次递交请愿书,贸易部报告里多了一句:「各邦协商未果。」" }, { label:"暂不介入", axis:"AP", fx:{fatigue:-1,gov_trust:-1}, cost:"暂不介入", msg:"你不介入。商贩继续在各邦之间碰壁,贸易部报告末页写着:「该案未决。」" } ]}, "气象台拟在东部边境增设观测站": { tier:"white", prompt:"气象台呈报:拟在东部边境增设观测站,军方认为该站涉及防务数据,要求参与管理。气象台则认为观测数据应归民用。部里请示是否由中央裁定。", options:[ { label:"裁定归气象台管理", axis:"GM", fx:{idealism:1,gov_trust:1,economy:1}, cost:"裁定归气象台管理", msg:"你裁定观测站归气象台管理。军方未公开反对,但在下一次军方简报里,该站数据被列为「另需核实」。" }, { label:"裁定军方参与管理", axis:"OP", fx:{economy:-1,gov_trust:-1}, cost:"裁定军方参与管理", msg:"你裁定军方参与管理。气象台表示接受,但在内部备忘中写道:「观测数据独立性受损。」" }, { label:"暂缓设立", axis:"AP", fx:{fatigue:-1,ddp:-1}, cost:"暂缓设立", msg:"你说先缓一缓。观测站没有设立,军方与气象台均未再提。报告末页写着:「该案暂悬。」" } ]}, "柏林消防队与某邦消防队跨区支援争议": { tier:"white", prompt:"内政部呈报:柏林消防队与某邦消防队就跨区支援费用发生争执,双方均拒绝承担更多份额。部里请示是否由中央协调。", options:[ { label:"中央协调分摊比例", axis:"GM", fx:{gov_trust:1,spd:1,economy:1}, cost:"中央协调,定分摊比例", msg:"你命内政部定出分摊比例。双方均表示接受,但柏林消防队在回函中附了一句:「今后跨区支援,请先与柏林市政协商。」" }, { label:"交由双方自行协商", axis:"OP", fx:{economy:-1,spd:-1}, cost:"交由双方自行协商", msg:"你让双方自己谈。谈判达成临时协议,支援照常进行。内政部报告里多了一句:「双方已自行解决。」" }, { label:"暂不协调", axis:"AP", fx:{fatigue:-1,gov_trust:-1}, cost:"暂不协调", msg:"你不协调。跨区支援照旧进行,费用争议未决。内政部报告末页写着:「该案待决。」" } ]}, "某邦养老院协会请求中央增加冬季燃料补贴": { tier:"white", prompt:"内政部呈报:某邦养老院协会请求中央增加冬季燃料补贴,该邦政府表示不愿承担配套资金。协会称若中央不拨款,部分养老院将无法过冬。部里请示是否拨款。", options:[ { label:"中央拨款", axis:"GM", fx:{zentrum:1,gov_trust:1,economy:1}, cost:"中央拨款,不要求邦配套", msg:"你批了款。养老院收到补贴,炉子烧起来。该邦政府在收到拨款后未再提配套资金的事,内政部报告里多了一句:「邦方未作回应。」" }, { label:"要求邦政府先承担配套", axis:"OP", fx:{gov_trust:1,spd:-1}, cost:"要求邦政府先承担配套资金", msg:"你要求该邦先承担配套。邦政府拒绝,协会再次递交请愿书。内政部报告里多了一句:「邦方与协会均未再递件。」" }, { label:"交由邦政府自行处理", axis:"AP", fx:{fatigue:-1,zentrum:-1}, cost:"交由邦政府自行处理", msg:"你把它推给邦政府。邦政府没有拨款,协会自行筹款。内政部报告末页写着:「该案已转邦方,中央未再介入。」" } ]}, "某邦拟将历史公园改为建筑用地": { tier:"white", prompt:"文化部呈报:某邦拟将一处历史公园改为建筑用地,当地居民与文物保护团体联名反对,请求中央介入。邦政府称该地块属邦内事务。部里请示是否干预。", options:[ { label:"中央出面干预", axis:"GM", fx:{gov_trust:1,spd:1,economy:1}, cost:"中央出面,要求暂缓改建", msg:"你命文化部要求该邦暂缓改建。邦政府照办,但在一份内部备忘中写道:「中央干预邦内土地事务,开了先例。」" }, { label:"交由邦政府自行决定", axis:"OP", fx:{economy:-1,gov_trust:-1}, cost:"交由邦政府自行决定", msg:"你让邦政府自行决定。改建计划继续推进,文物保护团体向中央递交了第二封请愿书,未获回应。" }, { label:"暂不介入", axis:"OP", fx:{fatigue:-1,gov_trust:-1}, cost:"暂不介入,观察事态", msg:"你不介入。改建与抗议同时进行,文化部报告末页写着:「该案未决,邦方未再请示中央。」" } ]}, "儿童接种登记": { tier:"white", prompt:"卫生部呈报:拟对全国学龄儿童进行集中接种登记,预防时疫。巴伐利亚邦卫生部表示经费不足,且认为接种事宜应由各邦自行决定。部里请示是否由中央统一推行。", options:[ { label:"支持登记", axis:"GM", fx:{gov_trust:1,spd:1,fatigue:1}, cost:"由中央统一推行接种登记", msg:"你命卫生部统一推行。大部分邦配合,巴伐利亚邦勉强照办但未拨足经费。卫生部报告末页写道:「登记已启动,巴伐利亚执行进度滞后。」" }, { label:"低调试行", axis:"GM", fx:{ddp:1,spd:-1}, cost:"由各邦自行决定", msg:"你让各邦自行决定。几个邦即刻推行,巴伐利亚与另两个邦暂缓。卫生部的全国统计表上,出现了几片空白。" }, { label:"暂缓", axis:"AP", fx:{fatigue:-1,gov_trust:-1}, cost:"暂缓推行", msg:"你放一放。名单没记,针没打。卫生部在报告末页只写了一行:「本季接种登记未启动。」" } ]}, "前帝国档案归属争议": { tier:"white", prompt:"国家档案馆呈报:一批前帝国时期档案在各邦之间归属不清,某邦拒绝移交,称档案涉及邦内历史。部里请示是否由中央裁定。", options:[ { label:"中央裁定移交", axis:"GM", fx:{ddp:1,gov_trust:1,fatigue:1}, cost:"中央裁定,移交国家档案馆", msg:"你命国家档案馆裁定移交。档案运抵柏林,该邦在邦议会上提出抗议,称「中央无视邦内历史」。国家档案馆报告里多了一句:「该邦后续借阅申请暂未回复。」" }, { label:"维持原址,中央不介入", axis:"OP", fx:{fatigue:-1,ddp:-1}, cost:"维持原址,中央不介入", msg:"你让档案留在原邦。国家档案馆撤回了申请,该邦没有再提此事。国家档案馆报告末页写着:「档案仍存原址。」" }, { label:"暂缓裁定", axis:"AP", fx:{fatigue:-1,gov_trust:-1}, cost:"暂缓裁定,等双方再递意见", msg:"你把两边的申请都压着。档案还在原处,国家档案馆的调阅申请也还悬着。报告里多了一句:「该案待决。」" } ]}, "各邦小酒馆营业时间规定不一": { tier:"white", prompt:"经济部呈报:各邦对小酒馆营业时间规定不一,导致边境地区出现跨邦饮酒现象,警方称难以执法。部里请示是否统一规定。", options:[ { label:"制定统一营业时间", axis:"GM", fx:{zentrum:1,gov_trust:1,ddp:-1}, cost:"制定全国统一营业时间", msg:"你命经济部制定统一规定。多数邦表示接受,两个邦表示「需邦议会审议」。警方报告里多了一句:「统一规定待各邦反馈。」" }, { label:"交由各邦自行协商", axis:"GM", fx:{ddp:1,fatigue:1}, cost:"交由各邦自行协商", msg:"你让各邦自己谈。协商持续数月,未达成一致。警方再次递交报告,经济部报告里多了一句:「各邦协商未果。」" }, { label:"暂不介入", axis:"AP", fx:{fatigue:-1,gov_trust:-1}, cost:"暂不介入", msg:"你不介入。跨邦饮酒现象继续,警方继续执法困难。经济部报告末页写着:「该案未决。」" } ]}, "某邦博物馆请求将私人收藏划归国有": { tier:"white", prompt:"文化部呈报:某邦博物馆请求将一批私人收藏的文物划归国有,收藏者要求补偿。邦政府表示不愿承担补偿费用,请求中央拨款。部里请示是否介入。", options:[ { label:"中央拨款补偿", axis:"GM", fx:{idealism:1,economy:-1}, cost:"中央拨款,补偿收藏者", msg:"你批了款。文物划归国有,收藏者收到补偿。邦政府未再提此事,文化部报告里多了一句:「该邦后续类似申请暂未递件。」" }, { label:"要求邦政府承担补偿", axis:"AP", fx:{fatigue:-1}, cost:"要求邦政府承担补偿费用", msg:"你要求该邦承担补偿。邦政府拒绝,博物馆撤回申请。文化部报告里多了一句:「邦方与博物馆均未再递件。」" }, { label:"交由邦政府自行处理", axis:"GM", fx:{ddp:1}, cost:"交由邦政府自行处理", msg:"你把它推给邦政府。邦政府没有拨款,博物馆自行筹款。文化部报告末页写着:「该案已转邦方,中央未再介入。」" } ]}, /* ═══════ 暗账引爆事件(undercurrent) ═══════ 由 27_undercurrent_system 的 undercurrent-day 引爆(deck_id Auc1-3)。 不进跳天黄池(skip_yellow_tier 未收录即不进池),只走暗账积攒满线一条路。 */ "执政联盟停摆": { tier:"undercurrent", prompt:"总理府内参:连续七周,联盟议事会一揽子法案无一通过。SPD 与 DVP 的谈判代表已经不再掩饰对彼此的厌恶,中立的议程接连被程序性发言拖死。无党派背景的公务员联合会递来一封措辞罕见的信:请政府「至少让薪水照发」。", options:[ { label:"亲自坐镇议事会,一单一单磨", axis:"GM", fx:{gov_trust:2,spd:2,dvp:-1,fatigue:4}, cost:"亲自主持联盟议事,逐案斡旋", msg:"你把议事会搬进了总理府的会议室。第一周磨出两项不痛不痒的法案,第三周,双方代表第一次在同一份文件上签了字。没人庆祝——体面的僵局解了,往后还有的是。内参写道:「议事恢复,积案在清。」" }, { label:"放话威胁提前大选,逼各党回头", axis:"SM", fx:{spd:-2,dvp:-2,ddp:2,gov_trust:3,social_anger:2}, cost:"以解散国会为筹码逼联盟就范", msg:"你让新闻稿漏出一句话:政府不排除请国民重新表态。当晚,三个党的总务委员都打来电话。法案通过了四项,比过去七周加起来还多。内参写道:「以解散相胁有效。下次再用,效果存疑。」" }, { label:"随他们去,用第48条签紧急法令", axis:"SM", fx:{ddp:-4,spd:-3,gov_trust:2}, cost:"绕开议会,以紧急法令续政", shift:{authoritarian:2}, msg:"你不劝了。法令一份接一份从总理府发出,国家照常运转——只是不再经过国会。宪法之友协会的抗议信堆了一托盘。内参写道:「行政畅通。议会的椅子,正在变成摆设。」" } ]}, "两翼上街": { tier:"undercurrent", prompt:"警察总局急报:同一天,KPD 前线联盟在亚历山大广场集结集会,DNVP 外围团体在夏洛滕堡游行。两支队伍的路线只隔一条街,双方都在朝对方的方向喊口号。警力已按最坏情况部署,局长请求指示:隔离、驱散,还是任其对峙。", options:[ { label:"重兵隔离,让两支队伍都走完", axis:"GM", fx:{political_violence:-2,gov_trust:1,fatigue:3,army:-1}, cost:"警力隔离两翼路线,护送各自走完", msg:"你调集了几乎全部机动警力,在两条街之间筑出一道空巷。喊了一下午口号,没人越过那道线。警察局报告写道:「隔离有效。双方各自散去,都觉得自己被羞辱了——这大概就是和平。」" }, { label:"一律驱散,谁闹抓谁", axis:"SM", fx:{political_violence:2,spd:-2,dnvp:1,gov_trust:-1,army:1}, cost:"两翼集会一律驱散", shift:{authoritarian:1}, msg:"水龙带和警棍同时对两条街用了。当晚收押名单上,两个党的名字一样多。第二天,两边的报纸用了同一个词:「暴政」。警察局报告写道:「行动达成目标。仇恨值均匀分布。」" }, { label:"暗中给两边的领队递话,让他们改道", axis:"OP", fx:{insider:3,political_violence:-1,gov_trust:-1}, cost:"情报渠道私下运作,引导双方改道", msg:"你让便衣把话分别递给了两个领队:对方要来砸你们的场子。傍晚,两支队伍改了道,各自在安全的距离上骂完了对方。没人知道是你的手笔。内参写道:「不费一枪一弹。只是这两笔人情,迟早要还。」" } ]}, "信贷骤停": { tier:"undercurrent", prompt:"央行周报:过去一个月,银行界对新贷款的审批实际上停了。表上没有一纸禁令,但每一个放款员都在引用「审慎原则」。三家靠滚动信贷活着的中型厂商已申请展期,商会的信写得直白:体面撑不了两个月。", options:[ { label:"央行出面担保关键厂商,定向输血", axis:"GM", fx:{economy:2,gov_trust:1,dvp:2,inflation:1}, cost:"央行定向担保,撑住关键厂商", msg:"央行开了一扇很窄的门:只担保设备还在转的厂。名单外的申请照旧被拒。三家厂缓了过来,银行的胆子没有跟着回来。周报写道:「定向输血有效。市场仍在等一个更响的信号。」" }, { label:"公开「信贷无忧」讲话,稳预期", axis:"OP", fx:{gov_trust:2,economy:1,inflation:2}, cost:"公开喊话稳预期,不动真金白银", msg:"你对着话筒讲了十分钟「流动性」「基本面」和「信心」。第二天,放款窗口开了一半。讲话救不了任何一家厂,但救了所有人等下一家厂倒闭的心情。周报写道:「预期改善。数字未变。」" }, { label:"顺势不管,让该死的信贷先死", axis:"AP", fx:{economy:3,social_anger:3,dvp:-3,gov_trust:-2}, cost:"不干预,任信贷市场自然出清", msg:"你把周报放回了文件堆的最底下。一个月内,七家厂商停产,两家银行接管了它们的抵押品。价格在跌,街上排队的人在涨。周报写道:「出清进行中。此轮没有官方责任。」" } ]} }>> <<set $world_custom_options_ready to true>> <</if>> <</silently>>\ <</widget>>
/* 记事本·长线收束:把对应追查线标为已生效,保存 reveal 文本供回看,并处理深挖 bonus */ <<silently>> <<set _ev_idx to $file_target_idx ?? 0>> <<set _ev to $pending_events[_ev_idx]>> <<set _nk to $last_ll_key>> <<set _nt to "一条追查中的线">> <<set _reveal_text to _ev.description>> <<for _ni to 0; _ni lt $notebook.length; _ni++>> <<if $notebook[_ni].key eq _nk>> <<set $notebook[_ni].status to "已生效·第二阶段">> <<set $notebook[_ni]._revealed to true>> <<set $notebook[_ni]._reveal_text to _reveal_text>> <<set $notebook[_ni]._done_day to $session_day>> <<set _nt to $notebook[_ni].title>> <<if _nk eq "officer_list" and $flags.officer_list_digged>> <<set $notebook[_ni]._reveal_text to _reveal_text + "【深挖追加】你记下的边境小城路线与请假记录对上了。有人在试路线,不是试一次,是试一条链。">> <<set $flags.officer_list_intel to true>> <</if>> <<if _nk eq "black_market_net" and $flags.black_market_digged>> <<set $notebook[_ni]._reveal_text to _reveal_text + "【深挖追加】纺织厂的「进口棉纱」与码头仓库的「工业原料」对不上账。你可以现在收网,也可以再跟一段。">> <<set $flags.black_market_fork to true>> <</if>> <</if>> <</for>> <<if _nk neq "">><<set $flags[_nk] to "active">><</if>> <<set $pending_events[_ev_idx].status to "resolved">> <</silently>>\ <div class="scene-block"> //这是你上一次的选择——《_nt》——如今迎来了新消息。// //_ev.description// </div> <<if _nk eq "black_market_net" and $flags.black_market_fork>>\ <div class="scene-block"> //你手里现在有两张牌:// <<link "收网,端掉纺织厂和仓库" "Longline_Bust_black_market">><</link>> <<link "继续放,跟到那扇门的背后" "Scene_Office">><<set $flags.black_market_fork to false>><</link>> </div>\ <<else>>\ <<link "回到办公室" "Scene_Office">><</link>> <</if>>
/* 记事本 · 深挖:统一入口。由 $dig_target_idx 定位,按线 key 分支给效果。 */ <<silently>> <<set _didx to Number($dig_target_idx) || 0>> <<set _ditem to $notebook[_didx] ? $notebook[_didx] : null>> <<set _dkey to _ditem ? _ditem.key : "">> <<set _dtitle to _ditem ? _ditem.title : "这条线">> <<tp-spend 1 2>> <<set _dgk to "dig_" + _dkey>> <<set $flags[_dgk] to (Number($flags[_dgk]) || 0) + 1>> <<set _dtext to "你往下查了一条线,暂时还没有起色。">> <<if _dkey eq "rev_infil">> <<for _sfi to 0; _sfi lt $site_followups.length; _sfi++>> <<if $site_followups[_sfi].title eq _dtitle>> <<set $site_followups[_sfi].due_day to $session_day + 1>> <</if>> <</for>> <<set $flags.rev_infil_digged to true>> <<set _dtext to "你给城东当铺的联络员传了话。当晚回讯:名单是活的,他们在攒枪,接头点不止一家。卧底请求再宽两日,他想摸到仓库。你多等了两天,也多花了一个人情。">> <<elseif _dkey eq "officer_list">> <<set $flags.officer_list_digged to true>> <<set _dtext to "你让内务处查了一遍军官俱乐部近三个月的请假记录。有几个人,在『私人旅行』的名义下去了同一个边境小城。名字和上次酒会上记下的,对上了。他们不是闲聊。他们在试路线。">> <<elseif _dkey eq "black_market_net">> <<set $flags.black_market_digged to true>> <<set _dtext to "你让人跟了那几家铺子的货。三批货,两批进了城南的纺织厂,一批进了码头仓库。纺织厂的账面上写的是『进口棉纱』,报关单上却是『工业原料』。那条你不愿惊动的门,又推开了一条缝。">> <</if>> <</silently>>\ <div class="scene-block"> //你往下挖了《_dtitle》。// //_dtext// </div> <span class="dash-hint">你消耗了 1 行动点。</span> <<link "回到办公室" "Scene_Office">><</link>>
/* 记事本 · 放弃追查:把目标线标为已失效 */ <<silently>> <<set _ab_idx to Number($abandon_target_idx) || 0>> <<set _ab_title to "这条线">> <<if $notebook[_ab_idx]>> <<set $notebook[_ab_idx].status to "已失效">> <<set $notebook[_ab_idx]._dead_day to $session_day>> <<set _ab_title to $notebook[_ab_idx].title>> <</if>> <</silently>>\ <div class="scene-block"> //你把关于「_ab_title」的那页折了起来。// //不是每条线都值得追到底。有些本子合上,就再也不会打开了。// </div> <<link "回到办公室" "Scene_Office">><</link>>
/* 记事本 · 催线:花行动点把这条线的收线提前 hurry_days 天。 不改 reveal 内容,只把对应 site_followup 的 due_day 提前。 */ <<silently>> <<set _h_idx to Number($hurry_target_idx) || 0>> <<set _h_title to "这条线">> <<set _h_done to false>> <<if $notebook[_h_idx]>> <<set _h_title to $notebook[_h_idx].title>> <<set _h_due to ($notebook[_h_idx].due ? $notebook[_h_idx].due : 5)>> <<set _h_born to $notebook[_h_idx].born>> <<set _h_left to _h_due - ($session_day - _h_born)>> <<set _h_pull to Math.min($notebook_config.hurry_days, Math.max(0, _h_left - 1))>> <<if _h_pull gt 0>> <<tp-spend $notebook_config.hurry_cost_tp 2>> /* 同步推进记事本 due(显示倒计时)与 site_followups 里同名线的 due_day(真实收线日) */ <<set $notebook[_h_idx].due to _h_due - _h_pull>> <<for _hf to 0; _hf lt $site_followups.length; _hf++>> <<if $site_followups[_hf].title eq _h_title>> <<set $site_followups[_hf].due_day to Math.max($session_day + 1, $site_followups[_hf].due_day - _h_pull)>> <</if>> <</for>> <<set _h_done to true>> <<set _h_text to "你托人带话、压了一个期限。回讯比预期早了 _h_pull 天。有些线催得动,只要你肯把人情花在前头。">> <</if>> <</if>> <<if not _h_done>> <<set _h_text to "这条线已经贴着收线的日子了,再催也快不了。你收回了话。">> <</if>> <</silently>>\ <div class="scene-block"> //你催了催《_h_title》。// //_h_text// </div> <span class="dash-hint">你消耗了 $notebook_config.hurry_cost_tp 行动点。</span> <<link "回到办公室" "Scene_Office">><</link>>
/* 记事本 · 回看已生效线的完整收线记录 */ <<silently>> <<set _ri to Number($readback_idx) || 0>> <<set _ritem to $notebook[_ri] ? $notebook[_ri] : null>> <</silently>>\ <<if _ritem>>\ <div class="scene-block"> //《_ritem.title》// // //_ritem._reveal_text// <<if _ritem._done_day>>\ //于第 _ritem._done_day 天收线。//\ <</if>>\ </div>\ <<else>>\ //这个本子那页空了。//\ <</if>>\ <<link "合上本子" "Scene_Office">><</link>>
/* 黑市深挖后的收网终局:查封铺子,get把柄,线作废 */ <<silently>> <<set $flags.black_market_fork to false>> <<set $flags.black_market_busted to true>> <<for _bi to 0; _bi lt $notebook.length; _bi++>> <<if $notebook[_bi].key eq "black_market_net">> <<set $notebook[_bi].status to "已失效">> <<set $notebook[_bi]._dead_day to $session_day>> <<set $notebook[_bi]._dead_reason to "主动收网">> <</if>> <</for>> <</silently>>\ <div class="scene-block"> //你签了令。// //纺织厂和仓库同时被查封。抓了几个人,跑了几个人。账本被抬进总理府的时候,你翻到了那扇门的名字——一个你认识的议员。// //线断了。但你知道了门后是谁。// </div> <span class="dash-hint">黑市网络已摧毁。你获得了一条政治把柄(效果待后续系统接入)。</span> <<link "回到办公室" "Scene_Office">><</link>>
/* ---------- notebook-fail:把指定线标为已失效(主动反制打断长线的冲突检测) ---------- 用法:<<notebook-fail "key" "原因">> */ <<widget "notebook-fail">>\ <<silently>> <<set _nf_key to $args[0]>> <<set _nf_reason to $args[1] ? $args[1] : "主动切断">> <<for _nfi to 0; _nfi lt $notebook.length; _nfi++>> <<if $notebook[_nfi].key eq _nf_key and $notebook[_nfi].status eq "追查中">> <<set $notebook[_nfi].status to "已失效">> <<set $notebook[_nfi]._dead_day to $session_day>> <<set $notebook[_nfi]._dead_reason to _nf_reason>> <</if>> <</for>> <</silently>>\ <</widget>> /* ---------- notebook-render:办公室·长线记事本卡 ---------- 用法:<<notebook-render>>(在 Scene_Office 双列区调用) 渲染 $notebook:追查中(可深挖/放弃)、已生效(可回看)、已失效。 */ <<widget "notebook-render">>\ <<if (not $notebook or $notebook.length eq 0) and (not $site_followups or $site_followups.length eq 0)>>\ <div class="dash-card dash-sec notebook-card">\ <span class="dash-chip">长线记事本</span>\ <span class="dash-desc">本子里还白着。有些事,得先埋下去,才谈得上收线。</span>\ </div>\ <<else>>\ <<silently>> <<set _nb_active to []>><<set _nb_done to []>><<set _nb_dead to []>> <<for _ni to 0; _ni lt $notebook.length; _ni++>> <<set _n to $notebook[_ni]>> <<if _n.status eq "追查中">><<set _nb_active.push(_ni)>> <<elseif _n.status eq "已生效" or _n.status eq "已生效·第二阶段">><<set _nb_done.push(_ni)>> <<elseif _n.status eq "已失效">><<set _nb_dead.push(_ni)>><</if>> <</for>> <<set _fu_pending to []>><<set _fu_count to 0>> /* 隐藏回访(covert):标题不预告,但情报高的玩家能察觉「有些线在暗处走」 */ <<set _fu_covert_count to 0>> <<set _fu_covert_soon to false>> <<for _fi to 0; _fi lt $site_followups.length; _fi++>> <<set _fu to $site_followups[_fi]>> <<if _fu.due_day gt $session_day and not _fu.covert>> <<set _fu_pending.push(_fi)>> <<set _fu_count to _fu_count + 1>> <<elseif _fu.due_day gt $session_day and _fu.covert>> <<set _fu_covert_count to _fu_covert_count + 1>> <<if _fu.due_day - $session_day lte 3>><<set _fu_covert_soon to true>><</if>> <</if>> <</for>> /* 知情者强度:≥40 才显示「暗处的线」提示 */ <<set _nb_zhi to 0>> <<if $active_tags and $active_tags.length gt 0>> <<for _nzi to 0; _nzi lt $active_tags.length; _nzi++>> <<if $active_tags[_nzi] and $active_tags[_nzi].name eq "知情者">> <<set _nb_zhi to $active_tags[_nzi].intensity>> <</if>> <</for>> <</if>> <<if _nb_zhi lt 40>><<set _fu_covert_count to 0>><</if>> <</silently>>\ <div class="dash-card dash-sec notebook-card">\ <span class="dash-chip">长线记事本<<if _fu_count gt 0>>(_fu_count 件待约)<</if>><<if _nb_active.length gt 0>>(_nb_active.length 条追查中)<</if>></span>\ <<if _fu_count gt 0>>\ <div class="nb-section-hd">待约——已记下,等它们回来</div>\ <<for _pi to 0; _pi lt _fu_pending.length; _pi++>>\ <<set _f to $site_followups[_fu_pending[_pi]]>>\ <<set _f_left to _f.due_day - $session_day>>\ <<set _f_idx to _fu_pending[_pi]>>\ <div class="nb-item nb-pending">\ <span class="nb-tag">待约</span><span class="nb-title">_f.title</span>\ <span class="nb-meta"><<if _f_left eq 1>>明天<<else>>_f_left 天后<</if>>会回到你的案头</span>\ </div>\ <</for>>\ <</if>>\ <<if _fu_covert_count gt 0>>\ <div class="nb-section-hd">待约——有些线,还走在暗处</div>\ <<if _fu_covert_soon>>\ <div class="nb-item nb-pending">\ <span class="nb-tag">预感</span><span class="nb-title">有什么快要来了</span>\ <span class="nb-meta">你的耳目听到了动静,说不上是什么,但就在这几天</span>\ </div>\ <<else>>\ <div class="nb-item nb-pending">\ <span class="nb-tag">预感</span><span class="nb-title">有些线在暗处走</span>\ <span class="nb-meta">你埋下的事还没到回来的日子——但它们都记着账</span>\ </div>\ <</if>>\ <</if>>\ <<if _nb_active.length gt 0>>\ <<for _ai to 0; _ai lt _nb_active.length; _ai++>>\ <<set _a to $notebook[_nb_active[_ai]]>>\ <<set _a_day to $session_day - _a.born>>\ <<set _a_due to (_a.due ? _a.due : 5)>>\ <<set _a_left to _a_due - _a_day>>\ <<set _a_overdue to _a_left lte 0>>\ <div class="nb-item nb-active">\ <span class="nb-tag">_a.tag</span><span class="nb-title">_a.title</span>\ <span class="nb-meta">已追查 _a_day 天<<if _a_overdue>> · <span class="nb-overdue">该收线了</span><<else>> · 预计 _a_left 天后有消息<</if>></span>\ <<silently>> <<set _adgk to "dig_" + _a.key>> <<set _adgc to (Number($flags[_adgk]) || 0)>> <<set _diggable to (_a.key eq "rev_infil" or _a.key eq "officer_list" or _a.key eq "black_market_net")>> <<set _can_dig to (_diggable and _a_day gte $notebook_config.dig_min_day and $tp gte $notebook_config.dig_cost_tp and _adgc lt $notebook_config.dig_bonus_threshold)>> <<set _can_hurry to (_a_left gt $notebook_config.hurry_days and $tp gte $notebook_config.hurry_cost_tp)>> <</silently>>\ <<set _t_idx to _nb_active[_ai]>><<set _t_key to _a.key>>\ <<if _can_dig>>\ <<capture _t_idx _t_key>>\ <span class="nb-actions"><<link "深挖这条线" "Longline_Dig">><<set $dig_target_idx to _t_idx>><<set $dig_target_key to _t_key>><</link>>(1 行动点)</span>\ <</capture>>\ <</if>>\ <<if _can_hurry>>\ <<capture _t_idx>>\ <span class="nb-actions"><<link "催一催这条线" "Longline_Hurry">><<set $hurry_target_idx to _t_idx>><</link>>(1 行动点,提前 _notebook_config.hurry_days 天收线)</span>\ <</capture>>\ <</if>>\ <<capture _t_idx>>\ <span class="nb-actions"><<link "放弃追查" "Longline_Abandon">><<set $abandon_target_idx to _t_idx>><</link>></span>\ <</capture>>\ </div>\ <</for>>\ <</if>>\ <<if _nb_done.length gt 0>>\ <div class="nb-section-hd">已生效</div>\ <<for _di to 0; _di lt _nb_done.length; _di++>>\ <<set _d to $notebook[_nb_done[_di]]>>\ <div class="nb-item nb-done">\ <span class="nb-tag nb-tag-done">_d.tag</span><span class="nb-title">_d.title</span>\ <<if _d._revealed>>\ <<set _t_idx to _nb_done[_di]>>\ <<capture _t_idx>>\ <span class="nb-actions"><<link "回看收线记录" "Notebook_ReadBack">><<set $readback_idx to _t_idx>><</link>></span>\ <</capture>>\ <</if>>\ </div>\ <</for>>\ <</if>>\ <<if _nb_dead.length gt 0>>\ <div class="nb-section-hd">已失效</div>\ <<for _zi to 0; _zi lt _nb_dead.length; _zi++>>\ <<set _z to $notebook[_nb_dead[_zi]]>>\ <div class="nb-item nb-dead">\ <span class="nb-tag nb-tag-dead">_z.tag</span><span class="nb-title">_z.title</span>\ <span class="nb-meta">线断了<<if _z._dead_reason>>(_z._dead_reason)<</if>></span>\ </div>\ <</for>>\ <</if>>\ </div>\ <</if>>\ <</widget>>
<<widget "white-roll">>\ <<world-event-custom-init>>\ <<silently>> <<set _wr_avail to []>> <<for _wi to 0; _wi lt $white_deck.length; _wi++>> <<set _wkey to $white_deck[_wi]>> <<set _wcd to ($white_cooldowns[_wkey] ? $white_cooldowns[_wkey] : -999)>> <<if $session_day - _wcd gte 60>> <<set _wr_avail.push(_wkey)>> <</if>> <</for>> <<if _wr_avail.length eq 0>> <<set _wr_avail to $white_deck.slice()>> <</if>> <<set _pick to _wr_avail[random(0, _wr_avail.length - 1)]>> <<set $white_cooldowns[_pick] to $session_day>> <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: "A_white", source: "random", lifecycle: "instant", irreversible: 1, intensity: 8, related_tag: "日常", tag: "日常", title: _pick, description: ($world_custom_options[_pick] ? $world_custom_options[_pick].prompt : _pick), template: "decision", born_date: { year: $date.year, month: $date.month, day: $date.day }, born_day: $session_day, status: "pending" })>> <<if not $last_event_roll>><<set $last_event_roll to []>><</if>> <<set $last_event_roll.push("档·白色事件:" + _pick)>> <</silently>>\ <</widget>>
/* 小案升级中转:读 $escalate_pending,把更大的决策事件推入文件栏,展示一句转场。 */ <<silently>> <<set _ep to $escalate_pending>> <<if _ep and _ep.title>> <<set $event_counter to $event_counter + 1>> <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: "A_esc", source: "tag-induced", lifecycle: "instant", irreversible: 2, intensity: 40, related_tag: _ep.tag ? _ep.tag : "政治暴力增加", tag: _ep.tag ? _ep.tag : "政治暴力增加", title: _ep.title, description: _ep.fu_desc, template: "decision", born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> <<if not $last_event_roll>><<set $last_event_roll to []>><</if>> <<set $last_event_roll.push("卷宗已升级:《" + _ep.title + "》由小案上升为大案")>> <</if>> <<set $escalate_pending to null>> <</silently>>\ <div class="scene-block"> //那件小案没有按你所愿平息。几天后,它穿过街巷,长成了更大的火。这份卷宗已经换了一副份量,重新摆回你桌上。// </div> <<link "回到办公室" "Scene_Office">><</link>>
/* 世界大事件·通用后续场景 由大事件选项的 chain 通过 site-followup-add 登记,到期进文件栏,点进来看余波。 展示事件 description(可含多段 `\n\n`),结算后回办公室。 */ <<set _ev_idx to $file_target_idx ?? 0>>\ <<set _ev to $pending_events[_ev_idx]>>\ <<silently>><<set $pending_events[_ev_idx].status to "resolved">><<event-log-fu _ev_idx>><</silently>>\ <div class="scene-block"> //_ev.description// </div> <<link "回到办公室" "Scene_Office">><</link>>
<<widget "render-world-custom-options">>\ <<silently>> <<set _wr_ev to $args[0]>>\ <<set _wr_cur to ($world_custom_options and $world_custom_options[_wr_ev.title] ? $world_custom_options[_wr_ev.title] : null)>>\ <</silently>>\ <<if _wr_cur>>\ /* 白事件 description 本就取自 prompt(white-roll),相同就不再复述一遍 */ <<if _wr_cur.prompt and _wr_cur.prompt neq _wr_ev.description>>''<<print _wr_cur.prompt>>''<<else>>''你的决定:''<</if>> <<for _wr_i to 0; _wr_i lt _wr_cur.options.length; _wr_i++>>\ <<capture _wr_i>>\ <span class="red-choice"><<link _wr_cur.options[_wr_i].label "File_Result">> /* 定制事件不再记假 sign/delegate/delay;援助性首选(扩建收容/当场发粮/进厂结账) 用 custom_aid 显式标记,供 File_Result 现场允诺链(L324)识别 */ <<set $file_action to "custom">>\ <<set $custom_aid to (_wr_i eq 0)>>\ <<set $opt_label to _wr_cur.options[_wr_i].label>>\ <<set $opt_msg to (_wr_cur.options[_wr_i].msg ? _wr_cur.options[_wr_i].msg : "")>>\ <<apply-red-fx _wr_cur.options[_wr_i].fx _wr_ev.id>>\ <<set _wsh to _wr_cur.options[_wr_i].shift>>\ <<if _wsh>>\ <<if _wsh.lr>><<set $spectrum.left_right to Math.max(-100, Math.min(100, $spectrum.left_right + _wsh.lr))>><</if>>\ <<if _wsh.rc>><<set $spectrum.radical_conservative to Math.max(-100, Math.min(100, $spectrum.radical_conservative + _wsh.rc))>><</if>>\ <<if _wsh.authoritarian>>\ <<if not $weimar.historical_anxiety["威权幽灵"]>><<set $weimar.historical_anxiety["威权幽灵"] to 0>><</if>>\ <<set $weimar.historical_anxiety["威权幽灵"] to Math.max(0, $weimar.historical_anxiety["威权幽灵"] + Math.max(0, Math.round(_wsh.authoritarian)))>>\ <</if>>\ <</if>>\ <<set _wch to _wr_cur.options[_wr_i].chain>>\ <<if _wch>>\ <<if _wch.flag>><<set $flags[_wch.flag] to true>><</if>>\ <<if _wch.followup>>\ <<for _wfi to 0; _wfi lt _wch.followup.length; _wfi++>>\ <<set _wfu to _wch.followup[_wfi]>>\ <<set _wfu_p to (_wfu.passage ? _wfu.passage : "Followup_World")>>\ <<site-followup-add _wfu.title _wfu.desc _wfu.delay "_world" _wfu_p>>\ <</for>>\ <</if>>\ <</if>>\ <<set _wl_t to _wr_ev.title>>\ <<if _wl_t eq "军官密谋" or _wl_t eq "政变传言" or _wl_t eq "国防军抗命">>\ <<mil-line-advance>>\ <</if>>\ <<if _wr_cur.options[_wr_i].line_resolve>>\ <<set $mil_line to 9>>\ <<set $mil_outcome to _wr_cur.options[_wr_i].line_resolve>>\ <</if>>\ <<if _wr_cur.options[_wr_i].escalate>>\ <<set $escalate_pending to _wr_cur.options[_wr_i].escalate>>\ <<set _esc to _wr_cur.options[_wr_i].escalate>>\ <<site-followup-add _esc.fu_title _esc.fu_desc _esc.delay "_world" "Escalate_Trigger">>\ <</if>>\ <<set _ll to _wr_cur.options[_wr_i].longline>>\ <<if _ll>>\ <<set $last_ll_key to _ll.key>>\ <<set $notebook.push({key:_ll.key, tag:(_ll.tag ? _ll.tag : "追查"), title:_ll.title, status:"追查中", born:$session_day, due:(_ll.due ? _ll.due : 5)})>>\ <<set $flags[_ll.key] to "waiting">>\ <<site-followup-add _ll.title _ll.reveal `(_ll.due ? _ll.due : 5)` "_world" "Notebook_Reveal">>\ <</if>>\ <<if _wr_cur.options[_wr_i].kills_key>>\ <<notebook-fail _wr_cur.options[_wr_i].kills_key "主动反制,长线作废">>\ <</if>>\ <</link>></span> <<if _wr_cur.options[_wr_i].cost and _wr_cur.options[_wr_i].cost neq _wr_cur.options[_wr_i].label>>@@.red-choice-note;<<print _wr_cur.options[_wr_i].cost>>@@<</if>> <</capture>>\ <</for>>\ <</if>>\ <</widget>> <<widget "mil-line-advance">>\ <<silently>> <<set $mil_line to ($mil_line ? $mil_line : 0) + 1>>\ <<if $mil_line gte 3 and not $mil_climax_done>>\ <<set $mil_climax_done to true>>\ <<set $event_counter to $event_counter + 1>>\ <<set $pending_events.push({ event_id: "EV_" + $event_counter, deck_id: "A_mil", source: "tag-induced", lifecycle: "instant", irreversible: 3, intensity: 60, related_tag: "军队不满", tag: "军队不满", title: "政变之夜", description: "军营里传来马靴声。今夜,不是你说话,就是他们动手。", template: "decision", born_date: { year: $date.year, month: $date.month, day: $date.day }, status: "pending" })>> <<if not $last_event_roll>><<set $last_event_roll to []>><</if>>\ <<set $last_event_roll.push("军方线摊牌事件已呈上:政变之夜")>>\ <</if>>\ <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════ 跳天黄池 · 调参区(想改就改这里,改动全局生效) -------------------------------------------------------- 把「危机黄色事件」分三档,跳天数抽牌时: · 黄池优先抽(先按世界变量门槛过滤 → 60天冷却 → 按档位权重) · 不足的槽位用白色事件补齐。 1) $skip_yellow_w 每档的抽牌权重(越大越容易抽到) light 日常张力 > medium 中度危机 > critical 重度危机 2) $skip_gate gte 型门槛放宽系数(数值越高越危机,如 economy/inflation…) 轻档把母体门槛压低一半,最易命中;重档 = 母体原门槛(只有真危机才进池) 3) $skip_gate_lte lte 型门槛放宽加成(数值越低越危机,如 gov_trust) 在该门槛上「+ 的幅度」(越轻加得越多 = 门槛越宽) 4) $skip_yellow_tier 每个黄事件 title 归哪一档(light/medium/critical) · 不列进来的黄事件默认按 medium;不想让它进跳天池,直接删掉该行 · 想新增黄事件,在 $world_custom_options 写好 title 后,在这里归档即可 5) $skip_yellow_extra 不在 archetype 母体里的旧定制黄(Y 段 8 件) 补 stat/op/val/tag/template/intensity/world_effects,供抽牌 + 结算使用 ════════════════════════════════════════════════════════ */ <<widget "skip-pool-config">>\ <<silently>> <<set $skip_yellow_w to { light: 6, medium: 3, critical: 1 }>>\ <<set $skip_gate to { light: 0.5, medium: 0.72, critical: 1.0 }>>\ <<set $skip_gate_lte to { light: 25, medium: 12, critical: 0 }>>\ <<set $skip_yellow_tier to { /* ---- 轻:日常张力(门槛宽,最常出) ---- */ "乞讨者增多":"light", "传单散发":"light", "告密者":"light", "面包店排队":"light", "配给制讨论":"light", "谣言扩散":"light", "学生政治集会":"light", "街头巡逻":"light", "鲁尔难民到柏林":"light", "边境流民":"light", "占领区儿童撤离":"light", "暴发户炫耀":"light", "工会请愿":"light", "报馆被冲击":"light", "街头斗殴":"light", "冲锋队挑衅":"light", /* ---- 中:中度危机 ---- */ "物价飞涨":"medium", "黑市扩大":"medium", "工厂倒闭":"medium", "银行挤兑":"medium", "大面额马克遭拒收":"medium", "外汇黑市":"medium", "工资谈判破裂":"medium", "码头工人失业":"medium", "白领阶层沦落":"medium", "外汇贩子活跃":"medium", "资本外逃":"medium", "罢工蔓延":"medium", "街头冲突":"medium", "地下集会":"medium", "武装训练":"medium", "抢粮事件":"medium", "右翼集会":"medium", "殉道者崇拜":"medium", "复仇主义宣传":"medium", "排外情绪":"medium", "不信任动议":"medium", "内阁改组":"medium", "报纸攻击政府":"medium", "警方镇压":"medium", "红色阵线活动":"medium", "志愿团集结":"medium", "增税与抗税":"medium", "鲁尔罢工补贴不足":"medium", "工会抗议物价":"medium", "黑市猖獗":"medium", "法国驱逐鲁尔官员":"medium", "巴伐利亚右翼集会":"medium", /* ---- 重:重度危机(门槛窄,只有对应变量真告急才进池) ---- */ "中产储蓄归零":"critical", "工人占领工厂":"critical", "示威倒阁":"critical", "第48条讨论":"critical", "巴伐利亚对抗柏林":"critical", "莱茵分离主义":"critical", "地方武装集结":"critical", "军官密谋":"critical", "政变传言":"critical", "国防军抗命":"critical", "暗杀事件":"critical", "冲锋队扩编":"critical", "财政黑洞":"critical", "国债无人认购":"critical", "军费挤占民生":"critical", "马克跌破万亿":"critical", "埃森工厂冲突":"critical" }>> <<set $skip_yellow_extra to { "鲁尔罢工补贴不足": { stat:"economy", op:"gte", val:55, tag:"工人愤怒", template:"decision", intensity:28, world_effects:{"economy":2,"social_anger":2} }, "马克跌破万亿": { stat:"inflation", op:"gte", val:60, tag:"货币信任下降", template:"decision", intensity:35, world_effects:{"inflation":3,"gov_trust":-2} }, "埃森工厂冲突": { stat:"political_violence", op:"gte", val:50, tag:"政治暴力增加", template:"decision", intensity:35, world_effects:{"political_violence":3,"social_anger":2} }, "巴伐利亚右翼集会": { stat:"nationalism", op:"gte", val:55, tag:"民族主义", template:"action", intensity:28, world_effects:{"nationalism":3,"political_violence":2} }, "法国驱逐鲁尔官员": { stat:"nationalism", op:"gte", val:50, tag:"民族屈辱", template:"action", intensity:25, world_effects:{"nationalism":2,"gov_trust":-2} }, "工会抗议物价": { stat:"social_anger", op:"gte", val:50, tag:"工人愤怒", template:"action", intensity:25, world_effects:{"social_anger":3} }, "学生政治集会": { stat:"political_violence", op:"gte", val:40, tag:"政治暴力增加", template:"action", intensity:22, world_effects:{"political_violence":2,"social_anger":1} }, "黑市猖獗": { stat:"economy", op:"gte", val:50, tag:"经济压力", template:"survival", intensity:25, world_effects:{"economy":3,"gov_trust":-2} } }>> <</silently>>\ <</widget>>
/* ════════════════════════════════════════════════════════════════ 第48条 · 紧急权力(执政道具) ────────────────────────────────────────────────────────────── 历史:第48条是 1919 年 8 月宪法与生俱来的条款(不是 1923 年的新法)。 R09(9/26 全国紧急状态)是"启用"——共和国第一次真正拔出这把剑, 玩家作为代理人从 R09 结算起持有它。 卡状态 $a48 = { held, ready, recharge_day, uses } 每期(60天)限用一次;用后 recharge_day = session_day + 60, daily-tick 到期回充。 三种用法: 1. 压下一个事件(File_Event 红色/暗涌/危机事件页出现) → 事件整个停在纸上:不发生、无世界效果。 代价:受益方(party_affinity)信任-8、对立面+3、DDP-4、中产信心-2、魏玛疲惫+5 2. 作废一道法案(开票页·对已通过的他党提案) → 表决作废,提案党-12、赞成党各-4、DDP-4、中产信心-2、魏玛疲惫+5 3. 强行生效一道法案(开票页·对未通过的提案) → 不经表决直接生效(effects 照常结算), 反对党各-6、赞成党各+2、DDP-4、中产信心-2、魏玛疲惫+5 同意闸(每次使用前): - 路 A 请总理副署:$flags.pm_party(默认 dvp)+ "_pm" 为总理NPC。 看信任 + 这次用法对不对他胃口: 有利(对准对面阵营)→ 信任≥25 就签,还+2; 中性 → 信任≥45; 逆他(对准他自己阵营)→ 信任≥65,且用后-6。 拒绝时可加价:政治资本-20(会期内)或立欠条(promise-write middle)。 - 路 B 直接请总统签字:魏玛信任≥45,代价 信任-8+人格张力+4; 总理未上台前(R07 前)还需 军方信任≥30(法令要枪背书)。 - 宪法之约:$flags.ddp_covenant eq "kept"(P22 立约且未破)时动用 = 违约 → DDP -20 + 失信者 标签,DDP 当面对质。 总理换党(S4+ 留钩子):换届时 set $flags.pm_party 和 $npcs.<党>_pm 即可, 本文件所有逻辑读 pm_party,不写死 DVP。 ════════════════════════════════════════════════════════════════ */ /* ---------- a48-find-bill:按 id 找到桌上的法案对象(引用) ---------- 用法:<<a48-find-bill "banner_x">> 结果存 $a48_bill */ <<widget "a48-find-bill">>\ <<silently>> <<set _afb_id to $args[0]>> <<set $a48_bill to null>> <<if $session_review.opp_bills>> <<for _afb_i to 0; _afb_i lt $session_review.opp_bills.length; _afb_i++>> <<if $session_review.opp_bills[_afb_i].id eq _afb_id>><<set $a48_bill to $session_review.opp_bills[_afb_i]>><</if>> <</for>> <</if>> <<if $a48_bill eq null and $session_review.table>> <<for _afb_j to 0; _afb_j lt $session_review.table.length; _afb_j++>> <<if $session_review.table[_afb_j].id eq _afb_id>><<set $a48_bill to $session_review.table[_afb_j]>><</if>> <</for>> <</if>> <</silently>>\ <</widget>> /* ---------- a48-event-affinity:解析一个待办事件的受益方 ---------- 发牌对象不带 party_affinity,需按 deck_id 回查: R 前缀 → $event_deck 原卡;S 前缀(暗涌)→ 被替换的原红色事件受益方; C 前缀(危机)→ 按性质固定;其余 → 空(中性)。 */ <<widget "a48-event-affinity">>\ <<silently>> <<set _aef_ev to $args[0]>> <<set $a48_aff to []>> <<if _aef_ev.party_affinity>> <<set $a48_aff to _aef_ev.party_affinity>> <<else>> /* 发牌对象不带 party_affinity,按 deck_id 回查: S 前缀(暗涌)先换成被替换的原 R id;R/C 都到 $event_deck / 危机表取 */ <<set _aef_id to _aef_ev.deck_id ? _aef_ev.deck_id : "">> <<if _aef_id neq "" and $swell_events>> <<set _aef_target to "">> <<for _aef_i to 0; _aef_i lt $swell_events.length; _aef_i++>> <<if $swell_events[_aef_i].id eq _aef_id>><<set _aef_target to $swell_events[_aef_i].target>><</if>> <</for>> <<if _aef_target neq "">><<set _aef_id to _aef_target>><</if>> <</if>> <<if _aef_id neq "" and $event_deck>> <<for _aef_j to 0; _aef_j lt $event_deck.length; _aef_j++>> <<if $event_deck[_aef_j].id eq _aef_id and $event_deck[_aef_j].party_affinity>><<set $a48_aff to $event_deck[_aef_j].party_affinity>><</if>> <</for>> <</if>> <<if $a48_aff.length eq 0>> <<if _aef_ev.deck_id eq "C01" or _aef_ev.deck_id eq "C04">> <<set $a48_aff to ["kpd","nsdap"]>> <<elseif _aef_ev.deck_id eq "C02">> <<set $a48_aff to ["kpd","spd"]>> <<elseif _aef_ev.deck_id eq "C03">> <<set $a48_aff to ["army","dnvp"]>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- a48-stance:同意闸计算器 ---------- 用法:<<a48-stance "suppress" _ev>> 或 <<a48-stance "annul" 提案党key或null>> 输出 $a48_st = { favors:"favor|against|neutral", req:门槛, pm_ok:bool, pm_note:文案 } */ <<widget "a48-stance">>\ <<silently>> <<set _as_mode to $args[0]>> <<set _as_target to $args[1]>> <<set _as_pm to $flags.pm_party ?? "dvp">> <<set _as_npc to _as_pm + "_pm">> <<set _as_side to { spd:-1, kpd:-1, ddp:0, dvp:1, zentrum:0.2, dnvp:1, nsdap:1, army:1 }>> <<set _as_pm_side to _as_side[_as_pm] ?? 1>> <<set $a48_st to { favors:"neutral", req:45, pm_ok:false, pm_note:"" }>> <<set _as_favors to "neutral">> <<if _as_mode eq "suppress" and _as_target>> <<a48-event-affinity _as_target>> <<if $a48_aff.length gt 0>> <<set _as_against to false>> <<set _as_for to false>> <<for _as_i to 0; _as_i lt $a48_aff.length; _as_i++>> <<set _as_pid to $a48_aff[_as_i]>> <<set _as_ps to _as_side[_as_pid] ?? 0>> /* 压掉对他阵营有利的事 = 逆他;压掉对面阵营的事 = 顺他 */ <<if _as_pm_side gte 0.5 and _as_ps gte 0.5>><<set _as_against to true>><</if>> <<if _as_pm_side lte -0.5 and _as_ps lte -0.5>><<set _as_against to true>><</if>> <<if _as_pm_side gte 0.5 and _as_ps lte -0.5>><<set _as_for to true>><</if>> <<if _as_pm_side lte -0.5 and _as_ps gte 0.5>><<set _as_for to true>><</if>> <</for>> <<if _as_against>><<set _as_favors to "against">> <<elseif _as_for>><<set _as_favors to "favor">> <</if>> <</if>> <<elseif (_as_mode eq "annul" or _as_mode eq "force") and _as_target>> <<set _as_ts to _as_side[_as_target] ?? 0>> <<if _as_ts gte 0.5 and _as_pm_side gte 0.5 or _as_ts lte -0.5 and _as_pm_side lte -0.5>> <<set _as_favors to (_as_mode eq "annul" ? "against" : "favor")>> <<elseif _as_ts lte -0.5 and _as_pm_side gte 0.5 or _as_ts gte 0.5 and _as_pm_side lte -0.5>> <<set _as_favors to (_as_mode eq "annul" ? "favor" : "against")>> <</if>> <</if>> <<set $a48_st.favors to _as_favors>> <<if _as_favors eq "favor">> <<set $a48_st.req to 25>> <<set $a48_st.pm_note to "他会乐意。这份法令对准的,正是他想压的人。">> <<elseif _as_favors eq "against">> <<set $a48_st.req to 65>> <<set $a48_st.pm_note to "他不会乐意。这份法令对准的,是他自己人。">> <<else>> <<set $a48_st.req to 45>> <<set $a48_st.pm_note to "他要先看看你给的理由够不够硬。信任不到 45,他不会冒这个险。">> <</if>> <<if $npcs[_as_npc] and $npcs[_as_npc].active>> <<set $a48_st.pm_ok to ($npcs[_as_npc].trust gte $a48_st.req)>> <</if>> <</silently>>\ <</widget>> /* ---------- a48-suppress-event:把一个事件整个压下去 ---------- 从待办移除、入日志(status=suppressed)、记入今日已处理。 不产生标签/遗产/世界效果——事情根本没有发生。 */ <<widget "a48-suppress-event">>\ <<silently>> <<set _ase_id to $args[0]>> <<set _ase_idx to -1>> <<for _ase_i to 0; _ase_i lt $pending_events.length; _ase_i++>> <<if $pending_events[_ase_i].event_id eq _ase_id>><<set _ase_idx to _ase_i>><</if>> <</for>> <<if _ase_idx gte 0>> <<set _ase_ev to $pending_events[_ase_idx]>> <<set _ase_ev.status to "suppressed">> <<set _ase_ev.suppressed_by to "a48">> <<set _ase_ev.resolved_date to { year: $date.year, month: $date.month, day: $date.day }>> <<set $event_log to $event_log.concat([_ase_ev])>> <<set _ase_keep to []>> <<for _ase_j to 0; _ase_j lt $pending_events.length; _ase_j++>> <<if _ase_j neq _ase_idx>><<set _ase_keep.push($pending_events[_ase_j])>><</if>> <</for>> <<set $pending_events to _ase_keep>> <<set $today_handled.push({ deck_id: _ase_ev.deck_id, title: _ase_ev.title, template: _ase_ev.template, intensity: _ase_ev.intensity, level: "red", action: "a48_suppress" })>> <<set $a48_suppressed_ev to _ase_ev>> <</if>> <</silently>>\ <</widget>> /* ---------- a48-execute:真正动用(调用前必须已过同意闸) ---------- 用法:<<a48-execute "pm">> / <<a48-execute "pm_capital">> / <<a48-execute "pm_promise">> / <<a48-execute "weimar">> 依赖 $a48_ctx {mode,title,event_id?,bill_id?} 与 $a48_st.favors */ <<widget "a48-execute">>\ <<silently>> <<set _ae_path to $args[0]>> <<set _ae_pm to $flags.pm_party ?? "dvp">> <<set _ae_npc to _ae_pm + "_pm">> <<set _ae_names to { spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方", weimar:"魏玛" }>> /* 卡状态:用掉这一次,60天后回充 */ <<set $a48.ready to false>> <<set $a48.recharge_day to $session_day + 60>> <<set $a48.uses to ($a48.uses ?? 0) + 1>> /* 路径代价 */ <<set _ae_path_text to "">> <<if _ae_path eq "pm">> <<set _ae_fav to $a48_st ? $a48_st.favors : "neutral">> <<if _ae_fav eq "favor">> <<trust-capped _ae_npc 2 "big">> <<set _ae_path_text to "总理副署得很痛快(" + (_ae_names[_ae_pm] ?? "总理") + "信任+2)">> <<elseif _ae_fav eq "against">> <<trust-capped _ae_npc -6 "big">> <<set _ae_path_text to "总理副了署,把笔摔在桌上(" + (_ae_names[_ae_pm] ?? "总理") + "信任-6)">> <<else>> <<trust-capped _ae_npc -2 "big">> <<set _ae_path_text to "总理犹豫了很久,最终还是签了(" + (_ae_names[_ae_pm] ?? "总理") + "信任-2)">> <</if>> <<elseif _ae_path eq "pm_capital">> <<set $session_review.capital to Math.max(0, ($session_review.capital ?? 0) - 20)>> <<trust-capped _ae_npc -2 "big">> <<set _ae_path_text to "你从国会账上划了一笔政治资本给他(资本-20,信任-2)">> <<elseif _ae_path eq "pm_promise">> <<promise-write "middle" "答应总理:下一份预算照顾工商界的处境" 60>> <<set _ae_path_text to "你立了新欠条:下一份预算照顾工商界(已记入欠条簿)">> <<elseif _ae_path eq "weimar">> <<trust-capped "weimar" -8 "big">> <<set $weimar.personality_tension to Math.min(100, ($weimar.personality_tension ?? 0) + 4)>> <<set _ae_path_text to "你绕开了所有人,直接请总统签的字(魏玛信任-8,张力+4)">> <</if>> /* 宪法守护者的账:立过宪法之约(未破)→ 动用即违约 */ <<set $a48_covenant_broken to false>> <<if $party_milestones.ddp and $party_milestones.ddp.arc_state eq "accepted" and $flags.ddp_covenant neq "broken">> <<trust-capped "ddp" -20 "big">> <<if $player.tags and not $player.tags.includes("失信者")>><<set $player.tags.push("失信者")>><</if>> <<set $flags.ddp_covenant to "broken">> <<set $a48_covenant_broken to true>> <<else>> <<trust-capped "ddp" -4 "big">> <</if>> /* 中产信心:政策翻覆,最不安的是攒存折的人 */ <<set $world.middle_confidence to Math.max(0, Math.min(100, ($world.middle_confidence ?? 32) - 2))>> /* 魏玛的疲惫:每动用一次,他都老一点 */ <<set $weimar.surface.fatigue to Math.min(100, $weimar.surface.fatigue + 5)>> /* ── 按用法结算 ── */ <<set $a48_result to { mode: $a48_ctx.mode, title: $a48_ctx.title, path_text: _ae_path_text, covenant: $a48_covenant_broken, aff_text: "" }>> <<if $a48_ctx.mode eq "suppress">> <<a48-suppress-event $a48_ctx.event_id>> <<set _ae_aff to []>> <<if $a48_suppressed_ev>><<a48-event-affinity $a48_suppressed_ev>><<set _ae_aff to $a48_aff>><</if>> <<set _ae_hit_left to false>> <<set _ae_hit_right to false>> <<set _ae_parts to []>> <<for _ae_i to 0; _ae_i lt _ae_aff.length; _ae_i++>> <<set _ae_pid to _ae_aff[_ae_i]>> <<trust-capped _ae_pid -8 "big">> <<set _ae_parts.push((_ae_names[_ae_pid] ?? _ae_pid) + "信任-8")>> <<if _ae_pid eq "spd" or _ae_pid eq "kpd">><<set _ae_hit_left to true>><</if>> <<if _ae_pid eq "dnvp" or _ae_pid eq "nsdap" or _ae_pid eq "army" or _ae_pid eq "dvp">><<set _ae_hit_right to true>><</if>> <</for>> /* 对立面暗爽(最多点两家) */ <<if _ae_hit_right>> <<trust-capped "spd" 3 "big">> <<trust-capped "kpd" 3 "big">> <<set _ae_parts.push("SPD信任+3", "KPD信任+3")>> <</if>> <<if _ae_hit_left>> <<trust-capped "dnvp" 3 "big">> <<trust-capped "nsdap" 3 "big">> <<set _ae_parts.push("DNVP信任+3", "NSDAP信任+3")>> <</if>> <<set $a48_result.aff_text to _ae_parts.join(",")>> <<elseif $a48_ctx.mode eq "annul">> <<a48-find-bill $a48_ctx.bill_id>> <<if $a48_bill>> <<set $a48_bill.a48 to "annulled">> <<set _ae_parts to []>> <<if $a48_bill.party and not $a48_bill.is_player>> <<trust-capped $a48_bill.party -12 "big">> <<set _ae_parts.push((_ae_names[$a48_bill.party] ?? $a48_bill.party) + "信任-12")>> <</if>> /* 赞成此案的党也白高兴一场 */ <<party-stance $a48_bill>> <<set _ae_voters to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap"]>> <<for _ae_v to 0; _ae_v lt _ae_voters.length; _ae_v++>> <<set _ae_vp to _ae_voters[_ae_v]>> <<if _stance_map[_ae_vp] eq "yes" and _ae_vp neq $a48_bill.party>> <<trust-capped _ae_vp -4 "big">> <<set _ae_parts.push((_ae_names[_ae_vp] ?? _ae_vp) + "信任-4")>> <</if>> <</for>> <<set $a48_result.aff_text to _ae_parts.join(",")>> <<set $a48_vote_note to "紧急法令当场生效:《" + $a48_ctx.title + "》作废。提案的人站在原地,半天没有坐下。">> <</if>> <<elseif $a48_ctx.mode eq "force">> <<a48-find-bill $a48_ctx.bill_id>> <<if $a48_bill>> <<set $a48_bill.a48 to "forced">> <<party-stance $a48_bill>> <<set _ae_parts to []>> <<set _ae_voters2 to ["spd","kpd","ddp","dvp","zentrum","dnvp","nsdap"]>> <<for _ae_w to 0; _ae_w lt _ae_voters2.length; _ae_w++>> <<set _ae_vq to _ae_voters2[_ae_w]>> <<if _stance_map[_ae_vq] eq "no">> <<trust-capped _ae_vq -6 "big">> <<set _ae_parts.push((_ae_names[_ae_vq] ?? _ae_vq) + "信任-6")>> <<elseif _stance_map[_ae_vq] eq "yes">> <<trust-capped _ae_vq 2 "big">> <<set _ae_parts.push((_ae_names[_ae_vq] ?? _ae_vq) + "信任+2")>> <</if>> <</for>> <<set $a48_result.aff_text to _ae_parts.join(",")>> <<set $a48_vote_note to "紧急法令当场生效:《" + $a48_ctx.title + "》不经表决,已经生效。反对的人把笔拍在了桌上。">> <</if>> <</if>> <<set $a48_ctx to {}>> <</silently>>\ <</widget>> /* ============================================================ 同意闸 · 第48条动用确认页 三种用法都先到这里:选路(总理副署 / 直接请总统)→ 执行。 ============================================================ */
<<silently>> <<if not $a48 or not $a48.held or not $a48.ready>> <<goto "Scene_Office">> <</if>> <<if not $a48_ctx or not $a48_ctx.mode>> <<goto "Scene_Office">> <</if>> <<set _ac_pm to $flags.pm_party ?? "dvp">> <<set _ac_npc to _ac_pm + "_pm">> <<set _ac_pm_active to ($npcs[_ac_npc] and $npcs[_ac_npc].active)>> <<if $a48_ctx.mode eq "suppress">> <<set _ac_ev to null>> <<for _ac_i to 0; _ac_i lt $pending_events.length; _ac_i++>> <<if $pending_events[_ac_i].event_id eq $a48_ctx.event_id>><<set _ac_ev to $pending_events[_ac_i]>><</if>> <</for>> <<a48-stance "suppress" _ac_ev>> <<else>> <<a48-find-bill $a48_ctx.bill_id>> <<set _ac_proposer to ($a48_bill and $a48_bill.party and not $a48_bill.is_player) ? $a48_bill.party : null>> <<a48-stance $a48_ctx.mode _ac_proposer>> <</if>> /* 总统路可行性:信任≥45;总理未上台时还须军方≥30(法令要枪背书) */ <<set _ac_w_ok to ($npcs.weimar.trust gte 45)>> <<set _ac_w_army_note to false>> <<if not _ac_pm_active and $npcs.army.trust lt 30>> <<set _ac_w_ok to false>> <<set _ac_w_army_note to true>> <</if>> /* 返回去向 */ <<set _ac_back to ($a48_ctx.return eq "vote" ? "Scene_Review_Results" : "File_Event")>> <</silently>>\ ''紧急权力 · 第48条'' //你把那张薄薄的条文从抽屉最底层抽了出来。宪法第48条:公共安全与秩序受到严重扰乱时,总统可以采取一切必要的措施。建国那年写下的最后一件武器,从今天起由你的手来用。// <<if $a48_ctx.mode eq "suppress">>\ //现在,它要压下去的是:《<<= $a48_ctx.title >>》。不开会,不辩论,不给任何人递条子——让这件事整个停在纸上。//\ <<elseif $a48_ctx.mode eq "annul">>\ //现在,它要对准的,是国会刚点过头的:《<<= $a48_ctx.title >>》。表决还没有散场,条文可以比表决快。//\ <<else>>\ //现在,它要替的是没能过半数的:《<<= $a48_ctx.title >>》。议长的槌还没落下,条文可以比槌快。//\ <</if>> <div class="a48-box"> //这是你这一期(60天)唯一的一次。代价照单全收:DDP 信任-4、中产信心-2、魏玛疲惫+5。<<if $party_milestones.ddp and $party_milestones.ddp.arc_state eq "accepted" and $flags.ddp_covenant neq "broken">><span class="txt-severe">你立过「宪法之约」——动用它,就是违约(DDP 信任-20,得「失信者」之名)。</span><</if>>// </div> /* 第48条教学 · 第2拍:同意闸首访导览——这一页选的只是「请谁来签」 */ <<if not $flags.a48_consent_teach>>\ //第一次把它抽出来,先把规矩说全:这里选的只是「请谁来签」。总理可以拒绝,也可以开价;总统不会说不,但他的信任就是价目。签下去之前,全部代价都会摆在纸上——你随时可以把笔放回去。//\ <<set $flags.a48_consent_teach to true>>\ <</if>>\ <<if _ac_pm_active>>\ ''总理的态度'' <<= $a48_st.pm_note >> <<if $a48_st.pm_ok>>\ <span class="a48-choice"><<link "请总理副署,现在就签">> <<a48-execute "pm">>\ <<if $a48_result.mode eq "suppress">><<goto "Scene_A48_Result">><<else>><<goto "Scene_Review_Results">><</if>>\ <</link>></span>\ <<elseif $a48_pm_asked>>\ //他听完,把茶杯放下了。『这份东西,我不副署。』他没有解释——解释是给外人听的。// <span class="a48-choice"><<link "(加价)从国会账上划一笔政治资本给他(-20)">> <<a48-execute "pm_capital">>\ <<if $a48_result.mode eq "suppress">><<goto "Scene_A48_Result">><<else>><<goto "Scene_Review_Results">><</if>>\ <</link>></span> <span class="a48-choice"><<link "(加价)立一份新欠条:下一份预算照顾工商界">> <<a48-execute "pm_promise">>\ <<if $a48_result.mode eq "suppress">><<goto "Scene_A48_Result">><<else>><<goto "Scene_Review_Results">><</if>>\ <</link>></span>\ <<else>>\ <span class="a48-choice"><<link "请总理副署">><<set $a48_pm_asked to true>><<goto "Scene_A48_Consent">><</link>></span> <</if>>\ <<else>>\ //内阁的总理还是个管不了枪杆子的技术官僚。真正的签字权在总统手里——而总统要看军队肯不肯执行。//\ <</if>> ''总统的路'' <<if _ac_w_ok>>\ <span class="a48-choice"><<link "直接请总统签字(魏玛信任-8 · 张力+4)">> <<a48-execute "weimar">>\ <<if $a48_result.mode eq "suppress">><<goto "Scene_A48_Result">><<else>><<goto "Scene_Review_Results">><</if>>\ <</link>></span> //绕开总理,就欠共和国的。每一次,魏玛都会为这个签名流血。//\ <<else>>\ //总统的信任还不够他替你担这个险(需要 45)。<<if _ac_w_army_note>>军队也不会替一张没人背书的命令卖力(军方信任需 30)。<</if>>//\ <</if>> <<link "算了,把笔放回去">><<goto _ac_back>><</link>> /* ============================================================ 压下事件 · 结果页(作废/强推直接回开票页,不经过这里) ============================================================ */
<<silently>> <<set _ar_r to $a48_result ? $a48_result : { mode:"suppress", title:"那份文件", path_text:"", covenant:false, aff_text:"" }>> <</silently>>\ ''紧急法令 · 已经签了字'' //你没有开会,也没有签字照会谁。紧急法令的抄件压在那份文件上面,墨迹还没干。// //《<<= _ar_r.title >>》不会发生了。该准备的人还在准备,该上街的人还在等口令——等不到的。事情停在纸上,像一块从日历上抠掉的日子。// <span class="txt-sys">//(DDP 信任<<if _ar_r.covenant>>-20(违约)<<else>>-4<</if>> | 中产信心-2 | 魏玛疲惫+5<<if _ar_r.aff_text neq "">> | <<= _ar_r.aff_text >><</if>>)//</span> <<if _ar_r.path_text neq "">>\ <span class="txt-sys">//(<<= _ar_r.path_text >>)//</span>\ <</if>> <<if _ar_r.covenant>>\ <div class="ddp-note"><span class="ddp-note-tag">DDP 的声音</span>第二天一早,他堵在门口。他没有进来,只把宪法抄本摊开在第一页,扣在你的桌上。「约,是你自己立的。」他等你抬头,等你一句辩解——你没有给。他走的时候把门带得很轻,比骂你一顿还重。<span class="spd-note-delta">(违约:DDP信任-20,获得「失信者」标签)</span></div>\ <</if>> //这一期里,这张牌用完了。这六十天不必再想它——墨迹干了,它会自己回到抽屉里去。// <<link "返回办公室" "Scene_Office">><</link>> /* ============================================================ 紧急权力 · 状态页(办公室资料室入口) ============================================================ */
''紧急权力 · 第48条'' //宪法第48条:公共安全与秩序受到严重扰乱时,总统可以采取一切必要的措施,可以临时中止七项基本权利。建国那年写下的最后一件武器。9月26日,它被真正拔了出来。// <<if $a48.ready>>\ <span class="a48-choice">//状态:''可用''(本期尚未动用)| 已动用 <<= $a48.uses >> 次//</span>\ <<elseif $a48.recharge_day gt $session_day>>\ <span class="a48-choice">//状态:''冷却中''——墨迹未干,还剩 <<print $a48.recharge_day - $session_day>> 天回充 | 已动用 <<= $a48.uses >> 次//</span> <</if>> //它能做三件事:// //一、压下一个事件。处理历史巨浪、历史暗涌、危机时,事件页会多出「动用紧急权力」一项——不处理、不签字,让事情整个停在纸上。// //二、作废一道法案。开票时对已通过的提案动用,表决作废。// //三、强行生效一道法案。开票时对没过半数的提案动用,不经表决,直接生效。// //每次动用都要过一道闸:// //请总理副署——看你的信任,也看这次用法对不对他的胃口。他会拒绝,也会开价。// //直接请总统签字——绕开总理。魏玛信任-8、张力+4;总理未上台时,还要军方点头。// //代价照单全收:DDP 信任-4、中产信心-2、魏玛疲惫+5;被压的人各自记账。若立过「宪法之约」,动用即违约。每期(60天)限一次。// <<link "返回办公室" "Scene_Office">><</link>> /* ============================================================ 总理府 · 求见总理(总理线日常经营 + 第48条态度预览) ============================================================ */
<<if not ($npcs.dvp_pm and $npcs.dvp_pm.active)>>\ ''总理办公室'' //门开着,里面在换窗帘。秘书说,总理还没搬进来。// <<link "退出去" "Region_Chancellery">><</link>> <<else>>\ <<silently>> <<set _pv_t to $npcs.dvp_pm.trust>> <</silently>>\ ''总理办公室'' //他在。桌上摊着预算案,另一只手里是凉掉的咖啡。看见你进来,他把咖啡放下了。// <<if _pv_t gte 60>>\ //他把椅子往你那边挪了半尺,声音压得很低。有些话,他只在这里说。//\ <<elseif _pv_t gte 35>>\ //他亲自给你续了茶。谈到一半,他说:「这件事,我们俩得站在同一边。」//\ <<elseif _pv_t gte 20>>\ //他会和你多聊两句物价和天气。真正的账,他还押在心里没掏出来。//\ <<else>>\ //他很客气,客气得像在签一份收据。你开口之前,他先看了一眼表。//\ <</if>> <<inline-gate "pm_talk_time">>\ <<if _io_ok>>\ <span class="a48-choice"><<link "聊聊眼下的时局(信任+2 · 疲惫+1)">> <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + 1)>>\ <<trust-capped "dvp_pm" 2>>\ <<goto "Scene_Pm_Visit">>\ <</link>></span> //他给你数这个月的物价,又数内阁里欠的债。数到最后他停下来:「我们得让这个国家先活过今年。」//\ <<else>>\ @@color:gray;(时局今天就聊到这里。)@@\ <</if>> <<inline-gate "pm_talk_biz">>\ <<if _io_ok>>\ <span class="a48-choice"><<link "听他倒倒工商界的苦水(信任+2 · 疲惫+1)">> <<set $player.mental.fatigue to Math.min(100, $player.mental.fatigue + 1)>>\ <<trust-capped "dvp_pm" 2>>\ <<goto "Scene_Pm_Visit">>\ <</link>></span> //他谈到鲁尔的企业家,谈到把钱汇去荷兰的人。手指在桌上敲了两下:「留得住资本,才留得住共和国。」//\ <<else>>\ @@color:gray;(这个话题今天听过了。)@@\ <</if>> <<if $a48 and $a48.held>>\ <<inline-gate "pm_talk_a48">>\ <<if _io_ok>>\ <<link "问问他,对『紧急权力』是什么态度">> <<goto "Scene_Pm_Visit">>\ <</link>>\ <<if _pv_t gte 65>>\ //「你需要的时候,不用来问。签了送过来,我补个副署。」//\ <<elseif _pv_t gte 45>>\ //「真到那一步……你签,我副署。但你要想清楚每一次。」//\ <<elseif _pv_t gte 25>>\ //「看是什么事。压罢工,行。动我的案子,免谈。」//\ <<else>>\ //「别把那张纸递到我面前来。」他说得很轻,但没有商量的余地。//\ <</if>>\ <<else>>\ @@color:gray;(这个问题的答案,今天不会变了。)@@\ <</if>>\ <</if>> <<link "回到走廊" "Region_Chancellery">><</link>> <</if>>
/* ════════════════════════════════════════════════════════════ 第二章牌库(S2 · 1920-21 动荡与暗杀 · V0.9 骨架) ------------------------------------------------------------ 由 01_init 的 StoryInit include(在 Init_PlayerReview 之后, 因引用 $event_deck 结构无关,纯新增数组)。 id 用 R201-R210 前缀,与第一章 R01-R19 区分。 历史时间线(已核实): - 1920.2 国防军解散令(自由军团缩减到十万,国防军与极右翼摩擦开始) - 1920.3.13 卡普政变(自由军团柏林哗变,政府逃往斯图加特,总罢工粉碎政变) - 1920.3 上西里西亚冲突(波兰人起义,协约国公投前夜) - 1920.6.6 国会选举(SPD失利,右翼多数,魏玛联合破裂) - 1920.8.10 《凡尔赛条约》生效,德国裁军限期逼近 - 1921.3.20 上西里西亚公投(60/40留德,但协约国仍分走大片工业区) - 1921.5.5 伦敦最后通牒(赔款1320亿金马克,不服从即占领鲁尔) - 1921.8.26 埃尔茨贝格尔遇刺(签停战协定的「罪人」被右翼暗杀) - 1921 塞克特时代(军队脱离政治传统的表面下,黑国防军成形) - (拉特瑙遇刺是 1922.6,属下一阶段入口;骨架先不排) ════════════════════════════════════════════════════════════ */ /* ---------- S2 红色事件(10个,日期绑定,必发生) ---------- */ <<set $s2_event_deck to [ {id:"R201", level:"red", date:{y:1920, m:2, d:20}, title:"国防军解散令", tag:"军方影响", template:"decision", intensity:55, irreversible:3, desc:"条约限期将至,国防部下令解散自由军团。两百万把刺刀要缩成十万。被裁的军官里有一半恨这个共和国--他们昨天还在替他打共产党,今天他发给他们一张遣散费欠条。", dealt:false, party_affinity:["army","dnvp"]}, {id:"R202", level:"red", date:{y:1920, m:3, d:13}, title:"卡普政变", tag:"政治暴力增加", template:"decision", intensity:85, irreversible:4, desc:"海军旅拒不解散,向柏林进军。国防军司令说了那句载入史册的话:「军队不打军队。」政府跑了,政变者抬着一个东普鲁士的文官进了总理府--名义上叫他总理。共和国第一次被人从自己的椅子上推开。", dealt:false, party_affinity:["dnvp","army"]}, {id:"R203", level:"red", date:{y:1920, m:3, d:16}, title:"总罢工反击", tag:"工人愤怒", template:"action", intensity:75, irreversible:3, desc:"工会号召总罢工。电停了,水停了,政变政府发不出一道能执行的命令。柏林瘫了--瘫在罢工者手里,而不是政变者手里。这是共和国第一次靠工人的手活下来。", dealt:false, party_affinity:["spd","kpd"]}, {id:"R204", level:"red", date:{y:1920, m:6, d:6}, title:"国会选举", tag:"政府信誉", template:"decision", intensity:60, irreversible:3, desc:"第一届国会选举。左边失利,右边大胜。魏玛联合--共和国的亲爹娘--没能拿到多数。组阁要靠右派的脸色,而右派里有三分之一的人认为这个国家最好回到皇帝时代。", dealt:false, party_affinity:["zentrum","ddp"]}, {id:"R205", level:"red", date:{y:1920, m:8, d:10}, title:"条约生效日", tag:"民族屈辱", template:"stance", intensity:55, irreversible:3, desc:"《凡尔赛条约》正式生效。交出战犯名单,交出军舰,交出殖民地。报纸把这一天称为国耻日。街上有游行,烛火从勃兰登堡门排到菩提树下大街。愤怒在找一个人恨。", dealt:false, party_affinity:["dnvp","nsdap"]}, {id:"R206", level:"red", date:{y:1921, m:3, d:20}, title:"上西里西亚公投", tag:"民族屈辱", template:"decision", intensity:60, irreversible:3, desc:"上西里西亚投票:六成留德。但协约国的委员会还是把煤矿和工业区划给了波兰。赢了投票,输了土地。柏林的报纸说这是背叛。波兰人说这是正义。矿工们说:我们的煤,凭什么别人分。", dealt:false, party_affinity:["dnvp","zentrum"]}, {id:"R207", level:"red", date:{y:1921, m:5, d:5}, title:"伦敦最后通牒", tag:"经济压力", template:"decision", intensity:70, irreversible:4, desc:"赔款委员会在伦敦摊牌:一千三百二十亿金马克,四十二年付清。不接受?法军进鲁尔。政府在三天内答复。总理问幕僚:我们有选择吗。幕僚沉默了。", dealt:false, party_affinity:["dvp","ddp"]}, {id:"R208", level:"red", date:{y:1921, m:8, d:26}, title:"停战签字人遇刺", tag:"政治暴力增加", template:"action", intensity:80, irreversible:4, desc:"签停战协定的那个人在黑森林的山路上被枪杀了。两个凶手是前军官,组织叫「 Consul」。他们说他把祖国卖给了敌人。他死在自己的国家里,杀他的人认为这是爱国。", dealt:false, party_affinity:["ddp","zentrum"]}, {id:"R209", level:"red", date:{y:1921, m:9, d:10}, title:"黑国防军曝光", tag:"军方影响", template:"stance", intensity:70, irreversible:4, desc:"协约国调查组查到了「工人体操队」的枪械账本。十万陆军的表面下藏着一支影子军队--指挥它的将军们说:这是为了国防。条约说:这是战争准备。两边的说法里,共和国是抵押品。", dealt:false, party_affinity:["army","dnvp"]}, {id:"R210", level:"red", date:{y:1921, m:11, d:15}, title:"内战谣言", tag:"工人愤怒", template:"action", intensity:60, irreversible:3, desc:"巴伐利亚的武装团体在集结,图林根的工人纠察队也在集结。两边都在等对方先动,好把「自卫」两个字写在旗子上。总理府收到的每一份报告,结论都一样:明年春天会有事。", dealt:false, party_affinity:["kpd","nsdap"]} ]>> /* ---------- S2 暗涌事件(3个,替换对应红事件的备选历史) ---------- 复用 $swell_events 机制,判定走 63_swell_gate(两道门+一颗骰子+风声)。 */ <<set $s2_swell_events to [ {id:"S201", target:"R202", priority:150, title:"卡普政变失控", tag:"政治暴力增加", template:"decision", intensity:88, irreversible:4, gate:{ hard:[ { t:"world", k:"political_violence", min:55 }, { t:"world", k:"army_influence", min:50 } ], soft:[ { t:"world", k:"political_violence", min:65, w:1 }, { t:"world", k:"army_influence", min:60, w:1 }, { t:"party", k:"army", min:45, w:1 }, { t:"party", k:"dnvp", min:40, w:1 } ], rumor:"海军旅的饷单已经两个月没人签了。营房却静得反常——连休假的兵都不进城了。" }, world_effects:{political_violence:8, army_influence:6, gov_trust:-5, social_anger:5}, desc:"海军旅进了柏林,但这次总罢工没有及时组织起来。政变政府撑过了第一周。街上的战斗从柏林蔓延到鲁尔--那里立起了五万人的红军。共和国同时面对两个「合法政府」,都在用大炮投票。"}, {id:"S202", target:"R204", priority:140, title:"选举崩盘", tag:"政府信誉", template:"decision", intensity:70, irreversible:4, gate:{ hard:[ { t:"world", k:"gov_trust", max:35 }, { t:"world", k:"social_anger", min:45 } ], soft:[ { t:"world", k:"gov_trust", max:25, w:1 }, { t:"world", k:"social_anger", min:55, w:1 }, { t:"party", k:"ddp", max:30, w:1 } ], rumor:"印选票的作坊在赶夜工。工头说,这一单要印的版样,比上回多了好几张。" }, world_effects:{gov_trust:-8, nationalism:6, revolution:5, social_anger:6}, desc:"选举结果比民调更坏。中间派几乎清零,两边极端壮大。没有可以组阁的多数--只有可以否决一切的少数。国会从议事厅变成了阵地。"}, {id:"S203", target:"R208", priority:160, title:"暗杀名单", tag:"政治暴力增加", template:"action", intensity:82, irreversible:4, gate:{ hard:[ { t:"world", k:"political_violence", min:50 }, { t:"world", k:"nationalism", min:55 } ], soft:[ { t:"world", k:"political_violence", min:60, w:1 }, { t:"world", k:"nationalism", min:65, w:1 }, { t:"party", k:"dnvp", min:40, w:1 }, { t:"tag", k:"政治暴力增加", min:15, w:1 } ], rumor:"咖啡馆最里的位子,最近总有人提前占着。没人问他在等谁。" }, world_effects:{political_violence:10, nationalism:6, gov_trust:-6}, desc:"「Consul」的名单不止一个名字。签停战协定的、承认赔款的、主张履约的--名单在咖啡馆之间传递,像菜单。名单上第一个被划掉的,就是黑森林山路上的那位。共和国的部长们开始要求警察保护,而警力永远不够。"} ]>> /* ---------- S3 开局快照(选章恢复用) ---------- 发牌会把 dealt=true 直接写在牌元素上,所以选章确认页一律深拷贝出新副本上桌, 绝不引用赋值(否则原始库被污染,二次进章全哑)。 这里存的是 1923 开局的原始态:从 S2 切回 S3(或二次进入 S3)时逐项还原。 注意:本引擎没有 Object.clone,深拷贝用 JSON 往返。 */ <<set $s3_snapshot to { deck: JSON.parse(JSON.stringify($event_deck)), swell: JSON.parse(JSON.stringify($swell_events)), seats: JSON.parse(JSON.stringify($party_seats)), motives: JSON.parse(JSON.stringify($party_motives)), profile_kpd: JSON.parse(JSON.stringify($party_profile.kpd)), world: JSON.parse(JSON.stringify($world)), army_trust: $npcs.army.trust }>>
/* ---------- shadow-init:懒初始化(旧存档兼容,所有入口先调) ---------- */ <<widget "shadow-init">>\ <<silently>> <<if not $shadow_cabinet>> <<set $shadow_cabinet to { unlocked: false, intro_seen: false, members: {}, exposure: 0, intel_acc: 0, exposed_count: 0 }>> <</if>> <<if not $shadow_positions>> <<set $shadow_positions to { finance_clerk: { name: "财政部的拨款司官", duty: "管日常拨款的那支笔", perk: "赤字涨得慢一点(财政压力每日小幅回落)", daily: { fiscal: -0.12 }, grudge: "dvp", grudge_name: "DVP" }, press_editor: { name: "通讯社的版面编辑", duty: "管官方通稿的版面", perk: "报上的日子显得好过些(中产信心每日微涨),每月多一份人情(情报+2)", daily: { middle_confidence: 0.06 }, grudge: "ddp", grudge_name: "DDP" }, police_liaison: { name: "警察总署的档案联络官", duty: "管街头档案归档的先后", perk: "街面骚乱压得住些(政治暴力每日小幅回落),风声也传得慢些(曝光增速降四分之一)", daily: { political_violence: -0.08 }, grudge: "zentrum", grudge_name: "Zentrum" }, army_adjutant: { name: "国防部的值班参谋", duty: "管值班简报的措辞", perk: "军方的动向你先一步知道(军方影响每日小幅回落)", daily: { army_influence: -0.08 }, grudge: "army", grudge_name: "军方" } }>> <</if>> <</silently>>\ <</widget>> /* ---------- shadow-gate-check:信笺门(只读) ---------- 情报≥12 且 暗账最险值<55。输出 _sh_gate(true/false)。 情报值用 $var 暂存(循环内临时变量赋值循环后丢失)。 */ <<widget "shadow-gate-check">>\ <<silently>> <<set $sh_gate_intel to 0>> <<if $active_tags and $active_tags.length gt 0>> <<for _sgi to 0; _sgi lt $active_tags.length; _sgi++>> <<if $active_tags[_sgi] and $active_tags[_sgi].name eq "知情者">> <<set $sh_gate_intel to $active_tags[_sgi].intensity>> <</if>> <</for>> <</if>> <<undercurrent-worst>> <<set _sh_gate to ($sh_gate_intel gte 12 and _uc_worst lt 55)>> <</silently>>\ <</widget>> /* ---------- shadow-intel-delta N:情报(知情者标签)±N,0-30 钳制 ---------- 按踩坑3的老规矩:map 重建全新对象+全新数组,再整体写回。 */ <<widget "shadow-intel-delta">>\ <<silently>> <<set _sd_n to Number($args[0])>> <<set $sh_sd_tmp to []>> <<if $active_tags and $active_tags.length gt 0>> <<for _sdi to 0; _sdi lt $active_tags.length; _sdi++>> <<set _sdt to $active_tags[_sdi]>> <<if _sdt.name eq "知情者">> <<set $sh_sd_tmp.push({ id: _sdt.id, name: _sdt.name, level: _sdt.level, category: _sdt.category, intensity: Math.max(0, Math.min(30, _sdt.intensity + _sd_n)), decay_rate: _sdt.decay_rate, direction: _sdt.direction, target: _sdt.target, fusion_candidates: _sdt.fusion_candidates, weimar_text: _sdt.weimar_text, born_date: _sdt.born_date, source_event: _sdt.source_event, owner: _sdt.owner })>> <<else>> <<set $sh_sd_tmp.push(_sdt)>> <</if>> <</for>> <<set $active_tags to $sh_sd_tmp>> <</if>> <</silently>>\ <</widget>> /* ---------- shadow-hire pos:招募 ---------- 成本:TP2(疲劳+3)、情报-8、魏玛信任-3、怨主信任-10、曝光+6。 产出:注册永久滴灌(duration 99999,同源防堆叠)。 */ <<widget "shadow-hire">>\ <<silently>> <<set _shh_pos to $args[0]>> <<shadow-init>> <<if $shadow_positions[_shh_pos] and not $shadow_cabinet.members[_shh_pos]>> <<tp-spend 2 3>> <<shadow-intel-delta -8>> <<set $npcs.weimar.trust to Math.max(0, $npcs.weimar.trust - 3)>> <<set _shh_g to $shadow_positions[_shh_pos].grudge>> <<if $npcs[_shh_g]>> <<set $npcs[_shh_g].trust to Math.max(0, $npcs[_shh_g].trust - 10)>> <</if>> <<set $shadow_cabinet.members[_shh_pos] to { hired_day: $session_day }>> <<set $shadow_cabinet.exposure to Math.min(100, $shadow_cabinet.exposure + 6)>> <<set $sh_hire_reg to { src_id: "shadow_" + _shh_pos, title: "影子班底 · " + $shadow_positions[_shh_pos].name, kind: "shadow", band: "", effects: { daily: $shadow_positions[_shh_pos].daily, duration: 99999 } }>> <<active-effect-register $sh_hire_reg>> <</if>> <</silently>>\ <</widget>> /* ---------- shadow-dismiss pos:体面离开 ---------- 无遣散费。移除滴灌、曝光-10(少一张嘴)。 */ <<widget "shadow-dismiss">>\ <<silently>> <<set _shd_pos to $args[0]>> <<shadow-init>> <<if $shadow_cabinet.members[_shd_pos]>> <<set $sh_dis_members to {}>> <<set _shd_keys to Object.keys($shadow_cabinet.members)>> <<for _shdk to 0; _shdk lt _shd_keys.length; _shdk++>> <<if _shd_keys[_shdk] neq _shd_pos>> <<set $sh_dis_members[_shd_keys[_shdk]] to $shadow_cabinet.members[_shd_keys[_shdk]]>> <</if>> <</for>> <<set $shadow_cabinet.members to $sh_dis_members>> <<set $shadow_cabinet.exposure to Math.max(0, $shadow_cabinet.exposure - 10)>> /* 摘除滴灌:重建 $active_effects,跳过同源条目 */ <<set $sh_dis_fx to []>> <<if $active_effects and $active_effects.length gt 0>> <<for _shdf to 0; _shdf lt $active_effects.length; _shdf++>> <<if $active_effects[_shdf].src_id neq ("shadow_" + _shd_pos)>> <<set $sh_dis_fx.push($active_effects[_shdf])>> <</if>> <</for>> <</if>> <<set $active_effects to $sh_dis_fx>> <</if>> <</silently>>\ <</widget>> /* ---------- shadow-day N:每日结算(曝光/党争裂痕/编辑的人情) ---------- 日常传 1,快进传天数。曝光 0.4/人/天(police_liaison 在职 ×0.75); 党争裂痕 0.05/人/天;press_editor 在职时情报每满30天 +2。 */ <<widget "shadow-day">>\ <<silently>> <<if $shadow_cabinet and $shadow_cabinet.unlocked>> <<set _shdd_days to ($args.length gt 0 and Number($args[0]) gt 0) ? Number($args[0]) : 1>> <<set _shdd_keys to Object.keys($shadow_cabinet.members)>> <<set _shdd_n to _shdd_keys.length>> <<if _shdd_n gt 0>> <<set _shdd_rate to _shdd_n * 0.4>> <<if _shdd_keys.indexOf("police_liaison") neq -1>> <<set _shdd_rate to _shdd_rate * 0.75>> <</if>> <<set $shadow_cabinet.exposure to Math.min(100, $shadow_cabinet.exposure + _shdd_rate * _shdd_days)>> <<if $undercurrent>> <<set $undercurrent.party_rift to Math.min(100, $undercurrent.party_rift + 0.05 * _shdd_n * _shdd_days)>> <</if>> <<if _shdd_keys.indexOf("press_editor") neq -1>> <<set $shadow_cabinet.intel_acc to ($shadow_cabinet.intel_acc ? $shadow_cabinet.intel_acc : 0) + _shdd_days>> <<if $shadow_cabinet.intel_acc gte 30>> <<set _shdd_m to Math.floor($shadow_cabinet.intel_acc / 30)>> <<set _shdd_add to _shdd_m * 2>> <<shadow-intel-delta _shdd_add>> <<set $shadow_cabinet.intel_acc to $shadow_cabinet.intel_acc - _shdd_m * 30>> <</if>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- shadow-exp-label:曝光档位文案(输出 _sh_exp_label/_sh_exp_bar) ---------- */ <<widget "shadow-exp-label">>\ <<silently>> <<set _shel_e to Math.floor($shadow_cabinet.exposure)>> <<if _shel_e lt 40>> <<set _sh_exp_label to "无人察觉">> <<elseif _shel_e lt 70>> <<set _sh_exp_label to "有些视线">> <<else>> <<set _sh_exp_label to "风声渐紧">> <</if>> <<set _shel_fill to Math.min(10, Math.round(_shel_e / 10))>> <<set _sh_exp_bar to "▓".repeat(_shel_fill) + "░".repeat(10 - _shel_fill)>> <</silently>>\ <</widget>>
<<shadow-init>>\ //深夜。门房敲了两下门,放下东西就走。你桌上多了第二封信。// 这封信不走公文渠道——没有编号,没有部门抬头,火漆也不是总理府的那一枚。字是好字,抄写员的手笔,但内容不是抄写员的口吻。 「先生: 有些位置上的人,忠于工资单,忠于党证,忠于部长本人——唯独不忠于这台机器。 他们都在等一个真正对这台机器负责的人来用他们。 我们不问您站在哪边。我们只提醒一句:这张名单一旦展开,就收不回去了。」 信纸下面压着四张便签。每张背面写着一个职务。职务旁边本来该有名字的地方,被墨水仔细涂掉了。 <div class="guide-box"> ''这份名单的规矩(务必先读)'' · 物色一人:花 ''2 点行动力''、动用 ''8 点情报'' 的人情线 · 他带来一条''长期的好处''(各不相同,每天生效);他原先的主人会记恨(''对应势力信任-10'') · 魏玛会察觉你在布自己的棋(''他的信任-3'') · 人手越多越难藏:''暗处的视线''每天涨(0.4/人),''攒满 100 就有人上门对质'' · 随时可以让他们体面离开;但用过的棋子,记性好得很 </div> <<link "展开名单">><<set $shadow_cabinet.intro_seen to true>><<set $shadow_cabinet.unlocked to true>><<goto "Scene_Shadow_Cabinet">><</link>> \ <<link "把信烧掉">><<set $shadow_cabinet.intro_seen to true>><<goto "Scene_Office">><</link>>
<<shadow-init>>\ <<if not $shadow_cabinet.unlocked>>\ <<goto "Scene_Shadow_Intro">>\ <</if>>\ <<shadow-exp-label>>\ ''影子内阁 · 名单'' //正式的政府开在楼上的会议厅里。你的这一届,开在抽屉里。// ''暗处的视线'':<<print _sh_exp_bar>>(<<print Math.floor($shadow_cabinet.exposure)>> / 100 · _sh_exp_label) <<if $shadow_cabinet.exposure gte 70>>\ <span class="ev-warning">已经有人在打听这些职务的调动记录。再拖下去,就不由你选时间和地点了。</span>\ <</if>>\ <hr> ''在职(<<print Object.keys($shadow_cabinet.members).length>> 人)'' <<set $sh_cb_any to false>>\ <<for _shc_k range Object.keys($shadow_cabinet.members)>>\ <<capture _shc_k>>\ <<set $sh_cb_any to true>>\ <span class="shadow-mem">\ ''$shadow_positions[_shc_k].name'' //入职第 <<print $shadow_cabinet.members[_shc_k].hired_day>> 天// $shadow_positions[_shc_k].duty 产出:$shadow_positions[_shc_k].perk <<link "让他体面离开">><<shadow-dismiss _shc_k>><<goto "Scene_Shadow_Cabinet">><</link>>\ </span>\ <</capture>>\ <</for>>\ <<if not $sh_cb_any>>\ //名单还是干净的。//\ <</if>>\ <hr> ''可物色'' <<shadow-gate-check>>\ <<set $sh_cb_open to false>>\ <<set $sh_cb_intel to $sh_gate_intel>>\ <<for _shc_k2 range Object.keys($shadow_positions)>>\ <<capture _shc_k2>>\ <<if not $shadow_cabinet.members[_shc_k2]>>\ <<set $sh_cb_open to true>>\ <span class="shadow-mem">\ ''$shadow_positions[_shc_k2].name'' $shadow_positions[_shc_k2].duty 产出:$shadow_positions[_shc_k2].perk //代价:行动力2 · 情报-8 · 魏玛信任-3 · $shadow_positions[_shc_k2].grudge_name 信任-10 · 视线+6// <<if $sh_cb_intel lt 8>>\ //情报线不够用(需至少 8 点,当前 <<print $sh_cb_intel>>)。先让耳目再多一些。//\ <<elseif $tp lt 2>>\ //今天的精神不够了(需 2 点行动力)。//\ <<else>>\ <<link "物色此人">><<shadow-hire _shc_k2>><<goto "Scene_Shadow_Cabinet">><</link>>\ <</if>>\ </span>\ <</if>>\ <</capture>>\ <</for>>\ <<if not $sh_cb_open>>\ //名单上的位置都填满了。人手到齐——但这张名单本身,已经开始有重量了。//\ <</if>>\ <hr> <<link "合上抽屉,回办公室" "Scene_Office">><</link>>
<<shadow-init>>\ <<set $sh_ex_keys to Object.keys($shadow_cabinet.members)>>\ <<set $sh_ex_target to "">>\ <<set $sh_ex_day to -1>>\ <<for _shex to 0; _shex lt $sh_ex_keys.length; _shex++>>\ <<if $shadow_cabinet.members[$sh_ex_keys[_shex]].hired_day gt $sh_ex_day>>\ <<set $sh_ex_day to $shadow_cabinet.members[$sh_ex_keys[_shex]].hired_day>>\ <<set $sh_ex_target to $sh_ex_keys[_shex]>>\ <</if>>\ <</for>>\ ''纸包不住火'' 例会上,一位部长把一页纸拍在桌上。纸上没有点名,但每个人都看得懂那几行「人事异动记录」指的是谁。有人低声念了其中一个职务。没有人笑。 散会后,魏玛在窗前站了很久,背对着你。 「我不问你这些人是怎么来的。」他说,「我问你——这台机器,到底是谁的?」 <<if $sh_ex_target neq "">>\ <span class="shadow-mem"> ''挥泪切割'' 弃车保帅。名单上最显眼的那一位(''$shadow_positions[$sh_ex_target].name'')明天就会收到调令。 //视线 -45 · 魏玛信任 +2 · 党争裂痕 -5 · 班底少一人// <<link "签调令">> <<shadow-dismiss $sh_ex_target>>\ <<set $shadow_cabinet.exposure to Math.max(0, $shadow_cabinet.exposure - 45)>>\ <<set $npcs.weimar.trust to Math.min(100, $npcs.weimar.trust + 2)>>\ <<if $undercurrent>><<set $undercurrent.party_rift to Math.max(0, $undercurrent.party_rift - 5)>><</if>>\ <<set $shadow_cabinet.exposed_count to $shadow_cabinet.exposed_count + 1>>\ <<goto "Scene_Office">>\ <</link>>\ </span>\ <</if>>\ <span class="shadow-mem"> ''硬顶下来'' 你告诉他:查吧。他会照办——他总是照办——但有什么东西,从这天起就不一样了。 //视线 -15 · 魏玛信任 -8 · 全党信任 -4 · 党争裂痕 +12// <<link "把话说死">> <<set $shadow_cabinet.exposure to Math.max(0, $shadow_cabinet.exposure - 15)>>\ <<set $npcs.weimar.trust to Math.max(0, $npcs.weimar.trust - 8)>>\ <<set $sh_ex_parties to ["spd", "kpd", "ddp", "dvp", "zentrum", "dnvp", "nsdap", "army"]>>\ <<for _shexp to 0; _shexp lt $sh_ex_parties.length; _shexp++>>\ <<if $npcs[$sh_ex_parties[_shexp]]>>\ <<set $npcs[$sh_ex_parties[_shexp]].trust to Math.max(0, $npcs[$sh_ex_parties[_shexp]].trust - 4)>>\ <</if>>\ <</for>>\ <<if $undercurrent>><<set $undercurrent.party_rift to Math.min(100, $undercurrent.party_rift + 12)>><</if>>\ <<set $shadow_cabinet.exposed_count to $shadow_cabinet.exposed_count + 1>>\ <<goto "Scene_Office">>\ <</link>>\ </span>
/* ---------- drift-memory-init:懒初始化(旧存档兼容) ---------- */ <<widget "drift-memory-init">>\ <<silently>> <<if not $drift_memory>><<set $drift_memory to []>><</if>> <<if not $drift_mem_lookup>><<set $drift_mem_lookup to {}>><</if>> <</silently>>\ <</widget>> /* ---------- drift-note-swell deck_id:暗涌处理完记账 ---------- kind 依据该暗涌是否有 swell_avoided(我按下了它) → deflected, 否则按当前治理路线自动处置 → swept;日常处理动作映射 alliance/suppressed/accepted。 踩坑1重申:循环里捞到的配置必须暂存 $var,临时 _var 循环后丢失。 */ <<widget "drift-note-swell">>\ <<silently>> <<drift-memory-init>> <<set _dm_id to $args[0]>> <<set $dm_cfg to null>> <<if $swell_events and $swell_events.length gt 0>> <<for _dmi to 0; _dmi lt $swell_events.length; _dmi++>> <<if $swell_events[_dmi].id eq _dm_id>> <<set $dm_cfg to $swell_events[_dmi]>> <</if>> <</for>> <</if>> <<set _dm_title to ($dm_cfg and $dm_cfg.title) ? $dm_cfg.title : (_ev ? _ev.title : "那件事")>> <<set _dm_kind to "swept">> <<if $flags["swell_avoided_" + _dm_id]>> <<set _dm_kind to "deflected">> <<elseif $file_action and $file_action eq "sign">> <<set _dm_kind to "suppressed">> <<elseif $file_action and $file_action eq "delegate">> <<set _dm_kind to "alliance">> <<elseif $file_action and $file_action eq "delay">> <<set _dm_kind to "accepted">> <</if>> <<if _ev and _ev.irreversible gte 4>> <<set _dm_kind to "fate">> <</if>> /* 踩坑30:对象字面量里不能嵌三元表达式(Unexpected token '.')——复杂值先暂存再进字面量 */ <<set _dm_ledger to ($dm_cfg and $dm_cfg.desc) ? $dm_cfg.desc.slice(0, 60) + "……" : "">> <<set _dm_note to $file_action ? $file_action : "">> <<set $drift_memory.push({ day: $session_day, id: _dm_id, type: "swell", title: _dm_title, ledger: _dm_ledger, kind: _dm_kind, choice_note: _dm_note, spoken: false })>> <<set $drift_mem_lookup[_dm_id] to true>> <</silently>>\ <</widget>> /* ---------- drift-note-card card_id:历史歧路(反事实牌)通过后记账 ---------- */ <<widget "drift-note-card">>\ <<silently>> <<drift-memory-init>> <<set _dm_id to $args[0]>> <<set $dm_cfg to null>> <<if $player_proposals and $player_proposals.counterfact and $player_proposals.counterfact.length gt 0>> <<for _dmi to 0; _dmi lt $player_proposals.counterfact.length; _dmi++>> <<if $player_proposals.counterfact[_dmi].id eq _dm_id>> <<set $dm_cfg to $player_proposals.counterfact[_dmi]>> <</if>> <</for>> <</if>> <<if $dm_cfg>> <<set _dm_ledger to $dm_cfg.narrative ? $dm_cfg.narrative.slice(0, 60) + "……" : "">> <<set $drift_memory.push({ day: $session_day, id: _dm_id, type: "card", title: $dm_cfg.title, ledger: _dm_ledger, kind: "fate", choice_note: "国会表决通过", spoken: false })>> <<set $drift_mem_lookup[_dm_id] to true>> <</if>> <</silently>>\ <</widget>> /* ---------- drift-kind-name kind:偏移性质 → 手记栏位小标(输出 _dkn) ---------- */ <<widget "drift-kind-name">>\ <<silently>> <<set _dkn_k to $args[0]>> <<if _dkn_k eq "deflected">><<set _dkn to "它本可发生——我按下了">> <<elseif _dkn_k eq "swept">><<set _dkn to "它把我们卷走了">> <<elseif _dkn_k eq "alliance">><<set _dkn to "我借它搭了线">> <<elseif _dkn_k eq "suppressed">><<set _dkn to "我把它压了下去">> <<elseif _dkn_k eq "accepted">><<set _dkn to "我由着它发生">> <<elseif _dkn_k eq "fate">><<set _dkn to "它说出就收不回">> <<else>><<set _dkn to "它来过">><</if>> <</silently>>\ <</widget>> /* ---------- drift-echo-insert:报纸余波栏 ---------- 选一条未上过的(或全部上过后从最早的循环)偏移,输出 _drift_echo_head / _drift_echo_body(已含 //斜体//),没有可出则置空。 */ <<widget "drift-echo-insert">>\ <<silently>> <<drift-memory-init>> <<set _drift_echo_head to "">> <<set _drift_echo_body to "">> <<if $drift_memory.length gt 0>> <<if not $drift_echo_used>><<set $drift_echo_used to {}>><</if>> <<set $de_pick to null>> <<for _dei to 0; _dei lt $drift_memory.length; _dei++>> <<if not $de_pick and not $drift_echo_used[$drift_memory[_dei].id]>> <<set $de_pick to $drift_memory[_dei]>> <</if>> <</for>> <<if not $de_pick>> /* 全部上过了:从最早的一条循环(世界反复回味它) */ <<set $de_pick to $drift_memory[0]>> <</if>> <<if $de_pick>> <<set $drift_echo_used[$de_pick.id] to true>> <<drift-kind-name $de_pick.kind>> <<set _de_tagline to "">> /* 栏内性质小注 */ <<if $de_pick.kind eq "deflected">><<set _de_tagline to "这件事没有发生。报纸上找不到它,但写字的人都知道它差点就在头条上。">> <<elseif $de_pick.kind eq "swept">><<set _de_tagline to "这件事发生过。它不在头版了,可城里的每个角落还在替它付账。">> <<elseif $de_pick.kind eq "alliance">><<set _de_tagline to "这件事发生过。有人借它搭上了话——现在那根线还牵着,没人知道牵到哪头。">> <<elseif $de_pick.kind eq "suppressed">><<set _de_tagline to "这件事被压下去了。可压进土里的东西,根都还活着。">> <<elseif $de_pick.kind eq "accepted">><<set _de_tagline to "这件事没有人拦。它就这样走进了日子里,再没出来。">> <<elseif $de_pick.kind eq "fate">><<set _de_tagline to "这件事说出了就收不回。报纸登过,现在轮到街道来记住它。">> <<else>><<set _de_tagline to "这件事发生过。街道记得比报纸久。">> <</if>> <<set _drift_echo_head to "余波 · " + $de_pick.title>> <<set _drift_echo_body to "//" + _de_tagline + "//">> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- weimar-drift-speak:夜话主动提一次 ---------- 输出 $weimar_drift_line(有则注入夜话);一条偏移只讲一次(spoken=true)。 */ <<widget "weimar-drift-speak">>\ <<silently>> <<drift-memory-init>> <<set $weimar_drift_line to "">> <<if $drift_memory.length gt 0>> <<set $dw_pick to null>> <<set $dw_pick_i to -1>> <<for _dwi to 0; _dwi lt $drift_memory.length; _dwi++>> <<if not $dw_pick and not $drift_memory[_dwi].spoken>> <<set $dw_pick to $drift_memory[_dwi]>> <<set $dw_pick_i to _dwi>> <</if>> <</for>> <<if $dw_pick>> <<set _dw_line to "">> /* 按性质+暗涌id配一句他亲口说的话 */ <<if $dw_pick.kind eq "deflected">> <<set _dw_line to "那天的事,后来没有人再提。但我知道它差点就发生了。是你按住的。……我不知道该谢你,还是该怕你。">> <<elseif $dw_pick.kind eq "swept">> <<set _dw_line to "有时候我半夜醒,会想起『" + $dw_pick.title + "』。不是我们选了它——是它把我们卷了进去。这种事,有过一次就够让人老了。">> <<elseif $dw_pick.kind eq "alliance">> <<set _dw_line to "『" + $dw_pick.title + "』……我后来想明白了。你不是被它推着走,你是踩着它往你要的方向走了一步。我不问你那一步通向哪。">> <<elseif $dw_pick.kind eq "suppressed">> <<set _dw_line to "『" + $dw_pick.title + "』压下去了。可我见过压过的地方长什么样——草是会更绿一些,土下面全是断的。你下次压之前,告诉我一声。">> <<elseif $dw_pick.kind eq "accepted">> <<set _dw_line to "『" + $dw_pick.title + "』的时候,你什么都没做。我盯着你看了一整晚,想从你脸上看出那是宽容还是放弃。到现在也没看出来。">> <<elseif $dw_pick.kind eq "fate">> <<set _dw_line to "有些话说出去就收不回了。『" + $dw_pick.title + "』就是。我现在每天醒来第一件事,是确认它还只是发生过一次,不是正在发生。">> <<else>> <<set _dw_line to "『" + $dw_pick.title + "』。我记着呢。你也记着点。">> <</if>> <<if _dw_line neq "">> <<set $weimar_drift_line to "魏玛:「" + _dw_line + "」">> /* $dw_pick 与数组元素是同一引用,直接改它比下标路径稳 */ <<set $dw_pick.spoken to true>> <</if>> <</if>> <</if>> <</silently>>\ <</widget>> /* ---------- drift-ledger-embed:手记页尾「历史偏移」区(HTML 直出) ---------- */ <<widget "drift-ledger-embed">>\ <<silently>> <<drift-memory-init>> <<set _dl_html to "">> <<if $drift_memory.length gt 0>> <<set _dl_html to _dl_html + '<div class="nb-archive drift-ledger">——\n历史偏移(他记得的事)\n'>> <<for _dli to 0; _dli lt $drift_memory.length; _dli++>> <<set _dl_e to $drift_memory[_dli]>> <<drift-kind-name _dl_e.kind>> <<set _dl_html to _dl_html + '<p class="drift-entry"><span class="drift-day">第 ' + _dl_e.day + ' 天</span> · <b>' + _dl_e.title + '</b> <span class="drift-kind">' + _dkn + '</span>'>> <<if _dl_e.ledger neq "">> <<set _dl_html to _dl_html + '<br><span class="drift-note">//' + _dl_e.ledger + '//</span>'>> <</if>> <<set _dl_html to _dl_html + '</p>\n'>> <</for>> <<set _dl_html to _dl_html + '</div>'>> <</if>> <</silently>>\ <<if _dl_html neq "">><<print _dl_html>><</if>>\ <</widget>>
/* ---------- affection-cards-init:卡组数据(由 Init_Parties 调用) ---------- */ <<widget "affection-cards-init">>\ <<silently>> <<set $aff_cards to { ambient: { office: [ { id: "amb_any_01", who: "any", w: 6, text: "总机这一小时接了七次电话:三次指名总理府,四次只说是公事。" }, { id: "amb_any_02", who: "any", w: 6, text: "楼下的车换了两拨。院里的旗被风扯了一上午。" }, { id: "amb_spd_low", who: "spd", tiers: [0,1], text: "工会的公函照例到了,抬头用全称,签收栏空着——他的人没有多写一个字。" }, { id: "amb_spd_mid", who: "spd", tiers: [2,3], text: "会刊寄到了,比往常早两天。夹页里有一张手写便条:「下周的会,坐前排。」" }, { id: "amb_spd_high", who: "spd", tiers: [4,5,6], text: "工会大楼侧门的钥匙送到了,用旧报纸包着。附条没有署名,只写了楼层。" }, { id: "amb_kpd_low", who: "kpd", tiers: [0,1], text: "今天的党报没有点你的名。上周还点过。" }, { id: "amb_kpd_mid", who: "kpd", tiers: [2,3], text: "一张传单从门缝底下塞进来。讲的是别处的事,版式却眼熟——排字的人没换。" }, { id: "amb_kpd_high", who: "kpd", tiers: [4,5,6], text: "一份还带着油墨味的党报送到了门口台阶上。日期印的是明天。" }, { id: "amb_army_low", who: "army", tiers: [0,1], text: "武官处的公函到了。编号排在同类公文的最末一档,像是被人排上去的。" }, { id: "amb_army_mid", who: "army", tiers: [2,3], text: "楼下停过一辆军牌轿车,引擎没有熄。十分钟后它开走了,没有人上来。" }, { id: "amb_army_high", who: "army", tiers: [4,5,6], text: "一份不在呈送名单上的调防简报,出现在你桌上第二摞的最上面。谁放的,没有人问。" }, { id: "amb_weimar_low", who: "weimar", tiers: [0,1], text: "他在你门外站了一会儿。脚步声来过,又走了,门没有被敲响。" }, { id: "amb_weimar_mid", who: "weimar", tiers: [2,3], text: "咖啡是他让人送来的。杯底压着今日议程:划掉了三项,留了四项。" }, { id: "amb_weimar_high", who: "weimar", tiers: [4,5,6], text: "傍晚他路过你的门,脚步慢了半拍,最后没有停。第二天的议程上多了一项:听你谈谈。" }, { id: "amb_ddp_low", who: "ddp", tiers: [0,1], text: "他的公函把每一条都引了宪法条文,连借会议室这样的小事也一样。" }, { id: "amb_ddp_mid", who: "ddp", tiers: [2,3], text: "立法草案的清样送到了,页边有两行小字,提醒你第四款和州法打架。" }, { id: "amb_ddp_high", who: "ddp", tiers: [4,5,6], text: "旧书店的包裹寄到了,里面是你要找的那版宪法草案,夹着一张手绘的修正案对照表。" }, { id: "amb_dvp_low", who: "dvp", tiers: [0,1], text: "他的备忘录印在厚实的纸上,数字精确到分位,落款盖着商会的钢印,没有手写一字。" }, { id: "amb_dvp_mid", who: "dvp", tiers: [2,3], text: "煤和铁的运输计划表提前到了你桌上,比他自己董事会的日程还早半天。" }, { id: "amb_dvp_high", who: "dvp", tiers: [4,5,6], text: "莱茵河的航班给你留了舱位,票根用火漆封着。随票的便条写:这条水路的账,往后咱们一起算。" }, { id: "amb_zentrum_low", who: "zentrum", tiers: [0,1], text: "他的信写在主教公署的信笺上,火漆压着双十字。通篇称你「阁下」,一句多余的话都没有。" }, { id: "amb_zentrum_mid", who: "zentrum", tiers: [2,3], text: "他的报纸转载了你的讲话,删去尖锐的那段,加了一句教义式的按语。" }, { id: "amb_zentrum_high", who: "zentrum", tiers: [4,5,6], text: "瞻礼那天,教堂为你点了一支蜡烛。没有仪式,就插在烛排最不起眼的位置。" }, { id: "amb_dnvp_low", who: "dnvp", tiers: [0,1], text: "他的信纸四边镶着黑白红的细线。字是花体,内容是抗议。" }, { id: "amb_dnvp_mid", who: "dnvp", tiers: [2,3], text: "易北河以东的收成报告寄来了,附言请你留意「东部对帝国的意义」,数据列得很全。" }, { id: "amb_dnvp_high", who: "dnvp", tiers: [4,5,6], text: "两瓶庄园烧酒送到了你办公室,酒标是手写的:东部窖藏,非卖品。" }, { id: "amb_nsdap_low", who: "nsdap", tiers: [0,1], text: "街头小报的漫画又画了你一回,这回把你的影子涂成了黑的。报童吆喝得很起劲。" }, { id: "amb_nsdap_mid", who: "nsdap", tiers: [2,3], text: "他的集会越来越守时,散了场,街面也扫得干干净净。传单上第一次出现「共同」这个词。" }, { id: "amb_nsdap_high", who: "nsdap", tiers: [4,5,6], text: "他的队伍打你门前过,皮靴声齐得像一个人。领队的在楼下朝你抬了抬手。" } ] }, cross: { spd: { up: [ { id: "cross_spd_up_1", text: "那份会议记录的副本又出现在你桌上。这次没有附字条——不需要了。" }, { id: "cross_spd_up_2", text: "深夜的电话响了。总机说:工会大楼的线,指名找你。" } ], down: [ { id: "cross_spd_down_1", text: "会议记录的副本停了。你等了两天,去函催问,回函只有四个字:「按惯例办。」" }, { id: "cross_spd_down_2", text: "他在走廊那头朝你点了点头,然后转身走了另一边的楼梯。" } ] }, kpd: { up: [ { id: "cross_kpd_up_1", text: "接头路线的纸条这次写得很全,连万一出事时该烧掉哪一半,都用铅笔圈了出来。" }, { id: "cross_kpd_up_2", text: "散会后他没有走,坐在原位等你。他有一个问题,问得很慢。" } ], down: [ { id: "cross_kpd_down_1", text: "党报头版的措辞变了。关于你的那一段,称呼从「你」换回了「总理府」。" }, { id: "cross_kpd_down_2", text: "你坐过的那把旁听席的椅子,下次开会时被挪走了。没有人说明。" } ] }, army: { up: [ { id: "cross_army_up_1", text: "调防简报之外多了一页手写的部署草图。按规矩,这种纸看完就该烧。他没有烧。" }, { id: "cross_army_up_2", text: "检阅那天,观礼台给你留了位置。请柬是手写的,没有走文书。" } ], down: [ { id: "cross_army_down_1", text: "呈送名单重新排过了。你的名字往下挪了三行,没有附任何说明。" }, { id: "cross_army_down_2", text: "那辆军牌车不再停在楼下了。公函照来,编号又排回了最末一档。" } ] }, weimar: { up: [ { id: "cross_weimar_up_1", text: "他走的时候把外套忘在了你的会客室。他从来不忘东西。" }, { id: "cross_weimar_up_2", text: "夜里你的灯亮着,走廊尽头的那盏也没有熄。你们谁都没有去关。" } ], down: [ { id: "cross_weimar_down_1", text: "他敲门只剩两下。公事公办的两下——从前是三下。" }, { id: "cross_weimar_down_2", text: "他退回的文件上,批注先是变成一行,再后来只有一个「照办」。最近什么都没有了。" } ] }, ddp: { up: [ { id: "cross_ddp_up_1", text: "法学家的茶会第一次请你入席。请柬是手写的,末尾注了一句:不谈公报,只谈草案。" }, { id: "cross_ddp_up_2", text: "他的报纸开始替你的草案逐条辩护。社论不长,条文编号却排得整整齐齐。" } ], down: [ { id: "cross_ddp_down_1", text: "他的律师们不再出席你的协调会。议程上空着的席位,没有人说明。" }, { id: "cross_ddp_down_2", text: "宪法研究会的通讯照常寄来,你的名字从撰稿人一栏退到了订户一栏。" } ] }, dvp: { up: [ { id: "cross_dvp_up_1", text: "分红方案的内页多了一行小字:优先照顾政府方面的现金流。这是他不写进正文的条款。" }, { id: "cross_dvp_up_2", text: "你出席的会上,他的董事们不再看表了。散会时,有人把一支没抽的雪茄留在了你桌上。" } ], down: [ { id: "cross_dvp_down_1", text: "例行会晤取消了,改派来一位年轻的代表,照着声明念要点,念完就走。" }, { id: "cross_dvp_down_2", text: "你签过字的订单照常履行,只是货款结算的周期,从三十天悄悄改成了九十天。" } ] }, zentrum: { up: [ { id: "cross_zentrum_up_1", text: "布道词里第一次为政府祈了平安。这份祈祷词,第二天照原文登在他的周报上。" }, { id: "cross_zentrum_up_2", text: "弥撒散了,他的代表留到最后,把一份教会学校的经费草约推到你面前。这是他头一回先开口。" } ], down: [ { id: "cross_zentrum_down_1", text: "周日的钟声照旧。他的报纸不再引你的话,连批评也省了,版面上换成了教区新闻。" }, { id: "cross_zentrum_down_2", text: "联合会年的请柬没有再来。往年这一天,他的席位总在你左手边。" } ] }, dnvp: { up: [ { id: "cross_dnvp_up_1", text: "他的俱乐部给你寄来一把铜钥匙。门房说,里面的藏书室从没对会员之外的人开过。" }, { id: "cross_dnvp_up_2", text: "他把祖传的族谱抄本借给了你,借条上写着他的原话:「让你看看什么才叫秩序。」借期一栏填的是「不限」。" } ], down: [ { id: "cross_dnvp_down_1", text: "东部的救灾案被他原样退回,退信只有一句:施舍养不出好农人。" }, { id: "cross_dnvp_down_2", text: "他的晚宴照开,宾客名单上你的名字从主桌挪到了靠门的第二桌。" } ] }, nsdap: { up: [ { id: "cross_nsdap_up_1", text: "啤酒馆寄来一个包裹:一枚新铸的徽章,一张集会月历。附条只有一句——街头已经准备好了。" }, { id: "cross_nsdap_up_2", text: "他的代表送来一份联名名单,你的名字排在第一行。几十个签名,笔迹却像同一个人的。" } ], down: [ { id: "cross_nsdap_down_1", text: "街上的鼓点绕开了你的街区。传单照旧满天飞,只是不再送进你这条街。" }, { id: "cross_nsdap_down_2", text: "集会的请柬不再署你的名字,换成了一行铅字:诚挚欢迎各界人士。" } ] } } }>> <<if not $aff_state>><<set $aff_state to { used: {}, recent: [], last_day: {}, queue: [] }>><</if>> <<if not $aff_state.queue>><<set $aff_state.queue to []>><</if>> <<memory-pools-init>> <</silently>>\ <</widget>> /* ---------- aff-draw:擦肩卡抽取 ---------- 用法:<<aff-draw "office">> 在场景预留的反应位调用。 规则:每场景每天最多 1 张;一次性卡用过即焚;近期 5 张不重复; 按对象当前档位过滤(tiers 省略=全档);加权随机;无候选则静默。 */ <<widget "aff-draw">>\ <<silently>> <<set _ad_scene to $args[0]>>\ <<set _ad_out to "">>\ <<if $aff_cards and $aff_cards.ambient and $aff_cards.ambient[_ad_scene] and $aff_state>>\ <<if $aff_state.last_day[_ad_scene] neq $session_day>>\ <<set _ad_pool to []>>\ <<for _adi to 0; _adi lt $aff_cards.ambient[_ad_scene].length; _adi++>>\ <<set _ad_c to $aff_cards.ambient[_ad_scene][_adi]>>\ <<set _ad_ok to true>>\ <<if _ad_c.who neq "any">>\ <<set _ad_ok to false>>\ <<if $npcs[_ad_c.who]>>\ <<attitude-tier-idx _ad_c.who $npcs[_ad_c.who].trust>>\ <<if _tier_idx gte 0 and ((not _ad_c.tiers) or _ad_c.tiers.includes(_tier_idx))>><<set _ad_ok to true>><</if>>\ <</if>>\ <</if>>\ <<if _ad_ok and _ad_c.once and $aff_state.used[_ad_c.id]>><<set _ad_ok to false>><</if>>\ <<if _ad_ok and $aff_state.recent.includes(_ad_c.id)>><<set _ad_ok to false>><</if>>\ <<if _ad_ok>>\ <<set _ad_w to (_ad_c.w ? _ad_c.w : 10)>>\ <<for _adk to 0; _adk lt _ad_w; _adk++>><<set _ad_pool.push(_ad_c)>><</for>>\ <</if>>\ <</for>>\ <<if _ad_pool.length gt 0>>\ <<set _ad_pick to _ad_pool[random(0, _ad_pool.length - 1)]>>\ <<set _ad_out to _ad_pick.text>>\ <<set $aff_state.last_day[_ad_scene] to $session_day>>\ <<if _ad_pick.once>><<set $aff_state.used[_ad_pick.id] to true>><</if>>\ <<set $aff_state.recent.push(_ad_pick.id)>>\ <<if $aff_state.recent.length gt 5>><<set $aff_state.recent.splice(0, $aff_state.recent.length - 5)>><</if>>\ <</if>>\ <</if>>\ <</if>>\ <</silently>>\ <<if _ad_out neq "">>@@.aff-line;_ad_out@@<br><</if>>\ <</widget>> /* ---------- cross-queue-push:跨档事件进队 ---------- 用法:<<cross-queue-push "spd" "down">> 在信任闸门检测到档位变化时调用。 */ <<widget "cross-queue-push">>\ <<silently>> <<if not $aff_state>><<set $aff_state to { used: {}, recent: [], last_day: {}, queue: [] }>><</if>>\ <<if not $aff_state.queue>><<set $aff_state.queue to []>><</if>>\ <<set $aff_state.queue.push({ pid: $args[0], dir: $args[1] })>>\ <</silently>>\ <</widget>> /* ---------- cross-tier-flush:冲刷跨档卡 ---------- 用法:<<cross-tier-flush>> 在 trust-act-note 末尾与 Scene_Office 进页时调用。 逐条抽一张未用的跨档卡显示(金框),显示即消耗;无卡可抽则静默跳过。 冲刷完清空队列——未出卡的跨档事件不补出,避免旧账堆积。 */ <<widget "cross-tier-flush">>\ <<silently>> <<set _cf_names to {spd:"SPD", kpd:"KPD", ddp:"DDP", dvp:"DVP", zentrum:"Zentrum", dnvp:"DNVP", nsdap:"NSDAP", army:"军方", weimar:"魏玛", police:"红堡", dvp_pm:"DVP总理"}>>\ <<set _cf_list to []>>\ <<if $aff_state and $aff_state.queue and $aff_state.queue.length gt 0 and $aff_cards>>\ <<for _cfi to 0; _cfi lt $aff_state.queue.length; _cfi++>>\ <<set _cf_e to $aff_state.queue[_cfi]>>\ <<set _cf_card to null>>\ <<if $aff_cards.cross[_cf_e.pid] and $aff_cards.cross[_cf_e.pid][_cf_e.dir]>>\ <<set _cf_cards to $aff_cards.cross[_cf_e.pid][_cf_e.dir]>>\ <<set _cf_pool to []>>\ <<for _cfj to 0; _cfj lt _cf_cards.length; _cfj++>>\ <<set _cf_c to _cf_cards[_cfj]>>\ <<if not $aff_state.used[_cf_c.id]>><<set _cf_pool.push(_cf_c)>><</if>>\ <</for>>\ <<if _cf_pool.length gt 0>>\ <<set _cf_card to _cf_pool[random(0, _cf_pool.length - 1)]>>\ <<set $aff_state.used[_cf_card.id] to true>>\ <</if>>\ <</if>>\ <<if _cf_card>><<set _cf_list.push({ pid: _cf_e.pid, text: _cf_card.text })>><</if>>\ <</for>>\ <<set $aff_state.queue to []>>\ <</if>>\ <</silently>>\ <<for _cfr to 0; _cfr lt _cf_list.length; _cfr++>><div class="aff-cross"><span class="aff-cross-tag"><<print _cf_names[_cf_list[_cfr].pid]>></span><br><<print _cf_list[_cfr].text>></div><</for>>\ <</widget>> /* ---------- memory-pools-init:记忆回响模板池(惰性初始化,旧存档也能补) ---------- {content} 会替换成承诺原文;不出现具体人名。 */ <<widget "memory-pools-init">>\ <<silently>> <<if not $mem_pools>>\ <<set $mem_pools to { promise_kept: [ "他先提起了那件事:{content}。说完补了一句——「你倒是言而有信。」", "{content}——这件事他记得很牢。谈正事之前,他先把这个说了。", "落座没几句,他把话头绕回了{content}。正题还没开始,这件事先摆在了桌上。" ], promise_broken: [ "他提起了{content}。就一句,问完了日子,然后不再说下去。", "谈正事之前,他先翻出了{content}那笔账。没有责怪的话,只是把日子又报了一遍。", "{content}——他没忘。这次他把这件事和别的条款写在同一张纸上,摆在你看得到的位置。" ], trust_shock_up: [ "会面比约定提前了。他的门房直接把你领了进去,没有通报。", "他让人重新换了热茶。上一次这样,还是你们头一回坐下来谈的时候。", "他先开了口,说了一句题外话:「看来你是认真的。」说完才谈别的。" ], trust_shock_down: [ "他迟到了一会儿,进门没有道歉,坐下第一句是:「说事吧。」", "他的回函比往常短了一半。该说的都说了,没有一句多余的。", "这一次,他的记事本合着放在手边,一次也没有翻开。" ] }>> <</if>>\ <</silently>>\ <</widget>> /* ---------- memory-register:记忆回响登记 ---------- 用法:<<memory-register "spd" "promise_kept" "提高工人补贴">> 第三个参数可省(trust_shock 类不需要内容)。 由 trust-capped(大幅信任变化)与 promise-fulfill/promise-settle(承诺兑现/违约)调用。 每党至多留 5 条未说的旧事,超出的最旧一条标记用过。 */ <<widget "memory-register">>\ <<silently>> <<set _mr_pid to $args[0]>>\ <<set _mr_kind to $args[1]>>\ <<set _mr_content to ($args.length gt 2 and $args[2]) ? $args[2] : "">>\ <<if $npcs[_mr_pid]>>\ <<if not $party_memories>><<set $party_memories to {}>><</if>>\ <<if not $party_memories[_mr_pid]>><<set $party_memories[_mr_pid] to []>><</if>>\ <<set $party_memories[_mr_pid].push({kind:_mr_kind, day:$session_day, content:_mr_content, used:false})>>\ <<set _mr_count to 0>>\ <<for _mrr range $party_memories[_mr_pid]>><<if not _mrr.used>><<set _mr_count to _mr_count + 1>><</if>><</for>>\ <<if _mr_count gt 5>>\ <<for _mrs range $party_memories[_mr_pid]>>\ <<if not _mrs.used>><<set _mrs.used to true>><<break>><</if>>\ <</for>>\ <</if>>\ <</if>>\ <</silently>>\ <</widget>> /* ---------- memory-flush:他提起旧事(会面时冲刷一条) ---------- 用法:<<memory-flush "spd">> 在 party-chat2 选项列表前调用。 取该党最新一条未说的旧事渲染(.aff-memory 灰青引言),说过即标记; 超过 120 天没说的不再提;无旧事则静默。 */ <<widget "memory-flush">>\ <<silently>> <<memory-pools-init>>\ <<set _mf_pid to $args[0]>>\ <<set _mf_out to "">>\ <<if $party_memories and $party_memories[_mf_pid] and $party_memories[_mf_pid].length gt 0 and $mem_pools>>\ <<for _mfe range $party_memories[_mf_pid]>>\ <<if not _mfe.used and _mfe.day lt ($session_day - 120)>><<set _mfe.used to true>><</if>>\ <</for>>\ <<set _mf_pick to null>>\ <<for _mfp range $party_memories[_mf_pid]>>\ <<if not _mfp.used>><<set _mf_pick to _mfp>><</if>>\ <</for>>\ <<if _mf_pick>>\ <<set _mf_pool to $mem_pools[_mf_pick.kind]>>\ <<if _mf_pool and _mf_pool.length gt 0>>\ <<set _mf_tpl to _mf_pool[random(0, _mf_pool.length - 1)]>>\ <<if _mf_pick.content neq "">><<set _mf_out to _mf_tpl.replace("{content}", _mf_pick.content)>>\ <<else>><<set _mf_out to _mf_tpl.replace(":{content}。", "。").replace(":{content}——", "——").replace("{content}", "那件事")>><</if>>\ <<set _mf_pick.used to true>>\ <</if>>\ <</if>>\ <</if>>\ <</silently>>\ <<if _mf_out neq "">><div class="aff-memory"><span class="aff-memory-tag">旧事</span><br>_mf_out</div><</if>>\ <</widget>>