nonkit-vsc 

nonkit is a non-official mod development kit for the RPG game The NOexistenceN of Morphean Paradox : The Forest of Silver Shallots.
⚠️ Disclaimer: This is a fan project and is not affiliated with the developers or team behind NONMP. It's maintained to the best of my capacities, but keep in mind that NONMP is a new game currently in Early Access and rapidly changing, sometimes receiving more than one update per day as of writing. This project should be considered experimental.
What is this?
nonkit-vsc is a Visual Studio Code extension created as a helper tool for the developmnent of mods for the game. It integrates with nonkit-plugin to enable runtime modification of the game's storyline and injection of entirely new scenes, making the iteration cycle much faster than the traditional "edit, compile, replace files, restart game" workflow.
Building
To build the extension from source:
- Clone this repository
- Run
npm install to install dependencies
- Build the Yarn compiler shim:
cd nonkit-yarn-shim
dotnet build -c Release
- Compile the extension with
npm run compile (or npm run watch for development)
- To package the extension as a
.vsix, run npm run package:vsix
The extension requires the .NET SDK to build the Yarn compiler shim.
Installation
Prerequisites
Windows only: This extension currently only supports Windows, as it bundles a Windows-native Yarn Spinner compiler.
This extension is designed to work alongside the official Yarn Spinner extension, which provides syntax highlighting, node graph visualization, and Yarn-specific editing features. Install it first for the best experience.
You'll also need nonkit-plugin installed in your game to use the live testing features. nonkit-plugin requires BepInEx:
BepInEx Installation: NONMP is an IL2CPP game, which requires BepInEx 6.x (not 5.x). Refer to the official installation instructions at https://github.com/BepInEx/BepInEx for the correct version and setup procedure.
Installing nonkit-vsc
From the Visual Studio Marketplace: available here.
From source: Build the extension (see above), then install the generated .vsix from the project root using the same method.
Getting Started
- Open a folder in VS Code where you want to create your mod
- Open the nonkit panel in the Activity Bar (look for the nonkit icon)
- Click "Initialize Project" to set up the project structure
- The extension creates a starter
Main.yarn file, a localization template, and a Default.ysls.json containing NONMP's Yarn command definitions (used by the Yarn Spinner extension for autocomplete)
Versioning
This project follows SemVer.
Architecture
nonkit-vsc is organized into these main components:
- Extension Core (
src/extension.ts) - Entry point that registers commands, views, and wires everything together
- Project Management (
src/project/) - Handles project files, loading and saving .yarn scripts and .csv localization files
- IPC Client (
src/ipc/) - Named pipe communication with nonkit-plugin running inside the game
- Yarn Compiler (
src/compiler/) - Wraps the .NET-based Yarn Spinner compiler (nonkit-yarn-shim/) to compile scripts on demand
- Views (
src/views/) - Tree view providers for the project files and node explorer panels
- UI (
src/ui/) - Status bar and output console
How Live Testing Works
When you run a node:
- nonkit-vsc compiles all
.yarn files in your project using the bundled Yarn compiler
- The compiled bytecode, localization strings, and config tables are sent to nonkit-plugin via named pipe
- nonkit-plugin injects the dialogue and config data into the running game and starts the specified node
- Status messages and errors are displayed in VS Code's output panel
Loading Content
The extension provides several load commands:
- Load Scripts - Compile and load only Yarn scripts (without running)
- Load Localization - Load only localization CSV files
- Load Config - Load only Luban config tables (quests, conditions, etc.)
- Load All - Load everything from the project
These commands let you inject content into the running game without starting a dialogue node. Useful for testing quests that need to appear in the game's map.
Project Structure
A nonkit project contains:
Project.nonkit.json - Project metadata and file mappings
scripts/*.yarn - Yarn Spinner dialogue scripts
localization/*.csv - Translation files keyed by line IDs (e.g., #line:example)
config/*.json - Luban configuration tables (quests, conditions, localization)
Default.ysls.json - Yarn command definitions for NONMP (enables references in the Yarn Spinner extension)
Creating Custom Quests
nonkit supports creating custom quests that appear in the game's map event system. This requires three config files working together:
Config Files
When you initialize a new project, nonkit creates example config files in the config/ folder:
TbMapEvent.json
Defines the quest itself:
[
{
"ID": 900001,
"PlaceID": 9,
"Title": "Example Quest",
"Subtitle": "Custom Quest Demo",
"BannerPath": "BG-4",
"Desc": "This is a demonstration quest.",
"MapEventType": "Special",
"UnlockCondition": 900001,
"LockCondition": 0,
"DialogID": "ModQuest_Example",
"Nonkit": {
"IconSourceId": 10084
}
}
]
Key fields:
ID - Unique identifier (use 900000+ to avoid conflicts with base game)
PlaceID - Which location the quest appears in (9 = player's home)
DialogID - The Yarn node name to run when the quest starts
UnlockCondition - ID of a condition in TbCondition that controls when this quest appears
Nonkit.IconSourceId - Borrow an icon from an existing event (since custom events don't have icon assets)
TbCondition.json
Defines when the quest appears:
[
{
"ID": 900001,
"Name": "ModQuest_Example_Unlock",
"Day": "",
"InWar": "",
"Period": "",
"Event": "",
"YarnVariable": "",
"Talent": [],
"Lv": "",
"PrimeAttribute": [],
"Affection": "",
"Item": []
}
]
An empty condition (like above) means the quest is always available. You can add requirements like specific days, levels, or items.
TbLocalizationAutoGenerated.json
Provides localized text for the quest UI:
[
{
"Key": "MapEvent_900001_Title",
"CH": "示例任务",
"EN": "Example Quest",
"Handled": true
},
{
"Key": "MapEvent_900001_Desc",
"CH": "这是使用nonkit创建的演示任务。",
"EN": "This is a demonstration quest created with nonkit.",
"Handled": true
}
]
The game looks up quest titles and descriptions using the pattern MapEvent_{ID}_Title and MapEvent_{ID}_Desc.
ID Conventions
The default templates use ID range 900000+ to avoid accidental conflicts with base game IDs. However, you can deliberately use an existing game ID to override that entry, which is a valid use case for patching game content.
License
nonkit-vsc is published under the Unlicense.