@zigrivers/scaffold 3.4.1 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +91 -0
  2. package/content/knowledge/game/game-accessibility.md +328 -0
  3. package/content/knowledge/game/game-ai-patterns.md +567 -0
  4. package/content/knowledge/game/game-asset-pipeline.md +363 -0
  5. package/content/knowledge/game/game-audio-design.md +344 -0
  6. package/content/knowledge/game/game-binary-vcs-strategy.md +396 -0
  7. package/content/knowledge/game/game-design-document.md +269 -0
  8. package/content/knowledge/game/game-domain-patterns.md +299 -0
  9. package/content/knowledge/game/game-economy-design.md +355 -0
  10. package/content/knowledge/game/game-engine-selection.md +242 -0
  11. package/content/knowledge/game/game-input-systems.md +379 -0
  12. package/content/knowledge/game/game-level-content-design.md +483 -0
  13. package/content/knowledge/game/game-liveops-analytics.md +280 -0
  14. package/content/knowledge/game/game-localization.md +323 -0
  15. package/content/knowledge/game/game-milestone-definitions.md +337 -0
  16. package/content/knowledge/game/game-modding-ugc.md +390 -0
  17. package/content/knowledge/game/game-narrative-design.md +404 -0
  18. package/content/knowledge/game/game-networking.md +393 -0
  19. package/content/knowledge/game/game-performance-budgeting.md +389 -0
  20. package/content/knowledge/game/game-platform-certification.md +417 -0
  21. package/content/knowledge/game/game-project-structure.md +360 -0
  22. package/content/knowledge/game/game-save-systems.md +452 -0
  23. package/content/knowledge/game/game-testing-strategy.md +470 -0
  24. package/content/knowledge/game/game-ui-patterns.md +477 -0
  25. package/content/knowledge/game/game-vr-ar-design.md +313 -0
  26. package/content/knowledge/review/review-art-bible.md +305 -0
  27. package/content/knowledge/review/review-game-design.md +303 -0
  28. package/content/knowledge/review/review-game-economy.md +272 -0
  29. package/content/knowledge/review/review-game-ui.md +293 -0
  30. package/content/knowledge/review/review-netcode.md +280 -0
  31. package/content/knowledge/review/review-platform-cert.md +341 -0
  32. package/content/methodology/custom-defaults.yml +25 -0
  33. package/content/methodology/deep.yml +25 -0
  34. package/content/methodology/game-overlay.yml +145 -0
  35. package/content/methodology/mvp.yml +25 -0
  36. package/content/pipeline/architecture/ai-behavior-design.md +87 -0
  37. package/content/pipeline/architecture/netcode-spec.md +86 -0
  38. package/content/pipeline/architecture/review-netcode.md +78 -0
  39. package/content/pipeline/foundation/performance-budgets.md +91 -0
  40. package/content/pipeline/modeling/narrative-bible.md +84 -0
  41. package/content/pipeline/pre/game-design-document.md +90 -0
  42. package/content/pipeline/pre/review-gdd.md +74 -0
  43. package/content/pipeline/quality/analytics-telemetry.md +98 -0
  44. package/content/pipeline/quality/live-ops-plan.md +99 -0
  45. package/content/pipeline/quality/platform-cert-prep.md +129 -0
  46. package/content/pipeline/quality/playtest-plan.md +84 -0
  47. package/content/pipeline/specification/art-bible.md +87 -0
  48. package/content/pipeline/specification/audio-design.md +97 -0
  49. package/content/pipeline/specification/content-structure-design.md +142 -0
  50. package/content/pipeline/specification/economy-design.md +105 -0
  51. package/content/pipeline/specification/game-accessibility.md +82 -0
  52. package/content/pipeline/specification/game-ui-spec.md +97 -0
  53. package/content/pipeline/specification/input-controls-spec.md +81 -0
  54. package/content/pipeline/specification/localization-plan.md +113 -0
  55. package/content/pipeline/specification/modding-ugc-spec.md +116 -0
  56. package/content/pipeline/specification/online-services-spec.md +104 -0
  57. package/content/pipeline/specification/review-economy.md +87 -0
  58. package/content/pipeline/specification/review-game-ui.md +73 -0
  59. package/content/pipeline/specification/save-system-spec.md +116 -0
  60. package/dist/cli/commands/adopt.d.ts.map +1 -1
  61. package/dist/cli/commands/adopt.js +25 -0
  62. package/dist/cli/commands/adopt.js.map +1 -1
  63. package/dist/cli/commands/adopt.test.js +28 -1
  64. package/dist/cli/commands/adopt.test.js.map +1 -1
  65. package/dist/cli/commands/build.test.js +3 -0
  66. package/dist/cli/commands/build.test.js.map +1 -1
  67. package/dist/cli/commands/init.d.ts +1 -0
  68. package/dist/cli/commands/init.d.ts.map +1 -1
  69. package/dist/cli/commands/init.js +6 -0
  70. package/dist/cli/commands/init.js.map +1 -1
  71. package/dist/cli/commands/init.test.js +12 -1
  72. package/dist/cli/commands/init.test.js.map +1 -1
  73. package/dist/cli/commands/knowledge.test.js +8 -0
  74. package/dist/cli/commands/knowledge.test.js.map +1 -1
  75. package/dist/cli/commands/next.d.ts.map +1 -1
  76. package/dist/cli/commands/next.js +19 -5
  77. package/dist/cli/commands/next.js.map +1 -1
  78. package/dist/cli/commands/next.test.js +56 -0
  79. package/dist/cli/commands/next.test.js.map +1 -1
  80. package/dist/cli/commands/rework.d.ts.map +1 -1
  81. package/dist/cli/commands/rework.js +11 -2
  82. package/dist/cli/commands/rework.js.map +1 -1
  83. package/dist/cli/commands/rework.test.js +5 -0
  84. package/dist/cli/commands/rework.test.js.map +1 -1
  85. package/dist/cli/commands/run.d.ts.map +1 -1
  86. package/dist/cli/commands/run.js +54 -4
  87. package/dist/cli/commands/run.js.map +1 -1
  88. package/dist/cli/commands/run.test.js +384 -0
  89. package/dist/cli/commands/run.test.js.map +1 -1
  90. package/dist/cli/commands/skip.test.js +3 -0
  91. package/dist/cli/commands/skip.test.js.map +1 -1
  92. package/dist/cli/commands/status.d.ts.map +1 -1
  93. package/dist/cli/commands/status.js +16 -3
  94. package/dist/cli/commands/status.js.map +1 -1
  95. package/dist/cli/commands/status.test.js +55 -0
  96. package/dist/cli/commands/status.test.js.map +1 -1
  97. package/dist/cli/output/auto.d.ts +3 -0
  98. package/dist/cli/output/auto.d.ts.map +1 -1
  99. package/dist/cli/output/auto.js +9 -0
  100. package/dist/cli/output/auto.js.map +1 -1
  101. package/dist/cli/output/context.d.ts +6 -0
  102. package/dist/cli/output/context.d.ts.map +1 -1
  103. package/dist/cli/output/context.js.map +1 -1
  104. package/dist/cli/output/context.test.js +87 -0
  105. package/dist/cli/output/context.test.js.map +1 -1
  106. package/dist/cli/output/error-display.test.js +3 -0
  107. package/dist/cli/output/error-display.test.js.map +1 -1
  108. package/dist/cli/output/interactive.d.ts +3 -0
  109. package/dist/cli/output/interactive.d.ts.map +1 -1
  110. package/dist/cli/output/interactive.js +76 -0
  111. package/dist/cli/output/interactive.js.map +1 -1
  112. package/dist/cli/output/json.d.ts +3 -0
  113. package/dist/cli/output/json.d.ts.map +1 -1
  114. package/dist/cli/output/json.js +9 -0
  115. package/dist/cli/output/json.js.map +1 -1
  116. package/dist/config/loader.d.ts.map +1 -1
  117. package/dist/config/loader.js +3 -2
  118. package/dist/config/loader.js.map +1 -1
  119. package/dist/config/schema.d.ts +641 -15
  120. package/dist/config/schema.d.ts.map +1 -1
  121. package/dist/config/schema.js +26 -1
  122. package/dist/config/schema.js.map +1 -1
  123. package/dist/config/schema.test.js +192 -1
  124. package/dist/config/schema.test.js.map +1 -1
  125. package/dist/core/assembly/overlay-loader.d.ts +24 -0
  126. package/dist/core/assembly/overlay-loader.d.ts.map +1 -0
  127. package/dist/core/assembly/overlay-loader.js +190 -0
  128. package/dist/core/assembly/overlay-loader.js.map +1 -0
  129. package/dist/core/assembly/overlay-loader.test.d.ts +2 -0
  130. package/dist/core/assembly/overlay-loader.test.d.ts.map +1 -0
  131. package/dist/core/assembly/overlay-loader.test.js +106 -0
  132. package/dist/core/assembly/overlay-loader.test.js.map +1 -0
  133. package/dist/core/assembly/overlay-resolver.d.ts +15 -0
  134. package/dist/core/assembly/overlay-resolver.d.ts.map +1 -0
  135. package/dist/core/assembly/overlay-resolver.js +58 -0
  136. package/dist/core/assembly/overlay-resolver.js.map +1 -0
  137. package/dist/core/assembly/overlay-resolver.test.d.ts +2 -0
  138. package/dist/core/assembly/overlay-resolver.test.d.ts.map +1 -0
  139. package/dist/core/assembly/overlay-resolver.test.js +246 -0
  140. package/dist/core/assembly/overlay-resolver.test.js.map +1 -0
  141. package/dist/core/assembly/overlay-state-resolver.d.ts +26 -0
  142. package/dist/core/assembly/overlay-state-resolver.d.ts.map +1 -0
  143. package/dist/core/assembly/overlay-state-resolver.js +63 -0
  144. package/dist/core/assembly/overlay-state-resolver.js.map +1 -0
  145. package/dist/core/assembly/overlay-state-resolver.test.d.ts +2 -0
  146. package/dist/core/assembly/overlay-state-resolver.test.d.ts.map +1 -0
  147. package/dist/core/assembly/overlay-state-resolver.test.js +256 -0
  148. package/dist/core/assembly/overlay-state-resolver.test.js.map +1 -0
  149. package/dist/core/assembly/preset-loader.d.ts +1 -0
  150. package/dist/core/assembly/preset-loader.d.ts.map +1 -1
  151. package/dist/core/assembly/preset-loader.js +2 -0
  152. package/dist/core/assembly/preset-loader.js.map +1 -1
  153. package/dist/core/dependency/eligibility.test.js +3 -0
  154. package/dist/core/dependency/eligibility.test.js.map +1 -1
  155. package/dist/e2e/game-pipeline.test.d.ts +10 -0
  156. package/dist/e2e/game-pipeline.test.d.ts.map +1 -0
  157. package/dist/e2e/game-pipeline.test.js +298 -0
  158. package/dist/e2e/game-pipeline.test.js.map +1 -0
  159. package/dist/e2e/init.test.js +3 -0
  160. package/dist/e2e/init.test.js.map +1 -1
  161. package/dist/project/adopt.d.ts +3 -1
  162. package/dist/project/adopt.d.ts.map +1 -1
  163. package/dist/project/adopt.js +29 -1
  164. package/dist/project/adopt.js.map +1 -1
  165. package/dist/project/adopt.test.js +51 -1
  166. package/dist/project/adopt.test.js.map +1 -1
  167. package/dist/types/config.d.ts +50 -4
  168. package/dist/types/config.d.ts.map +1 -1
  169. package/dist/types/config.test.d.ts +2 -0
  170. package/dist/types/config.test.d.ts.map +1 -0
  171. package/dist/types/config.test.js +97 -0
  172. package/dist/types/config.test.js.map +1 -0
  173. package/dist/utils/eligible.d.ts +3 -2
  174. package/dist/utils/eligible.d.ts.map +1 -1
  175. package/dist/utils/eligible.js +18 -4
  176. package/dist/utils/eligible.js.map +1 -1
  177. package/dist/utils/errors.d.ts +4 -0
  178. package/dist/utils/errors.d.ts.map +1 -1
  179. package/dist/utils/errors.js +31 -0
  180. package/dist/utils/errors.js.map +1 -1
  181. package/dist/utils/errors.test.js +4 -1
  182. package/dist/utils/errors.test.js.map +1 -1
  183. package/dist/wizard/questions.d.ts +4 -0
  184. package/dist/wizard/questions.d.ts.map +1 -1
  185. package/dist/wizard/questions.js +59 -1
  186. package/dist/wizard/questions.js.map +1 -1
  187. package/dist/wizard/questions.test.js +178 -4
  188. package/dist/wizard/questions.test.js.map +1 -1
  189. package/dist/wizard/wizard.d.ts +1 -0
  190. package/dist/wizard/wizard.d.ts.map +1 -1
  191. package/dist/wizard/wizard.js +4 -1
  192. package/dist/wizard/wizard.js.map +1 -1
  193. package/dist/wizard/wizard.test.js +102 -4
  194. package/dist/wizard/wizard.test.js.map +1 -1
  195. package/package.json +1 -1
@@ -0,0 +1,363 @@
1
+ ---
2
+ name: game-asset-pipeline
3
+ description: Asset naming taxonomies by engine, per-type specs (poly budgets, texture sizes, audio formats), DCC tool chains, Git LFS config, and file locking
4
+ topics: [game-dev, assets, pipeline, naming, dcc, lfs]
5
+ ---
6
+
7
+ The asset pipeline is the full chain from an artist's DCC tool (Maya, Blender, Substance Painter, Houdini) through export, import, optimization, and packaging into the final game build. A well-structured pipeline enforces naming conventions, validates assets against per-type budgets on import, automates texture compression and LOD generation, and integrates with version control to prevent binary merge conflicts. Pipeline failures are insidious — a single 4K texture on a UI element or an uncompressed WAV in the audio bank can ship to players because nobody validated the asset against its budget.
8
+
9
+ ## Summary
10
+
11
+ ### Naming Conventions by Engine
12
+
13
+ Consistent naming is the foundation of asset discoverability, automated validation, and build tooling. Every major engine community has converged on prefix-based taxonomies:
14
+
15
+ **Unreal Engine convention (prefix_category_variant_index):**
16
+ - `SM_Weapon_Sword_01` — Static Mesh, weapon category, sword variant, first iteration
17
+ - `SK_Character_Player` — Skeletal Mesh for the player character
18
+ - `T_Rock_D` / `T_Rock_N` / `T_Rock_R` — Texture: diffuse/albedo, normal, roughness
19
+ - `M_Env_Ground_Dirt` — Material for environment ground, dirt variant
20
+ - `MI_Env_Ground_Dirt_Wet` — Material Instance variant
21
+ - `ABP_Character_Player` — Animation Blueprint
22
+ - `A_Weapon_Sword_Swing` — Animation asset
23
+ - `BP_Pickup_Health` — Blueprint actor
24
+ - `WBP_HUD_Crosshair` — Widget Blueprint
25
+ - `SFX_Weapon_Sword_Hit` — Sound effect
26
+ - `MUS_Level01_Combat` — Music track
27
+ - `FX_Env_Fire_Campfire` — Particle/Niagara effect
28
+ - `LVL_World01_Area03` — Level/Map file
29
+
30
+ **Unity convention (PascalCase with type suffixes or directory-based):**
31
+ - `WeaponSword01_Mesh` or simply organized by folder: `Art/Meshes/Weapons/Sword01.fbx`
32
+ - `RockDiffuse`, `RockNormal`, `RockRoughness` — textures
33
+ - `PlayerCharacter_Anim_Run` — animation clip
34
+ - `HUD_Crosshair` — UI prefab
35
+ - Unity relies more on folder structure than prefixes, but prefixes are still recommended for large projects
36
+
37
+ **Godot convention:**
38
+ - Snake_case file names: `weapon_sword_01.tres`, `player_character.tscn`
39
+ - Resources by type directory: `res://assets/meshes/`, `res://assets/textures/`
40
+ - Scenes: `res://scenes/levels/world_01.tscn`
41
+
42
+ ### Per-Type Asset Specifications
43
+
44
+ Every asset type needs explicit budgets documented in a project asset spec:
45
+
46
+ - **Static Meshes**: Hero props 5K–20K triangles, environment props 500–5K, background/distant 50–500. LOD0 within 10m, LOD1 at 50%, LOD2 at 25%
47
+ - **Skeletal Meshes**: Player character 15K–50K, NPCs 8K–30K, distant crowd 500–2K. Bone count: main characters 80–150, simple enemies 30–60
48
+ - **Textures**: Props 512x512–1024x1024, hero assets 2048x2048, environment tiling 1024x1024–2048x2048, UI elements power-of-2 or atlas. Always square or 2:1 ratio for compression
49
+ - **Audio**: SFX as .ogg/.wav (mono, 44.1kHz, 16-bit), music as .ogg (stereo, 44.1kHz), voice as .ogg (mono, 22.05kHz acceptable). Compress to platform-appropriate codec at build time
50
+ - **Animations**: 30fps for body anims, 60fps for facial/hand detail. Max clip length 10s for looping, segmented for cinematics
51
+
52
+ ### DCC Tool Chains
53
+
54
+ The pipeline typically involves multiple DCC tools in sequence:
55
+
56
+ - **3D Modeling**: Maya (industry standard, USD support), Blender (free, growing adoption), 3ds Max (legacy, architectural viz)
57
+ - **Sculpting**: ZBrush (high-poly sculpting, retopo), Blender (integrated sculpt mode)
58
+ - **Texturing**: Substance 3D Painter (PBR texturing standard), Substance Designer (procedural materials), Quixel Bridge (Mixer was discontinued in 2024; the Megascans library and Bridge integration remain active in Unreal)
59
+ - **VFX/Procedural**: Houdini (procedural generation, destruction, terrain), EmberGen (real-time fluid sim for VFX textures)
60
+ - **2D Art**: Photoshop, Aseprite (pixel art), Krita (free painting)
61
+ - **Audio**: FMOD Studio / Wwise (integration middleware), Audacity (editing), Reaper (DAW)
62
+
63
+ ### Git LFS and Binary Version Control
64
+
65
+ Game assets are binary files that cannot be diffed or merged. Git LFS (Large File Storage) tracks them by pointer, storing actual content on a separate server.
66
+
67
+ ## Deep Guidance
68
+
69
+ ### Git LFS Configuration
70
+
71
+ Every game project using Git must configure LFS for binary assets from day one. Retroactively adding LFS to an existing repo with binary history is painful and requires `git lfs migrate`.
72
+
73
+ ```gitattributes
74
+ # .gitattributes — place in repo root, commit BEFORE adding any binary files
75
+
76
+ # Textures
77
+ *.png filter=lfs diff=lfs merge=lfs -text
78
+ *.jpg filter=lfs diff=lfs merge=lfs -text
79
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
80
+ *.tga filter=lfs diff=lfs merge=lfs -text
81
+ *.tif filter=lfs diff=lfs merge=lfs -text
82
+ *.tiff filter=lfs diff=lfs merge=lfs -text
83
+ *.psd filter=lfs diff=lfs merge=lfs -text
84
+ *.exr filter=lfs diff=lfs merge=lfs -text
85
+ *.hdr filter=lfs diff=lfs merge=lfs -text
86
+ *.bmp filter=lfs diff=lfs merge=lfs -text
87
+
88
+ # 3D Models and Scenes
89
+ *.fbx filter=lfs diff=lfs merge=lfs -text
90
+ *.obj filter=lfs diff=lfs merge=lfs -text
91
+ *.blend filter=lfs diff=lfs merge=lfs -text
92
+ *.mb filter=lfs diff=lfs merge=lfs -text
93
+ *.ma filter=lfs diff=lfs merge=lfs -text
94
+ *.max filter=lfs diff=lfs merge=lfs -text
95
+ *.ztl filter=lfs diff=lfs merge=lfs -text
96
+ *.usd filter=lfs diff=lfs merge=lfs -text
97
+ *.usda filter=lfs diff=lfs merge=lfs -text
98
+ *.usdc filter=lfs diff=lfs merge=lfs -text
99
+ *.gltf filter=lfs diff=lfs merge=lfs -text
100
+ *.glb filter=lfs diff=lfs merge=lfs -text
101
+
102
+ # Audio
103
+ *.wav filter=lfs diff=lfs merge=lfs -text
104
+ *.mp3 filter=lfs diff=lfs merge=lfs -text
105
+ *.ogg filter=lfs diff=lfs merge=lfs -text
106
+ *.flac filter=lfs diff=lfs merge=lfs -text
107
+ *.bank filter=lfs diff=lfs merge=lfs -text
108
+ *.wem filter=lfs diff=lfs merge=lfs -text
109
+
110
+ # Video
111
+ *.mp4 filter=lfs diff=lfs merge=lfs -text
112
+ *.mov filter=lfs diff=lfs merge=lfs -text
113
+ *.avi filter=lfs diff=lfs merge=lfs -text
114
+ *.webm filter=lfs diff=lfs merge=lfs -text
115
+
116
+ # Engine-specific binary formats
117
+ *.uasset filter=lfs diff=lfs merge=lfs -text
118
+ *.umap filter=lfs diff=lfs merge=lfs -text
119
+ *.unity filter=lfs diff=lfs merge=lfs -text
120
+ *.asset filter=lfs diff=lfs merge=lfs -text
121
+ *.prefab filter=lfs diff=lfs merge=lfs -text
122
+ *.physicMaterial filter=lfs diff=lfs merge=lfs -text
123
+ *.controller filter=lfs diff=lfs merge=lfs -text
124
+ *.anim filter=lfs diff=lfs merge=lfs -text
125
+
126
+ # Fonts
127
+ *.ttf filter=lfs diff=lfs merge=lfs -text
128
+ *.otf filter=lfs diff=lfs merge=lfs -text
129
+
130
+ # Compiled/packaged
131
+ *.dll filter=lfs diff=lfs merge=lfs -text
132
+ *.so filter=lfs diff=lfs merge=lfs -text
133
+ *.dylib filter=lfs diff=lfs merge=lfs -text
134
+ *.exe filter=lfs diff=lfs merge=lfs -text
135
+ *.zip filter=lfs diff=lfs merge=lfs -text
136
+ *.7z filter=lfs diff=lfs merge=lfs -text
137
+ ```
138
+
139
+ ### File Locking Protocol
140
+
141
+ Binary files cannot be merged. Two artists editing the same texture simultaneously will result in one person losing their work. File locking prevents this.
142
+
143
+ **Git LFS locking workflow:**
144
+
145
+ 1. Before editing a binary file: `git lfs lock Art/Textures/T_Rock_D.png`
146
+ 2. Edit the file in your DCC tool
147
+ 3. Stage, commit, push
148
+ 4. Release the lock: `git lfs unlock Art/Textures/T_Rock_D.png`
149
+
150
+ **Lockable file types** — add to `.gitattributes`:
151
+ ```gitattributes
152
+ # Mark files as lockable (enables lock tracking in LFS)
153
+ *.uasset lockable
154
+ *.umap lockable
155
+ *.fbx lockable
156
+ *.blend lockable
157
+ *.psd lockable
158
+ *.mb lockable
159
+ *.ma lockable
160
+ *.unity lockable
161
+ *.prefab lockable
162
+ *.asset lockable
163
+ ```
164
+
165
+ **Team locking rules:**
166
+ - Never edit a binary file without locking it first
167
+ - Check `git lfs locks` before starting work to see what is currently locked and by whom
168
+ - Do not hold locks overnight — if work is incomplete, communicate on the team channel
169
+ - Admins can force-unlock with `git lfs unlock --force --id=<lock-id>` if someone is unavailable
170
+ - CI should verify no stale locks exist older than 48 hours and send notifications
171
+
172
+ ### Asset Import Validation
173
+
174
+ Automated validation on asset import catches budget violations before they enter the build.
175
+
176
+ ```python
177
+ # asset_validator.py — Run as pre-commit hook or CI step
178
+ # Validates assets against project budgets
179
+
180
+ import os
181
+ import sys
182
+ import json
183
+ from pathlib import Path
184
+ from typing import NamedTuple
185
+
186
+ class AssetBudget(NamedTuple):
187
+ max_triangles: int = 0
188
+ max_texture_size: int = 0
189
+ max_file_size_mb: float = 0
190
+
191
+ # Project-specific budgets — adjust per project
192
+ BUDGETS = {
193
+ "meshes/props": AssetBudget(max_triangles=5000, max_file_size_mb=10),
194
+ "meshes/heroes": AssetBudget(max_triangles=20000, max_file_size_mb=50),
195
+ "meshes/environment": AssetBudget(max_triangles=10000, max_file_size_mb=30),
196
+ "textures/ui": AssetBudget(max_texture_size=512, max_file_size_mb=1),
197
+ "textures/props": AssetBudget(max_texture_size=1024, max_file_size_mb=5),
198
+ "textures/heroes": AssetBudget(max_texture_size=2048, max_file_size_mb=10),
199
+ "textures/environment": AssetBudget(max_texture_size=2048, max_file_size_mb=10),
200
+ }
201
+
202
+ # File size validation (works without engine-specific tooling)
203
+ MAX_SIZES_MB = {
204
+ ".fbx": 50, ".blend": 100, ".psd": 200,
205
+ ".png": 20, ".tga": 40, ".jpg": 10,
206
+ ".wav": 50, ".ogg": 10, ".mp3": 10,
207
+ }
208
+
209
+ def validate_file_size(filepath: Path) -> list[str]:
210
+ errors = []
211
+ ext = filepath.suffix.lower()
212
+ if ext in MAX_SIZES_MB:
213
+ size_mb = filepath.stat().st_size / (1024 * 1024)
214
+ limit = MAX_SIZES_MB[ext]
215
+ if size_mb > limit:
216
+ errors.append(
217
+ f"SIZE: {filepath.name} is {size_mb:.1f} MB "
218
+ f"(limit: {limit} MB for {ext})"
219
+ )
220
+ return errors
221
+
222
+ def validate_naming(filepath: Path) -> list[str]:
223
+ errors = []
224
+ name = filepath.stem
225
+ # Check for spaces
226
+ if " " in name:
227
+ errors.append(f"NAMING: '{name}' contains spaces — use underscores")
228
+ # Check for special characters
229
+ if not all(c.isalnum() or c in "_-" for c in name):
230
+ errors.append(f"NAMING: '{name}' has special chars — alphanumeric, _ and - only")
231
+ return errors
232
+
233
+ def main():
234
+ changed_files = sys.argv[1:] # Pass changed files from git hook
235
+ all_errors = []
236
+ for f in changed_files:
237
+ path = Path(f)
238
+ if not path.exists():
239
+ continue
240
+ all_errors.extend(validate_file_size(path))
241
+ all_errors.extend(validate_naming(path))
242
+ if all_errors:
243
+ print("ASSET VALIDATION FAILURES:")
244
+ for err in all_errors:
245
+ print(f" {err}")
246
+ sys.exit(1)
247
+ print(f"Validated {len(changed_files)} assets — all passed.")
248
+
249
+ if __name__ == "__main__":
250
+ main()
251
+ ```
252
+
253
+ ### DCC Export Standards
254
+
255
+ Each DCC tool in the pipeline needs documented export settings to ensure consistency.
256
+
257
+ **Blender to FBX export settings:**
258
+ - Scale: 1.0 (ensure Blender scene scale matches engine units — 1 unit = 1 meter for Unreal, 1 unit = 1 meter for Unity)
259
+ - Forward axis per engine:
260
+ - Unreal: -Y Forward, Z Up
261
+ - Unity: use FBX exporter 'Z Forward' setting — Unity converts to Y-Up left-handed on import
262
+ - Godot: -Z Forward, Y Up (right-handed)
263
+ Verify axis settings with a test cube export before committing to a convention. A single wrong axis setting affects every asset in the pipeline.
264
+ - Apply Modifiers: Yes
265
+ - Mesh: Triangulate Faces enabled for guaranteed triangle counts
266
+ - Armature: only include deform bones (exclude IK targets, helper bones)
267
+ - Animation: bake all actions, simplify with constant interpolation removal at 0.001 threshold
268
+ - Do NOT embed textures in FBX — reference them externally
269
+
270
+ **Substance Painter export templates:**
271
+ - Unreal template: BaseColor + Normal (DirectX) + OcclusionRoughnessMetallic (packed RGB)
272
+ - Unity URP template: Albedo + Normal (OpenGL) + MetallicSmoothness (packed, alpha = smoothness)
273
+ - Export at project texture resolution, let engine handle platform compression
274
+ - File format: PNG for lossless, TGA for legacy pipelines
275
+
276
+ **Houdini export for game assets:**
277
+ - Use GameDev Toolset (SideFX Labs) for game-focused export nodes
278
+ - Export static meshes as FBX with LOD variants as separate meshes in the same file
279
+ - Export terrain as heightmap (16-bit RAW or PNG) plus splatmap layers
280
+ - Procedural generation outputs should be deterministic — same seed, same output — so results can be cached and version-controlled
281
+
282
+ ### Texture Pipeline Details
283
+
284
+ Textures typically consume the largest share of game memory. A disciplined texture pipeline is essential.
285
+
286
+ **Texture channel packing:**
287
+ Channel packing stores multiple grayscale maps in the RGBA channels of a single texture, halving or quartering texture samples:
288
+ - **Unreal ORM**: R=Ambient Occlusion, G=Roughness, B=Metallic
289
+ - **Unity Mask Map (HDRP)**: R=Metallic, G=AO, B=Detail Mask, A=Smoothness
290
+ - **Custom packing**: R=Height, G=Roughness, B=Curvature, A=Thickness (for subsurface)
291
+
292
+ **Compression formats by platform:**
293
+ - **PC/Console**: BC7 (high quality, 8 bpp) for albedo/normal, BC5 for 2-channel normals, BC4 for grayscale masks
294
+ - **Android**: ASTC (adaptive block sizes: 4x4 for high quality, 8x8 for lower quality/smaller size), ETC2 for broad compatibility
295
+ - **iOS**: ASTC (required for all Metal-capable devices, iPhone 6 and later). PVRTC is deprecated — Apple dropped dedicated PVRTC hardware decompression in recent GPU generations. Do not use PVRTC for new projects.
296
+ - **Nintendo Switch**: ASTC is the primary format
297
+
298
+ **MIP map policy:**
299
+ - Generate mipmaps for all 3D-rendered textures (engine does this automatically)
300
+ - Disable mipmaps for UI textures and pixel-art (they cause blurring)
301
+ - For terrain textures, ensure mip bias is tuned to prevent distant terrain looking muddy
302
+
303
+ ### Audio Asset Standards
304
+
305
+ Audio is often the most neglected part of the asset pipeline, leading to bloated builds and inconsistent quality.
306
+
307
+ **Source format requirements:**
308
+ - Record and master at 48kHz/24-bit WAV minimum (archive these as golden masters)
309
+ - Game-ready export: 44.1kHz/16-bit for SFX, 44.1kHz/16-bit stereo for music
310
+ - Voice lines: 22.05kHz/16-bit mono is acceptable if storage constrained
311
+
312
+ **Compression and middleware integration:**
313
+ - FMOD/Wwise handle runtime compression — provide uncompressed WAV to the middleware
314
+ - For engine-native audio: compress to Vorbis/OGG at quality 5–7 for SFX, quality 7–9 for music
315
+ - Stream long audio (music, ambience, dialogue) rather than loading fully into memory
316
+ - Short SFX (under 2 seconds) should be decompressed on load for instant playback without decode latency
317
+
318
+ **Naming and organization:**
319
+ ```
320
+ Audio/
321
+ SFX/
322
+ Weapons/
323
+ SFX_Weapon_Sword_Swing_01.wav
324
+ SFX_Weapon_Sword_Swing_02.wav # Multiple variations for randomization
325
+ SFX_Weapon_Sword_Hit_Metal_01.wav
326
+ Footsteps/
327
+ SFX_Footstep_Dirt_01.wav
328
+ SFX_Footstep_Dirt_02.wav
329
+ SFX_Footstep_Wood_01.wav
330
+ Music/
331
+ MUS_MainMenu_Loop.wav
332
+ MUS_Level01_Explore.wav
333
+ MUS_Level01_Combat.wav
334
+ Voice/
335
+ VO_NPC_Merchant_Greet_01.wav
336
+ VO_NPC_Merchant_Greet_02.wav
337
+ Ambience/
338
+ AMB_Forest_Day.wav
339
+ AMB_Cave_Drip.wav
340
+ ```
341
+
342
+ ### Build Pipeline Integration
343
+
344
+ The asset pipeline feeds into the build system. Key integration points:
345
+
346
+ **Asset cooking/processing:**
347
+ - Unreal: `RunUAT BuildCookRun` — cooks assets for target platform (compresses textures, builds shader permutations, packages data)
348
+ - Unity: `BuildPipeline.BuildAssetBundles()` — creates platform-specific asset bundles
349
+ - Godot: Export presets handle platform-specific resource conversion
350
+
351
+ **CI asset validation checklist:**
352
+ 1. All new/modified assets pass naming convention check
353
+ 2. No binary files committed outside LFS tracking
354
+ 3. File sizes within per-type budgets
355
+ 4. Texture dimensions are power-of-2 (or explicitly exempted)
356
+ 5. No uncompressed audio files in the build (WAV masters stay in a separate archive)
357
+ 6. Import settings match project standards (compression, mip settings, LOD)
358
+ 7. No orphaned assets (referenced by nothing, consuming build size)
359
+
360
+ **Asset bundle and content addressing:**
361
+ - Use addressable assets (Unity) or soft references (Unreal) to decouple asset loading from folder structure
362
+ - Tag assets with categories for selective loading (e.g., load only Level01 assets, not all levels)
363
+ - Generate asset manifests at build time listing every asset, its size, and its load group — use this for download size estimation and DLC partitioning