Developer Mode: Difference between revisions

From OniGalore
Jump to navigation Jump to search
m (wikilinked Data Comlink)
 
(117 intermediate revisions by 10 users not shown)
Line 1: Line 1:
{|align=right
[[Image:TheDayIsMine crate.png|frame|Developer Mode's cheat code on [[Easter eggs#Old Man Murray|a special crate]] in Syndicate Warehouse.]]
|http://geyser.oni2.net/Developer_Mode/TheDayIsMine0.png
{{UpdatedForOniX|1.0.0}}
|http://geyser.oni2.net/Developer_Mode/TheDayIsMine.png
{{TOCfloat|limit=3}}
|}
Developer Mode is a bundle of features created by [[Bungie West]] to help them develop [[Oni]]: a console line for entering scripting commands, manual camera controls, and various debugging features. It was traditionally activated with the [[Cheats|cheat code]] '''thedayismine''', but see "Unlocking it" and "Activating it" below before trying the code.
==thedayismine==
It was very much of a myth ever since Oni was released. Random game sites around the web kept posting overviews of Oni's [[Cheats|cheat codes]] with stuff like :
;(this one from [http://oni.planets.gamespy.com/info/cheats.shtml Oni Online])
:thedayismine - Developer Mode
:
:'''Step 3: Developer Mode Commands'''
:While in developer mode, you can use certain key combinations and access the command console. These are the keys I have found (in dev mode):
:*Cntl-Shift-Y = FPS Counter (works always, not only in dev)
:*F7 = Cycle through all possible weapons
:*F8 = Change character
:*F9 = Start recording
:*F10 = Stop recording
:*F11 = Playback recording
:*Cntl-Shift-G = toggles between slow motion and normal modes
:*Cntl-Shift-S = toggles textures on some objects
:*Cntl-Shift-B = shows your current opponent logic
:*` = brings up the cmd prompt
:
:Command prompt is perhaps the most interesting thing out there. You can execute script commands from there or assign values to internal variables. The best way to find out what commands/variable are there is to type at the cmd prompt: dump_docs. This command will dump all known docs and variables (sometimes with comments!) to the text file. CMD prompt has autocompletion feature, to accept the suggestion it gives you, use Tab key. Up and down arrows scrolls through the command history.
:Some handy commands:
:*door_ignore_locks = 1 unlocks all doors for you
:*ai2_kill kills all nearby AI
:*chr_nocollision 0 1 'noclip' mode, allows you to walk through avoid jumping. The designed levels are beautiful.
:More stuff can be found in the docs file created by dump_docs command.
:Special thanks to:
:Dr.Qwerty, nop, Mary
W.O.W. , right? One would rush to one's PC (or Mac), type in "thedayismine"...


and...                     :D :) :| :(
Despite being hinted at by a crate texture (right) and appearing on a leaked list of cheat codes during beta testing, this cheat code did not work upon Oni's release, and it was long believed that Developer Mode had been cut from retail versions of Oni. However, Dev Mode is actually present in ''all'' available versions of Oni. It just needed to be unlocked, as the community [[History of Oni modding/The tale of Dev Mode|learned back in 2006]].


It just didn't work. No matter what one did. One has tried to call up the console through scripting, but without any success.
Below you will find download links, unlocking instructions, and finally an overview of the Developer Mode's features. For Dev Mode features lurking in the PS2 version of Oni, first discovered in 2017, see [[Oni (PlayStation 2)]].
<br clear="all" />
==Unlocking it==
===...by downloading a patch===
Windows: You can install the [[Daodan DLL]] to unlock Developer Mode; note that the [[Anniversary Edition]] installs the Daodan DLL automatically.<br>
Mac: The [[FERAL|Intel build]] of Oni already has Dev Mode unlocked; note that the Anniversary Edition installs the Intel build automatically.


So, as years flew by, it looked more and more like the Developer Mode was left out of the retail version of Oni, and those lucky bastards at Oni Online (and elsewhere) were either repeating each other's BS without having actually used the Dev Mode, or they had gotten their hands on the beta or pre-beta version... or something.
===...by doing it yourself===
{{Divhide}}
You may want to read this if your Windows version of Oni is not covered by the above DLL (e.g. if you have an odd language version) or if you are on a Mac that cannot run the Intel build (if you're using an old PowerPC Mac, note that a Dev Mode-enabled version of The Omni Group's "Mac OS X port" is [[OMNI|HERE]]).


(maybe add links to frustrated forum talk etc)
First, get a good hex editor. Ideally, it should allow you to search for sequences containing joker characters (that is, wildcards or bit masks). One such editor for Windows is [http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm XVI32]. On Macs, [http://www.cihexviewer.com/ CI Hex Viewer] is free, powerful, and can perform the search you need, but [https://ridiculousfish.com/hexfiend/ Hex Fiend] has a better comparison function so you can check your work afterward (open the original and edited binaries and choose File > Compare "Oni" and "Oni").


It looked like we were screwed.
====Cheat code lookup tables====
 
{|style="float:right"
Until...
|+Cheat codes and IDs
 
|
==January 21, 2006==
{|border=1 cellspacing=0
http://geyser.oni2.net/Developer_Mode/Screenshot.jpg
|-
 
|shapeshifter
[http://sfeli.oni2.net SFeli] came around. He rediscovered the Developer Mode, reenabled it, and there was much rejoicing.
 
Below is a slightly reformatted version of his "dev diary"
;Enabling Developer Mode (console):22-01-2006
It is so simple, that I'm wondering why it wasn't done yet.
 
Two years ago I've read on Bungie's Oni site, that there was developer mode in Oni. It could be activated by the cheat code ("thedayismine").  But  this  cheat
code didn't work for me, because Bungie had removed it before releasing Oni...
 
Look at the cheat table entry structure:
struct ONI_CHEAT_ENTRY                ;FASM-style structure declaration.
    lpszCheatName  dd ?                ;Address of "magic" word.
    lpszDescOn      dd ?                ;Address of "Cheat is enabled" message.
    lpszDescOff    dd ?                ;Address of "Cheat is disabled" message.
    nFnIndex        dd ?                ;Index in in CcLocations array.
ends
At the address  0x005533f8  (real 0x001533f8)  in  OniEn,  0x0054dea8  (real 0x0014dea8) in OniRu,  there  is an array of ONI_CHEAT_ENTRY structures (used by one of the core functions).
 
{|
|+The whole array
!shapeshifter
|ONI_CHEAT_ENTRY
|szShapeShifter
|szShapeShiftOn
|szShapeShiftOff
|0x00
|0x00
|-
|-
!liveforever
|liveforever
|ONI_CHEAT_ENTRY
|szLive4Ever
|szLive4EverOn
|szLive4EverOff
|0x01
|0x01
|-
|-
!touchofdeath
|touchofdeath
|ONI_CHEAT_ENTRY
|szTouchOfDeath
|szTODOn
|szTODOff
|0x02
|0x02
|-
|-
!canttouchthis
|canttouchthis
|ONI_CHEAT_ENTRY
|szCantTouch
|szCantTouchOn
|szCantTouchOff
|0x03
|0x03
|-
|-
!fatloot ''(1)''
|''fatloot''
|ONI_CHEAT_ENTRY
|szFatLoot
|szFatLootOn
|0
|0x04
|0x04
|-
|-
!glassworld
|glassworld
|ONI_CHEAT_ENTRY
|szGlassWorld
|szGlassWorldOn
|szGlassWorldOff
|0x05
|0x05
|-
|-
!winlevel ''(2)''
|''winlevel''
|ONI_CHEAT_ENTRY
|szWinLevel
|szWinLevelOn
|0
|0x06
|0x06
|-
|-
!loselevel ''(2)''
|''loselevel''
|ONI_CHEAT_ENTRY
|szLoseLevel
|szLoseLevelOff
|0
|0x07
|0x07
|-
|-
!bighead
|bighead
|ONI_CHEAT_ENTRY
|szBigHead
|szBigHeadOn
|szBigHeadOff
|0x08
|0x08
|-
|-
!minime
|minime
|ONI_CHEAT_ENTRY
|szMiniMe
|szMiniMeOn
|szMiniMeOff
|0x09
|0x09
|-
|-
!superammo
|superammo
|ONI_CHEAT_ENTRY
|0x0A
|szSuperAmmo
|}
|szSuperAmmoOn
|
|szSuperAmmoOff
{|border=1 cellspacing=0
|0x0a
|-
|-
|'''thedayismine'''
!reservoirdogs
|0x0B
|ONI_CHEAT_ENTRY
|-
|szResDogs
|reservoirdogs
|szResDogsOn
|0x0C
|szResDogsOff
|-
|0x0c
|roughjustice
|-
|0x0D
!roughjustice
|-
|ONI_CHEAT_ENTRY
|chenille
|szRoughJustice
|0x0E
|szRJOn
|-
|szRJOff
|behemoth
|0x0d
|0x0F
|-
|-
!chenille
|elderrune
|ONI_CHEAT_ENTRY
|szChenille
|szChenilleOn
|szChenilleOff
|0x0e
|-
!behemoth
|ONI_CHEAT_ENTRY
|szBehemoth
|szBehemothOn
|szBehemothOff
|0x0f
|- 
!elderrune
|ONI_CHEAT_ENTRY
|szElderrune
|szElderruneOn
|szElderruneOff
|0x10
|0x10
|-
|-
!moonshadow
|moonshadow
|ONI_CHEAT_ENTRY
|szMoonShadow
|szMoonShadowOn
|szMoonShadowOff
|0x11
|0x11
|-
|-
!munitionfrenzy ''(2)''
|''munitionfrenzy''
|ONI_CHEAT_ENTRY
|szMunitionFrenzy
|szMunFrenOn
|0
|0x12
|0x12
|-
|-
!fistsoflegend
|fistsoflegend
|ONI_CHEAT_ENTRY
|szFistsOfLegend
|szFistsOn
|szFistsOff
|0x13
|0x13
|-
|-
!killmequick
|killmequick
|ONI_CHEAT_ENTRY
|szKillMeQuick
|szKillMeQOn
|szKillMeQOff
|0x14
|0x14
|-  
|-
!carousel
|carousel
|ONI_CHEAT_ENTRY
|szCarousel
|szCarouselOn
|szCarouselOff
|0x15
|0x15
|- 
!''(3)''
|ONI_CHEAT_ENTRY
|0
|0
|0
|}
|}
#you can't undo '''fatloot''', so no "disabled" message
|}
#no undo for '''winlevel''', '''loselevel''' or '''munitionfrenzy''', either
#Null entry (see below)
Look  at the 'superammo' cheat,  then at the 'reservoirdogs' cheat.  Something strange? Their .nFnIndex'es are 0x0a and 0x0c.


Guess why?
;Cheat overview
Yes, it's because Bungie have commented element 0x0b  of  cheats array  in  the game  source-code (Oni_GameState.c)  before  building the release  version.
:There are 22 cheat events in every version of Oni, indexed from 0 to 21 (or 0x00 to 0x15 in hexadecimal). See table on right; the cheat code omitted by Bungie, thedayismine, is in bold. The four italicized cheat codes are "one-way" cheats that do not have on/off states, which affects the table described below.
:The order is the same in every version, so we can refer to the cheats by their ID, or by the cheat code used to activate them.


What  was that  cheat?
;Cheat lookup table
Developer mode, of course!!! :-)
:When you type characters on the [[Data Comlink]] screen, the text you enter is progressively compared with all the strings in the cheat table.
And since  cheats array  was fixed-size (0x16) elements  --  we have a zero entry  at the end  of array.
:When and if there is a match, the corresponding confirmation message is displayed – for activation, for recognition (when the cheat is not an on/off state but an action to perform), or for deactivation if the cheat was already on – and the cheat event takes effect when the Data Comlink is closed.
Fill  it  with  correct szCheatName, szDescOn, szDescOff pointers,  set  nFnIndex  to 0x0b  and you will have working developer mode cheat code.
:In full, each row of the cheat table consists of:
:*a pointer to the cheat code string
:*a pointer to the "enabled"/recognition message
:*a pointer to the "disabled" message (if any)
:*the internal ID of the cheat event to launch
There is a row for every cheat, and they appear by order of increasing ID. In most Oni builds, the developer mode cheat (ID 0x0B) is simply skipped over; '''reservoirdogs''' (0x0C) comes right after '''superammo''' (0x0A).


About  cheat function with  index  0x0b  (CcCaseDevMode). Actually it's not a function -- it's part of CcDispatcher's switch-case statement (CcLocations array is a jumptable for it), and it is part of CcDispatcher  in  OniEn version -- it uses step-by-step compare instead of jumptable (less compiler optimization ;-)).
;Data size on different platforms
:In the Windows retail/demo builds and The Omni Group's PPC Mac builds, every row of the lookup table takes up 16 bytes. The 3 pointers and the ID are 4-byte data words (little-endian in Windows, big-endian on PPC Macs). If a cheat has no "disabled" message, the row's third pointer is null.
:In Bungie's original Mac build (the retail version of the application), the pointers and the ID are 2-byte words (Big Endian). Regular rows take up 8 bytes, but for one-way cheats with no "disabled" message, weird stuff happens to the third pointer and to the ID, and the row takes up 10 bytes; here, the ID can be found in what would be the first byte of the ID field instead of the second, and the remaining 3 bytes are garbage. An additional garbage byte is added between consecutive one-way cheats (0x06 and 0x07).


You can find CcCaseDevMode at the address 0x004f5da5/0x004f2297  (En/Ru). It inverts value of the flag bfDevMode at 0x005ece8e/0x005e87e6 and then  registers (binds)  additional  actions (calling CcBindDevActions at 0x0404730/0x00404610).
====Let's kill "killmequick"====
In the Windows retail, Windows demo and Omni Group PPC builds, there's extra space at the end of the lookup table and where the cheat codes/messages are stored, so one can add '''thedayismine''' as an extra cheat. In Bungie's retail Mac builds, the data is packed tighter (and the text strings are stored together with their size), so the only easy way is to replace an existing cheat. Since replacing an existing cheat is the only solution that works on all platforms, the following mini-tutorial will explain how to bind the Developer Mode cheat event to the Ultra Mode cheat code '''killmequick''' (since hardly anyone uses that cheat).


Here is complete list of bound actions:
====Finding the lookup table====
*'profile_toggle'        to ONI_KEY_BSLASH    ;Backslash.
Open the executable (or the data fork of the retail Mac build), after backing it up of course…. We shall look for the last three elements of the table, corresponding to '''fistsoflegend''', '''killmequick''' and '''carousel'''.
*'console'              to '`'                ;'~' key (tilde).
;In the Windows retail and demo builds, look for '''13 00 00 00 ## ## ## ## ## ## ## ## ## ## ## ## 14 00 00 00 ## ## ## ## ## ## ## ## ## ## ## ## 15 00 00 00'''
*'unstick'              to 'u'
;In the Omni Group build, look for '''00 00 00 13 ## ## ## ## ## ## ## ## ## ## ## ## 00 00 00 14 ## ## ## ## ## ## ## ## ## ## ## ## 00 00 00 15''' ([[:Image:Finding killmequick - Omni build.jpg|sample pic]])
*'cutscene1'             to ONI_KEY_F2
;In the retail Mac build, look for '''00 13 ## ## ## ## ## ## 00 14 ## ## ## ## ## ## 00 15''' ([[:Image:Finding killmequick - Mac OS 9 build.jpg|sample pic]])
*'cutscene2'             to ONI_KEY_F3
;
*'f4'                   to ONI_KEY_F4
where the ## are joker characters (wildcard bytes). Once you've found that data (make sure it occurs only once in the file), replace the '''14''' with a '''0B'''.
*'f5'                   to ONI_KEY_F5
*'f6'                   to ONI_KEY_F6
*'f7'                   to ONI_KEY_F7
*'f8'                   to ONI_KEY_F8
*'start_record'         to ONI_KEY_F9
*'stop_record'           to ONI_KEY_F10
*'play_record'           to ONI_KEY_F11
*'camera_record'         to 'n'
*'camera_stop'           to 'm'
*'camera_play'           to ONI_KEY_COMMA
*'record_screen'         to 'l'
*'addflag'               to ONI_KEY_INS        ;NumPad Insert.
*'deleteflag'            to ONI_KEY_DEL        ;NumPad Delete.
*'man_cam_move_up'      to ONI_KEY_SUB        ;NumPad Subtract.
*'man_cam_move_down'     to ONI_KEY_ADD        ;NumPad Add.
*'man_cam_move_left'     to ONI_KEY_NUM1
*'man_cam_move_right'   to ONI_KEY_NUM3
*'man_cam_move_forward' to ONI_KEY_NUM8
*'man_cam_move_backward' to ONI_KEY_NUM5
*'man_cam_pan_left'     to ONI_KEY_NUM6
*'man_cam_pan_right'    to ONI_KEY_NUM4
*'man_cam_pan_up'        to ONI_KEY_UP        ;Up Arrow.
*'man_cam_pan_down'      to ONI_KEY_DOWN      ;Down Arrow.
*'place_quad'            to ONI_KEY_COMMA
*'place_quad_mode'      to ONI_KEY_PERIOD
Some of them don't work, but I'm working on this now. ;-)


Key '`' (twiddle) activates  console.
Developer Mode will now be enabled/disabled every time you type '''killmequick''' on the Data Comlink (pause) screen; you'll get "Ultra Mode Enabled" and "Ultra Mode Disabled" as confirmation messages.
Press  'Tab' to cycle  through  all available commands / autocomplete command that you've started to type in.
{{Divhide|end}}
==Developer Mode==
 
Yeah, Developer Mode... it's ''there'' after all.
==Activating it==
That's when we all say W.O.W. and hurry to our PCs.
===Unlock cheats===
Even once Developer Mode is unlocked, it must be activated in-game through a cheat code. Cheats are normally disabled until you finish the full version of the game, but cheats are enabled all the time when the Daodan DLL is installed in Windows or when using the Mac Intel build.
 
===Enter the cheat code===
Enter the [[Data Comlink]] (default key F1) and look for a confirmation message after typing the Developer Mode cheat '''thedayismine''' (or '''killmequick''' if you followed the DIY tutorial above). You can also just type '''x''' when the Daodan DLL or Mac Intel build is being used.
 
==Using the console==
{|border=1 cellspacing=0 cellpadding=2 style="float:right; border-color:#dddddd;"
|width=95px align=center style="border-width:4px 4px 2px 2px; border-radius:1em; box-shadow:inset 0rem -0.8rem 2rem #dadada;"|<span style="font-size:175%">~</span><br><span style="font-size:200%; top:0.3em; position:relative">`</span>
|width=95px align=center style="border-width:4px 4px 2px 2px; border-radius:1em; box-shadow:inset 0rem -0.8rem 2rem #dadada;"|<span style="font-size:150%">§</span><br><span style="font-size:150%; top:0.3em; position:relative">½</span>
|width=95px align=center style="border-width:4px 4px 2px 2px; border-radius:1em; box-shadow:inset 0rem -0.8rem 2rem #dadada;"|<span style="font-size:150%">°</span><br><span style="font-size:150%; top:0.3em; position:relative">^</span>
|width=95px align=center style="border-width:4px 4px 2px 2px; border-radius:1em; box-shadow:inset 0rem -0.8rem 2rem #dadada;"|<span style="font-size:150%"></span><br><span style="font-size:150%; top:0.3em; position:relative">2</span>
|-
|align=center style="border-width:0px"|U.S.<br>QWERTY
|align=center style="border-width:0px"|Danish<br>QWERTY
|align=center style="border-width:0px"|German<br>QWERTZ
|align=center style="border-width:0px"|French<br>AZERTY
|}
By default, Oni auto-binds the "console" toggle to the key to the left of the numeric row. On U.S. QWERTY keyboards, this is the key with a grave accent, `, in the lowercase position and a tilde, ~, in the uppercase position. It is usually called the "tilde key" by users even though it's really the "grave accent key".
 
On non-U.S. keyboards, that key may not be present. The default key for your layout is depicted to the right:
:Danish QWERTY: The ½ key to the left of the numeric row.
:German QWERTZ: The circumflex accent key, ^.
:French AZERTY: The <sub>2</sub> key to the left of the numeric row.
 
Or you can simply add a line like "bind z to console" to '''key_config.txt''' in your Oni folder and you'll be able to open the console with that key. In some cases, this bound key will not ''close'' the console, but pressing the grave accent key will, oddly enough.
 
===Console output glitch===
When Developer Mode is active, Oni prints debug messages about in-game events along the bottom-left of the screen. Past messages scroll up the screen and fade. In some situations, messages don't fade (e.g. if character debugging is enabled or you are currently using the console line).
 
The easiest way to check whether console output works at all is to press '''F8''': the character class change is acknowledged with a console message.
 
If you don't see anything, console output is broken in your version of Oni. The old WinXP patch (no longer offered because it is superseded by the Daodan DLL) was known to disable console output. In Windows demo Oni, both console output and console input are invisible (i.e. you can enter script commands, but you're "blindfolded").
 
==Features==
Many of the features listed below no longer work as intended, either due to changes made to the code before shipping Oni or due to the absence in retail Oni of developer resources that the features were intended to call upon, such as [[level0_Tools]]. Nevertheless, some of these features are helpful for modders, most notably the camera controls and dev console.
 
===Hotkeys===
Below are Oni's hardcoded mappings for Developer Mode functions. The Alt key (Option key on Macs) can be used in place of Ctrl. Ctrl is called "Strg" on German keyboards.
 
The "U.S. QWERTY" column gives the standard hotkeys (the keys intended by the American developers to be pressed). In the "German QWERTZ" and "French AZERTY" columns, the hotkeys differing from U.S. QWERTY are shown. If you have another type of keyboard that you would like to have incorporated into the table, feel free to add a column (or ask for it on the talk page).
 
If a hotkey's functionality has been restored in Windows using the Daodan DLL, it will be checked off here. Stuff that doesn't work has been grouped at the end of the table.
 
{|class="wikitable" style="margin-left:auto; margin-right:auto;"
!U.S. QWERTY
!German QWERTZ
!French AZERTY
!Description
!width=75|Windows
!width=75|Mac
|-
|` (grave accent)
|bgcolor=silver|^
|bgcolor=silver|²
|Displays console
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+O
|Hide non-(visually-)occluding quads '''(1)'''
|
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+S
|Hide non-sound-occluding quads '''(2)'''
|
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+<tt>I</tt>
|Draw invisible quads
|
|align=center|{{ckblue}}
|-
|Ctrl+Shift+Y
|bgcolor=silver|Ctrl+Shift+Z
|Ctrl+Shift+Y
|Performance display (includes FPS)
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+T
|Draw only character-colliding geometry
|
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+R
|Draw only object-colliding geometry
|
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+F
|Fast Mode (runs Oni at up to 24x)
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+G
|Draw Every Frame Mode
|align=center|{{ckblue}}
|align=center|'''(3)'''
|-
|colspan=3|Ctrl+Shift+X
|Toggle show trigger volumes (formerly "Secret X")
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+Ins
|Add flag
|align=center|{{ckblue}}
|align=center|'''(4)'''
|-
|colspan=3|Ctrl+Shift+Del
|Delete flag
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+U
|Unstick player
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|Ctrl+Shift+\
|bgcolor=silver|Ctrl+Shift+#
|bgcolor=silver|Ctrl+Shift+*
|Displays "Profile on"/"Profile off" (no other known effect)
|align=center|{{ckblue}}
|
|-
|colspan=3|Ctrl+Shift+L
|Dumps a screenshot every frame
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=2|. (period)
|bgcolor=silver|: (colon)
|Single Step Mode
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|/
|bgcolor=silver| -
|bgcolor=silver|!
|Advance one step (when in Single Step Mode)
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|.+/
|bgcolor=silver|.+-
|bgcolor=silver|:+!
|Exit Single Step Mode (press keys simultaneously)
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+Home
|Cycle active camera
|
|align=center|{{ckblue}}
|-
|colspan=3|End
|Warp to camera
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+Shift+B
|Shows current opponent's logic
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|]
|bgcolor=silver| +
|bgcolor=silver|$
|Freeze animation frame '''(6)'''
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|[
|bgcolor=silver|Ü
|bgcolor=silver|^
|Advance animation frame '''(6)'''
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|F2
|Cutscene Animation 1
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|F3
|Cutscene Animation 2
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|F6
|Kill all AIs
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Ctrl+F7
|Play dead
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|F7, Shift+F7
|Cycle weapons (holster to get second weapon)
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|F8, Shift+F8
|Cycle characters
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|F9
|Start recording
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|F10
|Stop recording
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|F11
|Playback recording
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
|colspan=3|Return/Enter
|Cycle camera modes (see table below for camera controls):<br>1. Normal<br>2. Detached A - mouse still controls character aim<br>3. Detached B - mouse aims camera
|align=center|{{ckblue}}
|align=center|{{ckblue}}
|-
!U.S. QWERTY
!German QWERTZ
!French AZERTY
!Description
!width=75|Windows
!width=75|Mac
|-
|Ctrl+Shift+Y
|bgcolor=silver|Ctrl+Shift+Z
|Ctrl+Shift+Y
|Secret Y '''(5)'''
|
|
|-
|Ctrl+Shift+Z
|bgcolor=silver|Ctrl+Shift+Y
|Ctrl+Shift+Z
|Secret Z '''(5)'''
|
|
|-
|colspan=3|Ctrl+Shift+N
|Camera recording start
|
|
|-
|colspan=2|Ctrl+Shift+M
|bgcolor=silver|Ctrl+Shift+,
|Camera recording stop
|
|
|-
|colspan=2|Ctrl+Shift+,
|bgcolor=silver|Ctrl+Shift+;
|Camera recording playback
|
|
|-
|colspan=3|
|Place quad
|
|
|-
|colspan=3|
|Place quad mode
|
|
|-
|colspan=2|Ctrl+Shift+1
|bgcolor=silver|Ctrl+Shift+&
|Test One
|
|
|-
|colspan=2|Ctrl+Shift+2
|bgcolor=silver|Ctrl+Shift+é
|Test Two
|
|
|-
|colspan=2|Ctrl+Shift+3
|bgcolor=silver|Ctrl+Shift+"
|Test Three
|
|
|-
|colspan=2|Ctrl+Shift+4
|bgcolor=silver|Ctrl+Shift+'
|Test Four
|
|
|-
|colspan=3|Ctrl+Shift+K
|Kill particles
|
|
|-
|colspan=3|Backspace
|Enter AI debugger
|
|
|-
|colspan=2|7
|bgcolor=silver|è
|Explode One
|
|
|-
|colspan=2|8
|bgcolor=silver|_
|Explode Two
|
|
|-
|colspan=2|9
|bgcolor=silver|ç
|Explode Three
|
|
|-
|colspan=2|0
|bgcolor=silver|@
|Explode Four
|
|
|-
|colspan=3|Ctrl+Shift+J
|Reset particles
|
|
|-
|Ctrl+Shift+W
|bgcolor=silver|Ctrl+Shift+Z
|Ctrl+Shift+W
|Drop flag and add waypoint
|
|
|-
|colspan=3|Ctrl+Shift+P
|Display particle performance
|
|
|-
|Ctrl+Shift+;
|bgcolor=silver|Ctrl+Shift+Ö
|bgcolor=silver|Ctrl+Shift+M
|Lock particle performance display
|
|
|}
 
 
'''(1)''' This dev feature does not fully function in Windows, so the only non-occluding quads that disappear are console screens.
 
'''(2)''' This dev feature does not fully function in Windows, so the non-sound-occluding quads remain visible. However, the second aspect of this feature, which marks furniture with a red texture to indicate that it is partially sound-occluding, still works.
 
'''(3)''' On Macs, Draw Every Frame Mode speeds up the game almost to the extent of Fast Mode, but with glitchy animations.
 
'''(4)''' Please see talk page section "Insert key on Macs".
 
'''(5)''' Wouldn't Ctrl+Y and Ctrl+Z conflict with "Performance display"?
 
'''(6)''' "Animation freezing" works on the main character and means two things:
:a) The character's position and pose remain exactly the same as they were at the time of freezing, along with collision shapes (spheres and body parts) and other stuff.
:b) The actual character, unless "pinned" with <tt>[[chr_pin_character]]=1</tt>, will keep moving with the same velocity as at the time of freezing.
:*For regular (grounded) animations, the vertical velocity is zero and the horizontal velocity is determined by the animation frame that was playing at the time of freezing.
:*If airborne (jumping or falling) the current airborne velocity (both vertical and horizontal) at the time of freezing is maintained.
:*Wall collision is disabled, as well as gravity acceleration and the "air" timer (so you can't die from falling for too long while frozen).
:*Floor collision still works, as well as the "off" timer that starts when you step off a ledge, and the downward velocity that is applied then (see [[ONCC]] for details on this downward velocity).
:If one sets <tt>[[chr_pin_character]]=1</tt>, then animation debugging works exactly as intended: there is no drifting, and one can conveniently advance through the frames of the current animation.
:If one does not set <tt>[[chr_pin_character]]=1</tt>, then the frame-freezing functionality does not allow one to study animations, and instead provides a powerful (and risky) teleporting gimmick.
 
===Camera controls===
Note that the camera controls have default mappings, given below, but unlike the developer hotkeys, they are '''custom-bindable'''. In fact, on Macs, the default numpad bindings ''need'' to be customized or they won't work at all. See note [[Customizing/Binding#Detached camera controls|HERE]] about how to bind these keys and fix the Mac numpad controls. Also, the definitions of panning left and right are reversed, as NumPad4 will turn the camera to the left, but its action is called "man_cam_pan_right", and vice versa for NumPad6....
 
After detaching the camera with Enter and flying it away from Konoko, the End key teleports Konoko to the camera position and attaches the camera to her position again. If you turn off collision with "chr_nocollision 0 1" before teleporting, Konoko will not fall out of the air when teleported to the camera position (just don't jump with collision off...).
{|class="wikitable" style="margin-left:auto; margin-right:auto;"
|align="center"|'''Windows'''
{|class="wikitable" style="margin-left:auto; margin-right:auto;"
!Key
!Result
|-
|NumPad 1/3
|Move camera left/right
|-
|NumPad 8/5
|Move camera forward/backward
|-
|NumPad -/+
|Move camera up/down
|-
|NumPad 6/4
|Pan camera left/right
|-
|Up/Down Arrow
|Pan camera up/down
|}
|align="center"|'''Mac'''
{|class="wikitable" style="margin-left:auto; margin-right:auto;"
!Key
!Result
|-
|Left/Right Arrow
|Move camera left/right
|-
|Up/Down Arrow
|Move camera forward/backward
|-
|Page Up/Down
|Move camera up/down
|-
|NumPad 6/4
|Pan camera left/right
|-
|NumPad 8/2
|Pan camera up/down
|}
|}


Yeah, it's a sorry thing for Mac users, but Dev Mode was completely [[PS vs Mac|cut from the Mac build]].
===Runtime scripting===
===Enabling the cheat===
Almost anything that you can write in a [[BSL]] script you can enter at runtime with the console. One major thing you can't do is register new variables and functions. You can only call existing functions and get/set the values of existing variables. "Existing" means either built-in ones (see [[BSL:Functions]] and [[BSL:Variables]]), or ones found in the level scripts, or ones defined by scripts you may have added to the current level.
Get the patched executable here (English version, patched with Ian's patch then patched by [[User:Geyser|myself]] according to SFeli's instructions) :
*[http://geyser.oni2.net/Developer_Mode/Oni_ian_dev.exe Oni_ian_dev.exe]
(I've packed the cheat-code strings together, so that they don't take any extra space)


You can also follow SFeli's instructions] and patch it yourself...
While typing on the console line, you'll see a suggested autocompletion for the command you're typing; Tab accepts the autocomplete, and then Tab or Shift-Tab will cycle forward/backward through adjacent commands in ASCIIbetical order (A…Z comes before a…z). Previous commands from the current session can be retrieved with the up/down arrows. You can't insert/delete text in the middle of a command; you have to use Backspace. Copy and Paste are not available either.
===Binding extra functions===
One event you absolutely want to bind is "console" (if you don't have a US keyboard, the automatic binding to "apostrophe" may not work for you).


As for the other ones... some of them are already bindable ''without'' the Dev Mode. Some others will be bound automatically and will work without you having to edit you key_config.txt.
If you press an illegal key during console input (such as F1), the input display will freeze; hit Tab a few times to fix.


A few of them don't work out as nicely as expected. We'll tell you more about them in the near future.
===Cheating===
===Enjoying===
There are a few commands which you can type in as equivalents to regular cheat codes, and more that you can't do with cheats:
Type in "thedayismine" as you'd type in any other cheat. Use [[OSGE|OSGE]] to enable cheats if you haven't finished the game and don't want to hack '''persist.dat''' manually.
*"chr_nocollision 0 1" and "chr_nocollision 0 0" enable/disable no-clip, allowing you to walk through walls. When in no-clip mode, you can't fall; thus, jumping makes you flail in midair, and eventually you die (so try not to jump).
Go back to the game and hit the "console" key.
*"give_powerup shield" gives you a force shield (which you can't get with '''fatloot''').
*See [[Cheats]] for the BSL equivalents to various other cheats.


Filling in...
[[Category:Engine docs]][[Category:OniX-affected articles]]

Latest revision as of 15:44, 6 December 2023

Developer Mode's cheat code on a special crate in Syndicate Warehouse.

Developer Mode is a bundle of features created by Bungie West to help them develop Oni: a console line for entering scripting commands, manual camera controls, and various debugging features. It was traditionally activated with the cheat code thedayismine, but see "Unlocking it" and "Activating it" below before trying the code.

Despite being hinted at by a crate texture (right) and appearing on a leaked list of cheat codes during beta testing, this cheat code did not work upon Oni's release, and it was long believed that Developer Mode had been cut from retail versions of Oni. However, Dev Mode is actually present in all available versions of Oni. It just needed to be unlocked, as the community learned back in 2006.

Below you will find download links, unlocking instructions, and finally an overview of the Developer Mode's features. For Dev Mode features lurking in the PS2 version of Oni, first discovered in 2017, see Oni (PlayStation 2).

Unlocking it

...by downloading a patch

Windows: You can install the Daodan DLL to unlock Developer Mode; note that the Anniversary Edition installs the Daodan DLL automatically.
Mac: The Intel build of Oni already has Dev Mode unlocked; note that the Anniversary Edition installs the Intel build automatically.

...by doing it yourself

Activating it

Unlock cheats

Even once Developer Mode is unlocked, it must be activated in-game through a cheat code. Cheats are normally disabled until you finish the full version of the game, but cheats are enabled all the time when the Daodan DLL is installed in Windows or when using the Mac Intel build.

Enter the cheat code

Enter the Data Comlink (default key F1) and look for a confirmation message after typing the Developer Mode cheat thedayismine (or killmequick if you followed the DIY tutorial above). You can also just type x when the Daodan DLL or Mac Intel build is being used.

Using the console

~
`
§
½
°
^

2
U.S.
QWERTY
Danish
QWERTY
German
QWERTZ
French
AZERTY

By default, Oni auto-binds the "console" toggle to the key to the left of the numeric row. On U.S. QWERTY keyboards, this is the key with a grave accent, `, in the lowercase position and a tilde, ~, in the uppercase position. It is usually called the "tilde key" by users even though it's really the "grave accent key".

On non-U.S. keyboards, that key may not be present. The default key for your layout is depicted to the right:

Danish QWERTY: The ½ key to the left of the numeric row.
German QWERTZ: The circumflex accent key, ^.
French AZERTY: The 2 key to the left of the numeric row.

Or you can simply add a line like "bind z to console" to key_config.txt in your Oni folder and you'll be able to open the console with that key. In some cases, this bound key will not close the console, but pressing the grave accent key will, oddly enough.

Console output glitch

When Developer Mode is active, Oni prints debug messages about in-game events along the bottom-left of the screen. Past messages scroll up the screen and fade. In some situations, messages don't fade (e.g. if character debugging is enabled or you are currently using the console line).

The easiest way to check whether console output works at all is to press F8: the character class change is acknowledged with a console message.

If you don't see anything, console output is broken in your version of Oni. The old WinXP patch (no longer offered because it is superseded by the Daodan DLL) was known to disable console output. In Windows demo Oni, both console output and console input are invisible (i.e. you can enter script commands, but you're "blindfolded").

Features

Many of the features listed below no longer work as intended, either due to changes made to the code before shipping Oni or due to the absence in retail Oni of developer resources that the features were intended to call upon, such as level0_Tools. Nevertheless, some of these features are helpful for modders, most notably the camera controls and dev console.

Hotkeys

Below are Oni's hardcoded mappings for Developer Mode functions. The Alt key (Option key on Macs) can be used in place of Ctrl. Ctrl is called "Strg" on German keyboards.

The "U.S. QWERTY" column gives the standard hotkeys (the keys intended by the American developers to be pressed). In the "German QWERTZ" and "French AZERTY" columns, the hotkeys differing from U.S. QWERTY are shown. If you have another type of keyboard that you would like to have incorporated into the table, feel free to add a column (or ask for it on the talk page).

If a hotkey's functionality has been restored in Windows using the Daodan DLL, it will be checked off here. Stuff that doesn't work has been grouped at the end of the table.

U.S. QWERTY German QWERTZ French AZERTY Description Windows Mac
` (grave accent) ^ ² Displays console Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+Shift+O Hide non-(visually-)occluding quads (1) Checkmark 16px blue.png
Ctrl+Shift+S Hide non-sound-occluding quads (2) Checkmark 16px blue.png
Ctrl+Shift+I Draw invisible quads Checkmark 16px blue.png
Ctrl+Shift+Y Ctrl+Shift+Z Ctrl+Shift+Y Performance display (includes FPS) Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+Shift+T Draw only character-colliding geometry Checkmark 16px blue.png
Ctrl+Shift+R Draw only object-colliding geometry Checkmark 16px blue.png
Ctrl+Shift+F Fast Mode (runs Oni at up to 24x) Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+Shift+G Draw Every Frame Mode Checkmark 16px blue.png (3)
Ctrl+Shift+X Toggle show trigger volumes (formerly "Secret X") Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+Shift+Ins Add flag Checkmark 16px blue.png (4)
Ctrl+Shift+Del Delete flag Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+Shift+U Unstick player Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+Shift+\ Ctrl+Shift+# Ctrl+Shift+* Displays "Profile on"/"Profile off" (no other known effect) Checkmark 16px blue.png
Ctrl+Shift+L Dumps a screenshot every frame Checkmark 16px blue.png Checkmark 16px blue.png
. (period) : (colon) Single Step Mode Checkmark 16px blue.png Checkmark 16px blue.png
/ - ! Advance one step (when in Single Step Mode) Checkmark 16px blue.png Checkmark 16px blue.png
.+/ .+- :+! Exit Single Step Mode (press keys simultaneously) Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+Shift+Home Cycle active camera Checkmark 16px blue.png
End Warp to camera Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+Shift+B Shows current opponent's logic Checkmark 16px blue.png Checkmark 16px blue.png
] + $ Freeze animation frame (6) Checkmark 16px blue.png Checkmark 16px blue.png
[ Ü ^ Advance animation frame (6) Checkmark 16px blue.png Checkmark 16px blue.png
F2 Cutscene Animation 1 Checkmark 16px blue.png Checkmark 16px blue.png
F3 Cutscene Animation 2 Checkmark 16px blue.png Checkmark 16px blue.png
F6 Kill all AIs Checkmark 16px blue.png Checkmark 16px blue.png
Ctrl+F7 Play dead Checkmark 16px blue.png Checkmark 16px blue.png
F7, Shift+F7 Cycle weapons (holster to get second weapon) Checkmark 16px blue.png Checkmark 16px blue.png
F8, Shift+F8 Cycle characters Checkmark 16px blue.png Checkmark 16px blue.png
F9 Start recording Checkmark 16px blue.png Checkmark 16px blue.png
F10 Stop recording Checkmark 16px blue.png Checkmark 16px blue.png
F11 Playback recording Checkmark 16px blue.png Checkmark 16px blue.png
Return/Enter Cycle camera modes (see table below for camera controls):
1. Normal
2. Detached A - mouse still controls character aim
3. Detached B - mouse aims camera
Checkmark 16px blue.png Checkmark 16px blue.png
U.S. QWERTY German QWERTZ French AZERTY Description Windows Mac
Ctrl+Shift+Y Ctrl+Shift+Z Ctrl+Shift+Y Secret Y (5)
Ctrl+Shift+Z Ctrl+Shift+Y Ctrl+Shift+Z Secret Z (5)
Ctrl+Shift+N Camera recording start
Ctrl+Shift+M Ctrl+Shift+, Camera recording stop
Ctrl+Shift+, Ctrl+Shift+; Camera recording playback
Place quad
Place quad mode
Ctrl+Shift+1 Ctrl+Shift+& Test One
Ctrl+Shift+2 Ctrl+Shift+é Test Two
Ctrl+Shift+3 Ctrl+Shift+" Test Three
Ctrl+Shift+4 Ctrl+Shift+' Test Four
Ctrl+Shift+K Kill particles
Backspace Enter AI debugger
7 è Explode One
8 _ Explode Two
9 ç Explode Three
0 @ Explode Four
Ctrl+Shift+J Reset particles
Ctrl+Shift+W Ctrl+Shift+Z Ctrl+Shift+W Drop flag and add waypoint
Ctrl+Shift+P Display particle performance
Ctrl+Shift+; Ctrl+Shift+Ö Ctrl+Shift+M Lock particle performance display


(1) This dev feature does not fully function in Windows, so the only non-occluding quads that disappear are console screens.

(2) This dev feature does not fully function in Windows, so the non-sound-occluding quads remain visible. However, the second aspect of this feature, which marks furniture with a red texture to indicate that it is partially sound-occluding, still works.

(3) On Macs, Draw Every Frame Mode speeds up the game almost to the extent of Fast Mode, but with glitchy animations.

(4) Please see talk page section "Insert key on Macs".

(5) Wouldn't Ctrl+Y and Ctrl+Z conflict with "Performance display"?

(6) "Animation freezing" works on the main character and means two things:

a) The character's position and pose remain exactly the same as they were at the time of freezing, along with collision shapes (spheres and body parts) and other stuff.
b) The actual character, unless "pinned" with chr_pin_character=1, will keep moving with the same velocity as at the time of freezing.
  • For regular (grounded) animations, the vertical velocity is zero and the horizontal velocity is determined by the animation frame that was playing at the time of freezing.
  • If airborne (jumping or falling) the current airborne velocity (both vertical and horizontal) at the time of freezing is maintained.
  • Wall collision is disabled, as well as gravity acceleration and the "air" timer (so you can't die from falling for too long while frozen).
  • Floor collision still works, as well as the "off" timer that starts when you step off a ledge, and the downward velocity that is applied then (see ONCC for details on this downward velocity).
If one sets chr_pin_character=1, then animation debugging works exactly as intended: there is no drifting, and one can conveniently advance through the frames of the current animation.
If one does not set chr_pin_character=1, then the frame-freezing functionality does not allow one to study animations, and instead provides a powerful (and risky) teleporting gimmick.

Camera controls

Note that the camera controls have default mappings, given below, but unlike the developer hotkeys, they are custom-bindable. In fact, on Macs, the default numpad bindings need to be customized or they won't work at all. See note HERE about how to bind these keys and fix the Mac numpad controls. Also, the definitions of panning left and right are reversed, as NumPad4 will turn the camera to the left, but its action is called "man_cam_pan_right", and vice versa for NumPad6....

After detaching the camera with Enter and flying it away from Konoko, the End key teleports Konoko to the camera position and attaches the camera to her position again. If you turn off collision with "chr_nocollision 0 1" before teleporting, Konoko will not fall out of the air when teleported to the camera position (just don't jump with collision off...).

Windows
Key Result
NumPad 1/3 Move camera left/right
NumPad 8/5 Move camera forward/backward
NumPad -/+ Move camera up/down
NumPad 6/4 Pan camera left/right
Up/Down Arrow Pan camera up/down
Mac
Key Result
Left/Right Arrow Move camera left/right
Up/Down Arrow Move camera forward/backward
Page Up/Down Move camera up/down
NumPad 6/4 Pan camera left/right
NumPad 8/2 Pan camera up/down

Runtime scripting

Almost anything that you can write in a BSL script you can enter at runtime with the console. One major thing you can't do is register new variables and functions. You can only call existing functions and get/set the values of existing variables. "Existing" means either built-in ones (see BSL:Functions and BSL:Variables), or ones found in the level scripts, or ones defined by scripts you may have added to the current level.

While typing on the console line, you'll see a suggested autocompletion for the command you're typing; Tab accepts the autocomplete, and then Tab or Shift-Tab will cycle forward/backward through adjacent commands in ASCIIbetical order (A…Z comes before a…z). Previous commands from the current session can be retrieved with the up/down arrows. You can't insert/delete text in the middle of a command; you have to use Backspace. Copy and Paste are not available either.

If you press an illegal key during console input (such as F1), the input display will freeze; hit Tab a few times to fix.

Cheating

There are a few commands which you can type in as equivalents to regular cheat codes, and more that you can't do with cheats:

  • "chr_nocollision 0 1" and "chr_nocollision 0 0" enable/disable no-clip, allowing you to walk through walls. When in no-clip mode, you can't fall; thus, jumping makes you flail in midair, and eventually you die (so try not to jump).
  • "give_powerup shield" gives you a force shield (which you can't get with fatloot).
  • See Cheats for the BSL equivalents to various other cheats.