Glitch City Laboratories Forums

Lab δ: Tech => Emulation & ROM Hacking => Topic started by: Th3B0r3d on November 08, 2017, 12:45:24 pm

Title: GBZ80 - Teleportation
Post by: Th3B0r3d on November 08, 2017, 12:45:24 pm
I'm trying to make item in Pokémon red  that after using warps to predefined location. How to do such thing in assembly? (I know how to edit item's usage but I still need code that will warp you)
Title: Re: GBZ80 - Teleportation
Post by: ISSOtm on November 09, 2017, 05:39:28 am
What are you trying to do exactly, editing the warps in the current map ? All warps, or just one ?
Title: Re: GBZ80 - Teleportation
Post by: Th3B0r3d on November 09, 2017, 12:53:17 pm
I'm trying to make item that after usage warps you to some place.
Title: Re: GBZ80 - Teleportation
Post by: ISSOtm on November 09, 2017, 06:14:07 pm
You mean, that warps you to a given map once you use the item (but after closing the menu), right ?
Title: Re: GBZ80 - Teleportation
Post by: Th3B0r3d on November 10, 2017, 09:03:50 am
Yes
Title: Re: GBZ80 - Teleportation
Post by: Evie the Bird Mother 🌸 ☽ on November 10, 2017, 10:38:54 am
I have an answer that's incomplete as I don't actually know without further research how to properly execute this either, sorry.

However you can try:

ld a,(map ID (https://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(Generation_I)))
ld (d35e),a
ld h, d3
ld l, 6e
ld a,41
ld (hli),a
ld a,12 [1241 is LoadMapData in pokered disassembly]
ld (hli),a
ret

After closing the menu, this will warp you anywhere but Glitch Cities may appear depending on exactly where you warped from. Refreshing the map is also possible by placing X Attack x18 into item 41 (level-script pointer, D36E-D36F) and the map's ID into item 33 (D35E).

For more complex purposes, as Glitch Cities can appear depending on where you warp from, you may have to specify the data for these addresses in some way or get the game to look them up:

D35F-D360 = Top-left block pointer
D361 - 1 byte integer = Current Player Y-Position
D362 - 1 byte integer = Current Player X-Position
D363 = Current Player Y-Position (Current Block)
D364 = Current Player X-Position (Current Block)
D3B1 = Entrance position ID (affects D35F-D360)
D3B5 = Entrance position ID (affects D35F-D360)

(Note all of these addresses (for Red/Blue) are -1 in Yellow)

If you just want to warp and don't mind having to walk through the exit of a door, you can modify D365. This address is the location specific exits like those from Pokémon Centers and many houses take you. But the entrance position ID stays the same as the one from the original map, so you've got to find one that works, use cheat code 010xxB5D3 01xxB1D3 to modify the entrance position ID, or alternatively do this:

Change D3B1 to the entrance position ID (e.g. 01).
Change D3B2 to the desired map (or FF for the map stored in D365).

Then you need to walk through the first warp of the building. (In a Pokémon Center this should be the left-side of the exit mat).

Also for what it's worth D3AF-D3B0 are the y and x-coordinates of the warp, but you'll need a proper map tile for this to work.

Hope this helps and I hope somebody with better coding knowledge than me is able to assist. :)