Advertisement
DarkSoul144

DSI Skill Menu

Oct 8th, 2023
1,248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 9.38 KB | None | 0 0
  1. #==============================================================================
  2. # * Script Name  : DSI Skill Menu
  3. # * Author       : Nhat Nguyen (dsiver144)
  4. # * Last Updated : 10/08/2023
  5. # ------------------------------------------------------------------------
  6. # Script call: SceneManager.call(Scene_CustomSkill)
  7. # Image Folder: Graphics/SkillMenu/
  8. #
  9. # Actor Notetag: <skill_pic: pictureName>
  10. # ex: <skill_pic: SMenu_Actor1>
  11. #
  12. #==============================================================================
  13. module DSIVER144
  14.   module SKILL_MENU
  15.    
  16.     CATEGORIES = {}
  17.     CATEGORIES[0] = ["Skill_Category_1", "Skill_CategorySelected_1"]
  18.     CATEGORIES[1] = ["Skill_Category_2", "Skill_CategorySelected_2"]
  19.     CATEGORIES[2] = ["Skill_Category_3", "Skill_CategorySelected_3"]
  20.    
  21.     HIGHLIGHT_IMG = "Skill_Category_Highlight"
  22.    
  23.     BLUE_COLOR = Color.new(0, 255, 251)
  24.    
  25.     BACKGROUNG_IMG = "Background"
  26.     HELP_WINDOW_IMG = "Help Window"
  27.     SKILL_WINDOW_IMG = "Skill Window"
  28.     TOP_BAR_IMG = "Top Bar"
  29.    
  30.     CATEGORY_HELP_TEXT = "Choose a category"
  31.    
  32.     OVERWRITE_MENU_SCENE_ABILITY_COMMAND = true
  33.    
  34.     ACTOR_WINDOW_OPACITY = 255
  35.     ACTOR_WINDOW_BACKOPACITY = 255
  36.    
  37.   end
  38. end
  39.  
  40. module Cache
  41.  
  42.   def self.loadSkillMenu(filename)
  43.     load_bitmap("Graphics/SkillMenu/", filename)
  44.   end
  45. end
  46.  
  47. class Sprite_SkillCategory < Sprite
  48.   attr_accessor :filenames
  49.   attr_accessor :index
  50.   attr_accessor :selector_sprite
  51.  
  52.   def refresh(index)
  53.     self.bitmap = Cache.loadSkillMenu(self.filenames[self.index == index ? 1 : 0])
  54.     if self.index == index
  55.       @selector_sprite.x = 15 + index * 90
  56.     end
  57.   end
  58.  
  59. end
  60.  
  61. class Window_CustomSkillStatus < Window_Base
  62.   include DSIVER144::SKILL_MENU
  63.   def actor=(actor)
  64.     @actor = actor
  65.     refresh
  66.   end
  67.  
  68.   def refresh
  69.     return if !@actor
  70.     contents.clear
  71.     draw_actor_face(@actor, 0, 0)
  72.     cw = contents_width
  73.     ch = contents_height
  74.     lh = line_height
  75.     dx = 96 + 10
  76.     dy = 12
  77.     contents.font.size = 21
  78.     contents.font.name = "Timeless-Normal"
  79.     draw_text(dx, dy, cw - dx, lh, @actor.name)
  80.     dy += lh
  81.     contents.font.size = 17
  82.     change_color(BLUE_COLOR)
  83.     draw_text(dx, dy, cw - dx, lh, "Level")
  84.     change_color(normal_color)
  85.     s1 = @actor.max_level? ? "---" : @actor.exp
  86.     s2 = @actor.max_level? ? "---" : @actor.next_level_exp - @actor.exp
  87.     draw_text(dx + 50, dy, cw - dx, lh, "#{@actor.level} / #{@actor.max_level}")
  88.    
  89.     dy += lh
  90.     contents.font.size = 17
  91.     change_color(BLUE_COLOR)
  92.     draw_text(dx, dy, cw - dx, lh, "VIT")
  93.     change_color(normal_color)
  94.     draw_text(dx, dy, cw - dx - 4, lh, "#{@actor.hp} / #{@actor.mhp}", 2)
  95.    
  96.     dy += 16
  97.     contents.font.size = 17
  98.     change_color(BLUE_COLOR)
  99.     draw_text(dx, dy, cw - dx, lh, "EGO")
  100.     change_color(normal_color)
  101.     draw_text(dx, dy, cw - dx - 4, lh, "#{@actor.mp} / #{@actor.mmp}", 2)
  102.   end
  103.  
  104. end
  105.  
  106. class Window_CustomSkillActorWindow < Window_MenuActor
  107.  
  108.   def window_width
  109.     354
  110.   end
  111.  
  112.   def draw_actor_simple_status(actor, x, y)
  113.     draw_actor_name(actor, x, y)
  114.     draw_actor_level(actor, x, y + line_height * 1)
  115.     draw_actor_icons(actor, x, y + line_height * 2)
  116.     draw_actor_class(actor, x + 120, y)
  117.     draw_actor_hp(actor, x + 90, y + line_height * 1)
  118.     draw_actor_mp(actor, x + 90, y + line_height * 2)
  119.   end
  120.  
  121. end
  122.  
  123. class Window_CustomHelp < Window_Help
  124.   include DSIVER144::SKILL_MENU
  125.  
  126.   def set_item(item)
  127.     change_color(normal_color)
  128.     contents.font.name = "Timeless-Normal"
  129.     set_text(item ? "\\i[#{item.icon_index}] #{item.name}\n"+ item.description : "")
  130.   end
  131.  
  132. end
  133.  
  134. class Scene_CustomSkill < Scene_ItemBase
  135.  
  136.   include DSIVER144::SKILL_MENU
  137.  
  138.   def start
  139.     super
  140.     create_help_window
  141.     create_skill_category
  142.     create_category_sprites
  143.     create_item_window
  144.     create_status_window
  145.     refresh_actor_sprite
  146.   end
  147.  
  148.   def create_help_window
  149.     @help_window = Window_CustomHelp.new(3)
  150.     @help_window.viewport = @viewport
  151.     @help_window.y = Graphics.height - @help_window.height
  152.     @help_window.opacity = 0
  153.     @help_window.back_opacity = 0
  154.     @help_window.set_text(CATEGORY_HELP_TEXT)
  155.   end
  156.  
  157.   def create_actor_window
  158.     @actor_window = Window_CustomSkillActorWindow.new
  159.     @actor_window.set_handler(:ok,     method(:on_actor_ok))
  160.     @actor_window.set_handler(:cancel, method(:on_actor_cancel))
  161.     @actor_window.opacity = ACTOR_WINDOW_OPACITY
  162.     @actor_window.back_opacity = ACTOR_WINDOW_BACKOPACITY
  163.   end
  164.  
  165.   def create_background
  166.     @background_sprite = Sprite.new
  167.     @background_sprite.bitmap = Cache.loadSkillMenu(BACKGROUNG_IMG)
  168.    
  169.     @topbar_sprite = Sprite.new
  170.     @topbar_sprite.bitmap = Cache.loadSkillMenu(TOP_BAR_IMG)
  171.    
  172.     @actor_sprite = Sprite.new
  173.    
  174.     @help_sprite = Sprite.new
  175.     @help_sprite.bitmap = Cache.loadSkillMenu(HELP_WINDOW_IMG)
  176.   end
  177.  
  178.   def refresh_actor_sprite
  179.     return unless @actor
  180.     data_actor = $data_actors[@actor.id]
  181.     if data_actor.note =~ /<skill_pic:\s*(.+?)>/i
  182.       @actor_sprite.bitmap = Cache.loadSkillMenu($1)
  183.     else
  184.       @actor_sprite.bitmap = nil
  185.     end
  186.   end
  187.  
  188.   def create_skill_category
  189.     @command_window = Window_HorizontalSkillCommand.new(0, 0)
  190.     @command_window.actor = $game_party.leader
  191.     @command_window.opacity = 0
  192.     @command_window.back_opacity = 0
  193.     @command_window.visible = false
  194.     @command_window.set_handler(:skill,    method(:command_skill))
  195.     @command_window.set_handler(:cancel,   method(:return_scene))
  196.     @command_window.set_handler(:pagedown, method(:next_actor))
  197.     @command_window.set_handler(:pageup,   method(:prev_actor))
  198.   end
  199.  
  200.   def create_category_sprites
  201.     sprites = []
  202.     @sprite_category_selector = Sprite.new
  203.     @sprite_category_selector.bitmap = Cache.loadSkillMenu(HIGHLIGHT_IMG)
  204.     @sprite_category_selector.y = 148
  205.    
  206.     CATEGORIES.each_pair do |id, data|
  207.       sprite = Sprite_SkillCategory.new
  208.       sprite.selector_sprite = @sprite_category_selector
  209.       sprite.filenames = data
  210.       sprite.bitmap = Cache.loadSkillMenu(sprite.filenames[0])
  211.       sprite.index = id
  212.       sprite.x = 20 + id * 90
  213.       sprite.y = 155
  214.       sprites << sprite
  215.     end
  216.    
  217.     @command_window.category_sprites = sprites
  218.     @command_window.call_update_help
  219.   end
  220.  
  221.   def terminate
  222.     super
  223.     dispose_custom_sprites
  224.   end
  225.  
  226.   def dispose_custom_sprites
  227.     @command_window.category_sprites.each {|sprite| sprite.dispose}
  228.     @sprite_category_selector.dispose
  229.     @sprite_window_bg.dispose
  230.     @topbar_sprite.dispose
  231.     @actor_sprite.dispose
  232.     @help_sprite.dispose
  233.   end
  234.  
  235.   def create_item_window
  236.     wx = 10
  237.     wy = 167
  238.     ww = 272
  239.     wh = 215
  240.     @sprite_window_bg = Sprite.new()
  241.     @sprite_window_bg.bitmap = Cache.loadSkillMenu(SKILL_WINDOW_IMG)
  242.     @sprite_window_bg.x = 0
  243.     @sprite_window_bg.y = 0
  244.    
  245.     @item_window = Window_SkillList.new(wx, wy, ww, wh)
  246.     @item_window.actor = @actor
  247.     @item_window.viewport = @viewport
  248.     @item_window.help_window = @help_window
  249.     @item_window.set_handler(:ok,     method(:on_item_ok))
  250.     @item_window.set_handler(:cancel, method(:on_item_cancel))
  251.     @command_window.skill_window = @item_window
  252.     @item_window.help_window = @help_window
  253.     @item_window.opacity = 0
  254.     @item_window.back_opacity = 0
  255.   end
  256.  
  257.   def create_status_window
  258.     @status_window = Window_CustomSkillStatus.new(0, 0, 300, 120)
  259.     @status_window.opacity = 0
  260.     @status_window.back_opacity = 0
  261.     @status_window.actor = @actor
  262.     @status_window.x = -2
  263.     @status_window.y = 30
  264.   end
  265.  
  266.   def user
  267.     @actor
  268.   end
  269.  
  270.   def command_skill
  271.     @item_window.activate
  272.     @item_window.select_last
  273.     Sound.play_recovery
  274.   end
  275.  
  276.   def on_item_ok
  277.     @actor.last_skill.object = item
  278.     determine_item
  279.   end
  280.  
  281.   def on_item_cancel
  282.     @item_window.unselect
  283.     @command_window.activate
  284.     @help_window.set_text(CATEGORY_HELP_TEXT)
  285.   end
  286.  
  287.   def play_se_for_item
  288.     Sound.play_use_skill
  289.   end
  290.  
  291.   def use_item
  292.     super
  293.     @status_window.refresh
  294.     @item_window.refresh
  295.   end
  296.  
  297.   def on_actor_change
  298.     @command_window.actor = @actor
  299.     @status_window.actor = @actor
  300.     @item_window.actor = @actor
  301.     @command_window.activate
  302.     refresh_actor_sprite
  303.     Sound.play_use_item
  304.   end
  305.  
  306. end
  307.  
  308. class Window_HorizontalSkillCommand < Window_HorzCommand
  309.   attr_accessor :category_sprites
  310.  
  311.   def call_update_help
  312.     super
  313.     @category_sprites && category_sprites.each {|sprite| sprite.refresh(self.index)}
  314.   end
  315.  
  316.   attr_reader   :skill_window
  317.  
  318.   def initialize(x, y)
  319.     super(x, y)
  320.     @actor = nil
  321.   end
  322.  
  323.   def window_width
  324.     return 160
  325.   end
  326.  
  327.   def actor=(actor)
  328.     return if @actor == actor
  329.     @actor = actor
  330.     refresh
  331.     select_last
  332.   end
  333.  
  334.   def col_max
  335.     return DSIVER144::SKILL_MENU::CATEGORIES.keys.size
  336.   end
  337.  
  338.   def make_command_list
  339.     return unless @actor
  340.     @actor.added_skill_types.sort.each do |stype_id|
  341.       name = $data_system.skill_types[stype_id]
  342.       add_command(name, :skill, true, stype_id)
  343.     end
  344.   end
  345.  
  346.   def update
  347.     super
  348.     @skill_window.stype_id = current_ext if @skill_window
  349.   end
  350.  
  351.   def skill_window=(skill_window)
  352.     @skill_window = skill_window
  353.     update
  354.   end
  355.  
  356.   def select_last
  357.     skill = @actor.last_skill.object
  358.     if skill
  359.       select_ext(skill.stype_id)
  360.     else
  361.       select(0)
  362.     end
  363.   end
  364. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement