Mage Lv.11
Age : 33 Inscrit le : 02/10/2008 Messages : 611
| Sujet: [VX] Système de troc avec les PNJ Mer 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: 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
|
|