engine(macos-arm64): 4.7 native-module build + ship GodotSharp; add update-engine skill
- Replace macOS binary with the 4.7 build where Terrain3D + agent_skinned are native engine modules (no GDExtension .framework). Fixed C# bindability (set_plugin->Object, abstract Terrain3DAssetResource, drop dup duplicate bind) so glue generates. - SHIP GodotSharp alongside the binary (matched pair) — stale/missing GodotSharp causes "Wrapper class not found for Terrain3D" / ".NET assemblies not found". Engine does not regenerate it. Un-ignore GodotSharp in .gitignore. - manifest.json: macOS -> 4.7 (4ba7b5b) + new sha + godotsharp field; drop obsolete terrain_3d GDExtension section; windows flagged 4.7-pending. - Add .agents/skills/update-engine (mac+win self-serve install) + README + Forge handoff. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
# Handoff → Forge (Ozan's Windows box): build Windows 4.7 + ship GodotSharp
|
||||
|
||||
**Date:** 2026-06-19 · **From:** macOS 4.7 native-module migration · **For:** Windows build owner
|
||||
|
||||
## Why
|
||||
|
||||
The engine moved to **Godot 4.7** and **Terrain3D + agent_skinned are now native engine modules**
|
||||
(compiled into the binary — no GDExtension `.framework`). macOS is done and shipped in this repo
|
||||
(`engine/macos-arm64/`). **Windows is still 4.6.5 with the GDExtension** and must be brought up to
|
||||
4.7 the same way, or Windows teammates can't run the new `ariki-game` (the game-side cutover removed
|
||||
the terrain GDExtension).
|
||||
|
||||
## The critical bit (don't skip)
|
||||
|
||||
After the 4.7 build you **must regenerate GodotSharp and ship it next to the binary.** A native
|
||||
module changes the engine's class list; the C# bindings (`GodotSharp`) must be regenerated to
|
||||
include `Terrain3D` / `MultiSkinnedMeshInstance3D`, or the game throws
|
||||
`Wrapper class not found for type: Terrain3D` (terrain = water, animals frozen). The engine does
|
||||
**not** regenerate GodotSharp at runtime.
|
||||
|
||||
## Steps (Windows)
|
||||
|
||||
1. **Sync engine source** to the current `tinqs/engine` `main` (single 4.7 snapshot, `4ba7b5b`).
|
||||
```
|
||||
cd engine
|
||||
tinqs pull # or: git fetch origin && git checkout main && git reset --hard origin/main
|
||||
```
|
||||
2. **Build the editor**:
|
||||
```
|
||||
scons platform=windows target=editor arch=x86_64 module_mono_enabled=yes
|
||||
scons platform=windows target=editor arch=x86_64 module_mono_enabled=yes windows_subsystem=console # console binary
|
||||
```
|
||||
3. **Regenerate the mono glue + GodotSharp assemblies** (this is the step that fixes the wrapper errors):
|
||||
```
|
||||
bin\tinqs.windows.editor.x86_64.mono.exe --headless --generate-mono-glue modules\mono\glue
|
||||
python modules\mono\build_scripts\build_assemblies.py --godot-output-dir=bin --godot-platform=windows
|
||||
```
|
||||
Confirm `bin\GodotSharp\Api\Debug\GodotSharp.dll` exists and that
|
||||
`modules\mono\glue\...\Generated\Constructors.cs` contains `Terrain3D` (grep it).
|
||||
4. **If you hit the same build errors I did** (already fixed in `main`, but for reference): a core
|
||||
module can't expose an editor-API type — `Terrain3D::set_plugin` must take `Object*` not
|
||||
`EditorPlugin*`; `Terrain3DAssetResource` must be `GDREGISTER_ABSTRACT_CLASS`; drop the redundant
|
||||
`Terrain3DRegion::duplicate` bind. These are already in `main` — a clean pull should have them.
|
||||
5. **Drop into this builds repo** (`engine/windows-x64/`):
|
||||
- `tinqs.windows.editor.x86_64.mono.exe` (+ `.console.exe`)
|
||||
- the whole `GodotSharp/` folder ← **new requirement; was previously .gitignored**
|
||||
6. **Update `manifest.json`** windows-x64 block: version `4.7…`, `engine_commit` `4ba7b5b`, new
|
||||
sha256s, add `"godotsharp": "engine/windows-x64/GodotSharp"`, clear the "pending" note.
|
||||
7. `tinqs push`.
|
||||
|
||||
## Verify
|
||||
|
||||
On a Windows machine with `ariki-game`: run the update-engine skill (`.agents/skills/update-engine`,
|
||||
Windows path), launch `game.sh run`. Healthy = terrain renders, animals animate, **0**
|
||||
`Wrapper class not found`, no `.NET assemblies not found`.
|
||||
|
||||
## Notes
|
||||
|
||||
- `.gitattributes` already LFS-tracks `engine/**`, so the binary + GodotSharp go to LFS automatically.
|
||||
- The macOS side in this repo is the reference for exactly what the layout should look like.
|
||||
- Game-side cutover (GDExtension removal, `project.godot`→4.7) is committed on `ariki-game` `main`
|
||||
(held pending team sync) — Windows teammates need this engine before that lands for them.
|
||||
@@ -0,0 +1,89 @@
|
||||
---
|
||||
name: update-engine
|
||||
description: Install/update the local Tinqs engine (binary + GodotSharp C# bindings) from this builds repo so ariki-game runs on the current engine. Use when an engine update is announced, when setting up a new machine, or when the game shows ".NET assemblies not found" or "Wrapper class not found for type: Terrain3D" (terrain is water / animals don't animate). Covers macOS (arm64) and Windows (x64).
|
||||
---
|
||||
|
||||
# Update the Tinqs engine from `builds`
|
||||
|
||||
**Only Ozan edits the engine source.** Everyone else installs the prebuilt engine from this
|
||||
repo into `../engine/bin/`, which is where `ariki-game` looks for it.
|
||||
|
||||
## ⚠️ Read this first — binary + GodotSharp are a MATCHED PAIR
|
||||
|
||||
The engine binary and its `GodotSharp/` folder (Godot's C# bindings) are **both generated from the
|
||||
same engine source** and must be installed **together**. The binary does **not** regenerate
|
||||
`GodotSharp` — it must sit next to the binary on disk. Mismatch symptoms:
|
||||
|
||||
| Symptom | Cause |
|
||||
|---|---|
|
||||
| `.NET assemblies not found` dialog (looks for `engine/bin/GodotSharp/Api/Debug`) | no `GodotSharp` present |
|
||||
| `Wrapper class not found for type: Terrain3D` / `MultiSkinnedMeshInstance3D` — terrain renders as water, animals don't animate | **stale** `GodotSharp` from an older engine that predates the built-in Terrain3D / agent_skinned modules |
|
||||
|
||||
So: always **replace `GodotSharp` wholesale** when you take a new binary, and clear the game's C#
|
||||
cache so it rebuilds against the new bindings.
|
||||
|
||||
## Assumed layout
|
||||
|
||||
```
|
||||
tinqs-ltd/
|
||||
ariki-game/ ← the game (looks for ../engine/bin/…)
|
||||
engine/bin/ ← install target: binary + GodotSharp live here
|
||||
builds/ ← this repo (prebuilt engine)
|
||||
```
|
||||
Adjust paths below if your checkout differs.
|
||||
|
||||
## 1. Pull the latest build
|
||||
|
||||
```bash
|
||||
cd <…>/builds
|
||||
tinqs pull # never `git pull` — tinqs handles LFS (the binary + GodotSharp are LFS)
|
||||
```
|
||||
Check `builds/manifest.json` for the current version/commit per platform.
|
||||
|
||||
## 2a. Install — macOS (arm64)
|
||||
|
||||
```bash
|
||||
BUILDS="<…>/builds"; ENGINE="<…>/engine/bin"; GAME="<…>/ariki-game"
|
||||
mkdir -p "$ENGINE"
|
||||
# 1) binary
|
||||
cp "$BUILDS/engine/macos-arm64/tinqs.macos.editor.arm64.mono" "$ENGINE/"
|
||||
chmod +x "$ENGINE/tinqs.macos.editor.arm64.mono"
|
||||
# 2) GodotSharp — REPLACE wholesale (matched pair)
|
||||
rm -rf "$ENGINE/GodotSharp"
|
||||
cp -R "$BUILDS/engine/macos-arm64/GodotSharp" "$ENGINE/GodotSharp"
|
||||
# 3) clear the game's stale C# cache
|
||||
rm -rf "$GAME/.godot/mono"
|
||||
```
|
||||
|
||||
## 2b. Install — Windows (x64), PowerShell
|
||||
|
||||
```powershell
|
||||
$builds="<…>\builds"; $engine="<…>\engine\bin"; $game="<…>\ariki-game"
|
||||
New-Item -ItemType Directory -Force -Path $engine | Out-Null
|
||||
# 1) binaries
|
||||
Copy-Item "$builds\engine\windows-x64\tinqs.windows.editor.x86_64.mono.exe" $engine -Force
|
||||
Copy-Item "$builds\engine\windows-x64\tinqs.windows.editor.x86_64.mono.console.exe" $engine -Force
|
||||
# 2) GodotSharp — REPLACE wholesale (matched pair)
|
||||
Remove-Item -Recurse -Force "$engine\GodotSharp" -ErrorAction SilentlyContinue
|
||||
Copy-Item -Recurse "$builds\engine\windows-x64\GodotSharp" "$engine\GodotSharp"
|
||||
# 3) clear the game's stale C# cache
|
||||
Remove-Item -Recurse -Force "$game\.godot\mono" -ErrorAction SilentlyContinue
|
||||
```
|
||||
|
||||
## 3. Verify
|
||||
|
||||
```bash
|
||||
"$ENGINE/tinqs.macos.editor.arm64.mono" --version # matches manifest.json
|
||||
ls "$ENGINE/GodotSharp/Api/Debug/GodotSharp.dll" # MUST exist
|
||||
```
|
||||
Then run the game (`cd ariki-game && bash tools/game.sh run`). Healthy = terrain renders, animals
|
||||
animate, log shows **0** `Wrapper class not found` and no `.NET assemblies not found` dialog.
|
||||
|
||||
## Notes
|
||||
|
||||
- **GodotSharp must be present in this repo for the copy to work.** If `builds/engine/<platform>/GodotSharp`
|
||||
is missing, the build owner needs to add it (it ships *with* the binary — see `manifest.json`).
|
||||
- Don't mix a new binary with an old `GodotSharp`. Always replace both, together.
|
||||
- Terrain3D and the skinned-animation classes are **built into the engine binary** now (no separate
|
||||
`addons/terrain_3d` GDExtension `.framework`). If you still have `addons/terrain_3d/terrain.gdextension`
|
||||
or the macOS `.framework`, remove them — they conflict with the built-in module.
|
||||
Reference in New Issue
Block a user