Advertisement
leequangson

[VX/VXA] Resource Checker

Sep 28th, 2013
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 15.32 KB | None | 0 0
  1. =begin
  2. #==============================================================================
  3.  ** Resource Checker
  4.  Tác giả: Tsukihime
  5.  Lần cập nhật cuối: 2/8/2012
  6.  Dịch bởi: leequangson
  7.  Diễn đàn: taotrochoi.com
  8. ------------------------------------------------------------------------------  
  9.  Script này copy tất cả tài nguyên cần dùng từ RTP vào game của bạn, bao gồm
  10.  các file nhạc và hình.
  11.  
  12.  Ưu điểm: Giúp cho game của bạn có thể chơi mà không cần RTP
  13.  Nhược điểm: đếu có =))
  14.  
  15.  Hướng dẫn sử dụng: chạy game, ấn F5, xong!
  16. #==============================================================================
  17. =end
  18. $imported = {} if $imported.nil?
  19. $imported["Tsuki_Resource_Checker"] = true
  20. #==============================================================================
  21. # ** Configuration
  22. #==============================================================================
  23. module Tsuki
  24.   module Resource_Checker
  25.    
  26.     # Đây là link dẫn đến thư mục RTP (mặc định)
  27.     # Nếu bạn cài đặt RTP ở chỗ khác thì phải dẫn link đến chỗ đó
  28.     RTP_Directory = "C:/Program Files/Common Files/Enterbrain/RGSS3/RPGVXAce/"
  29.    
  30.     # true: tự động copy dữ liệu + tạo 1 danh sách dữ liệu
  31.     # false: chỉ tạo danh sách dữ liệu
  32.     Copy_Files_Over = true
  33.    
  34.     # Thay đổi phím copy dữ liệu, mặc định là F5
  35.     # Bạn có thể thay đổi nếu cần thiết: F6, F7, F8, ALT, CTRL
  36.     Check_Key = Input::F5
  37. #==============================================================================
  38. # ** Rest of the script
  39. #==============================================================================
  40.  
  41. # Bắt đầu từ dưới này, mình ko dịch gì hết. Các bạn cũng ko nên động vào.
  42.  
  43.     Graphics_Dirs = [:Animations, :Battlebacks1, :Battlebacks2, :Battlers,
  44.                      :Characters, :Faces, :Parallaxes, :Pictures, :System,
  45.                      :Tilesets, :Titles1, :Titles2]
  46.     Audio_Dirs = [:BGM, :BGS, :ME, :SE]
  47.     Font_Dirs = [:Fonts]
  48.    
  49.     # this is supposed to add some path checking...
  50.     def self.rtp_directory
  51.       RTP_Directory
  52.     end
  53.  
  54.     def self.rpgvxace?
  55.       defined? BasicObject
  56.     end
  57.    
  58.     def self.rpgvx?
  59.       defined? Graphics.resize_screen
  60.     end
  61.    
  62.     def self.show_message(message)
  63.       if rpgvxace?
  64.         $game_message.add(message)
  65.       elsif rpgvx?
  66.         $game_message.texts.push(message)
  67.       end
  68.     end
  69.    
  70.     def self.init_resource_finder
  71.       return Resource_Finder_Ace.new if rpgvxace?
  72.       return Resource_Finder_VX.new if rpgvx?
  73.     end
  74.   end
  75. end
  76.  
  77. # just add it somewhere
  78.  
  79. class Game_Player
  80.  
  81.   alias tsuki_Resource_Checker_update update
  82.   def update
  83.     tsuki_Resource_Checker_update
  84.     if Input.trigger?(Tsuki::Resource_Checker::Check_Key)
  85.       r = Tsuki::Resource_Checker.init_resource_finder
  86.       r.run
  87.     end
  88.   end
  89. end
  90. #~  
  91. # generic parser class. Subclasses should implement the methods if needed
  92. class Data_Parser
  93.  
  94.   def initialize
  95.     @data_animations = load_data_file("Animations")
  96.   end
  97.  
  98.   def make_data_path(filename)
  99.   end
  100.  
  101.   def load_data_file(filename)
  102.     path = make_data_path(filename)
  103.     return load_data(path)
  104.   end
  105.  
  106.   def parse_actors
  107.   end
  108.  
  109.   def parse_classes
  110.   end
  111.  
  112.   def parse_skills
  113.   end
  114.  
  115.   def parse_items
  116.   end
  117.  
  118.   def parse_weapons
  119.   end
  120.  
  121.   def parse_armors
  122.   end
  123.  
  124.   def parse_states
  125.   end
  126.  
  127.   def parse_enemies
  128.   end
  129.  
  130.   def parse_troops
  131.   end
  132.  
  133.   def parse_animations
  134.   end
  135.  
  136.   def parse_tilesets
  137.   end
  138.  
  139.   def parse_system
  140.   end
  141.  
  142.   def parse_fonts
  143.   end
  144.  
  145.   # takes a vehicle object stored in System.rvdata2
  146.   def parse_vehicle(vehicle)
  147.   end
  148.  
  149.   def parse_terms
  150.   end
  151.  
  152.   # map parsing
  153.  
  154.   def parse_datamaps
  155.   end
  156.  
  157.   # pass in a map ID
  158.   def parse_map(map_id)
  159.   end
  160.  
  161.   # takes an RPG::Map::Encounter object
  162.   def parse_encounters(encounters)
  163.   end
  164.  
  165.   # event parsers
  166.  
  167.   def parse_event_commands(list)
  168.   end
  169.  
  170.   def parse_event_page(page)
  171.   end
  172.  
  173.   def parse_event(event)
  174.   end
  175.  
  176.   def parse_map_events(events)
  177.   end
  178.  
  179.   def parse_common_events
  180.   end
  181.  
  182.   def parse_data_files
  183.     parse_actors
  184.     parse_classes
  185.     parse_skills
  186.     parse_items
  187.     parse_weapons
  188.     parse_armors
  189.     parse_enemies
  190.     parse_troops
  191.     parse_states
  192.     parse_animations
  193.     parse_tilesets
  194.     parse_common_events
  195.     parse_system
  196.     parse_terms
  197.     parse_datamaps
  198.     parse_fonts
  199.   end
  200. end
  201.  
  202. class Resource_Finder_Ace < Data_Parser
  203.  
  204.   attr_reader :resources
  205.  
  206.   def initialize
  207.     super
  208.     @resources = {}
  209.   end
  210.  
  211.   def make_data_path(filename)
  212.     "Data/#{filename}.rvdata2"
  213.   end
  214.  
  215.   def init_category(category)
  216.     @resources[category] = []
  217.   end
  218.  
  219.   def add_resource(category, name)
  220.     init_category(category) if @resources[category].nil?
  221.     return unless name && !name.empty?
  222.     @resources[category] |= [name]
  223.   end
  224.  
  225.   def parse_actors
  226.     actors = load_data_file("Actors")
  227.     actors.each {|actor|
  228.       next unless actor
  229.       add_resource(:Characters, actor.character_name)
  230.       add_resource(:Faces, actor.face_name)
  231.     }
  232.   end  
  233.  
  234.   def parse_enemies
  235.     enemies = load_data_file("Enemies")
  236.     enemies.each {|enemy|
  237.       next unless enemy
  238.       add_resource(:Battlers, enemy.battler_name)
  239.     }
  240.   end
  241.  
  242.   def parse_troops
  243.     troops = load_data_file("Troops")
  244.   end
  245.  
  246.   def parse_animations
  247.     anims = load_data_file("Animations")
  248.     anims.each {|anim|
  249.       next unless anim
  250.       add_resource(:Animations, anim.animation1_name)
  251.       add_resource(:Animations, anim.animation2_name)
  252.     }
  253.   end
  254.  
  255.   def parse_tilesets
  256.     tilesets = load_data_file("Tilesets")
  257.     tilesets.each {|tileset|
  258.       next unless tileset
  259.       tileset.tileset_names.each {|name|
  260.         add_resource(:Tilesets, name)
  261.       }
  262.     }
  263.   end
  264.  
  265.   def parse_common_events
  266.     events = load_data_file("CommonEvents")
  267.     events.each {|evt|
  268.       next unless evt
  269.       parse_command_list(evt.list)
  270.     }
  271.   end
  272.  
  273.   def parse_system
  274.     system = load_data_file("System")
  275.     add_resource(:BGM, system.title_bgm.name)
  276.     add_resource(:BGM, system.battle_bgm.name)
  277.     add_resource(:ME, system.battle_end_me.name)
  278.     add_resource(:ME, system.gameover_me.name)
  279.    
  280.     # add system sounds
  281.     system.sounds.each {|sound|
  282.       add_resource(:SE, sound.name)
  283.     }
  284.    
  285.     # test battle and editor related
  286.     add_resource(:Battlebacks1, system.battleback1_name)
  287.     add_resource(:Battlebacks2, system.battleback2_name)
  288.     add_resource(:Battlers, system.battler_name)    
  289.    
  290.     # vehicles
  291.     parse_vehicle(system.boat)
  292.     parse_vehicle(system.ship)
  293.     parse_vehicle(system.airship)
  294.    
  295.     # titles
  296.     add_resource(:Titles1, system.title1_name)
  297.     add_resource(:Titles2, system.title2_name)
  298.    
  299.     # some default stuff
  300.     add_resource(:System, "BattleStart")
  301.     add_resource(:System, "GameOver")
  302.     add_resource(:System, "IconSet")
  303.     add_resource(:System, "Shadow")
  304.     add_resource(:System, "Window")
  305.   end
  306.  
  307.   def parse_vehicle(vehicle)
  308.     add_resource(:Characters, vehicle.character_name)
  309.     add_resource(:BGM, vehicle.bgm.name)
  310.   end
  311.  
  312.   # just hardcoded...
  313.   def parse_fonts
  314.     add_resource(:Fonts, "VL-Gothic-Regular")
  315.     add_resource(:Fonts, "VL-PGothic-Regular")
  316.   end
  317.  
  318.   # map parser
  319.  
  320.   def parse_datamaps
  321.    
  322.     infos = load_data_file("MapInfos")
  323.     infos.each {|id, map|
  324.       next unless map
  325.       parse_map(id)
  326.     }
  327.   end
  328.  
  329.   def parse_map(map_id)
  330.     map = load_data_file(sprintf("Map%03d", map_id))
  331.     add_resource(:Parallaxes, map.parallax_name)
  332.     add_resource(:BGM, map.bgm.name)
  333.     add_resource(:BGS, map.bgs.name)
  334.     parse_map_events(map.events)
  335.   end
  336.  
  337.   # event parsing
  338.  
  339.   def check_event_resources(cmd)
  340.     code, params = cmd.code, cmd.parameters
  341.     case code
  342.     when 101 # show text
  343.       add_resource(:Faces, params[0]) # face name
  344.     when 212 # show animation
  345.     when 213 # show balloon
  346.       add_resource(:System, "Balloon")
  347.     when 231 # show picture
  348.       add_resource(:Pictures, params[1])
  349.     when 241 # play BGM
  350.       add_resource(:BGM, params[0].name)
  351.     when 245 # play BGS
  352.       add_resource(:BGS, params[0].name)
  353.     when 249 # play ME
  354.       add_resource(:ME, params[0].name)
  355.     when 250 # play SE
  356.       add_resource(:SE, params[0].name)
  357.     when 261 # play movie
  358.     when 282 # change tileset
  359.       tset_id = params[0]
  360.     when 284 # change parallax
  361.       add_resource(:Parallaxes, params[0])
  362.     when 322 # Change Actor Graphic
  363.       add_resource(:Characters, params[1])
  364.       add_resource(:Faces, params[3])
  365.     when 323 # Change Vehicle Graphic
  366.       add_resource(:Characters, params[1])
  367.     when 335 # Enemy appear
  368.     when 336 # Enemy transform
  369.     when 337 # Show battle animation
  370.       add_resource(:Animations, @data_animations[params[1]].name)
  371.     end
  372.   end
  373.  
  374.   def parse_command_list(list)
  375.     list.each {|cmd|
  376.       check_event_resources(cmd)
  377.     }
  378.   end
  379.  
  380.   def parse_event_page(page)
  381.    
  382.     add_resource(:Characters, page.graphic.character_name)
  383.     parse_command_list(page.list)
  384.   end
  385.  
  386.   def parse_event(event)
  387.     event.pages.each {|page|
  388.       parse_event_page(page)
  389.     }
  390.   end
  391.  
  392.   def parse_map_events(events)
  393.     events.each {|id, evt|
  394.       parse_event(evt)
  395.     }
  396.   end
  397.  
  398.   def run
  399.     parse_data_files
  400.     export
  401.   end
  402.  
  403.   def export
  404.     r = Resource_Exporter.new(@resources)
  405.     r.run
  406.   end
  407. end
  408.  
  409. # basically the same thing, except no tilesets and different system
  410. class Resource_Finder_VX < Resource_Finder_Ace
  411.  
  412.   def make_data_path(filename)
  413.     "Data/#{filename}.rvdata"
  414.   end
  415.  
  416.   def parse_tilesets
  417.     system = load_data_file("System")
  418.     add_resource(:System, "TileA1")
  419.     add_resource(:System, "TileA2")
  420.     add_resource(:System, "TileA3")
  421.     add_resource(:System, "TileA4")
  422.     add_resource(:System, "TileA5")
  423.     add_resource(:System, "TileB")
  424.     add_resource(:System, "TileC")
  425.     add_resource(:System, "TileD")
  426.     add_resource(:System, "TileE")
  427.   end
  428.  
  429.   def parse_system
  430.     system = load_data_file("System")
  431.     add_resource(:BGM, system.title_bgm.name)
  432.     add_resource(:BGM, system.battle_bgm.name)
  433.     add_resource(:ME, system.battle_end_me.name)
  434.     add_resource(:ME, system.gameover_me.name)
  435.    
  436.     # add system sounds
  437.     system.sounds.each {|sound|
  438.       add_resource(:SE, sound.name)
  439.     }
  440.    
  441.     # test battle and editor related
  442.     add_resource(:Battlers, system.battler_name)    
  443.    
  444.     # vehicles
  445.     parse_vehicle(system.boat)
  446.     parse_vehicle(system.ship)
  447.     parse_vehicle(system.airship)
  448.    
  449.     # titles
  450.     add_resource(:System, "Title")
  451.    
  452.     # some default stuff
  453.     add_resource(:System, "BattleStart")
  454.     add_resource(:System, "BattleFloor")
  455.     add_resource(:System, "MessageBack")
  456.     add_resource(:System, "GameOver")
  457.     add_resource(:System, "IconSet")
  458.     add_resource(:System, "Shadow")
  459.     add_resource(:System, "Window")
  460.   end
  461.  
  462.   def parse_fonts
  463.     add_resource(:Fonts, "umeplus-gothic")
  464.   end
  465. end
  466.  
  467. class Resource_Exporter
  468.  
  469.   def initialize(data)
  470.     @data = data
  471.     @outfile = nil
  472.   end
  473.  
  474.   def rtp_directory
  475.     Tsuki::Resource_Checker.rtp_directory
  476.   end
  477.  
  478.   def rtp_directory_valid?
  479.     return false unless File.directory?(rtp_directory)
  480.     return false unless File.directory?(rtp_directory + "Graphics")
  481.     return false unless File.directory?(rtp_directory + "Audio")
  482.     return false unless File.directory?(rtp_directory + "Fonts")
  483.     return true
  484.   end
  485.  
  486.   def create_outfile(name="resources.txt")
  487.     File.open(name, "w")
  488.   end
  489.  
  490.   def make_category_folder(category)
  491.     if Tsuki::Resource_Checker::Graphics_Dirs.include?(category)
  492.       name = "Graphics%s%s" %[File::Separator, category]
  493.     elsif Tsuki::Resource_Checker::Audio_Dirs.include?(category)
  494.       name = "Audio%s%s" %[File::Separator, category]
  495.     elsif Tsuki::Resource_Checker::Font_Dirs.include?(category)
  496.       return
  497.     end
  498.     Dir.mkdir(name) unless File.directory?(name)
  499.   end
  500.  
  501.   def make_out_name(folder, category, name)
  502.     matches = Dir::glob("#{rtp_directory}#{folder}/#{category}/#{name}.*")
  503.     unless matches.empty?
  504.       ext = matches[0].split("/")[-1].split(".")[-1]
  505.     else
  506.       Tsuki::Resource_Checker.show_message("%s was not found" %name)
  507.     end
  508.     return name + ".#{ext}"
  509.   end
  510.  
  511.   def make_path(category, name)    
  512.     outName = ""
  513.     if Tsuki::Resource_Checker::Graphics_Dirs.include?(category)
  514.       name = make_out_name("Graphics", category, name)
  515.       outName += sprintf("Graphics%s%s%s", File::Separator, category, File::Separator)
  516.     elsif Tsuki::Resource_Checker::Audio_Dirs.include?(category)
  517.       name = make_out_name("Audio", category, name)
  518.       outName += sprintf("Audio%s%s%s", File::Separator, category, File::Separator)
  519.     elsif Tsuki::Resource_Checker::Font_Dirs.include?(category)
  520.       name = make_out_name("", category, name)
  521.       outName += sprintf("Fonts%s", File::Separator)
  522.     end
  523.     return outName + name
  524.   end
  525.  
  526.   # just read/write
  527.   def copy_file(srcPath, destPath)
  528.     File.open(srcPath, 'rb') {|src_file|
  529.       File.open(destPath, 'wb') {|dest_file|
  530.         dest_file.write(src_file.read)
  531.       }
  532.     }
  533.   end
  534.  
  535.   def make_file(path)
  536.     begin
  537.       if FileTest.exist?(path)
  538.         # nothing. Don't clutter the console
  539.       elsif !FileTest.exist?(rtp_directory + path)
  540.         p "%s isn't an RTP file" %path
  541.       else
  542.         copy_file(rtp_directory + path, path)
  543.         #p "%s - copied successfully" %path
  544.       end
  545.     rescue
  546.       Tsuki::Resource_Checker.show_message("Something went wrong! Just be careful")
  547.     end
  548.   end
  549.  
  550.   def write_heading(name)
  551.     @outfile.puts("== %s == " %name)
  552.   end
  553.  
  554.   def write_data(category, list)
  555.     list.sort.each {|name|
  556.       path = make_path(category, name)
  557.       @outfile.puts(sprintf("%s", path))
  558.     }
  559.     @outfile.puts("\n")
  560.   end
  561.  
  562.   # write the log out
  563.   def export_log
  564.     @outfile = create_outfile
  565.     @data.each {|category, list|
  566.       write_heading(category)
  567.       write_data(category, list)
  568.     }
  569.     @outfile.close
  570.   end
  571.  
  572.   # lol inefficient but I like it separated
  573.   def copy_files
  574.    
  575.     t1 = Time.now
  576.     # check RTP folder exists
  577.     unless rtp_directory_valid?
  578.       Tsuki::Resource_Checker.show_message("Your RTP directory is invalid or inaccessible")
  579.       return
  580.     end
  581.     # basic folders
  582.     Dir.mkdir("Graphics") unless File.directory?("Graphics")
  583.     Dir.mkdir("Audio") unless File.directory?("Audio")
  584.     Dir.mkdir("Fonts") unless File.directory?("Fonts")
  585.     Dir.mkdir("Movies") unless File.directory?("Movies")
  586.     Dir.mkdir("System") unless File.directory?("System")
  587.    
  588.     @data.each {|category, list|
  589.       make_category_folder(category)
  590.       list.each { |name|
  591.         path = make_path(category, name)
  592.         make_file(path)
  593.       }
  594.     }
  595.     t2 = Time.now
  596.     Tsuki::Resource_Checker.show_message("File copy complete in %f seconds." %(t2 - t1))
  597.   end
  598.  
  599.   def run
  600.     export_log
  601.     copy_files if Tsuki::Resource_Checker::Copy_Files_Over
  602.   end
  603. end
  604.  
  605. class Game_Interpreter
  606.  
  607.   def build_resource_list
  608.     r = Tsuki::Resource_Checker.init_resource_finder
  609.     r.run
  610.   end
  611. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement