Restore the GS Ball Celebi Event - pret/pokecrystal GitHub Wiki

The Japanese Crystal GS Ball event required the player to connect to the Pokémon Mobile System GB, and receive the ball from an attendant at the PokéCom Center. This did not happen for the English release, however.

The GS Ball event was translated into English by the localisation team, and moved the event to Goldenrod's Pokémon Center, but then... didn't enable it whatsoever, the code still calling and checking the Mobile event. It was enabled years later in the 3DS Virtual Console re-release, replacing said mobile check with a simple Elite Four check.

This tutorial will teach you how to replace the mobile check, and just check for beating the Elite Four for the first time. The event will continue as normal, identical in functionality to how it worked in the 3DS VC re-release.

Contents

  1. Locate the event check
  2. Edit the event check
  3. Other examples

1. Locate the event check

The event is located in the Goldenrod Pokémon Center's first floor, so open up maps/GoldenrodPokecenter1F.asm:

GoldenrodPokecenter1F_GSBallSceneLeft:
	setval BATTLETOWERACTION_CHECKMOBILEEVENT
	special BattleTowerAction
	ifequal MOBILE_EVENT_OBJECT_GS_BALL, .gsball
        end

...

GoldenrodPokecenter1F_GSBallSceneRight:
	setval BATTLETOWERACTION_CHECKMOBILEEVENT
	special BattleTowerAction
	ifequal MOBILE_EVENT_OBJECT_GS_BALL, .gsball
        end

These two scripts in the block are the default mobile GS Ball event checks. Depending on which side of the floor/exit mat you are on, you will be approached from the left, or right side by a Cable Club attendant, jumping in the script to .gsball. .gsball runs the rest of the event (giving the player the ball etc), which we do not need to touch in this tutorial. But without something the English game can actually check against, it just checks for the mobile event (which there is none, so nothing will happen!).

2. Edit the event check

We will be replacing the mobile check with a simple checkevent command, checking whether the player has defeated the Elite Four at least once. This is basic, but matches the 3DS VC re-release. Make sure to edit both the Left and the Right scripts, otherwise you'll only have one side with the intended functionality.

GoldenrodPokecenter1F_GSBallSceneLeft:
-	setval BATTLETOWERACTION_CHECKMOBILEEVENT
-	special BattleTowerAction
-	ifequal MOBILE_EVENT_OBJECT_GS_BALL, .gsball
+	checkevent EVENT_BEAT_ELITE_FOUR
+	iftrue .gsball
	end

...

GoldenrodPokecenter1F_GSBallSceneRight:
-	setval BATTLETOWERACTION_CHECKMOBILEEVENT
-	special BattleTowerAction
-	ifequal MOBILE_EVENT_OBJECT_GS_BALL, .gsball
+	checkevent EVENT_BEAT_ELITE_FOUR
+	iftrue .gsball
	end

And that's it. The GS Ball event has been successfully restored to its proper functionality, and you can now go onwards to Kurt (and Celebi!) with the GS Ball in tow.

Screenshot

3. Other examples

Now you know how the check works, it is possible to change the check into something else entirely. Another good example is turning it into a badge count check, if you'd like to let the player access the GS ball earlier, or later.

GoldenrodPokecenter1F_GSBallSceneLeft:
-	checkevent EVENT_BEAT_ELITE_FOUR
-	iftrue .gsball
+	checkcode VAR_BADGES
+	if_equal 16, .gsball
end

VAR_BADGES looks at the players current amount of obtained badges, and if_equal checks if it matches the value listed here, which for this example is 16. If VAR_BADGES is not equal to or greater than the value set, it will not jump to .gsball.

Another example you could use is having it check for a current Pokémon in the party, such as the story-related Suicune.

GoldenrodPokecenter1F_GSBallSceneLeft:
-	checkevent EVENT_BEAT_ELITE_FOUR
+	setval SUICUNE
+	special FindPartyMonThatSpecies
	iftrue .gsball

setval sets the value to a certain value, for this example, is SUICUNE. FindPartyMonThatSpecies is a special that will analyse the player's current party, and look for the Pokémon value set, which is SUICUNE. If the player has Suicune in the party, the .gsball event will now run.

As you can see, there are many ways you could implement this check, to add additional gameplay or roadblocks in the way of obtaining the GS Ball. Use your creativity, or look at other scripts within the game and you might find other interesting ways to achieve the same outcome!

Understanding and editing the .gsball event is outside of the scope of this tutorial and a bit more complex, but if you know enough about the scripting system, replacing the sprites used with others from a different map set, and moving .gsball somewhere else is entirely possible.