Compare commits
5 Commits
1690981c70
...
39682f14fe
| Author | SHA1 | Date | |
|---|---|---|---|
| 39682f14fe | |||
| 9c1593e717 | |||
| b8fecd080f | |||
| 71f841fd23 | |||
| 85fadb21a1 |
266
docs/design.md
266
docs/design.md
@ -1,159 +1,175 @@
|
||||
这是一份整合了所有讨论内容(核心机制、肉鸽要素、任务重构、叠层羁绊、学科差异、装备系统)的最终版游戏总体设计文档。
|
||||
|
||||
---
|
||||
|
||||
# 游戏总体设计文档:最强导师 (The Apex Mentor)
|
||||
**版本:** 2.0 (Final Draft)
|
||||
**版本:** 3.0 (Master Design)
|
||||
**类型:** 模拟经营 / 策略养成 / Roguelite / 反向塔防
|
||||
**核心体验:** “学术界生存恐怖游戏”。在充满黑色幽默的校园中,扮演一名从零开始的导师,在30年的学术生涯中,通过压榨学生、抢夺署名、政治博弈,最终成为“学阀”或身败名裂。
|
||||
**核心体验:** “学术界生存恐怖游戏”。在长达30年的学术生涯中,通过压榨学生、抢夺署名、政治博弈和资源管理,在“非升即走”的压力下存活,最终成为学阀或身败名裂。
|
||||
|
||||
---
|
||||
|
||||
## 1. 游戏概述 (Overview)
|
||||
## 1. 游戏概览 (Game Overview)
|
||||
|
||||
* **平台:** PC (Steam)
|
||||
* **引擎:** Godot 4.5 (C#)
|
||||
* **视角:** 2.5D 俯视校园(类似于《监狱建筑师》或《双点医院》)
|
||||
* **核心循环:** 局内回合制经营 + 局外Roguelite成长。
|
||||
* **视角:** 2.5D 俯视校园(类似《监狱建筑师》)。
|
||||
* **单局时长:** 45-60 分钟(完整通关)。
|
||||
* **难度设计:** 硬核。初次游玩通常在第 5-10 回合失败,需要通过多次重开积累“传承”才能通关。
|
||||
* **游戏结构:** 局内回合制经营(30回合/30年)+ 局外Roguelite成长。
|
||||
* **核心循环:** 招募学生 $\rightarrow$ 攻克课题 $\rightarrow$ 发表论文 $\rightarrow$ 消耗论文申请基金 $\rightarrow$ 扩大实验室 $\rightarrow$ 应对考核。
|
||||
|
||||
---
|
||||
|
||||
## 2. 游戏进程与阶段 (Campaign Stages)
|
||||
## 2. 游戏阶段与进程 (Campaign Structure)
|
||||
|
||||
游戏设定为 **30 回合(30年)** 的长线战役,分为三个阶段。每阶段有明显的“劝退机制”和玩法重心变化。
|
||||
游戏分为三个阶段,难度呈阶梯式上升,每阶段有核心“劝退机制”。
|
||||
|
||||
### 第一阶段:青椒求生 (The Survivor) —— 回合 1-10
|
||||
* **叙事:** 你刚入职,没钱没学生,只有一张桌子。
|
||||
* **核心玩法:** **微操与生存**。导师必须亲自下场干活(写代码、改论文)。资金极度紧缺,容错率极低。
|
||||
* **劝退节点(Boss):** 第 6 回合【非升即走考核】。要求:B类论文 x2 + 存款 > 50万。失败则解聘(Game Over)。
|
||||
|
||||
### 第二阶段:教授崛起 (The Manager) —— 回合 11-20
|
||||
* **叙事:** 你拿到了教职,团队扩大,学生多了,麻烦也多了。
|
||||
* **核心玩法:** **人员管理与资源分配**。导师转为指挥官(Buff机)。重点在于平衡学生的心理健康、分配署名权,并引入“博后”等雇佣兵攻坚。
|
||||
* **劝退节点(Boss):** 第 15 回合【国家级项目申请】。要求:极高的学术声望 + 组建跨学科团队。失败则资金链断裂,全员解散。
|
||||
|
||||
### 第三阶段:学阀博弈 (The Godfather) —— 回合 21-30
|
||||
* **叙事:** 你已成名,开始介入学院政治。
|
||||
* **核心玩法:** **政治与防背刺**。小老师(青年讲师)可能自立门户带走资源。需要处理学术造假举报、同行评审打压等高维打击。
|
||||
* **终局目标:** 第 30 回合【院士评选/终身成就】。综合评分(科研+传承+资产)决定结局(S/A/B/C/D)。
|
||||
1. **青椒求生 (回合 1-10):**
|
||||
* **目标:** 活下来,通过“非升即走”考核。
|
||||
* **玩法:** 导师亲自下场干活,资金紧缺,微操为主。
|
||||
* **Boss:** 第6回合【聘期考核】(需论文+存款)。
|
||||
2. **教授崛起 (回合 11-20):**
|
||||
* **目标:** 扩大团队,申请国家级项目。
|
||||
* **玩法:** 人员管理,平衡压力与产出,处理“抢一作”矛盾。
|
||||
* **Boss:** 第15回合【重点基金申请】(需S级论文+团队羁绊)。
|
||||
3. **学阀博弈 (回合 21-30):**
|
||||
* **目标:** 评选院士,建立学派。
|
||||
* **玩法:** 政治博弈,防止小老师背刺,应对学术造假举报。
|
||||
* **终局:** 第30回合【终身成就评定】。
|
||||
|
||||
---
|
||||
|
||||
## 3. 核心角色系统 (Units)
|
||||
## 3. 学科与流派系统 (Disciplines)
|
||||
|
||||
### 3.1 导师 (玩家/英雄单位)
|
||||
* **双形态切换:**
|
||||
* **苦力形态 (Worker):** 亲自上阵,对任务造成大量伤害,消耗体力。随着职级提升,此能力逐渐削弱。
|
||||
* **老板形态 (Boss):** 站在设施上提供光环(如:在实验室增加攻速,在会议室增加回蓝)。
|
||||
* **技能 (消耗精力):**
|
||||
* *画饼充饥:* 牺牲下回合心情,本回合全员效率 +30%。
|
||||
* *亲自操刀:* 瞬间完成某任务剩余 10% 的进度。
|
||||
* *职场PUA:* 重置一名“摸鱼”状态的学生,但增加压力。
|
||||
开局选择学科,决定了**核心资源循环**、**专属Buff**以及**卡池中的特色单位/装备**。
|
||||
|
||||
### 3.2 学生 (基础作战单位)
|
||||
* **生命周期:** 硕士 (3回合) -> 博士 (3+3回合)。毕业即离队。
|
||||
* **四维属性:**
|
||||
* *学术 (INT):* 理论攻坚。
|
||||
* *工程 (STR):* 实验/代码搬砖。
|
||||
* *表达 (CHA):* 写作/答辩/申项目。
|
||||
* *抗压 (SAN):* 归零时崩溃/发疯/住院。
|
||||
* **特质 (Roguelike词条):** 随机生成,如“DDL战士”、“代码洁癖”、“恋爱脑”。
|
||||
|
||||
### 3.3 高级雇员 (特殊单位)
|
||||
* **博士后 (Mercenary):**
|
||||
* *机制:* 极强,极贵,**合同仅3回合**,不可续签。
|
||||
* *用途:* 专门用来应对“劝退节点”的临时强力打手。
|
||||
* **青年讲师/小老师 (Partner/Rival):**
|
||||
* *机制:* 永久雇员,属性强,能带学生。
|
||||
* *野心系统:* 拥有【野心值】。如果【野心 > 忠诚】,会触发**“分家事件”**:离职并带走 30% 经费和 2 名最好的学生。
|
||||
* *管理策略:* 通过给一作(增加野心但维持心情)或打压(降低野心但降低忠诚)来平衡。
|
||||
|
||||
---
|
||||
|
||||
## 4. 任务与战斗系统 (Battle)
|
||||
|
||||
### 4.1 任务实体化
|
||||
* 任务(论文/项目/杂务)是地图上的**怪物/节点**。
|
||||
* **HP = 工作量**。**防御力 = 难度**(需特定属性破防)。
|
||||
* **Deadline = 倒计时**。倒计时结束未完成 -> 扣除大量声望/资金,甚至导致学生延毕。
|
||||
|
||||
### 4.2 战斗流程 (自走)
|
||||
1. **分发阶段:** 玩家将任务卡牌放置在地图上的不同格子(如机房、实验室)。
|
||||
2. **执行阶段:** 学生根据AI自动寻找匹配的任务点进行“攻击”(工作)。
|
||||
3. **突发事件:** 战斗中随机弹窗(断电、设备损坏、失恋),需玩家使用道具或技能干预。
|
||||
|
||||
---
|
||||
|
||||
## 5. 特色机制 (Unique Mechanics)
|
||||
|
||||
### 5.1 署名分配 (The Authorship Game)
|
||||
* **触发:** 论文任务完成后触发。
|
||||
* **玩法:** 这是一个**分战利品**的界面。玩家需将作者槽位分配给参与的学生。
|
||||
* *一作:* 极高收益(毕业权重/野心/忠诚)。
|
||||
* *通讯:* 默认导师,获得声望。
|
||||
* *挂名:* 强行塞入未参与的人(如关系户),导致团队压力激增。
|
||||
* **博弈:** 如果抢了贡献度最高者的“一作”给别人,该学生会产生**“怨恨”**状态(效率减半,潜伏期后可能举报导师或删库)。
|
||||
|
||||
### 5.2 道具与采购 (Procurement)
|
||||
使用经费购买,增强即时策略感。
|
||||
* **消耗品 (拖拽使用):** *速效救心丸*(复活猝死学生)、*冰美式*(提速)、*生发液*(减压)。
|
||||
* **设备 (放置升级):** *人体工学椅*(减体力消耗)、*4090显卡集群*(工程任务加速)。
|
||||
* **特殊道具:** *专家推荐信*(强制让差生毕业)、*大喇叭*(全图喊话Buff)。
|
||||
|
||||
### 5.3 局外成长 (Roguelite Heritage)
|
||||
单局结束后的“结算点数”用于解锁永久加成,降低下一局难度。
|
||||
* **天赋树:**
|
||||
* *人脉:* 初始经费增加。
|
||||
* *教案积累:* 导师初始精力上限提升。
|
||||
* **校友录 (遗产系统):**
|
||||
* 上一局培养出的 S 级毕业生,会进入“校友池”。
|
||||
* 新开局时,可触发“校友回馈”事件(直接捐款、提供横向项目、或作为客座专家空降1回合)。
|
||||
* **祖传代码库:** 每一局结束保留部分代码/数据,下一局同类型课题效率 +10%。
|
||||
|
||||
---
|
||||
|
||||
## 6. 地图与设施 (Map System)
|
||||
|
||||
地图采用校园平面网格布局。
|
||||
|
||||
| 区域 | 功能 | 策略点 |
|
||||
| 学科 | 核心 Buff | 玩法风格 |
|
||||
| :--- | :--- | :--- |
|
||||
| **实验室** | 主战场,产出进度 | 可升级工位数量和舒适度。 |
|
||||
| **机房** | 算力中心 | 必须保持低温(空调升级),否则宕机。 |
|
||||
| **行政楼** | 资金/杂务 | **高危区**。去此处办事极易心情崩溃,需道具辅助。 |
|
||||
| **咖啡厅** | 恢复区 | 回血/回蓝。学生摸鱼的首选地。 |
|
||||
| **会议室** | 爆发/展示 | 答辩前突击专用,多人有羁绊加成。 |
|
||||
| **生物** | **【移液枪神】**:实验高成功率,学生高体力消耗。 | 搬砖流。拼体力,耗材贵。 |
|
||||
| **化学** | **【炼金术士】**:概率免费完成实验,概率爆炸。 | 赌狗流。高风险高回报。 |
|
||||
| **环境** | **【绿色通道】**:纵向基金成功率+20%,野外采样不降心情。 | 政策流。吃皇粮,跑野外。 |
|
||||
| **材料** | **【灌水大师】**:论文产出快,但引用率低。 | 铺量流。以量取胜。 |
|
||||
| **医学** | **【国自然宠儿】**:申请基金资金量+30%。 | 氪金流。极其烧钱,但经费也多。 |
|
||||
| **计算机** | **【超频运算】**:机房算力翻倍,AI任务加速。 | 算力流。烧电费,怕断网。 |
|
||||
| **数学** | **【粉笔与黑板】**:任务0资金成本,极高智力要求。 | 智力流。省钱,但极易卡关。 |
|
||||
| **物理** | **【第一性原理】**:S级任务概率直接顿悟完成。 | 顿悟流。平时平庸,爆发极强。 |
|
||||
| **机械** | **【蓝领专家】**:横向项目收益+50%,做工程不积怨。 | 搞钱流。拥抱工业界。 |
|
||||
| **哲学** | **【斯多葛学派】**:压力过高不发疯,只发呆。 | 苟命流。高San值抗性。 |
|
||||
| **经济** | **【资本运作】**:闲置经费产生利息。 | 利息流。钱生钱。 |
|
||||
| **法学** | **【钻空子】**:大概率免疫行政处罚/举报。 | 规则流。无视负面事件。 |
|
||||
| **文学** | **【修辞术】**:能将B级内容包装成A级发表。 | 包装流。低配高发。 |
|
||||
| **农学** | **【大丰收】**:定期产出回血/回心情道具。 | 补给流。自给自足。 |
|
||||
| **管理** | **【微操大师】**:导师光环翻倍,学生压力翻倍。 | 压榨流。献祭学生换效率。 |
|
||||
| **艺术** | **【传世之作】**:作品可成为永久声望来源。 | 养成流。单品收益最大化。 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 资源循环 (Economy)
|
||||
## 4. 角色与羁绊系统 (Units & Synergies)
|
||||
|
||||
1. **经费 (Money):** 生命线。用于发工资、买道具、维护设备。一旦归零,触发“拖欠工资”,忠诚度清零。
|
||||
2. **声望 (Reputation):** 经验值。决定每年的招生质量(N -> SSR)和课题等级。
|
||||
3. **算力/数据 (Resources):** 机房产出,消耗品,用于攻克高端AI课题。
|
||||
4. **压力 (Global Stress):** 全实验室共享的负面条。过高会导致群体性事件(集体罢工)。
|
||||
### 4.1 角色分类
|
||||
1. **导师 (Player):** 可在“干活模式”和“老板模式”切换。
|
||||
2. **学生 (Minions):** 硕士(3年) / 博士(6年)。
|
||||
3. **雇员 (Staff):** 博后(临时雇佣兵) / 小老师(长期合伙人,有野心值)。
|
||||
|
||||
### 4.2 叠层羁绊 (Stacking Mechanics)
|
||||
采用 **“人群画像 (Race)” + “职能分工 (Class)”** 双系统。
|
||||
|
||||
* **人群画像 (决定实验室风气):**
|
||||
* **卷王 (The Grinder):** 增加全队攻速,增加压力。 (2/4/6层)
|
||||
* **摸鱼党 (The Slacker):** 增加心情恢复,传染摸鱼状态。
|
||||
* **富家子弟 (The Elite):** 增加金钱利息,解锁商店高级货。
|
||||
* **天才 (The Prodigy):** 人越少越强,暴击率提升。
|
||||
* **职能分工 (决定任务效率):**
|
||||
* **通用教职:** 【笔杆子】(写论文)、【大忽悠】(拉项目)、【管家】(跑行政)。
|
||||
* **学科专精:**
|
||||
* *【炼金术士】(生化环材):* 消耗资金做实验。
|
||||
* *【极客】(理工):* 消耗算力写代码。
|
||||
* *【调研员】(社科):* 跑图采样。
|
||||
* *【思想者】(文史哲):* 憋灵感顿悟。
|
||||
|
||||
---
|
||||
|
||||
## 8. 界面与美术风格 (UI/Art)
|
||||
## 5. 任务与经济系统 (Tasks & Economy)
|
||||
|
||||
* **风格:** 像素风或低多边形 (Low Poly)。
|
||||
* **色调:** 早期冷色调(惨白灯光),后期根据结局变得辉煌(暖色)或破败(灰暗)。
|
||||
* **关键视觉反馈:**
|
||||
* **压力表现:** 学生的头发随着压力变少,眼圈变黑,步履蹒跚。
|
||||
* **署名界面:** 拖动头像时,学生会有明显的表情气泡(开心、震惊、愤怒)。
|
||||
* **年度看板:** 模仿真实的科研甘特图和财务报表,充满形式主义的压迫感。
|
||||
### 5.1 核心资源循环
|
||||
**资金 (Money)** $\leftrightarrow$ **声望 (Reputation)**
|
||||
* **中间介质:** 【论文卡牌】。论文不再是分值,而是消耗品。
|
||||
|
||||
### 5.2 任务分类
|
||||
1. **学术探索 (产出论文):**
|
||||
* 玩家分配任务 $\rightarrow$ 学生工作 $\rightarrow$ 产出实体道具【C/B/A/S级 论文】。
|
||||
2. **基金申请 (消耗论文换钱/声望):**
|
||||
* **纵向基金 (BOSS战):** 每年固定触发。**强制消耗**特定等级的论文作为门票(如重点项目需 1篇S + 2篇A)。完成后获得巨额声望和资金。
|
||||
* **横向项目 (搞钱):** 随时可接。不消耗论文,只考验工程/体力。
|
||||
3. **举办会议 (全屏大招):**
|
||||
* 消耗巨资和全员时间,换取声望暴涨和全场“灵感Buff”。
|
||||
|
||||
### 5.3 署名分配 (The Authorship Game)
|
||||
* 每篇论文产出时,需分配 **一作、二作、通讯作者**。
|
||||
* 分配不均会导致贡献者产生【怨恨】(忠诚度暴跌,甚至举报导师)。
|
||||
|
||||
---
|
||||
|
||||
## 9. 开发路线 (Roadmap)
|
||||
## 6. 装备与设施系统 (Equipment)
|
||||
|
||||
1. **Demo (MVP):** 实现 10 回合流程。包含导师+学生,基础战斗,署名分配。验证“压力 vs 产出”的平衡。
|
||||
2. **Alpha:** 加入“劝退节点”和“博后/小老师”机制。完成道具系统。
|
||||
3. **Beta:** 完善“局外成长”和“校友录”。大量填充随机事件文案(玩梗)。
|
||||
装备分为 **通用类** 和 **学科专用类**。
|
||||
|
||||
### 6.1 设施 (放置在地图格子)
|
||||
* **通用:** 咖啡机 (回蓝)、NAS服务器 (防数据丢失)、白板墙 (灵感UP)。
|
||||
* **专用示例:**
|
||||
* *超低温冰箱 (生物):* 防止样本腐烂。
|
||||
* *RTX集群 (计算机):* 深度学习加速。
|
||||
* *彭博终端 (经济):* 数据获取Max。
|
||||
* *安乐椅 (哲学):* 躺着涨学术值。
|
||||
|
||||
### 6.2 个人装备 (拖拽给学生)
|
||||
* **通用:** 降噪耳机 (防干扰)、速效救心丸 (防猝死)、防脱洗发水 (减压)。
|
||||
* **专用示例:**
|
||||
* *移液枪 (生物):* 精准度UP。
|
||||
* *机械键盘 (计算机):* 效率UP,噪音UP。
|
||||
* *法槌 (法学):* 威严UP。
|
||||
* *登山靴 (环境):* 野外体力消耗减半。
|
||||
|
||||
---
|
||||
|
||||
## 10. 设计师备注 (Design Pillars)
|
||||
## 7. 地图与战斗机制 (Map & Action)
|
||||
|
||||
* **地图布局:** 实验室、机房、行政楼、图书馆、咖啡厅、野外采样点。
|
||||
* **战斗逻辑:**
|
||||
* 任务是怪物(有HP和Deadline)。
|
||||
* 学生是塔/兵(自动寻路攻击)。
|
||||
* 导师是英雄单位(补位/放技能)。
|
||||
* **突发事件:** 断电、设备爆炸、失恋请假、甲方改需求。
|
||||
|
||||
---
|
||||
|
||||
## 8. 肉鸽成长要素 (Roguelite Progression)
|
||||
|
||||
单局结束后,根据评分(科研分+传承分)获得点数,解锁局外加成:
|
||||
|
||||
1. **校友录 (Alumni Network):** 上一局培养的S级学生,变为本局的“人脉卡”。(如:直接捐赠一笔经费,或作为客座教授空降一回合)。
|
||||
2. **祖传代码/数据 (Legacy):** 开局自带部分研究进度。
|
||||
3. **职称保留:** 提高初始经费和导师的初始精力上限。
|
||||
|
||||
---
|
||||
|
||||
## 9. 美术与UI风格 (Art Direction)
|
||||
|
||||
* **风格:** 像素风 (Pixel Art) 。
|
||||
* **色调:**
|
||||
* *日常:* 冷色调荧光灯光(压抑)。
|
||||
* *Deadline临近:* 红色警报滤镜。
|
||||
* *成功:* 金色粒子特效。
|
||||
* **细节:**
|
||||
* 学生头顶有气泡(写代码、摸鱼、哭泣)。
|
||||
* 压力高时,学生形象会改变(秃头、黑眼圈、衣衫不整)。
|
||||
* **看板:** 模仿真实的科研甘特图,充满形式主义的压迫感。
|
||||
|
||||
---
|
||||
|
||||
## 10. 设计师结语 (Design Pillars)
|
||||
|
||||
* **讽刺性:** 每一个机制(如报销难、抢一作、横向当苦力)都应映射现实痛点。
|
||||
* **策略性:** 不只是堆数值,而是在“做学术”和“搞政治”之间做平衡。
|
||||
* **情感反馈:** 从初期的无助,到中期的纠结,再到后期的“屠龙少年终成恶龙”或“桃李满天下”的感动。
|
||||
|
||||
===
|
||||
|
||||
1. **痛苦即乐趣:** 玩家的快乐建立在解决混乱之上。不要害怕让玩家感到压力,那是游戏的灵魂。
|
||||
2. **人心的博弈:** 数值(论文篇数)只是表象,真正的内核是管理一群各怀心思的人(抢一作、想跳槽、想摸鱼)。
|
||||
3. **传承的感动:** 即使这一局失败了,看到上一局的学生在这一局发来感谢信并捐款,是给予玩家最大的正向情感反馈。
|
||||
@ -1,96 +0,0 @@
|
||||
# 最强导师 核心循环详细设计
|
||||
|
||||
## 1. 核心循环概览
|
||||
- 循环框架:单局30回合,回合=筹备→分配→执行→结算→事件→准备。局外Roguelite加成影响筹备与结算,核心张力在“压力 vs 产出 vs 署名博弈”。
|
||||
- 核心目标:满足阶段Boss/劝退节点要求,在30回合达成综合评分结局(S→D),并积累传承点与校友池。
|
||||
- 关键痛点:资金断裂、压力失控、署名冲突、人才流失;玩家通过技能、道具、光环管理风险。
|
||||
|
||||
## 2. 回合流程与数据流
|
||||
1) 筹备阶段
|
||||
- 刷新:经费/声望/算力/数据、学生与雇员池、年度任务池、Boss/劝退节点需求。
|
||||
- 决策:招聘/续约/解约、设施升级、道具采购、导师技能/形态预设。
|
||||
- 输出:本回合任务列表、队伍构成、资源预算、风险提示(压力、资金、Deadline)。
|
||||
2) 分配阶段
|
||||
- 操作:将任务卡放置在地图格(实验室/机房/行政楼/会议室等);编队学生/雇员;导师选择站位和形态(光环/亲自下场)。
|
||||
- 校验:任务破防需求 vs 队伍属性;Deadline与压力预估;经费/算力消耗锁定。
|
||||
3) 执行阶段(自走)
|
||||
- AI:单位依据偏好/属性匹配路径→任务节点;开始“攻击”工作量HP,受难度DEF与破防需求影响。
|
||||
- 实时:体力/压力/心情变化;突发事件(停电、设备坏、情绪崩);导师主动技能与道具即时介入;光环/Buff生效。
|
||||
4) 结算阶段
|
||||
- 任务结果:成功→掉落奖励包(经费/声望/算力/传承点);失败/超时→惩罚(声望扣、延期、压力暴涨)。
|
||||
- 署名分配:一作/通讯/挂名/合作分配,调整野心/忠诚/怨恨,记录贡献历史。
|
||||
- 状态更新:学生心情、压力、忠诚、野心、毕业进度;导师精力与光环冷却;设施损耗。
|
||||
5) 事件阶段
|
||||
- 触发:年度Boss考核、举报、分家事件、校友回馈、政治打压等。
|
||||
- 结构:前置条件 + 选项 + 即时/持续效果;可能改变资源、单位状态或解锁新任务。
|
||||
6) 准备阶段
|
||||
- 看板:产出、压力、财务、声望、队伍状态、风险提示。
|
||||
- 传承:累积传承点、校友池更新;提示下一回合目标与Boss需求。
|
||||
|
||||
## 3. 核心对象设计
|
||||
### 3.1 导师(玩家)
|
||||
- 形态:
|
||||
- Worker:高爆发输出,消耗体力,随职级成长衰减;用于早期/危机收割。
|
||||
- Boss:站位光环(类型随设施:实验室攻速、会议室回蓝、咖啡厅减压、机房散热),适合中后期指挥。
|
||||
- 资源:精力(技能消耗)、威望(谈判/政治判定)、压力抗性;随天赋树/传承提升。
|
||||
- 技能槽:主动技能有冷却与资源消耗,需可插事件管线(支持多人同步/排行对局)。
|
||||
- 成长:
|
||||
- 天赋树:人脉(初始经费/招生质量)、教案(精力上限/技能改造)、政治(事件判定、打压反制)。
|
||||
- 遗产:祖传代码库、关系网、校友援助触发率。
|
||||
|
||||
### 3.2 学生(基础单位)
|
||||
- 生命周期:硕3→博3→博延期;毕业触发去向事件(校友池加成/跳槽/举报)。
|
||||
- 属性:INT/STR/CHA/SAN;隐藏特质(DDL战士、代码洁癖、恋爱脑等)。
|
||||
- 状态机:工作→摸鱼→过劳/猝死→康复;压力阈值触发崩溃/离队;怨恨、忠诚、野心影响行为(删库/举报/回馈)。
|
||||
- 进阶:特质进化、署名历史影响未来;支持跨局“校友回归”事件。
|
||||
|
||||
### 3.3 高级雇员
|
||||
- 博后:短约3回合,高爆发高费用;标签“临时借调”不可继承;用于劝退节点。
|
||||
- 青年讲师:长期雇员,可带学生;野心 vs 忠诚竞争,触发分家事件(带走经费与学生);可签署分成/署名协议调节风险。
|
||||
|
||||
### 3.4 任务(Task Node)
|
||||
- 属性:HP=工作量,DEF=难度,Deadline,收益包(经费/声望/算力/传承点),标签(论文/项目/杂务/政治)。
|
||||
- 机制:破防需求(属性阈值/特质克制),多人协作加成/内卷惩罚,超时惩罚表。
|
||||
- 钩子:完成→署名UI;失败/超时→负面事件;多人模式可设“共享节点/竞速节点”。
|
||||
|
||||
### 3.5 署名分配
|
||||
- 槽位:一作/通讯/挂名/合作;收益权重映射声望、野心、忠诚、怨恨。
|
||||
- 规则:贡献排序 vs 手动调整;强行挂名提升全队压力;抢稿触发怨恨冷却。
|
||||
- 扩展:多人模式抢稿对抗;积分排行计入高质量一作数。
|
||||
|
||||
### 3.6 设施(地图格)
|
||||
- 类型:实验室/机房/行政楼/咖啡厅/会议室。
|
||||
- 升级:容量、舒适度、能耗/维护费;高阶解锁特殊槽(GPU集群、空调、人体工学椅)。
|
||||
- 风险:宕机、断电、设备损耗;行政楼高压事件;机房温度管理。
|
||||
- 扩展:多人共享校园、房间争夺/租赁;赛季装饰对排行展示。
|
||||
|
||||
### 3.7 资源与经济
|
||||
- 资源:经费、声望、算力/数据、压力(负向共享)。
|
||||
- 现金流:工资、维护、道具、项目拨款;资金断裂触发拖欠工资(忠诚清零)。
|
||||
- 扩展:排行榜多维评分(科研产出/净资产/压力控制/事件效率)。
|
||||
|
||||
### 3.8 事件系统
|
||||
- 类别:年度Boss、突发(停电/失恋)、关系(校友回馈/举报)、政治(评审打压)。
|
||||
- 结构:前置条件+选项+即时/持续效果;影响资源、单位状态、任务池。
|
||||
- 扩展:多人同步事件,赛季限定环境。
|
||||
|
||||
### 3.9 局外成长(Heritage)
|
||||
- 传承点:结算按科研+传承+资产评分;用于天赋解锁、初始资源、导师技能。
|
||||
- 校友录:上一局S级毕业生入池,生成援助事件;跨局羁绊与剧情分支。
|
||||
- 遗产:祖传代码库/装备/关系网,绑定课题标签提升下一局效率。
|
||||
|
||||
## 4. 系统接口与技术考量
|
||||
- AI调度:属性/特质/偏好→任务匹配→路径规划→工作循环→状态反馈(压力/心情)。
|
||||
- Buff系统:导师光环、设施加成、道具、事件统一Buff栈(叠加/刷新/禁同类);作用域支持个人/队伍/全局/联盟(为多人预留)。
|
||||
- 资源管理:技能/道具消耗精力/经费/算力;统一资源池接口,便于多人同步与排行统计。
|
||||
- 压力与UI反馈:全局压力条+个人SAN;阈值触发动画/行为;UI热区警报。
|
||||
|
||||
## 5. 扩展性方案
|
||||
- 积分排行:多维评分(科研、一作质量、资金净值、压力控制、事件响应);赛季标签化任务/事件,限定加成/禁用;上传周榜。
|
||||
- 多结局:回合30读取综合评分与关键事件标记(举报成功/分家次数/校友捐赠)映射 S→D,含隐藏结局(法外狂徒/慈善家)。
|
||||
- 多人玩法:共享或并行校园;节点竞速/抢稿;交易学生/设备/数据;压力扩散;资源市场动态定价;光环/Buff支持队伍/联盟/敌对作用域。
|
||||
|
||||
## 6. 落地优先级(聚焦核心循环)
|
||||
1) 单人六步回合循环可玩:导师/学生/任务/署名四大对象完整流转。
|
||||
2) 压力系统、突发事件、设施光环,验证“压力 vs 产出”张力。
|
||||
3) 预留接口:任务/事件标签化、Buff作用域、结算多维统计,为排行与多人对抗埋点。
|
||||
@ -1,100 +0,0 @@
|
||||
# MVP 详细设计文档:最强导师 (The Apex Mentor)
|
||||
|
||||
## 1. 概述
|
||||
本 MVP 旨在验证游戏的核心循环:**任务分发 -> 学生自动工作 -> 资源结算 -> 压力/状态管理**。
|
||||
范围仅涵盖设计文档中的“第一阶段:青椒求生”(前 10 回合)。
|
||||
|
||||
## 2. 核心循环 (Core Loop)
|
||||
|
||||
游戏以“回合”(Turn)为单位,每个回合代表一年(或一个学期)。
|
||||
回合内流程如下:
|
||||
|
||||
1. **准备阶段 (Planning Phase)**
|
||||
* **时间暂停**。
|
||||
* 玩家查看当前资源(经费、声望)。
|
||||
* 玩家查看现有学生状态(心情、属性)。
|
||||
* 玩家接收新任务(课题/论文)并将其分配给具体的设施(如实验室工位)。
|
||||
* 玩家使用经费购买/升级设施或道具。
|
||||
|
||||
2. **执行阶段 (Execution Phase)**
|
||||
* **时间流动**(可视化的几天/几周)。
|
||||
* 学生根据 AI 逻辑自动寻找任务进行工作(扣减任务 HP)。
|
||||
* 学生各项数值变化(压力上升、体力下降)。
|
||||
* 导师(玩家 Avatar)在地图上移动,使用技能(如“画饼”、“PUA”)干预学生状态。
|
||||
* 突发事件触发(如“电脑蓝屏”),需要导师立刻前往处理。
|
||||
|
||||
3. **结算阶段 (Review Phase)**
|
||||
* 回合结束(Deadline 到达)。
|
||||
* 计算完成的任务:获得声望、经费。
|
||||
* 计算未完成的任务:扣除声望、经费。
|
||||
* 支付学生工资、维护费。
|
||||
* 结算学生状态(是否崩溃/退学/毕业)。
|
||||
* 显示本回合报表。
|
||||
|
||||
## 3. 核心对象设计 (Core Object Design)
|
||||
|
||||
### 3.1 全局管理器 (GameManager)
|
||||
* **职责**:维护全局状态、回合流转、全局资源。
|
||||
* **属性**:
|
||||
* `CurrentTurn` (int): 当前回合数。
|
||||
* `Phase` (Enum): Planning / Execution / Review。
|
||||
* `GlobalResources` (Object): 包含 Money, Reputation, ResearchPoints。
|
||||
* **方法**:
|
||||
* `StartTurn()`: 进入准备阶段。
|
||||
* `StartExecution()`: 开始执行阶段。
|
||||
* `EndTurn()`: 触发结算。
|
||||
|
||||
### 3.2 导师 (Mentor / Player)
|
||||
* **职责**:玩家在场景中的化身,提供 Buff 和技能。
|
||||
* **属性**:
|
||||
* `Energy` (int): 精力值,用于释放技能。
|
||||
* `Position` (Vector2): 地图位置。
|
||||
* `Skills` (List): 拥有的技能列表。
|
||||
* **技能示例**:
|
||||
* `Inspire`: 消耗精力,范围内学生工作效率 +50%,持续 5秒。
|
||||
* `MicroManage`: 消耗精力,立刻减少某任务 5% 剩余工作量,增加学生压力。
|
||||
|
||||
### 3.3 学生 (Student)
|
||||
* **职责**:基础工作单位,具有自主 AI。
|
||||
* **扩展属性** (继承自现有 `Student.cs`):
|
||||
* **Attributes (能力值)**: `Intelligence` (智力), `Strength` (体力), `Expression` (表达).
|
||||
* **Status (状态值)**: `Sanity` (SAN值/抗压), `Stamina` (当前体力), `Loyalty` (忠诚度).
|
||||
* **Traits (特质)**: List<Trait> (如 "NightOwl": 晚上效率高).
|
||||
* **状态机 (FSM)**:
|
||||
* `Idle`: 无任务或休息中。
|
||||
* `Working`: 在工位上对任务造成伤害。
|
||||
* `Resting`: 在咖啡厅/宿舍恢复 Sanity/Stamina。
|
||||
* `Breakdown`: 崩溃状态,无法工作,需导师干预。
|
||||
|
||||
### 3.4 任务 (Task)
|
||||
* **职责**:地图上的“怪物”,需要被学生“击败”。
|
||||
* **属性**:
|
||||
* `TotalWorkload` (float): 总工作量 (HP)。
|
||||
* `CurrentProgress` (float): 当前进度。
|
||||
* `Type` (Enum): Paper (论文), Project (项目), Admin (杂务).
|
||||
* `Difficulty` (float): 减伤系数,需要特定属性(如智力)对抗。
|
||||
* `Deadline` (int): 剩余回合数。
|
||||
* `Rewards` (Resource): 完成奖励。
|
||||
|
||||
### 3.5 实验室/地图 (Lab)
|
||||
* **职责**:容器,管理设施和路径。
|
||||
* **扩展**:
|
||||
* 需支持从 `GameManager` 获取设施列表。
|
||||
* 设施 (Facility) 需关联 Task(任务绑定到设施上,学生去设施工作)。
|
||||
|
||||
## 4. 扩展性设计 (Scalability)
|
||||
|
||||
* **IAgent 接口**:学生、导师、后续的“博后”都实现此接口,方便统一管理行为。
|
||||
* **EventSystem**:使用观察者模式(已有的 `TimelineType` 可扩展)处理突发事件。
|
||||
* **SaveSystem**:所有核心数据(Student Data, Task Data)需可序列化,支持 SL 大法和 Roguelite 继承。
|
||||
|
||||
## 5. MVP 开发计划 (脚手架)
|
||||
|
||||
我们将创建以下脚本结构:
|
||||
|
||||
* `scripts/Core/GameLoop.cs`: 处理回合流程。
|
||||
* `scripts/Domain/Task.cs`: 任务数据结构。
|
||||
* `scripts/Domain/Mentor.cs`: 导师逻辑。
|
||||
* `scripts/Domain/StudentData.cs`: 学生数值模型(与表现层 `Student.cs` 分离或集成)。
|
||||
|
||||
---
|
||||
153
docs/任务与经济系统.md
Normal file
153
docs/任务与经济系统.md
Normal file
@ -0,0 +1,153 @@
|
||||
|
||||
这是一个非常扎实且符合学术界现实逻辑的改进。你将任务分为了**“KPI考核(被动/强制)”**和**“实验室运营(主动/自选)”**两大类,并明确了**“论文作为货币”**去兑换**“纵向基金”**的核心循环。
|
||||
|
||||
以下是基于你的构思,结合之前设计的“自走棋+模拟经营”玩法的深度细化方案。
|
||||
|
||||
---
|
||||
|
||||
# 最强导师:任务系统设计 v3.0
|
||||
|
||||
## 1. 任务体系架构 (Task Architecture)
|
||||
|
||||
任务系统现在分为两条并行的轨道:
|
||||
* **轨道 A:生涯考核 (The Tenure Track)** - 系统强制分派,决定胜负。
|
||||
* **轨道 B:项目课题 (The Lab Projects)** - 玩家自主经营,决定资源产出。
|
||||
|
||||
---
|
||||
|
||||
## 2. 强制任务:生涯考核 (System Mandates)
|
||||
|
||||
这类任务代表学校、学院或教育部下达的指标。
|
||||
|
||||
### 2.1 目标型任务 (Milestones) - 挂机/检测类
|
||||
* **定义:** 不需要派人去“打”,而是检测当前状态。
|
||||
* **UI表现:** 屏幕右侧的“考核进度条”或年度看板。
|
||||
* **机制:**
|
||||
* **例子:** “三年内发表 5 篇 SCI”、“培养 2 名博士毕业”、“团队总经费达到 100万”。
|
||||
* **进度提示:** 实时显示 `当前值 / 目标值`。如果进度落后于时间线(如第2年了才完成10%),数字变红并闪烁报警。
|
||||
* **惩罚:** 考核期结束未达标 $\rightarrow$ 扣除巨额声望/降职/甚至 Game Over。
|
||||
|
||||
### 2.2 事务型任务 (Administrative Chores) - 干扰类
|
||||
* **定义:** 系统随机扔进地图的“杂兵”。如果不处理会产生负面光环。
|
||||
* **机制:**
|
||||
* **例子:** “填写年度报表”、“本科生期末监考”、“实验室安全检查”。
|
||||
* **操作:** 必须分配人员(通常是低级学生或行政人员)去处理。
|
||||
* **产出:** 极低(少量资金或仅仅是免除惩罚)。
|
||||
* **策略意义:** 消耗玩家的人力(占用人口),打断科研节奏。
|
||||
|
||||
---
|
||||
|
||||
## 3. 自选任务:项目课题 (Lab Projects)
|
||||
|
||||
这是玩家主要的玩法来源。玩家在“任务池/课题库”中选择卡牌,放置在地图设施上,然后分配学生去攻克。
|
||||
|
||||
### 3.1 学术探索 (Academic Exploration) - **“刷材料”**
|
||||
* **核心逻辑:** 投入算力/体力 $\rightarrow$ 产出**【论文草稿】**。
|
||||
* **创建流程:**
|
||||
1. **选方向:** 基于所选学科(如:深度学习、基因编辑)。
|
||||
2. **定难度:**
|
||||
* **简单 (Water):** 产出 C/B 类论文,速度快,适合硕士练手。
|
||||
* **中等 (Standard):** 产出 B/A 类论文,标准难度。
|
||||
* **困难 (Hardcore):** 产出 A/S 类论文,极高工作量,容易失败。
|
||||
* **未知 (Black Box):** **赌博机制**。
|
||||
* *机制:* 看不见进度条,看不见HP。
|
||||
* *结果:* 可能是惊世骇俗的 S+ (Nature/Science),也可能是完全错误的死胡同 (浪费所有时间,产出为0)。
|
||||
* **产出物:** 此时产出的不是直接的声望,而是**实体道具卡【论文】**。
|
||||
* *用途:* 论文卡是申请“纵向基金”的消耗材料(门票)。
|
||||
|
||||
### 3.2 基金申请 (Grant Application) - **“打BOSS”**
|
||||
|
||||
#### A. 纵向基金 (National Grants) - 强制性机遇
|
||||
* **触发:** 每年固定时间(如3月国自然申请季)系统弹窗。
|
||||
* **选择权:** 玩家可选择“放弃”(无惩罚但无收益)或“申请”。
|
||||
* **门票机制:** 申请必须**消耗**库存中的【论文卡】。
|
||||
* *青基:* 消耗 1 篇 B 类论文。
|
||||
* *面上:* 消耗 2 篇 A 类论文。
|
||||
* *重点:* 消耗 1 篇 S 类 + 2 篇 A 类。
|
||||
* **战斗过程:** 设定了 DDL 的高强度攻坚战。
|
||||
* *Input:* 需要【笔杆子】(写本子)+【大忽悠】(疏通关系)+ 导师亲自坐镇。
|
||||
* *Output:* **巨额经费** + **学术声望**(硬通货)。
|
||||
|
||||
#### B. 横向项目 (Industry Projects) - 搞钱神器
|
||||
* **触发:** 随时可在“企业合作处”领取。
|
||||
* **学科差异化设计:**
|
||||
* **理工科 (CS/Eng):** **交付型**。
|
||||
* *目标:* 提交代码/样品。
|
||||
* *机制:* 类似于“塔防”,甲方需求不断涌来(Bug波次),必须消灭干净。不依赖论文,只看【工程】属性。
|
||||
* **生化环材:** **检测型**。
|
||||
* *目标:* 跑大量数据。
|
||||
* *机制:* 纯体力活,消耗大量耗材费。
|
||||
* **人文社科:** **咨询型**。
|
||||
* *目标:* 写报告。
|
||||
* *机制:* 消耗心情值(伺候甲方),依赖【表达/忽悠】属性。
|
||||
* **产出:** 只有**资金**,基本无声望,甚至可能因为过度做横向而降低学术评价(被鄙视)。
|
||||
|
||||
### 3.3 举办学术会议 (Hosting Conference) - **“全屏大招”**
|
||||
这不是一个常规任务,而是一个**“仪式 (Ritual)”**。
|
||||
* **投入:** 消耗大量资金 + 占用全员人力(布置会场、接待)。
|
||||
* **过程:** 持续 1-2 个回合。期间所有科研活动停止(因为都在开会)。
|
||||
* **产出:**
|
||||
1. **声望暴涨:** 直接获得大量 XP。
|
||||
2. **全场 Buff (学术交流):** 会议结束后 5 回合内,所有人的【灵感/学术】属性 +50%(因为听了大佬报告受到了启发)。
|
||||
3. **挖掘人才:** 会议期间有概率刷新出 SSR 级别的学生/小老师供招募。
|
||||
|
||||
---
|
||||
|
||||
## 4. 人员分配与UI交互 (Assignment UI)
|
||||
|
||||
当玩家点击一个“需要分配人员”的任务(如:课题、横向、写本子)时,进入**战术分配模式**。
|
||||
|
||||
### 4.1 交互流程
|
||||
1. **任务详情弹窗:**
|
||||
* 左侧:任务要求(HP、抗性、DDL、推荐属性)。
|
||||
* 右侧:人员槽位(默认空槽,数量有限,如 0/3)。
|
||||
2. **筛选与拖拽:**
|
||||
* 下方显示学生卡牌列表。
|
||||
* **智能排序:** 系统自动根据任务需求对学生进行排序。
|
||||
* *例如:任务需求【工程】,列表自动把【工程】属性高的学生排在前面,并高亮显示。*
|
||||
3. **属性预览(关键点):**
|
||||
* 当玩家按住一名学生拖拽到槽位上方(未松手)时:
|
||||
* 任务的“预计完成时间”会发生变化(如:从“无法完成”变成“剩 3 回合”)。
|
||||
* 任务的“成功率”条会涨动。
|
||||
* **羁绊提示:** 如果放入的学生与槽位内已有学生能组成羁绊(如“双代码工”),两者之间会出现连线特效,并弹出 `效率 UP!` 文字。
|
||||
4. **动态增删:**
|
||||
* 任务开始后,玩家随时可以点击任务,把人**拔出来**(去救火其他任务),或者把新人**塞进去**。
|
||||
* *代价:* 频繁换人会导致任务进度条有短暂的“交接惩罚”(冻结 2 秒)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 核心循环图解
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Start[招募学生] --> Assign[分配: 学术探索]
|
||||
Assign --> Work(学生工作/消耗资金)
|
||||
|
||||
Work -->|产出| Paper[论文卡牌]
|
||||
|
||||
Paper -->|消耗| Vertical[申请纵向基金 强制/DDL]
|
||||
Paper -->|积累| Tenure[完成考核指标 强制]
|
||||
|
||||
Vertical -->|成功| Prestige[声望] & Money[巨额经费]
|
||||
|
||||
Money -->|维持| Salary[发工资/维护设备]
|
||||
Money -->|投入| Conference[举办会议]
|
||||
|
||||
Prestige -->|提升| RecruitLevel[生源质量提升]
|
||||
RecruitLevel --> Start
|
||||
|
||||
subgraph 支线: 搞钱
|
||||
Money_Low[没钱了?] --> Horizontal[接横向项目]
|
||||
Horizontal -->|产出| Money
|
||||
end
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 设计亮点总结
|
||||
|
||||
1. **论文实体化:** 将论文从一个抽象的分数变成了**“弹药”**。玩家需要囤积论文来应对每年的基金申请Boss战,这增加了策略厚度(是现在就发个B类论文救急,还是憋个S类去申重点项目?)。
|
||||
2. **学科差异化横向:** 让选择不同专业的玩家在“搞钱”这件事上有完全不同的体验(码农写代码 vs 文科写公文)。
|
||||
3. **会议作为大招:** 赋予了资金后期的用途,不仅仅是数值溢出,而是转化为全队爆发的手段。
|
||||
4. **考核的压迫感:** 始终悬在头顶的“非升即走”进度条,完美还原了青椒的焦虑感。
|
||||
|
||||
375
docs/学科与流派系统.md
Normal file
375
docs/学科与流派系统.md
Normal file
@ -0,0 +1,375 @@
|
||||
这是一个非常庞大且有趣的数据库构建工作。为了确保生成的论文题目既有“学术味”又有“随机的荒谬感”,我挑选了各个学科中**最高频、最典型、甚至有些被滥用**的词汇。
|
||||
|
||||
同时,针对每个学科的设计机制(Buff),我结合了之前的“资源循环(资金、声望、算力、压力)”和“自走棋属性”进行了差异化设计。
|
||||
|
||||
---
|
||||
|
||||
### 全学科 Mad Libs 词库与 Buff 设计
|
||||
|
||||
#### 1. 生物学 (Biology)
|
||||
**Buff:【移液枪神 (Pipette Master)】**
|
||||
* **效果:** 实验类任务(高资金消耗型)的成功率 +15%,但学生体力消耗增加 20%(搬砖累)。
|
||||
* **描述:** 只要手速够快,细胞就追不上我老化的速度。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 高通量筛选下的 (High-throughput) | 脱发基因 (Alopecia gene) | 靶向治疗 (Targeted therapy) |
|
||||
| CRISPR编辑后的 (CRISPR-edited) | 癌细胞 (Cancer cell) | 通路抑制 (Pathway inhibition) |
|
||||
| 单细胞精度的 (Single-cell) | 肠道菌群 (Gut microbiota) | 相互作用机制 (Interaction mechanism) |
|
||||
| 异位表达的 (Ectopic expression) | 模式小鼠 (Model mice) | 敲除验证 (Knockout validation) |
|
||||
| 翻译后修饰的 (Post-translational) | 膜蛋白 (Membrane protein) | 晶体结构解析 (Structure analysis) |
|
||||
| 代谢重编程的 (Metabolic) | 干细胞 (Stem cell) | 定向分化 (Directed differentiation) |
|
||||
| 远古病毒来源的 (Viral origin) | 线粒体 (Mitochondria) | 功能富集 (Functional enrichment) |
|
||||
| 跨物种保守的 (Conserved) | 信号通路 (Signaling pathway) | 免疫逃逸 (Immune escape) |
|
||||
| 药物诱导的 (Drug-induced) | 肿瘤微环境 (Tumor microenv) | 测序分析 (Sequencing analysis) |
|
||||
| 表观遗传修饰的 (Epigenetic) | 非编码RNA (ncRNA) | 沉默技术 (Silencing) |
|
||||
| 昼夜节律调控的 (Circadian) | 神经突触 (Synapse) | 荧光标记 (Fluorescent labeling) |
|
||||
| 宿主特异性的 (Host-specific) | 噬菌体 (Bacteriophage) | 侵染模型 (Infection model) |
|
||||
| 自噬依赖的 (Autophagy-dependent) | 炎症因子 (Inflammatory factor) | 风暴抑制 (Storm suppression) |
|
||||
| 基因组水平的 (Genomic) | 端粒酶 (Telomerase) | 活性检测 (Activity assay) |
|
||||
| 体外重组的 (Recombinant) | 拟南芥 (Arabidopsis) | 杂交育种 (Hybrid breeding) |
|
||||
|
||||
#### 2. 化学 (Chemistry)
|
||||
**Buff:【炼金术士 (Alchemist)】**
|
||||
* **效果:** 有 10% 的概率在不消耗资金的情况下完成一回合实验,但有 5% 的概率发生“爆炸”(任务进度倒退 10%,学生受伤)。
|
||||
* **描述:** 提纯靠柱子,过柱子靠命。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 手性诱导的 (Chiral) | 金属有机框架 (MOF) | 全合成 (Total synthesis) |
|
||||
| 原子层沉积的 (ALD) | 钙钛矿 (Perovskite) | 光催化降解 (Photocatalysis) |
|
||||
| 仿生结构的 (Biomimetic) | 石墨烯 (Graphene) | 自组装 (Self-assembly) |
|
||||
| 缺陷工程调控的 (Defect-engineered) | 单原子催化剂 (Single-atom) | 析氢反应 (HER efficiency) |
|
||||
| 溶剂热合成的 (Solvothermal) | 高分子聚合物 (Polymer) | 交联改性 (Cross-linking) |
|
||||
| 激发态的 (Excited state) | 荧光探针 (Fluorescent probe) | 灵敏检测 (Sensitive detection) |
|
||||
| 固相烧结的 (Solid-state) | 稀土元素 (Rare earth) | 掺杂改性 (Doping) |
|
||||
| 表面修饰的 (Surface-modified) | 锂离子电池 (Li-ion battery) | 循环寿命优化 (Cycle life opt) |
|
||||
| 超分子的 (Supramolecular) | 碳纳米管 (CNT) | 导电增强 (Conductivity enhancement) |
|
||||
| 绿色合成的 (Green synthesis) | 离子液体 (Ionic liquid) | 萃取分离 (Extraction) |
|
||||
| 原位生长的 (In-situ growth) | 气凝胶 (Aerogel) | 吸附性能 (Adsorption property) |
|
||||
| 空间位阻效应的 (Steric hindrance) | 自由基 (Free radical) | 链式反应 (Chain reaction) |
|
||||
| 亲水/疏水特性的 (Hydrophilic) | 表面活性剂 (Surfactant) | 乳化作用 (Emulsification) |
|
||||
| 价态可变的 (Valence-variable) | 过渡金属 (Transition metal) | 氧化还原 (Redox) |
|
||||
| 纳米尺度的 (Nanoscale) | 量子点 (Quantum dot) | 发光调控 (Luminescence control) |
|
||||
|
||||
#### 3. 环境科学 (Environment)
|
||||
**Buff:【绿色通道 (Green Pass)】**
|
||||
* **效果:** 申请政府类基金(纵向项目)成功率 +20%,且进行野外采样任务时,学生心情下降速度减半。
|
||||
* **描述:** 只要带上“可持续发展”,本子就成功了一半。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 人类活动干扰下的 (Anthropogenic) | 活性污泥 (Activated sludge) | 降解机理 (Degradation mechanism) |
|
||||
| 全球变暖背景下的 (Global warming) | 微塑料 (Microplastic) | 迁移转化 (Migration & transformation) |
|
||||
| 雾霾天气中的 (Haze weather) | PM2.5 (Particulate matter) | 源解析 (Source apportionment) |
|
||||
| 富营养化的 (Eutrophic) | 蓝藻水华 (Algal bloom) | 爆发预测 (Outbreak prediction) |
|
||||
| 重金属污染的 (Heavy metal) | 土壤修复 (Soil remediation) | 植物提取 (Phytoextraction) |
|
||||
| 碳中和视域下的 (Carbon neutral) | 碳足迹 (Carbon footprint) | 评估模型 (Assessment model) |
|
||||
| 地下水渗透的 (Groundwater) | 抗生素抗性基因 (ARGs) | 传播阻断 (Transmission block) |
|
||||
| 垃圾填埋场的 (Landfill) | 渗滤液 (Leachate) | 无害化处理 (Harmless treatment) |
|
||||
| 生态脆弱区的 (Ecologically fragile) | 生物多样性 (Biodiversity) | 保护策略 (Conservation strategy) |
|
||||
| 难降解的 (Persistent) | 有机污染物 (POPs) | 催化氧化 (Catalytic oxidation) |
|
||||
| 城市热岛效应的 (Heat island) | 绿色屋顶 (Green roof) | 缓解效益 (Mitigation benefit) |
|
||||
| 长期暴露下的 (Long-term exposure) | 内分泌干扰物 (EDCs) | 毒理效应 (Toxicological effect) |
|
||||
| 循环经济模式下的 (Circular economy) | 电子废弃物 (E-waste) | 资源化利用 (Recycling) |
|
||||
| 大气沉降的 (Atmospheric deposition) | 氮磷负荷 (N/P load) | 时空分布 (Spatiotemporal dist) |
|
||||
| 极端气候事件的 (Extreme weather) | 生态系统服务 (Ecosystem service) | 价值评估 (Valuation) |
|
||||
|
||||
#### 4. 材料科学 (Materials)
|
||||
**Buff:【灌水大师 (Paper Mill)】**
|
||||
* **效果:** 论文产出速度 +25%,但每篇论文被引用率(声望转化率)降低 10%。
|
||||
* **描述:** 万物皆可掺杂石墨烯。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 柔性可穿戴的 (Flexible wearable) | 电子皮肤 (E-skin) | 传感响应 (Sensing response) |
|
||||
| 自修复功能的 (Self-healing) | 水凝胶 (Hydrogel) | 伤口敷料 (Wound dressing) |
|
||||
| 仿生荷叶结构的 (Lotus-inspired) | 超疏水涂层 (Superhydrophobic) | 防污自洁 (Self-cleaning) |
|
||||
| 4D打印技术的 (4D printing) | 形状记忆合金 (Shape memory alloy) | 变形控制 (Deformation control) |
|
||||
| 界面工程调控的 (Interface engineering) | 固态电解质 (Solid electrolyte) | 离子电导率 (Ionic conductivity) |
|
||||
| 带隙可调的 (Bandgap tunable) | 半导体 (Semiconductor) | 光电探测 (Photodetection) |
|
||||
| 非晶态的 (Amorphous) | 金属玻璃 (Metallic glass) | 塑性增强 (Plasticity enhancement) |
|
||||
| 异质结界面的 (Heterojunction) | 二维材料 (2D materials) | 电荷转移 (Charge transfer) |
|
||||
| 纳米多孔的 (Nanoporous) | 骨支架 (Bone scaffold) | 组织工程 (Tissue engineering) |
|
||||
| 热电优值高的 (High ZT) | 热电材料 (Thermoelectric) | 废热回收 (Waste heat recovery) |
|
||||
| 智能响应型的 (Smart responsive) | 液晶弹性体 (Liquid crystal) | 致动器设计 (Actuator design) |
|
||||
| 高熵合金体系的 (High-entropy) | 固溶体 (Solid solution) | 强韧化机制 (Strengthening) |
|
||||
| 生物相容性的 (Biocompatible) | 纳米载体 (Nanocarrier) | 药物释放 (Drug delivery) |
|
||||
| 拓扑绝缘体的 (Topological) | 表面态 (Surface state) | 量子输运 (Quantum transport) |
|
||||
| 磁性纳米粒子的 (Magnetic) | 靶向成像 (Targeting imaging) | 热疗效果 (Hyperthermia) |
|
||||
|
||||
#### 5. 基础医学 (Basic Medicine)
|
||||
**Buff:【国自然宠儿 (NIH Favorite)】**
|
||||
* **效果:** 基金申请成功后,获得的资金量 +30%。
|
||||
* **描述:** 只要跟“癌症”或“干细胞”沾边,钱就不是问题。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 临床预后相关的 (Prognosis-related) | 肿瘤干细胞 (Cancer stem cell) | 耐药机制 (Drug resistance) |
|
||||
| 外泌体包裹的 (Exosome-encapsulated) | miRNA (MicroRNA) | 诊断标志物 (Biomarker) |
|
||||
| 免疫检查点的 (Immune checkpoint) | PD-1/PD-L1 (PD-1) | 联合治疗 (Combo therapy) |
|
||||
| 铁死亡诱导的 (Ferroptosis) | 活性氧 (ROS) | 细胞毒性 (Cytotoxicity) |
|
||||
| 肠-脑轴介导的 (Gut-brain axis) | 抑郁症 (Depression) | 行为学改变 (Behavioral change) |
|
||||
| 炎症小体激活的 (Inflammasome) | 巨噬细胞极化 (Macrophage polarization) | 炎症调控 (Inflammation reg) |
|
||||
| 缺血再灌注损伤的 (Ischemia-reperfusion) | 心肌细胞 (Cardiomyocyte) | 保护作用 (Protective effect) |
|
||||
| 血管生成依赖的 (Angiogenesis) | 转移灶 (Metastasis) | 侵袭能力 (Invasion ability) |
|
||||
| 神经退行性病变的 (Neurodegenerative) | β-淀粉样蛋白 (A-beta) | 聚集抑制 (Aggregation inhibition) |
|
||||
| 长新冠后遗症的 (Long COVID) | 细胞因子风暴 (Cytokine storm) | 免疫调节 (Immunomodulation) |
|
||||
| 骨质疏松模型的 (Osteoporosis) | 成骨/破骨细胞 (Osteo/Clast) | 平衡重构 (Balance remodeling) |
|
||||
| 代谢综合征伴随的 (Metabolic syndrome) | 胰岛素抵抗 (Insulin resistance) | 信号转导 (Signal transduction) |
|
||||
| 自身免疫性的 (Autoimmune) | T细胞耗竭 (T cell exhaustion) | 功能恢复 (Function recovery) |
|
||||
| 基因多态性的 (Polymorphism) | 易感性 (Susceptibility) | 关联分析 (Association study) |
|
||||
| 转化医学视角的 (Translational) | 靶点 (Target) | 药物筛选 (Drug screening) |
|
||||
|
||||
#### 6. 计算机 (Computer Science)
|
||||
**Buff:【超频运算 (Overclock)】**
|
||||
* **效果:** 机房设施提供的算力加成翻倍。AI类任务(高算力消耗型)进度 +20%。
|
||||
* **描述:** 显卡在燃烧,论文在生成。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 端到端学习的 (End-to-end) | 卷积神经网络 (CNN) | 图像分类 (Image classification) |
|
||||
| 联邦学习框架下的 (Federated learning) | 隐私保护 (Privacy protection) | 数据共享 (Data sharing) |
|
||||
| 基于注意力机制的 (Attention-based) | Transformer (Transformer) | 自然语言处理 (NLP tasks) |
|
||||
| 边缘计算环境中的 (Edge computing) | 任务卸载 (Task offloading) | 延迟优化 (Latency optimization) |
|
||||
| 面向元宇宙的 (Metaverse-oriented) | 数字孪生 (Digital twin) | 虚实交互 (Virtual-real interaction) |
|
||||
| 区块链赋能的 (Blockchain-enabled) | 智能合约 (Smart contract) | 信任机制 (Trust mechanism) |
|
||||
| 零知识证明的 (Zero-knowledge) | 身份认证 (Authentication) | 安全协议 (Security protocol) |
|
||||
| 自监督学习的 (Self-supervised) | 预训练模型 (Pre-trained model) | 下游微调 (Fine-tuning) |
|
||||
| 异构计算平台的 (Heterogeneous) | 调度算法 (Scheduling algo) | 负载均衡 (Load balancing) |
|
||||
| 面向6G通信的 (6G-oriented) | 太赫兹波 (Terahertz) | 频谱效率 (Spectral efficiency) |
|
||||
| 可解释性AI的 (Explainable AI) | 黑盒模型 (Black-box model) | 决策可视化 (Visualization) |
|
||||
| 知识图谱驱动的 (Knowledge graph) | 推荐系统 (RecSys) | 个性化推荐 (Personalized rec) |
|
||||
| 云原生架构的 (Cloud-native) | 微服务 (Microservices) | 容器编排 (Container orchestration) |
|
||||
| 量子霸权下的 (Quantum supremacy) | 量子纠缠 (Quantum entanglement) | 密钥分发 (Key distribution) |
|
||||
| 软硬协同设计的 (Hardware-software co-design) | 神经网络加速器 (NPU) | 能效比提升 (Energy efficiency) |
|
||||
|
||||
#### 7. 数学 (Mathematics)
|
||||
**Buff:【粉笔与黑板 (Chalk & Talk)】**
|
||||
* **效果:** 任务完全不消耗资金(0成本),但对“学术”属性要求极高,且一旦中断进度会大幅回退(思路断了)。
|
||||
* **描述:** 给我一支笔,我能算出一个宇宙。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 非线性的 (Nonlinear) | 黎曼流形 (Riemannian manifold) | 几何结构 (Geometric structure) |
|
||||
| 随机微分的 (Stochastic differential) | 布朗运动 (Brownian motion) | 存在性证明 (Existence proof) |
|
||||
| 高维空间中的 (High-dimensional) | 拓扑不变量 (Topological invariant) | 同调群计算 (Homology group) |
|
||||
| 算子代数上的 (Operator algebra) | 希尔伯特空间 (Hilbert space) | 谱分析 (Spectral analysis) |
|
||||
| 数论视域下的 (Number theoretic) | 素数分布 (Prime distribution) | 猜想逼近 (Conjecture approx) |
|
||||
| 混沌系统的 (Chaotic) | 奇异吸引子 (Strange attractor) | 分形维数 (Fractal dimension) |
|
||||
| 偏微分方程的 (PDE) | 边界值问题 (Boundary value) | 正则性估计 (Regularity est) |
|
||||
| 组合图论中的 (Combinatorial) | 拉姆齐数 (Ramsey number) | 极值问题 (Extremal problem) |
|
||||
| 范畴论视角的 (Categorical) | 态射 (Morphism) | 函子构造 (Functor construction) |
|
||||
| 变分法中的 (Variational) | 极小曲面 (Minimal surface) | 稳定性分析 (Stability analysis) |
|
||||
| 遍历理论下的 (Ergodic) | 测度保持变换 (Measure-preserving) | 混合性 (Mixing property) |
|
||||
| 李群与李代数的 (Lie Group) | 表示论 (Representation) | 结构分类 (Classification) |
|
||||
| 模糊逻辑的 (Fuzzy logic) | 隶属度函数 (Membership function) | 决策优化 (Decision optimization) |
|
||||
| 自适应网格的 (Adaptive mesh) | 有限元方法 (Finite element) | 误差控制 (Error control) |
|
||||
| 密码学中的 (Cryptographic) | 椭圆曲线 (Elliptic curve) | 离散对数 (Discrete logarithm) |
|
||||
|
||||
#### 8. 物理学 (Physics)
|
||||
**Buff:【第一性原理 (First Principles)】**
|
||||
* **效果:** 攻克S级(最高难度)任务时,有 5% 的概率直接“顿悟”完成,但平时压力增长 +20%。
|
||||
* **描述:** 上帝不掷骰子,但我们掷。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 量子纠缠态的 (Entangled) | 自旋波 (Spin wave) | 量子隐形传态 (Teleportation) |
|
||||
| 拓扑超导的 (Topological SC) | 马约拉纳费米子 (Majorana fermion) | 编织操作 (Braiding) |
|
||||
| 暗物质候选的 (Dark matter) | 轴子 (Axion) | 探测界限 (Detection limit) |
|
||||
| 引力波探测中的 (Gravitational wave) | 黑洞并合 (Black hole merger) | 信号提取 (Signal extraction) |
|
||||
| 玻色-爱因斯坦凝聚的 (BEC) | 冷原子气体 (Cold atoms) | 相变动力学 (Phase transition) |
|
||||
| 强关联体系的 (Strongly correlated) | 莫特绝缘体 (Mott insulator) | 金属-绝缘体转变 (MIT) |
|
||||
| 飞秒激光诱导的 (Femtosecond laser) | 等离子体尾波 (Plasma wakefield) | 电子加速 (Electron acceleration) |
|
||||
| 弦论背景下的 (String theory) | 全息对偶 (Holographic duality) | AdS/CFT对应 (AdS/CFT) |
|
||||
| 纳米光子学的 (Nanophotonics) | 超材料 (Metamaterial) | 负折射率 (Negative refraction) |
|
||||
| 复杂网络视角的 (Complex network) | 同步现象 (Synchronization) | 临界行为 (Critical behavior) |
|
||||
| 高能粒子对撞的 (High-energy) | 希格斯玻色子 (Higgs boson) | 衰变通道 (Decay channel) |
|
||||
| 软物质物理的 (Soft matter) | 活性胶体 (Active colloid) | 自驱动运动 (Self-propulsion) |
|
||||
| 宇宙早期的 (Early universe) | 暴涨模型 (Inflation model) | 微波背景辐射 (CMB) |
|
||||
| 谷电子学的 (Valleytronics) | 二硫化钼 (MoS2) | 谷极化控制 (Valley polarization) |
|
||||
| 非厄米系统的 (Non-Hermitian) | 趋肤效应 (Skin effect) | 能谱拓扑 (Spectral topology) |
|
||||
|
||||
#### 9. 机械工程 (Mechanical Engineering)
|
||||
**Buff:【蓝领专家 (Blue Collar)】**
|
||||
* **效果:** 横向项目(企业合作)的资金收益 +50%,且工程类学生不会因为做横向而产生“怨恨”状态。
|
||||
* **描述:** 图纸画得好,进厂当领导。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 刚柔耦合的 (Rigid-flexible) | 软体机器人 (Soft robot) | 抓取控制 (Grasping control) |
|
||||
| 仿生摩擦学的 (Biomimetic tribology) | 超滑表面 (Superlubricity) | 减摩耐磨 (Anti-wear) |
|
||||
| 增材制造的 (Additive mfg) | 晶格结构 (Lattice structure) | 轻量化设计 (Lightweight design) |
|
||||
| 故障诊断中的 (Fault diagnosis) | 滚动轴承 (Rolling bearing) | 寿命预测 (Life prediction) |
|
||||
| 智能网联的 (Connected vehicle) | 自动驾驶汽车 (Autonomous car) | 路径规划 (Path planning) |
|
||||
| 微纳尺度的 (Micro/Nano) | MEMS传感器 (MEMS sensor) | 灵敏度标定 (Calibration) |
|
||||
| 流固耦合的 (Fluid-structure) | 扑翼飞行器 (Flapping wing) | 气动特性 (Aerodynamics) |
|
||||
| 高速切削下的 (High-speed cutting) | 颤振 (Chatter) | 稳定性抑制 (Suppression) |
|
||||
| 人机协作的 (Human-robot) | 外骨骼 (Exoskeleton) | 助力效能 (Assistive efficiency) |
|
||||
| 非线性动力学的 (Nonlinear dynamics) | 转子系统 (Rotor system) | 分岔与混沌 (Bifurcation) |
|
||||
| 拓扑优化设计的 (Topology opt) | 承力构件 (Load-bearing part) | 结构刚度 (Stiffness) |
|
||||
| 极端环境下的 (Extreme environment) | 密封结构 (Seal structure) | 可靠性评估 (Reliability) |
|
||||
| 压电驱动的 (Piezoelectric) | 精密定位平台 (Positioning stage) | 迟滞补偿 (Hysteresis comp) |
|
||||
| 数字孪生驱动的 (Digital twin) | 智能车间 (Smart workshop) | 生产调度 (Scheduling) |
|
||||
| 复合材料层合板的 (Composite laminate) | 分层损伤 (Delamination) | 冲击响应 (Impact response) |
|
||||
|
||||
#### 10. 哲学 (Philosophy)
|
||||
**Buff:【斯多葛学派 (Stoicism)】**
|
||||
* **效果:** 全员压力上限 +20,且压力过高时不会触发“发疯/破坏”事件,而是触发“虚无/发呆”(仅仅是不工作,不搞破坏)。
|
||||
* **描述:** 痛苦是存在的,但我不在乎。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 现象学视域下的 (Phenomenological) | 意向性 (Intentionality) | 本质直观 (Eidetic reduction) |
|
||||
| 存在主义的 (Existential) | 荒诞感 (Absurdity) | 自由选择 (Free choice) |
|
||||
| 后现代语境中的 (Postmodern) | 宏大叙事 (Grand narrative) | 解构策略 (Deconstruction) |
|
||||
| 伦理学维度的 (Ethical) | 电车难题 (Trolley problem) | 道德直觉 (Moral intuition) |
|
||||
| 语言哲学中的 (Linguistic) | 家族相似性 (Family resemblance) | 意义治疗 (Logotherapy) |
|
||||
| 辩证唯物主义的 (Dialectical) | 异化劳动 (Alienated labor) | 批判性分析 (Critical analysis) |
|
||||
| 儒家思想中的 (Confucian) | 内圣外王 (Inner sage) | 现代性转化 (Modern transformation) |
|
||||
| 科技伦理视角的 (Tech-ethics) | 人工智能主体 (AI agent) | 责任归属 (Responsibility attribution) |
|
||||
| 政治哲学中的 (Political) | 正义论 (Theory of Justice) | 分配正义 (Distributive justice) |
|
||||
| 身体美学的 (Somaesthetics) | 具身认知 (Embodied cognition) | 感性重构 (Reconstruction) |
|
||||
| 解释学循环中的 (Hermeneutic) | 视域融合 (Fusion of horizons) | 文本解读 (Text interpretation) |
|
||||
| 虚无主义的 (Nihilistic) | 权力意志 (Will to power) | 价值重估 (Revaluation) |
|
||||
| 分析哲学的 (Analytic) | 可能世界 (Possible worlds) | 模态逻辑 (Modal logic) |
|
||||
| 精神分析视角的 (Psychoanalytic) | 潜意识 (Unconscious) | 镜像阶段 (Mirror stage) |
|
||||
| 生态女性主义的 (Eco-feminist) | 父权制 (Patriarchy) | 压迫机制 (Oppression mechanism) |
|
||||
|
||||
#### 11. 经济学 (Economics)
|
||||
**Buff:【资本运作 (Capital Flow)】**
|
||||
* **效果:** 没花完的经费会自动产生 10% 的利息。
|
||||
* **描述:** 钱生钱,才是硬道理。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 博弈论视角的 (Game theoretic) | 纳什均衡 (Nash equilibrium) | 策略选择 (Strategy selection) |
|
||||
| 行为经济学的 (Behavioral) | 损失厌恶 (Loss aversion) | 助推机制 (Nudge mechanism) |
|
||||
| 宏观审慎的 (Macro-prudential) | 系统性风险 (Systemic risk) | 压力测试 (Stress test) |
|
||||
| 全球价值链中的 (Global value chain) | 产业升级 (Industrial upgrading) | 附加值测算 (Value-added calc) |
|
||||
| 数字经济时代的 (Digital economy) | 平台垄断 (Platform monopoly) | 反垄断规制 (Antitrust regulation) |
|
||||
| 绿色金融的 (Green finance) | 碳交易市场 (Carbon market) | 定价效率 (Pricing efficiency) |
|
||||
| 新制度经济学的 (New institutional) | 交易成本 (Transaction cost) | 产权界定 (Property rights) |
|
||||
| 供给侧改革下的 (Supply-side) | 全要素生产率 (TFP) | 增长动力 (Growth driver) |
|
||||
| 计量经济学的 (Econometric) | 因果推断 (Causal inference) | 双重差分 (DID method) |
|
||||
| 财政分权背景下的 (Fiscal decentralization) | 地方债务 (Local debt) | 可持续性分析 (Sustainability) |
|
||||
| 普惠金融的 (Inclusive finance) | 贫困减缓 (Poverty alleviation) | 效应评估 (Impact evaluation) |
|
||||
| 契约理论中的 (Contract theory) | 信息不对称 (Info asymmetry) | 激励相容 (Incentive compatibility) |
|
||||
| 国际贸易中的 (International trade) | 贸易壁垒 (Trade barrier) | 福利效应 (Welfare effect) |
|
||||
| 人口老龄化的 (Aging population) | 养老金缺口 (Pension gap) | 精算模型 (Actuarial model) |
|
||||
| 随机动态一般均衡的 (DSGE) | 货币政策 (Monetary policy) | 冲击响应 (Impulse response) |
|
||||
|
||||
#### 12. 法学 (Law)
|
||||
**Buff:【钻空子 (Loophole)】**
|
||||
* **效果:** 遇到“行政处罚”、“举报”等负面事件时,有 30% 概率无视惩罚,并反诉获得少量声望。
|
||||
* **描述:** 法无禁止即可为。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 宪法视域下的 (Constitutional) | 备案审查 (Record review) | 合宪性解释 (Interpretation) |
|
||||
| 民法典时代的 (Civil Code) | 人格权 (Personality rights) | 司法保护 (Judicial protection) |
|
||||
| 认罪认罚从宽的 (Plea leniency) | 量刑建议 (Sentencing rec) | 精准化导向 (Precision guidance) |
|
||||
| 知识产权保护的 (IP protection) | 惩罚性赔偿 (Punitive damages) | 适用标准 (Application standard) |
|
||||
| 算法歧视中的 (Algorithmic bias) | 个人信息 (Personal info) | 法律规制 (Legal regulation) |
|
||||
| 国际法视角下的 (International law) | 长臂管辖 (Long-arm jurisdiction) | 阻断机制 (Blocking mechanism) |
|
||||
| 公司治理中的 (Corporate governance) | 刺破面纱 (Piercing the veil) | 连带责任 (Joint liability) |
|
||||
| 环境公益诉讼的 (Environmental litigation) | 举证责任 (Burden of proof) | 倒置规则 (Inversion rule) |
|
||||
| 刑法修正案的 (Criminal law amend) | 高空抛物 (High-altitude littering) | 罪名认定 (Conviction) |
|
||||
| 劳动法视野下的 (Labor law) | 灵活用工 (Gig work) | 权益保障 (Rights protection) |
|
||||
| 婚姻家庭编中的 (Marriage & Family) | 冷静期 (Cooling-off period) | 效力分析 (Validity analysis) |
|
||||
| 互联网法院的 (Internet court) | 区块链存证 (Blockchain evidence) | 采信规则 (Admissibility) |
|
||||
| 行政法治下的 (Administrative rule) | 裁量权基准 (Discretion benchmark) | 控权逻辑 (Control logic) |
|
||||
| 虚拟财产的 (Virtual property) | 继承权 (Inheritance right) | 法律属性 (Legal attribute) |
|
||||
| 正当防卫的 (Self-defense) | 限度条件 (Limit condition) | 司法认定 (Judicial determination) |
|
||||
|
||||
#### 13. 文学 (Literature)
|
||||
**Buff:【修辞术 (Rhetoric)】**
|
||||
* **效果:** 写作类任务效率 +20%,且可以用“S级辞藻”将一篇B级内容的论文包装成A级发表。
|
||||
* **描述:** 只要术语堆得够多,审稿人就看不懂。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 后殖民主义的 (Post-colonial) | 身份认同 (Identity) | 文本细读 (Close reading) |
|
||||
| 互文性视阈下的 (Intertextual) | 典故重构 (Allusion reconst) | 比较研究 (Comparative study) |
|
||||
| 创伤记忆的 (Traumatic memory) | 叙事伦理 (Narrative ethics) | 书写策略 (Writing strategy) |
|
||||
| 赛博朋克科幻的 (Cyberpunk) | 身体异化 (Body alienation) | 隐喻分析 (Metaphor analysis) |
|
||||
| 空间批评视角的 (Spatial criticism) | 城市漫游者 (Flaneur) | 地图绘制 (Mapping) |
|
||||
| 女性主义的 (Feminist) | 阁楼上的疯女人 (Madwoman) | 形象解构 (Deconstruction) |
|
||||
| 跨文化语境中的 (Cross-cultural) | 翻译策略 (Translation strategy) | 误读机制 (Misreading) |
|
||||
| 现代派诗歌的 (Modernist poetry) | 意象并置 (Juxtaposition) | 审美张力 (Aesthetic tension) |
|
||||
| 民间传说中的 (Folklore) | 母题 (Motif) | 类型学分析 (Typology) |
|
||||
| 离散写作的 (Diasporic) | 边缘人 (Marginal man) | 归属感焦虑 (Belonging anxiety) |
|
||||
| 荒诞派戏剧的 (Theatre of Absurd) | 语言破碎 (Broken language) | 舞台呈现 (Stage presentation) |
|
||||
| 魔幻现实主义的 (Magical realism) | 鬼魂叙事 (Ghost narrative) | 历史重述 (Retelling) |
|
||||
| 接受美学视角的 (Reception aesthetic) | 期待视野 (Horizon of expect) | 空白填充 (Gap filling) |
|
||||
| 比较文学变异学的 (Variation theory) | 文化过滤 (Cultural filtering) | 变异规律 (Variation rule) |
|
||||
| 生态批评下的 (Ecocriticism) | 人与自然 (Man and nature) | 伦理反思 (Ethical reflection) |
|
||||
|
||||
#### 14. 农学 (Agriculture)
|
||||
**Buff:【大丰收 (Harvest)】**
|
||||
* **效果:** 每回合随机产出“土特产”(道具),使用后可回复学生体力或心情。
|
||||
* **描述:** 论文写不出来,烤红薯还烤不出来吗?
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 盐碱胁迫下的 (Salt stress) | 转基因水稻 (Transgenic rice) | 抗逆性鉴定 (Stress resistance) |
|
||||
| 精准农业背景下的 (Precision ag) | 氮肥利用率 (N use efficiency) | 减施增效 (Reduction & efficiency) |
|
||||
| 设施园艺中的 (Facility hort) | 光合作用 (Photosynthesis) | 补光策略 (Light supp) |
|
||||
| 种质资源保护的 (Germplasm) | 野生大豆 (Wild soybean) | 基因挖掘 (Gene mining) |
|
||||
| 土壤微生物组的 (Soil microbiome) | 根际效应 (Rhizosphere effect) | 促生机制 (Growth promotion) |
|
||||
| 气候变化适应的 (Climate adaptation) | 冬小麦 (Winter wheat) | 产量预测 (Yield prediction) |
|
||||
| 绿色防控技术的 (Green control) | 草地贪夜蛾 (Fall armyworm) | 综合治理 (IPM) |
|
||||
| 采后生理学的 (Postharvest) | 果实软化 (Fruit softening) | 保鲜技术 (Preservation) |
|
||||
| 畜禽废弃物的 (Livestock waste) | 堆肥腐熟 (Composting) | 资源化利用 (Utilization) |
|
||||
| 分子标记辅助的 (Marker-assisted) | 杂交优势 (Heterosis) | 育种选择 (Breeding selection) |
|
||||
| 保护性耕作下的 (Conservation tillage) | 土壤有机碳 (Soil organic carbon) | 固碳潜力 (Carbon seq) |
|
||||
| 兽医流行病学的 (Vet epidemiology) | 非洲猪瘟 (ASF) | 传播模型 (Spread model) |
|
||||
| 水产养殖中的 (Aquaculture) | 循环水系统 (RAS) | 氨氮去除 (Ammonia removal) |
|
||||
| 农业遥感监测的 (Remote sensing) | 植被指数 (NDVI) | 旱情评估 (Drought assess) |
|
||||
| 食品安全视角的 (Food safety) | 农药残留 (Pesticide residue) | 快速检测 (Rapid detection) |
|
||||
|
||||
#### 15. 管理学 (Management)
|
||||
**Buff:【微操大师 (Micromanagement)】**
|
||||
* **效果:** 导师单位在场时,周围学生的效率加成翻倍,但压力积累速度也翻倍。
|
||||
* **描述:** 我不干活,但我教你干活。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 数字化转型下的 (Digital trans) | 敏捷组织 (Agile org) | 绩效评估 (Performance eval) |
|
||||
| 开放式创新的 (Open innovation) | 知识溢出 (Knowledge spillover) | 吸收能力 (Absorptive capacity) |
|
||||
| 供应链韧性的 (Supply chain resilience) | 牛鞭效应 (Bullwhip effect) | 协同优化 (Collaboration opt) |
|
||||
| 消费者行为学的 (Consumer behavior) | 购买意愿 (Purchase intention) | 影响因素 (Influencing factors) |
|
||||
| 战略人力资源的 (Strategic HR) | 员工敬业度 (Engagement) | 激励机制 (Incentive mechanism) |
|
||||
| 平台生态系统的 (Platform ecosystem) | 网络效应 (Network effect) | 赢家通吃 (Winner-takes-all) |
|
||||
| 危机管理视角的 (Crisis mgmt) | 品牌形象 (Brand image) | 修复策略 (Repair strategy) |
|
||||
| 跨国并购中的 (Cross-border M&A) | 文化冲突 (Cultural conflict) | 整合模式 (Integration mode) |
|
||||
| 创业导向的 (Entrepreneurial) | 新创企业 (Start-up) | 失败学习 (Learning from failure) |
|
||||
| 仆人式领导的 (Servant leadership) | 组织公民行为 (OCB) | 调节效应 (Moderating effect) |
|
||||
| 动态能力理论的 (Dynamic capability) | 商业模式 (Business model) | 创新重构 (Innovation reconst) |
|
||||
| 社交媒体营销的 (Social media marketing) | 口碑传播 (WOM) | 情感分析 (Sentiment analysis) |
|
||||
| 利益相关者视角的 (Stakeholder) | 企业社会责任 (CSR) | 价值共创 (Value co-creation) |
|
||||
| 隐性知识共享的 (Tacit knowledge) | 师徒制 (Mentorship) | 传递机制 (Transfer mechanism) |
|
||||
| 复杂适应系统的 (CAS) | 组织演化 (Org evolution) | 仿真模拟 (Simulation) |
|
||||
|
||||
#### 16. 艺术学 (Art)
|
||||
**Buff:【传世之作 (Masterpiece)】**
|
||||
* **效果:** 完成任务时,有概率触发“灵感爆发”,声望奖励翻倍,且该作品会成为“永久展品”(每回合提供少量被动声望)。
|
||||
* **描述:** 艺术是不需要解释的。
|
||||
|
||||
| 15 形容词/前缀 | 15 核心名词 | 5 方法/应用 |
|
||||
| :--- | :--- | :--- |
|
||||
| 包豪斯风格的 (Bauhaus) | 形式语言 (Formal language) | 视觉重构 (Visual reconst) |
|
||||
| 沉浸式体验的 (Immersive) | 交互装置 (Interactive install) | 情感共鸣 (Emotional resonance) |
|
||||
| 非物质文化遗产的 (Intangible heritage) | 传统纹样 (Traditional pattern) | 数字化保护 (Digital preservation) |
|
||||
| 符号学视域下的 (Semiotic) | 图像隐喻 (Visual metaphor) | 意义生成 (Meaning generation) |
|
||||
| 赛博格美学的 (Cyborg aesthetic) | 虚拟身体 (Virtual body) | 边界消解 (Boundary dissolution) |
|
||||
| 极简主义的 (Minimalist) | 留白艺术 (Negative space) | 空间营造 (Space creation) |
|
||||
| 跨媒介叙事的 (Transmedia) | 动态图形 (Motion graphics) | 视听融合 (Audio-visual fusion) |
|
||||
| 公共艺术介入的 (Public art) | 社区营造 (Community building) | 社会参与 (Social engagement) |
|
||||
| 表现主义的 (Expressionist) | 色彩张力 (Color tension) | 情感外化 (Externalization) |
|
||||
| 达达主义的 (Dadaist) | 现成品 (Readymade) | 反艺术策略 (Anti-art strategy) |
|
||||
| 生成艺术的 (Generative art) | 算法美学 (Algorithmic aesthetic) | 随机涌现 (Random emergence) |
|
||||
| 身体景观的 (Bodyscape) | 行为艺术 (Performance art) | 现场介入 (Live intervention) |
|
||||
| 波普艺术风格的 (Pop art) | 大众文化 (Mass culture) | 复制与挪用 (Copy & appropriation) |
|
||||
| 虚拟现实技术下的 (VR-based) | 全景绘画 (Panoramic painting) | 具身交互 (Embodied interaction) |
|
||||
| 东方美学视角的 (Eastern aesthetic) | 意境 (Artistic conception) | 现代转译 (Modern translation) |
|
||||
518
docs/装备与设施系统.md
Normal file
518
docs/装备与设施系统.md
Normal file
@ -0,0 +1,518 @@
|
||||
这是一个非常庞大的设计需求,为了保持文档的可读性和查找便利性,我将按照**通用类**和**学科专用类**进行分类。
|
||||
|
||||
设计思路依然延续游戏的**黑色幽默**和**硬核科研**风格,装备不仅提供数值,还隐含了对各学科刻板印象的致敬。
|
||||
|
||||
---
|
||||
|
||||
### 一、 通用实验室设备 (General Lab Facilities)
|
||||
*购买后放置在特定房间(如实验室、休息区),对该区域内的所有人员生效。*
|
||||
|
||||
1. **商用级意式咖啡机 (Industrial Espresso Machine)**
|
||||
* **位置:** 休息区/茶水间
|
||||
* **效果:** 区域内人员心情恢复速度 +20%,但有 5% 概率因为咖啡因过量导致“手抖”(工程类任务失败率微增)。
|
||||
* **描述:** 真正的科研燃料补给站。
|
||||
2. **赫曼米勒人体工学椅 (Ergonomic Chairs)**
|
||||
* **位置:** 实验室/工位
|
||||
* **效果:** 极大降低全员的“健康/体力”流失速度。
|
||||
* **描述:** “老板,腰间盘突出算工伤吗?” “算了,给你买把好椅子吧。”
|
||||
3. **全墙面白板 (Floor-to-Ceiling Whiteboard)**
|
||||
* **位置:** 会议室/讨论区
|
||||
* **效果:** 处于该区域的学生“学术”属性临时 +10%,灵感触发几率翻倍。
|
||||
* **描述:** 只有写满了公式的墙壁,才能不仅让外人觉得我们很厉害,也让我们觉得自己很厉害。
|
||||
4. **新风与空气净化系统 (Fresh Air System)**
|
||||
* **位置:** 全局生效
|
||||
* **效果:** 降低全员生病概率,微弱降低压力增长速度。
|
||||
* **描述:** 在充满试剂味、焊锡味和三天没洗澡的人味的房间里,这是保命装。
|
||||
* *注:生物/化学系效果减半(味道太冲了压不住)。*
|
||||
5. **高性能NAS存储服务器 (Central NAS)**
|
||||
* **位置:** 机房
|
||||
* **效果:** 防止“硬盘损坏”事件导致的数据丢失;所有任务的数据保存/备份速度 +50%。
|
||||
* **描述:** 只要没断电,你的毕业论文就是安全的。
|
||||
|
||||
---
|
||||
|
||||
### 二、 通用个人装备 (General Personal Items)
|
||||
*购买后需拖拽装备到具体某个学生身上(占用装备栏),提供单体加成。*
|
||||
|
||||
1. **降噪耳机 (Noise-Canceling Headphones)**
|
||||
* **效果:** 工作效率 +15%,但完全免疫“导师画饼/激励”技能(听不见)。
|
||||
* **描述:** “别跟我说话,我在另一个世界。”
|
||||
2. **护颈椎支架 (Neck Brace)**
|
||||
* **效果:** 体力上限 +20,抗压能力 +5。
|
||||
* **描述:** 低头族的最后防线。
|
||||
3. **防脱发洗发水 (Anti-Hair Loss Shampoo)**
|
||||
* **效果:** 压力增长速度 -10%,由于形象改善,答辩成功率 +5%。
|
||||
* **描述:** 心理安慰作用大于实际作用。
|
||||
4. **红牛/魔爪成箱装 (Energy Drink Stash)**
|
||||
* **效果:** 短期爆发力(攻速)+30%,但每回合健康值额外扣除。
|
||||
* **描述:** 也就是透支明天的生命来换今天的DDL。
|
||||
5. **机械键盘 (Blue Switch Keyboard)**
|
||||
* **效果:** 写作/工程属性 +10%,但周围一格内的其他同学压力 +5/回合(太吵了)。
|
||||
* **描述:** 噼里啪啦的声音听起来像是在干活。
|
||||
6. **U型午睡枕 (Nap Pillow)**
|
||||
* **效果:** 在工位上“摸鱼”时,体力恢复速度翻倍。
|
||||
* **描述:** 趴着睡不再手麻。
|
||||
7. **速效救心丸 (Emergency Pills)**
|
||||
* **效果:** 一次性道具(装备后自动触发)。当压力爆表即将猝死时,自动复活并清空压力,随后道具消失。
|
||||
* **描述:** 导师抽屉里的常备药,偶尔分给学生。
|
||||
8. **加厚格子衬衫 (Plaid Shirt)**
|
||||
* **效果:** 工程属性 +5,对异性吸引力 -50%(杜绝恋爱事件)。
|
||||
* **描述:** 科研人员的隐身衣。
|
||||
9. **PPT翻页笔 (Laser Pointer)**
|
||||
* **效果:** 表达属性 +15%,组会/答辩专用。
|
||||
* **描述:** 握着它,你就是讲台上的神。
|
||||
10. **幸运护身符 (Lucky Charm)**
|
||||
* **效果:** 实验/投稿的随机成功率判定 +2%。
|
||||
* **描述:** 雍和宫开过光的。
|
||||
|
||||
---
|
||||
|
||||
### 三、 学科专用装备 (Discipline Specific)
|
||||
|
||||
为了方便查阅,以下按学科分类列出 **5种实验室设备** 和 **5种个人装备**。
|
||||
|
||||
#### 1. 生物学 (Biology)
|
||||
* **实验室设备:**
|
||||
1. **-80℃超低温冰箱:** 保存样本进度,防止任务随时间腐烂。
|
||||
2. **超净工作台:** 降低细胞污染(任务失败)概率。
|
||||
3. **PCR仪集群:** 大幅加速基因类任务进度。
|
||||
4. **荧光显微镜:** 提升“学术”产出,也就是拍出好看的图。
|
||||
5. **摇床 (Shaker):** 持续产生低噪音,微生物任务自动化 +20%。
|
||||
* **个人装备:**
|
||||
1. **计时器 (Timer):** 同时处理多个实验步骤,防健忘。
|
||||
2. **移液枪 (Pipette):** 工程属性 +10,精准度提升。
|
||||
3. **乳胶手套 (Latex Gloves):** 防护 +10,但心情 -2(手汗)。
|
||||
4. **白大褂 (Lab Coat):** 仪式感道具,全属性微增。
|
||||
5. **实验鼠笼 (Mouse Cage):** 携带一只小白鼠,心情恢复 +5,但需消耗资金喂养。
|
||||
|
||||
#### 2. 化学 (Chemistry)
|
||||
* **实验室设备:**
|
||||
1. **通风橱 (Fume Hood):** 极大降低学生健康流失速度。
|
||||
2. **核磁共振仪 (NMR):** 极昂贵,S级任务必备,产出极高声望。
|
||||
3. **旋蒸仪 (Rotary Evaporator):** 提纯效率 +30%。
|
||||
4. **手套箱 (Glovebox):** 允许进行无水无氧的高难度实验。
|
||||
5. **防爆柜:** 储存危险品,降低爆炸事件后的损失。
|
||||
* **个人装备:**
|
||||
1. **防毒面具:** 免疫毒气事件,但表达能力 -20%(说话听不清)。
|
||||
2. **护目镜:** 帅气度 +5,防瞎眼。
|
||||
3. **刮勺 (Spatula):** 称量精准度提升。
|
||||
4. **元素周期表T恤:** 学术属性 +5。
|
||||
5. **洗瓶 (Wash Bottle):** 紧急冲洗,消除负面Buff。
|
||||
|
||||
#### 3. 环境科学 (Environment)
|
||||
* **实验室设备:**
|
||||
1. **气相色谱质谱联用仪 (GC-MS):** 分析污染物必备,检测速度 +50%。
|
||||
2. **人工气候箱:** 模拟环境,植物类任务成功率 +20%。
|
||||
3. **水样预处理台:** 降低脏活累活的压力消耗。
|
||||
4. **无人机 (Survey Drone):** 野外采样任务耗时减半。
|
||||
5. **危废处理桶:** 被环保局检查时,免除罚款。
|
||||
* **个人装备:**
|
||||
1. **登山靴:** 野外考察任务体力消耗减半。
|
||||
2. **冲锋衣:** 防雨防风,野外心情不降低。
|
||||
3. **采样瓶:** 增加单次外出获取的样本量。
|
||||
4. **防晒霜:** 防止在野外被晒伤(健康-)。
|
||||
5. **钓鱼竿:** 在水库采样时可以摸鱼(心情++)。
|
||||
|
||||
#### 4. 材料科学 (Materials)
|
||||
* **实验室设备:**
|
||||
1. **管式炉 (Tube Furnace):** 烧制材料,耗电极高,产出工程点。
|
||||
2. **扫描电镜 (SEM):** 产出精美图片,论文录用率 +20%。
|
||||
3. **手套箱 (Glovebox):** 同化学,做电池必备。
|
||||
4. **球磨机:** 噪音极大(全员压力+),但能把任何东西磨成粉。
|
||||
5. **3D打印机:** 快速制造原型,工程属性 +15%。
|
||||
* **个人装备:**
|
||||
1. **防尘口罩:** 防止吸入粉末。
|
||||
2. **金刚石刀:** 切割样品效率 +20%。
|
||||
3. **镊子:** 夹取微小样品,防手抖。
|
||||
4. **抛光机:** 把样品磨得像镜子一样,心情 +5。
|
||||
5. **胶带 (Scotch Tape):** 撕石墨烯专用,极低成本换极高收益(概率)。
|
||||
|
||||
#### 5. 基础医学 (Basic Medicine)
|
||||
* **实验室设备:**
|
||||
1. **流式细胞仪:** 细胞分选效率 +40%,极其昂贵。
|
||||
2. **小动物成像系统:** 活体实验必备,减少老鼠死亡率。
|
||||
3. **组织切片机:** 制作病理切片,学术+10%。
|
||||
4. **细胞培养箱:** 维持细胞存活,必须24小时不断电。
|
||||
5. **液氮罐:** 冻存细胞,保存火种。
|
||||
* **个人装备:**
|
||||
1. **手术刀套装:** 工程(解剖)属性 +20%。
|
||||
2. **听诊器:** 虽然做实验用不上,但挂脖子上能增加“专业感”(声望+)。
|
||||
3. **口罩 (N95):** 防护等级Max。
|
||||
4. **维C泡腾片:** 增强免疫力。
|
||||
5. **解剖图谱:** 学术属性 +5。
|
||||
|
||||
#### 6. 计算机 (CS)
|
||||
* **实验室设备:**
|
||||
1. **RTX 4090 集群:** 深度学习任务速度 +200%,电费激增。
|
||||
2. **双显示器支架:** 每个工位标配,代码效率 +20%。
|
||||
3. **升降桌:** 站立写代码,健康 +10%。
|
||||
4. **白板墙 (Scrum Board):** 管理敏捷开发,团队协作 +15%。
|
||||
5. **机房精密空调:** 防止服务器过热宕机。
|
||||
* **个人装备:**
|
||||
1. **HHKB键盘:** 只有大佬才用,工程 +15%,装逼 +10%。
|
||||
2. **垂直鼠标:** 防止腱鞘炎。
|
||||
3. **小黄鸭 (Rubber Duck):** 调试代码神器,压力增长 -5%。
|
||||
4. **Github 卫衣:** 开源精神,代码被引用率 +5%。
|
||||
5. **假发片:** 掩盖秃头事实,心情 +10。
|
||||
|
||||
#### 7. 数学 (Mathematics)
|
||||
* **实验室设备:**
|
||||
1. **黑板 (Blackboard):** 比白板更加神圣,学术属性 +20%,粉笔灰致病率 +1%。
|
||||
2. **废纸篓 (Huge Bin):** 越大越好,产生灵感的关键。
|
||||
3. **咖啡无限续杯台:** 将咖啡转化为定理的装置。
|
||||
4. **沙发床:** 思考累了直接睡。
|
||||
5. **研讨室 (Seminar Room):** 只有桌子和椅子,不需要电。
|
||||
* **个人装备:**
|
||||
1. **羽毛笔/昂贵钢笔:** 书写流畅度 +10%。
|
||||
2. **无尘粉笔:** 保护肺部。
|
||||
3. **草稿纸 (Draft Paper):** 消耗品,越多越好。
|
||||
4. **拓扑学马克杯:** 把手和杯子连在一起,心情 +5。
|
||||
5. **降噪耳塞:** 绝对安静。
|
||||
|
||||
#### 8. 物理 (Physics)
|
||||
* **实验室设备:**
|
||||
1. **光学平台 (Optical Table):** 极其平稳,精密实验必备。
|
||||
2. **低温恒温器 (Cryostat):** 创造绝对零度附近的条件。
|
||||
3. **示波器 (Oscilloscope):** 捕捉信号,工程 +10%。
|
||||
4. **激光器:** 高危设备,操作不当会导致学生失明(退役)。
|
||||
5. **超算终端:** 模拟宇宙,算力消耗大户。
|
||||
* **个人装备:**
|
||||
1. **绝缘手套:** 防止触电。
|
||||
2. **护目镜 (Laser Goggles):** 防激光专用。
|
||||
3. **万用表:** 查电路必备。
|
||||
4. **费曼讲义:** 学术 +10%。
|
||||
5. **胶带 (Duct Tape):** 修理一切实验设备。
|
||||
|
||||
#### 9. 机械 (Mechanical Eng)
|
||||
* **实验室设备:**
|
||||
1. **数控机床 (CNC):** 制造零件,噪音大,产出高。
|
||||
2. **万能试验机:** 拉伸压缩测试,破坏性实验。
|
||||
3. **3D扫描仪:** 逆向工程神器。
|
||||
4. **焊接台:** 焊电路或焊钢板,容易烫伤。
|
||||
5. **行车/吊车:** 搬运重物,体力消耗 -20%。
|
||||
* **个人装备:**
|
||||
1. **游标卡尺:** 精准测量,强迫症福音。
|
||||
2. **工装裤:** 耐脏,口袋多(携带道具数+1)。
|
||||
3. **劳保手套:** 防割防烫。
|
||||
4. **润滑油 (WD-40):** 解决一切卡顿问题,工程效率 +10%。
|
||||
5. **安全帽:** 进实验室必须戴,防爆头。
|
||||
|
||||
#### 10. 哲学 (Philosophy)
|
||||
* **实验室设备:**
|
||||
1. **安乐椅 (Armchair):** 哲学思考的温床,学术 +15%。
|
||||
2. **经典藏书墙:** 提供理论支持。
|
||||
3. **壁炉 (Fireplace):** 营造氛围,心情恢复 +20%。
|
||||
4. **猫 (Office Cat):** 薛定谔的猫?不,只是用来撸的。全员减压。
|
||||
5. **圆形讨论桌:** 方便辩论,口才 +10%。
|
||||
* **个人装备:**
|
||||
1. **烟斗 (Pipe):** 看起来很有智慧,学术 +5,健康 -2。
|
||||
2. **单片眼镜:** 增加威慑力。
|
||||
3. **笔记本 (Moleskine):** 记录灵光一闪。
|
||||
4. **行走手杖:** 散步思考用。
|
||||
5. **酒壶:** 微醺状态下灵感爆发。
|
||||
|
||||
#### 11. 经济学 (Economics)
|
||||
* **实验室设备:**
|
||||
1. **彭博终端 (Bloomberg Terminal):** 极其昂贵,数据获取速度 Max。
|
||||
2. **多屏股票看板:** 实时监控,虽然不知道对写论文有啥用,但看着专业。
|
||||
3. **沙盘推演台:** 模拟博弈论。
|
||||
4. **打印机 (High-Speed Printer):** 打印海量报表。
|
||||
5. **茶歇台:** 商务洽谈用,资金获取 +10%。
|
||||
* **个人装备:**
|
||||
1. **计算器 (Financial Calculator):** 算钱专用。
|
||||
2. **定制西装:** 魅力/表达 +20%,拉项目成功率高。
|
||||
3. **名片夹:** 社交属性 +10%。
|
||||
4. **《国富论》:** 拿在手里装样子的。
|
||||
5. **公文包:** 增加携带资金的上限。
|
||||
|
||||
#### 12. 法学 (Law)
|
||||
* **实验室设备:**
|
||||
1. **模拟法庭 (Moot Court):** 锻炼口才,表达属性 +30%。
|
||||
2. **卷宗柜:** 存储案例,学术 +10%。
|
||||
3. **录音笔/设备:** 取证用。
|
||||
4. **打印复印一体机:** 法学生的噩梦,永远在复印材料。
|
||||
5. **宣誓台:** 增加仪式感,忠诚度 +5。
|
||||
* **个人装备:**
|
||||
1. **法槌 (Gavel):** 敲一下,威严 +10,虽然平时用不上。
|
||||
2. **假发 (Wig):** 英式法庭专用,防御力(脸皮)+10。
|
||||
3. **六法全书:** 物理攻击力 +50(太厚了),学术 +5。
|
||||
4. **保温杯:** 保护嗓子。
|
||||
5. **录音笔:** 随身携带,防身用。
|
||||
|
||||
#### 13. 文学 (Literature)
|
||||
* **实验室设备:**
|
||||
1. **复古打字机:** 效率极低,但产出的文稿质量(声望)极高。
|
||||
2. **落地灯:** 营造孤独的写作氛围。
|
||||
3. **期刊阅览架:** 获取最新八卦和动态。
|
||||
4. **影音室:** 观看电影(文本分析用),心情 +10。
|
||||
5. **废稿焚烧炉:** 销毁黑历史。
|
||||
* **个人装备:**
|
||||
1. **贝雷帽:** 艺术气质 +10%。
|
||||
2. **钢笔 (Fountain Pen):** 写作灵感 +5%。
|
||||
3. **黑框眼镜:** 学术 +5。
|
||||
4. **围巾:** 增加忧郁气质。
|
||||
5. **香烟/咖啡:** 提神,减健康。
|
||||
|
||||
#### 14. 农学 (Agriculture)
|
||||
* **实验室设备:**
|
||||
1. **智能温室:** 自动浇水施肥,解放双手。
|
||||
2. **种子库:** 保存珍稀资源。
|
||||
3. **土壤分析仪:** 科学种地。
|
||||
4. **农用无人机:** 喷洒农药,效率 +50%。
|
||||
5. **品尝台:** 试吃实验产品,心情 +10,健康 +5。
|
||||
* **个人装备:**
|
||||
1. **草帽:** 户外防晒。
|
||||
2. **胶鞋 (Rain Boots):** 下地干活必备。
|
||||
3. **锄头:** 也可以当武器。
|
||||
4. **驱蚊水:** 野外生存必备。
|
||||
5. **水壶:** 补水。
|
||||
|
||||
#### 15. 管理学 (Management)
|
||||
* **实验室设备:**
|
||||
1. **圆桌 (Round Table):** 方便开会扯皮,团队协作 +10%。
|
||||
2. **投影仪:** 播放PPT专用。
|
||||
3. **案例库服务器:** 存储商业案例。
|
||||
4. **高尔夫推杆练习器:** 在办公室练习社交技能。
|
||||
5. **水晶奖杯陈列柜:** 增加声望光环。
|
||||
* **个人装备:**
|
||||
1. **蓝牙耳机:** 永远在打电话,业务繁忙。
|
||||
2. **PPT翻页器:** 核心武器。
|
||||
3. **日程本:** 规划时间。
|
||||
4. **领带/丝巾:** 职业形象。
|
||||
5. **秒表:** 计算工时,压榨效率 +10%。
|
||||
|
||||
#### 16. 艺术 (Art)
|
||||
* **实验室设备:**
|
||||
1. **画架/工作台:** 基础生产工具。
|
||||
2. **Mac Studio:** 设计渲染专用。
|
||||
3. **3D打印机:** 制作雕塑模型。
|
||||
4. **聚光灯:** 展示作品,声望获取 +20%。
|
||||
5. **人体模特:** 参考用,晚上看有点吓人(压力+)。
|
||||
* **个人装备:**
|
||||
1. **围裙:** 防颜料。
|
||||
2. **调色盘:** 灵感来源。
|
||||
3. **数位板:** 绘图效率 +20%。
|
||||
4. **单反相机:** 记录素材。
|
||||
5. **速写本:** 随时随地记录。
|
||||
|
||||
|
||||
这需要大量的“刻薄”与“自嘲”能量。以下是为每一件物品量身定制的“物品描述(Flavor Text)”,旨在让玩家在点击购买时会心一笑(或者心头一紧)。
|
||||
|
||||
---
|
||||
|
||||
### 一、 通用实验室设备 (全员共享)
|
||||
1. **商用级意式咖啡机**:唯一能比试剂消耗得更快的液体燃料补给站。
|
||||
2. **赫曼米勒人体工学椅**:它的价格比研究生一年的津贴还高,但在预防腰椎间盘突出方面物超所值。
|
||||
3. **全墙面白板**:哪怕你只是在上面画了一只乌龟,外人也会觉得那是某种高深的拓扑结构。
|
||||
4. **新风与空气净化系统**:努力在汗水味、发霉味和绝望的味道中,过滤出一丝生存的气息。
|
||||
5. **高性能NAS存储服务器**:因为“我的狗吃了硬盘”这个理由,基金委是不会买账的。
|
||||
|
||||
---
|
||||
|
||||
### 二、 通用个人装备 (单人独享)
|
||||
1. **降噪耳机**:戴上它,我就听不见你的愚蠢建议了。
|
||||
2. **护颈椎支架**:人类正在退化成虾米,而这是我们最后的倔强。
|
||||
3. **防脱发洗发水**:虽然没什么用,但涂在头皮上的清凉感让人觉得还有希望。
|
||||
4. **红牛/魔爪成箱装**:以300%的高利贷,向明天预支今天的精力。
|
||||
5. **机械键盘**:噼里啪啦的声音除了吵醒舍友,还能营造出一种“我进度很快”的假象。
|
||||
6. **U型午睡枕**:以极其科学的角度,精准承接你流下的口水和悔恨的泪水。
|
||||
7. **速效救心丸**:导师抽屉里的硬通货,该吃就吃,别为了科学献祭。
|
||||
8. **加厚格子衬衫**:工程师的迷彩服,避孕效果达99.9%。
|
||||
9. **PPT翻页笔**:握紧它,看着那个红点,你就是讲台上的宙斯。
|
||||
10. **幸运护身符**:当科学无法解释为什么实验失败时,我们就转向玄学。
|
||||
|
||||
---
|
||||
|
||||
### 三、 学科专用装备
|
||||
|
||||
#### 1. 生物学 (Biology)
|
||||
* **-80℃超低温冰箱**:这里埋葬着无数标以此生不再打开的“Final_Final_v2”样本。
|
||||
* **超净工作台**:虽然叫超净台,但里面可能比你的键盘还脏。
|
||||
* **PCR仪集群**:扩增的是基因,消耗的是青春。
|
||||
* **荧光显微镜**:只要颜色调得好,垃圾数据也能发封面。
|
||||
* **摇床**:就像摇篮一样,晃晕了细菌,也晃晕了守夜的学生。
|
||||
* *(个人)* **计时器**:身上没挂三个以上的计时器,不仅不专业,还没法去食堂抢饭。
|
||||
* *(个人)* **移液枪**:经过常年训练,我的大拇指比我的大腿更有力量。
|
||||
* *(个人)* **乳胶手套**:脱下来的时候,里面的汗水能养活一缸金鱼。
|
||||
* *(个人)* **白大褂**:如果不沾点血迹或染料,怎么证明你干过活?
|
||||
* *(个人)* **实验鼠笼**:这是整个实验室里唯一饮食规律、睡眠充足的活物。
|
||||
|
||||
#### 2. 化学 (Chemistry)
|
||||
* **通风橱**:如果这里的风停了,你就离见太奶不远了。
|
||||
* **核磁共振仪 (NMR)**:这台吞金兽发出的噪音,听起来像是经费燃烧的声音。
|
||||
* **旋蒸仪**:看着液体一滴滴流下来,是化学狗唯一的解压方式。
|
||||
* **手套箱**:在地球上模拟外太空,只为了让那该死的试剂不冒烟。
|
||||
* **防爆柜**:虽然炸了也没用,但至少能留个全尸。
|
||||
* *(个人)* **防毒面具**:戴上它,没人知道你在哭,也没人知道你在骂导师。
|
||||
* *(个人)* **护目镜**:脸上的压痕是荣誉的勋章,也是单身的封印。
|
||||
* *(个人)* **刮勺**:抖一抖手,误差正负50%,全凭缘分。
|
||||
* *(个人)* **元素周期表T恤**:一种把“我很无趣”写在身上的高效社交筛选器。
|
||||
* *(个人)* **洗瓶**:不管是着火还是口渴,呲一下总没错。
|
||||
|
||||
#### 3. 环境科学 (Environment)
|
||||
* **气相色谱质谱联用仪**:它能分析出空气里有几种屁,但分析不出为何我还在延毕。
|
||||
* **人工气候箱**:在这个箱子里,你是控制四季的神。
|
||||
* **水样预处理台**:这里也是洗杯子、洗饭盒和洗脸的地方。
|
||||
* **无人机**:原本是买来航拍的,现在主要用来取外卖。
|
||||
* **危废处理桶**:所有解释不清的数据和废液,最终都归于此处。
|
||||
* *(个人)* **登山靴**:穿上它不是为了征服高山,是为了征服垃圾填埋场。
|
||||
* *(个人)* **冲锋衣**:一年四季都穿它,因为耐脏且兜多。
|
||||
* *(个人)* **采样瓶**:看起来像捡破烂的,其实这一包瓶子值几万块。
|
||||
* *(个人)* **防晒霜**:为了不让野外采样把你变成包青天。
|
||||
* *(个人)* **钓鱼竿**:采样是工作,空军是生活。
|
||||
|
||||
#### 4. 材料科学 (Materials)
|
||||
* **管式炉**:炼丹炉的现代版,只是太上老君不用写周报。
|
||||
* **扫描电镜 (SEM)**:把垃圾放大一万倍,试图从中找到艺术美感。
|
||||
* **手套箱**:因为材料比你更娇贵,所以它住豪宅,你住宿舍。
|
||||
* **球磨机**:那震耳欲聋的轰鸣声,正好掩盖了实验失败的惨叫。
|
||||
* **3D打印机**:主要用途是给隔壁艺术系打印手办来换奶茶。
|
||||
* *(个人)* **防尘口罩**:防止你的肺部比你的材料先发生相变。
|
||||
* *(个人)* **金刚石刀**:切玻璃如切豆腐,切手指也一样。
|
||||
* *(个人)* **镊子**:只有帕金森患者才会被禁止使用的精密武器。
|
||||
* *(个人)* **抛光机**:磨样品的时候,感觉自己的棱角也被磨平了。
|
||||
* *(个人)* **胶带**:诺奖级发明的核心工具,办公用品店两块钱一卷。
|
||||
|
||||
#### 5. 基础医学 (Basic Medicine)
|
||||
* **流式细胞仪**:看着那些散点图,就像在看显微镜下的星空,虽然全是死细胞。
|
||||
* **小动物成像系统**:给老鼠拍CT,待遇比给人拍还好。
|
||||
* **组织切片机**:不仅能切组织,还能把你的耐心切成微米级的薄片。
|
||||
* **细胞培养箱**:比照顾婴儿还要精细,毕竟婴儿不会因为你少看一眼就发霉。
|
||||
* **液氮罐**:云雾缭绕中,封印着上一届师兄留下的不明生物。
|
||||
* *(个人)* **手术刀套装**:拿来切水果非常顺手,只要你不去想它切过什么。
|
||||
* *(个人)* **听诊器**:挂在脖子上是为了提醒自己是医生,虽然现在只治老鼠。
|
||||
* *(个人)* **口罩 (N95)**:不仅防病毒,还防导师喷口水。
|
||||
* *(个人)* **维C泡腾片**:只要我不生病,实验就做不完。
|
||||
* *(个人)* **解剖图谱**:下饭神器,甚至能边看边吃毛血旺。
|
||||
|
||||
#### 6. 计算机 (CS)
|
||||
* **RTX 4090 集群**:冬天用来取暖,夏天用来发论文,全年用来烧钱。
|
||||
* **双显示器支架**:左边是Stack Overflow,右边是复制粘贴的代码。
|
||||
* **升降桌**:站着写Bug,可以有效预防痔疮。
|
||||
* **白板墙**:贴满便利贴的样子,像极了案发现场的线索墙。
|
||||
* **机房精密空调**:服务器享受着24度恒温,而你在宿舍热成狗。
|
||||
* *(个人)* **HHKB键盘**:没有刻字是为了防止外行乱动,也是为了防止自己低头。
|
||||
* *(个人)* **垂直鼠标**:看起来像个熨斗,但能救你的手腕一命。
|
||||
* *(个人)* **小黄鸭**:当你向它解释代码时,它那空洞的眼神充满了理解。
|
||||
* *(个人)* **Github 卫衣**:穿上它,你就是开源社区的行走的广告牌。
|
||||
* *(个人)* **假发片**:程序员最后的尊严,请勿在强风天佩戴。
|
||||
|
||||
#### 7. 数学 (Mathematics)
|
||||
* **黑板**:白板是留给工程师的,只有粉笔灰才是数学家的化妆粉。
|
||||
* **废纸篓**:越大越好,因为天才的想法总是被扔掉99次才捡回来一次。
|
||||
* **咖啡无限续杯台**:这台机器的输入是咖啡豆,输出是定理。
|
||||
* **沙发床**:因为证明黎曼猜想可能需要睡上一觉,或者很多觉。
|
||||
* **研讨室**:除了桌椅什么都没有,因为这里只需要大脑。
|
||||
* *(个人)* **羽毛笔**:用最原始的工具,写最超前的公式。
|
||||
* *(个人)* **无尘粉笔**:这是为了保护肺,毕竟大脑还要靠氧气运作。
|
||||
* *(个人)* **草稿纸**:有些伟大的发现就写在餐巾纸上,但大多数垃圾写在A4纸上。
|
||||
* *(个人)* **拓扑学马克杯**:在拓扑学上,这个杯子和甜甜圈是一样的,所以我不洗也没关系。
|
||||
* *(个人)* **降噪耳塞**:在这个世界里,只有我和上帝在对话。
|
||||
|
||||
#### 8. 物理 (Physics)
|
||||
* **光学平台**:千万别碰!这一碰,那个博士生可能就要延毕半年。
|
||||
* **低温恒温器**:比你前任的心还要冷。
|
||||
* **示波器**:看着那条跳动的波浪线,仿佛看到了自己心律不齐的心电图。
|
||||
* **激光器**:注意安全,不要用剩下的那只眼睛去看光束。
|
||||
* **超算终端**:正在模拟宇宙大爆炸,别用它挖矿!
|
||||
* *(个人)* **绝缘手套**:我不怕死,我怕被电死后没人整理数据。
|
||||
* *(个人)* **护目镜**:为了在40岁时还能看清视力表上的第一行。
|
||||
* *(个人)* **万用表**:哪里不通点哪里,虽然通常是我脑子不通。
|
||||
* *(个人)* **费曼讲义**:遇到不懂的就翻一翻,虽然翻了也不懂,但心里踏实。
|
||||
* *(个人)* **胶带**:如果万有引力失效了,试试用胶带粘一下。
|
||||
|
||||
#### 9. 机械 (Mechanical Eng)
|
||||
* **数控机床**:削铁如泥,削手指也如泥,请保持敬畏。
|
||||
* **万能试验机**:看着材料被拉断的一瞬间,有一种变态的快感。
|
||||
* **3D扫描仪**:抄作业的高级形式,我们称之为“逆向工程”。
|
||||
* **焊接台**:焊锡的烟味,是机械男独特的古龙水。
|
||||
* **行车/吊车**:能举起几吨重的钢板,却举不起我不及格的绩点。
|
||||
* *(个人)* **游标卡尺**:即使是买煎饼果子,我也想量量薄脆的厚度。
|
||||
* *(个人)* **工装裤**:口袋里装着整个五金店。
|
||||
* *(个人)* **劳保手套**:戴上它,你就是工地之王,或者实验室苦力。
|
||||
* *(个人)* **润滑油 (WD-40)**:甚至想给生锈的人际关系喷一点。
|
||||
* *(个人)* **安全帽**:主要是为了防备天花板上掉下来的螺丝,或者导师的怒火。
|
||||
|
||||
#### 10. 哲学 (Philosophy)
|
||||
* **安乐椅**:我不是在睡觉,我是在进行深度的形而上学沉思。
|
||||
* **经典藏书墙**:大多数书页都没切开,但摆着能吓唬人。
|
||||
* **壁炉**:火光中跳动着赫拉克利特的逻各斯。
|
||||
* **猫**:它既在这里,又不在这里,取决于你是否去观测猫砂盆。
|
||||
* **圆形讨论桌**:没有棱角,就像我们的结论一样模棱两可。
|
||||
* *(个人)* **烟斗**:不一定要抽,叼着它能让你的废话听起来像真理。
|
||||
* *(个人)* **单片眼镜**:戴上它,连看外卖单都像是在审视契约论。
|
||||
* *(个人)* **笔记本**:上面写满了关于“无”的定义,所以它基本上是空的。
|
||||
* *(个人)* **行走手杖**:模仿康德散步,虽然我只走去食堂。
|
||||
* *(个人)* **酒壶**:狄奥尼索斯精神的液态载体。
|
||||
|
||||
#### 11. 经济学 (Economics)
|
||||
* **彭博终端**:其实我只会用它查股价,但这就够了。
|
||||
* **多屏股票看板**:红红绿绿的线条,不仅伤眼,还伤钱。
|
||||
* **沙盘推演台**:在这里,我们假设人是理性的,这本身就很不理性。
|
||||
* **打印机**:每分钟吐出60张废纸,模拟通货膨胀的速度。
|
||||
* **茶歇台**:很多几百万的项目,就是在这吃饼干的时候谈成的。
|
||||
* *(个人)* **计算器**:算得清每一个小数点,算不清这顿饭谁请客。
|
||||
* *(个人)* **定制西装**:把自己包装成成功人士,是为了骗取真正的成功人士的经费。
|
||||
* *(个人)* **名片夹**:虽然大概率会被扔进垃圾桶,但递出去的姿势要帅。
|
||||
* *(个人)* **《国富论》**:最适合压泡面的书,厚度适中。
|
||||
* *(个人)* **公文包**:里面可能只装了一个三明治,但拎着像装了三亿。
|
||||
|
||||
#### 12. 法学 (Law)
|
||||
* **模拟法庭**:在这里吵架是合法的,甚至是有学分的。
|
||||
* **卷宗柜**:散发着陈旧纸张的味道,那是正义(和灰尘)的气息。
|
||||
* **录音笔/设备**:你说出的每一句话,都可能成为呈堂证供。
|
||||
* **打印复印一体机**:法学生的亲生父母,甚至想叫它一声妈。
|
||||
* **宣誓台**:站上去的时候觉得自己像美剧男主,下来还要去背法条。
|
||||
* *(个人)* **法槌**:淘宝买的,主要用来在舍友打游戏太吵时敲桌子。
|
||||
* *(个人)* **假发**:戴上它,你就不是秃头,你是尊贵的秃头。
|
||||
* *(个人)* **六法全书**:居家旅行、防身自卫必备板砖。
|
||||
* *(个人)* **保温杯**:因为哪怕不说话,叹气多了也费嗓子。
|
||||
* *(个人)* **录音笔**:我有权保持沉默,但你没有。
|
||||
|
||||
#### 13. 文学 (Literature)
|
||||
* **复古打字机**:听着这清脆的敲击声,感觉自己是海明威,虽然写的是请假条。
|
||||
* **落地灯**:光线越暗,作品越深刻,视力越模糊。
|
||||
* **期刊阅览架**:看看谁又在圈子里互吹了。
|
||||
* **影音室**:我们不是在看电影摸鱼,我们是在进行“文本解构”。
|
||||
* **废稿焚烧炉**:如果不能流芳百世,至少不要遗臭万年。
|
||||
* *(个人)* **贝雷帽**:戴上它,我就不再是无业游民,而是自由撰稿人。
|
||||
* *(个人)* **钢笔**:墨水漏在口袋里,那是文人的血泪。
|
||||
* *(个人)* **黑框眼镜**:哪怕没有镜片,也要戴着增加书卷气。
|
||||
* *(个人)* **围巾**:即使是夏天也要戴,为了营造一种随时准备流浪的氛围。
|
||||
* *(个人)* **香烟/咖啡**:灵感缪斯也是需要贡品的。
|
||||
|
||||
#### 14. 农学 (Agriculture)
|
||||
* **智能温室**:这里的番茄比我还娇贵,但我不能吃它们。
|
||||
* **种子库**:末日降临时,这里是人类最后的希望,现在是老鼠的自助餐。
|
||||
* **土壤分析仪**:这块土缺氮磷钾,就像我缺钱一样明显。
|
||||
* **农用无人机**:原本是撒农药的,偶尔也用来给隔壁村送情书。
|
||||
* **品尝台**:整个学校最受欢迎的实验室,前提是实验品种没毒。
|
||||
* *(个人)* **草帽**:路飞戴它是为了当海贼王,我戴它是为了不中暑。
|
||||
* *(个人)* **胶鞋**:时尚界管这叫Hunter Boots,我们管这叫插秧鞋。
|
||||
* *(个人)* **锄头**:挖坑是一门学问,不管是挖土还是给导师挖。
|
||||
* *(个人)* **驱蚊水**:比起挂科,我更怕登革热。
|
||||
* *(个人)* **水壶**:里面装的可能是水,也可能是散装白酒。
|
||||
|
||||
#### 15. 管理学 (Management)
|
||||
* **圆桌**:没有主次之分,方便大家互相推卸责任。
|
||||
* **投影仪**:只要PPT够亮,就能以此掩盖内容的空洞。
|
||||
* **案例库服务器**:存放了无数个别人的成功,来解释我们的失败。
|
||||
* **高尔夫推杆练习器**:假装我们在谈几亿的生意,其实只是在办公室发呆。
|
||||
* **水晶奖杯陈列柜**:空的也没关系,淘宝批发的奖杯看起来也挺真的。
|
||||
* *(个人)* **蓝牙耳机**:其实没在通话,戴着只是为了不想听别人说话。
|
||||
* *(个人)* **PPT翻页器**:我的魔法棒,点击下一页,这页的废话就讲完了。
|
||||
* *(个人)* **日程本**:写满了会议,但没有一项是关于“干实事”的。
|
||||
* *(个人)* **领带/丝巾**:勒紧脖子,时刻提醒自己是社畜。
|
||||
* *(个人)* **秒表**:用来计算上厕所的时间,这就叫泰勒管理学。
|
||||
|
||||
#### 16. 艺术 (Art)
|
||||
* **画架/工作台**:上面那幅画已经放了三个月了,我称之为“酝酿”。
|
||||
* **Mac Studio**:性能过剩,但这符合极简主义美学。
|
||||
* **3D打印机**:打印出来的东西大多是废料,但我们叫它“后现代解构”。
|
||||
* **聚光灯**:哪怕是一坨泥巴,打上灯光就是艺术装置。
|
||||
* **人体模特**:深夜加班时,总觉得它换了个姿势。
|
||||
* *(个人)* **围裙**:上面的颜料比我的衣服还贵。
|
||||
* *(个人)* **调色盘**:有时候调色盘本身比画更像一幅画。
|
||||
* *(个人)* **数位板**:这块板子承载了太多的撤销(Ctrl+Z)。
|
||||
* *(个人)* **单反相机**:主要是为了拍展板,次要是为了拍帅哥美女。
|
||||
* *(个人)* **速写本**:前几页画得很认真,后面全是电话号码和涂鸦。
|
||||
376
docs/角色与羁绊系统.md
Normal file
376
docs/角色与羁绊系统.md
Normal file
@ -0,0 +1,376 @@
|
||||
|
||||
# 标签和羁绊系统
|
||||
|
||||
这是一个非常精准且符合品类的改进方向。将自走棋经典的**“种族(Race)+ 职业(Class)”**系统,转化为**“人群画像(Archetype)+ 职能分工(Role)”**,可以完美融入高校题材,而且不会觉得突兀——因为在现实中,实验室的“风气”确实是由人群数量决定的。
|
||||
|
||||
我们将这个系统重新命名为:**“实验室生态系统”**。
|
||||
|
||||
* **人群画像 (可叠层/羁绊):** 决定了实验室的**“氛围/风气”**(被动光环)。
|
||||
* **职能分工 (可叠层/羁绊):** 决定了工作的**“流水线效率”**(技能增强)。
|
||||
* **个人怪癖 (不可叠层/天赋):** 决定了单卡的**“神来之笔或定时炸弹”**(独立Buff)。
|
||||
|
||||
以下是重新设计的详细方案:
|
||||
|
||||
---
|
||||
|
||||
### 一、 机制重构:如何“叠层”才合理?
|
||||
|
||||
在传统自走棋里,凑齐 3 个法师会增加法强。
|
||||
在《最强导师》里,**凑齐 3 个“卷王”,会形成“内卷力场”**。
|
||||
|
||||
**设定逻辑:**
|
||||
* **层数命名:** 2人成伴 $\rightarrow$ 4人成团 $\rightarrow$ 6人成军(或者:小组 $\rightarrow$ 团队 $\rightarrow$ 学派)。
|
||||
* **视觉反馈:** 当某种羁绊激活时,实验室会有对应的环境特效。例如“摸鱼”层数高时,实验室里会飘着零食袋和枕头;“卷王”层数高时,实验室灯光会变成惨白的通宵灯。
|
||||
|
||||
---
|
||||
|
||||
### 二、 人群画像 (Archetypes) - 相当于“种族”
|
||||
*决定团队的生存、资源与抗性*
|
||||
|
||||
#### 1. 【卷王】 (The Grinder)
|
||||
*描述:以实验室为家,以此为荣,甚至为此感到兴奋的生物。*
|
||||
* **(2) 内卷漩涡:** 全员攻速 +15%,但压力自然增长率 +20%。
|
||||
* **(4) 996福报:** 全员攻速 +35%。当一名卷王压力爆表时,不会崩溃,而是进入“狂暴工作”状态(HP扣除加倍,效率翻倍),持续 10 秒后才倒下。
|
||||
* **(6) 永动机:** 全员攻速 +60%。所有学生免疫“睡眠”需求,且不再消耗体力,直接消耗寿命(高风险高回报)。
|
||||
|
||||
#### 2. 【摸鱼党】 (The Slacker)
|
||||
*描述:能够精准找到监控死角,擅长带薪拉屎和传播八卦。*
|
||||
* **(2) 劳逸结合:** 处于休息区的单位,心情恢复速度 +50%。
|
||||
* **(4) 快乐病毒:** 全员压力上限 +30%。当摸鱼党在场时,周围格子的队友有 20% 概率被传染,停手 2 秒,但回复 10 点心情。
|
||||
* **(6) 摆烂哲学:** 即使 Deadline 到期任务失败,也不会扣除声望(心态极好),只会扣除金钱。
|
||||
|
||||
#### 3. 【富家子弟】 (The Elite)
|
||||
*描述:带资进组,甚至可能是校董的亲戚。*
|
||||
* **(2) 自带干粮:** 每回合结束时,获得 10% 的利息(基于当前资金)。
|
||||
* **(4) 钞能力:** 可以在商店刷新出更高一级的道具。每次购买道具时,随机返还 50% 费用。
|
||||
* **(6) 校董光环:** 开启“赞助商通道”。可以直接花钱(巨款)买掉任务进度,无需工作。
|
||||
|
||||
#### 4. 【天才】 (The Prodigy)
|
||||
*描述:智商极高,性格极怪,往往看不起凡人。*
|
||||
* **(2) 灵光一闪:** 攻击(工作)时有 15% 概率造成 300% 暴击伤害。
|
||||
* **(4) 智商碾压:** 面对 S 级以上的高难任务时,暴击率提升至 50%,且无视任务抗性。
|
||||
* **(6) 孤独求败:** 场上每少一个单位(人数越少),天才的属性越高。如果只剩天才一人,全属性 +200%。
|
||||
|
||||
#### 5. 【关系户/甚至是狗】 (The Mascot)
|
||||
*描述:虽然干活不行,但能提供极高的情绪价值或行政便利。*
|
||||
* **(2) 吉祥物:** 只要场上有关系户存活,全队心情每秒 +1。
|
||||
* **(4) 上面有人:** 行政楼的办事效率 +100%,且免疫“被抓壮丁”等负面事件。
|
||||
|
||||
---
|
||||
|
||||
### 三、 职能分工 (Roles) - 相当于“职业”
|
||||
*决定对特定类型任务的杀伤力*
|
||||
|
||||
#### 1. 【代码工】 (Coder)
|
||||
*专攻:工程类任务、机房*
|
||||
* **(2) 结对编程:** 工程任务伤害 +20%。
|
||||
* **(4) Github Copilot:** 每次攻击有 30% 概率触发“复制粘贴”,额外造成一次伤害。
|
||||
* **(6) 全栈大神:** 所有的“代码工”获得远程攻击能力(无需移动到工位,在任何地方都能修Bug)。
|
||||
|
||||
#### 2. 【写手】 (Writer)
|
||||
*专攻:论文类任务、图书馆*
|
||||
* **(2) 润色:** 论文进度条在最后 20% 时,攻速翻倍。
|
||||
* **(4) 引用狂魔:** 每完成一篇论文,全队获得一层永久的“学术声望”Buff(提升 5% 效率)。
|
||||
* **(6) 自动生成:** 论文类任务不再需要“灵感”阶段,直接进入“写作”阶段。
|
||||
|
||||
#### 3. 【实验狗】 (Lab Rat)
|
||||
*专攻:实验类任务、实验室*
|
||||
* **(2) 熟练工:** 移动速度 +30%(为了在仪器间奔波)。
|
||||
* **(4) 绝命毒师:** 实验类任务产出的资金收益 +40%(可能是卖了多余的试剂)。
|
||||
* **(6) 量子波动:** 同时可以操作两台实验设备(双持)。
|
||||
|
||||
#### 4. 【演说家】 (Presenter)
|
||||
*专攻:答辩、组会、申请经费*
|
||||
* **(2) PPT大师:** 组会/答辩的成功率 +20%。
|
||||
* **(4) 忽悠:** 申请项目经费时,有 50% 概率获得双倍经费。
|
||||
* **(6) 精神领袖:** 演说家的存在会让周围队友的压力停止增长(都在听他画饼)。
|
||||
|
||||
---
|
||||
|
||||
### 四、 个人怪癖 (Traits) - 独立Buff (不可叠层)
|
||||
*这些是随机附着在棋子上的“前缀”,类似Roguelike词条,用于区分同类棋子。*
|
||||
|
||||
1. **【咖啡因依赖】**:必须装备咖啡道具才能工作,否则攻速-50%。
|
||||
2. **【夜猫子】**:18:00 后全属性翻倍,白天梦游。
|
||||
3. **【强迫症】**:必须把任务进度条推到 100% 才肯停手(哪怕 90% 就算通过),但也因此获得额外奖励。
|
||||
4. **【二次元】**:如果工位旁边有“手办”装饰,心情永不降低。
|
||||
5. **【玻璃心】**:一旦被骂(被导师技能击中)或论文被拒,直接晕厥 1 回合。
|
||||
6. **【大胃王】**:消耗双倍工资(饭补),但体力上限也是双倍。
|
||||
7. **【社恐】**:如果周围 1 格内有其他人,效率 -30%;独自一人时效率 +30%。
|
||||
8. **【社牛】**:如果周围 1 格内有其他人,双方效率都 +15%。
|
||||
9. **【锦鲤】**:参与的任务必定不会触发“坏事件”。
|
||||
10. **【倒霉蛋】**:参与的任务触发坏事件概率翻倍,但经验获取 +50%(吃一堑长一智)。
|
||||
11. **【键盘侠】**:在“网络对线/公关”类任务中效率极高。
|
||||
12. **【颜控】**:如果导师(玩家)使用了好看的皮肤,或者队友里有魅力高的角色,他的忠诚度很难下降。
|
||||
13. **【老好人】**:经常帮别人做任务(自动寻路去未分配的任务点),但容易过劳。
|
||||
14. **【刺头】**:无法被导师手动控制/拖拽,只能靠AI行动。属性极高。
|
||||
15. **【甚至不是人】**:(如ChatGPT成精)不需要休息,没有心情,但需要消耗巨额“算力”资源。
|
||||
|
||||
---
|
||||
|
||||
### 五、 游戏内的融合方式 (UI/UX)
|
||||
|
||||
1. **招募界面(简历筛选):**
|
||||
* 每张学生卡牌左上角显示 **[图标] 卷王**,右上角显示 **[图标] 代码工**。
|
||||
* 下方文字栏显示灰色小字:*“怪癖:咖啡因依赖”*。
|
||||
* **UI提示:** 当鼠标悬停时,左侧显示目前的羁绊进度(如:目前场上卷王 2/4,再买这个就凑齐 4 了)。
|
||||
|
||||
2. **视觉风格化:**
|
||||
* **2 卷王:** 大家的头带上了“奋斗”头巾。
|
||||
* **4 卷王:** 实验室背景音乐变快,所有角色移动出现残影。
|
||||
* **6 卷王:** 屏幕边缘出现火焰特效,角色眼睛发红光。
|
||||
|
||||
3. **策略深度:**
|
||||
* 前期(青椒阶段):可能需要凑 **(2) 富家子弟** 来维持经济,或者 **(2) 摸鱼党** 来省去心理治疗的钱。
|
||||
* 中期(攻坚阶段):必须凑齐 **(4) 代码工** 或 **(4) 写手** 才能在 Deadline 前完成任务。
|
||||
* 后期(学阀阶段):尝试构建 **(6) 天才** 的精英流,或者 **(6) 卷王** 的人海战术流。
|
||||
|
||||
这样修改后,“叠层”机制就不再是一个生硬的游戏术语,而是变成了**“我这个实验室现在的风气是怎样的”**,代入感和策略性都得到了提升。
|
||||
这是一个非常棒的细化方向。将“职能”与“学科”挂钩,不仅能体现不同专业的特色(文科不需要做生化实验,理科不需要田野调查),还能极大地丰富游戏的重玩性——**选择不同的开局学科,就是选择不同的棋子池和玩法流派。**
|
||||
|
||||
为了解决通用性与特殊性的问题,我们将职业(Role)分为两大类:
|
||||
1. **通用教职 (Common Faculty):** 所有学科都需要的通用技能(写论文、答辩、跑腿)。
|
||||
2. **专业专精 (Discipline Specialists):** 根据你开局选择的学科,限定出现的特定职业。
|
||||
|
||||
---
|
||||
|
||||
### 一、 学科与职业的映射关系 (The Discipline Matrix)
|
||||
|
||||
在游戏开始时,玩家选择学科,这将决定卡池中会出现哪些“专业专精”棋子。
|
||||
|
||||
| 职业分类 | 对应学科 (Disciplines) | 核心玩法风格 |
|
||||
| :--- | :--- | :--- |
|
||||
| **【炼金术士】 (The Alchemist)** | 生物、化学、环境、材料、基础医学、农学 | **烧钱流**。高耗材、高风险(爆炸)、高产出。依赖“实验室”。 |
|
||||
| **【极客】 (The Geek)** | 计算机、物理、数学、机械 | **算力流**。消耗“算力/电费”,解决Bug,依赖“机房”。 |
|
||||
| **【调研员】 (The Surveyor)** | 经济学、管理、法学、社会学* | **跑图流**。需频繁外出(去地图边缘采集数据/问卷),依赖“移动速度”。 |
|
||||
| **【思想者】 (The Thinker)** | 哲学、文学、艺术、(理论数学/物理)* | **灵感流**。不需要设备,需要“悟性”和“书”,极度依赖心情和San值。 |
|
||||
|
||||
*(注:某些学科如数学、物理,可能同时兼容极客与思想者)*
|
||||
|
||||
---
|
||||
|
||||
### 二、 通用教职 (Common Roles) - 所有学科共有
|
||||
*无论你是搞哲学的还是搞生化的,论文都得写,经费都得拉,章都得盖。*
|
||||
|
||||
#### 1. 【笔杆子】 (Scribe)
|
||||
* **定位:** 输出辅助 / 后期核心
|
||||
* **适用场景:** 图书馆、撰写阶段
|
||||
* **(2) 妙笔生花:** 写作/润色速度 +20%。
|
||||
* **(4) 引用狂魔:** 只要有【笔杆子】参与的论文,发表后获得的声望值 +15%(善于提升影响因子)。
|
||||
* **(6) 学术灌水:** 激活“一稿多投”或“拆分发表”技能。一个任务可以拆成两篇论文发表(收益翻倍,但有小概率被撤稿)。
|
||||
|
||||
#### 2. 【大忽悠】 (Orator)
|
||||
* **定位:** 资源获取 / 控场
|
||||
* **适用场景:** 会议室、答辩、拉赞助
|
||||
* **(2) 讲故事:** 组会/答辩成功率 +20%。
|
||||
* **(4) 画饼大师:** 申请项目经费时,额外获得 30% 的资金。
|
||||
* **(6) 精神控制:** 只要【大忽悠】在场,所有人心情下降速度减半(他能让大家相信996是福报)。
|
||||
|
||||
#### 3. 【管家】 (Steward)
|
||||
* **定位:** 辅助 / 坦克(抗压)
|
||||
* **适用场景:** 行政楼、财务报销、设备维护
|
||||
* **(2) 跑腿侠:** 在行政楼办事的效率 +50%(哪怕财务大妈脸再难看,他也能搞定)。
|
||||
* **(4) 报销圣手:** 购买道具、维护设备的费用降低 20%。
|
||||
* **(6) 完美后勤:** 自动为周围一格的队友补充体力(递咖啡/点外卖),无需玩家操作。
|
||||
|
||||
---
|
||||
|
||||
### 三、 专业专精 (Specialized Roles) - 学科限定
|
||||
*这是区分玩法的关键。*
|
||||
|
||||
#### 1. 【炼金术士】 (The Alchemist)
|
||||
* **限定学科:** 生物、化学、环境、材料、医学、农学
|
||||
* **核心机制:** **试剂消耗**。每次攻击(做实验)需要消耗金钱(买耗材)。
|
||||
* **(2) 熟练工:** 耗材成本降低 20%。
|
||||
* **(4) 绝命毒师:** 实验成功率大幅提升,但每次实验有 5% 概率引发“小爆炸”(扣除周围人HP,设施损坏)。
|
||||
* **(6) 提桶跑路:** 哪怕实验失败(爆炸),也能从中提取出数据发表论文(坏结果也是结果),失败不再归零进度。
|
||||
* *点评:* “这也是我们生化环材被称为天坑的原因——太费钱了。”
|
||||
|
||||
#### 2. 【极客】 (The Geek)
|
||||
* **限定学科:** 计算机、物理、数学、机械
|
||||
* **核心机制:** **算力负荷**。攻击依赖机房算力,算力不足时攻击力为0。
|
||||
* **(2) 这里的黎明静悄悄:** 降低机房的噪音和发热,算力恢复速度 +20%。
|
||||
* **(4) 代码复用:** 遇到同类任务时,直接继承 30% 进度(Ctrl+C/V)。
|
||||
* **(6) 赛博飞升:** 可以远程办公(无需移动到机房,在宿舍也能满效率跑代码),且免疫“断网”事件。
|
||||
* *点评:* “只要键盘还在响,项目就有希望。”
|
||||
|
||||
#### 3. 【调研员】 (The Surveyor)
|
||||
* **限定学科:** 经济、管理、法学
|
||||
* **核心机制:** **数据挖掘**。需要去地图上随机刷新的“采样点”呆够时间,然后带回实验室分析。
|
||||
* **(2) 飞毛腿:** 移动速度 +30%。
|
||||
* **(4) 问卷回收:** 每次完成外出采样,有概率带回额外的“小道消息”(解锁隐藏任务或少量经费)。
|
||||
* **(6) 大数据杀熟:** 能够分析出审稿人的喜好,从而精确调整论文参数,通过率翻倍。
|
||||
* *点评:* “为了一个样本,我在行政楼门口蹲了三天。”
|
||||
|
||||
#### 4. 【思想者】 (The Thinker)
|
||||
* **限定学科:** 哲学、文学、艺术
|
||||
* **核心机制:** **顿悟 (Epiphany)**。攻击速度极慢,但有概率触发“顿悟”,瞬间造成巨额进度推进。
|
||||
* **(2) 苦吟:** 基础攻速降低,但顿悟概率 +10%。
|
||||
* **(4) 疯魔:** 心情越低(越痛苦),顿悟概率越高。在心情 < 20 时,顿悟是一击必杀。
|
||||
* **(6) 传世之作:** 一旦完成 S 级任务,直接获得大量声望,且该角色获得“大师”光环(周围人膜拜,不会掉忠诚)。
|
||||
* *点评:* “痛苦是创作的源泉,所以请继续折磨我,导师。”
|
||||
|
||||
---
|
||||
|
||||
### 四、 混合学科的策略示例
|
||||
|
||||
在游戏中,有些学科可以跨界招募(由“天赋树”解锁或特殊事件触发),产生有趣的化学反应:
|
||||
|
||||
1. **生物信息学 (Bioinformatics) 流派:**
|
||||
* **组合:** 4 【炼金术士】 + 2 【极客】
|
||||
* **效果:** 既能做湿实验,又能自己跑数据分析。
|
||||
* **羁绊特效:** 实验产生的大数据可以直接被极客消化,不需要转换时间。
|
||||
|
||||
2. **法经济学 (Law & Econ) 流派:**
|
||||
* **组合:** 4 【调研员】 + 2 【大忽悠】
|
||||
* **效果:** 极强的找数据能力 + 极强的辩护/忽悠能力。
|
||||
* **羁绊特效:** 基本上没有拉不到的经费,也没有打不赢的官司(Reviewer申诉必胜)。
|
||||
|
||||
3. **数字媒体艺术 (Digital Art) 流派:**
|
||||
* **组合:** 4 【思想者】 + 2 【极客】
|
||||
* **效果:** 用代码写诗,用算法画画。
|
||||
* **羁绊特效:** 极客为思想者提供稳定的产出下限,思想者为极客提供上限爆发。
|
||||
|
||||
---
|
||||
|
||||
这样设计后,**“选专业”**就不再只是一个文本标签,而是直接决定了:
|
||||
* 你的核心资源是什么(钱?算力?San值?跑图时间?)
|
||||
* 你的战斗节奏是什么(平稳输出?憋大招爆发?赌博?)
|
||||
* 你的团队构成是什么。
|
||||
|
||||
这完美解决了“文科生不需要做实验”的逻辑漏洞,同时也大大加深了游戏的策略池。
|
||||
|
||||
这是一个极具策略深度的改进点。将**个人怪癖 (Traits)** 与 **羁绊叠层 (Stacking)** 挂钩,可以让棋子的价值不再仅仅取决于面板数值,而是取决于他在“构筑 (Build)”中的位置。
|
||||
|
||||
这一类怪癖我们称为 **“催化剂特质” (Catalyst Traits)**。它们可以视为“万能牌”、“增幅器”或者“阻断剂”。
|
||||
|
||||
以下是针对“实验室生态(人群)”和“职能分工(职业)”设计的 20 个互动型怪癖:
|
||||
|
||||
---
|
||||
|
||||
### 一、 增益型:为了凑羁绊而生 (Bond Boosters)
|
||||
*这些棋子是构筑流派的核心插件,或者是前期的强力打工仔。*
|
||||
|
||||
#### 1. 【学术变色龙】 (Academic Chameleon)
|
||||
* **效果:** 该单位入场时,自动**模仿**队伍中当前层数最高的“人群画像”羁绊(如场上卷王最多,他自动视为卷王)。
|
||||
* **叠层互动:** 视为 1 个单位,但类型灵活。
|
||||
* **点评:** “为了混进圈子,他什么都能演。”
|
||||
|
||||
#### 2. 【简历注水】 (Resume Padder)
|
||||
* **效果:** 该单位在计算“职能分工”羁绊时,**视为 2 个单位**。但他本人的实际工作效率 -30%。
|
||||
* **叠层互动:** 快速凑齐 (4) 或 (6) 层羁绊的强力挂件。
|
||||
* **点评:** “虽然代码不是他写的,但项目组名单里他排第一个。”
|
||||
|
||||
#### 3. 【跨学科天才】 (Interdisciplinary)
|
||||
* **效果:** 同时拥有【炼金术士】和【极客】(或随机两个职业)的双重标签。
|
||||
* **叠层互动:** 可以同时为两个职业羁绊提供层数 +1。
|
||||
* **点评:** “生物里代码写得最好的,码农里最懂分子式的。”
|
||||
|
||||
#### 4. 【精神股东】 (Fanatic)
|
||||
* **效果:** 如果当前激活了【卷王】或【富家子弟】羁绊,该单位享受的羁绊加成效果 **翻倍**。
|
||||
* **叠层互动:** 单体享受双倍Buff。
|
||||
* **点评:** “明明拿的是实习生的工资,操的却是CEO的心。”
|
||||
|
||||
#### 5. 【气氛组】 (Hype Man)
|
||||
* **效果:** 只要他在场,当前激活的所有羁绊层数需求 **-1**(例如原本 4 人触发的效果,现在 3 人即可触发)。但全队压力增长 +10%。
|
||||
* **叠层互动:** 降低触发门槛(仅限第二层级以上)。
|
||||
* **点评:** “只要我不尴尬,这个组就是世界一流团队。”
|
||||
|
||||
#### 6. 【领头羊】 (Alpha)
|
||||
* **效果:** 必须作为队长(放在特定核心格子上)才能生效。使当前最高的职业羁绊等级 **+1**(突破上限,如创造出 7 层羁绊效果)。
|
||||
* **叠层互动:** 突破上限。
|
||||
* **点评:** “他重新定义了这个专业。”
|
||||
|
||||
---
|
||||
|
||||
### 二、 减益/干扰型:副作用与高回报 (Disruptors)
|
||||
*这些棋子通常数值极高,但会破坏团队化学反应,适合“独狼”或特定解法。*
|
||||
|
||||
#### 7. 【害群之马】 (Black Sheep)
|
||||
* **效果:** 该单位的全属性 +50%(极强),但在计算任何羁绊层数时,**视为 -1 个单位**。
|
||||
* **叠层互动:** 扣除层数。可能导致原本激活的 (4) 层掉回 (3) 层。
|
||||
* **点评:** “技术是大牛,但只要他在,团队就没法团结。”
|
||||
|
||||
#### 8. 【独行侠】 (Lone Wolf)
|
||||
* **效果:** 如果该单位**没有**激活任何羁绊(既不是卷王也不享受职业加成),攻击力 +100%。
|
||||
* **叠层互动:** 只有不叠层才强。
|
||||
* **点评:** “我不抱团,我就是大腿。”
|
||||
|
||||
#### 9. 【熵增发生器】 (Entropy Generator)
|
||||
* **效果:** 随机**无效化**场上的一个已激活羁绊,转化为全队的“吸血”效果(工作回心情)。
|
||||
* **叠层互动:** 献祭羁绊换取生存。
|
||||
* **点评:** “毁灭秩序,带来混乱的快乐。”
|
||||
|
||||
#### 10. 【鄙视链顶端】 (Elitist)
|
||||
* **效果:** 如果他在场,**除他以外**的所有同职业棋子(如其他写手)羁绊收益归零,但他本人获得所有被归零收益的总和。
|
||||
* **叠层互动:** 吸星大法,献祭队友养大哥。
|
||||
* **点评:** “文无第一,但我就是第一,你们都是垃圾。”
|
||||
|
||||
#### 11. 【社恐患者】 (Social Phobia)
|
||||
* **效果:** 如果激活了【人群画像】(如卷王/摸鱼党)这种涉及社交氛围的羁绊,他会立刻**逃跑**(离场或停止工作)。只有在“无阵营”状态下才能工作。
|
||||
* **叠层互动:** 互斥机制。
|
||||
* **点评:** “人一多我就想吐。”
|
||||
|
||||
---
|
||||
|
||||
### 三、 特殊机制型:动态与随机 (Special Mechanics)
|
||||
*增加Roguelike的不可预测性。*
|
||||
|
||||
#### 12. 【墙头草】 (Bandwagoner)
|
||||
* **效果:** 每回合开始时,随机变成场上人数最多的那个职业。
|
||||
* **叠层互动:** 动态补位。
|
||||
* **点评:** “这就是所谓的'追逐热点',哪个方向火我就搞哪个。”
|
||||
|
||||
#### 13. 【卧底】 (Imposter)
|
||||
* **效果:** 表面上显示为【卷王】,实际上在计算层数时视为【摸鱼党】。
|
||||
* **叠层互动:** 欺骗玩家(或者在PVP/对抗模式中欺骗对手)。
|
||||
* **点评:** “看他在疯狂敲键盘,其实是在和群友对喷。”
|
||||
|
||||
#### 14. 【催化剂】 (Catalyst)
|
||||
* **效果:** 他不提供层数,但能改变羁绊的**性质**。
|
||||
* 例如:让【卷王】羁绊的“攻速加成”变为“金钱产出”。
|
||||
* 例如:让【摸鱼党】羁绊的“心情恢复”变为“甚至能恢复压力(San值)”。
|
||||
* **叠层互动:** 质变。
|
||||
* **点评:** “他改变了这股风气的走向。”
|
||||
|
||||
#### 15. 【内卷终结者】 (The Breaker)
|
||||
* **效果:** 当【卷王】层数达到 (6) 时,他会自爆,清空所有卷王层数,并给予全队一个巨额的“解放”Buff(瞬间完成当前任务)。
|
||||
* **叠层互动:** 阈值触发型核弹。
|
||||
* **点评:** “同归于尽吧,该死的KPI!”
|
||||
|
||||
#### 16. 【学术寄生虫】 (Parasite)
|
||||
* **效果:** 只要场上有任何 (4) 层以上的羁绊激活,该单位每回合自动升级(星级/属性提升),但他自己不贡献层数。
|
||||
* **叠层互动:** 纯收益者。
|
||||
* **点评:** “大树底下好乘凉。”
|
||||
|
||||
#### 17. 【教条主义者】 (Purist)
|
||||
* **效果:** 只有当全队**所有单位**都是同一个职业(如全是代码工)时,全队属性 +50%。只要混入一个异类,加成消失。
|
||||
* **叠层互动:** 纯色队核心。
|
||||
* **点评:** “我们的血统必须纯正。”
|
||||
|
||||
#### 18. 【客座教授】 (Visiting Scholar)
|
||||
* **效果:** 每回合随机获得一个不同的职业标签(本回合是【笔杆子】,下回合是【大忽悠】)。
|
||||
* **叠层互动:** 随机性补位。
|
||||
* **点评:** “我在很多领域都有涉猎……虽然都不精。”
|
||||
|
||||
#### 19. 【镜像】 (Mirror)
|
||||
* **效果:** 复制站在他**左边**那个棋子的所有职业和人群标签。
|
||||
* **叠层互动:** 位置相关的复制。
|
||||
* **点评:** “导师,我也想做师兄那个课题。”
|
||||
|
||||
#### 20. 【负重训练】 (Weight Trainer)
|
||||
* **效果:** 他使所有羁绊的触发门槛 **+1**(例如需要 3 人才能触发 2 人效果),但一旦触发,效果提升 **150%**。
|
||||
* **叠层互动:** 提高门槛换取高强度的后期流派。
|
||||
* **点评:** “我们要走精英路线,不是什么阿猫阿狗都能进来的。”
|
||||
|
||||
---
|
||||
|
||||
### 设计总结
|
||||
|
||||
通过引入这些对叠层机制进行**增益(Amplifiers)、伪装(Masqueraders)、破坏(Saboteurs)**的特质,游戏的策略空间被大幅拉伸了:
|
||||
|
||||
* **初期:** 玩家可能会为了凑齐 (2) 层羁绊,不得不忍受一个带有【简历注水】但属性很差的棋子。
|
||||
* **中期:** 玩家可能会遇到一个【害群之马】的S级强卡,为了用他,不得不重构整个队伍,放弃某些羁绊。
|
||||
* **后期:** 玩家可能会利用【领头羊】或【负重训练】来打造一个极致的数值怪物团队。
|
||||
|
||||
这使得“特质”不再是单调的Buff,而是连接“单卡”与“团队”的粘合剂。
|
||||
@ -66,6 +66,10 @@ project/assembly_name="最强导师"
|
||||
version_control/plugin_name="GitPlugin"
|
||||
version_control/autoload_on_startup=true
|
||||
|
||||
[editor_plugins]
|
||||
|
||||
enabled=PackedStringArray("res://addons/csv_resource_importer/plugin.cfg")
|
||||
|
||||
[gui]
|
||||
|
||||
theme/default_font_antialiasing=0
|
||||
|
||||
70
resources/definitions/archetypes.json
Normal file
70
resources/definitions/archetypes.json
Normal file
@ -0,0 +1,70 @@
|
||||
[
|
||||
{
|
||||
"Header": {
|
||||
"Id": "core:archetype_grinder",
|
||||
"Name": {
|
||||
"Key": "archetype.grinder.name",
|
||||
"Fallback": "Grinder"
|
||||
},
|
||||
"Description": {
|
||||
"Key": "archetype.grinder.desc",
|
||||
"Fallback": "They live in the lab and push everything faster."
|
||||
},
|
||||
"Tags": [ "archetype" ]
|
||||
},
|
||||
"Tiers": [
|
||||
{
|
||||
"RequiredCount": 2,
|
||||
"Modifiers": {
|
||||
"AttributeModifiers": [
|
||||
{ "Type": "Activation", "Add": 5, "Multiplier": 1.1 }
|
||||
],
|
||||
"RuleIds": [ "rule:grinder_stress_up" ]
|
||||
}
|
||||
},
|
||||
{
|
||||
"RequiredCount": 4,
|
||||
"Modifiers": {
|
||||
"AttributeModifiers": [
|
||||
{ "Type": "Activation", "Add": 10, "Multiplier": 1.2 }
|
||||
],
|
||||
"RuleIds": [ "rule:grinder_overwork" ]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Header": {
|
||||
"Id": "core:archetype_slacker",
|
||||
"Name": {
|
||||
"Key": "archetype.slacker.name",
|
||||
"Fallback": "Slacker"
|
||||
},
|
||||
"Description": {
|
||||
"Key": "archetype.slacker.desc",
|
||||
"Fallback": "They recover morale but slow down the team."
|
||||
},
|
||||
"Tags": [ "archetype" ]
|
||||
},
|
||||
"Tiers": [
|
||||
{
|
||||
"RequiredCount": 2,
|
||||
"Modifiers": {
|
||||
"StatusModifiers": [
|
||||
{ "Type": "Mood", "Add": 5, "Multiplier": 1.05 }
|
||||
],
|
||||
"RuleIds": [ "rule:slacker_relax" ]
|
||||
}
|
||||
},
|
||||
{
|
||||
"RequiredCount": 4,
|
||||
"Modifiers": {
|
||||
"StatusModifiers": [
|
||||
{ "Type": "Stress", "Add": -5, "Multiplier": 0.9 }
|
||||
],
|
||||
"RuleIds": [ "rule:slacker_spread" ]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
21
resources/definitions/discipline_biology.tres
Normal file
21
resources/definitions/discipline_biology.tres
Normal file
@ -0,0 +1,21 @@
|
||||
[gd_resource type="Resource" script_class="DisciplineDefinitionResource" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://scripts/Core/DisciplineDefinitionResource.cs" id=1]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
Id = "core:discipline_biology_tres"
|
||||
NameKey = "discipline.biology.name"
|
||||
NameFallback = "Biology"
|
||||
DescriptionKey = "discipline.biology.desc"
|
||||
DescriptionFallback = "Lab-intensive discipline focused on experiments."
|
||||
IconPath = ""
|
||||
Tags = [ "discipline" ]
|
||||
BuffNameKey = "buff.pipette_master.name"
|
||||
BuffNameFallback = "Pipette Master"
|
||||
BuffDescriptionKey = "buff.pipette_master.desc"
|
||||
BuffDescriptionFallback = "Higher lab success, higher stamina cost."
|
||||
BuffRuleIds = [ "rule:discipline_biology_pipette_master" ]
|
||||
RolePoolIds = [ "core:role_alchemist", "core:role_lab_rat" ]
|
||||
ItemPoolIds = [ "core:item_pipette" ]
|
||||
TaskKeywordIds = [ "task_keyword_lab" ]
|
||||
68
resources/definitions/disciplines.json
Normal file
68
resources/definitions/disciplines.json
Normal file
@ -0,0 +1,68 @@
|
||||
[
|
||||
{
|
||||
"Header": {
|
||||
"Id": "core:discipline_economics",
|
||||
"Name": {
|
||||
"Key": "discipline.economics.name",
|
||||
"Fallback": "Economics"
|
||||
},
|
||||
"Description": {
|
||||
"Key": "discipline.economics.desc",
|
||||
"Fallback": "Money drives everything; interest becomes a core loop."
|
||||
},
|
||||
"Tags": [ "discipline" ]
|
||||
},
|
||||
"Buff": {
|
||||
"Name": {
|
||||
"Key": "buff.capital_flow.name",
|
||||
"Fallback": "Capital Flow"
|
||||
},
|
||||
"Description": {
|
||||
"Key": "buff.capital_flow.desc",
|
||||
"Fallback": "Idle funds generate interest each turn."
|
||||
},
|
||||
"Modifiers": {
|
||||
"ResourceModifiers": [
|
||||
{ "Type": "Money", "Add": 0, "Multiplier": 1.0 }
|
||||
],
|
||||
"RuleIds": [ "rule:discipline_economics_interest" ]
|
||||
}
|
||||
},
|
||||
"RolePoolIds": [ "core:role_surveyor", "core:role_orator" ],
|
||||
"ItemPoolIds": [ "core:item_bloomberg_terminal" ],
|
||||
"TaskKeywordIds": [ "task_keyword_finance" ]
|
||||
},
|
||||
{
|
||||
"Header": {
|
||||
"Id": "core:discipline_computer",
|
||||
"Name": {
|
||||
"Key": "discipline.computer.name",
|
||||
"Fallback": "Computer Science"
|
||||
},
|
||||
"Description": {
|
||||
"Key": "discipline.computer.desc",
|
||||
"Fallback": "Compute-heavy discipline with strong tech output."
|
||||
},
|
||||
"Tags": [ "discipline" ]
|
||||
},
|
||||
"Buff": {
|
||||
"Name": {
|
||||
"Key": "buff.overclock.name",
|
||||
"Fallback": "Overclock"
|
||||
},
|
||||
"Description": {
|
||||
"Key": "buff.overclock.desc",
|
||||
"Fallback": "Server power is amplified for AI tasks."
|
||||
},
|
||||
"Modifiers": {
|
||||
"AttributeModifiers": [
|
||||
{ "Type": "Engineering", "Add": 5, "Multiplier": 1.05 }
|
||||
],
|
||||
"RuleIds": [ "rule:discipline_computer_overclock" ]
|
||||
}
|
||||
},
|
||||
"RolePoolIds": [ "core:role_geek", "core:role_coder" ],
|
||||
"ItemPoolIds": [ "core:item_rtx_cluster" ],
|
||||
"TaskKeywordIds": [ "task_keyword_ai" ]
|
||||
}
|
||||
]
|
||||
26
scripts/Core/ContentCollectionResource.cs
Normal file
26
scripts/Core/ContentCollectionResource.cs
Normal file
@ -0,0 +1,26 @@
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 资源集合(便于打包多个定义到一个 .tres)
|
||||
/// </summary>
|
||||
[GlobalClass]
|
||||
public partial class ContentCollectionResource : Resource, IContentResourceCollection
|
||||
{
|
||||
[Export] public Array<Resource> Items { get; set; } = new();
|
||||
|
||||
public IEnumerable<IContentResource> GetItems()
|
||||
{
|
||||
foreach (var item in Items)
|
||||
{
|
||||
if (item is IContentResource content)
|
||||
{
|
||||
yield return content;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
299
scripts/Core/ContentRegistry.cs
Normal file
299
scripts/Core/ContentRegistry.cs
Normal file
@ -0,0 +1,299 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using Godot;
|
||||
using Models;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 内容加载与合并(基础 + Mod)
|
||||
/// 设计说明:
|
||||
/// 1) 通过 IContentSource 抽象读取来源,支持 res:// 与 user://mods。
|
||||
/// 2) ContentRegistry 负责合并,同 Id 以后加载覆盖先加载。
|
||||
/// 注意事项:
|
||||
/// - 真实加载逻辑应避免在主线程做大规模 IO。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“补丁合并策略”(例如列表合并/字段覆盖)。
|
||||
/// </summary>
|
||||
public interface IContentSource
|
||||
{
|
||||
int Priority { get; }
|
||||
IEnumerable<T> LoadAll<T>() where T : class;
|
||||
}
|
||||
|
||||
public enum ContentMergeMode
|
||||
{
|
||||
Override,
|
||||
KeepFirst
|
||||
}
|
||||
|
||||
public sealed class ContentRegistry
|
||||
{
|
||||
private readonly List<IContentSource> _sources = new();
|
||||
public ContentMergeMode MergeMode { get; set; } = ContentMergeMode.Override;
|
||||
|
||||
public void RegisterSource(IContentSource source)
|
||||
{
|
||||
_sources.Add(source);
|
||||
_sources.Sort((a, b) => a.Priority.CompareTo(b.Priority));
|
||||
}
|
||||
|
||||
public GameContentDatabase BuildDatabase()
|
||||
{
|
||||
var db = new GameContentDatabase();
|
||||
Merge(db.Disciplines, LoadAll<DisciplineDefinition>(), d => d.Header.Id);
|
||||
Merge(db.Archetypes, LoadAll<ArchetypeDefinition>(), d => d.Header.Id);
|
||||
Merge(db.Roles, LoadAll<RoleDefinition>(), d => d.Header.Id);
|
||||
Merge(db.Traits, LoadAll<TraitDefinition>(), d => d.Header.Id);
|
||||
Merge(db.Tasks, LoadAll<TaskDefinition>(), d => d.Header.Id);
|
||||
Merge(db.Items, LoadAll<ItemDefinition>(), d => d.Header.Id);
|
||||
Merge(db.Papers, LoadAll<PaperDefinition>(), d => d.Header.Id);
|
||||
Merge(db.RoguelitePerks, LoadAll<RoguelitePerkDefinition>(), d => d.Header.Id);
|
||||
return db;
|
||||
}
|
||||
|
||||
private IEnumerable<T> LoadAll<T>() where T : class
|
||||
{
|
||||
foreach (var source in _sources)
|
||||
{
|
||||
foreach (var item in source.LoadAll<T>())
|
||||
{
|
||||
yield return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Merge<T>(Dictionary<string, T> target, IEnumerable<T> items, Func<T, string> idSelector) where T : class
|
||||
{
|
||||
foreach (var item in items)
|
||||
{
|
||||
var id = idSelector(item);
|
||||
if (string.IsNullOrWhiteSpace(id))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (target.ContainsKey(id))
|
||||
{
|
||||
if (MergeMode == ContentMergeMode.Override)
|
||||
{
|
||||
target[id] = item;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
target[id] = item;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 资源读取示例:res:// 中的 .tres/.res
|
||||
/// 这里只给出接口骨架,具体解析留给后续实现。
|
||||
/// </summary>
|
||||
public sealed class ResourceContentSource : IContentSource
|
||||
{
|
||||
public int Priority { get; }
|
||||
public List<string> ResourcePaths { get; } = new();
|
||||
|
||||
public ResourceContentSource(int priority)
|
||||
{
|
||||
Priority = priority;
|
||||
}
|
||||
|
||||
public IEnumerable<T> LoadAll<T>() where T : class
|
||||
{
|
||||
foreach (var path in ResourcePaths)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(path))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var resource = ResourceLoader.Load<Resource>(path);
|
||||
if (resource == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (var item in ExtractResources<T>(resource))
|
||||
{
|
||||
yield return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<T> ExtractResources<T>(Resource resource) where T : class
|
||||
{
|
||||
if (resource is IContentResource content)
|
||||
{
|
||||
if (content.GetDefinitionType() == typeof(T))
|
||||
{
|
||||
if (content.ToDefinition() is T typed)
|
||||
{
|
||||
yield return typed;
|
||||
}
|
||||
}
|
||||
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (resource is IContentResourceCollection collection)
|
||||
{
|
||||
foreach (var item in collection.GetItems())
|
||||
{
|
||||
if (item.GetDefinitionType() == typeof(T))
|
||||
{
|
||||
if (item.ToDefinition() is T typed)
|
||||
{
|
||||
yield return typed;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 资源读取示例:json/yaml/自定义格式(Mod 友好)
|
||||
/// </summary>
|
||||
public sealed class JsonContentSource : IContentSource
|
||||
{
|
||||
public int Priority { get; }
|
||||
public List<string> DataPaths { get; } = new();
|
||||
private readonly JsonSerializerOptions _options;
|
||||
|
||||
public JsonContentSource(int priority)
|
||||
{
|
||||
Priority = priority;
|
||||
_options = new JsonSerializerOptions
|
||||
{
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
_options.Converters.Add(new JsonStringEnumConverter());
|
||||
}
|
||||
|
||||
public IEnumerable<T> LoadAll<T>() where T : class
|
||||
{
|
||||
foreach (var path in DataPaths)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(path))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var resolvedPath = ResolvePath(path);
|
||||
if (!File.Exists(resolvedPath))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var json = File.ReadAllText(resolvedPath);
|
||||
if (string.IsNullOrWhiteSpace(json))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (TryDeserializeList(json, out List<T> list))
|
||||
{
|
||||
foreach (var item in list)
|
||||
{
|
||||
yield return item;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (TryDeserializeEnvelope(json, out JsonContentEnvelope<T> envelope))
|
||||
{
|
||||
if (envelope.Items != null)
|
||||
{
|
||||
foreach (var item in envelope.Items)
|
||||
{
|
||||
yield return item;
|
||||
}
|
||||
}
|
||||
else if (envelope.Item != null)
|
||||
{
|
||||
yield return envelope.Item;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (TryDeserializeSingle(json, out T single))
|
||||
{
|
||||
yield return single;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string ResolvePath(string path)
|
||||
{
|
||||
if (path.StartsWith("res://") || path.StartsWith("user://"))
|
||||
{
|
||||
return ProjectSettings.GlobalizePath(path);
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
private bool TryDeserializeList<T>(string json, out List<T> list) where T : class
|
||||
{
|
||||
try
|
||||
{
|
||||
list = JsonSerializer.Deserialize<List<T>>(json, _options);
|
||||
return list != null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
list = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryDeserializeSingle<T>(string json, out T item) where T : class
|
||||
{
|
||||
try
|
||||
{
|
||||
item = JsonSerializer.Deserialize<T>(json, _options);
|
||||
return item != null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
item = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryDeserializeEnvelope<T>(string json, out JsonContentEnvelope<T> envelope) where T : class
|
||||
{
|
||||
try
|
||||
{
|
||||
envelope = JsonSerializer.Deserialize<JsonContentEnvelope<T>>(json, _options);
|
||||
if (envelope == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return envelope.Items != null || envelope.Item != null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
envelope = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class JsonContentEnvelope<T> where T : class
|
||||
{
|
||||
public string Type { get; set; }
|
||||
public List<T> Items { get; set; }
|
||||
public T Item { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
27
scripts/Core/ContentResources.cs
Normal file
27
scripts/Core/ContentResources.cs
Normal file
@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 资源定义接口(用于 .tres/.res 的内容加载)
|
||||
/// 设计说明:
|
||||
/// 1) 资源负责“序列化友好”,模型负责“运行时友好”。
|
||||
/// 2) 通过 ToDefinition 映射到纯数据模型,保持解耦。
|
||||
/// 注意事项:
|
||||
/// - 资源字段尽量使用 Godot 可序列化的基础类型与 Array。
|
||||
/// 未来扩展:
|
||||
/// - 可加入验证器,确保 Id/路径等关键字段符合规范。
|
||||
/// </summary>
|
||||
public interface IContentResource
|
||||
{
|
||||
Type GetDefinitionType();
|
||||
object ToDefinition();
|
||||
}
|
||||
|
||||
public interface IContentResourceCollection
|
||||
{
|
||||
IEnumerable<IContentResource> GetItems();
|
||||
}
|
||||
|
||||
|
||||
109
scripts/Core/DisciplineDefinitionResource.cs
Normal file
109
scripts/Core/DisciplineDefinitionResource.cs
Normal file
@ -0,0 +1,109 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
using Models;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 学科定义资源(先落地一个完整示例)
|
||||
/// 设计说明:
|
||||
/// 1) 为避免 .tres 过度嵌套,字段保持扁平化。
|
||||
/// 2) Buff 规则通过 RuleIds 存储,数值效果可后续用 JSON 增补。
|
||||
/// 注意事项:
|
||||
/// - Id 与资源路径应稳定且小写下划线。
|
||||
/// 未来扩展:
|
||||
/// - 可补充 Modifiers/AllowedRoles 等字段,进一步丰富配置能力。
|
||||
/// </summary>
|
||||
[GlobalClass]
|
||||
public partial class DisciplineDefinitionResource : Resource, IContentResource
|
||||
{
|
||||
// --- Header ---
|
||||
[Export] public string Id { get; set; }
|
||||
[Export] public string NameKey { get; set; }
|
||||
[Export] public string NameFallback { get; set; }
|
||||
[Export] public string DescriptionKey { get; set; }
|
||||
[Export] public string DescriptionFallback { get; set; }
|
||||
[Export] public string IconPath { get; set; }
|
||||
[Export] public Array<string> Tags { get; set; } = new();
|
||||
|
||||
// --- Buff ---
|
||||
[Export] public string BuffNameKey { get; set; }
|
||||
[Export] public string BuffNameFallback { get; set; }
|
||||
[Export] public string BuffDescriptionKey { get; set; }
|
||||
[Export] public string BuffDescriptionFallback { get; set; }
|
||||
[Export] public Array<string> BuffRuleIds { get; set; } = new();
|
||||
|
||||
// --- Pools ---
|
||||
[Export] public Array<string> RolePoolIds { get; set; } = new();
|
||||
[Export] public Array<string> ItemPoolIds { get; set; } = new();
|
||||
[Export] public Array<string> TaskKeywordIds { get; set; } = new();
|
||||
|
||||
public Type GetDefinitionType() => typeof(DisciplineDefinition);
|
||||
|
||||
public object ToDefinition()
|
||||
{
|
||||
var header = new DefinitionHeader
|
||||
{
|
||||
Id = Id,
|
||||
IconPath = IconPath,
|
||||
Name = new LocalizedText
|
||||
{
|
||||
Key = NameKey,
|
||||
Fallback = NameFallback
|
||||
},
|
||||
Description = new LocalizedText
|
||||
{
|
||||
Key = DescriptionKey,
|
||||
Fallback = DescriptionFallback
|
||||
}
|
||||
};
|
||||
|
||||
foreach (var tag in Tags)
|
||||
{
|
||||
header.Tags.Add(tag);
|
||||
}
|
||||
|
||||
var buff = new DisciplineBuff
|
||||
{
|
||||
Name = new LocalizedText
|
||||
{
|
||||
Key = BuffNameKey,
|
||||
Fallback = BuffNameFallback
|
||||
},
|
||||
Description = new LocalizedText
|
||||
{
|
||||
Key = BuffDescriptionKey,
|
||||
Fallback = BuffDescriptionFallback
|
||||
},
|
||||
Modifiers = new ModifierBundle()
|
||||
};
|
||||
|
||||
foreach (var ruleId in BuffRuleIds)
|
||||
{
|
||||
buff.Modifiers.RuleIds.Add(ruleId);
|
||||
}
|
||||
|
||||
var definition = new DisciplineDefinition
|
||||
{
|
||||
Header = header,
|
||||
Buff = buff
|
||||
};
|
||||
|
||||
AddRange(RolePoolIds, definition.RolePoolIds);
|
||||
AddRange(ItemPoolIds, definition.ItemPoolIds);
|
||||
AddRange(TaskKeywordIds, definition.TaskKeywordIds);
|
||||
|
||||
return definition;
|
||||
}
|
||||
|
||||
private static void AddRange(Array<string> source, List<string> target)
|
||||
{
|
||||
foreach (var value in source)
|
||||
{
|
||||
target.Add(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
44
scripts/Core/DomainEvents.cs
Normal file
44
scripts/Core/DomainEvents.cs
Normal file
@ -0,0 +1,44 @@
|
||||
using Models;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 领域事件(用于系统解耦)
|
||||
/// 设计说明:
|
||||
/// 1) Task/Economy/Turn 等系统通过事件通信,避免直接依赖。
|
||||
/// 2) 事件只携带最小必要信息,避免模型被过度暴露。
|
||||
/// 注意事项:
|
||||
/// - 事件是同步派发,请避免在处理器中做耗时操作。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“事件上下文/来源系统”等字段,便于调试。
|
||||
/// </summary>
|
||||
public readonly struct TaskCompletedEvent
|
||||
{
|
||||
public TaskModel Task { get; }
|
||||
|
||||
public TaskCompletedEvent(TaskModel task)
|
||||
{
|
||||
Task = task;
|
||||
}
|
||||
}
|
||||
|
||||
public readonly struct TaskFailedEvent
|
||||
{
|
||||
public TaskModel Task { get; }
|
||||
|
||||
public TaskFailedEvent(TaskModel task)
|
||||
{
|
||||
Task = task;
|
||||
}
|
||||
}
|
||||
|
||||
public readonly struct TurnEndedEvent
|
||||
{
|
||||
public int Turn { get; }
|
||||
|
||||
public TurnEndedEvent(int turn)
|
||||
{
|
||||
Turn = turn;
|
||||
}
|
||||
}
|
||||
|
||||
58
scripts/Core/EventBus.cs
Normal file
58
scripts/Core/EventBus.cs
Normal file
@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 轻量事件总线(解耦系统之间的通信)
|
||||
/// 设计说明:
|
||||
/// 1) 系统层发布 DomainEvent,View/Controller 可订阅。
|
||||
/// 2) 不依赖 Godot Signal,便于纯逻辑测试。
|
||||
/// 注意事项:
|
||||
/// - 事件为进程内同步调用,避免在事件里做耗时操作。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“事件队列”和“延迟派发”以支持回合结算。
|
||||
/// </summary>
|
||||
public sealed class DomainEventBus
|
||||
{
|
||||
private readonly Dictionary<Type, List<Delegate>> _handlers = new();
|
||||
|
||||
public void Subscribe<T>(Action<T> handler)
|
||||
{
|
||||
var type = typeof(T);
|
||||
if (!_handlers.TryGetValue(type, out var list))
|
||||
{
|
||||
list = new List<Delegate>();
|
||||
_handlers[type] = list;
|
||||
}
|
||||
|
||||
list.Add(handler);
|
||||
}
|
||||
|
||||
public void Unsubscribe<T>(Action<T> handler)
|
||||
{
|
||||
var type = typeof(T);
|
||||
if (_handlers.TryGetValue(type, out var list))
|
||||
{
|
||||
list.Remove(handler);
|
||||
}
|
||||
}
|
||||
|
||||
public void Publish<T>(T evt)
|
||||
{
|
||||
var type = typeof(T);
|
||||
if (!_handlers.TryGetValue(type, out var list))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var handler in list)
|
||||
{
|
||||
if (handler is Action<T> typedHandler)
|
||||
{
|
||||
typedHandler.Invoke(evt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
43
scripts/Core/GameController.cs
Normal file
43
scripts/Core/GameController.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using Models;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 高层控制器(面向 UI/输入)
|
||||
/// 设计说明:
|
||||
/// 1) Controller 只负责“指令式操作”,不直接做数值计算。
|
||||
/// 2) 复杂结算交给系统层(GameSystems)。
|
||||
/// 注意事项:
|
||||
/// - 需要可重入性,避免重复触发同一阶段切换。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“命令队列”,用于回放或网络同步。
|
||||
/// </summary>
|
||||
public sealed class GameController : IController
|
||||
{
|
||||
private GameSession _session;
|
||||
|
||||
public void Initialize(GameSession session)
|
||||
{
|
||||
_session = session;
|
||||
}
|
||||
|
||||
public void StartExecution()
|
||||
{
|
||||
if (_session.State.Turn.Phase != GamePhase.Planning) return;
|
||||
_session.State.Turn.Phase = GamePhase.Execution;
|
||||
}
|
||||
|
||||
public void EndExecution()
|
||||
{
|
||||
if (_session.State.Turn.Phase != GamePhase.Execution) return;
|
||||
_session.State.Turn.Phase = GamePhase.Review;
|
||||
}
|
||||
|
||||
public void StartNextTurn()
|
||||
{
|
||||
if (_session.State.Turn.Phase != GamePhase.Review) return;
|
||||
_session.State.Turn.CurrentTurn++;
|
||||
_session.State.Turn.Phase = GamePhase.Planning;
|
||||
}
|
||||
}
|
||||
|
||||
56
scripts/Core/GameSession.cs
Normal file
56
scripts/Core/GameSession.cs
Normal file
@ -0,0 +1,56 @@
|
||||
using Models;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 游戏会话(运行时入口)
|
||||
/// 设计说明:
|
||||
/// 1) 将 State + Content + Systems + Services 组织为一个整体。
|
||||
/// 2) 便于在 Godot Node 中持有,避免散落的静态单例。
|
||||
/// 注意事项:
|
||||
/// - 真实项目中应通过工厂或依赖注入创建。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“加载存档/保存存档/重置”接口。
|
||||
/// </summary>
|
||||
public sealed class GameSession
|
||||
{
|
||||
public GameState State { get; }
|
||||
public GameContentDatabase Content { get; }
|
||||
public DomainEventBus Events { get; }
|
||||
public ILocalizationService Localization { get; }
|
||||
public GameSystems Systems { get; }
|
||||
|
||||
public GameSession(GameState state, GameContentDatabase content, ILocalizationService localization, DomainEventBus events)
|
||||
{
|
||||
State = state;
|
||||
Content = content;
|
||||
Localization = localization;
|
||||
Events = events;
|
||||
Systems = new GameSystems();
|
||||
Systems.Initialize(this);
|
||||
}
|
||||
|
||||
public static GameSession CreateDefault()
|
||||
{
|
||||
var registry = new ContentRegistry();
|
||||
var resourceSource = new ResourceContentSource(0);
|
||||
resourceSource.ResourcePaths.Add("res://resources/definitions/discipline_biology.tres");
|
||||
registry.RegisterSource(resourceSource);
|
||||
|
||||
var jsonSource = new JsonContentSource(10);
|
||||
jsonSource.DataPaths.Add("res://resources/definitions/disciplines.json");
|
||||
jsonSource.DataPaths.Add("res://resources/definitions/archetypes.json");
|
||||
registry.RegisterSource(jsonSource);
|
||||
|
||||
var content = registry.BuildDatabase();
|
||||
var localization = new GodotLocalizationService();
|
||||
var events = new DomainEventBus();
|
||||
return new GameSession(new GameState(), content, localization, events);
|
||||
}
|
||||
|
||||
public void Tick(float delta)
|
||||
{
|
||||
Systems.Tick(delta);
|
||||
}
|
||||
}
|
||||
|
||||
621
scripts/Core/GameSystems.cs
Normal file
621
scripts/Core/GameSystems.cs
Normal file
@ -0,0 +1,621 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Models;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 系统层骨架(负责模型变化,不直接处理输入/显示)
|
||||
/// 设计说明:
|
||||
/// 1) 每个系统只关注单一职责,形成高内聚低耦合结构。
|
||||
/// 2) 系统之间通过 GameSession 共享状态,通过事件总线通讯。
|
||||
/// 注意事项:
|
||||
/// - 系统逻辑应尽量“幂等”,便于回合重算与调试。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“系统执行顺序配置”,支持 Mod 插入新系统。
|
||||
/// </summary>
|
||||
public interface IGameSystem
|
||||
{
|
||||
void Initialize(GameSession session);
|
||||
void Tick(float delta);
|
||||
}
|
||||
|
||||
public sealed class GameSystems
|
||||
{
|
||||
public TurnSystem Turn { get; } = new();
|
||||
public TaskSystem Task { get; } = new();
|
||||
public EconomySystem Economy { get; } = new();
|
||||
public SynergySystem Synergy { get; } = new();
|
||||
public AssignmentSystem Assignment { get; } = new();
|
||||
|
||||
public void Initialize(GameSession session)
|
||||
{
|
||||
Turn.Initialize(session);
|
||||
Task.Initialize(session);
|
||||
Economy.Initialize(session);
|
||||
Synergy.Initialize(session);
|
||||
Assignment.Initialize(session);
|
||||
}
|
||||
|
||||
public void Tick(float delta)
|
||||
{
|
||||
Turn.Tick(delta);
|
||||
Synergy.Tick(delta);
|
||||
Task.Tick(delta);
|
||||
Economy.Tick(delta);
|
||||
Assignment.Tick(delta);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class TurnSystem : IGameSystem
|
||||
{
|
||||
private GameSession _session;
|
||||
|
||||
public void Initialize(GameSession session)
|
||||
{
|
||||
_session = session;
|
||||
}
|
||||
|
||||
public void Tick(float delta)
|
||||
{
|
||||
// 预留:回合推进计时器/阶段切换
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class TaskSystem : IGameSystem
|
||||
{
|
||||
private GameSession _session;
|
||||
private StatResolver _statResolver;
|
||||
|
||||
public void Initialize(GameSession session)
|
||||
{
|
||||
_session = session;
|
||||
_statResolver = new StatResolver(session);
|
||||
}
|
||||
|
||||
public void Tick(float delta)
|
||||
{
|
||||
if (_session.State.Turn.Phase != GamePhase.Execution)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AdvanceTasks(delta);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 回合结算(扣除 Deadline,判定完成与失败)
|
||||
/// </summary>
|
||||
public void ResolveEndOfTurn()
|
||||
{
|
||||
var state = _session.State;
|
||||
var completed = new List<TaskModel>();
|
||||
var failed = new List<TaskModel>();
|
||||
|
||||
foreach (var task in state.Tasks.ActiveTasks)
|
||||
{
|
||||
if (task.Runtime.RemainingTurns > 0)
|
||||
{
|
||||
task.Runtime.RemainingTurns--;
|
||||
}
|
||||
|
||||
if (task.IsCompleted)
|
||||
{
|
||||
completed.Add(task);
|
||||
}
|
||||
else if (task.IsFailed)
|
||||
{
|
||||
failed.Add(task);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var task in completed)
|
||||
{
|
||||
state.Tasks.ActiveTasks.Remove(task);
|
||||
state.Tasks.CompletedTasks.Add(task);
|
||||
_session.Events.Publish(new TaskCompletedEvent(task));
|
||||
}
|
||||
|
||||
foreach (var task in failed)
|
||||
{
|
||||
state.Tasks.ActiveTasks.Remove(task);
|
||||
state.Tasks.FailedTasks.Add(task);
|
||||
_session.Events.Publish(new TaskFailedEvent(task));
|
||||
}
|
||||
}
|
||||
|
||||
private void AdvanceTasks(float delta)
|
||||
{
|
||||
var state = _session.State;
|
||||
if (state.Tasks.ActiveTasks.Count == 0) return;
|
||||
|
||||
var unitIndex = BuildUnitIndex();
|
||||
|
||||
foreach (var task in state.Tasks.ActiveTasks)
|
||||
{
|
||||
if (task.IsCompleted || task.IsFailed) continue;
|
||||
if (task.Kind == TaskKind.Milestone) continue;
|
||||
|
||||
var taskDef = GetTaskDefinition(task);
|
||||
var totalPower = 0f;
|
||||
|
||||
foreach (var unitId in task.AssignedUnitIds)
|
||||
{
|
||||
if (!unitIndex.TryGetValue(unitId, out var entry))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var contribution = GetUnitContribution(entry, task, taskDef, delta);
|
||||
totalPower += contribution;
|
||||
}
|
||||
|
||||
if (totalPower <= 0f) continue;
|
||||
|
||||
var difficultyScale = task.Runtime.DifficultyScale * GetDifficultyScale(task.Difficulty);
|
||||
task.AddProgress(totalPower * delta / difficultyScale);
|
||||
}
|
||||
}
|
||||
|
||||
private float GetUnitContribution(UnitEntry entry, TaskModel task, TaskDefinition taskDef, float delta)
|
||||
{
|
||||
var unit = entry.Unit;
|
||||
var basePower = GetTaskBasePower(unit, task.Kind);
|
||||
if (basePower <= 0f) return 0f;
|
||||
|
||||
var roleMultiplier = GetRoleMultiplier(unit, taskDef);
|
||||
var disciplineMultiplier = GetDisciplineMultiplier(unit, taskDef);
|
||||
var statusMultiplier = GetStatusMultiplier(entry);
|
||||
var requirementMultiplier = GetRequirementMultiplier(unit, taskDef);
|
||||
|
||||
var effectivePower = basePower * roleMultiplier * disciplineMultiplier * statusMultiplier * requirementMultiplier;
|
||||
TrackContribution(entry, task, effectivePower * delta);
|
||||
return effectivePower;
|
||||
}
|
||||
|
||||
private float GetTaskBasePower(UnitModel unit, TaskKind kind)
|
||||
{
|
||||
var academic = _statResolver.GetAttribute(unit, AttributeType.Academic);
|
||||
var engineering = _statResolver.GetAttribute(unit, AttributeType.Engineering);
|
||||
var writing = _statResolver.GetAttribute(unit, AttributeType.Writing);
|
||||
var financial = _statResolver.GetAttribute(unit, AttributeType.Financial);
|
||||
var social = _statResolver.GetAttribute(unit, AttributeType.Social);
|
||||
var activation = _statResolver.GetAttribute(unit, AttributeType.Activation);
|
||||
|
||||
return kind switch
|
||||
{
|
||||
TaskKind.AcademicExploration => academic * 0.6f + writing * 0.4f,
|
||||
TaskKind.GrantVertical => writing * 0.4f + social * 0.4f + financial * 0.2f,
|
||||
TaskKind.GrantHorizontal => engineering * 0.5f + activation * 0.3f + academic * 0.2f,
|
||||
TaskKind.Administrative => activation * 0.6f + social * 0.4f,
|
||||
TaskKind.Conference => social * 0.5f + writing * 0.3f + financial * 0.2f,
|
||||
TaskKind.Milestone => 0f,
|
||||
_ => academic
|
||||
};
|
||||
}
|
||||
|
||||
private float GetStatusMultiplier(UnitEntry entry)
|
||||
{
|
||||
var mood = entry.Unit.Statuses.Mood.Normalized;
|
||||
var stress = entry.Unit.Statuses.Stress.Current.Normalized;
|
||||
|
||||
var moodMultiplier = 0.5f + mood * 0.5f;
|
||||
var stressMultiplier = Math.Clamp(1.0f - 0.3f * stress, 0.7f, 1.0f);
|
||||
var multiplier = moodMultiplier * stressMultiplier;
|
||||
|
||||
if (entry.Student != null)
|
||||
{
|
||||
var stamina = entry.Student.Progress.Stamina.Current.Normalized;
|
||||
if (stamina < 0.1f) multiplier *= 0.4f;
|
||||
else if (stamina < 0.2f) multiplier *= 0.7f;
|
||||
}
|
||||
|
||||
return Math.Clamp(multiplier, 0.3f, 1.2f);
|
||||
}
|
||||
|
||||
private float GetRoleMultiplier(UnitModel unit, TaskDefinition taskDef)
|
||||
{
|
||||
if (taskDef == null) return 1.0f;
|
||||
|
||||
if (taskDef.Requirements.RequiredRoleIds.Count > 0)
|
||||
{
|
||||
foreach (var roleId in taskDef.Requirements.RequiredRoleIds)
|
||||
{
|
||||
if (unit.Tags.RoleIds.Contains(roleId))
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
return 0.5f;
|
||||
}
|
||||
|
||||
if (taskDef.RecommendedRoleIds.Count > 0)
|
||||
{
|
||||
foreach (var roleId in taskDef.RecommendedRoleIds)
|
||||
{
|
||||
if (unit.Tags.RoleIds.Contains(roleId))
|
||||
{
|
||||
return 1.1f;
|
||||
}
|
||||
}
|
||||
|
||||
return 0.9f;
|
||||
}
|
||||
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
private float GetRequirementMultiplier(UnitModel unit, TaskDefinition taskDef)
|
||||
{
|
||||
if (taskDef == null) return 1.0f;
|
||||
var multiplier = 1.0f;
|
||||
|
||||
foreach (var requirement in taskDef.Requirements.AttributeChecks)
|
||||
{
|
||||
var value = _statResolver.GetAttribute(unit, requirement.Type);
|
||||
if (value < requirement.MinValue)
|
||||
{
|
||||
multiplier *= 0.85f;
|
||||
}
|
||||
}
|
||||
|
||||
return multiplier;
|
||||
}
|
||||
|
||||
private float GetDisciplineMultiplier(UnitModel unit, TaskDefinition taskDef)
|
||||
{
|
||||
if (taskDef == null) return 1.0f;
|
||||
if (taskDef.AllowedDisciplineIds.Count == 0) return 1.0f;
|
||||
if (string.IsNullOrWhiteSpace(unit.Tags.DisciplineId)) return 0.8f;
|
||||
|
||||
foreach (var disciplineId in taskDef.AllowedDisciplineIds)
|
||||
{
|
||||
if (disciplineId == unit.Tags.DisciplineId)
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
return 0.7f;
|
||||
}
|
||||
|
||||
private float GetDifficultyScale(TaskDifficulty difficulty)
|
||||
{
|
||||
return difficulty switch
|
||||
{
|
||||
TaskDifficulty.Water => 0.8f,
|
||||
TaskDifficulty.Standard => 1.0f,
|
||||
TaskDifficulty.Hardcore => 1.3f,
|
||||
TaskDifficulty.BlackBox => 1.6f,
|
||||
_ => 1.0f
|
||||
};
|
||||
}
|
||||
|
||||
private TaskDefinition GetTaskDefinition(TaskModel task)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(task.DefinitionId)) return null;
|
||||
return _session.Content.Tasks.TryGetValue(task.DefinitionId, out var definition) ? definition : null;
|
||||
}
|
||||
|
||||
private Dictionary<Guid, UnitEntry> BuildUnitIndex()
|
||||
{
|
||||
var index = new Dictionary<Guid, UnitEntry>();
|
||||
var roster = _session.State.Roster;
|
||||
|
||||
if (roster.Mentor != null)
|
||||
{
|
||||
var unit = roster.Mentor.Core;
|
||||
index[unit.Identity.Id] = new UnitEntry(unit, roster.Mentor, null, null);
|
||||
}
|
||||
|
||||
foreach (var student in roster.Students)
|
||||
{
|
||||
var unit = student.Core;
|
||||
index[unit.Identity.Id] = new UnitEntry(unit, null, student, null);
|
||||
}
|
||||
|
||||
foreach (var staff in roster.Staffs)
|
||||
{
|
||||
var unit = staff.Core;
|
||||
index[unit.Identity.Id] = new UnitEntry(unit, null, null, staff);
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
private void TrackContribution(UnitEntry entry, TaskModel task, float deltaContribution)
|
||||
{
|
||||
if (entry.Student == null) return;
|
||||
|
||||
var contributions = entry.Student.Contributions.ByTask;
|
||||
if (!contributions.TryGetValue(task.Id, out var value))
|
||||
{
|
||||
value = new PropertyValue(0, 0, 1000000);
|
||||
contributions[task.Id] = value;
|
||||
}
|
||||
|
||||
value.Add(deltaContribution);
|
||||
}
|
||||
|
||||
private readonly struct UnitEntry
|
||||
{
|
||||
public UnitModel Unit { get; }
|
||||
public MentorModel Mentor { get; }
|
||||
public StudentModel Student { get; }
|
||||
public StaffModel Staff { get; }
|
||||
|
||||
public UnitEntry(UnitModel unit, MentorModel mentor, StudentModel student, StaffModel staff)
|
||||
{
|
||||
Unit = unit;
|
||||
Mentor = mentor;
|
||||
Student = student;
|
||||
Staff = staff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class EconomySystem : IGameSystem
|
||||
{
|
||||
private GameSession _session;
|
||||
private const int MasterSalary = 500;
|
||||
private const int DoctorSalary = 800;
|
||||
private const int PostDocSalary = 1200;
|
||||
private const int JuniorFacultySalary = 2000;
|
||||
|
||||
public void Initialize(GameSession session)
|
||||
{
|
||||
_session = session;
|
||||
_session.Events.Subscribe<TaskCompletedEvent>(OnTaskCompleted);
|
||||
_session.Events.Subscribe<TaskFailedEvent>(OnTaskFailed);
|
||||
_session.Events.Subscribe<TurnEndedEvent>(OnTurnEnded);
|
||||
}
|
||||
|
||||
public void Tick(float delta)
|
||||
{
|
||||
// 当前为回合驱动,不在 Tick 中结算
|
||||
}
|
||||
|
||||
private void OnTaskCompleted(TaskCompletedEvent evt)
|
||||
{
|
||||
var task = evt.Task;
|
||||
var economy = _session.State.Economy;
|
||||
economy.Money += task.Reward.Money;
|
||||
economy.Reputation += task.Reward.Reputation;
|
||||
|
||||
if (task.Reward.PaperIds.Count > 0)
|
||||
{
|
||||
foreach (var paperId in task.Reward.PaperIds)
|
||||
{
|
||||
if (_session.Content.Papers.TryGetValue(paperId, out var paper))
|
||||
{
|
||||
AddPaper(paper.Rank);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (task.Kind == TaskKind.AcademicExploration)
|
||||
{
|
||||
AddPaper(GetPaperRankByDifficulty(task.Difficulty));
|
||||
}
|
||||
|
||||
foreach (var itemId in task.Reward.ItemIds)
|
||||
{
|
||||
AddItem(itemId, 1);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTaskFailed(TaskFailedEvent evt)
|
||||
{
|
||||
var task = evt.Task;
|
||||
var penalty = task.Track == TaskTrack.Tenure ? 20 : 10;
|
||||
if (task.Kind == TaskKind.GrantVertical) penalty += 10;
|
||||
_session.State.Economy.Reputation -= penalty;
|
||||
}
|
||||
|
||||
private void OnTurnEnded(TurnEndedEvent evt)
|
||||
{
|
||||
ApplySalaries();
|
||||
ApplyInterest();
|
||||
}
|
||||
|
||||
private void ApplySalaries()
|
||||
{
|
||||
var economy = _session.State.Economy;
|
||||
foreach (var student in _session.State.Roster.Students)
|
||||
{
|
||||
economy.Money -= student.Type == StudentModel.StudentType.MasterCandidate
|
||||
? MasterSalary
|
||||
: DoctorSalary;
|
||||
}
|
||||
|
||||
foreach (var staff in _session.State.Roster.Staffs)
|
||||
{
|
||||
economy.Money -= staff.Type == StaffModel.StaffType.PostDoc
|
||||
? PostDocSalary
|
||||
: JuniorFacultySalary;
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyInterest()
|
||||
{
|
||||
var economy = _session.State.Economy;
|
||||
UpdateInterestRate();
|
||||
if (economy.Money <= 0 || economy.InterestRate <= 0) return;
|
||||
|
||||
var interest = (int)(economy.Money * economy.InterestRate);
|
||||
economy.Money += interest;
|
||||
}
|
||||
|
||||
private void UpdateInterestRate()
|
||||
{
|
||||
var economy = _session.State.Economy;
|
||||
var mentor = _session.State.Roster.Mentor;
|
||||
if (mentor?.Core.Tags.DisciplineId == CoreIds.DisciplineEconomics)
|
||||
{
|
||||
economy.InterestRate = Math.Max(economy.InterestRate, 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddPaper(PaperRank rank)
|
||||
{
|
||||
var inventory = _session.State.Inventory;
|
||||
if (!inventory.PaperCounts.ContainsKey(rank))
|
||||
{
|
||||
inventory.PaperCounts[rank] = 0;
|
||||
}
|
||||
|
||||
inventory.PaperCounts[rank] += 1;
|
||||
}
|
||||
|
||||
private void AddItem(string itemId, int count)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(itemId)) return;
|
||||
var inventory = _session.State.Inventory;
|
||||
if (!inventory.ItemCounts.ContainsKey(itemId))
|
||||
{
|
||||
inventory.ItemCounts[itemId] = 0;
|
||||
}
|
||||
|
||||
inventory.ItemCounts[itemId] += count;
|
||||
}
|
||||
|
||||
private PaperRank GetPaperRankByDifficulty(TaskDifficulty difficulty)
|
||||
{
|
||||
return difficulty switch
|
||||
{
|
||||
TaskDifficulty.Water => PaperRank.C,
|
||||
TaskDifficulty.Standard => PaperRank.B,
|
||||
TaskDifficulty.Hardcore => PaperRank.A,
|
||||
TaskDifficulty.BlackBox => PaperRank.S,
|
||||
_ => PaperRank.C
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class SynergySystem : IGameSystem
|
||||
{
|
||||
private GameSession _session;
|
||||
|
||||
public void Initialize(GameSession session)
|
||||
{
|
||||
_session = session;
|
||||
}
|
||||
|
||||
public void Tick(float delta)
|
||||
{
|
||||
RecalculateSynergy();
|
||||
}
|
||||
|
||||
private void RecalculateSynergy()
|
||||
{
|
||||
var state = _session.State.Synergy;
|
||||
state.ArchetypeStacks.Clear();
|
||||
state.RoleStacks.Clear();
|
||||
state.ActiveSynergyIds.Clear();
|
||||
ClearModifiers(state.ActiveModifiers);
|
||||
|
||||
CountUnitTags(state);
|
||||
ApplySynergyDefinitions(state);
|
||||
}
|
||||
|
||||
private void CountUnitTags(SynergyState synergy)
|
||||
{
|
||||
var roster = _session.State.Roster;
|
||||
AddUnitTags(synergy, roster.Mentor?.Core);
|
||||
|
||||
foreach (var student in roster.Students)
|
||||
{
|
||||
AddUnitTags(synergy, student.Core);
|
||||
}
|
||||
|
||||
foreach (var staff in roster.Staffs)
|
||||
{
|
||||
AddUnitTags(synergy, staff.Core);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddUnitTags(SynergyState synergy, UnitModel unit)
|
||||
{
|
||||
if (unit == null) return;
|
||||
foreach (var archetypeId in unit.Tags.ArchetypeIds)
|
||||
{
|
||||
AddStack(synergy.ArchetypeStacks, archetypeId);
|
||||
}
|
||||
|
||||
foreach (var roleId in unit.Tags.RoleIds)
|
||||
{
|
||||
AddStack(synergy.RoleStacks, roleId);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddStack(Dictionary<string, int> stacks, string id)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(id)) return;
|
||||
if (!stacks.ContainsKey(id))
|
||||
{
|
||||
stacks[id] = 0;
|
||||
}
|
||||
|
||||
stacks[id] += 1;
|
||||
}
|
||||
|
||||
private void ApplySynergyDefinitions(SynergyState synergy)
|
||||
{
|
||||
foreach (var archetype in _session.Content.Archetypes.Values)
|
||||
{
|
||||
ApplySynergyTier(archetype.Header.Id, archetype.Tiers, synergy.ArchetypeStacks, synergy);
|
||||
}
|
||||
|
||||
foreach (var role in _session.Content.Roles.Values)
|
||||
{
|
||||
ApplySynergyTier(role.Header.Id, role.Tiers, synergy.RoleStacks, synergy);
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplySynergyTier(string id, List<SynergyTier> tiers, Dictionary<string, int> stacks, SynergyState synergy)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(id)) return;
|
||||
stacks.TryGetValue(id, out var count);
|
||||
|
||||
foreach (var tier in tiers)
|
||||
{
|
||||
if (count < tier.RequiredCount) continue;
|
||||
var synergyId = $"{id}@{tier.RequiredCount}";
|
||||
synergy.ActiveSynergyIds.Add(synergyId);
|
||||
MergeModifiers(synergy.ActiveModifiers, tier.Modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
private void MergeModifiers(ModifierBundle target, ModifierBundle source)
|
||||
{
|
||||
if (target == null || source == null) return;
|
||||
target.AttributeModifiers.AddRange(source.AttributeModifiers);
|
||||
target.StatusModifiers.AddRange(source.StatusModifiers);
|
||||
target.ResourceModifiers.AddRange(source.ResourceModifiers);
|
||||
target.RuleIds.AddRange(source.RuleIds);
|
||||
}
|
||||
|
||||
private void ClearModifiers(ModifierBundle bundle)
|
||||
{
|
||||
bundle.AttributeModifiers.Clear();
|
||||
bundle.StatusModifiers.Clear();
|
||||
bundle.ResourceModifiers.Clear();
|
||||
bundle.RuleIds.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class AssignmentSystem : IGameSystem
|
||||
{
|
||||
private GameSession _session;
|
||||
|
||||
public void Initialize(GameSession session)
|
||||
{
|
||||
_session = session;
|
||||
}
|
||||
|
||||
public void Tick(float delta)
|
||||
{
|
||||
// 预留:人员分配、交接惩罚等
|
||||
}
|
||||
}
|
||||
|
||||
46
scripts/Core/LocalizationService.cs
Normal file
46
scripts/Core/LocalizationService.cs
Normal file
@ -0,0 +1,46 @@
|
||||
using Godot;
|
||||
using Models;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// i18n 服务抽象
|
||||
/// 设计说明:
|
||||
/// 1) Model 只持有 LocalizedText(Key/Fallback),具体翻译交给服务层。
|
||||
/// 2) 便于后续替换为自定义多语言系统或 Mod 词库。
|
||||
/// 注意事项:
|
||||
/// - TranslationServer 的翻译表应通过 Godot Editor 管理。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“参数化翻译”和“运行时语言切换事件”。
|
||||
/// </summary>
|
||||
public interface ILocalizationService
|
||||
{
|
||||
string Translate(LocalizedText text);
|
||||
string Translate(string key, string fallback = null);
|
||||
}
|
||||
|
||||
public sealed class GodotLocalizationService : ILocalizationService
|
||||
{
|
||||
public string Translate(LocalizedText text)
|
||||
{
|
||||
if (text == null) return string.Empty;
|
||||
return Translate(text.Key, text.Fallback);
|
||||
}
|
||||
|
||||
public string Translate(string key, string fallback = null)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(key))
|
||||
{
|
||||
return fallback ?? string.Empty;
|
||||
}
|
||||
|
||||
var translated = TranslationServer.Translate(key);
|
||||
if (translated == key && !string.IsNullOrWhiteSpace(fallback))
|
||||
{
|
||||
return fallback;
|
||||
}
|
||||
|
||||
return translated;
|
||||
}
|
||||
}
|
||||
|
||||
29
scripts/Core/ModManifest.cs
Normal file
29
scripts/Core/ModManifest.cs
Normal file
@ -0,0 +1,29 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// Mod 清单与包信息
|
||||
/// 设计说明:
|
||||
/// 1) 通过 Manifest 提供版本/依赖/内容路径。
|
||||
/// 2) 与 ContentRegistry 配合,实现热加载或启动时加载。
|
||||
/// 注意事项:
|
||||
/// - 建议为每个 Mod 指定唯一 Id 与语义化版本。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“加载开关/冲突检测/签名校验”。
|
||||
/// </summary>
|
||||
public sealed class ModManifest
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Version { get; set; }
|
||||
public List<string> Dependencies { get; } = new();
|
||||
public List<string> ContentPaths { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class ModPackage
|
||||
{
|
||||
public ModManifest Manifest { get; set; } = new();
|
||||
public string RootPath { get; set; }
|
||||
}
|
||||
|
||||
39
scripts/Core/Mvc.cs
Normal file
39
scripts/Core/Mvc.cs
Normal file
@ -0,0 +1,39 @@
|
||||
using Godot;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// MVC 基础接口
|
||||
/// 设计说明:
|
||||
/// 1) View 只负责显示与输入,Controller 负责修改 Model。
|
||||
/// 2) View 与 Model 通过 Bind 绑定,避免静态单例。
|
||||
/// 注意事项:
|
||||
/// - View 内不要直接写业务结算逻辑。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“脏标记刷新”与“差量更新”以减少 UI 开销。
|
||||
/// </summary>
|
||||
public interface IView<TModel>
|
||||
{
|
||||
void Bind(TModel model);
|
||||
}
|
||||
|
||||
public interface IController
|
||||
{
|
||||
void Initialize(GameSession session);
|
||||
}
|
||||
|
||||
public abstract partial class ModelView<TModel> : Node, IView<TModel>
|
||||
{
|
||||
public TModel Model { get; private set; }
|
||||
|
||||
public virtual void Bind(TModel model)
|
||||
{
|
||||
Model = model;
|
||||
OnModelBound();
|
||||
}
|
||||
|
||||
protected virtual void OnModelBound()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
90
scripts/Core/StatResolver.cs
Normal file
90
scripts/Core/StatResolver.cs
Normal file
@ -0,0 +1,90 @@
|
||||
using System.Collections.Generic;
|
||||
using Models;
|
||||
|
||||
namespace Core;
|
||||
|
||||
/// <summary>
|
||||
/// 数值解析器(用于统一计算有效属性)
|
||||
/// 设计说明:
|
||||
/// 1) 只做“读+合成”,不直接修改 Model。
|
||||
/// 2) 合成来源包含:羁绊、学科 Buff、特质、装备。
|
||||
/// 注意事项:
|
||||
/// - 规则型效果(RuleIds)暂不在此处理,由系统层扩展。
|
||||
/// 未来扩展:
|
||||
/// - 可引入“上下文参数”(任务类型/场景)以处理条件加成。
|
||||
/// </summary>
|
||||
public sealed class StatResolver
|
||||
{
|
||||
private readonly GameSession _session;
|
||||
|
||||
public StatResolver(GameSession session)
|
||||
{
|
||||
_session = session;
|
||||
}
|
||||
|
||||
public float GetAttribute(UnitModel unit, AttributeType type)
|
||||
{
|
||||
var value = GetBaseAttribute(unit, type);
|
||||
ApplyBundle(_session.State.Synergy.ActiveModifiers, type, ref value);
|
||||
ApplyDiscipline(unit.Tags.DisciplineId, type, ref value);
|
||||
ApplyTraits(unit.Tags.TraitIds, type, ref value);
|
||||
ApplyItems(unit.Equipment.EquippedItemIds, type, ref value);
|
||||
return value;
|
||||
}
|
||||
|
||||
private float GetBaseAttribute(UnitModel unit, AttributeType type)
|
||||
{
|
||||
return type switch
|
||||
{
|
||||
AttributeType.Academic => unit.Attributes.Academic.Value,
|
||||
AttributeType.Engineering => unit.Attributes.Engineering.Value,
|
||||
AttributeType.Writing => unit.Attributes.Writing.Value,
|
||||
AttributeType.Financial => unit.Attributes.Financial.Value,
|
||||
AttributeType.Social => unit.Attributes.Social.Value,
|
||||
AttributeType.Activation => unit.Attributes.Activation.Value,
|
||||
_ => 0f
|
||||
};
|
||||
}
|
||||
|
||||
private void ApplyDiscipline(string disciplineId, AttributeType type, ref float value)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(disciplineId)) return;
|
||||
if (!_session.Content.Disciplines.TryGetValue(disciplineId, out var discipline)) return;
|
||||
ApplyBundle(discipline.Buff?.Modifiers, type, ref value);
|
||||
}
|
||||
|
||||
private void ApplyTraits(List<string> traitIds, AttributeType type, ref float value)
|
||||
{
|
||||
if (traitIds == null || traitIds.Count == 0) return;
|
||||
foreach (var traitId in traitIds)
|
||||
{
|
||||
if (_session.Content.Traits.TryGetValue(traitId, out var trait))
|
||||
{
|
||||
ApplyBundle(trait.Modifiers, type, ref value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyItems(List<string> itemIds, AttributeType type, ref float value)
|
||||
{
|
||||
if (itemIds == null || itemIds.Count == 0) return;
|
||||
foreach (var itemId in itemIds)
|
||||
{
|
||||
if (_session.Content.Items.TryGetValue(itemId, out var item))
|
||||
{
|
||||
ApplyBundle(item.Effect?.Modifiers, type, ref value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyBundle(ModifierBundle bundle, AttributeType type, ref float value)
|
||||
{
|
||||
if (bundle == null) return;
|
||||
foreach (var modifier in bundle.AttributeModifiers)
|
||||
{
|
||||
if (modifier.Type != type) continue;
|
||||
value = (value + modifier.Add) * modifier.Multiplier;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1 +0,0 @@
|
||||
uid://odcll7t6ojce
|
||||
@ -2,7 +2,18 @@ using Godot;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Models;
|
||||
using Core;
|
||||
|
||||
/// <summary>
|
||||
/// 游戏主控制节点(MVC 的桥接层)
|
||||
/// 设计说明:
|
||||
/// 1) 负责初始化 GameSession,并把输入/信号转交给 Controller/System。
|
||||
/// 2) 仅做“流程调度”,不直接计算复杂数值,避免逻辑堆积。
|
||||
/// 注意事项:
|
||||
/// - View 与 Model 的绑定应逐步迁移到独立 View 脚本,避免在此类膨胀。
|
||||
/// 未来扩展:
|
||||
/// - 可拆分为 SceneRoot + UIController + DebugController,分层管理。
|
||||
/// </summary>
|
||||
public partial class GameManager : Node
|
||||
{
|
||||
/// <summary>
|
||||
@ -12,25 +23,22 @@ public partial class GameManager : Node
|
||||
public static string NextScene { get; set; } = null;
|
||||
public static readonly Resource Arrow2X = ResourceLoader.Load("res://temp_res/kenney_ui-pack-space-expansion/PNG/Extra/Double/cursor_f.png");
|
||||
|
||||
// --- Core Loop Definitions ---
|
||||
public enum GamePhase
|
||||
{
|
||||
Planning, // 筹备阶段:时间暂停,分配任务,购买设施
|
||||
Execution, // 执行阶段:时间流动,学生工作
|
||||
Review, // 结算阶段:回合结束,发工资,结算成果
|
||||
}
|
||||
|
||||
[Export]
|
||||
public int MaxTurns = 30;
|
||||
|
||||
// --- Global State ---
|
||||
public static GamePhase CurrentPhase { get; private set; } = GamePhase.Planning;
|
||||
public static int CurrentTurn { get; private set; } = 1;
|
||||
|
||||
public GameSession Session { get; private set; }
|
||||
public GameState State => Session?.State;
|
||||
public GameController Controller { get; private set; }
|
||||
|
||||
public GamePhase CurrentPhase => State?.Turn.Phase ?? GamePhase.Planning;
|
||||
public int CurrentTurn => State?.Turn.CurrentTurn ?? 1;
|
||||
|
||||
// --- Domain Model ---
|
||||
public MentorModel Mentor { get; private set; }
|
||||
public List<StudentModel> Students { get; private set; } = new List<StudentModel>();
|
||||
public List<Task> ActiveTasks { get; private set; } = new List<Task>();
|
||||
public MentorModel Mentor => State?.Roster.Mentor;
|
||||
public List<StudentModel> Students => State?.Roster.Students;
|
||||
public List<TaskModel> ActiveTasks => State?.Tasks.ActiveTasks;
|
||||
public EconomyState Economy => State?.Economy;
|
||||
|
||||
// --- Signals ---
|
||||
[Signal] public delegate void PhaseChangedEventHandler(int phase); // int cast of GamePhase
|
||||
@ -54,15 +62,21 @@ public partial class GameManager : Node
|
||||
|
||||
private void InitializeGame()
|
||||
{
|
||||
CurrentTurn = 1;
|
||||
CurrentPhase = GamePhase.Planning;
|
||||
Session = GameSession.CreateDefault();
|
||||
Controller = new GameController();
|
||||
Controller.Initialize(Session);
|
||||
State.Turn.MaxTurns = MaxTurns;
|
||||
State.Turn.CurrentTurn = 1;
|
||||
State.Turn.Phase = GamePhase.Planning;
|
||||
|
||||
// MVP: Add a test student
|
||||
var s1 = new StudentModel("张三");
|
||||
Students.Add(s1);
|
||||
|
||||
// MVP: Add a test task
|
||||
var t1 = new Task("深度学习导论", TaskType.Paper, 1000f, 3);
|
||||
var t1 = new TaskModel("深度学习导论", TaskKind.AcademicExploration, 1000f, 3);
|
||||
t1.Reward.Money = 1000;
|
||||
t1.Reward.Reputation = 5;
|
||||
ActiveTasks.Add(t1);
|
||||
|
||||
GD.Print("Game Initialized. Phase: Planning, Turn: 1");
|
||||
@ -76,6 +90,8 @@ public partial class GameManager : Node
|
||||
// Update game logic (timers, etc.)
|
||||
// In a real implementation, this might manage the global timer for the day/week
|
||||
}
|
||||
|
||||
Session?.Tick((float)delta);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -85,7 +101,7 @@ public partial class GameManager : Node
|
||||
{
|
||||
if (CurrentPhase != GamePhase.Planning) return;
|
||||
|
||||
CurrentPhase = GamePhase.Execution;
|
||||
Controller.StartExecution();
|
||||
EmitSignal(SignalName.PhaseChanged, (int)CurrentPhase);
|
||||
GD.Print("Phase Changed: Execution");
|
||||
|
||||
@ -99,7 +115,7 @@ public partial class GameManager : Node
|
||||
{
|
||||
if (CurrentPhase != GamePhase.Execution) return;
|
||||
|
||||
CurrentPhase = GamePhase.Review;
|
||||
Controller.EndExecution();
|
||||
EmitSignal(SignalName.PhaseChanged, (int)CurrentPhase);
|
||||
GD.Print("Phase Changed: Review");
|
||||
|
||||
@ -111,28 +127,8 @@ public partial class GameManager : Node
|
||||
/// </summary>
|
||||
private void PerformReview()
|
||||
{
|
||||
// 1. Task progress check
|
||||
foreach (var task in ActiveTasks)
|
||||
{
|
||||
task.Deadline--;
|
||||
if (task.IsCompleted)
|
||||
{
|
||||
GD.Print($"Task {task.Name} Completed!");
|
||||
Mentor.Reputation += task.RewardReputation;
|
||||
Mentor.Money += task.RewardMoney;
|
||||
}
|
||||
else if (task.IsFailed)
|
||||
{
|
||||
GD.Print($"Task {task.Name} Failed!");
|
||||
Mentor.Reputation -= 10; // Penalty
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Student status update (Salary, etc.)
|
||||
foreach (var student in Students)
|
||||
{
|
||||
// Deduct salary? Restore some stamina?
|
||||
}
|
||||
Session.Systems.Task.ResolveEndOfTurn();
|
||||
Session.Events.Publish(new TurnEndedEvent(CurrentTurn));
|
||||
|
||||
GD.Print("Review Complete. Waiting for Next Turn confirmation.");
|
||||
}
|
||||
@ -144,20 +140,20 @@ public partial class GameManager : Node
|
||||
{
|
||||
if (CurrentPhase != GamePhase.Review) return;
|
||||
|
||||
CurrentTurn++;
|
||||
if (CurrentTurn > MaxTurns)
|
||||
Controller.StartNextTurn();
|
||||
if (CurrentTurn > State.Turn.MaxTurns)
|
||||
{
|
||||
GD.Print("Game Over!");
|
||||
// Handle Game Over
|
||||
return;
|
||||
}
|
||||
|
||||
CurrentPhase = GamePhase.Planning;
|
||||
State.Turn.Phase = GamePhase.Planning;
|
||||
EmitSignal(SignalName.TurnChanged, CurrentTurn);
|
||||
EmitSignal(SignalName.PhaseChanged, (int)CurrentPhase);
|
||||
|
||||
// Refresh resources/AP
|
||||
Mentor.Energy.Current = Mentor.Energy.UpperThreshold;
|
||||
Mentor.Resources.Energy.Current.Value = Mentor.Resources.Energy.UpperThreshold;
|
||||
|
||||
GD.Print($"Turn {CurrentTurn} Started. Phase: Planning");
|
||||
}
|
||||
|
||||
55
scripts/Models/CoreIds.cs
Normal file
55
scripts/Models/CoreIds.cs
Normal file
@ -0,0 +1,55 @@
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 内置内容 Id(方便代码引用,避免魔法字符串)
|
||||
/// 设计说明:
|
||||
/// 1) 仅列出核心/内置内容,Mod 内容不应写在这里。
|
||||
/// 2) Id 使用 “namespace:name” 形式,默认 namespace 为 core。
|
||||
/// 注意事项:
|
||||
/// - 更改 Id 会破坏存档兼容性,请谨慎修改。
|
||||
/// 未来扩展:
|
||||
/// - 可拆分为多个文件(Disciplines/Roles/Items)以减少体积。
|
||||
/// </summary>
|
||||
public static class CoreIds
|
||||
{
|
||||
public const string Namespace = "core";
|
||||
|
||||
// Disciplines
|
||||
public const string DisciplineBiology = "core:discipline_biology";
|
||||
public const string DisciplineChemistry = "core:discipline_chemistry";
|
||||
public const string DisciplineEnvironment = "core:discipline_environment";
|
||||
public const string DisciplineMaterials = "core:discipline_materials";
|
||||
public const string DisciplineMedicine = "core:discipline_medicine";
|
||||
public const string DisciplineComputer = "core:discipline_computer";
|
||||
public const string DisciplineMath = "core:discipline_math";
|
||||
public const string DisciplinePhysics = "core:discipline_physics";
|
||||
public const string DisciplineMechanical = "core:discipline_mechanical";
|
||||
public const string DisciplinePhilosophy = "core:discipline_philosophy";
|
||||
public const string DisciplineEconomics = "core:discipline_economics";
|
||||
public const string DisciplineLaw = "core:discipline_law";
|
||||
public const string DisciplineLiterature = "core:discipline_literature";
|
||||
public const string DisciplineAgriculture = "core:discipline_agriculture";
|
||||
public const string DisciplineManagement = "core:discipline_management";
|
||||
public const string DisciplineArt = "core:discipline_art";
|
||||
|
||||
// Archetypes
|
||||
public const string ArchetypeGrinder = "core:archetype_grinder";
|
||||
public const string ArchetypeSlacker = "core:archetype_slacker";
|
||||
public const string ArchetypeElite = "core:archetype_elite";
|
||||
public const string ArchetypeProdigy = "core:archetype_prodigy";
|
||||
public const string ArchetypeMascot = "core:archetype_mascot";
|
||||
|
||||
// Roles
|
||||
public const string RoleCoder = "core:role_coder";
|
||||
public const string RoleWriter = "core:role_writer";
|
||||
public const string RoleLabRat = "core:role_lab_rat";
|
||||
public const string RolePresenter = "core:role_presenter";
|
||||
public const string RoleScribe = "core:role_scribe";
|
||||
public const string RoleOrator = "core:role_orator";
|
||||
public const string RoleSteward = "core:role_steward";
|
||||
public const string RoleAlchemist = "core:role_alchemist";
|
||||
public const string RoleGeek = "core:role_geek";
|
||||
public const string RoleSurveyor = "core:role_surveyor";
|
||||
public const string RoleThinker = "core:role_thinker";
|
||||
}
|
||||
|
||||
32
scripts/Models/DefinitionSupport.cs
Normal file
32
scripts/Models/DefinitionSupport.cs
Normal file
@ -0,0 +1,32 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 定义数据的通用结构(i18n + 标识 + 标签)
|
||||
/// 设计说明:
|
||||
/// 1) LocalizedText 只保存 Key/Fallback,不做翻译,翻译交给服务层。
|
||||
/// 2) DefinitionHeader 用组合而非继承,避免所有定义都挂在同一基类。
|
||||
/// 3) Tags 统一用 string Id,便于 Mod 增删与过滤。
|
||||
/// 注意事项:
|
||||
/// - 资源路径统一使用 res:// 且小写下划线。
|
||||
/// - Id 建议使用 “namespace:name” 形式,例如 “core:discipline_biology”。
|
||||
/// 未来扩展:
|
||||
/// - 可加入 Icon/Color/SortOrder 以支持 UI 排序与分组。
|
||||
/// - 可加入 Source/Version 字段用于 Mod 冲突排查。
|
||||
/// </summary>
|
||||
public sealed class LocalizedText
|
||||
{
|
||||
public string Key { get; set; }
|
||||
public string Fallback { get; set; }
|
||||
}
|
||||
|
||||
public sealed class DefinitionHeader
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public LocalizedText Name { get; set; } = new();
|
||||
public LocalizedText Description { get; set; } = new();
|
||||
public string IconPath { get; set; }
|
||||
public List<string> Tags { get; } = new();
|
||||
}
|
||||
|
||||
31
scripts/Models/DisciplineDefinitions.cs
Normal file
31
scripts/Models/DisciplineDefinitions.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 学科定义(决定开局流派、核心资源循环与卡池)
|
||||
/// 设计说明:
|
||||
/// 1) 学科只描述“规则与池子”,具体资源结算由系统层执行。
|
||||
/// 2) Buff 使用 ModifierBundle + RuleIds 组合,便于非数值机制扩展。
|
||||
/// 注意事项:
|
||||
/// - DisciplineId 应稳定,用于存档与 Mod 兼容。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“学科子方向”与“跨学科解锁条件”。
|
||||
/// </summary>
|
||||
public sealed class DisciplineDefinition
|
||||
{
|
||||
public DefinitionHeader Header { get; set; } = new();
|
||||
public DisciplineBuff Buff { get; set; } = new();
|
||||
|
||||
public List<string> RolePoolIds { get; } = new();
|
||||
public List<string> ItemPoolIds { get; } = new();
|
||||
public List<string> TaskKeywordIds { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class DisciplineBuff
|
||||
{
|
||||
public LocalizedText Name { get; set; } = new();
|
||||
public LocalizedText Description { get; set; } = new();
|
||||
public ModifierBundle Modifiers { get; set; } = new();
|
||||
}
|
||||
|
||||
43
scripts/Models/DomainEnums.cs
Normal file
43
scripts/Models/DomainEnums.cs
Normal file
@ -0,0 +1,43 @@
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 通用枚举(跨系统共享)
|
||||
/// 设计说明:
|
||||
/// 1) 这些枚举用于 Modifier 与系统逻辑,不直接绑定某个 UI。
|
||||
/// 2) 若未来需要 Mod 扩展新类型,可将枚举替换为 string Id。
|
||||
/// 注意事项:
|
||||
/// - 如果确实需要开放扩展,请避免在存档里写枚举的数值。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“行动点/灵感/算力”等资源类型。
|
||||
/// </summary>
|
||||
public enum AttributeType
|
||||
{
|
||||
Academic,
|
||||
Engineering,
|
||||
Writing,
|
||||
Financial,
|
||||
Social,
|
||||
Activation
|
||||
}
|
||||
|
||||
public enum ResourceType
|
||||
{
|
||||
Money,
|
||||
Reputation,
|
||||
ResearchPoints,
|
||||
Paper,
|
||||
Inspiration,
|
||||
Time
|
||||
}
|
||||
|
||||
public enum StatusType
|
||||
{
|
||||
Stress,
|
||||
Sanity,
|
||||
Mood,
|
||||
Stamina,
|
||||
Loyalty,
|
||||
Energy,
|
||||
Health
|
||||
}
|
||||
|
||||
26
scripts/Models/GameContentDatabase.cs
Normal file
26
scripts/Models/GameContentDatabase.cs
Normal file
@ -0,0 +1,26 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 游戏内容数据库(Definitions 聚合)
|
||||
/// 设计说明:
|
||||
/// 1) 将所有配置型数据集中到一个对象,便于系统层按 Id 索引。
|
||||
/// 2) 由 ContentRegistry 构建,支持 Mod 覆盖/合并。
|
||||
/// 注意事项:
|
||||
/// - 本对象只存配置,不存运行时状态。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“索引缓存”(如按学科/稀有度过滤)。
|
||||
/// </summary>
|
||||
public sealed class GameContentDatabase
|
||||
{
|
||||
public Dictionary<string, DisciplineDefinition> Disciplines { get; } = new();
|
||||
public Dictionary<string, ArchetypeDefinition> Archetypes { get; } = new();
|
||||
public Dictionary<string, RoleDefinition> Roles { get; } = new();
|
||||
public Dictionary<string, TraitDefinition> Traits { get; } = new();
|
||||
public Dictionary<string, TaskDefinition> Tasks { get; } = new();
|
||||
public Dictionary<string, ItemDefinition> Items { get; } = new();
|
||||
public Dictionary<string, PaperDefinition> Papers { get; } = new();
|
||||
public Dictionary<string, RoguelitePerkDefinition> RoguelitePerks { get; } = new();
|
||||
}
|
||||
|
||||
85
scripts/Models/GameState.cs
Normal file
85
scripts/Models/GameState.cs
Normal file
@ -0,0 +1,85 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 运行时全局状态(GameState)
|
||||
/// 设计说明:
|
||||
/// 1) 将“局内状态”集中在一个聚合对象中,便于存档与调试快照。
|
||||
/// 2) 具体子状态按职责拆分:回合/经济/人员/任务/库存/羁绊。
|
||||
/// 3) Controller/System 只依赖这份数据,不直接操作 View。
|
||||
/// 注意事项:
|
||||
/// - 这是运行时数据,不是配置数据;配置请看 *Definition 类。
|
||||
/// - 禁止在这里引用 Godot Node,保持纯数据。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“存档版本号”和“迁移器”,支持版本升级。
|
||||
/// - 可加入“局外 Roguelite 状态”,与局内共享接口。
|
||||
/// </summary>
|
||||
public sealed class GameState
|
||||
{
|
||||
public TurnState Turn { get; } = new();
|
||||
public EconomyState Economy { get; } = new();
|
||||
public RosterState Roster { get; } = new();
|
||||
public TaskState Tasks { get; } = new();
|
||||
public InventoryState Inventory { get; } = new();
|
||||
public SynergyState Synergy { get; } = new();
|
||||
public RogueliteState Roguelite { get; } = new();
|
||||
}
|
||||
|
||||
public enum GamePhase
|
||||
{
|
||||
Planning,
|
||||
Execution,
|
||||
Review
|
||||
}
|
||||
|
||||
public sealed class TurnState
|
||||
{
|
||||
public int CurrentTurn { get; set; } = 1;
|
||||
public int MaxTurns { get; set; } = 30;
|
||||
public GamePhase Phase { get; set; } = GamePhase.Planning;
|
||||
}
|
||||
|
||||
public sealed class EconomyState
|
||||
{
|
||||
public int Money { get; set; } = 50000;
|
||||
public int Reputation { get; set; }
|
||||
public int ResearchPoints { get; set; }
|
||||
public float InterestRate { get; set; } = 0.0f;
|
||||
}
|
||||
|
||||
public sealed class RosterState
|
||||
{
|
||||
public MentorModel Mentor { get; set; } = new("Player");
|
||||
public List<StudentModel> Students { get; } = new();
|
||||
public List<StaffModel> Staffs { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class TaskState
|
||||
{
|
||||
public List<TaskModel> ActiveTasks { get; } = new();
|
||||
public List<TaskModel> CompletedTasks { get; } = new();
|
||||
public List<TaskModel> FailedTasks { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class InventoryState
|
||||
{
|
||||
public Dictionary<string, int> ItemCounts { get; } = new();
|
||||
public Dictionary<PaperRank, int> PaperCounts { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class SynergyState
|
||||
{
|
||||
public Dictionary<string, int> ArchetypeStacks { get; } = new();
|
||||
public Dictionary<string, int> RoleStacks { get; } = new();
|
||||
public List<string> ActiveSynergyIds { get; } = new();
|
||||
public ModifierBundle ActiveModifiers { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class RogueliteState
|
||||
{
|
||||
public List<string> AlumniCardIds { get; } = new();
|
||||
public List<string> LegacyUnlockIds { get; } = new();
|
||||
public int TitleRetentionLevel { get; set; }
|
||||
}
|
||||
|
||||
59
scripts/Models/ItemDefinitions.cs
Normal file
59
scripts/Models/ItemDefinitions.cs
Normal file
@ -0,0 +1,59 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 装备/设施定义(通用 + 学科专用)
|
||||
/// 设计说明:
|
||||
/// 1) Facility 与 Equipment 统一为 ItemDefinition,不同类别通过枚举区分。
|
||||
/// 2) 效果使用 ModifierBundle + RuleIds 组合,便于特殊规则注入。
|
||||
/// 注意事项:
|
||||
/// - Placement/Slot 为 UI 与摆放系统提供约束,不做逻辑判断。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“耐久度/维护成本/占地大小”等字段。
|
||||
/// </summary>
|
||||
public enum ItemCategory
|
||||
{
|
||||
Facility,
|
||||
Equipment,
|
||||
Consumable
|
||||
}
|
||||
|
||||
public enum FacilityPlacement
|
||||
{
|
||||
Lab,
|
||||
ServerRoom,
|
||||
Admin,
|
||||
Library,
|
||||
RestArea,
|
||||
Field,
|
||||
Global
|
||||
}
|
||||
|
||||
public enum EquipmentSlot
|
||||
{
|
||||
Tool,
|
||||
Accessory,
|
||||
Body,
|
||||
Head,
|
||||
Hand
|
||||
}
|
||||
|
||||
public sealed class ItemDefinition
|
||||
{
|
||||
public DefinitionHeader Header { get; set; } = new();
|
||||
public ItemCategory Category { get; set; }
|
||||
public string DisciplineId { get; set; }
|
||||
public FacilityPlacement Placement { get; set; }
|
||||
public EquipmentSlot Slot { get; set; }
|
||||
public ItemEffect Effect { get; set; } = new();
|
||||
public bool IsUnique { get; set; }
|
||||
public int MaxStack { get; set; } = 1;
|
||||
}
|
||||
|
||||
public sealed class ItemEffect
|
||||
{
|
||||
public ModifierBundle Modifiers { get; set; } = new();
|
||||
public List<string> RuleIds { get; } = new();
|
||||
}
|
||||
|
||||
@ -1,70 +1,51 @@
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 导师数据模型 (MentorModel)
|
||||
/// 玩家的数值状态。
|
||||
/// 单例模式。
|
||||
/// 导师数据模型 (MentorModel)
|
||||
/// 设计说明:
|
||||
/// 1) 改为组合式结构,不再使用单例,避免全局隐式依赖。
|
||||
/// 2) 导师只保留“角色自身状态”,资金/声望等全局资源归 EconomyState 管理。
|
||||
/// 3) 这样便于后续扩展多导师/多人模式或 Mod 玩法。
|
||||
/// 注意事项:
|
||||
/// - 构造函数不做复杂逻辑,具体初始数值交由 GameSession 初始化。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“导师技能树/天赋树”组件,与肉鸽继承系统对接。
|
||||
/// - 可加入“导师光环”组件,在系统层计算对学生的影响范围。
|
||||
/// </summary>
|
||||
public class MentorModel : UnitModel
|
||||
public sealed class MentorModel
|
||||
{
|
||||
private static MentorModel _instance;
|
||||
public enum MentorModeType
|
||||
{
|
||||
Worker,
|
||||
Manager
|
||||
}
|
||||
|
||||
public static MentorModel Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_instance == null)
|
||||
{
|
||||
// 如果需要默认名称,这里可以硬编码或改为 Lazy 加载
|
||||
_instance = new MentorModel("Player");
|
||||
}
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
public UnitModel Core { get; }
|
||||
public MentorResources Resources { get; }
|
||||
public MentorModeType Mode { get; set; } = MentorModeType.Worker;
|
||||
|
||||
public enum MentorModeType
|
||||
{
|
||||
Worker,
|
||||
Manager
|
||||
}
|
||||
public string Name
|
||||
{
|
||||
get => Core.Name;
|
||||
set => Core.Name = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 精力值 (Energy)
|
||||
/// 用于释放技能(画饼、PUA、甚至亲自写代码)。
|
||||
/// 每回合恢复。
|
||||
/// </summary>
|
||||
public StatusValue Energy { get; set; }
|
||||
public MentorModel(string name)
|
||||
{
|
||||
Core = new UnitModel(name);
|
||||
Resources = new MentorResources();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 经费 (Money/Funds)
|
||||
/// 单位:元。用于发工资、买设备。
|
||||
/// </summary>
|
||||
public int Money { get; set; } = 50000;
|
||||
/// <summary>
|
||||
/// 导师资源组件(角色自身能量池)
|
||||
/// </summary>
|
||||
public sealed class MentorResources
|
||||
{
|
||||
public StatusValue Energy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 学术声望 (Reputation)
|
||||
/// 影响招生质量、项目申请成功率。
|
||||
/// </summary>
|
||||
public int Reputation { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 算力/数据资源 (ResearchPoints)
|
||||
/// 用于攻克高难度 AI 课题。
|
||||
/// </summary>
|
||||
public int ResearchPoints { get; set; } = 0;
|
||||
|
||||
public MentorModeType Mode { get; set; } = MentorModeType.Worker;
|
||||
|
||||
// 私有构造函数,防止外部实例化
|
||||
private MentorModel(string name) : base(name)
|
||||
{
|
||||
// 初始化 Energy,默认上限 10000 (100.00)
|
||||
Energy = new StatusValue(new PropertyValue(10000), new PropertyValue(10000), new PropertyValue(0));
|
||||
}
|
||||
|
||||
// 如果需要重置单例(例如新游戏),可以添加一个重置方法
|
||||
public static void Reset(string name = "Player")
|
||||
{
|
||||
_instance = new MentorModel(name);
|
||||
}
|
||||
}
|
||||
public MentorResources()
|
||||
{
|
||||
Energy = new StatusValue(100, 100, 0);
|
||||
}
|
||||
}
|
||||
|
||||
43
scripts/Models/Modifiers.cs
Normal file
43
scripts/Models/Modifiers.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 统一的数值修饰结构(用于学科 Buff、羁绊、装备、特质)
|
||||
/// 设计说明:
|
||||
/// 1) 只表达“加成/倍率/规则”,不直接改变模型数值。
|
||||
/// 2) 计算由系统层统一处理,便于叠加与回滚。
|
||||
/// 注意事项:
|
||||
/// - 这里的 Multiplier 默认 1.0f,不是百分比。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“条件触发”与“持续时间”字段。
|
||||
/// </summary>
|
||||
public sealed class AttributeModifier
|
||||
{
|
||||
public AttributeType Type { get; set; }
|
||||
public float Add { get; set; }
|
||||
public float Multiplier { get; set; } = 1.0f;
|
||||
}
|
||||
|
||||
public sealed class StatusModifier
|
||||
{
|
||||
public StatusType Type { get; set; }
|
||||
public float Add { get; set; }
|
||||
public float Multiplier { get; set; } = 1.0f;
|
||||
}
|
||||
|
||||
public sealed class ResourceModifier
|
||||
{
|
||||
public ResourceType Type { get; set; }
|
||||
public int Add { get; set; }
|
||||
public float Multiplier { get; set; } = 1.0f;
|
||||
}
|
||||
|
||||
public sealed class ModifierBundle
|
||||
{
|
||||
public List<AttributeModifier> AttributeModifiers { get; } = new();
|
||||
public List<StatusModifier> StatusModifiers { get; } = new();
|
||||
public List<ResourceModifier> ResourceModifiers { get; } = new();
|
||||
public List<string> RuleIds { get; } = new();
|
||||
}
|
||||
|
||||
18
scripts/Models/PaperDefinitions.cs
Normal file
18
scripts/Models/PaperDefinitions.cs
Normal file
@ -0,0 +1,18 @@
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 论文卡牌定义
|
||||
/// 设计说明:
|
||||
/// 1) 论文作为“消耗品资源”,用于申请纵向基金。
|
||||
/// 2) 论文等级只是一种枚举,真正的效果由系统层决定。
|
||||
/// 注意事项:
|
||||
/// - 若需要“引用率/影响因子”,可在此扩展字段。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“论文主题标签”,影响基金/任务匹配度。
|
||||
/// </summary>
|
||||
public sealed class PaperDefinition
|
||||
{
|
||||
public DefinitionHeader Header { get; set; } = new();
|
||||
public PaperRank Rank { get; set; }
|
||||
}
|
||||
|
||||
@ -3,120 +3,129 @@ using System;
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 属性值类型
|
||||
/// 封装了整型数值,提供最大值限制(100)和显示转换。
|
||||
/// 属性值类型(通用数值封装)
|
||||
/// 设计说明:
|
||||
/// 1) 过去固定使用 0-100 的范围,导致“精力/算力”等大数值被强行截断。
|
||||
/// 2) 现在改为“每个实例自带范围”,默认仍然是 0-100,兼顾直觉和可扩展性。
|
||||
/// 3) 这个类仅承担“数值与范围”的职责,不负责业务含义,便于在 MVC 中被复用。
|
||||
/// 注意事项:
|
||||
/// - 运算符会保留左操作数的范围(或右操作数的范围),避免范围丢失。
|
||||
/// - 如果需要无上限/无下限,请显式传入更大的 Max/更小的 Min。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“软上限/软下限”和“可见范围”等 UI 表现字段。
|
||||
/// - 可增加数值变化事件,以便 View 层更高效地刷新。
|
||||
/// </summary>
|
||||
public class PropertyValue
|
||||
public sealed class PropertyValue
|
||||
{
|
||||
public const int Min = 0;
|
||||
public const int Max = 100;
|
||||
|
||||
private float _value;
|
||||
public const float DefaultMin = 0f;
|
||||
public const float DefaultMax = 100f;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置当前值。
|
||||
/// 设置时会自动限制在 [Min, Max] 范围内。
|
||||
/// </summary>
|
||||
public float Value
|
||||
{
|
||||
get => _value;
|
||||
set
|
||||
{
|
||||
_value = value;
|
||||
if (_value > Max) _value = Max;
|
||||
if (_value < Min) _value = Min;
|
||||
}
|
||||
}
|
||||
public float Min { get; }
|
||||
public float Max { get; }
|
||||
|
||||
public PropertyValue(int value)
|
||||
{
|
||||
Value = value;
|
||||
}
|
||||
|
||||
public PropertyValue(float value)
|
||||
{
|
||||
Value = value;
|
||||
}
|
||||
private float _value;
|
||||
|
||||
public PropertyValue() : this(0) { }
|
||||
public float Value
|
||||
{
|
||||
get => _value;
|
||||
set => _value = Clamp(value, Min, Max);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取显示值 (Value / 100.0f)
|
||||
/// </summary>
|
||||
public int Display() => (int)_value;
|
||||
public PropertyValue(float value = 0, float min = DefaultMin, float max = DefaultMax)
|
||||
{
|
||||
if (max < min)
|
||||
{
|
||||
// 兜底修正,避免传参错误导致全局异常
|
||||
(min, max) = (max, min);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Display().ToString();
|
||||
}
|
||||
Min = min;
|
||||
Max = max;
|
||||
Value = value;
|
||||
}
|
||||
|
||||
// --- 隐式转换 (实现“重载等号”效果) ---
|
||||
public PropertyValue(int value, float min = DefaultMin, float max = DefaultMax)
|
||||
: this((float)value, min, max)
|
||||
{
|
||||
}
|
||||
|
||||
// 允许 int 直接赋值给 PropertyValue (创建新实例)
|
||||
public static implicit operator PropertyValue(int value)
|
||||
{
|
||||
return new PropertyValue(value);
|
||||
}
|
||||
public int DisplayInt() => (int)_value;
|
||||
|
||||
// 允许 int 直接赋值给 PropertyValue (创建新实例)
|
||||
public static implicit operator PropertyValue(float value)
|
||||
{
|
||||
return new PropertyValue(value);
|
||||
}
|
||||
|
||||
// 允许 PropertyValue 像 int 一样使用
|
||||
public static implicit operator int(PropertyValue p)
|
||||
{
|
||||
return (int)p._value;
|
||||
}
|
||||
public float Normalized
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Max <= Min) return 0f;
|
||||
return (Value - Min) / (Max - Min);
|
||||
}
|
||||
}
|
||||
|
||||
// 允许 PropertyValue 像 float 一样使用
|
||||
public static implicit operator float(PropertyValue p)
|
||||
{
|
||||
return p._value;
|
||||
}
|
||||
public PropertyValue Clone() => new(Value, Min, Max);
|
||||
|
||||
// --- 运算符重载 (支持 int 计算) ---
|
||||
public void Add(float delta) => Value += delta;
|
||||
|
||||
public static PropertyValue operator +(PropertyValue a, int b) => new(a._value + b);
|
||||
public static PropertyValue operator +(int a, PropertyValue b) => new(a + b._value);
|
||||
|
||||
public static PropertyValue operator -(PropertyValue a, int b) => new(a._value - b);
|
||||
public static PropertyValue operator -(int a, PropertyValue b) => new(a - b._value);
|
||||
public void Subtract(float delta) => Value -= delta;
|
||||
|
||||
public static PropertyValue operator *(PropertyValue a, int b) => new(a._value * b);
|
||||
public static PropertyValue operator *(int a, PropertyValue b) => new(a * b._value);
|
||||
public override string ToString() => DisplayInt().ToString();
|
||||
|
||||
public static PropertyValue operator /(PropertyValue a, int b)
|
||||
{
|
||||
return b == 0 ? throw new DivideByZeroException() : new PropertyValue(a._value / b);
|
||||
}
|
||||
public static PropertyValue operator /(int a, PropertyValue b)
|
||||
{
|
||||
return b._value == 0 ? throw new DivideByZeroException() : new PropertyValue(a / b._value);
|
||||
}
|
||||
// --- 隐式转换(用于简化调用,但不改变范围语义) ---
|
||||
public static implicit operator PropertyValue(int value)
|
||||
{
|
||||
return new PropertyValue(value);
|
||||
}
|
||||
|
||||
// --- 运算符重载 (支持 float 计算) ---
|
||||
public static implicit operator PropertyValue(float value)
|
||||
{
|
||||
return new PropertyValue(value);
|
||||
}
|
||||
|
||||
public static PropertyValue operator +(PropertyValue a, float b) => new(a._value + b);
|
||||
public static PropertyValue operator +(float a, PropertyValue b) => new(a + b._value);
|
||||
public static implicit operator int(PropertyValue p)
|
||||
{
|
||||
return (int)p._value;
|
||||
}
|
||||
|
||||
public static PropertyValue operator -(PropertyValue a, float b) => new(a._value - b);
|
||||
public static PropertyValue operator -(float a, PropertyValue b) => new(a - b._value);
|
||||
public static implicit operator float(PropertyValue p)
|
||||
{
|
||||
return p._value;
|
||||
}
|
||||
|
||||
public static PropertyValue operator *(PropertyValue a, float b) => new(a._value * b);
|
||||
public static PropertyValue operator *(float a, PropertyValue b) => new(a * b._value);
|
||||
// --- 运算符重载(保留范围) ---
|
||||
public static PropertyValue operator +(PropertyValue a, int b) => new(a._value + b, a.Min, a.Max);
|
||||
public static PropertyValue operator +(int a, PropertyValue b) => new(a + b._value, b.Min, b.Max);
|
||||
public static PropertyValue operator -(PropertyValue a, int b) => new(a._value - b, a.Min, a.Max);
|
||||
public static PropertyValue operator -(int a, PropertyValue b) => new(a - b._value, b.Min, b.Max);
|
||||
public static PropertyValue operator *(PropertyValue a, int b) => new(a._value * b, a.Min, a.Max);
|
||||
public static PropertyValue operator *(int a, PropertyValue b) => new(a * b._value, b.Min, b.Max);
|
||||
public static PropertyValue operator /(PropertyValue a, int b)
|
||||
{
|
||||
return b == 0 ? throw new DivideByZeroException() : new PropertyValue(a._value / b, a.Min, a.Max);
|
||||
}
|
||||
public static PropertyValue operator /(int a, PropertyValue b)
|
||||
{
|
||||
return b._value == 0 ? throw new DivideByZeroException() : new PropertyValue(a / b._value, b.Min, b.Max);
|
||||
}
|
||||
|
||||
public static PropertyValue operator /(PropertyValue a, float b) => new(a._value / b);
|
||||
public static PropertyValue operator /(float a, PropertyValue b) => new(a / b._value);
|
||||
|
||||
// --- 运算符重载 (PropertyValue 之间) ---
|
||||
|
||||
public static PropertyValue operator +(PropertyValue a, PropertyValue b) => new(a._value + b._value);
|
||||
public static PropertyValue operator -(PropertyValue a, PropertyValue b) => new(a._value - b._value);
|
||||
public static PropertyValue operator *(PropertyValue a, PropertyValue b) => new(a._value * b._value);
|
||||
public static PropertyValue operator /(PropertyValue a, PropertyValue b)
|
||||
{
|
||||
return b._value == 0 ? throw new DivideByZeroException() : new PropertyValue(a._value / b._value);
|
||||
}
|
||||
}
|
||||
public static PropertyValue operator +(PropertyValue a, float b) => new(a._value + b, a.Min, a.Max);
|
||||
public static PropertyValue operator +(float a, PropertyValue b) => new(a + b._value, b.Min, b.Max);
|
||||
public static PropertyValue operator -(PropertyValue a, float b) => new(a._value - b, a.Min, a.Max);
|
||||
public static PropertyValue operator -(float a, PropertyValue b) => new(a - b._value, b.Min, b.Max);
|
||||
public static PropertyValue operator *(PropertyValue a, float b) => new(a._value * b, a.Min, a.Max);
|
||||
public static PropertyValue operator *(float a, PropertyValue b) => new(a * b._value, b.Min, b.Max);
|
||||
public static PropertyValue operator /(PropertyValue a, float b) => new(a._value / b, a.Min, a.Max);
|
||||
public static PropertyValue operator /(float a, PropertyValue b) => new(a / b._value, b.Min, b.Max);
|
||||
|
||||
public static PropertyValue operator +(PropertyValue a, PropertyValue b) => new(a._value + b._value, a.Min, a.Max);
|
||||
public static PropertyValue operator -(PropertyValue a, PropertyValue b) => new(a._value - b._value, a.Min, a.Max);
|
||||
public static PropertyValue operator *(PropertyValue a, PropertyValue b) => new(a._value * b._value, a.Min, a.Max);
|
||||
public static PropertyValue operator /(PropertyValue a, PropertyValue b)
|
||||
{
|
||||
return b._value == 0 ? throw new DivideByZeroException() : new PropertyValue(a._value / b._value, a.Min, a.Max);
|
||||
}
|
||||
|
||||
private static float Clamp(float value, float min, float max)
|
||||
{
|
||||
if (value < min) return min;
|
||||
if (value > max) return max;
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
27
scripts/Models/RogueliteDefinitions.cs
Normal file
27
scripts/Models/RogueliteDefinitions.cs
Normal file
@ -0,0 +1,27 @@
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 肉鸽继承/局外成长定义
|
||||
/// 设计说明:
|
||||
/// 1) 对应“校友录/祖传代码/职称保留”等局外系统。
|
||||
/// 2) 这里只描述解锁项,实际解锁逻辑由系统层处理。
|
||||
/// 注意事项:
|
||||
/// - 与存档绑定的解锁项需要稳定 Id。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“局外科技树”与“多周目难度曲线”。
|
||||
/// </summary>
|
||||
public enum RoguelitePerkType
|
||||
{
|
||||
AlumniCard,
|
||||
LegacyProgress,
|
||||
TitleRetention
|
||||
}
|
||||
|
||||
public sealed class RoguelitePerkDefinition
|
||||
{
|
||||
public DefinitionHeader Header { get; set; } = new();
|
||||
public RoguelitePerkType Type { get; set; }
|
||||
public ModifierBundle Modifiers { get; set; } = new();
|
||||
public int MaxLevel { get; set; } = 1;
|
||||
}
|
||||
|
||||
47
scripts/Models/StaffModel.cs
Normal file
47
scripts/Models/StaffModel.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 雇员/合作人数据模型 (StaffModel)
|
||||
/// 设计说明:
|
||||
/// 1) 覆盖“博后/小老师”等非学生角色,强调长期合作与野心值。
|
||||
/// 2) 继续复用 UnitModel 组件,保证与学生/导师统一的数据接口。
|
||||
/// 注意事项:
|
||||
/// - Staff 行为逻辑应由系统层决定(例如背刺/跳槽)。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“合作者关系网”和“派系归属”。
|
||||
/// </summary>
|
||||
public sealed class StaffModel
|
||||
{
|
||||
public enum StaffType
|
||||
{
|
||||
PostDoc,
|
||||
JuniorFaculty
|
||||
}
|
||||
|
||||
public UnitModel Core { get; }
|
||||
public StaffType Type { get; private set; }
|
||||
public StaffMotivation Motivation { get; }
|
||||
|
||||
public string Name
|
||||
{
|
||||
get => Core.Name;
|
||||
set => Core.Name = value;
|
||||
}
|
||||
|
||||
public StaffModel(string name, StaffType type, Random random = null)
|
||||
{
|
||||
Core = new UnitModel(name, random);
|
||||
Type = type;
|
||||
Motivation = new StaffMotivation();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class StaffMotivation
|
||||
{
|
||||
public StatusValue Ambition { get; set; } = new(50, 100, 0);
|
||||
public StatusValue Loyalty { get; set; } = new(70, 100, 0);
|
||||
public StatusValue ContractTurns { get; set; } = new(6, 12, 0);
|
||||
}
|
||||
|
||||
@ -4,98 +4,81 @@ namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 状态值 (StatusValue)
|
||||
/// 维护当前状态值以及上限和下限阈值。
|
||||
/// 设计说明:
|
||||
/// 1) 这是“带阈值的数值”,用于压力、体力、忠诚等需要触发事件的状态。
|
||||
/// 2) 当前值由 PropertyValue 承担“范围约束”,阈值只负责触发行为。
|
||||
/// 3) 事件由 Model 层抛出,Controller/系统层订阅,View 不直接耦合。
|
||||
/// 注意事项:
|
||||
/// - Upper/Lower 默认等于当前范围的上/下限,保持语义直观。
|
||||
/// - 如果需要“软阈值”,请在系统中根据 Normalized 手动判断。
|
||||
/// 未来扩展:
|
||||
/// - 可增加“阈值触发冷却/抑制器”,避免频繁触发。
|
||||
/// - 可加入“变化速率”以支持回合/时间驱动的增减。
|
||||
/// </summary>
|
||||
public class StatusValue
|
||||
public sealed class StatusValue
|
||||
{
|
||||
private PropertyValue _current;
|
||||
private PropertyValue _upperThreshold;
|
||||
private PropertyValue _lowerThreshold;
|
||||
private PropertyValue _current;
|
||||
|
||||
/// <summary>
|
||||
/// 当 Current >= UpperThreshold 时触发此事件
|
||||
/// </summary>
|
||||
public event Action OnUpperThresholdReached;
|
||||
public event Action OnUpperThresholdReached;
|
||||
public event Action OnLowerThresholdReached;
|
||||
|
||||
/// <summary>
|
||||
/// 当 Current <= LowerThreshold 时触发此事件
|
||||
/// </summary>
|
||||
public event Action OnLowerThresholdReached;
|
||||
public PropertyValue Current
|
||||
{
|
||||
get => _current;
|
||||
set
|
||||
{
|
||||
_current = value;
|
||||
CheckThresholds();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当前状态值
|
||||
/// 修改时会自动检测阈值。
|
||||
/// </summary>
|
||||
public PropertyValue Current
|
||||
{
|
||||
get => _current;
|
||||
set
|
||||
{
|
||||
_current = value;
|
||||
CheckThresholds();
|
||||
}
|
||||
}
|
||||
public float UpperThreshold { get; set; }
|
||||
public float LowerThreshold { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 上限阈值
|
||||
/// </summary>
|
||||
public PropertyValue UpperThreshold
|
||||
{
|
||||
get => _upperThreshold;
|
||||
set
|
||||
{
|
||||
_upperThreshold = value;
|
||||
CheckThresholds();
|
||||
}
|
||||
}
|
||||
public StatusValue(int current = 0, int upper = 100, int lower = 0)
|
||||
{
|
||||
_current = new PropertyValue(current, lower, upper);
|
||||
UpperThreshold = upper;
|
||||
LowerThreshold = lower;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 下限阈值
|
||||
/// </summary>
|
||||
public PropertyValue LowerThreshold
|
||||
{
|
||||
get => _lowerThreshold;
|
||||
set
|
||||
{
|
||||
_lowerThreshold = value;
|
||||
CheckThresholds();
|
||||
}
|
||||
}
|
||||
public StatusValue(float current, float upper, float lower)
|
||||
{
|
||||
_current = new PropertyValue(current, lower, upper);
|
||||
UpperThreshold = upper;
|
||||
LowerThreshold = lower;
|
||||
}
|
||||
|
||||
public StatusValue(int current = 0, int upper = 100, int lower = 0)
|
||||
{
|
||||
_current = new PropertyValue(current);
|
||||
_upperThreshold = new PropertyValue(upper);
|
||||
_lowerThreshold = new PropertyValue(lower);
|
||||
}
|
||||
|
||||
public StatusValue(PropertyValue current, PropertyValue upper, PropertyValue lower)
|
||||
{
|
||||
_current = current ?? new PropertyValue(0);
|
||||
_upperThreshold = upper ?? new PropertyValue(100);
|
||||
_lowerThreshold = lower ?? new PropertyValue(0);
|
||||
}
|
||||
public StatusValue(PropertyValue current, float upperThreshold, float lowerThreshold)
|
||||
{
|
||||
_current = current ?? new PropertyValue(0);
|
||||
UpperThreshold = upperThreshold;
|
||||
LowerThreshold = lowerThreshold;
|
||||
CheckThresholds();
|
||||
}
|
||||
|
||||
private void CheckThresholds()
|
||||
{
|
||||
if ((int)_current >= (int)_upperThreshold)
|
||||
{
|
||||
OnUpperThresholdReached?.Invoke();
|
||||
}
|
||||
private void CheckThresholds()
|
||||
{
|
||||
if (_current.Value >= UpperThreshold)
|
||||
{
|
||||
OnUpperThresholdReached?.Invoke();
|
||||
}
|
||||
|
||||
if ((int)_current <= (int)_lowerThreshold)
|
||||
{
|
||||
OnLowerThresholdReached?.Invoke();
|
||||
}
|
||||
}
|
||||
if (_current.Value <= LowerThreshold)
|
||||
{
|
||||
OnLowerThresholdReached?.Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
public void Add(int value)
|
||||
{
|
||||
Current += value; // 触发 setter -> CheckThresholds
|
||||
}
|
||||
|
||||
public void Subtract(int value)
|
||||
{
|
||||
Current -= value; // 触发 setter -> CheckThresholds
|
||||
}
|
||||
}
|
||||
public void Add(float value)
|
||||
{
|
||||
_current.Add(value);
|
||||
CheckThresholds();
|
||||
}
|
||||
|
||||
public void Subtract(float value)
|
||||
{
|
||||
_current.Subtract(value);
|
||||
CheckThresholds();
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,59 +5,70 @@ namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 学生数据模型 (StudentModel)
|
||||
/// 包含学生的数值、状态和特质。
|
||||
/// 与 Godot 的 Node (View) 分离,便于序列化和逻辑处理。
|
||||
/// 设计说明:
|
||||
/// 1) 不再继承 UnitModel,而是通过 Core 组合通用组件(属性/状态/标签/装备等)。
|
||||
/// 2) 学生特有内容(年级/体力/忠诚/署名贡献)放在独立组件中,保持高内聚。
|
||||
/// 3) Model 层仅负责数据,不做 Godot 行为调用,方便后续存档与 Mod 注入。
|
||||
/// 注意事项:
|
||||
/// - Traits 实际上是标签(Tag),统一走 Core.Tags.TraitIds,避免双份真相。
|
||||
/// - Grade 仅表示“学年进度”,不是学术能力值。
|
||||
/// 未来扩展:
|
||||
/// - 可新增“毕业/退学事件队列”,由系统层驱动。
|
||||
/// - 可新增“论文署名历史”用于复盘与羁绊叠层回溯。
|
||||
/// </summary>
|
||||
public class StudentModel: UnitModel
|
||||
public sealed class StudentModel
|
||||
{
|
||||
public enum StudentType
|
||||
{
|
||||
MasterCandidate,
|
||||
DoctorCandidate
|
||||
}
|
||||
|
||||
// --- 静态属性 (Property) ---
|
||||
/// <summary>
|
||||
/// 学生类型
|
||||
/// </summary>
|
||||
public StudentType Type { get; private set; }
|
||||
|
||||
// --- 动态状态 (Status) ---
|
||||
|
||||
/// <summary>
|
||||
/// 体力 (Stamina)
|
||||
/// 范围 0-100。工作消耗体力,休息恢复。体力过低效率下降。
|
||||
/// </summary>
|
||||
public StatusValue Stamina { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 忠诚度 (Loyalty)
|
||||
/// 范围 0-100。过低可能跳槽或举报。
|
||||
/// </summary>
|
||||
public StatusValue Loyalty { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 年级
|
||||
/// </summary>
|
||||
public StatusValue Grade { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 记录对每个 Task 的贡献量,用于署名分配
|
||||
/// </summary>
|
||||
public Dictionary<Guid, PropertyValue> Contributions { get; set; }
|
||||
public enum StudentType
|
||||
{
|
||||
MasterCandidate,
|
||||
DoctorCandidate
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 特质列表 (如 "DDL战士", "卷王")
|
||||
/// </summary>
|
||||
public List<string> Traits { get; set; } = [];
|
||||
public UnitModel Core { get; }
|
||||
public StudentType Type { get; private set; }
|
||||
public StudentProgress Progress { get; }
|
||||
public StudentContributions Contributions { get; }
|
||||
|
||||
public StudentModel(string name) : base(name)
|
||||
{
|
||||
var random = new Random();
|
||||
Stamina = new StatusValue(random.Next(100),100, 0);
|
||||
Loyalty = new StatusValue(80, 100, 0);
|
||||
Type = random.Next(2) == 0 ? StudentType.MasterCandidate : StudentType.DoctorCandidate;
|
||||
Grade = new StatusValue(0, Type == StudentType.DoctorCandidate ? 6 : 3);
|
||||
}
|
||||
public string Name
|
||||
{
|
||||
get => Core.Name;
|
||||
set => Core.Name = value;
|
||||
}
|
||||
|
||||
public List<string> Traits => Core.Tags.TraitIds;
|
||||
|
||||
public StudentModel(string name, Random random = null)
|
||||
{
|
||||
var rng = random ?? Random.Shared;
|
||||
Core = new UnitModel(name, rng);
|
||||
Type = rng.Next(2) == 0 ? StudentType.MasterCandidate : StudentType.DoctorCandidate;
|
||||
Progress = new StudentProgress(Type);
|
||||
Contributions = new StudentContributions();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 学生进度组件(只关心学生生命周期)
|
||||
/// </summary>
|
||||
public sealed class StudentProgress
|
||||
{
|
||||
public StatusValue Stamina { get; set; }
|
||||
public StatusValue Loyalty { get; set; }
|
||||
public PropertyValue Grade { get; set; }
|
||||
|
||||
public StudentProgress(StudentModel.StudentType type)
|
||||
{
|
||||
Stamina = new StatusValue(100, 100, 0);
|
||||
Loyalty = new StatusValue(80, 100, 0);
|
||||
var maxGrade = type == StudentModel.StudentType.DoctorCandidate ? 6 : 3;
|
||||
Grade = new PropertyValue(0, 0, maxGrade);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 署名贡献记录(任务 -> 贡献值)
|
||||
/// </summary>
|
||||
public sealed class StudentContributions
|
||||
{
|
||||
public Dictionary<Guid, PropertyValue> ByTask { get; } = new();
|
||||
}
|
||||
|
||||
43
scripts/Models/SynergyDefinitions.cs
Normal file
43
scripts/Models/SynergyDefinitions.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 羁绊/职业/特质定义(“人群画像 + 职能分工”)
|
||||
/// 设计说明:
|
||||
/// 1) Archetype/Role 采用分层 Tier 模式,满足 2/4/6 叠层设计。
|
||||
/// 2) Trait 为单体特质,不叠层,仅提供修饰与规则。
|
||||
/// 注意事项:
|
||||
/// - Tier 的规则效果写在 RuleIds 中,由系统层解释执行。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“跨学科混合羁绊”条件与视觉特效引用。
|
||||
/// </summary>
|
||||
public sealed class ArchetypeDefinition
|
||||
{
|
||||
public DefinitionHeader Header { get; set; } = new();
|
||||
public List<SynergyTier> Tiers { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class RoleDefinition
|
||||
{
|
||||
public DefinitionHeader Header { get; set; } = new();
|
||||
public List<SynergyTier> Tiers { get; } = new();
|
||||
|
||||
// 如果是学科限定角色(如炼金术士/极客),在这里配置允许的学科 Id。
|
||||
public List<string> AllowedDisciplineIds { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class TraitDefinition
|
||||
{
|
||||
public DefinitionHeader Header { get; set; } = new();
|
||||
public ModifierBundle Modifiers { get; set; } = new();
|
||||
public List<string> RuleIds { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class SynergyTier
|
||||
{
|
||||
public int RequiredCount { get; set; }
|
||||
public ModifierBundle Modifiers { get; set; } = new();
|
||||
public List<string> RuleIds { get; } = new();
|
||||
}
|
||||
|
||||
@ -4,94 +4,77 @@ using System.Collections.Generic;
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 任务类型枚举
|
||||
/// 任务运行时模型 (TaskModel)
|
||||
/// 设计说明:
|
||||
/// 1) TaskDefinition 描述“配置”,TaskModel 描述“运行时进度”。二者分离利于 Mod 追加内容。
|
||||
/// 2) 任务状态只保存必要字段,展示文本统一由 Definition + i18n 输出。
|
||||
/// 3) 任务参与单位只记录 Id,避免模型直接引用 Node。
|
||||
/// 注意事项:
|
||||
/// - 如果没有 DefinitionId,可使用 Name 作为临时演示数据。
|
||||
/// - Deadline 语义是“剩余回合数”,由 TurnSystem 递减。
|
||||
/// 未来扩展:
|
||||
/// - 可加入阶段状态(灵感/写作/实验/审核),与 UI 进度条分段对应。
|
||||
/// - 可加入失败原因/完成评级,用于结算与肉鸽评分。
|
||||
/// </summary>
|
||||
public enum TaskType
|
||||
{
|
||||
Paper, // 论文:重学术(Intelligence) + 表达(Expression)
|
||||
Project, // 项目:重工程(Strength) + 学术(Intelligence)
|
||||
Admin // 杂务:消耗体力,低收益,但必须做
|
||||
public sealed class TaskModel
|
||||
{
|
||||
public Guid Id { get; } = Guid.NewGuid();
|
||||
public string DefinitionId { get; set; }
|
||||
public string Name { get; set; }
|
||||
public TaskTrack Track { get; set; }
|
||||
public TaskKind Kind { get; set; }
|
||||
public TaskDifficulty Difficulty { get; set; }
|
||||
|
||||
public TaskRuntime Runtime { get; }
|
||||
public TaskRewardSnapshot Reward { get; set; } = new();
|
||||
public List<Guid> AssignedUnitIds { get; } = new();
|
||||
|
||||
public bool IsCompleted => Runtime.CurrentProgress >= Runtime.TotalWorkload;
|
||||
public bool IsFailed => Runtime.RemainingTurns <= 0 && !IsCompleted;
|
||||
|
||||
public TaskModel(string name, TaskKind kind, float workload, int deadline)
|
||||
{
|
||||
Name = name;
|
||||
Kind = kind;
|
||||
Track = TaskTrack.LabProject;
|
||||
Difficulty = TaskDifficulty.Standard;
|
||||
Runtime = new TaskRuntime(workload, deadline);
|
||||
}
|
||||
|
||||
public void AddProgress(float amount)
|
||||
{
|
||||
Runtime.CurrentProgress += amount;
|
||||
if (Runtime.CurrentProgress > Runtime.TotalWorkload)
|
||||
{
|
||||
Runtime.CurrentProgress = Runtime.TotalWorkload;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 任务 (Task)
|
||||
/// 核心游戏对象之一,相当于地图上的“怪物”。
|
||||
/// 学生需要“攻击”任务(消耗工作量)来完成它。
|
||||
/// 任务运行参数(进度与截止)
|
||||
/// </summary>
|
||||
public class Task
|
||||
public sealed class TaskRuntime
|
||||
{
|
||||
public Guid Id { get; private set; } = Guid.NewGuid();
|
||||
|
||||
/// <summary>
|
||||
/// 任务名称
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 任务类型
|
||||
/// </summary>
|
||||
public TaskType Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 总工作量 (HP)
|
||||
/// </summary>
|
||||
public float TotalWorkload { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前进度
|
||||
/// </summary>
|
||||
public float CurrentProgress { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 难度系数 (Defense)
|
||||
/// 影响学生攻克该任务的效率。若学生能力低于难度,效率会大幅下降。
|
||||
/// </summary>
|
||||
public float Difficulty { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 截止日期 (剩余回合数)
|
||||
/// 归零时如果未完成,触发失败惩罚。
|
||||
/// </summary>
|
||||
public int Deadline { get; set; }
|
||||
public float TotalWorkload { get; set; }
|
||||
public float CurrentProgress { get; set; }
|
||||
public float DifficultyScale { get; set; } = 1.0f;
|
||||
public int RemainingTurns { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 奖励:经费
|
||||
/// </summary>
|
||||
public int RewardMoney { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 奖励:声望
|
||||
/// </summary>
|
||||
public int RewardReputation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 任务是否已完成
|
||||
/// </summary>
|
||||
public bool IsCompleted => CurrentProgress >= TotalWorkload;
|
||||
|
||||
/// <summary>
|
||||
/// 任务是否已失败(超时未完成)
|
||||
/// </summary>
|
||||
public bool IsFailed => Deadline <= 0 && !IsCompleted;
|
||||
|
||||
public Task(string name, TaskType type, float workload, int deadline)
|
||||
{
|
||||
Name = name;
|
||||
Type = type;
|
||||
TotalWorkload = workload;
|
||||
Deadline = deadline;
|
||||
CurrentProgress = 0;
|
||||
Difficulty = 1.0f;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 增加进度
|
||||
/// </summary>
|
||||
/// <param name="amount">工作量数值</param>
|
||||
public void AddProgress(float amount)
|
||||
{
|
||||
CurrentProgress += amount;
|
||||
if (CurrentProgress > TotalWorkload) CurrentProgress = TotalWorkload;
|
||||
}
|
||||
public TaskRuntime(float totalWorkload, int remainingTurns)
|
||||
{
|
||||
TotalWorkload = totalWorkload;
|
||||
RemainingTurns = remainingTurns;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 运行时奖励快照(避免 Definition 被动态修改)
|
||||
/// </summary>
|
||||
public sealed class TaskRewardSnapshot
|
||||
{
|
||||
public int Money { get; set; }
|
||||
public int Reputation { get; set; }
|
||||
public List<string> PaperIds { get; } = new();
|
||||
public List<string> ItemIds { get; set; }
|
||||
}
|
||||
|
||||
101
scripts/Models/TaskDefinitions.cs
Normal file
101
scripts/Models/TaskDefinitions.cs
Normal file
@ -0,0 +1,101 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 任务定义与枚举(配置层)
|
||||
/// 设计说明:
|
||||
/// 1) Definition 描述“任务是什么”,TaskModel 描述“任务正在发生什么”。
|
||||
/// 2) 任务类别与难度与设计文档一致,方便 UI/系统层做分流。
|
||||
/// 3) Requirements/Rewards 以组合结构表示,便于 Mod 追加新条件。
|
||||
/// 注意事项:
|
||||
/// - 不在此处写具体数值表,仅提供结构骨架。
|
||||
/// - 业务系统应优先读取 Definition,而不是硬编码逻辑。
|
||||
/// 未来扩展:
|
||||
/// - 可加入“阶段式任务”与“事件触发任务”字段。
|
||||
/// - 可加入“动态难度曲线”,用于 Roguelite 调整强度。
|
||||
/// </summary>
|
||||
public enum TaskTrack
|
||||
{
|
||||
Tenure, // 生涯考核
|
||||
LabProject // 实验室项目
|
||||
}
|
||||
|
||||
public enum TaskKind
|
||||
{
|
||||
AcademicExploration, // 学术探索:产出论文
|
||||
GrantVertical, // 纵向基金:强制门票
|
||||
GrantHorizontal, // 横向项目:搞钱
|
||||
Administrative, // 行政事务:干扰项
|
||||
Milestone, // 目标型考核
|
||||
Conference // 会议大招
|
||||
}
|
||||
|
||||
public enum TaskDifficulty
|
||||
{
|
||||
Water,
|
||||
Standard,
|
||||
Hardcore,
|
||||
BlackBox
|
||||
}
|
||||
|
||||
public enum PaperRank
|
||||
{
|
||||
C,
|
||||
B,
|
||||
A,
|
||||
S,
|
||||
SPlus
|
||||
}
|
||||
|
||||
public sealed class TaskDefinition
|
||||
{
|
||||
public DefinitionHeader Header { get; set; } = new();
|
||||
public TaskTrack Track { get; set; }
|
||||
public TaskKind Kind { get; set; }
|
||||
public TaskDifficulty Difficulty { get; set; }
|
||||
public TaskRuntimeConfig Runtime { get; set; } = new();
|
||||
public TaskRequirements Requirements { get; set; } = new();
|
||||
public TaskRewards Rewards { get; set; } = new();
|
||||
|
||||
public List<string> AllowedDisciplineIds { get; } = new();
|
||||
public List<string> RecommendedRoleIds { get; } = new();
|
||||
public List<string> RecommendedArchetypeIds { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class TaskRuntimeConfig
|
||||
{
|
||||
public float Workload { get; set; }
|
||||
public int DeadlineTurns { get; set; }
|
||||
public float DifficultyScale { get; set; } = 1.0f;
|
||||
public int MaxAssignedSlots { get; set; } = 3;
|
||||
}
|
||||
|
||||
public sealed class TaskRequirements
|
||||
{
|
||||
public List<PaperRequirement> PaperTickets { get; } = new();
|
||||
public List<AttributeRequirement> AttributeChecks { get; } = new();
|
||||
public List<string> RequiredRoleIds { get; } = new();
|
||||
}
|
||||
|
||||
public sealed class PaperRequirement
|
||||
{
|
||||
public PaperRank Rank { get; set; }
|
||||
public int Count { get; set; }
|
||||
}
|
||||
|
||||
public sealed class AttributeRequirement
|
||||
{
|
||||
public AttributeType Type { get; set; }
|
||||
public int MinValue { get; set; }
|
||||
}
|
||||
|
||||
public sealed class TaskRewards
|
||||
{
|
||||
public int Money { get; set; }
|
||||
public int Reputation { get; set; }
|
||||
public List<string> PaperIds { get; } = new();
|
||||
public List<string> ItemIds { get; } = new();
|
||||
public List<string> BuffIds { get; } = new();
|
||||
}
|
||||
|
||||
110
scripts/Models/UnitComponents.cs
Normal file
110
scripts/Models/UnitComponents.cs
Normal file
@ -0,0 +1,110 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// Unit 组件集合(组合优于继承)
|
||||
/// 设计说明:
|
||||
/// 1) UnitModel 只是“组件容器”,具体能力拆分到小组件中,便于复用与替换。
|
||||
/// 2) 组件保持低内聚小职责,避免“巨型基类”造成的隐式耦合。
|
||||
/// 3) 这些组件只描述数据,不包含具体行为,行为交给系统/控制器层。
|
||||
/// 注意事项:
|
||||
/// - 不引用 Godot 类型,保持纯数据层,利于测试与序列化。
|
||||
/// - 标识/标签使用 string Id,方便 Mod 扩展新增内容。
|
||||
/// 未来扩展:
|
||||
/// - 可以给组件增加“快照/脏标记”,用于高效 UI 刷新。
|
||||
/// - 需要网络联机时,可在这里加入序列化版本号。
|
||||
/// </summary>
|
||||
public static class UnitComponents
|
||||
{
|
||||
public readonly struct GridPosition
|
||||
{
|
||||
public int X { get; }
|
||||
public int Y { get; }
|
||||
|
||||
public GridPosition(int x, int y)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
}
|
||||
|
||||
public static GridPosition Zero => new(0, 0);
|
||||
}
|
||||
|
||||
public sealed class UnitIdentity
|
||||
{
|
||||
public Guid Id { get; } = Guid.NewGuid();
|
||||
public string Name { get; set; }
|
||||
public string NameKey { get; set; }
|
||||
|
||||
public UnitIdentity(string name, string nameKey = null)
|
||||
{
|
||||
Name = name;
|
||||
NameKey = nameKey;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class UnitAttributes
|
||||
{
|
||||
public PropertyValue Academic { get; set; }
|
||||
public PropertyValue Engineering { get; set; }
|
||||
public PropertyValue Writing { get; set; }
|
||||
public PropertyValue Financial { get; set; }
|
||||
public PropertyValue Social { get; set; }
|
||||
public PropertyValue Activation { get; set; }
|
||||
|
||||
public UnitAttributes(Random random = null)
|
||||
{
|
||||
var rng = random ?? Random.Shared;
|
||||
Academic = new PropertyValue(rng.Next(0, 100));
|
||||
Engineering = new PropertyValue(rng.Next(0, 100));
|
||||
Writing = new PropertyValue(rng.Next(0, 100));
|
||||
Financial = new PropertyValue(rng.Next(0, 100));
|
||||
Social = new PropertyValue(rng.Next(0, 100));
|
||||
Activation = new PropertyValue(rng.Next(0, 100));
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class UnitStatuses
|
||||
{
|
||||
public StatusValue Stress { get; set; }
|
||||
public StatusValue Sanity { get; set; }
|
||||
public PropertyValue Mood { get; set; }
|
||||
public PropertyValue MoveSpeed { get; set; }
|
||||
|
||||
public UnitStatuses()
|
||||
{
|
||||
Stress = new StatusValue(0, 100, 0);
|
||||
Sanity = new StatusValue(100, 100, 0);
|
||||
Mood = new PropertyValue(50);
|
||||
MoveSpeed = new PropertyValue(50, 0, 200);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class UnitTags
|
||||
{
|
||||
public string DisciplineId { get; set; }
|
||||
public List<string> ArchetypeIds { get; } = new();
|
||||
public List<string> RoleIds { get; } = new();
|
||||
public List<string> TraitIds { get; } = new();
|
||||
|
||||
public bool HasTrait(string traitId) => TraitIds.Contains(traitId);
|
||||
}
|
||||
|
||||
public sealed class UnitAssignment
|
||||
{
|
||||
public Guid? CurrentTaskId { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UnitPlacement
|
||||
{
|
||||
public GridPosition Current { get; set; } = GridPosition.Zero;
|
||||
public GridPosition Target { get; set; } = GridPosition.Zero;
|
||||
}
|
||||
|
||||
public sealed class UnitEquipment
|
||||
{
|
||||
public List<string> EquippedItemIds { get; } = new();
|
||||
}
|
||||
}
|
||||
@ -1,78 +1,44 @@
|
||||
using Godot;
|
||||
using System;
|
||||
|
||||
namespace Models;
|
||||
|
||||
/// <summary>
|
||||
/// 所有角色的基类,无论是导师、学生还是博后。
|
||||
/// UnitModel(组合式数据容器)
|
||||
/// 设计说明:
|
||||
/// 1) 该类不再是“基类”,而是用于聚合组件的纯数据对象。
|
||||
/// 2) 这样 Student/Mentor/Staff 可以按需组合组件,避免继承链的耦合。
|
||||
/// 3) 任何业务逻辑应放在 System/Controller 层,Model 保持可序列化、可测试。
|
||||
/// 注意事项:
|
||||
/// - 不引用 Godot 类型,保证与视图层隔离。
|
||||
/// - 通过 Name 属性提供便捷访问,便于旧代码过渡。
|
||||
/// 未来扩展:
|
||||
/// - 可以增加“能力衰减/成长曲线”等组件,而不影响现有对象结构。
|
||||
/// - 可引入“只读快照”用于回放/结算等需求。
|
||||
/// </summary>
|
||||
public class UnitModel
|
||||
public sealed class UnitModel
|
||||
{
|
||||
public Guid Id { get; private set; } = Guid.NewGuid();
|
||||
public string Name { get; set; }
|
||||
|
||||
// 基础属性
|
||||
|
||||
/// <summary>
|
||||
/// 学术能力,影响科研进度
|
||||
/// </summary>
|
||||
public PropertyValue Academic {get; set;}
|
||||
/// <summary>
|
||||
/// 工程能力,影响实验进度
|
||||
/// </summary>
|
||||
public PropertyValue Engineering {get; set;}
|
||||
/// <summary>
|
||||
/// 写作能力,影响论文发表
|
||||
/// </summary>
|
||||
public PropertyValue Writing {get; set;}
|
||||
/// <summary>
|
||||
/// 财务能力,影响资金相关任务
|
||||
/// </summary>
|
||||
public PropertyValue Financial {get; set;}
|
||||
/// <summary>
|
||||
/// 社交能力
|
||||
/// </summary>
|
||||
public PropertyValue Social {get; set;}
|
||||
/// <summary>
|
||||
/// 行动力,影响各种行为的效率和能动性
|
||||
/// </summary>
|
||||
public PropertyValue Activation {get; set;}
|
||||
|
||||
// 状态属性
|
||||
public UnitComponents.UnitIdentity Identity { get; }
|
||||
public UnitComponents.UnitAttributes Attributes { get; }
|
||||
public UnitComponents.UnitStatuses Statuses { get; }
|
||||
public UnitComponents.UnitTags Tags { get; }
|
||||
public UnitComponents.UnitAssignment Assignment { get; }
|
||||
public UnitComponents.UnitPlacement Placement { get; }
|
||||
public UnitComponents.UnitEquipment Equipment { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 压力值
|
||||
/// </summary>
|
||||
public StatusValue Stress {get; set;}
|
||||
/// <summary>
|
||||
/// 精神值 (Sanity) / 抗压能力
|
||||
/// 范围 0-100。过低会导致崩溃(Breakdown)。
|
||||
/// </summary>
|
||||
public StatusValue Sanity { get; set; }
|
||||
/// <summary>
|
||||
/// 情绪值,影响工作效率
|
||||
/// </summary>
|
||||
public PropertyValue Mood {get; set;}
|
||||
/// <summary>
|
||||
/// 移动速度
|
||||
/// </summary>
|
||||
public float MoveSpeed {get; set;}
|
||||
|
||||
// 局内属性
|
||||
|
||||
public Vector2I TargetPosition {get; set;}
|
||||
public Vector2I CurrentPosition {get; set;}
|
||||
public Guid TargetTaskId {get; set;}
|
||||
public string Name
|
||||
{
|
||||
get => Identity.Name;
|
||||
set => Identity.Name = value;
|
||||
}
|
||||
|
||||
protected UnitModel(string name)
|
||||
{
|
||||
Name = name;
|
||||
var random = new Random();
|
||||
Academic = random.Next(PropertyValue.Min, PropertyValue.Max);
|
||||
Engineering = random.Next(PropertyValue.Min, PropertyValue.Max);
|
||||
Writing = random.Next(PropertyValue.Min, PropertyValue.Max);
|
||||
Financial = random.Next(PropertyValue.Min, PropertyValue.Max);
|
||||
Social = random.Next(PropertyValue.Min, PropertyValue.Max);
|
||||
Activation = random.Next(PropertyValue.Min, PropertyValue.Max);
|
||||
}
|
||||
}
|
||||
public UnitModel(string name, Random random = null)
|
||||
{
|
||||
Identity = new UnitComponents.UnitIdentity(name);
|
||||
Attributes = new UnitComponents.UnitAttributes(random);
|
||||
Statuses = new UnitComponents.UnitStatuses();
|
||||
Tags = new UnitComponents.UnitTags();
|
||||
Assignment = new UnitComponents.UnitAssignment();
|
||||
Placement = new UnitComponents.UnitPlacement();
|
||||
Equipment = new UnitComponents.UnitEquipment();
|
||||
}
|
||||
}
|
||||
|
||||
12
最强导师.csproj
12
最强导师.csproj
@ -6,8 +6,16 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="docs\design.md" />
|
||||
<Content Include="docs\detail_design.md" />
|
||||
<Content Include="docs\mvp_design.md" />
|
||||
<Content Include="docs\装备与设施系统.md" />
|
||||
<Content Include="docs\学科与流派系统.md" />
|
||||
<Content Include="docs\任务与经济系统.md" />
|
||||
<Content Include="docs\角色与羁绊系统.md" />
|
||||
<Content Include="README.md" />
|
||||
<Content Include="resources\definitions\archetypes.json" />
|
||||
<Content Include="resources\definitions\disciplines.json" />
|
||||
<Content Include="resources\definitions\discipline_biology.tres" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="addons\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
Loading…
Reference in New Issue
Block a user