Native plugins are an advanced opt-in path. These notes are generated from the approved public SDK document.
Safety Gate
- Toggle in game Mods menu: **Unsafe Native Mods: ON/OFF**.
- OFF blocks all native plugin declarations.
- ON still validates manifest/API/permission requirements before activation.
Runtime Validation
- `nativeApiVersion` in mod manifest must match game API (`1` in this build).
- Requested `nativePermissions` must be present in `data/modding/native_permissions.json`.
- Rejections are logged with actionable reasons.
- Plugin binaries must resolve to the current platform and export required entry points.
C ABI Contract (`engine/mod/NativePluginApi.h`)
- `WardenPlugin_GetApiVersion`
- `WardenPlugin_GetMetadata`
- `WardenPlugin_OnLoad`
- `WardenPlugin_OnUnload`
- `WardenPlugin_OnTick`
- `logInfo`, `logWarn`, `logError`
- economy/state:
- `grantCopper(int amount)`
- `setCopper(int amount)` / `getCopper()`
- `addExperience(int amount)`
- `getCurrentWave()`, `getHeroLevel()`, `setWave(int wave)`
- combat/gameplay multipliers:
- `setEnemyScaleMultiplier(float multiplier)`
- `setEnemyHealthMultiplier(float multiplier)`
- `setEnemySpeedMultiplier(float multiplier)`
- `setEnemyDamageMultiplier(float multiplier)`
- `setPlayerDamageMultiplier(float multiplier)`
- `setPlayerMoveSpeedMultiplier(float multiplier)`
- `setPlayerAttackSpeedMultiplier(float multiplier)`
- `setPlayerXpGainMultiplier(float multiplier)`
- `setPlayerGoldGainMultiplier(float multiplier)`
- `setCopperRewardMultiplier(float multiplier)`
- `setWaveClearBonusMultiplier(float multiplier)`
- direct actions:
- `healHero(float amount)`, `damageHero(float amount)`
- `spawnEnemyBatch(const char* enemyId, int count, int spawnBoss, int markAsElite)`
SDK Assets
- SDK header + sample plugin are shipped in `tools/native_sdk/`:
- `tools/native_sdk/include/WardenNativePluginApi.h`
- `tools/native_sdk/sample_plugin/`
- `tools/native_sdk/README.md`
- Shipped native mod template:
- `mods/template_enemy_size_pulse_cpp/`
Current Runtime Status
- Native plugin loading is enabled in unsafe mode.
- Host validates manifest API/permissions, binary platform/path, required exports, and plugin ABI before activation.
- Loaded plugins participate in runtime tick and in compatibility/save digest metadata.