#===============================================================================# Multiple Crafting Script v2.1 updated: 10/05/2013# Based off of Cooking Script v1.0 by GubiD# ported to VXAce and updated by Venka#===============================================================================# - Introduction -#------------------------------------------------------------------------------# A script that allows the player to craft items. There's a menu to help the# player keep track of their recipes and items needed to make their items.# You can have multiple crafts (Cooking, Smithing, Alchemy, etc). Each craft# has it's own exp, levels and recipes.## When crafting an item, gauge bar will show up. The gauge will change colors# when you can claim an item. If you press enter when the color changes, then# you succesfully craft the item. If you do it before the change then you# consume the ingredients and make nothing (with the option of still earning# some exp). If you try to claim the item after the gauge's color changes# back to it's orginal color, then you have waited too long and you can# recieve a failed item (and the option of some exp).## For example, if you're cooking and you cook for too long then you could# recieve a burnt item.## An option has been added to allow you to instantly use a crafted item.# If you do not wish to use this feature, then set ConsumeItem to false.# # NOTE: I took out the menu access in this version since it take more coding# to try to determine the crafting skill type before opening the scene.# However, you could make a portable item and give it a common event that# calls the scene.# I made a Mortar and Pestle that can be used from the menu for Alchemy.##------------------------------------------------------------------------------# - Script Calls -#------------------------------------------------------------------------------# To call the scene use:# craft(crafte_id)# crafte_id = This is the ID set for the craft at Craft_Info## EXAMPLE: craft(1)# This would call the Craft_Info at ID 1, which is "Cooking". So the# windows would open and show recipes and info for Cooking.# # To teach the player a new recipe use:# learn_recipe(recipe_id)# recipe_id is the ID in Recipes.## EXAMPLE: learn_recipe(1)# This would call the recipe that matches Recipes[1]. Which is the# Loaf of Bread recipe for cooking. So it will show when the cook book# is open, but not any other craft books.# # To delete a recipe use:# forget_recipe(recipe_id)# recipe_id is the ID in Recipes.# NOTE: It's the same as learn_recipe but it removes the recipe.## To check the current crafting level:# $craft[craft_id].level - player's level# $craft[craft_id].exp - player's total craft exp# $craft[craft_id].change_level(level) - grant or loose levels# crafte_id = This is the ID set for the craft at Craft_Info# level = the levels you want to add or loose.## EXAMPLES: $craft[2].level - Checks the Smithing Level# $craft[3].exp - Checks the total exp earned for Alchemy# $craft[1].change_level(3) - Would grant 3 levels to Cooking# NOTE: You can use negative numbers to loose levels.# $craft[1].change_level(-1) - Would loose 1 level to Cooking##==============================================================================module Venka; module Crafting #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # - General Settings - #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Crafting_Time_Max = 1000 # Max craft time (total time) Crafting_Buffer = 30 # Buffer to activated timer (window for claiming) Default_Craft_Time = 300 # Default craft time (when to claim item) Failure_Exp_Rate = 0.25 # Exp recieved when failed. Ex 0.25 is 25% ConsumeItem = true # Use consumable items right after crafting it #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # - Gauge Color Settings - #---------------------------------------------------------------------------- # You can use window skin color code by simply putting the number (0 - 31) # OR use RBG Colors by putting (red, blue, green, opacity) 0 - 255 each. # Examples: Exp_Gauge_Color1 = 27 # Exp_Gauge_Color1 = [10, 100, 215, 100] #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Exp_Gauge_Color1 = [110, 0, 215, 200] # Left side of the exp gauge Exp_Gauge_Color2 = [180, 150, 255, 230] # Right side of the exp gauge Craft_Gauge_Color1 = 10 # Left side of the crafting gauge Craft_Gauge_Color2 = 21 # Right side of the crafting gauge Claim_Gauge_Color1 = [ 25, 100, 0, 255] # Left side of the claim gauge Claim_Gauge_Color2 = [ 0, 255, 0, 240] # Right side of the claim gauge #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # - Sound Settings - #---------------------------------------------------------------------------- # The file should be one found in the SE folder. Volume is 1 - 100 # Pitch can be 50 - 200 # Use this format: [ "FileName", Volume, Pitch ] #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Start_Scene = ["Book1", 80, 100] # Sound on book open Success_Sound = ["Item1", 80, 75] # Crafted successfuly Premature_Sound = ["Disappointment", 80, 100] # Crafted too soon Failure_Sound = ["Chime1", 80, 50] # Crafted too late Level_Up_Sound = ["Sound2", 80, 100] # Gained crafting level #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # - Text Settings - #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Craft_Button_Text = "Create" # What the begin crafting button displays Directions_Msg = "Press 'Enter' when the bar is green" # Instructions Text Failed_Msg = "You have failed at creating this item." # Fail message Result_Msg = "You crafted:" # Success Message Lv_Gain = "Leveled Up!!" # Level up message #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # - Font Settings - #---------------------------------------------------------------------------- # :title_text = the text craft's name in the Title Window. # :recipe_name = the recipe's name at the top of the detail window # :recipe_list = font used in the recipe list window # :header_text = the "Ingredients: Needed/Owned" line in the detail window # :description = the crafted item's description text. # :help_text = the text that appears when crafting an item. # ther_text = all other text # :button_text = the Create/Cancel Buttons test # # For each text type you need to set up the Fonts, Size, Boldness and Color. # Use the following format: # [["Font_Name, Font_Name, etc], Font_Size, Bold?, Color]], # Font_Name = an array holding font choices. The fist one is your first # choice to use, but if the player doesn't have that font on their # computer, it will go through the list until it finds one it can use # Font_Size = the size font you want to use # Bold? = this should be true for bold, false to turn bold off # Color = This is the same format as setting colors for Gauge Color. # Use [red, blue, green, opacity] or window skin color number. #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Fonts = { # Fonts, Size, Bold?, Color :title_text => [["Sylfaen", "Calibri"], 24, true, 0], :recipe_name => [["Sylfaen", "Calibri"], 25, true, 14], :recipe_list => [["Sylfaen", "Calibri"], 24, true, 0], :header_text => [["Sylfaen", "Calibri"], 24, true, 1], :description => [["Sylfaen", "Calibri"], 22, false, 0], :help_text => [["Sylfaen", "Calibri"], 24, false, 17], ther_text => [["Verdana", "Calibri"], 20, false, 0], :button_text => [["Verdana", "Calibri"], 24, true, [0, 255, 0, 200]], } # <- DO NOT REMOVE #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # - Craft_Info Settings - #---------------------------------------------------------------------------- # ID => [ [ EXP_Table ], "Craft Name", Max_Lv] # ID is used to identify each craft # EXP Table has 4 parts just like a class's exp in the database. # [A, B, C, D] # A is the base exp needed (this number can be 10 or higher) # B is the exp tacked on to each level (this can be 0 or higher) # C is a curve that effects all levels (must be 10 or higher) # D is another curve that effects high levels mostly (must be 10+) #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Craft_Info = { # ID => [ [ EXP_Table ], "Craft Name", Max_Lv] 1 => [[ 10, 5, 12, 20], "Cook", 30], 2 => [[ 12, 3, 20, 15], "Smith", 30], 3 => [[ 10, 0, 10, 10], "Alchemy", 30], } # <- DO NOT REMOVE #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # - Recipe Settings - #---------------------------------------------------------------------------- # Recipe[ID] => { The ID must be a unique number. # :recipe_type => x # x = the Craft_Info ID this recipe belongs to. # If it was 1 then it'd be a cooking recipe, 2 is blacksmith, etc # :req_level => y # y = the crafting level needed to make the recipe # :craft_time => t # t = time in frames (60 frames = 1 second). This is the time when # the recipe can claim success. Before the time resaults in lost # ingredients and no item. After this time results in lost # ingredients and a failed attempt item is granted. # NOTE: You can omit this one to use the Default_Craft_Time above # :earned_exp => exp # exp = the amount of exp recieved on successful crafting of the item # :crafted_item => [Type, Item_ID, Amount] # :failed_item => [Type, Item_ID, Amount] # :ingredients => [[Type, ItemID, Amount], [Type, ItemID, Amount], ... ] # Type = 1 for Items # 2 for Armor # 3 for Weapons # Item_ID = item's id in the database # Amount = the amount of items to reward # # NOTE: :ingredients can have multiple entries. #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Recipes ||= {} #-------------------------------------------------------------------------- # - Custom Recipes Start Here - #-------------------------------------------------------------------------- Recipes[1] = { # Loaf of Bread :recipe_type => 1, # Cooking Recipe :req_level => 1, # Level required to use this recipe :craft_time => 200, # Time it takes to make the item :earned_exp => 3, # Exp gained on success :crafted_item => [1,20,2], # Makes 2x Loaf of Bread :failed_item => [1,29,1], # 1x Piece of Charcoal if failed attempt :ingredients => [ # 2x Eggs, 1x Flour, 1x Fresh Milk [1, 21, 2], [1, 22, 1], [1, 23, 1], ]} # <- DO NOT REMOVE Recipes[2] = { # Stew :recipe_type => 1, # Cooking Recipe :req_level => 2, # Level required to use this recipe :craft_time => 250, # Time it takes to make the item :earned_exp => 5, # Exp gained on success :crafted_item => [1,24,1], # Makes 1x Stew #:failed_item => [1,31,1], # Omitting failed item. You'd just get no item :ingredients => [# 2x Meat, 1x Carrot, 1x Bell Pepper, 1x Onioin [1, 25, 2], [1, 26, 1], [1, 27, 1], [1, 28, 1], ]} # <- DO NOT REMOVE Recipes[3] = { # Battle Axe :recipe_type => 2, # Smithing Recipe :req_level => 1, # Level required to use this recipe #:craft_time => 300, # Time omitted to use defualt time of 300 :earned_exp => 4, # Exp gained on success :crafted_item => [3,2,1], # Makes 1x Battle Axe :failed_item => [1,30,1], # 1x Slag on failed attempt :ingredients => [# 1x Iron Ore, 1x Wooden Shaft [1, 33, 1], [1, 35, 1], ]} # <- DO NOT REMOVE Recipes[4] = { # Chain Mail :recipe_type => 2, # Smithing Recipe :req_level => 2, # Level required to use this recipe :craft_time => 400, # Time it takes to make the item :earned_exp => 5, # Exp gained on success :crafted_item => [2,31,1], # Makes 1x Chain Mail :failed_item => [1,30,1], # 1x Slag on failed attempt :ingredients => [# 2x Iron Ore, 3x Leather Straps [1, 33, 2], [1, 34, 3], ]} # <- DO NOT REMOVE Recipes[5] = { # Full Potion :recipe_type => 3, # Alchemy Recipe :req_level => 1, # Level required to use this recipe :craft_time => 350, # Time it takes to make the item :earned_exp => 4, # Exp gained on success :crafted_item => [1, 3,1], # Makes 1x Full Potion :failed_item => [1,31,1], # 1x Slag on failed attempt :ingredients => [# 1x Lizard Hearts, 1x Sea Shell [1, 37, 1], [1, 40, 1], ]} # <- DO NOT REMOVE Recipes[6] = { # Stimulant :recipe_type => 3, # Alchemy Recipe :req_level => 3, # Level required to use this recipe :craft_time => 500, # Time it takes to make the item :earned_exp => 7, # Exp gained on success :crafted_item => [1, 5,1], # Makes 1x Stimulant :failed_item => [1,31,1], # 1x Slag on failed attempt :ingredients => [# 1x Bat Wings, 1x Pixie Dust [1, 38, 1], [1, 39, 1], ]} # <- DO NOT REMOVEend; end#==============================================================================# ■ DataManager#==============================================================================module DataManager #---------------------------------------------------------------------------- # ● alias methods: #---------------------------------------------------------------------------- class << self alias venka_crafting_create_objects create_game_objects alias venka_crafting_save_contents make_save_contents alias venka_crafting_extract_contents extract_save_contents end #---------------------------------------------------------------------------- # ● alias method: create_game_objects #---------------------------------------------------------------------------- def self.create_game_objects venka_crafting_create_objects $craft = Game_Crafting.new $recipe = Game_Recipes.new end #---------------------------------------------------------------------------- # ● alias method: make_save_contents #---------------------------------------------------------------------------- def self.make_save_contents contents = venka_crafting_save_contents contents[:crafting] = $craft contents end #---------------------------------------------------------------------------- # ● alias method: extract_save_contents #---------------------------------------------------------------------------- def self.extract_save_contents(contents) venka_crafting_extract_contents(contents) $craft = contents[:crafting] endend#==============================================================================# ■ Game_Craft_Info#==============================================================================class Game_Craft_Info #---------------------------------------------------------------------------- # ♦ Public Instance Variables #---------------------------------------------------------------------------- attr_reader :name attr_reader :level #---------------------------------------------------------------------------- # ● upgrade method: initialize #---------------------------------------------------------------------------- def initialize(craft_id) @craft_id = craft_id @name = Venka::Crafting::Craft_Info[@craft_id][1] @level = 1 @max_level = Venka::Crafting::Craft_Info[@craft_id][2] @exp = {} @unlocked = false init_exp end #---------------------------------------------------------------------------- # ○ new method: exp_for_level #---------------------------------------------------------------------------- def exp_for_level(level) lv = level.to_f basis = Venka::Crafting::Craft_Info[@craft_id][0][0].to_f extra = Venka::Crafting::Craft_Info[@craft_id][0][1].to_f acc_a = Venka::Crafting::Craft_Info[@craft_id][0][2].to_f acc_b = Venka::Crafting::Craft_Info[@craft_id][0][3].to_f return (basis*((lv-1)**(0.9+acc_a/250))*lv*(lv+1)/(6+lv**2/50/acc_+(lv-1)*extra).round.to_i end #---------------------------------------------------------------------------- # ○ new method: init_exp #---------------------------------------------------------------------------- def init_exp; @exp[@craft_id] = current_level_exp; end #---------------------------------------------------------------------------- # ○ new method: learn, forget, learned? #---------------------------------------------------------------------------- def learn; @unlock = true; end def forget; @unlock = false; end def learned?; return @unlock; end #---------------------------------------------------------------------------- # ○ new method: exp related methods #---------------------------------------------------------------------------- def exp; @exp[@craft_id]; end def current_level_exp; exp_for_level(@level); end def next_level_exp; exp_for_level(@level + 1); end def level_up; @level += 1; end def level_down; @level -= 1; end def max_level?; @level >= @max_level; end #---------------------------------------------------------------------------- # ○ new method: change_exp #---------------------------------------------------------------------------- def change_exp(exp) @exp[@craft_id] = [exp, 0].max last_level = @level level_up while !max_level? && self.exp >= next_level_exp level_down while self.exp < current_level_exp end #---------------------------------------------------------------------------- # ○ new method: exp, gain_exp #---------------------------------------------------------------------------- def exp; @exp[@craft_id]; end def gain_exp(exp); change_exp(self.exp + exp.to_i); end #---------------------------------------------------------------------------- # ○ new method: change_level #---------------------------------------------------------------------------- def change_level(level) @level += level @level = [[@level, @max_level].min, 1].max change_exp(exp_for_level(@level)) endend#==============================================================================# ■ Game_Crafting #==============================================================================class Game_Crafting #---------------------------------------------------------------------------- # ♦ Public Instance Variables #---------------------------------------------------------------------------- attr_reader :learned_recipes #---------------------------------------------------------------------------- # ● upgraded method: initialize #---------------------------------------------------------------------------- def initialize; @craft = []; end #---------------------------------------------------------------------------- # ○ new method: [] #---------------------------------------------------------------------------- def [](craft_id) return nil unless Venka::Crafting::Craft_Info[craft_id] @craft[craft_id] ||= Game_Craft_Info.new(craft_id) end #---------------------------------------------------------------------------- # ○ new method: learn_recipe #---------------------------------------------------------------------------- def learn_recipe(recipe_id) @learned_recipes ||= [] @learned_recipes << recipe_id unless @learned_recipes.include?(recipe_id) @learned_recipes.sort! end #---------------------------------------------------------------------------- # ○ new method: forget_recipe #---------------------------------------------------------------------------- def forget_recipe(recipe_id) @learned_recipes.delete(recipe_id) endend#==============================================================================# ■ Game_Recipe#==============================================================================class Game_Recipe #---------------------------------------------------------------------------- # ♦ Public Instance Variables #---------------------------------------------------------------------------- attr_reader :recipe_type, :req_level, :ingredients attr_reader :craft_time, :earned_exp, :ingredient_amount #---------------------------------------------------------------------------- # ● upgrade method: initialize #---------------------------------------------------------------------------- def initialize(recipe_id) @recipe_id = recipe_id @recipe = Venka::Crafting::Recipes[@recipe_id] @recipe_type = @recipe[:recipe_type] @req_level = @recipe[:req_level] @craft_time = @recipe[:craft_time] ? @recipe[:craft_time] : Venka::Crafting:efault_Craft_Time @earned_exp = @recipe[:earned_exp] @craft_item = @recipe[:crafted_item] @fail_item = @recipe[:failed_item] @components = @recipe[:ingredients] @ingredients = [] get_ingredients @ingredient_amount = [] get_ingredient_amount end #---------------------------------------------------------------------------- # ○ new method: crafted_item, failed_item, crafted_amount, failed_amount #---------------------------------------------------------------------------- def crafted_item; get_item_info(@craft_item[0], @craft_item[1]); end def failed_item; get_item_info(@fail_item[0], @fail_item[1]); end def crafted_amount; @craft_item[2]; end def failed_amount; @fail_item[2]; end #---------------------------------------------------------------------------- # ○ new method: ingredients #---------------------------------------------------------------------------- def get_ingredients for i in 0...@components.size item = get_item_info(@components[0], @components[1]) @ingredients << item end return @ingredients end #---------------------------------------------------------------------------- # ○ new method: ingredient_amount #---------------------------------------------------------------------------- def get_ingredient_amount for i in 0...@components.size @ingredient_amount << @components[2] end return @ingredient_amount end #---------------------------------------------------------------------------- # ○ new method: get_item_type #---------------------------------------------------------------------------- def get_item_info(item_type, item_id) case item_type when 1; return $data_items[item_id] # Itme when 2; return $data_armors[item_id] # Armor when 3; return $data_weapons[item_id] # Weapon end endend#==============================================================================# ■ Game_Recipes#==============================================================================class Game_Recipes #---------------------------------------------------------------------------- # ● upgraded method: initialize #---------------------------------------------------------------------------- def initialize; @recipes = []; end #---------------------------------------------------------------------------- # ○ new method: [] #---------------------------------------------------------------------------- def [](recipe_id) return nil unless Venka::Crafting::Recipes[recipe_id] @recipes[recipe_id] ||= Game_Recipe.new(recipe_id) endend#==============================================================================# ■ Game_Interpreter#==============================================================================class Game_Interpreter #---------------------------------------------------------------------------- # ○ new method: craft #---------------------------------------------------------------------------- def craft(craft_type) SceneManager.call(Scene_Crafting) SceneManager.scene.prepare(craft_type) end #---------------------------------------------------------------------------- # ○ new method: learn_recipe #---------------------------------------------------------------------------- def learn_recipe(recipe_id) $craft.learn_recipe(recipe_id) end #---------------------------------------------------------------------------- # ○ new method: forget_recipe #---------------------------------------------------------------------------- def forget_recipe(recipe_id) $craft.forget_recipe(recipe_id) endend#==============================================================================# ■ Window_Base#==============================================================================class Window_Base < Window #-------------------------------------------------------------------------- # ● alias method: process_escape_character - credit LoneWolf (fixes trash symbols) #-------------------------------------------------------------------------- alias rocess_normal_character_vxa rocess_normal_character def process_normal_character(c, pos) return unless c >= ' ' process_normal_character_vxa(c, pos) end #---------------------------------------------------------------------------- # ○ new method: get_color - method detirmines if text color or new color #---------------------------------------------------------------------------- def get_color(input) input.is_a?(Integer) ? text_color([[input, 0].max, 31].min) : Color.new(*input) end #---------------------------------------------------------------------------- # ○ new method: craft_font_color #---------------------------------------------------------------------------- def craft_font_color(text_type) f_color = Venka::Crafting::Fonts[text_type][3] color = f_color.is_a?(Integer) ? text_color(f_color) : Color.new(*f_color) end #---------------------------------------------------------------------------- # ○ new method: set_font #---------------------------------------------------------------------------- def set_font(text_type) font = Venka::Crafting::Fonts[text_type] contents.font.name = font[0] contents.font.size = font[1] contents.font.bold = font[2] change_color(craft_font_color(text_type), enabled = true) endend#==============================================================================# ■ Crafting_Title_Window#==============================================================================class Crafting_Title_Window < Window_Base #---------------------------------------------------------------------------- # ● upgraded method: initialize #---------------------------------------------------------------------------- def initialize super(0, 0, Graphics.width, 48) @craft_id = nil end #---------------------------------------------------------------------------- # ○ new method: craft #---------------------------------------------------------------------------- def craft=(craft_id) return if @craft_id == craft_id @craft_id = craft_id @craft = $craft[@craft_id] @exp = @craft.exp refresh end #---------------------------------------------------------------------------- # ● upgraded method: refresh #---------------------------------------------------------------------------- def refresh contents.clear x = w = contents.width * 0.5 set_fonttitle_text) draw_text(0, 0, contents.width * 0.3, line_height, @craft.name) set_fontother_text) draw_crafting_gauge(x, 0, w) draw_text(x, 0, w, line_height, "Level: #{@craft.level}") end #---------------------------------------------------------------------------- # ○ new method: draw_crafting_exp_gauge #---------------------------------------------------------------------------- def draw_crafting_gauge(x, y, width) @s1 = @craft.exp - @craft.current_level_exp @s2 = @craft.exp_for_level(@craft.level + 1) - @craft.current_level_exp rate = [@s1.to_f/@s2, 1.0].min color1 = get_color(Venka::Crafting::Exp_Gauge_Color1) color2 = get_color(Venka::Crafting::Exp_Gauge_Color2) draw_gauge(x, y, width, rate, color1, color2) color1 = color2 = normal_color draw_current_and_max_values(x + 80, y, width - 80, @s1.to_s, @s2.to_s, color1, color2) end #---------------------------------------------------------------------------- # ● upgraded method: update #---------------------------------------------------------------------------- def update super if @exp != $craft[@craft_id].exp @exp = $craft[@craft_id].exp refresh end endend#==============================================================================# ■ Recipe_List_Window#==============================================================================class Recipe_List_Window < Window_Command #---------------------------------------------------------------------------- # ♦ Public Instance Variables #---------------------------------------------------------------------------- attr_reader :detail_window #---------------------------------------------------------------------------- # ● upgraded method: initialize #---------------------------------------------------------------------------- def initialize(x, y) super(x, y) @craft_type = nil @recipes = $craft.learned_recipes end #---------------------------------------------------------------------------- # ○ new method: craft #---------------------------------------------------------------------------- def craft=(craft) return if @craft_type == craft @craft_type = craft refresh end #---------------------------------------------------------------------------- # ● window_settings #---------------------------------------------------------------------------- def window_width; return Graphics.width * 0.3; end def window_height; return Graphics.height - 48; end #---------------------------------------------------------------------------- # ● upgraded method: update #---------------------------------------------------------------------------- def update super if @detail_window.recipe_id != current_symbol @detail_window.recipe_id = current_symbol end end #---------------------------------------------------------------------------- # ● upgraded method: make_command_list #---------------------------------------------------------------------------- def make_command_list return unless @recipes @items = [] @recipes.each do |recipe_id| next unless $recipe[recipe_id].recipe_type == @craft_type item = $recipe[recipe_id].crafted_item @items << item add_command(item.name, recipe_id.to_s.to_sym) end end #---------------------------------------------------------------------------- # ● upgraded method: make_command_list #---------------------------------------------------------------------------- def draw_item(index) rect = item_rect_for_text(index) set_fontrecipe_list) draw_item_name(@items[index], rect.x, rect.y, rect.width) if @items[index] end #---------------------------------------------------------------------------- # ● upgraded method: draw_item_name #---------------------------------------------------------------------------- def draw_item_name(item, x, y, width = contents.width) return unless item draw_icon(item.icon_index, x, y) draw_text(x + 24, y, width, line_height, item.name) end #---------------------------------------------------------------------------- # ○ new method: detail_window #---------------------------------------------------------------------------- def detail_window=(detail_window) @detail_window = detail_window update endend#==============================================================================# ■ Crafting_Details_Window#==============================================================================class Crafting_Details_Window < Window_Command; include Venka::Crafting #---------------------------------------------------------------------------- # ♦ Public Instance Variables #---------------------------------------------------------------------------- attr_reader :recipe_id, :started attr_reader :result_exp, :result_item, :result_level attr_reader :result_amount, :result_message #---------------------------------------------------------------------------- # ● upgraded method: initialize #---------------------------------------------------------------------------- def initialize super(Graphics.width * 0.3, 48) @recipe_id = :none @recipe = [] @started = @success = @failed = @result_level = false @max = Crafting_Time_Max @result_exp = @result_amount = 0 @result_item = nil @result_message = "" unselect deactivate end #---------------------------------------------------------------------------- # ● window settings #---------------------------------------------------------------------------- def window_width; Graphics.width * 0.7; end def window_height; Graphics.height - 48; end def item_max; return 1; end #---------------------------------------------------------------------------- # ○ new method: craft #---------------------------------------------------------------------------- def craft=(craft) return if @craft_type == craft @craft_type = craft end #---------------------------------------------------------------------------- # ○ new method: recipe_id #---------------------------------------------------------------------------- def recipe_id=(recipe_id) return if @recipe_id == recipe_id @recipe_id = recipe_id @recipe = $recipe[@recipe_id.to_s.to_i] refresh current_item_enabled? refresh end #---------------------------------------------------------------------------- # ● upgraded method: make_command_list #---------------------------------------------------------------------------- def make_command_list add_command(Craft_Button_Text, :craft, current_item_enabled?) end #---------------------------------------------------------------------------- # ○ new method: draw_item #---------------------------------------------------------------------------- def draw_item(index) w, h = contents.width, line_height set_fontbutton_text) contents.font.color.alpha = 80 unless current_item_enabled? draw_text(0, contents.height - h, w, h, Craft_Button_Text, 1) end #---------------------------------------------------------------------------- # ● upgraded method: refresh #---------------------------------------------------------------------------- def refresh super return unless @recipe_id width, height = contents.width, line_height draw_recipe_header(0, 0, width, height) draw_item_description(0, height, @recipe.crafted_item.description) draw_ingredients(0, height * 4, width, height) end #---------------------------------------------------------------------------- # ○ new method: draw_recipe_header #---------------------------------------------------------------------------- def draw_recipe_header(x, y, w, h) set_fontrecipe_name) draw_icon(@recipe.crafted_item.icon_index, x, y) draw_text(x + 24, y, width, line_height, @recipe.crafted_item.name) text = sprintf("x%2d", $game_party.item_number(@recipe.crafted_item)) draw_text(x+200, y, 50, h, text, 2) set_fontheader_text) draw_text(w-60, y, 60, h, "Lv:") set_fontother_text) draw_text(w-60, y, 60, h, @recipe.req_level.to_s, 2) end #---------------------------------------------------------------------------- # ○ new method: draw_item_description #---------------------------------------------------------------------------- def draw_item_description(x, y, text) set_fontdescription) text = convert_escape_characters(text) pos = {:x => x, :y => y, :new_x => x, :height => calc_line_height(text)} process_character(text.slice!(0, 1), text, pos) until text.empty? end #---------------------------------------------------------------------------- # ○ new method: draw_ingredients #---------------------------------------------------------------------------- def draw_ingredients(x, y, width, height) set_fontheader_text) draw_text(x, y, width * 0.5, height, "Ingredients:") draw_text(x + (width * 0.5), y, width * 0.5, height, "Needed/Owned", 1) set_fontother_text) @ingredients = @recipe.ingredients @ingredient_count = 0 @required = @recipe.ingredient_amount for i in 0...@ingredients.size y += height owned = $game_party.item_number(@ingredients) enabled = (owned < @required ? false : @ingredient_count += 1) draw_item_name(@ingredients, x, y, enabled, width * 0.5 - 20) draw_text(x + (width * 0.5), y, (width * 0.5), height, "#{@required}/#{owned}", 1) end reset_font_settings end #---------------------------------------------------------------------------- # ● upgraded method: draw_item_name #---------------------------------------------------------------------------- def draw_item_name(item, x, y, enabled = true, width = 172) return unless item draw_icon(item.icon_index, x, y) change_color(craft_font_colorother_text), enabled) draw_text(x + 24, y, width, line_height, item.name) end #---------------------------------------------------------------------------- # ○ new method: current_item_enabled? #---------------------------------------------------------------------------- def current_item_enabled? return false unless @recipe_id return false if @recipe.req_level > $craft[@craft_type].level return false if $game_party.item_number(@recipe.crafted_item) == 99 return false if @ingredient_count != @recipe.ingredients.size return true end #---------------------------------------------------------------------------- # ● alias method: item_rect #---------------------------------------------------------------------------- alias venka_crafting_skill_script_ir item_rect def item_rect(index) rect = venka_crafting_skill_script_ir(index) rect.y = contents.height - line_height return rect end #---------------------------------------------------------------------------- # ○ new method: start_crafting #---------------------------------------------------------------------------- def start_crafting @claim_time = @recipe.craft_time @elapsed = 0 @buffer = Crafting_Buffer @started = true end #---------------------------------------------------------------------------- # ● upgraded method: update #---------------------------------------------------------------------------- def update super while @started Graphics.update Input.update activate_craft rewards if Input.trigger?(Input::C) end end #---------------------------------------------------------------------------- # ○ new method: activate_craft #---------------------------------------------------------------------------- def activate_craft width, height = contents.width, line_height rate = [@elapsed.to_f / @max, 1.0].min if @claim_time + @buffer > @elapsed and @elapsed > @claim_time - @buffer @success = true gc1 = get_color(Claim_Gauge_Color1) gc2 = get_color(Claim_Gauge_Color2) else if @claim_time + @buffer < @elapsed @failed = true end @success = false gc1 = get_color(Craft_Gauge_Color1) gc2 = get_color(Craft_Gauge_Color2) end set_fonthelp_text) draw_text(0, contents.height - height * 3, width, height, Directions_Msg, 1) set_fontother_text) draw_gauge(0, contents.height - 60, width, rate, gc1, gc2) @elapsed += 1 end #---------------------------------------------------------------------------- # ○ new method: rewards #---------------------------------------------------------------------------- def rewards @started = false level = $craft[@craft_type].level # Check current level for i in 0...@ingredients.size # Remove ingredients from bags $game_party.lose_item(@ingredients, @required) end # Get exp, items, and pop up message based on success @success ? success_rewards : failed_rewards # If crafting level changed, then do pop up message and play sound if level != $craft[@craft_type].level RPG::SE.new(*Level_Up_Sound).play @result_level = true end refresh # Make pop up window here!!! end #---------------------------------------------------------------------------- # ○ new method: success_rewards #---------------------------------------------------------------------------- def success_rewards RPG::SE.new(*Success_Sound).play @result_exp = @recipe.earned_exp @result_message = Result_Msg @result_item = @recipe.crafted_item @result_amount = @recipe.crafted_amount $game_party.gain_item(@result_item, @result_amount) $craft[@craft_type].gain_exp(@result_exp) end #---------------------------------------------------------------------------- # ○ new method: failed_rewards #---------------------------------------------------------------------------- def failed_rewards # Get the right sound file info sound_file = @failed ? Failure_Sound : Premature_Sound RPG::SE.new(*sound_file).play # Get the right pop up message @result_message = @failed ? Result_Msg : Failed_Msg # Determine if failure exp is allowed failed_exp = (@recipe.earned_exp * Failure_Exp_Rate).to_i @result_exp = Failure_Exp_Rate > 0 ? [failed_exp, 1].max : 0 # Give failure exp $craft[@craft_type].gain_exp(@result_exp) unless @result_exp == 0 # Deterimine if you get a failure item @result_item = @failed ? @recipe.failed_item : nil @result_amount = @result_item ? @recipe.failed_amount : nil # Grant failure item if one exsists $game_party.gain_item(@result_item, @result_amount) if @result_item endend#==============================================================================# ■ Crafting_Results_Window#==============================================================================class Crafting_Results_Window < Window_Message #---------------------------------------------------------------------------- # ♦ Public Instance Variables #---------------------------------------------------------------------------- attr_reader :detail_window #---------------------------------------------------------------------------- # ● upgraded method: initialize #---------------------------------------------------------------------------- def initialize super self.x = (Graphics.width - window_width) * 0.5 self.y = (Graphics.height - window_height) * 0.5 @item = nil @amount = @exp = 0 @message = "" @leveled = false self.back_opacity = 220 self.openness = 0 end #---------------------------------------------------------------------------- # ● window settings #---------------------------------------------------------------------------- def window_width; Graphics.width * 0.8; end def window_height; fitting_height(4); end #---------------------------------------------------------------------------- # ○ new method: detail_window #---------------------------------------------------------------------------- def detail_window=(detail_window) @detail_window = detail_window end #---------------------------------------------------------------------------- # ○ new method: update_info #---------------------------------------------------------------------------- def update_info @item = @detail_window.result_item @amount = @detail_window.result_amount @exp = @detail_window.result_exp @message = @detail_window.result_message @leveled = @detail_window.result_level refresh self.open wait_to_dispose end #---------------------------------------------------------------------------- # ● upgraded method: refresh #---------------------------------------------------------------------------- def refresh contents.clear draw_header set_fontother_text) draw_items_recieved(line_height, contents.width) draw_exp_recieved(line_height*2) if @exp > 0 draw_level_up(line_height*3) if @leveled end #---------------------------------------------------------------------------- # ○ new method: draw_header #---------------------------------------------------------------------------- def draw_header set_fontrecipe_name) draw_text(0, 0, contents.width, line_height, "Results", 1) color = normal_color contents.fill_rect(0, line_height - 2, contents_width, 1, color) color.alpha = 90 contents.fill_rect(0, line_height - 1, contents_width, 1, color) end #---------------------------------------------------------------------------- # ○ new method: draw_items_recieved #---------------------------------------------------------------------------- def draw_items_recieved(y, width) case @message when Venka::Crafting::Result_Msg draw_text(0, y, 120, line_height, @message) draw_text(120, y, 40, line_height, "x#{@amount}") draw_item_name(@item, 160, y, width - 160) when Venka::Crafting::Failed_Msg draw_text(0, y, width, line_height, @message, 1) end end #---------------------------------------------------------------------------- # ● upgraded method: draw_item_name #---------------------------------------------------------------------------- def draw_item_name(item, x, y, width) draw_icon(item.icon_index, x, y) draw_text(x + 24, y, width, line_height, item.name) end #---------------------------------------------------------------------------- # ○ new method: draw_exp_recieved #---------------------------------------------------------------------------- def draw_exp_recieved(y) draw_text(0, y, 120, line_height, "Exp earned: ") draw_text(120, y, contents.width - 120, line_height, @exp.to_s) end #---------------------------------------------------------------------------- # ○ new method: draw_level_up #---------------------------------------------------------------------------- def draw_level_up(y) set_fontbutton_text) draw_text(0, y, contents.width, line_height, Venka::Crafting::Lv_Gain, 1) end #---------------------------------------------------------------------------- # ○ new method: wait_to_dispose #---------------------------------------------------------------------------- def wait_to_dispose loop do Graphics.update Input.update update break if Input.trigger?(Input::C) end self.close endend#==============================================================================# ■ Scene_Crafting#==============================================================================class Scene_Crafting < Scene_ItemBase; include Venka::Crafting #---------------------------------------------------------------------------- # ○ new method: prepare #---------------------------------------------------------------------------- def prepare(craft_type) @craft_type = craft_type end #---------------------------------------------------------------------------- # ● upgraded method: start #---------------------------------------------------------------------------- def start super RPG::SE.new(*Start_Scene).play create_title_window create_list_window create_detail_window create_result_window end #---------------------------------------------------------------------------- # ● upgrade method: create_actor_window #---------------------------------------------------------------------------- def create_actor_window super @actor_window.x = Graphics.width - @actor_window.width @actor_window.z += 100 end #---------------------------------------------------------------------------- # ○ new method: create_title_window #---------------------------------------------------------------------------- def create_title_window @title_window = Crafting_Title_Window.new @title_window.craft = @craft_type end #---------------------------------------------------------------------------- # ○ new method: create_list_window #---------------------------------------------------------------------------- def create_list_window @list_window = Recipe_List_Window.new(0, @title_window.height) @list_window.viewport = @viewport @list_window.craft = @craft_type @list_window.set_handlerok, methodto_detail_window)) @list_window.set_handlercancel, methodreturn_scene)) end #---------------------------------------------------------------------------- # ○ new method: to_detail_window #---------------------------------------------------------------------------- def to_detail_window @detail_window.activate.select(0) end #---------------------------------------------------------------------------- # ○ new method: create_detail_window #---------------------------------------------------------------------------- def create_detail_window @detail_window = Crafting_Details_Window.new @detail_window.viewport = @viewport @detail_window.craft = @craft_type @detail_window.set_handlercraft, methodcraft_start)) @detail_window.set_handlercancel, methodreturn_to_list)) @list_window.detail_window = @detail_window end #---------------------------------------------------------------------------- # ○ new method: craft_start #---------------------------------------------------------------------------- def craft_start Sound.play_ok @detail_window.start_crafting while @detail_window.started Graphics.update Input.update update end @result_window.update_info if item.is_a?(RPG::Item) && item.consumable && ConsumeItem select_actor end to_detail_window end #---------------------------------------------------------------------------- # ○ new method: return_to_list #---------------------------------------------------------------------------- def return_to_list Sound.play_cancel @detail_window.unselect @list_window.activate end #---------------------------------------------------------------------------- # ○ new method: create_result_window #---------------------------------------------------------------------------- def create_result_window @result_window = Crafting_Results_Window.new @result_window.viewport = @viewport @result_window.detail_window = @detail_window end #---------------------------------------------------------------------------- # ● def's for actor window #---------------------------------------------------------------------------- def item; @detail_window.result_item; end def cursor_left?; return true; end def play_se_for_item; Sound.play_use_item; end #---------------------------------------------------------------------------- # ● upgraded method: select_actor #---------------------------------------------------------------------------- def select_actor determine_item @actor_window.show.activate @actor_window.select_for_item(item) while @actor_window.visible Graphics.update Input.update update end end #-------------------------------------------------------------------------- # * Hide Subwindow #-------------------------------------------------------------------------- def hide_sub_window(window) @viewport.rect.x = @viewport.ox = 0 @viewport.rect.width = Graphics.width window.hide.deactivate to_detail_window end #-------------------------------------------------------------------------- # * Confirm Item #-------------------------------------------------------------------------- def determine_item if item.for_friend? show_sub_window(@actor_window) @actor_window.select_for_item(item) else use_item to_detail_window end endend