Save-Point
KSkillMax 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: KSkillMax XP (/thread-4485.html)

Pages: 1 2 3 4


RE: KSkillMax - Noctis - 11-20-2016

(11-20-2016, 01:40 AM)kyonides Wrote: There is one single reason for it, you don't have any party member in slot 3 (alias index 2) as the script call pretends so it will obviously end up throwing that error message at your embarrassed face. Poor you! I should have warned you about that just in case...

I tested it again. I used script call (below) while I had only aluxes in my party
$game_party.actors[1].skill_limit +=1
That script call is for aluxes as far as I know but I still get the same error.
Btw. is it normal that skills vanish when I put them out?


RE: KSkillMax - kyonides - 11-20-2016

Again, there is one single reason for it, you don't have any party member in slot 2 (alias index 1 in the script call) as the script call pretends so it will obviously end up throwing that error message at your not so surprised face, Noctis. About the other stuff I can't tell you anything so far, I need to get there the next time I test my script because I haven't seen that ever happening to my heroes so it will take some time to find the root cause.


RE: KSkillMax - Noctis - 11-20-2016

(11-20-2016, 05:33 PM)kyonides Wrote: Again, there is one single reason for it, you don't have any party member in slot 2 (alias index 1 in the script call) as the script call pretends so it will obviously end up throwing that error message at your not so surprised face, Noctis. About the other stuff I can't tell you anything so far, I need to get there the next time I test my script because I haven't seen that ever happening to my heroes so it will take some time to find the root cause.

AH.... So, that script call
$game_party.actors[1].skill_limit +=1
has nothing to do with the actors ID but rather with actor_index. Now I see.
So, if I want to increase the skill limit from Actor 1 I need to use: $game_party.actors[0].skill_limit +=1
Sorry, I forgot about it.
But wouldnt it be more wise to use the script call for actor id rather for actor index?
What do I do if the actor whos skill limit should be increased is not in the party?
BTW: I get the skill deleted issue every time I change a skill.


RE: KSkillMax - kyonides - 11-20-2016

Script Call for Team Leader (Aluxes alias Alex?)

$game_party.actors[0].skill_limit +=1

Script Call for Any Actor in the Database

$game_actors[ID].skill_limit += 1

The only thing about the second script call I might add is that I'm not sure if heroes not currently available in your party will keep that, especially after you load a saved game. I haven't tested the script under such circumstances so far...


RE: KSkillMax - Noctis - 11-20-2016

(11-20-2016, 07:17 PM)kyonides Wrote: Script Call for Team Leader (Aluxes alias Alex?)

$game_party.actors[0].skill_limit +=1

Script Call for Any Actor in the Database

$game_actors[ID].skill_limit += 1

The only thing about the second script call I might add is that I'm not sure if heroes not currently available in your party will keep that, especially after you load a saved game. I haven't tested the script under such circumstances so far...

Im going to test it today or tomorrow and edit it then.
EDIT: I couldnt test it because of another bug.
When a party member is not in the party from the beginning and I add him in game and try to look on his learned skills I get the following message:
[Image: bug001mt12w35k78.png]


RE: KSkillMax - kyonides - 12-03-2016

Well, Noctis, I just forgot to update the method name in that line, but that's now fix in version 1.2.12 for XP!

Call Me Mr. Bump! Bugs Now Slump!

Yeah, this new version also prevents the menu from showing up every single time any actor gets some extra level, but only if the player didn't want to replace all skills last time the menu showed up. (If the player replaced all skills available, then the menu won't show its face obviously!) Once the same actor couldn't learn another skill or another one now needs to learn any new skill, the skill replacement menu will come back!

Edit:

In VX version 1.2.2 your heroes will be able to learn pending skills if they level up and there was an increase in the skill limit. Also there was another addition, now VX game developers can keep pending skills just like in the XP version.


RE: KSkillMax - Noctis - 12-04-2016

(12-03-2016, 03:35 AM)kyonides Wrote: Well, Noctis, I just forgot to update the method name in that line, but that's now fix in version 1.2.12 for XP!


Call Me Mr. Bump! Bugs Now Slump!

Yeah, this new version also prevents the menu from showing up every single time any actor gets some extra level, but only if the player didn't want to replace all skills last time the menu showed up. (If the player replaced all skills available, then the menu won't show its face obviously!) Once the same actor couldn't learn another skill or another one now needs to learn any new skill, the skill replacement menu will come back!

Edit:

In VX version 1.2.2 your heroes will be able to learn pending skills if they level up and there was an increase in the skill limit. Also there was another addition, now VX game developers can keep pending skills just like in the XP version.

Thanks,
Is there a reason why skills that I changed got deleted or was this intended?
Also, is there a way to give the player ultimate number of replacement skills?


RE: KSkillMax - kyonides - 12-05-2016

Well, so far I have tested my script, skills don't get deleted unless you didn't learn the replacement skills and the corresponding variable is set to true, if it's nil or false, then it should keep them. Nope, all new skills learned one way or another remained there as expected. So unless you could tell me you included another skill related script there, your issue puzzles me.

Yes, there is! MAX = Any number would tell you how many skills an actor may learn before the next one triggers the open menu feature.


RE: KSkillMax - Noctis - 12-05-2016

(12-05-2016, 04:21 AM)kyonides Wrote: Well, so far I have tested my script, skills don't get deleted unless you didn't learn the replacement skills and the corresponding variable is set to true, if it's nil or false, then it should keep them. Nope, all new skills learned one way or another remained there as expected. So unless you could tell me you included another skill related script there, your issue puzzles me.

Yes, there is! MAX = Any number would tell you how many skills an actor may learn before the next one triggers the open menu feature.

I didint include another script, I jusrt opened your recent demo and included the latest version.
When I replaced a skill with a skill from the "new skill" it vanishes off.

Heres the script:

Code:
#   KSkillMax XP
#   Scripter : Kyonides-Arkanthos
#   v 1.2.12 - 2016-12-02
#   Plug & Play Script

#   This script allows the game dev to limit the maximum number of skills that a
#   hero can use during gameplay. Whenever they have reached this maximum, a new
#   menu will show up to tell the player that there is a need to replace some
#   skills if they really want to learn new ones.

#   The CLEAR_SKILLS_NOT_LEARNED Constant allows the game dev to define whether
#   or not the skills heroes will not learn will be discarded before going back
#   to the map scene.

#   OPTIONAL
#     The following script calls may allow the game dev to change the maximum
#     number of skills a heroe may remember.

#   SCRIPT CALLS

#      #  INCREASE or DECREASE Maximum Number of Skills  #
#      $game_party.actors[INDEX].skill_limit += NUMBER
#      $game_party.actors[INDEX].skill_limit -= NUMBER

#      The Following Script Call is optional, you would only use it if you
#      want to let the player check and modify their unlearned skills even if
#      they didn't learn a new skill by leveling up or by purchasing a skill at
#      a skill shop (that would be possible if you add my KSkill Shop XP script
#      and place it below KSkillMax XP).
#         $scene = Scene_SkillMax.new
module KSkill
 # Maximum Number of Skills to be learned by a hero
 MAX = 3
 # Will the Maximum Number of Skills be increased by Leveling Up?
 LVLUPINCREASE = true
 # Increase of Skills After reaching specific Levels : Level => Increase
 LVLUPMAX = { 10 => 1, 20 => 1, 40 => 2 }
 # Replacement Icon Name
 OLD_SKILL_ICON = '047-Skill04'
 NEW_SKILL_ICON = '048-Skill05'
 # Buttons to display Old and New Skill Data Windows
 INFOBUTTONID = Input::A
 # Delete Skills Heroes did not learn: YES - true, NO - false or nil
 CLEAR_SKILLS_NOT_LEARNED = false
 # Help Menu Titles
 NOEXTRASKILLS = 'There is no need for any hero to learn new skills'
 REACHEDMAX = 'There are heroes that cannot learn more skills'
 REPLACESKILLS = 'Which skills do you want to replace with new ones?'
 AREYOUSURE = 'Are you really positive about applying these changes?'
 REPLACEMENTSLEFT = "Replacement Skills Left: %s"
 HEROES = 'Heroes'
 LEARNEDSKILLS = 'Learned Skills'
 NEWSKILLS = 'New Skills'
 EXITOPTIONS = ['Apply Changes', 'Review Changes', 'No Changes']
 LABELS = {} # DO NOT EDIT THIS LINE
 LABELS[nil]       = 'None'
 LABELS[:target]   = 'Target'
 LABELS[0]         = LABELS[nil]
 LABELS[1]         = '1 Enemy'
 LABELS[2]         = 'Enemies'
 LABELS[3]         = '1 Ally'
 LABELS[4]         = 'Allies'
 LABELS[5]         = 'Dead Ally'
 LABELS[6]         = 'Dead Allies'
 LABELS[7]         = 'User'
 LABELS[:cost]     = 'Cost' # Costo de Habilidad o Técnica
 LABELS[:power]    = 'Power' # Poder o Fuerza de la Técnica
 LABELS[:str]      = 'STR' # Fuerza de la Técnica
 LABELS[:int]      = 'INT' # Inteligencia de la Técnica
 LABELS[:agi]      = 'AGI' # Agilidad de la Técnica
 LABELS[:dex]      = 'DEX' # Destreza de la Técnica
 LABELS[:pdef]     = 'PDEF' # Defensa Física de la Técnica
 LABELS[:mdef]     = 'MDEF' # Defensa Mágica de la Técnica
 LABELS[:eva]      = 'EVA' # Evasión de la Técnica
 OCCASIONS = {} # DO NOT EDIT THIS LINE
 OCCASIONS[:occasion] = 'Occasion'
 OCCASIONS[0] = 'Always'
 OCCASIONS[1] = 'In Battle'
 OCCASIONS[2] = 'From Menu'
 OCCASIONS[3] = 'Never'
 # STOP! NO MORE EDITS REQUIRED
 @help_actors = []
 @replacements = 0
 LVLUPMAX.default = 0
 class << self
   attr_accessor :help_actors, :replacements, :open_menu
 end
end

class Game_Actor
 attr_accessor :pending_skills
 attr_reader :skills_not_learned
 alias kyon_skill_limit_gm_actor_init initialize
 def initialize(actor_id)
   @limit_breaker = 0
   @skills_not_learned = []
   kyon_skill_limit_gm_actor_init(actor_id)
 end

 def learn_skill(sid)
   return unless sid > 0 and !skill_learn?(sid)
   if @skills.size == KSkill::MAX + @limit_breaker
     KSkill.help_actors << @actor_id if !KSkill.help_actors.include?(@actor_id)
     @skills_not_learned << sid
     @skills_not_learned = @skills_not_learned.uniq.sort
     return
   end
   @skills << sid
   @skills.sort!
 end

 def exp=(exp)
   @exp = [[exp, 9999999].min, 0].max
   check_level_up
   check_level_down
   @hp = [@hp, self.maxhp].min
   @sp = [@sp, self.maxsp].min
 end

 def check_level_up
   old_size = @skills_not_learned.size
   while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
     @level += 1
     self.skill_limit += KSkill::LVLUPMAX[@level] if KSkill::LVLUPINCREASE
     $data_classes[@class_id].learnings.each {|j|
       learn_skill(j.skill_id) if j.level == @level }
     @pending_skills = old_size < @skills_not_learned.size
   end
 end

 def check_level_down
   while @exp < @exp_list[@level]
     @level -= 1
     self.skill_limit -= KSkill::LVLUPMAX[@level] if KSkill::LVLUPINCREASE
   end
 end

 def skill_max() KSkill::MAX + @limit_breaker end
 def skill_limit() @limit_breaker end
 def skill_limit=(int) @limit_breaker = [int, 0].max end
end

class Window_KSkillHelp < Window_Base
 def initialize(width=640)
   super(0, 0, width, 64)
   self.contents = Bitmap.new(width - 32, height - 32)
 end

 def set_text(text, align=0)
   contents.clear
   contents.draw_text(0, 0, self.width - 32, 32, text, align)
 end
end

class Window_ActorSelection < Window_Selectable
 def initialize
   empty = KSkill.help_actors.size == 0
   h = 32 + KSkill.help_actors.size * 80
   h += 80 if empty
   super(0, 128, 120, h)
   self.contents = Bitmap.new(width - 32, height - 32)
   @item_max = KSkill.help_actors.size
   self.index = empty ? -2 : 0
   refresh unless empty
 end

 def refresh
   self.contents.clear
   self.contents.font.bold, self.contents.font.size = true, 18
   ny, sy = -80, -64
   KSkill.help_actors.each {|id| actor = $data_actors[id]
     self.contents.draw_text(0, ny += 80, 88, 28, actor.name, 1)
     draw_actor_graphic(actor, 44, ny + 74) }
 end

 def update_cursor_rect
   return if @item_max == 1
   self.cursor_rect.set(0, @index * 80, 88, 80)
 end
end

class Window_ActorSkills < Window_Selectable
 attr_reader :replaced, :replace_index
 def initialize
   super(120, 128, 260, 288)
   @replaced = {}
   one_choice = KSkill.help_actors.size == 1
   self.index = one_choice ? 0 : -1
 end

 def replace_skills?() @replaced[@actor_id].size > 0 end
 def replace_max() @replaced[@actor_id].size end
 def skill_id() @data[@index].id end

 def refresh
   self.contents.dispose if self.contents
   @data = []
   @actor.skills.size.times {|i| skill = $data_skills[@actor.skills[i]]
     @data << skill if skill != nil }
   @item_max = @data.size
   return unless @item_max > 0
   self.contents = Bitmap.new(width - 32, row_max * 32)
   self.contents.font.size = 20
   self.contents.font.bold = true
   @item_max.times {|i| draw_item(i) }
 end

 def actor=(new_actor)
   @actor, @actor_id, @index = new_actor, new_actor.id, 0
   @replaced[@actor_id] ||= []
   refresh
 end

 def update_replacement_check
   if !@replaced[@actor_id].include?(@index)
     if KSkill.replacements == 0
       $game_system.se_play($data_system.buzzer_se)
       return @replace_index = nil
     elsif @replaced[@actor_id].size < @actor.skills_not_learned.size
       $game_system.se_play($data_system.decision_se)
       @replaced[@actor_id] << @index
       KSkill.replacements -= 1
       @replace_index = @index
     else
       $game_system.se_play($data_system.buzzer_se)
       return @replace_index = nil
     end
   else
     $game_system.se_play($data_system.decision_se)
     @replaced[@actor_id].delete(@index)
     KSkill.replacements += 1
     @replace_index = nil
   end
   refresh
 end

 def draw_item(index)
   skill, y = @data[index], index * 32
   rect = Rect.new(4, y, self.width - 32, 32)
   self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
   if @replaced[@actor_id].include?(index)
     bitmap = RPG::Cache.icon(KSkill::OLD_SKILL_ICON)
     self.contents.blt(0, y + 4, bitmap, Rect.new(0, 0, 24, 24))
   end
   bitmap = RPG::Cache.icon(skill.icon_name)
   self.contents.blt(28, y + 4, bitmap, Rect.new(0, 0, 24, 24))
   self.contents.draw_text(60, y, 204, 32, skill.name, 0)
 end

 def dispose
   @replaced.clear
   @replaced = nil
   super
 end
end

class Window_NewSkills < Window_Selectable
 attr_reader :selected
 attr_writer :replace_max
 def initialize(index, skills)
   super(380, 128, 260, 288)
   self.index = index
   @skills = skills
   self.active = nil
   @replace_max = 0
   @selected = {}
   @s = []
   @data = []
   ds = $data_skills
   @skills.each{|d| @s[@s.size] = d.map{|i| [id,ds[i].icon_name,ds[i].name]}}
   @actor_index = 0 if @skills.size == 1
   refresh unless index < 0
 end

 def skills_size() @item_max end
 def skill_ids() @data.map {|values| values[0] } end

 def skills(actor_index, new_index, new_skills)
   @actor_index = actor_index
   self.index = new_index
   @skills = new_skills
   refresh
 end

 def update_single_skill
   @selected[@actor_index][0] = 0
   refresh
 end

 def update_selection
   $game_system.se_play($data_system.decision_se)
   reached_max = @replace_max == @selected[@actor_index].compact.size
   selected = @selected[@actor_index].include?(@index)
   @selected[@actor_index][@index] = ((reached_max or selected)? nil : @index)
   refresh
 end

 def refresh
   self.contents.dispose if self.contents
   @data = @s[@actor_index]
   @item_max = @data.size
   return unless @item_max > 0
   @selected[@actor_index] ||= Array.new(@item_max, nil)
   self.contents = Bitmap.new(width - 32, @item_max * 32)
   self.contents.font.size = 20
   self.contents.font.bold = true
   @item_max.times {|i| draw_item(i) }
 end

 def draw_item(index)
   skill, y = @data[index], index * 32
   rect = Rect.new(4, y, self.width - 32, 32)
   self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
   if @selected[@actor_index].include?(index)
     bitmap = RPG::Cache.icon(KSkill::NEW_SKILL_ICON)
     self.contents.blt(0, y + 4, bitmap, Rect.new(0, 0, 24, 24))
   end
   bitmap = RPG::Cache.icon(skill[1])
   self.contents.blt(28, y + 4, bitmap, Rect.new(0, 0, 24, 24))
   self.contents.draw_text(60, y, 204, 32, skill[2], 0)
 end

 def dispose
   @data.clear
   @s.clear
   super
 end
end

class Window_KSkillData < Window_Selectable
 def initialize(new_x, new_y)
   super(new_x, new_y, 272, 256)
   self.contents = Bitmap.new(width - 32, height - 32)
   self.z += 100
   @skill = nil
   refresh if @skill
 end

 def skill_id=(new_skill_id)
   @skill = $data_skills[new_skill_id]
   refresh
 end

 def refresh
   self.contents.clear
   draw_skill_labels
   draw_skill_data
 end

 def draw_skill_labels
   labels = KSkill::LABELS
   contents.font.color = system_color
   contents.draw_text(0, 28, 240, 28, labels[:target])
   contents.draw_text(0, 56, 240, 28, KSkill::OCCASIONS[:occasion])
   contents.draw_text(0, 84, 240, 28, labels[:cost])
   contents.draw_text(124, 84, 240, 28, labels[:power])
   contents.draw_text(0, 112, 240, 28, labels[:str])
   contents.draw_text(124, 112, 240, 28, labels[:int])
   contents.draw_text(0, 140, 240, 28, labels[:agi])
   contents.draw_text(124, 140, 240, 28, labels[:dex])
   contents.draw_text(0, 168, 240, 28, labels[:pdef])
   contents.draw_text(124, 168, 240, 28, labels[:mdef])
   contents.draw_text(0, 196, 240, 28, labels[:eva])
 end

 def draw_skill_data
   contents.font.color = normal_color
   bitmap = RPG::Cache.icon(@skill.icon_name)
   contents.blt(0, 4, bitmap, Rect.new(0, 0, 24, 24))
   contents.draw_text(32, 0, 204, 32, @skill.name, 0)
   contents.draw_text(0, 28, 240, 28, KSkill::LABELS[@skill.scope], 2)
   contents.draw_text(0, 56, 240, 28, KSkill::OCCASIONS[@skill.occasion], 2)
   contents.draw_text(0, 84, 108, 28, @skill.sp_cost.to_s, 2)
   contents.draw_text(0, 84, 240, 28, @skill.power.abs.to_s, 2)
   contents.draw_text(0, 112, 108, 28, @skill.str_f.to_s, 2)
   contents.draw_text(0, 112, 240, 28, @skill.int_f.to_s, 2)
   contents.draw_text(0, 140, 108, 28, @skill.agi_f.to_s, 2)
   contents.draw_text(0, 140, 240, 28, @skill.dex_f.to_s, 2)
   contents.draw_text(0, 168, 108, 28, @skill.pdef_f.to_s, 2)
   contents.draw_text(0, 168, 240, 28, @skill.mdef_f.to_s, 2)
   contents.draw_text(0, 196, 108, 28, @skill.eva_f.to_s, 2)
 end
end

class Interpreter
 def command_315
   value = operate_value(@parameters[1], @parameters[2], @parameters[3])
   iterate_actor(@parameters[0]){|actor| actor.exp += value }
   pending = $game_party.actors.select{|actor| actor.pending_skills }.size
   KSkill.open_menu = (!KSkill.help_actors.empty? and pending > 0)
   $game_party.actors.each {|actor| actor.pending_skills = nil }
   return true
 end
end

class Scene_Map
 alias kyon_kskillmax_scn_map_up update
 def update
   kyon_kskillmax_scn_map_up
   return unless KSkill.open_menu and !$game_temp.message_window_showing
   $scene = Scene_KSkillMax.new
 end
end

class Scene_Load
 alias kyon_kskillmax_scn_load_rsd read_save_data
 def read_save_data(file)
   kyon_kskillmax_scn_load_rsd(file)
   actors = $game_party.actors
   actors.each {|a| KSkill.help_actors << a.id if !a.skills_not_learned.empty?}
 end
end

class Scene_Battle
 def battle_end(result)
   $game_temp.in_battle = false
   $game_party.clear_actions
   $game_party.actors.each {|actor| actor.remove_states_battle }
   $game_troop.enemies.clear
   if $game_temp.battle_proc != nil
     $game_temp.battle_proc.call(result)
     $game_temp.battle_proc = nil
   end
   $scene = KSkill.help_actors.empty? ? Scene_Map.new : Scene_KSkillMax.new
 end
end

class Scene_KSkillMax
 def initialize
   KSkill.open_menu = nil
   @skills = []
   @actors = []
   actors = $game_party.actors
   KSkill.replacements = 0
   actors.each {|a| skills = a.skills_not_learned
     next if skills.empty?
     number = [a.skill_max, skills.size].min
     next if number == 0
     KSkill.replacements += number
     @skills << skills
     @actors << a }
 end

 def main
   make_help_windows
   make_status_windows
   make_skill_windows
   @command_window = Window_Command.new(200, KSkill::EXITOPTIONS)
   @command_window.x = (640 - @command_window.width) / 2
   @command_window.y = (480 - @command_window.height) / 2
   @command_window.visible = nil
   @command_window.active = nil
   Graphics.transition
   loop do
     Graphics.update
     Input.update
     update
     break if $scene != self
   end
   Graphics.freeze
   @command_window.dispose
   @new_status_window.dispose
   @old_status_window.dispose
   @replace_window.dispose
   @skill_window.dispose
   @selection_window.dispose
   @help_windows.each {|window| window.dispose }
 end

 def make_status_windows
   @old_status_window = Window_KSkillData.new(368, 128)
   @old_status_window.visible = false
   @new_status_window = Window_KSkillData.new(108, 128)
   @new_status_window.visible = false
 end

 def make_help_windows
   @help_windows = [Window_KSkillHelp.new, Window_KSkillHelp.new(120)]
   @help_windows += [Window_KSkillHelp.new(260), Window_KSkillHelp.new(260)]
   @help_windows[4] = Window_KSkillHelp.new(520)
   @help_windows[2].x = 120
   @help_windows[3].x = 380
   @help_windows[4].x = 120
   @help_windows[1].y = @help_windows[2].y = @help_windows[3].y = 64
   @help_windows[4].y = 416
   @empty = KSkill.replacements == 0
   text = @empty ? KSkill::NOEXTRASKILLS : KSkill::REACHEDMAX
   @help_windows[0].set_text(text, 1)
   @help_windows[1].set_text(KSkill::HEROES, 1)
   @help_windows[2].set_text(KSkill::LEARNEDSKILLS, 1)
   @help_windows[3].set_text(KSkill::NEWSKILLS, 1)
   text = sprintf(KSkill::REPLACEMENTSLEFT, KSkill.replacements)
   @help_windows[4].set_text(text, 1)
 end

 def make_skill_windows
   @selection_window = Window_ActorSelection.new
   @skill_window = Window_ActorSkills.new
   if KSkill.help_actors.size == 1
     @selection_window.active = nil
     @skill_window.active = true
     @skill_window.actor = $game_actors[KSkill.help_actors[0]]
     @skill_window.index = 0
     @replace_window = Window_NewSkills.new(0, @skills)
     @help_windows[0].set_text(KSkill::REPLACESKILLS, 1)
   else
     @skill_window.active = nil
     @replace_window = Window_NewSkills.new(-1, @skills)
   end
 end

 def update
   @help_windows[0].update
   @selection_window.update
   @skill_window.update
   @replace_window.update
   @old_status_window.update
   @new_status_window.update
   @command_window.update
   if @selection_window.active
     update_actor_selection
     return
   elsif @skill_window.active
     update_skill_selection
     return
   elsif @replace_window.active
     update_replace_selection
     return
   elsif @old_status_window.visible
     update_old_skills_data
     return
   elsif @new_status_window.visible
     update_new_skills_data
     return
   elsif @command_window.active
     update_exit_selection
     return
   end
 end

 def update_skills_info
   @help_windows[0].set_text(KSkill::REPLACESKILLS, 1)
   @skill_window.actor = actor = @actors[@selection_window.index]
   @replace_window.skills(@selection_window.index, 0, @skills)
   @selection_window.active = nil
   @skill_window.active = true
   @skill_window.index = 0
 end

 def update_actor_selection
   if Input.trigger?(Input::B)
     $game_system.se_play($data_system.cancel_se)
     if @empty
       $scene = Scene_Map.new
       return
     end
     @help_windows[0].set_text(KSkill::AREYOUSURE, 1)
     @selection_window.active = nil
     @command_window.active = true
     @command_window.visible = true
   elsif Input.trigger?(Input::C)
     if @actors[@selection_window.index].nil?
       $scene = Scene_Map.new
       return
     elsif @actors[@selection_window.index].skills_not_learned.empty?
       $game_system.se_play($data_system.buzzer_se)
       return
     end
     $game_system.se_play($data_system.decision_se)
     update_skills_info
   end
 end

 def update_skill_selection
   if Input.trigger?(Input::B)
     size1 = @skill_window.replaced.values.flatten.size
     size2 = @replace_window.selected.values.flatten.compact.size
     if size1 != size2
       $game_system.se_play($data_system.buzzer_se)
       return
     end
     $game_system.se_play($data_system.cancel_se)
     @help_windows[0].set_text(KSkill::REACHEDMAX, 1)
     @skill_window.active = nil
     if KSkill.help_actors.size == 1
       @help_windows[0].set_text(KSkill::AREYOUSURE, 1)
       @command_window.active = true
       @command_window.visible = true
     else
       @selection_window.active = true
     end
     @skill_window.index = -1
     @replace_window.index = -1
     if @skill_window.contents
       @skill_window.contents.clear
       @replace_window.contents.clear
     end
     return
   elsif Input.trigger?(Input::C)
     @skill_window.update_replacement_check
     text = sprintf(KSkill::REPLACEMENTSLEFT, KSkill.replacements)
     @help_windows[4].set_text(text, 1)
     return
   elsif Input.trigger?(KSkill::INFOBUTTONID)
     $game_system.se_play($data_system.decision_se)
     actor_id = KSkill.help_actors[@selection_window.index]
     @actor_skills = $game_actors[actor_id].skills
     @skills_size = @actor_skills.size
     @skill_index = @skill_window.index
     @old_status_window.skill_id = @skill_window.skill_id
     @skill_window.active = false
     @old_status_window.visible = true
     return
   elsif Input.trigger?(Input::L) or Input.trigger?(Input::R)
     update_active_window
   elsif Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT)
     update_active_window
   end
 end

 def update_replace_selection
   if Input.trigger?(Input::B) or Input.trigger?(Input::LEFT)
     $game_system.se_play($data_system.cancel_se)
     @replace_window.active = nil
     @skill_window.active = true
     return
   elsif Input.trigger?(KSkill::INFOBUTTONID)
     $game_system.se_play($data_system.decision_se)
     @actor_skills = @actors[@selection_window.index].skills_not_learned
     @skills_size = @actor_skills.size
     @skill_index = 0
     @new_status_window.skill_id = @actor_skills[0]
     @replace_window.active = false
     @new_status_window.visible = true
   elsif Input.trigger?(Input::C)
     @replace_window.update_selection
   end
 end

 def update_old_skills_data
   if Input.trigger?(Input::B) or Input.trigger?(KSkill::INFOBUTTONID)
     $game_system.se_play($data_system.cancel_se)
     $game_system
     @actor_skills = []
     @old_status_window.visible = false
     @skill_window.active = true
   elsif Input.trigger?(Input::UP)
     if @skills_size == 1
       $game_system.se_play($data_system.cancel_se)
       return
     end
     @skill_index = (@skill_index + @skills_size - 1) % @skills_size
     @old_status_window.skill_id = @actor_skills[@skill_index]
   elsif Input.trigger?(Input::DOWN)
     if @skills_size == 1
       $game_system.se_play($data_system.cancel_se)
       return
     end
     @skill_index = (@skill_index + 1) % @skills_size
     @old_status_window.skill_id = @actor_skills[@skill_index]
   end
 end

 def update_new_skills_data
   if Input.trigger?(Input::B) or Input.trigger?(KSkill::INFOBUTTONID)
     $game_system.se_play($data_system.cancel_se)
     @actor_skills = []
     @new_status_window.visible = false
     @replace_window.active = true
   elsif Input.trigger?(Input::UP)
     if @skills_size == 1
       $game_system.se_play($data_system.cancel_se)
       return
     end
     @skill_index = (@skill_index + @skills_size - 1) % @skills_size
     @new_status_window.skill_id = @actor_skills[@skill_index]
   elsif Input.trigger?(Input::DOWN)
     if @skills_size == 1
       $game_system.se_play($data_system.cancel_se)
       return
     end
     @skill_index = (@skill_index + 1) % @skills_size
     @new_status_window.skill_id = @actor_skills[@skill_index]
   end
 end

 def update_active_window
   $game_system.se_play($data_system.decision_se)
   @skill_window.active = nil
   @replace_window.replace_max = @skill_window.replace_max
   @replace_window.active = true
 end

 def update_exit_selection
   if Input.trigger?(Input::C)
     $game_system.se_play($data_system.decision_se)
     case @command_window.index
     when 0
       actor_index = -1
       @actors.each {|actor| id, actor_index = actor.id, actor_index + 1
         next if @skill_window.replaced[id].nil?
         index = -1
         s = @replace_window.selected[actor_index].compact
         @skill_window.replaced[id].each {|ix| index += 1
           not_learned = @actors[actor_index].skills_not_learned
           @actors[actor_index].skills[ix] = not_learned[s[index]]
           not_learned[s[index]] = nil }
           @actors[actor_index].skills_not_learned.compact! }
       clear_skills_info
     when 1
       @selection_window.active = true
       @command_window.active = @command_window.visible = nil
     when 2 then clear_skills_info end
     $scene = Scene_Map.new unless @command_window.index == 1
   end
 end

 def clear_skills_info
   KSkill.help_actors.delete_if {|i| $game_actors[i].skills_not_learned.empty?}
   return unless KSkill::CLEAR_SKILLS_NOT_LEARNED
   KSkill.help_actors.each {|id| $game_actors[id].skills_not_learned.clear }
   KSkill.help_actors.clear
 end
end



RE: KSkillMax - kyonides - 12-05-2016

OK, thanks, Noctis, but please stop posting the same script, it's useless and pointless, you just need to point out that it's the latest version. Still, I've got to say you're the only one reporting that situation and I've never seen that happening and I did run the demo with the latest version (1.2.12 at that specific moment), the same available for everybody here, and nothing weird happened. Are you sure you didn't do anything else? Are you sure the demo or anything around it didn't get corrupt somehow? Really I ran my demo once again just a few moments ago, and the skill got replaced, nothing but the old skill vanished there, just as expected. There's the exit menu on my script and it has 3 choices, are you sure you pick Apply Changes to get the new skill? Or perhaps you added some script call that deletes hero's skills, possibly very specific ones...

As a summary I can tell for sure my script works fine.

And yeah, there is a new version of KSkillMax XP, version 1.2.13, and no, it doesn't fix your issue, Noctis, because I couldn't find it anywhere. Actually it just fixes a bug where one couldn't see the menus when you had a single actor and chose to Review Changes. It didn't happen when there were 2 or more actors on the waiting list. Now it's history, it's working fine, 100% fine.

Have you tried my script on a new game project? Sometimes old projects get corrupted and we don't notice it...