Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

PrexCraft - Crafting Script

I remember this script..:D, might just be me..but it feels you can do a lot more with it on VX just because you can utilize the "comment" thing in the database as part of scripting..maybe for more ease of use? (Though it's already fairly easy to setup and use XP wise.)

As for rick..since it seems s/he was banned, no clue if they can even read this but:

I don't think there's a VX Crafting script just yet..unless Prexus does plan on making the XP version compatible.
 
Good idea, actually, Razaroic.

I think I will recode this for VX.

But in response to what you said to rick, I did tell him that I have already recoded it for RMVX, but it uses a mouse-controlled engine that is unique to a project I was coding for so I can't release that version of the script or the mouse engine.
 
I'd definitely want an RMVX version of this! I've tried several Crafting scripts, but none of them is as easy to use as this one... Keep it up!
 

raiyun

Member

Hey Prexus, AWESOME script, however i have an issue and I am not sure if its a bug or not.

The recipe to craft an item that either was already crafted, or is in a recipe to be crafted won't show up in the crafting screen.

Heres an example.

I have an armor called Arcen Bracer that can be crafted into a Flame Bracer.
Then I want to beable to craft the Flame Bracer into a Composite Bracer.
Then the Composite Bracer into a Flame Gauntlet.

So
Arcen Bracer > Flame Bracer > Composite Bracer > Flame Gauntlet.

The recipe to create the flame bracer shows up in the menu, but recipe for the Composite Bracer, and the Flame Gauntlet will not show in the system.

All of the recipes are there, and correct, and I added all three of the recipes. ('Flame Bracer'), ('Composite Bracer'), and ('Flame Gauntlet')

But only the Flame Bracer recipe will show. Am I doing something wrong, or does this script not allow items already crafted or on another recipe to be crafted?

I am currently looking for ways around this.
 

raiyun

Member

Ok I have to revise this.

I found out that the Length of the items name effects if it shows or not. If the name of the item is too long, then it won't show in the recipe list when you bring up the craft menu.

SO..... how can I fix this, I sort of don't want to rename the items.......
 
What is likely happening is in your event to add the recipe, the name of the recipe i.e. ('Flame Bracer') is being split onto two lines. If you replace 'Flame Bracer' with x and add the line x = 'Flame Bracer' before hand, it should fix your problem.
 

raiyun

Member

Yeah I just figured that part out, I was fiddling with it, and i realised that it was cause of the two line thing. But I hadn't figured out what to do about it yet.

So you mean to place the X = Flame Bracer in the call script before the recipe?

Or somewhere else....
 

raiyun

Member

Alright COOL BEANS.

You know I don't even know why I asked... I tried it while waiting for your confirmation and it worked so. Thanks alot, This script is really something.

I don't know much about scripting... yet... but I am learning small things and sort of figuring out how it works by messing with and changing other scripts....

So thanks alot for this. I am glad that it worked well with the other scripts I have.

((Using SephirothSpawn's Equipment Skills v2, Limit break, rtab, and like 20 other scripts.... lol))

So thanks alot... hehe....
 
Nice script Prex, but could you explain a few of the systems to me?

+Is there a failure rate?
+If so, is there a way to disable it?
+What is the difference of having higher levels in certain trades? what does it change?
+Are the Trade Levels stored under a common variable?

thanks for your time
 
To save you all hassle, I'm currently making this for VX. Really it's not that hard, anyone could do it. Just involves rewording everything.

I was literally just about to PM Prexus asking whether I could post it when I was finished, I didn't realise so many people wanted it.

So I may aswell ask here.
When I'm done can I post it, Prexus?





I'm also redoing all of Retaime's Visual Scripts, but don't know whether I'll be allowed to post them...
 
Not if you are copying my code and posting it. I'd much rather do it myself. In addition to the code in this one being suboptimal, RMVX can do some nifty things that I want to make use of when I made the RMVX version of this.
 
Alright, well I was making sure to ask you first. I finished it and I was going to customise a few things, but wasn't sure if I should. But seeing as I can't post it, I may aswell ^_^
 
necropost i know...

but i was looking for the demo of this amazing looking script and wondered if any of you had working links i PMed Prexus but thought it would not hurt to ask you all too just in case.
 
heres the script, its fairly easy to understand, so you shouldnt really need a demo

Code:
#===============================================================================

# Module Craft by Prexus

#  - Version 2.0 (12.31.06)

#-------------------------------------------------------------------------------

# This is the primary module of the PrexCraft script. Be sure to read the

# instructions to learn how to create new recipes. Do not change any of the

# constants in the DO NOT TOUCH section.

#===============================================================================

 

module Craft

  #=============================================================================

  # CONSTANTS :: DO NOT TOUCH

  #=============================================================================

  ITEM = 0; ARMOR = 1; WEAPON = 2

  NOT_CONSUMED = false; CONSUMED = true;

 

  #=============================================================================

  # CONSTANTS :: PLEASE TOUCH THESE.. BABY!

  #=============================================================================

  USE_LEVELS           = true  # Use Levels for skills.

  SHOW_COLORS          = true  # Use colorcoding (only for Levels)

  SHOW_LEVELS          = true  # Show recipe level display

  SHOW_LEVEL_UP        = true  # Show level up window

  SHOW_LIST_ICONS      = true  # Show icons in recipe list

  SHOW_RESULT_ICON     = true  # Show icons in result window

  SHOW_COMPONENT_ICONS = true  # Show icons in component window

 

  #=============================================================================

  # TRADE :: OFFSET LEVEL RANGE (edit with caution) (For use with levels only)

  #=============================================================================

  TRADE_LEVEL_OFFSET = 10

 

  #=============================================================================

  # COLORS :: EDIT WITH CAUTION (For use with Levels only)

  #=============================================================================

  TRIVIAL    = Color.new( 64,  64,  64, 255)

  LOW        = Color.new(  0, 255,   0, 255)

  MID        = Color.new(255, 255,   0, 255)

  HIGH       = Color.new(255, 128,   0, 255)

  IMPOSSIBLE = Color.new(255,   0,   0, 255)

 

  #=============================================================================

  # RECIPES :: Follow Instructions

  #-----------------------------------------------------------------------------

  # FORMAT :

  # {'NAME' => 'RECIPE NAME AS STRING',

  #  'TYPE' => 'RECIPE TYPE AS STRING',

  #  'LEVEL' => LEVEL_AS_INTEGER,  << Not Necessary with USE_LEVELS set to False

  #  'RESULT' => [TYPE, ID, VALUE],

  #  'COMPONENTS' => [

  #    [TYPE, ID, VALUE, CONSUMED?],

  #    [TYPE, ID, VALUE, CONSUMED?],

  #    ...

  #  ]

  # }

  #-----------------------------------------------------------------------------

  # To setup a recipe, follow the example below:

  #-----------------------------------------------------------------------------

  # {'NAME' => 'Cold Iron Sword',

  #  'TYPE' => 'Blacksmith',

  #  'LEVEL' => 10,

  #  'RESULT' => [WEAPON, 1, 1],

  #  'COMPONENTS' => [

  #    [ITEM, 1, 1, CONSUMED],

  #    [ITEM, 2, 1, CONSUMED],

  #    [WEAPON, 3, 1, NOT_CONSUMED]

  #  ]

  # } # End Recipe [WEAPON, 1, 1]

  #=============================================================================

  RECIPES = [

    {'NAME' => 'Cold Sword',

     'TYPE' => 'Blacksmith',

     'LEVEL' => 1,

     'RESULT' => [WEAPON, 33, 1],

     'COMPONENTS' => [

       [ITEM, 33, 1, CONSUMED],

       [WEAPON, 1, 1, CONSUMED]

     ]

    },

    {'NAME' => 'Tempered Sword',

     'TYPE' => 'Blacksmith',

     'LEVEL' => 20,

     'RESULT' => [WEAPON, 34, 1],

     'COMPONENTS' => [

       [ITEM, 38, 1, NOT_CONSUMED],

       [WEAPON, 1, 1, CONSUMED]

     ]

    },

    {'NAME' => 'Apple Pie',

     'TYPE' => 'Cook',

     'LEVEL' => 1,

     'RESULT' => [ITEM, 36, 1],

     'COMPONENTS' => [

       [ITEM, 34, 1, NOT_CONSUMED],

       [ITEM, 35, 3, CONSUMED]

     ]

    }

  ]

 

  #=============================================================================

  # Craft Methods

  #-----------------------------------------------------------------------------

  # valid_recipe? : name

  # Checks if the recipe name given exists in the recipe data store.

  #=============================================================================

  def self.valid_recipe?(name)

    for recipe in RECIPES

      return true if name == recipe['NAME']

    end

    return false

  end

 

  #=============================================================================

  # Craft Methods

  #-----------------------------------------------------------------------------

  # can_make? : name

  # Checks if the recipe is possible to make. First finds if the recipe given is

  # valid, then checks if there are enough components in your inventory.

  #=============================================================================

  def self.can_make?(name)

    return false unless self.valid_recipe?(name)

    for r in RECIPES

      next unless name == r['NAME']

      recipe = r

    end

    return false unless recipe

    for component in recipe['COMPONENTS']

      case component[0]

      when 0 # ITEM

        return false unless $game_party.item_number(component[1]) >= component[2]

      when 1 # ARMOR

        return false unless $game_party.armor_number(component[1]) >= component[2]

      when 2 # WEAPON

        return false unless $game_party.weapon_number(component[1]) >= component[2]

      end

    end

    return true

  end

 

  #=============================================================================

  # Craft Methods

  #-----------------------------------------------------------------------------

  # get_recipe : name

  # Returns the hash object containing the data information for the recipe if

  # the recipe is valid. Else returns nil.

  #=============================================================================

  def self.get_recipe(name)

    return nil unless self.valid_recipe?(name)

    for recipe in RECIPES

      return recipe if recipe['NAME'] == name

    end

    return nil

  end

 

  #=============================================================================

  # Craft Methods for LEVELS

  #-----------------------------------------------------------------------------

  # color_chart : diff

  # Returns the color suited for the recipe based on the difference between the

  # recipe level and your party's skill level

  #=============================================================================

  def self.color_chart(diff)

    if diff < 0

      return IMPOSSIBLE

    elsif (0...TRADE_LEVEL_OFFSET).to_a.include?(diff)

      return HIGH

    elsif (TRADE_LEVEL_OFFSET...TRADE_LEVEL_OFFSET * 2).to_a.include?(diff)

      return MID

    elsif (TRADE_LEVEL_OFFSET * 2...TRADE_LEVEL_OFFSET * 3).to_a.include?(diff)

      return LOW

    else

      return TRIVIAL

    end

  end

 

  #=============================================================================

  # Craft Methods for LEVELS

  #-----------------------------------------------------------------------------

  # level_skill : skill, diff

  # Raises the level of the skill based on the difference between the recipe

  # level and the party's skill level.

  #=============================================================================

  def self.level_skill(skill, diff)

    if (0...TRADE_LEVEL_OFFSET).to_a.include?(diff)

      if rand(10) >= 1

        $game_party.trade_level_up(skill, 1)

        return true

      else

        return false

      end

    elsif (TRADE_LEVEL_OFFSET...TRADE_LEVEL_OFFSET * 2).to_a.include?(diff)

      if rand(10) >= 3

        $game_party.trade_level_up(skill, 1)

        return true

      else

        return false

      end

    elsif (TRADE_LEVEL_OFFSET * 2...TRADE_LEVEL_OFFSET * 3).to_a.include?(diff)

      if rand(10) >= 6

        $game_party.trade_level_up(skill, 1)

        return true

      else

        return false

      end

    else

      return false

    end

  end

end

 

#===============================================================================

# Scene Craft

#-------------------------------------------------------------------------------

# This is the main interface for the crafting system. You can run it by using

# the callscript command '$scene = Scene_Craft.new' or by adding it to your own

# code in the same manner.

#===============================================================================

 

class Scene_Craft

  def initialize(type = nil)

    @type = type

  end

  def main

    @recipe_list = Window_RecipeList.new(@type)

    @result_info = Window_ResultInfo.new(@recipe_list.data)

    @result_comp = Window_ResultComponents.new(@recipe_list.data)

    Graphics.transition

    loop do

      Graphics.update

      Input.update

      update

      break if $scene != self

    end

    Graphics.freeze

    @recipe_list.dispose

    @result_info.dispose

    @result_comp.dispose

    @level_window.dispose if @level_window

  end

  #-----------------------------------------------------------------------------

  def update

    @recipe_list.update

    @result_info.update(@recipe_list.data)

    @result_comp.update(@recipe_list.data)

    if @level_window

      @level_window.update

      @level_window.opacity -= 2

      @level_window.contents_opacity -= 2

      if @level_window.opacity == 0

        @level_window.dispose

        @level_window = nil

      end

    end

    if Input.trigger?(Input::B)

      $game_system.se_play($data_system.cancel_se)

      $scene = Scene_Map.new

      return

    end

    if Input.trigger?(Input::C)

      if craft(@recipe_list.data)

        $game_system.se_play($data_system.decision_se)

      else

        $game_system.se_play($data_system.buzzer_se)

      end

      @recipe_list.refresh

      @result_info.refresh

      @result_comp.refresh

      return

    end

  end

  #-----------------------------------------------------------------------------

  def craft(recipe)

    return false unless Craft.can_make?(recipe)

    recipe = Craft.get_recipe(@recipe_list.data)

    if Craft::USE_LEVELS

      skill = (recipe['TYPE'] ? recipe['TYPE'] : nil)

      level = (recipe['LEVEL'] ? recipe['LEVEL'] : 1)

      if skill

        return unless $game_party.trade_check?(skill, level)

        diff = ($game_party.trade_skills[skill] - level).abs

        old_level = $game_party.trade_skills[skill]

        if Craft.level_skill(skill, diff)

          if Craft::SHOW_LEVEL_UP

            if @level_window

              @level_window.dispose

              @level_window = nil

            end

            @level_window = Window_Base.new(0, 0, 256, 64)

            @level_window.contents = Bitmap.new(224, 32)

            @level_window.x = 320 - @level_window.width / 2

            @level_window.y = 240 - @level_window.height / 2

            @level_window.z = 9998

            @level_window.contents.draw_text(4, 0, 224, 32,

              "#{skill} +#{($game_party.trade_skills[skill] - old_level).abs}", 1)

          end

        end

      end

    end

    for component in recipe['COMPONENTS']

      case component[0]

      when 0 # Item

        $game_party.lose_item(component[1], component[2]) if component[3]

      when 1 # Armor

        $game_party.lose_armor(component[1], component[2]) if component[3]

      when 2 # Weapon

        $game_party.lose_weapon(component[1], component[2]) if component[3]

      end

    end

    case recipe['RESULT'][0]

    when 0 # Item

      $game_party.gain_item(recipe['RESULT'][1], recipe['RESULT'][2])

    when 1 # Armor

      $game_party.gain_armor(recipe['RESULT'][1], recipe['RESULT'][2])

    when 2 # Weapon

      $game_party.gain_weapon(recipe['RESULT'][1], recipe['RESULT'][2])

    end

    return true

  end

end

 

#===============================================================================

# Window RecipeList

#-------------------------------------------------------------------------------

# This is a standard command window which shows all the recipes known by the

# party. They will appear in White if you have the proper reagents to combine

# or grey otherwise.

#===============================================================================

 

class Window_RecipeList < Window_Selectable

  def initialize(type)

    super(0, 0, 224, 480)

    self.contents = Bitmap.new(width - 32, height - 32)

    @data = []

    @type = type

    refresh

  end

  #-----------------------------------------------------------------------------

  def data

    return @data[self.index]

  end

  #-----------------------------------------------------------------------------

  def refresh

    self.contents.clear

    @data = []

    for recipe in $game_party.recipes

      if @type

        next unless Craft.get_recipe(recipe)['TYPE'] == @type

      end

      @data.push(recipe) if Craft.valid_recipe?(recipe)

    end

    @item_max = @data.size

    self.index = [[self.index, 0].max, @item_max].min

    for i in [email=0..@data.size]0..@data.size[/email]

      data = @data[i]

      next unless data

      x = (Craft::SHOW_LIST_ICONS ? 32 : 4)

      recipe = Craft.get_recipe(data)

      if Craft::SHOW_LIST_ICONS

        case recipe['RESULT'][0]

        when 0 # ITEM

          bitmap = RPG::Cache.icon($data_items[recipe['RESULT'][1]].icon_name)

          self.contents.blt(4, i * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))

        when 1 # ARMOR

          bitmap = RPG::Cache.icon($data_armors[recipe['RESULT'][1]].icon_name)

          self.contents.blt(4, i * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))

        when 2 # WEAPON

          bitmap = RPG::Cache.icon($data_weapons[recipe['RESULT'][1]].icon_name)

          self.contents.blt(4, i * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))

        end

      end

      if Craft::USE_LEVELS

        level = (recipe['LEVEL'] ? recipe['LEVEL'] : 1)

        diff = $game_party.trade_skills[recipe['TYPE']] - level

        if Craft::SHOW_COLORS

          self.contents.font.color = Craft.color_chart(diff)

        else

          self.contents.font.color = (Craft.can_make?(data) ? normal_color : disabled_color)

        end

        if Craft::SHOW_LEVELS

          self.contents.draw_text(x, i * 32, self.contents.width - x, 32,

            "(#{recipe['LEVEL']}) #{data}")

        else

          self.contents.draw_text(x, i * 32, self.contents.width - x, 32, data.to_s)

        end

      else

        self.contents.font.color = (Craft.can_make?(data) ? normal_color : disabled_color)

        self.contents.draw_text(x, i * 32, self.contents.width - x, 32, data.to_s)

      end

    end

  end

end

 

#===============================================================================

# Window ResultInfo

#-------------------------------------------------------------------------------

# This window displays all the information regarding the resulting item.

#===============================================================================

 

class Window_ResultInfo < Window_Base

  def initialize(recipe)

    super(224, 0, 640-224, 272)

    self.contents = Bitmap.new(width - 32, height - 32)

    @recipe = recipe

    refresh

  end

  #-----------------------------------------------------------------------------

  def refresh

    self.contents.clear

    recipe = Craft.get_recipe(@recipe)

    return unless recipe

    case recipe['RESULT'][0]

    when 0 # ITEM

      item = $data_items[recipe['RESULT'][1]]

      return unless item

      if Craft::SHOW_RESULT_ICON

        bitmap = RPG::Cache.icon(item.icon_name)

        self.contents.blt(4, 4, bitmap, Rect.new(0, 0, 24, 24))

        self.contents.draw_text(32,  0, self.contents.width - 36, 32, item.name.to_s)

      else

        self.contents.draw_text(4,  0, self.contents.width - 8, 32, item.name.to_s)

      end

      self.contents.draw_text(4,  0, self.contents.width - 8, 32, "#{item.price} #{$data_system.words.gold}", 2)

      if item.recover_hp_rate != 0

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "HP: #{item.recover_hp_rate}%")

      elsif item.recover_hp != 0

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "HP: #{item.recover_hp}")

      end

      if item.recover_sp_rate != 0

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "SP: #{item.recover_sp_rate}%", 1)

      elsif item.recover_sp != 0

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "SP: #{item.recover_sp}", 1)

      end

      self.contents.draw_text(4, 80, self.contents.width - 8, 32, "Hit%: #{item.hit}")

      self.contents.draw_text(4, 80, self.contents.width - 8, 32, "Variance: #{item.variance}", 2)

      case item.parameter_type

      when 1

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "Max HP: +#{item.parameter_points}", 2)

      when 2

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "Max SP: +#{item.parameter_points}", 2)

      when 3

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "STR: +#{item.parameter_points}", 2)

      when 4

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "DEX: +#{item.parameter_points}", 2)

      when 5

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "AGI: +#{item.parameter_points}", 2)

      when 6

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, "INT: +#{item.parameter_points}", 2)

      end

      state_text = 'State + '

      for state in item.plus_state_set

        state_text += ', ' unless state == item.plus_state_set.first

        state_text += $data_states[state].name

      end

      self.contents.draw_text(4, 112, self.contents.width - 8, 32, "#{state_text}")

      state_text = 'State - '

      for state in item.minus_state_set

        state_text += ', ' unless state == item.minus_state_set.first

        state_text += $data_states[state].name

      end

      self.contents.draw_text(4, 144, self.contents.width - 8, 32, "#{state_text}")

    when 1 # ARMOR

      item = $data_armors[recipe['RESULT'][1]]

      return unless item

      if Craft::SHOW_RESULT_ICON

        bitmap = RPG::Cache.icon(item.icon_name)

        self.contents.blt(4, 4, bitmap, Rect.new(0, 0, 24, 24))

        self.contents.draw_text(32,  0, self.contents.width - 36, 32, item.name.to_s)

      else

        self.contents.draw_text(4,  0, self.contents.width - 8, 32, item.name.to_s)

      end

      self.contents.draw_text(4, 0, self.contents.width - 8, 32, "#{item.price} #{$data_system.words.gold}", 2)

      case item.kind

      when 0 # Shield

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, 'Shield')

      when 1 # Helmet

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, 'Helmet')

      when 2 # Body Armor

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, 'Body Armor')

      when 3 # Accessory

        self.contents.draw_text(4, 48, self.contents.width - 8, 32, 'Accessory')

      end

      self.contents.draw_text(4, 48, self.contents.width - 8, 32, "EVA: #{item.eva}", 2)

      self.contents.draw_text(4, 80, self.contents.width - 8, 32, "PDEF: #{item.pdef}")

      self.contents.draw_text(4, 80, self.contents.width - 8, 32, "STR: #{item.str_plus}", 1)

      self.contents.draw_text(4, 80, self.contents.width - 8, 32, "DEX: #{item.dex_plus}", 2)

      self.contents.draw_text(4, 112, self.contents.width - 8, 32, "MDEF: #{item.mdef}")

      self.contents.draw_text(4, 112, self.contents.width - 8, 32, "AGI: #{item.agi_plus}", 1)

      self.contents.draw_text(4, 112, self.contents.width - 8, 32, "INT: #{item.int_plus}", 2)

      state_text = 'State Guard: '

      for state in item.guard_state_set

        state_text += ', ' unless state == item.guard_state_set.first

        state_text += $data_states[state].name

      end

      self.contents.draw_text(4, 144, self.contents.width - 8, 32, "#{state_text}")

      state_text = 'Element Guard: '

      for state in item.guard_element_set

        state_text += ', ' unless state == item.guard_element_set.first

        state_text += $data_system.elements[state]

      end

      self.contents.draw_text(4, 176, self.contents.width - 8, 32, "#{state_text}")

      if item.auto_state_id != 0

        self.contents.draw_text(4, 208, self.contents.width - 8, 32, "Auto State: #{$data_states[item.auto_state_id].name}")

      end

    when 2 # WEAPON

      item = $data_weapons[recipe['RESULT'][1]]

      return unless item

      if Craft::SHOW_RESULT_ICON

        bitmap = RPG::Cache.icon(item.icon_name)

        self.contents.blt(4, 4, bitmap, Rect.new(0, 0, 24, 24))

        self.contents.draw_text(32,  0, self.contents.width - 36, 32, item.name.to_s)

      else

        self.contents.draw_text(4,  0, self.contents.width - 8, 32, item.name.to_s)

      end

      self.contents.draw_text(4, 0, self.contents.width - 8, 32, "#{item.price} #{$data_system.words.gold}", 2)

      self.contents.draw_text(4, 48, self.contents.width - 8, 32, "ATK: #{item.atk}")

      self.contents.draw_text(4, 48, self.contents.width - 8, 32, "PDEF: #{item.pdef}", 1)

      self.contents.draw_text(4, 48, self.contents.width - 8, 32, "MDEF: #{item.mdef}", 2)

      self.contents.draw_text(4, 80, self.contents.width - 8, 32, "STR: #{item.str_plus}")

      self.contents.draw_text(4, 80, self.contents.width - 8, 32, "DEX: #{item.dex_plus}", 2)

      self.contents.draw_text(4, 112, self.contents.width - 8, 32, "AGI: #{item.agi_plus}")

      self.contents.draw_text(4, 112, self.contents.width - 8, 32, "INT: #{item.int_plus}", 2)

      state_text = 'State + '

      for state in item.plus_state_set

        state_text += ', ' unless state == item.plus_state_set.first

        state_text += $data_states[state].name

      end

      self.contents.draw_text(4, 144, self.contents.width - 8, 32, "#{state_text}")

      state_text = 'State - '

      for state in item.minus_state_set

        state_text += ', ' unless state == item.minus_state_set.first

        state_text += $data_states[state].name

      end

      self.contents.draw_text(4, 176, self.contents.width - 8, 32, "#{state_text}")

      state_text = 'Element: '

      for state in item.element_set

        state_text += ', ' unless state == item.element_set.first

        state_text += $data_system.elements[state]

      end

      self.contents.draw_text(4, 208, self.contents.width - 8, 32, "#{state_text}")

    end

  end

  #-----------------------------------------------------------------------------

  def update(recipe)

    super()

    return unless recipe != @recipe

    @recipe = recipe

    refresh

  end

end

 

#===============================================================================

# Window ResultComponents

#-------------------------------------------------------------------------------

# This window displays all the components required for the combination, as well

# as the amount you have and the amount required of each. If an item has a *

# after the name, it will not be consumed in the combination.

#===============================================================================

 

class Window_ResultComponents < Window_Base

  def initialize(recipe)

    super(224, 272, 640-224, 208)

    self.contents = Bitmap.new(width - 32, height - 32)

    @recipe = recipe

    refresh

  end

  #-----------------------------------------------------------------------------

  def refresh

    self.contents.clear

    recipe = Craft.get_recipe(@recipe)

    return unless recipe

    i = 0

    for component in recipe['COMPONENTS']

      case component[0]

      when 0 # ITEM

        item = $data_items[component[1]]

        number = $game_party.item_number(component[1])

      when 1 # ARMOR

        item = $data_armors[component[1]]

        number = $game_party.armor_number(component[1])

      when 2 # WEAPON

        item = $data_weapons[component[1]]

        number = $game_party.weapon_number(component[1])

      end

      next unless item

      text = "#{item.name}"

      text += ' (*)' unless component[3]

      x = (Craft::SHOW_COMPONENT_ICONS ? 32 : 4)

      if Craft::SHOW_COMPONENT_ICONS

        bitmap = RPG::Cache.icon(item.icon_name)

        self.contents.blt(4, i * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))

      end

      self.contents.draw_text(x, i * 32, self.contents.width - x - 4, 32, "#{text}")

      self.contents.draw_text(x, i * 32, self.contents.width - x - 4, 32, "#{number}/#{component[2]}", 2)

      i += 1

    end

  end

  #-----------------------------------------------------------------------------

  def update(recipe)

    super()

    return unless recipe != @recipe

    @recipe = recipe

    refresh

  end

end

 

#===============================================================================

# Game_Party

#-------------------------------------------------------------------------------

# This is a small edit of the original Game_Party class to add recognition for

# recipes. It also adds the methods below:

#   add_recipe() : name

#     - this will teach the party the recipe, if it's valid. name is the name

#       of the recipe.

#   remove_recipe() : name

#     - this will force the party to forget the recipe, if it's known. name is

#       the name of the recipe.

#   have_recipe() : name

#     - this will return true or false, depending on if the party knows the

#       recipe. Primary used in the can_make? method of the Craft module.

# -- FOR LEVELS --

#   learn_trade() : name

#     - this will set the level of the 'trade skill' to 1, enabling it for use

#       with recipes.

#   forget_trade() : name

#     - this will reset the level of the 'trade skill' to 0.

#   trade_check() : name, level

#     - this will return true or false, depending on if the arguement 'level' is

#       less than or equal to the 'trade skill'.

#   trade_level_up() : name, value = 1

#     - this will add the value to the existing trade level. Used primary by

#       the Craft module.

#===============================================================================

 

class Game_Party

  attr_reader :recipes

  attr_reader :trade_skills

  #-----------------------------------------------------------------------------

  alias prexcraft_g_party_initialize initialize

  #-----------------------------------------------------------------------------

  def initialize

    prexcraft_g_party_initialize

    @recipes = []

    @trade_skills = Hash.new(0)

  end

  #-----------------------------------------------------------------------------

  def add_recipe(name)

    @recipes.push(name) if Craft.valid_recipe?(name) and !have_recipe(name)

  end

  #-----------------------------------------------------------------------------

  def remove_recipe(name)

    @recipes.delete(name)

  end

  #-----------------------------------------------------------------------------

  def have_recipe(name)

    return @recipes.include?(name)

  end

  #-----------------------------------------------------------------------------

  def learn_trade(name)

    @trade_skills[name] = 1

  end

  #-----------------------------------------------------------------------------

  def forget_trade(name)

    @trade_skills[name] = 0

  end

  #-----------------------------------------------------------------------------

  def trade_check?(name, level)

    return (@trade_skills[name] >= level)

  end

  #-----------------------------------------------------------------------------

  def trade_level_up(name, value = 1)

    @trade_skills[name] += value

  end

end
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top