#=======================================================================
# ■ Scene permettant d'effectuer un choix entre plusieurs réponses possible.
# ■ Scene_choix + Window_choix v1.0 par Krazplay
#=======================================================================
# Ecrit par Krazplay, version la plus à jour disponible sur le forum du site rpgmakerxp.free.fr
# Nécessite : le scrîpt Scene_choix fesant office de base de donnée.
#--------------------------------------------------------------
# Descrïption :
# La commande "Effectuer un choix" dans l'éditeur d'évènements ne permet de choisir qu'entre
# 4 possibilitées différentes, et de plus chacun de ses choix doivent respecter une limite de
# caractères, ce scrîpt propose une alternative à cette commande, il permet de faire jusqu'à
# 12 choix différents, et de proposer un choix tenant sur plus d'une ligne.
#--------------------------------------------------------------
# Caractéristiques :
# - Jusqu'à 12 choix possibles.
# - L'ensemble de tout les choix ne doivent pas dépasser 14 lignes.
# - La hauteur de la fenêtre dépend du nombre de lignes utilisées, la fenêtre est
# automatiquement centrée.
# - Le retour à la ligne si le choix est trop long est fait automatiquement
#--------------------------------------------------------------
# Utilisation :
# Simple, dans votre évènement, insérer la ligne de scrîpt suivante :
# $scene = Scene_choix.new(sav)
# Suivi imédiatement d'un "Afficher un message" avec rien dedans, ce message ne s'affichera
# pas, il sera "mangé" par le scrîpt, si vous ne le faites pas, il n'est pas certain que le prochain
# message s'affiche.
# La variable sav correspond au choix qui seront affichés, pour cela regarder à quoi cela
# correspond dans le scrîpt de base de donnée, le nombre sav ne doit jamais être égal à 0
# si vous souhaitez tirer les choix de votre scrîpt de base de donnée.
#
# Pour les résultats, c'est simple, il suffit de mettre une condition, choisir scrîpt, puis mettre :
# @resu == (chiffre allant de 1 à 12)
# Le chiffre étant le choix selectionné par le joueur (s'il sélectionne le premier choix, @resu est
# égal à 1.
#--------------------------------------------------------------
# Supplément :
# Néanmoins vous n'êtes pas obligé d'utiliser le scrîpt de base de donnée, dans ce cas-là,
# utiliser cette ligne :
# $scene = Scene_choix.new(0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)
# Sachant que c1 à c12 sont les choix, et qu'ils ne sont pas tous obligatoires, exemple :
# c1 = "Je vais bien"
# c2 = "Je vais mal"
# c3 = "Je ne te dirai rien"
# Scene_choix.new(0, c1, c2, c3)
# Cela marchera parfaitement, le problème est que dans la commande "Insérez un scrîpt"
# de l'éditeur de l'évènement, lorsque vous arrivez en bout de ligne vous êtes renvoyés à la
# ligne, ce qui risque de donner une erreur, pour pouvoir mettre un long choix il faut alors faire :
# c1part1 = "Moi je vais très bien merci, mais je me demandais"
# c1part2 = " si toi tu allais bien car la pizza que je t'ai donné hier"
# c1part3 = " était périmé depuis trois mois."
# c1 = c1part1 + c1part2 + c1part3
# Ce qui est extrêmement pénible.
#--------------------------------------------------------------
# Supplément 2 :
# Si vous prenez les choix de votre base de donnée, vous pouvez tout de même en ajouter
# manuellement dans l'éditeur d'évènement. Imaginons que dans votre base de donnée
# le nombre 1 correspond à 4 choix, en écrivant cela :
# c5 = "Exemple d'un choix ajouté manuellement"
# $scene = Scene_choix.new(1,nil,nil,nil,nil,c5)
# Vous ajoutez un 5ème choix, que vous pouvez par exemple ne faire apparaitre que sous
# certaines conditions.
#=======================================================================
class Scene_choix
# c1,c2,c3 etc = choix entrés par l'utilisateur lorsqu'il a appellé cette scène.
def initialize(sav,c1=nil,c2=nil,c3=nil,c4=nil,c5=nil,c6=nil,c7=nil,c8=nil,c9=nil,c10=nil,c11=nil,c12=nil)
if sav > 0 # Si sav est à zéro, cela veut dire qu'on ne consulte pas la database,
voir_ds_data(sav) # sinon on tire les choix de la database.
choix_sup = [c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12] # On garde qd même les choix entrés par l'utilisateur.
for i in 0...12
if @choix[i] == nil and choix_sup[i] != nil # Si dans la database un choix est nul alors qu'il existe dans les entrés de l'utilisateur,
@choix[i] = choix_sup[i] # Ce choix nul devient celui entré.
end
end
else
@choix = [c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12] # On fait un tableau contenant tout les choix.
end
@ligne = []
@choix.compact! # On élimine tout les choix nuls
for i in
0...@choix.size @ligne[i] = 1 # On considère pour le moment que tt les choix s'écrivent sur une ligne.
end
vérif_long # Cette méthode va gérer le nombre de lignes qu'à besoin chacun des choix.
end
def main
@wind = Window_choix.new(@choix, @ligne) # On crée la fenêtre
loop do # La boucle standarte commune à quasiment tout les scrïpts.
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@wind.dispose # Si la boucle s'est brisée on efface la fenêtre.
end
def update
@wind.update
if Input.trigger?(Input::B) # En cas d'annulation (pas encore utilisé)
end
if Input.trigger?(Input::C) # En cas de confirmation
$game_system.map_interpreter.resu_choix(@wind.index+1)
$scene = Scene_Map.new
end
end
def vérif_long
@long_max = 55
for i in
0...@choix.size # Pour chacun des choix, si celui-ci possède un nombre
if @choix[i].size > @long_max # de caractère supérieur à @long_max, on va le passer
découp_en_lignes(@choix[i],i) # à la méthode qui va la couper en plusieurs lignes.
end
end
end
end
def découp_en_lignes(texte,num) # Cette méthode découpe un choix trop long en plusieurs
@choix[num] = [] # morceaux, et stocke le nombre de lignes que le choix
rep = 0 # possède dans la variable @ligne.
loop do
if texte.size > 55 and not texte.size < 65
for i in 56..64
if texte[i] == 32 #32 = code de l'espace
break
end
end
@ligne[num] += 1
@choix[num][rep] = texte[0...i]
rep += 1
@choix[num][rep] = texte[(i+1)...texte.size]
texte = @choix[num][rep]
else
break
end
end
end
class Scene_Map
def main
@spriteset = Spriteset_Map.new
@message_window = Window_Message.new
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
if not $scene.is_a?(Scene_choix) # Evite d'effacer l'arrière-plan si la nouvelle scene
Graphics.freeze # est une Scene_choix
@spriteset.dispose
end
@message_window.dispose
if $scene.is_a?(Scene_Title)
Graphics.transition
Graphics.freeze
end
end
end
class Interpreter
def resu_choix(choix) # Sert à mettre le résultat dans la variable @resu de la class Interpreter,
@resu = choix # ce qui permet d'utiliser cette variable dans l'éditeur d'évènement.
end
end
class Window_choix < Window_Selectable
def initialize(choix, ligne)
@choix = choix
@ligne = ligne
@width = 640
@height = 0
for i in
0...@ligne.size @height += @ligne[i] * 32
end
@height += 32
@height = 480 if @height > 480
y = (480 - @height) / 2
super(0, y, @width, @height)
@column_max = 1
@item_max = @choix.size
self.opacity = 180
refresh
self.index = 0
end
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
self.contents = Bitmap.new(@width - 32, @height-32)
self.contents.font.name = $fontface
self.contents.font.size = $fontsize
u = -32
for i in
0...@choix.size for n in 0...@ligne[i]
u += 32
if @ligne[i] >1
self.contents.draw_text(0, u, @width - 32, 32,@choix[i][n])
else
self.contents.draw_text(0, u, @width - 32, 32,@choix[i])
end
end
end
end
def update_cursor_rect
if @index < 0
self.cursor_rect.empty
return
end
row = @index / @column_max
if row < self.top_row
self.top_row = row
end
if row > self.top_row + (self.page_row_max - 1)
self.top_row = row - (self.page_row_max - 1)
end
cursor_width = self.width / @column_max - 32
x = @index % @column_max * (cursor_width + 32)
new_y = 0
for i in 0...@index
new_y += @ligne[i]
end
y = new_y / @column_max * 32 - self.oy
self.cursor_rect.set(x, y, cursor_width, 32*@ligne[@index])
end
end
# Fin du scrîpt