Developer Mode: Difference between revisions

m
→‎...by doing it yourself: wording, mainly centered around clarifying the different Mac builds
m (wording)
m (→‎...by doing it yourself: wording, mainly centered around clarifying the different Mac builds)
Line 14: Line 14:
===...by doing it yourself===
===...by doing it yourself===
{{Divhide}}
{{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 your Mac is not running the Intel build (though a Dev Mode-enabled version of the last PPC build is [[OMNI|HERE]]).
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]]).


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 PC 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 [http://ridiculousfish.com/hexfiend/ Hex Fiend] has a better comparison function so you can check your work afterward (open original and edited binaries and choose File>Compare "Oni" and "Oni").
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 [http://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").


====Cheat code lookup tables====
====Cheat code lookup tables====
Line 100: Line 100:


;Cheat lookup table
;Cheat lookup table
:When you type characters in the "pause screen", the text you enter is progressively compared with all the strings in the cheat table.
:When you type characters in the Pause screen, the text you enter is progressively compared with all the strings in the cheat table.
:When and if there is a match, the corresponding confirmation message is displayed for enablement/confirmation or for disablement if the cheat was already on, and the corresponding cheat event takes effect when the Pause screen is closed.
:When and if there is a match, the corresponding confirmation message is displayed for enablement/confirmation, or for disablement if the cheat was already on, and the corresponding cheat event takes effect when the Pause screen is closed.
:In full, each row of the cheat table consists of:
:In full, each row of the cheat table consists of:
:*a pointer to the cheat code string
:*a pointer to the cheat code string
Line 110: Line 110:


;Data size on different platforms
;Data size on different platforms
:In the Windows retail, Windows demo and macOS PPC builds, every row of the lookup table takes up 16 bytes; the 3 pointers and the ID are 4-byte data words (Little Endian on PC, Big Endian on PPC Macs); if a cheat has no "disabled" message, the row's third pointer is null.
: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.
<!--This does not appear to be true, not sure what version geyser was looking at. The item below this claimed to be for the Mac beta, but it's actually true of the Mac retail app. --Iritscen
: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).
:In the Mac OS 9 retail and demo, every row of the lookup table takes up 8 bytes; the 3 pointers and the ID are 3-byte data words (Big Endian); if a cheat has no "disabled" message, the last byte of the third element is taken up by the ID (the remaining 2 bytes are garbage, as well as the ID field).-->
:In the Mac OS 9 builds, the pointers and the ID are 2-byte words (Big Endian); regular rows take up 8 bytes; 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... 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).


====Let's kill killmequick====
====Let's kill "killmequick"====
In the Windows, Windows demo and macOS 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. On Mac OS 9, 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).
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).


====Finding the lookup table====
====Finding the lookup table====
Open the executable (or the data fork of the executable in the Mac OS 9 build), after backing it up of course.... We shall look for the last three elements of the table, corresponding to '''fistsoflegend''', '''killmequick''' and '''carousel'''.
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'''.
;In the Windows retail and demo builds, look for '''13 00 00 00 ## ## ## ## ## ## ## ## ## ## ## ## 14 00 00 00 ## ## ## ## ## ## ## ## ## ## ## ## 15 00 00 00'''
;In the Windows retail and demo builds, look for '''13 00 00 00 ## ## ## ## ## ## ## ## ## ## ## ## 14 00 00 00 ## ## ## ## ## ## ## ## ## ## ## ## 15 00 00 00'''
;In the macOS PPC build, look for '''00 00 00 13 ## ## ## ## ## ## ## ## ## ## ## ## 00 00 00 14 ## ## ## ## ## ## ## ## ## ## ## ## 00 00 00 15''' ([[:File:Finding killmequick - Omni build.jpg|sample pic]])
;In the Omni Group build, look for '''00 00 00 13 ## ## ## ## ## ## ## ## ## ## ## ## 00 00 00 14 ## ## ## ## ## ## ## ## ## ## ## ## 00 00 00 15''' ([[:File:Finding killmequick - Omni build.jpg|sample pic]])
;In the Mac OS 9 build, look for '''00 13 ## ## ## ## ## ## 00 14 ## ## ## ## ## ## 00 15''' ([[:File:Finding killmequick - Mac OS 9 build.jpg|sample pic]])
;In the retail Mac build, look for '''00 13 ## ## ## ## ## ## 00 14 ## ## ## ## ## ## 00 15''' ([[:File:Finding killmequick - Mac OS 9 build.jpg|sample pic]])
;
;
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'''.
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'''.