RMRK is retiring.
Server is paid up for the rest of 2026, but the forum may go after that. See here for more information. Please archive or save anything you would like to keep before 2027.
Main Menu
  • Welcome to The RPG Maker Resource Kit.

Exp based skill shop(one actor only)

Started by gerkrt, July 14, 2011, 06:00:43 PM

0 Members and 1 Guest are viewing this topic.

gerkrt

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

#===============================================================================
# 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