Le Deal du moment : -20%
-20% sur le Lot de 2 écrans PC GIGABYTE ...
Voir le deal
429 €

Aller en bas
Garruk
Garruk
Membre

Nombre de messages : 1030
Age : 39
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

[Résolu] Script de quête. Empty [Résolu] Script de quête.

Mer 1 Fév 2012 - 17:01
J'ai un problème avec ce script de quête disponible ici : https://rpgmakervx.1fr1.net/t8451-script-script-de-quete
Le premier problème est le nombre qui fait buggé l'écran. Mon design est un peu différent par rapport à celui d'origine.
Spoiler:

Le deuxième est un peu plus complexe, quand on regarde la liste des objectifs, on est obligé d'appuyer à chaque fois sur entrée pour faire afficher les objectifs (c'est un peu naze je sais). Je voulais donc faire en sorte que ses objectifs soient visibles sans pour autant que le joueur appuie sur entrée.

La ligne du script de base:
Code:
#--------------------------------------------------------------------------
# * Terminate
#--------------------------------------------------------------------------
def terminate
dispose_menu_background
@type.dispose
@quests.dispose
@title.dispose
@desc_window.dispose
end
#--------------------------------------------------------------------------
# * Update Frame
#--------------------------------------------------------------------------
def update
super
update_menu_background
@type.update
@quests.update
if @type.active
update_type_selection
elsif @quests.active
update_quests_selection
else
update_desc_selection
end
if Input.trigger?(Input::A)
Sound.play_cancel
return_scene
end
end
#--------------------------------------------------------------------------
# * Update Type Selection
#--------------------------------------------------------------------------
def update_type_selection
if Input.trigger?(Input::B)
Sound.play_cancel
return_scene
elsif Input.trigger?(Input::C)
a = @type.index
Sound.play_cursor
@type.active = false
@quests.dispose
@quests = Window_Select_Quest.new(a + 1)
@quests.active = true
@quests.index = 0
elsif Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT)
a = @type.index
@quests.dispose
@quests = Window_Select_Quest.new(a + 1)
@quests.index = -1
update_desc
end
end

#--------------------------------------------------------------------------
# * Update Quests Decription
#--------------------------------------------------------------------------
def update_desc
case @type.index
when 0
@title.dispose
@title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEPRINCIP)
when 1
@title.dispose
@title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMESECOND)
when 2
@title.dispose
@title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMECOMP)
when 3
@title.dispose
@title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEFAIL)
end
end
#--------------------------------------------------------------------------
# * Update Quests Selection
#--------------------------------------------------------------------------
def update_quests_selection
if Input.trigger?(Input::B)
Sound.play_cancel
Sound.play_cursor
@type.active = true
@quests.active = false
@quests.index = -1
update_desc
@desc_window.dispose
@desc_window = Window_Quest_Desc.new
elsif Input.trigger?(Input::C)
if @quests.c_items[@quests.index] == nil
Sound.play_buzzer
else
Sound.play_decision
@desc_window.dispose
@desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
@title.dispose
@title = Window_Quest_Title.new(@quests.c_items[@quests.index])
@quests.active = false
@type.active = false
end
end
end

#--------------------------------------------------------------------------
# * Update Desc Selection
#--------------------------------------------------------------------------
def update_desc_selection
if Input.trigger?(Input::B)
Sound.play_cancel
Sound.play_cursor
@quests.active = true
update_desc
@desc_window.dispose
@desc_window = Window_Quest_Desc.new
end
end
end



Chez moi cette ligne à commencer à être modifier par un ami qui lutte pour résoudre ce problème, la liste apparait bien comme je le veux, mais dès que je fais echap pour revenir à la sélection des quêtes (complète, incomplète), mon cursor ce bloque et je ne peux plus rien faire.
Sa version

Code:
#--------------------------------------------------------------------------
# * Terminate
#--------------------------------------------------------------------------
def terminate
dispose_menu_background
@type.dispose
@quests.dispose
@title.dispose
@desc_window.dispose
end
#--------------------------------------------------------------------------
# * Update Frame
#--------------------------------------------------------------------------
def update
super


update_menu_background
@type.update
@quests.update
if @type.active
update_type_selection
elsif @quests.active
update_quests_selection
afficher_descr
else
update_desc_selection
end
if Input.trigger?(Input::A)
Sound.play_cancel
return_scene
end
end
#--------------------------------------------------------------------------
# * Update Type Selection
#--------------------------------------------------------------------------
def update_type_selection
if Input.trigger?(Input::B)
Sound.play_cancel
return_scene
elsif Input.trigger?(Input::C)
a = @type.index
Sound.play_cursor
@type.active = false
@quests.dispose
@quests = Window_Select_Quest.new(a + 1)
@quests.active = true
@quests.index = 0
elsif Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT)
a = @type.index
@quests.dispose
@quests = Window_Select_Quest.new(a + 1)
@quests.index = -1
update_desc
end
end

#--------------------------------------------------------------------------
# * Update Quests Decription
#--------------------------------------------------------------------------
def update_desc
case @type.index
when 0
@title.dispose
@title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEPRINCIP)

when 1
@title.dispose
@title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMESECOND)

when 2
@title.dispose
@title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMECOMP)

when 3
@title.dispose
@title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEFAIL)

end
end


#--------------------------------------------------------------------------
# * Update Quests Selection
#--------------------------------------------------------------------------
def update_quests_selection
if Input.trigger?(Input::B)
annulation
elsif Input.trigger?(Input::UP) or Input.trigger?(Input::DOWN)
afficher_descr
end
end
#-----------------------------------------------------------------------------
#*Annulation
#-----------------------------------------------------------------------------
def annulation
Sound.play_cancel
#Sound.play_cursor
@type.active = true
@quests.active = false
@quests.index = -1
@desc_window.dispose
@desc_window = Window_Quest_Desc.new
update_desc

end
#-----------------------------------------------------------------------------
#*Afficher la description
#-----------------------------------------------------------------------------
def afficher_descr
@desc_window.dispose
@desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
@title.dispose
@title = Window_Quest_Title.new(@quests.c_items[@quests.index])
@quests.active = true
@type.active = false
end
#--------------------------------------------------------------------------
# * Update Desc Selection
#--------------------------------------------------------------------------
def update_desc_selection
if Input.trigger?(Input::B)
Sound.play_cancel
Sound.play_cursor
@quests.active = false
update_desc
@desc_window.dispose
@desc_window = Window_Quest_Desc.new
end
end
end


J'ai déjà essayé de contacter l'auteur, mais il ne répond pas, alors voilà, merci d'avance. =)


Dernière édition par Garruk le Jeu 2 Fév 2012 - 18:20, édité 1 fois
dricc
dricc
Membre

Nombre de messages : 2760
Localisation : Lille
Distinction : Altruiste - Incarnation de la Patience [Mist']
Date d'inscription : 10/08/2009

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Mer 1 Fév 2012 - 18:46
Bon , déja pour le 2éme point j'ai modifié comme ça :

Code:

  #--------------------------------------------------------------------------
  # * Update Type Selection
  #--------------------------------------------------------------------------
  def update_type_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::C)
      a = @type.index
      Sound.play_cursor
      @type.active = false
      @quests.dispose
      @quests = Window_Select_Quest.new(a + 1)
      @quests.active = true
      @quests.index = 0
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
        @quests.active = false
        @type.active = false
# fin ajouter ceci
    elsif Input.trigger?(Input::LEFT) or  Input.trigger?(Input::RIGHT)
        a = @type.index
        @quests.dispose
        @quests = Window_Select_Quest.new(a + 1)
        @quests.index = -1
        update_desc
    end
  end

Au passage , le code est vraiment naze (on détruit la fenetre à chaque fois ,quel gachi!).

Le premier , je vais essayer de regarde mai sil faut ajouter plein de quetes , c'est lourd .

EDIT : oups , non , ça marche pas ce que j'ai fait , oublie .
Garruk
Garruk
Membre

Nombre de messages : 1030
Age : 39
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Mer 1 Fév 2012 - 18:55
Ca marche pas Dricc, je peux même plus bouger le cursor pour voir les autres quêtes maintenant. =/
Pour le code j'y peux rien c'est pas moi qui le fait. ^^
Pour les quêtes tu raccourcis la fenêtre. =)
dricc
dricc
Membre

Nombre de messages : 2760
Localisation : Lille
Distinction : Altruiste - Incarnation de la Patience [Mist']
Date d'inscription : 10/08/2009

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Jeu 2 Fév 2012 - 10:44
Nom de nom ... pas imple ce truc .

Bon , voila qui donne un meilleur resultat :

Code:


=begin
########################## Breadlord's Quets Script Modifié par Skillo ############################
Ceci est un script pour quête vous permettant d'avoir une large description des quêtes et de multiples tâches
(entend par là plusieurs à truc à faire pour la même quête hein).
Tu met les quêtes sous forme d'evenement c'est à dire sous ce format :

$quests['nom de la quête'] = Quest.new([' ligne de description 1', 'ligne de description 2, ...],
['tâche 1 description', 'tâche 2 description',...])

Dans ce format 'nom de la quête' correspond au nom de la quête,
'ligne de description N' est la N ème ligne de la description de la quête et
'tâche N description' est la description de la N eme tâche

Pour completer une tâche dans un evenement utilisez $quests['nom de la quête'].complete_sub('tâche description'),
et pour échouer une tâche utilisez $quests['nom de la quête'].fail_sub('tâche description').
Si toutes les tâches sont complétées/échouées alors le status de la quête deviendra complétée/échouée.
Pour mettre une quête en complétée utilisez $quests['nom de la quête'].complete_all,
et échouée utilisez $quests['nom de la quête'].fail_all

Pour vérifier si une quête est complétée utilisez $quests['nom de la quête'].complete?,
et pour vérifier si elle est échouée utilisez $quests['nom de la quête'].failed?.
Pour vérifier si une tâche est complétée utilisez $quests['nom de la quête'].sub_complete?('tâche description')
et pour vérifier si elle est échouée utilisez $quests['nom de la quête'].sub_failed?('tâche description')

Pour definir une quete secondaire il suffit de rajouter true  après les taches :
$quests['nom de la quête'] = Quest.new([' ligne de description 1', 'ligne de description 2, ...],
['tâche 1 description', 'tâche 2 description',...], true)

Enfin pour vérifier que la quête existe utilisez $quests['nom de la quête'] != nil
Pour appeler le menu de quête utilisez $scene = Scene_Quest.new
Et pour lancer le menu quête sur un onglet précis il suffit de $scene = Scene_Quest.new(index de l'onglet)
0<= index de l'onglet <= 3



################################################################################
################################################################################
=end
module QUEST_CONFIG
 
  # Ici seront defini les 3 icones correspondant aux tri des quêtes
  # QUEST_ICONS = [icone des quetes en cours, icone des quetes complétées, icone des quete echouées]
  QUEST_ICONS =  [188, 189, 150, 112] 
 
  # Ici sera defini l'image apparaissant dans le menu
  # QUEST_PICTURE = "nom de l'image"
  QUEST_PICTURE = "Quest"
 
  # Ici sera defini la hauteur des fenêtre et par consequence la place laisser à l'image
  # QUEST_WINDOWHEIGHT = hauteur
  QUEST_WINDOWHEIGHT =  293  # 293
 
  # Ici sera defini l'image apparaissant lorsqu'une quête est completée
  # QUEST_COMPLETE = "nom de l'image"
  QUEST_COMPLETE = "Complete"
 
  # Ici sera defini l'image apparaissant lorsqu'une quête est échouée
  # QUEST_FAILED = "nom de l'image"
  QUEST_FAILED =  "Failed"
 
  # Ici sera defini le message apparaissant dans la fenetre de description lors d'une quête secondaire
  # QUEST_SECOND = "message"
  QUEST_SECOND = "Quête secondaire"
 
  # Ici seront defini les 3 icones correspondant aux états des quêtes et des tâches principales
  # VALIDATEICONS = [icone des taches en cours, icone des taches complétées, icone des taches echouées]
  VALIDATEICONS =  [96, 101, 99] 
 
  # Ici seront defini les 3 icones correspondant aux états des quêtes et des tâches secondaires
  # VALIDATEICONS = [icone des taches en cours, icone des taches complétées, icone des taches echouées]
  VALIDATESECONDICONS =  [98, 100, 103] 
 
  #Ici sera defini le nom apparaissant dans le menu de base
  # MENUNAME = nom du menu
  MENUNAME = 'Quêtes'
 
  #Ici sera defini le nom apparaissant dans la description de l'onglet  des quêtes principales
  # QUEST_NAMEPRINCIP = nom
  QUEST_NAMEPRINCIP = "Quêtes Principales"
 
  #Ici sera defini le nom apparaissant dans la description de l'onglet  des quêtes secondaires
  # QUEST_NAMESECOND = nom 
  QUEST_NAMESECOND = "Quêtes Secondaires"
 
  #Ici sera defini le nom apparaissant dans la description de l'onglet  des quêtes réussies
  # QUEST_NAMECOMP = nom   
  QUEST_NAMECOMP = "Quêtes Réussies"

  #Ici sera defini le nom apparaissant dans la description de l'onglet  des quêtes échouées
  # QUEST_NAMEFAIL = nom
  QUEST_NAMEFAIL  =  "Quêtes Ratés"
 
  # Ici sera defini à titre indicatif le numero du menu quête dans le menu de base (comptez à partir de 0)
  # cela n'aura aucune influance sur sa position.
  # MENU_NUMBER = umero du menu quête dans le menu de base
  MENU_NUMBER = 4
 
  # Ici sera defini l'interrupteur definissant si un tache échoué fais echoué la quête ou non.
  # FAILSUB_FAILCOMPLETE = true/false
  FAILSUB_FAILCOMPLETE = true
 
end

#==============================================================================
# ** Quest
#------------------------------------------------------------------------------
#  Cette classe permet de definir des quêtes
#  Elle est appelée par $quests
#==============================================================================
class Quest

attr_accessor :desc, :sub, :comp, :sub_text, :pic

  #--------------------------------------------------------------------------
  # * Quête Initialization
  #    desc    : tableau des descriptions
  #    sub      : tableau des tâches
  #    pic  : window width
  #--------------------------------------------------------------------------
  def initialize(desc = [''], sub = [''], second = false)
    @desc = desc
    @sub = {}
    @second = second
    for i in 0..sub.size - 1  # pour chaque tache
      @sub[sub[i]] = 'prog'      #construit une clef du nom de la tache avec la valeur prog
    end
    @comp = 'prog'
    @sub_text = []
    for i in 0..sub.size - 1
      @sub_text.push(sub[i]) # pour chaque tache
    end
  end
 
  #--------------------------------------------------------------------------
  # * Completer une Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def second?
  return @second
  end
  #--------------------------------------------------------------------------
  # * Completer une Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def complete_sub(sub)
    @sub[sub] = 'comp'
    test_complete
  end
  #--------------------------------------------------------------------------
  # * Tester si la Quête est devenue complete
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def test_complete
    @a = true
    for i in 0..@sub.keys.size - 1
      if @sub[@sub.keys[i]] == 'comp'
        @a = (@a and true)
      else
        @a =  (@a and false)
      end
    end
    if @a == true
      complete_all
    end
  end
  #--------------------------------------------------------------------------
  # * Echouer une  Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def fail_sub(sub)
    if QUEST_CONFIG::FAILSUB_FAILCOMPLETE
      fail_all
    else
      @sub[sub] = 'fail'
    end
  end

 
  #--------------------------------------------------------------------------
  # *Compeleter toutes les Tâches
  #--------------------------------------------------------------------------
  def complete_all
    @comp = 'comp'
    for i in @sub.keys
      @sub[i] = 'comp'
    end
  end

  #--------------------------------------------------------------------------
  # *Echouer à toutes les Tâches
  #--------------------------------------------------------------------------
  def fail_all
    @comp = 'fail'
    for i in @sub.keys
      @sub[i] = 'fail'
    end
  end

  #--------------------------------------------------------------------------
  # *Tester si une  Tâches est complete
  #--------------------------------------------------------------------------
  def sub_complete?(sub)
    return @sub[sub] == 'comp'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une Quête est complete
  #--------------------------------------------------------------------------
  def complete?
    return @comp == 'comp'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une  Tâches est échouée
  #--------------------------------------------------------------------------
  def sub_failed?(sub)
    return @sub[sub] == 'fail'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une Quête est échouée
  #--------------------------------------------------------------------------
  def failed?
    return @comp == 'fail'? true : false
  end
end


#==============================================================================
# ** Window_Quest_Type
#------------------------------------------------------------------------------
#  Cette fenetre affiche les differents états des quêtes.
#==============================================================================
class Window_Quest_Type < Window_Selectable

attr_accessor :active, :index
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0,352 - QUEST_CONFIG::QUEST_WINDOWHEIGHT,160,64)
    @column_max = 4
    @index = 0
    @icons =  QUEST_CONFIG::QUEST_ICONS
    @spacing = 14
    refresh
  end

  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    @item_max = @icons.size
    create_contents
    for i in 0...@item_max
      rect = item_rect(i)
      rect.x -= 2
      icon = @icons[i]
      draw_icon(icon, rect.x, rect.y)
    end
  end
end

#==============================================================================
# ** Window_Quest_Title
#------------------------------------------------------------------------------
#  Cette fenetre affiche les descriptions des quêtes.
#==============================================================================
class Window_Quest_Title < Window_Base

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(index = QUEST_CONFIG::MENUNAME)
    super( 160, 352 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 384, 64)
      @pic_title = Sprite.new
      @pic_title.bitmap = Cache.picture(QUEST_CONFIG::QUEST_PICTURE)
      self.contents.draw_text(0, 0, self.width - 40, WLH, index, 1)
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @pic_title.dispose
  end
end

#==============================================================================
# ** Window_Quest_Desc
#------------------------------------------------------------------------------
#  Cette fenetre affiche lee contenue des quêtes.
#==============================================================================
class Window_Quest_Desc < Window_Base

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(index = nil)
    super( 160, 416 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 384, QUEST_CONFIG::QUEST_WINDOWHEIGHT)
    @status = Sprite.new
    if index != nil
      if $quests[index].complete?
        @status.bitmap = Cache.picture(QUEST_CONFIG::QUEST_COMPLETE)
      elsif $quests[index].failed?
        @status.bitmap = Cache.picture(QUEST_CONFIG::QUEST_FAILED)
      end
      @status.z = 201
      for i in 0..$quests[index].desc.size - 1
        a = $quests[index].desc[i]
        self.contents.draw_text(0, WLH*i, self.width - 40, WLH, a, 1)
      end
      a = $quests[index].sub_text
      for i in 0..a.size - 1
        b = a[i]
        if $quests[index].sub[b] == 'prog'
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[0]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[0]
          end
        elsif $quests[index].sub[b] == 'comp'
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[1]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[1]
          end
        else
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[2]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[2]
          end
        end
        draw_icon(ic, 4, WLH*(i + $quests[index].desc.size + 1))
        self.contents.draw_text(0, WLH*(i + $quests[index].desc.size + 1), self.width - 40, WLH, b, 1)
      end
      if $quests[index].second?
        self.contents.draw_text(0, QUEST_CONFIG::QUEST_WINDOWHEIGHT - 3*WLH, self.width - 40, WLH, QUEST_CONFIG::QUEST_SECOND, 1)
      end 
    end
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @status.dispose
  end
end

#==============================================================================
# ** Window_Quest_Type
#------------------------------------------------------------------------------
#  Cette fenetre affiche lee contenue des quêtes.
#==============================================================================
class Window_Select_Quest < Window_Selectable
 
attr_accessor :c_items

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(type = 1)
    super(0, 416 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 160, QUEST_CONFIG::QUEST_WINDOWHEIGHT)
    @type = type
    self.index = 0
    self.active = false
    @items = $quests.keys
    create_contents
    a = @items
    @c_items = []
    for it in 0...@items.size
      if include?(a[it])
        @c_items.push(a[it])
      end
    end
    for it in 0...@c_items.size
      draw_opt(it)
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    super
    @data = @c_items
    @item_max = @data.size
  end
 
  #--------------------------------------------------------------------------
  # * Include ?
  #  key  : nom d'une quête
  #--------------------------------------------------------------------------
  def include?(key)
    case @type
    when 1
      if !$quests[key].complete? and !$quests[key].failed? and !$quests[key].second?
        return true
      end
    when 2
      unless $quests[key].complete? or $quests[key].failed?
        return $quests[key].second?
      end
    when 3
      return $quests[key].complete?
    when 4
      return $quests[key].failed?
    end
  end

  #--------------------------------------------------------------------------
  # * Draw Opt
  #  itemm  :  quête
  #--------------------------------------------------------------------------
  def draw_opt(itemm)
    a = @c_items
    rect = item_rect(itemm)
    self.contents.clear_rect(rect)
    if $quests[@c_items[itemm]].complete?
      if $quests[@c_items[itemm]].second?
        draw_icon(QUEST_CONFIG::VALIDATESECONDICONS[1],rect.x, rect.y)
      else
        draw_icon(QUEST_CONFIG::VALIDATEICONS[1],rect.x, rect.y)
      end
    elsif $quests[@c_items[itemm]].failed?
      if $quests[@c_items[itemm]].second?
        draw_icon(QUEST_CONFIG::VALIDATESECONDICONS[2],rect.x, rect.y)
      else
        draw_icon(QUEST_CONFIG::VALIDATEICONS[2],rect.x, rect.y)
      end
    else
      if $quests[@c_items[itemm]].second?
        draw_icon(QUEST_CONFIG::VALIDATESECONDICONS[0],rect.x, rect.y)
      else
        draw_icon(QUEST_CONFIG::VALIDATEICONS[0],rect.x , rect.y)
      end
    end
    string = @c_items[itemm]
    rect.width -= 4
    self.contents.draw_text(rect.x, rect.y, rect.width, WLH, string, 2)
  end
end


#==============================================================================
# ** Scene_Quest
#------------------------------------------------------------------------------
#  Cette classe fere le menu de quêtes
#==============================================================================
class Scene_Quest < Scene_Base
 
  #--------------------------------------------------------------------------
  # * Object Initialization
  #   
  #--------------------------------------------------------------------------
  def initialize(index = 0, menu = false)
    @menu = menu
    @index = index
  end
 
  #--------------------------------------------------------------------------
  # * Start processing
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @type = Window_Quest_Type.new
    @type.visible = true
    @type.active = true
    @type.index = @index
    @quests = Window_Select_Quest.new(@index +1)
    @quests.active = false
    @quests.index = -1
    @desc_window = Window_Quest_Desc.new
    @title = Window_Quest_Title.new
    update_desc
  end
 
  #--------------------------------------------------------------------------
  # * Return to Original Screen
  #--------------------------------------------------------------------------
  def return_scene
    if @menu
      $scene = Scene_Menu.new(QUEST_CONFIG::MENU_NUMBER)
    else
      $scene = Scene_Map.new
    end
  end
 
  #--------------------------------------------------------------------------
  # * Terminate
  #--------------------------------------------------------------------------
  def terminate
    dispose_menu_background
    @type.dispose
    @quests.dispose
    @title.dispose
    @desc_window.dispose
  end

  #--------------------------------------------------------------------------
  # * Update Frame
  #--------------------------------------------------------------------------
  def update
    super
    update_menu_background
    @type.update
    @quests.update
    if @type.active
      update_type_selection
    elsif @quests.active
      update_quests_selection
    else
      update_desc_selection
    end
    if Input.trigger?(Input::A)
      Sound.play_cancel
      return_scene
    end
  end

  #--------------------------------------------------------------------------
  # * Update Type Selection
  #--------------------------------------------------------------------------
  def update_type_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::C)
      a = @type.index
      Sound.play_cursor
      @type.active = false
      @quests.dispose
      @quests = Window_Select_Quest.new(a + 1)
      @quests.active = true
      @quests.index = 0
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
#        @quests.active = false
        @type.active = false
# fin ajouter ceci
    elsif Input.trigger?(Input::LEFT) or  Input.trigger?(Input::RIGHT)
        a = @type.index
        @quests.dispose
        @quests = Window_Select_Quest.new(a + 1)
        @quests.index = -1
        update_desc
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Quests Decription
  #--------------------------------------------------------------------------
  def update_desc
    case @type.index
    when 0
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEPRINCIP)
    when 1
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMESECOND)
    when 2
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMECOMP)
    when 3
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEFAIL)
    end
  end
  #--------------------------------------------------------------------------
  # * Update Quests Selection
  #--------------------------------------------------------------------------
  def update_quests_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      Sound.play_cursor
      @type.active = true
      @quests.active = false
      @quests.index = -1
      update_desc
      @desc_window.dispose
      @desc_window = Window_Quest_Desc.new
=begin
    elsif Input.trigger?(Input::C)
      if @quests.c_items[@quests.index] == nil
        Sound.play_buzzer
      else
        Sound.play_decision
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
        @quests.active = false
        @type.active = false
      end
=end
      elsif Input.trigger?(Input::UP) or  Input.trigger?(Input::DOWN)
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
#        @quests.active = false
        @type.active = false
# fin ajouter ceci
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Desc Selection
  #--------------------------------------------------------------------------
  def update_desc_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      Sound.play_cursor
      @quests.active = true
      update_desc
      @desc_window.dispose
      @desc_window = Window_Quest_Desc.new
    end
  end
end



#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs the title screen processing.
#==============================================================================
class Scene_Title < Scene_Base
 
  alias startupquest command_new_game
  #--------------------------------------------------------------------------
  # * Command: New Game
  #--------------------------------------------------------------------------
  def command_new_game
    startupquest
    $quests = {}
  end
end

#==============================================================================
# ** Scene_File
#------------------------------------------------------------------------------
#  This class performs the save and load screen processing.
#==============================================================================
class Scene_File < Scene_Base
 
  alias savequest write_save_data
  #--------------------------------------------------------------------------
  # * Write Save Data
  #    file : write file object (opened)
  #--------------------------------------------------------------------------
  def write_save_data(file)
    savequest(file)
    Marshal.dump($quests, file)
  end
 
  alias loadquest read_save_data
  #--------------------------------------------------------------------------
  # * Read Save Data
  #    file : file object for reading (opened)
  #--------------------------------------------------------------------------
  def read_save_data(file)
    $quests = Marshal.load(file)
    loadquest(file)
  end
end

J'ai pas vu de soucis avec . ça navigue bien .
Reste à voir le coup où il y a beaucoup de quetes .
Garruk
Garruk
Membre

Nombre de messages : 1030
Age : 39
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Jeu 2 Fév 2012 - 16:50
Ca marche très bien, merci Driic. =)
Il reste comme tu le signales juste le petit problème avec les quêtes, mais pour la navigation c'est nickel.

EDIT: Maintenant il y a un autre problème. =/
Si on se déplace en maintenant le cursor, la liste des quêtes ne s'actualise pas.

Je te laisse ma version du script ici, ma m'évitera de devoir modifier la taille des fenêtres et de recorriger le bug de compatibilité avec mon script de sauvegarde.

Code:
 =begin
########################## Breadlord's Quets Script ############################
Ceci est un script pour quête vous permettant d'avoir une large description des quêtes et de multiples tâches
(entend par là plusieurs à truc à faire pour la même quête hein).
Tu met les quêtes sous forme d'evenement c'est à dire sous ce format :

$quests['nom de la quête'] = Quest.new([' ligne de description 1', 'ligne de description 2, ...],
['tâche 1 description', 'tâche 2 description',...])

Dans ce format 'nom de la quête' correspond au nom de la quête,
'ligne de description N' est la N ème ligne de la description de la quête et
'tâche N description' est la description de la N eme tâche

Pour completer une tâche dans un evenement utilisez $quests['nom de la quête'].complete_sub('tâche description'),
et pour échouer une tâche utilisez $quests['nom de la quête'].fail_sub('tâche description').
Si toutes les tâches sont complétées/échouées alors le status de la quête deviendra complétée/échouée.
Pour mettre une quête en complétée utilisez $quests['nom de la quête'].complete_all,
et échouée utilisez $quests['nom de la quête'].fail_all

Pour vérifier si une quête est complétée utilisez $quests['nom de la quête'].complete?,
et pour vérifier si elle est échouée utilisez $quests['nom de la quête'].failed?.
Pour vérifier si une tâche est complétée utilisez $quests['nom de la quête'].sub_complete?('tâche description')
et pour vérifier si elle est échouée utilisez $quests['nom de la quête'].sub_failed?('tâche description')

Pour definir une quete secondaire il suffit de rajouter true après les taches :
$quests['nom de la quête'] = Quest.new([' ligne de description 1', 'ligne de description 2, ...],
['tâche 1 description', 'tâche 2 description',...], true)

Enfin pour vérifier que la quête existe utilisez $quests['nom de la quête'] != nil
Pour appeler le menu de quête utilisez $scene = Scene_Quest.new
Et pour lancer le menu quête sur un onglet précis il suffit de $scene = Scene_Quest.new(index de l'onglet)
0<= index de l'onglet <= 3



################################################################################
################################################################################
=end

module QUEST_CONFIG

# Ici seront defini les 3 icones correspondant aux tri des quêtes
# QUEST_ICONS = [icone des quetes en cours, icone des quetes complétées, icone des quete echouées]
QUEST_ICONS = [7, 8, 11547, 6]

# Ici sera defini l'image apparaissant dans le menu
# QUEST_PICTURE = "nom de l'image"
QUEST_PICTURE = ""

# Ici sera defini la hauteur des fenêtre et par consequence la place laisser à l'image
# QUEST_WINDOWHEIGHT = hauteur
QUEST_WINDOWHEIGHT = 351 # 293

# Ici sera defini l'image apparaissant lorsqu'une quête est completée
# QUEST_COMPLETE = "nom de l'image"
QUEST_COMPLETE = "Complete"

# Ici sera defini l'image apparaissant lorsqu'une quête est échouée
# QUEST_FAILED = "nom de l'image"
QUEST_FAILED = "Complete"

# Ici sera defini le message apparaissant dans la fenetre de description lors d'une quête secondaire
# QUEST_SECOND = "message"
QUEST_SECOND = ""
# Ici seront defini les 3 icones correspondant aux états des quêtes et des tâches principales
# VALIDATEICONS = [icone des taches en cours, icone des taches complétées, icone des taches echouées]
VALIDATEICONS = [11565, 11547, 11547] # [6417, 6481, 6481]

# Ici seront defini les 3 icones correspondant aux états des quêtes et des tâches secondaires
# VALIDATEICONS = [icone des taches en cours, icone des taches complétées, icone des taches echouées]
VALIDATESECONDICONS = [11565, 6, 6] # [6417, 6513, 6513]

#Ici sera defini le nom apparaissant dans le menu de base
# MENUNAME = nom du menu
MENUNAME = 'Quêtes'

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes principales
# QUEST_NAMEPRINCIP = nom
QUEST_NAMEPRINCIP = "Quêtes"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes secondaires
# QUEST_NAMESECOND = nom
QUEST_NAMESECOND = "Quêtes de chasses"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes réussies
# QUEST_NAMECOMP = nom
QUEST_NAMECOMP = "Quêtes Réussies"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes échouées
# QUEST_NAMEFAIL = nom
QUEST_NAMEFAIL = "Quêtes de chasses Réussies"

# Ici sera defini à titre indicatif le numero du menu quête dans le menu de base (comptez à partir de 0)
# cela n'aura aucune influance sur sa position.
# MENU_NUMBER = umero du menu quête dans le menu de base
MENU_NUMBER = 3

# Ici sera defini l'interrupteur definissant si un tache échoué fais echoué la quête ou non.
# FAILSUB_FAILCOMPLETE = true/false
FAILSUB_FAILCOMPLETE = true

end

#==============================================================================
# ** Quest
#------------------------------------------------------------------------------
#  Cette classe permet de definir des quêtes
#  Elle est appelée par $quests
#==============================================================================
class Quest

attr_accessor :desc, :sub, :comp, :sub_text, :pic

  #--------------------------------------------------------------------------
  # * Quête Initialization
  #    desc    : tableau des descriptions
  #    sub      : tableau des tâches
  #    pic  : window width
  #--------------------------------------------------------------------------
  def initialize(desc = [''], sub = [''], second = false)
    @desc = desc
    @sub = {}
    @second = second
    for i in 0..sub.size - 1  # pour chaque tache
      @sub[sub[i]] = 'prog'      #construit une clef du nom de la tache avec la valeur prog
    end
    @comp = 'prog'
    @sub_text = []
    for i in 0..sub.size - 1
      @sub_text.push(sub[i]) # pour chaque tache
    end
  end
 
  #--------------------------------------------------------------------------
  # * Completer une Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def second?
  return @second
  end
  #--------------------------------------------------------------------------
  # * Completer une Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def complete_sub(sub)
    @sub[sub] = 'comp'
    test_complete
  end
  #--------------------------------------------------------------------------
  # * Tester si la Quête est devenue complete
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def test_complete
    @a = true
    for i in 0..@sub.keys.size - 1
      if @sub[@sub.keys[i]] == 'comp'
        @a = (@a and true)
      else
        @a =  (@a and false)
      end
    end
    if @a == true
      complete_all
    end
  end
  #--------------------------------------------------------------------------
  # * Echouer une  Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def fail_sub(sub)
    if QUEST_CONFIG::FAILSUB_FAILCOMPLETE
      fail_all
    else
      @sub[sub] = 'fail'
    end
  end

 
  #--------------------------------------------------------------------------
  # *Compeleter toutes les Tâches
  #--------------------------------------------------------------------------
  def complete_all
    @comp = 'comp'
    for i in @sub.keys
      @sub[i] = 'comp'
    end
  end

  #--------------------------------------------------------------------------
  # *Echouer à toutes les Tâches
  #--------------------------------------------------------------------------
  def fail_all
    @comp = 'fail'
    for i in @sub.keys
      @sub[i] = 'fail'
    end
  end

  #--------------------------------------------------------------------------
  # *Tester si une  Tâches est complete
  #--------------------------------------------------------------------------
  def sub_complete?(sub)
    return @sub[sub] == 'comp'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une Quête est complete
  #--------------------------------------------------------------------------
  def complete?
    return @comp == 'comp'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une  Tâches est échouée
  #--------------------------------------------------------------------------
  def sub_failed?(sub)
    return @sub[sub] == 'fail'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une Quête est échouée
  #--------------------------------------------------------------------------
  def failed?
    return @comp == 'fail'? true : false
  end
end


#==============================================================================
# ** Window_Quest_Type
#------------------------------------------------------------------------------
#  Cette fenetre affiche les differents états des quêtes.
#==============================================================================
class Window_Quest_Type < Window_Selectable

attr_accessor :active, :index
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
super(0,416 - QUEST_CONFIG::QUEST_WINDOWHEIGHT,160,64) # Emplacemen des icons
    @column_max = 4
    @index = 0
    @icons =  QUEST_CONFIG::QUEST_ICONS
    @spacing = 14
    refresh
  end

  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    @item_max = @icons.size
    create_contents
    for i in 0...@item_max
      rect = item_rect(i)
      rect.x -= 2
      icon = @icons[i]
      draw_icon(icon, rect.x, rect.y)
    end
  end
end

#==============================================================================
# ** Window_Quest_Title
#------------------------------------------------------------------------------
#  Cette fenetre affiche les descriptions des quêtes.
#==============================================================================
class Window_Quest_Title < Window_Base

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(index = QUEST_CONFIG::MENUNAME)
super( 0, 352 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 544, 64) # Description
      @pic_title = Sprite.new
      @pic_title.bitmap = Cache.picture(QUEST_CONFIG::QUEST_PICTURE)
      self.contents.draw_text(0, 0, self.width - 40, WLH, index, 1)
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @pic_title.dispose
  end
end

#==============================================================================
# ** Window_Quest_Desc
#------------------------------------------------------------------------------
#  Cette fenetre affiche lee contenue des quêtes.
#==============================================================================
class Window_Quest_Desc < Window_Base

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(index = nil)
super( 160, 416 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 384, QUEST_CONFIG::QUEST_WINDOWHEIGHT) # Les objetctif
    @status = Sprite.new
    if index != nil
      if $quests[index].complete?
        @status.bitmap = Cache.picture(QUEST_CONFIG::QUEST_COMPLETE)
      elsif $quests[index].failed?
        @status.bitmap = Cache.picture(QUEST_CONFIG::QUEST_FAILED)
      end
      @status.z = 201
      for i in 0..$quests[index].desc.size - 1
        a = $quests[index].desc[i]
        self.contents.draw_text(0, WLH*i, self.width - 40, WLH, a, 1)
      end
      a = $quests[index].sub_text
      for i in 0..a.size - 1
        b = a[i]
        if $quests[index].sub[b] == 'prog'
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[0]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[0]
          end
        elsif $quests[index].sub[b] == 'comp'
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[1]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[1]
          end
        else
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[2]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[2]
          end
        end
        draw_icon(ic, 4, WLH*(i + $quests[index].desc.size + 1))
        self.contents.draw_text(0, WLH*(i + $quests[index].desc.size + 1), self.width - 40, WLH, b, 1)
      end
      if $quests[index].second?
        self.contents.draw_text(0, QUEST_CONFIG::QUEST_WINDOWHEIGHT - 3*WLH, self.width - 40, WLH, QUEST_CONFIG::QUEST_SECOND, 1)
      end 
    end
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @status.dispose
  end
end

#==============================================================================
# ** Window_Quest_Type
#------------------------------------------------------------------------------
#  Cette fenetre affiche lee contenue des quêtes.
#==============================================================================
class Window_Select_Quest < Window_Selectable
 
attr_accessor :c_items

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(type = 1)
super(0, 480 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 160, 287, QUEST_CONFIG::QUEST_WINDOWHEIGHT)# La liste
    @type = type
    self.index = 0
    self.active = false
    @items = $quests.keys
    create_contents
    a = @items
    @c_items = []
    for it in 0...@items.size
      if include?(a[it])
        @c_items.push(a[it])
      end
    end
    for it in 0...@c_items.size
      draw_opt(it)
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    super
    @data = @c_items
    @item_max = @data.size
  end
 
  #--------------------------------------------------------------------------
  # * Include ?
  #  key  : nom d'une quête
  #--------------------------------------------------------------------------
  def include?(key)
    case @type
    when 1
      if !$quests[key].complete? and !$quests[key].failed? and !$quests[key].second?
        return true
      end
    when 2
      unless $quests[key].complete? or $quests[key].failed?
        return $quests[key].second?
      end
    when 3
      return $quests[key].complete?
    when 4
      return $quests[key].failed?
    end
  end

  #--------------------------------------------------------------------------
  # * Draw Opt
  #  itemm  :  quête
  #--------------------------------------------------------------------------
  def draw_opt(itemm)
    a = @c_items
    rect = item_rect(itemm)
    self.contents.clear_rect(rect)
    if $quests[@c_items[itemm]].complete?
      if $quests[@c_items[itemm]].second?
      end
    elsif $quests[@c_items[itemm]].failed?
      if $quests[@c_items[itemm]].second?
      end
      if $quests[@c_items[itemm]].second?
      end
    end
    string = @c_items[itemm]
    rect.width -= 0
    self.contents.draw_text(rect.x, rect.y, rect.width, WLH, string, 0)
  end
end


#==============================================================================
# ** Scene_Quest
#------------------------------------------------------------------------------
#  Cette classe fere le menu de quêtes
#==============================================================================
class Scene_Quest < Scene_Base
 
  #--------------------------------------------------------------------------
  # * Object Initialization
  #   
  #--------------------------------------------------------------------------
  def initialize(index = 0, menu = false)
    @menu = menu
    @index = index
  end
 
  #--------------------------------------------------------------------------
  # * Start processing
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @type = Window_Quest_Type.new
    @type.visible = true
    @type.active = true
    @type.index = @index
    @quests = Window_Select_Quest.new(@index +1)
    @quests.active = false
    @quests.index = -1
    @desc_window = Window_Quest_Desc.new
    @title = Window_Quest_Title.new
    update_desc
  end
 
  #--------------------------------------------------------------------------
  # * Return to Original Screen
  #--------------------------------------------------------------------------
def return_scene
if @menu
$scene = Scene_Map.new
else
$scene = Scene_Menu.new($game_temp.menu_command_index[:quest])
end
end
 
  #--------------------------------------------------------------------------
  # * Terminate
  #--------------------------------------------------------------------------
  def terminate
    dispose_menu_background
    @type.dispose
    @quests.dispose
    @title.dispose
    @desc_window.dispose
  end

  #--------------------------------------------------------------------------
  # * Update Frame
  #--------------------------------------------------------------------------
  def update
    super
    update_menu_background
    @type.update
    @quests.update
    if @type.active
      update_type_selection
    elsif @quests.active
      update_quests_selection
    else
      update_desc_selection
    end
    if Input.trigger?(Input::A)
      Sound.play_cancel
      return_scene
    end
  end

  #--------------------------------------------------------------------------
  # * Update Type Selection
  #--------------------------------------------------------------------------
  def update_type_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::C)
      a = @type.index
      Sound.play_cursor
      @type.active = false
      @quests.dispose
      @quests = Window_Select_Quest.new(a + 1)
      @quests.active = true
      @quests.index = 0
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
#        @quests.active = false
        @type.active = false
# fin ajouter ceci
    elsif Input.trigger?(Input::LEFT) or  Input.trigger?(Input::RIGHT)
        a = @type.index
        @quests.dispose
        @quests = Window_Select_Quest.new(a + 1)
        @quests.index = -1
        update_desc
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Quests Decription
  #--------------------------------------------------------------------------
  def update_desc
    case @type.index
    when 0
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEPRINCIP)
    when 1
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMESECOND)
    when 2
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMECOMP)
    when 3
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEFAIL)
    end
  end
  #--------------------------------------------------------------------------
  # * Update Quests Selection
  #--------------------------------------------------------------------------
  def update_quests_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      Sound.play_cursor
      @type.active = true
      @quests.active = false
      @quests.index = -1
      update_desc
      @desc_window.dispose
      @desc_window = Window_Quest_Desc.new
=begin
    elsif Input.trigger?(Input::C)
      if @quests.c_items[@quests.index] == nil
        Sound.play_buzzer
      else
        Sound.play_decision
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
        @quests.active = false
        @type.active = false
      end
=end
      elsif Input.trigger?(Input::UP) or  Input.trigger?(Input::DOWN)
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
#        @quests.active = false
        @type.active = false
# fin ajouter ceci
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Desc Selection
  #--------------------------------------------------------------------------
  def update_desc_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      Sound.play_cursor
      @quests.active = true
      update_desc
      @desc_window.dispose
      @desc_window = Window_Quest_Desc.new
    end
  end
end



#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
# This class performs the title screen processing.
#==============================================================================
class Scene_Title < Scene_Base

alias startupquest command_new_game
#--------------------------------------------------------------------------
# * Command: New Game
#--------------------------------------------------------------------------
def command_new_game
startupquest
$quests = {}
end
end
#==============================================================================
# ** Scene_File
#------------------------------------------------------------------------------
# This class performs the save and load screen processing.
#==============================================================================
class Scene_File < Scene_Base

alias savequest write_save_data
#--------------------------------------------------------------------------
# * Write Save Data
# file : write file object (opened)
#--------------------------------------------------------------------------
def write_save_data(file)
savequest(file)
Marshal.dump($quests, file)
end

alias loadquest read_save_data
#--------------------------------------------------------------------------
# * Read Save Data
# file : file object for reading (opened)
#--------------------------------------------------------------------------
def read_save_data(file)
loadquest(file)
$quests = Marshal.load(file)
end
end
 
dricc
dricc
Membre

Nombre de messages : 2760
Localisation : Lille
Distinction : Altruiste - Incarnation de la Patience [Mist']
Date d'inscription : 10/08/2009

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Jeu 2 Fév 2012 - 17:50
OK , trouvé .
y compris le probleme avec beaucoup de quetes .

Code:

=begin
########################## Breadlord's Quets Script ############################
Ceci est un script pour quête vous permettant d'avoir une large description des quêtes et de multiples tâches
(entend par là plusieurs à truc à faire pour la même quête hein).
Tu met les quêtes sous forme d'evenement c'est à dire sous ce format :

$quests['nom de la quête'] = Quest.new([' ligne de description 1', 'ligne de description 2, ...],
['tâche 1 description', 'tâche 2 description',...])

Dans ce format 'nom de la quête' correspond au nom de la quête,
'ligne de description N' est la N ème ligne de la description de la quête et
'tâche N description' est la description de la N eme tâche

Pour completer une tâche dans un evenement utilisez $quests['nom de la quête'].complete_sub('tâche description'),
et pour échouer une tâche utilisez $quests['nom de la quête'].fail_sub('tâche description').
Si toutes les tâches sont complétées/échouées alors le status de la quête deviendra complétée/échouée.
Pour mettre une quête en complétée utilisez $quests['nom de la quête'].complete_all,
et échouée utilisez $quests['nom de la quête'].fail_all

Pour vérifier si une quête est complétée utilisez $quests['nom de la quête'].complete?,
et pour vérifier si elle est échouée utilisez $quests['nom de la quête'].failed?.
Pour vérifier si une tâche est complétée utilisez $quests['nom de la quête'].sub_complete?('tâche description')
et pour vérifier si elle est échouée utilisez $quests['nom de la quête'].sub_failed?('tâche description')

Pour definir une quete secondaire il suffit de rajouter true après les taches :
$quests['nom de la quête'] = Quest.new([' ligne de description 1', 'ligne de description 2, ...],
['tâche 1 description', 'tâche 2 description',...], true)

Enfin pour vérifier que la quête existe utilisez $quests['nom de la quête'] != nil
Pour appeler le menu de quête utilisez $scene = Scene_Quest.new
Et pour lancer le menu quête sur un onglet précis il suffit de $scene = Scene_Quest.new(index de l'onglet)
0<= index de l'onglet <= 3



################################################################################
################################################################################
=end

module QUEST_CONFIG

# Ici seront defini les 3 icones correspondant aux tri des quêtes
# QUEST_ICONS = [icone des quetes en cours, icone des quetes complétées, icone des quete echouées]
QUEST_ICONS = [7, 8, 11547, 6]

# Ici sera defini l'image apparaissant dans le menu
# QUEST_PICTURE = "nom de l'image"
QUEST_PICTURE = ""

# Ici sera defini la hauteur des fenêtre et par consequence la place laisser à l'image
# QUEST_WINDOWHEIGHT = hauteur
QUEST_WINDOWHEIGHT = 351 # 293

# Ici sera defini l'image apparaissant lorsqu'une quête est completée
# QUEST_COMPLETE = "nom de l'image"
QUEST_COMPLETE = "Complete"

# Ici sera defini l'image apparaissant lorsqu'une quête est échouée
# QUEST_FAILED = "nom de l'image"
QUEST_FAILED = "Complete"

# Ici sera defini le message apparaissant dans la fenetre de description lors d'une quête secondaire
# QUEST_SECOND = "message"
QUEST_SECOND = ""
# Ici seront defini les 3 icones correspondant aux états des quêtes et des tâches principales
# VALIDATEICONS = [icone des taches en cours, icone des taches complétées, icone des taches echouées]
VALIDATEICONS = [11565, 11547, 11547] # [6417, 6481, 6481]

# Ici seront defini les 3 icones correspondant aux états des quêtes et des tâches secondaires
# VALIDATEICONS = [icone des taches en cours, icone des taches complétées, icone des taches echouées]
VALIDATESECONDICONS = [11565, 6, 6] # [6417, 6513, 6513]

#Ici sera defini le nom apparaissant dans le menu de base
# MENUNAME = nom du menu
MENUNAME = 'Quêtes'

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes principales
# QUEST_NAMEPRINCIP = nom
QUEST_NAMEPRINCIP = "Quêtes"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes secondaires
# QUEST_NAMESECOND = nom
QUEST_NAMESECOND = "Quêtes de chasses"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes réussies
# QUEST_NAMECOMP = nom
QUEST_NAMECOMP = "Quêtes Réussies"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes échouées
# QUEST_NAMEFAIL = nom
QUEST_NAMEFAIL = "Quêtes de chasses Réussies"

# Ici sera defini à titre indicatif le numero du menu quête dans le menu de base (comptez à partir de 0)
# cela n'aura aucune influance sur sa position.
# MENU_NUMBER = umero du menu quête dans le menu de base
MENU_NUMBER = 3

# Ici sera defini l'interrupteur definissant si un tache échoué fais echoué la quête ou non.
# FAILSUB_FAILCOMPLETE = true/false
FAILSUB_FAILCOMPLETE = true

end

#==============================================================================
# ** Quest
#------------------------------------------------------------------------------
#  Cette classe permet de definir des quêtes
#  Elle est appelée par $quests
#==============================================================================
class Quest

attr_accessor :desc, :sub, :comp, :sub_text, :pic

  #--------------------------------------------------------------------------
  # * Quête Initialization
  #    desc    : tableau des descriptions
  #    sub      : tableau des tâches
  #    pic  : window width
  #--------------------------------------------------------------------------
  def initialize(desc = [''], sub = [''], second = false)
    @desc = desc
    @sub = {}
    @second = second
    for i in 0..sub.size - 1  # pour chaque tache
      @sub[sub[i]] = 'prog'      #construit une clef du nom de la tache avec la valeur prog
    end
    @comp = 'prog'
    @sub_text = []
    for i in 0..sub.size - 1
      @sub_text.push(sub[i]) # pour chaque tache
    end
  end
 
  #--------------------------------------------------------------------------
  # * Completer une Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def second?
  return @second
  end
  #--------------------------------------------------------------------------
  # * Completer une Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def complete_sub(sub)
    @sub[sub] = 'comp'
    test_complete
  end
  #--------------------------------------------------------------------------
  # * Tester si la Quête est devenue complete
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def test_complete
    @a = true
    for i in 0..@sub.keys.size - 1
      if @sub[@sub.keys[i]] == 'comp'
        @a = (@a and true)
      else
        @a =  (@a and false)
      end
    end
    if @a == true
      complete_all
    end
  end
  #--------------------------------------------------------------------------
  # * Echouer une  Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def fail_sub(sub)
    if QUEST_CONFIG::FAILSUB_FAILCOMPLETE
      fail_all
    else
      @sub[sub] = 'fail'
    end
  end

 
  #--------------------------------------------------------------------------
  # *Compeleter toutes les Tâches
  #--------------------------------------------------------------------------
  def complete_all
    @comp = 'comp'
    for i in @sub.keys
      @sub[i] = 'comp'
    end
  end

  #--------------------------------------------------------------------------
  # *Echouer à toutes les Tâches
  #--------------------------------------------------------------------------
  def fail_all
    @comp = 'fail'
    for i in @sub.keys
      @sub[i] = 'fail'
    end
  end

  #--------------------------------------------------------------------------
  # *Tester si une  Tâches est complete
  #--------------------------------------------------------------------------
  def sub_complete?(sub)
    return @sub[sub] == 'comp'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une Quête est complete
  #--------------------------------------------------------------------------
  def complete?
    return @comp == 'comp'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une  Tâches est échouée
  #--------------------------------------------------------------------------
  def sub_failed?(sub)
    return @sub[sub] == 'fail'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une Quête est échouée
  #--------------------------------------------------------------------------
  def failed?
    return @comp == 'fail'? true : false
  end
end


#==============================================================================
# ** Window_Quest_Type
#------------------------------------------------------------------------------
#  Cette fenetre affiche les differents états des quêtes.
#==============================================================================
class Window_Quest_Type < Window_Selectable

attr_accessor :active, :index
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
super(0,416 - QUEST_CONFIG::QUEST_WINDOWHEIGHT,160,64) # Emplacemen des icons
    @column_max = 4
    @index = 0
    @icons =  QUEST_CONFIG::QUEST_ICONS
    @spacing = 14
    refresh
  end

  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    @item_max = @icons.size
    create_contents
    for i in 0...@item_max
      rect = item_rect(i)
      rect.x -= 2
      icon = @icons[i]
      draw_icon(icon, rect.x, rect.y)
    end
  end
end

#==============================================================================
# ** Window_Quest_Title
#------------------------------------------------------------------------------
#  Cette fenetre affiche les descriptions des quêtes.
#==============================================================================
class Window_Quest_Title < Window_Base

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(index = QUEST_CONFIG::MENUNAME)
super( 0, 352 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 544, 64) # Description
      @pic_title = Sprite.new
      @pic_title.bitmap = Cache.picture(QUEST_CONFIG::QUEST_PICTURE)
      self.contents.draw_text(0, 0, self.width - 40, WLH, index, 1)
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @pic_title.dispose
  end
end

#==============================================================================
# ** Window_Quest_Desc
#------------------------------------------------------------------------------
#  Cette fenetre affiche lee contenue des quêtes.
#==============================================================================
class Window_Quest_Desc < Window_Base

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(index = nil)
super( 160, 416 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 384, QUEST_CONFIG::QUEST_WINDOWHEIGHT) # Les objetctif
    @status = Sprite.new
    if index != nil
      if $quests[index].complete?
        @status.bitmap = Cache.picture(QUEST_CONFIG::QUEST_COMPLETE)
      elsif $quests[index].failed?
        @status.bitmap = Cache.picture(QUEST_CONFIG::QUEST_FAILED)
      end
      @status.z = 201
      for i in 0..$quests[index].desc.size - 1
        a = $quests[index].desc[i]
        self.contents.draw_text(0, WLH*i, self.width - 40, WLH, a, 1)
      end
      a = $quests[index].sub_text
      for i in 0..a.size - 1
        b = a[i]
        if $quests[index].sub[b] == 'prog'
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[0]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[0]
          end
        elsif $quests[index].sub[b] == 'comp'
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[1]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[1]
          end
        else
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[2]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[2]
          end
        end
        draw_icon(ic, 4, WLH*(i + $quests[index].desc.size + 1))
        self.contents.draw_text(0, WLH*(i + $quests[index].desc.size + 1), self.width - 40, WLH, b, 1)
      end
      if $quests[index].second?
        self.contents.draw_text(0, QUEST_CONFIG::QUEST_WINDOWHEIGHT - 3*WLH, self.width - 40, WLH, QUEST_CONFIG::QUEST_SECOND, 1)
      end 
    end
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @status.dispose
  end
end

#==============================================================================
# ** Window_Quest_Type
#------------------------------------------------------------------------------
#  Cette fenetre affiche lee contenue des quêtes.
#==============================================================================
class Window_Select_Quest < Window_Selectable
 
attr_accessor :c_items

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(type = 1)
super(0, 480 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 160, 287, QUEST_CONFIG::QUEST_WINDOWHEIGHT)# La liste
    @type = type
    self.index = 0
    self.active = false
    @items = $quests.keys
    @item_max=@items.size
    create_contents
    a = @items
    @c_items = []
    for it in 0...@items.size
      if include?(a[it])
        @c_items.push(a[it])
      end
    end
    for it in 0...@c_items.size
      draw_opt(it)
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    super
    @data = @c_items
    @item_max = @data.size
  end
 
  #--------------------------------------------------------------------------
  # * Include ?
  #  key  : nom d'une quête
  #--------------------------------------------------------------------------
  def include?(key)
    case @type
    when 1
      if !$quests[key].complete? and !$quests[key].failed? and !$quests[key].second?
        return true
      end
    when 2
      unless $quests[key].complete? or $quests[key].failed?
        return $quests[key].second?
      end
    when 3
      return $quests[key].complete?
    when 4
      return $quests[key].failed?
    end
  end

  #--------------------------------------------------------------------------
  # * Draw Opt
  #  itemm  :  quête
  #--------------------------------------------------------------------------
  def draw_opt(itemm)
    a = @c_items
    rect = item_rect(itemm)
    self.contents.clear_rect(rect)
    if $quests[@c_items[itemm]].complete?
      if $quests[@c_items[itemm]].second?
      end
    elsif $quests[@c_items[itemm]].failed?
      if $quests[@c_items[itemm]].second?
      end
      if $quests[@c_items[itemm]].second?
      end
    end
    string = @c_items[itemm]
    rect.width -= 0
    self.contents.draw_text(rect.x, rect.y, rect.width, WLH, string, 0)
  end
end


#==============================================================================
# ** Scene_Quest
#------------------------------------------------------------------------------
#  Cette classe fere le menu de quêtes
#==============================================================================
class Scene_Quest < Scene_Base
 
  #--------------------------------------------------------------------------
  # * Object Initialization
  #   
  #--------------------------------------------------------------------------
  def initialize(index = 0, menu = false)
    @menu = menu
    @index = index
  end
 
  #--------------------------------------------------------------------------
  # * Start processing
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @type = Window_Quest_Type.new
    @type.visible = true
    @type.active = true
    @type.index = @index
    @quests = Window_Select_Quest.new(@index +1)
    @quests.active = false
    @quests.index = -1
    @desc_window = Window_Quest_Desc.new
    @title = Window_Quest_Title.new
    update_desc
  end
 
  #--------------------------------------------------------------------------
  # * Return to Original Screen
  #--------------------------------------------------------------------------
def return_scene
if @menu
$scene = Scene_Map.new
else
$scene = Scene_Menu.new($game_temp.menu_command_index[:quest])
end
end
 
  #--------------------------------------------------------------------------
  # * Terminate
  #--------------------------------------------------------------------------
  def terminate
    dispose_menu_background
    @type.dispose
    @quests.dispose
    @title.dispose
    @desc_window.dispose
  end

  #--------------------------------------------------------------------------
  # * Update Frame
  #--------------------------------------------------------------------------
  def update
    super
    update_menu_background
    @type.update
    @quests.update
    if @type.active
      update_type_selection
    elsif @quests.active
      update_quests_selection
    else
      update_desc_selection
    end
    if Input.trigger?(Input::A)
      Sound.play_cancel
      return_scene
    end
  end

  #--------------------------------------------------------------------------
  # * Update Type Selection
  #--------------------------------------------------------------------------
  def update_type_selection
   
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::C)
      a = @type.index
      Sound.play_cursor
      @type.active = false
      @quests.dispose
      @quests = Window_Select_Quest.new(a + 1)
      @quests.active = true
      @quests.index = 0
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
#        @quests.active = false
        @type.active = false
# fin ajouter ceci
    elsif Input.trigger?(Input::LEFT) or  Input.trigger?(Input::RIGHT)
        a = @type.index
        @quests.dispose
        @quests = Window_Select_Quest.new(a + 1)
        @quests.index = -1
        update_desc
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Quests Decription
  #--------------------------------------------------------------------------
  def update_desc
    case @type.index
    when 0
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEPRINCIP)
    when 1
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMESECOND)
    when 2
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMECOMP)
    when 3
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEFAIL)
    end
  end
  #--------------------------------------------------------------------------
  # * Update Quests Selection
  #--------------------------------------------------------------------------
  def update_quests_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      Sound.play_cursor
      @type.active = true
      @quests.active = false
      @quests.index = -1
      update_desc
      @desc_window.dispose
      @desc_window = Window_Quest_Desc.new
=begin
    elsif Input.trigger?(Input::C)
      if @quests.c_items[@quests.index] == nil
        Sound.play_buzzer
      else
        Sound.play_decision
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
        @quests.active = false
        @type.active = false
      end
=end
      elsif Input.trigger?(Input::UP) or  Input.trigger?(Input::DOWN) or Input.repeat?(Input::DOWN) or Input.repeat?(Input::UP)
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
#        @quests.active = false
        @type.active = false
# fin ajouter ceci
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Desc Selection
  #--------------------------------------------------------------------------
  def update_desc_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      Sound.play_cursor
      @quests.active = true
      update_desc
      @desc_window.dispose
      @desc_window = Window_Quest_Desc.new
    end
  end
end



#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
# This class performs the title screen processing.
#==============================================================================
class Scene_Title < Scene_Base

alias startupquest command_new_game
#--------------------------------------------------------------------------
# * Command: New Game
#--------------------------------------------------------------------------
def command_new_game
startupquest
$quests = {}
end
end
#==============================================================================
# ** Scene_File
#------------------------------------------------------------------------------
# This class performs the save and load screen processing.
#==============================================================================
class Scene_File < Scene_Base

alias savequest write_save_data
#--------------------------------------------------------------------------
# * Write Save Data
# file : write file object (opened)
#--------------------------------------------------------------------------
def write_save_data(file)
savequest(file)
Marshal.dump($quests, file)
end

alias loadquest read_save_data
#--------------------------------------------------------------------------
# * Read Save Data
# file : file object for reading (opened)
#--------------------------------------------------------------------------
def read_save_data(file)
loadquest(file)
$quests = Marshal.load(file)
end
end
Garruk
Garruk
Membre

Nombre de messages : 1030
Age : 39
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Jeu 2 Fév 2012 - 17:57
Merci beaucoup Dricc tu gères =)
Juste une petite question, dans le menu avec les Icon il y a les même problèmes avec l'actualisation du cursor. =/
Je sais j'en demande trop. ><
dricc
dricc
Membre

Nombre de messages : 2760
Localisation : Lille
Distinction : Altruiste - Incarnation de la Patience [Mist']
Date d'inscription : 10/08/2009

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Jeu 2 Fév 2012 - 18:09
Ah oui , evidemment ....

Code:

=begin
########################## Breadlord's Quets Script ############################
Ceci est un script pour quête vous permettant d'avoir une large description des quêtes et de multiples tâches
(entend par là plusieurs à truc à faire pour la même quête hein).
Tu met les quêtes sous forme d'evenement c'est à dire sous ce format :

$quests['nom de la quête'] = Quest.new([' ligne de description 1', 'ligne de description 2, ...],
['tâche 1 description', 'tâche 2 description',...])

Dans ce format 'nom de la quête' correspond au nom de la quête,
'ligne de description N' est la N ème ligne de la description de la quête et
'tâche N description' est la description de la N eme tâche

Pour completer une tâche dans un evenement utilisez $quests['nom de la quête'].complete_sub('tâche description'),
et pour échouer une tâche utilisez $quests['nom de la quête'].fail_sub('tâche description').
Si toutes les tâches sont complétées/échouées alors le status de la quête deviendra complétée/échouée.
Pour mettre une quête en complétée utilisez $quests['nom de la quête'].complete_all,
et échouée utilisez $quests['nom de la quête'].fail_all

Pour vérifier si une quête est complétée utilisez $quests['nom de la quête'].complete?,
et pour vérifier si elle est échouée utilisez $quests['nom de la quête'].failed?.
Pour vérifier si une tâche est complétée utilisez $quests['nom de la quête'].sub_complete?('tâche description')
et pour vérifier si elle est échouée utilisez $quests['nom de la quête'].sub_failed?('tâche description')

Pour definir une quete secondaire il suffit de rajouter true après les taches :
$quests['nom de la quête'] = Quest.new([' ligne de description 1', 'ligne de description 2, ...],
['tâche 1 description', 'tâche 2 description',...], true)

Enfin pour vérifier que la quête existe utilisez $quests['nom de la quête'] != nil
Pour appeler le menu de quête utilisez $scene = Scene_Quest.new
Et pour lancer le menu quête sur un onglet précis il suffit de $scene = Scene_Quest.new(index de l'onglet)
0<= index de l'onglet <= 3



################################################################################
################################################################################
=end

module QUEST_CONFIG

# Ici seront defini les 3 icones correspondant aux tri des quêtes
# QUEST_ICONS = [icone des quetes en cours, icone des quetes complétées, icone des quete echouées]
QUEST_ICONS = [7, 8, 11547, 6]

# Ici sera defini l'image apparaissant dans le menu
# QUEST_PICTURE = "nom de l'image"
QUEST_PICTURE = ""

# Ici sera defini la hauteur des fenêtre et par consequence la place laisser à l'image
# QUEST_WINDOWHEIGHT = hauteur
QUEST_WINDOWHEIGHT = 351 # 293

# Ici sera defini l'image apparaissant lorsqu'une quête est completée
# QUEST_COMPLETE = "nom de l'image"
QUEST_COMPLETE = "Complete"

# Ici sera defini l'image apparaissant lorsqu'une quête est échouée
# QUEST_FAILED = "nom de l'image"
QUEST_FAILED = "Complete"

# Ici sera defini le message apparaissant dans la fenetre de description lors d'une quête secondaire
# QUEST_SECOND = "message"
QUEST_SECOND = ""
# Ici seront defini les 3 icones correspondant aux états des quêtes et des tâches principales
# VALIDATEICONS = [icone des taches en cours, icone des taches complétées, icone des taches echouées]
VALIDATEICONS = [11565, 11547, 11547] # [6417, 6481, 6481]

# Ici seront defini les 3 icones correspondant aux états des quêtes et des tâches secondaires
# VALIDATEICONS = [icone des taches en cours, icone des taches complétées, icone des taches echouées]
VALIDATESECONDICONS = [11565, 6, 6] # [6417, 6513, 6513]

#Ici sera defini le nom apparaissant dans le menu de base
# MENUNAME = nom du menu
MENUNAME = 'Quêtes'

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes principales
# QUEST_NAMEPRINCIP = nom
QUEST_NAMEPRINCIP = "Quêtes"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes secondaires
# QUEST_NAMESECOND = nom
QUEST_NAMESECOND = "Quêtes de chasses"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes réussies
# QUEST_NAMECOMP = nom
QUEST_NAMECOMP = "Quêtes Réussies"

#Ici sera defini le nom apparaissant dans la description de l'onglet des quêtes échouées
# QUEST_NAMEFAIL = nom
QUEST_NAMEFAIL = "Quêtes de chasses Réussies"

# Ici sera defini à titre indicatif le numero du menu quête dans le menu de base (comptez à partir de 0)
# cela n'aura aucune influance sur sa position.
# MENU_NUMBER = umero du menu quête dans le menu de base
MENU_NUMBER = 3

# Ici sera defini l'interrupteur definissant si un tache échoué fais echoué la quête ou non.
# FAILSUB_FAILCOMPLETE = true/false
FAILSUB_FAILCOMPLETE = true

end

#==============================================================================
# ** Quest
#------------------------------------------------------------------------------
#  Cette classe permet de definir des quêtes
#  Elle est appelée par $quests
#==============================================================================
class Quest

attr_accessor :desc, :sub, :comp, :sub_text, :pic

  #--------------------------------------------------------------------------
  # * Quête Initialization
  #    desc    : tableau des descriptions
  #    sub      : tableau des tâches
  #    pic  : window width
  #--------------------------------------------------------------------------
  def initialize(desc = [''], sub = [''], second = false)
    @desc = desc
    @sub = {}
    @second = second
    for i in 0..sub.size - 1  # pour chaque tache
      @sub[sub[i]] = 'prog'      #construit une clef du nom de la tache avec la valeur prog
    end
    @comp = 'prog'
    @sub_text = []
    for i in 0..sub.size - 1
      @sub_text.push(sub[i]) # pour chaque tache
    end
  end
 
  #--------------------------------------------------------------------------
  # * Completer une Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def second?
  return @second
  end
  #--------------------------------------------------------------------------
  # * Completer une Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def complete_sub(sub)
    @sub[sub] = 'comp'
    test_complete
  end
  #--------------------------------------------------------------------------
  # * Tester si la Quête est devenue complete
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def test_complete
    @a = true
    for i in 0..@sub.keys.size - 1
      if @sub[@sub.keys[i]] == 'comp'
        @a = (@a and true)
      else
        @a =  (@a and false)
      end
    end
    if @a == true
      complete_all
    end
  end
  #--------------------------------------------------------------------------
  # * Echouer une  Tâche
  #    sub      :  tâche
  #--------------------------------------------------------------------------
  def fail_sub(sub)
    if QUEST_CONFIG::FAILSUB_FAILCOMPLETE
      fail_all
    else
      @sub[sub] = 'fail'
    end
  end

 
  #--------------------------------------------------------------------------
  # *Compeleter toutes les Tâches
  #--------------------------------------------------------------------------
  def complete_all
    @comp = 'comp'
    for i in @sub.keys
      @sub[i] = 'comp'
    end
  end

  #--------------------------------------------------------------------------
  # *Echouer à toutes les Tâches
  #--------------------------------------------------------------------------
  def fail_all
    @comp = 'fail'
    for i in @sub.keys
      @sub[i] = 'fail'
    end
  end

  #--------------------------------------------------------------------------
  # *Tester si une  Tâches est complete
  #--------------------------------------------------------------------------
  def sub_complete?(sub)
    return @sub[sub] == 'comp'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une Quête est complete
  #--------------------------------------------------------------------------
  def complete?
    return @comp == 'comp'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une  Tâches est échouée
  #--------------------------------------------------------------------------
  def sub_failed?(sub)
    return @sub[sub] == 'fail'? true : false
  end

  #--------------------------------------------------------------------------
  # *Tester si une Quête est échouée
  #--------------------------------------------------------------------------
  def failed?
    return @comp == 'fail'? true : false
  end
end


#==============================================================================
# ** Window_Quest_Type
#------------------------------------------------------------------------------
#  Cette fenetre affiche les differents états des quêtes.
#==============================================================================
class Window_Quest_Type < Window_Selectable

attr_accessor :active, :index
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
super(0,416 - QUEST_CONFIG::QUEST_WINDOWHEIGHT,160,64) # Emplacemen des icons
    @column_max = 4
    @index = 0
    @icons =  QUEST_CONFIG::QUEST_ICONS
    @spacing = 14
    refresh
  end

  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    @item_max = @icons.size
    create_contents
    for i in 0...@item_max
      rect = item_rect(i)
      rect.x -= 2
      icon = @icons[i]
      draw_icon(icon, rect.x, rect.y)
    end
  end
end

#==============================================================================
# ** Window_Quest_Title
#------------------------------------------------------------------------------
#  Cette fenetre affiche les descriptions des quêtes.
#==============================================================================
class Window_Quest_Title < Window_Base

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(index = QUEST_CONFIG::MENUNAME)
super( 0, 352 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 544, 64) # Description
      @pic_title = Sprite.new
      @pic_title.bitmap = Cache.picture(QUEST_CONFIG::QUEST_PICTURE)
      self.contents.draw_text(0, 0, self.width - 40, WLH, index, 1)
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @pic_title.dispose
  end
end

#==============================================================================
# ** Window_Quest_Desc
#------------------------------------------------------------------------------
#  Cette fenetre affiche lee contenue des quêtes.
#==============================================================================
class Window_Quest_Desc < Window_Base

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(index = nil)
super( 160, 416 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 384, QUEST_CONFIG::QUEST_WINDOWHEIGHT) # Les objetctif
    @status = Sprite.new
    if index != nil
      if $quests[index].complete?
        @status.bitmap = Cache.picture(QUEST_CONFIG::QUEST_COMPLETE)
      elsif $quests[index].failed?
        @status.bitmap = Cache.picture(QUEST_CONFIG::QUEST_FAILED)
      end
      @status.z = 201
      for i in 0..$quests[index].desc.size - 1
        a = $quests[index].desc[i]
        self.contents.draw_text(0, WLH*i, self.width - 40, WLH, a, 1)
      end
      a = $quests[index].sub_text
      for i in 0..a.size - 1
        b = a[i]
        if $quests[index].sub[b] == 'prog'
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[0]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[0]
          end
        elsif $quests[index].sub[b] == 'comp'
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[1]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[1]
          end
        else
          if $quests[index].second?
            ic =  QUEST_CONFIG::VALIDATESECONDICONS[2]
          else
            ic =  QUEST_CONFIG::VALIDATEICONS[2]
          end
        end
        draw_icon(ic, 4, WLH*(i + $quests[index].desc.size + 1))
        self.contents.draw_text(0, WLH*(i + $quests[index].desc.size + 1), self.width - 40, WLH, b, 1)
      end
      if $quests[index].second?
        self.contents.draw_text(0, QUEST_CONFIG::QUEST_WINDOWHEIGHT - 3*WLH, self.width - 40, WLH, QUEST_CONFIG::QUEST_SECOND, 1)
      end 
    end
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    super
    @status.dispose
  end
end

#==============================================================================
# ** Window_Quest_Type
#------------------------------------------------------------------------------
#  Cette fenetre affiche lee contenue des quêtes.
#==============================================================================
class Window_Select_Quest < Window_Selectable
 
attr_accessor :c_items

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(type = 1)
super(0, 480 - QUEST_CONFIG::QUEST_WINDOWHEIGHT, 160, 287, QUEST_CONFIG::QUEST_WINDOWHEIGHT)# La liste
    @type = type
    self.index = 0
    self.active = false
    @items = $quests.keys
    @item_max=@items.size
    create_contents
    a = @items
    @c_items = []
    for it in 0...@items.size
      if include?(a[it])
        @c_items.push(a[it])
      end
    end
    for it in 0...@c_items.size
      draw_opt(it)
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    super
    @data = @c_items
    @item_max = @data.size
  end
 
  #--------------------------------------------------------------------------
  # * Include ?
  #  key  : nom d'une quête
  #--------------------------------------------------------------------------
  def include?(key)
    case @type
    when 1
      if !$quests[key].complete? and !$quests[key].failed? and !$quests[key].second?
        return true
      end
    when 2
      unless $quests[key].complete? or $quests[key].failed?
        return $quests[key].second?
      end
    when 3
      return $quests[key].complete?
    when 4
      return $quests[key].failed?
    end
  end

  #--------------------------------------------------------------------------
  # * Draw Opt
  #  itemm  :  quête
  #--------------------------------------------------------------------------
  def draw_opt(itemm)
    a = @c_items
    rect = item_rect(itemm)
    self.contents.clear_rect(rect)
    if $quests[@c_items[itemm]].complete?
      if $quests[@c_items[itemm]].second?
      end
    elsif $quests[@c_items[itemm]].failed?
      if $quests[@c_items[itemm]].second?
      end
      if $quests[@c_items[itemm]].second?
      end
    end
    string = @c_items[itemm]
    rect.width -= 0
    self.contents.draw_text(rect.x, rect.y, rect.width, WLH, string, 0)
  end
end


#==============================================================================
# ** Scene_Quest
#------------------------------------------------------------------------------
#  Cette classe fere le menu de quêtes
#==============================================================================
class Scene_Quest < Scene_Base
 
  #--------------------------------------------------------------------------
  # * Object Initialization
  #   
  #--------------------------------------------------------------------------
  def initialize(index = 0, menu = false)
    @menu = menu
    @index = index
  end
 
  #--------------------------------------------------------------------------
  # * Start processing
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @type = Window_Quest_Type.new
    @type.visible = true
    @type.active = true
    @type.index = @index
    @quests = Window_Select_Quest.new(@index +1)
    @quests.active = false
    @quests.index = -1
    @desc_window = Window_Quest_Desc.new
    @title = Window_Quest_Title.new
    update_desc
  end
 
  #--------------------------------------------------------------------------
  # * Return to Original Screen
  #--------------------------------------------------------------------------
def return_scene
if @menu
$scene = Scene_Map.new
else
$scene = Scene_Menu.new($game_temp.menu_command_index[:quest])
end
end
 
  #--------------------------------------------------------------------------
  # * Terminate
  #--------------------------------------------------------------------------
  def terminate
    dispose_menu_background
    @type.dispose
    @quests.dispose
    @title.dispose
    @desc_window.dispose
  end

  #--------------------------------------------------------------------------
  # * Update Frame
  #--------------------------------------------------------------------------
  def update
    super
    update_menu_background
    @type.update
    @quests.update
    if @type.active
      update_type_selection
    elsif @quests.active
      update_quests_selection
    else
      update_desc_selection
    end
    if Input.trigger?(Input::A)
      Sound.play_cancel
      return_scene
    end
  end

  #--------------------------------------------------------------------------
  # * Update Type Selection
  #--------------------------------------------------------------------------
  def update_type_selection
   
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::C)
      a = @type.index
      Sound.play_cursor
      @type.active = false
      @quests.dispose
      @quests = Window_Select_Quest.new(a + 1)
      @quests.active = true
      @quests.index = 0
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
#        @quests.active = false
        @type.active = false
# fin ajouter ceci
    elsif Input.trigger?(Input::LEFT) or  Input.trigger?(Input::RIGHT) or Input.repeat?(Input::LEFT) or Input.repeat?(Input::RIGHT)
        a = @type.index
        @quests.dispose
        @quests = Window_Select_Quest.new(a + 1)
        @quests.index = -1
        update_desc
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Quests Decription
  #--------------------------------------------------------------------------
  def update_desc
    case @type.index
    when 0
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEPRINCIP)
    when 1
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMESECOND)
    when 2
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMECOMP)
    when 3
      @title.dispose
      @title = Window_Quest_Title.new(QUEST_CONFIG::QUEST_NAMEFAIL)
    end
  end
  #--------------------------------------------------------------------------
  # * Update Quests Selection
  #--------------------------------------------------------------------------
  def update_quests_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      Sound.play_cursor
      @type.active = true
      @quests.active = false
      @quests.index = -1
      update_desc
      @desc_window.dispose
      @desc_window = Window_Quest_Desc.new
=begin
    elsif Input.trigger?(Input::C)
      if @quests.c_items[@quests.index] == nil
        Sound.play_buzzer
      else
        Sound.play_decision
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
        @quests.active = false
        @type.active = false
      end
=end
      elsif Input.trigger?(Input::UP) or  Input.trigger?(Input::DOWN) or Input.repeat?(Input::DOWN) or Input.repeat?(Input::UP)
# ajouter ceci
        @desc_window.dispose
        @desc_window = Window_Quest_Desc.new(@quests.c_items[@quests.index])
        @title.dispose
        @title = Window_Quest_Title.new(@quests.c_items[@quests.index])
#        @quests.active = false
        @type.active = false
# fin ajouter ceci
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Desc Selection
  #--------------------------------------------------------------------------
  def update_desc_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      Sound.play_cursor
      @quests.active = true
      update_desc
      @desc_window.dispose
      @desc_window = Window_Quest_Desc.new
    end
  end
end



#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
# This class performs the title screen processing.
#==============================================================================
class Scene_Title < Scene_Base

alias startupquest command_new_game
#--------------------------------------------------------------------------
# * Command: New Game
#--------------------------------------------------------------------------
def command_new_game
startupquest
$quests = {}
end
end
#==============================================================================
# ** Scene_File
#------------------------------------------------------------------------------
# This class performs the save and load screen processing.
#==============================================================================
class Scene_File < Scene_Base

alias savequest write_save_data
#--------------------------------------------------------------------------
# * Write Save Data
# file : write file object (opened)
#--------------------------------------------------------------------------
def write_save_data(file)
savequest(file)
Marshal.dump($quests, file)
end

alias loadquest read_save_data
#--------------------------------------------------------------------------
# * Read Save Data
# file : file object for reading (opened)
#--------------------------------------------------------------------------
def read_save_data(file)
loadquest(file)
$quests = Marshal.load(file)
end
end


J'ai modifié que ça en fait :
Code:

    elsif Input.trigger?(Input::LEFT) or  Input.trigger?(Input::RIGHT) or Input.repeat?(Input::LEFT) or Input.repeat?(Input::RIGHT)
Garruk
Garruk
Membre

Nombre de messages : 1030
Age : 39
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Jeu 2 Fév 2012 - 18:19
Ah oui en effet. --"
Merci beaucoup pour ton aide Dricc encore une fois. =)
Contenu sponsorisé

[Résolu] Script de quête. Empty Re: [Résolu] Script de quête.

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum