Elin Modding Improvements
The ideas below are collected from the Elin-Modding Discord channel and the Chinese Elin modding community. Many of them are inspired by or directly borrowed from the mod Custom Whatever Loader (CWL).
CWL References
Mod Localization
Currently, most moddable data only supports _JP and _EN entries.
Proposal: Adopt CWL's LangMod/**/ folder structure along with its path-relocation system to enable true multilingual support for mod resources.
This approach is not perfect, but it avoids modifying existing Elin data structures, preserving backward compatibility.
Suggested mod package layout:
📦 Mod Package
├── 📂 LangMod
│ ├── 📂 EN
│ │ ├── 📂 Data
│ │ │ └── 📘 Data Files, JSON configurations
│ │ ├── 📂 Dialog
│ │ │ ├── 📂 Drama
│ │ │ │ └── 📗 drama_example.xlsx
│ │ │ ├── 📗 dialog.xlsx
│ │ │ └── 📗 god_talk.xlsx
│ │ └── 📗 ModSources.xlsx
│ ├── 📂 CN
│ ├── 📂 JP (Can be omitted)
│ ├── 📂 ZHTW (Can be omitted)
│ └── 📂 KR/RU/ES (Other Langs)
├── 📂 Sound
│ ├── 📂 BGM
│ │ └── 🎵 bgm_xxx.mp3/ogg/wav
│ └── 🎵 new_sound.mp3/ogg/wav
├── 📄 package.xml
└── 🖼 preview.jpgSource Sheet Loading
The most used used CWL feature is loading mod source workbooks without requiring a compiled DLL.
The ModUtil.ImportExcel loads only one sheet at a time, which becomes slow when a mod contains many sheets (unless every sheet is split into separate files). CWL instead iterates all sheets automatically and imports them into the correct SourceData collection (Chara, Thing, Job, Race, etc.) based on sheet name.
Proposal: Add native support for automatically importing mod-provided source Excel workbooks.
Optional: Implement SourceData caching (as done in CWL): after the first parse, store the processed data as JSON blobs keyed by file hash/last-modified timestamp. This dramatically improves load times because most mods rarely update after publishing.
Character Spawning
CWL includes an system that spawns modded characters in the world or as adventurers based on tags. While popular, the current implementation is not considered stable enough for official adoption without some rework.
Dialog and Drama Systems
Dialog (Let's Talk!)
CWL merges each mod's dialog.xlsx into the game's Lang.excelDialog, allowing modded characters to have their own random lines using the same format.
Proposal: Natively support loading per-mod dialog.xlsx files for modded characters.
Drama Sheet Loading
Elin hard-codes drama sheet lookup to CorePath.DramaData. CWL patches this to use its path-relocation system, enabling mods to supply their own drama sheets.
Proposal:
- Allow drama sheets to be loaded from the appropriate
LangMod/**/Dialog/Drama/folder. - Extend the existing
Loadmethod to accept full file paths so scripts can load drama sheets at runtime.
Drama Text Localization
For very long drama sheets, maintaining separate language folders becomes cumbersome. CWL therefore supports optional text_XX columns (e.g., text_EN, text_CN, text_ZHTW) directly inside the drama sheet.
Proposal: Modify ParseLine to also look for the text_XX column matching the current LangCode.
Drama Invoke Actions
CWL introduces a lightweight DSL-style invoke* action system (similar to DramaOutcome) that calls external C# methods. Many mod authors find this extremely useful and some also register their own methods via reflection.
Proposal: Provide an API for script DLLs to register custom drama invoke handlers.
Game Events / Hook System
Most script-DLL functionality today relies on Harmony patches. These patches are fragile: any change to method signatures or mod conflicts can break mods or causes undefined behaviours.
Proposal: Introduce an official event-dispatcher system for commonly requested events (examples: OnPickupItem, OnCharaDie, OnMoveZone, OnDamageCalculated, etc.). Mods would simply subscribe to these events instead of patching methods just to get a callback.
This would not eliminate the need for Harmony entirely but would drastically reduce its use for simple event triggers.
Sound & BGM
Proposal:
- Automatically load sound effect and BGM files placed in a mod's
Sound/folder. - Provide a simple
SoundDataconfiguration file so modders can define clip names, volume, pitch, looping behavior, etc.
Optional: Support custom BGM playlists (with scene/zone overrides). This is entirely optional because there are a lot of hard-coded BGM switches in Elin.
Custom Effects
Creating new effects can be done using Unity AssetBundle, which is overly complex for simple sprite-based effects.
Proposal: Add runtime effect creation similar to SpriteAnimation and CWL's implementation: automatically slice provided sprite sheets into frames and generate Effect objects that mods can reference by id.
UI & Widgets
Creating new UI & Widgets right now can only be done with a lot of runtime patching or importing Unity AssetBundle to generate a Layer or new Widget.
Suggestion: I'm not sure if this feature is entirely needed, because there are mods providing similar functionality (YKFramework for Layer creations).
Exception Reporting (Optional)
CWL displays a detailed error popup that lists the full stack trace and highlights which Harmony patches (and therefore which mods) are involved. This is invaluable for debugging but may confuse or disturb non-modding players.
Suggestion: Include this feature as an opt-in dev mode or enable it only when mods are detected.