gitextract_4ifgu9p8/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE.md │ └── workflows/ │ └── ci.yml ├── .gitignore ├── CHANGELOG.md ├── CLAUDE.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── apps/ │ ├── README.md │ ├── cli/ │ │ ├── README.md │ │ ├── bin/ │ │ │ └── warriorjs.js │ │ ├── declarations.d.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Game.test.ts │ │ │ ├── Game.ts │ │ │ ├── GameError.ts │ │ │ ├── Profile.test.ts │ │ │ ├── Profile.ts │ │ │ ├── ProfileGenerator.test.ts │ │ │ ├── ProfileGenerator.ts │ │ │ ├── Tower.test.ts │ │ │ ├── Tower.ts │ │ │ ├── cli.test.ts │ │ │ ├── cli.ts │ │ │ ├── loadTowers.test.ts │ │ │ ├── loadTowers.ts │ │ │ ├── parseArgs.test.ts │ │ │ ├── parseArgs.ts │ │ │ ├── ui/ │ │ │ │ ├── components/ │ │ │ │ │ ├── App.tsx │ │ │ │ │ ├── ConfirmPrompt.test.tsx │ │ │ │ │ ├── ConfirmPrompt.tsx │ │ │ │ │ ├── Divider.test.tsx │ │ │ │ │ ├── Divider.tsx │ │ │ │ │ ├── ErrorMessage.test.tsx │ │ │ │ │ ├── ErrorMessage.tsx │ │ │ │ │ ├── FloorMap.test.tsx │ │ │ │ │ ├── FloorMap.tsx │ │ │ │ │ ├── GameMenu.test.tsx │ │ │ │ │ ├── GameMenu.tsx │ │ │ │ │ ├── Header.test.tsx │ │ │ │ │ ├── Header.tsx │ │ │ │ │ ├── LevelCompleteScreen.test.tsx │ │ │ │ │ ├── LevelCompleteScreen.tsx │ │ │ │ │ ├── LogArea.test.tsx │ │ │ │ │ ├── LogArea.tsx │ │ │ │ │ ├── PlayLayout.test.tsx │ │ │ │ │ ├── PlayLayout.tsx │ │ │ │ │ ├── PlayScreen.test.tsx │ │ │ │ │ ├── PlayScreen.tsx │ │ │ │ │ ├── PlaySession.test.tsx │ │ │ │ │ ├── PlaySession.tsx │ │ │ │ │ ├── ProfileWizard.test.tsx │ │ │ │ │ ├── ProfileWizard.tsx │ │ │ │ │ ├── ResultScreen.test.tsx │ │ │ │ │ ├── ResultScreen.tsx │ │ │ │ │ ├── Scrubber.test.tsx │ │ │ │ │ ├── Scrubber.tsx │ │ │ │ │ ├── SelectPrompt.test.tsx │ │ │ │ │ ├── SelectPrompt.tsx │ │ │ │ │ ├── TextPrompt.test.tsx │ │ │ │ │ ├── TextPrompt.tsx │ │ │ │ │ ├── TowerCompleteScreen.test.tsx │ │ │ │ │ ├── TowerCompleteScreen.tsx │ │ │ │ │ ├── WarriorArt.test.tsx │ │ │ │ │ ├── WarriorArt.tsx │ │ │ │ │ ├── WarriorStatus.test.tsx │ │ │ │ │ ├── WarriorStatus.tsx │ │ │ │ │ ├── WelcomeScreen.test.tsx │ │ │ │ │ └── WelcomeScreen.tsx │ │ │ │ ├── hooks/ │ │ │ │ │ ├── usePlaySession.test.ts │ │ │ │ │ ├── usePlaySession.ts │ │ │ │ │ ├── usePlayback.test.ts │ │ │ │ │ └── usePlayback.ts │ │ │ │ ├── testing.ts │ │ │ │ ├── theme.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils/ │ │ │ │ ├── buildLevelReport.test.ts │ │ │ │ └── buildLevelReport.ts │ │ │ └── utils/ │ │ │ ├── formatDirectory.test.ts │ │ │ ├── formatDirectory.ts │ │ │ ├── getFloorMap.test.ts │ │ │ ├── getFloorMap.ts │ │ │ ├── getFloorMapKey.test.ts │ │ │ ├── getFloorMapKey.ts │ │ │ ├── getTowerId.test.ts │ │ │ ├── getTowerId.ts │ │ │ ├── getWarriorNameSuggestions.test.ts │ │ │ ├── getWarriorNameSuggestions.ts │ │ │ ├── renderPlayerCode.test.ts │ │ │ ├── renderPlayerCode.ts │ │ │ ├── renderReadme.test.ts │ │ │ ├── renderReadme.ts │ │ │ ├── renderTypes.test.ts │ │ │ └── renderTypes.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ └── website/ │ ├── core/ │ │ ├── Footer.js │ │ ├── GitHubButton.js │ │ └── TwitterButton.js │ ├── crowdin.yaml │ ├── data/ │ │ └── sponsors.json │ ├── i18n/ │ │ └── en.json │ ├── languages.js │ ├── package.json │ ├── pages/ │ │ └── en/ │ │ └── index.js │ ├── sidebars.json │ ├── siteConfig.js │ ├── static/ │ │ ├── .circleci/ │ │ │ └── config.yml │ │ ├── css/ │ │ │ ├── custom.css │ │ │ └── nord.css │ │ └── googlee0ff7b5bc8d30f78.html │ └── utils/ │ ├── getDocUrl.js │ └── getImgUrl.js ├── biome.json ├── docs/ │ ├── community/ │ │ ├── ecosystem.md │ │ ├── roadmap.md │ │ └── socialize.md │ ├── maker/ │ │ ├── adding-levels.md │ │ ├── creating-tower.md │ │ ├── defining-abilities.md │ │ ├── defining-units.md │ │ ├── introduction.md │ │ ├── publishing.md │ │ ├── refactoring.md │ │ ├── space-api.md │ │ ├── testing.md │ │ └── unit-api.md │ └── player/ │ ├── abilities.md │ ├── ai-tips.md │ ├── cli-tips.md │ ├── effects.md │ ├── epic-mode.md │ ├── gameplay.md │ ├── general-tips.md │ ├── install.md │ ├── js-tips.md │ ├── object.md │ ├── options.md │ ├── overview.md │ ├── perspective.md │ ├── scoring.md │ ├── space-api.md │ ├── spaces.md │ ├── towers.md │ ├── turn-api.md │ ├── unit-api.md │ ├── units.md │ └── warrior.md ├── lefthook.yml ├── libs/ │ ├── README.md │ ├── abilities/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Attack.test.ts │ │ │ ├── Attack.ts │ │ │ ├── Bind.test.ts │ │ │ ├── Bind.ts │ │ │ ├── Detonate.test.ts │ │ │ ├── Detonate.ts │ │ │ ├── DirectionOf.test.ts │ │ │ ├── DirectionOf.ts │ │ │ ├── DirectionOfStairs.test.ts │ │ │ ├── DirectionOfStairs.ts │ │ │ ├── DistanceOf.test.ts │ │ │ ├── DistanceOf.ts │ │ │ ├── Feel.test.ts │ │ │ ├── Feel.ts │ │ │ ├── Health.test.ts │ │ │ ├── Health.ts │ │ │ ├── Listen.test.ts │ │ │ ├── Listen.ts │ │ │ ├── Look.test.ts │ │ │ ├── Look.ts │ │ │ ├── MaxHealth.test.ts │ │ │ ├── MaxHealth.ts │ │ │ ├── Pivot.test.ts │ │ │ ├── Pivot.ts │ │ │ ├── Rescue.test.ts │ │ │ ├── Rescue.ts │ │ │ ├── Rest.test.ts │ │ │ ├── Rest.ts │ │ │ ├── Shoot.test.ts │ │ │ ├── Shoot.ts │ │ │ ├── Think.test.ts │ │ │ ├── Think.ts │ │ │ ├── Walk.test.ts │ │ │ ├── Walk.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── core/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Ability.test.ts │ │ │ ├── Ability.ts │ │ │ ├── Action.test.ts │ │ │ ├── Action.ts │ │ │ ├── Effect.test.ts │ │ │ ├── Effect.ts │ │ │ ├── Floor.test.ts │ │ │ ├── Floor.ts │ │ │ ├── Level.test.ts │ │ │ ├── Level.ts │ │ │ ├── Logger.ts │ │ │ ├── Position.test.ts │ │ │ ├── Position.ts │ │ │ ├── Sense.test.ts │ │ │ ├── Sense.ts │ │ │ ├── Space.test.ts │ │ │ ├── Space.ts │ │ │ ├── Unit.test.ts │ │ │ ├── Unit.ts │ │ │ ├── Warrior.test.ts │ │ │ ├── Warrior.ts │ │ │ ├── getLevel.test.ts │ │ │ ├── getLevel.ts │ │ │ ├── getLevelConfig.test.ts │ │ │ ├── getLevelConfig.ts │ │ │ ├── index.ts │ │ │ ├── loadLevel.ts │ │ │ ├── loadPlayer.test.ts │ │ │ ├── loadPlayer.ts │ │ │ ├── runLevel.test.ts │ │ │ ├── runLevel.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── effects/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Ticking.test.ts │ │ │ ├── Ticking.ts │ │ │ └── index.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── scoring/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── getClearBonus.test.ts │ │ │ ├── getClearBonus.ts │ │ │ ├── getGradeLetter.test.ts │ │ │ ├── getGradeLetter.ts │ │ │ ├── getLastEvent.test.ts │ │ │ ├── getLastEvent.ts │ │ │ ├── getLevelScore.test.ts │ │ │ ├── getLevelScore.ts │ │ │ ├── getRemainingTimeBonus.test.ts │ │ │ ├── getRemainingTimeBonus.ts │ │ │ ├── getTurnCount.test.ts │ │ │ ├── getTurnCount.ts │ │ │ ├── getWarriorScore.test.ts │ │ │ ├── getWarriorScore.ts │ │ │ ├── index.ts │ │ │ ├── isFloorClear.test.ts │ │ │ └── isFloorClear.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── spatial/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── absoluteDirections.test.ts │ │ │ ├── absoluteDirections.ts │ │ │ ├── index.ts │ │ │ ├── location.test.ts │ │ │ ├── location.ts │ │ │ ├── relativeDirections.test.ts │ │ │ └── relativeDirections.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ └── units/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── Archer.test.ts │ │ ├── Archer.ts │ │ ├── Captive.test.ts │ │ ├── Captive.ts │ │ ├── MeleeUnit.test.ts │ │ ├── MeleeUnit.ts │ │ ├── RangedUnit.test.ts │ │ ├── RangedUnit.ts │ │ ├── Sludge.test.ts │ │ ├── Sludge.ts │ │ ├── ThickSludge.test.ts │ │ ├── ThickSludge.ts │ │ ├── Wizard.test.ts │ │ ├── Wizard.ts │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── logo/ │ ├── LICENSE │ ├── README.md │ └── warriorjs.sketch ├── package.json ├── pnpm-workspace.yaml ├── towers/ │ ├── README.md │ ├── the-narrow-path/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ └── the-powder-keep/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── tsconfig.json ├── turbo.json └── vitest.config.ts