Skip to content

Releases: jondwillis/kuluu-ffxi

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 12 Sep 02:19

Kuluu v0.7.0 is a ferry, movement, world-fidelity and installer release. You can now buy a ticket in Selbina or Mhaura and sail the ferry end to end, the player character walks on a single-authority collision resolver built on avian3d, zones are lit and populated the way retail lights them, and a fresh install no longer needs Wine or a hand-patched client.

Ferries and transport

  • The Selbina/Mhaura ferry works end to end: buy a ticket from Lucia, board automatically, sail on a hull with its own collision, use the cabin doors mid-voyage, and arrive. Hulls and FollowPoints motion load from retail DATs; interior lamps light the cabin.
  • Dock gates load from authored RID door barriers and follow the server's door animation, so an absent boat is blocked and boarding a docked one is natural.
  • Scripted passenger walks (Lucia, Catus) interpolate across the session cadence with a gait and land on the exact scripted end position.
  • Transport gate dialogs seed retail work slots from server event parameters, run the actor and position acknowledgements, and fold the accepted position into the completion datagram. Decline and insufficient-funds paths behave.
  • Airships: Zedduva's gate admission and exact fares are verified. Full airship journeys are not yet, and the schedule fallback remains open.

Movement and camera

  • New single-authority movement resolver: move_and_slide with horizontal wall collision, wall sliding, swept stair steps and retail's 45 degree floor/wall cutoff. A fall never passes through a steep bank.
  • Actor contact matches retail: a blocked move is withheld, never depenetrated, and mobs and NPCs soft-block.
  • Locked-on movement scales speed by direction like retail; walk runs at a third of run speed on forward and backpedal.
  • Entity spawn and player grounding wait for the zone's MZB floor to land, ending the first-load fall.
  • Remote players and mobs tween across sparse packet updates instead of overshooting, and stair grounding holds.
  • Chase camera moved onto the same resolver: position spring, orbit and avian collision. PgUp/PgDn zoom.

World rendering and lighting

  • Terrain ambient and diffuse come from the player's sub-area, so interiors and caves are lit per zone record.
  • Dynamic Lights true-up: the overbright-emitter heuristic is gone. The Enhanced mode casts shadow maps from the nearest DAT point lights, and skinned models receive those shadows.
  • Zone geometry no longer casts into the sun's shadow map. Self-shadow occlusion follows the illuminating light.
  • Zone-static particle generators now run every timed auto-run emitter, resolve global effect-dir meshes and honor the emit cull. Screen-billboard particles and actor-attached particles sit in the right frame.
  • Celestial particle sheets have their DXT3 alpha undithered; the moon tint is scraped from its sprite generator.
  • MMB vertex color unpacks as BGRA, fixing tinted geometry.
  • Smoke and effect sprite sheets with the retail 0x81 image header now resolve instead of being skipped.

Actors and nameplates

  • Nameplates are owned by the live entity table and anchored to authored model locators. Retail icon priority: monstrosity, ballista/besieged, job-master star, new-adventurer "?". Name colors follow entity status.
  • Invisible players hide their model and plate but stay targetable. Server-invisible entities never re-show through distance culling.
  • Mob animation decoder merged: worms pop up and dig with sound. Idle animations no longer freeze on non-selector mob flags.
  • Death plays the collapse once and holds the corpse frame. The zone-in DeadCounter is decoded; the numeric KO countdown is an Enhanced gate.

HUD, menus and audio

  • Items window matches retail layout with paging, the Options box, the Item submenu and the item card. Drop sends the retail item dump packet.
  • The vanilla compass radar returns above chat. Radar presentation is a single Config choice, and the minimap radar is a Vanilla/Enhanced setting.
  • Entity list shows claim state, STATUS names, a marker column and a target-row rectangle.
  • Retail+ section in the dev-only Debug menu: Mob HP Under and the party Job column. Status-ribbon countdowns are gated behind enhanced-buff-timers. DLSS is an opt-in source build with the NVIDIA SDK and is not included in these binaries.
  • Change Map lists every floor the retail zone-map table knows, so Delkfutt's Tower, the Horutoto Ruins and the WotG past zones no longer show zero rows.
  • BGM: battle music on a nearby party claim, day/night themes by Vana'diel hour, slot order as NormalMusicPlay does.
  • Client telemetry, bag capacities and now-playing lines moved off the chat log onto the debug channel.
  • Logout and shutdown countdowns cancel on stand-up.

Session and protocol

  • The server can retarget the client: s2c ASSIST is handled and forwarded as ChangeTarget without echoing back.
  • Self Mog House state comes only from the zone-in packet, never the party flag.
  • Skip the intro cutscene on new characters. The toggle and CLI flag only appear when a patched LSB lobby advertises the capability, and default on there, because Kuluu does not yet play the opening cutscene.
  • Event VM: work-slot arithmetic family implemented, transportation event parameters and gate admission fixed, and event state contracts enforced across VM, transport and gates.
  • Entity ingest sends O(changed) deltas instead of a full snapshot per tick.

Install and launcher

  • ffxi-install unpacks Square Enix's official installer natively and ships a native PlayOnline patch client, replacing the Wine viewer path.
  • The launcher install screen lists clients and fetches or updates the official one. One locator resolves the install the client loads.
  • Launcher falls back to an owner-only secrets file when no keyring daemon is running.
  • kuluu steam-shortcut registers the binary as a non-Steam shortcut for Steam Deck Game Mode.
  • Settings load salvages fields individually and clamps master volume and UI scale. A document with a non-finite UI scale is rejected and falls back to defaults.

What's Changed

  • Kuluu FFXI client: base additions (#502 + #512), 18/18 review-comment resolutions, feature-gate reorg by @cowrevenge in #517
  • Base: entity table, nameplate rework, skip intro CS, screenshot over relay by @cowrevenge in #521
  • Preserve scene updates and make opt-in DLSS builds reproducible by @jondwillis in #522
  • build(deps): bump futures-util from 0.3.32 to 0.3.34 by @dependabot[bot] in #506
  • build(deps): bump clap from 4.6.1 to 4.6.6 by @dependabot[bot] in #507
  • build(deps): bump log from 0.4.33 to 0.4.34 by @dependabot[bot] in #508
  • build(deps): bump chrono from 0.4.44 to 0.4.45 by @dependabot[bot] in #510
  • build(deps): bump rmcp from 2.2.0 to 3.1.4 by @dependabot[bot] in #509
  • Mob animation decoder: merge #541 onto main, resolve review by @jondwillis in #560

New Contributors

Full Changelog: v0.6.0...v0.7.0

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 24 Aug 20:28

What's Changed

  • build(deps): bump thiserror from 2.0.18 to 2.0.20 by @dependabot[bot] in #501
  • build(deps): bump console_log from 1.0.0 to 1.1.0 by @dependabot[bot] in #499
  • build(deps): bump rustls from 0.23.42 to 0.23.43 by @dependabot[bot] in #497
  • build(deps): bump bevy from 0.19.0 to 0.19.1 by @dependabot[bot] in #498

Full Changelog: v0.5.2...v0.6.0

v0.5.2

Choose a tag to compare

@github-actions github-actions released this 21 Aug 02:41

Kuluu v0.5.2

Fixes the Windows launch failure on machines without the Visual C++ redistributable. No gameplay changes.

The fix

Both Windows builds (x86_64 and aarch64) now statically link the MSVC C runtime (-C target-feature=+crt-static). Previously the exes imported VCRUNTIME140.dll, which Windows does not ship — it arrives via the VC++ redistributable. On x86_64 that redist is nearly ubiquitous so the dependency stayed invisible; on fresh Windows-on-ARM machines (Snapdragon laptops, Parallels VMs) it usually isn't installed, and v0.5.1's native ARM64 exe failed at launch with the missing-DLL dialog. Note the arch subtlety that made this bite: the x64 redist does not satisfy a native ARM64 exe.

Verified: the published v0.5.2 exes contain zero CRT DLL imports (vcruntime140 / msvcp140 / ucrt), checked directly against the shipped archives. No redistributable needed on any Windows machine, any arch.

If you previously worked around this by installing vc_redist.arm64.exe, that's no longer required (and harmless to keep).

Full Changelog: v0.5.1...v0.5.2

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 20 Aug 23:44

Kuluu v0.5.1

Native ARM builds for Linux and Windows. No gameplay changes since v0.5.0.

New platforms

  • kuluu-v0.5.1-aarch64-linux.tar.gz — native arm64 Linux. Runs on Asahi Linux, ARM SBCs/handhelds, and ARM servers (the headless agent mode, play --headless, needs no GPU). Verified by running the published binary natively in an arm64 Linux VM.
  • kuluu-v0.5.1-aarch64-windows.zip — native ARM64 Windows for Snapdragon laptops and Windows-on-ARM VMs (e.g. Parallels on Apple Silicon), which previously ran the x86_64 build under Prism emulation. Built natively with the MSVC arm64 toolchain.

The x86_64 Linux/Windows, macOS, and browser-WASM assets are unchanged in kind. If you're on an ARM machine, download the aarch64 asset for your OS; SHA256SUMS covers all six archives.

Full Changelog: v0.5.0...v0.5.1

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 18:58

Kuluu v0.5.0

The client is now named what it is: the binary is kuluu. Beyond the rename, this release brings the Auction House, treasure pools and item drops, fishing, chocobo riding, Widescan, retail nameplates, DAT-driven weather/sky/celestials, zone ambient audio, and a large performance program.

Breaking changes (the ffxi-*kuluu-* rename)

The crate namespace now carries the faithfulness boundary: ffxi-* crates hold domain truth — facts about the game, retail file formats, or the LSB protocol, provable against an authority — while kuluu-* crates are this product's own machinery. Enhanced (non-retail) behavior lives only on the kuluu-* side, behind opt-in gates, and checks.sh style enforces it.

What that changes for you:

  • The end-user binary is kuluu (kuluu.exe on Windows), was ffxi-client. Release archives are named kuluu-v0.5.0-<target> accordingly. Update launch scripts, aliases, and Steam/desktop shortcuts.
  • The MCP server binary is kuluu-mcp, was ffxi-mcp. MCP configs (.mcp.json, claude mcp add) pointing at an ffxi-mcp path must be updated.
  • Building from source: package names changed — cargo run -p kuluu -- play, cargo build -p kuluu-mcp. Renames: ffxi-clientkuluu, ffxi-sessionkuluu-session, ffxi-viewer-corekuluu-render, ffxi-viewer-wirekuluu-snapshot (it was never the FFXI wire protocol; it is the scene-snapshot contract), ffxi-viewer-wasmkuluu-viewer-wasm, ffxi-navkuluu-nav. ffxi-nav-recast stays ffxi-*: it wraps LSB's meshes.
  • RUST_LOG filters follow the lib names: kuluu=, kuluu_session::, kuluu_render:: (were ffxi_client/ffxi_session/ffxi_viewer_core).

Not changed: config and save locations (<config-dir>/kuluu/launcher.json, keybinds.json, markers.json, goal.json), the FFXI_USER/FFXI_PASS/FFXI_CHAR/FFXI_SERVER/FFXI_DAT_PATH env vars, and the v0.4.0 in-app update banner (it links to this release page; it does not auto-replace the binary, so the rename cannot strand it).

Also policy-level: default builds are vanilla — Enhanced features are opt-in — and the SceneSnapshot / AgentCommand / AgentEvent extension surfaces are pinned additive-only.

Economy & items

  • Auction House: browse the catalog, sell, and bid — full search-server transport, retail 0x04C/0x04E map packets, and a browse/sell/bid UI.
  • Treasure pools: pool packets decoded, lot/pass wired, drops announced in chat with the item name colored, wording read from the client message table — and chat lines use the retail lowercase log name from the item DAT ("You find a sprig of chamomile…"), while the pool window keeps display names.
  • Delivery box fixes: gil amounts named, menus open on their first row, button captions drawn.
  • Trade: the gil spinner now offers your actual gil (its max was hardcoded to 0); digit spinners borrow/carry arithmetically.
  • /check rebuilt as retail's icon grid, with bazaar browse and buy.

Out in the world

  • Chocobo riding: the rented mount renders, you sit where retail seats you, ride at retail speed, and the mount cutscene runs.
  • Fishing: rod/bait/facing-water gates, retail poses (the fsh* routines), landmark texts, and a Fish entry in the action menu.
  • Widescan: full list including beyond-spawn-range hits, plotted as map dots, with a cursor ring and compass track pointer.
  • Map screen: retail map image and calibration from the DLL record, markers aligned to the drawn picture, zoom on the camera-zoom keys (Period/Comma), scene damped underneath for contrast.
  • Doors open. Sub-area interiors swap in correctly, with their shell's collision suppressed.
  • NPC dialog / cutscenes: the event VM gained 25 opcodes and honors retail's input polls and timed waits; zone-in cutscenes and TALKNUM lines with item names render.

Rendering & atmosphere

  • Nameplates: retail name colors and status icons from the menu DATs, drawn in a post-effects overlay pass (retail CXiActorNameDraw parity), legible at all depths.
  • Sky & celestials: sun and moon drawn from the zone DAT's celestial generators with retail's flare stage chain; dome/canopy sized off the frustum; the stored 4-bit alpha dither resolved.
  • Weather: retail's 20-row weather table, precipitation from the weat/ generators, zone-in weather from the 0x00A packet, per-generator fog honored.
  • Water: generator sea sheets at retail scroll rate with their proper scale/rotation/tint; placeholder planes suppressed beneath them.
  • Camera: retail default FOV (2·atan(192/350) ≈ 57.5°, was an uncited 50°), chase camera capped by retail's horizontal standoff and snapped behind you on zone-in.
  • Audio: zone ambient beds, placed positional SFX, and footsteps derived from the retail tables.

Performance

Snapshot translation moved off the Bevy main thread; per-action effect DATs load async and cache; skinned actors frustum-cull via posed AABBs; actor meshes and materials dedupe; particle meshes skip rebuilds when unchanged; per-frame writes that only change with the snapshot are gone; frame-critical threads get platform scheduling classes; a Frame Rate Cap graphics option landed.

Fixes worth knowing about

  • /tell now sends all 15 bytes of the recipient name (15-character names were truncated to 14 and silently ignored by the server).
  • Recast timers: the action-menu display and the dispatch gate now read the same clock, so the row un-greys exactly when the ability fires.
  • Auto-run survives a focused chat input; chat history recalls with Up/Down.
  • Your own character is mouse-targetable in third person, and other targets outrank your own hitbox.
  • The agent socket self-heals if macOS purges it from $TMPDIR mid-session.
  • markers.json is no longer rewritten on every menu keypress.

Full Changelog: v0.4.0...v0.5.0

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 27 Jul 18:25

The theme this cycle is making the world react: spells and melee now play their real retail effect routines with sound and particles, zones light and burn correctly at night, and the Map screen became a real full-screen UI.

Magic & abilities — driven by retail data, not guesses

  • Cast motion and cast time now come from the retail spell DAT (ROM/118/114.DAT), not server tables — so each spell uses its own animation and its cast bar matches retail timing.
  • Casting plays the caster's full effect routine, not a single motion clip — the complete retail sequence, including the completion effect.
  • MagicStart is decoded correctly: its argument is the effect-routine FourCC, which previously was misread as a spell id, breaking both the cast routine and interrupt handling.
  • Interrupting a spell now cancels the looping cast pose instead of leaving the character stuck in it.
  • The self-cast bar is modelled from real MagicStart round-trip timing.
  • Abilities on cooldown are blocked client-side, replacing the (h:mm:ss) placeholder text.
  • Cast directly on an already-valid target instead of forcing the sub-target step; sub-target cursor now colours by range, as retail does.
  • Boost: correct self-cast routing, sound, and battle-log line.

Melee combat

  • Swing and hit sounds are dispatched from the retail sound routines.
  • Hit-spark particles spawn on the victim, where retail puts them.

The effect/animation scheduler

  • Decodes several more retail routine stages: random-group sub-blocks, damage callbacks, blocking sub-routines, and branch-based routines.
  • Runs on the retail 60fps internal clock, with skeletons stepping at half rate — fixing effects that ran at the wrong speed.
  • Rest animations behave properly: the stand-up clip plays before movement resumes, In/Out clips play once instead of looping, and the self rest stance reconciles against the server's state byte.

Particles & lighting

  • SpriteSheet (0x0E) particles render — this Poison's venom cloud, previously a white blob.
  • Ambient fire and smoke generators render: campfires, hearths and braziers now actually burn.
  • Particle textures resolve by qualified name meshes), rather than by an id that frequentlymissed.
  • Zone lighting moved to Bevy clustered forwawn falloff — no more light pop-in.
  • Dynamic light budget is configurable, raised from 4 to up to 16 slots.
  • Lamps read correctly from a distance from te glow-billboard hack was removed.

Map screen (rebuilt)

  • A full-screen map surface with its own comm old panel.
  • Map markers: placement, naming (with a live text field), persistence, and rendering on both surfaces.
  • Change Map: browse other floors and other z
  • Zoom, refresh, name display, and /widescan gating fixes.

Interaction, events & dialog

  • Doors are targetable (tab and click) and support the Open action.
  • Picking is opt-in per mesh, so zone geometrs meant for entities.
  • Server customMenu dialogs (GMPROMPT / _CUSTOM_MENU) render as real interactive dialogs, with the reply packet fixed.
  • Event VM gained the LOADEXTSCHEDULER opcode
  • The event grace watchdog no longer force-ends a dialog the player is still reading — retail never times dialogs out;
    walking away or /endevent are the escapes.
  • System messages (e.g. home-point-set confirmation) now appear in the main chat log.
  • Retail-contextual lock key: H rests when no

Steam Deck & input

  • Gamepad navigation, movement/camera controld — the Deck is playable without a keyboard.

Audio

  • World SFX are positional: emitters carry a ce attenuation, instead of playing flat.

World & zone fidelity

  • Cloud canopies (weat/) are no longer mistak sky generators are identified by theircamera-follow flag rather than by name.
  • MZB placement-grid stride is derived from t assumed — this is what left Port Jeuno piledat the origin.
  • Movement no longer blocks at navmesh covera
  • Home Point crystals render solid and stable (no strobing or transparency flicker).

HUD & menus

  • Long static menus scroll, so the Graphics options' bottom rows stay reachable and no longer wrap past the window.
  • The Commands menu opens on page 1.

Correctness & robustness

  • NPC names are addressed by their embedded ed index — the previous indexing mislabelledNPCs.
  • The DAT chunk walker terminates cleanly on f reading past it.
  • Character selection at the lobby is by id alone, so no caller can mis-name it.
  • Real-DAT-dependent tests skip loudly rather

Build & release

  • Release pipeline fix: the auto-release path branch ref, publishing a release tagged main;it now uses the passed tag and hard-fails on any non-vX.Y.Z tag.
  • Dependency refresh (rustls, serde_json, uuiaken from crates.io, and glam pinned againstdependabot drift.

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 00:12

What's Changed

New Contributors

Full Changelog: v0.2.0...v0.3.0

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 26 Jun 16:14

Full Changelog: v0.1.0...v0.2.0