AndrewRqy commited on
Commit ·
5afb7b3
0
Parent(s):
Initial commit — The Apprentice for Build Small
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .env.example +16 -0
- .gitattributes +1 -0
- .gitignore +78 -0
- README.md +112 -0
- app.py +0 -0
- assets/parallax/banner_far.png +3 -0
- assets/parallax/banner_mid.png +3 -0
- assets/parallax/banner_near.png +3 -0
- assets/parallax/far.png +3 -0
- assets/parallax/mid.png +3 -0
- assets/parallax/near.png +3 -0
- assets/parallax/v1_backup/banner_far.png +3 -0
- assets/parallax/v1_backup/banner_mid.png +3 -0
- assets/parallax/v1_backup/banner_near.png +3 -0
- assets/parallax/v1_backup/far.png +3 -0
- assets/parallax/v1_backup/mid.png +3 -0
- assets/parallax/v1_backup/near.png +3 -0
- assets/sprites/banner_near.png +3 -0
- assets/sprites/demo/_model_test/hero_smug_flux_1_1_pro.png +3 -0
- assets/sprites/demo/_model_test/hero_smug_flux_1_1_pro_extreme.png +3 -0
- assets/sprites/demo/_model_test/hero_smug_flux_1_1_pro_pixelheavy.png +3 -0
- assets/sprites/demo/_model_test/hero_smug_flux_schnell.png +3 -0
- assets/sprites/demo/_model_test/hero_smug_rd_fast.png +3 -0
- assets/sprites/demo/p1_resolve.png +3 -0
- assets/sprites/demo/p1_resolve_raw.png +3 -0
- assets/sprites/demo_bandit_archer.png +3 -0
- assets/sprites/demo_bluejay_angry.png +3 -0
- assets/sprites/demo_card_backdrop.png +3 -0
- assets/sprites/demo_hero_confused.png +3 -0
- assets/sprites/demo_hero_panic_scarf.png +3 -0
- assets/sprites/demo_hero_smug_phone.png +3 -0
- assets/sprites/demo_hero_tripped.png +3 -0
- assets/sprites/demo_hero_whistle.png +3 -0
- assets/sprites/demo_hornet_dagger.png +3 -0
- assets/sprites/demo_hornet_queen_guilty.png +3 -0
- assets/sprites/demo_wraith_heron.png +3 -0
- assets/sprites/dragon.png +3 -0
- assets/sprites/dragon_black_land.png +3 -0
- assets/sprites/dragon_galactic_light.png +3 -0
- assets/sprites/dragon_mistgate.png +3 -0
- assets/sprites/dragon_quiet_years.png +3 -0
- assets/sprites/dragon_space_cowboy.png +3 -0
- assets/sprites/dragon_throne_room.png +3 -0
- assets/sprites/epilogue_homecoming.png +3 -0
- assets/sprites/force_black_land.png +3 -0
- assets/sprites/force_galactic_light.png +3 -0
- assets/sprites/force_mistgate.png +3 -0
- assets/sprites/force_quiet_years.png +3 -0
- assets/sprites/force_space_cowboy.png +3 -0
- assets/sprites/forest_dusk_texture.png +3 -0
.env.example
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Copy to .env.local and fill in. Without these, the app runs in mock mode.
|
| 2 |
+
|
| 3 |
+
# Modal-hosted OpenAI-compatible endpoint (vLLM serving Qwen2.5-32B or similar).
|
| 4 |
+
# Leave empty to force mock mode for the LLM calls.
|
| 5 |
+
MODAL_URL=
|
| 6 |
+
|
| 7 |
+
# Modal proxy auth (optional, only if the endpoint requires headers).
|
| 8 |
+
MODAL_KEY=
|
| 9 |
+
MODAL_SECRET=
|
| 10 |
+
|
| 11 |
+
# Force mock mode for the LLM even if MODAL_URL is set.
|
| 12 |
+
ORACLES_FORCE_MOCK=0
|
| 13 |
+
|
| 14 |
+
# Klein-4B image generation endpoint (separate from the LLM URL).
|
| 15 |
+
# Leave empty to disable live image gen; mock SVG cards are used.
|
| 16 |
+
KLEIN_URL=
|
.gitattributes
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
*.png filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ---------------------------------------------------------------------------
|
| 2 |
+
# Local secrets — NEVER push to HF Space.
|
| 3 |
+
# ---------------------------------------------------------------------------
|
| 4 |
+
.env
|
| 5 |
+
.env.local
|
| 6 |
+
.env.production
|
| 7 |
+
|
| 8 |
+
# ---------------------------------------------------------------------------
|
| 9 |
+
# Python build artifacts
|
| 10 |
+
# ---------------------------------------------------------------------------
|
| 11 |
+
__pycache__/
|
| 12 |
+
*.pyc
|
| 13 |
+
*.pyo
|
| 14 |
+
*.pyd
|
| 15 |
+
.Python
|
| 16 |
+
*.egg-info/
|
| 17 |
+
.pytest_cache/
|
| 18 |
+
|
| 19 |
+
# ---------------------------------------------------------------------------
|
| 20 |
+
# OS junk
|
| 21 |
+
# ---------------------------------------------------------------------------
|
| 22 |
+
.DS_Store
|
| 23 |
+
Thumbs.db
|
| 24 |
+
.vscode/
|
| 25 |
+
.idea/
|
| 26 |
+
|
| 27 |
+
# ---------------------------------------------------------------------------
|
| 28 |
+
# Dev-only directories — they live on the local machine but never need to
|
| 29 |
+
# ship to the HF Space. The Space only runs app.py + the oracles/ package
|
| 30 |
+
# + prompts/ + assets/sprites.
|
| 31 |
+
# ---------------------------------------------------------------------------
|
| 32 |
+
|
| 33 |
+
# Klein sprite generator scripts — only used at build time
|
| 34 |
+
modal_backend/
|
| 35 |
+
scripts/
|
| 36 |
+
|
| 37 |
+
# Training + distillation — produced the LoRA weights, not needed at runtime
|
| 38 |
+
training/
|
| 39 |
+
|
| 40 |
+
# Smoke / unit tests — not part of the served app
|
| 41 |
+
tests/
|
| 42 |
+
|
| 43 |
+
# Local LoRA adapter weights — published to HF Hub separately
|
| 44 |
+
lora-out/
|
| 45 |
+
lora-out-v2/
|
| 46 |
+
lora-out-tiny/
|
| 47 |
+
|
| 48 |
+
# Pre-chroma-key raw PNGs — *.png is what the app uses
|
| 49 |
+
assets/sprites/*_raw.png
|
| 50 |
+
assets/sprites/v1_backup/
|
| 51 |
+
|
| 52 |
+
# GGUF artifacts for the local llama-cpp backend
|
| 53 |
+
gguf-out/
|
| 54 |
+
*.gguf
|
| 55 |
+
|
| 56 |
+
# Captured LLM traces — submit separately to HF Datasets for the
|
| 57 |
+
# Sharing-is-Caring badge, not for the Space repo
|
| 58 |
+
traces/
|
| 59 |
+
.llama_cpp_cache/
|
| 60 |
+
/tmp/oracles_local_llama.log
|
| 61 |
+
|
| 62 |
+
# ---------------------------------------------------------------------------
|
| 63 |
+
# Project pivot logs + planning docs — useful to the developer, noise to
|
| 64 |
+
# the Space reader. Keep on disk, don't ship.
|
| 65 |
+
# ---------------------------------------------------------------------------
|
| 66 |
+
PIVOT_LOG.md
|
| 67 |
+
IMPLEMENTATION_PLAN.md
|
| 68 |
+
CONTRACTS.md
|
| 69 |
+
|
| 70 |
+
# Mocked / debug output dirs
|
| 71 |
+
mock_out/
|
| 72 |
+
debug_out/
|
| 73 |
+
|
| 74 |
+
# Runtime-generated mock SVG scene images — produced by the
|
| 75 |
+
# image-fallback code in oracles/images.py when Klein output is
|
| 76 |
+
# unavailable. These accumulate over self-test runs and should
|
| 77 |
+
# never ship to the Space.
|
| 78 |
+
assets/generated/
|
README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: The Apprentice
|
| 3 |
+
emoji: 🌲
|
| 4 |
+
colorFrom: indigo
|
| 5 |
+
colorTo: yellow
|
| 6 |
+
sdk: gradio
|
| 7 |
+
sdk_version: 4.44.1
|
| 8 |
+
python_version: "3.10"
|
| 9 |
+
suggested_hardware: cpu-basic
|
| 10 |
+
app_file: app.py
|
| 11 |
+
pinned: false
|
| 12 |
+
license: mit
|
| 13 |
+
short_description: A pixel-art branching-narrative game powered by a custom 14B LoRA — the mentor inscribes the wisdom, the apprentice has to make it save his life.
|
| 14 |
+
tags:
|
| 15 |
+
- thousand-token-wood
|
| 16 |
+
- off-brand
|
| 17 |
+
- well-tuned
|
| 18 |
+
- field-notes
|
| 19 |
+
- tiny-titan
|
| 20 |
+
- branching-narrative
|
| 21 |
+
- game
|
| 22 |
+
- pixel-art
|
| 23 |
+
- gradio
|
| 24 |
+
- vllm
|
| 25 |
+
- lora
|
| 26 |
+
- qwen
|
| 27 |
+
- bilingual
|
| 28 |
+
models:
|
| 29 |
+
- Qwen/Qwen2.5-14B-Instruct
|
| 30 |
+
- Qwen/Qwen2.5-1.5B-Instruct
|
| 31 |
+
- AndrewRqy/oracles-wizard-14b-lora
|
| 32 |
+
- AndrewRqy/oracles-wizard-1.5b-lora
|
| 33 |
+
---
|
| 34 |
+
|
| 35 |
+
# The Apprentice — Build Small Hackathon
|
| 36 |
+
|
| 37 |
+
> A pixel-art branching fairy-tale game. You inscribe five short oracles before the journey begins; an apprentice has to make every one of them save his life across five trials in a branching graph that converges on one of five distinct endings.
|
| 38 |
+
|
| 39 |
+
**Track**: Thousand Token Wood
|
| 40 |
+
**Stack**: Gradio + Modal-hosted vLLM + Qwen2.5-14B + custom humor LoRA
|
| 41 |
+
**Languages**: English + Simplified Chinese
|
| 42 |
+
**Demo video**: _(to be added by submitter)_
|
| 43 |
+
**Social post**: _(to be added by submitter)_
|
| 44 |
+
|
| 45 |
+
---
|
| 46 |
+
|
| 47 |
+
## What's in the box
|
| 48 |
+
|
| 49 |
+
| Component | Detail |
|
| 50 |
+
|---|---|
|
| 51 |
+
| **Frontend** | Single-file Gradio app (~5000 lines) with a hand-authored pixel-art aesthetic — Press Start 2P + VT323 fonts, NES-style sharp corners, layered animated scene composition, custom theme that suppresses every visible piece of Gradio chrome. |
|
| 52 |
+
| **Backend** | Qwen2.5-14B-Instruct + custom humor LoRA (`AndrewRqy/oracles-wizard-14b-lora`) served via vLLM on Modal. OpenAI-compatible API; the frontend talks to it through the OpenAI SDK. |
|
| 53 |
+
| **Tiny Titan path** | Qwen2.5-1.5B-Instruct + LoRA, also trained on the same 23k humor corpus (`AndrewRqy/oracles-wizard-1.5b-lora`). Eligible for the ≤4B prize. |
|
| 54 |
+
| **Branching narrative** | Hand-authored 15-node story graph with 5 distinct endings. Each fork at trials 2–4 is picked by an LLM call seeded with the player's inscribed oracle, so the path the apprentice walks is shaped by what wisdom was inscribed. |
|
| 55 |
+
| **6 themes × 2 languages** | Fantasy, Space-Cowboy, Galactic-Light, Black-Land, Mistgate, Quiet-Years — each with its own sprite set, finale boss, themed obstacle scenes (finale / arena / passage / trap), localized banner + oracle artifact + apprentice role title. All authored for both English and Chinese. |
|
| 56 |
+
| **Klein-4B sprites** | All in-game art (~105 pixel-art sprites + 4 environment backdrops per theme) was generated locally via Klein-4B on a Modal H100, then chroma-keyed offline. No FLUX, no commercial generators. |
|
| 57 |
+
|
| 58 |
+
## How to play
|
| 59 |
+
|
| 60 |
+
1. **Inscribe** — pick a language, then a theme, then write five short oracles (any words, gibberish, emoji — whatever you want).
|
| 61 |
+
2. **Send-off** — the mentor seals the parchments and the apprentice leaves.
|
| 62 |
+
3. **Five trials** — at each obstacle, the apprentice draws ONE oracle. The model takes the obstacle + the oracle and writes a 200-word resolution in one of three humor modes (wild imagination / accidental trip / last-minute revelation).
|
| 63 |
+
4. **Boss** — trial 5 is the world's finale (the dragon for fantasy; the warlord-king for space-cowboy; etc.). Different paths through the tree lead to different bosses.
|
| 64 |
+
5. **Ending** — one of 5 distinct endings plays, each with its own preset framing (Why the boss behaved as it did + What the apprentice carried home) and an LLM-expanded 3-paragraph epilogue.
|
| 65 |
+
6. **Summary** — clicking through reveals the story tree with the path you took lit gold and the four endings you didn't reach blurred behind "???" for replay motivation.
|
| 66 |
+
|
| 67 |
+
## Badge claims
|
| 68 |
+
|
| 69 |
+
| Badge | Why we claim it |
|
| 70 |
+
|---|---|
|
| 71 |
+
| **🎯 Well-Tuned** | Qwen2.5-14B + a hand-distilled 23k-example humor LoRA (rank 16, ~6.5 h on H100). The fine-tune visibly steers all three humor modes; the field-notes write-up below details the distillation pipeline. |
|
| 72 |
+
| **🎨 Off-Brand** | ~2000 lines of bespoke CSS, Press Start 2P + VT323 fonts, hand-painted pixel-art sprites, sharp-corner theme that overrides every visible Gradio token, custom story-tree visualization, custom ending banner with five-pip "endings discovered" strip. No stock Gradio chrome reaches the rendered page. |
|
| 73 |
+
| **📓 Field Notes** | See `docs/FIELD_NOTES_distillation.md` — a ~950-word blog post on the schema-locked Claude-Sonnet-4.5 → Qwen distillation pipeline, the three humor modes, the JSON enforcement layers, and what 98.4% reject-sampling acceptance got us. |
|
| 74 |
+
| **⚡ Tiny Titan (prize)** | Same 23k corpus also trained into a Qwen2.5-1.5B LoRA on H100 (~$5.50, ~1.5 h). Eligible for the ≤4B prize. |
|
| 75 |
+
|
| 76 |
+
## Running it (locally or on Space)
|
| 77 |
+
|
| 78 |
+
Three environment variables need to be set as **secrets** (HF Space Settings → Variables and secrets):
|
| 79 |
+
|
| 80 |
+
```
|
| 81 |
+
MODAL_URL = https://<modal-workspace>--<app-name>-serve.modal.run
|
| 82 |
+
MODAL_KEY = wk-… (Modal proxy auth key)
|
| 83 |
+
MODAL_SECRET = ws-… (Modal proxy auth secret)
|
| 84 |
+
```
|
| 85 |
+
|
| 86 |
+
Once those are set, the Space spins up the Gradio app and the player can immediately walk a trial. No GPU is needed on the Space side — the LLM call streams in from Modal over HTTPS.
|
| 87 |
+
|
| 88 |
+
If `MODAL_URL` is unset OR `ORACLES_FORCE_MOCK=1`, the app runs in **mock mode** — every LLM call returns a hand-written placeholder, the visuals still play, but the humor is dead. Useful for offline demos.
|
| 89 |
+
|
| 90 |
+
## Repository layout
|
| 91 |
+
|
| 92 |
+
```
|
| 93 |
+
oracles_app/
|
| 94 |
+
├── app.py main Gradio file (~5000 lines)
|
| 95 |
+
├── README.md this file (HF Space metadata + write-up)
|
| 96 |
+
├── requirements.txt gradio + openai + Pillow
|
| 97 |
+
├── .gitignore excludes dev artifacts from the Space upload
|
| 98 |
+
├── oracles/ pure-Python package (state, LLM client, story graph, themes, i18n)
|
| 99 |
+
├── prompts/ LLM prompt templates (resolution / epilogue / interludes / obstacles)
|
| 100 |
+
└── assets/sprites/ ~105 chroma-keyed pixel-art PNGs
|
| 101 |
+
```
|
| 102 |
+
|
| 103 |
+
The dev-only directories (`modal_backend/`, `scripts/`, `training/`, `tests/`, `lora-out/`, `*_raw.png`) live in this folder on local disk but are excluded from the HF Space upload by `.gitignore`.
|
| 104 |
+
|
| 105 |
+
## Credits
|
| 106 |
+
|
| 107 |
+
- Base model — Qwen2.5-14B-Instruct + Qwen2.5-1.5B-Instruct (Alibaba)
|
| 108 |
+
- Distillation teacher — Claude Sonnet 4.5 (Anthropic) via OpenRouter
|
| 109 |
+
- Sprite generator — Klein-4B (Anthropic) on Modal H100
|
| 110 |
+
- Pixel-art fonts — Press Start 2P + VT323 (Google Fonts)
|
| 111 |
+
|
| 112 |
+
Built for the **Build Small Hackathon — Thousand Token Wood track** (2026-06-15).
|
app.py
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
assets/parallax/banner_far.png
ADDED
|
Git LFS Details
|
assets/parallax/banner_mid.png
ADDED
|
Git LFS Details
|
assets/parallax/banner_near.png
ADDED
|
Git LFS Details
|
assets/parallax/far.png
ADDED
|
Git LFS Details
|
assets/parallax/mid.png
ADDED
|
Git LFS Details
|
assets/parallax/near.png
ADDED
|
Git LFS Details
|
assets/parallax/v1_backup/banner_far.png
ADDED
|
Git LFS Details
|
assets/parallax/v1_backup/banner_mid.png
ADDED
|
Git LFS Details
|
assets/parallax/v1_backup/banner_near.png
ADDED
|
Git LFS Details
|
assets/parallax/v1_backup/far.png
ADDED
|
Git LFS Details
|
assets/parallax/v1_backup/mid.png
ADDED
|
Git LFS Details
|
assets/parallax/v1_backup/near.png
ADDED
|
Git LFS Details
|
assets/sprites/banner_near.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo/_model_test/hero_smug_flux_1_1_pro.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo/_model_test/hero_smug_flux_1_1_pro_extreme.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo/_model_test/hero_smug_flux_1_1_pro_pixelheavy.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo/_model_test/hero_smug_flux_schnell.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo/_model_test/hero_smug_rd_fast.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo/p1_resolve.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo/p1_resolve_raw.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_bandit_archer.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_bluejay_angry.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_card_backdrop.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_hero_confused.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_hero_panic_scarf.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_hero_smug_phone.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_hero_tripped.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_hero_whistle.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_hornet_dagger.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_hornet_queen_guilty.png
ADDED
|
|
Git LFS Details
|
assets/sprites/demo_wraith_heron.png
ADDED
|
|
Git LFS Details
|
assets/sprites/dragon.png
ADDED
|
|
Git LFS Details
|
assets/sprites/dragon_black_land.png
ADDED
|
|
Git LFS Details
|
assets/sprites/dragon_galactic_light.png
ADDED
|
|
Git LFS Details
|
assets/sprites/dragon_mistgate.png
ADDED
|
|
Git LFS Details
|
assets/sprites/dragon_quiet_years.png
ADDED
|
|
Git LFS Details
|
assets/sprites/dragon_space_cowboy.png
ADDED
|
|
Git LFS Details
|
assets/sprites/dragon_throne_room.png
ADDED
|
|
Git LFS Details
|
assets/sprites/epilogue_homecoming.png
ADDED
|
|
Git LFS Details
|
assets/sprites/force_black_land.png
ADDED
|
|
Git LFS Details
|
assets/sprites/force_galactic_light.png
ADDED
|
|
Git LFS Details
|
assets/sprites/force_mistgate.png
ADDED
|
|
Git LFS Details
|
assets/sprites/force_quiet_years.png
ADDED
|
|
Git LFS Details
|
assets/sprites/force_space_cowboy.png
ADDED
|
|
Git LFS Details
|
assets/sprites/forest_dusk_texture.png
ADDED
|
|
Git LFS Details
|