{"id":35132233,"url":"https://github.com/ikostan/skylockassault","last_synced_at":"2026-05-17T06:05:26.728Z","repository":{"id":314182315,"uuid":"1028141091","full_name":"ikostan/SkyLockAssault","owner":"ikostan","description":"Combat top-down airplane game with fuel management, multiple weapons, multi-level, and adjustable difficulty. Made with Godot.","archived":false,"fork":false,"pushed_at":"2026-05-15T01:04:32.000Z","size":203913,"stargazers_count":7,"open_issues_count":77,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-15T02:13:34.285Z","etag":null,"topics":["2d-game","browser-game","godot","godot4","top-down-game","webgame"],"latest_commit_sha":null,"homepage":"https://ikostan.itch.io/sky-lock-assault","language":"GDScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ikostan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"ikostan"}},"created_at":"2025-07-29T05:13:08.000Z","updated_at":"2026-05-12T04:27:16.000Z","dependencies_parsed_at":"2026-01-08T07:00:27.228Z","dependency_job_id":"d25550ca-9417-480a-ae48-62987a333eff","html_url":"https://github.com/ikostan/SkyLockAssault","commit_stats":null,"previous_names":["ikostan/skylockassault"],"tags_count":98,"template":false,"template_full_name":null,"purl":"pkg:github/ikostan/SkyLockAssault","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikostan%2FSkyLockAssault","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikostan%2FSkyLockAssault/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikostan%2FSkyLockAssault/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikostan%2FSkyLockAssault/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ikostan","download_url":"https://codeload.github.com/ikostan/SkyLockAssault/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikostan%2FSkyLockAssault/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33129104,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T18:38:32.183Z","status":"online","status_checked_at":"2026-05-17T02:00:05.366Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2d-game","browser-game","godot","godot4","top-down-game","webgame"],"created_at":"2025-12-28T06:33:41.066Z","updated_at":"2026-05-17T06:05:26.722Z","avatar_url":"https://github.com/ikostan.png","language":"GDScript","funding_links":["https://github.com/sponsors/ikostan"],"categories":[],"sub_categories":[],"readme":"# [Sky Lock Assault](https://ikostan.itch.io/sky-lock-assault)\n\n\u003c!-- markdownlint-disable line-length --\u003e\n[![Project Start](https://img.shields.io/badge/Project_Start-Jul_28%2C_2025-blue?style=flat-square)](https://github.com/ikostan/SkyLockAssault/commit/c412eb3cea0bbc73f716a14afa678d21c7d4d0d0)\n[![Made with Godot](https://img.shields.io/badge/Made%20with-Godot-478CBF?style=flat-square\u0026logo=godot%20engine\u0026logoColor=white)](https://godotengine.org)\n[![Godot](https://img.shields.io/badge/Godot-4.5-blue?style=flat-square\u0026logo=godot-engine)](https://godotengine.org/)\n[![GDScript](https://img.shields.io/badge/Language-GDScript-brightgreen?style=flat-square)](https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/index.html)\n[![Itch.io](https://img.shields.io/badge/Deployment-Itch.io-purple?style=flat-square\u0026logo=itch-dot-io)](https://itch.io/)\n![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/ikostan/SkyLockAssault?utm_source=oss\u0026utm_medium=github\u0026utm_campaign=ikostan%2FSkyLockAssault\u0026labelColor=171717\u0026color=FF570A\u0026link=https%3A%2F%2Fcoderabbit.ai\u0026label=CodeRabbit+Reviews)\n[![CI/CD](https://github.com/ikostan/SkyLockAssault/actions/workflows/lint_test_deploy.yml/badge.svg?style=flat-square)](https://github.com/ikostan/SkyLockAssault/actions/workflows/lint_test_deploy.yml)\n[![Latest Release](https://img.shields.io/github/v/release/ikostan/SkyLockAssault?label=Latest%20Release\u0026style=flat-square\u0026color=brightgreen)](https://github.com/ikostan/SkyLockAssault/releases/latest)\n![Last Commit](https://img.shields.io/github/last-commit/ikostan/SkyLockAssault?style=flat-square)\n[![Downloads](https://img.shields.io/github/downloads/ikostan/SkyLockAssault/total?style=flat-square\u0026color=brightgreen\u0026label=Downloads)](https://github.com/ikostan/SkyLockAssault/releases)\n[![codecov](https://codecov.io/gh/ikostan/SkyLockAssault/graph/badge.svg?token=A4O6I72HP0)](https://codecov.io/gh/ikostan/SkyLockAssault)\n![Repo Size](https://img.shields.io/github/repo-size/ikostan/SkyLockAssault?style=flat-square)\n![Closed Issues](https://img.shields.io/github/issues-closed/ikostan/SkyLockAssault?style=flat-square\u0026label=Issues\u0026color=green)\n![Open Issues](https://img.shields.io/github/issues/ikostan/SkyLockAssault?style=flat-square\u0026label=Issues\u0026color=red)\n[![All Contributors](https://img.shields.io/github/all-contributors/ikostan/SkyLockAssault?color=ee8449\u0026style=flat-square)](#contributors)\n\n## A top-down online web browser game built with Godot 4.5\n\n![Sky Lock Assault](https://github.com/ikostan/SkyLockAssault/blob/main/files/img/main_menu_2.png)\n\nCombat airplane web game with fuel management, multiple weapons, multi-level,\nand adjustable difficulty.\n\nThis is a dedicated Godot v4.5 game dev project on Windows 10 64-bit OS.\nWe'll be learning game dev here, starting with a simple main menu and expanding\nto core mechanics like player controls, enemy AI, and assaults in the sky.\nThe repo is open-source at [SkyLockAssault](https://github.com/ikostan/SkyLockAssault).\n\nYou can play this game on [Itch.io](https://ikostan.itch.io/sky-lock-assault)\n\n## Project Overview\n\n- **Godot Version**: 4.5 stable (or compatible).\n- **OS**: `Windows 10 64-bit`.\n- **Tools**:\n  - `Docker Desktop v4.45` for local testing\n  - `GitHub Desktop v3.5` for repo management\n  - `PyCharm 2024.1.7 (Community Edition)` for file editing\n  - `Windows PowerShell` for running Docker commands\n- **Supported Browsers**: Chrome 90+, Firefox 88+, Edge 90+ (WebGL 2.0 required)\n- **Known Limitations**: Mobile touch controls are experimental; fullscreen may not\n  persist on iOS Safari\n- **Goal**: Build a playable top-down shooter with web deployment in mind—export\n  to HTML5/Web, test locally, deploy to itch.io.\n\n## Game Assets\n\n- [Empire State Font](https://www.dafont.com/empire-state.font?l[]=10\u0026l[]=1)\n- [Pixel Planes Assets Pack](https://clavs.itch.io/pixel-planes-assets-pack)\n- [Assets Free Laser Bullets Pack 2020](https://wenrexa.itch.io/laser2020)\n- Csaba Felvegi aka \"chabull\" free assets collection, [see here](https://opengameart.org/users/chabull)\n- [Pixabay: royalty free stock](https://pixabay.com/)\n- Music:\n  - [Battle Epic](https://pixabay.com/music/main-title-battle-epic-241575/) by [Hot_Dope](https://pixabay.com/users/hot_dope-27442149/)\n  - [Retro laser 1](https://pixabay.com/sound-effects/retro-laser-1-236669/) by [Driken5482](https://pixabay.com/users/driken5482-45721595/)\n\n## Documentation\n\n1. [Guide to Implementing Versioning](/files/docs/Guide_to_Implementing_Versioning.md)\n2. [Godot v4.5 Docs](https://docs.godotengine.org/en/stable/index.html)\n3. [Development Guide](files/docs/Development_Guide.md)\n4. [Local CI Pipeline for Godot Project using Docker](/files/docs/Local_CI_Pipeline_for_Godot_Project_using_Docker.md)\n5. [Docker Local Test Server](/files/docs/Docker_Local_Test_Server.md)\n6. [Setup Instructions](/files/docs/Setup_Instructions.md)\n7. [Signing Setup for GitHub Desktop](/files/docs/Signing_Setup_GitHub_Desktop.md)\n8. BOTS:\n   - [Dependabot](https://docs.github.com/en/code-security/dependabot)\n   - [Snyk](https://docs.snyk.io/)\n   - [Sourcery AI](https://docs.sourcery.ai/)\n   - [CodeRabbit AI](https://github.com/coderabbitai)\n   - [LlamaPreview](https://github.com/apps/llamapreview)\n   - [IMGBOT](https://imgbot.net/docs/)\n   - [Release Drafter](https://github.com/release-drafter/release-drafter?tab=readme-ov-file#readme)\n   - [Close Stale Issues and PRs](https://github.com/actions/stale)\n   - [AllContributors GitHub App](https://allcontributors.org/docs/en/bot/installation)\n   - [DeepSource](https://github.com/deepsource)\n9. [Free Web Browser Game Deployment Platforms](files/docs/Platforms_for_Web_Deployment_Guide.md)\n10. [How to inspect the files saved by a Godot web export](files/docs/howto_inspect_the_files_saved_by_a_Godot_web_export.md)\n11. [CI/CD Production Salt Injection \u0026 Security Guard Architecture](files/docs/Production_Salt_Injection_\u0026_Security_Guard_Architecture.md)\n\u003c!-- markdownlint-enable line-length --\u003e\n\n## Roadmap\n\nHere's a high-level plan for upcoming features. Contributions welcome!\n\n- **v0.2: Completed Foundations** - Project import, Docker local testing,\n  basic input actions, top-down movement, main menu, quit handling for browser,\n  HTML5 export and testing, GitHub Actions CI/CD to Itch.io (complete).\n- **v0.3: Expansion** - Add levels, weapons, player feedback integration.\n- **v0.4: Post-MVP Refinements** - Performance optimization, audio polish, bug fixes.\n- **v0.5: Ongoing Development** - Feedback gathering, minor updates, release tagging.\n- Future: Multiplayer elements, AI enemies, mobile export\n  (post-launch based on community input).\n\n## Contributing\n\nPull requests welcome for mechanics like enemy AI, levels, or web optimizations!\nFork the repo and submit your ideas. See [CONTRIBUTING](CONTRIBUTING.md) for\nguidelines (create if needed).\n\n## Player Feedback\n\nWe value your input to improve Sky Lock Assault! Share your thoughts via:\n\n- [Itch.io Comments](https://ikostan.itch.io/sky-lock-assault) – Discuss\n  gameplay, bugs, or suggestions directly on the game's page.\n\n## Security\n\nFor details on reporting vulnerabilities and our disclosure process, see\n[SECURITY.md](/.github/SECURITY.md).\n\n---\n\n## License\n\nThis project is licensed under the GNU General Public License v3.0 or\nlater (GPL-3.0-or-later) - see the [LICENSE](LICENSE) file for details.\n\nCommercial use is allowed under GPLv3 terms, which require that any\ndistributed derivatives or combined works remain open source and provide\nsource code to users. For closed-source commercial alternatives without\nthese GPL requirements, a separate license is available upon request.\n\n### Key Terms\n\n- **Open Source**: You can view, modify, and distribute the code freely,\n  as long as derivatives remain under GPLv3.\n- **Commercial Use**: Allowed under GPLv3 (with source code obligations\n  for distributions). Closed-source commercial use requires a separate license.\n- **Contact**: For custom licenses, trademark use (e.g., \"Sky Lock Assault\"),\n  or inquiries, reach out via GitHub issues or X @EgorKostan.\n\n---\n\n## Architecture Highlights\n\n- Separation of gameplay logic and UI state\n- Centralized stat tracking (fuel/speed dictionaries)\n- Speed-based gameplay scaling\n- Modular audio system with buses\n- CI/CD-driven deployment workflow\n- Test-driven improvements with GUT\n- Observer-based Settings System: Centralized GameSettingsResource that handles\n  automatic persistence and UI synchronization through signals.\n\n### Project Structure (`scripts/`)\n\nPost-Refactor Phase 4 (PR `#582`), the root `scripts/` directory has been fully\nreorganised into purpose-specific sub-directories:\n\u003c!-- markdownlint-disable MD013 --\u003e\n| Directory            | Contents                                                                                                                                                                                     |\n|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `scripts/core/`      | Foundational systems: `game_paths.gd` (centralized path registry), `globals.gd`, `main_scene.gd`, `settings.gd`                                                                              |\n| `scripts/resources/` | Data containers \u0026 configuration: `game_settings_resource.gd`, `audio_constants.gd`                                                                                                           |\n| `scripts/entities/`  | Game objects: `player.gd`, `bullet.gd`, `weapon.gd`                                                                                                                                          |\n| `scripts/system/`    | Platform wrappers \u0026 integrations: `audio_web_bridge.gd`, `JavaScriptBridgeWrapper.gd`, `OSWrapper.gd`                                                                                        |\n| `scripts/managers/`  | Game-loop managers: `audio_manager.gd`, `parallax_manager.gd`, `resource_preloader.gd`                                                                                                       |\n| `scripts/ui/`        | Interface layer: `hud.gd`; sub-dirs `menus/` (main, pause, options, audio, gameplay, key-mapping, advanced), `screens/` (splash, loading), `components/` (volume slider, input remap button) |\n\u003c!-- markdownlint-enable MD013 --\u003e\n---\n\n## 🟢 Current Development Status\n\n**Milestone:** Milestone 14\n**Status:** Stable gameplay loop with synced UI systems and GUT-based unit testing.\n**Active Focus:** Gameplay expansion (AI enemies, multiplayer, levels).\n\n### Current features\n\n- Main menu scene with buttons (Start, Resume, Options, Quit).\n- Placeholder game level for future mechanics and game testing.\n- Options menu with log level settings, accessible from main and pause menus.\n- Pause menu with buttons (Main Menu, Options, Resume).\n- Player scene with CharacterBody2D, ShaderBody, CollisionShape, and FuelTimer.\n- Fade-in animations for main menu UI panels.\n- Fuel system including fuel level progress bar with dynamic color gradients\n  (green to yellow to red/dark red) and low-fuel blinking warnings.\n- Basic weapon system.\n- Difficulty settings.\n- Game controls input remapping.\n- Fuel management (timer-based depletion scaled by speed, base drain, and difficulty;\n  refuel not yet implemented).\n- Basic adjustable difficulty (affects fire rate, fuel depletion, and more).\n- Basic sound effects \u0026 background music.\n- Airplane Rotor Sound (Stereo SFX) + Rotor Animation, with reusable helpers and\n  rotors stopping on zero fuel.\n- Audio Buses \u0026 Panning (L/R Split).\n- Options Menu: Rotors Volume Slider.\n- Multi-Thread support enabled.\n- Player movement refactor: Lateral-only motion with acceleration-based forward/back\n  speed control, clamped between min/max speeds.\n- Speed system with progress bar, dynamic color changes (green normal, yellow caution,\n  red/dark red danger based on thresholds), and low/over-speed blinking warnings.\n- Centralized fuel/speed tracking via dictionaries for gameplay and UI integration.\n- Fully synchronized Input Remapping system:\n  - UI reflects saved bindings\n  - Conflict-safe remapping logic\n  - Persistent across sessions\n- Improved Options Menu behavior:\n  - Shared between Main Menu and Pause Menu\n  - Live updates to audio and gameplay settings\n- UI state consistency across scene transitions\n- Automatic Settings Persistence: Settings (including log levels, difficulty, and\n  debug flags) auto-save to disk via Globals.gd whenever a change is detected in\n  the resource.\n- Real-time UI Synchronization: UI components dynamically observe the settings resource,\n  ensuring that any external changes are immediately reflected in the menus.\n- UI navigation sounds integrated with a dedicated Menu SFX bus.\n- Hardened JavaScript bridge (`AudioWebBridge` and gameplay settings bridge)\n  to ensure robust communication between the Godot engine and the web browser\n  environment.\n\n### Features Roadmap\n\n- **Completed (Merged via Recent PRs)**:\n  - Fuel management with timer-based depletion scaled by speed/difficulty (PR #288).\n  - Player movement refactor: Lateral-only controls with acceleration/deceleration,\n    min/max speed clamping (PR #288).\n  - Speed system with progress bar, dynamic color gradients (green normal, yellow\n    caution, red/dark red danger), and low/over-speed blinking warnings\n    (PR #275 and #288).\n  - Rotor SFX/animation with volume sliders and zero-fuel stopping (prior PRs).\n  - Refactor player movement integrations\n    (e.g., speed-based fuel drain, UI sync) – Issue #169.\n  - Add procedural random parallax background for speed-based\n    scrolling – Issue #273.\n  - Switch testing from GDUnit4 to GUT for better coverage – Issues #282, #283.\n  - GitHub Wiki for documentation/learning resources – Issue #284.\n  - Version tagging in CI/CD – Issue #285.\n  - Dynamic speed bar color changes (partially merged in PR #275/#288,\n    but full threshold logic ongoing) – Issue #286.\n  - Improve input mappings with conflict handling and unbound warnings:\n    - Conflict detection + confirmation dialog when assigning already-used inputs.\n    - Per-device tracking, last-used device persistence, and device-aware\n      remap prompts.\n    - HUD warnings for unbound critical controls during gameplay.\n    - Support opening key-mapping menu directly from other menus.\n    - Expanded tests for input remap and settings behaviors.\n  - Ensure menu navigation bindings \u0026 legacy input migration:\n    - Guaranteed binding of core navigation actions (ui_accept, ui_up, etc.).\n    - Initial focus management for gameplay/options menus and restored focus flows.\n    - Improved keyboard/gamepad input label generation and legacy config migration.\n    - Updated default gamepad throttle mappings to match expectations.\n    - Expanded test coverage around menu navigation and input handling.\n  - Enable keyboard \u0026 d-pad navigation for audio settings and key mappings:\n    - Full keyboard + gamepad navigation support for audio settings.\n    - Focus highlighting on volume rows and unified accept action for slider/toggle.\n    - Better modifier key handling (Ctrl/Shift/Alt/Meta) in remapping UI.\n    - Refined conflict handling in key remapping logic and focus restoration\n      from audio → main menu.\n    - CI/tooling version bumps and asset import config additions.\n  - Documented the observer-based settings system and pinned CI actions for\n    pipeline stability (PR #488).\n  - Hardened the gameplay settings JavaScript bridge and added comprehensive GUT\n    test coverage (PR #500).\n  - Integrated UI navigation sounds, a dedicated Menu SFX bus, and the\n    `AudioWebBridge` (PR #479).\n\n---\n\n## Milestones\n\n## Input \u0026 Navigation Improvements (Milestone 12)\n\nMilestone 12 focused on making the game more navigable and responsive\nto user input devices:\n\n### Input Remapping\n\n- Conflict detection dialog when assigning existing bindings\n- Per-device last input selection persists between sessions\n- Critical control warnings if actions are unbound\n- Remap menu accessible from all relevant UI paths\n\n### Menu Navigation\n\n- Keyboard + gamepad (D-Pad) support for all menu flows\n- Guaranteed core navigation actions remain bound\n- Focus restoration when leaving submenus (Audio → Options → Main)\n- Modifier key respect (Ctrl/Shift/Alt/Meta) in remapping UI\n\n### Audio Settings Controls\n\n- Use keyboard/gamepad accept action for sliders and toggles\n- Focus highlighting for better visual feedback\n- Unified UI interactions without relying on the mouse\n- Modular audio system with dedicated buses (including a specific\n  Menu SFX bus) and an `AudioWebBridge` for seamless web environment\n  synchronization.\n\n### Godot Resource Migration\n\n- Replaced hard-coded globals with a `GameSettingsResource`\n- Easier inspector-based editing and persistence\n- Safer loading with fallback on corrupted configs\n\n### Known Limitations\n\n- Some complex menu flows may still rely on the mouse until additional\n  focus neighbors are defined.\n- Modifier-aware remapping requires explicit key+modifier press for\n  unique bindings.\n\n### Milestone 14\n\n**Status:** Stable gameplay loop with synced UI systems and GUT-based\nunit testing.\n**Active Focus:** Gameplay expansion (AI enemies, multiplayer, levels).\n**Version:** v0.9.18\n\n### Milestone 16\n\n**Status:** Stable gameplay loop with fully refactored script architecture,\nsynced UI systems, and GUT-based unit testing.\n**Active Focus:** Gameplay expansion (AI enemies, multiplayer, levels).\n\nTrack progress via [Milestones](https://github.com/ikostan/SkyLockAssault/milestones).\n\n---\n\n### Known Issues\n\n- Harmless console warning on desktop fullscreen\n  (NotSupportedError for orientation lock—ignored as non-fatal; doesn't affect gameplay).\n- Placeholder level lacks mechanics—work in progress:\n  - Core gameplay loop functional (movement, fuel, speed, audio)\n  - Enemy AI and combat progression are upcoming.\n- Report new issues on [GitHub](https://github.com/ikostan/SkyLockAssault/issues).\n\n---\n\n## DevOps \u0026 Automation\n\n- GitHub Actions CI/CD pipeline\n- Automated HTML5 build \u0026 Itch.io deployment\n- Codecov integration\n- Snyk security scanning\n- Docker-based local web testing\n- Release Drafter for automated changelogs\n\n---\n\n## Testing\n\nSky Lock Assault uses **GUT (Godot Unit Test)** framework for automated testing.\n\n- Unit tests cover:\n  - Input remapping logic\n  - Fuel system behavior\n  - Speed system thresholds \u0026 UI sync\n  - Player movement constraints\n- Tests run locally and in CI via GitHub Actions.\n- Coverage is tracked with Codecov.\n- Settings Observer Tests: Dedicated GUT test suite validates signal emission, value\n  clamping (e.g., difficulty limits), and successful serialization to the user's\n  disk.\n- JavaScript bridge communication and web integration reliability\n\nRun tests locally:\n\n- Open Godot\n- Use GUT Test Runner\n- Or run via CI pipeline\n\nTesting is a core part of development and required for gameplay logic changes.\n\n---\n\n### Play Instructions\n\n- **In Godot Editor**: Open the project \u003e Press F5 to run the main scene\n  (`main_menu.tscn`). Use keyboard/mouse for navigation.\n- **Local Web Testing**: After exporting to HTML5 (see Setup),\n  cd to `infra/` in `PowerShell` \u003e `docker compose up -d` \u003e\n  Open \u003chttp://localhost:9090\u003e in browser. Click \"Run game\" iframe;\n  use fullscreen for immersion (ignore desktop console warnings).\n- **Online on itch.io**:\n  1. Visit [ikostan.itch.io/sky-lock-assault](https://ikostan.itch.io/sky-lock-assault)\n  2. Click \"Run game\".\n- The game supports browser play; mobile-friendly with landscape orientation.\n\nFor learning: Test quit handling (platform-specific) and log levels in options\nmenu during play.\n\n---\n\n### 🙌 How to Contribute\n\n- Fork the repo and create a branch for your changes.\n- Follow GDScript best practices; test in editor and web export.\n- Open a Pull Request with details.\n- See [CONTRIBUTING.md](/CONTRIBUTING.md) for full guidelines.\n- **Join the Discussions**: Chat about ideas, ask questions on web exports, or suggest\n  features at [GitHub Discussions](https://github.com/ikostan/SkyLockAssault/discussions).\n\nWe use the following labels to organize contributions:\n\n- `good first issue` — beginner friendly\n- `documentation` — improvements to docs\n- `feature` — gameplay or UI work\n\nPlease create a branch per issue and reference the issue number in your PR title.\n\n---\n\n### Contributors\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikostan%2Fskylockassault","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fikostan%2Fskylockassault","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikostan%2Fskylockassault/lists"}