• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

Making Every Pokemon A Starter

  • 247
    Posts
    6
    Years
    • Seen yesterday
    Ever since I got into Pokemon ROM hacking, I've wanted to implement an idea that I had: make any Pokemon available as a starter. However, I know some C, but have no scripting experience, so I'm not sure how I would go about doing this task.

    My goal, in practice, would be this: At the beginning of the game, when the player goes out to save Professor Birch and looks into the professor's bag, instead of going into the usual scene where you see the three Pokeballs next to the bag, you would instead just see a list appear that you could scroll through. It would have every Pokemon in the game, and whichever one you chose would be the Pokemon you'd fight the Zigzagoon with and eventually keep as your first Pokemon.

    I'm not sure how difficult it is to change an event like that, but I would greatly appreciate it if someone more experienced than I would either give me some solid pointers, or if they were incredibly gracious, actually write it up for me. And, if overwriting the normal starter selection script causes too many problems, I'd also be fine with an option of trading with Professor Birch whatever starter Pokemon you chose with any other Pokemon after you save the professor and go to his lab.
     
  • 1,403
    Posts
    10
    Years
    • Seen Apr 29, 2024
    I think you might be able to do this entirely from within regular scripts, assuming that the multichoice option command thing will scroll if you have too many options (I'm not sure). If that does work, you'd probably want to write a little code to generate the script, since it's going to be hundreds of options and checks that all look pretty much the same (differing only on the Pokémon they give you when it's chosen).
     
  • 247
    Posts
    6
    Years
    • Seen yesterday
    Does anyone know where the rival's (May/Brendan) starter is decided? I know it must be somehow linked to the player's starter choice, so I figured I'm going to have to handle that if I want this to work.
     

    Lunos

    Random Uruguayan User
  • 3,116
    Posts
    15
    Years
    Does anyone know where the rival's (May/Brendan) starter is decided? I know it must be somehow linked to the player's starter choice, so I figured I'm going to have to handle that if I want this to work.
    The Rival's starter is chosen in their script at the different maps where you battle them.
    There's 3 trainerbattles for both, Brendan and May, for every instance where you battle them. The Player gets one of those 3 depending on the value of VAR_STARTER_MON.

    Ex:
    Making Every Pokemon A Starter
     
  • 247
    Posts
    6
    Years
    • Seen yesterday
    I got it working! It's currently setup to work with DizzyEggg's Pokemon Expansion. I've also set it up so that you only have access to non-legendary/mythical, first-evolution Pokemon. I personally felt it would be a bit cheap to start the game with a Mewtwo or Garchomp. How would I go about sharing this? I know there's someway to connect my version of pokeemerald to the original, but I'm not sure how to go about that.
     
  • 49
    Posts
    5
    Years
    • Seen Dec 27, 2023
    If you have it in a github repository you could simply share the link. If not you would have to make a branche on github of DizzyEggg's and then upload your changes
     
  • 146
    Posts
    16
    Years
    • Age 26
    • Seen May 20, 2024
    I got it working! It's currently setup to work with DizzyEggg's Pokemon Expansion. I've also set it up so that you only have access to non-legendary/mythical, first-evolution Pokemon. I personally felt it would be a bit cheap to start the game with a Mewtwo or Garchomp. How would I go about sharing this? I know there's someway to connect my version of pokeemerald to the original, but I'm not sure how to go about that.

    Did you ever end up posting this code anywhere? If you don't want to set up a whole repo for it, you could always just post your changes here.
     
  • 247
    Posts
    6
    Years
    • Seen yesterday
    Did you ever end up posting this code anywhere? If you don't want to set up a whole repo for it, you could always just post your changes here.

    Sorry for the long wait. I thought I had it working, and then I found out there were several elements I had to account for. Now I've REALLY got it working, so here goes:

    In src/starter_choose.c:
    Spoiler:

    To explain what's going on here, I commented out a great deal of the normal starter-choosing process so that the scene with Professor Birch's bag and the Pokeballs don't appear, and it just takes the player's input from the scrolling list to choose the Pokemon. At the beginning of CB2_ChooseStarter, it checks to see if the Pokemon's secondary type is flying. Since the only pure Flying type (until Gen 8 is added) is Tornadus, and the only primary Flying types (again, until Gen 8 is added) are Noibat and Noivern, I made sure the game will account for flying types when choosing the rival's team, which I will talk about later. If the Pokemon is primarily Normal and secondarily Flying, it's just considered a Flying type. If it's NOT primarily Normal and is secondarily Flying, there's a 50% chance the Pokemon is considered a Flying type, and a 50% chance it is considered it's primary type.


    In src/script_menu.c:
    Spoiler:

    The real code stuff in here is just copied off of DizzyEgg's post. The rest is me slapping in every single Pokemon name that's needed for each list, as well as a unique value that lets starter_choose.c know which Pokemon the player chose.

    In src/scrcmd.c:
    Spoiler:
    This is used when the player chooses a starter Pokemon. A textbox appears and asks if the player is sure they want <insert Pokemon's name here>. This gets that name based off of the player's choice. I realized far too late that I could've just put SPECIES_<NAME OF MON> in each gSpecialVar_0x8002 assignment, rather than using the numbers those names represent. It still works exactly the same, but it could look a lot nicer.

    In src/data/trainers.h:
    Spoiler:

    This holds every possible encounter with your rival that you can have. Later on, in the Route 103 section, I'll explain why there are so many.
     
  • 247
    Posts
    6
    Years
    • Seen yesterday
    In src/data/trainer_parties.h:
    Spoiler:

    This holds every possible team that your rival could have. If you want, you can change up which Pokemon are in each team, since it is quite possible that some of the Route 103 battles, depending on the player's starter choice, will be effectively impossible. I wrote some other code that allows the game to proceed even if the player loses, so if you want that, just let me know.

    In include/constants/opponents.h, add this:
    Spoiler:
    This gives each of the names for each rival battle a value, which is required for src/data/trainers.h, as well as when we activate these battles in the scripts.

    In asm/macros/event.inc:
    Spoiler:
    These define some scripts that you will need to use in the starter choosing process in Route 101. The first one is a variation of the normal case command that is used with switch statements. Normally, you can only goto a line rather than call it. With this callcase, though, the switch statement lets you call a script and then return to the originating script, all in the condensed form of a switch statement. The other two allow you to use the scrolling list stuff and the GetStarterName stuff.

    In data/maps/Route101/scripts.inc:
    Spoiler:

    Now here's where stuff begins to happen. I added in the initial list that shows all the letters in the alphabet for the starter choice list (except X, since there are no non-legendary, first-evolution Pokemon that have a name that starts with X), and then added all of the individual letter lists at the end. You choose the first letter of the name of the Pokemon you want, and then a second list will appear where you can look for and pick your Pokemon. There are textboxes that appear and let you know what to do, as well as tell you that after choosing a letter, you can press B to go back to the letter list. When you choose a Pokemon, it'll ask for confirmation, show a picture of the Pokemon, and play the Pokemon's cry.

    In data/maps/Route103/scripts.inc:
    Spoiler:

    Now is the time for the explanation: why are there so many teams for your rival? Because your rival must be prepared for any Pokemon you choose. And there are a lot of options. The stuff I've added in here checks the type of your starter (based off of that one part from starter_choose.c), and then randomly chooses a type that would be super-effective against your starter's type. This allows for not only adaptability with your starter choice, but also a bit of uniqueness with each playthrough. If you choose a Fire type, your rival may have a Water, Rock, or Ground type. If you choose a Dragon type, your rival might have an Ice, Fairy, or Dragon type, and so on.


    The rest of these are all basically the same. They just check to see which team your rival has based off of the Route 103 stuff, and then pits you against the proper team.


    In data/maps/RustboroCity/scripts.inc:
    Spoiler:


    In data/maps/Route110/scripts.inc:
    Spoiler:


    In data/maps/Route119/scripts.inc:
    Spoiler:


    In data/maps/LilycoveCity/scripts.inc:
    Spoiler:

    Hopefully I covered everything. As you can see, there's quite a bit to account for. If you get some error when trying to use this, post it in here, and hopefully I can help you out. I hope you guys can use this code and enjoy having any non-legendary, first-evolution Pokemon as a starter!
     
    Last edited:
    Back
    Top