Save-Point
KActorSkill XP - Printable Version

+- Save-Point (https://www.save-point.org)
+-- Forum: Material Development (https://www.save-point.org/forum-8.html)
+--- Forum: Scripts Database (https://www.save-point.org/forum-39.html)
+---- Forum: RPGMaker XP (RGSS) Engine (https://www.save-point.org/forum-116.html)
+---- Thread: KActorSkill XP (/thread-8065.html)



KActorSkill XP - kyonides - 06-03-2020

KActorSkill XP

by Kyonides Arkanthes


Introduction

Are you tired of just including skills your heroes can learn only if they picked a certain class or job?
Are you feeling an urge to add actor specific skills?
Now you can do it! Shocked 

It is a two step process! Happy with a sweat
You first add some sort of skill recipe that only includes ID and some default conditions like level or number of items or amount of gold and you are done! Shocked
Rinse and repeat for every single actor that you think that should benefit from this! Grinning

You can either preset the skill learning (alias simple recipe) or add it via script call in game. Thinking Interesting, don't you think?

Side Notes
It does NOT include any menu so far... Laughing
This is just a theory but it might work in VX or VX Ace as well. Confused

Script

Code:
# * KActorSkill XP
#   Scripter : Kyonides Arkanthes
#   2020-06-03

# This scriptlet has a specific goal, to let your heroes learn skills that are
# not linked to their current job or class. You could call them...
# Actor Specific Learnable Skills - It is a two step process!

# Step 1: Get a "recipe" for a specific skill
# Step 2: Finally learn the skill if you met the requirements

# KActorSkill.add_learn script call shows you all of the available options.

# Currently there are two ways to add such skill learning.
# Method 1: You setup the SKILLS constant found in the KActorSkill module.
# Method 2: You use the KActorSkill.add_learn script call in game.

# * Script Call *

# KActorSkill.add_learn(ActorID, SkillID, Options)
#  Allows an Actor to add a skill learning to his list of learnable skills
#  Options can be one of these combos:
#  :level => SomeLevel
#  :gold => SomeAmount
#  :item => ItemID, :total => SomeNumber

module KActorSkill
  SKILLS = {} # Do Not Touch This Line!
  # Examples - You can add more than one Skill ID for any actor!
  # SKILLS[ActorID] = { SkillID => { condition }, etc. }
  # SKILLS[1] = { 1 => { :level => 3 } }
  # SKILLS[2] = { 2 => { :gold => 300 } }
  # SKILLS[3] = { 3 => { :item => 3, :total => 5 } }
  SKILLS[1] = { 1 => { :level => 1 } }
  class Setup
    @@default_values = { :level => 1, :gold => 10 , :item => 1, :total => 0 }
    def initialize(settings=@@default_values)
      @level = settings.delete(:level) || 0
      @gold = settings.delete(:gold) || 0
      @item = settings.delete(:item) || 0
      @total = settings.delete(:total) || 0
    end
    attr_reader :level, :gold, :item, :total
  end
  def self.add_learn(actor_id, skill_id, setup={})
    actor = $game_actors[actor_id]
    return if actor.learned_skill?(skill_id)
    actor.set_learning(skill_id, setup)
  end
end

class Game_Actor
  alias :kyon_kskillsetup_gm_actor_setup :setup
  alias :kyon_kskillsetup_gm_actor_exp= :exp=
  def check_learn_skill(sid)
    learn = @learnings[skill_id]
    return unless learn
    if learn.item > 0 and item_number(learn.item) >= learn.total
      learn_extra_skill(sid)
      $game_party.lose_item(learn.item, learn.total)
    elsif learn.gold > 0 and @gold > learn.gold + 1
      learn_extra_skill(sid)
      $game_party.lose_gold(learn.gold)
    end
  end

  def exp=(new_exp)
    kyon_kskillsetup_gm_actor_exp=(new_exp)
    learn = @learnings.dup
    learn.each{|lid, ln| learn_extra_skill(lid) if ln.level <= @level }
  end

  def setup(actor_id)
    kyon_kskillsetup_gm_actor_setup(actor_id)
    @learnings = {}
    KActorSkill::SKILLS[@actor_id].each do |sid, set|
      next if set[:level] == 0
      set[:level] <= @level ? learn_extra_skill(sid) : set_learning(sid, set)
    end
  end

  def learn_extra_skill(sid)
    @skills << sid
    @skills = @skills.uniq
    @learnings.delete(sid)
  end
  def learned_skill?(sid) @learnings[skill_id] or @skills.include?(skill_id) end
  def set_learning(sid, set) @learnings[sid] = KActorSkill::Setup.new(set) end
  attr_reader :learnings
end

class Game_Party
  def learn_actor_skill(actor_id, skill_id)
    @actors[actor_id].check_learn_skill(skill_id)
  end
end

Terms & Conditions

For now it might be free for use in non commercial games.
Give me a free copy of your completed game if you include at least 2 of my scripts! Laughing + Tongue sticking out


RE: KActorSkill XP - kyonides - 06-04-2020

KActorSkill XP Menu Script

I can't say it's ready for deployment but you can get a picture of how it would look like when finished.
You may report issues or make minor feature requests.

Code:
# * KActorSkill XP Menu
#   Scripter : Kyonides Arkanthes
#   2020-06-04

# $scene = KActorSkillMenu.new(ActorIndex)
# ActorIndex's default value: 0 (Aluxes)
# (ActorIndex) can be omitted if you start with the team leader.

module KActorSkill
 PLACE_GOLD_SYMBOL = :first
 ACTOR_NAME_AS_TITLE = true
 PENDING_SKILLS_LABEL = "%s's Pending Skills"
 SKILL_NAME_LABEL = "Learn %s"
 NO_LEARNING = "No skill found!"
end

class KActorSkillWindow < Window_Selectable
 def initialize
   super(0, 64, 320, 192)
   self.contents = Bitmap.new(width - 32, height - 32)
 end

 def list=(new_list)
   @list = new_list
   refresh
 end

 def refresh
   contents.clear
   if @list.empty?
     contents.draw_text(0, 0, width - 32, 28, KActorSkill::NO_LEARNING, 1)
     return
   end
   @label = KActorSkill::SKILL_NAME_LABEL
   @symbol_first = KActorSkill::PLACE_GOLD_SYMBOL == :first
   @symbol = $data_system.words.gold
   ly = 0
   @ids = @list.keys.sort
   @ids.each do |sid|
     draw_skill(sid)
     ly += 28
   end
 end

 def draw_skill(sid)
   skill = $data_skills[sid]
   name = sprintf(@label, skill.name)
   skill = @list[sid]
   lvl = "LVL " + skill.level.to_s
   gold = skill.gold.to_s
   gold = @symbol_first ? @symbol + gold : gold + @symbol
   item = $data_items[skill.item].name
   total = "#{$game_party.item_number(skill.item)}/#{skill.total}"
   contents.draw_text(0, ly, width - 32, 28, name)
   contents.draw_text(120, ly, 160, 28, lvl)
   contents.draw_text(0, ly + 24, 160, 28, gold)
   contents.draw_text(120, ly + 24, width - 152, 28, item)
   contents.draw_text(240, ly + 24, width - 272, 28, total)
 end
 attr_reader :ids
end

class KActorSkillMenu
 def initialize(pos=0) @index = pos end
 def main
   @name_only = KActorSkill::ACTOR_NAME_AS_TITLE
   @title = KActorSkill::PENDING_SKILLS_LABEL
   @actors = $game_party.actors
   @name_window = Window_Help.new
   @skill_window = KActorSkillWindow.new
   update_actor_data
   Graphics.transition
   loop do
     Graphics.update
     Input.update
     update
     break if $scene != self
   end
   Graphics.freeze
   @skill_window.dispose
 end

 def update
   if Input.trigger?(Input::B)
     $game_system.se_play($data_system.cancel_se)
     return $scene = Scene_Map.new
   elsif Input.trigger?(Input::C)
     $game_system.se_play($data_system.decision_se)
     
   elsif Input.trigger?(Input::L)
     $game_system.se_play($data_system.cursor_se)
     @index = (@index - 1) % @actors.size
     update_actor_data
     return
   elsif Input.trigger?(Input::R)
     $game_system.se_play($data_system.cursor_se)
     @index = (@index + 1) % @actors.size
     update_actor_data
   end
 end

 def update_actor_data
   actor = @actors[@index]
   label = @name_only ? actor.name : sprintf(@title, actor.name)
   @name_window.set_text(label, 1)
   @skill_window.list = actor.learnings
 end
end

The terms and conditions are the same as those found on the first post.