Pokémon Script Project Index du Forum

S’enregistrer | Rechercher | Connexion
 Information des admins 
Si vous désirez parler de PSP ou obtenir du soutient là dessus, merci d'aller faire un tour sur https://pokemonworkshop.com/forum/index.php Imbécile heureux

Copieur d'event

 
Poster un nouveau sujet   Répondre au sujet    Pokémon Script Project Index du Forum -> Game Making -> Ressources techniques -> Scripts
Sujet précédent :: Sujet suivant   
Auteur Message
Ku'rei
Membre


Inscrit le: 10 Aoû 2010
Messages: 546
Adepte du NoMoreExcuses
Localisation: Chambéry
Masculin

MessagePosté le: Mer 12 Juin - 09:04 (2013)    Sujet du message: Copieur d'event

Historique des ajout :
  • 12/06/13 - Création du sujet
  • 12/06/13 - Ajout des methodes copy_event_from_map(map_id, event_spec, x, y) et replace_event_other_copy_map(map_id, event_spec, x, y)
  • 15/06/13 - Ajout de la methodes place_list_of_prefab_event(event_info_list, event_copier = $event_copier) et de Kurei::Event_Copier.place_event_list(event_list)



Bonjour tout le monde,
ayant besoin de faire une pausa dans mon projet personnel, je reviens rapidement sur PSP. J'ai donc créer ce script permettant de copier/coller un événement depuis une map prédéfinie PENDANT le jeu par une simple commande événementielle de script. Vous vous demandez sans doute à quoi ça peut servir. Un tel script vous permettra de faire apparâitre de nouveaux événement en cours de jeu comme par exemple :
  • Apparition de Pokémon en continu,
  • Apparition de Pokémon/Dresseur prédéfinis aléatoirement,
  • ...


Je laisse le reste du travail à votre imagination.

Voici donc le script à copier/coller dans un nouveau script nommé "Event_Copier" au dessus de Main.
 

Code:
 
#=========================================================
# -- Event_Copier  --  11/06//13  --
#   Script from Ku'rei Jinwu
# CREDIT IF USED - CREDITS OBLIGATOIRES
#=========================================================
# = How to use =
#   1.  At the beginning of the game, call next
#       next script juste one time
# $event_copier = Kurei::Event_Copier.new(copy_map_id)
#       copy_map_id : index of the map where original
#                     events are
#
#      1.bis : You also can call the Interpreter method:
# create_event_copier(copy_map_id)
#
#   2a. When you want copy an event from this map
#       you have to know :
#           - its ID in the copy map
#           - coords x and y in the destination map
#       and it's simple, call the next script in your
#       event to copy an event to the current map :
# $event_copier.copy_event(event_spec, x, y)
#       event_spec : index of the event
#                    or its name
#       x, y : destination coordinates
#
#     2a.bis. Use the following script
# place_prefab_event(event_spec, x, y)
#
#
#   2b Replace event whose calling script, the following
#       script will replace the event whose calling it by the copyable
#       event.
# replace_event(event_spec)
#       event_spec : index of the event
#                    or its name
#
#==========================================================
# = Comment l'utiliser =
#   1.  Au début du jeu, appeler une fois le script
#       suivant :
# $event_copier = Event_Copier.new(copy_map_id)
#       copy_map_id : index de la map où se trouvent
#                     les events à copier
#
#      1.bis : Vous pouvez aussi appeler la méthode
# create_event_copier(copy_map_id)
#
#   2a.  Lorsque vous voudrez copier un event, vous aurez
#       besoin de :
#           - son index dans la map de copiage
#           - les coordonées x et y dans la map courante
#       puis vous pourrez simplement appeler le script
#       suivant pour copier l'event dans la map courante :
# $event_copier.copy_event(event_spec, x, y)
#       event_spec : index ou nom de l'évent à copier
#       x, y : coodonnées dans la map courante
#
#   2a.bis. Utiliser le script suivant
# place_prefab_event(event_spec, x, y)
#
#
#   2b Le script suivant remplacera l'évènement l'appelant
#       par celui portant l'id donné en paramètre et étant
#       situé sur la map de copiage
# replace_event(event_spec)
#       event_spec : index ou nom de l'évent à copier
#==========================================================
# = Known Issues / Problèmes Connus =
#  There's no known issues
#  Il n'y a aucun probleme connu
#==========================================================
module Kurei
  # Global variable for this class is $event_copier
  class Event_Copier
    attr_reader :events
   
    # Initialisation du copieur
    #  copy_map : int, index de la map où se trouve les évent copiables
    def initialize(copy_map_id)
      map = load_data(sprintf("Data/Map%03d.rxdata", copy_map_id))
     
      @events = {}
      for i in map.events.keys
        @events[i] = Game_Event.new(copy_map_id, map.events[i])
      end
    end
   
    # Retourne l'evenement de la map ayant l'id indiqueé ou NIL
    # event_id : int, index de l'event dans la map de copiage
    def get_event_by_id(event_id, events = @events)
      return events[event_id]
    end
   
    # Retroune l'évènement
    def get_event(event_spec)
      if event_spec.is_a?(Integer)
        event = get_event_by_id(event_spec)
      else
        event = get_event_by_name(event_spec)
      end
      return event
    end
   
    # Retourne l'évènement de la map dont le nom corespont ou NIL
    # event_name : string, nom de l'évènement recherché
    def get_event_by_name(event_name, events =@events)
      for e in events.values
        if e.event.name == event_name
          return e
        end
      end
      return nil
    end
   
    # Retourne un clone de l'évènement, simple
    # event : Game_Event, évènement à cloner
    def get_clone(event)
      e = event.clone
      e.event = event.event.clone
      return e
    end
     
    #=============================
    # Methodes utilisant $game_map
   
    # Copie un évènement et le calibre
    # original_event : Game_Event, évènement à copier/coller dans la map
    # x, y : int, destination de l'évènement (coordonées sur la map courante)
    # Retourne l'évent calibré
    def copy_event_and_calibrate_it(original_event, x, y)
      # Obtention d'un clone de l'event et repositionnement
      # Clone Event
      event = get_clone(original_event)
      event = calibrate_event(event, x, y)
      return event
    end
   
    # Calibre l'évènement.
    # event : Game_Event, évènement à calibrer
    # x, y : int, destination del'évènement
    def calibrate_event(event, x, y)
      #Affect new Map_id
      event.map_id = $game_map.map_id
      #Affect new ID
      id = search_new_id()
      event.id = event.event.id = id
      event.moveto(x, y)
      return event
    end
   
    # Recherche un ID valide dans la map courante
    def search_new_id()
      i = 1
      while $game_map.events.keys.include?(i)
        i+=1
      end
      return i
    end
   
    #Créer un clone complet de l'event jusqu'au bout de la structure !
    # original_event : Game_Event, event à cloner
    def get_full_clone(original_event)
      # Game_Event
      event = original_event.dup
      # RPG::Event
      event.event = original_event.event.dup
        #RPG::Event::Page
        event.event.pages = []
        for i in 0...original_event.event.pages.length
          event.event.pages.push(original_event.event.pages[i].dup)
          #RPG::Event::Page::Condition
          event.event.pages[i].condition = original_event.event.pages[i].condition.dup
          #RPG::Event::Page::Graphic
          event.event.pages[i].graphic = original_event.event.pages[i].graphic.dup
          #RPG::Event::Page::MoveRoute
          event.event.pages[i].move_route  = original_event.event.pages[i].move_route.dup
            #RPG::MoveCommand
            event.event.pages[i].move_route.list = []
            for m in 0...original_event.event.pages[i].move_route.list.length
              event.event.pages[i].move_route.list.push(original_event.event.pages[i].move_route.list[m].dup)
            end
          #RPG::EventCommand
          event.event.pages[i].list = []
          for c in 0...original_event.event.pages[i].list.length
            event.event.pages[i].list.push(original_event.event.pages[i].list[c].dup)
            #RPG::EventCommand.parameters
            event.event.pages[i].list[c].parameters = original_event.event.pages[i].list[c].parameters.dup
          end
        end
        return event
    end
   
    #====================================
    #  SYNTHESES
   
    # Copie l'évènement intégralement de la map de stockage
    # sur la map courante au coordonnées précisées
    # event_spec : int/string, signe de reconnaissance de l'evenement à copier
    def copy_event(event_spec, x, y)
      # Obtention de l'évènement
      event=get_event(event_spec)
       
      calibrated_event = copy_event_and_calibrate_it(event, x, y)   
     
      place_event(calibrated_event)
    end
   
    # Remplace l'évènement de la map dont l'id est passé en paramètre
    # event_spec : int/string, signe de reconnaissance de l'evenement à copier
    # original_event_id : int, index de l'évènement à remplacer
    def replace_event_by_another(event_spec, original_event_id)
      original_event = get_event_by_id(original_event_id, $game_map.events)
      if (event_spec.is_a?(Game_Event))
        event = event_spec
      else
        event = get_event(event_spec)
      end
     
      # Copy and calib
      calibrated_event = copy_event_and_calibrate_it(event, original_event.x, original_event.y)
      calibrated_event.id = calibrated_event.event.id = original_event.id
     
      #Remove old event (original_event)
      $game_map.events.delete(original_event.id)
      $scene.spriteset.remove_sprite_of_event(original_event)
     
      #Add new
      place_event(calibrated_event)
    end
   
    def replace_by_empty(original_event_id)
      original_event = get_event_by_id(original_event_id, $game_map.events)
      e = RPG::Event.new(original_event.x, original_event.y)
      ge = Game_Event.new($game_map.map_id, e)
      replace_event_by_another(ge, original_event_id)
    end
   
    #Place the given event on map
    def place_event(event)
      #Add new
      event.id = event.event.id = search_new_id
      $game_map.events[event.id] = event
      $scene.spriteset.add_character_sprite(event)
    end
   
    # Place all event in list after get their new id
    # event_list : List<Game_Event>, list of event
    def place_event_list(event_list)
      for event in event_list
        place_event(event)
      end
    end
  end
end #En module definition

class Game_Event < Game_Character
  attr_accessor :event  #Used to acces the RPG::Event
  attr_accessor :x      #Used to replace event on map
  attr_accessor :y      #Used to replace event on map
  attr_accessor :id     #Used to reaffect event's id
  attr_accessor :map_id #Used to add self switches
end

class Game_Map
  attr_accessor :events #Used to add dynamics event
  attr_accessor :map_id #Used to add self switches
end

class Scene_Map
  attr_accessor :spriteset  #Used to add Character_Sprite
end

class Spriteset_Map 
  # Retire le sprite correspondant au Character
  # event : Game_Event, event à retirer
  def remove_sprite_of_event(event)
    for s in @character_sprites
      if s.character == event
        s.dispose
        @character_sprites.delete(s)
      end
    end
  end
 
  # Ajoute le sprite au spriteset
  # event : Game_Event (Game_Character), event à ajouter
  def add_character_sprite(event)
    sprite = Sprite_Character.new(@viewport1, event)
    sprite.bitmap = RPG::Cache.character(event.character_name, event.character_hue)
    @character_sprites.push(sprite)
  end
end

class Game_Character
  attr_accessor :character  # Used to remove sprite
end

#===============================
# Interpreter Modifying
class Interpreter
  # Créer un Event_Copier et le place dans la variable globale $event_copier
  #   copy_map_id : int, index de la map où sont les évent copiables
  def create_event_copier(copy_map_id)
    $event_copier = Kurei::Event_Copier.new(copy_map_id)
  end
 
  # Place un évènement de la map de copiage aux coordonnées
  # Précisées dans la spec.
  # event_spec : int/string, signe de reconnaissance de l'evenement à copier
  def place_prefab_event(event_spec, x, y, event_copier = $event_copier)
    #Test l'existance d'un event_copier
    if event_copier == nil
      print("ERREUR : Event_Copier inexistant")
      return
    else
      event_copier.copy_event(event_spec, x, y)
    end
  end
 
  # Remplace l'évènement de la map dont l'id est passé en paramètre
  # event_spec : int/string, signe de reconnaissance de l'evenement à copier
  def replace_event(event_spec, event_copier = $event_copier)
    #Test l'existance d'un event_copier
    if event_copier == nil
      print("ERREUR : Event_Copier inexistant")
      return
    else
      event_copier.replace_event_by_another(event_spec, @event_id)
    end
  end
 
  # Copy and paste all events of the list
  # event_info_list : List<int[3]> or List<[string, int, int]>,
  #                   is a list of [event_spec, x, y]
  def place_list_of_prefab_event(event_info_list, event_copier = $event_copier)
    for info in event_info_list
      place_prefab_event(info[0], info[1], info[2], event_copier)
    end
  end
end




UTILISATION


Initialisation

Au début du jeu, appeler le code suivant :
Code:
create_event_copier(copy_map_id)

Où copy_map_id est l'id de la map où se trouve les évènements que vous voulez copier

Copie d'un évent
Pour copier un événement de la map de copiage il vous faut connaître :
  • Son ID dans la map de copiage ou son nom s'il est unique -> event_spec

[*]Ses coordonnées dans la map courante (celle que vous voulez) -> x, y

Il vous suffira d'appeler le code suivant dans l'évènement lançant le copiage
Code:
place_prefab_event(event_spec, x, y)


Remplacement d'un event
Pour remplacer un event, vous devez connaitre le nom ou l'id de l'event qui va être copié. Et insérer le code suivant dans l'event à remplacer
Code:
replace_event(event_spec)


MAP DE COPIAGE


La map de copiage est une banque d'évènement, elle n'est en aucun cas accessible au joueur. Il vous faudra simplement son ID pour faire fonctionner le script.

VIDEO


Voici une petite vidéo présentant le script. Il n'y a pas l'utilisation du script pour les ROC, ou autres chose mais je la pense déjà compléte.
VIDEO DISPONIBLE ICI
Les membres suivants remercient Ku'rei pour ce message :
Nuri Yuri (12/06/13), bamoisoloman (12/06/13)


Dernière édition par Ku'rei le Dim 16 Juin - 07:22 (2013); édité 5 fois
Revenir en haut
Publicité






MessagePosté le: Mer 12 Juin - 09:04 (2013)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Mer 12 Juin - 12:56 (2013)    Sujet du message: Copieur d'event

Intéressant de voir une autre version d'un script que j'avais codé par le passé x) (lien)
Y'a plein de bonnes choses mais c'est un peu dommage que dans le fonctionnement général (via l'interpreter) on soit limité à une seule MAP :B
Revenir en haut
Facebook Twitter
Ku'rei
Membre


Inscrit le: 10 Aoû 2010
Messages: 546
Adepte du NoMoreExcuses
Localisation: Chambéry
Masculin

MessagePosté le: Mer 12 Juin - 21:30 (2013)    Sujet du message: Copieur d'event

Merci, c'est bizarre que je n'ai pas trouvé ton script en cherchant s'il existait ...
En ajoutant :
Code:

class Interpreter
  def copy_event_from_map(map_id, event_spec, x, y)
    old_copier = $event_copier
    $event_copier = Event_Copier.new(map_id)

    place_prefab_event(event_spec, x, y)

    $event_copier = old_copier
  end

  def replace_event_other_copy_map(map_id, event_spec, x, y)
    old_copier = $event_copier
    $event_copier = Event_Copier.new(map_id)

    replace_event(event_spec)

    $event_copier = old_copier
  end
end


Tu peux copier depuis n'importe quelle autre map.

Je pensais utiliser une seule map pour gérer les event de Pokemon de map et remplacer les rencontres aléatoire de base par une présence concrete des pokémon sur la map.
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Jeu 13 Juin - 12:45 (2013)    Sujet du message: Copieur d'event

C'est faisable après en fonction des personnes c'est plus ou moins gérable x)
Enfin bref, c'est un bon script quand même Gros matou qui ronronne
Revenir en haut
Facebook Twitter
Ku'rei
Membre


Inscrit le: 10 Aoû 2010
Messages: 546
Adepte du NoMoreExcuses
Localisation: Chambéry
Masculin

MessagePosté le: Jeu 13 Juin - 13:25 (2013)    Sujet du message: Copieur d'event

En fonction des personnes ? Je ne comprend pas, tu parle des projets dont les scripts sont déjà modifiés ?
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Jeu 13 Juin - 17:30 (2013)    Sujet du message: Copieur d'event

Non, certains arrive à supporter des maps remplies d'évent et d'autres ont besoins d'une organisation claire (genre une Map Pokémons Une Map Dresseurs Une Map pour les PNJ du centre etc...) :B
Ton script ne devrait poser aucuns problèmes je pense.
Revenir en haut
Facebook Twitter
Ku'rei
Membre


Inscrit le: 10 Aoû 2010
Messages: 546
Adepte du NoMoreExcuses
Localisation: Chambéry
Masculin

MessagePosté le: Sam 15 Juin - 07:24 (2013)    Sujet du message: Copieur d'event

Je vois le problème, je crois qu'un petit Dictionnary<string, Event_Copier> pour gérer les map de copies personnelles. Ca marche facilement comme ça !

Petite news, le script d'apparition des pkm sur la map est presque terminé, plus qu'à traiter les tag_terrains.

EDIT_VISIBLE :: Miseà jour prête
Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 16:57 (2017)    Sujet du message: Copieur d'event

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Pokémon Script Project Index du Forum -> Game Making -> Ressources techniques -> Scripts Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  

Index | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Thème par Thomas et l'équipe de la refonte PSP 2012 (version 1.0)
Traduction par : phpBB-fr.com