Advertisement
Guest User

MBS - DLC

a guest
Jun 30th, 2015
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 20.83 KB | None | 0 0
  1. #==============================================================================
  2. # MBS - DLC
  3. #------------------------------------------------------------------------------
  4. # por Masked
  5. #==============================================================================
  6. #==============================================================================
  7. # Instruções
  8. #------------------------------------------------------------------------------
  9. # Criando o projeto:
  10. #------------------------------------------------------------------------------
  11. #    Para criar uma DLC, primeiro crie um novo projeto no RPG Maker e faça tudo
  12. #  normalmente, não é preciso colocar no projeto da DLC o conteúdo já existente
  13. #  na versão original do jogo, e lembre-se de criar as coisas no database com o
  14. #  ID a partir do último ID já usado no jogo.
  15. #
  16. #    Por questão de segurança, deixe, na versão original do jogo, todos os
  17. #  primeiros espaços do database vazios.
  18. #
  19. #  (OBS.: Para fazer os mapas, recomendo que os faça no projeto original e
  20. #  depois passe tudo que foi criado ou alterado para o projeto da DLC, assim
  21. #  o ID do mapa não fica igual ao de outro mapa)
  22. #
  23. #    Lembre-se também que, exceto os mapas, todos os elementos da DLC são
  24. #  "somados" aos originais.
  25. #    No caso dos mapas, todo mapa que existir na DLC vai substituir qualquer
  26. #  mapa que tenha o mesmo ID.
  27. #
  28. #------------------------------------------------------------------------------
  29. # Exportando a DLC:
  30. #------------------------------------------------------------------------------
  31. #    Para exportar a DLC, coloque num script acima do main:
  32. #      MBS::DLC.export(nome, itens_exportados, encriptar, chave)
  33. #    
  34. #    Nesse caso, nome deve ser o nome do arquivo da DLC a ser criada, e deve
  35. #  vir entre aspas, e itens exportados deve ser uma Array com a lista de itens
  36. #  que a DLC vai ter, existem algumas listas prontas que podem ser usadas,
  37. #  elas são:
  38. #
  39. #    - MBS::DLC::ALL       = Exporta tudo que for possível
  40. #
  41. #    - MBS::DLC::ALL_DATA  = Exporta tudo exceto as pastas Graphics e Audio
  42. #
  43. #    - MBS::DLC::MAPS      = Exporta todos os mapas, dados dos mapas,
  44. #                            tilesets e eventos comuns
  45. #
  46. #    - MBS::DLC::BATTLERS  = Exporta heróis, habilidades, animações, inimigos,
  47. #                            tropas, estados, classes, itens, armas e armaduras
  48. #
  49. #    - MBS::DLC::ITEMS     = Exporta itens, armas e armaduras
  50. #
  51. #    - MBS::DLC::USABLE    = Exporta itens e habilidades
  52. #
  53. #    - MBS::DLC::RESOURCES = Exporta gráficos, audio e scripts
  54. #
  55. #    Além dessas listas pré-definidas, podem ser feitas outras listas, usando
  56. #   para isso os seguintes itens precedidos por : (dois pontos):
  57. #
  58. #    - maps
  59. #    - tilesets
  60. #    - c_events
  61. #    - map_data
  62. #    - items
  63. #    - weapons
  64. #    - armors
  65. #    - skills
  66. #    - actors
  67. #    - classes
  68. #    - enemies
  69. #    - troops
  70. #    - states
  71. #    - animations
  72. #    - system
  73. #    - scripts
  74. #    - graphics
  75. #    - audio
  76. #
  77. # 'Encriptar' deve ser true, para encriptar, e false, para não encriptar, a
  78. # encriptação exige o script MS - Crypt no projeto.
  79. # A chave pode ser um texto ou um número.
  80. #------------------------------------------------------------------------------
  81. #   Ex.:
  82. #------------------------------------------------------------------------------
  83. #
  84. #  # exporta tudo, encriptando com a senha 'maçã'
  85. #  MBS::DLC.export('dlc1', MBS::DLC::ALL, true, 'maçã')
  86. #
  87. #  # exporta itens, animações, estados e scripts encriptando com a senha 123345
  88. #  MBS::DLC.save('dlc2', [:items, :animations, :states, :scripts], true, 12345)
  89. #
  90. #------------------------------------------------------------------------------
  91. # Colocando a DLC no jogo
  92. #------------------------------------------------------------------------------
  93. #   Para colocar a DLC no jogo, é só copiar o arquivo que aparece depois de
  94. # exportar a DLC (algumacoisa.rvdlc2) na pasta do jogo, com isso, o script
  95. # carrega os dados do arquivo junto com o resto.
  96. #   Caso queira importar todas as DLCs disponíveis automaticamente, coloque
  97. # num script acima do main:
  98. #
  99. # MBS::DLC.import_all(encriptar, chave)
  100. #
  101. # Trocando encriptar por true (caso as DLCs estejam encriptadas) ou por false
  102. # (caso não) e chave pela chave de encriptação usada nas DLCs (pode ser um
  103. # texto entre aspas ou um número)
  104. #
  105. # Para importar uma DLC separadamente:
  106. # MBS::DLC.import(nome, encriptar, chave)
  107. #
  108. # Trocando nome pelo nome do arquivo sem a extensão e encritar e chave como no
  109. # import_all
  110. #==============================================================================
  111. ($imported ||= {})[:mbs_dlc] = true
  112. #==============================================================================
  113. # >> MBS
  114. #------------------------------------------------------------------------------
  115. # Este é o módulo básico dos scripts MS/MBS
  116. #==============================================================================
  117. module MBS
  118.   #============================================================================
  119.   # >> DLC
  120.   #----------------------------------------------------------------------------
  121.   # Este é o módulo de importação e exportação da DLC
  122.   #============================================================================
  123.   module DLC
  124.     #==========================================================================
  125.     # Configurações
  126.     #==========================================================================
  127.    
  128.     # Extensão do arquivo de DLC
  129.     EXTENSION = 'rvdlc2'
  130.    
  131.     # Opção padrão para encriptar ou não os arquivos de DLC
  132.     ENCRYPT = false
  133.    
  134.     # Chave de encriptação padrão
  135.     CRYPT = ''
  136.    
  137.     #==========================================================================
  138.     # Fim das configurações
  139.     #==========================================================================
  140.    
  141.     # Variável com os dados das DLCs
  142.     @@data = {}
  143.    
  144.     #==========================================================================
  145.     # << @@data
  146.     #--------------------------------------------------------------------------
  147.     # Esta é a classe singleton da variável @@data
  148.     #==========================================================================
  149.     class << @@data
  150.       #------------------------------------------------------------------------
  151.       # * Aquisição do valor em um índice
  152.       #------------------------------------------------------------------------
  153.       def [](index)
  154.         if index.nil?
  155.           return values.inject({}) do |r, v|
  156.             r.merge(v)
  157.           end
  158.         else
  159.           return super(index)
  160.         end
  161.       end
  162.     end
  163.    
  164.     #--------------------------------------------------------------------------
  165.     # * Aquisição dos dados de uma DLC
  166.     #--------------------------------------------------------------------------
  167.     def self.data(dlc)
  168.       @@data[dlc] || {}
  169.     end
  170.    
  171.     #==========================================================================
  172.     # ** DLCExportError
  173.     #--------------------------------------------------------------------------
  174.     # Esta é a classe dos erros no salvamento das DLCs
  175.     #==========================================================================
  176.     class DLCExportError < RuntimeError
  177.       #------------------------------------------------------------------------
  178.       # * Inicialização do objeto
  179.       #------------------------------------------------------------------------
  180.       def initialize(dlcname, parenterror)
  181.         super("Erro ao exportar DLC '#{dlcname}' (#{parenterror.class})")
  182.       end
  183.     end
  184.    
  185.     #==========================================================================
  186.     # ** DLCLoadError
  187.     #--------------------------------------------------------------------------
  188.     # Esta é a classe dos erros no carregamento das DLCs
  189.     #==========================================================================
  190.     class DLCLoadError < RuntimeError
  191.       #------------------------------------------------------------------------
  192.       # * Inicialização do objeto
  193.       #------------------------------------------------------------------------
  194.       def initialize(dlcname, parenterror)
  195.         super("Erro ao carregar DLC '#{dlcname}' (#{parenterror.class})")
  196.       end
  197.     end
  198.    
  199.     #==========================================================================
  200.     # ** DLCCryptError
  201.     #--------------------------------------------------------------------------
  202.     # Esta é a classe dos erros com a encriptação das DLCs
  203.     #==========================================================================
  204.     class DLCCryptError < RuntimeError
  205.       #------------------------------------------------------------------------
  206.       # * Inicialização do objeto
  207.       #------------------------------------------------------------------------
  208.       def initialize
  209.         super("O script MBS - DLC requer o script MS - Crypt para " +
  210.               "encriptar os arquivos de DLC")
  211.       end
  212.     end
  213.    
  214.     #--------------------------------------------------------------------------
  215.     # Constantes
  216.     #--------------------------------------------------------------------------
  217.    
  218.     # Todos os componentes possíveis para a DLC
  219.     ALL = [
  220.             :maps,      :c_events,   :actors,    :classes,  :items,  
  221.             :weapons,   :armors,     :skills,    :enemies,  :troops,  
  222.             :states,    :animations, :tilesets,  :system,   :graphics,  
  223.             :audio,     :scripts,    :map_info
  224.           ]
  225.          
  226.     # Todos os componentes da DLC relacionados a dados
  227.     ALL_DATA = ALL - [:audio, :graphics]
  228.    
  229.     # Todos os componentes da DLC relacionados a itens
  230.     ITEMS = [:items, :weapons, :armors]
  231.    
  232.     # Todos os components da DLC relacionados à batalha
  233.     BATTLERS = [:actors, :classes, :skills,     :armors, :weapons, :enemies,
  234.                 :troops, :states,  :animations, :items]
  235.                
  236.     # Todos os componentes da DLC relacionados a itens usáveis
  237.     USABLE = [:skills, :items]
  238.    
  239.     # Todos os componentes da DLC relacionados aos mapas
  240.     MAPS = [:maps, :c_events, :tilesets, :map_info]
  241.    
  242.     # Todos os componentes da DLC relacionados aos recursos
  243.     RESOURCES = [:graphics, :audio, :scripts]
  244.    
  245.     # Tabela associativa dos símbolos dos componentes com seus respectivos
  246.     # arquivos/pastas
  247.     FILES = {
  248.       maps:       'Data/Map%03d.rvdata2',
  249.       c_events:   'Data/CommonEvents.rvdata2',
  250.       actors:     'Data/Actors.rvdata2',
  251.       classes:    'Data/Classes.rvdata2',
  252.       items:      'Data/Items.rvdata2',
  253.       weapons:    'Data/Weapons.rvdata2',
  254.       armors:     'Data/Armors.rvdata2',
  255.       skills:     'Data/Skills.rvdata2',
  256.       enemies:    'Data/Enemies.rvdata2',
  257.       troops:     'Data/Troops.rvdata2',
  258.       states:     'Data/States.rvdata2',
  259.       animations: 'Data/Animations.rvdata2',
  260.       tilesets:   'Data/Tilesets.rvdata2',
  261.       system:     'Data/System.rvdata2',
  262.       graphics:   'Graphics',
  263.       audio:      'Audio',
  264.       scripts:    'Data/Scripts.rvdata2',
  265.       map_info:   'Data/MapInfos.rvdata2'
  266.     }
  267.    
  268.     #--------------------------------------------------------------------------
  269.     # * Exportação de uma DLC
  270.     #--------------------------------------------------------------------------
  271.     def self.export(name, content=ALL, encrypt=ENCRYPT, crypt=CRYPT)
  272.       pack(name, content)
  273.       if encrypt
  274.         raise(MBSCryptError.new) unless $imported[:mbs_crypt]
  275.         MBS::Crypt.encrypt_file(name + '.' + EXTENSION, crypt)
  276.       end
  277.     end
  278.    
  279.     #--------------------------------------------------------------------------
  280.     # * Importação de uma DLC
  281.     #--------------------------------------------------------------------------
  282.     def self.import(name, encrypted=ENCRYPT, crypt=CRYPT)
  283.       return unless FileTest.file?(name + '.' + EXTENSION)
  284.       begin
  285.         content = File.open(name + '.' + EXTENSION, 'rb') do |f|
  286.           c = f.read
  287.           if encrypted
  288.             raise(MBSCryptError.new) unless $imported[:mbs_crypt]
  289.             c = Zlib::Inflate.inflate(MBS::Crypt.decrypt(c, crypt))
  290.           end
  291.           Zlib::Inflate.inflate(c)
  292.         end
  293.         @@data[name] = Marshal.load(content)
  294.       rescue
  295.         raise DLCLoadError.new(name, $!)
  296.       end
  297.     end
  298.    
  299.     #--------------------------------------------------------------------------
  300.     # * Importação de todas as DLCs possíveis
  301.     #--------------------------------------------------------------------------
  302.     def self.import_all(encrypted=ENCRYPT, crypt=CRYPT)
  303.       (Dir.entries('.') - ['.', '..']).collect do |entry|
  304.         entry =~ /(.*)\.#{EXTENSION}/
  305.         $1
  306.       end.compact.each do |dlc|
  307.         import(dlc, encrypted, crypt)
  308.       end
  309.     end
  310.    
  311.     #--------------------------------------------------------------------------
  312.     # * Empacotamento dos arquivos da DLC
  313.     #--------------------------------------------------------------------------
  314.     def self.pack(name, content)
  315.       hash = {}
  316.       content.each do |symbol|
  317.         case symbol
  318.         when :maps
  319.           hash[symbol] = []
  320.           Dir.entries('Data').select do |e|
  321.             e =~ /^Map(\d+)\.rvdata2$/
  322.           end.size.times do |i|
  323.             hash[symbol][i] = load_data(sprintf(FILES[symbol], i + 1))
  324.           end
  325.         when :graphics, :audio
  326.           hash[symbol] = {}
  327.           entries = get_entries(FILES[symbol])
  328.           entries.each do |filename|
  329.             File.open(FILES[symbol] + '/' + filename, 'rb') do |file|
  330.               index = filename.split('.')[0...-1].inject('') {|r, v| r + v}
  331.               hash[symbol][index] = Zlib::Deflate.deflate(file.read)
  332.             end
  333.           end
  334.         else
  335.           hash[symbol] = load_data(FILES[symbol])
  336.         end
  337.       end
  338.       File.open(name + '.' + EXTENSION, 'wb') do |file|
  339.         file.write(Zlib::Deflate.deflate(Marshal.dump(hash)))
  340.       end
  341.     end
  342.     private_class_method :pack
  343.    
  344.     #--------------------------------------------------------------------------
  345.     # * Aquisição da lista de arquivos em uma pasta e suas subpastas
  346.     #--------------------------------------------------------------------------
  347.     def self.get_entries(foldername)
  348.       return (Dir.entries(foldername) - ['.', '..']).inject([]) do |r, v|
  349.         if FileTest.file?(foldername + '/' + v)
  350.           r << v
  351.         elsif FileTest.directory?(foldername + '/' + v)
  352.           r += get_entries(foldername + '/' + v).collect {|f| v + '/' + f}
  353.         end
  354.         r
  355.       end
  356.     end
  357.     private_class_method :get_entries
  358.    
  359.     #--------------------------------------------------------------------------
  360.     # * Carregamento de um arquivo da DLC
  361.     #--------------------------------------------------------------------------
  362.     def self.load(file, dlc=nil)
  363.       if FILES.values.include?(file)
  364.         @@data[dlc][FILES.keys[FILES.values.index(file)]]
  365.       elsif file =~ /^Data\/Map(\d+)\.rvdata2$/
  366.         @@data[dlc][:maps][$1.to_i-1]
  367.       elsif file =~ /^(Graphics|Audio)\/(.*)/
  368.         Zlib::Inflate.inflate(@@data[dlc][$1.downcase.to_sym][$2])
  369.       else
  370.         return false
  371.       end
  372.     end
  373.    
  374.     #--------------------------------------------------------------------------
  375.     # * Carregamento de um Bitmap da DLC
  376.     #--------------------------------------------------------------------------
  377.     def self.load_bitmap(file, dlc=nil)
  378.       rnd = rand(0xFFFFFFFFFFFFFFFF).to_s(16)
  379.       File.open(rnd, 'wb') do |f|
  380.         f.write(load(file, dlc))
  381.       end
  382.       begin
  383.         b = Bitmap.new(rnd)
  384.       ensure
  385.         File.delete(rnd)
  386.       end
  387.       return b
  388.     end
  389.    
  390.     #--------------------------------------------------------------------------
  391.     # * Execução de uma BGM
  392.     #--------------------------------------------------------------------------
  393.     def self.play_bgm(file, dlc=nil, vol=100, pitch=100, pos=0)
  394.       return if RPG::BGM.last.name == file
  395.       File.open(file, 'wb') do |f|
  396.         f.write(load(file, dlc))
  397.       end
  398.       Audio.bgm_play(file, vol, pitch, pos)
  399.     end
  400.    
  401.     #--------------------------------------------------------------------------
  402.     # * Execução de uma BGS
  403.     #--------------------------------------------------------------------------
  404.     def self.play_bgs(file, dlc=nil, vol=100, pitch=100, pos=0)
  405.       return if RPG::BGS.last.name == file
  406.       File.open(file, 'wb') do |f|
  407.         f.write(load(file, dlc))
  408.       end
  409.       Audio.bgs_play(file, vol, pitch, pos)
  410.     end
  411.    
  412.     #--------------------------------------------------------------------------
  413.     # * Execução de uma ME
  414.     #--------------------------------------------------------------------------
  415.     def self.play_me(file, dlc=nil, vol=100, pitch=100)
  416.       unless FileTest.file?(file)
  417.         File.open(file, 'wb') do |f|
  418.           f.write(load(file, dlc))
  419.         end
  420.       end
  421.       Audio.me_play(file, vol, pitch)
  422.     end
  423.    
  424.     #--------------------------------------------------------------------------
  425.     # * Execução de uma SE
  426.     #--------------------------------------------------------------------------
  427.     def self.play_se(file, dlc=nil, vol=100, pitch=100)
  428.       unless FileTest.file?(file)
  429.         File.open(file, 'wb') do |f|
  430.           f.write(load(file, dlc))
  431.         end
  432.       end
  433.       Audio.se_play(file, vol, pitch)
  434.     end
  435.   end
  436. end
  437.  
  438. #==============================================================================
  439. # >> Audio
  440. #------------------------------------------------------------------------------
  441. # Este é o módulo responsável pelo áudio do jogo
  442. #==============================================================================
  443. module Audio
  444.   #----------------------------------------------------------------------------
  445.   # Alias
  446.   #----------------------------------------------------------------------------
  447.   class << self
  448.     alias mbsplbgm bgm_play
  449.     alias mbsplbgs bgs_play
  450.     alias mbsplme  me_play
  451.     alias mbsplse  se_play
  452.   end
  453.  
  454.   #----------------------------------------------------------------------------
  455.   # * Tocamento de uma BGM
  456.   #----------------------------------------------------------------------------
  457.   def self.bgm_play(*args, &block)
  458.     bgm_play(*args, &block) rescue MBS::DLC.play_bgm(*args)
  459.   end
  460.  
  461.   #----------------------------------------------------------------------------
  462.   # * Tocamento de uma BGS
  463.   #----------------------------------------------------------------------------
  464.   def self.bgm_play(*args, &block)
  465.     bgs_play(*args, &block) rescue MBS::DLC.play_bgs(*args)
  466.   end
  467.  
  468.   #----------------------------------------------------------------------------
  469.   # * Tocamento de uma ME
  470.   #----------------------------------------------------------------------------
  471.   def self.bgm_play(*args, &block)
  472.     me_play(*args, &block) rescue MBS::DLC.play_me(*args)
  473.   end
  474.  
  475.   #----------------------------------------------------------------------------
  476.   # * Tocamento de uma SE
  477.   #----------------------------------------------------------------------------
  478.   def self.bgm_play(*args, &block)
  479.     se_play(*args, &block) rescue MBS::DLC.play_se(*args)
  480.   end
  481. end
  482.  
  483. #==============================================================================
  484. # ** Bitmap
  485. #------------------------------------------------------------------------------
  486. # Esta é a classe dos bitmaps
  487. #==============================================================================
  488. class Bitmap
  489.  
  490.   #----------------------------------------------------------------------------
  491.   # Alias
  492.   #----------------------------------------------------------------------------
  493.   class << self
  494.     alias mbsbmpnew new
  495.   end
  496.  
  497.   #----------------------------------------------------------------------------
  498.   # * Criação de um novo objeto Bitmap
  499.   #----------------------------------------------------------------------------
  500.   def self.new(*args, &block)
  501.     mbsbmpnew(*args, &block) rescue MBS::DLC.load_bitmap(*args)
  502.   end
  503. end
  504.  
  505. #==============================================================================
  506. # >> Built-in
  507. #------------------------------------------------------------------------------
  508. # Estes são os valores/métodos que podem ser usados de qualquer lugar
  509. #==============================================================================
  510. #------------------------------------------------------------------------------
  511. # Alias
  512. #------------------------------------------------------------------------------
  513. alias mbslddt load_data
  514.  
  515. #------------------------------------------------------------------------------
  516. # * Carregamento de dados
  517. #------------------------------------------------------------------------------
  518. def load_data(*args)
  519.   d = (MBS::DLC.load(*args) rescue nil)
  520.   return d if d
  521.   return mbslddt(*args)
  522. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement