Code: Select all
<cheat desc="Invincibility">
<script state="on">
<action>temp0 = main.mw@1c57</action>
<action>temp1 = main.mw@2780</action>
<action>temp2 = main.mw@2819</action>
<action>temp3 = main.mw@2a1c</action>
<action>main.mw@1c57 = 1801</action>
<action>main.mw@2780 = 1804</action>
<action>main.mw@2819 = 1801</action>
<action>main.mw@2a1c = 1801</action>
</script>
<script state="off">
<action>main.mw@1c57 = temp0</action>
<action>main.mw@2780 = temp1</action>
<action>main.mw@2819 = temp2</action>
<action>main.mw@2a1c = temp3</action>
</script>
</cheat>
Code: Select all
<cheat desc="Infinite Lives">
<script state="on">
<action>temp0 = main.mb@12fc</action>
<action>temp1 = main.md@06c7</action>
<action>main.mb@12fc = 00</action><!-- never have lives subtracted -->
<action>main.md@06c7 = 0000063e</action><!-- always display maximum -->
</script>
<script state="off">
<action>main.mb@12fc = temp0</action>
<action>main.md@06c7 = temp1</action>
</script>
</cheat>
My version freezes the timer, and you can resume if you choose, even at zero.
Code: Select all
<cheat desc="Freeze Bonus Timer">
<script state="on">
<action>temp0 = main.mb@06a9</action>
<action>main.mb@06a9 = 00</action>
<action>main.pb@6386 = 00</action>
</script>
<script state="run">
<action condition="(main.pb@62b1 == 1)">main.pb@62b1 = main.pb@62b0 - 1</action>
</script>
<script state="off">
<action>main.mb@06a9 = temp0</action>
<action>temp1 = (main.pb@638c - (main.pb@638c / 10) * 6)</action>
<action condition="(main.pb@6200 != 0)">main.pb@62b1 = temp1</action>
<action condition="(main.pb@6200 != 0) AND (temp1 == 0)">main.pb@6386 = 02</action>
</script>
</cheat>
Code: Select all
<cheat desc="Select Starting Level">
<parameter min="2" max="99" step="1"/>
<script state="change">
<action>main.mb@095e = (param)</action>
<action condition="(param == 2)">main.mb@095f = 67</action>
<action condition="(param == 3)">main.mb@095f = 6A</action>
<action condition="(param == 4)">main.mb@095f = 6E</action>
<action condition="(param GT 4)">main.mb@095f = 73</action>
</script>
<script state="off">
<action>main.mb@095e = 01</action>
<action>main.mb@095f = 65</action>
</script>
</cheat>
1. [on] Save temp variables.
2. [run] Change bytes.
3. [off] Restore from temp variables.
A good example is the kill screen fix. It's a one-shot, but since all of the code is in "run", it gets reapplied every frame. It shouldn't have a run state:
Code: Select all
<cheat desc="Fix Kill Screen Bug">
<comment>Fixes the timer bug on level 22. See donhodges com how_high_can_you_get htm</comment>
<script state="on">
<action>temp0 = main.mq@0F7D</action>
<action>temp1 = main.mq@0F85</action>
<action>main.mq@0F7D = 3E47043E023805FE</action>
<action>main.mq@0F85 = 000218FC100AC628</action>
</script>
<script state="off">
<action>main.mq@0F7D = temp0</action>
<action>main.mq@0F85 = temp1</action>
</script>
</cheat>
Any advice on these is welcome. I'm guessing at the new format sometimes. I'll post updates here myself if I find any improvements.