Partagez
Aller en bas
ASHKA
ASHKA
Membre

Nombre de messages : 242
Age : 37
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008

Systeme de troc avec les PNJ Empty Systeme de troc avec les PNJ

le Mar 28 Oct 2008 - 15:56
Nom : Systeme de troc avec les PNJ
Auteur : ASHKA
Information : Surtout, lisez bien l'entete !!
( Tout y est expliqué ... )

Créez un nouveau script dans l'espace adéquate et collez y ceci :

Code:
#===============================================================
#                         
#                www.rpgmakervx-fr.com                                         
#     
#===============================================================
###################################
#
#    Systeme de troc d'objet avec les PNJ
#
###################################
=begin
 Le principe est simple : il est possible pour le héros d'echanger des objets avec les PNJ.
 Vous pouvez decider quel PNJ possedera des objets.
 Vous lancer le menu "echange" en parlant au PNJ avec la touche "A" du clavier.
 S'il n'ont pas d'objet, il y aura un son d'erreur.
 Les PNJ perdent les objets qu'il vous donnent et gagnent les votres.
 Pour eviter que les PNJ possedent les mêmes objets tout au long du jeu, il existe un systeme de niveau
 geré par une variable de jeu dont l'ID doit etre defini ci-dessous ligne 41.
 Les possessions des PNJ sont determiné grace à un commentaire placé dans la progammation du PNJ.
 Voici comment il doit etre :
 ( Respectez impérativement ces regles !! )
 
 KEY=1-O1-W1-A1
 KEY=2-O4-O5-A7
 KEY=4-W11
 
 Le nombre apres KEY= correspond au niveau d'echange ( celui determiné par la variable sus-mentionné )
 Les blocs suivants correspondent au objets que possede le PNJ à l'origine
 Les codes O W ou A designe le type d'objet :
 O pour objet  /  W pour arme  /  A pour armure
 Le chiffres juste apres est l'ID de l'objet en question.
 Un PNJ avec ce commentaire possedera donc :
 Au niveau 1 : L'objet d'ID 1, l'arme d'ID 1 et l'armure d'ID 1
 Au niveau 2 : L'objet d'ID 4, l'objet d'ID 5 et l'armure d'ID 7
 Rien au niveau 3
 Au niveau 4 : L'arme d'ID 11
 Rien ensuite
 
 Vous pouvez placer les objets d'un même niveau sur plusieurs lignes du moment qu'elle commence toutes par KEY=.
 Vous pouvez utiliser plusieurs commentaires à la suite.
 Si les PNJ echangeurs doivent avoir plusieurs pages de programmation, placez les commentaires sur chaques ( au debut ).
N'oubliez pas de configurer les options suivantes !!
=end
module Troc
# Placez ici l'ID de la variable de jeu qui controlera le niveau des echanges
  Var_type = 1
# Ici, placez le pourcentage de valeur de l'objet du PNJ à echanger
# A 50, le joueur devra offrir des objets couvrant la moitié du prix de l'objet
# A 100, le joueur devra offrir des objets couvrant le prix de l'objet
# A 200, le joueur devra offrir des objets couvrant le double du prix de l'objet
  Pourc_objet = 120
# Ici, c'est l'estimation du prix des objets offert par le héros qui peut etre modifié
# A 50, le PNJ estimera l'objet à la moitié du prix en magasin
# A 100, le PNJ utilisera le prix réel
  Pourc_heros = 75
end
###################################
class Scene_Title < Scene_Base
  alias troc_cmd command_new_game
  def command_new_game
    $event_possession = Hash.new
    troc_cmd
  end
end
###################################
class Scene_File < Scene_Base
  def write_save_data(file)
    characters = []
    for actor in $game_party.members
      characters.push([actor.character_name, actor.character_index])
    end
    $game_system.save_count += 1
    $game_system.version_id = $data_system.version_id
    @last_bgm = RPG::BGM::last
    @last_bgs = RPG::BGS::last
    Marshal.dump(characters,          file)
    Marshal.dump(Graphics.frame_count, file)
    Marshal.dump(@last_bgm,            file)
    Marshal.dump(@last_bgs,            file)
    Marshal.dump($game_system,        file)
    Marshal.dump($game_message,        file)
    Marshal.dump($game_switches,      file)
    Marshal.dump($game_variables,      file)
    Marshal.dump($game_self_switches,  file)
    Marshal.dump($game_actors,        file)
    Marshal.dump($game_party,          file)
    Marshal.dump($game_troop,          file)
    Marshal.dump($game_map,            file)
    Marshal.dump($game_player,        file)
    Marshal.dump($event_possession, file)
  end
  def read_save_data(file)
    characters          = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    @last_bgm            = Marshal.load(file)
    @last_bgs            = Marshal.load(file)
    $game_system        = Marshal.load(file)
    $game_message        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables      = Marshal.load(file)
    $game_self_switches  = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party          = Marshal.load(file)
    $game_troop          = Marshal.load(file)
    $game_map            = Marshal.load(file)
    $game_player        = Marshal.load(file)
    $event_possession = Marshal.load(file)
    if $game_system.version_id != $data_system.version_id
      $game_map.setup($game_map.map_id)
      $game_player.center($game_player.x, $game_player.y)
    end
  end
end
###################################
class Game_Event < Game_Character
  attr_reader :name
  def initialize(map_id, event)
    super()
    @map_id = map_id
    @event = event
    @name = event.name
    @id = @event.id
    @erased = false
    @starting = false
    @through = true
    moveto(@event.x, @event.y)            # Move to initial position
    refresh
  end
  def possession
    key = [$game_map.map_id, @id, $game_variables[Troc::Var_type]]
    determine_possession(key)
    if $event_possession.key?(key)
      return $event_possession[key]
    end
    return []
  end
  def determine_possession(key)
    return if $event_possession.key?(key)
    tab = []
    for cmd in @list
      case cmd.code
      when 108,408,608
        text = cmd.parameters.to_s
        if text.include?("KEY=")
          bloc = text.split("-")
          tab.push(bloc)
        end
      end
    end
    if tab != []
      $event_possession[key] = []
      for line in tab
        bloc = line[0]
        if bloc.include?("KEY=")
          num = bloc.to_s.delete("KEY=").to_i
          if num == $game_variables[Troc::Var_type]
            for x in 1...line.size
              info = line[x]
              if info.include?("O")
                id = info.delete("O").to_i
                $event_possession[key].push($data_items[id])
            elsif info.include?("W")
                id = info.delete("W").to_i
                $event_possession[key].push($data_weapons[id])
              elsif info.include?("A")
                id = info.delete("A").to_i
                $event_possession[key].push($data_armors[id])
              end
            end
          end
        end
      end
    end
    $event_possession.delete(key) if $event_possession[key] == []
  end
end
###################################
class Game_Player < Game_Character
  def update_nonmoving(last_moving)
    return if $game_map.interpreter.running?
    return if moving?
    return if check_touch_event if last_moving
    if not $game_message.visible and Input.trigger?(Input::C)
      return if get_on_off_vehicle
      return if check_action_event
    end
##
    update_bouton
##
    update_encounter if last_moving
  end
  def update_bouton
    return  if $game_map.interpreter.running?
    front_x = $game_map.x_with_direction(@x, @direction)
    front_y = $game_map.y_with_direction(@y, @direction)
    for event in $game_map.events_xy(front_x, front_y)
      if Input.trigger?(Input::X)
        if event.possession != []
          Sound.play_decision
          $scene = Scene_Troc.new(event)
        else
          Sound.play_buzzer
        end
      end
    end
  end
end
###################################
class Scene_Troc < Scene_Base
  def initialize(event)
    @event = event
    @poss = event.possession
  end
  def start
    @tab = []
    @prix = nil
    @offre = nil
    @fond = Spriteset_Map.new
    @chara = Window_Faceset.new(0,@event)
    @liste_chara = Window_Possession.new(0, @event)
    @heros = Window_Faceset.new(442,$game_player)
    @liste_heros = Window_Possession.new(272, $game_player)
    @liste_heros.active = false
    @liste_heros.index = -1
    @cadre = Window_Centrale.new
    @confirme = Window_Command.new(100, ["Valider", "Retour"])
    @confirme.visible = false
    @confirme.active = false
    @confirme.z = 150
    @confirme.x = 222
    @confirme.y = 168
  end
  def terminate
    @fond.dispose
    @heros.dispose
    @chara.dispose
    @liste_chara.dispose
    @liste_heros.dispose
    @cadre.dispose
    @confirme.dispose
  end
  def update
    @fond.update
    @heros.update
    @chara.update
    @liste_chara.update
    @liste_heros.update
    @cadre.update
    @confirme.update
    if @confirme.active
      update_confirme
      return
    end
    if @offre != nil and @prix != nil and @offre >= @prix
      @confirme.active = true
      @confirme.visible = true
      @liste_heros.active = false
      return
    end
    if @liste_heros.active
      update_troc
      return
    end
    if Input.trigger?(Input::B)
      Sound.play_cancel
      $scene = Scene_Map.new
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @objet = @liste_chara.item
      @prix = (@objet.price *  Troc::Pourc_objet) / 100
      @cadre.refresh(@objet, nil, @prix, @offre)
      @liste_chara.active = false
      @liste_heros.active = true
      @liste_heros.index = 0
    end
  end
  def update_troc
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @liste_chara.active = true
      @liste_heros.active = false
      @liste_heros.index = -1
      @tab.clear
      @offre = nil
      @cadre.refresh(@objet, @tab, @prix, @offre)
      @liste_heros.refresh(@tab)
    elsif Input.trigger?(Input::C)
      item = @liste_heros.item
      if item != nil
        Sound.play_decision
        @tab.push(item)
        @offre = 0
        for x in @tab
          @offre += ((x.price * Troc::Pourc_heros) / 100)
        end
        @cadre.refresh(@objet, @tab, @prix, @offre)
        @liste_heros.refresh(@tab)
      else
        Sound.play_buzzer
      end
    end
  end
  def update_confirme
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @tab.delete(@tab.last)
      @offre = 0
      for x in @tab
        @offre += ((x.price * Troc::Pourc_heros) / 100)
      end
      @cadre.refresh(@objet, @tab, @prix, @offre)
      @liste_heros.refresh(@tab)
      @confirme.active = false
      @confirme.visible = false
      @liste_heros.active = true
    elsif Input.trigger?(Input::C)
      case @confirme.index
      when 0
        Sound.play_decision
        for item in @tab
          @poss.push(item)
          $game_party.lose_item(item, 1)
        end
        $game_party.gain_item(@objet, 1)
        @poss.delete(@objet)
        $scene = Scene_Troc.new(@event)
      when 1
        Sound.play_decision
        @tab.delete(@tab.last)
        @offre = 0
        for x in @tab
          @offre += ((x.price * Troc::Pourc_heros) / 100)
        end
        @cadre.refresh(@objet, @tab, @prix, @offre)
        @liste_heros.refresh(@tab)
        @confirme.active = false
        @confirme.visible = false
        @liste_heros.active = true
      end
    end
  end
end
###################################
class Window_Faceset < Window_Base
  def initialize(x, actor)
    super(x, 0, 102, 128)
  @actor = actor
    refresh
  end
  def refresh
    self.contents.clear
    if @actor != nil
      draw_character(@actor.character_name, @actor.character_index, 35, 48)
      if @actor.is_a?(Game_Event)
        name = @actor.name
      else
        name = $game_party.members[0].name
      end
      self.contents.draw_text(0, 64, 70, 24, name, 1)
    end
  end
end
###################################
class Window_Possession < Window_Selectable
  def initialize(x, actor, tab = nil)
    super(x, 128, 272, 288)
    @actor = actor
    @column_max = 1
    self.index = 0
    refresh(tab)
  end
  def item
    return @data[self.index]
  end
  def refresh(tab)
    @tab = tab
    @data = []
    if @actor.is_a?(Game_Event)
      objet = @actor.possession
      for item in objet
        @data.push(item)
      end
    else
      objet = $game_party.items
      for item in objet
        num = 0
        if @tab != nil
          for obj in @tab
            num += 1 if obj == item
          end
        end
        if $game_party.item_number(item) > num
          @data.push(item)
        end
      end
    end
    @item_max = @data.size
    create_contents
    for i in 0...@item_max
      draw_item(i)
    end
  end
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    item = @data[index]
    if item != nil
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, true)
      unless @actor.is_a?(Game_Event)
        num = 0
        if @tab != nil
          for obj in @tab
            num += 1 if obj == item
          end
        end
        number = $game_party.item_number(item) - num
        self.contents.draw_text(rect, sprintf(":%2d", number), 2)
      end
    end
  end
end
###################################
class Window_Centrale < Window_Base
  def initialize(obj = nil, tab = nil, prix = nil, offre = nil)
    super(102, 0, 340, 128)
    refresh(obj, tab, prix, offre)
  end
  def refresh(obj, tab, prix, offre)
    self.contents.clear
    if obj != nil
      xx = ((340 - 32) / 2) - ((contents.text_size(obj.name).width + 24) / 2)
      draw_item_name(obj, xx, 0, true)
    end
    nbr = tab.nil? ? "0" : tab.size.to_s
    self.contents.draw_text(0, 24, 340 - 32, 24, "Nombres d'objets en echange : " + nbr, 1)
    self.contents.draw_text(0, 2 * 24, 180, 24, "Prix :", 2)
    self.contents.draw_text(0, 3 * 24, 340, 24, "Offre :")
    self.contents.fill_rect(70, 3 * 24, 204, 24, Color.new(0, 0, 0, 255))
    if prix != nil and offre != nil
      if prix > offre
        self.contents.font.color.alpha = 128
      end
      self.contents.draw_text(0, 2 * 24, 340 - 32, 24, "OK !!", 2)
      self.contents.font.color.alpha = 255
      pourc = (offre * 100) / prix
      if pourc < 100
        self.contents.fill_rect(72, 3 * 24 + 2, pourc, 20, Color.new(0, 0, 255, 255))
      else
        self.contents.fill_rect(72, 3 * 24 + 2, 100, 20, Color.new(0, 255, 0, 255))
        supp = [(pourc - 100), 100].min
        self.contents.fill_rect(172, 3 * 24 + 2, supp, 20, Color.new(255, 0, 0, 255))
      end
    end
    self.contents.fill_rect(167, 3 * 24, 10, 24, Color.new(255, 255, 255, 255))
  end
end

Un ch'ti screen pour voir ce qui vous attends :

Systeme de troc avec les PNJ Troc-75c4b4

ASHKA


Dernière édition par ASHKA le Jeu 27 Nov 2008 - 22:10, édité 1 fois
Shadow Tr.
Shadow Tr.
Membre

Nombre de messages : 438
Age : 28
Localisation : au siège de la mog-poste
Distinction : Harceleur Sexuel et Voyeur
Est un Connard (avec un grand C)
Ne veut pas harceler par MP avec des images cochonnes x)
Date d'inscription : 12/10/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mar 28 Oct 2008 - 15:59
hé mais c'est intéressant tout ça !!!
Merci ^^
AnthO'
AnthO'
Membre

Nombre de messages : 2202
Age : 26
Localisation : Orléans
Distinction : Panda d'élite

[Wax Rolling Eyes]
Date d'inscription : 05/01/2008
http://anthonybourgouin.fr

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mar 28 Oct 2008 - 16:12
Bon script...
Le Scripteur commence à faire parler de lui ! Very Happy
freezia
freezia
Staffeux retraité

Nombre de messages : 1734
Distinction : Elu membre de l'année 2009 haut la main.
Inventeur du Mapping Show.

caricaturatationeur de la comu'
[ Dudu']
Date d'inscription : 18/02/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mar 28 Oct 2008 - 18:13
Original comme système ! Vraiment pas mal du tout !!
ASHKA
ASHKA
Membre

Nombre de messages : 242
Age : 37
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mar 28 Oct 2008 - 18:20
Original, pas vraiment.
L'essentiel de mon "oeuvre" est de scripter des systemes trouvés dans des jeux pros.
Ici, c'est Hack qui m'a inspiré !!

ASHKA
Berka
Berka
Administrateur

Nombre de messages : 1832
Age : 29
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

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mar 28 Oct 2008 - 18:20
joli !

sauf que tu devrais mettre des gradientbars, plus dans le style rmvx ! Wink
ASHKA
ASHKA
Membre

Nombre de messages : 242
Age : 37
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mar 28 Oct 2008 - 18:35
C'est vrai, autant profiter de l'une des innovations du RGSS2 !!
Mais je ne suis pas trés doué pour l'aspect "visuel" ...

ASHKA
Parasoft
Parasoft
Membre

Nombre de messages : 27
Distinction : aucune
Date d'inscription : 27/07/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mer 12 Nov 2008 - 19:35
Bonjour,
Ca ne marche pas. J'ai essayé.
Arayashiki
Arayashiki
Membre

Nombre de messages : 655
Age : 29
Localisation : Trois lettres me demangent. Oserai-je ?
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 18/08/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mer 12 Nov 2008 - 19:43
Et bien pour un premier post ,après la présentation, c'est du lourd.

Détail plus ton problème sinon on pourra pas t'aider.
Jess
Jess
Staffeux retraité

Nombre de messages : 855
Age : 28
Localisation : Ma drums ou mon ordi !
Distinction : Dieu de Kipatord


Date d'inscription : 04/05/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Mer 12 Nov 2008 - 21:21
Trop bien ce script, je vais m'en servir pour faire un système de collectionneur comme dans guild wars ! Pour mon jeu Kipatord ça vas être bien. ^^ Alors merci à toi sérieux. Et heu... Parasoft, précise plus ton problème, on pourrais sûrement t'aider.
A tchoux
Parasoft
Parasoft
Membre

Nombre de messages : 27
Distinction : aucune
Date d'inscription : 27/07/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Jeu 13 Nov 2008 - 22:01
Disons, que je ne sais pas manipuler le script.
Pour tout vous dire, le script est fonctionnel mais hier j'ai cru le contraire. En effet, je n'ai rien compris à la tuto d'Askha. Aidez-moi !
ASHKA
ASHKA
Membre

Nombre de messages : 242
Age : 37
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Jeu 13 Nov 2008 - 22:38
Pfuh, moi qui fais des efforts pour vous donner des trucs simples à utiliser ...
Je suis deçu !!

Alors, d'abord les reglages :

Tu peux indiquer une sorte de taux d'echange.
Pourc_objet indique le prix que le PNJ exige.
Si c'est sup à 100, il en exige plus que le prix normal.

Pourc_heros indique l'estimation que le PNJ fait de ton objet.
Si c'est inf à 100, il le sous-estime.

Ensuite, les objets des PNJ :
Dans un PNJ qui pourra faire un echange, tu place un commentaire.
Le com' doit etre construit comme ceci :

KEY=1-O1-W1-A1

Le KEY=1 indique les possessions du PNJ au niveau 1.
Ce niveau est geré par une variable de jeu.
Au cours du jeu, augmenter cette variable permet de renouveller le stock des PNJ.

Apres, chaque groupe lettre-chiffre represente une possesion du PNJ.
O pour objet, W pour arme et A pour armure.
Le chiffre est l'ID de la possesion, sa place dans la base de donnée.

Bref, place KEY=1-O1-W1-A1 en commentaire dans un event, teste et parle lui avec la touche "A".
C'est sans doute la meilleure maniere de comprendre.

ASHKA
Parasoft
Parasoft
Membre

Nombre de messages : 27
Distinction : aucune
Date d'inscription : 27/07/2008

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Ven 14 Nov 2008 - 18:09
Merci.
avatar
Az'
Membre

Nombre de messages : 3317
Age : 74
Date d'inscription : 22/12/2007

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Ven 14 Nov 2008 - 18:28
Arrête le flood quoi, c'est bien de remercier, m'enfin, un peu plus de constructivité aurait été la bienvenue...
[Averto' oral] ==> [Prochaine fois un vrai averto']

Allez, en Ruby :

Code:
class Parasoft

def initialize(taux_chianteur =0)
@t_chiant = taux_chiateur
@parasoft = Chiant.new # Classe fictive
update
end

def update
@t_chiant += 1 if @parasoft != nil ; end
update
end
end

Ouais, codé à l'arrache, flemme de finir.

berka: pas besoin de ;end Wink
et puis l'appel d'une methode dans la meme methode va remplir la pile memoire, ce qui va te donner une erreur "stack level too deep"
Yasan
Yasan
Membre

Nombre de messages : 149
Age : 34
Distinction : aucune
Date d'inscription : 18/01/2011

Systeme de troc avec les PNJ Empty Re: Systeme de troc avec les PNJ

le Lun 24 Jan 2011 - 9:46
J'ai une question à propos de ce script ^^

J'aimerai faire en sorte de pouvoir appeler la transaction autrement que par la touche A (dans un dialogue en fait).

Donc j'ai tenté le coup en supprimant

Spoiler:
if Input.trigger?(Input::X)
if event.possession != []
Sound.play_decision
$scene = Scene_Troc.new(event)
else
Sound.play_buzzer
end
end

Pour éviter que le imput fonctionne, et dans le dialogue j'ai ajouté ça =>

$scene = Scene_Troc.new(1) (le 1 étant normalement l'event)

Mais ça ne marche pas :/ Une piste ?
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum