共同骨架
所有系统共享的心智模型读任一系统前,先记住这四条贯穿全工程的规则——它们是 AGENTS.md 的红线,也是每个系统的设计前提。
① 服务器权威
客户端只发请求 + 播表现,真值永远在服务器。权威态绝不只活在 UI / 客户端 / 蓝图事件图。战斗、库存、合成、掉落、伤害、存档、世界进度都是 server-authoritative。
② 数据驱动
Data/Source/*.csv → GenerateGameData.py → Data/Generated/* → UCSItemDataSubsystem 运行时查表。数值(武器/配方/敌人/Buff/任务)不写死在代码,改表重生成即可。
③ 事件驱动
用 RepNotify + 委托 + 服务器 Timer 推动更新,避免 Tick 逐帧轮询。客户端经 OnRep_* / On*Changed 委托得知结果。
④ 数据归属三分
个人态在 ACSPlayerState(库存) / 角色组件(生存·属性·状态);世界共享态在 ACSGameState.WorldProgress;请求经 owning ACSPlayerController 或角色组件的 Server RPC。
CoopSurvival,C++ 类用 CS 前缀。完整的类对类地图与活跃重构清单见 UE_CodeArchitecture.md(代码现状快照);本页是它的「按系统切片 + 终端风呈现」。战斗 Combat
近战挥砍 + 枪械开火的服务端权威结算设计目标
反枪械哲学:武器是常规遭遇的主要解决手段(~70–85%),但不能替代设施 / 核心异常 / 污染 / 身份 / 样本 / 门禁 / 路线 / 世界推进。「枪械可以强,但必须有后果、有场景、有代价。」反对的是"仅靠枪械就能通关",不是反对武器本身。
玩家体验
近战优先、有重量(低噪音 / 低维护长期有价值);开枪有后果(噪音引敌 / 扰动污染 / 弹药稀缺 / 门禁不认火力);站位·体力·负载是真变量。分层解法:普通=武器可解 → 精英=武器+弱点/环境 → SCP规则Boss=收容流程/AIM协议/样本归档。
数值 / 平衡意图
弹药 / 耐久 / 维护 / 噪音 = 平衡杠杆;用弱点·破甲·阶段而非"堆高血量";武器类别定位(近战工具 / 安保枪械 / GOC遗留=可能破坏真结局变量)。难度只缩放战斗体验,不缩放真相理解或通关。
世界观 / 成长挂钩
双成长线:①工程升级线(普通材料→升级台→数值,可预期)②AIM 协议线(SCP样本→S0归档→AIC解析→协议,稀缺有代价)。护甲 / 负载 = 身份与定位;底线:不许同时最高火力+最厚甲+最大包+最强协议。
职责
核心 UCSCombatComponent(挂角色):攻击/换弹校验、冷却体力、近战刀刃轨迹采样、枪械 hitscan、弹匣/换弹状态机、按弱点+护甲缩放扣血、触发受击表现与 AI 枪声。本身不拥有血量/弹药/属性/Buff——只读数据 + 判命中 + 调各组件权威入口。
数据归属 & 权威
全服务端。冷却/连击/伤害窗口 = CombatComponent 私有(不复制);血量 = UCSSurvivalStatsComponent;弹药/弹匣 = UCSInventoryComponent(PlayerState, COND_OwnerOnly);属性 = UCSAttributeComponent;Buff = UCSStatusEffectComponent。
请求 → 服务器流
角色输入 → CombatComponent.TryPrimaryAttack/TryReload → Server RPC ServerPrimaryAttack/ServerReload。注意:Server RPC 直接定义在角色拥有的组件上、不经 Controller 转发——战斗是项目「请求走 Controller」规则的有意例外。
复制方式
bReloading(Replicated);Stats/Snapshot/ActiveEffects(RepNotify+委托);攻击/开火/换弹表现 = Multicast Unreliable。客户端经 OnRep_Stats 得知掉血,事件驱动非轮询。
核心机制
- 近战逐帧扫掠:伤害只在
UCSAnimNotifyState_MeleeWindow窗口内结算——服务端读当前BP_Weapon_*的HitStart/HitEnd/HitRadius,逐帧 Sweep 上一帧↔当前帧刀刃线段(非按键瞬时单发),DamagedActorsThisMeleeWindow去重保证一刀每目标只扣一次。 - 枪械服务端 hitscan:校验冷却/弹药/换弹/存活后 trace;完整弹匣/换弹机(首次上膛、续弹种、按枪型升级
WeaponUpgrades改容量/换弹速度);每发被接受调ReportGunshotNoise()喂 AI 听觉。 - 减伤 + 弱点:三处造伤汇点先过统一静态入口
UCSAttributeComponent::MitigateDamage(Ballistic→防弹/其余→物理;目标无属性组件=不减伤),弱点倍率经ICSHitReactable::GetIncomingDamageMultiplier(爆头,数据驱动)。每枪几何/数值在BP_Weapon_*与 CSV,C++ 不写死枪名。
关键类
| 类 | 文件 / 职责 |
|---|---|
UCSCombatComponent | Components/CSCombatComponent.h/.cpp · 近战窗口扫掠 + 枪械 hitscan + 换弹机 |
UCSAnimNotifyState_MeleeWindow | Animation/CSAnimNotifyState_MeleeWindow.h · 近战伤害窗口 |
ACSWeaponActor / Melee / Firearm | Weapons/CSWeaponActor.h 等 · 命中段 HitStart/HitEnd / 枪口 socket(BP 调参) |
UCSAttributeComponent | Components/CSAttributeComponent.h · 属性快照 + 静态 MitigateDamage |
UCSStatusEffectComponent | Components/CSStatusEffectComponent.h · Buff 生效层(Timer 周期) |
数据驱动表
MeleeWeaponDefinitions · FirearmDefinitions · AmmoDefinitions · WeaponUpgradeTiers · EquipmentDefinitions · BuffDefinitions(+副表 BuffAttributeModifiers/BuffPeriodicEffects) · AppearanceDefinitions(护甲数值寄居) · EnemyDefinitions。
落地状态
✅ Combat-A U35 ✅ Firearm-A U36 ✅ Buff-A U47 ✅ Enemy-D 命中流血 U51 ✅ 枪械手感 已PIE
🔶 Buff-B U48 待验 🔶 Attribute-A U69 待验 🔶 Armor-A U74 待验 ⬜ Combat-B 起 计划
FCSDamageContext 统一伤害上下文尚未引入(仍 ApplyDamage(float));玩家武器命中自动附 Buff(Combat-B)缺失(GrantedBuffIdsOnHit 已读进 Spec 但未对目标 ApplyBuff,目前只有「敌人打玩家」那条附流血);ApplyBuffModifiers 接进属性快照仍是空钩子;污染周期 Buff(Buff_ContaminationLeak)因 Buff-B 周期类型未实现暂未挂;枪械尚未迁到 ItemInstanceId 单把实例,耐久/卡壳/附件待 Firearm-B/D/G。制作 Crafting
靠台按配方:校验→扣料→计时→产出设计目标
制作服务于搜刮生存循环,不是建造或刷资源致富;材料全部来自搜刮(search→craft 单向供给);S0 是把"层级成果"转成"长期进度"的唯一枢纽。MVP 明确不做自由基地建造——只摆场景站点 + 后续有限 Deployable(消耗品/工具,非建筑)。
玩家体验
核心节奏 = scavenge → 带回 → S0 台制作/升级;资源张力来自背包取舍而非金钱(带医疗包还是带残留?带弹药还是带样本容器?)。S0 整备有仪式感:返回扫描查污染/未封装样本,"安全但不安宁"。
数值 / 平衡意图
配方门控走"世界存档优先":能不能做=世界进度,做不做得起=材料;材料稀缺分层;升级"不只 +10%"应给新交互(抗孢子滤芯→进 L2 根系);craft-time 当节奏阀。制作变强→更重→机动降(自平衡)。
世界观 / 进度挂钩
制作台 = 虚构设施(修复/安装基金会模块,不是摆建筑);做出/升级某件装备 = 进下一层的资格。制作只属"工程线",不能做出 SCP 能力(那是平行的 AIM 归档线,§19 禁止"杀 SCP 掉技能")。
职责
玩家在工作台附近按配方制作:服务端校验配方/工作台/材料 → 扣料 → 计时 → 产出入背包。进行态(进度/剩余时间)复制给发起者本人。
数据归属 & 权威
进行态 = UCSCraftingComponent,挂在 ACSPlayerController(仅复制给 owner)。全流程服务端 StartCraftOnServer/CompleteCraftOnServer(先判 HasOwnerAuthority)。材料背包 = PlayerState 的 UCSInventoryComponent。
请求 → 服务器流
E 开台 → Workbench.Interact(服务端) → ClientOpenCraftingStation 本机开合成面板;发起制作 → CraftItem → 有权威直接 StartCraftOnServer / 否则 ServerCraftItem 薄转发。
复制方式
CraftingState(RepNotify, owner-only)→OnRep 刷 Slate;剩余时间本机算(ServerFinishSeconds - now,倒计时不复制);产出经背包 RepNotify(COND_OwnerOnly);工作台 bStationEnabled(RepNotify 全端) + DORM_Initial 休眠。
核心机制:服务端校验链
工作台是 ICSInteractable 世界 Actor(关卡摆放、静态、带 PersistentId),聚焦走全工程统一 Custom Depth 后处理描边 M_InteractOutline_PP。
关键类
| 类 | 文件 / 职责 |
|---|---|
UCSCraftingComponent | Components/CSCraftingComponent.h/.cpp · 服务端权威合成核心 |
ACSWorkbenchStation | World/CSWorkbenchStation.h/.cpp · ICSInteractable 工作台 |
ACSPlayerController | Core/CSPlayerController.* · 请求入口 + Server RPC 薄转发,持有组件 |
UCSInventoryComponent | Components/CSInventoryComponent.* · 材料扣减/产出入库(PlayerState) |
UCSItemDataSubsystem | Items/CSItemDataSubsystem.* · 配方/物品查询 + GetRecipesForStation |
数据驱动表
Recipes.csv(当前 Axe / Knife,含 StationId/OutputItemId/CraftTimeSeconds)+ RecipeRequirements.csv(Axe→Wood×3 / Knife→Wood×2)+ Items.csv。GenerateGameData.py 校验 RecipeId 唯一、产出/材料 ItemId 外键存在。
落地状态
✅ 第一个配方 U31 已PIE ✅ 站点交互 U32 已PIE 🔶 Crafting-A 组件抽取 U41 待验 🔶 合成 UI U10 待验
"Workbench",「升级台」等扩展未在配方校验打通;合成 UI 验证未闭环;世界存档读写仍留在 ACSPlayerController(计划迁 UWorldSubsystem)。合成进行态按设计不入存档(既定取舍)。怪物AI Enemy
服务器权威 PvE 近战追击敌人 · 污染变异体设计目标
污染变异体 = 基准威胁(教学单位,非数值门槛):教三件事——武器可解 / 受击带污染 / 用普通材料衔接养成。敌人是潜行·声音·站位的谜题,不是射击场;污染是身体代价、不是第二条血;无血条(靠姿态/前摇/硬直读状态,写实压迫)。
玩家体验 / 恐怖
感官潜行 = 噪音拉杆(蹲≈无声 / 走小 / 跑中 / 枪声大);视觉正面有向可绕背 + 360° 近身必察觉圈;警觉条(看到/听到涨,断线安静衰减→可摆脱追踪)。Stalker 恐惧 = 换感知档案换应对方式(盲听者 vs 守望者)。
数值 / 平衡意图
原型角色:Basic 均衡 / Brute 压力变体 / Stalker 由感知档案实现;感知全数据驱动(视野锥+听觉+警觉条+近身圈+蹲伏降视距)。首版不加复杂抗性,"让战斗手感先成立"。
世界观挂钩
收容失效副产物、不是完整 SCP;真菌感染源自 L2 菌丝母体苏醒、蔓延上 L1/L0;对活体身份/声/光有反应(契合身份事故主题);污染 Buff 接 AIM 虚构。
遭遇 / 难度设计(多为 DESIGN-only 未实现)
遭遇导演(按预算生成敌人)+ 动态难度(按有效玩家数缩放,非房间最大人数)+ Boss 阶段(不只血条,阶段压力/收容窗口)。掉落只普通材料(变异组织/污染残留),绝不掉关键样本/路线/AIM/结局变量。AI 只发 ObjectiveEvent、不直接改玩家属性(走 BuffSystem 单点写)。
职责
三类分工:ACSEnemyCharacter(本体血/受击/攻击/死亡/尸体搜刮) + ACSEnemyAIController(感知/追击决策核心) + UCSEnemyAnimInstance(纯算值)。数值真值在 EnemyDefinitions.csv,BP_AI_* 只负责 Mesh/动画/内容。
数据归属 & 权威
全服务端 HasAuthority。血量复用玩家同款 UCSSurvivalStatsComponent;AI 状态在 AIController 非复制成员,只复制 bIsAggressive 给动画。
状态机(5 态)
Idle 游荡 → Investigating 调查噪音 → Chasing 全速追 → Pursuing 丢视线后持续追击的时间窗口 → Returning 脱战返回。仍是薄 C++ AIController + Timer,待状态变多再迁 StateTree。
感知 = 噪音杠杆
视觉(有向锥 + LoS,只认玩家 Pawn)+ 听觉(全向,听到 ⇔ 距离 ≤ HearingRange × 噪音响度)。噪音源 = 玩家 UCSNoiseEmitterComponent(蹲 0.2 / 走 0.5 / 跑 1.0 / 枪声 2.5);受伤即被发现 ForceAggro。
战斗接线
- 攻击侧:命中帧
PerformAttackHit→ 过玩家护甲MitigateDamage→ApplyDamage+ 对玩家StatusEffectComponent.ApplyBuff(Buff_Bleed_Light);命中时机由UCSAnimNotify_EnemyMeleeHit卡帧,bHitAppliedThisAttack一击一次。 - 防守侧:实现
ICSHitReactable——服务端算方向×部位×轻重选受击动作 + 短硬直;爆头/弱点倍率GetIncomingDamageMultiplier(数据驱动,Basic 2.0/Brute 1.5/Stalker 2.5)。 - 死亡:
HandleDeath生成战利品 + 死亡动画;若带EncounterGroupId→ 通知任务求值器NotifyKill。受击表现UCSEnemyFeedbackComponent(喷血 + 闪白,默认关);不做血条(真实感,用户拍板)。
关键类 & 数据表
| 类 / 表 | 文件 / 内容 |
|---|---|
ACSEnemyCharacter | AI/CSEnemyCharacter.* · 实现 ICSHitReactable+ICSInteractable+ICSLootSource |
ACSEnemyAIController | AI/CSEnemyAIController.* · 感知 + 追击决策核心,仅服务器 |
UCSEnemyAnimInstance | AI/CSEnemyAnimInstance.* · 纯算值(速度/移动/情绪/Stride) |
EnemyDefinitions.csv | 3 行:Basic(HP80) / Brute(HP180) / Stalker(HP110);ECSEnemyAIArchetype Wanderer/Brute/Sentry/Stalker |
LootTableEntries.csv | LT_MutantCorpse 等(当前用 9mm/碎石占位) |
落地状态
✅ Enemy A/B/C/D/E/G U43–54 ✅ Anim-A / Atk-Notify ✅ Data-A U55 ✅ Enemy-F 搜刮 U56
🔶 Enemy-H 听觉 U58 待验 🔶 Locomotion-B U59 待验 🔶 Patrol-A U61 待验 🔶 AI-Chase-Config 待PIE
任务 Quest
Site 事故处理记录 · 关键进度属世界档案设计目标
任务 ≠ 接/交任务列表,是 Site 事故处理记录;关键进度属世界档案非个人玩家(后加入者直接看到当前进度)。主/支/隐藏是一个结构 + 类型 + 可见性,不是三套系统;目标永不游戏化成进度条(用"档案/删除字段"语言)。
玩家体验
目标不靠任务 NPC 列表浮现,靠 AIC 语音 + 世界状态 + 门禁拒绝原因;隐藏目标靠推理 + reveal 标签命中浮现。门禁 = 物品实体 + 区域状态 + 归档记录(关键物来自机制、不是随手拾取);体感 = 处置一桩收容事故。
任务结构
Main 主事故线(最低必要路线)/ Side 旁支调查(深度路线,换完整档案·强装备·真结局)/ Hidden 未登记异常(reveal 标签)。骨干揭示点每层一次性,承载 SD-37 器官真相(L1 免疫→L7 胃/子宫),线性走完自然集齐、不设硬收集门。
世界观 / 结局挂钩
结局 = 门槛 + 决断:累积归档完整度决定 L7 开放哪些选项。任务是承载真相揭示的脊柱(L4 决定你是否知道真正参与的是什么);D-7710/残留绑定真结局。L7 不做额外收集门(条件核对+抉择,非 Boss 战)。
关卡推进设计
线性 S0→L7,不靠回刷同层解锁下一层;重复探索边界:稳定层只产出普通材料,不重发骨干揭示点/关键物/路线/AIM/结局变量。难度只影响战斗体验,不门禁真相理解或通关。
职责
任务不是接/交任务列表,是 Site 事故处理记录。关键进度属世界存档 / Site 档案,不属于个人玩家;单人能完成主线,多人只加速/分担;UI 只读不写、永不完成任务。
数据归属 & 权威
集中在 ACSGameState.WorldProgress(FCSWorldProgressSaveData:ObjectiveStates/WorldStateTags/UnlockedRouteIds/…)。只服务端经 ApplyObjectiveEvent/CompleteObjective/AddWorldStateTag/UnlockRoute 写(按 EventId 幂等);OnWorldProgressChanged 广播驱动 UI/门禁/叙事/求值器。
任务模型(Quest-A)
ECSQuestType{Main/Side/Hidden} + FCSQuestDefinition + FCSObjectiveDefinition。隐藏可见性 = 计算值(RevealWorldStateTags 命中),零存档迁移;ObjectiveId 复用 WorldProgress.ObjectiveStates join 键。
复制方式
WorldProgress 全端复制;任务视图各端本地算(BuildResolvedQuestView 读复制态 × 静态定义,产出只读视图,无新增复制)。求值器子系统服务端独有、无复制。
条件求值器(Quest-C / Unit 28)
UCSObjectiveDirectorSubsystem(UWorldSubsystem,仅权威无复制)绑 OnWorldProgressChanged,按 Order 武装目标。8 种 ECSObjectiveConditionType:
Manual · Interact · CollectItem · KillCount · ReachVolume · RepairCount · HoldTimer · WorldStateTag。被动条件重算、主动 Notify* 累计达阈值 → ApplyObjectiveEvent 自动完成 + 折叠奖励(路线/配方/样本/标签)。
事件接线(全服务端 · 零新增 RPC)
Obj.<Key> actor tag → NotifyInteract关键类 & 数据表
| 类 / 表 | 文件 / 内容 |
|---|---|
FCSWorldProgressSaveData | World/CSWorldSaveGame.h · 世界共享进度(权威 + 存档) |
ACSGameState | Core/CSGameState.* · WorldProgress + 写入入口 + OnWorldProgressChanged + BuildResolvedQuestView |
UCSObjectiveDirectorSubsystem | World/CSObjectiveDirectorSubsystem.* · 条件求值器(仅权威) |
ACSObjectiveTriggerVolume | World/CSObjectiveTriggerVolume.* · 到点触发 + 检查点记录 |
Quests.csv / Objectives.csv | 3 任务种子(主/支/隐藏)/ 5 步;条件列并入 Objectives.csv(无独立 Conditions.csv) |
落地状态
🔶 Quest-A U81 已实现待验(编辑器目标过 / 有 PrintQuests exec / 无 UI) 🔶 Quest-C 求值器 U28 已实现待 PIE
⬜ Quest-B 事故面板 + HUD 追踪 ⬜ Quest-D Site 状态图
UI/Editor/CSWidgetAuthoringLibrary.h(Unit 78 WIP)让 runtime 目标整编失败,需迁编辑器专用模块(与 Quest-A 无关但卡 runtime);UI 全缺(只有 PrintQuests / GM Dump,Quest-B/D 待做);收容关卡导演的 RepairCount/HoldTimer 入口已就绪但无调用方(待 ACSFilterNode+ACSContainmentEncounter);隐藏任务「命中条件→自动写 reveal 标签」触发器未做。道具/物品 Items
物品数据模型 + 个人背包 + 装备 + 搜刮设计目标
服务于反撤离经济的 SCP Site 持续生存,不是"刷装备射击游戏"——搜索 = "找到继续活下去 + 完成收容程序的条件"。明确不做:按局结算卖钱 / 反复刷取稀有枪 / 死亡纯装备经济。样本·残留喂档案经济 + 污染压力。
玩家体验
背包取舍 / 负重张力;网格背包(塔科夫式占格·旋转·堆叠·样本/隔离特殊槽);搜完才揭示(未搜完内容隐藏);装备 loadout 一屏纸娃娃(左纸娃娃 + 中背包网格 + 右搜刮容器,拖物到槽=装备)。
数值 / 平衡意图
堆叠上限按物分(材料 99 / 霰弹壳 32 / 武器 1);网格 + 重量双约束;关键物不随机复制(关键样本 / 路线权限 / AIM / 归档记录禁走随机表);多人不按人数复制关键样本。
世界观挂钩
样本 / 残留 → 档案经济(归档台扣残留→写世界状态,归档即中和污染 = cost=cure);关键物 = Site 事故遗物(权限卡 / 唯一门禁件 / AIM 解锁数据);携带未登记样本让扫描门警惕。
物品分类(严格 taxonomy — 即"装备 / 堆叠 / 属性 / 任务道具"规则矩阵)
| 类型 | 可堆叠 | 可装备 / 使用 | 带属性 / 词条 | 任务 / 关键(唯一·不可丢卖) | 落地 |
|---|---|---|---|---|---|
| 材料 Material | 是(99) | — | — | 否 | ✅ |
| 弹药 Ammo | 是(99/32) | 装填 | 弹种(伤害/穿甲/散布/后坐) | 否 | ✅ |
| 武器 Weapon | 否 | 可装备 | 是(武器数值 + 弹匣 + 升级) | 否 | ✅ |
| 护甲 Armor | 否 | 可装备 | 是(物理/弹道减伤·负重·移速) | 否 | ✅ |
| 工具 Tool | 否 | 可装备 | — | 否 | ✅ |
| 穿戴 Apparel | 否 | 换装(非武器栏) | 部分带护甲数值 | 否 | ✅ |
| 消耗品 Consumable | 是/否 | 使用 → Buff | 效果走 Buff | 否 | ⬜纸面 |
| 投掷物 Throwable | 是 | 投掷 | — | 否 | ⬜纸面 |
| SCP 样本 Sample | 否 | 需样本槽 | 污染 / 归档价值 | 关键样本唯一·不可卖 | 🔶 类型+示例 |
| 残留碎片 Residue | 视设计 | 归档 | 无数值(叙事/结局) | 拼死者档案 | ⬜纸面 |
| 关键物 KeyItem | 否 | — | 门禁 / 权限 | 唯一·禁丢(禁卖待售卖功能) | ✅ 规则生效 |
| 归档数据 / 货币 | 否 / 是 | — | — | 写世界状态 / S0 换点数 | ⬜纸面 |
ItemType 已从 FName 字符串升级为正式 UENUM ECSItemType(上表 10 类全部入枚举,GenerateGameData.py 校验 VALID_ITEM_TYPES,非法值生成期报错)。新增三字段:bCriticalItem(关键物:服务端禁丢 + 不进随机掉落,已生效)、ContaminationPerSecond(携带涨污染,数据已就位,结算待污染单元)、bArchivable(可归档,数据已就位,逻辑待归档台单元)。已补示例物品 Item_Fuse(关键物)、Sample_C12_Stable(样本)。仍待后续单元:样本槽/隔离槽、污染累积结算(接生存属性,SD_47 决策①)、S0 归档台、消耗品使用、投掷物、物品实例 FGuid。职责
UCSInventoryComponent:服务端权威的个人背包 + 装备 + 弹匣 + 升级 + 穿戴外观,挂 ACSPlayerState(跨 Pawn 重生持久),是 UI/握持/快捷栏/存档的真值来源。
数据归属 & 权威
挂 PlayerState;复制状态全 RepNotify(InventoryStacks/EquippedItemId/EquipmentHotbar/WeaponMagazines/WeaponUpgrades/WornAppearanceItemIds),按 OwnerOnly 设计(背包是个人隐私态)。
请求 → 服务器流
客户端不直接改背包,经 owning ACSPlayerController 的 Server RPC(RequestEquipItem→ServerEquipItem→Inventory.EquipItem);搜刮取物经 ICSLootSource 由容器/尸体服务端处理。
复制方式
事件驱动:服务端改 → ForceNetUpdate + 广播 OnEquippedItemChanged/OnInventoryStacksChanged(属性组件订阅重算负重;角色订阅刷握持),客户端经 OnRep_* 重建。
核心机制 & 关键类
- 栈模型:
FCSInventoryStack { ItemId; Quantity; GridX; GridY; bRotated }——网格是叠在逻辑栈上的摆放层,HasItemQuantity仍按 ItemId 跨栈求和。无 per-instance GUID(耐久/词条无处落)。 - 网格摆放(Grid-A~C2b):服务端
PlaceStackAutomatically/MoveStackTo/RotateStackInPlace,放不下=拒绝、物品留容器。 - 装备:4 槽无类型
EquipmentHotbar,IsItemEquipable=bCanEquip且在 EquipmentDefinitions——任意可装备物可进任意槽,无类型路由(5 槽主/副/刀/投/道具未做)。弹匣FCSWeaponMagazineState+ 口径系统。 - 搜完才揭示(Search-A):容器/尸体实现
ICSLootSource,BeginLootSearch→Timer→CompleteLootSearch揭示;未搜完服务端根本不下发战利品。 - 关键类:
Items/CSItemDataTypes.h(全数据结构)·Components/CSInventoryComponent.*·Core/CSPlayerState.h(FCSInventoryStack)·World/CSLootContainer.*+AI/CSEnemyCharacter.*(尸体)。
数据驱动表 & 落地状态
Items.csv(实跑 ItemType 6 类,字段 MaxStack/bCanDrop/bCanEquip/GridW/H/Weight/Icon)· EquipmentDefinitions(槽类型只存数据未强制路由)· Containers.csv(BasicLocker 6×6/3s)· LootTableEntries(全普通物资,无关键物)· AppearanceDefinitions(护甲数值)。
✅ Search-A/B/C #22/26/27 ✅ Inventory-A #40 ✅ Enemy-F 尸体搜刮 #56 ✅ Grid-B 拖拽/旋转 #71 ✅ Grid-C2a #76
🔶 Item-Strict 物品类型严格化 #85 🔶 Grid-A #70 🔶 Grid-C1 #73 🔶 Grid-C2b #77 🔶 Search-A 搜完揭示 #79 ⬜ Loadout-A 类型化5槽 / Consumable-A / Throwable-A / 纸娃娃UI / Search-D~I
bCriticalItem 强制不可丢卖。角色属性 Attributes
生存状态 + 派生属性快照 + 负重 / 护甲设计目标
按层级危险准备(护甲/抗性服务于"进哪层抗哪种异常",而非盲目堆叠数值);装备配置须有取舍,禁止全项拉满(不许同时最高火力+最厚甲+最大包+最强协议);双成长线(工程升级 / AIM 协议)汇入属性层。
玩家体验
负重张力:重 → 慢 → 体力恢复降 → 搜索/修复易被打断;明面属性玩家整备时直接权衡,隐藏属性藏在档案/风险声明语言里(不像魔法天赋页);护甲 = 按异常向抗性准备。
数值 / 平衡意图
计算顺序 基础 → 装备 → Buff → 倍率 → Clamp;负载是连续拖累不是开关;护甲抗性分向(物理/弹道/污染/孢子/热/现实/AIM 稳定),各带 Weight/移速/体力代价。
世界观挂钩
污染 = 身份滑移(SD-22 §14:视觉模糊/移速下降/门禁误判率,是持久身体量表);AIMStability 接 AIM 协议;属性 = 身份/收容准备,而非 RPG 式的数值堆叠(§19 禁止彩色品质词条的爆率掉落、禁止所有人同一最优 Build)。
属性清单(明面 vs 隐藏 — SD-42 §10/BuffSystem §2 设计愿景)
| 明面(玩家可见,整备时权衡) | 隐藏(藏在档案/战斗乘区,随异常/污染浮动) |
|---|---|
| 生命 Health ✅ | AIMStability(AIM 协议承载/身份风险)⬜ |
| 体力 Stamina ✅ | 污染 Contamination(提高 AIM 风险)⬜ |
| 负重 Load / MaxLoad ✅ | 孢子 / 精神抗性 SporeResistance ⬜ |
| 物理防护 ProtectionPhysical ✅ | 现实稳定 RealityStability(抗空间错位/伪声)⬜ |
| 防弹 ProtectionBallistic ✅ | Focus(搜索/弱点识别/异常痕迹)⬜ |
| 移速倍率 MoveSpeedScalar ✅ | 门禁误判率 / 删除队列触发 ⬜ |
| 稳定 Stability(后坐/硬直)✅ | 耐热 HeatResistance ⬜ |
职责
两组件挂角色:UCSAttributeComponent(派生属性快照:负重/护甲减伤/移速恢复倍率/稳定,事件驱动重算不 Tick)+ UCSSurvivalStatsComponent(生命/体力/饥饿/口渴,有界衰减 Tick + 死亡/复活)。
数据归属 & 权威
都挂角色、服务端权威 HasAuthority;属性快照输入来自 PlayerState 库存(ResolveInventory);客户端只读复制快照,不本地重算权威值。
复制方式
Snapshot(RepNotify + OnAttributeSnapshotChanged,服务端重算后手动广播);Stats(RepNotify + OnHealthChanged)。
核心机制
快照:基础→ApplyEquipmentModifiers(Armor-A 已实现)→ApplyBuffModifiers(空钩子)→负重派生→负重连乘移速→Clamp。MitigateDamage 静态(Ballistic→防弹 / 其余→物理;无属性组件=不减伤)。负重→移速(UpdateMovementSpeed 末端乘 MoveSpeedScalar,超重禁冲刺)。
关键类 + 实际字段(忠实落点)
| 结构 / 类 | 实际字段 |
|---|---|
FCSAttributeSnapshotComponents/CSAttributeComponent.h | Load · MaxLoad(=25) · ProtectionPhysical · ProtectionBallistic · Stability · MoveSpeedScalar · StaminaRegenScalar |
FSurvivalStatsComponents/CSSurvivalStatsComponent.h | 仅 6 字段:Health/MaxHealth · Hunger · Thirst · Stamina/MaxStamina。没有 Contamination 字段。 |
FCSAppearanceDefinition 护甲列Items/CSItemDataTypes.h | Armor-A 新增 6 列:ArmorPhysical · ArmorBallistic · StabilityBonus · MaxLoadBonus · MoveSpeedPenalty · StaminaRegenPenalty(护甲数值复用换装表,未另起 ArmorDefinitions) |
🔶 Attribute-A 属性快照+负重 #69 待验 🔶 Armor-A 护甲→属性→减伤 #74 待验
ApplyBuffModifiers 空钩子(Buff 的 AttributeModifiers 还没改快照);污染(Contamination)周期未接、归属未拍板(UCSContaminationComponent vs FSurvivalStats.Contamination 两方案并存,代码都没有);隐藏认知属性(AIMStability/Focus/孢子/现实/门禁误判率)无快照字段;护甲只有物理/弹道两类减伤,§10.2 的污染/孢子/热/现实/AIM 抗性列未建;MaxHealth/Stamina 仍在生存组件待迁;快照是否改 OwnerOnly 未决。经济 Economy
请购点 · 回收/购买 · 物品分类 · 下潜损耗设计目标
个人闭环、非刷钱:卖战利品→换请购点→买补给/解锁后的强装备→下潜可能死亡掉装备→保险/重新置装。参考塔科夫/暗区/三角洲,SCP 化。三决策已拍板:每人独立钱包 · 解锁后才上架 · 死亡掉落+保险。
玩家体验
价值密度抉择:收藏品又大又重又值钱,带满收藏品还是带满弹药自己赌;S0=安全区(个人仓库寄存)、下层=风险区;强力/SCP 物品先解锁再花钱买,不花钱跳关。
物品三轴分类
功能类型(已有)+ 经济分类ECSItemEconomyCategory(收藏/核心/道具料/升级料/装备/受限)+ 价值评级ECSItemRarity(T1普通→T5异常级,定价档+颜色)。加到 Items.csv→FCSItemDefinition。
红线(不可违反)
关键样本/关键物/残留禁卖禁掉禁复制;世界解锁归世界不卖;不做花钱跳关/无限刷钱;无 NPC 商人街/自由建造;永久权限门禁只解锁不卖、只卖一次性消耗门卡。
⬜ 105 货币地基 ⬜ 106 回收+分类 ⬜ 107 请购购买 ⬜ 108 安全仓库 ⬜ 109 死亡掉落+保险 ⬜ 110 升级强化
SD_49(经济总设计)· SD_42(升级线)· SD_34(S0 枢纽)· SD_19(反枪械红线)。现状:全部设计阶段、代码未起;落地照搬合成的"校验→扣→产出"事务 + 控制器 Request→Server RPC + ICSInteractable 站点。状态图例 & 注记
UE_CodeArchitecture.md(代码快照)、Docs/Development/*(系统拆分)、实际 Source/ 与 DevelopmentUnits.md(单元状态)。「待验证」严格指还没录 PIE 验收——网络相关单元须 Listen Server + 至少 1 客户端验。下一步可补:Buff/状态效果 · 存档 · 电梯流式关卡 · 叙事/对话 · 音频/脚步 · 联机会话——按本页同一双轨模板(策划层 + 工程层)逐个加节。