- ASHKAMembre
- Nombre de messages : 242
Age : 42
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008
Systeme de troc avec les PNJ
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 :
Un ch'ti screen pour voir ce qui vous attends :
ASHKA
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:
#===============================================================
#
# rpgmakervx.1fr1.net
#
#===============================================================
###################################
#
# 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 :
ASHKA
- Shadow Tr.Membre
- Nombre de messages : 438
Age : 33
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
Re: Systeme de troc avec les PNJ
Mar 28 Oct 2008 - 15:59
hé mais c'est intéressant tout ça !!!
Merci ^^
Merci ^^
Re: Systeme de troc avec les PNJ
Mar 28 Oct 2008 - 16:12
Bon script...
Le Scripteur commence à faire parler de lui !
Le Scripteur commence à faire parler de lui !
- freeziaStaffeux 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
Re: Systeme de troc avec les PNJ
Mar 28 Oct 2008 - 18:13
Original comme système ! Vraiment pas mal du tout !!
- ASHKAMembre
- Nombre de messages : 242
Age : 42
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008
Re: Systeme de troc avec les PNJ
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
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
Re: Systeme de troc avec les PNJ
Mar 28 Oct 2008 - 18:20
joli !
sauf que tu devrais mettre des gradientbars, plus dans le style rmvx !
sauf que tu devrais mettre des gradientbars, plus dans le style rmvx !
- ASHKAMembre
- Nombre de messages : 242
Age : 42
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008
Re: Systeme de troc avec les PNJ
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
Mais je ne suis pas trés doué pour l'aspect "visuel" ...
ASHKA
- ParasoftMembre
- Nombre de messages : 27
Distinction : aucune
Date d'inscription : 27/07/2008
Re: Systeme de troc avec les PNJ
Mer 12 Nov 2008 - 19:35
Bonjour,
Ca ne marche pas. J'ai essayé.
Ca ne marche pas. J'ai essayé.
- ArayashikiMembre
- Nombre de messages : 655
Age : 34
Localisation : Trois lettres me demangent. Oserai-je ?
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 18/08/2008
Re: Systeme de troc avec les PNJ
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.
Détail plus ton problème sinon on pourra pas t'aider.
- JessStaffeux retraité
- Nombre de messages : 855
Age : 33
Localisation : Ma drums ou mon ordi !
Distinction : Dieu de Kipatord
Date d'inscription : 04/05/2008
Re: Systeme de troc avec les PNJ
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
A tchoux
- ParasoftMembre
- Nombre de messages : 27
Distinction : aucune
Date d'inscription : 27/07/2008
Re: Systeme de troc avec les PNJ
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 !
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 !
- ASHKAMembre
- Nombre de messages : 242
Age : 42
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008
Re: Systeme de troc avec les PNJ
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
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
- ParasoftMembre
- Nombre de messages : 27
Distinction : aucune
Date d'inscription : 27/07/2008
Re: Systeme de troc avec les PNJ
Ven 14 Nov 2008 - 18:09
Merci.
- YasanMembre
- Nombre de messages : 149
Age : 39
Distinction : aucune
Date d'inscription : 18/01/2011
Re: Systeme de troc avec les PNJ
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
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 ?
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 ?
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum