- HinolaModérateur
- Nombre de messages : 969
Age : 31
Distinction : Gagnant invaincu à ce jour de tous les concours de mapping de ce forum fait par Coco'
[Coco' ]
Grande figure du Mapping Show .
Grand admirateur de notre mascotte Vehyxine
STI Haruhiste like me [Hamu' ]
et fier de l'être ! [bibi ^^]
Un fier Homme du désert sans foi ni loi è_é [:3]
Date d'inscription : 21/05/2009
Voyage rapide
Mer 22 Mai 2019 - 10:47
Salut salut
Sur demande, j'ai créé un système de voyage rapide (qui peu d'ailleurs faire office d'autre chose)
Fonctionnement :
Utilisation :
Configuration :
Evenement commun :
Scripts :
Voila voila
Si vous avez des suggestions, retours, bugs, n'hésitez pas bien entendu.
Sur demande, j'ai créé un système de voyage rapide (qui peu d'ailleurs faire office d'autre chose)
Fonctionnement :
- Liste des fonctions:
Gestion de contenu
- Ajout de royaume (identifiant, nom)
- Ajout de lieu (identifiant, nom, royaume, map, x, y, visible, actif, connu)
Modification de lieux en fonction de leur identifiant :
- activer
- désactiver
- montrer
- cacher
- connaitre
- oublier
accéder aux valeurs :
- map du lieu choisi via le menu
- coord. x du lieu choisi
- coord. y du lieu choisi
Possibilités supplémentaires :
- simuler la selection d'un lieu en dehors du menu
Affichage du menu :
- si aucun royaume n'est défini
- 1 colonne
- 2 colonnes
- 3 colonnes avec défilement latéral- Captures d'écran
Le système fonctionne par royaumes et lieux :
Un royaume rassemble plusieurs lieux, chacun pouvant être accessible via ce menu.
Ces lieux peuvent être ajoutés au fil du jeu, être inaccessibles, cachés, ou de dénomination inconnue.
La sélection d'un lieu entraine l'appel d'un événement commun, que vous pouvez customiser à souhait.
Utilisation :
- Appeler le menu
Pour appeler le menu, dans un événement utilisez la commande "appel de script" pour y écrire cette ligne :
- Code:
open_travel_menu
- Ajouter un royaume
L'ajout d'un royaume se fait également par ligne de commande :
- Code:
FT.add_realm(id: ID_UNIQUE, name: NOM_DU_ROYAUME)
exemple :
FT.add_realm(id: 1, name: "France")
id: ID_UNIQUE
Donnez ici un identifiant (1, 2, 3 ...) à votre royaume
Cet identifiant est unique, et servira à modifier le royaume par la suite.
name: NOM_DU_ROYAUME
Le nom qui sera affiché en haut de la liste des lieux. - Ajouter un lieu
L'ajout d'un royaume se fait également par ligne de commande :
- Code:
FT.add_location(id: ID_UNIQUE, name: NOM_DU_LIEU, realm: ID_DU_ROYAUME, map: ID_DE_LA_MAP, x: COORD_X, y: COORD_Y, [options])
exemple :
FT.add_location(id: 1, name: "Paris", realm: 1, map: 5, x: 10, y: 10, active: false)
id: ID_UNIQUE
Donnez ici un identifiant (1, 2, 3 ...) à votre lieu
Cet identifiant est unique, et servira à modifier le lieu par la suite.
name: NOM_DU_LIEU
Le nom affiché du lieu dans la liste
realm: ID_DU_ROYAUME
L'identifiant du royaume au quel est rattaché le lieu
map: ID_DE_LA_MAP, x: COORD_X, y: COORD_Y
L'identifiant de la map, et les coordonnées pour la téléportation
Options :
visible: true/false
Si "true" ou rien, le nom du lieu sera affiché dans la liste des lieux du royaume.
Si "false", le nom ne sera pas affiché.
active: true/false
Si "true", le choix du lieu sera faisable.
Si "false" ou rien, le nom sera grisé et le choix ne pourra être validé.
named: true/false
Si "true", le nom du lieu sera remplacé par un autre texte (voir plus bas).
Si "false" ou rien, le nom sera affiché normalement. - Modifier un lieu
Les lieux sont modifiables pour leurs options d'affichage via les lignes de commandes suivantes :
- Code:
FT.activate(id)
FT.deactivate(id)
FT.show(id)
FT.hide(id)
FT.know(id)
FT.unknow(id)
Active ou désactive un lieu (le nom sera grisé et le choix impossible)
FT.show/FT.hide
Rend visible ou non un lieu (le nom ne sera pas affiché)
FT.know/FT.unknow
Le nom du lieu sera remplacé ou non par un texte défini - Simuler la sélection d'un lieu
Il est possible de simuler la sélection d'un lieu d'une ligne de commande :
- Code:
FT.select_location(id)
exemple :
FT.select_location(1)
L'événement commun sera appelé. - Récupérer des informations
Il est possible de récupérer les informations du lieu selectionné : map, coordonnées, et nom
- Code:
FT.location_map
FT.location_x
FT.location_y
FT.location_name
Pour rappel, il est possible de stocker du texte dans les variables.
Par exemple pour afficher le nom du lieu dans une fenêtre de dialogue.
(voir plus bas)
Configuration :
- Modifier les textes du menu
La modification se fait dans le module Vocab intégré au script :
- Code:
module Vocab
FT_Title = "Voyage rapide"
FT_Unknow = "(Inconnu)"
FT_NoRealm = "Aucun royaume n'a été découvert."
end
Titre du menu de voyage rapide, s'affiche en haut de la fenêtre
FT_Unknow
Nom de remplacement des lieux inconnus, se remplace automatiquement si l'option "named" est "false"
FT_NoRealm
Texte si aucun royaume n'est découvert, s'affiche dans une fenêtre sous le titre. - Modifier le fonctionnement
- Code:
module FT
def self.common_event
return 4
end
def self.initialize
add_realm(id:1, name:"France")
add_location(id:1, name:"Paris", realm:1, map:1, x:9, y:7, active:true)
add_location(id:2, name:"Lion", realm:1, map:2, x:9, y:7, named:false)
end
end
Identifiant de l'événement commun appelé par la sélection d'un lieu. (dans cet exemple, 4)
Si le nombre est inférieur à 1, aucun événement n'est appelé, pour une variante possible
self.initialize
Commandes appelées automatiquement à la création d'une nouvelle partie
Notez qu'il n'est pas nécessaire ici de commencer les commandes par "FT."
Pour des tests sur une partie existante, la commande "FT.initialize" peut être appelée dans un événement.
Evenement commun :
- Exemple
Voila un exemple d'évenement commun pouvant être appelé :
On utilise la commande de téléportation du logiciel, reglé via des variables pour l'id de la map, la position X et la position Y.
Ces variables sont modifiées via les lignes de commande vues plus haut.
La variable 9 ici stock le nom du lieu (donc un texte) et est affiché dans le message de confirmation via le code \V[9]
Pour rappel, FT.location_name retourne le vrai nom du lieu, qu'il soit connu ou non. - Variante
Rappelez vous, on peu configurer le système pour ne pas appeler d'événement commun.
Mais pourquoi ?
Voici un second exemple d'utilisation avec la configuration suivante
- Code:
def self.common_event
return 0
end
Ici on appel un événement commun via un événement, et on execute notre voyage juste après.
Comme si le menu n'était qu'un choix dans un dialogue.
Scripts :
Le script se trouve dans le message suivant.
Voila voila
Si vous avez des suggestions, retours, bugs, n'hésitez pas bien entendu.
- HinolaModérateur
- Nombre de messages : 969
Age : 31
Distinction : Gagnant invaincu à ce jour de tous les concours de mapping de ce forum fait par Coco'
[Coco' ]
Grande figure du Mapping Show .
Grand admirateur de notre mascotte Vehyxine
STI Haruhiste like me [Hamu' ]
et fier de l'être ! [bibi ^^]
Un fier Homme du désert sans foi ni loi è_é [:3]
Date d'inscription : 21/05/2009
Re: Voyage rapide
Mer 22 Mai 2019 - 10:48
- Code:
module Vocab
# Titre du menu de voyage rapide
FT_Title = "Voyage rapide"
# Nom de remplacement des lieux inconnus
FT_Unknow = "(Inconnu)"
# Texte si aucun royaume n'est découvert
FT_NoRealm = "Aucun royaume n'a été découvert."
end
module FT
#--------------------------------------------------------------------------
# * Common event to call
#--------------------------------------------------------------------------
def self.common_event
return 0
end
#--------------------------------------------------------------------------
# * Commandes to start a new game
#--------------------------------------------------------------------------
def self.initialize
add_realm(id:1, name:"France")
add_location(id:1, name:"Paris", realm:1, map:1, x:9, y:7, active:true)
add_location(id:2, name:"Lion", realm:1, map:2, x:9, y:7, named:false)
end
end
#==============================================================================
# ** Game_FastTravel
#------------------------------------------------------------------------------
# Main part of the fast travel system
#==============================================================================
class Game_FastTravel
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :realms
attr_reader :locations
attr_reader :selection
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
@realms = []
@locations = []
@selection = nil
end
#--------------------------------------------------------------------------
# * Return a realm with its index
#--------------------------------------------------------------------------
def realm(index)
return nil unless @realms[index]
@realms[index]
end
#--------------------------------------------------------------------------
# * Return a location with its index
#--------------------------------------------------------------------------
def location(index)
return nil unless @locations[index]
@locations[index]
end
#--------------------------------------------------------------------------
# * Select a location and call common event
#--------------------------------------------------------------------------
def select(id)
@selection = @locations[id] || nil
$game_temp.reserve_common_event(FT.common_event) if FT.common_event > 0
end
#--------------------------------------------------------------------------
# * Set selection to no location
#--------------------------------------------------------------------------
def set_initial
@selection = nil
end
#--------------------------------------------------------------------------
# * Add a realm to the list
#--------------------------------------------------------------------------
def add_realm(realm)
id = realm.id
@realms[id] = realm
puts "realm #{id} : \"#{realm.name}\" added"
end
#--------------------------------------------------------------------------
# * Add a location to the list and in the realm
#--------------------------------------------------------------------------
def add_location(location)
id = location.id
realm = location.realm
@locations[id] = location
@realms[realm].add_location(location) if @realms[realm]
puts "location #{id} : \"#{location.name}\" added in realm #{realm}"
end
end
#==============================================================================
# ** Data_structures
#------------------------------------------------------------------------------
#
#==============================================================================
module RPG
module FastTravel
#==============================================================================
# ** Realm
#------------------------------------------------------------------------------
# Define realms, ids, names and locations list.
#==============================================================================
class Realm
attr_accessor :id
attr_accessor :name
attr_accessor :locations
def initialize(id, name)
@id = id
@name = name
@locations = []
end
def add_location(location)
@locations.push(location)
end
end
#==============================================================================
# ** Location
#------------------------------------------------------------------------------
# Define locations, ids, names, teleports, and display options
#==============================================================================
class Location
attr_accessor :id
attr_accessor :name
attr_accessor :realm
attr_accessor :map
attr_accessor :x
attr_accessor :y
attr_accessor :visible
attr_accessor :active
attr_accessor :named
def initialize(id, name, realm, map, x, y, visible, active, named)
@id = id
@name = name
@realm = realm
@map = map
@x = x
@y = y
@visible = visible
@active = active
@named = named
end
def activate; @active=true; end
def deactivate; @active=false; end
def show; @visible=true; end
def hide; @visible=false; end
def know; @named=true; end
def unknow; @named=false; end
end
end
end
#==============================================================================
# ** Scene_Travel
#------------------------------------------------------------------------------
# This class performs the fast travel screen processing.
#==============================================================================
class Scene_Travel < Scene_Base
def start
super
$game_fast_travel.set_initial
create_item_list
create_background
create_realms_viewport
create_title_window
create_realms_windows
end
#--------------------------------------------------------------------------
# * Get Number of Items
#--------------------------------------------------------------------------
def item_max
@realms.size
end
#--------------------------------------------------------------------------
# * Get Number of Save Files to Show on Screen
#--------------------------------------------------------------------------
def visible_max
return 3
end
#--------------------------------------------------------------------------
# * Get Max width of each realms
#--------------------------------------------------------------------------
def max_realm_width
Graphics.width / visible_max
end
#--------------------------------------------------------------------------
# * Select base of realms and locations
#--------------------------------------------------------------------------
def create_item_list
@realms = $game_fast_travel.realms.compact
end
#--------------------------------------------------------------------------
# * Create title
#--------------------------------------------------------------------------
def create_title_window
@title_window = Window_Camp_Title.new
end
#--------------------------------------------------------------------------
# * Create viewport
#--------------------------------------------------------------------------
def create_realms_viewport
@realms_viewport = Viewport.new(0,48,Graphics.width, Graphics.height-48)
end
#--------------------------------------------------------------------------
# * Create windows
#--------------------------------------------------------------------------
def create_realms_windows
@index = 0
@left_index = @index
@windows_list = []
@windows_title_list = []
return create_no_realm_window if @realms.empty?
@realms.each_with_index do |r,k|
@windows_title_list[k] = Window_Realm_name.new(k, r.name, item_max)
@windows_list[k] = Window_Realm.new(k, r.locations, item_max)
@windows_title_list[k].viewport = @realms_viewport
@windows_list[k].viewport = @realms_viewport
end
@windows_list[@index].activate
@windows_list[@index].index = 0
end
#--------------------------------------------------------------------------
# * Create window to inform player no realm have been found
#--------------------------------------------------------------------------
def create_no_realm_window
@window_error = Window_No_Realm.new
end
#--------------------------------------------------------------------------
# * Create Background
#--------------------------------------------------------------------------
def create_background
@background_sprite = Sprite.new
@background_sprite.bitmap = SceneManager.background_bitmap
@background_sprite.color.set(16, 16, 16, 128)
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
@windows_list.each {|win| win.update}
update_selection
update_cursor
end
#--------------------------------------------------------------------------
# * Update Cursor
#--------------------------------------------------------------------------
def update_cursor
last_index = @index
cursor_right if Input.trigger?(:RIGHT) && !@realms.empty?
cursor_left if Input.trigger?(:LEFT) && !@realms.empty?
if @index != last_index
Sound.play_cursor
@windows_list[last_index].deactivate
@windows_list[@index].activate
@windows_list[@index].index = [@windows_list[last_index].index,
@windows_list[@index].item_max-1].min
@windows_list[last_index].index = -1
end
end
#--------------------------------------------------------------------------
# * Update Realm Selection
#--------------------------------------------------------------------------
def update_selection
on_cancel if Input.trigger?(:B)
on_selection if Input.trigger?(:C)
end
#--------------------------------------------------------------------------
# * Select location
#--------------------------------------------------------------------------
def on_selection
return on_cancel if @realms.empty?
location = @windows_list[@index].selected_location
if location.active
Sound.play_ok
$game_fast_travel.select(location.id)
scene_return
else
Sound.play_buzzer
end
end
#--------------------------------------------------------------------------
# * Cancel menu
#--------------------------------------------------------------------------
def on_cancel
Sound.play_cancel
scene_return
end
#--------------------------------------------------------------------------
# * Go back to map/menu
#--------------------------------------------------------------------------
def scene_return
SceneManager.return
end
#--------------------------------------------------------------------------
# * Move Cursor Right
#--------------------------------------------------------------------------
def cursor_right()
@index = (@index + 1) % item_max
ensure_cursor_visible
end
#--------------------------------------------------------------------------
# * Move Cursor Left
#--------------------------------------------------------------------------
def cursor_left()
@index = (@index - 1 + item_max) % item_max
ensure_cursor_visible
end
#--------------------------------------------------------------------------
# * Scroll Cursor to Position Within Screen
#--------------------------------------------------------------------------
def ensure_cursor_visible
@left_index = @index-2 if @index > @left_index + visible_max-1
@left_index = @index if @index < @left_index
@realms_viewport.ox = @left_index * max_realm_width
end
#--------------------------------------------------------------------------
# * Termination Processing
#--------------------------------------------------------------------------
def terminate
super
dispose_background
@windows_list.each {|win| win.dispose}
@windows_title_list.each {|win| win.dispose}
@window_error.dispose if @window_error
dispose_realms_viewport
end
#--------------------------------------------------------------------------
# * Free Background
#--------------------------------------------------------------------------
def dispose_background
@background_sprite.dispose
end
#--------------------------------------------------------------------------
# * Free viewport
#--------------------------------------------------------------------------
def dispose_realms_viewport
@realms_viewport.dispose
end
end
#==============================================================================
# ** Window_Camp_Title
#------------------------------------------------------------------------------
# Top window of the fast travel scen, display the title (Vocab)
#==============================================================================
class Window_Camp_Title < Window_Base
def initialize
super(0,0,Graphics.width, 48)
@text = Vocab::FT_Title
refresh
end
def refresh
contents.clear
draw_text(0, 0, width, 24, @text, 1)
end
end
#==============================================================================
# ** Window_No_Realm
#------------------------------------------------------------------------------
# Error window in case no realms have been discovered
#==============================================================================
class Window_No_Realm < Window_Base
def initialize
super(0,48,Graphics.width, 48)
@text = Vocab::FT_NoRealm
refresh
end
def refresh
contents.clear
draw_text(0, 0, width, 24, @text, 1)
end
end
#==============================================================================
# ** Window_Realm_name
#------------------------------------------------------------------------------
# Name of each realms on top of the selection window
#==============================================================================
class Window_Realm_name < Window_Base
def initialize(index, name, nb)
width = Graphics.width/[nb, 3].min
height = 48
x = width * index
super(x, 0, width, height)
@text = name
refresh
end
def refresh
contents.clear
draw_text(0, 0, width, 24, @text)
end
end
#==============================================================================
# ** Window_Realm
#------------------------------------------------------------------------------
# Location selection window, for each realms
#==============================================================================
class Window_Realm < Window_Selectable
def initialize(index, data, nb)
width = Graphics.width/[nb, 3].min
height = Graphics.height - 96
x = width * index
super(x, 48, width, height)
create_item_list(data)
refresh
end
#--------------------------------------------------------------------------
# * Get Number of Items
#--------------------------------------------------------------------------
def item_max
@data ? @data.size : 1
end
#--------------------------------------------------------------------------
# * Get Number of Items
#--------------------------------------------------------------------------
def selected_location
@data[@index]
end
#--------------------------------------------------------------------------
# * Create name list
#--------------------------------------------------------------------------
def create_item_list(data)
@data = data.select{|d| d.visible}
end
#--------------------------------------------------------------------------
# * Draw Item
#--------------------------------------------------------------------------
def draw_item(index)
name = (@data[index].named)? @data[index].name : Vocab::FT_Unknow
change_color(normal_color, @data[index].active)
draw_text(item_rect_for_text(index), name)
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
create_contents
draw_all_items
end
end
#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
# An interpreter for executing event commands. This class is used within the
# Game_Map, Game_Troop, and Game_Event classes.
#==============================================================================
class Game_Interpreter
def open_travel_menu
SceneManager.call(Scene_Travel)
Fiber.yield while SceneManager.scene_is?(Scene_Travel)
end
end
#==============================================================================
# ** FT
#------------------------------------------------------------------------------
# Module used to call fast travel commands
#==============================================================================
module FT
class << self
def get(id); $game_fast_travel.location(id); end
def boolean_default(test, default); (test.nil?)? default : test; end
#--------------------------------------------------------------------------
# * Add a new realm
#--------------------------------------------------------------------------
def add_realm(hash)
realm = RPG::FastTravel::Realm.new(hash[:id], hash[:name])
$game_fast_travel.add_realm(realm)
end
#--------------------------------------------------------------------------
# * Add a new location
#--------------------------------------------------------------------------
def add_location(hash)
loc = RPG::FastTravel::Location.new(
hash[:id] || 0,
hash[:name] || Game_FastTravel::unknow_name,
hash[:realm] || 0,
hash[:map] || $data_system.start_map_id,
hash[:x] || $data_system.start_x,
hash[:y] || $data_system.start_y,
boolean_default(hash[:visible],true),
boolean_default(hash[:active],false),
boolean_default(hash[:named],true))
$game_fast_travel.add_location(loc)
end
#--------------------------------------------------------------------------
# * Simulate location selection
#--------------------------------------------------------------------------
def select_location(id)
$game_fast_travel.select(id)
end
#--------------------------------------------------------------------------
# * Get selected location map
#--------------------------------------------------------------------------
def location_map
return 0 unless select = $game_fast_travel.selection
select.map
end
#--------------------------------------------------------------------------
# * Get selected location x coordonate
#--------------------------------------------------------------------------
def location_x
return 0 unless select = $game_fast_travel.selection
select.x
end
#--------------------------------------------------------------------------
# * Get selected location y coordonate
#--------------------------------------------------------------------------
def location_y
return 0 unless select = $game_fast_travel.selection
select.y
end
#--------------------------------------------------------------------------
# * Get selected location true name
#--------------------------------------------------------------------------
def location_name
return 0 unless select = $game_fast_travel.selection
select.name
end
#--------------------------------------------------------------------------
# * Set location options
#--------------------------------------------------------------------------
def activate(id); (l = get(id))? l.activate : -1; end
def deactivate(id); (l = get(id))? l.deactivate : -1; end
def show(id); (l = get(id))? l.show : -1; end
def hide(id); (l = get(id))? l.hide : -1; end
def know(id); (l = get(id))? l.know : -1; end
def unknow(id); (l = get(id))? l.unknow : -1; end
end
end
#==============================================================================
# ** DataManager
#------------------------------------------------------------------------------
# Patch save and load methods to include fast travel
#==============================================================================
module DataManager
class << self
#--------------------------------------------------------------------------
# * Create Game Objects
#--------------------------------------------------------------------------
alias_method :ft_create_game_objects, :create_game_objects
def create_game_objects
ft_create_game_objects
$game_fast_travel = Game_FastTravel.new
end
#--------------------------------------------------------------------------
# * Create Save Contents
#--------------------------------------------------------------------------
alias_method :ft_make_save_contents, :make_save_contents
def make_save_contents
contents = ft_make_save_contents
contents[:fast_travel] = $game_fast_travel
contents
end
#--------------------------------------------------------------------------
# * Extract Save Contents
#--------------------------------------------------------------------------
alias_method :ft_extract_save_contents, :extract_save_contents
def extract_save_contents(contents)
ft_extract_save_contents(contents)
if contents[:fast_travel]
$game_fast_travel = contents[:fast_travel]
else
$game_fast_travel = Game_FastTravel.new
end
end
#--------------------------------------------------------------------------
# * Set Up New Game
#--------------------------------------------------------------------------
alias_method :ft_setup_new_game, :setup_new_game
def setup_new_game
ft_setup_new_game
FT.initialize
end
end
end
- ÉlogioMembre
- Nombre de messages : 467
Localisation : Discord
Distinction : Vainqueurs Quicker I - Saison 2 [Amal']
Blagueur un peu nul mais on l'aime bien quand même [Yama']
Élologigio, un taquin qu'on aime bien taquiner [:3]
Poisson 2018 [Amal']
Duo comique du fofo' de 2017 à aujourd'hui feat Symphotang :v (mais on aime qd même <3) [:3]
Directeur du zoo sur le thème des rats [Yama]
Date d'inscription : 12/02/2017
Re: Voyage rapide
Ven 24 Mai 2019 - 19:02
Je n'ai pas vraiment l'occasion de tester ça...
Par contre sur papier c'est vraiment génial! Je ne connais pas d'équivalent, typiquement le genre de scripts qui finira dans beaucoup de projets!
Par contre sur papier c'est vraiment génial! Je ne connais pas d'équivalent, typiquement le genre de scripts qui finira dans beaucoup de projets!
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum