-
-
Notifications
You must be signed in to change notification settings - Fork 0
Other Mechanics
Ninja offers some additional, slight and necessary improvements to the games’ functionality.
As mentioned in Inserting NPC, Gothic fails to add an NPC on loading if its instance is no longer found in the scripts. Technically Gothic catches such an event, but the game will crash regardless due to a small consequential error. Ninja introduces a small fix in the right place to circumvent this crash resulting in successfully ignoring any NPC that were removed from the game. Therefore, Ninja will also be helpful in case this ever happens for a mod that removes an NPC in a later update.
In very rare cases shifts in the symbol table will cause a crash in conjunction with missing safety checks in Hlp_IsValidNpc
, Hlp_IsValidItem
and Hlp_GetNpc
. This will only occur in the unlikely event that one of these functions is called with an invalid symbol index which also happens to be a Daedalus class of different type. The only time known when this happens is for loading the target of an NPC from its AI variable AIV_LASTTARGET
after loading a saved game. Ninja adds a small safety check in these external functions. The reason for Ninja to introduce this fix is because a patch might add an NPC that might be stored in the mentioned AI variable of another NPC from the underlying mod. On removal of the patch this fix becomes relevant under certain circumstances. As with the fix mentioned above, this may also come in handy for mods that receive an update.
On loading a game, Gothic only restores the contents of variables that exist in the scripts. Any other variable that may have been introduced earlier will be removed from the game save at this point. Ninja will force Gothic to create any such missing variable. This small change allows the removal and re-adding of patches without resetting their impact on the game. Since a patch (ideally) introduces variables with unique patch-specific names, this does not compromise the game in any way.
On initialization of Ninja, when launching the game, it checks for an open instance of the zSpy and if found automatically sets its logging to level five if not already higher. This offers an easy way of debugging without the need of installing the mod starter or launching Gothic with command line parameters. To use this feature, the zSpy is required to be open at game start and should filter for all events including information (not only warnings or faults). How this is useful is explained in Debugging.
Since script features introduced by patches may already be included in certain mods, these patches might result in crashing the game. Typically, a patch has the means to detect if a feature is already present to not re-introduce it. However, to be on the safe side, a mod can provide a list of incompatible patches that Ninja will ignore and not load in conjunction with that mod.
The purpose of this blacklist should not be misunderstood: Patches that introduce features that may cause balancing issues or that a mod developer simply does not like, should not be added to this list. It is reserved exclusively for technical incompatibilities. If this list is abused by mod developers to exclude more patches than necessary, players will catch wind of this setting and simply remove their favorite patches from the list (their perception of gameplay imbalance might be different). In that case, this incompatibility list will lose its purpose and mods will start to crash. This will fall back onto the mod developers having to deal with complaints about these very incompatibility issues. Consequently, it is expected from mod developers to use this blacklist sparingly and with reason.
This list is an additional setting in the INI file of the mod, e.g. \System\ModName.ini
. Patches are specified by their name and separated by a space.
; ...
[SETTINGS]
; ...
IncompatibleNinjaPatches=Patch1 Patch2
; ...
Introduction
Virtual Disk File System
Formats
Single File Formats
Collected File Formats
Limitations to Overcome
Scripts
Animations
Output Units
Solution
Implementation
Patch Structure
VDF File Tree
VDF Header
Patch Template
Patch Validator
Inter-Game Compatibility
Inject Changes
Daedalus Scripts
Overwriting Symbols
Naming Conventions
Preserved Symbols
Initialization Functions
Init_Global
Menu Creation
Ikarus and LeGo
Initializing LeGo
Modifications to LeGo
PermMem and Handles
Daedalus Hooks
Inserting NPC
Disallow Saving
Helper Symbols
NINJA_VERSION
NINJA_MODNAME
NINJA_PATCHES
NINJA_ID_PATCHNAME
NINJA_SYMBOLS_START
NINJA_SYMBOLS…PATCHNAME
Common Symbols
Localization
Animations and Armor
Output Units
Other Mechanics
Remove Invalid NPC
Safety Checks in Externals
Preserve Integer Variables
Detect zSpy
Incompatibility List for Mods
Applications and Examples
Add New NPC
Set AI Variables
Add New Dialogs
Add New Spells
Add New World
Translation Patch
Installation
Requirements
Instructions
Troubleshooting
Is Ninja Active
Is Patch Loaded
Error Messages