{"id":27002921,"url":"https://github.com/dammafra/drysland","last_synced_at":"2026-04-11T14:35:05.450Z","repository":{"id":285778310,"uuid":"959318223","full_name":"dammafra/drysland","owner":"dammafra","description":"Entry for Challenge 017 of Three.js Journey","archived":false,"fork":false,"pushed_at":"2025-04-02T16:00:32.000Z","size":645,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-02T16:46:54.086Z","etag":null,"topics":["tailwi","threejs","vercel"],"latest_commit_sha":null,"homepage":"https://drysland.vercel.app","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dammafra.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-04-02T15:43:29.000Z","updated_at":"2025-04-02T16:00:35.000Z","dependencies_parsed_at":"2025-04-02T16:56:58.069Z","dependency_job_id":null,"html_url":"https://github.com/dammafra/drysland","commit_stats":null,"previous_names":["dammafra/drysland"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dammafra%2Fdrysland","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dammafra%2Fdrysland/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dammafra%2Fdrysland/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dammafra%2Fdrysland/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dammafra","download_url":"https://codeload.github.com/dammafra/drysland/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248074931,"owners_count":21043489,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["tailwi","threejs","vercel"],"created_at":"2025-04-04T05:14:20.202Z","updated_at":"2026-04-11T14:35:05.441Z","avatar_url":"https://github.com/dammafra.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🏝️ Drysland\n\n![Vite](https://img.shields.io/badge/Vite-B73BFE?style=for-the-badge\u0026logo=vite\u0026logoColor=FFD62E)\n![Three.js\t](https://img.shields.io/badge/ThreeJs-black?style=for-the-badge\u0026logo=three.js\u0026logoColor=white)\n![Vercel](https://img.shields.io/badge/Vercel-000000?style=for-the-badge\u0026logo=vercel\u0026logoColor=white)\n![Firebase](https://img.shields.io/badge/firebase-a08021?style=for-the-badge\u0026logo=firebase\u0026logoColor=ffcd34)\n![TailwindCSS](https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=for-the-badge\u0026logo=tailwind-css\u0026logoColor=white)\n\n\u003e 🥇 1st place in the [Three.js Journey Challenge 017](https://threejs-journey.com/challenges/017-island)\n\n\u003e Try it live here 👉 [drysland.dammafra.dev](https://drysland.dammafra.dev)\n\nInspired by classic **pipe-connection games**, Drysland is a relaxing, minimalist puzzle experience where you restore the flow of a river across a parched island by rotating and reconnecting its broken segments to bring water — and life — back to the land.\n\nEach level in Drysland is a procedurally generated island that gradually increases in size and difficulty.\nPipe networks are created using a simplified version of the **Growing Tree algorithm**, ensuring each puzzle is both solvable and unique.\n\n\u003cimg src=\"./static/cover.png\" alt=\"Cover\"  \u003e\n\n## Technologies Used\n\n- [Three.js](https://threejs.org/) (3D rendering)\n- [Tweakpane](https://tweakpane.github.io/docs/) (Debug)\n- [@yomotsu/camera-controls](https://github.com/yomotsu/camera-controls)\n- [@pmndrs/pointer-events](https://www.npmjs.com/package/@pmndrs/pointer-events)\n- [GSAP](https://gsap.com/)\n- [Firebase](https://firebase.google.com/)\n- [Tailwind](https://tailwindcss.com/)\n\n## Setup\n\n```bash\n# Install dependencies (only the first time)\nnpm install\n\n# Run the local server at localhost:5173\nnpm run dev\n\n# Build for production in the dist/ directory\nnpm run build\n```\n\n## Features\n\nTBD\n\n### Level Generation\n\nAll levels in Drysland are guaranteed to be solvable. The game uses a custom adaptation of the **Growing Tree algorithm**, commonly used for maze generation.\n\nThe core idea is to “carve” one or more continuous paths through a fixed-size hexagonal grid, primarily using a depth-first traversal (DFS).\n\nOnce the main paths are generated, the algorithm performs a second pass to insert additional connections between blocks along the existing routes, subtly increasing the complexity without breaking solvability.\n\nFinally, all tiles are randomly rotated to scramble the solution and form the playable puzzle.\n\nThe algorithm is configurable, the main parameters currently in use are:\n\n- **Traversal strategy**: defines the node selection method during path carving (e.g. DFS, BFS, or hybrid approaches).\n- **Grid radius**: determines the size of the hexagonal level.\n- **Grid coverage**: controls how much of the grid is used to generate the main path(s).\n- **Extra link probability**: chance to add additional connections between blocks during the second pass.\n- **Dead-end preservation**: percentage of dead ends that are intentionally left untouched to preserve challenge and variety.\n\nThese parameters allow for fine-tuning the level structure and difficulty, and can be adjusted to explore different types of puzzle layouts. There’s room to explore more sophisticated path-building strategies.\n\n### Save System \u0026 Sync\n\n\u003cimg src=\"./screens/log-in.png\" alt=\"Log in\"  \u003e\n\u003cimg src=\"./screens/state-conflict.png\" alt=\"Cover\"  \u003e\n\nDrysland automatically saves your progress locally using the browser’s local storage, so you can pick up right where you left off.\nFor cross-device play, you can optionally log in with a Google account to sync your progress across multiple devices.\nIf differences are detected between the local and cloud save data, a simple conflict resolution system will help you choose which version to keep.\n\n### Graphics Settings\n\n\u003cimg src=\"./screens/settings.png\" alt=\"Settings\"  \u003e\n\nDrysland offers a simple toggle between Quality and Performance modes. This setting adjusts shadows, water effects, and other visual details to strike a balance between visual fidelity and smooth performance. Your preference is saved and applied automatically each time you return.\n\n### Mobile-Friendly\n\nDrysland is optimized for mobile devices, providing a smooth and engaging experience on smartphones and tablets. It adapts to smaller screens, ensuring easy interaction and navigation on touch interfaces.\n\n|                                                             |                                                               |                                                            |                                                                  |\n| ----------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------- |\n| \u003cimg src=\"./screens/mobile-1.png\" alt=\"Mobile Main Menu\"  \u003e | \u003cimg src=\"./screens/mobile-2.png\" alt=\"Mobile Level Start\"  \u003e | \u003cimg src=\"./screens/mobile-3.png\" alt=\"Mobile Gameplay\"  \u003e | \u003cimg src=\"./screens/mobile-4.png\" alt=\"Mobile Level Complete\"  \u003e |\n\n## Credits\n\nCheck out the credits section in the project for a full list of resources used\n\n\u003cimg src=\"./screens/credits.png\" alt=\"Credits\"  \u003e\n\n- **Hexagon Kit**  \n  by [Kenney.nl](https://kenney.nl/assets/hexagon-kit)\n\n- **Cursor Pack**  \n  by [Kenney.nl](https://kenney.nl/assets/cursor-pack)\n\n- **Wind flow implementation**  \n  by [@boytchev](https://github.com/boytchev) from [CodePen](https://codepen.io/boytchev/pen/qBLNEVZ)\n\n- **Happy Relaxing Loop Sound Effect**  \n  by [Sergei Chetvertnykh](https://pixabay.com/users/sergequadrado-24990007/?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=275487) from [Pixabay](https://pixabay.com/sound-effects//?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=275487)\n\n- **Swing Whoosh In Room 8**  \n  by [floraphonic](https://pixabay.com/users/floraphonic-38928062/?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=234259) from [Pixabay](https://pixabay.com//?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=234259)\n\n- **UI Pop Up 7**  \n  by [floraphonic](https://pixabay.com/users/floraphonic-38928062/?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=197891) from [Pixabay](https://pixabay.com//?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=197891)\n\n- **Multi Pop 1**  \n  by [floraphonic](https://pixabay.com/users/floraphonic-38928062/?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=188165) from [Pixabay](https://pixabay.com//?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=188165)\n\n- **Ocean Waves**  \n  by [Lynda Smith](https://pixabay.com/users/missywhimsyart-4358466/?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=266187) from [Pixabay](https://pixabay.com/sound-effects//?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=266187)\n\n- **Notification Sound**  \n  by [Rasool Asaad](https://pixabay.com/users/rasoolasaad-47313572/?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=269266) from [Pixabay](https://pixabay.com//?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=music\u0026utm_content=269266)\n\n- **Skybox**  \n  from [Freestylized](https://freestylized.com/skybox/sky_42/)\n\n- **Low-Poly Seagull (with Animation \u0026 Rigged)**  \n  by [simonaskLDE](https://skfb.ly/orun9) [[CC](http://creativecommons.org/licenses/by/4.0/)] from [Sketchfab](https://sketchfab.com)\n\n- **Sail Ship**  \n  by [Quaternius](https://poly.pizza/m/cIzO4MBPqI) from [Poly Pizza](https://poly.pizza)\n\n- **Sailboat**  \n  by [Poly by Google](https://poly.pizza/m/1d76pfN4Dne) [[CC](https://creativecommons.org/licenses/by/3.0/)] from [Poly Pizza](https://poly.pizza)\n\n## Feedback\n\nIf you have any suggestions, feel free to reach out!\n\n## License\n\n© 2025 Francesco Dammacco  \nThis project is licensed under the GNU Affero General Public License v3.0.  \nSee the [LICENSE](./LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdammafra%2Fdrysland","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdammafra%2Fdrysland","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdammafra%2Fdrysland/lists"}