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.

Exp based skill shop(one actor only)

This is a modified version of the gameguys skill shop. It lets use exp rather than gold for buying, but only for one actor.

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

# Skill Shop

# Author: Game_guy, gerkt(exp based addition), mast3rshake2049(idea)

# Date: June 7th, 2009

# Version: 2.2z

# VERY IMPORTANT ADDITION: Edited to use exp and not gold. Only works with one actor in the 

# party. The actor have to be the actor with the ID=1 of the database.

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

# 

# Intro:

# What this script does is act as a shop but sells skills instead.

# 

# Instructions:

# 1: First how do you want it setup? Theres two ways

#   1: -Any person can learn any skill 

#   or

#   2: -Classes learn different skills then other classes

# 

#   Go down to UseClasses and set it to false for 1: or true for 2:

#

# 2: Ok now that thats over lets move onto price. Go down to CONFIG PRICE and 

#   follow the instructions there.

#   

# 3: Skip this step if you set UseClasses to false. 

#   Go to CONFIG CLASS SKILLS and follow the instructions there.

#   

# 4: Ok so everythings setup now. Time to actually find out how to open the 

#   skillshop right? You use this line

#   $scene = SkillShop.new([skill id's go here])

#   example

#   $scene = SkillShop.new([1, 2]) will make a shop with the skills

#   Heal and Great Heal

#

# 5: Ok the script now is able to make it where only skills are learnable at

#   certain levels. Go to CONFIG LEVEL and follow instructions there.

#

# 6: Ok so now there's a new option that sorts the skills in the following.

#   Alphabetical

#   Reverse Alphabetical

#   Numeric (Sorts it by Id)

#   Reverse Numberic

#   Price

#   Reverse price

#   At default its at numeric but to change it use this,

#   $game_system.ssort = 0,1,2, or 3. 

#   0 = Numeric, 1 = Reverse Numeric, 2 = Alphabetical, 

#   3 = Reverse Alphabetical, 4 = Price, 5 = Reverse Price.

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

module GameGuy

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

  # BEGIN CONFIG

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

  UseClasses = true # if false anyone can learn any skill

                     # if true only classes can learn the defined skills

end

module RPG

  class Skill

    def price

      case id

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

      # CONFIG PRICE

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

      # use 

      # when skill_id then return price

      when 1 then return 50

      when 57 then return 75

      end

      return 10

    end

    def llevel

      case id

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

      # CONFIG LEVEL

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

      # use

      # when skill_id then return level

      when 57 then return 2

      end

      return 1

    end

  end

  class Class

    def learnskills

      case id

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

      # CONFIG CLASS SKILLS

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

      # use

      # when class_id then return [skill id's here]

      when 1 then return [1, 2, 57, 58, 59, 60]

      when 2 then return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 81]

      when 7 then return [69, 70, 71, 72, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80]

      when 8 then return [30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56]

      end

      return []

    end

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

  # END CONFIG

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

  end

end

class Game_System

  attr_accessor :ssort

  alias sort_me_skillz initialize

  def initialize

    @ssort = 0

    sort_me_skillz

  end

end

class Window_SkillCommand < Window_Selectable

  def initialize

    super(0, 64, 480, 64)

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

    @item_max = 2

    @column_max = 2

    @commands = ["Learn", "Exit"]

    refresh

    self.index = 0

  end

  def refresh

    self.contents.clear

    for i in 0...@item_max

      draw_item(i)

    end

  end

  def draw_item(index)

    x = 4 + index * 240

    self.contents.draw_text(x, 0, 128, 32, @commands[index])

  end

end

 

class Window_SkillBuy < Window_Selectable

  def initialize(shop_goods)

    super(0, 128, 368, 352)

    @skill_shop_goods = shop_goods

    self.active = false

    refresh

    self.index = 0

  end

  def skill

    return @data[self.index]

  end

  def refresh

    if self.contents != nil

      self.contents.dispose

      self.contents = nil

    end

    @data = []

    for i in 0...@skill_shop_goods.size

      skill = $data_skills[@skill_shop_goods[i]]

      if skill != nil

        @data.push(skill)

      end

    end

    case $game_system.ssort

    when 0

      [@data].each {|ary| ary.sort! {|a, b| a.id <=> b.id}}

    when 1

      [@data].each {|ary| ary.sort! {|a, b| a.id <=> b.id}}

      [@data].each {|ary| ary.reverse!}

    when 2

      [@data].each {|ary| ary.sort! {|a, b| a.name <=> b.name}}

    when 3

      [@data].each {|ary| ary.sort! {|a, b| a.name <=> b.name}}

      [@data].each {|ary| ary.reverse!}

    when 4

      [@data].each {|ary| ary.sort! {|a, b| a.price <=> b.price}}

    when 5

      [@data].each {|ary| ary.sort! {|a, b| a.price <=> b.price}}

      [@data].each {|ary| ary.reverse!}

    else

      [@data].each {|ary| ary.sort! {|a, b| a.id <=> b.id}}

    end

    @item_max = @data.size

    if @item_max > 0

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

      for i in 0...@item_max

        draw_item(i)

      end

    end

  end

  def draw_item(index)

    skill = @data[index]

    price = skill.price

    enabled = (price <= $game_actors[1].exp)

    if enabled

      self.contents.font.color = normal_color

    else

      self.contents.font.color = disabled_color

    end

    x = 4

    y = index * 32

    rect = Rect.new(x, y, self.width - 32, 32)

    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))

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

    opacity = self.contents.font.color == normal_color ? 255 : 128

    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)

    self.contents.draw_text(x + 28, y, 212, 32, skill.name, 0)

    self.contents.draw_text(x + 240, y, 88, 32, price.to_s, 2)

  end

  def update_help

    @help_window.set_text(skill == nil ? "" : skill.description)

  end

end

 

class Window_SkillStatus2 < Window_Selectable

  def initialize

    super(368, 128, 272, 352)

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

    refresh

    self.z = 200

    self.active = false

    self.index = -1

  end

  def refresh

    self.contents.clear

    @item_max = $game_party.actors.size

    for i in 0...$game_party.actors.size

      x = 64

      y = i * 80

      actor = $game_party.actors[i]

      classs = $data_classes[$game_actors[actor.id].class_id]

      draw_actor_graphic(actor, x - 40, y + 60)

      draw_actor_name(actor, x - 13, y + 10)

      if actor.skill_learn?($thing.id)

        self.contents.font.color = crisis_color

        $text = "Aquired"

      elsif GameGuy::UseClasses

        if classs.learnskills.include?($thing.id) && $thing.llevel <= actor.level

          self.contents.font.color = normal_color

          $text = "Can Learn"

        elsif classs.learnskills.include?($thing.id) && $thing.llevel > actor.level

          self.contents.font.color = disabled_color

          $text = "Can Learn At Level " + $thing.llevel.to_s

        else

          self.contents.font.color = disabled_color

          $text = "Can't Learn"

        end

      else

        if actor.level >= $thing.llevel

          self.contents.font.color = normal_color

          $text = "Can Learn"

        else

          self.contents.font.color = disabled_color

          $text = "Can Learn At Level " + $thing.llevel.to_s

        end

      end

      self.contents.draw_text(x - 13, y + 40, 200, 32, $text)

    end

  end

  def update_cursor_rect

    if @index < 0

      self.cursor_rect.empty

    else

      self.cursor_rect.set(0, @index * 80, self.width - 32, 80)

    end

  end

end

 

class SkillShop

  def initialize(skills)

    @skills = skills

  end

  def main

    @command = Window_SkillCommand.new

    @help_window = Window_Help.new

    @skillbuy = Window_SkillBuy.new(@skills)

    @skillbuy.active = false

    @skillbuy.help_window = @help_window

    $thing = @skillbuy.skill

    @status = Window_SkillStatus2.new

    #@status.visible = false

    @gold = Window_Exp.new

    @gold.x = 480

    @gold.y = 64

    

    Graphics.transition

    loop do

      Graphics.update

      Input.update

      update

      if $scene != self

        break

      end

    end

    Graphics.freeze

    @gold.dispose

    @skillbuy.dispose

    @help_window.dispose

    @command.dispose

    @status.dispose

  end

  def update

    @gold.update

    @status.update

    @gold.refresh

    @command.update

    @skillbuy.update

    @help_window.update

    $thing = @skillbuy.skill

    @status.refresh

    if @command.active

      update_command

      return

    end

    

    if @status.active

      update_status

      return

    end

    

    if @skillbuy.active

      update_buy

      return

    end

  end

  

  def update_buy

    if Input.trigger?(Input::B)

      $game_system.se_play($data_system.cancel_se)

      @skillbuy.active = false

      @skillbuy.index = -1

      @command.active = true

      @command.index = 0

      return

    end

    if Input.trigger?(Input::C)

      $game_system.se_play($data_system.decision_se)

      @skillbuy.active = false

      @status.active = true

      @status.visible = true

      @status.index = 0 if @status.index == -1

    end

  end

  

  def update_command

    if Input.trigger?(Input::B)

      $game_system.se_play($data_system.cancel_se)

      $scene = Scene_Map.new

      return

    end

    if Input.trigger?(Input::C)

      $game_system.se_play($data_system.decision_se)

      case @command.index

      when 0

        @command.active = false

        @command.index = -1

        @skillbuy.active = true

        @skillbuy.index = 0

      when 1

        $game_system.se_play($data_system.cancel_se)

        $scene = Scene_Map.new

      end

      return

    end

  end

  

  def update_status

    if Input.trigger?(Input::B)

      @status.active = false

      @status.index = -1

      @skillbuy.active = true

      return

    end

    if Input.trigger?(Input::C)

      price = @skillbuy.skill.price

      @actort = $game_party.actors[@status.index]

      enabled = (price <= $game_actors[1].exp)

      

      if enabled

        if @actort.skill_learn?(@skillbuy.skill.id)

          $game_system.se_play($data_system.buzzer_se)

          return

        end

        if GameGuy::UseClasses

          if $data_classes[@actort.class_id].learnskills.include?(@skillbuy.skill.id) && @actort.level >= @skillbuy.skill.llevel

            @actort.learn_skill(@skillbuy.skill.id)

            $game_actors[1].exp -= (@skillbuy.skill.price)

            $game_system.se_play($data_system.decision_se)

            @status.refresh

            @skillbuy.refresh

            return

          else

            $game_system.se_play($data_system.buzzer_se)

            return

          end

        else

          if @actort.level >= @skillbuy.skill.llevel

            @actort.learn_skill(@skillbuy.skill.id)

            $game_actors[1].exp -= (@skillbuy.skill.price)

            $game_system.se_play($data_system.decision_se)

            @status.refresh

            @skillbuy.refresh

          else

            $game_system.se_play($data_system.buzzer_se)

            return

          end

          return

        end

        

      else

        $game_system.se_play($data_system.buzzer_se)

        return

      end

    end

  end

 

end

 

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

# ** Window_Exp

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

#  This window displays amount of gold.

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

 

class Window_Exp < Window_Base

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

  # * Object Initialization

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

  def initialize

    super(0, 0, 160, 64)

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

    refresh

  end

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

  # * Refresh

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

  def refresh

    self.contents.clear

    cx = contents.text_size('Exp').width

    self.contents.font.color = normal_color

    self.contents.draw_text(4, 0, 120-cx-2, 32, $game_actors[1].exp.to_s, 2)

    self.contents.font.color = system_color

    self.contents.draw_text(124-cx, 0, cx, 32, 'Exp', 2)

    

  end

end
 
Pretty nifty script. I didn't try it out, but maybe you should add a bit more documentation in the topic, like where to exactly put it, and how to use it.
 

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