Registrarse

[pokeemerald] Encuentro salvaje dependiendo de una flag

Kaktus

Miembro insignia
Miembro insignia


ENCUENTRO SALVAJE DEPENDIENDO DE UNA FLAG




Con este método evitaremos los encuentros salvajes, aún así, encontraremos Pokémon si pescamos, y los encuentros por script seguirán funcionando, viene a ser como un repelente permanente, que podemos controlar con una flag.

Para crear el sistema sólo tenemos que editar "src/field_control_avatar.c", donde encontraremos esta función:

Código:
static bool8 CheckStandardWildEncounter(u16 metatileBehavior)
{
    if (sWildEncounterImmunitySteps < 4)
    {
        sWildEncounterImmunitySteps++;
        sPreviousPlayerMetatileBehavior = metatileBehavior;
        return FALSE;
    }

    if (StandardWildEncounter(metatileBehavior, sPreviousPlayerMetatileBehavior) == TRUE)
    {
        sWildEncounterImmunitySteps = 0;
        sPreviousPlayerMetatileBehavior = metatileBehavior;
        return TRUE;
    }

    sPreviousPlayerMetatileBehavior = metatileBehavior;
    return FALSE;
}
Que como su nombre describe, comprueba si cabe la posibilidad de que haya un encuentro salvaje, así que añadiremos un condicional que compruebe si una flag está activada para poder ejecutar el código. Podemos encontrar la lista de flags en "include/constants/flags.h".

Para comprobar si una flag está activada en un archivo .c, usaremos

Código:
FlagGet(FLAG)
Así que sabiendo esto, añadiremos un condicional para saber si la flag está activa. Yo usaré una flag que no es empleada en el juego, vosotros podéis usar la que queráis (siempre y cuando sepáis que estás haciendo)

Código:
static bool8 CheckStandardWildEncounter(u16 metatileBehavior)
{
	if (FlagGet(FLAG_UNUSED_0x020) != 0){
	
		if (sWildEncounterImmunitySteps < 4)
		{
			sWildEncounterImmunitySteps++;
			sPreviousPlayerMetatileBehavior = metatileBehavior;
			return FALSE;
		}

		if (StandardWildEncounter(metatileBehavior, sPreviousPlayerMetatileBehavior) == TRUE)
		{
			sWildEncounterImmunitySteps = 0;
			sPreviousPlayerMetatileBehavior = metatileBehavior;
			return TRUE;
		}

		sPreviousPlayerMetatileBehavior = metatileBehavior;
		return FALSE;
	}
}
Como podéis ver, he encerrado absolutamente todo el código en el condicional, y vosotros ahora mismo podrías estar pensando que porqué no encierro sólo el segundo condicional, que es el que realmente se ejecutará cuando haya un encuentro salvaje. Bueno, es simplemente para evitar que se ejecute código innecesario. Y ya tenemos el archivo .c listo. Fácil, ¿no?

Ahora, simplemente vamos a crear el script que compruebe en qué estado está la flag, y en función de ello, la active o la desactive.

Código:
Route117_ComprobarFlag::
	checkflag FLAG_UNUSED_0x020
	vgoto_if 1, Route117_FlagActivada
	setflag FLAG_UNUSED_0x020
	msgbox Route117_Text_FlagActivada, MSGBOX_NPC
	end
	
Route117_FlagActivada::
	clearflag FLAG_UNUSED_0x020
	msgbox Route117_Text_FlagDesactivada, MSGBOX_NPC
	end

Route117_Text_FlagActivada: 
	.string "Encuentros salvajes\n"
	.string "activados.$"
	
Route117_Text_FlagDesactivada: 
	.string "Encuentros salvajes\n"
	.string "desactivados.$"
Y ya tenemos todo listo. Guardamos, asignamos la etiqueta del script a cualquier NPC, compilamos, y lo probamos. :)

 
Arriba