Sujet n°9418
Posté par Ku'rei le 18 Mar - 22:28 (2011)
Titre : Créer des Pokémons voyageurs visibles sur la map !



Bonjour tout le monde ! Certains se souviendrons de mon script "Pokemons_voyageurs" quand j'était encore MadRob, ce script horrible, rempli de bug et réaliser sans aucun savoir-faire... Enfin, la chose est là, j'ai repris mon projet à zéro, maintenant tout est fonctionnel. Grâce à ce script, il est maintenant possible de créer facilement des pokémons comme ceux du légendaire trio de Or et Argent ou encore le duo Latios et Latias des cersions Rubis, Saphir et Emeraude, et rendre nomade tout les autres (une chasse au Racaillou doré dans une caverne, ça tente quelqu'un ?).

Le Topic est divisé en deux partie : l'Installation du script, qui est compliquée et le tutoriel expliquant comment créer le pokémon voyageur.

NB:Ce script a été réaliser sous PSP4G+, il est possible que certaine(s) ligne(s) ne correspondent pas si vous utilisez PSP0.7, il est aussi possible que le script ne fonctionne pas sous PSPDS (étant donné que je n'ai tester ni l'un ni l'autre, juste PSP4G+)



L'installation est malheureusement compliquée pour un débutant, je vais essayer d'expliquer comment installer mon script de façon claire et simple car je n'ai pas fais ce script pour que seule une poignée de maker puisse l'utiliser. Pour commencer, ouvrez l'éditeur de script (F9) puis faites les modifications précisées ci-après.


1.1-Les modifications des scripts existants


1.1.1-Pokemon_Battle_Core 1

Dans le script Pokemon_Battle_Core 1, j'ai modifié la fonction end_battle_flee_enemy car elle provoquait des bug quant à la fuite du pokémon voyageur. Dans cette fonction située aux environs de la ligne 2431, il faut remplacer ...
Code:
$battle_var.result_flee_enemy = expulsion ? false : true
$battle_var.result_flee = expulsion

... par ...
Code:
$battle_var.result_flee = expulsion ? false : true
$battle_var.result_flee_enemy = expulsion

(Les scripteurs les plus à l'aise du forum auraient sans doutes quelques remarques à faire sur cette modification)


1.1.2-Pokemon_Battle_Core 2

Dans ce script la modification tient de l'ajout, c'est ce qui fait fuire le pokémon voyageur (s'il est fuyard). Au début de la fonction attack_acttion, qui est aux alentours de la ligne 167, ajoutez le code qui suit (mettez le juste après def attack_action(user, user_skill, enemy)) :
Code:
if $combat_contre_pokemon_fuyard and user == @enemy
 if flee_able(@enemy, @actor)
   $combat_contre_pokemon_fuyard = false
    end_battle_flee_enemy
    return
  end
end

(Il y a deux conditions car flee_able affiche quelque chose si le pokémon ne peut fuir, y compris quand c'est le tour du pokémon du joueur)

1.1.3-Pokemon_Battle_Wild
Dans ce script, il y a deux modifications à apporter. La première consiste à supprimer la ligne suivante du script (ligne 61 environ), dans l'initialize :
Code:
@enemy.hp = @enemy.hp_max

NB : Cette ligne n’existe que sur PSP4G+, je ne sais pas pourquoi elle a été ajoutée, mais elle régénère les PV du pokémon en début de combat et sape la conservation du paramètre PV du pokémon voyageur.

La deuxième modification sert pour le paramétrage de la musique de combat spéciale au pokémon voyageur, remplacer cette portion de code de la fonction pre_battle_transition (environ ligne 127) :
Code:
$game_system.bgm_play($game_system.battle_bgm)
Audio.me_play("Audio/ME/battle_jingle.mid")

Est à remplacer par :
Code:
if $musique_combat_changee != nil
  Audio.bgm_play("Audio/BGM/" + $musique_combat_changee,100,100)
  $musique_combat_changee = nil
else 
  $game_system.bgm_play($game_system.battle_bgm)
  Audio.me_play("Audio/ME/battle_jingle.mid")
end

Voilà qui permet de changer ponctuellement la musique d'un combat ; le nom est stocké dans la variable $musique_combat_changee et doit comporter ".mid" ou autre.

C'est fini pour les modifications sur les script de combat ; il n'en reste plus qu'une sur un autre script.


1.1.4-Pokemon_Party

Dans le script Pokemon_Party, dans la fonction increase_steps aux alentours de la ligne 317, il faut ajouter après def increase_steps :
Code:
#Rencontre aléatoire pokémons voyageurs
Interpreter.new.load_file_pok_voy
rencontres = []
if $pokemons_voyageurs != nil
  $pokemons_voyageurs.each_value {|pokemon|
  if pokemon.rencontre?
     rencontres.push(pokemon)
     end
  }
  if rencontres != []
     rencontres[rand(rencontres.size)].rencontre_pok_voy
  end
end

Cela sert à détecter les mouvements du héros et à tester si il rencontre un pokémon voyageur. Je tiens à remercier Sphinx et Yuri pour m'avoir montrer cette fonction.

C'est la fin des modifications, le plus laborieux est terminé. Il ne reste plus qu'a installer le script principal.



1.2-Le script principal

Créez un nouveau script au-dessus du script "Main" (sinon il ne sera pas lu par le logiciel), nommez-le Pokemon_voyageurs puis copiez-y le code suivant :
Spoiler
Code:

#-------------------------------------------------------------------------------
# --- Script: Pokemon_voyageurs - ©Kureiji -
# --- Début :09/03/2011 --- Fin : 17/03/2011 -
#-------------------------------------------------------------------------------
module POKEMON_S
  #-----------------------------------------------------------------------------
  #  Paramètres concernant la visibilité du pokémon voyageur sur la map
  #-----------------------------------------------------------------------------
 
  POK_VOY_VISIBLE = false #false si vous ne voulez pas que les pokémons voyageurs soient visibles sur la map où ils sont
  ID_MAP_EVENT_POK_VOY = 46 #a remplacer par l'ID de la map ou se trouve l'évent décrit dans le tuto
  ID_EVENT_POK_VOY = 9 # à remplacer par l'id de l'event dans la map où il se trouve
 
  #-----------------------------------------------------------------------------
  #  Liste de map appartenant à la même catégorie
  #-----------------------------------------------------------------------------
 
  Maps_plaines = [46,51,50]
 
  #-----------------------------------------------------------------------------
  #  POKEMONS VOYAGEURS : "INDEX" : index du répertoire où sont stockées les informations sur le pokémon
  #-----------------------------------------------------------------------------
  LATIOS = {"INDEX" => "LATIOS","ID"=>"LATIOS","LVL"=>45,"SHINY"=>false, "SLOT"=>2,
            "MAPS"=>Maps_plaines,"TERRAINS"=>[1,7], "RARETE"=>30, "FUITE"=>true}
 
  LATIAS_SHINY = {"INDEX" => "LATIAS_SHINY", "ID"=>"LATIAS","LVL"=>45,"SHINY"=>true,
                  "SLOT"=>1,"MAPS"=>Maps_plaines,"TERRAINS"=>[1,7], "RARETE"=>10, "FUITE"=>true}
 
  RACAILLOU_SHINY = {"INDEX" => "RACAILLOU_SHINY","ID"=>"RACAILLOU","LVL"=>40,"SHINY"=>true,
                    "SLOT"=>3,"MAPS"=>Maps_plaines+[50],"TERRAINS"=>[1], "RARETE"=>80,
                    "FUITE"=>false}
 
  SUICUNE = {"INDEX"=>"SUICUNE", "ID"=>"SUICUNE","LVL"=>50,"SHINY"=>false,
              "SLOT"=>4,"MAPS"=>[50], "TERRAINS"=>[1], "RARETE"=>25, "FUITE"=>true,
              "MUSIQUE"=>"PkmnCrystal_Raikou,Entei,Suicune.mid"}
 

     
  class Pokemon_voyageur
   
    attr_accessor :index
    attr_accessor :id
    attr_accessor :level 
    attr_accessor :shiny
    attr_accessor :slot
    attr_accessor :maps_f
    attr_accessor :terrains_f
    attr_accessor :fuite
    attr_accessor :musique
    attr_accessor :map_actuelle
    attr_accessor :terrain_actuel
   
  #----------------------------------------------------------------------------
  #Création du pokémon voyageur (hash = {"INDEX","ID","LVL","SHINY","SLOT","MAPS" => [ARRAY],"TERRAINS" => [ARRAY] ,"RARETE",FUITE","VISIBLE","MAP DEPART"})
  #Caractéristiques du pokémon
  #-----------------------------------------------------------------------------
    def initialize(hash)
      @index = hash["INDEX"]
      @id = hash["ID"]
      @level = hash["LVL"]
      @shiny = hash["SHINY"]
      @slot = hash["SLOT"]
      @maps_f = hash["MAPS"].flatten  #Maps_fréquentées
      @terrains_f = hash["TERRAINS"]  #Terrains_fréquentés
      @rarete = hash["RARETE"]
      @fuite = hash["FUITE"]
      @musique = hash["MUSIQUE"]
      @visible = hash["VISIBLE"]
     
   
      #Initialisation de la map d'apparition initiale
      if hash["MAP DEPART"] != nil
        @map_actuelle = hash["MAP DEPART"]
      else
        tab = hash["MAPS"]
        @map_actuelle = tab[rand(tab.size)]
      end #if
   
      #Ajout du pokémon à la liste des pokémons voyageurs, création de la variables si premier pokemon voyageur
      if $pokemons_voyageurs == nil
        $pokemons_voyageurs = {}
      end #if   
      $pokemons_voyageurs[@index] = self
   
      #Création du pokémon voyageur
      @interpreter = Interpreter.new
      @interpreter.enregistrer_pokemon(@slot,@id,@level,@shiny)
      save_file

      #NOTE : l'enregistrement du pokémon voyageur dans un slot se fait dans l'Interpreter
      #(à l'appel de la fonction "creer_pokemon_voyageur"
   
    end #initialize
     
  #-----------------------------------------------------------------------------
  #  Enregistrement et récupération de données sur les pokémons voyageurs
  #-----------------------------------------------------------------------------
 
    def save_file
      slot = $game_variables[8] #Save slot
      save = "Data/Pokemon_voyageurs_slot_"+slot.to_s+".rxdata"
      file = File.open(save,"w")
      Marshal.dump($pokemons_voyageurs,file)
      file.close
    end
       
 
  #-----------------------------------------------------------------------------
  #  Gestion des rencontres et des combats avec les pokémons voyageurs
  #-----------------------------------------------------------------------------
   
    def rencontre?
      if self.map_act_ok? and self.terrain_act_ok? and self.rarete_loc_ok? and not(POK_VOY_VISIBLE)
        return true
      else
        return false
      end
    end #rencontre?
   
    def rencontre_pok_voy
      $musique_combat_changee = @musique if @musique != nil
      $combat_contre_pokemon_fuyard = true if @fuite == true
      @interpreter.demarrer_combat_existant(@interpreter.appel_pokemon(@slot))
      changement_map
      save_file
    end #rencontre_pok_voy
 
  #change @map_actuelle et @terrain_actuel
 
  def changement_map
    change_map
  end #changement_map
 
  def change_map
    if @maps_f.size > 1 #une seule map => on ne change pas de map
      maps = @maps_f-[@map_actuelle]
      @map_actuelle = maps[rand(maps.size)]
    end
  end #change_map
 
 
  #-----------------------------------------------------------------------------
  #  Fonctions applicable à l'objet de classe Pokemon_voyageur
  #-----------------------------------------------------------------------------
 
    def map_act_ok?
      if $game_map.map_id == @map_actuelle
        return true
      end #if
    end #map_act_ok?
 
    def terrain_act_ok?
      if @terrains_f.include?($game_player.terrain_tag)
        return true
      end #if
    end #terrain_act_ok?
 
    def rarete_loc_ok?
      if rand(101) <= @rarete #101 car rand(101) appartient à [0;100], comme @rarete
        return true
      end #if
    end #rarete_loc_ok?
 
    def slot
      return @slot
    end
   
    def map_actuelle
      if @map_actuelle ==nil
        return nil
      else
        return @map_actuelle
      end
    end
   
    #--------------------------------------------------------------------------
    #   DETECTION SI LE POKEMON EST PLACABLE DANS LA MAP ET PLACEMENT SI TRUE
    #--------------------------------------------------------------------------
   
    def detect_event_poke_voy
      if map_act_ok? and VISIBILITE == true and @visible == true
        create_event_pokemon_voyageur
      end
    end
   
   
    #--------------------------------------------------------------------------
    #   CREATION DE L'EVENT DU POKEMON VOYAGEUR SUR LA MAP
    #--------------------------------------------------------------------------
   
    # Structure principale
   
    def create_event_pokemon_voyageur
      p = @interpreter.appel_pokemon(@slot)
      if p.dead?
        return
      end
     
      map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
      events = map.events
      if events == nil
        return
      end
     
      for event in events.values
        if event.name == ("EVENT_POKEMON_VOYAGEUR_SLOT_" + @slot.to_s)
          return
        end
      end
      #Si l'event a déja été créer, on ne le recréer pas.

      @coo = recherche_coordonnees
      if @coo != nil
        pokemon = @interpreter.appel_pokemon(@slot)
        @chara = to_chara_filename(pokemon)
        if @chara != nil and pokemon != nil
          @create = Create_Event_Pokemon_Voyageur.new(@coo,@index,@chara)
        end
       
        return @create
      end
    end #create_event_pokemon_voyageur
   
   
    # to_chara_filename retourne le nom du fichier de la forme "CHARA_POKEMONS/034s_0.png", ce fichier doit
    # être dans le dossier Characters/CHARA_POKEMONS et du format png
   
    def to_chara_filename(pokemon)
      id = pokemon.id
      if id.between?(1,9)
        id = "00" + id.to_s
      elsif id.between?(10,99)
        id = "0" + id.to_s
      elsif id.between?(100,999)
        id = id.to_s
      end
     
      if pokemon.shiny
        shiny = "s"
      else
        shiny =""
      end
     
      #mise sous forme "CHARA_POKEMONS/019s_0.png"
      chara = "CHARA_POKEMONS/" + id.to_s + shiny.to_s + "_0.png"
      return chara
    end #to_chara_filename
       
   
    # Recherche de coordonnées valides :
    #     - Pas d'event
    #     - Tile Passable
    #     - Terrain correspondant
    #Organisation des recherche de terrain :
    #_____________________________________________________
    #|   _____________________________________________   |
    #|   |   _____________________________________   |   | Ca, c'est la map ...
    #|   |   |   ______________________________  |   |   |
    #|   |   |   |       ETC ...              |  |   |   |
    #|   |   | 3 |____________________________|  |   |   |
    #|   | 4 |___________________________________|   |   |
    #| 5 |___________________________________________|   |
    #_____________________________________________________
   
   
    def recherche_coordonnees
      for zone in 1..3
        coo = test_zone(zone)
        if coo != nil
          break
        end
      end
      return coo
    end #recherche de coordonnees
   
    # une zone est un rectangle dont les diagonales se coupent au centre de la map
    # height : hauteur de la map
    # width : largeur
    def test_zone(i)
      result = []
      width = $game_map.width
      height = $game_map.height
      if i < 3
        xf = width -1
        xf *= i*3 - 1
        xf /= i*3
        yf = height -1
        yf *= i*3 - 1
        yf /= i*3
      else
        xf = width
        yf = height
      end
     
      yd = (width - 1)/(i*3)
      yd = yd
     
      xd = (height - 1)/(i*3)
      xd = xd
     
      for y in yd..yf
        for x in xd..xf
          if good_coo?(x,y)
            result.push([x,y])
          end
          x += 1
        end
        y += 1
      end
     
      return (result[rand(result.size)])
    end #test_zone
   
    def good_coo?(x,y)
      if tile_passable?(x,y)
        if @terrains_f.include?($game_map.terrain_tag(x,y))
          if not(event_detected?(x,y))
            return true
          end
        end
      end
      return false
    end #good_coo?
   
    def tile_passable?(x,y)
      for a in 1..4
        dir = a*4
        if not($game_map.passable?(x,y,dir))
          return false
        end
      end
    end
   
   
    def event_detected?(x,y)
      for event in $game_map.events.values
        if event.x == x and event.y == y
          return true
        end
      end
      return false
    end # event_detected?     

  end #class Pokemon_voyageur
 
 
 
  # Class permettant de copier l'event du pokémon voyageur
  # Il doit être situé dans une map du jeu, celle d'id : ID_MAP_EVENT_POK_VOY
  # et doit avoir l'id : ID_EVENT_POK_VOY
  # cf. début du script
 
  class Create_Event_Pokemon_Voyageur < Pokemon_voyageur          #releve du copiage ... plus que de la création
   
    attr_accessor :index
   
    def initialize(coo, index, chara)
      @map = load_data(sprintf("Data/Map%03d.rxdata", ID_MAP_EVENT_POK_VOY))
      # Les évènements de la map
      @events = @map.events
      @event_id = ID_EVENT_POK_VOY
      @coo = coo
      @index = index
      @chara = chara
      if @events[@event_id] == nil
        return
      elsif coo != nil
        create
        return @create
      end
     
    end
   
    def create
      event = @events[@event_id]
      event.x = @coo[0]
      event.y = @coo[1]
      event.id = search_new_id
      event.name = "EVENT_POKEMON_VOYAGEUR_" + @index
      event.pages[0].graphic.character_name = @chara
      event.pages[0].move_type = 1
      event.pages[0].move_frequency = 5
      event.pages[0].trigger = 1
   
      @create = Game_Event.new($game_map.map_id,event)
      #Ajoute dans liste des évènements de la carte actuelle
      $game_map.events[event.id] = @create
      # Indique qu'on ajoute un Sprite
      $game_temp.add_event = true
      # ID de l'évènement pour le Sprite à ajouter
      $game_temp.id_add_event = event.id
      return @create
    end #create
   
    def search_new_id
      id = 1
      while $game_map.events.include?(id)
        id += 1
      end
      return id
    end   #search_new_id
   
  end #Create_Event_Pokemon_Voyageur
 

end #module POKEMON_S

#-------------------------------------------------------------------------------
# Interpreter
#-------------------------------------------------------------------------------

class Interpreter
 
  def creer_pokemon_voyageur(hash)
    Pokemon_voyageur.new(hash)
  end #creer_pokemon_voyageur
  alias lacher_pokemon_voyageur creer_pokemon_voyageur
 
  def creer_event_pok_voy(pokemon)
    pokemon.create_event_pokemon_voyageur
  end
 
 
  def pokemon_voyageur_event_fight
    xh = $game_player.x
    yh = $game_player.y
    coo_p = [[xh-1,yh],[xh,yh-1], [xh+1,yh], [xh,yh+1]]
    for coo in coo_p
      for index in $pokemons_voyageurs.keys
        for event in $game_map.events.values
          if event.name == ("EVENT_POKEMON_VOYAGEUR_" + index) and event.x == coo[0] and event.y == coo[1]
            pokemon = $pokemons_voyageurs[index]
            ok = true
            pokemon.rencontre_pok_voy
            break
          end
        end
        break if ok
      end
      break if ok
    end
  end
 
 
 
  def search_pokemon_voyageur(name)
    name.delete!("EVENT_POKEMON_VOYAGEUR_")
    return $pokemons_voyageurs[name]
  end
 
    def load_file_pok_voy
      if $pokemons_voyageurs == nil
        slot = $game_variables[8]
        save = "Data/Pokemon_voyageurs_slot_"+slot.to_s+".rxdata"
        if FileTest.exist?(save)
          file = File.open(save,"r")
          $pokemons_voyageurs = Marshal.load(file)
          file.close
        end
      end
    end

end #class Interpreter

Voilà qui est fini du point de vue script, je vais maintenant vous présenter son petit manuel d'utilisation, la partie la plus intéressante pour les non-scripteur : celle où l'on créer son propre pokémon voyageur !



Voici la partie du topic la plus intéressante pour ceux qui ne s'intéresse pas aux scripts, et pour ceux qui souhaitent utiliser ce script. 


2.1-Le paramétrage du pokémon voyageur


Tout d'abord, je vais dressé la liste des caractéristiques du pokémon voyageur :
-INDEX : L'index sert à classer le pokémon dans la variables $pokemons_voyageurs, le pokémon sera facilement retrouvable du moment que l'on connait son index,

-ID : l'id du pokémon, ou son nom entre guillemets (exemple : 212 sera un cizayox, "CIZAYOX" aussi),

-LVL : c'est le niveau du pokémon voyageur,

-SHINY : true si le pokémon est shiny, false si non,

-SLOT : c'est le slot de sauvegarde du pokémon ATTENTION ! c'est les mêmes slots que ceux utilisés pour la fonction enregistrer_pokemon !! Veillez à ne pas les mélanger, sinon ça bug,

-FUITE : true si le pokémon doit fuir quand on le rencontre, false ou rien si non,

-RARETE : Le poucentage de chance de rencontrer le pokémon voyageur à chaque pas que fais le héros si ils sont dans la même map et sur le même terrain,

-MAP_DEPART : C'est l'id de la map où apparaît pour la première fois le pokémon voyageur (ce paramètre est optionnel).

-MUSIQUE : c'est le nom de la musique spéciale au pokémon voyageur, c'est une chaîne de caractères et doit donc être écrite entre guillemets ; ensuite, elle doit contenir le nom complet de la musique : le nom + le format
exemple : "MUSIQUE" => "PkmnCrystal_Raikou,Entei,Suicune.mid", ce n'est pas la peine de préciser que la musique doit être dans le répertoire Audio de votre jeux.
Et si ce n'est pas le cas, il faut spécifier le chemin d'accès de la façon suivante :
"MUSIQUE" => "Dossier1/nom_de_la_musique.format", où dossier est le dossier où est la musique.



Voilà, ce sont les paramètres les plus simples à régler. Les plus compliqués arrivent : 
¤Régler les terrains ; le paramètre TERRAINS est un array, un tableau, dont les membres sont les tag des terrains où est susceptible d'apparaître le pokémon voyageur. 
exemple : [1,4,7] le pokémon voyageur pourra apparaître dans les tile dont le tag terrain est 1, 4 ou 7.


¤Régler les maps ; le paramètre MAPS est un array aussi et se présente de la même façon, le tableau contient les ids des map où peut apparaître le pokémon voyageur. En soit, la syntaxe de ce tableau n'est pas compliqué ; cependant pour faciliter la création des pokémon et raccourcir la liste des maps, je propose de créer une constante dans laquelle on stockera un tableau contenant les maps appartenant à la même catégorie.


Exemple : Au lieu d'écrire dans le paramètre MAPS du hash que l'on vera après un énorme tableau ([12,34,24,36,47,10,53,61,35,64,65,32,98,63] par exemple), on définie la constante Maps_plaines telle que :
 
Code:
 Maps_plaines = [12,34,24,36,47,10,53,61,35,64,65,32,98,63]

A NOTER : le nom de la constante DOIT commencer par une majuscule, sinon c'est une variable locale.


Nous aurons donc plus qu'à placer cette constante dans le Hash.
Mais attention ! il ne faut pas la placer n'importe comment non plus !


1er cas : Le pokémon n'apparaît que dans les map de la constante Maps_plaines
C'est le cas le plus simple, dans le Hash, il suffit de paramétrer :
 
Code:
 "MAPS" => Maps_plaines


2ème cas : Le pokémon apparaît dans les map de la constante Maps_plaines et dans d'autres map comme des maps d'une autre constante (Maps_montagnes,...) où des maps spécifiques. Il faut dans ce cas, paramétrer :
 
Code:
 "MAPS" => Maps_plaines + Maps_montagnes + [120, 40]

En gros, on ajoute les listes de map.
Voilà, ce n'est pas trés clair mais n'hésitez pas à demander des précisions.



2.2-La création du pokémon voyageur

Nous avons vu les paramètres possibles du future pokémon voyageur, mais ils faut les rassembler. Pour créer un pokémon voyageur, je connais de méthode dont l'une que je recommande fortement (je la présenterais en dernier pour bien faire contraste avec la première).


2.2.1-Première méthode

Dans l'évènement qui créer, ou lâche le pokémon voyageur dans la nature, utilisez la commande insérer un script et écrivez-y ceci, avec les paramètres de votre pokémon voyageur bien sûr :

Code:
lacher_pokemon_voyageur({"INDEX"=>"SUICUCNE", "ID"=>"SUICUNE","LVL"=>50,"SHINY"=>false, "SLOT"=>4,"MAPS"=>[Maps_plaines,35], "TERRAINS"=>[1], "RARETE"=>25, "FUITE"=>true, "MUSIQUE"=>"PkmnCrystal_Raikou,Entei,Suicune.mid", "MAP DEPART"=>33}

Voilà qui lachera un Suicune niveau 50 dans les Maps_plaines et 35
Qui trouve que c'est trééééés lourd à écrire dans un évènement ? Tout le monde, ça ne m'étonne pas. C'est pourquoi il existe une seconde méthode.

2.2.2-Seconde méthode

Dans le script Pokémons_voyageurs que vous avez installé précédemment, au tout début, entre module POKEMON_S et class Pokemon_voyageur Entrez y le code suivant, en personnalisant vos paramètres selon le pokémon que vous voulez créer bien entendu :
Code:
LATIAS_SHINY = {"INDEX" => "LATIAS_SHINY", "ID"=>"LATIAS","LVL"=>45,"SHINY"=>true,"SLOT"=>1,"MAPS"=>[33,34,35],"TERRAINS"=>[1,7], "RARETE"=>10, "FUITE"=>true}

Créer un Latias shiny de niveau 45 pouvant être dans les maps 33,34 ou 35
Notez bien que LATIAS_SHINY est une constante car son nom débute par une majuscule, nous allons donc pouvoir la réutiliser ailleurs...

Certains l'aurons deviné, on l'utilise dans la commande insérer un script, le gros bloc illisible devient simplement LATIAS_SHINY :
Code:
lacher_pokemon_voyageur(LATIAS_SHINY)


Admettez que c'est beaucoup plus évocateur, de plus, si le nom de la constante LATIAS_SHINY est trop peu précise pour vous, il est toujours possible de la nommer LATIAS_NV45_SHINY_SLOT4 mais bon ...


Sauvegardez le tout et jouez.


Pour ceux qui ont encore le courage de copier/coller des lignes de script j'ai une nouvelle fonctionnalité, innovante par rapport au jeu officiel. Faire apparaître le pokémon voyageur dans la map où il se trouve. Trois petites partie pour installer cette version.
Note : Le script principale installé précédemment contient déjà toutes les fonctions nécessaires à cette version.
ATTENTION ! Installer la version "visibilité" ne vous dispense pas d'installer le script normal !!


3.1-Les scripts à modifier
Etant donné que je me suis basé sur le tutoriel de RPG créative (Créer des events mais durant le jeu) pour créer ce script, il y a beaucoup de modification a faire.

3.1.1-Spriteset_Map
A la ligne 54, après l'initialize, insérez cette fonction :
Code:
  def add_event(event_id)
    sprite = Sprite_Character.new(@viewport2, $game_map.events[event_id])
    @character_sprites.push(sprite)
  end


3.1.2-Game_Temp
A la ligne 11, là où il y a tout les attr_accessor, insérez :
Code:
  attr_accessor :add_event
  attr_accessor :id_add_event

Puis dans l'initialize, vers la ligne 109, insérez les deux lignes suivantes :
Code:
    @add_event = false
    @id_add_event = 0


3.1.3-Scene_Map
Il y a deux script Scene_Map, celui de RPMX et celui de Krosk, insérez au début de la fonction update, vers la ligne 48 :
Code:
    if $game_temp.add_event
      @spriteset.add_event($game_temp.id_add_event)
      $game_temp.add_event = false
    end

Note: Ce sont les mêmes lignes pour les deux scripts.

3.1.4-Game_Map
A la ligne 42 du script Game_Map de Krosk (cf. Spoiler), insérez ces lignes :
Code:
    if $pokemons_voyageurs != nil
      $pokemons_voyageurs.each_value{|pokemon|
        if pokemon.map_actuelle == $game_map.map_id and POKEMON_S::POK_VOY_VISIBLE
          pokemon.create_event_pokemon_voyageur
        end
      }
    end


Après :
Code:
    for i in @map.events.keys
      @events[i] = Game_Event.new(@map_id, @map.events[i])
      if @events[i].event.name == "LIVREUR"
        int.check_cm(i)
      end
    end


{{{Vous devez répondre à ce sujet pour voir la partie cachée}}}


C'est tout pour les modifications de script.

3.2-L'évènement Pokemon_voyageur
N'ayant pas réussi à créer entièrement l'évent du pokémon voyageur. J'ai du utiliser une supercherie : copier un évent déjà créer sur une autre map.
Il faut donc créer cette évent : Sans rien modifier, ça pourrait tout faire bugger :
Spoiler

Relever son ID ainsi que l'id de la map ou il se trouve. Je pense que le plus simple est de le placé dans l'intro, ou même mieux, dans une nouvelle map on l'on pourra stocker ce genre d'évènements et d'autres évènements de map communs.

Au tout début du script Pokemon_Voyageur : il y a trois constantes :
Code:
POK_VOY_VISIBLE = false #à régler sur true, sinon le pokémon voyageur n'apparaîtera pas sur la map

Code:
ID_MAP_EVENT_POK_VOY = l'id de la map où vous venez de créer l'event à copier
ID_EVENT_POK_VOY = l'id de l'évent que vous venez de copier

Ce sont les coordonnées (Map, id) de l'event, trés important car c'est la base de l'évènement Pokémon_voyageur.

3.2-Les Chara pokémons
Bon, les chara de pokémons sont dans ce fichié zip : HGSS OW.zip, je sais qu'ils sont en téléchargement sur le forum mais je ne les ai pas retrouvé --', je ne sais pas si il y a des crédit mais vu le travail je pense que si.
Les chara ne sont pas a mettre n'importe où !!! Dans le dossier Characters, créer un nouveau dossier que vous appellerez CHARA_POKEMONS (en majuscules), puis faites extraire les données dans ce dossier.



On dirait que c'est enfin la fin de ce manuel d'installation et d'utilisation de mon script, cool non ? Parfait, je vous souhaite un bon jeu, un bon making et si vous utilisez ce script un petit crédit pour moi Clin d'œil foireux sans oublier de marquer que vous utiliser le pack HGSS OW.zip dont l'auteur pourra vous demander un crédit s'il le souhaite.

BON MAKING A TOUTES ET A TOUS !

Posté par Ku'rei le 19 Mar - 10:59 (2011)
20 Vues et aucun commentaires ... Le topic ne fonctionne pas ? Le script est trop compliqué à installer ? Ou tout le monde à la flegme de l'installer ?
Je suis en train de faire une démo, pour montrer l'utilité de ce script.

Posté par Solfay le 19 Mar - 11:34 (2011)
Ok, à quoi ça sert?        

Posté par Nuri Yuri le 19 Mar - 12:56 (2011)
En même temps le pokémons voyageurs n’intéressent pas beaucoup de monde et ça se fait aussi facilement avec les events surtout quand c'est pour trois pokémons.

Posté par Raude le 19 Mar - 19:59 (2011)
Bonsoir Kureiji,

Le double post, n'est pas toléré. La prochaine fois, tu écoperas d'un avertissement.
Pour éviter le double post : ./391-Petit-tuto-pour-les-forums-rendre…
Merci.

Posté par Tinei le 19 Mar - 20:34 (2011)
Salut, ça a l'air cool ton truc, mais comme tu l'as dis, j'ai la flemme de l'installer :D
Sinon tu as bien expliqué et ça m'a l'air sympa, merci.

Posté par Ku'rei le 20 Mar - 12:41 (2011)
Je suis désolé pour le double-post, je croyais que le grand message ne comptait pas, je ferais attention la prochaine fois.
Solfay : Ca sert à créer de pokémons qui se baladent de map en map comme Suicune, Entei, Raiku, Latios et Latias (mais rien ne t'empêche d'en faire d'autre)
Yuri : Je sais que c'est une petite partie d'un jeu, mais ça me plait beaucoup de poursuivre des pokémon comme ça. Et ça faciliterais la création de tels pokémons si le script était incorporé à PSP 50.7 ou 4G+) mais cela ne dépend pas de moi.
Tinei : Oui, c'est dommage, j'aimerais trouver une solution pour simplifier l'installation du script ...

Posté par Tinei le 21 Mar - 09:06 (2011)
Pas grave, j'attend la démo :D

Posté par Ku'rei le 21 Mar - 20:12 (2011)
Bah en fait, j'ai plusieurs script en réalisation, quand ils seront tous prêt je les installerais sur une version de PSP4G+ et la mettrait en téléchargement dans un topic.

Posté par maror le 21 Mar - 20:18 (2011)
Tu crois qu'il y a un moyen pour le mettre sur PSPDS?

Posté par Ku'rei le 21 Mar - 21:22 (2011)
Je ne sais pas, mais alors pas du tout... Je ne connais pas PSPDS, mais si les script n'ont pas trop variés d'une version à l'autre il ne devrait pas y avoir de problème.

Posté par IamTheAdic le 23 Mar - 00:33 (2011)
PSPDS est fait à partir de 0.7, donc les scripts sont différents. Fin bref je ne connais pas le 4G+ de Sphinxinou.

Posté par Nuri Yuri le 23 Mar - 13:01 (2011)
Dans PSP DS il y a certainement plus de fonctions dans la classe Pokémon.
Dans 4G+ il y a plus de fonctions, mais les ancienne n'ont pas vraiment changer donc ça devrais marcher et puis pour savoir si le script fonctionne faut tester.

Posté par maror le 23 Mar - 20:57 (2011)
j'ai testé mais quand je lâche le pokémon avec une des deux méthodes, je les trouves pas (pas de combat).

Posté par Ku'rei le 24 Mar - 21:25 (2011)
J'essaie de l'installer sur PSPDS, je tente de corriger le bug et j'édite.
PS : Y aurait-il des intéressé pour que le pokémon voyageur apparaisse sur la map ? Comme ceci :

Car l'installation du script est compliqué, il faut télécharger les chara pokémons. Mais si ça intéresse quelqu'un je modifie mon topic et je refait le tuto Imbécile heureux

EDIT : J'ai fais quelque test, notamment sur les trois façon de déterminer les maps où apparaissent les pokémons voyageurs. Si tu utilise une constante et d'autre id dans ta liste de map, il semblerait qu'il y ai des bugs.
Voilà, il faut transformer (dans la définition de la constante du pokémon) :
Code:
"MAPS"=>[Maps_plaines, 45, 66]

en :
Code:
"MAPS"=>Maps_plaines + [45,66]

En espérant que ce soit ça Imbécile heureux

EDIT 2 : C'est ça, et on a le même problème dans PSP4G+, merci maror Imbécile heureux
J'édite le sujet tout de suite

Posté par maror le 25 Mar - 08:06 (2011)
J'avoue que le pokémon voyageur sur la map serait marrant, se serait plus dure à l'attrapé, que si on voyage dans les hautes-herbes.
Sinon, j'ai pas trop compris le reste de se que tu as dit dans tes édits.


EDIT: Tu as raison (en fait j'ai compris), j'ai fait :
  "MAPS"=>Ville + [11]
ça marche, même sur PSPDS
Merci pour l'aide Kureiji  :D


EDIT2: (oui je sais, je suis embêtant)
Je lâche mon suicune j'ai fais le combat, il fuit, je sauvegarde et j'arrete, je reprend la partie, aucun moyen de le trouver, dans TOUTE les map où
j'ai mis pour qu'il apparaisse (une seul car je vien de tester), aucun combat contre le fuyard...


Posté par Tinei le 25 Mar - 17:33 (2011)
Kureiji a écrit:

PS : Y aurait-il des intéressé pour que le pokémon voyageur apparaisse sur la map ? Comme ceci :



Ça m’intéresse ! Merci !

Posté par Ku'rei le 25 Mar - 20:11 (2011)
à maror : Bon je crois savoir d'où vient le problème, les pokémon lâchés ne sont pas enregistrer ...
àTinei : Je règle le problème majeur de maror et je m'occupe de cette version du script.

EDIT:C'est un gros soucis que tu as découvert maror --' ... Ca va mettre plus de temps que prévue, à moins qu'un scripteur plus expérimenté m'aide...

EDIT 2 : J'y arrive pas désolé ... Faut demander de l'aide

EDIT 3 : J'y suis arrivé ! Alors il faut que tu copie/colle le nouveau script Pokemons_voyageurs (j'y ai juste ajouter quelques nouvelle fonctions) :
Script
Code:
#-------------------------------------------------------------------------------
# --- Script: Pokemon_voyageurs - ©Kureiji -
# --- Début :09/03/2011 --- Fin : 17/03/2011 -
#-------------------------------------------------------------------------------
module POKEMON_S
  #-----------------------------------------------------------------------------
  #  Paramètres concernant la visibilité du pokémon voyageur sur la map
  #-----------------------------------------------------------------------------
 
  POK_VOY_VISIBLE = true #false si vous ne voulez pas que les pokémons voyageurs soient visibles sur la map où ils sont
  ID_MAP_EVENT_POK_VOY = 46 #a remplacer par l'ID de la map ou se trouve l'évent décrit dans le tuto
  ID_EVENT_POK_VOY = 9 # à remplacer par l'id de l'event dans la map où il se trouve
  POK_VOY_VAR_SAVE = 36
 
  #-----------------------------------------------------------------------------
  #  Liste de map appartenant à la même catégorie
  #-----------------------------------------------------------------------------
 
  Maps_plaines = [46,51,50]
 
  #-----------------------------------------------------------------------------
  #  POKEMONS VOYAGEURS : "INDEX" : index du répertoire où sont stockées les informations sur le pokémon
  #-----------------------------------------------------------------------------
  LATIOS = {"INDEX" => "LATIOS","ID"=>"LATIOS","LVL"=>45,"SHINY"=>false, "SLOT"=>2,
            "MAPS"=>Maps_plaines,"TERRAINS"=>[1,7], "RARETE"=>30, "FUITE"=>true}
 
  LATIAS_SHINY = {"INDEX" => "LATIAS_SHINY", "ID"=>"LATIAS","LVL"=>45,"SHINY"=>true,
                  "SLOT"=>1,"MAPS"=>Maps_plaines,"TERRAINS"=>[1,7], "RARETE"=>10, "FUITE"=>true}
 
  RACAILLOU_SHINY = {"INDEX" => "RACAILLOU_SHINY","ID"=>"RACAILLOU","LVL"=>40,"SHINY"=>true,
                    "SLOT"=>3,"MAPS"=>Maps_plaines+[50],"TERRAINS"=>[1], "RARETE"=>80,
                    "FUITE"=>false}
 
  SUICUNE = {"INDEX"=>"SUICUNE", "ID"=>"SUICUNE","LVL"=>50,"SHINY"=>false,
              "SLOT"=>4,"MAPS"=>[50], "TERRAINS"=>[1], "RARETE"=>25, "FUITE"=>true,
              "MUSIQUE"=>"PkmnCrystal_Raikou,Entei,Suicune.mid"}
 

     
  class Pokemon_voyageur
   
    attr_accessor :index
    attr_accessor :id
    attr_accessor :level 
    attr_accessor :shiny
    attr_accessor :slot
    attr_accessor :maps_f
    attr_accessor :terrains_f
    attr_accessor :fuite
    attr_accessor :musique
    attr_accessor :map_actuelle
    attr_accessor :terrain_actuel
   
  #----------------------------------------------------------------------------
  #Création du pokémon voyageur (hash = {"INDEX","ID","LVL","SHINY","SLOT","MAPS" => [ARRAY],"TERRAINS" => [ARRAY] ,"RARETE",FUITE","VISIBLE","MAP DEPART"})
  #Caractéristiques du pokémon
  #-----------------------------------------------------------------------------
    def initialize(hash)
      @index = hash["INDEX"]
      @id = hash["ID"]
      @level = hash["LVL"]
      @shiny = hash["SHINY"]
      @slot = hash["SLOT"]
      @maps_f = hash["MAPS"].flatten  #Maps_fréquentées
      @terrains_f = hash["TERRAINS"]  #Terrains_fréquentés
      @rarete = hash["RARETE"]
      @fuite = hash["FUITE"]
      @musique = hash["MUSIQUE"]
      @visible = hash["VISIBLE"]
     
   
      #Initialisation de la map d'apparition initiale
      if hash["MAP DEPART"] != nil
        @map_actuelle = hash["MAP DEPART"]
      else
        tab = hash["MAPS"]
        @map_actuelle = tab[rand(tab.size)]
      end #if
   
      #Ajout du pokémon à la liste des pokémons voyageurs, création de la variables si premier pokemon voyageur
      if $pokemons_voyageurs == nil
        $pokemons_voyageurs = {}
      end #if   
      $pokemons_voyageurs[@index] = self
   
      #Création du pokémon voyageur
      @interpreter = Interpreter.new
      @interpreter.enregistrer_pokemon(@slot,@id,@level,@shiny)
      save_file

      #NOTE : l'enregistrement du pokémon voyageur dans un slot se fait dans l'Interpreter
      #(à l'appel de la fonction "creer_pokemon_voyageur"
   
    end #initialize
     
  #-----------------------------------------------------------------------------
  #  Enregistrement et récupération de données sur les pokémons voyageurs
  #-----------------------------------------------------------------------------
 
    def save_file
      slot = $game_variables[8] #Save slot
      save = "Data/Pokemon_voyageurs_slot_"+slot.to_s+".rxdata"
      file = File.open(save,"w")
      Marshal.dump($pokemons_voyageurs,file)
      file.close
    end
       
 
  #-----------------------------------------------------------------------------
  #  Gestion des rencontres et des combats avec les pokémons voyageurs
  #-----------------------------------------------------------------------------
   
    def rencontre?
      if self.map_act_ok? and self.terrain_act_ok? and self.rarete_loc_ok? and not(POK_VOY_VISIBLE)
        return true
      else
        return false
      end
    end #rencontre?
   
    def rencontre_pok_voy
      $musique_combat_changee = @musique if @musique != nil
      $combat_contre_pokemon_fuyard = true if @fuite == true
      @interpreter.demarrer_combat_existant(@interpreter.appel_pokemon(@slot))
      changement_map
      save_file
    end #rencontre_pok_voy
 
  #change @map_actuelle et @terrain_actuel
 
  def changement_map
    change_map
  end #changement_map
 
  def change_map
    if @maps_f.size > 1 #une seule map => on ne change pas de map
      maps = @maps_f-[@map_actuelle]
      @map_actuelle = maps[rand(maps.size)]
    end
  end #change_map
 
 
  #-----------------------------------------------------------------------------
  #  Fonctions applicable à l'objet de classe Pokemon_voyageur
  #-----------------------------------------------------------------------------
 
    def map_act_ok?
      if $game_map.map_id == @map_actuelle
        return true
      end #if
    end #map_act_ok?
 
    def terrain_act_ok?
      if @terrains_f.include?($game_player.terrain_tag)
        return true
      end #if
    end #terrain_act_ok?
 
    def rarete_loc_ok?
      if rand(101) <= @rarete #101 car rand(101) appartient à [0;100], comme @rarete
        return true
      end #if
    end #rarete_loc_ok?
 
    def slot
      return @slot
    end
   
    def map_actuelle
      if @map_actuelle ==nil
        return nil
      else
        return @map_actuelle
      end
    end
   
    #--------------------------------------------------------------------------
    #   DETECTION SI LE POKEMON EST PLACABLE DANS LA MAP ET PLACEMENT SI TRUE
    #--------------------------------------------------------------------------
   
    def detect_event_poke_voy
      if map_act_ok? and VISIBILITE == true and @visible == true
        create_event_pokemon_voyageur
      end
    end
   
   
    #--------------------------------------------------------------------------
    #   CREATION DE L'EVENT DU POKEMON VOYAGEUR SUR LA MAP
    #--------------------------------------------------------------------------
   
    # Structure principale
   
    def create_event_pokemon_voyageur
      p = @interpreter.appel_pokemon(@slot)
      if p.dead?
        return
      end
     
      map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
      events = map.events
      if events == nil
        return
      end
     
      for event in events.values
        if event.name == ("EVENT_POKEMON_VOYAGEUR_SLOT_" + @slot.to_s)
          return
        end
      end
      #Si l'event a déja été créer, on ne le recréer pas.

      @coo = recherche_coordonnees
      if @coo != nil
        pokemon = @interpreter.appel_pokemon(@slot)
        @chara = to_chara_filename(pokemon)
        if @chara != nil and pokemon != nil
          @create = Create_Event_Pokemon_Voyageur.new(@coo,@index,@chara)
        end
       
        return @create
      end
    end #create_event_pokemon_voyageur
   
   
    # to_chara_filename retourne le nom du fichier de la forme "CHARA_POKEMONS/034s_0.png", ce fichier doit
    # être dans le dossier Characters/CHARA_POKEMONS et du format png
   
    def to_chara_filename(pokemon)
      id = pokemon.id
      if id.between?(1,9)
        id = "00" + id.to_s
      elsif id.between?(10,99)
        id = "0" + id.to_s
      elsif id.between?(100,999)
        id = id.to_s
      end
     
      if pokemon.shiny
        shiny = "s"
      else
        shiny =""
      end
     
      #mise sous forme "CHARA_POKEMONS/019s_0.png"
      chara = "CHARA_POKEMONS/" + id.to_s + shiny.to_s + "_0.png"
      return chara
    end #to_chara_filename
       
   
    # Recherche de coordonnées valides :
    #     - Pas d'event
    #     - Tile Passable
    #     - Terrain correspondant
    #Organisation des recherche de terrain :
    #_____________________________________________________
    #|   _____________________________________________   |
    #|   |   _____________________________________   |   | Ca, c'est la map ...
    #|   |   |   ______________________________  |   |   |
    #|   |   |   |       ETC ...              |  |   |   |
    #|   |   | 3 |____________________________|  |   |   |
    #|   | 4 |___________________________________|   |   |
    #| 5 |___________________________________________|   |
    #_____________________________________________________
   
   
    def recherche_coordonnees
      for zone in 1..3
        coo = test_zone(zone)
        if coo != nil
          break
        end
      end
      return coo
    end #recherche de coordonnees
   
    # une zone est un rectangle dont les diagonales se coupent au centre de la map
    # height : hauteur de la map
    # width : largeur
    def test_zone(i)
      result = []
      width = $game_map.width
      height = $game_map.height
      if i < 3
        xf = width -1
        xf *= i*3 - 1
        xf /= i*3
        yf = height -1
        yf *= i*3 - 1
        yf /= i*3
      else
        xf = width
        yf = height
      end
     
      yd = (width - 1)/(i*3)
      yd = yd
     
      xd = (height - 1)/(i*3)
      xd = xd
     
      for y in yd..yf
        for x in xd..xf
          if good_coo?(x,y)
            result.push([x,y])
          end
          x += 1
        end
        y += 1
      end
     
      return (result[rand(result.size)])
    end #test_zone
   
    def good_coo?(x,y)
      if tile_passable?(x,y)
        if @terrains_f.include?($game_map.terrain_tag(x,y))
          if not(event_detected?(x,y))
            return true
          end
        end
      end
      return false
    end #good_coo?
   
    def tile_passable?(x,y)
      for a in 1..4
        dir = a*4
        if not($game_map.passable?(x,y,dir))
          return false
        end
      end
    end
   
   
    def event_detected?(x,y)
      for event in $game_map.events.values
        if event.x == x and event.y == y
          return true
        end
      end
      return false
    end # event_detected?     

  end #class Pokemon_voyageur
 
 
 
  # Class permettant de copier l'event du pokémon voyageur
  # Il doit être situé dans une map du jeu, celle d'id : ID_MAP_EVENT_POK_VOY
  # et doit avoir l'id : ID_EVENT_POK_VOY
  # cf. début du script
 
  class Create_Event_Pokemon_Voyageur < Pokemon_voyageur          #releve du copiage ... plus que de la création
   
    attr_accessor :index
   
    def initialize(coo, index, chara)
      @map = load_data(sprintf("Data/Map%03d.rxdata", ID_MAP_EVENT_POK_VOY))
      # Les évènements de la map
      @events = @map.events
      @event_id = ID_EVENT_POK_VOY
      @coo = coo
      @index = index
      @chara = chara
      if @events[@event_id] == nil
        return
      elsif coo != nil
        create
        return @create
      end
     
    end
   
    def create
      event = @events[@event_id]
      event.x = @coo[0]
      event.y = @coo[1]
      event.id = search_new_id
      event.name = "EVENT_POKEMON_VOYAGEUR_" + @index
      event.pages[0].graphic.character_name = @chara
      event.pages[0].move_type = 1
      event.pages[0].move_frequency = 5
      event.pages[0].trigger = 1
   
      @create = Game_Event.new($game_map.map_id,event)
      #Ajoute dans liste des évènements de la carte actuelle
      $game_map.events[event.id] = @create
      # Indique qu'on ajoute un Sprite
      $game_temp.add_event = true
      # ID de l'évènement pour le Sprite à ajouter
      $game_temp.id_add_event = event.id
      return @create
    end #create
   
    def search_new_id
      id = 1
      while $game_map.events.include?(id)
        id += 1
      end
      return id
    end   #search_new_id
   
  end #Create_Event_Pokemon_Voyageur
 
 
  def search_new_id
    id = 1
    while $game_map.events.include?(id)
      id += 1
    end
    return id
  end
 

end #module POKEMON_S

#-------------------------------------------------------------------------------
# Interpreter
#-------------------------------------------------------------------------------

class Interpreter
 
  def creer_pokemon_voyageur(hash)
    Pokemon_voyageur.new(hash)
  end #creer_pokemon_voyageur
  alias lacher_pokemon_voyageur creer_pokemon_voyageur
 
  def creer_event_pok_voy(pokemon)
    pokemon.create_event_pokemon_voyageur
  end
 
 
  def pokemon_voyageur_event_fight
    x = $event_coo[0]
    y = $event_coo[1]
    for index in $pokemons_voyageurs.keys
      for event in $game_map.events.values
        if event.name == ("EVENT_POKEMON_VOYAGEUR_" + index) and event.x == x and event.y ==y
          pokemon = $pokemons_voyageurs[index]
          ok = true
          pokemon.rencontre_pok_voy
          break
        end
      end
      break if ok == true
    end
  end
 
 
 
  def search_pokemon_voyageur(name)
    name.delete!("EVENT_POKEMON_VOYAGEUR_")
    return $pokemons_voyageurs[name]
  end
 
 
  def add_event_coo(coo = 0, index = 0)
    $event_coo = [0,0] if $event_coo == nil
    case coo
    when "x"
      $event_coo[0] = $game_variables[index]
    when "y"
      $event_coo[1] = $game_variables[index]
    when 0
      $event_coo = [0,0]
    end
  end
 
    def load_file_pok_voy
      if $pokemons_voyageurs == nil
        slot = $game_variables[8]
        save = "Data/Pokemon_voyageurs_slot_"+slot.to_s+".rxdata"
        if FileTest.exist?(save)
          file = File.open(save,"r")
          $pokemons_voyageurs = Marshal.load(file)
          file.close
        end
      end
    end

end #class Interpreter


Et que tu ajoute cette ligne de code au dessus des modification daites au script Pokemon_Party :
Code:
Interpreter.new.load_file_pok_voy


Voici tout fonctionne correctement. J'ai plus qu'à installer ça dans le Topic

EDIT 4 : toute les modifications sont incorporé au topic et pour Tinei, j'ai aussi écris le Manuel d'installation du script gérant la visibilité sur la map du pokémon voyageur Imbécile heureux

Posté par Sphinx le 27 Mar - 14:04 (2011)
Kureiji a écrit:
Code 1 :
Code:
"MAPS"=>[Maps_plaines, 45, 66]

Code 2 :
Code:
"MAPS"=>Maps_plaines + [45,66]


Voici la différence entre ces deux codes, et ce qui explique probablement les erreurs que tu as eu :
Résultat du code 1 :
Code:

[[12, 34, 24, 36, 47, 10, 53, 61, 35, 64, 65, 32, 98, 63], 45, 66]

Résultat du code 2 :
Code:

[12, 34, 24, 36,47,10,53,61,35,64,65,32,98,63, 45,66]


D'ou des bugs de type NoMethodError ou encore TypeError :p

PS : Pour les constantes, je vous conseille vivement de les nommer entièrement en majuscule vos constantes (ma_variable, Ma_Classe, MA_CONSTANTE Clin d'œil foireux)
PS2 : ^^ Je suis impatient de voir une démo du système, parce qu'à mon avis ca vaudra le détour

Posté par RevengeOfShadow le 27 Mar - 15:23 (2011)
Excellent boulot, je vais intégrer ça au jeu Coeur de Platine.

EDIT:
Bug à cette ligne :
Code:
@terrains_f = hash["TERRAINS"]


(Sur PSP DS) ...


Autre chose: j'ai vu que tu utilisais un fichier .rxdata dans DATA pour sauver les paramètres du pokémon. Si j'en prends un et que je le copie sur un autre PC avec le même jeu, le pokémon sera pareil ? Si oui comme ça je pourrais faire des évènements pour mon jeu !

Posté par maror le 27 Mar - 16:20 (2011)
génial, je vais tester ça pour voir si ça marche chez moi. 

Posté par Ku'rei le 27 Mar - 16:25 (2011)
Sphinx : Dans l'initialize, j'utilisais .flatten! qui devait "aplatir" le tableau ... sauf que j'ai du mal comprendre la fonction ou juste que ça ne marche pas --' Et oui, utiliser des nom entièrement en majuscules c'est mieux pour les constantes (on voit le scripteur débutant là XP). Quand à la vidéo, je dois régler un dernier bug : le combat se déclanche quand le personnage est à moitié dans l'herbes et les combats peuvent se déclancher à la suite si plusieurs pokémons sont dans la même map :/

RL77LUC : Tout fonctionne bien sur PSPDS (cf. 4message plus haut), pour ton bug, soit tu as mal écris "TERRAINS" dans ton hash de définition du pokémon voyageur, soit tu a oublié d'écrire l'unique terrain sur lequel est le pokémon
Code:
"TERRAINS"=>1
#est totalement différent de :
"TERRAINS"=>[1]


Si c'est autre chose, tu pourrais me donner le log d'erreur ? ou un screen de l'erreur ?

EDIT : Je pense que oui, mais attention ! N'ayant pas réussi a écrire dans la sauvegarde je créer un fichier "Pokemons_voyageurs_X.rxdata" par sauvegarde, X est le slot (numero) de la sauvegarde.

Posté par RevengeOfShadow le 27 Mar - 16:50 (2011)
Kureiji, merci de te pencher sur mon soucis, malheureusement, je n'ai même pas le temps de lancer le jeu, ça le fait juste après l'intro en noir. je n'ai pas défini de pokémons et ceux dans le script sont bien avec des crochets.

PS: Si tu veux rejoindre l'équipe de dev de pokémon CDP, y'a pas de soucis Clin d'œil foireux.

Posté par Ku'rei le 27 Mar - 16:58 (2011)
C'est simpa de m'invité Imbécile heureux Mais j'ai pas envie de me lancer dans un projet tout de suite, j'ai bien envie de mettre au point mon interface perso :D
Tu peut mettre le log ? ou un screen ? du bug, sans ça je peux rien faire :/

Posté par maror le 27 Mar - 16:59 (2011)
Le pokémon voyageur marche merci, mais pour qu'il soit en event, c'est moi qui est mal mis les scripts car à la ligne
 if p.dead?
ça met une erreur des que je marche.


Log
---------- Erreur de script : Pokemon_voyageur ----------
----- Type
NoMethodError


----- Message
- ARGS - []
undefined method `dead?' for nil:NilClass


----- Position dans Pokemon_voyageur
Ligne 196


----- Backtrace
Script : Pokemon_voyageur | Ligne : 196 | Méthode : in `create_event_pokemon_voyageur'
Script : Game_Map | Ligne : 65 | Méthode : in `passable?'
Script : Game_Map | Ligne : 63 | Méthode : in `each_value'
Script : Game_Map | Ligne : 63 | Méthode : in `passable?'
Script : Game_Character | Ligne : 25 | Méthode : in `passable?'
Script : Game_Player | Ligne : 34 | Méthode : in `passable?'
Script : Follow me | Ligne : 137 | Méthode : in `move_left'
Script : Deplacement | Ligne : 16 | Méthode : in `update'
Script : Scene_Map | Ligne : 54 | Méthode : in `alias_update'
Script : Scene_Map | Ligne : 51 | Méthode : in `loop'
Script : Scene_Map | Ligne : 64 | Méthode : in `alias_update'
Script : MAPPANEL* | Ligne : 89 | Méthode : in `oldUpdate'
Script : Bouton_Rouge* | Ligne : 54 | Méthode : in `follow_me_update'
Script : Follow me | Ligne : 113 | Méthode : in `update'
Script : Scene_Map | Ligne : 29 | Méthode : in `main'
Script : Scene_Map | Ligne : 24 | Méthode : in `loop'
Script : Scene_Map | Ligne : 37 | Méthode : in `main'
Script : Main | Ligne : 59




Voila, sinon tout marche  Clin d'œil foireux .

Posté par Nuri Yuri le 27 Mar - 17:15 (2011)
Pokemon.dead est une variable et non une methode donc pas de "?" à la fin.
Mettez p.dead au lieu de p.dead?

Posté par Ku'rei le 27 Mar - 17:24 (2011)
Bien vu Yuri ! Je pensait que "dead?" était une fonction applicable aux objets de classe pokémon ... mais non, elle s'utilise dans "Insérer un script".
EDIT : Cependant, le log dis qu'on applique dead? à NilClass ... Donc le problème ne vient pas de là, je cherche.
EDIT2: Je viens de vérifié, on peut appliquer dead?, ça marche Imbécile heureux

Posté par maror le 27 Mar - 19:27 (2011)
Quoi? j'ai pas tout compris se que tu as dit... Il faut mettre juste dead c'est ça?

Posté par RevengeOfShadow le 28 Mar - 06:16 (2011)
Pour le log j'en ai pas. Pour le screen je peux t'en faire un mais tu verras rien de plus, il y a un simple 'Syntax Error' à la ligne indiquée au dessus ...

PS: Si tu as un peu de temps, tu pourrais m'aider, car je voudrais réaliser une interface avec le tuto de Palb' (toute bête, heure et argent uniquement ... pour le moment) sauf que ça fonctionne pas.

Posté par Ku'rei le 28 Mar - 18:19 (2011)
maror : les deux marchent
RL77 : bah je sais pas ... Je comprend pas ce bug => essaie de réinstaller le script :/

Posté par maror le 28 Mar - 18:28 (2011)
dac, meric encore, et super script

Posté par RevengeOfShadow le 29 Mar - 20:15 (2011)
OK, j'essayerai à l'occasion. Si tu es OK pour m'aider (un tout petit peu) sur l'interface, pourrais-tu m'envoyer un MP ? Merci en tous cas.

Posté par Ku'rei le 30 Mar - 18:23 (2011)
J'ai pas étudié cette interface... mais je vais le faire, de toute façon j'en ai besoin pour faire mon début de projet. Envoie moi ton probleme par MP je verrai ce que je peux faire Imbécile heureux

Posté par RevengeOfShadow le 31 Mar - 06:18 (2011)
Merci beaucoup !

Posté par Sphinx le 31 Mar - 16:18 (2011)
Imbécile heureux Juste par pure curiosité, tu prévois une démo ?

Posté par Ku'rei le 31 Mar - 19:25 (2011)
Si par démo tu entend une portion de jeu jouable, c'est en cours de making mais je ne peux pas trop trop maker en ce moment mon bac blanc approche Clin d'œil foireux

Posté par Giratinaprimal le 9 Avr - 16:17 (2011)
J'ai SyntaxError sur cette ligne (vers la 60) :
Ligne buguée
@terrains_f = hash["TERRAINS"]  #Terrains_fréquentés


Cette erreur survient dès le démarrage.

Posté par Ku'rei le 9 Avr - 19:28 (2011)
Je ne comprend pas ce bug ... C'est la même syntaxe que les autres ligne et pourtant ...
Essaie de supprimer le '.flatten' de la ligne juste au-dessus, sinon, le souligné entre terrains et f ( 'terrain_f') a peut-être été remplacer par un espace tout bête --'
Sinon c'est autre chose

Posté par Giratinaprimal le 9 Avr - 19:32 (2011)
Ca s'arrange pas... La même ligne bugue après les modifs...
C'est bien un "_" et non pas un " " qui est présent pourtant.

Posté par Ku'rei le 9 Avr - 20:55 (2011)
Ben ... Je ne sais pas, désolé ... Essaie de réinstaller le script, mais je vois vraiment pas où est l'erreur de suntaxe --'

Posté par Sphinx le 12 Avr - 16:02 (2011)
Quel est le message d'erreur ?

Posté par Giratinaprimal le 12 Avr - 16:19 (2011)
Il dit : "Syntax Error" et la ligne buguée. Et c'est tout.

Posté par Sphinx le 12 Avr - 18:09 (2011)
Il ne te donne pas plus de détails ?

Posté par Nuri Yuri le 12 Avr - 20:28 (2011)
Généralement un syntaxe error ne se couronne pas d'un log vue que le script qui gère ça n'est pas actif.

Posté par Giratinaprimal le 12 Avr - 23:00 (2011)
Bon ben... tant pis...

Posté par Sphinx le 16 Avr - 05:09 (2011)
Yuri-岼 a écrit:
Généralement un syntaxe error ne se couronne pas d'un log vue que le script qui gère ça n'est pas actif.


Certes mais le message d'erreur contient - la plupart du temps - la réponse avec entre autre : la cause de l'erreur, le script qui la contient, ainsi que la ligne buggée. Ce sont ces détails qui m'intéressent Imbécile heureux

Posté par Conan Edogawa le 8 Juin - 06:59 (2011)
Bonjour Kureiji,

J'ai installé ton script ,mais j' ai un bug.Le voici:

Et rien dans Log.

Posté par Newtiteuf le 8 Juin - 20:50 (2011)
Personnellement ... et sans avoir étudié pplus que ca le script, je dirais de remplacer

@terrains_f = hash["TERRAINS"]

par

@terrains_f = hash["TERRAINS"].flatten


Après advienne que pourra ... ce n'est qu'un hypothèses non fondée.

Posté par Ku'rei le 11 Juin - 15:06 (2011)
@Newtiteuf : Ce n'est pas possible que l'erreur vienne de là, car c'est une erreur de syntaxe. De plus, la variable @terrain_f n'a absolument rien à voir avec les script Pokemon_Battle_Core Clin d'œil foireux

@pikachu5000 : C'est normal qu'il n'y ai rien dans le log, par contre je ne vois pas ce qui bug ailleurs ... Mais comme c'est une erreur de syntaxe, ça doit être facile à repérer. Tu peux poster le morceau du script qui bug ? Genre de la ligne 2264(vers def launch_enemy_pokemon) à 2380 (vers def end_battle_flee). Sinon, je pense qu'il manque un end quelque part dans la fonction lauch_enemy_pokemon, je te laisse vérifier que le nombre d'ouverture (if, each, unless, ...) et le nombre de end est bon.

Posté par Conan Edogawa le 15 Juil - 23:57 (2011)
J'ai un bug 
log:
---------- Erreur de script : Pokemon_Battle_Trainer ----------
----- Type
NoMethodError

----- Message
- ARGS - []
undefined method `dead?' for nil:NilClass

----- Position dans Pokemon_Battle_Trainer
Ligne 155

----- Backtrace
Script : Pokemon_Battle_Trainer | Ligne : 155 | Méthode : in `qu_initialize'
Script : Fonctions quêtes | Ligne : 26 | Méthode : in `initialize'
Script : Interpreter | Ligne : 62 | Méthode : in `new'
Script : Interpreter | Ligne : 62 | Méthode : in `call_battle_trainer'
Script : Interpreter Bis | Ligne : 181 | Méthode : in `command_301'
Script : Interpreter 2 | Ligne : 151 | Méthode : in `execute_command'
Script : Interpreter 1 | Ligne : 199 | Méthode : in `update'
Script : Interpreter 1 | Ligne : 113 | Méthode : in `loop'
Script : Interpreter 1 | Ligne : 204 | Méthode : in `update'
Script : Scene_Map | Ligne : 51 | Méthode : in `alias_update'
Script : Scene_Map | Ligne : 48 | Méthode : in `loop'
Script : Scene_Map | Ligne : 67 | Méthode : in `alias_update'
Script : MAPPANEL | Ligne : 90 | Méthode : in `old_update'
Script : TempsJourNuit | Ligne : 248 | Méthode : in `update_passminimap'
Script : Minimap | Ligne : 44 | Méthode : in `follow_me_update'
Script : Follow Me | Ligne : 99 | Méthode : in `update'
Script : Scene_Map | Ligne : 24 | Méthode : in `old_main'
Script : Scene_Map | Ligne : 19 | Méthode : in `loop'
Script : Scene_Map | Ligne : 29 | Méthode : in `old_main'
Script : TempsJourNuit | Ligne : 237 | Méthode : in `main_passminimap'
Script : Minimap | Ligne : 31 | Méthode : in `main'
Script : Main | Ligne : 49

Posté par Ku'rei le 17 Juil - 20:08 (2011)
Je sais pas d'où viens ce bug et je suis désolé de ne pas pouvoir t'aider car ça fait vraiment longtemps que je ne me suis pas plongé dans ce script et que j'ai beaucoup de travail sur mon projet... Désolé, dis moi quand se déclenche le bug, si ça cible bien je pourrais peut-être t'aider.

Posté par Conan Edogawa le 22 Juil - 20:24 (2011)
en lancant le jeu. :guillotine:

Posté par arthurmaker le 25 Aoû - 20:44 (2011)
Titre : Plz, demo!
Demo, pleaase *-*


I need this system for my game *u*

Posté par Disccat le 16 Fév - 02:57 (2012)
Titre : Créer des Pokémons voyageurs visibles sur la map !
Bonsoir, ou bonjour, on verra,

J'ai installé les deux premières parties du script (donc sans la version visible), et ça semble fonctionner nickel.

Le Pokémon est trouvé avec sa musique, il fuit, on le retrouve, on le blesse, on le paralyse, il fuit, on le retrouve, on le capture... Et là, on le retrouve encore avec ses blessures dans les hautes herbes... Je le mets KO, ne voulant pas le capturer infiniment, et la musique des combats semble ne plus se réinitialiser non plus pour la rencontre normale des Pokémon... De plus, la musique du lieu où le Pokémon apparait (je n'avais mis qu'un lieu) disparait quand on marche sur le tag terrain concerné.

Si tu peux trouver le problème vis à vis des musiques et du Pokémon réapparaissant, ce serait le top !

Et j'ajoute à cela une petite suggestion ; je modifie de temps en temps le taux de capture de certains Pokémon, rendre par exemple un Racaillou doré plus difficile à attraper que les Racaillou normaux, si tu vois ce que je veux dire, ce serait encore plus top ! ^^

Merci d'avoir retravaillé ce script, si je trouve encore des soucis techniques, je t'en fais part.

"travaille sous PSP_0.7"

Posté par couga le 20 Avr - 12:44 (2012)
Je ne sais pas si cela compte comme un "necropost" mais, possibilité de re-up les fichiers ou bien d'en divulguer le contenue pour y appliquer les même noms de fichiers ?