islaApocalypse-v2/README.md
beezm b60d78b752 Move the user:// isolation warning out of project.godot
Godot rewrites project.godot on import and strips all comments, replacing the
header with its own boilerplate. The isolation SETTINGS survived — name,
use_custom_user_dir and custom_user_dir_name are intact and the probe still
passes — but the block explaining why they must not be touched was deleted.

A comment there is therefore not a durable place for a warning. The warning
moves to README.md, which records the behaviour so nobody puts it back, and the
actual guarantee stays where it was always enforced: UserDirProbe, which exits
non-zero if user:// ever resolves to the old prototype's directory.

Also drops the now-empty [rendering] section the rewriter removed as redundant
(forward_plus is already declared in config/features).
2026-08-19 21:31:12 -04:00

91 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Isla Apocalypse — v2
The rewrite (**D-049**). A post-apocalyptic survival voxel game: one island, generated once offline,
loaded by everyone.
**Status: Phase 0 — foundation.** This repo is a *skeleton*. It builds, it resolves its own runtime
directory, and it carries the two data contracts and the tooling rails. **It generates nothing.**
---
## ⚠ Two repos. Never one.
| Repo | Role |
|---|---|
| **`~/celerNexus/islaApocalypse-v2/`** *(this)* | The rewrite. **Every line of new code is written here.** |
| **`~/celerNexus/islaApocalypse/`** | ⛔ **READ-ONLY.** The pre-rewrite prototype, archived at `ab78883`, tag `pre-rewrite-reference`. **Ported FROM; never written to.** |
| **`~/celerNexus/islaApocalypse-vault-v0.1/`** | The design vault — **the source of truth for WHAT and WHY.** The vault leads. |
**The old codebase is a spent quarry** (D-050): mined, never tracked, never synced, never canon'd.
Writing rewrite code into it would corrupt the very thing being ported from.
## ⚠ Runtime data isolation — do not weaken
This project pins its `user://` directory **away from the old prototype's**, which holds the
preserved reference seeds, blueprints and batches:
```
user:// → ~/.local/share/islaApocalypse-v2/ ← this project
~/.local/share/godot/app_userdata/islaApocalypse/ ← ⛔ the OLD prototype. Never touch.
```
Pinned two ways in `project.godot` — a distinct `application/config/name` **and**
`use_custom_user_dir` + `custom_user_dir_name`. Both must stay.
> ### ⚠ Do not document this with a comment in `project.godot` — it will not survive.
> **Godot rewrites `project.godot` on import and STRIPS ALL COMMENTS**, replacing the header with
> its own boilerplate. (Measured: a warning block written there was gone after the next
> `--import`. The *settings* survived; only the explanation was deleted.) So the warning lives
> **here**, and the guarantee is enforced by the probe below — which exits non-zero on a clash and
> therefore works in a pre-flight check, not just by eye.
After any change to the `[application]` block, re-run the probe:
```bash
Godot_v4.7.2-stable_mono_linux.x86_64 --headless \
--path ~/celerNexus/islaApocalypse-v2 res://Tools/Scenes/UserDirProbe.tscn
```
## Layout
```
Core/ math + data only, ENGINE-FREE — depends on nothing above it
Server/ authoritative logic — may use Core (empty: Phase 0)
Client/ rendering — may use Core (empty: Phase 0)
Tools/ the offline generator — ⚠ may NOT use Client (Phase 1 fills it)
```
Each layer has a `README.md` stating its role and its boundary. Read the one for the layer you are
about to write in — they carry the reasons, not just the rules.
## The contracts this phase establishes
- **★★ The column model** (D-053) — the world as a 2D grid of columns, each a stack of
`(material, thickness)` runs. **Air is the top run; there is no air-vs-solid height branch.**
`Core/Scripts/Column.cs`
- **The material schemas** (D-054) — terrain and building, two schemas bridged by a transformation
seam that is **deliberately empty.** Identity is a registry key, never an ordinal. Mesh style is
per-origin, never a material property. → `Core/Scripts/MaterialRegistry.cs`
- **The scaling discipline** — nothing uses a raw pixel number.
`Core/Scripts/GenerationScale.cs`
- **Tooling safety** — every path env-overridable, deletion refused by code.
`Core/Scripts/ToolingPaths.cs`, `Core/Scripts/FileSafety.cs`
## Build
```bash
dotnet build
Godot_v4.7.2-stable_mono_linux.x86_64 --headless --import --path .
```
**Godot 4.7.2** (mono) · **.NET 8** (`net8.0`) · `Godot.NET.Sdk/4.7.2`
> The reference repo is Godot 4.7.1. This repo deliberately targets **4.7.2** — clean rewrite,
> current tooling. 4.7.1 is the *port source*, not a constraint on new code.
## What this phase is NOT
No generation, no mesher, no stratigraphy, no biomes, no water, no algorithms of any kind. The
pipeline is **2D-maps-first** (D-056): stages 15 are flat maps, gotten completely right before a
single 3D vertex exists. Building the mesher before the data is right is the specific trap this
rewrite exists to undo.