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).
91 lines
4.2 KiB
Markdown
91 lines
4.2 KiB
Markdown
# 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 1–5 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.
|