Partagez
Aller en bas
avatar
Elscorto
Membre

Nombre de messages : 486
Age : 33
Localisation : Dans sa tombe en ce moment
Distinction : Homme de goût en chef.
Date d'inscription : 10/07/2008

Aide pour script personnel

le Mar 3 Mar 2009 - 18:47
Bonsoir, voilà j'essaye de faire un système de script pour m'exercer au rgss2, je voulais pas le poster avant qu'il soit fini mais là je ne voie pas Sad

Je vous explique le système, on créé un objet quête dans la BDD, la description de l'objet correspond au nom de la quête, dans les commentaires on a description,but et gain.
Quand l'objet est donné, cette quête passe en active, quand l'objet est perdu,la quête passe en fini. Voilà ensuite c'est juste un affichage banal.

J'ai d'abord essayé avec une BDD en script et ça fonctionne impec mais là, c'est pas bon.
Je tiens à dire que je suis parti à la base d'un script de Tonyryu, donc si vous trouvez des ressemblances,c'est normal, quand le script sera fini, je lui demanderai bien sûr l'autorisation.

Voilà le script en question
Code:

class String
 
  def decoupe
    bloc = []
    self.split(/[\r\n]+/).each { |line| bloc.push(line) }
    return bloc
  end
 
end

class Game_quete
  attr_accessor :tab_def_quete
 
  def initialize(item_id)
 
    @etat =  0
    @nom = $data_items[item_id].description
    @text = $data_items[item_id].note
    @commentaire = @text.decoupe
 
    for line in @commentaire
      if line.include?("DESC = ")
        @desc = line.gsub!("DESC = "," ")
      end
      if line.include?("BUT = ")
        @but = line.gsub!("BUT = "," ")
      end
      if line.include?("GAIN = ")
        @gain = line.gsub!("GAIN = "," ")
      end
    end
 
    @tab_def_quete = {"nom" => @nom,
                              "etat" => @etat,
                              "desc" => @commentaire,
                              "but" => @but,
                              "gain" => @gain}
    end
end


class Game_Party < Game_Unit
  attr_accessor :tab_quete
 
  alias quete_initialize initialize
  def initialize
    quete_initialize
    @tab_quete = []
  end
 
  def items
    result = []
    for i in @items.keys.sort
      if $data_items[i].name.include?("Quete")
        item = $data_items[i]
        @tab_quete.push(Game_quete.new(item.id))
      else
        result.push($data_items[i]) if @items[i] > 0
      end
    end
    for i in @weapons.keys.sort
      result.push($data_weapons[i]) if @weapons[i] > 0
    end
    for i in @armors.keys.sort
      result.push($data_armors[i]) if @armors[i] > 0
    end
    return result
  end
 
  #--------------------------------------------------------------------------
  # * Gain Items (or lose)
  #    item          : Item
  #    n            : Number
  #    include_equip : Include equipped items
  #--------------------------------------------------------------------------
  def gain_item(item, n, include_equip = false)
    number = item_number(item)
    case item
    when RPG::Item
      for i in 0...@tab_quete.size
        if  @tab_quete[i] ==  item.id
          @tab_quete[i]["etat"] = 1
        end 
      end
      @items[item.id] = [[number + n, 0].max, 99].min
    when RPG::Weapon
      @weapons[item.id] = [[number + n, 0].max, 99].min
    when RPG::Armor
      @armors[item.id] = [[number + n, 0].max, 99].min
    end
    n += number
    if include_equip and n < 0
      for actor in members
        while n < 0 and actor.equips.include?(item)
          actor.discard_equip(item)
          n += 1
        end
      end
    end
  end
end

class Window_EtatQuete < Window_Selectable
  def initialize(x,y)
    super(x,y,544,75)
    @item_max = 2
    @column_max = 2
 
    self.index = 0
    refresh
  end
 
  def refresh
    self.contents.clear
 
    self.contents.draw_text(0,0,120,24,"Quête active",1)
    self.contents.draw_text(275,0,100,24,"Quête finie",1)
  end
 
  def update_cursor
    super
  end
 
end

class Window_ListeQuete < Window_Selectable
  WLH = 20
  def  initialize(x,y)
    super(x,y,200,341)
 
 
    @column_max = 1
    self.index = -1
    self.active = false
    refresh
  end
 
  def refresh(etat_quete = 1)
    self.contents.clear
    @tab_quete = []
    for i in 0...$game_party.tab_quete.size
      if $game_party.tab_quete[i]["etat"] == etat_quete
        @tab_quete.push(i)
      end
   
    end
    @item_max = @tab_quete.size
 
    if @item_max > 0
      for i in 0...@tab_quete.size
        id_quete = @tab_quete[i]
        self.contents.font.size = 16
        self.contents.draw_text(0, (i * 20) -2, 250, 20,$game_party.tab_quete[id_quete]["nom"])
      end
   
    end
 
 
  end
 
  def nb_quete
    return @tab_quete.size
  end
 
 
  def id_quete
    return @tab_quete[@index]
  end
 
  def item_rect(index)
    rect = Rect.new(0,0,0,0)
    rect.width = (contents.width + @spacing) / @column_max - @spacing
    rect.height = WLH
    rect.x = index % @column_max * (rect.width + @spacing)
    rect.y = index / @column_max * WLH
    return rect
  end
 
  def update_cursor
    super
  end

end

class Window_DetailQuete < Window_Base
  def initialize(x,y)
    super(x,y,344,341)
    refresh
  end
 
  def refresh(id_quete = -1)
    self.contents.clear
    return if id_quete == -1
    ligne = 0
 
    self.contents.font.italic = true
    self.contents.draw_text(20,ligne*20,100,20, "Description : ")
    self.contents.font.italic = false

    self.contents.draw_text(0,ligne*20,290,20,$game_party.tab_quete[id_quete]["desc"])
    ligne +=2
 
    self.contents.font.italic = true
    self.contents.draw_text(20,ligne*20,290,20,"But : ")
    self.contents.font.italic = false
    ligne +=1
    self.contents.font.size = 18
    self.contents.draw_text(0,ligne*20,290,20,$game_party.tab_quete[id_quete]["but"])
    ligne +=2
    self.contents.font.italic = true
    self.contents.draw_text(20,ligne *20,100,20,"Récompenses : ")
    self.contents.font.italic = false
 
    for i in 0...$game_party.tab_quete[id_quete]["gain"].size
      gain = $game_party.tab_quete[id_quete]["gain"][i]
      nbre = gain[1].to_s
   
      if gain[0] =="EXP"
        ligne +=1
        self.contents.draw_text(0,ligne*20,290,20,"Exp : " + nbre)
      elsif gain[0] =="ARGENT"
        ligne +=1
        self.contents.draw_text(0,ligne*20,290,20,"Argent : "+nbre+Vocab::gold)
      end
   
      if ["OBJ","ARME","ARMU"].include?(gain[0])
        case gain[0]
        when "OBJ"
          ligne +=1
          item = $data_items[gain[2]]
        draw_icon(item.icon_index,0,ligne*20)
        self.contents.draw_text(30,ligne*20,290,20,item.name + " * "+ nbre)
        when "ARME"
          ligne +=1
          item = $data_weapons[gain[2]]
          draw_icon(item.icon_index,0,ligne*20)
          self.contents.draw_text(30,ligne*20,290,20,item.name+ " * " + nbre)
        when "ARMU"
          ligne +=1
          item = $data_armors[gain[2]]
          draw_icon(item.icon_index,0,ligne*20)
          self.contents.draw_text(30,ligne*20,290,20,item.name+ " * " + nbre)
        end
      end
    end
  end
end


class Scene_Quete < Scene_Base
  def start
    create_menu_background
    @window_etat = Window_EtatQuete.new(0,0)
    @window_liste = Window_ListeQuete.new(0,75)
    @window_detail = Window_DetailQuete.new(200,75)
  end
 
  def  terminate
    dispose_menu_background
    @window_detail.dispose
    @window_liste.dispose
    @window_etat.dispose
    end
 
  def  update
    super
    update_menu_background
    @window_etat.update
    @window_liste.update
    @window_detail.update
 
    if  @window_etat.active
      gerer_etat
    elsif @window_liste.active
      gerer_liste
    end
  end
 
 
  def gerer_etat
    if Input.trigger?(Input::B)
      Sound.play_cancel
      $scene = Scene_Map.new
    end
   
    if Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT)
      @window_liste.refresh(@window_etat.index + 1)
    end
   
    if Input.trigger?(Input::C)
      return if @window_liste.nb_quete == 0
      Sound.play_decision
      @window_etat.active = false
      @window_liste.active = true
      @window_liste.index = 0
      @window_detail.refresh(@window_liste.id_quete)
    end
   
  end
 
  def gerer_liste
    if Input.trigger?(Input::DOWN) or Input.trigger?(Input::UP)
      @window_detail.refresh(@window_liste.id_quete)
    end
 
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @window_liste.active = false
      @window_etat.active = true
      @window_liste.index = -1
      @window_detail.refresh
      return
    end
  end
 end

Attention, je ne tiens pas à ce qu'on me le fasse mais plutôt qu'on m'explique ce qui ne vas pas, ici en l'occurrence, mes quêtes ne s'affichent pas,ma question est pourquoi?
Merci à vous.

Le vieux!
avatar
Elscorto
Membre

Nombre de messages : 486
Age : 33
Localisation : Dans sa tombe en ce moment
Distinction : Homme de goût en chef.
Date d'inscription : 10/07/2008

Re: Aide pour script personnel

le Jeu 5 Mar 2009 - 7:55
Bon ben je up dans l'espoir de trouver de l'aide Sad

Merci
avatar
Berka
Administrateur

Nombre de messages : 1831
Age : 28
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: Aide pour script personnel

le Jeu 5 Mar 2009 - 18:40
je n'ai pas tellement étudié ton systeme de près, mais je remarque un premier problème.

tu stockes tes quetes dans un hash.
le problème c'est que ton hash ne possède qu'une clé d'acces pour toutes les quetes... "nom"
voila ce que je propose:
tu crées un hash vide:
Code:
hash={}
tu attribues un id pour chaque quete:
Code:
id = 10
hash[id]={'nom'=>@NOM, 'desc''=>@DESC, 'but'=>@BUT, 'gain'=>@GAIN}}
et tu accede a tes quetes:
Code:
hash[id]['nom']
=>@NOM

ce sera plus propre !

berka
avatar
Elscorto
Membre

Nombre de messages : 486
Age : 33
Localisation : Dans sa tombe en ce moment
Distinction : Homme de goût en chef.
Date d'inscription : 10/07/2008

Re: Aide pour script personnel

le Jeu 5 Mar 2009 - 18:59
Je teste quand j'aurai le temps, merci Berka.
avatar
RGS_Dakara
Membre

Nombre de messages : 3
Age : 27
Localisation : Illusiopolis
Distinction : aucune
Date d'inscription : 14/03/2009

Re: Aide pour script personnel

le Sam 14 Mar 2009 - 16:04
Salut à toi Elscorto.

Personnelement mon aide ne te sera pas précieuse car je ne vois pas très bien comment analysé ton truc si ce n'est relevé les détails comme l'a fait Berka... D'ailleurs bien vu de la part de Berka.

Désolé, méssage inutile mais au moins j'ai ai jeté un oeil... Crying or Very sad

Tiens nous au courant, merci.
Bye.
avatar
Berka
Administrateur

Nombre de messages : 1831
Age : 28
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: Aide pour script personnel

le Sam 14 Mar 2009 - 16:51
en effet, ton message est totalement inutile... Evil or Very Mad

berka
Contenu sponsorisé

Re: Aide pour script personnel

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