Suite à une demande Cabaji, j'ai effectué une refonte du script de forge créé par lb_guilherme. Le script a été entièrement recréé afin de permettre de nouvelles fonctionalités:
Définir un coût en gold.
Avoir un nombre infini de groupes ou d'objets dans les groupes.
Aucune limite au nombre d'ingrédients dans le jeu (Bien que pour chaque "recette" une limite existe toujours)
Possibilité d'utiliser des armes et armures comme ingrédients (ex: épée + ruby = épée de feu)
Une fenetre de help pour afficher la description de l'objet forgé (comme menu item)
Possibilité que certains objets ne soient disponible que si certains interrupteurs sont activés.
La dernière option permet d'avoir différentes forges dans le jeu, par exemple une pour l'alchimie et une autre pour les armes. Cela permettra aussi d'avoir certaines armes qui apparaissent dans la forge suite à l'obtention de certains objets (Livre de compétence ou outil de travail) ou bien suite à une évolution dans l'histoire.
J'ai aussi créé un démo afin de présenter le nouvel outil de forge, disponible à cette adresse: http://www.megaupload.com/?d=6JV6C4DN
INSTALLATION DU SCRIPT: à placer au dessus du main. CONFIGURATION: expliqué à la ligne 114 du script.
Aussi, si des vétérans du script ont des commentaires ou des idées concernant le code de mon script (structure, standards, good practices, etc), n'hésitez pas à m'en faire part, je suis très interessé à m'améliorer.
Dernière édition par jebbou le Mar 30 Sep 2008 - 16:30, édité 6 fois
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 0:18
Voici le script à utiliser (PART 1):
Code:
# ========================================= # FORGE 1.0 # ========================================= # # Author: Jebbou AKA LorD_DaoS[ATF] # Version 1.0 (02/09/2008) # Configuration: à la ligne 114 # =========================================
def getItem tempItem = nil case @item_type when 1 then tempItem = $data_armors[@item_id] when 2 then tempItem = $data_weapons[@item_id] when 3 then tempItem = $data_items[@item_id] else print ("ERROR - BAD ITEM TYPE") end return tempItem end
def GetIngredientItems
tempItem = nil tempItemList = [] for index in 0 ... @reqComponentID.size case @reqComponentType[index] when 1 then tempItem = $data_armors[@reqComponentID[index]] when 2 then tempItem = $data_weapons[@reqComponentID[index]] when 3 then tempItem = $data_items[@reqComponentID[index]] else print ("ERROR - BAD ITEM TYPE") end tempItemList.push(tempItem) end
return tempItemList end
def isCraftable? isCraftable = true arrIngredients = self.GetIngredientItems if $game_party.gold < @gold_cost isCraftable = false else for i in 0 ... arrIngredients.size if $game_party.item_number( arrIngredients[i] ) < @reqComponentQty[i] isCraftable = false end end end return isCraftable end end
class Crafted_Item_Group def initialize (name) @name = name @arrItems = [] end
attr_reader:name
def push (item) @arrItems[@arrItems.size] = item end
def getItem(index) return @arrItems[index] end
def getAvailableItemList
arrAvailableItems = [] for i in 0 ... @arrItems.size if @arrItems[i].required_switch >= 0 if $game_switches[@arrItems[i].required_switch] == true arrAvailableItems.push(@arrItems[i]) end else arrAvailableItems.push(@arrItems[i]) end end return arrAvailableItems end
def getAvailableGroupSize arrTemp = self.getAvailableItemList return arrTemp.size end
end
module Forge
# Numéro de l'icone correspondant au pièces de monnaie courante # NOTE: Si vous ne voulez pas d'icone, mettez -1 au lieu du numéro GOLDICON = 147
# Instructions # ====================================== # 1) CONFIGURATION DES GROUPES # ====================================== # On doit d'abord créer les groupes d'objets à l'aide de la ligne # ARRGROUPS[0] = Crafted_Item_Group.new("Armes simples") # Notez que le numéro entre crochet [] est spécifique à chaque groupe
# ====================================== # 2) CONFIGURATION DES OBJETS # ====================================== # Ensuite, pour chacun des groupes, on doit définir les objets se trouvant à l'intérieur. # Cela implique de créer, pour chaque objet, une ligne de code ressemblant à : # ARRGROUPS[x].push(Crafted_Item.new(a, b, c, d, [e1, e2], [f1, f2], [g1, g2])) # Le code entre crochet (x) doit correspondre au numéro de groupe (de zéro à infini)
# Voici les paramètres qui sont défini dans cette ligne : # a) numéro de l'objet à créer # b) Type de l'objet à créer (Armure=1, Arme=2, Objet=3) # c) Interrupteur nécessaire pour afficher (-1 = aucun interrupteur nécessaire) # d) Coût en or # e) Array contenant la liste des ID des objets nécessaire à la conception de l'objet (Jusqu'à 8) # f) Dans le même ordre, array contenant les quantités nécessaires de chacun des objets défini en "e)" # g) Dans le même ordre, array contenant les types de chacun des objets défini en "e)" # (Armure=1, Arme=2, Objet=3)
# ====================================== # 3) APPEL DE LA FORGE # ======================================
# Pour appeller la forge, il suffit d'ajouter la ligne suivante dans un événement: # $scene = Scene_Forge.new
# Lorsque les interrupteurs sont utilisés, on doit les définir AVANT d'appeller l'événement. Voici différentes # possibilité d'utilisation d'interrupteurs, lors de la configuration:
# 1) Laisser à -1 va permettre à l'objet d'apparaitre dans lors de tous les appels de la forge. C'est l'option par défaut.
# 2) Si on veut avoir différentes forges avec différents objets disponible, on doit définir le numéro de l'interrupteur # pour chaque objet durant la configuration. Lors de l'exécution de l'événement qui appèle la forge, on définit les # interrupteurs AVANTd'appeller la forge.
# 3) On peut définir que certains événements dans le jeu définissent une progression dans le niveau de maitrise # de la forge (en définissant certains # NOTE: Dans le démo, plusieurs exemples expliquent les différentes options possibles pour ces fusions:
Dernière édition par jebbou le Mer 3 Sep 2008 - 11:55, édité 1 fois
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 0:19
Voici le script (PART 2)
Code:
class Scene_Forge < Scene_Base def start super create_menu_background
# Définir quels groupes ont des objets, en fonction des interrupteurs activés. @arrCurrentGroups = [] for i in 0 ... Forge::ARRGROUPS.size if Forge::ARRGROUPS[i].getAvailableGroupSize > 0 @arrCurrentGroups.push(Forge::ARRGROUPS[i]) end end
# Création de la fenêtre pour l'aide sur les objets @help_window = Window_Help.new
# Création de la fenêtre pour les groupes d'objets @craft_group_window = Window_ForgeGroups.new (260, Window_Base::WLH * 12 + 32, @arrCurrentGroups) @craft_group_window.x = 0 @craft_group_window.y = Window_Base::WLH + 32 @craft_group_window.visible = true @craft_group_window.active = true @craft_group_window.index = 0
# Création de la fenêtre pour les objets @craft_objects_window = Window_ForgeObjectList.new (260,Window_Base::WLH * 12 + 32, []) @craft_objects_window.x = 0 @craft_objects_window.y = Window_Base::WLH + 32 @craft_objects_window.visible = false @craft_objects_window.active = false @craft_objects_window.help_window = @help_window
def terminate super dispose_menu_background @help_window.dispose @craft_group_window.dispose @craft_ingredients_window.dispose end
def update super update_menu_background @help_window.update @craft_group_window.update @craft_objects_window.update @craft_ingredients_window.update if @craft_group_window.active == true craft_group_update elsif @craft_objects_window.active = true craft_objects_update craft_ingredients_update end end
# ====================================================================== # craft_group_update : Saisie d'input dans la fenêtre des groupes d'objets # ====================================================================== def craft_group_update if Input.trigger?(Input::B) Sound.play_cancel $scene = Scene_Map.new elsif Input.trigger?(Input::C)
if (@craft_group_window.commands.size > 0)
@craft_objects_window.set_new_parameters (@arrCurrentGroups[@craft_group_window.index].getAvailableItemList) @craft_group_window.visible = false @craft_group_window.active = false @craft_objects_window.visible = true @craft_objects_window.active = true @craft_objects_window.index = 0 @craft_ingredients_window.visible = true else Sound.play_cancel end end end
# ====================================================================== # craft_group_update : Saisie d'input dans la fenêtre des objets # ====================================================================== def craft_objects_update if Input.trigger?(Input::B)
elsif Input.trigger?(Input::C) currentObject = @craft_objects_window.commands[@craft_objects_window.index] if currentObject.isCraftable? Sound.play_shop $game_party.gain_item(currentObject.getItem, 1) arrIngredients = currentObject.GetIngredientItems for i in 0 ... arrIngredients.size $game_party.lose_item(arrIngredients[i], currentObject.reqComponentQty[i] ) end if currentObject.gold_cost > 0 $game_party.lose_gold(currentObject.gold_cost ) end @craft_objects_window.refresh @craft_ingredients_window.refresh else Sound.play_buzzer end end end
# Charger la liste if currentObject != nil @craft_ingredients_window.set_new_parameters(currentObject.GetIngredientItems, currentObject.reqComponentQty, currentObject.gold_cost) end end end
class Window_ForgeGroups < Window_Selectable attr_reader:commands
# Note : Commands est une liste de groupes d'objets de type Crafted_Item_Group def initialize (width, height, commands) super(0, 0, width, height ) @commands = commands @column_max = 1 @item_max = commands.size refresh end
def refresh @item_max = @commands.size create_contents for i in 0...@item_max draw_item(i) end end
#-------------------------------------------------------------------------- # * Draw Item # index : no de l'item #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) rect.x += 4 rect.width -= 8 self.contents.clear_rect(rect) self.contents.font.color = normal_color self.contents.draw_text(rect, @commands[index].name) end end
class Window_ForgeObjectList < Window_Selectable attr_reader:commands
# Note: itemGroup est une liste des tous les objets disponibles, de type Crafted_Item def initialize(width, height, itemGroup, spacing = 32 )
# Afficher le coût en gold, lorsque applicable if @gold_cost > 0 rect = item_rect(0) if Forge::GOLDICON > 0 draw_icon(Forge::GOLDICON, rect.x, rect.y) end self.contents.draw_text( rect.x + 24, rect.y, rect.width - 32, rect.height, Vocab.gold) self.contents.font.color = ($game_party.gold < @gold_cost ? self.knockout_color : self.normal_color) self.contents.draw_text(rect, sprintf("%2d /%2d", $game_party.gold, @gold_cost), 2) end
# Afficher les ingrédients for i in 0...@item_max draw_item(i) end end
def draw_item(index, enabled = true)
# Sauter une position si le coût en gold a été affiché itemPosition = index + (@gold_cost > 0 ? 1:0) rect = item_rect(itemPosition) self.contents.clear_rect(rect)
# Afficher le nombre d'ingrédient requis pour ce type, ainsi que le nombre détenu par le party number = $game_party.item_number(@commands[index]) self.contents.font.color = (number < @reqQty[index] ? self.knockout_color : self.normal_color)
self.contents.draw_text(rect, sprintf("%2d /%2d", number, @reqQty[index]), 2) end end
Dernière édition par jebbou le Mer 3 Sep 2008 - 12:00, édité 2 fois
Skull21
Illusionniste Lv.12
Age : 29 Inscrit le : 08/08/2008 Messages : 769
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 7:37
merci pour ce script et Cabaji sera heureux surement sa va pourvoir me servir a quelque chose
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 11:17
N'hésitez pas à me laisser savoir si vous trouvez des bugs, soit dans le démo ou le script.
Merci!
Invité
Invité
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 11:52
Heu... Merci ça sera utile
mais Je que je veux: c'est une forge et alchimie mais ou on utilise des objet comme des pierre bleu,... que l'on trouve sur certains monstre mais que pour la forger il faut payer au forgeron une certaine somme
Exemple: Pour une épée, il faut 5pierre bleu et 3 pierre rouge + payer 90 pièce d'or tu comprend?
Skull21
Illusionniste Lv.12
Age : 29 Inscrit le : 08/08/2008 Messages : 769
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 11:54
s'il te plait tu peux changer tes sript en code, car c'est pas facile a avoir en spoiler
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 11:55
Pas de problème, le script le fait aussi, et c'est dans le démo!
En fait, dans le premier screenshot c'est un exemple parfait de ce que tu veux faire.
Un coût en or, plus des matériaux qui sont des objets.
MirainoHikari
Ex-Admin-Script
Age : 42 Inscrit le : 26/05/2008 Messages : 2360
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 13:49
Pas encore tester complètement, mais vraiment bien. Merci d'avoir répondu à cette demande. Je te donne tes points.
Invité
Invité
Sujet: Re: [VX] Script de Forge Mer 3 Sep 2008 - 13:54
C'est possible, et le script le fait déjà. Pour accomplir ce que tu veux faire, tu dois utiliser deux interrupteurs. Par exemple, tu pourrais avoir un interrupteur appellé "forge_armes" (disons l'interrupteur #15) et un autre appellé "forge_cuisine" (disons l'interrupteur #16). Avant d'appeller le script dans la forge pour les armes, tu dois faire ceci dans ton événement: Interrupteur forge_armes = activé Interrupteur forge_cuisine = désactivé $scene = Scene_Forge.new
Dans ton autre forge, disons celui de la cuisine, tu dois faire l'inverse: Interrupteur forge_armes = désactivé Interrupteur forge_cuisine = activé $scene = Scene_Forge.new
(Note: L'activation des interrupteurs ne se fait PAS dans le script, seulement par les fonctions de l'événement)
Mais le plus important, c'est que dans la configuration et pour chacun des objets à créer, tu définisses quel interrupteur doit être activé pour que l'objet soit présent dans la forge. Ca devrait être le 3ème paramètre de la configuration des objets. Dans l'exemple ci-dessous, j'ai créé trois groupes de forge. Le premier groupe va apparaitre dans la forge des armes, et les deux autres groupes dans la forge de cuisine.
J'ai codé la forge de cette façon afin d'être assez flexible, et de pouvoir faire varier la forge selon les interrupteurs, afin de pouvoir contrôler facilement les objets disponible directement dans le jeu.
Cordialement,
Jebbou
PS: Et si l'interrupteur nécessaire est défini à -1, alors il apparaitra dans toutes les forges. Par exemple: ARRGROUPS[0].push(Crafted_Item.new(10, 2, -1, 200, [27, 26], [1,1], [3,3]))
EDIT: Dans le démo, j'exploite les options de forge à fond :
Il existe plusieurs forges différentes, tel que l'alchimiste et le forgeron
Il est possible d'apporter le marteau de Thor au forgeron pour augmenter le nombre d'objets disponibles dans la forge.
Il existe une forge "libre service" (cachée dans l'école de magie), dans laquelle on peut forger ce qu'on veut selon les livres de compétences qu'on a aquis.
Ceci démontre la flexibilité et les possibilités de la forge, et tout se fait par des activations d'interrupteurs.
désolé, j'ai pas vraiment réfléchit sur ce coup là...
J'aurais du le deviner que c'était déjà prévu.
Merci de la réponse rapide te passe une bonne journée.
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Mar 30 Sep 2008 - 15:27
Si quelqu'un a utilisé mon script, et a des commentaires qui pourraient m'aider à l'améliorer, il est le bienvenue. Voici les changements que je prévois pour la version 2.0:
Ajout simplifié des ingrédients à une recette dans la configuration
Affichage des caractéristiques de l'arme lorsqu'applicable (pas pour des objets)
Dernière édition par jebbou le Mer 15 Oct 2008 - 16:57, édité 1 fois
Invité
Invité
Sujet: Re: [VX] Script de Forge Mar 30 Sep 2008 - 18:13
serait -til possible de:
Lors de l'achat de l'arme, qu'un message s'affiche: voulez-vous l'équiper maintenant? choix: oui/non Si oui,que l'arme équipé avant retourne dans les objet si non, que l'arme retourne dans les objet sans être équiper.
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Mar 30 Sep 2008 - 18:20
Hey Cabaji,
Tu avais pas demandé quelque chose de similaire pour le magasin? Si oui, est-ce que ca avait été répondu? Si c'est le cas, je pourrais peut-être reprendre ce qui avait été fait.
Jebbou
adrezo
Vagabond Lv.5
Inscrit le : 17/07/2008 Messages : 89
Sujet: Re: [VX] Script de Forge Dim 9 Nov 2008 - 10:22
Alors là.. Je dis BRAVO et MERCI c'est pile ce dont j'avais besoin. Merci vraiment !
Evite les necro-messages qui servent à rien, la prochaine fois c'est un averto >w<
adrezo
Vagabond Lv.5
Inscrit le : 17/07/2008 Messages : 89
Sujet: Re: [VX] Script de Forge Ven 14 Nov 2008 - 6:06
Bon j'ai une petite demande : serait-il possible de mettre un système pour que on ne voit une arme que si on a un certain objet (le plan de l'arme par exemple).
Pour que dans le jeu, on achète le plan d'une arme pour la construire chez nous après, je voudrais que la forge soit "dynamique"
Merci d'avance.
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Ven 14 Nov 2008 - 14:05
Salut,
Tout est basé sur des interrupteurs, donc si un joueur posède un objet, tu peux activer l'interrupteur pour voir certains objets. Si tu jettes un coup d'oeil au démo, c'est déjà possible. J'ai placé au fond de la mine derrière le village un marteau de Thor, qui est nécessaire afin de faire plus d'armes dans la forge du village.
Un autre exemple de ceci est que, dans le même démo, tu peux aquérir des livres de connaissances (rouge), qui trainent un peu partout. Lorsque tu accèdes au laboratoire de l'école de magie, tu peux forger les objets pour lesquels tu as obtenu les livres de connaissances correspondants. Je crois que c'est exactement ce que tu veux faire.
Cordialement,
Jebbou
adrezo
Vagabond Lv.5
Inscrit le : 17/07/2008 Messages : 89
Sujet: Re: [VX] Script de Forge Ven 14 Nov 2008 - 21:23
OK, merci j'ai pas testé la démo car marche pas chez moi. Je vais regarder les script un peu plus précisément. Merci
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Ven 14 Nov 2008 - 21:45
Adrezo,
Es-tu capable d'ouvrir le projet dans RMVX au moins? Si c'est le cas et que ca ne fonctionne toujours pas, je ferai une version compilé avec le RTP.
Cordialement,
Jebbou
adrezo
Vagabond Lv.5
Inscrit le : 17/07/2008 Messages : 89
Sujet: Re: [VX] Script de Forge Sam 15 Nov 2008 - 1:53
Je l'ouvre dans l'éditeur, mais quand je veux tester (ou lancer directement sans passer par rpgmvx) je vois le titre, je mets "nouvelle aprtie" et la "erreur script cache line 80 " failed to creat bitmap"
jebbou
Doyen
Age : 46 Inscrit le : 20/08/2008 Messages : 2485
Sujet: Re: [VX] Script de Forge Sam 15 Nov 2008 - 15:45
Bizzare. Je ferai une version avec le RTP. Peut-être que ca résoudra le problème.
adrezo
Vagabond Lv.5
Inscrit le : 17/07/2008 Messages : 89
Sujet: Re: [VX] Script de Forge Sam 15 Nov 2008 - 16:59
J'ai téléchargé une autre version du logiciel. et c'est bon ça marche, j'ai pu tester "en live" ^^
zaioun
Habitant Lv.6
Age : 28 Inscrit le : 06/05/2009 Messages : 121
Sujet: Re: [VX] Script de Forge Mer 9 Déc 2009 - 16:48
Petit bug, qui m'était arrivé aussi avec l'autre script de forge ICI vous pouvez voir les screens tout en bas de la page, quand j'améliore mon arme, je ne peut pas l'équiper... J'ai tout bien regardé mais sa ne marche pas... Voici quand même d'autres screens :
Voilà, et si vous pouviez m'aider, ça serait super !