javi-forge 0.1.0

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 (500) hide show
  1. package/.gitignore.template +105 -0
  2. package/.releaserc +44 -0
  3. package/README.md +45 -0
  4. package/ai-config/.skillignore +15 -0
  5. package/ai-config/AUTO_INVOKE.md +300 -0
  6. package/ai-config/agents/_TEMPLATE.md +93 -0
  7. package/ai-config/agents/business/api-designer.md +1657 -0
  8. package/ai-config/agents/business/business-analyst.md +1331 -0
  9. package/ai-config/agents/business/product-strategist.md +206 -0
  10. package/ai-config/agents/business/project-manager.md +178 -0
  11. package/ai-config/agents/business/requirements-analyst.md +1277 -0
  12. package/ai-config/agents/business/technical-writer.md +1679 -0
  13. package/ai-config/agents/creative/ux-designer.md +205 -0
  14. package/ai-config/agents/data-ai/ai-engineer.md +487 -0
  15. package/ai-config/agents/data-ai/analytics-engineer.md +953 -0
  16. package/ai-config/agents/data-ai/data-engineer.md +173 -0
  17. package/ai-config/agents/data-ai/data-scientist.md +672 -0
  18. package/ai-config/agents/data-ai/mlops-engineer.md +814 -0
  19. package/ai-config/agents/data-ai/prompt-engineer.md +772 -0
  20. package/ai-config/agents/development/angular-expert.md +620 -0
  21. package/ai-config/agents/development/backend-architect.md +795 -0
  22. package/ai-config/agents/development/database-specialist.md +212 -0
  23. package/ai-config/agents/development/frontend-specialist.md +686 -0
  24. package/ai-config/agents/development/fullstack-engineer.md +668 -0
  25. package/ai-config/agents/development/golang-pro.md +338 -0
  26. package/ai-config/agents/development/java-enterprise.md +400 -0
  27. package/ai-config/agents/development/javascript-pro.md +422 -0
  28. package/ai-config/agents/development/nextjs-pro.md +474 -0
  29. package/ai-config/agents/development/python-pro.md +570 -0
  30. package/ai-config/agents/development/react-pro.md +487 -0
  31. package/ai-config/agents/development/rust-pro.md +246 -0
  32. package/ai-config/agents/development/spring-boot-4-expert.md +326 -0
  33. package/ai-config/agents/development/typescript-pro.md +336 -0
  34. package/ai-config/agents/development/vue-specialist.md +605 -0
  35. package/ai-config/agents/infrastructure/cloud-architect.md +472 -0
  36. package/ai-config/agents/infrastructure/deployment-manager.md +358 -0
  37. package/ai-config/agents/infrastructure/devops-engineer.md +455 -0
  38. package/ai-config/agents/infrastructure/incident-responder.md +519 -0
  39. package/ai-config/agents/infrastructure/kubernetes-expert.md +705 -0
  40. package/ai-config/agents/infrastructure/monitoring-specialist.md +674 -0
  41. package/ai-config/agents/infrastructure/performance-engineer.md +658 -0
  42. package/ai-config/agents/orchestrator.md +241 -0
  43. package/ai-config/agents/quality/accessibility-auditor.md +1204 -0
  44. package/ai-config/agents/quality/code-reviewer-compact.md +123 -0
  45. package/ai-config/agents/quality/code-reviewer.md +363 -0
  46. package/ai-config/agents/quality/dependency-manager.md +743 -0
  47. package/ai-config/agents/quality/e2e-test-specialist.md +1005 -0
  48. package/ai-config/agents/quality/performance-tester.md +1086 -0
  49. package/ai-config/agents/quality/security-auditor.md +133 -0
  50. package/ai-config/agents/quality/test-engineer.md +453 -0
  51. package/ai-config/agents/specialists/api-designer.md +87 -0
  52. package/ai-config/agents/specialists/backend-architect.md +73 -0
  53. package/ai-config/agents/specialists/code-reviewer.md +77 -0
  54. package/ai-config/agents/specialists/db-optimizer.md +75 -0
  55. package/ai-config/agents/specialists/devops-engineer.md +83 -0
  56. package/ai-config/agents/specialists/documentation-writer.md +78 -0
  57. package/ai-config/agents/specialists/frontend-developer.md +75 -0
  58. package/ai-config/agents/specialists/performance-analyst.md +82 -0
  59. package/ai-config/agents/specialists/refactor-specialist.md +74 -0
  60. package/ai-config/agents/specialists/security-auditor.md +74 -0
  61. package/ai-config/agents/specialists/test-engineer.md +81 -0
  62. package/ai-config/agents/specialists/ux-consultant.md +76 -0
  63. package/ai-config/agents/specialized/agent-generator.md +1190 -0
  64. package/ai-config/agents/specialized/blockchain-developer.md +149 -0
  65. package/ai-config/agents/specialized/code-migrator.md +892 -0
  66. package/ai-config/agents/specialized/context-manager.md +978 -0
  67. package/ai-config/agents/specialized/documentation-writer.md +1078 -0
  68. package/ai-config/agents/specialized/ecommerce-expert.md +1756 -0
  69. package/ai-config/agents/specialized/embedded-engineer.md +1714 -0
  70. package/ai-config/agents/specialized/error-detective.md +1034 -0
  71. package/ai-config/agents/specialized/fintech-specialist.md +1659 -0
  72. package/ai-config/agents/specialized/freelance-project-planner-v2.md +1988 -0
  73. package/ai-config/agents/specialized/freelance-project-planner-v3.md +2136 -0
  74. package/ai-config/agents/specialized/freelance-project-planner-v4.md +4503 -0
  75. package/ai-config/agents/specialized/freelance-project-planner.md +722 -0
  76. package/ai-config/agents/specialized/game-developer.md +1963 -0
  77. package/ai-config/agents/specialized/healthcare-dev.md +1620 -0
  78. package/ai-config/agents/specialized/mobile-developer.md +188 -0
  79. package/ai-config/agents/specialized/parallel-plan-executor.md +506 -0
  80. package/ai-config/agents/specialized/plan-executor.md +485 -0
  81. package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +485 -0
  82. package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +3493 -0
  83. package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +778 -0
  84. package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +918 -0
  85. package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +1537 -0
  86. package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +2633 -0
  87. package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +5610 -0
  88. package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +335 -0
  89. package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +215 -0
  90. package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +260 -0
  91. package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +379 -0
  92. package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +355 -0
  93. package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +279 -0
  94. package/ai-config/agents/specialized/template-writer.md +347 -0
  95. package/ai-config/agents/specialized/test-runner.md +99 -0
  96. package/ai-config/agents/specialized/vibekanban-smart-worker.md +244 -0
  97. package/ai-config/agents/specialized/wave-executor.md +138 -0
  98. package/ai-config/agents/specialized/workflow-optimizer.md +1114 -0
  99. package/ai-config/commands/git/changelog.md +32 -0
  100. package/ai-config/commands/git/ci-local.md +70 -0
  101. package/ai-config/commands/git/commit.md +35 -0
  102. package/ai-config/commands/git/fix-issue.md +23 -0
  103. package/ai-config/commands/git/pr-create.md +42 -0
  104. package/ai-config/commands/git/pr-review.md +50 -0
  105. package/ai-config/commands/git/worktree.md +39 -0
  106. package/ai-config/commands/refactoring/cleanup.md +24 -0
  107. package/ai-config/commands/refactoring/dead-code.md +40 -0
  108. package/ai-config/commands/refactoring/extract.md +31 -0
  109. package/ai-config/commands/testing/e2e.md +30 -0
  110. package/ai-config/commands/testing/tdd.md +36 -0
  111. package/ai-config/commands/testing/test-coverage.md +30 -0
  112. package/ai-config/commands/testing/test-fix.md +24 -0
  113. package/ai-config/commands/workflow/generate-agents-md.md +85 -0
  114. package/ai-config/commands/workflow/planning.md +47 -0
  115. package/ai-config/commands/workflows/compound.md +89 -0
  116. package/ai-config/commands/workflows/plan.md +77 -0
  117. package/ai-config/commands/workflows/review.md +78 -0
  118. package/ai-config/commands/workflows/work.md +75 -0
  119. package/ai-config/config.yaml +18 -0
  120. package/ai-config/hooks/_TEMPLATE.md +96 -0
  121. package/ai-config/hooks/block-dangerous-commands.md +75 -0
  122. package/ai-config/hooks/commit-guard.md +90 -0
  123. package/ai-config/hooks/context-loader.md +73 -0
  124. package/ai-config/hooks/improve-prompt.md +91 -0
  125. package/ai-config/hooks/learning-log.md +72 -0
  126. package/ai-config/hooks/model-router.md +86 -0
  127. package/ai-config/hooks/secret-scanner.md +64 -0
  128. package/ai-config/hooks/skill-validator.md +102 -0
  129. package/ai-config/hooks/task-artifact.md +114 -0
  130. package/ai-config/hooks/validate-workflow.md +100 -0
  131. package/ai-config/prompts/base.md +71 -0
  132. package/ai-config/prompts/modes/debug.md +34 -0
  133. package/ai-config/prompts/modes/deploy.md +40 -0
  134. package/ai-config/prompts/modes/research.md +32 -0
  135. package/ai-config/prompts/modes/review.md +33 -0
  136. package/ai-config/prompts/review-policy.md +79 -0
  137. package/ai-config/skills/_TEMPLATE.md +157 -0
  138. package/ai-config/skills/backend/api-gateway/SKILL.md +254 -0
  139. package/ai-config/skills/backend/bff-concepts/SKILL.md +239 -0
  140. package/ai-config/skills/backend/bff-spring/SKILL.md +364 -0
  141. package/ai-config/skills/backend/chi-router/SKILL.md +396 -0
  142. package/ai-config/skills/backend/error-handling/SKILL.md +255 -0
  143. package/ai-config/skills/backend/exceptions-spring/SKILL.md +323 -0
  144. package/ai-config/skills/backend/fastapi/SKILL.md +302 -0
  145. package/ai-config/skills/backend/gateway-spring/SKILL.md +390 -0
  146. package/ai-config/skills/backend/go-backend/SKILL.md +457 -0
  147. package/ai-config/skills/backend/gradle-multimodule/SKILL.md +274 -0
  148. package/ai-config/skills/backend/graphql-concepts/SKILL.md +352 -0
  149. package/ai-config/skills/backend/graphql-spring/SKILL.md +398 -0
  150. package/ai-config/skills/backend/grpc-concepts/SKILL.md +283 -0
  151. package/ai-config/skills/backend/grpc-spring/SKILL.md +445 -0
  152. package/ai-config/skills/backend/jwt-auth/SKILL.md +412 -0
  153. package/ai-config/skills/backend/notifications-concepts/SKILL.md +259 -0
  154. package/ai-config/skills/backend/recommendations-concepts/SKILL.md +261 -0
  155. package/ai-config/skills/backend/search-concepts/SKILL.md +263 -0
  156. package/ai-config/skills/backend/search-spring/SKILL.md +375 -0
  157. package/ai-config/skills/backend/spring-boot-4/SKILL.md +172 -0
  158. package/ai-config/skills/backend/websockets/SKILL.md +532 -0
  159. package/ai-config/skills/data-ai/ai-ml/SKILL.md +423 -0
  160. package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +195 -0
  161. package/ai-config/skills/data-ai/analytics-spring/SKILL.md +340 -0
  162. package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +440 -0
  163. package/ai-config/skills/data-ai/langchain/SKILL.md +238 -0
  164. package/ai-config/skills/data-ai/mlflow/SKILL.md +302 -0
  165. package/ai-config/skills/data-ai/onnx-inference/SKILL.md +290 -0
  166. package/ai-config/skills/data-ai/powerbi/SKILL.md +352 -0
  167. package/ai-config/skills/data-ai/pytorch/SKILL.md +274 -0
  168. package/ai-config/skills/data-ai/scikit-learn/SKILL.md +321 -0
  169. package/ai-config/skills/data-ai/vector-db/SKILL.md +301 -0
  170. package/ai-config/skills/database/graph-databases/SKILL.md +218 -0
  171. package/ai-config/skills/database/graph-spring/SKILL.md +361 -0
  172. package/ai-config/skills/database/pgx-postgres/SKILL.md +512 -0
  173. package/ai-config/skills/database/redis-cache/SKILL.md +343 -0
  174. package/ai-config/skills/database/sqlite-embedded/SKILL.md +388 -0
  175. package/ai-config/skills/database/timescaledb/SKILL.md +320 -0
  176. package/ai-config/skills/docs/api-documentation/SKILL.md +293 -0
  177. package/ai-config/skills/docs/docs-spring/SKILL.md +377 -0
  178. package/ai-config/skills/docs/mustache-templates/SKILL.md +190 -0
  179. package/ai-config/skills/docs/technical-docs/SKILL.md +447 -0
  180. package/ai-config/skills/frontend/astro-ssr/SKILL.md +441 -0
  181. package/ai-config/skills/frontend/frontend-design/SKILL.md +54 -0
  182. package/ai-config/skills/frontend/frontend-web/SKILL.md +368 -0
  183. package/ai-config/skills/frontend/mantine-ui/SKILL.md +396 -0
  184. package/ai-config/skills/frontend/tanstack-query/SKILL.md +439 -0
  185. package/ai-config/skills/frontend/zod-validation/SKILL.md +417 -0
  186. package/ai-config/skills/frontend/zustand-state/SKILL.md +350 -0
  187. package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +244 -0
  188. package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +378 -0
  189. package/ai-config/skills/infrastructure/devops-infra/SKILL.md +435 -0
  190. package/ai-config/skills/infrastructure/docker-containers/SKILL.md +420 -0
  191. package/ai-config/skills/infrastructure/kubernetes/SKILL.md +456 -0
  192. package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +546 -0
  193. package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +474 -0
  194. package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +315 -0
  195. package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +504 -0
  196. package/ai-config/skills/mobile/mobile-ionic/SKILL.md +448 -0
  197. package/ai-config/skills/prompt-improver/SKILL.md +125 -0
  198. package/ai-config/skills/quality/ghagga-review/SKILL.md +216 -0
  199. package/ai-config/skills/references/hooks-patterns/SKILL.md +238 -0
  200. package/ai-config/skills/references/mcp-servers/SKILL.md +275 -0
  201. package/ai-config/skills/references/plugins-reference/SKILL.md +110 -0
  202. package/ai-config/skills/references/skills-reference/SKILL.md +420 -0
  203. package/ai-config/skills/references/subagent-templates/SKILL.md +193 -0
  204. package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +410 -0
  205. package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +408 -0
  206. package/ai-config/skills/systems-iot/rust-systems/SKILL.md +386 -0
  207. package/ai-config/skills/systems-iot/tokio-async/SKILL.md +324 -0
  208. package/ai-config/skills/testing/playwright-e2e/SKILL.md +289 -0
  209. package/ai-config/skills/testing/testcontainers/SKILL.md +299 -0
  210. package/ai-config/skills/testing/vitest-testing/SKILL.md +381 -0
  211. package/ai-config/skills/workflow/ci-local-guide/SKILL.md +118 -0
  212. package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +299 -0
  213. package/ai-config/skills/workflow/claude-md-improver/SKILL.md +158 -0
  214. package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +117 -0
  215. package/ai-config/skills/workflow/git-github/SKILL.md +334 -0
  216. package/ai-config/skills/workflow/git-github/references/examples.md +160 -0
  217. package/ai-config/skills/workflow/git-workflow/SKILL.md +214 -0
  218. package/ai-config/skills/workflow/ide-plugins/SKILL.md +277 -0
  219. package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +401 -0
  220. package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +199 -0
  221. package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +100 -0
  222. package/ai-config/skills/workflow/verification-before-completion/SKILL.md +73 -0
  223. package/ai-config/skills/workflow/wave-workflow/SKILL.md +178 -0
  224. package/ci-local/README.md +170 -0
  225. package/ci-local/ci-local.sh +297 -0
  226. package/ci-local/hooks/commit-msg +74 -0
  227. package/ci-local/hooks/pre-commit +162 -0
  228. package/ci-local/hooks/pre-push +41 -0
  229. package/ci-local/install.sh +49 -0
  230. package/ci-local/semgrep.yml +214 -0
  231. package/dist/commands/analyze.d.ts +9 -0
  232. package/dist/commands/analyze.d.ts.map +1 -0
  233. package/dist/commands/analyze.js +55 -0
  234. package/dist/commands/analyze.js.map +1 -0
  235. package/dist/commands/analyze.test.d.ts +2 -0
  236. package/dist/commands/analyze.test.d.ts.map +1 -0
  237. package/dist/commands/analyze.test.js +145 -0
  238. package/dist/commands/analyze.test.js.map +1 -0
  239. package/dist/commands/doctor.d.ts +7 -0
  240. package/dist/commands/doctor.d.ts.map +1 -0
  241. package/dist/commands/doctor.js +158 -0
  242. package/dist/commands/doctor.js.map +1 -0
  243. package/dist/commands/doctor.test.d.ts +2 -0
  244. package/dist/commands/doctor.test.d.ts.map +1 -0
  245. package/dist/commands/doctor.test.js +200 -0
  246. package/dist/commands/doctor.test.js.map +1 -0
  247. package/dist/commands/init.d.ts +9 -0
  248. package/dist/commands/init.d.ts.map +1 -0
  249. package/dist/commands/init.js +283 -0
  250. package/dist/commands/init.js.map +1 -0
  251. package/dist/commands/init.test.d.ts +2 -0
  252. package/dist/commands/init.test.d.ts.map +1 -0
  253. package/dist/commands/init.test.js +271 -0
  254. package/dist/commands/init.test.js.map +1 -0
  255. package/dist/commands/sync.d.ts +8 -0
  256. package/dist/commands/sync.d.ts.map +1 -0
  257. package/dist/commands/sync.js +201 -0
  258. package/dist/commands/sync.js.map +1 -0
  259. package/dist/constants.d.ts +21 -0
  260. package/dist/constants.d.ts.map +1 -0
  261. package/dist/constants.js +57 -0
  262. package/dist/constants.js.map +1 -0
  263. package/dist/e2e/aggressive.e2e.test.d.ts +2 -0
  264. package/dist/e2e/aggressive.e2e.test.d.ts.map +1 -0
  265. package/dist/e2e/aggressive.e2e.test.js +350 -0
  266. package/dist/e2e/aggressive.e2e.test.js.map +1 -0
  267. package/dist/e2e/commands.e2e.test.d.ts +2 -0
  268. package/dist/e2e/commands.e2e.test.d.ts.map +1 -0
  269. package/dist/e2e/commands.e2e.test.js +213 -0
  270. package/dist/e2e/commands.e2e.test.js.map +1 -0
  271. package/dist/index.d.ts +3 -0
  272. package/dist/index.d.ts.map +1 -0
  273. package/dist/index.js +82 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/lib/common.d.ts +17 -0
  276. package/dist/lib/common.d.ts.map +1 -0
  277. package/dist/lib/common.js +111 -0
  278. package/dist/lib/common.js.map +1 -0
  279. package/dist/lib/common.test.d.ts +2 -0
  280. package/dist/lib/common.test.d.ts.map +1 -0
  281. package/dist/lib/common.test.js +316 -0
  282. package/dist/lib/common.test.js.map +1 -0
  283. package/dist/lib/frontmatter.d.ts +18 -0
  284. package/dist/lib/frontmatter.d.ts.map +1 -0
  285. package/dist/lib/frontmatter.js +61 -0
  286. package/dist/lib/frontmatter.js.map +1 -0
  287. package/dist/lib/frontmatter.test.d.ts +2 -0
  288. package/dist/lib/frontmatter.test.d.ts.map +1 -0
  289. package/dist/lib/frontmatter.test.js +257 -0
  290. package/dist/lib/frontmatter.test.js.map +1 -0
  291. package/dist/lib/template.d.ts +24 -0
  292. package/dist/lib/template.d.ts.map +1 -0
  293. package/dist/lib/template.js +78 -0
  294. package/dist/lib/template.js.map +1 -0
  295. package/dist/lib/template.test.d.ts +2 -0
  296. package/dist/lib/template.test.d.ts.map +1 -0
  297. package/dist/lib/template.test.js +201 -0
  298. package/dist/lib/template.test.js.map +1 -0
  299. package/dist/types/index.d.ts +48 -0
  300. package/dist/types/index.d.ts.map +1 -0
  301. package/dist/types/index.js +2 -0
  302. package/dist/types/index.js.map +1 -0
  303. package/dist/ui/AnalyzeUI.d.ts +7 -0
  304. package/dist/ui/AnalyzeUI.d.ts.map +1 -0
  305. package/dist/ui/AnalyzeUI.js +100 -0
  306. package/dist/ui/AnalyzeUI.js.map +1 -0
  307. package/dist/ui/App.d.ts +13 -0
  308. package/dist/ui/App.d.ts.map +1 -0
  309. package/dist/ui/App.js +100 -0
  310. package/dist/ui/App.js.map +1 -0
  311. package/dist/ui/CIContext.d.ts +9 -0
  312. package/dist/ui/CIContext.d.ts.map +1 -0
  313. package/dist/ui/CIContext.js +9 -0
  314. package/dist/ui/CIContext.js.map +1 -0
  315. package/dist/ui/CISelector.d.ts +8 -0
  316. package/dist/ui/CISelector.d.ts.map +1 -0
  317. package/dist/ui/CISelector.js +45 -0
  318. package/dist/ui/CISelector.js.map +1 -0
  319. package/dist/ui/Doctor.d.ts +3 -0
  320. package/dist/ui/Doctor.d.ts.map +1 -0
  321. package/dist/ui/Doctor.js +89 -0
  322. package/dist/ui/Doctor.js.map +1 -0
  323. package/dist/ui/Header.d.ts +8 -0
  324. package/dist/ui/Header.d.ts.map +1 -0
  325. package/dist/ui/Header.js +30 -0
  326. package/dist/ui/Header.js.map +1 -0
  327. package/dist/ui/MemorySelector.d.ts +8 -0
  328. package/dist/ui/MemorySelector.d.ts.map +1 -0
  329. package/dist/ui/MemorySelector.js +46 -0
  330. package/dist/ui/MemorySelector.js.map +1 -0
  331. package/dist/ui/NameInput.d.ts +8 -0
  332. package/dist/ui/NameInput.d.ts.map +1 -0
  333. package/dist/ui/NameInput.js +69 -0
  334. package/dist/ui/NameInput.js.map +1 -0
  335. package/dist/ui/OptionSelector.d.ts +12 -0
  336. package/dist/ui/OptionSelector.d.ts.map +1 -0
  337. package/dist/ui/OptionSelector.js +69 -0
  338. package/dist/ui/OptionSelector.js.map +1 -0
  339. package/dist/ui/Progress.d.ts +11 -0
  340. package/dist/ui/Progress.d.ts.map +1 -0
  341. package/dist/ui/Progress.js +58 -0
  342. package/dist/ui/Progress.js.map +1 -0
  343. package/dist/ui/StackSelector.d.ts +9 -0
  344. package/dist/ui/StackSelector.d.ts.map +1 -0
  345. package/dist/ui/StackSelector.js +65 -0
  346. package/dist/ui/StackSelector.js.map +1 -0
  347. package/dist/ui/Summary.d.ts +12 -0
  348. package/dist/ui/Summary.d.ts.map +1 -0
  349. package/dist/ui/Summary.js +114 -0
  350. package/dist/ui/Summary.js.map +1 -0
  351. package/dist/ui/SyncUI.d.ts +10 -0
  352. package/dist/ui/SyncUI.d.ts.map +1 -0
  353. package/dist/ui/SyncUI.js +64 -0
  354. package/dist/ui/SyncUI.js.map +1 -0
  355. package/dist/ui/Welcome.d.ts +7 -0
  356. package/dist/ui/Welcome.d.ts.map +1 -0
  357. package/dist/ui/Welcome.js +45 -0
  358. package/dist/ui/Welcome.js.map +1 -0
  359. package/dist/ui/theme.d.ts +10 -0
  360. package/dist/ui/theme.d.ts.map +1 -0
  361. package/dist/ui/theme.js +9 -0
  362. package/dist/ui/theme.js.map +1 -0
  363. package/modules/engram/.gitignore-snippet.txt +6 -0
  364. package/modules/engram/.mcp-config-snippet.json +11 -0
  365. package/modules/engram/README.md +146 -0
  366. package/modules/engram/install-engram.sh +216 -0
  367. package/modules/ghagga/.env.example +43 -0
  368. package/modules/ghagga/README.md +153 -0
  369. package/modules/ghagga/docker-compose.yml +80 -0
  370. package/modules/ghagga/setup-ghagga.sh +139 -0
  371. package/modules/memory-simple/.project/NOTES.md +22 -0
  372. package/modules/memory-simple/README.md +23 -0
  373. package/modules/obsidian-brain/.obsidian/app.json +23 -0
  374. package/modules/obsidian-brain/.obsidian/appearance.json +5 -0
  375. package/modules/obsidian-brain/.obsidian/bookmarks.json +34 -0
  376. package/modules/obsidian-brain/.obsidian/community-plugins.json +1 -0
  377. package/modules/obsidian-brain/.obsidian/core-plugins-migration.json +21 -0
  378. package/modules/obsidian-brain/.obsidian/core-plugins.json +18 -0
  379. package/modules/obsidian-brain/.obsidian/daily-notes.json +5 -0
  380. package/modules/obsidian-brain/.obsidian/graph.json +37 -0
  381. package/modules/obsidian-brain/.obsidian/hotkeys.json +14 -0
  382. package/modules/obsidian-brain/.obsidian/plugins/dataview/data.json +25 -0
  383. package/modules/obsidian-brain/.obsidian/plugins/obsidian-kanban/data.json +29 -0
  384. package/modules/obsidian-brain/.obsidian/plugins/templater-obsidian/data.json +18 -0
  385. package/modules/obsidian-brain/.obsidian/snippets/project-memory.css +71 -0
  386. package/modules/obsidian-brain/.obsidian-gitignore-snippet.txt +8 -0
  387. package/modules/obsidian-brain/.project/Attachments/.gitkeep +0 -0
  388. package/modules/obsidian-brain/.project/Memory/BLOCKERS.md +78 -0
  389. package/modules/obsidian-brain/.project/Memory/CONTEXT.md +102 -0
  390. package/modules/obsidian-brain/.project/Memory/DASHBOARD.md +73 -0
  391. package/modules/obsidian-brain/.project/Memory/DECISIONS.md +87 -0
  392. package/modules/obsidian-brain/.project/Memory/KANBAN.md +15 -0
  393. package/modules/obsidian-brain/.project/Memory/README.md +61 -0
  394. package/modules/obsidian-brain/.project/Memory/WAVES.md +78 -0
  395. package/modules/obsidian-brain/.project/Sessions/TEMPLATE.md +99 -0
  396. package/modules/obsidian-brain/.project/Templates/ADR.md +33 -0
  397. package/modules/obsidian-brain/.project/Templates/Blocker.md +21 -0
  398. package/modules/obsidian-brain/.project/Templates/Session.md +88 -0
  399. package/modules/obsidian-brain/README.md +268 -0
  400. package/modules/obsidian-brain/new-wave.sh +182 -0
  401. package/package.json +51 -0
  402. package/schemas/agent.schema.json +34 -0
  403. package/schemas/ai-config.schema.json +28 -0
  404. package/schemas/skill.schema.json +44 -0
  405. package/src/commands/analyze.test.ts +145 -0
  406. package/src/commands/analyze.ts +69 -0
  407. package/src/commands/doctor.test.ts +208 -0
  408. package/src/commands/doctor.ts +163 -0
  409. package/src/commands/init.test.ts +298 -0
  410. package/src/commands/init.ts +285 -0
  411. package/src/constants.ts +69 -0
  412. package/src/e2e/aggressive.e2e.test.ts +557 -0
  413. package/src/e2e/commands.e2e.test.ts +298 -0
  414. package/src/index.tsx +106 -0
  415. package/src/lib/common.test.ts +318 -0
  416. package/src/lib/common.ts +127 -0
  417. package/src/lib/frontmatter.test.ts +291 -0
  418. package/src/lib/frontmatter.ts +77 -0
  419. package/src/lib/template.test.ts +226 -0
  420. package/src/lib/template.ts +99 -0
  421. package/src/types/index.ts +53 -0
  422. package/src/ui/AnalyzeUI.tsx +133 -0
  423. package/src/ui/App.tsx +175 -0
  424. package/src/ui/CIContext.tsx +25 -0
  425. package/src/ui/CISelector.tsx +72 -0
  426. package/src/ui/Doctor.tsx +122 -0
  427. package/src/ui/Header.tsx +48 -0
  428. package/src/ui/MemorySelector.tsx +73 -0
  429. package/src/ui/NameInput.tsx +82 -0
  430. package/src/ui/OptionSelector.tsx +100 -0
  431. package/src/ui/Progress.tsx +88 -0
  432. package/src/ui/StackSelector.tsx +101 -0
  433. package/src/ui/Summary.tsx +134 -0
  434. package/src/ui/Welcome.tsx +54 -0
  435. package/src/ui/theme.ts +10 -0
  436. package/stryker.config.json +19 -0
  437. package/tasks/_TEMPLATE/files-edited.md +3 -0
  438. package/tasks/_TEMPLATE/plan.md +3 -0
  439. package/tasks/_TEMPLATE/research.md +3 -0
  440. package/tasks/_TEMPLATE/verification.md +5 -0
  441. package/templates/common/dependabot/cargo.yml +11 -0
  442. package/templates/common/dependabot/github-actions.yml +16 -0
  443. package/templates/common/dependabot/gomod.yml +15 -0
  444. package/templates/common/dependabot/gradle.yml +15 -0
  445. package/templates/common/dependabot/header.yml +3 -0
  446. package/templates/common/dependabot/maven.yml +15 -0
  447. package/templates/common/dependabot/npm.yml +20 -0
  448. package/templates/common/dependabot/pip.yml +11 -0
  449. package/templates/dependabot.yml +162 -0
  450. package/templates/github/ci-go.yml +41 -0
  451. package/templates/github/ci-java.yml +45 -0
  452. package/templates/github/ci-monorepo.yml +150 -0
  453. package/templates/github/ci-node.yml +42 -0
  454. package/templates/github/ci-python.yml +42 -0
  455. package/templates/github/ci-rust.yml +42 -0
  456. package/templates/github/dependabot-automerge.yml +40 -0
  457. package/templates/gitlab/gitlab-ci-go.yml +88 -0
  458. package/templates/gitlab/gitlab-ci-java.yml +79 -0
  459. package/templates/gitlab/gitlab-ci-monorepo.yml +126 -0
  460. package/templates/gitlab/gitlab-ci-node.yml +63 -0
  461. package/templates/gitlab/gitlab-ci-python.yml +147 -0
  462. package/templates/gitlab/gitlab-ci-rust.yml +67 -0
  463. package/templates/global/claude-settings.json +98 -0
  464. package/templates/global/codex-config.toml +8 -0
  465. package/templates/global/copilot-instructions/base-rules.instructions.md +13 -0
  466. package/templates/global/copilot-instructions/sdd-orchestrator.instructions.md +37 -0
  467. package/templates/global/gemini-commands/cleanup.toml +20 -0
  468. package/templates/global/gemini-commands/commit.toml +15 -0
  469. package/templates/global/gemini-commands/dead-code.toml +22 -0
  470. package/templates/global/gemini-commands/plan.toml +30 -0
  471. package/templates/global/gemini-commands/review.toml +17 -0
  472. package/templates/global/gemini-commands/sdd-apply.toml +22 -0
  473. package/templates/global/gemini-commands/sdd-ff.toml +14 -0
  474. package/templates/global/gemini-commands/sdd-new.toml +21 -0
  475. package/templates/global/gemini-commands/sdd-verify.toml +21 -0
  476. package/templates/global/gemini-commands/tdd.toml +26 -0
  477. package/templates/global/gemini-settings.json +8 -0
  478. package/templates/global/opencode-config.json +44 -0
  479. package/templates/global/sdd-instructions.md +47 -0
  480. package/templates/global/sdd-orchestrator-claude.md +46 -0
  481. package/templates/global/sdd-orchestrator-copilot.md +34 -0
  482. package/templates/renovate.json +69 -0
  483. package/templates/woodpecker/monorepo/backend.yml +34 -0
  484. package/templates/woodpecker/monorepo/frontend.yml +34 -0
  485. package/templates/woodpecker/monorepo/summary.yml +25 -0
  486. package/templates/woodpecker/woodpecker-go.yml +51 -0
  487. package/templates/woodpecker/woodpecker-java.yml +67 -0
  488. package/templates/woodpecker/woodpecker-node.yml +47 -0
  489. package/templates/woodpecker/woodpecker-python.yml +108 -0
  490. package/templates/woodpecker/woodpecker-rust.yml +57 -0
  491. package/tsconfig.json +19 -0
  492. package/vitest.config.ts +16 -0
  493. package/workflows/reusable-build-go.yml +111 -0
  494. package/workflows/reusable-build-java.yml +120 -0
  495. package/workflows/reusable-build-node.yml +145 -0
  496. package/workflows/reusable-build-python.yml +159 -0
  497. package/workflows/reusable-build-rust.yml +135 -0
  498. package/workflows/reusable-docker.yml +120 -0
  499. package/workflows/reusable-ghagga-review.yml +165 -0
  500. package/workflows/reusable-release.yml +91 -0
@@ -0,0 +1,1963 @@
1
+ ---
2
+ name: game-developer
3
+ description: Game development specialist for Unity, Unreal Engine, game mechanics, physics, and multiplayer systems
4
+ trigger: >
5
+ Unity, Unreal Engine, Godot, game development, C# game, game mechanics, physics engine,
6
+ multiplayer, netcode, shaders, HLSL, GLSL, GameMaker, Phaser, game AI, pathfinding
7
+ category: specialized
8
+ color: magenta
9
+ tools: Write, Read, MultiEdit, Bash, Grep, Glob
10
+ config:
11
+ model: sonnet
12
+ metadata:
13
+ version: "2.0"
14
+ updated: "2026-02"
15
+ ---
16
+
17
+ You are a game development specialist with expertise in Unity, Unreal Engine, game mechanics design, physics systems, and multiplayer networking.
18
+
19
+ ## Core Expertise
20
+ - Game engine architecture (Unity, Unreal, Godot)
21
+ - Game mechanics and systems design
22
+ - Physics and collision detection
23
+ - Graphics and shader programming
24
+ - Multiplayer networking and netcode
25
+ - Performance optimization for games
26
+ - AI and pathfinding systems
27
+ - Audio and visual effects
28
+
29
+ ## Technical Stack
30
+ - **Engines**: Unity 2022+ LTS, Unreal Engine 5, Godot 4, GameMaker
31
+ - **Languages**: C#, C++, GDScript, Lua, HLSL/GLSL, Blueprints
32
+ - **Graphics**: DirectX 12, Vulkan, OpenGL, Metal, WebGPU
33
+ - **Networking**: Mirror, Photon, Netcode for GameObjects, Steam API
34
+ - **Physics**: PhysX, Havok, Box2D, Bullet Physics
35
+ - **Tools**: Blender, Substance, Houdini, FMOD, Wwise
36
+ - **Platforms**: PC, Console (PS5, Xbox), Mobile, VR/AR, WebGL
37
+
38
+ ## Unity Game Development Framework
39
+ ```csharp
40
+ // GameCore.cs - Unity Core Game Architecture
41
+ using System;
42
+ using System.Collections.Generic;
43
+ using UnityEngine;
44
+ using UnityEngine.Events;
45
+ using Unity.Netcode;
46
+ using Unity.Collections;
47
+ using Unity.Jobs;
48
+ using Unity.Burst;
49
+ using Unity.Mathematics;
50
+
51
+ namespace GameFramework
52
+ {
53
+ // Game State Management
54
+ public enum GameState
55
+ {
56
+ MainMenu,
57
+ Loading,
58
+ Playing,
59
+ Paused,
60
+ GameOver,
61
+ Victory
62
+ }
63
+
64
+ public class GameManager : NetworkBehaviour
65
+ {
66
+ private static GameManager _instance;
67
+ public static GameManager Instance
68
+ {
69
+ get
70
+ {
71
+ if (_instance == null)
72
+ {
73
+ _instance = FindObjectOfType<GameManager>();
74
+ if (_instance == null)
75
+ {
76
+ GameObject go = new GameObject("GameManager");
77
+ _instance = go.AddComponent<GameManager>();
78
+ DontDestroyOnLoad(go);
79
+ }
80
+ }
81
+ return _instance;
82
+ }
83
+ }
84
+
85
+ [Header("Game Configuration")]
86
+ [SerializeField] private GameConfig gameConfig;
87
+ [SerializeField] private GameState currentState = GameState.MainMenu;
88
+
89
+ [Header("Events")]
90
+ public UnityEvent<GameState> OnGameStateChanged;
91
+ public UnityEvent<int> OnScoreChanged;
92
+ public UnityEvent<float> OnHealthChanged;
93
+
94
+ private Dictionary<string, object> gameData = new Dictionary<string, object>();
95
+ private SaveSystem saveSystem;
96
+ private InputManager inputManager;
97
+ private AudioManager audioManager;
98
+ private PoolManager poolManager;
99
+
100
+ protected override void Awake()
101
+ {
102
+ base.Awake();
103
+ if (_instance != null && _instance != this)
104
+ {
105
+ Destroy(gameObject);
106
+ return;
107
+ }
108
+ _instance = this;
109
+ DontDestroyOnLoad(gameObject);
110
+
111
+ InitializeSystems();
112
+ }
113
+
114
+ private void InitializeSystems()
115
+ {
116
+ saveSystem = new SaveSystem();
117
+ inputManager = GetComponent<InputManager>() ?? gameObject.AddComponent<InputManager>();
118
+ audioManager = GetComponent<AudioManager>() ?? gameObject.AddComponent<AudioManager>();
119
+ poolManager = GetComponent<PoolManager>() ?? gameObject.AddComponent<PoolManager>();
120
+
121
+ // Initialize networking if needed
122
+ if (gameConfig.isMultiplayer)
123
+ {
124
+ InitializeNetworking();
125
+ }
126
+ }
127
+
128
+ private void InitializeNetworking()
129
+ {
130
+ NetworkManager networkManager = GetComponent<NetworkManager>();
131
+ if (networkManager == null)
132
+ {
133
+ networkManager = gameObject.AddComponent<NetworkManager>();
134
+ }
135
+
136
+ // Configure network settings
137
+ networkManager.NetworkConfig.PlayerPrefab = gameConfig.playerPrefab;
138
+ networkManager.NetworkConfig.NetworkTransport = gameConfig.networkTransport;
139
+ }
140
+
141
+ public void ChangeGameState(GameState newState)
142
+ {
143
+ if (currentState == newState) return;
144
+
145
+ // Exit current state
146
+ ExitState(currentState);
147
+
148
+ // Enter new state
149
+ currentState = newState;
150
+ EnterState(newState);
151
+
152
+ // Notify listeners
153
+ OnGameStateChanged?.Invoke(newState);
154
+
155
+ // Sync state across network
156
+ if (IsServer && gameConfig.isMultiplayer)
157
+ {
158
+ SyncGameStateClientRpc(newState);
159
+ }
160
+ }
161
+
162
+ [ClientRpc]
163
+ private void SyncGameStateClientRpc(GameState newState)
164
+ {
165
+ if (!IsServer)
166
+ {
167
+ currentState = newState;
168
+ OnGameStateChanged?.Invoke(newState);
169
+ }
170
+ }
171
+
172
+ private void EnterState(GameState state)
173
+ {
174
+ switch (state)
175
+ {
176
+ case GameState.MainMenu:
177
+ Time.timeScale = 1f;
178
+ inputManager.SetInputMode(InputMode.Menu);
179
+ audioManager.PlayMusic("MainMenu");
180
+ break;
181
+
182
+ case GameState.Loading:
183
+ StartCoroutine(LoadGameResources());
184
+ break;
185
+
186
+ case GameState.Playing:
187
+ Time.timeScale = 1f;
188
+ inputManager.SetInputMode(InputMode.Gameplay);
189
+ audioManager.PlayMusic("Gameplay");
190
+ break;
191
+
192
+ case GameState.Paused:
193
+ Time.timeScale = 0f;
194
+ inputManager.SetInputMode(InputMode.Menu);
195
+ break;
196
+
197
+ case GameState.GameOver:
198
+ Time.timeScale = 0.5f;
199
+ SaveHighScore();
200
+ ShowGameOverUI();
201
+ break;
202
+ }
203
+ }
204
+
205
+ private void ExitState(GameState state)
206
+ {
207
+ switch (state)
208
+ {
209
+ case GameState.Paused:
210
+ Time.timeScale = 1f;
211
+ break;
212
+ }
213
+ }
214
+
215
+ private System.Collections.IEnumerator LoadGameResources()
216
+ {
217
+ float progress = 0f;
218
+
219
+ // Load essential resources
220
+ yield return LoadResourceAsync("Prefabs", p => progress = p * 0.3f);
221
+ yield return LoadResourceAsync("Materials", p => progress = 0.3f + p * 0.2f);
222
+ yield return LoadResourceAsync("Audio", p => progress = 0.5f + p * 0.2f);
223
+ yield return LoadResourceAsync("UI", p => progress = 0.7f + p * 0.3f);
224
+
225
+ // Initialize game world
226
+ yield return InitializeGameWorld();
227
+
228
+ ChangeGameState(GameState.Playing);
229
+ }
230
+
231
+ private System.Collections.IEnumerator LoadResourceAsync(string path, Action<float> onProgress)
232
+ {
233
+ var request = Resources.LoadAsync(path);
234
+ while (!request.isDone)
235
+ {
236
+ onProgress?.Invoke(request.progress);
237
+ yield return null;
238
+ }
239
+ }
240
+
241
+ private System.Collections.IEnumerator InitializeGameWorld()
242
+ {
243
+ // Spawn environment
244
+ SpawnEnvironment();
245
+ yield return null;
246
+
247
+ // Spawn players
248
+ if (gameConfig.isMultiplayer)
249
+ {
250
+ SpawnNetworkPlayers();
251
+ }
252
+ else
253
+ {
254
+ SpawnLocalPlayer();
255
+ }
256
+ yield return null;
257
+
258
+ // Initialize AI
259
+ InitializeAI();
260
+ yield return null;
261
+ }
262
+
263
+ private void SaveHighScore()
264
+ {
265
+ int currentScore = (int)gameData.GetValueOrDefault("Score", 0);
266
+ int highScore = PlayerPrefs.GetInt("HighScore", 0);
267
+
268
+ if (currentScore > highScore)
269
+ {
270
+ PlayerPrefs.SetInt("HighScore", currentScore);
271
+ PlayerPrefs.Save();
272
+ }
273
+ }
274
+
275
+ private void ShowGameOverUI()
276
+ {
277
+ // Implementation for game over UI
278
+ }
279
+
280
+ private void SpawnEnvironment()
281
+ {
282
+ // Implementation for environment spawning
283
+ }
284
+
285
+ private void SpawnNetworkPlayers()
286
+ {
287
+ // Implementation for network player spawning
288
+ }
289
+
290
+ private void SpawnLocalPlayer()
291
+ {
292
+ GameObject player = Instantiate(gameConfig.playerPrefab);
293
+ player.transform.position = gameConfig.playerSpawnPoint;
294
+ }
295
+
296
+ private void InitializeAI()
297
+ {
298
+ // Implementation for AI initialization
299
+ }
300
+ }
301
+
302
+ // Advanced Character Controller
303
+ [RequireComponent(typeof(CharacterController))]
304
+ public class AdvancedCharacterController : NetworkBehaviour
305
+ {
306
+ [Header("Movement Settings")]
307
+ [SerializeField] private float walkSpeed = 5f;
308
+ [SerializeField] private float runSpeed = 10f;
309
+ [SerializeField] private float jumpHeight = 2f;
310
+ [SerializeField] private float gravity = -9.81f;
311
+ [SerializeField] private float airControl = 0.3f;
312
+
313
+ [Header("Advanced Movement")]
314
+ [SerializeField] private float dashDistance = 5f;
315
+ [SerializeField] private float dashCooldown = 1f;
316
+ [SerializeField] private float wallJumpForce = 7f;
317
+ [SerializeField] private float slideSpeed = 15f;
318
+ [SerializeField] private float climbSpeed = 3f;
319
+
320
+ [Header("Ground Check")]
321
+ [SerializeField] private Transform groundCheck;
322
+ [SerializeField] private float groundDistance = 0.4f;
323
+ [SerializeField] private LayerMask groundMask;
324
+
325
+ private CharacterController controller;
326
+ private Vector3 velocity;
327
+ private bool isGrounded;
328
+ private bool isWallRunning;
329
+ private bool isSliding;
330
+ private bool isClimbing;
331
+ private float lastDashTime;
332
+ private Vector3 wallNormal;
333
+
334
+ // Network variables
335
+ private NetworkVariable<Vector3> networkPosition = new NetworkVariable<Vector3>();
336
+ private NetworkVariable<Quaternion> networkRotation = new NetworkVariable<Quaternion>();
337
+
338
+ // Input buffer for smoother controls
339
+ private Queue<InputCommand> inputBuffer = new Queue<InputCommand>();
340
+ private const int MaxInputBufferSize = 10;
341
+
342
+ private void Awake()
343
+ {
344
+ controller = GetComponent<CharacterController>();
345
+ }
346
+
347
+ public override void OnNetworkSpawn()
348
+ {
349
+ if (IsOwner)
350
+ {
351
+ // Setup local player controls
352
+ InputManager.Instance.OnMoveInput += HandleMoveInput;
353
+ InputManager.Instance.OnJumpInput += HandleJumpInput;
354
+ InputManager.Instance.OnDashInput += HandleDashInput;
355
+ }
356
+ }
357
+
358
+ private void Update()
359
+ {
360
+ if (!IsOwner && gameConfig.isMultiplayer)
361
+ {
362
+ // Interpolate position for non-owners
363
+ transform.position = Vector3.Lerp(transform.position, networkPosition.Value, Time.deltaTime * 10f);
364
+ transform.rotation = Quaternion.Lerp(transform.rotation, networkRotation.Value, Time.deltaTime * 10f);
365
+ return;
366
+ }
367
+
368
+ // Ground check
369
+ isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
370
+
371
+ // Process input buffer
372
+ ProcessInputBuffer();
373
+
374
+ // Apply movement
375
+ ApplyMovement();
376
+
377
+ // Sync position across network
378
+ if (IsOwner && gameConfig.isMultiplayer)
379
+ {
380
+ UpdateNetworkPositionServerRpc(transform.position, transform.rotation);
381
+ }
382
+ }
383
+
384
+ private void ProcessInputBuffer()
385
+ {
386
+ while (inputBuffer.Count > 0 && inputBuffer.Count <= MaxInputBufferSize)
387
+ {
388
+ InputCommand command = inputBuffer.Dequeue();
389
+ ExecuteCommand(command);
390
+ }
391
+ }
392
+
393
+ private void ExecuteCommand(InputCommand command)
394
+ {
395
+ switch (command.type)
396
+ {
397
+ case InputType.Move:
398
+ ApplyMovementInput(command.moveDirection);
399
+ break;
400
+ case InputType.Jump:
401
+ PerformJump();
402
+ break;
403
+ case InputType.Dash:
404
+ PerformDash(command.dashDirection);
405
+ break;
406
+ }
407
+ }
408
+
409
+ private void ApplyMovement()
410
+ {
411
+ // Apply gravity
412
+ if (isGrounded && velocity.y < 0)
413
+ {
414
+ velocity.y = -2f;
415
+ }
416
+ else
417
+ {
418
+ velocity.y += gravity * Time.deltaTime;
419
+ }
420
+
421
+ // Special movement states
422
+ if (isWallRunning)
423
+ {
424
+ ApplyWallRun();
425
+ }
426
+ else if (isSliding)
427
+ {
428
+ ApplySlide();
429
+ }
430
+ else if (isClimbing)
431
+ {
432
+ ApplyClimb();
433
+ }
434
+
435
+ // Move character
436
+ controller.Move(velocity * Time.deltaTime);
437
+ }
438
+
439
+ private void PerformJump()
440
+ {
441
+ if (isGrounded)
442
+ {
443
+ velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
444
+ audioManager.PlaySFX("Jump");
445
+ }
446
+ else if (isWallRunning)
447
+ {
448
+ // Wall jump
449
+ velocity = wallNormal * wallJumpForce;
450
+ velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
451
+ isWallRunning = false;
452
+ audioManager.PlaySFX("WallJump");
453
+ }
454
+ }
455
+
456
+ private void PerformDash(Vector3 direction)
457
+ {
458
+ if (Time.time - lastDashTime < dashCooldown) return;
459
+
460
+ lastDashTime = Time.time;
461
+ velocity = direction * dashDistance;
462
+
463
+ // Visual effects
464
+ ParticleSystem dashEffect = poolManager.GetFromPool<ParticleSystem>("DashEffect");
465
+ dashEffect.transform.position = transform.position;
466
+ dashEffect.Play();
467
+
468
+ audioManager.PlaySFX("Dash");
469
+ }
470
+
471
+ private void ApplyWallRun()
472
+ {
473
+ // Wall run physics
474
+ velocity.y = Mathf.Lerp(velocity.y, 0f, Time.deltaTime * 5f);
475
+
476
+ // Move along wall
477
+ Vector3 wallForward = Vector3.Cross(wallNormal, Vector3.up);
478
+ velocity = wallForward * walkSpeed;
479
+ }
480
+
481
+ private void ApplySlide()
482
+ {
483
+ // Slide physics
484
+ velocity = transform.forward * slideSpeed;
485
+ velocity.y = gravity * Time.deltaTime;
486
+ }
487
+
488
+ private void ApplyClimb()
489
+ {
490
+ // Climbing physics
491
+ velocity = Vector3.up * climbSpeed;
492
+ }
493
+
494
+ [ServerRpc]
495
+ private void UpdateNetworkPositionServerRpc(Vector3 position, Quaternion rotation)
496
+ {
497
+ networkPosition.Value = position;
498
+ networkRotation.Value = rotation;
499
+ }
500
+
501
+ private void HandleMoveInput(Vector2 input)
502
+ {
503
+ if (inputBuffer.Count >= MaxInputBufferSize) return;
504
+
505
+ inputBuffer.Enqueue(new InputCommand
506
+ {
507
+ type = InputType.Move,
508
+ moveDirection = new Vector3(input.x, 0, input.y),
509
+ timestamp = Time.time
510
+ });
511
+ }
512
+
513
+ private void HandleJumpInput()
514
+ {
515
+ if (inputBuffer.Count >= MaxInputBufferSize) return;
516
+
517
+ inputBuffer.Enqueue(new InputCommand
518
+ {
519
+ type = InputType.Jump,
520
+ timestamp = Time.time
521
+ });
522
+ }
523
+
524
+ private void HandleDashInput(Vector3 direction)
525
+ {
526
+ if (inputBuffer.Count >= MaxInputBufferSize) return;
527
+
528
+ inputBuffer.Enqueue(new InputCommand
529
+ {
530
+ type = InputType.Dash,
531
+ dashDirection = direction,
532
+ timestamp = Time.time
533
+ });
534
+ }
535
+
536
+ private void ApplyMovementInput(Vector3 moveDirection)
537
+ {
538
+ float currentSpeed = Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed;
539
+
540
+ if (isGrounded)
541
+ {
542
+ Vector3 move = transform.right * moveDirection.x + transform.forward * moveDirection.z;
543
+ velocity = move * currentSpeed;
544
+ }
545
+ else
546
+ {
547
+ // Air control
548
+ Vector3 move = transform.right * moveDirection.x + transform.forward * moveDirection.z;
549
+ velocity += move * currentSpeed * airControl * Time.deltaTime;
550
+ }
551
+ }
552
+ }
553
+
554
+ // Combat System
555
+ public class CombatSystem : NetworkBehaviour
556
+ {
557
+ [Header("Combat Settings")]
558
+ [SerializeField] private float damage = 10f;
559
+ [SerializeField] private float attackRange = 2f;
560
+ [SerializeField] private float attackCooldown = 0.5f;
561
+ [SerializeField] private LayerMask enemyLayers;
562
+
563
+ [Header("Combo System")]
564
+ [SerializeField] private ComboAttack[] comboAttacks;
565
+ [SerializeField] private float comboTimeout = 1f;
566
+
567
+ private Queue<AttackInput> attackBuffer = new Queue<AttackInput>();
568
+ private List<AttackInput> currentCombo = new List<AttackInput>();
569
+ private float lastAttackTime;
570
+ private int comboCounter;
571
+
572
+ // Network sync
573
+ private NetworkVariable<float> networkHealth = new NetworkVariable<float>(100f);
574
+
575
+ [System.Serializable]
576
+ public class ComboAttack
577
+ {
578
+ public string name;
579
+ public AttackInput[] sequence;
580
+ public float damageMultiplier;
581
+ public AnimationClip animation;
582
+ public ParticleSystem effect;
583
+ public AudioClip soundEffect;
584
+ }
585
+
586
+ private void Update()
587
+ {
588
+ if (!IsOwner) return;
589
+
590
+ // Check combo timeout
591
+ if (Time.time - lastAttackTime > comboTimeout && currentCombo.Count > 0)
592
+ {
593
+ ResetCombo();
594
+ }
595
+
596
+ // Process attack buffer
597
+ ProcessAttackBuffer();
598
+ }
599
+
600
+ public void PerformAttack(AttackInput input)
601
+ {
602
+ if (Time.time - lastAttackTime < attackCooldown) return;
603
+
604
+ attackBuffer.Enqueue(input);
605
+ lastAttackTime = Time.time;
606
+ }
607
+
608
+ private void ProcessAttackBuffer()
609
+ {
610
+ while (attackBuffer.Count > 0)
611
+ {
612
+ AttackInput input = attackBuffer.Dequeue();
613
+ currentCombo.Add(input);
614
+
615
+ // Check for combo match
616
+ ComboAttack matchedCombo = CheckComboMatch();
617
+ if (matchedCombo != null)
618
+ {
619
+ ExecuteCombo(matchedCombo);
620
+ ResetCombo();
621
+ }
622
+ else if (currentCombo.Count == 1)
623
+ {
624
+ // Execute basic attack
625
+ ExecuteBasicAttack(input);
626
+ }
627
+ }
628
+ }
629
+
630
+ private ComboAttack CheckComboMatch()
631
+ {
632
+ foreach (var combo in comboAttacks)
633
+ {
634
+ if (MatchesCombo(combo.sequence))
635
+ {
636
+ return combo;
637
+ }
638
+ }
639
+ return null;
640
+ }
641
+
642
+ private bool MatchesCombo(AttackInput[] sequence)
643
+ {
644
+ if (currentCombo.Count != sequence.Length) return false;
645
+
646
+ for (int i = 0; i < sequence.Length; i++)
647
+ {
648
+ if (currentCombo[i] != sequence[i]) return false;
649
+ }
650
+
651
+ return true;
652
+ }
653
+
654
+ private void ExecuteCombo(ComboAttack combo)
655
+ {
656
+ // Play animation
657
+ GetComponent<Animator>().Play(combo.animation.name);
658
+
659
+ // Apply damage
660
+ float totalDamage = damage * combo.damageMultiplier;
661
+ ApplyAreaDamage(transform.position, attackRange * 1.5f, totalDamage);
662
+
663
+ // Visual effects
664
+ if (combo.effect != null)
665
+ {
666
+ Instantiate(combo.effect, transform.position, Quaternion.identity);
667
+ }
668
+
669
+ // Audio
670
+ if (combo.soundEffect != null)
671
+ {
672
+ audioManager.PlaySFX(combo.soundEffect);
673
+ }
674
+
675
+ // Network sync
676
+ if (IsServer)
677
+ {
678
+ ExecuteComboClientRpc(combo.name);
679
+ }
680
+ }
681
+
682
+ [ClientRpc]
683
+ private void ExecuteComboClientRpc(string comboName)
684
+ {
685
+ // Sync combo execution across clients
686
+ Debug.Log($"Combo executed: {comboName}");
687
+ }
688
+
689
+ private void ExecuteBasicAttack(AttackInput input)
690
+ {
691
+ // Perform raycast or overlap check
692
+ Collider[] hitEnemies = Physics.OverlapSphere(transform.position, attackRange, enemyLayers);
693
+
694
+ foreach (Collider enemy in hitEnemies)
695
+ {
696
+ IDamageable damageable = enemy.GetComponent<IDamageable>();
697
+ if (damageable != null)
698
+ {
699
+ damageable.TakeDamage(damage, transform.position);
700
+ }
701
+ }
702
+ }
703
+
704
+ private void ApplyAreaDamage(Vector3 center, float radius, float damageAmount)
705
+ {
706
+ Collider[] hitEnemies = Physics.OverlapSphere(center, radius, enemyLayers);
707
+
708
+ foreach (Collider enemy in hitEnemies)
709
+ {
710
+ IDamageable damageable = enemy.GetComponent<IDamageable>();
711
+ if (damageable != null)
712
+ {
713
+ // Calculate damage falloff based on distance
714
+ float distance = Vector3.Distance(center, enemy.transform.position);
715
+ float falloff = 1f - (distance / radius);
716
+ float finalDamage = damageAmount * falloff;
717
+
718
+ damageable.TakeDamage(finalDamage, center);
719
+ }
720
+ }
721
+ }
722
+
723
+ private void ResetCombo()
724
+ {
725
+ currentCombo.Clear();
726
+ comboCounter = 0;
727
+ }
728
+
729
+ public void TakeDamage(float amount)
730
+ {
731
+ if (!IsServer) return;
732
+
733
+ networkHealth.Value = Mathf.Max(0, networkHealth.Value - amount);
734
+
735
+ if (networkHealth.Value <= 0)
736
+ {
737
+ Die();
738
+ }
739
+ }
740
+
741
+ private void Die()
742
+ {
743
+ // Handle death
744
+ GameManager.Instance.ChangeGameState(GameState.GameOver);
745
+ }
746
+ }
747
+
748
+ // AI System using Unity Job System
749
+ [BurstCompile]
750
+ public struct AIPathfindingJob : IJobParallelFor
751
+ {
752
+ [ReadOnly] public NativeArray<float3> positions;
753
+ [ReadOnly] public NativeArray<float3> targets;
754
+ [ReadOnly] public float deltaTime;
755
+ [ReadOnly] public float moveSpeed;
756
+
757
+ public NativeArray<float3> velocities;
758
+
759
+ public void Execute(int index)
760
+ {
761
+ float3 direction = math.normalize(targets[index] - positions[index]);
762
+ velocities[index] = direction * moveSpeed * deltaTime;
763
+ }
764
+ }
765
+
766
+ public class AIManager : MonoBehaviour
767
+ {
768
+ [SerializeField] private int maxAIAgents = 100;
769
+ [SerializeField] private float aiUpdateInterval = 0.1f;
770
+
771
+ private NativeArray<float3> aiPositions;
772
+ private NativeArray<float3> aiTargets;
773
+ private NativeArray<float3> aiVelocities;
774
+ private JobHandle currentJobHandle;
775
+
776
+ private List<AIAgent> agents = new List<AIAgent>();
777
+
778
+ private void Start()
779
+ {
780
+ InitializeArrays();
781
+ InvokeRepeating(nameof(UpdateAI), 0f, aiUpdateInterval);
782
+ }
783
+
784
+ private void InitializeArrays()
785
+ {
786
+ aiPositions = new NativeArray<float3>(maxAIAgents, Allocator.Persistent);
787
+ aiTargets = new NativeArray<float3>(maxAIAgents, Allocator.Persistent);
788
+ aiVelocities = new NativeArray<float3>(maxAIAgents, Allocator.Persistent);
789
+ }
790
+
791
+ private void UpdateAI()
792
+ {
793
+ // Update native arrays with current positions
794
+ for (int i = 0; i < agents.Count && i < maxAIAgents; i++)
795
+ {
796
+ aiPositions[i] = agents[i].transform.position;
797
+ aiTargets[i] = agents[i].GetTarget();
798
+ }
799
+
800
+ // Schedule pathfinding job
801
+ AIPathfindingJob job = new AIPathfindingJob
802
+ {
803
+ positions = aiPositions,
804
+ targets = aiTargets,
805
+ velocities = aiVelocities,
806
+ deltaTime = aiUpdateInterval,
807
+ moveSpeed = 5f
808
+ };
809
+
810
+ currentJobHandle = job.Schedule(agents.Count, 32);
811
+ }
812
+
813
+ private void LateUpdate()
814
+ {
815
+ // Complete job and apply results
816
+ currentJobHandle.Complete();
817
+
818
+ for (int i = 0; i < agents.Count && i < maxAIAgents; i++)
819
+ {
820
+ agents[i].ApplyVelocity(aiVelocities[i]);
821
+ }
822
+ }
823
+
824
+ private void OnDestroy()
825
+ {
826
+ currentJobHandle.Complete();
827
+
828
+ if (aiPositions.IsCreated) aiPositions.Dispose();
829
+ if (aiTargets.IsCreated) aiTargets.Dispose();
830
+ if (aiVelocities.IsCreated) aiVelocities.Dispose();
831
+ }
832
+
833
+ public void RegisterAgent(AIAgent agent)
834
+ {
835
+ if (agents.Count < maxAIAgents)
836
+ {
837
+ agents.Add(agent);
838
+ }
839
+ }
840
+
841
+ public void UnregisterAgent(AIAgent agent)
842
+ {
843
+ agents.Remove(agent);
844
+ }
845
+ }
846
+
847
+ // Procedural Generation System
848
+ public class ProceduralWorldGenerator : MonoBehaviour
849
+ {
850
+ [Header("World Settings")]
851
+ [SerializeField] private int worldWidth = 100;
852
+ [SerializeField] private int worldHeight = 100;
853
+ [SerializeField] private float noiseScale = 20f;
854
+ [SerializeField] private int octaves = 4;
855
+ [SerializeField] private float persistence = 0.5f;
856
+ [SerializeField] private float lacunarity = 2f;
857
+
858
+ [Header("Biomes")]
859
+ [SerializeField] private BiomeSettings[] biomes;
860
+
861
+ [Header("Objects")]
862
+ [SerializeField] private GameObject[] treePrefabs;
863
+ [SerializeField] private GameObject[] rockPrefabs;
864
+ [SerializeField] private GameObject[] grassPrefabs;
865
+
866
+ private float[,] heightMap;
867
+ private int[,] biomeMap;
868
+ private MeshFilter meshFilter;
869
+ private MeshCollider meshCollider;
870
+
871
+ [System.Serializable]
872
+ public class BiomeSettings
873
+ {
874
+ public string name;
875
+ public float minHeight;
876
+ public float maxHeight;
877
+ public Color color;
878
+ public GameObject[] decorations;
879
+ public float decorationDensity;
880
+ }
881
+
882
+ private void Start()
883
+ {
884
+ GenerateWorld();
885
+ }
886
+
887
+ public void GenerateWorld()
888
+ {
889
+ // Generate height map
890
+ heightMap = GenerateHeightMap();
891
+
892
+ // Generate biome map
893
+ biomeMap = GenerateBiomeMap(heightMap);
894
+
895
+ // Create terrain mesh
896
+ Mesh terrainMesh = GenerateTerrainMesh(heightMap);
897
+ ApplyMesh(terrainMesh);
898
+
899
+ // Place decorations
900
+ PlaceDecorations();
901
+
902
+ // Generate rivers
903
+ GenerateRivers();
904
+
905
+ // Place structures
906
+ PlaceStructures();
907
+ }
908
+
909
+ private float[,] GenerateHeightMap()
910
+ {
911
+ float[,] map = new float[worldWidth, worldHeight];
912
+
913
+ System.Random prng = new System.Random(gameConfig.worldSeed);
914
+ Vector2[] octaveOffsets = new Vector2[octaves];
915
+
916
+ for (int i = 0; i < octaves; i++)
917
+ {
918
+ float offsetX = prng.Next(-100000, 100000);
919
+ float offsetY = prng.Next(-100000, 100000);
920
+ octaveOffsets[i] = new Vector2(offsetX, offsetY);
921
+ }
922
+
923
+ float maxNoiseHeight = float.MinValue;
924
+ float minNoiseHeight = float.MaxValue;
925
+
926
+ for (int y = 0; y < worldHeight; y++)
927
+ {
928
+ for (int x = 0; x < worldWidth; x++)
929
+ {
930
+ float amplitude = 1;
931
+ float frequency = 1;
932
+ float noiseHeight = 0;
933
+
934
+ for (int i = 0; i < octaves; i++)
935
+ {
936
+ float sampleX = (x - worldWidth / 2f) / noiseScale * frequency + octaveOffsets[i].x;
937
+ float sampleY = (y - worldHeight / 2f) / noiseScale * frequency + octaveOffsets[i].y;
938
+
939
+ float perlinValue = Mathf.PerlinNoise(sampleX, sampleY) * 2 - 1;
940
+ noiseHeight += perlinValue * amplitude;
941
+
942
+ amplitude *= persistence;
943
+ frequency *= lacunarity;
944
+ }
945
+
946
+ if (noiseHeight > maxNoiseHeight) maxNoiseHeight = noiseHeight;
947
+ if (noiseHeight < minNoiseHeight) minNoiseHeight = noiseHeight;
948
+
949
+ map[x, y] = noiseHeight;
950
+ }
951
+ }
952
+
953
+ // Normalize height map
954
+ for (int y = 0; y < worldHeight; y++)
955
+ {
956
+ for (int x = 0; x < worldWidth; x++)
957
+ {
958
+ map[x, y] = Mathf.InverseLerp(minNoiseHeight, maxNoiseHeight, map[x, y]);
959
+ }
960
+ }
961
+
962
+ return map;
963
+ }
964
+
965
+ private int[,] GenerateBiomeMap(float[,] heightMap)
966
+ {
967
+ int[,] biomeMap = new int[worldWidth, worldHeight];
968
+
969
+ for (int y = 0; y < worldHeight; y++)
970
+ {
971
+ for (int x = 0; x < worldWidth; x++)
972
+ {
973
+ float height = heightMap[x, y];
974
+
975
+ for (int i = 0; i < biomes.Length; i++)
976
+ {
977
+ if (height >= biomes[i].minHeight && height <= biomes[i].maxHeight)
978
+ {
979
+ biomeMap[x, y] = i;
980
+ break;
981
+ }
982
+ }
983
+ }
984
+ }
985
+
986
+ return biomeMap;
987
+ }
988
+
989
+ private Mesh GenerateTerrainMesh(float[,] heightMap)
990
+ {
991
+ Mesh mesh = new Mesh();
992
+ mesh.name = "Procedural Terrain";
993
+
994
+ Vector3[] vertices = new Vector3[worldWidth * worldHeight];
995
+ int[] triangles = new int[(worldWidth - 1) * (worldHeight - 1) * 6];
996
+ Vector2[] uvs = new Vector2[vertices.Length];
997
+ Color[] colors = new Color[vertices.Length];
998
+
999
+ int vertIndex = 0;
1000
+ int triIndex = 0;
1001
+
1002
+ for (int y = 0; y < worldHeight; y++)
1003
+ {
1004
+ for (int x = 0; x < worldWidth; x++)
1005
+ {
1006
+ float height = heightMap[x, y] * 10f; // Scale height
1007
+ vertices[vertIndex] = new Vector3(x, height, y);
1008
+ uvs[vertIndex] = new Vector2((float)x / worldWidth, (float)y / worldHeight);
1009
+
1010
+ // Set vertex color based on biome
1011
+ int biomeIndex = biomeMap[x, y];
1012
+ colors[vertIndex] = biomes[biomeIndex].color;
1013
+
1014
+ // Create triangles
1015
+ if (x < worldWidth - 1 && y < worldHeight - 1)
1016
+ {
1017
+ triangles[triIndex] = vertIndex;
1018
+ triangles[triIndex + 1] = vertIndex + worldWidth + 1;
1019
+ triangles[triIndex + 2] = vertIndex + worldWidth;
1020
+
1021
+ triangles[triIndex + 3] = vertIndex;
1022
+ triangles[triIndex + 4] = vertIndex + 1;
1023
+ triangles[triIndex + 5] = vertIndex + worldWidth + 1;
1024
+
1025
+ triIndex += 6;
1026
+ }
1027
+
1028
+ vertIndex++;
1029
+ }
1030
+ }
1031
+
1032
+ mesh.vertices = vertices;
1033
+ mesh.triangles = triangles;
1034
+ mesh.uv = uvs;
1035
+ mesh.colors = colors;
1036
+ mesh.RecalculateNormals();
1037
+ mesh.RecalculateBounds();
1038
+
1039
+ return mesh;
1040
+ }
1041
+
1042
+ private void ApplyMesh(Mesh mesh)
1043
+ {
1044
+ if (meshFilter == null)
1045
+ meshFilter = GetComponent<MeshFilter>() ?? gameObject.AddComponent<MeshFilter>();
1046
+
1047
+ if (meshCollider == null)
1048
+ meshCollider = GetComponent<MeshCollider>() ?? gameObject.AddComponent<MeshCollider>();
1049
+
1050
+ meshFilter.mesh = mesh;
1051
+ meshCollider.sharedMesh = mesh;
1052
+ }
1053
+
1054
+ private void PlaceDecorations()
1055
+ {
1056
+ System.Random prng = new System.Random(gameConfig.worldSeed + 1);
1057
+
1058
+ for (int y = 0; y < worldHeight; y += 2)
1059
+ {
1060
+ for (int x = 0; x < worldWidth; x += 2)
1061
+ {
1062
+ int biomeIndex = biomeMap[x, y];
1063
+ BiomeSettings biome = biomes[biomeIndex];
1064
+
1065
+ if (prng.NextDouble() < biome.decorationDensity)
1066
+ {
1067
+ GameObject decoration = biome.decorations[prng.Next(biome.decorations.Length)];
1068
+ float height = heightMap[x, y] * 10f;
1069
+ Vector3 position = new Vector3(x, height, y);
1070
+
1071
+ GameObject instance = Instantiate(decoration, position, Quaternion.identity);
1072
+
1073
+ // Random rotation and scale
1074
+ instance.transform.rotation = Quaternion.Euler(0, prng.Next(360), 0);
1075
+ float scale = (float)(0.8 + prng.NextDouble() * 0.4);
1076
+ instance.transform.localScale = Vector3.one * scale;
1077
+ }
1078
+ }
1079
+ }
1080
+ }
1081
+
1082
+ private void GenerateRivers()
1083
+ {
1084
+ // Implement river generation using flow field
1085
+ }
1086
+
1087
+ private void PlaceStructures()
1088
+ {
1089
+ // Implement structure placement (villages, dungeons, etc.)
1090
+ }
1091
+ }
1092
+
1093
+ // Shader and Graphics
1094
+ public class ShaderController : MonoBehaviour
1095
+ {
1096
+ [Header("Post-Processing")]
1097
+ [SerializeField] private Material postProcessMaterial;
1098
+ [SerializeField] private float bloomIntensity = 1f;
1099
+ [SerializeField] private float vignetteIntensity = 0.3f;
1100
+
1101
+ [Header("Dynamic Lighting")]
1102
+ [SerializeField] private Light sunLight;
1103
+ [SerializeField] private Gradient sunColor;
1104
+ [SerializeField] private AnimationCurve sunIntensity;
1105
+ [SerializeField] private float dayDuration = 300f; // 5 minutes
1106
+
1107
+ private float currentTimeOfDay = 0.5f; // 0 = midnight, 0.5 = noon, 1 = midnight
1108
+
1109
+ private void Start()
1110
+ {
1111
+ // Set up shader properties
1112
+ Shader.SetGlobalFloat("_GlobalWindStrength", 1f);
1113
+ Shader.SetGlobalVector("_GlobalWindDirection", new Vector4(1, 0, 0, 0));
1114
+ }
1115
+
1116
+ private void Update()
1117
+ {
1118
+ UpdateTimeOfDay();
1119
+ UpdateLighting();
1120
+ UpdateShaderGlobals();
1121
+ }
1122
+
1123
+ private void UpdateTimeOfDay()
1124
+ {
1125
+ currentTimeOfDay += Time.deltaTime / dayDuration;
1126
+ if (currentTimeOfDay >= 1f) currentTimeOfDay -= 1f;
1127
+ }
1128
+
1129
+ private void UpdateLighting()
1130
+ {
1131
+ // Update sun rotation
1132
+ float sunAngle = currentTimeOfDay * 360f - 90f;
1133
+ sunLight.transform.rotation = Quaternion.Euler(sunAngle, 30f, 0f);
1134
+
1135
+ // Update sun color and intensity
1136
+ sunLight.color = sunColor.Evaluate(currentTimeOfDay);
1137
+ sunLight.intensity = sunIntensity.Evaluate(currentTimeOfDay);
1138
+
1139
+ // Update fog
1140
+ RenderSettings.fogColor = Color.Lerp(
1141
+ sunColor.Evaluate(currentTimeOfDay),
1142
+ Color.gray,
1143
+ 0.5f
1144
+ );
1145
+ }
1146
+
1147
+ private void UpdateShaderGlobals()
1148
+ {
1149
+ // Wind animation
1150
+ float windTime = Time.time * 0.5f;
1151
+ Shader.SetGlobalFloat("_GlobalWindTime", windTime);
1152
+
1153
+ // Water animation
1154
+ Shader.SetGlobalFloat("_WaterWaveHeight", 0.5f);
1155
+ Shader.SetGlobalFloat("_WaterWaveSpeed", 1f);
1156
+
1157
+ // Season effects
1158
+ float seasonValue = Mathf.Sin(Time.time * 0.01f) * 0.5f + 0.5f;
1159
+ Shader.SetGlobalFloat("_SeasonBlend", seasonValue);
1160
+ }
1161
+
1162
+ private void OnRenderImage(RenderTexture source, RenderTexture destination)
1163
+ {
1164
+ if (postProcessMaterial != null)
1165
+ {
1166
+ postProcessMaterial.SetFloat("_BloomIntensity", bloomIntensity);
1167
+ postProcessMaterial.SetFloat("_VignetteIntensity", vignetteIntensity);
1168
+ Graphics.Blit(source, destination, postProcessMaterial);
1169
+ }
1170
+ else
1171
+ {
1172
+ Graphics.Blit(source, destination);
1173
+ }
1174
+ }
1175
+ }
1176
+
1177
+ // Supporting Classes and Interfaces
1178
+ public interface IDamageable
1179
+ {
1180
+ void TakeDamage(float amount, Vector3 hitPoint);
1181
+ void Heal(float amount);
1182
+ float GetCurrentHealth();
1183
+ float GetMaxHealth();
1184
+ }
1185
+
1186
+ public interface IInteractable
1187
+ {
1188
+ void Interact(GameObject interactor);
1189
+ bool CanInteract(GameObject interactor);
1190
+ string GetInteractionPrompt();
1191
+ }
1192
+
1193
+ public interface IPickupable
1194
+ {
1195
+ void Pickup(GameObject picker);
1196
+ void Drop(Vector3 position);
1197
+ ItemData GetItemData();
1198
+ }
1199
+
1200
+ [System.Serializable]
1201
+ public class GameConfig : ScriptableObject
1202
+ {
1203
+ public bool isMultiplayer = false;
1204
+ public GameObject playerPrefab;
1205
+ public Vector3 playerSpawnPoint;
1206
+ public NetworkTransport networkTransport;
1207
+ public int worldSeed = 12345;
1208
+ public float gameDuration = 600f; // 10 minutes
1209
+ }
1210
+
1211
+ [System.Serializable]
1212
+ public class ItemData
1213
+ {
1214
+ public string itemName;
1215
+ public Sprite icon;
1216
+ public int stackSize = 1;
1217
+ public ItemType type;
1218
+ public float weight;
1219
+ public int value;
1220
+ public Dictionary<string, float> stats;
1221
+ }
1222
+
1223
+ public enum ItemType
1224
+ {
1225
+ Weapon,
1226
+ Armor,
1227
+ Consumable,
1228
+ Resource,
1229
+ Quest,
1230
+ Currency
1231
+ }
1232
+
1233
+ public enum InputType
1234
+ {
1235
+ Move,
1236
+ Jump,
1237
+ Attack,
1238
+ Dash,
1239
+ Interact,
1240
+ Inventory
1241
+ }
1242
+
1243
+ public enum AttackInput
1244
+ {
1245
+ Light,
1246
+ Heavy,
1247
+ Special,
1248
+ Block,
1249
+ Parry
1250
+ }
1251
+
1252
+ public struct InputCommand
1253
+ {
1254
+ public InputType type;
1255
+ public Vector3 moveDirection;
1256
+ public Vector3 dashDirection;
1257
+ public float timestamp;
1258
+ }
1259
+
1260
+ public enum InputMode
1261
+ {
1262
+ Gameplay,
1263
+ Menu,
1264
+ Cutscene,
1265
+ Disabled
1266
+ }
1267
+
1268
+ // Placeholder classes (would be implemented separately)
1269
+ public class SaveSystem { }
1270
+ public class InputManager : MonoBehaviour
1271
+ {
1272
+ public static InputManager Instance;
1273
+ public Action<Vector2> OnMoveInput;
1274
+ public Action OnJumpInput;
1275
+ public Action<Vector3> OnDashInput;
1276
+ public void SetInputMode(InputMode mode) { }
1277
+ }
1278
+ public class AudioManager : MonoBehaviour
1279
+ {
1280
+ public void PlayMusic(string name) { }
1281
+ public void PlaySFX(string name) { }
1282
+ public void PlaySFX(AudioClip clip) { }
1283
+ }
1284
+ public class PoolManager : MonoBehaviour
1285
+ {
1286
+ public T GetFromPool<T>(string poolName) where T : Component { return null; }
1287
+ }
1288
+ public class AIAgent : MonoBehaviour
1289
+ {
1290
+ public Vector3 GetTarget() { return Vector3.zero; }
1291
+ public void ApplyVelocity(float3 velocity) { }
1292
+ }
1293
+ }
1294
+ ```
1295
+
1296
+ ## Unreal Engine 5 Game Development
1297
+ ```cpp
1298
+ // GameFramework.h - Unreal Engine 5 Core Framework
1299
+ #pragma once
1300
+
1301
+ #include "CoreMinimal.h"
1302
+ #include "GameFramework/GameModeBase.h"
1303
+ #include "GameFramework/Character.h"
1304
+ #include "Components/ActorComponent.h"
1305
+ #include "Engine/DataAsset.h"
1306
+ #include "Net/UnrealNetwork.h"
1307
+ #include "GameFramework.generated.h"
1308
+
1309
+ // Game State Management
1310
+ UENUM(BlueprintType)
1311
+ enum class EGameState : uint8
1312
+ {
1313
+ MainMenu UMETA(DisplayName = "Main Menu"),
1314
+ Loading UMETA(DisplayName = "Loading"),
1315
+ Playing UMETA(DisplayName = "Playing"),
1316
+ Paused UMETA(DisplayName = "Paused"),
1317
+ GameOver UMETA(DisplayName = "Game Over"),
1318
+ Victory UMETA(DisplayName = "Victory")
1319
+ };
1320
+
1321
+ // Advanced Game Mode
1322
+ UCLASS()
1323
+ class GAMENAME_API AAdvancedGameMode : public AGameModeBase
1324
+ {
1325
+ GENERATED_BODY()
1326
+
1327
+ protected:
1328
+ UPROPERTY(BlueprintReadOnly, Category = "Game State")
1329
+ EGameState CurrentGameState;
1330
+
1331
+ UPROPERTY(EditDefaultsOnly, Category = "Game Config")
1332
+ class UGameConfiguration* GameConfig;
1333
+
1334
+ UPROPERTY()
1335
+ TMap<FString, UObject*> GameData;
1336
+
1337
+ public:
1338
+ AAdvancedGameMode();
1339
+
1340
+ virtual void BeginPlay() override;
1341
+ virtual void Tick(float DeltaTime) override;
1342
+
1343
+ UFUNCTION(BlueprintCallable, Category = "Game State")
1344
+ void ChangeGameState(EGameState NewState);
1345
+
1346
+ UFUNCTION(BlueprintImplementableEvent, Category = "Game State")
1347
+ void OnGameStateChanged(EGameState NewState);
1348
+
1349
+ UFUNCTION(Server, Reliable, WithValidation)
1350
+ void ServerChangeGameState(EGameState NewState);
1351
+
1352
+ UFUNCTION(NetMulticast, Reliable)
1353
+ void MulticastGameStateChanged(EGameState NewState);
1354
+
1355
+ UFUNCTION(BlueprintCallable, Category = "Game Data")
1356
+ void SaveGameData(const FString& Key, UObject* Value);
1357
+
1358
+ UFUNCTION(BlueprintCallable, Category = "Game Data")
1359
+ UObject* LoadGameData(const FString& Key);
1360
+
1361
+ protected:
1362
+ virtual void HandleMatchIsWaitingToStart() override;
1363
+ virtual void HandleMatchHasStarted() override;
1364
+ virtual void HandleMatchHasEnded() override;
1365
+
1366
+ private:
1367
+ void EnterState(EGameState State);
1368
+ void ExitState(EGameState State);
1369
+ void InitializeGameSystems();
1370
+ void ShutdownGameSystems();
1371
+ };
1372
+
1373
+ // Advanced Character with Enhanced Movement
1374
+ UCLASS()
1375
+ class GAMENAME_API AAdvancedCharacter : public ACharacter
1376
+ {
1377
+ GENERATED_BODY()
1378
+
1379
+ protected:
1380
+ // Movement Properties
1381
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement")
1382
+ float WalkSpeed = 600.0f;
1383
+
1384
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement")
1385
+ float SprintSpeed = 900.0f;
1386
+
1387
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement")
1388
+ float CrouchSpeed = 300.0f;
1389
+
1390
+ // Advanced Movement
1391
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced Movement")
1392
+ float WallRunSpeed = 700.0f;
1393
+
1394
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced Movement")
1395
+ float WallJumpForce = 800.0f;
1396
+
1397
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced Movement")
1398
+ float DashDistance = 500.0f;
1399
+
1400
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Advanced Movement")
1401
+ float DashCooldown = 1.0f;
1402
+
1403
+ // State Variables
1404
+ UPROPERTY(BlueprintReadOnly, Replicated)
1405
+ bool bIsWallRunning;
1406
+
1407
+ UPROPERTY(BlueprintReadOnly, Replicated)
1408
+ bool bIsSliding;
1409
+
1410
+ UPROPERTY(BlueprintReadOnly, Replicated)
1411
+ bool bIsMantling;
1412
+
1413
+ UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health)
1414
+ float Health;
1415
+
1416
+ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats")
1417
+ float MaxHealth = 100.0f;
1418
+
1419
+ // Combat Component
1420
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
1421
+ class UCombatComponent* CombatComponent;
1422
+
1423
+ // Inventory Component
1424
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
1425
+ class UInventoryComponent* InventoryComponent;
1426
+
1427
+ public:
1428
+ AAdvancedCharacter();
1429
+
1430
+ virtual void BeginPlay() override;
1431
+ virtual void Tick(float DeltaTime) override;
1432
+ virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
1433
+ virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
1434
+
1435
+ // Movement Functions
1436
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1437
+ void StartSprint();
1438
+
1439
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1440
+ void StopSprint();
1441
+
1442
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1443
+ void PerformDash();
1444
+
1445
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1446
+ void StartWallRun();
1447
+
1448
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1449
+ void StopWallRun();
1450
+
1451
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1452
+ void PerformWallJump();
1453
+
1454
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1455
+ void StartSlide();
1456
+
1457
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1458
+ void StopSlide();
1459
+
1460
+ UFUNCTION(BlueprintCallable, Category = "Movement")
1461
+ void PerformMantle();
1462
+
1463
+ // Combat Functions
1464
+ UFUNCTION(BlueprintCallable, Category = "Combat")
1465
+ void PerformAttack();
1466
+
1467
+ UFUNCTION(BlueprintCallable, Category = "Combat")
1468
+ void PerformHeavyAttack();
1469
+
1470
+ UFUNCTION(BlueprintCallable, Category = "Combat")
1471
+ void StartBlocking();
1472
+
1473
+ UFUNCTION(BlueprintCallable, Category = "Combat")
1474
+ void StopBlocking();
1475
+
1476
+ // Damage System
1477
+ UFUNCTION(BlueprintCallable, Category = "Health")
1478
+ virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent,
1479
+ class AController* EventInstigator, AActor* DamageCauser) override;
1480
+
1481
+ UFUNCTION(BlueprintCallable, Category = "Health")
1482
+ void Heal(float HealAmount);
1483
+
1484
+ UFUNCTION()
1485
+ void OnRep_Health();
1486
+
1487
+ // Network Functions
1488
+ UFUNCTION(Server, Reliable, WithValidation)
1489
+ void ServerPerformDash();
1490
+
1491
+ UFUNCTION(NetMulticast, Reliable)
1492
+ void MulticastPlayDashEffect();
1493
+
1494
+ protected:
1495
+ // Input Handlers
1496
+ void MoveForward(float Value);
1497
+ void MoveRight(float Value);
1498
+ void Turn(float Value);
1499
+ void LookUp(float Value);
1500
+
1501
+ private:
1502
+ float LastDashTime;
1503
+ FVector WallRunNormal;
1504
+
1505
+ void UpdateWallRunning();
1506
+ void CheckForWallRun();
1507
+ void UpdateSliding();
1508
+ bool CanMantle() const;
1509
+ FVector GetMantleLocation() const;
1510
+ };
1511
+
1512
+ // Combat Component
1513
+ UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
1514
+ class GAMENAME_API UCombatComponent : public UActorComponent
1515
+ {
1516
+ GENERATED_BODY()
1517
+
1518
+ public:
1519
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
1520
+ float BaseDamage = 20.0f;
1521
+
1522
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
1523
+ float AttackRange = 200.0f;
1524
+
1525
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combat")
1526
+ float AttackCooldown = 0.5f;
1527
+
1528
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Combo")
1529
+ TArray<class UComboData*> AvailableCombos;
1530
+
1531
+ protected:
1532
+ UPROPERTY()
1533
+ TArray<EAttackType> CurrentComboSequence;
1534
+
1535
+ float LastAttackTime;
1536
+ float ComboWindow = 1.0f;
1537
+ int32 ComboCounter = 0;
1538
+
1539
+ public:
1540
+ UCombatComponent();
1541
+
1542
+ virtual void TickComponent(float DeltaTime, ELevelTick TickType,
1543
+ FActorComponentTickFunction* ThisTickFunction) override;
1544
+
1545
+ UFUNCTION(BlueprintCallable, Category = "Combat")
1546
+ void PerformAttack(EAttackType AttackType);
1547
+
1548
+ UFUNCTION(BlueprintCallable, Category = "Combat")
1549
+ void ResetCombo();
1550
+
1551
+ UFUNCTION(BlueprintCallable, Category = "Combat")
1552
+ bool CheckComboMatch(class UComboData* Combo);
1553
+
1554
+ UFUNCTION(BlueprintCallable, Category = "Combat")
1555
+ void ExecuteCombo(class UComboData* Combo);
1556
+
1557
+ protected:
1558
+ virtual void BeginPlay() override;
1559
+
1560
+ private:
1561
+ void ProcessAttack(EAttackType AttackType);
1562
+ TArray<AActor*> GetTargetsInRange();
1563
+ void ApplyDamageToTargets(const TArray<AActor*>& Targets, float Damage);
1564
+ };
1565
+
1566
+ // Procedural Level Generation
1567
+ UCLASS()
1568
+ class GAMENAME_API AProceduralLevelGenerator : public AActor
1569
+ {
1570
+ GENERATED_BODY()
1571
+
1572
+ public:
1573
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Generation")
1574
+ int32 WorldWidth = 100;
1575
+
1576
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Generation")
1577
+ int32 WorldHeight = 100;
1578
+
1579
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Generation")
1580
+ float NoiseScale = 20.0f;
1581
+
1582
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Generation")
1583
+ int32 Seed = 12345;
1584
+
1585
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Biomes")
1586
+ TArray<class UBiomeData*> Biomes;
1587
+
1588
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Objects")
1589
+ TArray<TSubclassOf<AActor>> TreeClasses;
1590
+
1591
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Objects")
1592
+ TArray<TSubclassOf<AActor>> RockClasses;
1593
+
1594
+ protected:
1595
+ UPROPERTY()
1596
+ class UProceduralMeshComponent* TerrainMesh;
1597
+
1598
+ TArray<float> HeightMap;
1599
+ TArray<int32> BiomeMap;
1600
+
1601
+ public:
1602
+ AProceduralLevelGenerator();
1603
+
1604
+ virtual void BeginPlay() override;
1605
+
1606
+ UFUNCTION(BlueprintCallable, Category = "Generation")
1607
+ void GenerateWorld();
1608
+
1609
+ UFUNCTION(BlueprintCallable, Category = "Generation")
1610
+ void ClearWorld();
1611
+
1612
+ protected:
1613
+ void GenerateHeightMap();
1614
+ void GenerateBiomeMap();
1615
+ void CreateTerrainMesh();
1616
+ void PlaceVegetation();
1617
+ void GenerateRivers();
1618
+ void PlaceStructures();
1619
+
1620
+ private:
1621
+ float GetNoiseValue(float X, float Y);
1622
+ int32 DetermineBiome(float Height, float Moisture);
1623
+ FVector GetSpawnLocation(int32 X, int32 Y);
1624
+ bool IsValidSpawnLocation(const FVector& Location);
1625
+ };
1626
+
1627
+ // Loot System
1628
+ USTRUCT(BlueprintType)
1629
+ struct FLootTableEntry
1630
+ {
1631
+ GENERATED_BODY()
1632
+
1633
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
1634
+ TSubclassOf<class AItemBase> ItemClass;
1635
+
1636
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
1637
+ float DropChance = 0.1f;
1638
+
1639
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
1640
+ int32 MinQuantity = 1;
1641
+
1642
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
1643
+ int32 MaxQuantity = 1;
1644
+ };
1645
+
1646
+ UCLASS()
1647
+ class GAMENAME_API ULootTable : public UDataAsset
1648
+ {
1649
+ GENERATED_BODY()
1650
+
1651
+ public:
1652
+ UPROPERTY(EditAnywhere, BlueprintReadOnly)
1653
+ TArray<FLootTableEntry> LootEntries;
1654
+
1655
+ UFUNCTION(BlueprintCallable, Category = "Loot")
1656
+ TArray<class AItemBase*> GenerateLoot(UWorld* World);
1657
+ };
1658
+ ```
1659
+
1660
+ ## Godot 4 Game Development
1661
+ ```gdscript
1662
+ # GameFramework.gd - Godot 4 Game Framework
1663
+ extends Node
1664
+
1665
+ class_name GameFramework
1666
+
1667
+ # Game State Management
1668
+ enum GameState {
1669
+ MAIN_MENU,
1670
+ LOADING,
1671
+ PLAYING,
1672
+ PAUSED,
1673
+ GAME_OVER,
1674
+ VICTORY
1675
+ }
1676
+
1677
+ var current_state: GameState = GameState.MAIN_MENU
1678
+ var game_data: Dictionary = {}
1679
+
1680
+ signal game_state_changed(new_state)
1681
+ signal score_changed(score)
1682
+ signal health_changed(health)
1683
+
1684
+ # Singleton Pattern
1685
+ static var instance: GameFramework
1686
+
1687
+ func _ready():
1688
+ if instance == null:
1689
+ instance = self
1690
+ process_mode = Node.PROCESS_MODE_ALWAYS
1691
+ else:
1692
+ queue_free()
1693
+
1694
+ func change_game_state(new_state: GameState) -> void:
1695
+ if current_state == new_state:
1696
+ return
1697
+
1698
+ exit_state(current_state)
1699
+ current_state = new_state
1700
+ enter_state(new_state)
1701
+ emit_signal("game_state_changed", new_state)
1702
+
1703
+ func enter_state(state: GameState) -> void:
1704
+ match state:
1705
+ GameState.MAIN_MENU:
1706
+ get_tree().paused = false
1707
+ AudioManager.play_music("main_menu")
1708
+ GameState.LOADING:
1709
+ load_game_resources()
1710
+ GameState.PLAYING:
1711
+ get_tree().paused = false
1712
+ AudioManager.play_music("gameplay")
1713
+ GameState.PAUSED:
1714
+ get_tree().paused = true
1715
+ GameState.GAME_OVER:
1716
+ save_high_score()
1717
+ show_game_over_ui()
1718
+
1719
+ func exit_state(state: GameState) -> void:
1720
+ match state:
1721
+ GameState.PAUSED:
1722
+ get_tree().paused = false
1723
+
1724
+ # Advanced Character Controller
1725
+ class_name AdvancedCharacter
1726
+ extends CharacterBody3D
1727
+
1728
+ @export var walk_speed: float = 5.0
1729
+ @export var run_speed: float = 10.0
1730
+ @export var jump_velocity: float = 8.0
1731
+ @export var dash_distance: float = 5.0
1732
+ @export var wall_run_speed: float = 7.0
1733
+
1734
+ var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
1735
+ var is_wall_running: bool = false
1736
+ var is_sliding: bool = false
1737
+ var can_dash: bool = true
1738
+ var wall_normal: Vector3
1739
+
1740
+ @onready var camera: Camera3D = $Camera3D
1741
+ @onready var raycast: RayCast3D = $RayCast3D
1742
+
1743
+ func _physics_process(delta: float) -> void:
1744
+ handle_movement(delta)
1745
+ handle_wall_run(delta)
1746
+ handle_combat()
1747
+ move_and_slide()
1748
+
1749
+ func handle_movement(delta: float) -> void:
1750
+ # Add gravity
1751
+ if not is_on_floor():
1752
+ velocity.y -= gravity * delta
1753
+
1754
+ # Handle jump
1755
+ if Input.is_action_just_pressed("jump"):
1756
+ if is_on_floor():
1757
+ velocity.y = jump_velocity
1758
+ elif is_wall_running:
1759
+ perform_wall_jump()
1760
+
1761
+ # Handle dash
1762
+ if Input.is_action_just_pressed("dash") and can_dash:
1763
+ perform_dash()
1764
+
1765
+ # Get input direction
1766
+ var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
1767
+ var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
1768
+
1769
+ if direction:
1770
+ var speed = run_speed if Input.is_action_pressed("sprint") else walk_speed
1771
+ velocity.x = direction.x * speed
1772
+ velocity.z = direction.z * speed
1773
+ else:
1774
+ velocity.x = move_toward(velocity.x, 0, walk_speed * delta * 3)
1775
+ velocity.z = move_toward(velocity.z, 0, walk_speed * delta * 3)
1776
+
1777
+ func handle_wall_run(delta: float) -> void:
1778
+ if is_on_wall() and not is_on_floor() and velocity.y > 0:
1779
+ start_wall_run()
1780
+ elif is_wall_running and (is_on_floor() or not is_on_wall()):
1781
+ stop_wall_run()
1782
+
1783
+ if is_wall_running:
1784
+ velocity.y = lerp(velocity.y, 0.0, delta * 5.0)
1785
+ var wall_forward = wall_normal.cross(Vector3.UP)
1786
+ velocity = wall_forward * wall_run_speed
1787
+
1788
+ func perform_dash() -> void:
1789
+ can_dash = false
1790
+ var dash_direction = -transform.basis.z * dash_distance
1791
+ velocity = dash_direction
1792
+
1793
+ # Cooldown timer
1794
+ await get_tree().create_timer(1.0).timeout
1795
+ can_dash = true
1796
+
1797
+ func perform_wall_jump() -> void:
1798
+ velocity = wall_normal * 10.0 + Vector3.UP * jump_velocity
1799
+ is_wall_running = false
1800
+
1801
+ # Combat System
1802
+ class_name CombatSystem
1803
+ extends Node
1804
+
1805
+ @export var base_damage: float = 10.0
1806
+ @export var attack_range: float = 2.0
1807
+ @export var combo_window: float = 1.0
1808
+
1809
+ var current_combo: Array = []
1810
+ var last_attack_time: float = 0.0
1811
+ var available_combos: Dictionary = {}
1812
+
1813
+ signal combo_performed(combo_name)
1814
+ signal damage_dealt(amount, target)
1815
+
1816
+ func _ready():
1817
+ load_combos()
1818
+
1819
+ func perform_attack(attack_type: String) -> void:
1820
+ var current_time = Time.get_ticks_msec() / 1000.0
1821
+
1822
+ if current_time - last_attack_time > combo_window:
1823
+ current_combo.clear()
1824
+
1825
+ current_combo.append(attack_type)
1826
+ last_attack_time = current_time
1827
+
1828
+ var combo = check_combo()
1829
+ if combo:
1830
+ execute_combo(combo)
1831
+ current_combo.clear()
1832
+ else:
1833
+ execute_basic_attack(attack_type)
1834
+
1835
+ func check_combo() -> Dictionary:
1836
+ for combo_name in available_combos:
1837
+ var combo = available_combos[combo_name]
1838
+ if arrays_equal(current_combo, combo.sequence):
1839
+ return combo
1840
+ return {}
1841
+
1842
+ func execute_combo(combo: Dictionary) -> void:
1843
+ emit_signal("combo_performed", combo.name)
1844
+ apply_area_damage(combo.damage * 2, combo.range * 1.5)
1845
+
1846
+ func execute_basic_attack(attack_type: String) -> void:
1847
+ apply_area_damage(base_damage, attack_range)
1848
+
1849
+ func apply_area_damage(damage: float, range: float) -> void:
1850
+ var space_state = get_world_3d().direct_space_state
1851
+ var query = PhysicsShapeQueryParameters3D.new()
1852
+ query.shape = SphereShape3D.new()
1853
+ query.shape.radius = range
1854
+ query.transform.origin = global_position
1855
+
1856
+ var results = space_state.intersect_shape(query)
1857
+ for result in results:
1858
+ var target = result.collider
1859
+ if target.has_method("take_damage"):
1860
+ target.take_damage(damage)
1861
+ emit_signal("damage_dealt", damage, target)
1862
+
1863
+ # Procedural Generation
1864
+ class_name ProceduralWorld
1865
+ extends Node3D
1866
+
1867
+ @export var world_size: Vector2i = Vector2i(100, 100)
1868
+ @export var noise_scale: float = 20.0
1869
+ @export var octaves: int = 4
1870
+ @export var seed_value: int = 12345
1871
+
1872
+ var noise: FastNoiseLite
1873
+ var height_map: Array = []
1874
+ var biome_map: Array = []
1875
+
1876
+ func _ready():
1877
+ generate_world()
1878
+
1879
+ func generate_world() -> void:
1880
+ setup_noise()
1881
+ generate_height_map()
1882
+ generate_biomes()
1883
+ create_terrain()
1884
+ place_objects()
1885
+
1886
+ func setup_noise() -> void:
1887
+ noise = FastNoiseLite.new()
1888
+ noise.seed = seed_value
1889
+ noise.frequency = 1.0 / noise_scale
1890
+ noise.fractal_octaves = octaves
1891
+
1892
+ func generate_height_map() -> void:
1893
+ height_map = []
1894
+ for y in world_size.y:
1895
+ var row = []
1896
+ for x in world_size.x:
1897
+ var height = noise.get_noise_2d(x, y)
1898
+ row.append(height)
1899
+ height_map.append(row)
1900
+
1901
+ func create_terrain() -> void:
1902
+ var mesh_instance = MeshInstance3D.new()
1903
+ var array_mesh = ArrayMesh.new()
1904
+ var arrays = []
1905
+ arrays.resize(Mesh.ARRAY_MAX)
1906
+
1907
+ var vertices = PackedVector3Array()
1908
+ var uvs = PackedVector2Array()
1909
+ var normals = PackedVector3Array()
1910
+
1911
+ # Generate vertices
1912
+ for y in world_size.y:
1913
+ for x in world_size.x:
1914
+ var height = height_map[y][x] * 10.0
1915
+ vertices.push_back(Vector3(x, height, y))
1916
+ uvs.push_back(Vector2(float(x) / world_size.x, float(y) / world_size.y))
1917
+
1918
+ # Generate triangles and normals
1919
+ # ... (triangle generation code)
1920
+
1921
+ arrays[Mesh.ARRAY_VERTEX] = vertices
1922
+ arrays[Mesh.ARRAY_TEX_UV] = uvs
1923
+ arrays[Mesh.ARRAY_NORMAL] = normals
1924
+
1925
+ array_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
1926
+ mesh_instance.mesh = array_mesh
1927
+ add_child(mesh_instance)
1928
+ ```
1929
+
1930
+ ## Best Practices
1931
+ 1. **Performance Optimization**: Profile and optimize for target platforms
1932
+ 2. **Asset Management**: Efficient loading and memory management
1933
+ 3. **Network Architecture**: Client-server authoritative model
1934
+ 4. **Input Handling**: Buffer inputs for responsive controls
1935
+ 5. **Physics**: Use appropriate collision layers and optimization
1936
+ 6. **Graphics**: LOD systems and culling for performance
1937
+ 7. **Audio**: 3D spatial audio and dynamic music systems
1938
+
1939
+ ## Game Development Patterns
1940
+ - Entity Component System (ECS) for flexibility
1941
+ - State machines for AI and game flow
1942
+ - Object pooling for performance
1943
+ - Observer pattern for events
1944
+ - Command pattern for input handling
1945
+ - Strategy pattern for AI behaviors
1946
+ - Factory pattern for object creation
1947
+
1948
+ ## Approach
1949
+ - Design core gameplay mechanics first
1950
+ - Prototype and iterate quickly
1951
+ - Optimize based on profiling data
1952
+ - Test on target hardware early
1953
+ - Implement proper save/load systems
1954
+ - Create modular, reusable systems
1955
+ - Document architecture decisions
1956
+
1957
+ ## Output Format
1958
+ - Provide complete game systems
1959
+ - Include multiplayer networking
1960
+ - Add procedural generation
1961
+ - Implement physics and combat
1962
+ - Include AI systems
1963
+ - Provide optimization strategies