Compare commits
1 Commits
mimo/creat
...
mimo/code/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
536744ec21 |
@@ -1,169 +1,132 @@
|
||||
# Legacy Matrix Audit — Migration Table
|
||||
# Legacy Matrix Audit
|
||||
|
||||
Purpose:
|
||||
Preserve quality work from `/Users/apayne/the-matrix` before the Nexus browser shell is rebuilt.
|
||||
Preserve useful work from `/Users/apayne/the-matrix` before the Nexus browser shell is rebuilt.
|
||||
|
||||
Canonical rule:
|
||||
- `Timmy_Foundation/the-nexus` is the only canonical 3D repo.
|
||||
- `/Users/apayne/the-matrix` is legacy source material, not a parallel product.
|
||||
- This document is the authoritative migration table for issue #685.
|
||||
|
||||
## Verified Legacy State
|
||||
## Verified Legacy Matrix State
|
||||
|
||||
Local legacy repo: `/Users/apayne/the-matrix`
|
||||
Local legacy repo:
|
||||
- `/Users/apayne/the-matrix`
|
||||
|
||||
Observed facts:
|
||||
- Vite browser app, vanilla JS + Three.js 0.171.0
|
||||
- 24 JS modules under `js/`
|
||||
- Smoke suite: 87 passed, 0 failed
|
||||
- Package scripts: dev, build, preview, test
|
||||
- PWA manifest + service worker
|
||||
- Vite config with code-splitting (Three.js in separate chunk)
|
||||
- Quality-tier system for hardware detection
|
||||
- WebSocket client with reconnection, heartbeat, mock mode
|
||||
- Full avatar FPS movement + PiP camera
|
||||
- Sub-world portal system with zone triggers
|
||||
- Vite browser app exists
|
||||
- `npm test` passes with `87 passed, 0 failed`
|
||||
- 23 JS modules under `js/`
|
||||
- package scripts include `dev`, `build`, `preview`, and `test`
|
||||
|
||||
## Migration Table
|
||||
## Known historical Nexus snapshot
|
||||
|
||||
Decision key:
|
||||
- **CARRY** = transplant concepts and patterns into Nexus vNext
|
||||
- **ARCHIVE** = keep as reference, do not directly transplant
|
||||
- **DROP** = do not preserve unless re-justified
|
||||
Useful in-repo reference point:
|
||||
- `0518a1c3ae3c1d0afeb24dea9772102f5a3d9a66`
|
||||
|
||||
### Core Modules
|
||||
That snapshot still contains browser-world root files such as:
|
||||
- `index.html`
|
||||
- `app.js`
|
||||
- `style.css`
|
||||
- `package.json`
|
||||
- `tests/`
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `js/main.js` | 180 | App bootstrap, render loop, WebGL context recovery | **CARRY** | Architectural pattern. Shows clean init/teardown lifecycle, context-loss recovery, visibility pause. Nexus needs this loop but should not copy the monolithic wiring. |
|
||||
| `js/world.js` | 95 | Scene, camera, renderer, grid, lights | **CARRY** | Foundational. Quality-tier-aware renderer setup, grid floor, lighting. Nexus already has a world but should adopt the tier-aware antialiasing and pixel-ratio capping. |
|
||||
| `js/config.js` | 68 | Connection config via URL params + env vars | **ARCHIVE** | Pattern reference only. Nexus config should route through Hermes harness, not Vite env vars. The URL-override pattern (ws, token, mock) is worth remembering. |
|
||||
| `js/quality.js` | 90 | Hardware detection, quality tier (low/medium/high) | **CARRY** | Directly useful. DPR capping, core/memory/screen heuristics, WebGL renderer sniffing. Nexus needs this for graceful degradation on Mac/iPad. |
|
||||
| `js/storage.js` | 39 | Safe localStorage with in-memory fallback | **CARRY** | Small, robust, sandbox-proof. Nexus should use this or equivalent. Prevents crashes in sandboxed iframes. |
|
||||
## Rescue Candidates
|
||||
|
||||
### Agent System
|
||||
### Carry forward into Nexus vNext
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `js/agent-defs.js` | 30 | Agent identity data (id, label, color, role, position) | **CARRY** | Seed data model. Nexus agents should be defined similarly — data-driven, not hardcoded in render logic. Color hex helper is trivial but useful. |
|
||||
| `js/agents.js` | 523 | Agent 3D objects, movement, state, connection lines, hot-add/remove | **CARRY** | Core visual system. Shared geometries (perf), movement interpolation, wallet-health stress glow, auto-placement algorithm, connection-line pulse. All valuable. Needs integration with real agent state from Hermes. |
|
||||
| `js/behaviors.js` | 413 | Autonomous agent behavior state machine | **ARCHIVE** | Pattern reference. The personality-weighted behavior selection, conversation pairing, and artifact-placement system are well-designed. But Nexus behaviors should be driven by Hermes, not a client-side simulation. Keep the architecture, drop the fake-autonomy. |
|
||||
| `js/presence.js` | 139 | Agent presence HUD (online/offline, uptime, state) | **CARRY** | Valuable UX. Live "who's here" panel with uptime tickers and state indicators. Needs real backend state, not mock assumptions. |
|
||||
1. `agent-defs.js`
|
||||
- agent identity definitions
|
||||
- useful as seed data/model for visible entities in the world
|
||||
|
||||
### Visitor & Interaction
|
||||
2. `agents.js`
|
||||
- agent objects, state machine, connection lines
|
||||
- useful for visualizing Timmy / subagents / system processes in a world-native way
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `js/visitor.js` | 141 | Visitor enter/leave protocol, chat input | **CARRY** | Session lifecycle. Device detection, visibility-based leave/return, chat input wiring. Directly applicable to Nexus visitor tracking. |
|
||||
| `js/avatar.js` | 360 | FPS movement, PiP dual-camera, touch input | **CARRY** | Visitor embodiment. WASD + arrow movement, first/third person swap, PiP canvas, touch joystick, right-click mouse-look. Strong work. Needs tuning for Nexus world bounds. |
|
||||
| `js/interaction.js` | 296 | Raycasting, click-to-select agents, info popup | **CARRY** | Essential for any browser world. OrbitControls, pointer/tap detection, agent popup with state/role, TALK button. The popup-anchoring-to-3D-position logic is particularly well done. |
|
||||
| `js/zones.js` | 161 | Proximity trigger zones (portal enter/exit, events) | **CARRY** | Spatial event system. Portal traversal, event triggers, once-only zones. Nexus portals (#672) need this exact pattern. |
|
||||
3. `avatar.js`
|
||||
- visitor embodiment, movement, camera handling
|
||||
- strongly aligned with "training ground" and "walk the world" goals
|
||||
|
||||
### Chat & Communication
|
||||
4. `ui.js`
|
||||
- HUD, chat surfaces, overlays
|
||||
- useful if rebuilt against real harness data instead of stale fake state
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `js/bark.js` | 141 | Speech bubble system with typing animation | **CARRY** | Timmy's voice in-world. Typing animation, queue, auto-dismiss, emotion tags, demo bark lines. Strong expressive presence. The demo lines ("The Tower watches. The Tower remembers.") are good seed content. |
|
||||
| `js/ui.js` | 285 | Chat panel, agent list, HUD, streaming tokens | **CARRY** | Chat infrastructure. Rolling chat buffer, per-agent localStorage history, streaming token display with cursor animation, HTML escaping. Needs reconnection to Hermes chat instead of WS mock. |
|
||||
| `js/transcript.js` | 183 | Conversation transcript logger, export | **ARCHIVE** | Pattern reference. The rolling buffer, structured JSON entries, TXT/JSON download, HUD badge are all solid. But transcript authority should live in Hermes, not browser localStorage. Keep the UX pattern, rebuild storage layer. |
|
||||
5. `websocket.js`
|
||||
- browser-side live bridge patterns
|
||||
- useful if retethered to Hermes-facing transport
|
||||
|
||||
### Visual Effects
|
||||
6. `transcript.js`
|
||||
- local transcript capture pattern
|
||||
- useful if durable truth still routes through Hermes and browser cache remains secondary
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `js/effects.js` | 195 | Matrix rain particles + starfield | **CARRY** | Atmospheric foundation. Quality-tier particle counts, frame-skip optimization, adaptive draw-range (FPS-budget recovery), bounding-sphere pre-compute. This is production-grade particle work. |
|
||||
| `js/ambient.js` | 212 | Mood-driven atmosphere (lighting, fog, rain, stars) | **CARRY** | Scene mood engine. Smooth eased transitions between mood states (calm, focused, excited, contemplative, stressed), per-mood lighting/fog/rain/star parameters. Directly supports Nexus atmosphere. |
|
||||
| `js/satflow.js` | 261 | Lightning payment particle flow | **CARRY** | Economy visualization. Bezier-arc particles, staggered travel, burst-on-arrival, pooling. If Nexus shows any payment/economy flow, this is the pattern. |
|
||||
7. `ambient.js`
|
||||
- mood / atmosphere system
|
||||
- directly supports wizardly presentation without changing system authority
|
||||
|
||||
### Economy & Scene
|
||||
8. `satflow.js`
|
||||
- visual economy / payment flow motifs
|
||||
- useful if Timmy's economy/agent interactions become a real visible layer
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `js/economy.js` | 100 | Wallet/treasury HUD panel | **ARCHIVE** | UI pattern reference. Clean sats formatting, per-agent balance rows, health-colored dots, recent transactions. Worth rebuilding when backed by real sovereign metrics. |
|
||||
| `js/scene-objects.js` | 718 | Dynamic 3D object registry, portals, sub-worlds | **CARRY** | Critical. Geometry/material factories, animation system (rotate/bob/pulse/orbit), portal visual (torus ring + glow disc + zone), sub-world load/unload, text sprites, compound groups. This is the most complex and valuable module. Nexus portals (#672) should build on this. |
|
||||
9. `economy.js`
|
||||
- treasury / wallet panel ideas
|
||||
- useful if later backed by real sovereign metrics
|
||||
|
||||
### Backend Bridge
|
||||
10. `presence.js`
|
||||
- who-is-here / online-state UI
|
||||
- useful for showing human + agent + process presence in the world
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `js/websocket.js` | 598 | WebSocket client, message dispatcher, mock mode | **ARCHIVE** | Pattern reference only. Reconnection with exponential backoff, heartbeat/zombie detection, rich message dispatch (40+ message types), streaming chat support. The architecture is sound but must be reconnected to Hermes transport, not copied wholesale. The message-type catalog is the most valuable reference artifact. |
|
||||
| `js/demo.js` | ~300 | Demo autopilot (mock mode simulation) | **DROP** | Fake activity simulation. Deliberately creates the illusion of live data. Do not preserve. If Nexus needs a demo mode, build a clearly-labeled one that doesn't pretend to be real. |
|
||||
11. `interaction.js`
|
||||
- clicking, inspecting, selecting world entities
|
||||
- likely needed in any real browser-facing Nexus shell
|
||||
|
||||
### Testing & Build
|
||||
12. `quality.js`
|
||||
- hardware-aware quality tiering
|
||||
- useful for local-first graceful degradation on Mac hardware
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `test/smoke.mjs` | 235 | Automated browser smoke test suite | **CARRY** | Testing discipline. Module inventory check, export verification, HTML structure validation, Vite build test, bundle-size budget, PWA manifest check. Nexus should adopt this pattern (adapted for its own module structure). |
|
||||
| `vite.config.js` | 53 | Build config with code splitting, SW generation | **ARCHIVE** | Build tooling reference. manualChunks for Three.js, SW precache generation plugin. Relevant if Nexus re-commits to Vite. |
|
||||
| `sw.js` | ~40 | Service worker with precache | **ARCHIVE** | PWA reference. Relevant only if Nexus pursues offline-first PWA. |
|
||||
| `manifest.json` | ~20 | PWA manifest | **ARCHIVE** | PWA reference. |
|
||||
13. `bark.js`
|
||||
- prominent speech / bark system
|
||||
- strong fit for Timmy's expressive presence in-world
|
||||
|
||||
### Server-Side (Python)
|
||||
14. `world.js`, `effects.js`, `scene-objects.js`, `zones.js`
|
||||
- broad visual foundation work
|
||||
- should be mined for patterns, not blindly transplanted
|
||||
|
||||
| File | Lines | Capability | Decision | Why for Nexus |
|
||||
|------|-------|------------|----------|---------------|
|
||||
| `server/bridge.py` | ~900 | WebSocket bridge server | **ARCHIVE** | Reference. Hermes replaces this role. Keep for protocol schema reference. |
|
||||
| `server/gateway.py` | ~400 | HTTP gateway | **ARCHIVE** | Reference. |
|
||||
| `server/ollama_client.py` | ~280 | Ollama integration | **ARCHIVE** | Reference. Relevant if Nexus needs local model calls. |
|
||||
| `server/research.py` | ~450 | Research pipeline | **ARCHIVE** | Reference. |
|
||||
| `server/webhooks.py` | ~350 | Webhook handler | **ARCHIVE** | Reference. |
|
||||
| `server/test_*.py` | ~5 files | Server test suites | **ARCHIVE** | Testing patterns worth studying. |
|
||||
15. `test/smoke.mjs`
|
||||
- browser smoke discipline
|
||||
- should inform rebuilt validation in canonical Nexus repo
|
||||
|
||||
## Summary by Decision
|
||||
### Archive as reference, not direct carry-forward
|
||||
|
||||
### CARRY FORWARD (17 modules)
|
||||
These modules contain patterns, algorithms, or entire implementations that should move into the Nexus browser shell:
|
||||
- demo/autopilot assumptions that pretend fake backend activity is real
|
||||
- any websocket schema that no longer matches Hermes truth
|
||||
- Vite-specific plumbing that is only useful if we consciously recommit to Vite
|
||||
|
||||
- `quality.js` — hardware detection
|
||||
- `storage.js` — safe persistence
|
||||
- `world.js` — scene foundation
|
||||
- `agent-defs.js` — agent data model
|
||||
- `agents.js` — agent visualization + movement
|
||||
- `presence.js` — online presence HUD
|
||||
- `visitor.js` — session lifecycle
|
||||
- `avatar.js` — FPS embodiment
|
||||
- `interaction.js` — click/select/raycast
|
||||
- `zones.js` — spatial triggers
|
||||
- `bark.js` — speech bubbles
|
||||
- `ui.js` — chat/HUD
|
||||
- `effects.js` — particle effects
|
||||
- `ambient.js` — mood atmosphere
|
||||
- `satflow.js` — payment flow particles
|
||||
- `scene-objects.js` — dynamic objects + portals
|
||||
- `test/smoke.mjs` — smoke test discipline
|
||||
### Deliberately drop unless re-justified
|
||||
|
||||
### ARCHIVE AS REFERENCE (9 modules/files)
|
||||
Keep for patterns, protocol schemas, and architectural reference. Do not directly transplant:
|
||||
|
||||
- `config.js` — config pattern (use Hermes instead)
|
||||
- `behaviors.js` — behavior architecture (use Hermes-driven state)
|
||||
- `transcript.js` — transcript UX (use Hermes storage)
|
||||
- `economy.js` — economy UI pattern (use real metrics)
|
||||
- `websocket.js` — message protocol catalog + reconnection patterns
|
||||
- `vite.config.js` — build tooling
|
||||
- `sw.js`, `manifest.json` — PWA reference
|
||||
- `server/*.py` — server protocol schemas
|
||||
|
||||
### DELIBERATELY DROP (2)
|
||||
Do not preserve unless re-justified:
|
||||
|
||||
- `demo.js` — fake activity simulation; creates false impression of live system
|
||||
- `main.js` monolithic wiring — the init pattern carries, the specific module wiring does not
|
||||
- anything that presents mock data as if it were live
|
||||
- anything that duplicates a better Hermes-native telemetry path
|
||||
- anything that turns the browser into the system of record
|
||||
|
||||
## Concern Separation for Nexus vNext
|
||||
|
||||
When rebuilding inside `the-nexus`, keep these concerns in separate modules:
|
||||
When rebuilding inside `the-nexus`, keep concerns separated:
|
||||
|
||||
1. **World shell** — scene, camera, renderer, grid, lights, fog
|
||||
2. **Effects layer** — rain, stars, ambient mood transitions
|
||||
3. **Agent visualization** — 3D objects, labels, connection lines, movement
|
||||
4. **Visitor embodiment** — avatar, FPS controls, PiP camera
|
||||
5. **Interaction layer** — raycasting, selection, zones, portal traversal
|
||||
6. **Communication surface** — bark, chat panel, streaming tokens
|
||||
7. **Presence & HUD** — who's-online, economy panel, transcript controls
|
||||
8. **Harness bridge** — WebSocket/API transport to Hermes (NOT a copy of websocket.js)
|
||||
9. **Quality & config** — hardware detection, runtime configuration
|
||||
10. **Smoke tests** — automated validation
|
||||
1. World shell / rendering
|
||||
- scene, camera, movement, atmosphere
|
||||
|
||||
2. Presence and embodiment
|
||||
- avatar, agent placement, selection, bark/chat surfaces
|
||||
|
||||
3. Harness bridge
|
||||
- websocket / API bridge from Hermes truth into browser state
|
||||
|
||||
4. Visualization panels
|
||||
- metrics, presence, economy, portal states, transcripts
|
||||
|
||||
5. Validation
|
||||
- smoke tests, screenshot proof, provenance checks
|
||||
|
||||
6. Game portal layer
|
||||
- Morrowind / portal-specific interaction surfaces
|
||||
|
||||
Do not collapse all of this into one giant app file again.
|
||||
Do not let visual shell code become telemetry authority.
|
||||
|
||||
112
portal/bannerlord/INSTALL.md
Normal file
112
portal/bannerlord/INSTALL.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# Bannerlord Local Install Guide (macOS / Apple Silicon)
|
||||
|
||||
## Goal
|
||||
Run the GOG Mount & Blade II: Bannerlord build natively on Alexander's Mac (arm64, macOS Sequoia+).
|
||||
|
||||
## Prerequisites
|
||||
- macOS 14+ on Apple Silicon (arm64)
|
||||
- ~60 GB free disk space (game + Wine prefix)
|
||||
- GOG installer files in `~/Downloads/`:
|
||||
- `setup_mount__blade_ii_bannerlord_1.3.15.109797_(64bit)_(89124).exe`
|
||||
- `setup_mount__blade_ii_bannerlord_1.3.15.109797_(64bit)_(89124)-1.bin` through `-13.bin`
|
||||
|
||||
## Step 1: Install Porting Kit
|
||||
|
||||
Porting Kit (free) wraps Wine/GPTK for macOS. It has a GUI but we automate what we can.
|
||||
|
||||
```bash
|
||||
brew install --cask porting-kit
|
||||
```
|
||||
|
||||
Launch it once to complete first-run setup:
|
||||
```bash
|
||||
open -a "Porting Kit"
|
||||
```
|
||||
|
||||
## Step 2: Create Wine Prefix + Install Game
|
||||
|
||||
**Option A: Via Porting Kit GUI (recommended)**
|
||||
|
||||
1. Open Porting Kit
|
||||
2. Click "Install Game" → "Custom Port" or search for Bannerlord
|
||||
3. Point it at: `~/Downloads/setup_mount__blade_ii_bannerlord_1.3.15.109797_(64bit)_(89124).exe`
|
||||
4. Follow the GOG installer wizard
|
||||
5. Install to default path inside the Wine prefix
|
||||
6. When done, note the prefix path (usually `~/Library/Application Support/PortingKit/...`)
|
||||
|
||||
**Option B: Manual Wine prefix (advanced)**
|
||||
|
||||
If you have Homebrew Wine (or GPTK) installed:
|
||||
|
||||
```bash
|
||||
# Create prefix
|
||||
export WINEPREFIX="$HOME/Games/Bannerlord"
|
||||
wine64 boot /init
|
||||
|
||||
# Run the GOG installer (it auto-chains the .bin files)
|
||||
cd ~/Downloads
|
||||
wine64 setup_mount__blade_ii_bannerlord_1.3.15.109797_\(64bit\)_\(89124\).exe
|
||||
```
|
||||
|
||||
Follow the GOG installer wizard. Default install path is fine.
|
||||
|
||||
## Step 3: Locate the Game Binary
|
||||
|
||||
After installation, the game executable is at:
|
||||
```
|
||||
$WINEPREFIX/drive_c/GOG Games/Mount & Blade II Bannerlord/bin/Win64_Shipping_Client/Bannerlord.exe
|
||||
```
|
||||
|
||||
Or inside Porting Kit's prefix at:
|
||||
```
|
||||
~/Library/Application Support/PortingKit/<prefix-name>/drive_c/GOG Games/Mount & Blade II Bannerlord/bin/Win64_Shipping_Client/Bannerlord.exe
|
||||
```
|
||||
|
||||
## Step 4: First Launch
|
||||
|
||||
```bash
|
||||
# Find the actual path first, then:
|
||||
cd "$HOME/Games/Bannerlord/drive_c/GOG Games/Mount & Blade II Bannerlord/bin/Win64_Shipping_Client"
|
||||
wine64 Bannerlord.exe
|
||||
```
|
||||
|
||||
Or use the launcher script:
|
||||
```bash
|
||||
./portal/bannerlord/launch.sh
|
||||
```
|
||||
|
||||
## Step 5: Proof (Operator Checklist)
|
||||
|
||||
- [ ] Game window opens and is visible on screen
|
||||
- [ ] At least the main menu renders (TaleWorlds logo, "Campaign", "Custom Battle", etc.)
|
||||
- [ ] Screenshot taken: save to `portal/bannerlord/proof/`
|
||||
- [ ] Launch command recorded below for repeatability
|
||||
|
||||
**Launch command (fill in after install):**
|
||||
```
|
||||
# Repeatable launch:
|
||||
./portal/bannerlord/launch.sh
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Black screen on launch:**
|
||||
- Try: `wine64 Bannerlord.exe -force-d3d11` or `-force-vulkan`
|
||||
- Set Windows version: `winecfg` → set to Windows 10
|
||||
|
||||
**Missing DLLs:**
|
||||
- Install DirectX runtime: `winetricks d3dx9 d3dx10 d3dx11 vcrun2019`
|
||||
|
||||
**Performance:**
|
||||
- GPTK/Rosetta overhead is expected; 30-60 FPS is normal on M1/M2
|
||||
- Lower in-game graphics settings to "Medium" for first run
|
||||
|
||||
**Installer won't chain .bin files:**
|
||||
- Make sure all .bin files are in the same directory as the .exe
|
||||
- Verify with: `ls -la ~/Downloads/setup_mount__blade_ii_bannerlord_*`
|
||||
|
||||
## References
|
||||
- GamePortal Protocol: `GAMEPORTAL_PROTOCOL.md`
|
||||
- Portal config: `portals.json` (entry: "bannerlord")
|
||||
- GOG App ID: Mount & Blade II: Bannerlord
|
||||
- Steam App ID: 261550 (for Steam stats integration)
|
||||
115
portal/bannerlord/launch.sh
Executable file
115
portal/bannerlord/launch.sh
Executable file
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env bash
|
||||
# Bannerlord Launcher for macOS (Apple Silicon via Wine/GPTK)
|
||||
# Usage: ./portal/bannerlord/launch.sh [--wine-prefix PATH] [--exe PATH]
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
|
||||
# Defaults — override with flags or environment
|
||||
WINEPREFIX="${WINEPREFIX:-$HOME/Games/Bannerlord}"
|
||||
BANNERLORD_EXE=""
|
||||
WINE_CMD=""
|
||||
|
||||
# Parse args
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--wine-prefix) WINEPREFIX="$2"; shift 2 ;;
|
||||
--exe) BANNERLORD_EXE="$2"; shift 2 ;;
|
||||
--help)
|
||||
echo "Usage: $0 [--wine-prefix PATH] [--exe PATH]"
|
||||
echo ""
|
||||
echo "Defaults:"
|
||||
echo " Wine prefix: $WINEPREFIX"
|
||||
echo " Auto-discovers Bannerlord.exe in the prefix"
|
||||
exit 0
|
||||
;;
|
||||
*) echo "Unknown arg: $1"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Find wine command
|
||||
find_wine() {
|
||||
if command -v wine64 &>/dev/null; then
|
||||
echo "wine64"
|
||||
elif command -v wine &>/dev/null; then
|
||||
echo "wine"
|
||||
elif [ -f "/Applications/Whisky.app/Contents/Resources/WhiskyCmd" ]; then
|
||||
echo "/Applications/Whisky.app/Contents/Resources/WhiskyCmd"
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
WINE_CMD="$(find_wine)"
|
||||
if [ -z "$WINE_CMD" ]; then
|
||||
echo "ERROR: No Wine runtime found."
|
||||
echo "Install one of:"
|
||||
echo " brew install --cask porting-kit"
|
||||
echo " brew install --cask crossover"
|
||||
echo " brew tap apple/apple && brew install game-porting-toolkit"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Wine runtime: $WINE_CMD"
|
||||
echo "Wine prefix: $WINEPREFIX"
|
||||
|
||||
# Find Bannerlord.exe if not specified
|
||||
if [ -z "$BANNERLORD_EXE" ]; then
|
||||
# Search common GOG install paths
|
||||
SEARCH_PATHS=(
|
||||
"$WINEPREFIX/drive_c/GOG Games/Mount & Blade II Bannerlord/bin/Win64_Shipping_Client/Bannerlord.exe"
|
||||
"$WINEPREFIX/drive_c/GOG Games/Mount Blade II Bannerlord/bin/Win64_Shipping_Client/Bannerlord.exe"
|
||||
"$WINEPREFIX/drive_c/Program Files/Mount & Blade II Bannerlord/bin/Win64_Shipping_Client/Bannerlord.exe"
|
||||
)
|
||||
|
||||
# Also search PortingKit prefixes
|
||||
while IFS= read -r -d '' exe; do
|
||||
SEARCH_PATHS+=("$exe")
|
||||
done < <(find "$HOME/Library/Application Support/PortingKit" -name "Bannerlord.exe" -print0 2>/dev/null || true)
|
||||
|
||||
for path in "${SEARCH_PATHS[@]}"; do
|
||||
if [ -f "$path" ]; then
|
||||
BANNERLORD_EXE="$path"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -z "$BANNERLORD_EXE" ] || [ ! -f "$BANNERLORD_EXE" ]; then
|
||||
echo "ERROR: Bannerlord.exe not found."
|
||||
echo "Searched:"
|
||||
echo " $WINEPREFIX/drive_c/GOG Games/"
|
||||
echo " ~/Library/Application Support/PortingKit/"
|
||||
echo ""
|
||||
echo "Run the install first. See: portal/bannerlord/INSTALL.md"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Game binary: $BANNERLORD_EXE"
|
||||
echo "Launching..."
|
||||
echo ""
|
||||
|
||||
# Log the launch for proof
|
||||
LAUNCH_LOG="$SCRIPT_DIR/proof/launch_$(date +%Y%m%d_%H%M%S).log"
|
||||
mkdir -p "$SCRIPT_DIR/proof"
|
||||
{
|
||||
echo "=== Bannerlord Launch ==="
|
||||
echo "Date: $(date -Iseconds)"
|
||||
echo "Wine: $WINE_CMD"
|
||||
echo "Prefix: $WINEPREFIX"
|
||||
echo "Binary: $BANNERLORD_EXE"
|
||||
echo "User: $(whoami)"
|
||||
echo "macOS: $(sw_vers -productVersion)"
|
||||
echo "Arch: $(uname -m)"
|
||||
echo "========================="
|
||||
} > "$LAUNCH_LOG"
|
||||
echo "Launch log: $LAUNCH_LOG"
|
||||
echo ""
|
||||
|
||||
# Set the prefix and launch
|
||||
export WINEPREFIX
|
||||
EXE_DIR="$(dirname "$BANNERLORD_EXE")"
|
||||
cd "$EXE_DIR"
|
||||
exec "$WINE_CMD" "Bannerlord.exe" "$@"
|
||||
16
portal/bannerlord/proof/README.md
Normal file
16
portal/bannerlord/proof/README.md
Normal file
@@ -0,0 +1,16 @@
|
||||
# Bannerlord Proof
|
||||
|
||||
Screenshots and launch logs proving the game runs locally on the Mac.
|
||||
|
||||
## How to capture proof
|
||||
|
||||
1. Launch the game: `./portal/bannerlord/launch.sh`
|
||||
2. Wait for main menu to render
|
||||
3. Take screenshot: `screencapture -x portal/bannerlord/proof/main_menu_$(date +%Y%m%d).png`
|
||||
4. Save launch log (auto-generated by launch.sh)
|
||||
|
||||
## Expected proof files
|
||||
|
||||
- `main_menu_*.png` — screenshot of game main menu
|
||||
- `launch_*.log` — launch command + environment details
|
||||
- `ingame_*.png` — optional in-game screenshots
|
||||
13
portals.json
13
portals.json
@@ -23,18 +23,21 @@
|
||||
"rotation": { "y": 0.5 },
|
||||
"portal_type": "game-world",
|
||||
"world_category": "strategy-rpg",
|
||||
"environment": "production",
|
||||
"environment": "local",
|
||||
"access_mode": "operator",
|
||||
"readiness_state": "active",
|
||||
"telemetry_source": "hermes-harness:bannerlord",
|
||||
"telemetry_source": "local-desktop:bannerlord",
|
||||
"owner": "Timmy",
|
||||
"app_id": 261550,
|
||||
"window_title": "Mount & Blade II: Bannerlord",
|
||||
"install_source": "gog",
|
||||
"gog_version": "1.3.15.109797",
|
||||
"launcher_script": "portal/bannerlord/launch.sh",
|
||||
"install_guide": "portal/bannerlord/INSTALL.md",
|
||||
"destination": {
|
||||
"url": "https://bannerlord.timmy.foundation",
|
||||
"type": "harness",
|
||||
"type": "local-launch",
|
||||
"action_label": "Enter Calradia",
|
||||
"params": { "world": "calradia" }
|
||||
"params": { "world": "calradia", "runtime": "wine/gptk" }
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user