● ● ● SCP-FOUNDATION // ENGINEERING TERMINAL · SITE-7█ · 系统实现档案 · ACCESS GRANTED

Foundation · Abyss Protocol — Systems Index

系统设计总览

每个系统策划层(设计目标 / 玩家体验 / 数值平衡意图 / 世界观挂钩) + 工程层(职责 / 权威 / 复制 / 关键类 / 落地状态)双轨呈现。本批:战斗 · 制作 · 怪物AI · 任务 · 道具/物品 · 角色属性(其余系统按同模板续补)。

版本 0.1 · 工程终端 生成 2026-06-10 数据源 UE_CodeArchitecture.md · Docs/Development/* · Source/ · DevelopmentUnits.md
00

共同骨架

所有系统共享的心智模型

读任一系统前,先记住这四条贯穿全工程的规则——它们是 AGENTS.md 的红线,也是每个系统的设计前提。

① 服务器权威

客户端只发请求 + 播表现,真值永远在服务器。权威态绝不只活在 UI / 客户端 / 蓝图事件图。战斗、库存、合成、掉落、伤害、存档、世界进度都是 server-authoritative。

② 数据驱动

Data/Source/*.csvGenerateGameData.pyData/Generated/*UCSItemDataSubsystem 运行时查表。数值(武器/配方/敌人/Buff/任务)不写死在代码,改表重生成即可。

③ 事件驱动

用 RepNotify + 委托 + 服务器 Timer 推动更新,避免 Tick 逐帧轮询。客户端经 OnRep_* / On*Changed 委托得知结果。

④ 数据归属三分

个人态ACSPlayerState(库存) / 角色组件(生存·属性·状态);世界共享态ACSGameState.WorldProgress请求经 owning ACSPlayerController 或角色组件的 Server RPC。

单一运行时模块 CoopSurvival,C++ 类用 CS 前缀。完整的类对类地图与活跃重构清单见 UE_CodeArchitecture.md(代码现状快照);本页是它的「按系统切片 + 终端风呈现」。
01

战斗 Combat

近战挥砍 + 枪械开火的服务端权威结算
本节是架构 / 工程视角。想看「枪能做什么、玩家会看到/听到/感受到什么」的玩家视角机制 + 表现目录(开火 · 弹匣弹种 · 改装 · 后坐 · 瞄准 · 枪口抛壳弹着 · 枪声 3D 衰减 · 持枪动作),见 → 枪械系统 · 机制与表现图谱。想看玩家角色的运动 / 控制 / 交互状态、Locomotion 状态机与状态→动作映射,见 → 战斗与人物运动系统 · 状态架构
策划 · DESIGN

设计目标

反枪械哲学:武器是常规遭遇的主要解决手段(~70–85%),但不能替代设施 / 核心异常 / 污染 / 身份 / 样本 / 门禁 / 路线 / 世界推进。「枪械可以强,但必须有后果、有场景、有代价。」反对的是"仅靠枪械就能通关",不是反对武器本身。

玩家体验

近战优先、有重量(低噪音 / 低维护长期有价值);开枪有后果(噪音引敌 / 扰动污染 / 弹药稀缺 / 门禁不认火力);站位·体力·负载是真变量。分层解法:普通=武器可解 → 精英=武器+弱点/环境 → SCP规则Boss=收容流程/AIM协议/样本归档。

数值 / 平衡意图

弹药 / 耐久 / 维护 / 噪音 = 平衡杠杆;用弱点·破甲·阶段而非"堆高血量";武器类别定位(近战工具 / 安保枪械 / GOC遗留=可能破坏真结局变量)。难度只缩放战斗体验,缩放真相理解或通关。

世界观 / 成长挂钩

双成长线:①工程升级线(普通材料→升级台→数值,可预期)②AIM 协议线(SCP样本→S0归档→AIC解析→协议,稀缺有代价)。护甲 / 负载 = 身份与定位;底线:不许同时最高火力+最厚甲+最大包+最强协议。

设计来源:SD-19(反枪械深度)· SD-42(战斗装备与 AIM 协议成长)· FirearmHandfeel(手感)· GameDesign「战斗解决方式修正」。设计层未定:绝大多数数值未锁定(伤害 / 噪音半径 / 耐久 / 协议代价);倒地救援"中期实现";职业分工"先靠系统自然产生,暂不专门实现"。
工程 · ENGINEERING

职责

核心 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++ 不写死枪名。

关键类

文件 / 职责
UCSCombatComponentComponents/CSCombatComponent.h/.cpp · 近战窗口扫掠 + 枪械 hitscan + 换弹机
UCSAnimNotifyState_MeleeWindowAnimation/CSAnimNotifyState_MeleeWindow.h · 近战伤害窗口
ACSWeaponActor / Melee / FirearmWeapons/CSWeaponActor.h 等 · 命中段 HitStart/HitEnd / 枪口 socket(BP 调参)
UCSAttributeComponentComponents/CSAttributeComponent.h · 属性快照 + 静态 MitigateDamage
UCSStatusEffectComponentComponents/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。
02

制作 Crafting

靠台按配方:校验→扣料→计时→产出
策划 · DESIGN
⚠ 设计现状:无专属"制作"策划文档。制作在设计层是薄的、由邻居系统隐含定义的——被拆进 SD-42 的"工程升级线"和 SD-34 的"装备台资格解锁"。下列为从邻居文档忠实综合,是当前设计的最大空白。

设计目标

制作服务于搜刮生存循环,不是建造或刷资源致富;材料全部来自搜刮(search→craft 单向供给);S0 是把"层级成果"转成"长期进度"的唯一枢纽。MVP 明确不做自由基地建造——只摆场景站点 + 后续有限 Deployable(消耗品/工具,非建筑)。

玩家体验

核心节奏 = scavenge → 带回 → S0 台制作/升级;资源张力来自背包取舍而非金钱(带医疗包还是带残留?带弹药还是带样本容器?)。S0 整备有仪式感:返回扫描查污染/未封装样本,"安全但不安宁"。

数值 / 平衡意图

配方门控走"世界存档优先":能不能做=世界进度,做不做得起=材料;材料稀缺分层;升级"不只 +10%"应给新交互(抗孢子滤芯→进 L2 根系);craft-time 当节奏阀。制作变强→更重→机动降(自平衡)。

世界观 / 进度挂钩

制作台 = 虚构设施(修复/安装基金会模块,不是摆建筑);做出/升级某件装备 = 进下一层的资格制作只属"工程线",不能做出 SCP 能力(那是平行的 AIM 归档线,§19 禁止"杀 SCP 掉技能")。

设计来源:SD-20(搜刮背包)· SD-42 §6(工程升级线)· SD-34(S0 装备台/归档台)· GameDesign(不做自由建造)· LimitedBuilding(有限 Deployable 边界)。设计层未定:配方树 / craft-time 数值 / 合成 UI 流程 / 工作台类型清单从未单独设计;升级树结构、Deployable 与配方如何接驳均待定;残留碎片明确不喂制作(叙事/结局回报)。
工程 · ENGINEERING

职责

玩家在工作台附近按配方制作:服务端校验配方/工作台/材料 → 扣料 → 计时 → 产出入背包。进行态(进度/剩余时间)复制给发起者本人。

数据归属 & 权威

进行态 = 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 休眠。

核心机制:服务端校验链

1配方存在RecipeId 查表
2未在制作防重入
3附近可用台RequiredStationId + UseRadius 350
4材料齐全HasItemQuantity
5先扣料RemoveItem
6计时产出SetTimer→AddItem

工作台是 ICSInteractable 世界 Actor(关卡摆放、静态、带 PersistentId),聚焦走全工程统一 Custom Depth 后处理描边 M_InteractOutline_PP

关键类

文件 / 职责
UCSCraftingComponentComponents/CSCraftingComponent.h/.cpp · 服务端权威合成核心
ACSWorkbenchStationWorld/CSWorkbenchStation.h/.cpp · ICSInteractable 工作台
ACSPlayerControllerCore/CSPlayerController.* · 请求入口 + Server RPC 薄转发,持有组件
UCSInventoryComponentComponents/CSInventoryComponent.* · 材料扣减/产出入库(PlayerState)
UCSItemDataSubsystemItems/CSItemDataSubsystem.* · 配方/物品查询 + GetRecipesForStation

数据驱动表

Recipes.csv(当前 Axe / Knife,含 StationId/OutputItemId/CraftTimeSeconds)+ RecipeRequirements.csv(Axe→Wood×3 / Knife→Wood×2)+ Items.csvGenerateGameData.py 校验 RecipeId 唯一、产出/材料 ItemId 外键存在。

落地状态

✅ 第一个配方 U31 已PIE ✅ 站点交互 U32 已PIE 🔶 Crafting-A 组件抽取 U41 待验 🔶 合成 UI U10 待验

待办 / 已知缺口:产出失败(背包满)或扣料中途失败不退料(潜在丢材料,待加事务回滚);站点类型硬编码只认 "Workbench",「升级台」等扩展未在配方校验打通;合成 UI 验证未闭环;世界存档读写仍留在 ACSPlayerController(计划迁 UWorldSubsystem)。合成进行态按设计不入存档(既定取舍)。
03

怪物AI Enemy

服务器权威 PvE 近战追击敌人 · 污染变异体
本节是架构 / 工程视角。想看「这种敌人会做什么、玩家会看到/听到什么」的玩家视角行为目录(感知 · 五态机 · 攻击 · 挨打 · 死亡 · 受击血效 · 发声),见 → 怪物 AI · 行为与表现图谱
策划 · DESIGN

设计目标

污染变异体 = 基准威胁(教学单位,非数值门槛):教三件事——武器可解 / 受击带污染 / 用普通材料衔接养成。敌人是潜行·声音·站位的谜题,不是射击场;污染是身体代价、不是第二条血;无血条(靠姿态/前摇/硬直读状态,写实压迫)。

玩家体验 / 恐怖

感官潜行 = 噪音拉杆(蹲≈无声 / 走小 / 跑中 / 枪声大);视觉正面有向可绕背 + 360° 近身必察觉圈;警觉条(看到/听到涨,断线安静衰减→可摆脱追踪)。Stalker 恐惧 = 换感知档案换应对方式(盲听者 vs 守望者)。

数值 / 平衡意图

原型角色:Basic 均衡 / Brute 压力变体 / Stalker 由感知档案实现;感知全数据驱动(视野锥+听觉+警觉条+近身圈+蹲伏降视距)。首版不加复杂抗性,"让战斗手感先成立"。

世界观挂钩

收容失效副产物、不是完整 SCP;真菌感染源自 L2 菌丝母体苏醒、蔓延上 L1/L0;对活体身份/声/光有反应(契合身份事故主题);污染 Buff 接 AIM 虚构。

遭遇 / 难度设计(多为 DESIGN-only 未实现)

遭遇导演(按预算生成敌人)+ 动态难度(按有效玩家数缩放,非房间最大人数)+ Boss 阶段(不只血条,阶段压力/收容窗口)。掉落只普通材料(变异组织/污染残留),绝不掉关键样本/路线/AIM/结局变量。AI 只发 ObjectiveEvent、不直接改玩家属性(走 BuffSystem 单点写)。

设计来源:SD-45(§6 感知与潜伏系统)· SD-19(敌人=思考密度)· AIEncounterBoss(遭遇导演/Boss)· SD-31(逐层威胁来源)。设计层未定:所有数值为"建议"非锁定;"无血条 vs 有 Health"张力未裁决(§5 仍保留 Health 数值);Stalker 极端档案 / 遭遇导演 / 动态难度 / Boss / 敌人战斗音频首版不做。
工程 · ENGINEERING

职责

三类分工:ACSEnemyCharacter(本体血/受击/攻击/死亡/尸体搜刮) + ACSEnemyAIController(感知/追击决策核心) + UCSEnemyAnimInstance(纯算值)。数值真值在 EnemyDefinitions.csvBP_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 → 过玩家护甲 MitigateDamageApplyDamage + 对玩家 StatusEffectComponent.ApplyBuff(Buff_Bleed_Light);命中时机由 UCSAnimNotify_EnemyMeleeHit 卡帧,bHitAppliedThisAttack 一击一次。
  • 防守侧:实现 ICSHitReactable——服务端算方向×部位×轻重选受击动作 + 短硬直;爆头/弱点倍率 GetIncomingDamageMultiplier(数据驱动,Basic 2.0/Brute 1.5/Stalker 2.5)。
  • 死亡:HandleDeath 生成战利品 + 死亡动画;若带 EncounterGroupId → 通知任务求值器 NotifyKill。受击表现 UCSEnemyFeedbackComponent(喷血 + 闪白,默认关);不做血条(真实感,用户拍板)。

关键类 & 数据表

类 / 表文件 / 内容
ACSEnemyCharacterAI/CSEnemyCharacter.* · 实现 ICSHitReactable+ICSInteractable+ICSLootSource
ACSEnemyAIControllerAI/CSEnemyAIController.* · 感知 + 追击决策核心,仅服务器
UCSEnemyAnimInstanceAI/CSEnemyAnimInstance.* · 纯算值(速度/移动/情绪/Stride)
EnemyDefinitions.csv3 行:Basic(HP80) / Brute(HP180) / Stalker(HP110);ECSEnemyAIArchetype Wanderer/Brute/Sentry/Stalker
LootTableEntries.csvLT_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

待办 / 已知缺口:StateTree 迁移待状态增多;Stalker 潜伏/突袭真行为未实现(枚举已识别,暂按游荡行为处理);SD-45 设计的警觉条 / 近身必察觉圈 / 蹲伏降视距未实现(现用 UE 感知 sight age + 持续追击窗口近似);遭遇导演 / 动态难度 / spawner 未实现(敌人靠关卡手动摆放);敌人战斗音频缺;污染周期 Buff 未挂;掉落内容仍占位。
04

任务 Quest

Site 事故处理记录 · 关键进度属世界档案
策划 · DESIGN

设计目标

任务 ≠ 接/交任务列表,是 Site 事故处理记录;关键进度属世界档案非个人玩家(后加入者直接看到当前进度)。主/支/隐藏是一个结构 + 类型 + 可见性,不是三套系统;目标永不游戏化成进度条(用"档案/删除字段"语言)。

玩家体验

目标不靠任务 NPC 列表浮现,靠 AIC 语音 + 世界状态 + 门禁拒绝原因;隐藏目标靠推理 + reveal 标签命中浮现。门禁 = 物品实体 + 区域状态 + 归档记录(关键物来自机制、不是随手拾取);体感 = 处置一桩收容事故。

任务结构

Main 主事故线(最低必要路线)/ Side 旁支调查(深度路线,换完整档案·强装备·真结局)/ Hidden 未登记异常(reveal 标签)。骨干揭示点每层一次性,承载 SD-37 器官真相(L1 免疫→L7 胃/子宫),线性走完自然集齐、不设硬收集门。

世界观 / 结局挂钩

结局 = 门槛 + 决断:累积归档完整度决定 L7 开放哪些选项。任务是承载真相揭示的脊柱(L4 决定你是否知道真正参与的是什么);D-7710/残留绑定真结局。L7 不做额外收集门(条件核对+抉择,非 Boss 战)。

关卡推进设计

线性 S0→L7,不靠回刷同层解锁下一层;重复探索边界:稳定层只产出普通材料,不重发骨干揭示点/关键物/路线/AIM/结局变量。难度只影响战斗体验,不门禁真相理解或通关。

设计来源:ObjectiveWorldState §0(开发读法)· SD-33(逐层目标内容)· SD-43(推进/难度/结局框架)· Unit 81(Quest-A 设计决定)。设计层未定:各结局累积完整度阈值与构成项未定;S0 认知进度面板呈现形式待定;Quest-C 条件求值器/reveal 触发器规划未做;Quest-B 事故面板 / Quest-D 状态图 UI 待做。
工程 · ENGINEERING

职责

任务不是接/交任务列表,是 Site 事故处理记录。关键进度属世界存档 / Site 档案,不属于个人玩家;单人能完成主线,多人只加速/分担;UI 只读不写、永不完成任务。

数据归属 & 权威

集中在 ACSGameState.WorldProgressFCSWorldProgressSaveDataObjectiveStates/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)

UCSObjectiveDirectorSubsystemUWorldSubsystem,仅权威无复制)绑 OnWorldProgressChanged,按 Order 武装目标。8 种 ECSObjectiveConditionType

Manual · Interact · CollectItem · KillCount · ReachVolume · RepairCount · HoldTimer · WorldStateTag。被动条件重算、主动 Notify* 累计达阈值 → ApplyObjectiveEvent 自动完成 + 折叠奖励(路线/配方/样本/标签)。

事件接线(全服务端 · 零新增 RPC)

交互InteractOnServerObj.<Key> actor tag → NotifyInteract
拾取AddItem→ NotifyCollect
击杀HandleDeath→ NotifyKill
到点TriggerVolume→ NotifyReachVolume(+检查点)

关键类 & 数据表

类 / 表文件 / 内容
FCSWorldProgressSaveDataWorld/CSWorldSaveGame.h · 世界共享进度(权威 + 存档)
ACSGameStateCore/CSGameState.* · WorldProgress + 写入入口 + OnWorldProgressChanged + BuildResolvedQuestView
UCSObjectiveDirectorSubsystemWorld/CSObjectiveDirectorSubsystem.* · 条件求值器(仅权威)
ACSObjectiveTriggerVolumeWorld/CSObjectiveTriggerVolume.* · 到点触发 + 检查点记录
Quests.csv / Objectives.csv3 任务种子(主/支/隐藏)/ 5 步;条件列并入 Objectives.csv(无独立 Conditions.csv)

落地状态

🔶 Quest-A U81 已实现待验(编辑器目标过 / 有 PrintQuests exec / 无 UI) 🔶 Quest-C 求值器 U28 已实现待 PIE
⬜ Quest-B 事故面板 + HUD 追踪 ⬜ Quest-D Site 状态图

待办 / 已知缺口:runtime 编译阻塞——未跟踪文件 UI/Editor/CSWidgetAuthoringLibrary.h(Unit 78 WIP)让 runtime 目标整编失败,需迁编辑器专用模块(与 Quest-A 无关但卡 runtime);UI 全缺(只有 PrintQuests / GM Dump,Quest-B/D 待做);收容关卡导演的 RepairCount/HoldTimer 入口已就绪但无调用方(待 ACSFilterNode+ACSContainmentEncounter);隐藏任务「命中条件→自动写 reveal 标签」触发器未做。
05

道具/物品 Items

物品数据模型 + 个人背包 + 装备 + 搜刮
策划 · DESIGN

设计目标

服务于反撤离经济的 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 换点数⬜纸面
✅ 已严格化(Unit 85,2026-06-10,运行时整编通过、待 PIE):ItemType 已从 FName 字符串升级为正式 UENUM ECSItemType(上表 10 类全部入枚举,GenerateGameData.py 校验 VALID_ITEM_TYPES,非法值生成期报错)。新增三字段:bCriticalItem(关键物:服务端禁丢 + 不进随机掉落,已生效)、ContaminationPerSecond(携带涨污染,数据已就位,结算待污染单元)、bArchivable(可归档,数据已就位,逻辑待归档台单元)。已补示例物品 Item_Fuse(关键物)、Sample_C12_Stable(样本)。仍待后续单元:样本槽/隔离槽、污染累积结算(接生存属性,SD_47 决策①)、S0 归档台、消耗品使用、投掷物、物品实例 FGuid。
设计来源:SD-20(搜刮背包,§7 物品字段 / §9 容器状态机 / §10 SCP 特殊物品)· EquipmentLoadout(5 槽 loadout + 纸娃娃)· SearchInventory(§4 分类矩阵)· SD-42 §10-11(背包/护甲)。设计层未定:物品实例 FGuid(耐久/词条无处落);普通物品词条系统无设计;样本/隔离槽/污染携带/认知危害/归档台/S0 回收/残留碎片全 TBD。
工程 · ENGINEERING

职责

UCSInventoryComponent:服务端权威的个人背包 + 装备 + 弹匣 + 升级 + 穿戴外观,挂 ACSPlayerState(跨 Pawn 重生持久),是 UI/握持/快捷栏/存档的真值来源。

数据归属 & 权威

挂 PlayerState;复制状态全 RepNotify(InventoryStacks/EquippedItemId/EquipmentHotbar/WeaponMagazines/WeaponUpgrades/WornAppearanceItemIds),按 OwnerOnly 设计(背包是个人隐私态)。

请求 → 服务器流

客户端不直接改背包,经 owning ACSPlayerController 的 Server RPC(RequestEquipItemServerEquipItemInventory.EquipItem);搜刮取物经 ICSLootSource 由容器/尸体服务端处理。

复制方式

事件驱动:服务端改 → ForceNetUpdate + 广播 OnEquippedItemChanged/OnInventoryStacksChanged(属性组件订阅重算负重;角色订阅刷握持),客户端经 OnRep_* 重建。

核心机制 & 关键类

  • 栈模型:FCSInventoryStack { ItemId; Quantity; GridX; GridY; bRotated }——网格是叠在逻辑栈上的摆放层,HasItemQuantity 仍按 ItemId 跨栈求和。无 per-instance GUID(耐久/词条无处落)。
  • 网格摆放(Grid-A~C2b):服务端 PlaceStackAutomatically/MoveStackTo/RotateStackInPlace,放不下=拒绝、物品留容器。
  • 装备:4 槽无类型 EquipmentHotbarIsItemEquipable=bCanEquip 且在 EquipmentDefinitions——任意可装备物可进任意槽,无类型路由(5 槽主/副/刀/投/道具未做)。弹匣 FCSWeaponMagazineState + 口径系统。
  • 搜完才揭示(Search-A):容器/尸体实现 ICSLootSourceBeginLootSearch→Timer→CompleteLootSearch 揭示;未搜完服务端根本不下发战利品
  • 关键类:Items/CSItemDataTypes.h(全数据结构)· Components/CSInventoryComponent.* · Core/CSPlayerState.hFCSInventoryStack)· 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

待办 / 缺口:类型化 loadout 不存在(4 槽无类型);消耗品使用路径 / 投掷物完全没有;物品实例化缺失(耐久无处存单件状态);SCP 特化全缺(样本槽 / 污染携带 / 归档台 / S0 回收 / 残留);关键物保护靠"不进随机表"的人工约定,无 bCriticalItem 强制不可丢卖。
06

角色属性 Attributes

生存状态 + 派生属性快照 + 负重 / 护甲
策划 · DESIGN

设计目标

按层级危险准备(护甲/抗性服务于"进哪层抗哪种异常",而非盲目堆叠数值);装备配置须有取舍,禁止全项拉满(不许同时最高火力+最厚甲+最大包+最强协议);双成长线(工程升级 / 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
设计来源:SD-42(§4 能力层 / §5 负载 / §10 护甲与防护 / §13 伤害状态 / §16 UI / §19 禁止事项)· BuffSystem §2(属性表 + 计算公式)· SD-22 §14(污染=持久体征)。设计层未定:隐藏属性大多无字段;饥饿/口渴定位偏弱;污染后遗症分级未定;倒地/救援"中期实现"。
工程 · ENGINEERING

职责

两组件挂角色:UCSAttributeComponent(派生属性快照:负重/护甲减伤/移速恢复倍率/稳定,事件驱动重算不 Tick)+ UCSSurvivalStatsComponent(生命/体力/饥饿/口渴,有界衰减 Tick + 死亡/复活)。

数据归属 & 权威

都挂角色、服务端权威 HasAuthority;属性快照输入来自 PlayerState 库存ResolveInventory);客户端只读复制快照,不本地重算权威值

复制方式

Snapshot(RepNotify + OnAttributeSnapshotChanged,服务端重算后手动广播);Stats(RepNotify + OnHealthChanged)。

核心机制

快照:基础→ApplyEquipmentModifiersArmor-A 已实现)→ApplyBuffModifiers空钩子)→负重派生→负重连乘移速→Clamp。MitigateDamage 静态(Ballistic→防弹 / 其余→物理;无属性组件=不减伤)。负重→移速(UpdateMovementSpeed 末端乘 MoveSpeedScalar,超重禁冲刺)。

关键类 + 实际字段(忠实落点)

结构 / 类实际字段
FCSAttributeSnapshot
Components/CSAttributeComponent.h
Load · MaxLoad(=25) · ProtectionPhysical · ProtectionBallistic · Stability · MoveSpeedScalar · StaminaRegenScalar
FSurvivalStats
Components/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 未决。
本系统与 战斗MitigateDamage 减伤汇点)、道具/物品(装备→护甲喂快照、背包 Weight→负重)紧耦合——属性是装备/Buff/污染最终汇入的承载层。
07

经济 Economy

请购点 · 回收/购买 · 物品分类 · 下潜损耗
策划 · DESIGN

设计目标

个人闭环、非刷钱:卖战利品→换请购点→买补给/解锁后的强装备→下潜可能死亡掉装备→保险/重新置装。参考塔科夫/暗区/三角洲,SCP 化。三决策已拍板:每人独立钱包 · 解锁后才上架 · 死亡掉落+保险

玩家体验

价值密度抉择:收藏品又大又重又值钱,带满收藏品还是带满弹药自己赌;S0=安全区(个人仓库寄存)、下层=风险区;强力/SCP 物品先解锁再花钱买,不花钱跳关。

物品三轴分类

功能类型(已有)+ 经济分类ECSItemEconomyCategory(收藏/核心/道具料/升级料/装备/受限)+ 价值评级ECSItemRarity(T1普通→T5异常级,定价档+颜色)。加到 Items.csvFCSItemDefinition

红线(不可违反)

关键样本/关键物/残留禁卖禁掉禁复制;世界解锁归世界不卖;不做花钱跳关/无限刷钱;无 NPC 商人街/自由建造;永久权限门禁只解锁不卖、只卖一次性消耗门卡。

⬜ 105 货币地基 ⬜ 106 回收+分类 ⬜ 107 请购购买 ⬜ 108 安全仓库 ⬜ 109 死亡掉落+保险 ⬜ 110 升级强化

设计来源:经济系统图谱(专页) · SD_49(经济总设计)· SD_42(升级线)· SD_34(S0 枢纽)· SD_19(反枪械红线)。现状:全部设计阶段、代码未起;落地照搬合成的"校验→扣→产出"事务 + 控制器 Request→Server RPC + ICSInteractable 站点。
本系统与 道具/物品(卖/买走背包增减、物品加经济分类/评级列)、制作(同构事务骨架)、任务(解锁门控读 WorldProgress)、角色属性(升级强化汇入属性)紧耦合。委托 / 事件任务(接活换货币 / 材料 / 解锁)见 委托与任务图谱SD_50,建在现有任务求值器之上)。S0 交易 UI 设计稿见 S0 枢纽终端
§

状态图例 & 注记

✅ 完成 已实现并通过 PIE / 用户验收 🔶 待验证 代码 + 编译通过,待 PIE / Listen Server 验 ⬜ 计划 / 缺口 设计有、代码无
口径:本页是设计层 + 实现现状的呈现,不替代代码。每条均来自 UE_CodeArchitecture.md(代码快照)、Docs/Development/*(系统拆分)、实际 Source/DevelopmentUnits.md(单元状态)。「待验证」严格指还没录 PIE 验收——网络相关单元须 Listen Server + 至少 1 客户端验。
下一步可补:Buff/状态效果 · 存档 · 电梯流式关卡 · 叙事/对话 · 音频/脚步 · 联机会话——按本页同一双轨模板(策划层 + 工程层)逐个加节。