The Daodan DLL is a patch for Oni that hooks into the game engine to fix bugs and add features. It does this by posing as binkw32.dll, the library that Oni loads to help it play the game's opening and ending videos. The Daodan fixes issues such as the famous "Blam!" error that occurs on modern Windows machines. It also adds new features such as support for widescreen resolutions and bonus cheat codes.
This is the recommended version of the Daodan DLL. This is also the only version that fixes windowed mode. Note that you already have this installed if you installed the AE.
1. Before installation, it is important to know where your copy of Oni has been installed to. For most people, it is stored in "C:\Program Files\Oni". This folder should contain a "GameDataFolder" and "Oni" or "Oni.exe".
2. Back up your Oni.exe by renaming it (e.g. "Oni-original.exe").
3. Place the newly-downloaded Oni.exe, binkw32.dll, realbink.dll, and assorted files in the folder with Oni.exe.
4. To test if you have done everything correctly, run "Oni.exe". Enter the pause (Diary) screen (F1 by default) and type "tellmetheversion"; if you get a result like "Daodan v.3.0", the DLL is working.
If the game does not display correctly (for instance, a black window), try the following in any order:
1. Disable the intro movie by renaming GameDataFolder\intro.bik. This often fixes the game window.
2. Open the daodan.ini in Notepad and set either "daodangl" or "windowhack" to true. "windowhack" should at least center the window on the screen.
3. Try launching Oni as Administrator.
4. Make the Oni folder writable by un-checking "Read-only" in the Properties window for the folder.
5. Try both the run_full and run_wind scripts.
You can report problems on the forum in this thread or in a new thread in the Modifications forum.
- Windows XP patch - Fixed Oni crashing at startup on modern computers.
- Windowed mode - Oni runs inside a window.
- Custom screen resolutions - Includes many more default screen resolutions and the ability to add custom resolutions (see below).
- BGRA32 (ARGB8888) support.
- Extra cheats - see "Added cheat codes" section below.
- Cheats always enabled; no need to beat game first.
- Extra command line options (for advanced users) - For a list, type "Oni -help".
- DirectInput is used on NT, XP and Vista - Better support for keyboard layouts.
- AIs have ability to properly dodge projectiles.
- Stops fly-in character portraits from being stretched when playing in widescreen.
Creating a file called Daodan.ini in the same directory as the Daodan DLL will allow you to enable/disable the patches inside Daodan. It can also be used to store configuration settings and language items. Each setting is stored inside a section as a name and value pair. To temporarily disable a setting in the INI, add a '#' to the beginning of the line and the Daodan will ignore it.
To enable a patch, look for the patches section in your Daodan.ini. If the patches section doesn't exist, create it by typing
at the end of your file. You can now enable or disable patches by typing the patch name followed by =True or =False (caps and spacing don't matter). For example, let's say you want to turn off the cooldown timer patch (so you can drop and pick up the Mercury Bow after firing to fire again immediately) and the new windowed mode makes your game crash or makes it run slowly:
[Patch] CooldownTimer = False WindowHack = False
All patch names are found in the "All patches" section below.
With an unpatched Oni, the only way to change settings such as windowed mode was to create a batch file (.bat) and type command line options into it. In the beta Daodan, options can be added to the Daodan.ini. To add an option, look for the options section or type
at the end of your Daodan.ini. To enable windowed mode by default, type:
[Options] Switch = False
Similarly, to disable sound, add the line:
[Options] Switch = False Sound = False
A list of options can be found in the "All options" section below.
The Daodan DLL offers support for the Chinese version of the game as well as multibyte languages in general (see "multibyte" under "Patches" section). It also has the beginnings of some basic localization support, by allowing cheat code names and other strings to be translated. To add an option, look for the options section or type
To enable Chinese support, type:
[Language] Chinese = True
This will load a DLL called xfhsm_oni.dll (apparently provided with Chinese copies of Oni).
Here are the strings that you can replace using the .ini file:
|blam||Replaces body text of the blam window.|
|damn||Replaces title of the blam window.|
|savepoint||Replaces string "Save Point" in Load Game menu (not working?).|
|syndicatewarehouse||Replaces string "Syndicate Warehouse" in Load Game menu (not working?).|
|nameofcheat_on/_off||Replaces name of the built-in cheat code as it appears on the pause screen when code is entered. E.g., "behemoth_on=Gojira Desu!".|
Command line options are still present in the beta Daodan although the syntax is a little different (and a bit more powerful.) The basic syntax for a command line option is this:
-<ini section>.<name> <value>
Where <ini section> is the Daodan.ini section (usually Patch or Options,) <name> is the option and <value> is the value to set it to (usually True or False.) Therefore, to disable sound, start Oni with this:
oni -options.sound false
When <ini section> is omitted, it is assumed to be options. When <value> is omitted, it is assumed to be true unless <name> starts with no (eg. nosound) in which case it is assumed to be false. So an easier way to write the above command would be:
Options or patches specified on the command line take precedence over options specified in Daodan.ini. Currently Oni's command line parser isn't powerful enough to parse language elements (no support for quoting arguments); this will be fixed in a later release.
Below are the names of the patches you can turn on and off in Daodan.ini (names are case-insensitive). Also noted is whether the DLL has this patch turned on or off by default.
|alttab||true||Allows user to switch applications while in Oni (Alt-Tab) and use Windows key, however it may enable the screensaver as well.|
|argb8888||true||Textures using ARGB8888 can be used.|
|binkplay||true||Fix binkplay calls to use GDI and outro same mode as intro.|
|bsl||true||Enables d_regen (unfinished) and prevents fly-in portraits from being stretched when playing in widescreen resolutions.|
|cheater||true||Adds new cheat codes (see section below).|
|cheatsenabled||true||Enables cheats without having to beat the game first.|
|cheattable||true||Replaces Oni's cheat table with table that includes new cheats (see section below).|
|clipcursor||true||Limit cursor to Oni's window|
|cooldowntimer||true||Disables weapon cooldown exploit.|
|daodandisplayenum||true||Offers more display modes in the Options menu.|
|daodaninit||true||If option (not patch) "usedaodanbsl" is also set to true, adds new Daodan BSL functions (documented below).|
|directinput||true||Forces on DirectInput.|
|disablecmdline||true||Replaces existing command line parser with Daodan's in order to add new commands. Meant to be used with getcmdline.|
|fonttexturecache||true||Doubles size of font texture cache.|
|getcmdline||true||Replaces existing command line parser with Daodan's in order to add new commands. Meant to be used with disablecmdline.|
|kickguns||false||Unfinished, do not use.|
|killvtune||REMOVED||Would prevent loading of vtuneapi.dll.|
|largetextures||true||Textures up to 512x512 can be used.|
|levelplugins||true||Allows level files to be loaded from the GDF which do not end in "_Final".|
|newweap||true||Picking up a weapon displays a message containing the weapon name and amount of ammo.|
|nomultibyte||true||Enables languages which use multibyte coding (such as Chinese).|
|optionsvisible||true||Always show options button in main menu, even when pausing from a game|
|particledisablebit||false||Unlocks particle action disabling/enabling bits for all events so that a particle event can occur multiple times.|
|pathfinding||true||Multiplies size of pathfinding grid cache by eight in order to prevent crashes in large levels.|
|projaware||true||Allows AI to dodge incoming gunfire properly.|
|safeprintf||true||Replaces Oni's function that prints to startup.txt with a safer one.|
|throwtest||false||Not recommended for use; experiment with allowing enemies to be thrown over railings.|
|usedaodangl||true||Provides an improved windowed mode (-noswitch); this patch is known to break the hiding of the Windows taskbar in fullscreen mode.|
|usegettickcount||true||Replaces Oni's timing functions with more accurate ones.|
|wpfadetime||true||Adds working function for existing BSL command wp_fadetime, sets fade time to 4800.|
Below are the names of the options you can turn on and off in Daodan.ini (names are case-insensitive). Also noted is whether the DLL has this option turned on or off by default.
|border||true||If "windowhack" patch is active, make sure game window has border in windowed mode.|
|nomultibyte||false||Redirects to patch "nomultibyte"; see "Patches" section.|
|gamma||true||Enable gamma slider in fullscreen|
|switch||true||Always switch screen to resolution on Oni's Options screen, making the game fullscreen; opposite of Oni's built-in argument "noswitch".|
|topmost||false||Keep game window on top in windowed mode, even when switching applications.|
|usedaodanbsl||true||Adds new BSL commands (see below) as long as patch "daodaninit" is true.|
|various||--||Oni's built-in arguments; see Customizing#Command-line_arguments. Reenables (as bool): debug, findsounds, ignore_private_data, sound|
Added cheat codes
- Player takes less weapon damage.
- Player is unkillable (will not go below 1HP).
- Player takes no weapon damage.
- Player can make super-high jumps.
- Player can fly by holding down jump key.
- Extra difficulty mode; player always has 1HP, but also is immune to weapons, and the enemy AI cannot hear the player.
Added BSL functions
Any time a function can both get and set a value, and you set the value, the old value should be is returned, barring any programming oversight by Gumby.
- int int32mul n1:int n2:int
- Multiplies two integers
- float mul [int1:int|float1:float] [int2:int|float2:float]
- Multiplies two numbers
- int int32div n1:int n2:int
- Divides two integers
- float div [int1:int|float1:float] [int2:int|float2:float]
- Divides two two numbers
- int int32rand start:int end:int
- Returns a pseudo-random number between two numbers (inclusive).
- int d_getkills [ai_name:str | script_id:int]
- Gets the number of kills a character has
- int d_getdamage [ai_name:str | script_id:int]
- Gets the amount of damage a character has caused
- string d_name [ai_name:str | script_id:int] [newname:string]
- Gets or sets a character's name
- string d_regen [ai_name:str | script_id:int] on_off:bool
- Currently broken, won't do anything
- int d_getindex [ai_name:str]
- Gets a character's script_id from their name
- int d_powerup ai_name:str|script_id:int powerup:str [newcount:int]
- Gets or sets the amount of powerups a character has
- Powerup list the same as with chr_givepowerup with the addition of "bossshield"
- int d_health [ai_name:str | script_id:int] [newhealth:int]
- Gets or sets a character's health
- int d_maxhealth [ai_name:str | script_id:int] [newmaxhealth:int]
- Gets or sets a character's maxhealth
- int d_holdkey [ai_name:string | script_id:int] keys frames:int
- Makes a character hold a key
- Possibly broken
- int d_isheld keys
- Checks if player is holding a key
- Possibly broken
- int d_waitforkey keys
- Waits for a keypress from the player
- int d_powerup [ai_name:string | script_id:int] powerup:string
- Gets or sets a character's powerups
- float d_location [ai_name:string | script_id:int] xyz:string
- Gets the XYZ coordinate of a character
- float d_location [ai_name:string | script_id:int] x:float y:float z:float
- Sets the XYZ coordinates of a character
- float d_distance [ai_name:string | script_id:int] [ai_name:string | script_id:int]
- Gets the distance between two characters
- int d_regen [ai_name:string | script_id:int] yesno:int
- Gets or sets a character's regeneration abilities
- void d_dprint text:string [textcolor: r b g] [shadowcolor: r b g]
- Prints to console in color
- Colors are ints between 0 and 255. Other numbers will be reduced to 255.
- Any colors you do not supply will be replaced with the default values: 255, 255, 255 and 63, 63. 63
- string sprintf str1:format ...
- Does a C-style sprintf operation on a string
The DLL enables Developer Mode; go to the pause screen (F1) and type "thedayismine" or simply 'x' to activate it.
Custom screen resolutions
If you wish to run in a screen resolution that is not available and you are running the recommended version of C-Daodan, create a text file (Notepad document) called "res.txt" in your Oni folder (C:\Program Files\Oni) containing a list of custom resolutions in this format (one resolution per line):
Note: Unsupported by community. There is also a much older release of Daodan, referred to as FASM-Daodan. This is the original version by SFeLi. Unlike the C-Daodan, FASM-Daodan requires a different DLL to be downloaded depending on which Oni.exe is used. It does not support the newer Daodan features, such as windowed mode and custom resolutions, however it still contains the basic patches such as the Windows XP patch and the custom cheats.
Download a ZIP containing the DLLs for an experimental (unstable) FASM-Daodan This includes the projectile awareness patch and support for any language (except Chinese and Japanese).