Document carry capacity placeholder

This commit is contained in:
2026-05-17 13:26:14 -07:00
parent edd40501d6
commit cb663fbfaf
4 changed files with 122 additions and 1 deletions
+5 -1
View File
@@ -510,7 +510,11 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe
state; tools remain inventory items until active hand, worn, backpack, armor, state; tools remain inventory items until active hand, worn, backpack, armor,
weapon, durability, animation, or mesh-attachment rules require replicated and weapon, durability, animation, or mesh-attachment rules require replicated and
persisted slot state. persisted slot state.
- [ ] Add weight or carry capacity placeholder. - [x] Add weight or carry capacity placeholder. Locked MVP carry capacity to
stack `UnitWeight`, inventory `GetTotalWeight`, character comfort/heavy carry
thresholds, strength-scaled movement penalties, and a debug HUD carried
weight readout. Later volume, backpack, awkward-object, and hard overload
rules should extend this hook.
- [ ] Add inventory UI. - [ ] Add inventory UI.
- [x] Add replication for inventory changes. - [x] Add replication for inventory changes.
- [ ] Add persistence for inventory. - [ ] Add persistence for inventory.
+21
View File
@@ -120,6 +120,27 @@ The 0.1.E inventory work should implement these operations on top of the model:
systems layered on top. systems layered on top.
- UI: read the replicated stack list and send requests back through server RPCs. - UI: read the replicated stack list and send requests back through server RPCs.
## Carry Capacity Placeholder
The 0.1.E MVP carry-capacity placeholder is implemented as a weight-first
movement penalty, not a hard inventory lock. Each `FAgrarianItemStack` stores
`UnitWeight`; `UAgrarianInventoryComponent::GetTotalWeight` sums
`Quantity * UnitWeight`; and `AAgrarianGameCharacter` reads that total through
`GetCurrentCarryWeight`.
The default comfort and heavy thresholds are `25.0` and `60.0` item-weight
units. `StrengthMultiplier` scales those thresholds so stronger characters can
carry more before penalties. Movement remains full speed at or below the
effective comfort threshold, trends down toward `65%` between comfort and heavy
loads, and uses a `45%` carry multiplier at or above the heavy threshold. The
debug HUD shows current carried weight so designers can tune item weights during
play tests.
This intentionally leaves volume, containers, backpacks, injuries, fatigue,
awkward-object handling, and hard over-encumbrance rules for later systems.
Those systems should build on the existing total-weight hook instead of adding a
parallel inventory burden model.
## Equipment Slot Decision ## Equipment Slot Decision
Dedicated equipment slots are deferred for the 0.1.E MVP. Current MVP tools, Dedicated equipment slots are deferred for the 0.1.E MVP. Current MVP tools,
+8
View File
@@ -130,6 +130,14 @@ or mesh-attachment state. When that need appears, equipment should be added as
server-authoritative, replicated, persisted slot state rather than as local UI server-authoritative, replicated, persisted slot state rather than as local UI
selection only. selection only.
Carry capacity is active as an MVP placeholder through stack `UnitWeight`,
inventory `GetTotalWeight`, and character movement penalties. The current
character uses `25.0` comfort and `60.0` heavy item-weight thresholds, scales
those thresholds by strength, and exposes current carried weight in the debug
HUD. Future backpacks, containers, awkward-object rules, and hard overload
limits should extend this total-weight path rather than creating a second carry
model.
## Time And Environment ## Time And Environment
The MVP gameplay calendar target is: The MVP gameplay calendar target is:
@@ -0,0 +1,88 @@
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
FILES = {
"AgrarianTypes.h": ROOT / "Source" / "AgrarianGame" / "AgrarianTypes.h",
"AgrarianInventoryComponent.cpp": ROOT / "Source" / "AgrarianGame" / "AgrarianInventoryComponent.cpp",
"AgrarianGameCharacter.h": ROOT / "Source" / "AgrarianGame" / "AgrarianGameCharacter.h",
"AgrarianGameCharacter.cpp": ROOT / "Source" / "AgrarianGame" / "AgrarianGameCharacter.cpp",
"AgrarianDebugHUD.cpp": ROOT / "Source" / "AgrarianGame" / "AgrarianDebugHUD.cpp",
"InventoryDataModel.md": ROOT / "Docs" / "InventoryDataModel.md",
"TechnicalDesignDocument.md": ROOT / "Docs" / "TechnicalDesignDocument.md",
"AGRARIAN_DEVELOPMENT_ROADMAP.md": ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md",
}
EXPECTED = {
"AgrarianTypes.h": [
"UnitWeight",
],
"AgrarianInventoryComponent.cpp": [
"UAgrarianInventoryComponent::GetTotalWeight",
"Stack.UnitWeight",
"Stack.Quantity",
],
"AgrarianGameCharacter.h": [
"ComfortableCarryWeight = 25.0f",
"HeavyCarryWeight = 60.0f",
"CalculateCarryWeightMovementMultiplier",
"GetCurrentCarryWeight",
],
"AgrarianGameCharacter.cpp": [
"AAgrarianGameCharacter::GetCurrentCarryWeight",
"InventoryComponent->GetTotalWeight()",
"CalculateCarryWeightMovementMultiplier()",
"AAgrarianGameCharacter::CalculateCarryWeightMovementMultiplier",
"StrengthMultiplier",
"FVector2D(1.0f, 0.65f)",
"return 0.45f",
],
"AgrarianDebugHUD.cpp": [
"GetCurrentCarryWeight()",
],
"InventoryDataModel.md": [
"## Carry Capacity Placeholder",
"weight-first",
"movement penalty",
"`UnitWeight`",
"`GetTotalWeight`",
"`GetCurrentCarryWeight`",
"`25.0`",
"`60.0`",
"`StrengthMultiplier`",
"`45%` carry multiplier",
"parallel inventory burden model",
],
"TechnicalDesignDocument.md": [
"Carry capacity is active as an MVP placeholder",
"stack `UnitWeight`",
"inventory `GetTotalWeight`",
"`25.0` comfort and `60.0` heavy",
"debug",
"HUD",
],
"AGRARIAN_DEVELOPMENT_ROADMAP.md": [
"[x] Add weight or carry capacity placeholder.",
"stack `UnitWeight`",
"inventory `GetTotalWeight`",
"strength-scaled movement penalties",
],
}
def main():
missing = []
for label, path in FILES.items():
text = path.read_text(encoding="utf-8")
for snippet in EXPECTED[label]:
if snippet not in text:
missing.append(f"{label}: {snippet}")
if missing:
raise RuntimeError("Carry capacity placeholder verification failed: " + "; ".join(missing))
print("Agrarian carry capacity placeholder verification complete.")
if __name__ == "__main__":
main()