| McDohl's Skill Book script: | ||||||||||||
| Well now, this is a more complex script that's instructions will be at the bottom of the page. Now, make a new class called Skill Book above 'Main' and put this into it: | ||||||||||||
| #================================
# Item_Book by momomomo? # http://f53.aaa.livedoor.jp/%7Emomomo/source/skillbook_source.html #---------------------------------------------------------------- #-Translated by Mcdohl #---------------------------------------------------------------- #================================ # English is not my main language, so I'm sorry if you can't understand some of my comments. # 11.18.2005 # Script translated, known bugs: # -Doesn't seem to work with some custom-skill learning scripts. # This script will add all the skills you learn throughout the game into a "Book." # In this book you can see the stats, MP cost, element and states of each skill. module Skill_Book_Config # The following line (SHOW_COMPLETE_TYPE =) is very important. It will define how are # the items counted. (The item count appears on the upper right corner, in the help window. # Use "0" to display nothing. # Use "1" to display it in a "items found so far/total" format. # Use "2" to use percentage completion. # Use "3" for...a weird item counting method... SHOW_COMPLETE_TYPE = 3 DRAW_POW_ZERO = false ZERO_POW_TEXT = "" end class Window_SkillBook_Info < Window_Selectable include Skill_Book_Config end class Data_SkillBook attr_reader :skill_kind_name attr_reader :kind_row attr_reader :skill_id_data attr_reader :skill_kind_element_name #-------------------------------------------------------------------------- # ? Setup #-------------------------------------------------------------------------- def initialize # Name the skill categories. @skill_kind_name = ["Physical", "Elemental", "Non-Elemental", "Curative", "Status"] # Next is the menu setup. It's a vertical list. List the categories in any order you want. # Note: The categories below must coincide with the categories you listed above. @kind_row = ["Physical", "Elemental", "Non-Elemental", "Curative", "Status"] # Now write the element setups.You need to add elements in the Database (in the System Tab). For # example, if you want to use a "Physical" category, go make an element called "Physical" and # then apply it to all the skills you want them to appear under the Physical category! @skill_kind_element_name = ["Physical", "Elemental", "Curative", "Status", "Non-Elemental"] @skill_id_data = skill_book_id_set end #-------------------------------------------------------------------------- # ? Defining Kinds #-------------------------------------------------------------------------- def kind_search(name) if @skill_kind_name.include?(name) return [0, @skill_kind_name.index(name)] end end #-------------------------------------------------------------------------- # ? ??????????? #-------------------------------------------------------------------------- def no_add_element no_add = 0 # ???????ID??? for i in 1...$data_system.elements.size if $data_system.elements[i] =~ /??????/ no_add = i break end end return no_add end #-------------------------------------------------------------------------- # ? ?????????ID??? #-------------------------------------------------------------------------- def element_search(element_name) return nil if element_name == nil for i in 1...$data_system.elements.size if $data_system.elements[i] =~ /^#{element_name}/ return i end end end #-------------------------------------------------------------------------- # ? ??????ID?? #-------------------------------------------------------------------------- def skill_book_id_set data = [] no_add = no_add_element if @skill_kind_element_name.size == 0 data[0] = [0] for i in 1...$data_skills.size skill = $data_skills[i] next if skill.name == "" next if skill.element_set.include?(no_add) data[0].push(skill.id) end else for i in 0...@skill_kind_element_name.size data[i] = [0] element_id = element_search(@skill_kind_element_name[i]) for j in 1...$data_skills.size skill = $data_skills[j] next if skill.name == "" next if skill.element_set.include?(no_add) if skill.element_set.include?(element_id) data[i].push(skill.id) end end end end return data end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ? ??????? # skill_id : ??? ID # This seems to be how the script detects a new skill, this may be the key to making it compatible # with custom-learning skills scripts, not sure tho. #-------------------------------------------------------------------------- alias game_actor_skill_book_learn_skill learn_skill def learn_skill(skill_id) game_actor_skill_book_learn_skill(skill_id) $game_system.add_skill_count(skill_id) end end class Window_Base < Window #-------------------------------------------------------------------------- # ? Element Set Up # NOTE: Default RTP elements were used. #-------------------------------------------------------------------------- def draw_attack_element(x, y, element_set) elem_temp = [] for i in element_set elem = $data_system.elements[i] elem_temp.push("Fire") if elem == "Fire" elem_temp.push("Ice") if elem == "Ice" elem_temp.push("Thunder") if elem == "Thunder" elem_temp.push("Water") if elem == "Water" elem_temp.push("Earth") if elem == "Earth" elem_temp.push("Wind") if elem == "Wind" elem_temp.push("Light") if elem == "Light" elem_temp.push("Darkness") if elem == "Darkness" end if elem_temp.size == 0 self.contents.draw_text(x, y, 64, 32, "None") return end ox = 0 for name in elem_temp cx = self.contents.text_size(name).width self.contents.draw_text(x+ox, y, cx, 32, name) ox += cx+8 end end #-------------------------------------------------------------------------- # ? ?????? #-------------------------------------------------------------------------- def draw_attack_wp_element(x, y, element_set) elem_temp = [] for i in element_set elem = $data_system.elements[i] elem_temp.push("?") if elem == "?" elem_temp.push("?") if elem == "?" elem_temp.push("?") if elem == "?" elem_temp.push("?") if elem == "?" elem_temp.push("?") if elem == "?" end if elem_temp.size == 0 self.contents.draw_text(x, y, 64, 32, "??") return end ox = 0 for name in elem_temp cx = self.contents.text_size(name).width self.contents.draw_text(x+ox, y, cx, 32, name) ox += cx+8 end end #-------------------------------------------------------------------------- # ? ?????? #-------------------------------------------------------------------------- def draw_attack_weak_element(x, y, element_set) elem_temp = [] for i in element_set elem = $data_system.elements[i] elem_temp.push("??") if elem == "? ??" elem_temp.push("?") if elem == "? ?" elem_temp.push("??") if elem == "? ??" elem_temp.push("?") if elem == "? ?" elem_temp.push("?") if elem == "? ?" elem_temp.push("?") if elem == "? ?" elem_temp.push("??") if elem == "? ??" elem_temp.push("??") if elem == "? ??" end if elem_temp.size == 0 self.contents.draw_text(x, y, 64, 32, "??") return end ox = 0 for name in elem_temp cx = self.contents.text_size(name).width self.contents.draw_text(x+ox, y, cx, 32, name) ox += cx+8 end end #-------------------------------------------------------------------------- # ? States (Status Abnormalities like Poison, Sleep, etc.) #-------------------------------------------------------------------------- def draw_attack_add_state(x, y, plus_state_set) state_temp = [] for i in plus_state_set state = $data_states[i] state_temp.push(state.name) if state.name != "" end if state_temp.size == 0 self.contents.draw_text(x, y, 64, 32, "None") return end ox = 0 oy = 0 for name in state_temp cx = self.contents.text_size(name).width if ox + cx + 4 >= self.contents.width - 128 ox = 0 oy += 1 end self.contents.draw_text(x+ox, y+oy*32, cx, 32, name) ox += cx+8 end end #-------------------------------------------------------------------------- # ? ??????? #-------------------------------------------------------------------------- def draw_scope(scope) case scope when 0 return "" when 1 return "" when 2 return "" when 3 return "" when 4 return "" when 5 return "" when 6 return "" when 7 return "" end end end class Game_Temp attr_accessor :skill_book_data alias temp_skill_book_data_initialize initialize def initialize temp_skill_book_data_initialize @skill_book_data = Data_SkillBook.new end end class Game_System attr_accessor :skill_count # ???????(???) #-------------------------------------------------------------------------- # ? ????????? #-------------------------------------------------------------------------- alias game_system_skill_book_initialize initialize def initialize game_system_skill_book_initialize @skill_count = {} end #-------------------------------------------------------------------------- # ? ???????????(???) # 0:??? 1:??? #-------------------------------------------------------------------------- def add_skill_count(skill_id, type=0) if type == -1 @skill_count[skill_id] = 0 else @skill_count[skill_id] = 1 end end #-------------------------------------------------------------------------- # ? ?????????????? #-------------------------------------------------------------------------- def skill_book_max kind_data = $game_temp.skill_book_data.skill_kind_name size = 0 for kind in kind_data size += skill_book_category_max(kind) end return size end #-------------------------------------------------------------------------- # ? ?????????????? #-------------------------------------------------------------------------- def skill_book_now kind_data = $game_temp.skill_book_data.skill_kind_name size = 0 for kind in kind_data size += skill_book_category_now(kind) end return size end #-------------------------------------------------------------------------- # ? ???????????? #-------------------------------------------------------------------------- def skill_book_complete_percentage s_max = skill_book_max.to_f s_now = skill_book_now.to_f comp = s_now / s_max * 100 return comp.truncate end #-------------------------------------------------------------------------- # ? ???????????????????? # category:?????? #-------------------------------------------------------------------------- def skill_book_category_max(category) id_data = $game_temp.skill_book_data.skill_id_data.dup index = $game_temp.skill_book_data.kind_search(category)[1] size = id_data[index].size - 1 return size end #-------------------------------------------------------------------------- # ? ???????????????????? # category:?????? #-------------------------------------------------------------------------- def skill_book_category_now(category) now_skill_info = @skill_count.keys index = $game_temp.skill_book_data.kind_search(category)[1] # ???????ID??? no_add = $game_temp.skill_book_data.no_add_element elename = $game_temp.skill_book_data.skill_kind_element_name[index] element_id = $game_temp.skill_book_data.element_search(elename) new_skill_info = [] for i in now_skill_info skill = $data_skills[i] next if skill == nil next if skill.name == "" next if skill.element_set.include?(no_add) if element_id == nil or skill.element_set.include?(element_id) new_skill_info.push(skill.id) end end return new_skill_info.size end #-------------------------------------------------------------------------- # ? ?????????????????? # category:?????? #-------------------------------------------------------------------------- def skill_book_category_complete_percentage(category) s_max = skill_book_category_max(category).to_f s_now = skill_book_category_now(category).to_f comp = s_now / s_max * 100 end end class Interpreter def skill_book_max(category=nil) if category == nil return $game_system.skill_book_max else return $game_system.skill_book_category_max(category) end end def skill_book_now(category=nil) if category == nil return $game_system.skill_book_now else return $game_system.skill_book_category_now(category) end end def skill_book_comp(category=nil) if category == nil return $game_system.skill_book_complete_percentage else return $game_system.skill_book_category_complete_percentage(category) end end end class Window_SkillBook < Window_Selectable attr_reader :data attr_reader :item_kind attr_reader :item_index #-------------------------------------------------------------------------- # ? ????????? #-------------------------------------------------------------------------- def initialize(index=0) super(0, 64, 640, 416) @column_max = 2 @book_data = $game_temp.skill_book_data @data = data_set(index) @data.shift #@data.sort! @item_max = @data.size @item_kind = index self.index = 0 #refresh end def new_data_set(index) @data = data_set(index) @data.shift #@data.sort! @item_max = @data.size end #-------------------------------------------------------------------------- # ? ???????? #-------------------------------------------------------------------------- def data_set(index) kind_row_data = @book_data.kind_search(@book_data.kind_row[index]) @item_kind = kind_row_data[0] @item_index = kind_row_data[1] data = [] case @item_kind when 0 data = @book_data.skill_id_data[@item_index].dup end return data end #-------------------------------------------------------------------------- # ? ?????? #-------------------------------------------------------------------------- def show?(kind, id) case kind when 0 if $game_system.skill_count[id] == 0 or $game_system.skill_count[id] == nil return false else return true end end end #-------------------------------------------------------------------------- # ? ?????? #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # ? ?????? #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end #???? 0 ?????????????????????? return if @item_max == 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ? ????? # index : ???? #-------------------------------------------------------------------------- def draw_item(index) case @item_kind when 0 item = $data_skills[@data[index]] id = @book_data.skill_id_data[@item_index].index(item.id) end return if item == nil x = 4 + index % 2 * (288 + 32) y = index / 2 * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) self.contents.font.color = normal_color self.contents.draw_text(x, y, 32, 32, id.to_s) if show?(@item_kind, item.id) bitmap = RPG::Cache.icon(item.icon_name) opacity = 255 self.contents.blt(x+48, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) self.contents.draw_text(x+48 + 28, y, 212, 32, item.name, 0) else # The "??" are used in blank spaces. (the skills you haven't learned yet) self.contents.draw_text(x+48 + 28, y, 212, 32, "??", 0) return end end end class Window_SkillBook_Info < Window_Selectable #-------------------------------------------------------------------------- # ? ????????? #-------------------------------------------------------------------------- def initialize super(0, 0+64+64, 640, 480-64-64) @book_data = $game_temp.skill_book_data self.contents = Bitmap.new(width - 32, height - 32) self.index = -1 end #-------------------------------------------------------------------------- # ? ?????? #-------------------------------------------------------------------------- def refresh(item_id, item_kind, item_index) self.contents.clear self.contents.font.size = 22 case item_kind when 0 draw_skill_info(item_id, item_index) end end #-------------------------------------------------------------------------- # ? ????? #-------------------------------------------------------------------------- def draw_skill_info(item_id, item_index) item = $data_skills[item_id] rect = Rect.new(4, 0, 160, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon(item.icon_name) opacity = 255 self.contents.blt(4+48, 0 + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) self.contents.font.color = normal_color id = @book_data.skill_id_data[item_index].index(item.id) self.contents.draw_text(4, 0, 32, 32, id.to_s) self.contents.draw_text(4+48 + 28, 0, 212, 32, item.name, 0) cost = item.sp_cost.to_s # Change "MP" to whatever you want. Like "SP" for example, or just leave it in MP. self.contents.draw_text(4+20 + 28 + 232, 0, 48, 32, "MP:", 2) self.contents.draw_text(4+48 + 28 + 232, 0, 48, 32, cost.to_s, 2) #skill_kind = skill_kind_name(item.element_set) #self.contents.draw_text(320+96, 0, 160, 32, skill_kind, 0) self.contents.font.color = text_color(2) self.contents.draw_text(4, 32, 48, 32, "DMG", 0) self.contents.font.color = normal_color if item.power == 0 and DRAW_POW_ZERO == false pow = ZERO_POW_TEXT else pow = item.power.to_s end self.contents.draw_text(4+48, 32, 48, 32, pow, 2) self.contents.font.color = system_color self.contents.draw_text(4, 64, 48, 32, "", 0) self.contents.font.color = normal_color self.contents.draw_text(4+96+16, 64, 128, 32, draw_scope(item.scope), 0) self.contents.font.color = system_color self.contents.draw_text(4, 96, 96, 32, "Element") self.contents.draw_text(4, 128, 96, 32, "") self.contents.draw_text(4, 160, 96, 32, "State") self.contents.font.color = normal_color draw_attack_element(4+96+16, 96, item.element_set) draw_attack_weak_element(4+96+16, 128, item.element_set) draw_attack_add_state(4+96+16, 160, item.plus_state_set) @help_window.set_text(item.description) end #-------------------------------------------------------------------------- # ? ????????? #-------------------------------------------------------------------------- def update_help #??? end end class Scene_SkillBook include Skill_Book_Config #-------------------------------------------------------------------------- # ? ????? #-------------------------------------------------------------------------- def main # ???????? @title_window = Window_Base.new(0, 0, 640, 64) @title_window.contents = Bitmap.new(640 - 32, 64 - 32) @title_window.contents.draw_text(4, 0, 320, 32, "Skill Book", 0) draw_comp @main_window = Window_SkillBook.new @main_window.active = false @main_window.index = -1 @help_window = Window_Help.new @help_window.z = 110 @help_window.y = 64 @help_window.visible = false command = $game_temp.skill_book_data.kind_row @kind_window = Window_Command.new(160, command) @kind_window.z = 110 @kind_window.x = 320 - @kind_window.width / 2 @kind_window.y = 240 - @kind_window.height / 2 @kind_window.active = true # ???????????? (?????????????) @info_window = Window_SkillBook_Info.new @info_window.z = 110 @info_window.visible = false @info_window.active = false # ????????????? @info_window.help_window = @help_window @visible_index = 0 @now_kind = nil # ????????? Graphics.transition # ?????? loop do # ???????? Graphics.update # ??????? Input.update # ?????? update # ???????????????? if $scene != self break end end # ????????? Graphics.freeze # ???????? @title_window.dispose @help_window.dispose @main_window.dispose @kind_window.dispose @info_window.dispose end #-------------------------------------------------------------------------- # ? ?????? #-------------------------------------------------------------------------- def update # ???????? #@help_window.update @main_window.update @kind_window.update @info_window.update if @info_window.active update_info return end # ?????????????????: update_target ??? if @main_window.active update_main return end # ????????????????: update_kind ??? if @kind_window.active update_kind return end end #-------------------------------------------------------------------------- # ? ?????? (????????????????) #-------------------------------------------------------------------------- def update_kind # C ?????????? if Input.trigger?(Input::C) # ?? SE ??? $game_system.se_play($data_system.decision_se) if @now_kind != @kind_window.index @main_window.new_data_set(@kind_window.index) @main_window.refresh @now_kind = @kind_window.index end subtitle = $game_temp.skill_book_data.kind_row[@kind_window.index] # This is, when you enter a sub-menu. (for example Physical). Physical is the subtitle, so you # write a text to go before Armors. The default said "Skill Book:" that way it would look this # way when you scroll through the Physical Section..."Skill Book: Physical." title = ""+subtitle @title_window.contents.clear @title_window.contents = Bitmap.new(640 - 32, 64 - 32) @title_window.contents.draw_text(4, 0, 320, 32, title, 0) draw_comp(subtitle) @kind_window.active = false @kind_window.visible = false @main_window.active = true @main_window.index = 0 return end # B ?????????? if Input.trigger?(Input::B) # ????? SE ??? $game_system.se_play($data_system.cancel_se) $scene = Scene_Map.new return end end #-------------------------------------------------------------------------- # ? ?????? (?????????????????) #-------------------------------------------------------------------------- def update_main # B ?????????? if Input.trigger?(Input::B) # ????? SE ??? $game_system.se_play($data_system.cancel_se) @main_window.active = false @kind_window.active = true @kind_window.visible = true @main_window.index = -1 @title_window.contents.clear @title_window.contents = Bitmap.new(640 - 32, 64 - 32) @title_window.contents.draw_text(4, 0, 320, 32, "Skill Book", 0) draw_comp return end # C ?????????? if Input.trigger?(Input::C) if @main_window.item == nil or @main_window.show?(@main_window.item_kind, @main_window.item) == false # ??? SE ??? $game_system.se_play($data_system.buzzer_se) return end # ?? SE ??? $game_system.se_play($data_system.decision_se) @main_window.active = false @info_window.active = true @info_window.visible = true @visible_index = @main_window.index @info_window.refresh(@main_window.item, @main_window.item_kind, @main_window.item_index) return end end #-------------------------------------------------------------------------- # ? ?????? (??????????????????) #-------------------------------------------------------------------------- def update_info # B ?????????? if Input.trigger?(Input::B) # ????? SE ??? $game_system.se_play($data_system.cancel_se) @main_window.active = true @info_window.active = false @info_window.visible = false @help_window.visible = false return end # C ?????????? if Input.trigger?(Input::C) # ?? SE ??? $game_system.se_play($data_system.decision_se) return end if Input.trigger?(Input::L) # ?? SE ??? $game_system.se_play($data_system.decision_se) loop_end = false while loop_end == false if @visible_index != 0 @visible_index -= 1 else @visible_index = @main_window.data.size - 1 end loop_end = true if @main_window.show?(@main_window.item_kind,@main_window.data[@visible_index]) end id = @main_window.data[@visible_index] @info_window.refresh(id, @main_window.item_kind, @main_window.item_index) return end if Input.trigger?(Input::R) # ?? SE ??? $game_system.se_play($data_system.decision_se) loop_end = false while loop_end == false if @visible_index != @main_window.data.size - 1 @visible_index += 1 else @visible_index = 0 end loop_end = true if @main_window.show?(@main_window.item_kind,@main_window.data[@visible_index]) end id = @main_window.data[@visible_index] @info_window.refresh(id, @main_window.item_kind, @main_window.item_index) return end end def draw_comp(category=nil) if SHOW_COMPLETE_TYPE != 0 if category == nil case SHOW_COMPLETE_TYPE when 1 s_now = $game_system.skill_book_now s_max = $game_system.skill_book_max text = s_now.to_s + "/" + s_max.to_s when 2 comp = $game_system.skill_book_complete_percentage text = comp.to_s + "%" when 3 s_now = $game_system.skill_book_now s_max = $game_system.skill_book_max comp = $game_system.skill_book_complete_percentage text = s_now.to_s + "/" + s_max.to_s + " " + comp.to_s + "%" end else case SHOW_COMPLETE_TYPE when 1 s_now = $game_system.skill_book_category_now(category) s_max = $game_system.skill_book_category_max(category) text = s_now.to_s + "/" + s_max.to_s when 2 comp = $game_system.skill_book_category_complete_percentage(category) text = comp.to_s + "%" when 3 s_now = $game_system.skill_book_category_now(category) s_max = $game_system.skill_book_category_max(category) comp = $game_system.skill_book_category_complete_percentage(category) text = s_now.to_s + "/" + s_max.to_s + " " + comp.to_s + "%" end end if text != nil @title_window.contents.draw_text(320, 0, 288, 32, text, 2) end end end end |
||||||||||||
| First off, go to your Database in your game after you get this script in and go to the system tab. In the bottom left hand corner in the element/attribute tab, add new slots. Now, the stuff in these lines: | ||||||||||||
| def initialize
# Name the skill categories. @skill_kind_name = ["Physical", "Elemental", "Non-Elemental", "Curative", "Status"] # Next is the menu setup. It's a vertical list. List the categories in any order you want. # Note: The categories below must coincide with the categories you listed above. @kind_row = ["Physical", "Elemental", "Non-Elemental", "Curative", "Status"] # Now write the element setups.You need to add elements in the Database (in the System Tab). For # example, if you want to use a "Physical" category, go make an element called "Physical" and # then apply it to all the skills you want them to appear under the Physical category! @skill_kind_element_name = ["Physical", "Elemental", "Curative", "Status", "Non-Elemental"] @skill_id_data = skill_book_id_set end |
||||||||||||
| Is what you put in those new elements/attributes you just made. Note that I have customized this to my needs, if you want to get rid of the stuff you dont want just delete all instances of each out of those lines above that are in the script. You new ones in the same way as well. Now, go to the skills tab, and go to the 'Fire' spell. Now, check the Elemental element/arrtibute to place this spell into the Elemental section of the skill book. Then just do the same for the rest of the skills by selecting to proper element/attribute for them. Now, to call this script from the main menu or from a call script, use this: | ||||||||||||
| $scene = Scene_SkillBook.new | ||||||||||||