Script
RPG Maker XP

Zeus81 Resource Scanner

Les fichiers manquant dans vos projets, c'est fini !

Version: 2.3
Utilitaire

Ce script est un Scanneur de Ressources pour RPG Maker XP, écrit par Zeus81.
Son objectif est simple et efficace : analyser l’intégralité d’un projet RMXP afin d’identifier précisément quelles ressources sont utilisées, manquantes ou inutilisées, puis générer un rapport détaillé dans un fichier texte (Scan.log).

Il permet à la fois :

  • d’éviter les bugs dus à des fichiers absents,
  • d’alléger le projet en supprimant les ressources inutiles,
  • d’avoir une vision exhaustive de l’utilisation réelle des assets (audio, graphismes, base de données).

Comment utiliser le Scanneur de Ressources pour RMXP

Le script peut être lancé de deux manières :

  1. Manuellement, via : $scene = Scene_Resource_Scan.new
  2. Automatiquement au démarrage du jeu, en remplaçant dans Main : $scene = Scene_Title.new par : $scene = Scene_Resource_Scan.new

Cette seconde méthode est la plus rapide pour analyser votre projet.

Interface et options

Le script affiche une interface graphique complète, divisée en plusieurs zones :

1. Sélection des ressources à analyser

Le Scanneur de Ressources peut analyser séparément :

Audio

  • BGM
  • BGS
  • ME
  • SE

Graphismes

  • Animations
  • Autotiles
  • Battlebacks
  • Battlers
  • Characters
  • Fogs
  • Gameovers
  • Icons
  • Panoramas
  • Pictures
  • Tilesets
  • Titles
  • Transitions
  • Windowskins

Chaque catégorie peut être activée ou désactivée indépendamment.

2. Options d’analyse

Le script propose plusieurs options importantes :

  • Afficher les fichiers utiles
    → Ressources réellement utilisées par le jeu et présentes dans le projet.
  • Afficher les fichiers manquants
    → Ressources appelées par le jeu mais absentes des dossiers (source fréquente de crash).
  • Afficher les fichiers inutiles
    → Ressources présentes dans le projet mais jamais utilisées.
  • Calculer le poids des fichiers
    → Additionne la taille des fichiers pour mesurer le gain potentiel après nettoyage.
  • Afficher les emplacements
    → Indique précisément quelles commandes utilisent chaque ressource.
  • Afficher les éléments inutiles de la BDD
    → Détecte les acteurs, classes, objets, compétences, ennemis, etc., jamais utilisés.

Script

Bloc de code
TEXTE
#=================================
# Resource Scanner v2.3
# Script créé par Zeus81
#=================================
#
#
# Pour l'utiliser faire insérer un script et écrire :
#    $scene = Scene_Resource_Scan.new
# Sinon vous pouvez aussi l'écrire en dessous de $scene = Scene_Title.new
# dans le Main pour qu'il se lance automatiquement au démarrage
# comme ça c'est plus rapide !
 
class Window_Help_Scroll < Window_Base
 
  SPACE = " " * 8
 
  def initialize
    super(0, 428, 640, 64)
    self.contents = Bitmap.new(1, 1)
    self.contents.font = Font.new("Comic Sans MS", 20)
    self.windowskin = nil
    @wait_count = @text_width = 0
  end
 
  def set_text(text, align = 0)
    if text != @text or align != @align
      @text, @align, @wait_count, self.ox, font = text, align, 100, 0, self.contents.font
      if (w = self.contents_size(text).width) >= width-32
        text += SPACE + text
        w += (@text_width = self.contents_size(SPACE).width + w)
      else @text_width, w = 0, width-32
      end
      self.contents.dispose
      self.contents = Bitmap.new(w, 32)
      self.contents.font = font
      self.contents.draw_text(self.contents.rect, text, align)
    end
    self.ox = (self.ox >= @text_width ? 0 : self.ox+1) if @text_width > 0 and (@wait_count -= 1) < 0
  end
 
end
 
 
class Window_Resource_Scan < Window_Selectable
   
  attr_reader :options
 
  def initialize
    super(0, 0, 640, 480)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font = Font.new("Comic Sans MS", 22)
    @item_max = 30
    @index = 0
    refresh
  end
 
  def refresh
    self.contents.clear
    self.contents.fill_rect(0, 32, 608, 1, normal_color)
    self.contents.fill_rect(256, 32, 1, 416, normal_color)
    self.contents.fill_rect(256, 240, 352, 1, normal_color)
    self.contents.fill_rect(256, 420, 352, 1, normal_color)
    self.contents.font.size = 28
    self.contents.font.color = knockout_color
    self.contents.draw_text(0, -8, 608, 32, "Resource Scanner", 1)
    self.contents.font.size = 20
    self.contents.font.color = crisis_color
    self.contents.draw_text(0, 32, 256, 32, "Fichiers à analyser", 1)
    self.contents.draw_text(256, 32, 352, 32, "Options de configuration", 1)
    self.contents.draw_text(256, 240, 352, 32, "Commandes", 1)
    self.contents.font.color = normal_color
    self.contents.draw_text(0, 64, 128, 32, "Audio", 1)
    self.contents.draw_text(0, 96, 128, 32, "BGM", 1)
    self.contents.draw_text(0, 120, 128, 32, "BGS", 1)
    self.contents.draw_text(0, 144, 128, 32, "ME", 1)
    self.contents.draw_text(0, 168, 128, 32, "SE", 1)
    self.contents.draw_text(128, 64, 128, 32, "Graphics", 1)
    self.contents.draw_text(128, 96, 128, 32, "Animations", 1)
    self.contents.draw_text(128, 120, 128, 32, "Autotiles", 1)
    self.contents.draw_text(128, 144, 128, 32, "Battlebacks", 1)
    self.contents.draw_text(128, 168, 128, 32, "Battlers", 1)
    self.contents.draw_text(128, 192, 128, 32, "Characters", 1)
    self.contents.draw_text(128, 216, 128, 32, "Fogs", 1)
    self.contents.draw_text(128, 240, 128, 32, "Gameovers", 1)
    self.contents.draw_text(128, 264, 128, 32, "Icons", 1)
    self.contents.draw_text(128, 288, 128, 32, "Panoramas", 1)
    self.contents.draw_text(128, 312, 128, 32, "Pictures", 1)
    self.contents.draw_text(128, 336, 128, 32, "Tilesets", 1)
    self.contents.draw_text(128, 360, 128, 32, "Titles", 1)
    self.contents.draw_text(128, 384, 128, 32, "Transitions", 1)
    self.contents.draw_text(128, 408, 128, 32, "Windowskins", 1)
    self.contents.draw_text(280, 64, 328, 32, "Afficher les fichiers utiles")
    self.contents.draw_text(280, 88, 328, 32, "Afficher les fichiers manquants")
    self.contents.draw_text(280, 112, 328, 32, "Afficher les fichiers inutiles")
    self.contents.draw_text(280, 144, 328, 32, "Calculer le poids des fichiers")
    self.contents.draw_text(280, 168, 328, 32, "Afficher les emplacements")
    self.contents.draw_text(280, 200, 328, 32, "Afficher les éléments inutiles de la BDD")
    self.contents.draw_text(256, 272, 352, 32, "Tout sélectionner", 1)
    self.contents.draw_text(256, 296, 352, 32, "Tout désélectionner", 1)
    self.contents.draw_text(256, 328, 352, 32, "Commencer l'analyse", 1)
    self.contents.draw_text(256, 352, 352, 32, "Quitter", 1)
    self.contents.font.size = 16
    self.contents.draw_text(260, 418, 64, 20, "Aide")
  end
 
  def draw_states(options)
    draw_state(0, 64, options[0])
    4.times {|i| draw_state(0, 96+i*24, options[i+1])}
    draw_state(128, 64, options[5])
    14.times {|i| draw_state(128, 96+i*24, options[i+6])}
    3.times {|i| draw_state(264,  64+i*24, options[i+20])}
    2.times {|i| draw_state(264, 144+i*24, options[i+23])}
    draw_state(264, 200, options[25])
  end
 
  def draw_state(x, y, state)
    self.contents.fill_rect(x+3, y+11, 10, 10, Color.new(29, 82, 129))
    self.contents.fill_rect(x+4, y+12, 8, 8, Color.new(255, 255, 255))
    self.contents.fill_rect(x+5, y+13, 6, 6, state ? Color.new(34, 161, 34) : Color.new(128, 128, 128))
  end
 
  def update_cursor_rect
    x, y, w = case @index
    when    0 ; [  0,  68, 120]
    when  1..4 ; [  0, (@index-1 )*24+100, 120]
    when    5 ; [128,  68, 120]
    when  6..19; [128, (@index-6 )*24+100, 120]
    when 20..22; [264, (@index-20)*24+68 , 344]
    when 23, 24; [264, (@index-23)*24+148, 344]
    when    25; [264, 204, 344]
    when 26, 27; [348, (@index-26)*24+276, 172]
    when 28, 29; [348, (@index-28)*24+332, 172]
    end
    self.cursor_rect.set(x, y, w, 24)
  end
 
  def update_help
    @help_window.set_text case @index
    when 0..19; "Sélectionnez les fichiers à analyser ou pas."
    when 20; "Fichiers utilisés dans le jeu et présents dans les dossiers du projet."
    when 21; "Fichiers utilisés dans le jeu mais absents des dossiers du projet."
    when 22; "Fichiers non utilisés dans le jeu mais présents dans les dossiers du projet."
    when 23; "Allonge de façon plus ou moins négligeable le temps d'analyse selon le nombre de fichiers."
    when 24; "Pour chaque fichier, la liste des commandes l'utilisant est affichée."
    when 25; "Liste les éléments de la base de données non utilisés dans le jeu " <<
            "(leurs ressources sont considérées comme inutiles)."
    when 26; "Active toutes les options."
    when 27; "Désactive toutes les options."
    when 28; "L'analyse est infaillible si vous n'utilisez pas de scripts et/ou insertions de scripts, " <<
            "dans le cas contraire vérifiez que les scripts en question n'utilisent pas des fichiers " <<
            "marqués comme inutiles avant de les supprimer."
    when 29; "Ferme le jeu."
    end, 1
  end
 
end
 
 
class Scene_Resource_Scan
 
  def main
    unless $game_system
      $data_actors        = load_data("Data/Actors.rxdata")
      $data_classes      = load_data("Data/Classes.rxdata")
      $data_skills        = load_data("Data/Skills.rxdata")
      $data_items        = load_data("Data/Items.rxdata")
      $data_weapons      = load_data("Data/Weapons.rxdata")
      $data_armors        = load_data("Data/Armors.rxdata")
      $data_enemies      = load_data("Data/Enemies.rxdata")
      $data_troops        = load_data("Data/Troops.rxdata")
      $data_states        = load_data("Data/States.rxdata")
      $data_animations    = load_data("Data/Animations.rxdata")
      $data_tilesets      = load_data("Data/Tilesets.rxdata")
      $data_common_events = load_data("Data/CommonEvents.rxdata")
      $data_system        = load_data("Data/System.rxdata")
      $game_system        = Game_System.new
    end
    @main_window = Window_Resource_Scan.new
    @help_window = Window_Help_Scroll.new
    @help_window.x, @help_window.width = 272, 368
    @main_window.help_window = @help_window
    @options = Array.new(26, true)
    @options[24] = @options[25] = false
    @main_window.draw_states(@options)
    Graphics.transition
    while ($scene == self)
      Graphics.update
      Input.update
      update
    end
    Graphics.freeze
    @help_window.dispose
    @main_window.dispose
  end
 
  def update
    @main_window.update
    if Input.repeat?(Input::LEFT) or Input.repeat?(Input::RIGHT)
      $game_system_play($data_system.cursor_se)
      @main_window.index = case @main_window.index
      when  0..4 ; Input.repeat?(Input::LEFT) ? 26 : 5
      when  5..19; Input.repeat?(Input::LEFT) ?  0 : 20
      when 20..25; Input.repeat?(Input::LEFT) ?  5 : 26
      else        Input.repeat?(Input::LEFT) ? 20 : 0
      end
    elsif Input.trigger?(Input::C)
      $game_system_play($data_system.decision_se)
      case @main_window.index
      when 0..25
        @options[@main_window.index] = !@options[@main_window.index]
        case @main_window.index
        when 0; 4.times {|i| @options[i+1] = @options[0]}
        when 5; 14.times {|i| @options[i+6] = @options[5]}
        when 1..4
          @options[0] = false
          4.times {|i| @options[0] ||= @options[i+1]}
        when 6..19
          @options[5] = false
          14.times {|i| @options[5] ||= @options[i+6]}
        end
      when 26; @options.each_index {|i| @options[i] = true}
      when 27; @options.each_index {|i| @options[i] = false}
      when 28
        if resource_scan? or @options[25]
        then start_scan
        else print("Inutile de lancer un scan vide.")
        end
      when 29; $scene = nil
      end
      @main_window.draw_states(@options)
    elsif Input.trigger?(Input::B)
      $game_system_play($data_system.cancel_se)
      @main_window.index = 29
    end
  end
 
  def resource_scan?
    (@options[20] or @options[21] or @options[22]) and
    (@options[0] or @options[5])
  end
 
  def get_path(type)
    case type
    when  1; "Audio/BGM/"
    when  2; "Audio/BGS/"
    when  3; "Audio/ME/"
    when  4; "Audio/SE/"
    when  6; "Graphics/Animations/"
    when  7; "Graphics/Autotiles/"
    when  8; "Graphics/Battlebacks/"
    when  9; "Graphics/Battlers/"
    when 10; "Graphics/Characters/"
    when 11; "Graphics/Fogs/"
    when 12; "Graphics/Gameovers/"
    when 13; "Graphics/Icons/"
    when 14; "Graphics/Panoramas/"
    when 15; "Graphics/Pictures/"
    when 16; "Graphics/Tilesets/"
    when 17; "Graphics/Titles/"
    when 18; "Graphics/Transitions/"
    when 19; "Graphics/Windowskins/"
    end
  end
 
  MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'iipipi', 'i')
  WideCharToMultiByte = Win32API.new('kernel32', 'WideCharToMultiByte', 'iipipipp', 'i')
  GetShortPathName    = Win32API.new('kernel32', 'GetShortPathName', 'ppi', 'i')
  def lpath_to_spath(string)
    @utf16_buff ||= "\0" * 512
    @ansi_buff  ||= "\0" * 256
    @spath_buff ||= "\0" * 256
    MultiByteToWideChar.call(65001, 0, string, -1, @utf16_buff, 256) # utf8 => utf16
    WideCharToMultiByte.call(0, 0, @utf16_buff, -1, @ansi_buff, 256, 0, 0) # utf16 => ansi
    l = GetShortPathName.call(@ansi_buff, @spath_buff, 256)
    return @spath_buff[0,l]
  end
 
  def get_size(path)
    return 0 unless @options[23]
    if FileTest.directory?(spath=lpath_to_spath(path))
      entries = Dir.entries(spath)
      2.times {entries.shift}
      size = 0
      entries.each {|entry| size += get_size("#{path}/#{entry}")}
      return size
    else return FileTest.size(spath)
    end
  end
 
  def get_size_text(size)
    if size >= 1000000
    then "%0.2f Mo" % (size / 1048576.0)
    elsif size >= 1000
    then "%0.2f Ko" % (size / 1024.0)
    else "#{size} octets"
    end
  end
 
  def add_used_file(type, file_name, command_name)
    if @options[type] and !file_name.empty?
      id = -1
      for gf in @data[:game_files][type]
        if gf[0] == file_name
          id = @data[:game_files][type].index(gf)
          break
        end
      end
      @data[:game_files][type] << [file_name] if id == -1
      @data[:game_files][type][id] << command_name if @options[24]
    end
  end
 
  def start_scan
    initialize_scan
    scan_files if resource_scan?
    scan_maps
    scan_common_events
    scan_troops
    scan_tilesets
    scan_systems
    scan_enemies
    scan_actors
    scan_classes
    scan_skills
    scan_items
    scan_weapons
    scan_armors
    scan_states
    scan_animations
    sort_data if resource_scan?
    write_data
    finalize_scan
  end
 
  def initialize_scan
    @thread = Thread.new {loop {Graphics.update; sleep(5)}}
    @data  = {}
    @data[:project_files] = Array.new(20) {[]}
    @data[:game_files]    = Array.new(20) {[]}
    @data[:usefull_files] = Array.new(20) {[]}
    @data[:missing_files] = Array.new(20) {[]}
    @data[:useless_files] = Array.new(20) {[]}
    @data[:actors]        = []
    @data[:animations]    = []
    @data[:armors]        = []
    @data[:classes]      = []
    @data[:enemies]      = []
    @data[:items]        = []
    @data[:skills]        = []
    @data[:states]        = []
    @data[:tilesets]      = []
    @data[:troops]        = []
    @data[:weapons]      = []
  end
 
  def finalize_scan
    @thread.kill
    @data = @thread = nil
    print("L'analyse est terminée !")
    Thread.new {system("explorer.exe Scan.log")}
  end
 
  def scan_files
    for type in 1...20
      next if !@options[type] or type == 5 or !FileTest.exist?(path = get_path(type))
      @data[:project_files][type] = Dir.entries(path)
      2.times {@data[:project_files][type].shift}
      for i in 0...@data[:project_files][type].size
        fn = @data[:project_files][type][i]
        @data[:project_files][type][i] = [File.basename(fn, ".*"), fn, get_size(path+fn)]
      end
    end
  end
 
  def scan_command(command, name)
    case command.code
    when  41; add_used_file(10, command.parameters[0], name)
    when 131; add_used_file(19, command.parameters[0], name)
    when 204; add_used_file(14-3*command.parameters[0], command.parameters[1], name)
    when 222; add_used_file(18, command.parameters[0], name)
    when 231; add_used_file(15, command.parameters[1], name)
    when 241, 132; add_used_file(1, command.parameters[0].name, name)
    when 245    ; add_used_file(2, command.parameters[0].name, name)
    when 249, 133; add_used_file(3, command.parameters[0].name, name)
    when 250,  44; add_used_file(4, command.parameters[0].name, name)
    when 322; add_used_file(10, command.parameters[1], name)
              add_used_file( 9, command.parameters[3], name)
    when 126; @data[:items] << command.parameters[0] if command.parameters[1] == 0
    when 127; @data[:weapons] << command.parameters[0] if command.parameters[1] == 0
    when 128; @data[:armors] << command.parameters[0] if command.parameters[1] == 0
    when 129; @data[:actors] << command.parameters[0] if command.parameters[1] == 0
    when 207; @data[:animations] << command.parameters[1]
    when 301; @data[:troops] << command.parameters[0]
    when 302, 605
      case command.parameters[0]
      when 0; @data[:items] << command.parameters[1]
      when 1; @data[:weapons] << command.parameters[1]
      when 2; @data[:armors] << command.parameters[1]
      end
    when 313, 333; @data[:states] << command.parameters[2] if command.parameters[1] == 0
    when 318; @data[:skills] << command.parameters[2] if command.parameters[1] == 0
    when 321; @data[:classes] << command.parameters[1]
    when 336; @data[:enemies] << command.parameters[1]
    when 337; @data[:animations] << command.parameters[2]
    when 339; @data[:skills] << command.parameters[3] if command.parameters[2] == 1
    when 509; scan_command(command.parameters[0], name)
    end
  end
 
  def scan_maps
    map_infos = load_data("Data/MapInfos.rxdata")
    for map_id in map_infos.keys.sort
      map = load_data("Data/Map%03d.rxdata" % map_id)
      @data[:tilesets] << map.tileset_id
      @data[:troops] += map.encounter_list
      name = "Map %03d #{map_infos[map_id].name} " % map_id
      add_used_file(1, map.bgm.name, "#{name}BGM automatique") if map.autoplay_bgm
      add_used_file(2, map.bgs.name, "#{name}BGS automatique") if map.autoplay_bgs
      for event in map.events.values
        for i in 0...event.pages.size
          namei = "#{name}Événement %03d Page #{i+1} " % event.id
          add_used_file(10, event.pages[i].graphic.character_name, "#{namei}Apparence")
          for j in 0...event.pages[i].list.size
            scan_command(event.pages[i].list[j], "#{namei}Commande #{j+1}")
          end
          for j in 0...event.pages[i].move_route.list.size
            scan_command(event.pages[i].move_route.list[j], "#{namei}Déplacement #{j+1}")
          end
        end
      end
    end
  end
 
  def scan_common_events
    for common_event_id in 1...$data_common_events.size
      name = "Événement commun %03d Commande " % common_event_id
      for i in 0...$data_common_events[common_event_id].list.size
        scan_command($data_common_events[common_event_id].list[i], "#{name}#{i+1}")
      end
    end
  end
 
  def scan_troops
    @data[:troops].uniq!
    @data[:troops].delete(0)
    for troop_id in @data[:troops]
      $data_troops[troop_id].members.each {|member| @data[:enemies] << member.enemy_id}
      name = "Groupe d'ennemis %03d Événement de combat Page %d Commande %d"
      for i in 0...$data_troops[troop_id].pages.size
        for j in 0...$data_troops[troop_id].pages[i].list.size
          scan_command($data_troops[troop_id].pages[i].list[j], name % [troop_id, i+1, j+1])
        end
      end
    end
  end
 
  def scan_tilesets
    @data[:tilesets].uniq!
    @data[:tilesets].delete(0)
    if @options[5]
      for i in @data[:tilesets]
        add_used_file(16, $data_tilesets[i].tileset_name, "Tileset %03d Fichier du Tileset" % i)
        for j in 0...$data_tilesets[i].autotile_names.size
          add_used_file(7, $data_tilesets[i].autotile_names[j], "Tileset %03d Autotile #{j+1}" % i)
        end
        add_used_file(14, $data_tilesets[i].panorama_name, "Tileset %03d Panorama" % i)
        add_used_file(11, $data_tilesets[i].fog_name, "Tileset %03d Brouillard" % i)
        add_used_file( 8, $data_tilesets[i].battleback_name, "Tileset %03d Fond de combat" % i)
      end
    end
  end
 
  def scan_systems
    @data[:actors] += $data_system.party_members
    if @options[0]
      add_used_file(1, $data_system.title_bgm.name, "Système Musique de l'écran titre")
      add_used_file(1, $data_system.battle_bgm.name, "Système Musique des combats")
      add_used_file(3, $data_system.battle_end_me.name, "Système Musique de victoire")
      add_used_file(3, $data_system.gameover_me.name, "Système Musique de gameover")
      add_used_file(4, $data_system.cursor_se.name, "Système Effet sonore du curseur")
      add_used_file(4, $data_system.decision_se.name, "Système Effet sonore de validation")
      add_used_file(4, $data_system.cancel_se.name, "Système Effet sonore d'annulation")
      add_used_file(4, $data_system.buzzer_se.name, "Système Effet sonore du buzzer")
      add_used_file(4, $data_system.equip_se.name, "Système Effet sonore d'équipement")
      add_used_file(4, $data_system.shop_se.name, "Système Effet sonore d'achat")
      add_used_file(4, $data_system.save_se.name, "Système Effet sonore de sauvegarde")
      add_used_file(4, $data_system.load_se.name, "Système Effet sonore de chargement")
      add_used_file(4, $data_system.battle_start_se.name, "Système Effet sonore de début de combat")
      add_used_file(4, $data_system.escape_se.name, "Système Effet sonore de fuite")
      add_used_file(4, $data_system.actor_collapse_se.name, "Système Effet sonore de mort d'un allié")
      add_used_file(4, $data_system.enemy_collapse_se.name, "Système Effet sonore de mort d'un ennemi")
    end
    if @options[5]
      add_used_file(12, $data_system.gameover_name, "Système Ecran de gameover")
      add_used_file(17, $data_system.title_name, "Système Ecran titre")
      add_used_file(18, $data_system.battle_transition, "Système Transition vers les combats")
      add_used_file(19, $data_system.windowskin_name, "Système Apparence des fenêtres")
    end
  end
 
  def scan_enemies
    @data[:enemies].uniq!
    @data[:enemies].delete(0)
    for i in @data[:enemies]
      @data[:animations] << $data_enemies[i].animation1_id
      @data[:animations] << $data_enemies[i].animation2_id
      @data[:items] << $data_enemies[i].item_id
      @data[:weapons] << $data_enemies[i].weapon_id
      @data[:armors] << $data_enemies[i].armor_id
      $data_enemies[i].actions.each {|action| @data[:skills] << action.skill_id if action.kind == 1}
      add_used_file(9, $data_enemies[i].battler_name, "Ennemi %03d Apparence" % i)
    end
  end
     
  def scan_actors
    @data[:actors].uniq!
    @data[:actors].delete(0)
    for i in @data[:actors]
      @data[:classes] << $data_actors[i].class_id
      @data[:weapons] << $data_actors[i].weapon_id
      @data[:armors] << $data_actors[i].armor1_id
      @data[:armors] << $data_actors[i].armor2_id
      @data[:armors] << $data_actors[i].armor3_id
      @data[:armors] << $data_actors[i].armor4_id
      add_used_file(10, $data_actors[i].character_name, "Allié %03d Apparence sur la carte" % i)
      add_used_file( 9, $data_actors[i].battler_name, "Allié %03d Apparence en combat" % i)
    end
  end
 
  def scan_classes
    @data[:classes].uniq!
    @data[:classes].delete(0)
    for i in @data[:classes]
      $data_classes[i] {|learning| @data[:skills] << learning.skill_id}
    end
  end
 
  def scan_skills
    @data[:skills].uniq!
    @data[:skills].delete(0)
    for i in @data[:skills]
      @data[:animations] << $data_skills[i].animation1_id
      @data[:animations] << $data_skills[i].animation2_id
      @data[:states] += $data_skills[i].plus_state_set
      add_used_file( 4, $data_skills[i].menu_se.name, "Compétence %03d Effet sonore dans le menu" % i)
      add_used_file(13, $data_skills[i].icon_name, "Compétence %03d Icône" % i)
    end
  end
 
  def scan_items
    @data[:items].uniq!
    @data[:items].delete(0)
    for i in @data[:items]
      @data[:animations] << $data_items[i].animation1_id
      @data[:animations] << $data_items[i].animation2_id
      @data[:states] += $data_items[i].plus_state_set
      add_used_file( 4, $data_items[i].menu_se.name, "Objet %03d Effet sonore dans le menu" % i)
      add_used_file(13, $data_items[i].icon_name, "Objet %03d Icône" % i)
    end
  end
 
  def scan_weapons
    @data[:weapons].uniq!
    @data[:weapons].delete(0)
    for i in @data[:weapons]
      @data[:animations] << $data_weapons[i].animation1_id
      @data[:animations] << $data_weapons[i].animation2_id
      @data[:states] += $data_weapons[i].plus_state_set
      add_used_file(13, $data_weapons[i].icon_name, "Arme %03d Icône" % i)
    end
  end
 
  def scan_armors
    @data[:armors].uniq!
    @data[:armors].delete(0)
    for i in @data[:armors]
      @data[:states] << $data_armors[i].auto_state_id
      add_used_file(13, $data_armors[i].icon_name, "Armure %03d Icône" % i)
    end
  end
 
  def scan_states
    @data[:states].uniq!
    @data[:states].delete(0)
    for i in @data[:states]
      @data[:animations] << $data_states[i].animation_id
    end
  end
 
  def scan_animations
    @data[:animations].uniq!
    @data[:animations].delete(0)
    for i in @data[:animations]
      add_used_file(6, $data_animations[i].animation_name, "Animation %03d Fichier d'animation" % i)
      for j in 0...$data_animations[i].timings.size
        add_used_file(4, $data_animations[i].timings[j], "Animation %03d Effet sonore #{j+1}" % i)
      end
    end
  end
 
  def sort_data
    for type in 1...20
      next if !@options[type] or type == 5
      pf = gf = nil
      @data[:game_files][type].sort!
      for gf in @data[:game_files][type]
        if @data[:project_files][type].any? {|pf| pf[0] == gf[0]}
        then @data[:usefull_files][type] << [pf, gf]
        else @data[:missing_files][type] << gf
        end
      end
      for pf in @data[:project_files][type]
        @data[:useless_files][type] << pf unless @data[:game_files][type].any? {|gf| pf[0] == gf[0]}
      end
      for i in 1...@data[:project_files][type].size
        if @data[:project_files][type][i][0] == @data[:project_files][type][i-1][0]
          @data[:useless_files][type] << @data[:project_files][type][i]
        end
      end
      @data[:useless_files][type].sort!.uniq!
    end
  end
 
  def write_data
    statistics = [0, 0, 0, 0, 0, 0]
    file = File.open("Scan.log", "w")
    file.write("\t\t\t\t- = RESULTAT DU SCAN = -\n\n\n")
    write_resource(file, statistics) if resource_scan?
    write_database(file, statistics) if @options[25]
    write_statistics(file, statistics)
    file.close
  end
 
  def write_resource(file, statistics)
    for type in 1...20
      next if !@options[type] or type == 5
      res_stats = [0, 0, 0, 0, 0]
      file.write("\n#{get_path(type)}\n")
      if @options[20]
        res_stats[0] += @data[:usefull_files][type].size
        @data[:usefull_files][type].each {|pf_gf| res_stats[1] += pf_gf[0][2]} if @options[23]
        size = @options[23] ? "\t[#{get_size_text(res_stats[1])}]" : ""
        file.write("\n\t\tFichiers utiles :\t#{res_stats[0]}#{size}\n")
        if !@data[:usefull_files][type].empty?
          for pf_gf in @data[:usefull_files][type]
            pf, gf = pf_gf
            file.write("\t\t\t#{pf[1].ljust(31)}")
            file.write("\t[#{get_size_text(pf[2])}]") if @options[23]
            (1...gf.size).each {|i| file.write("\t- #{gf[i]}")} if @options[24]
            file.write("\n")
          end
        else file.write("\t\t\t-\n")
        end
      end
      if @options[21]
        res_stats[2] += @data[:missing_files][type].size
        file.write("\n\t\tFichiers manquants :\t#{res_stats[2]}\n")
        if !@data[:missing_files][type].empty?
          for gf in @data[:missing_files][type]
            file.write("\t\t\t#{gf[0].ljust(31)}")
            (1...gf.size).each {|i| file.write("\t- #{gf[i]}")} if @options[24]
            file.write("\n")
          end
        else file.write("\t\t\t-\n")
        end
      end
      if @options[22]
        res_stats[3] += @data[:useless_files][type].size
        @data[:useless_files][type].each {|pf| res_stats[4] += pf[2]} if @options[23]
        size = @options[23] ? "\t[#{get_size_text(res_stats[4])}]" : ""
        file.write("\n\t\tFichiers inutiles :\t#{res_stats[3]}#{size}\n")
        if !@data[:useless_files][type].empty?
          for pf in @data[:useless_files][type]
            file.write("\t\t\t#{pf[1].ljust(31)}")
            file.write("\t[#{get_size_text(pf[2])}]") if @options[23]
            file.write("\n")
          end
        else file.write("\t\t\t-\n")
        end
      end
      5.times {|i| statistics[i] += res_stats[i]}
    end
    file.write("\n\n")
  end
 
  def write_database(file, statistics)
    db = [["Alliés :", $data_actors, :actors], ["Classes :", $data_classes, :classes],
    ["Compétences :", $data_skills, :skills], ["Objets :", $data_items, :items],
    ["Armes :", $data_weapons, :weapons], ["Armures :", $data_armors, :armors],
    ["Ennemis :", $data_enemies, :enemies], ["Groupes :", $data_troops, :troops],
    ["Statuts :", $data_states, :states], ["Animations :", $data_animations, :animations],
    ["Tilesets :", $data_tilesets, :tilesets]]
    file.write("\nÉléments inutiles de la base de données :")
    for d in db
      pos, elements = 0, d[1].size-1-@data[d[2]].size
      file.write("\n\n\t#{d[0].ljust(15)}\t#{elements}")
      if elements != 0
        for i in 1...d[1].size
          next if @data[d[2]].include?(i)
          file.write("\n\t") if (pos+=1)%3 == 1
          file.write("\t%03d-#{d[1][i].name.ljust(31)}" % i)
        end
        statistics[5] += elements
      else file.write("\n\t\t-")
      end
    end
    file.write("\n\n\n")
  end
 
  def write_statistics(file, statistics)
    file.write("\nStatistiques :\n\n")
    if resource_scan?
      size = @options[23] ? "\t[#{get_size_text(statistics[1])}]" : "" if @options[20]
      file.write("\tFichiers utiles :\t#{statistics[0]}#{size}\n") if @options[20]
      file.write("\tFichiers manquants :\t#{statistics[2]}\n") if @options[21]
      size = @options[23] ? "\t[#{get_size_text(statistics[4])}]" : "" if @options[22]
      file.write("\tFichiers inutiles :\t#{statistics[3]}#{size}\n") if @options[22]
    end
    file.write("\tÉléments BDD inutiles :\t#{statistics[5]}\n") if @options[25]
  end
 
end

Scripts utiles

Newsletter

Ne ratez rien de la communauté

Nouveautés, jeux inspirants et ressources utiles directement dans votre boîte mail.

Pas de spam · Désinscription en un clic