Announcement

Collapse
No announcement yet.

Fixing the Crystalis Grinding Annoyance

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fixing the Crystalis Grinding Annoyance

    Hi, this is my first post.

    I joined because I couldn't find a Game Genie code to get something done that I wanted, so, I set out to hack the game myself.

    The game is Crystalis (NES) and what I'm trying to do is quadruple the amount of experience you get from killing enemies. This should make the game more enjoyable, because you won't have to spend so much time grinding.

    And you HAVE to grind in Crystalis:

    1. The levels are pretty small areas and the enemies are sparse
    2. The experience point rewards are small compared to the gaps between level-ups
    3. You have to level-up or you can't even damage enemies in upcoming areas (including bosses)

    I figure if you can earn four times as much as you are intended to, the game will seem more naturally "linear" and you won't feel like you're wasting time running in circles, respawning enemies and running into them with rapid-fire held down. 4x XP should make it so you might have to stop off and dispatch one or two extra enemies, but for the most part by the time you kill everything in sight directly on your way to wherever you're headed, you should have earned the necessary level ups to continue damaging things (including the requisite bosses).

    Another benefit would be that you won't be super-rich from all the wealth offered by the dead enemies, and purchases will have to be more carefully thought out and usage of consumable items more carefully guarded and planned.

    Anyways. So on to the hack:

    I got as far as finding that the experience is stored at $0704, and created a break looking for writes to $0704. Sure enough it breaks every time I kill an enemy. Specifically at line "OD:9254", a three-byte command to put the accumulator into $0704. Shortly before that, in line 0d:924a, there is an RTS, so I'm assuming that the subroutine that puts your new experience value in starts at :924b. I looked around for JMP to 924b but couldn't find anything.

    Well, I'm stumped. I don't know much about assembly, this is my first foray into seriously trying to reverse-engineer any program, and I'm not sure what to do, next.

    Ultimately what I want to do is:
    1. find where the game gets the XP value of the kill
    2. find where the game adds that to your current XP and puts the result in the accumulator
    3. get in the middle of that and rotate the XP value left twice (to multiply by four)

    Am I thinking about this the right way? Hopefully somebody will be able to help me out.

    -- Eyenot

  • #2
    took a look at it and I made it so its 4 times what you normally get, this is the actual line that loads the exp from the enemy:

    $924B:B9 20 05 LDA $0520,Y @ $0530 = #$01 A:FC X:04 Y:10 P:NvUbdizc

    its loading $0520 as a base and adding whats in Y register to it and it loads the value from $0530, if you were to actually track that back even further I'm sure you could find the exact table it will load from or even if you wanted to load a certain enemy's xp value you could just find what his offset is for and have it added to the base so it loads that enemies XP instead of the current enemies XP. But since thats not exactly what you want here is the code that has the effects you wanted:

    Raw:
    Multiply EXP x4
    924E:30:0A
    924F:0D:0A

    GG:
    Multiply EXP x4
    ZAKOTZAU
    ZAKOYXIE

    the original instruction these codes replace where a conditional branch, and since everytime I gained EXP it never branched I assumed it might be ok to replace but the code will need further testing to see if there will be issues.
    Spoiler Alert! Click to view...

    THE BAD GUY!!!!!!

    Comment


    • #3
      Wow, thank you very much Helder.

      So, if I just knew a bit more about ASM, I could've untangled the line on my own. Well, now that I have your translation of that line, I can spend time looking at it and at least learn the basic memory access and addition that's going on there. Thank you very much for that.

      Also, thanks for finding a space to put the multiplication into. I will playtest it for awhile and see if anything goes wrong. Crystalis should be a really much more playable game with this code put in.

      Comment


      • #4
        I played till i got a few levels in the very first area you encounter enemies and had no issues.
        Spoiler Alert! Click to view...

        THE BAD GUY!!!!!!

        Comment

        Working...
        X