Deep Sims makes Erenshor's existing SimPlayers feel more like persistent MMO companions. It observes verified game state, keeps bounded sidecar memory, and produces short social dialogue through deterministic templates or an optional local Ollama model.
Deep Sims does not replace Erenshor's Sim AI and does not control gameplay. Erenshor remains authoritative for movement, combat, pulls, healing, targeting, loot, grouping, roles, equipment, quests, faction, progression, and saves.
This branch is being prepared as a native Lunaris build. Treat 0.7.4 as a development/migration candidate until the compile and in-game conversation checklist is completed on a current Erenshor installation.
Part of the Forgotten Roads for Erenshor mod collection.
- Explicit opinion and preference questions stay with the Sim instead of triggering factual Wiki/news retrieval.
- Direct replies that fail grounding use a bounded grounded/template fallback; rejected generated claims remain hidden.
/dsbanternow creates a bounded connected A+B conversation thread through the existing Social Director.- Autonomous semantic seeds temporarily remember verifier rejection, reducing repeated unsupported prompts without turning rejected text into world knowledge.
- Erenshor
- Lunaris
- Ollama only if you want LLM-backed dialogue.
TemplatesandOffdo not require inference.
Deep Sims no longer requires BepInEx as its native plugin loader. Harmony is still used intentionally for verified Erenshor hooks and the existing rich command parser.
- Install Lunaris and launch Erenshor once.
- Put
ErenshorDeepSims.dllin:
<Erenshor>\plugins\ErenshorDeepSims.dll
- Launch Erenshor through the normal Lunaris installation.
- Use
/aistatusor/dsimsafter entering the game.
Do not copy Lunaris.dll, 0Harmony.dll, Newtonsoft, ImGui, or other Lunaris runtime libraries into the Deep Sims package. Lunaris owns those dependencies.
BUILD_AND_INSTALL.ps1 compiles against your current installed Erenshor assemblies plus local Lunaris developer references.
Put at least these two developer references in LunarisLibs\ or pass -LunarisLibDir:
Lunaris.dll
0Harmony.dll
Then run:
powershell -ExecutionPolicy Bypass -File .\BUILD_AND_INSTALL.ps1The script compiles to a temporary file first and copies only a completed DLL into <Erenshor>\plugins, avoiding a partial DLL being observed by Lunaris' runtime watcher.
After entering the game and grouping with SimPlayers:
/aistatus Deep Sims / Ollama status
/dsims current Deep Sim party status
/dssocial status social expression/activity status
/dsroleplay status MMO vs Roleplay perspective
/dssession current/last/outing encounter state
/dsperf performance and request diagnostics
Then simply talk in normal party chat. Deep Sims preserves Erenshor's ordinary command-bearing group chat path.
/dssocial controls how autonomous social lines are expressed:
Auto use LLM when appropriate/healthy; deterministic fallback when not
LLM prefer the local model
Templates deterministic social expression only
Off disable autonomous Deep Sims social expression
Activity can independently be Adaptive, Quiet, Normal, or Lively.
/dsroleplay controls who the Sim is speaking as, independently from expression mode:
/dsroleplay on Roleplay: speak as the adventurer represented by the Sim
/dsroleplay off MMO: speak like another old-school MMO player
/dsroleplay status
Roleplay does not change talk frequency, grounding, gameplay authority, or memory truth. It changes voice/perspective only. Roleplay autonomous output has an additional guard against MMO/meta language, narration, invented affiliation/history, and post-generation typing texture such as lol or text faces.
Native settings are registered through Lunaris and appear in its config system. The expected config file is:
<Erenshor>\plugins\config\erenshordeepsims.lpcfg
Deep Sims-owned sidecar data lives under:
<Erenshor>\plugins\config\DeepSims\
Memory\
Exports\
Deep Sims never writes its social memory into Erenshor save files.
The native Lunaris configuration starts as a fresh typed Lunaris config; this migration deliberately does not guess at or rewrite arbitrary old BepInEx settings.
For a simple direct game-root legacy install only, if the new Lunaris memory directory is empty, Deep Sims will copy existing files from:
<Erenshor>\BepInEx\config\DeepSims\Memory
into the new Lunaris sidecar directory. The old files are left untouched. r2modman/Thunderstore profile directories are not searched automatically.
Deep Sims separates observed/verified state from heard or generated text. Broadly:
OBSERVED_NOW
> verified EXPERIENCE / EVENTS
> bounded REMEMBERED summaries
> wiki / official game news
> external real-world news
> HEARD dialogue/player claims
> UNKNOWN
Generated dialogue is evidence only that a line was said. It is never proof that its content happened. Unsupported phrases such as again, last time, or shared-history claims are rejected unless verified history supports them.
0.7.2 adds a separate typed LivePartyFacts boundary for current party membership. GameData.GroupMembers is the primary native authority; manual Deep Sim slots only filter which already-grouped local Sims may be enhanced and can never create membership. Every party-facing inference captures a membership version immediately before prompting, revalidates it after inference/before grounding, and checks it again at the final display boundary. A short empty-roster hold during zoning is represented as transition_uncertain, never as confirmed current membership. Remote COOP humans may appear as context when the existing COOP bridge proves them, but they are never eligible generated speakers.
A deterministic final party-stance guard rejects or narrowly rewrites lines that conflict with live membership (for example an already-grouped Sim asking to be invited). See DEEP_SIMS_PARTY_GROUNDING_IMPLEMENTATION.md and LIVE_TEST.md.
/aistatus model/plugin status
/aitest AI/integration smoke test
/aimodel <model> change Ollama model
/dwhisper <Sim> <text> force an AI whisper
/vwhisper <Sim> <text> request vanilla-style handling
/dsbanter start a bounded connected A+B banter thread
/dssession encounter/session state
/dsperf performance/request diagnostics
/dsmemory [Sim] bounded memory inspection
/dsforget <Sim> ... forget eligible flavor/social data
/dsexport [full] concise/detailed session export
/dsevents ... verified event-director controls
/dsseeds ... autonomous seed diagnostics
/dsguardtest grounding/contract smoke tests
/dsinference ... auto/CPU/GPU inference mode
/dsreasoning ... reasoning-model routing
/dsxnews <query> explicit external-news lookup
/dsnewsources external-news source status
/dscamp ... Campmaster context integration
/dssocial ... expression/activity controls
/dsroleplay ... MMO/Roleplay perspective
Deep Sims deliberately keeps its existing Harmony-backed TypeText.CheckCommands parser instead of converting these to Lunaris command attributes. The current commands include optional and multiword/free-form grammar, and the inspected Lunaris command surface does not provide the unregister semantics this project requires for safe hot unload.
COOP is optional. When detected, Deep Sims preserves its conservative host-authority model. Remote humans are not classified as local Sims, remote chat remains HEARD rather than verified fact, and generated Sim speech is not given invented network replication authority.
Deep Sims remains standalone. Current optional integrations include Campmaster, Practice Duels, PvP, Nemesis, and related suite components. Existing narrow runtime/reflection contracts remain optional and absent-safe during this migration; they are not being forced to Aura until both sides have stable native contracts.
BUILD_AND_INSTALL.ps1 does not build sibling mods unless -BuildCompanionMods is explicitly supplied.
Suite Hub is optional. Deep Sims publishes a versioned primitive-only DeepSimsControlApi/Aura surface and never references Hub types. Hub may show a coarse enabled/perspective/Ollama status and edit an allowlisted subset of normal player settings. Basic controls are Perspective (MMO/Roleplay), Social expression (Auto/LLM/Templates/Off), Social activity (Adaptive/Quiet/Normal/Lively), autonomous chatter, and party-chat replies. Advanced controls cover existing social/knowledge/runtime toggles plus inference/reasoning routing; developer controls are limited to verbose/seed diagnostics.
API keys, endpoint URLs, raw memories, conversation history, prompts, filesystem paths, and arbitrary command execution are deliberately absent from the Hub setting surface. Changing perspective through Hub uses the same Roleplay state/config path as /dsroleplay; it does not bypass the final Roleplay output guard, grounding, quality checks, generation invalidation, or gameplay-authority boundaries.
The pending-Ollama unload/re-enable sequence remains a live validation requirement. Source guards alone are not treated as proof that repeated runtime unload/reload is release-ready.
- Ollama defaults to a local endpoint.
- Wiki/news lookups are optional and bounded.
- External real-world news is conversation-scoped and never becomes Erenshor lore or permanent Sim memory.
- API keys are never intentionally logged or exported.
- Deep Sims memory remains local sidecar data.
- Do not publish personal memory exports or private logs with bug reports unless you have reviewed them.
Lunaris can unload plugins while Erenshor is running, so OnDestroy() is part of correctness. Deep Sims now stops new request admission, invalidates conversation generations, clears queued display work, finishes/flushes sidecar state, removes its Harmony patches, clears Roleplay runtime context, and clears the plugin singleton without waiting indefinitely for an Ollama request.
Before calling a native Lunaris build release-ready, test:
- load Deep Sims and join a party;
- start an Ollama request;
- unload Deep Sims through Lunaris while the request is pending;
- confirm no late chat appears and no Harmony behavior remains;
- reload and confirm exactly one working instance;
- repeat unload/reload several times;
- zone, then repeat unload/reload;
- verify no duplicated chat, callbacks, social events, or memory writers.
See LUNARIS_RELEASE_CHECKLIST.md in the migration package for the complete matrix.
UNINSTALL.ps1 removes only the native Deep Sims DLL by default and preserves config/memory.
To intentionally remove Deep Sims-owned config and sidecar data too:
.\UNINSTALL.ps1 -RemoveDataErenshor save files are never deleted by this script.
If Deep Sims does not appear:
-
verify Lunaris itself loads;
-
verify
ErenshorDeepSims.dllis under<Erenshor>\plugins; -
check the Lunaris console/log for an assembly or Harmony error;
-
rebuild against the current
Assembly-CSharp.dllafter an Erenshor update; -
use
/aistatus,/dsperf,/dsguardtest, and/dsinspectwhen available. -
if Ollama is unavailable, use
Templatesmode to verify the social layer independently from model inference.
- Forgotten Roads: Practice Duel: friendly, non-lethal virtual-health duels with local Sims.
- Forgotten Roads: PvP: standalone off-map Sim-profile PvP encounters.
- Forgotten Roads: Follow: deterministic player follow, Sim-led travel, and expeditions.
- Forgotten Roads: Party Tools: ready checks, cosmetic rolls, friend availability, and a compact command panel.
- Forgotten Roads: Campmaster: read-only Hunt Camp and Relax social-context modes.
- Forgotten Roads: Nemesis: an optional persistent rival system that can use PvP results when PvP is installed.
- CustomSimFramework by PuzzelPiece / TeamSaltyBois — inspiration for exploring richer Sim social behavior. Deep Sims is an independent implementation and does not use its code.
- Erenshor COOP by MizukiBelhi — important compatibility/reference work, especially for local-vs-remote actor boundaries. No COOP code is included.
- Lunaris by MizukiBelhi — native Erenshor loader/config/plugin API used by this migration.
Development is guided through design, testing, playtesting, audits, and iteration against Erenshor. Bug reports, code review, corrections, and contributions from experienced Erenshor modders are welcome.
This is an unofficial community-made mod for Erenshor and is not affiliated with or endorsed by the game's developer.