# ViceSky

Tropical neon skies for Minecraft Java Edition. Day, sunset, night, rain, and
thunder layers with a layered translucent cloud overlay. Procedurally generated
textures — no third-party art.

Primary target: **OptiFine** (1.20.1 through 1.21.11).
Secondary target: Fabric / Quilt / NeoForge through **Nuit**.
Nuit support is wired up but **not yet verified on 26.2** — it's left in the
repo so it will work the day a Fabric-compatible Nuit build catches up.

## Sky layers

| Layer | Mood | When | Loader files |
| --- | --- | --- | --- |
| 1 | Day | clear daytime | OptiFine `sky1.*`, Nuit `vicesky_day.*` |
| 2 | Sunset | clear evening | OptiFine `sky2.*`, Nuit `vicesky_sunset.*` |
| 3 | Night | clear night | OptiFine `sky3.*`, Nuit `vicesky_night.*` |
| 4 | Rain (day) | rain / snow | OptiFine `sky4.*`, Nuit `vicesky_rain.*` |
| 5 | Thunder (day) | thunderstorm | OptiFine `sky5.*`, Nuit `vicesky_thunder.*` |
| 6 | Rain (night) | rain at night | OptiFine `sky6.*`, Nuit `vicesky_rain_night.*` |
| 7 | Thunder (night) | thunder at night | OptiFine `sky7.*`, Nuit `vicesky_thunder_night.*` |

Each base layer has a matching `*_clouds.png` and `*_clouds.json` for the
transparent rotating cloud strip. The thunder layers render forked lightning
overlays baked into the static texture. Vanilla Minecraft has no animated sky
loader so flashes are static mood, not timed events.

Skybox atlases are 3072x2048 six-face layouts (top row: bottom / top / south;
bottom row: west / north / east).

## Install

### OptiFine (primary, recommended)

1. In the launcher, switch to the **OptiFine 1.21.11** install (or any OptiFine
   build for 1.20.1+).
2. Copy `ViceSky-v1.0.0.zip` into `.minecraft/resourcepacks/`.
3. Enable the pack in Minecraft.
4. Open `Options > Video Settings > Quality` and turn `Custom Sky` on.

### Fabric / Quilt / NeoForge (experimental)

Drop the zip into `.minecraft/resourcepacks/` and install a version of Nuit
that's compatible with your MC release in the `mods/` folder.

On Fabric 26.2 with `nuit-fabric-1.0.0-beta.4+mc26.2.jar` installed, the
shipped JSON files do not yet bind properly with the loaded Nuit schema
version, so the skybox silently falls back to vanilla. Wait for a Nuit
build that targets MC 26.x.

## Compatibility

`pack.mcmeta` declares `pack_format: 88` plus `supported_formats` /
`min_format` / `max_format` covering pack formats 15 through 88. That spans
1.20.1 (vanilla or OptiFine) through 1.21.11 (OptiFine) and 26.2 (Fabric).

On OptiFine 1.21.11 the pack uses `textures/environment/` for sun, moon, and
clouds. The pack also ships `textures/environment/celestial/sun.png` and
per-phase `celestial/moon/*.png` so 1.21.11+ clients use the cleaner modern
paths when supported.

## Download

Grab `dist/ViceSky-v1.0.0.zip` and verify against
`dist/ViceSky-v1.0.0.zip.sha256` after each release.

## Build

```bash
pip install -r requirements-dev.txt
python scripts/generate_assets.py
python scripts/generate_properties.py
python scripts/validate_pack.py
python scripts/build_zip.py
```

Pass `--force` to `build_zip.py` to regenerate every PNG from scratch.

Output: `dist/ViceSky-v1.0.0.zip` plus a sibling `.sha256` file.

## Tests

```bash
python -m unittest tests.test_smoke -v
```

Checks imports, generator determinism, seam-check wiring, and validator
wiring.

## License

All Rights Reserved. See `LICENSE`.

All artwork is original and procedurally generated from `scripts/generate_assets.py`.
No external image files, screenshots, stock art, or third-party textures are
bundled or referenced by the generator.
