Le Multi-Starter est un script rédigé par Hinola pour RPG Maker XP qui permet de proposer plusieurs positions de départ dès le lancement d’une nouvelle partie.
Au lieu d’un unique point de départ imposé, le joueur choisit comment et où commencer son aventure.
À quoi sert ce script
Le script permet notamment de :
- Créer un nombre illimité de positions de départ
- Afficher jusqu’à 6 choix visibles à l’écran (les autres restent accessibles par défilement)
- Définir pour chaque départ :
- La map de départ
- Les coordonnées X/Y
- Les personnages de départ
- Bloquer certains départs tant que des interrupteurs précis ne sont pas activés dans une sauvegarde existante
- Autoriser l’importation de l’équipe depuis une sauvegarde
- Ajuster facilement :
- Le nombre de sauvegardes prises en compte
- Le nombre maximal de starters affichés
Tout est pensé pour rester compatible avec les scripts modifiant Scene_Title, tant qu’ils utilisent command_new_game.
Configuration
La configuration se fait via des commandes simples comme :
@name→ Nom affiché dans le menu@id_map,@x_map,@y_map→ Position de départ@actors→ Personnages initiaux@switchs→ Conditions basées sur les interrupteurs@import→ Autoriser l’import d’une sauvegardeaddStarter→ Valide et ajoute le point de départ
Chaque appel à addStarter crée une nouvelle position de départ RPG Maker XP.
Exemples




Script
Script principal
#==============================================================================
# Multi-Starter
# Pour RPG Maker XP
# par Hinola
#==============================================================================
#
# VERSION : 2.0
# > Ce script fonctionne avec l'annexe 'Multi_Starter'
# > Cette partie n'est pas prévue pour être modifiée
# > Cette partie peut changer selon les versions
#
#==============================================================================
class Scene_MultiStarter
def main
@MSconfig = Starter_Manager.new
@MSconfig.setup
config = @MSconfig.getList
nbCom = config.size
@nbSave = @MSconfig.nbSave;
# si il n'y a pas de starters
# on lance directement le jeu avec les attributs de base
if nbCom < 1
new_game(-1)
# si tout est normal
else
# title
@sprite = Sprite.new
@sprite.bitmap = RPG::Cache.title($data_system.title_name)
listCom = []
@comInvalid = []
index = 0
config.each do | st |
listCom<<st[0]
# on test si la condition du swith est valable
if st[5].size > 0
if testSwitchSave(st[5]) == false
@comInvalid<<index
end
end
index += 1
end
# réglage de la hauteur de la fenêtre
max = @MSconfig.maxStarter
h = max * 32 + 32
posY = 384 - max * 32
if nbCom < max
h = nbCom * 32 + 32
posY = 384 - nbCom * 32
end
# dimensions de la fenêtre
@command_window = Window_Command.new(192, listCom)
@command_window.back_opacity = 160
@command_window.height = h
@command_window.x = 320 - @command_window.width / 2
@command_window.y = posY
# désactivation d'éléments
@comInvalid.each do | id |
@command_window.disable_item(id)
end
# graphics
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
# dispose
@command_window.dispose
@sprite.bitmap.dispose
@sprite.dispose
end
end
#test des switchs dans les sauvegardes
def testSwitchSave(tab)
for i in 0..@nbSave
saveValid = false
filename = make_filename(i)
if FileTest.exist?(filename)
file = File.open(filename, "rb")
# chargement des switchs dans une variable temporaire
temp = nil
for i in 0..3
temp = Marshal.load(file)
end
# test sur chacun des interrupteurs
saveValid = true
tab.each do | switch |
if temp[switch] == false
saveValid = false
end
end
file.close
end
if saveValid == true
return true
end
end
return false
end
# création du nom de la sauvegarde
def make_filename(file_index)
return "Save#{file_index + 1}.rxdata"
end
# update
def update
@command_window.update
# touche entrée / action
if Input.trigger?(Input::C)
#non valide
if @comInvalid.include?(@command_window.index)
$game_system_play($data_system.buzzer_se)
return
# valide
else
new_game(@command_window.index)
end
end
# touche échap / annulation
if Input.trigger?(Input::B)
$scene = Scene_Title.new
end
end
# nouvelle partie
def new_game(id)
# Play decision SE
$game_system_play($data_system.decision_se)
# Stop BGM
Audio.bgm_stop
# Reset frame count for measuring play time
Graphics.frame_count = 0
# Load games script
loadGame
st = @MSconfig.getStarter(id)
# start map and coord
$game_map.setup(st[1])
$game_player.moveto(st[2], st[3])
# setup party
if st[4].size < 1
$game_party.setup_starting_members
else
st[4][0..4].each do | idPerso |
if $game_actors[idPerso] != nil
$game_party.add_actor(idPerso)
end
end
end
# Refresh player
$game_player.refresh
# Run automatic change for BGM and BGS set with map
$game_map.autoplay
# Update map (run parallel process event)
$game_map.update
# si on import, on affiche le choix
if st[6]
$scene = Scene_ChoiceParty.new
else
$scene = Scene_Map.new
end
end
def loadGame
# Make each type of game object
$game_temp = Game_Temp.new
$game_system = Game_System.new
$game_switches = Game_Switches.new
$game_variables = Game_Variables.new
$game_self_switches = Game_SelfSwitches.new
$game_screen = Game_Screen.new
$game_actors = Game_Actors.new
$game_party = Game_Party.new
$game_troop = Game_Troop.new
$game_map = Game_Map.new
$game_player = Game_Player.new
end
end
# class de configuration
class Config_Starter
attr_reader :nbSave
attr_reader :maxStarter
def initialize
@list = []
initParameters
@nbSave = 4
@maxStarter = 6
end
def initParameters
@id_map = $data_system.start_map_id
@x_map = $data_system.start_x
@y_map = $data_system.start_y
@switchs = []
@actors = []
@name = "jeu de base"
@import = false
end
def addStarter
@list<<[@name, @id_map, @x_map, @y_map, @actors, @switchs, @import]
initParameters
end
def getStarter(id)
if id != -1
return @list[id]
else
@liste = []
addStarter
return @list[0]
end
end
def getList
return @list
end
end
# Scene_Title : commande new game
class Scene_Title
def command_new_game
$scene = Scene_MultiStarter.new
end
end
class Scene_ChoiceParty < Scene_File
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
# Remake temporary object
$game_temp = Game_Temp.new
# Timestamp selects new file
$game_temp.last_file_index = 0
latest_time = Time.at(0)
for i in 0..3
filename = make_filename(i)
if FileTest.exist?(filename)
file = File.open(filename, "r")
if file.mtime > latest_time
latest_time = file.mtime
$game_temp.last_file_index = i
end
file.close
end
end
super("Quelle équipe importer : ?")
end
#--------------------------------------------------------------------------
# * Decision Processing
#--------------------------------------------------------------------------
def on_decision(filename)
unless FileTest.exist?(filename)
$game_system_play($data_system.buzzer_se)
return
end
$game_system_play($data_system.load_se)
file = File.open(filename, "rb")
for i in 0..7
Marshal.load(file)
end
$game_party = Marshal.load(file)
for i in 0..1
Marshal.load(file)
end
$game_player.refresh
$game_party.refresh
$scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# * Cancel Processing
#--------------------------------------------------------------------------
def on_cancel
$game_system_play($data_system.cancel_se)
$scene = Scene_Title.new
end
endScript de configuration
#==============================================================================
# Multi-Starter
# Pour RPG Maker XP
# par Hinola
#==============================================================================
#
# VERSION : 1.0
# > Ce script est l'annexe de configuration du Multi-starter.
# > Cette partie est normalement prévue pour fonctionner
# quelque soit la version du script de base.
#
# Le script Multi-Starter permet la création de plusieurs points de départ.
# explications plus bas
#
#==============================================================================
class Starter_Manager < Config_Starter
def setup
# le nombre de choix affichés
# (de base 6, ils restent tout de même disponibles sur la même page)
@maxStarter = 6
# le nombre de sauvegarde maximum de votre projet
# (de base 4 si vous n'utilisez aucun script pour augmenter)
@nbSave = 4
@name = "Départ de base"
addStarter
@name = "Secondaire"
@actors = [1, 3, 5]
@switchs = [1, 2]
@import = true
addStarter
# configuration du multi starter :
# Les attributs suivants ne sont pas obligatoires.
# S’ils ne sont pas renseignés, une valeur de base les remplacera.
# addStarter Ajoutera un point de départ avec la configuration choisie.
#
# @name : le nom du starter (affiché dans le menu)
# > valeur de base : "jeu de base"
#
# @id_map : l'id de la map d'apparition
# > VDB : l'id choisi depuis le logiciel
#
# @x_map et @y_map : coordonnées x et y de départ
# > VDB : coordonnées choisies depuis le logiciel
#
# @ switchs : liste des interrupteurs requis
# > VDB : aucun interrupteur requis
# > exemple : @switchs = [1, 2] pour les deux premiers interrupteurs.
#
# @actors : tableaux des id des personnages
# > VDB : les personnages de la base de donnée
# > exemple : @actors = [1, 2] pour les deux premiers perso
#
# @import : donne le choix au joueur d'importer l'équipe d'une sauvegarde.
# > VDB : false (faux)
# > @import = true pour activer.
end
end