Registrarse

[RPG - Scripting] Elección diferente de los iniciales

dudaro

Usuario de oro
Tengo una idea para variar la elección de los iniciales y que no sea la típica de escoger directamente el que queremos a través de una pokeball. Mi idea es que el profesor nos haga unas preguntas como por ejemplo:
-¿Te sientes atraído por la naturaleza?
-¿Te gusta el calor del verano?
-¿Te relaja el sonido del agua?

Y que por medio de un script se valore la pregunta con una respuesta afirmativa (o que se escoja una al alzar en caso de empate) y a partir de ahí se presenten en el mapa todos los starterts de todas las regiones que tengan ese tipo. Es decir, si nos gusta el sonido del agua, se deberían de presentar todos los overworlds de todos los startes de tipo agua de todas las regiones y ahí nosotros ya escogemos el que prefiramos para añadir a nuestro equipo. Si elegimos el tipo planta, se tienen que presentar todos los startes de tipo plantas de todas las generaciones, y con el tipo fuego se debería hacer lo mismo.

El problema es que no sé cómo hacerlo. Hice este código, pero no me funciona

# Inicializar afinidades
plant_affinity = 0
fire_affinity = 0
water_affinity = 0

# Pregunta 1
pbMessage(_INTL("¿Qué tipo de entorno prefieres?"))
cmd = pbMessage(_INTL("Escoge una opción:"), [
_INTL("Un bosque lleno de árboles y flores."),
_INTL("Una cálida playa con sol brillante."),
_INTL("Un lago tranquilo rodeado de agua.")
])
case cmd
when 0
plant_affinity += 1 # Bosque -> Planta
pbMessage(_INTL("Sientes una conexión con la naturaleza."))
when 1
fire_affinity += 1 # Playa -> Fuego
pbMessage(_INTL("Sientes el calor del sol."))
when 2
water_affinity += 1 # Lago -> Agua
pbMessage(_INTL("Sientes la calma del agua."))
end

# Pregunta 2
pbMessage(_INTL("¿Qué elemento te atrae más?"))
cmd = pbMessage(_INTL("Escoge una opción:"), [
_INTL("La vida que surge de la tierra."),
_INTL("El fuego que arde con intensidad."),
_INTL("El agua que fluye serenamente.")
])
case cmd
when 0
plant_affinity += 1 # Tierra -> Planta
pbMessage(_INTL("Te sientes en armonía con la tierra."))
when 1
fire_affinity += 1 # Fuego -> Fuego
pbMessage(_INTL("El poder del fuego te envuelve."))
when 2
water_affinity += 1 # Agua -> Agua
pbMessage(_INTL("El flujo del agua te trae paz."))
end

# Pregunta 3
pbMessage(_INTL("¿Qué animal te parece más interesante?"))
cmd = pbMessage(_INTL("Escoge una opción:"), [
_INTL("Una criatura que vive entre las plantas."),
_INTL("Un ser que corre veloz entre las llamas."),
_INTL("Un pez que nada ágilmente en el agua.")
])
case cmd
when 0
plant_affinity += 1 # Criatura planta
pbMessage(_INTL("Te atraen las criaturas de la naturaleza."))
when 1
fire_affinity += 1 # Criatura de fuego
pbMessage(_INTL("Sientes la energía de la velocidad."))
when 2
water_affinity += 1 # Criatura de agua
pbMessage(_INTL("La serenidad del agua te calma."))
end

# Evaluar afinidad predominante
if plant_affinity > fire_affinity && plant_affinity > water_affinity
predominant_type = :pLANTA
pbMessage(_INTL("Sientes una fuerte conexión con los Pokémon tipo Planta."))
elsif fire_affinity > plant_affinity && fire_affinity > water_affinity
predominant_type = :FUEGO
pbMessage(_INTL("Sientes una fuerte conexión con los Pokémon tipo Fuego."))
elsif water_affinity > plant_affinity && water_affinity > fire_affinity
predominant_type = :AGUA
pbMessage(_INTL("Sientes una fuerte conexión con los Pokémon tipo Agua."))
else
# Si hay empate entre dos afinidades, se elige una al azar
types = []
types.push:)PLANTA) if plant_affinity == [fire_affinity, water_affinity].max
types.push:)FUEGO) if fire_affinity == [plant_affinity, water_affinity].max
types.push:)AGUA) if water_affinity == [plant_affinity, fire_affinity].max
predominant_type = types.sample
pbMessage(_INTL("Te sientes en sintonía con múltiples elementos..."))
end

# Definir las listas de Pokémon iniciales según el tipo
starter_planta = [:BULBASAUR, :CHIKORITA, :TREECKO, :TURTWIG, :SNIVY, :CHESPIN, :ROWLET, :GROOKEY]
starter_fuego = [:CHARMANDER, :CYNDAQUIL, :TORCHIC, :CHIMCHAR, :TEPIG, :FENNEKIN, :LITTEN, :SCORBUNNY]
starter_agua = [:SQUIRTLE, :TOTODILE, :MUDKIP, :pIPLUP, :OSHAWOTT, :FROAKIE, :pOPPLIO, :SOBBLE]

# Efecto de aparición por afinidad
case predominant_type
when :pLANTA
pbMessage(_INTL("La tierra a tu alrededor comienza a vibrar..."))
pbSEPlay("AnimEarth")
pbWait(20)
pbMessage(_INTL("¡Los Pokémon tipo Planta están emergiendo!"))
starters_to_spawn = starter_planta
appearance_effect = "AnimEarth"

when :FUEGO
pbMessage(_INTL("El aire se calienta, y llamas surgen desde el suelo..."))
pbSEPlay("AnimFire")
pbWait(20)
pbMessage(_INTL("¡Los Pokémon tipo Fuego aparecen entre las llamas!"))
starters_to_spawn = starter_fuego
appearance_effect = "AnimFire"

when :AGUA
pbMessage(_INTL("El aire se vuelve húmedo y una suave bruma aparece..."))
pbSEPlay("AnimRain")
pbWait(20)
pbMessage(_INTL("¡Los Pokémon tipo Agua emergen del agua!"))
starters_to_spawn = starter_agua
appearance_effect = "AnimRain"
end

# Mostrar Pokémon apareciendo de forma impresionante
starter_positions = [[5, 7], [6, 10], [8, 9], [10, 5], [11, 8], [12, 6], [13, 9], [14, 7]]
starters_to_spawn.each_with_index do |pokemon, index|
pbSpawnPokemonWithEffect(pokemon, starter_positions[index], appearance_effect)
end

# Función que maneja la aparición de los Pokémon con efectos
def pbSpawnPokemonWithEffect(pokemon, position, effect)
pbSEPlay("AnimAppear") # Sonido de aparición genérico
case effect
when "AnimEarth"
pbCreateAnimation("AnimEarth", position) # Usa la animación de tierra
when "AnimFire"
pbCreateAnimation("AnimFire", position) # Usa la animación de fuego
when "AnimRain"
pbCreateAnimation("AnimRain", position) # Usa la animación de agua
end
pbShowPokemon(pokemon, position) # Mostrar el Pokémon en esa posición
pbMessage(_INTL("Un {1} ha aparecido.", GameData::Species.get(pokemon).name))
end
 

Manurocker95

Doctorando en Ingeniería Biomédica & Game Dev
Miembro insignia
Es una elección más similar a Mundo Misterioso pero yo añadiría un “volver a empezar” o “repetir” si no te gusta la elección para no tener que volver a pasar por cerrar > abrir > nueva partida cada vez que te saliera algo que no tener gustase
 

dudaro

Usuario de oro
Me gusta la idea de "volver a empezar" y la añadiré en el código. ¿Sabrías por qué está fallándome el código? Me funciona bien con las preguntas y con el resultado final de ellas, pero en el momento en el que tienen que mostrarse los pokemon en el mapa, da error y se cierra el juego.
 

Pableroski

Novato - Rpg en desarrollo
Primero, ¿es necesario hacerlo por script? Hay partes que quizás sean más sencillas desde la página de eventos.

Por experiencia, te digo que cuando actualizas un gráfico en pantalla durante un evento, conviene poner un $game_map.refresh para que se actualicen los gráficos. Más de una vez se me ha quedado un gráfico congelado en mitad de la pantalla.

Ahora mismo estoy acabando un script que saca pkm al mapa precisamente
Por script podrías hacerlo de esta manera: crea en ese mapa 8 eventos, uno para cada pkm.
Si quieres mostrarlos en el mapa entiendo que tienes los overworld de los pkm.
Nada más que tendrías que crear un script que mueva esos eventos a la posición que quieras y luego usar el pbMoveRoute y el cambio de gráficos. Cambiar el gráfico de cada evento por el pkm que quieras. Y añadirle la animación. No olvides el $game_map.refresh
 

Pableroski

Novato - Rpg en desarrollo
Primero, ¿es necesario hacerlo por script? Hay partes que quizás sean más sencillas desde la página de eventos.

Por experiencia, te digo que cuando actualizas un gráfico en pantalla durante un evento, conviene poner un $game_map.refresh para que se actualicen los gráficos. Más de una vez se me ha quedado un gráfico congelado en mitad de la pantalla.

Ahora mismo estoy acabando un script que saca pkm al mapa precisamente
Por script podrías hacerlo de esta manera: crea en ese mapa 8 eventos, uno para cada pkm.
Si quieres mostrarlos en el mapa entiendo que tienes los overworld de los pkm.
Nada más que tendrías que crear un script que mueva esos eventos a la posición que quieras y luego usar el pbMoveRoute y el cambio de gráficos. Cambiar el gráfico de cada evento por el pkm que quieras. Y añadirle la animación. No olvides el $game_map.refresh
Código:
=begin

CÓDIGO
especie=
pbMoveRoute($game_map.events[evento],[PBMoveRoute::Graphic,especie_s+'.png',359,direccion,3])
pbMoveRoute($game_map.events[evento],[PBMoveRoute::StepAnimeOn])

especie será el número del gráfico según la especie que quieras poner (si tienes el overworld de chikorita guardado como 152.png, aquí habría que poner 152, porque luego en el código viene especie_s (pasa el número a texto) + '.png')
[evento] es el id del evento que quieres mover
359 no lo toques, es el tono y ese es el máximo.
direccion=tendrás que darle un valor: 2=abajo;4=izquierda;6=derecha;8=arriba
3 tampoco lo toques. Representa el patrón y va de 0-3. No sé qué es sinceramente.

Todo esto lo puedes encontrar en la wiki (https://pokemonessentials.fandom.com/es/wiki/Control_de_eventos_con_scripts) en el apartado pbMoveRoute(evento,comandos)

EJEMPLO:

especie=152
direccion=4
evento=15
pbMoveRoute($game_map.events[evento],[PBMoveRoute::Graphic,especie_s+'.png',359,direccion,3])
pbMoveRoute($game_map.events[evento],[PBMoveRoute::StepAnimeOn])
$game_map.refresh

En este código, el evento 15 de ese mapa tomará el gráfico de chikorita (152.png) mirando hacia la izquierda. El gráfico se estará moviendo en parado para no hacer la estatua.

=end
 
Arriba