#=============================================================================== # # Yanfly Engine RD - Actor Item Synthesis # Last Date Updated: 2009.06.23 # Level: Hard # # This item synthesis script is influenced after Gust RPG's famous synthesizing # systems. To synthesize an item, one would need a recipe and the required actor # in your party. Different actors can yield different outcomes, but they all # possess and use the same ingredients. # # Another thing this script will provide (for the player) is that any items that # were synthesized through the shop's recipes can then be bought without need # to synthesize them again. The need to constantly resynthesize items to get # more of them becomes rather tedious and that really isn't something we should # put the player through. # # This script also allows playing events after item creation similar to that of # the Gust RPG's. There you can play out little skits and such or even unlock # certain parts of the game for synthesizing a particular item. # #=============================================================================== # Updates: # ---------------------------------------------------------------------------- # o 2009.06.23 - Compatibility fix with KGC Help Extension # o 2009.06.21 - Compatibility update with Display Item Query # o 2009.06.14 - Bug fix for Synth Listing # o 2009.06.10 - Added # o 2009.06.04 - Added # - Common events are played only once per actor now # - Added to replay common events more than once # - Added and # o 2009.06.03 - Finished script # o 2009.06.02 - Started script #=============================================================================== # Instructions #=============================================================================== # # These go into the recipe's notebox. Recipes can be items, weapons, or armours # but they must contain the following information before they can be recipes: # ----------------------------------------------------------------------------- # # # a is the ID of the actor that can use the recipe. If the ID is 0, all actors # can user the recipe. b has to be either I, W, or A. This will determine what # type of item will be produced, an item, weapon, or armour. c is the ID of the # item type to be created. means if actor 3 uses this recipe # then actor 3 will create Item ID 8. # # # This is how much synthesizing the recipe will cost. If this isn't included, # the synthesis is considered to be free. # # or # This determines what ingredients are needed. a has to be either I, W, or A to # determine what type of item is being used. b determines the item ID of the # item type to be used. Should you decide to use the second tag, c is how many # of the item is needed for the recipe to be made. # # ----------------------------------------------------------------------------- # The following are optional tags you may place in a recipe's notebox. # ----------------------------------------------------------------------------- # # or # This will prevent actors from being able to perform the synthesis at all, # even if actor 0 is listed for . To block multiple actors, just # add more of the tags or use the version. # # # For those that want to play a common event after a synthesis, set b to the ID # of the common event desired. a is the actor set to play after that actor makes # an item. If a is 0, it is set for all actors. # # # This will allow the common event to be replayable after viewing once. # # or # This will override the default rules set for consuming recipes. The first will # always consume the recipe regardless of the rulesetting and the second one # will prevent the recipe from being consumed. # # or # This determines how much experience the actor synthesizing the item gains # from performing the synthesis. The first time through, the actor will gain x # experience. On follow-up synthesis sessions, the actor will not gain any exp # unless the second tag is used. Only y exp will be gained on follow up any # follow-up sessions. But no matter how much experience the actor gains, the # actor cannot level up from synthesizing items (to prevent bugs from occuring). # # # This makes the item unable to be bought even after synthesizing it. This tag # can be used in either the item to be bought or the recipe. If it's on the # item to be bought, then only that item is is disabled from the recipe. If the # tag is on the recipe, all items created by that recipe cannot be bought. # #=============================================================================== # # Compatibility # - Works With: KGC's LimitBreak, Help Extension # - Works With: Yanfly's Variable Controlled Discounts # - Alias: Scene_Map: call_shop # #=============================================================================== $imported = {} if $imported == nil $imported["ActorItemSynthesis"] = true module YE module SYNTH # This is the switch required to be on before the shop can be called out. # Remember to turn off your switches beforehand. SYNTH_SWITCH = 72 # The following determines the various settings for the synthesis shop. SYNTH_TEXT = "Synth" # Synthesis option for shop commands. SYNTH_INCOMP = "Incompatible" # Text for incompatible actors. SYNTH_INCOLR = 10 # Colour for incompatible actors. SYNTH_INGRED = "Ingredients" # Text used for ingredients. SYNTH_OUTCOM = "Outcome" # Text used for ingredients. SYNTH_FSIZE = 16 # Font size for smaller text. SYNTH_OFFSET = 48 # X offset for text next to actor sprite. SYNTH_TOTAL = "Recipes Known: %d" # Total recipes done by actor. SYNTH_COST = "Synth Cost" # Text for synthesis cost. SYNTH_C_ICON = 205 # Icon for synthesis cost. SYNTH_T_COST = "%d %s" # Text format used for synth amount. SYNTH_AMT = "%d/%d" # Ingredients required over possessed. SYNTH_HIDE_0 = true # This will hide amount needed if zero. SYNTH_UNICON = 144 # Icon used for unknown items. SYNTH_UNMASK = "Unknown" # Mask used for unknown items. # The following determines the rules for recipe consumption. This will # govern whether or not you would want recipes to be used up after synthing # an item. If it's set to true, recipes will be included in the ingredients # listing. The number consumed depends on how many items were synthesized # from the recipe. CONSUME_RECIPE_ITEM = false # If recipe is an item, consume item. CONSUME_RECIPE_WEAPON = true # If recipe is an weapon, consume weapon. CONSUME_RECIPE_ARMOUR = true # If recipe is an armour, consume armour. # The following determines the rules governing common events. Note that if # common events are played outside of the shop, the player will not return # to the shop after the event is done. EVENT_IN_SHOP = true # Stay inside the shop for common events. FADE_TIME = 30 # The amount of frames of fade in between events. end end #=============================================================================== # Editting anything past this point may potentially result in causing computer # damage, incontinence, explosion of user's head, coma, death, and/or halitosis. # Therefore, edit at your own risk. #=============================================================================== module YE module REGEXP module SYNTH ACTOR = /<(?:SYNTH_ACTOR|synth actor)[ ]*(\d+)[ ]\s*([IWA]):(\d+)?>/i EVENT = /<(?:SYNTH_ACTOR|synth actor)[ ]*(\d+)[ ](?:EVENT|event):(\d+)?>/i BLOCK = /<(?:SYNTH_BLOCK_ACTOR|synth block actor)[ ]*(\d+(?:\s*,\s*\d+)*)>/i COST = /<(?:SYNTH_COST|synth cost)[ ]*(\d+)>/i INGRE = /<(?:INGREDIENT|ingredients)\s*([IWA]):(\d+)?>/i INGRX = /<(?:INGREDIENT|ingredients)\s*([IWA]):(\d+)[ ]x(\d+)?>/i CONSUME = /<(?:CONSUME|consume recipe)>/i NOTCONSUME = /<(?:NOT_CONSUME|not consume recipe|not consume)>/i REPLAY = /<(?:REPLAY_EVENT|replay event)>/i UNBUYABLE = /<(?:SYNTH_UNBUYABLE|synth unbuyable)>/i EXP1 = /<(?:SYNTH_EXP|synth exp)[ ]*(\d+)>/i EXP2 = /<(?:SYNTH_EXP|synth exp)[ ]*(\d+):(\d+)>/i end # BASEITEM end # REGEXP end # YE #=============================================================================== # RPG::BaseItem #=============================================================================== class RPG::BaseItem #-------------------------------------------------------------------------- # Yanfly_Cache_BaseItem_AIS #-------------------------------------------------------------------------- def yanfly_cache_baseitem_ais @recipe = false; @synth_actor = {}; @ingredients = {}; @synth_cost = 0 @synth_consume = false; @synth_event = {}; @synth_block = [] @replay_event = false; @synth_exp1 = 0; @synth_exp2 = 0 @synth_unbuyable = false self.note.split(/[\r\n]+/).each { |line| case line when YE::REGEXP::SYNTH::ACTOR case $2.upcase when "I" @synth_actor[$1.to_i] = $data_items[$3.to_i] @synth_consume = YE::SYNTH::CONSUME_RECIPE_ITEM when "W" @synth_actor[$1.to_i] = $data_weapons[$3.to_i] @synth_consume = YE::SYNTH::CONSUME_RECIPE_WEAPON when "A" @synth_actor[$1.to_i] = $data_armors[$3.to_i] @synth_consume = YE::SYNTH::CONSUME_RECIPE_ARMOUR end when YE::REGEXP::SYNTH::EVENT @synth_event[$1.to_i] = $2.to_i when YE::REGEXP::SYNTH::BLOCK $1.scan(/\d+/).each { |num| if num.to_i > 0 @synth_block.push(num.to_i) end } when YE::REGEXP::SYNTH::COST @synth_cost = $1.to_i when YE::REGEXP::SYNTH::INGRE case $1.upcase when "I" @ingredients[$data_items[$2.to_i]] = 1 when "W" @ingredients[$data_weapons[$2.to_i]] = 1 when "A" @ingredients[$data_armors[$2.to_i]] = 1 end when YE::REGEXP::SYNTH::INGRX case $1.upcase when "I" @ingredients[$data_items[$2.to_i]] = $3.to_i when "W" @ingredients[$data_weapons[$2.to_i]] = $3.to_i when "A" @ingredients[$data_armors[$2.to_i]] = $3.to_i end when YE::REGEXP::SYNTH::REPLAY @replay_event = true when YE::REGEXP::SYNTH::EXP1 @synth_exp1 = $1.to_i when YE::REGEXP::SYNTH::EXP2 @synth_exp1 = $1.to_i @synth_exp2 = $2.to_i when YE::REGEXP::SYNTH::UNBUYABLE @synth_unbuyable = true end } self.note.split(/[\r\n]+/).each { |line| case line when YE::REGEXP::SYNTH::CONSUME @synth_consume = true when YE::REGEXP::SYNTH::NOTCONSUME @synth_consume = false end } if @synth_actor != {} and @ingredients != {} @recipe = true end end #-------------------------------------------------------------------------- # definitions #-------------------------------------------------------------------------- def recipe? yanfly_cache_baseitem_ais if @recipe == nil return @recipe end def synth_actor yanfly_cache_baseitem_ais if @synth_actor == nil return @synth_actor end def synth_event yanfly_cache_baseitem_ais if @synth_event == nil return @synth_event end def synth_block yanfly_cache_baseitem_ais if @synth_block == nil return @synth_block end def synth_cost yanfly_cache_baseitem_ais if @synth_cost == nil return @synth_cost end def synth_consume? yanfly_cache_baseitem_ais if @synth_consume == nil return @synth_consume end def ingredients yanfly_cache_baseitem_ais if @ingredients == nil return @ingredients end def replay_event? yanfly_cache_baseitem_ais if @replay_event == nil return @replay_event end def synth_exp1 yanfly_cache_baseitem_ais if @synth_exp1 == nil return @synth_exp1 end def synth_exp2 yanfly_cache_baseitem_ais if @synth_exp2 == nil return @synth_exp2 end def synth_unbuyable yanfly_cache_baseitem_ais if @synth_unbuyable == nil return @synth_unbuyable end end # RPG::BaseItem #=============================================================================== # Game_Actor #=============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # Next Exp - The experience needed for the next level. #-------------------------------------------------------------------------- def next_exp return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0 end #-------------------------------------------------------------------------- # learn_recipe #-------------------------------------------------------------------------- def learn_recipe(item) if item.is_a?(RPG::Item) unless synth_items.include?(item.id) synth_items.push(item.id) exp = [[item.synth_exp1, next_exp - 1].min, 0].max gain_exp(exp, false) else exp = [[item.synth_exp2, next_exp - 1].min, 0].max gain_exp(exp, false) end elsif item.is_a?(RPG::Weapon) unless synth_weapons.include?(item.id) synth_weapons.push(item.id) exp = [[item.synth_exp1, next_exp - 1].min, 0].max gain_exp(exp, false) else exp = [[item.synth_exp2, next_exp - 1].min, 0].max gain_exp(exp, false) end elsif item.is_a?(RPG::Armor) unless synth_armours.include?(item.id) synth_armours.push(item.id) exp = [[item.synth_exp1, next_exp - 1].min, 0].max gain_exp(exp, false) else exp = [[item.synth_exp2, next_exp - 1].min, 0].max gain_exp(exp, false) end end end #-------------------------------------------------------------------------- # synth_events #-------------------------------------------------------------------------- def synth_events @synth_events = [] if @synth_events == nil return @synth_events end #-------------------------------------------------------------------------- # synth_items #-------------------------------------------------------------------------- def synth_items @synth_items = [] if @synth_items == nil return @synth_items end #-------------------------------------------------------------------------- # synth_weapons #-------------------------------------------------------------------------- def synth_weapons @synth_weapons = [] if @synth_weapons == nil return @synth_weapons end #-------------------------------------------------------------------------- # synth_armours #-------------------------------------------------------------------------- def synth_armours @synth_armours = [] if @synth_armours == nil return @synth_armours end end # Game_Actor #=============================================================================== # Spriteset_Menu #=============================================================================== class Spriteset_Menu unless method_defined?(:create_viewports) #-------------------------------------------------------------------------- # initialize #-------------------------------------------------------------------------- def initialize create_viewports create_pictures update end def create_viewports @viewport1 = Viewport.new(0, 0, 544, 416) @viewport2 = Viewport.new(0, 0, 544, 416) @viewport3 = Viewport.new(0, 0, 544, 416) @viewport2.z = 50 @viewport3.z = 100 end def create_pictures @picture_sprites = [] for i in 1..20 @picture_sprites.push(Sprite_Picture.new(@viewport2, $game_map.screen.pictures[i])) end end #-------------------------------------------------------------------------- # dispose #-------------------------------------------------------------------------- def dispose dispose_pictures dispose_viewports end def dispose_pictures for sprite in @picture_sprites sprite.dispose end end def dispose_viewports @viewport1.dispose @viewport2.dispose @viewport3.dispose end #-------------------------------------------------------------------------- # update #-------------------------------------------------------------------------- def update update_pictures update_viewports end def update_pictures for sprite in @picture_sprites sprite.update end end def update_viewports @viewport1.tone = $game_map.screen.tone @viewport1.ox = $game_map.screen.shake @viewport2.color = $game_map.screen.flash_color @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness) @viewport1.update @viewport2.update @viewport3.update end end end # Spriteset_Menu #=============================================================================== # Scene_Map #=============================================================================== class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # alias call_shop #-------------------------------------------------------------------------- alias call_shop_ais call_shop unless $@ def call_shop if $game_switches[YE::SYNTH::SYNTH_SWITCH] $game_temp.next_scene = nil $game_switches[YE::SYNTH::SYNTH_SWITCH] = false $scene = Scene_Synthesis.new else call_shop_ais end end end # Scene_Map #=============================================================================== # Scene_Synthesis #=============================================================================== class Scene_Synthesis < Scene_Base #-------------------------------------------------------------------------- # start #-------------------------------------------------------------------------- def start super create_menu_background @actor_index = 0 @actor_id = $game_party.members[@actor_index].id @interpreter = Game_Interpreter.new @common_event = 0 @spriteset = Spriteset_Menu.new @running = false @help_window = Window_Help.new @gold_window = Window_Gold.new(384, @help_window.height) create_command_window adjust_window_size dy = @help_window.height + @gold_window.height dw = Graphics.width - 304 dh = Graphics.height - dy @buy_window = Window_SynthBuy.new(0, dy, 304, dh) @buy_window.help_window = @help_window @number_window = Window_ShopNumber.new(0, 112) @number_window.active = false @number_window.visible = false @status_window = Window_ShopStatus.new(304, dy) @status_window.height = dh @status_window.create_contents @synth_list = Window_SynthList.new(0, dy, 304, dh) @synth_list.help_window = @help_window @ingre_list = Window_Ingredients.new(304, dy, dw, dh) @synth_number = Window_SynthNumber.new(0, 112) @synth_number.visible = false @synth_number.active = false @message_window = Window_Message.new @help_window.set_text("") setup_display_item_query if $imported["DisplayItemQuery"] end #-------------------------------------------------------------------------- # adjust_window_size #-------------------------------------------------------------------------- def adjust_window_size return unless $imported["HelpExtension"] @help_window.row_max = KGC::HelpExtension::ROW_MAX @command_window.y = @help_window.height @gold_window.y = @help_window.height dy = @help_window.height + @command_window.height end #-------------------------------------------------------------------------- # terminate #-------------------------------------------------------------------------- def terminate super dispose_menu_background @spriteset.dispose if @spriteset != nil @help_window.dispose if @help_window != nil @gold_window.dispose if @gold_window != nil @buy_window.dispose if @buy_window != nil @number_window.dispose if @number_window != nil @status_window.dispose if @status_window != nil @synth_list.dispose if @synth_list != nil @ingre_list.dispose if @ingre_list != nil @command_window.dispose if @command_window != nil @synth_number.dispose if @synth_number != nil @message_window.dispose if @message_window != nil end #-------------------------------------------------------------------------- # create_command_window #-------------------------------------------------------------------------- def create_command_window carray = [] carray.push(Vocab::ShopBuy) carray.push(YE::SYNTH::SYNTH_TEXT) carray.push(Vocab::ShopCancel) @command_window = Window_Command.new(384, carray, 3) @command_window.y = @help_window.height end #-------------------------------------------------------------------------- # setup_display_item_query #-------------------------------------------------------------------------- def setup_display_item_query sdx = 0 sdy = @buy_window.y sdw = 272 sdh = @buy_window.height @item_data_window = Window_Item_Data.new(0, sdy, 272, sdh) @item_data_window.visible = false @item_data_window.active = false end #-------------------------------------------------------------------------- # update #-------------------------------------------------------------------------- def update super update_basic update_ingredients_window return if @interpreter.running? return if $game_message.visible if $imported["DisplayItemQuery"] and @item_data_window != nil and @item_data_window.active update_item_data_window elsif @command_window.active update_command_window elsif @buy_window.active @last_index = @buy_window.index + 1 update_buy_selection elsif @synth_list.active update_synth_list elsif @number_window.active update_number_input elsif @synth_number.active update_synth_number end end #-------------------------------------------------------------------------- # update_basic #-------------------------------------------------------------------------- def update_basic update_menu_background update_interpreter $game_map.update @interpreter.update @spriteset.update @message_window.update end #-------------------------------------------------------------------------- # update_interpreter #-------------------------------------------------------------------------- def update_interpreter if !@interpreter.running? and @running Graphics.fadeout(YE::SYNTH::FADE_TIME) @command_window.visible = true @gold_window.visible = true @help_window.visible = true @synth_list.visible = true @ingre_list.visible = true @synth_list.update Graphics.fadein(YE::SYNTH::FADE_TIME) @running = false elsif @interpreter.running? and !@running Graphics.fadeout(YE::SYNTH::FADE_TIME) @command_window.visible = false @gold_window.visible = false @help_window.visible = false @synth_list.visible = false @ingre_list.visible = false Graphics.fadein(YE::SYNTH::FADE_TIME) @running = true end if @common_event > 0 @interpreter.setup($data_common_events[@common_event].list) @common_event = 0 return end end #-------------------------------------------------------------------------- # update_ingredients_window #-------------------------------------------------------------------------- def update_ingredients_window return unless @ingre_list.visible return if @ingre_list.item == @synth_list.item @ingre_list.item = @synth_list.item @ingre_list.refresh(@actor_index) end #-------------------------------------------------------------------------- # update_item_data_window #-------------------------------------------------------------------------- def update_item_data_window @item_data_window.update if Input.trigger?(Input::B) Sound.play_cancel @item_data_window.disappear @buy_window.active = true elsif Input.trigger?(Input::LEFT) or Input.trigger?(Input::UP) @item_data_window.previous_page elsif Input.trigger?(Input::RIGHT) or Input.trigger?(Input::DOWN) @item_data_window.next_page elsif Input.trigger?(Input::L) @item_data_window.top_page elsif Input.trigger?(Input::R) @item_data_window.bottom_page end end #-------------------------------------------------------------------------- # update_command_window #-------------------------------------------------------------------------- def update_command_window @command_window.update if Input.trigger?(Input::B) Sound.play_cancel $scene = Scene_Map.new elsif Input.trigger?(Input::C) Sound.play_decision case @command_window.index when 0 Sound.play_decision @command_window.active = false @buy_window.index = 0 if @buy_window.index < 0 @buy_window.active = true @buy_window.refresh @status_window.visible = true when 1 @synth_list.active = true @synth_list.visible = true @ingre_list.visible = true @synth_list.refresh(@actor_index) @buy_window.visible = false @status_window.visible = false @command_window.active = false when 2 $scene = Scene_Map.new end end end #-------------------------------------------------------------------------- # update_buy_selection #-------------------------------------------------------------------------- def update_buy_selection if @last_index != @buy_window.index @last_index = @buy_window.index @status_window.item = @buy_window.item end @buy_window.update if $imported["DisplayItemQuery"] and Input.trigger?(YE::MENU::ITEM::ITEM_QUERY_SHOP_BUTTON) @item = @buy_window.item if @item == nil Sound.play_buzzer else Sound.play_decision @item = @buy_window.item @item_data_window.appear(@item, @buy_window, 2) @buy_window.active = false end elsif Input.trigger?(Input::B) Sound.play_cancel @command_window.active = true @buy_window.active = false @status_window.item = nil @help_window.set_text("") return elsif Input.trigger?(Input::C) @item = @buy_window.item if @item == nil Sound.play_buzzer return end number = $game_party.item_number(@item) limit = $imported["LimitBreak"] ? @item.number_limit : 99 if $imported["VariableControlledDiscounts"] price = @item.price * $game_variables[YE::EVENT::VARIABLE::PERCENT_BUY] price /= YE::EVENT::VARIABLE::PERCENT_DIVISOR else price = @item.price end if @item == nil or price > $game_party.gold or number == limit Sound.play_buzzer else Sound.play_decision if $imported["LimitBreak"] max = (price == 0 ? @item.number_limit : $game_party.gold / price) max = [max, @item.number_limit - number].min else max = price == 0 ? 99 : $game_party.gold / price max = [max, 99 - number].min end @buy_window.active = false @buy_window.visible = false @number_window.set(@item, max, price) @number_window.active = true @number_window.visible = true end end end #-------------------------------------------------------------------------- # update_synth_list #-------------------------------------------------------------------------- def update_synth_list @synth_list.update @help_window.update if Input.trigger?(Input::B) Sound.play_cancel @command_window.active = true @command_window.visible = true @synth_list.active = false @synth_list.visible = false @ingre_list.visible = false @buy_window.visible = true @buy_window.refresh @status_window.visible = true @help_window.set_text("") elsif Input.trigger?(Input::C) item = @synth_list.item unless enabled?(item) Sound.play_buzzer else Sound.play_decision synthesize_item(item) end elsif Input.trigger?(Input::LEFT) Sound.play_cursor if @actor_index == 0 @actor_index = $game_party.members.size - 1 else @actor_index -= 1 end @actor_id = $game_party.members[@actor_index].id @synth_list.refresh(@actor_index) @ingre_list.refresh(@actor_index) elsif Input.trigger?(Input::RIGHT) Sound.play_cursor if @actor_index == $game_party.members.size - 1 @actor_index = 0 else @actor_index += 1 end @actor_id = $game_party.members[@actor_index].id @synth_list.refresh(@actor_index) @ingre_list.refresh(@actor_index) end end #-------------------------------------------------------------------------- # update_number_input #-------------------------------------------------------------------------- def update_number_input @number_window.update if Input.trigger?(Input::B) Sound.play_decision @buy_window.active = true @buy_window.visible = true @buy_window.refresh @number_window.active = false @number_window.visible = false elsif Input.trigger?(Input::C) Sound.play_shop if $imported["VariableControlledDiscounts"] price = @item.price * $game_variables[YE::EVENT::VARIABLE::PERCENT_BUY] price /= YE::EVENT::VARIABLE::PERCENT_DIVISOR else price = @item.price end $game_party.lose_gold(@number_window.number * price) $game_party.gain_item(@item, @number_window.number) @gold_window.refresh @buy_window.refresh @status_window.refresh @buy_window.active = true @buy_window.visible = true @buy_window.refresh @number_window.active = false @number_window.visible = false end end #-------------------------------------------------------------------------- # update_synth_number #-------------------------------------------------------------------------- def update_synth_number @synth_number.update if Input.trigger?(Input::B) Sound.play_decision @synth_list.active = true @synth_list.visible = true @synth_number.active = false @synth_number.visible = false elsif Input.trigger?(Input::C) Sound.play_shop item = @synth_list.item $game_party.lose_gold(@synth_number.number * item.synth_cost) if item.synth_actor.include?($game_party.members[@actor_index].id) synth = item.synth_actor[$game_party.members[@actor_index].id] else synth = item.synth_actor[0] end $game_party.gain_item(synth, @synth_number.number) consume_ingredients(item, @synth_number.number) @gold_window.refresh $game_actors[@actor_id].learn_recipe(item) run_common_event(item) @synth_list.refresh(@actor_index) @ingre_list.refresh(@actor_index) @synth_list.active = true @synth_list.visible = true @synth_number.active = false @synth_number.visible = false end end #-------------------------------------------------------------------------- # enabled? #-------------------------------------------------------------------------- def enabled?(item) return false if item == nil return false if @actor_index == -1 return false if item.synth_block.include?(@actor_id) return false unless (item.synth_actor.include?(@actor_id) or item.synth_actor.include?(0)) for ingredient in item.ingredients return false if $game_party.item_number(ingredient[0]) < ingredient[1] end return false unless $game_party.gold >= item.synth_cost return true end #-------------------------------------------------------------------------- # synthesize_item #-------------------------------------------------------------------------- def synthesize_item(item) if item.synth_cost > 0 max = $game_party.gold / item.synth_cost else max = $game_party.gold end if item.synth_consume? max = [max, $game_party.item_number(item)].min end for ingredient in item.ingredients next if ingredient[1] == 0 n = $game_party.item_number(ingredient[0]) / ingredient[1] max = [max, n].min end number = $game_party.item_number(item) limit = ($imported["LimitBreak"] ? item.number_limit : 99) max = [max, limit - number].min synth = synth_number_item(item) @synth_number.set(synth, max, item.synth_cost, item) @synth_number.visible = true @synth_number.active = true @synth_list.visible = false @synth_list.active = false end #-------------------------------------------------------------------------- # consume_ingredients #-------------------------------------------------------------------------- def consume_ingredients(item, number) if item.synth_consume? $game_party.lose_item(item, number) end for ingredient in item.ingredients $game_party.lose_item(ingredient[0], number * ingredient[1]) end end #-------------------------------------------------------------------------- # synth_number_item #-------------------------------------------------------------------------- def synth_number_item(item) if item.is_a?(RPG::Item) if $game_party.members[@actor_index].synth_items.include?(item.id) if item.synth_actor.include?($game_party.members[@actor_index].id) item = item.synth_actor[$game_party.members[@actor_index].id] elsif item.synth_actor.include?(0) item = item.synth_actor[0] end end elsif item.is_a?(RPG::Weapon) if $game_party.members[@actor_index].synth_weapons.include?(item.id) if item.synth_actor.include?($game_party.members[@actor_index].id) item = item.synth_actor[$game_party.members[@actor_index].id] elsif item.synth_actor.include?(0) item = item.synth_actor[0] end end elsif item.is_a?(RPG::Armor) if $game_party.members[@actor_index].synth_armours.include?(item.id) if item.synth_actor.include?($game_party.members[@actor_index].id) item = item.synth_actor[$game_party.members[@actor_index].id] elsif item.synth_actor.include?(0) item = item.synth_actor[0] end end end return item end #-------------------------------------------------------------------------- # run_common_event #-------------------------------------------------------------------------- def run_common_event(item) event = nil actor = $game_party.members[@actor_index] if item.synth_event.include?(actor.id) @synth_list.update event = item.synth_event[actor.id] elsif item.synth_event.include?(0) @synth_list.update event = item.synth_event[0] end return if event == nil if !actor.synth_events.include?(event) or item.replay_event? actor.synth_events.push(event) unless actor.synth_events.include?(event) if YE::SYNTH::EVENT_IN_SHOP @common_event = event else $game_temp.common_event_id = event $scene = Scene_Map.new end end end end # Scene_Synthesis #============================================================================== # Window_SynthList #============================================================================== class Window_SynthList < Window_Selectable #-------------------------------------------------------------------------- # initialize #-------------------------------------------------------------------------- def initialize(x, y, w, h) super(x, y, w, h) self.visible = false self.active = false self.index = 0 refresh end #-------------------------------------------------------------------------- # refresh #-------------------------------------------------------------------------- def refresh(actor_index = -1) @data = [] for goods_item in $game_temp.shop_goods case goods_item[0] when 0 item = $data_items[goods_item[1]] when 1 item = $data_weapons[goods_item[1]] when 2 item = $data_armors[goods_item[1]] end next if item == nil next unless item.recipe? next unless $game_party.has_item?(item) @data.push(item) end @item_max = @data.size create_contents @actor_index = actor_index @actor_id = $game_party.members[@actor_index].id for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # draw_item #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) self.contents.clear_rect(rect) item = @data[index] enable = enabled?(item) if @actor_index >= 0 and item.synth_actor.include?(@actor_id) if item.is_a?(RPG::Item) if $game_actors[@actor_id].synth_items.include?(item.id) item = item.synth_actor[@actor_id] end elsif item.is_a?(RPG::Weapon) if $game_actors[@actor_id].synth_weapons.include?(item.id) item = item.synth_actor[@actor_id] end elsif item.is_a?(RPG::Armor) if $game_actors[@actor_id].synth_armours.include?(item.id) item = item.synth_actor[@actor_id] end end elsif @actor_index >= 0 and item.synth_actor.include?(0) if item.is_a?(RPG::Item) if $game_actors[@actor_id].synth_items.include?(item.id) item = item.synth_actor[0] end elsif item.is_a?(RPG::Weapon) if $game_actors[@actor_id].synth_weapons.include?(item.id) item = item.synth_actor[0] end elsif item.is_a?(RPG::Armor) if $game_actors[@actor_id].synth_armours.include?(item.id) item = item.synth_actor[0] end end end draw_item_name(item, rect.x, rect.y, enable) end #-------------------------------------------------------------------------- # enabled? #-------------------------------------------------------------------------- def enabled?(item) return false if item == nil return false if @actor_index == -1 return false if item.synth_block.include?(@actor_id) return false unless (item.synth_actor.include?(@actor_id) or item.synth_actor.include?(0)) for ingredient in item.ingredients return false if $game_party.item_number(ingredient[0]) < ingredient[1] end return false unless $game_party.gold >= item.synth_cost return true end #-------------------------------------------------------------------------- # return item #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # update_help #-------------------------------------------------------------------------- def update_help if item == nil text = "" else text = item.description end if item.is_a?(RPG::Item) if $game_party.members[@actor_index].synth_items.include?(item.id) if item.synth_actor.include?($game_party.members[@actor_index].id) text = item.synth_actor[$game_party.members[@actor_index].id].description elsif item.synth_actor.include?(0) text = item.synth_actor[0].description end end elsif item.is_a?(RPG::Weapon) if $game_party.members[@actor_index].synth_weapons.include?(item.id) if item.synth_actor.include?($game_party.members[@actor_index].id) text = item.synth_actor[$game_party.members[@actor_index].id].description elsif item.synth_actor.include?(0) text = item.synth_actor[0].description end end elsif item.is_a?(RPG::Armor) if $game_party.members[@actor_index].synth_armours.include?(item.id) if item.synth_actor.include?($game_party.members[@actor_index].id) text = item.synth_actor[$game_party.members[@actor_index].id].description elsif item.synth_actor.include?(0) text = item.synth_actor[0].description end end end @help_window.set_text(text) end end # Window_SynthList #============================================================================== # Window_Ingredients #============================================================================== class Window_Ingredients < Window_Base #-------------------------------------------------------------------------- # initialize #-------------------------------------------------------------------------- def initialize(x, y, w, h) super(x, y, w, h) self.visible = false @item = nil refresh end #-------------------------------------------------------------------------- # refresh #-------------------------------------------------------------------------- def refresh(actor_index = -1) self.contents.clear self.contents.font.color = normal_color self.contents.font.color.alpha = 255 self.contents.font.size = Font.default_size @actor_index = actor_index draw_actor draw_ingredients end #-------------------------------------------------------------------------- # return item #-------------------------------------------------------------------------- def item return @item end #-------------------------------------------------------------------------- # item= #-------------------------------------------------------------------------- def item=(item) if @item != item @item = item refresh end end #-------------------------------------------------------------------------- # draw_actor #-------------------------------------------------------------------------- def draw_actor return if @actor_index < 0 sw = self.width - 32 actor = $game_party.members[@actor_index] draw_actor_graphic(actor, 24, WLH*2) self.contents.draw_text(48, 0, sw-48, WLH, actor.name) self.contents.font.size = YE::SYNTH::SYNTH_FSIZE total = actor.synth_items.size + actor.synth_weapons.size + actor.synth_armours.size text = sprintf(YE::SYNTH::SYNTH_TOTAL, total) xoffset = YE::SYNTH::SYNTH_OFFSET self.contents.draw_text(48, 24, sw-48, WLH, text) end #-------------------------------------------------------------------------- # draw_ingredients #-------------------------------------------------------------------------- def draw_ingredients return if @item == nil self.contents.font.size = Font.default_size sw = self.width - 32 dy = 48 if incompatible? or @item.synth_block.include?($game_party.members[@actor_index].id) self.contents.font.color = text_color(YE::SYNTH::SYNTH_INCOLR) self.contents.draw_text(0, dy, sw, WLH, YE::SYNTH::SYNTH_INCOMP, 1) return else self.contents.font.color = system_color self.contents.draw_text(0, dy, sw, WLH, @item.name, 1) end dy += 24 self.contents.font.color = normal_color self.contents.font.size = YE::SYNTH::SYNTH_FSIZE if item.synth_cost > 0 enabled = ($game_party.gold >= item.synth_cost) ? true : false draw_icon(YE::SYNTH::SYNTH_C_ICON, 0, dy, enabled) self.contents.font.color.alpha = enabled ? 255 : 128 self.contents.draw_text(24, dy, sw-24, WLH, YE::SYNTH::SYNTH_COST) text = sprintf(YE::SYNTH::SYNTH_T_COST, item.synth_cost, Vocab.gold) self.contents.draw_text(24, dy, sw-24, WLH, text, 2) dy += 24 end if item.synth_consume? draw_item_name(item, 0, dy) amount = $game_party.item_number(item) text = sprintf(YE::SYNTH::SYNTH_AMT, 1, amount) self.contents.draw_text(0, dy, sw, WLH, text, 2) dy += 24 end item_list = @item.ingredients.sort { |a,b| a[0].name <=> b[0].name } for key in item_list amount = $game_party.item_number(key[0]) if amount >= key[1] self.contents.font.color.alpha = 255 enabled = true else self.contents.font.color.alpha = 128 enabled = false end draw_item_name(key[0], 0, dy, enabled) text = sprintf(YE::SYNTH::SYNTH_AMT, key[1], amount) self.contents.draw_text(0, dy, sw, WLH, text, 2) unless key[1] == 0 and YE::SYNTH::SYNTH_HIDE_0 dy += 24 end end #-------------------------------------------------------------------------- # incompatible? #-------------------------------------------------------------------------- def incompatible? actor = $game_party.members[@actor_index] if item.synth_actor.include?(actor.id) return false elsif item.synth_actor.include?(0) return false end return true end end # Window_Ingredients #============================================================================== # Window_SynthBuy #============================================================================== class Window_SynthBuy < Window_Selectable #-------------------------------------------------------------------------- # initialize #-------------------------------------------------------------------------- def initialize(x, y, w, h) super(x, y, w, h) @shop_goods = $game_temp.shop_goods refresh self.active = false self.index = -1 end #-------------------------------------------------------------------------- # return item #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # refresh #-------------------------------------------------------------------------- def refresh @data = [] for goods_item in @shop_goods case goods_item[0] when 0 item = $data_items[goods_item[1]] next if item == nil next unless item.recipe? next if item.synth_unbuyable for i in 1..$data_actors.size actor = $game_actors[i] next if actor == nil if actor.synth_items.include?(item.id) if item.synth_actor.include?(actor.id) @data.push(item.synth_actor[actor.id]) unless @data.include?(item) elsif item.synth_actor.include?(0) @data.push(item.synth_actor[0]) unless @data.include?(item) end end end when 1 item = $data_weapons[goods_item[1]] next if item == nil next unless item.recipe? next if item.synth_unbuyable for i in 1..$data_actors.size actor = $game_actors[i] next if actor == nil if actor.synth_weapons.include?(item.id) if item.synth_actor.include?(actor.id) @data.push(item.synth_actor[actor.id]) unless @data.include?(item) elsif item.synth_actor.include?(0) @data.push(item.synth_actor[0]) unless @data.include?(item) end end end when 2 item = $data_armors[goods_item[1]] next if item == nil next unless item.recipe? next if item.synth_unbuyable for i in 1..$data_actors.size actor = $game_actors[i] next if actor == nil if actor.synth_armours.include?(item.id) if item.synth_actor.include?(actor.id) @data.push(item.synth_actor[actor.id]) unless @data.include?(item) elsif item.synth_actor.include?(0) @data.push(item.synth_actor[0]) unless @data.include?(item) end end end end end sort_list @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # draw_item #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] number = $game_party.item_number(item) if $imported["VariableControlledDiscounts"] price = item.price * $game_variables[YE::EVENT::VARIABLE::PERCENT_BUY] price /= YE::EVENT::VARIABLE::PERCENT_DIVISOR else price = item.price end if $imported["LimitBreak"] max = item.number_limit else max = 99 end if $imported["DisplayItemQuery"] if item.is_a?(RPG::Item) $game_party.purchased_items[item.id] = [] if $game_party.purchased_items[item.id] == nil $game_party.purchased_items[item.id].push($game_map.map_id) unless $game_party.purchased_items[item.id].include?($game_map.map_id) elsif item.is_a?(RPG::Weapon) $game_party.purchased_weapons[item.id] = [] if $game_party.purchased_weapons[item.id] == nil $game_party.purchased_weapons[item.id].push($game_map.map_id) unless $game_party.purchased_weapons[item.id].include?($game_map.map_id) elsif item.is_a?(RPG::Armor) $game_party.purchased_armours[item.id] = [] if $game_party.purchased_armours[item.id] == nil $game_party.purchased_armours[item.id].push($game_map.map_id) unless $game_party.purchased_armours[item.id].include?($game_map.map_id) end end enable = (price <= $game_party.gold and number < max) rect = item_rect(index) self.contents.clear_rect(rect) draw_item_name(item, rect.x, rect.y, enable) rect.width -= 4 self.contents.draw_text(rect, price, 2) end #-------------------------------------------------------------------------- # sort_list #-------------------------------------------------------------------------- def sort_list dummy_items = []; dummy_weapons = []; dummy_armours = [] for item in @data next unless item.is_a?(RPG::Item) next if item.synth_unbuyable dummy_items.push(item) end dummy_items = dummy_items.sort{ |a,b| a.id <=> b.id } for item in @data next unless item.is_a?(RPG::Weapon) next if item.synth_unbuyable dummy_weapons.push(item) end dummy_weapons = dummy_weapons.sort{ |c,d| c.id <=> d.id } for item in @data next unless item.is_a?(RPG::Armor) next if item.synth_unbuyable dummy_armours.push(item) end dummy_armours = dummy_armours.sort{ |e,f| e.id <=> f.id } @data = dummy_items.uniq @data += dummy_weapons.uniq @data += dummy_armours.uniq end #-------------------------------------------------------------------------- # update_help #-------------------------------------------------------------------------- def update_help @help_window.set_text(item == nil ? "" : item.description) end end #Window_SynthBuy #============================================================================== # Window_SynthNumber #============================================================================== class Window_SynthNumber < Window_ShopNumber #-------------------------------------------------------------------------- # set #-------------------------------------------------------------------------- def set(item, max, price, real) @real = real super(item, max, price) end #-------------------------------------------------------------------------- # refresh #-------------------------------------------------------------------------- def refresh dy = 0 sw = self.width - 32 self.contents.clear self.contents.font.color = system_color self.contents.draw_text(0, dy, sw, WLH, YE::SYNTH::SYNTH_OUTCOM, 1) dy += 24 self.contents.font.color = normal_color if @item == @real draw_icon(YE::SYNTH::SYNTH_UNICON, 0, dy) text = YE::SYNTH::SYNTH_UNMASK self.contents.draw_text(24, dy, 172, WLH, text) else draw_item_name(@item, 0, dy) end self.contents.draw_text(212, dy, 20, WLH, "×") self.contents.draw_text(218, dy, 50, WLH, @number, 2) self.cursor_rect.set(207, dy, 64, WLH) dy += 24 self.contents.font.color = system_color self.contents.draw_text(0, dy, sw, WLH, YE::SYNTH::SYNTH_INGRED, 1) self.contents.font.color = normal_color if @price != 0 dy += 24 draw_icon(YE::SYNTH::SYNTH_C_ICON, 0, dy) self.contents.draw_text(24, dy, 172, WLH, YE::SYNTH::SYNTH_COST) draw_currency_value(@price * @number, 4, dy, 264) end if @real.synth_consume? dy += 24 draw_item_name(@real, 0, dy) self.contents.draw_text(212, dy, 20, WLH, "×") self.contents.draw_text(218, dy, 50, WLH, @number, 2) end ingredients = @real.ingredients.sort { |a,b| a[0].name <=> b[0].name } for ingredient in ingredients next if ingredient[0] == nil dy += 24 draw_item_name(ingredient[0], 0, dy) unless (@number * ingredient[1] == 0) and YE::SYNTH::SYNTH_HIDE_0 self.contents.draw_text(212, dy, 20, WLH, "×") self.contents.draw_text(218, dy, 50, WLH, @number * ingredient[1], 2) end end end end # Window_SynthNumber #=============================================================================== # # END OF FILE # #===============================================================================