Developer Mode: Difference between revisions
m (→thedayismine) |
mNo edit summary |
||
Line 1: | Line 1: | ||
{|align=right | {|align=right | ||
|+Label on a crate in<br>Syndicate Warehouse | |||
|http://geyser.oni2.net/Developer_Mode/TheDayIsMine.png | |||
|http://geyser.oni2.net/Developer_Mode/TheDayIsMine0.png | |http://geyser.oni2.net/Developer_Mode/TheDayIsMine0.png | ||
|} | |} | ||
==thedayismine== | ==thedayismine== | ||
Line 57: | Line 58: | ||
Look at the cheat table entry structure: | Look at the cheat table entry structure: | ||
struct ONI_CHEAT_ENTRY ;FASM-style structure declaration. | 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 | 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). | 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). | ||
{| | {|border=1 cellspacing=0 | ||
|+The whole array | |+The whole array | ||
| | |||
!colspan=4|ONI_CHEAT_ENTRY | |||
|- | |||
| | |||
!lpszCheatName | |||
!lpszDescOn | |||
!lpszDescOff | |||
!nFnIndex | |||
|- | |||
!shapeshifter | !shapeshifter | ||
|szShapeShifter | |szShapeShifter | ||
|szShapeShiftOn | |szShapeShiftOn | ||
Line 74: | Line 83: | ||
|- | |- | ||
!liveforever | !liveforever | ||
|szLive4Ever | |szLive4Ever | ||
|szLive4EverOn | |szLive4EverOn | ||
Line 81: | Line 89: | ||
|- | |- | ||
!touchofdeath | !touchofdeath | ||
|szTouchOfDeath | |szTouchOfDeath | ||
|szTODOn | |szTODOn | ||
Line 88: | Line 95: | ||
|- | |- | ||
!canttouchthis | !canttouchthis | ||
|szCantTouch | |szCantTouch | ||
|szCantTouchOn | |szCantTouchOn | ||
Line 95: | Line 101: | ||
|- | |- | ||
!fatloot ''(1)'' | !fatloot ''(1)'' | ||
|szFatLoot | |szFatLoot | ||
|szFatLootOn | |szFatLootOn | ||
Line 102: | Line 107: | ||
|- | |- | ||
!glassworld | !glassworld | ||
|szGlassWorld | |szGlassWorld | ||
|szGlassWorldOn | |szGlassWorldOn | ||
Line 109: | Line 113: | ||
|- | |- | ||
!winlevel ''(2)'' | !winlevel ''(2)'' | ||
|szWinLevel | |szWinLevel | ||
|szWinLevelOn | |szWinLevelOn | ||
Line 116: | Line 119: | ||
|- | |- | ||
!loselevel ''(2)'' | !loselevel ''(2)'' | ||
|szLoseLevel | |szLoseLevel | ||
|szLoseLevelOff | |szLoseLevelOff | ||
Line 123: | Line 125: | ||
|- | |- | ||
!bighead | !bighead | ||
|szBigHead | |szBigHead | ||
|szBigHeadOn | |szBigHeadOn | ||
Line 130: | Line 131: | ||
|- | |- | ||
!minime | !minime | ||
|szMiniMe | |szMiniMe | ||
|szMiniMeOn | |szMiniMeOn | ||
Line 137: | Line 137: | ||
|- | |- | ||
!superammo | !superammo | ||
|szSuperAmmo | |szSuperAmmo | ||
|szSuperAmmoOn | |szSuperAmmoOn | ||
Line 144: | Line 143: | ||
|- | |- | ||
!reservoirdogs | !reservoirdogs | ||
|szResDogs | |szResDogs | ||
|szResDogsOn | |szResDogsOn | ||
Line 151: | Line 149: | ||
|- | |- | ||
!roughjustice | !roughjustice | ||
|szRoughJustice | |szRoughJustice | ||
|szRJOn | |szRJOn | ||
Line 158: | Line 155: | ||
|- | |- | ||
!chenille | !chenille | ||
|szChenille | |szChenille | ||
|szChenilleOn | |szChenilleOn | ||
Line 165: | Line 161: | ||
|- | |- | ||
!behemoth | !behemoth | ||
|szBehemoth | |szBehemoth | ||
|szBehemothOn | |szBehemothOn | ||
Line 172: | Line 167: | ||
|- | |- | ||
!elderrune | !elderrune | ||
|szElderrune | |szElderrune | ||
|szElderruneOn | |szElderruneOn | ||
Line 179: | Line 173: | ||
|- | |- | ||
!moonshadow | !moonshadow | ||
|szMoonShadow | |szMoonShadow | ||
|szMoonShadowOn | |szMoonShadowOn | ||
Line 186: | Line 179: | ||
|- | |- | ||
!munitionfrenzy ''(2)'' | !munitionfrenzy ''(2)'' | ||
|szMunitionFrenzy | |szMunitionFrenzy | ||
|szMunFrenOn | |szMunFrenOn | ||
Line 193: | Line 185: | ||
|- | |- | ||
!fistsoflegend | !fistsoflegend | ||
|szFistsOfLegend | |szFistsOfLegend | ||
|szFistsOn | |szFistsOn | ||
Line 200: | Line 191: | ||
|- | |- | ||
!killmequick | !killmequick | ||
|szKillMeQuick | |szKillMeQuick | ||
|szKillMeQOn | |szKillMeQOn | ||
Line 207: | Line 197: | ||
|- | |- | ||
!carousel | !carousel | ||
|szCarousel | |szCarousel | ||
|szCarouselOn | |szCarouselOn | ||
Line 214: | Line 203: | ||
|- | |- | ||
!''(3)'' | !''(3)'' | ||
| | |0 | ||
|0 | |0 | ||
|0 | |0 |
Revision as of 15:33, 19 March 2006
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 cheat codes with stuff like :
- (this one from 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 :) :| :(
It just didn't work. No matter what one did. One has tried to call up the console through scripting, but without any success.
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.
(maybe add links to frustrated forum talk etc)
It looked like we were screwed.
Until...
January 21, 2006
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).
ONI_CHEAT_ENTRY | ||||
---|---|---|---|---|
lpszCheatName | lpszDescOn | lpszDescOff | nFnIndex | |
shapeshifter | szShapeShifter | szShapeShiftOn | szShapeShiftOff | 0x00 |
liveforever | szLive4Ever | szLive4EverOn | szLive4EverOff | 0x01 |
touchofdeath | szTouchOfDeath | szTODOn | szTODOff | 0x02 |
canttouchthis | szCantTouch | szCantTouchOn | szCantTouchOff | 0x03 |
fatloot (1) | szFatLoot | szFatLootOn | 0 | 0x04 |
glassworld | szGlassWorld | szGlassWorldOn | szGlassWorldOff | 0x05 |
winlevel (2) | szWinLevel | szWinLevelOn | 0 | 0x06 |
loselevel (2) | szLoseLevel | szLoseLevelOff | 0 | 0x07 |
bighead | szBigHead | szBigHeadOn | szBigHeadOff | 0x08 |
minime | szMiniMe | szMiniMeOn | szMiniMeOff | 0x09 |
superammo | szSuperAmmo | szSuperAmmoOn | szSuperAmmoOff | 0x0a |
reservoirdogs | szResDogs | szResDogsOn | szResDogsOff | 0x0c |
roughjustice | szRoughJustice | szRJOn | szRJOff | 0x0d |
chenille | szChenille | szChenilleOn | szChenilleOff | 0x0e |
behemoth | szBehemoth | szBehemothOn | szBehemothOff | 0x0f |
elderrune | szElderrune | szElderruneOn | szElderruneOff | 0x10 |
moonshadow | szMoonShadow | szMoonShadowOn | szMoonShadowOff | 0x11 |
munitionfrenzy (2) | szMunitionFrenzy | szMunFrenOn | 0 | 0x12 |
fistsoflegend | szFistsOfLegend | szFistsOn | szFistsOff | 0x13 |
killmequick | szKillMeQuick | szKillMeQOn | szKillMeQOff | 0x14 |
carousel | szCarousel | szCarouselOn | szCarouselOff | 0x15 |
(3) | 0 | 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? 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.
What was that cheat? Developer mode, of course!!! :-) And since cheats array was fixed-size (0x16) elements -- we have a zero entry at the end of array. Fill it with correct szCheatName, szDescOn, szDescOff pointers, set nFnIndex to 0x0b and you will have working developer mode cheat code.
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 ;-)).
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).
Here is complete list of bound actions:
- 'profile_toggle' to ONI_KEY_BSLASH ;Backslash.
- 'console' to '`' ;'~' key (tilde).
- 'unstick' to 'u'
- 'cutscene1' to ONI_KEY_F2
- 'cutscene2' to ONI_KEY_F3
- 'f4' to ONI_KEY_F4
- '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. Press 'Tab' to cycle through all available commands / autocomplete command that you've started to type in.
Developer Mode
Yeah, Developer Mode... it's there after all. That's when we all say W.O.W. and hurry to our PCs.
Yeah, it's a sorry thing for Mac users, but Dev Mode was completely cut from the Mac build.
Enabling the cheat
Get the patched executable here (English version, patched with Ian's patch then patched by myself according to SFeli's instructions) :
(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...
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.
A few of them don't work out as nicely as expected. We'll tell you more about them in the near future.
Enjoying
Type in "thedayismine" as you'd type in any other cheat. Use OSGE to enable cheats if you haven't finished the game and don't want to hack persist.dat manually. Go back to the game and hit the "console" key.
Filling in...