To remove the normal player when entering the room, I would first destroy the player object since it's persistent. And also be sure there's no player start object in that room, obviously. So,
example warp object or something:
if place_meeting(x, y, objPlayer) {
with objPlayer instance_destroy()
room_goto(rPokemonHome)
}
I guess another thing is how to deal with saving and loading with an alternate player. In my save and load scripts, I added a check for the effect (the roomIsPokemon script above). If it returns false, then proceed as normal. If it returns true, then save and load the alternate player's position. For example:
in scrSaveGame:
if roomIsPokemon(room) {
global.savePlayerX = objPokemonPlayer.x
global.savePlayerY = objPokemonPlayer.y
}
else {
// normal kid
global.savePlayerX = objPlayer.x
global.savePlayerY = objPlayer.y
}
in scrLoadGame:
if roomIsPokemon(global.saveRoom) {
instance_create(global.savePlayerX, global.savePlayerY, objPokemonPlayer)
}
else {
// normal kid
instance_create(global.savePlayerX,global.savePlayerY,objPlayer)
}
And you can imagine having multiple else-ifs if you have multiple alternate players, like run the marathon does. Hope that helps.