AccueilAccueil  PortailPortail  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  ConnexionConnexion  



-50%
Le deal à ne pas rater :
-50% Baskets Nike Dunk Low
64.99 € 129.99 €
Voir le deal

Partagez
 

 [VX] Système de troc avec les PNJ

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Fred 020
Mage Lv.11
Mage Lv.11
avatar


Masculin Age : 32
Inscrit le : 02/10/2008
Messages : 611

[VX] Système de troc avec les PNJ Empty
MessageSujet: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitimeMer 12 Nov 2008 - 15:04

System de troc(échanges) avec les PNJ par ASHKA

Ce script permet de négocier le prix d'un objet quelconque avec un PNJ.

sources du script: http://www.rpgmakeronline.com/forum/viewtopic.php?id=3652

screen:
[VX] Système de troc avec les PNJ Troc-710

Script: À mettre au dessus de main
Code:

###################################
#
#    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
Revenir en haut Aller en bas
Elezia
Roi des Lapinous
Roi des Lapinous
Elezia


Masculin Age : 33
Inscrit le : 11/10/2008
Messages : 2291

[VX] Système de troc avec les PNJ Empty
MessageSujet: Re: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitimeMer 12 Nov 2008 - 18:20

Merci du partage, super l'idée! néamoins facilement réalisable en event je pense!
Revenir en haut Aller en bas
Fred 020
Mage Lv.11
Mage Lv.11
avatar


Masculin Age : 32
Inscrit le : 02/10/2008
Messages : 611

[VX] Système de troc avec les PNJ Empty
MessageSujet: Re: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitimeMer 12 Nov 2008 - 18:33

Oui c'est sûr mais regarde le screen, le bel effet ^^
Revenir en haut Aller en bas
Matsuo Kaito
+ Heir Øf Ŧime +
+ Heir Øf Ŧime +
Matsuo Kaito


Masculin Age : 32
Inscrit le : 27/06/2008
Messages : 10881

[VX] Système de troc avec les PNJ Empty
MessageSujet: Re: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitimeMer 12 Nov 2008 - 18:51

Merci bien pour le script ^w^
Revenir en haut Aller en bas
jebbou
Doyen
Doyen
jebbou


Masculin Age : 45
Inscrit le : 20/08/2008
Messages : 2485

[VX] Système de troc avec les PNJ Empty
MessageSujet: Re: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitimeMer 12 Nov 2008 - 21:24

Le problème en event serait de comparer la valeur totale des objets échangés. Je ne sais pas si c'est possible. Mais puisque ca existe en script, c'est bien plus façile à gérer ^^

Merci pour le partage!
Revenir en haut Aller en bas
Dark wolf
Poulet carnivore Lv.2
Poulet carnivore Lv.2
Dark wolf


Masculin Age : 31
Inscrit le : 09/10/2008
Messages : 17

[VX] Système de troc avec les PNJ Empty
MessageSujet: Re: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitimeJeu 13 Nov 2008 - 18:57

Merci pour ce script.
Revenir en haut Aller en bas
Invité
Invité
avatar



[VX] Système de troc avec les PNJ Empty
MessageSujet: Re: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitimeJeu 13 Nov 2008 - 19:47

Ça a l'air duuuur les scripts !
Revenir en haut Aller en bas
Fred 020
Mage Lv.11
Mage Lv.11
avatar


Masculin Age : 32
Inscrit le : 02/10/2008
Messages : 611

[VX] Système de troc avec les PNJ Empty
MessageSujet: Re: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitimeJeu 13 Nov 2008 - 20:46

Ça l'air dur évidemment vu d'un premier oeil mais l'idée c'est plutôt de visualiser la structure afin d'établir les scripts. Moi ce que je fais vu que je suis terrible en script, je cherche et je partage.
Revenir en haut Aller en bas
Contenu sponsorisé




[VX] Système de troc avec les PNJ Empty
MessageSujet: Re: [VX] Système de troc avec les PNJ   [VX] Système de troc avec les PNJ Icon_minitime

Revenir en haut Aller en bas
 

[VX] Système de troc avec les PNJ

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

 Sujets similaires

-
» Problème Avec le systeme ABS
» Création de quête avec les système jour nuit -
» Faire un système de réputation avec classement en event
» Problème mineur avec mon système de combat alcool [Résolu]
» Je recherche un iPhone 4 ( achat & troc )

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RPG Maker VX :: Entraide :: Scripts :: Scripts VX - RGSS2 :: Évents & PNJs-
Créer un forum | ©phpBB | Forum gratuit d'entraide | Signaler un abus | Forum gratuit