Плохо! Плохо!:  0
Показано с 1 по 8 из 8

Тема: Resource Checker

  1. #1
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию Resource Checker

    Resource Checker/Unchecker(VXACE)
    Автор: caveman
    Версия: 1.1
    Тип: Работа с БД и ресурсами




    Описание:
    По подкинутой DeadElf79 идее нарисовал скрипт, который проверяет существование в папках проекта звуковых и графических ресурсов, используемых в игре, а также проверяет наличие неиспользуемых ресурсов.

    Полезно:
    - при отвязке проекта от rtp и распространении игры на те компы, где он не установлен
    - для уменьшения количества лучей ненависти на форуме по отношению к новичкам, выложившим очередной проект с забытым фейсом или музыкой
    - для уменьшения веса проекта путем избавления его от лишних ненужных файлов

    Особенности:
    Скрипт, кроме БД проекта, просматривает все общие события, а также карты (батлбеки, параллакс файл, BGS, BGM) и все события карт, которые могут задействовать ресурсы, типа Change Actor Graphic, Show Picture или Play SE (где-то с десяток видов), а также два события изменения ресурсов внутри Set Move Route.

    Скрипт для VX (положить в Materials):
    Спойлер файл настроек:

    Код:
    #===============================================================================
    =begin
                                    Resource Checker
      Скрипт проверяет наличие всех используемых ресурсов в игре.
      Автор: caveman
      Версия: 1.1
      Изменения: 1.1 
      - добавлена возможность проверки наличия лишних ресурсов
      - добавлено несколько забытых проверок в чекер (титульник и графика евента)
    =end
    #===============================================================================
    class Checker
      def initialize
        #==========МЕНЯЕМ ТОЛЬКО ЗДЕСЬ==========
        #опция проверки наличия ресурсов (пункт в меню)
        @check_resource=true
        #опция проверки неиспользуемых ресурсов (пункт в меню)
        @uncheck_resource=true
        #возможность проверки прямо из титульного экрана
        #если проект был запущен из редактора (то есть $DEBUG=true)
        @do_title_debug=true
     
        #==========ДАЛЬШЕ НЕ ТРОГАЕМ============
        @options_button_name="Настройки"
        @options_check_name="Пров. нехватку"
        @options_uncheck_name="Пров. лишнее"
        @options_cancel_name="Отмена"
      end
     
      attr_accessor :check_resource
      attr_accessor :uncheck_resource
      attr_accessor :do_title_debug
      attr_accessor :options_button_name
      attr_accessor :options_check_name
      attr_accessor :options_uncheck_name
      attr_accessor :options_cancel_name
    end
     
    $max_maps=999
    $counter=0
    class Game_Event
      attr_accessor :erased
      def g_event
        return @event
      end
    end
     
    class Game_Map
      def g_map
        return @map
      end
    end
     
    class Window_TitleCommand
      def make_command_list
        add_command(Vocab::new_game, :new_game)
        add_command(Vocab::continue, :continue, continue_enabled)
        if $checker.do_title_debug
          add_command($checker.options_button_name, :checker)
        end
        add_command(Vocab::shutdown, :shutdown)
      end
    end
     
    class Window_DialsCommand<Window_TitleCommand
      def make_command_list
        add_command($checker.options_check_name,:check,$checker.check_resource)
        add_command($checker.options_uncheck_name,:uncheck,$checker.uncheck_resource)
        add_command($checker.options_cancel_name,:cancel)
      end
    end
     
    class Scene_Title
      def start
        super
        SceneManager.clear
        Graphics.freeze
        create_background
        create_foreground
        $checker=Checker.new
        create_command_window
        create_extra_window
        play_title_music
      end
     
      def create_command_window
        @command_window = Window_TitleCommand.new
        @command_window.set_handler(:new_game, method(:command_new_game))
        @command_window.set_handler(:continue, method(:command_continue))
        if $checker.do_title_debug
          @command_window.set_handler(:checker, method(:command_checker))
        end
        @command_window.set_handler(:shutdown, method(:command_shutdown))
      end
     
      def create_extra_window
        @extra=Window_DialsCommand.new
        @extra.visible=false
        @extra.x = (Graphics.width - @command_window.width) / 2+@extra.width
        @extra.y = (Graphics.height * 1.6 - @command_window.height) / 2
        @extra.set_handler(:check, method(:command_check))
        @extra.set_handler(:uncheck, method(:command_uncheck))
        @extra.set_handler(:cancel, method(:command_cancel))
      end
     
      def command_checker
        @extra.visible=true
        @extra.openness=0
        @extra.open
        @command_window.active=false
        @extra.active=true
      end
     
      def command_check
        checker=Resource_Checker.new
        if checker.done then
          @extra.close
          msgbox "Проверка успешно завершена!"
          update until @extra.close?
          @command_window.active=true
          @extra.active=false
        elsif checker.error
          @extra.close
     
          @file=File.open("check.txt","w")
          @file.write(checker.errmsg)
          @file.close
          msgbox "При проверке возникли ошибки. Смотрите в файле check.txt"
     
          update until @extra.close?
          @command_window.active=true
          @extra.active=false
        elsif
          @extra.close
          msgbox "Эльфы полетели!"
          update until @extra.close?
          @command_window.active=true
          @extra.active=false
        end
      end
     
      def command_uncheck
        checker=Resource_Unchecker.new
        if checker.done then
          @extra.close
          msgbox "Проверка успешно завершена!"
          update until @extra.close?
          @command_window.active=true
          @extra.active=false
        elsif checker.error
          @extra.close
     
          @file=File.open("uncheck.txt","w")
          @file.write(checker.errmsg)
          @file.close
          msgbox "При проверке нашлись ненужные ресурсы. Смотрите в файле uncheck.txt"
     
          update until @extra.close?
          @command_window.active=true
          @extra.active=false
        elsif
          @extra.close
          msgbox "Эльфы полетели!"
          update until @extra.close?
          @command_window.active=true
          @extra.active=false
        end
      end
     
      def command_cancel
        @extra.close
        update until @extra.close?
        @command_window.active=true
        @extra.active=false
      end
    end

    Спойлер скрипт checker:

    Код:
    #===============================================================================
    =begin
                                    RESOURCE_CHECKER
      Проверяльщик ресурсов
      Этот скрипт просматривает проект на предмет забытых 
      графических и звуковых ресурсов при выкладывании без РТП.
     
      Автор: caveman
     
    =end
    #===============================================================================
    class Resource_Checker
      attr_accessor :done
      attr_accessor :error
      attr_accessor :errmsg
     
      def initialize
        DataManager.init
        $checker=Checker.new if $checker==nil
     
        @done=true
        @error = false
     
        @errmsg = "[База]\n"
        if !check_db?
          @error = true
          @done = false
        end
        @errmsg += "\n"
     
        @errmsg += "[Общие события]\n"
        if !check_commons?
          @error = true
          @done = false
        end
        @errmsg += "\n"
     
        @errmsg += "[Карты]\n"
        for map in 1..$max_maps
          if FileTest.exist?(sprintf("Data/Map%03d.rvdata2",map))
            if !check_map?(map)
              @error = true
              @done = false
            end
          else
            next
          end
        end
        @errmsg += "\n"
      end
     
      def check_img_file?(folder_name, file_name)
        if FileTest.exist?(sprintf("Graphics/%s/%s.%s",folder_name,file_name,"png"))
          return true
        end
        return false
      end
     
      def check_vid_file?(file_name)
        if FileTest.exist?(sprintf("Movies/%s",file_name))
          return true
        end
        return false
      end
     
      def check_mus_file?(folder_name, file_name)
        if FileTest.exist?(sprintf("Audio/%s/%s.%s",folder_name,file_name,"mp3")) ||
           FileTest.exist?(sprintf("Audio/%s/%s.%s",folder_name,file_name,"ogg"))
          return true
        end
        return false
      end
     
      def check_db?
        flag = true
        # icons
        if !check_img_file?("System","IconSet")
          @errmsg += sprintf("Не найден набор %s.png в папке System\n", 
           "IconSet")
           flag = false
        end
     
        # actors
        for i in 1...$data_actors.size
          if $data_actors[i].character_name != "" &&
             !check_img_file?("Characters",$data_actors[i].character_name)
            @errmsg += sprintf("Не найдена графика %s.png в папке Characters\n", 
              $data_actors[i].character_name)
              flag = false
          end
          if $data_actors[i].face_name != "" &&
             !check_img_file?("Faces",$data_actors[i].face_name)
            @errmsg += sprintf("Не найден фейс %s.png в папке Faces\n", 
              $data_actors[i].face_name)
              flag = false
          end
        end
        # enemies
        for i in 1...$data_enemies.size
          if $data_enemies[i].battler_name != "" &&
             !check_img_file?("Battlers",$data_enemies[i].battler_name)
            @errmsg += sprintf("Не найдена графика противника %s.png в папке Battlers\n", 
              $data_enemies[i].battler_name)
              flag = false
          end
        end
        # animations
        for i in 1...$data_animations.size
          if $data_animations[i].animation1_name != "" && 
             !check_img_file?("Animations",$data_animations[i].animation1_name)
            @errmsg += sprintf("Не найдена анимационная графика 1 %s.png в папке Animations\n", 
              $data_animations[i].animation1_name)
              flag = false
          end
          if $data_animations[i].animation2_name != "" &&
            !check_img_file?("Animations",$data_animations[i].animation2_name)
            @errmsg += sprintf("Не найдена анимационная графика 2 %s.png в папке Animations\n", 
              $data_animations[i].animation2_name)
              flag = false
          end
        end
        # tilesets
        for i in 1...$data_tilesets.size
          for j in 0...8
            if $data_tilesets[i].tileset_names[j] != "" &&
              !check_img_file?("Tilesets",$data_tilesets[i].tileset_names[j])
              @errmsg += sprintf("Не найдена графика для тайлсета %s.png в папке Tilesets\n", 
                $data_tilesets[i].tileset_names[j])
                flag = false
            end
          end
        end
        # system
        if $data_system.title1_name  != "" &&
            !check_img_file?("Titles1",$data_system.title1_name)
          @errmsg += sprintf("Не найдена графика для Title %s.png в папке Titles1\n", 
            $data_system.title1_name)
            flag = false
        end
        if $data_system.title2_name  != "" &&
            !check_img_file?("Titles2",$data_system.title2_name)
          @errmsg += sprintf("Не найдена графика для Title %s.png в папке Titles2\n", 
            $data_system.title2_name)
            flag = false
        end
        if $data_system.boat.character_name != "" &&
            !check_img_file?("Characters",$data_system.boat.character_name)
          @errmsg += sprintf("Не найдена графика для boat %s.png в папке Characters\n", 
            $data_system.boat.character_name)
            flag = false
        end
        if $data_system.ship.character_name != "" &&
            !check_img_file?("Characters",$data_system.ship.character_name)
          @errmsg += sprintf("Не найдена графика для ship %s.png в папке Characters\n", 
            $data_system.ship.character_name)
            flag = false
        end    
        if $data_system.airship.character_name != "" &&
            !check_img_file?("Characters",$data_system.airship.character_name)
          @errmsg += sprintf("Не найдена графика для airship %s.png в папке Characters\n", 
            $data_system.airship.character_name)
            flag = false
        end
     
        if $data_system.title_bgm.name != "" &&
           !check_mus_file?("BGM",$data_system.title_bgm.name)
             @errmsg += sprintf("Не найден трек %s для title_bgm в папке Audio/BGM\n", 
             $data_system.title_bgm.name)
             flag = false
        end
        if $data_system.battle_bgm.name != "" &&
           !check_mus_file?("BGM",$data_system.battle_bgm.name)
             @errmsg += sprintf("Не найден трек %s для battle_bgm в папке Audio/BGM\n", 
             $data_system.battle_bgm.name)
             flag = false
        end
        if $data_system.battle_end_me.name != "" &&
           !check_mus_file?("ME",$data_system.battle_end_me.name)
             @errmsg += sprintf("Не найден трек %s для battle_end_me в папке Audio/ME\n", 
             $data_system.battle_end_me.name)
             flag = false
        end
        if $data_system.gameover_me.name != "" &&
           !check_mus_file?("ME",$data_system.gameover_me.name)
             @errmsg += sprintf("Не найден трек %s для gameover_me в папке Audio/ME\n", 
             $data_system.gameover_me.name)
             flag = false
        end
        if $data_system.boat.bgm.name != "" && 
           !check_mus_file?("BGM",$data_system.boat.bgm.name)
             @errmsg += sprintf("Не найден трек %s для boat в папке Audio/BGM\n", 
             $data_system.boat.bgm.name)
             flag = false
        end
        if $data_system.ship.bgm.name != "" && 
           !check_mus_file?("BGM",$data_system.ship.bgm.name)
             @errmsg += sprintf("Не найден трек %s для ship в папке Audio/BGM\n", 
             $data_system.ship.bgm.name)
             flag = false
        end
        if $data_system.airship.bgm.name != "" && 
           !check_mus_file?("BGM",$data_system.airship.bgm.name)
             @errmsg += sprintf("Не найден трек %s для airship в папке Audio/BGM\n", 
             $data_system.airship.bgm.name)
             flag = false
        end
        for j in 0..23 
          if $data_system.sounds[j].name != "" && 
             !check_mus_file?("SE",$data_system.sounds[j].name)
            @errmsg += sprintf("Не найден системный звук %s в папке Audio/SE\n", 
             $data_system.sounds[j].name)
             flag = false
          end
        end
     
        return flag
      end
     
      def check_commons?
        flag = true
        for i in 1...$data_common_events.size
          list = $data_common_events[i].list
          if list != nil
            for command in list
              case command.code
              when 101 
                if command.parameters[0] != "" &&
                   !check_img_file?("Faces",command.parameters[0])
                  @errmsg += sprintf("[Общее событие %04d] Не найден фейс %s.png в папке Faces\n", 
                    i,command.parameters[0])
                  flag = false
                end
              when 231 
                if command.parameters[1] != "" &&
                   !check_img_file?("Pictures",command.parameters[1])
                  @errmsg += sprintf("[Общее событие %04d] Не найдена картинка %s.png в папке Pictures\n", 
                    i,command.parameters[1])
                  flag = false
                end
              when 241 
                if command.parameters[0].name != "" &&
                   !check_mus_file?("BGM",command.parameters[0].name)
                  @errmsg += sprintf("[Общее событие %04d] Не найден BGM файл %s в папке Audio/BGM\n", 
                    i,command.parameters[0].name)
                  flag = false
                end
              when 245 
                if command.parameters[0].name != "" &&
                   !check_mus_file?("BGS",command.parameters[0].name)
                  @errmsg += sprintf("[Общее событие %04d] Не найден BGS файл %s в папке Audio/BGS\n", 
                    i,command.parameters[0].name)
                  flag = false
                end
              when 249 
                if command.parameters[0].name != "" &&
                   !check_mus_file?("ME",command.parameters[0].name)
                  @errmsg += sprintf("[Общее событие %04d] Не найден ME файл %s в папке Audio/ME\n", 
                    i,command.parameters[0].name)
                  flag = false
                end
              when 250 
                if command.parameters[0].name != "" &&
                   !check_mus_file?("SE",command.parameters[0].name)
                  @errmsg += sprintf("[Общее событие %04d] Не найден SE файл %s в папке Audio/SE\n", 
                    i,command.parameters[0].name)
                  flag = false
                end
              when 283 
                if command.parameters[0] != "" &&
                   !check_img_file?("Battlebacks1",command.parameters[0])
                  @errmsg += sprintf("[Общее событие %04d] Не найдена картинка %s.png в папке Battlebacks1\n", 
                    i,command.parameters[0].name)
                  flag = false
                end
                if command.parameters[1] != "" &&
                   !check_img_file?("Battlebacks2",command.parameters[1])
                  @errmsg += sprintf("[Общее событие %04d] Не найдена картинка %s.png в папке Battlebacks2\n", 
                    i,command.parameters[1])
                  flag = false
                end
              when 284 
                if command.parameters[0] != "" &&
                   !check_img_file?("Parallaxes",command.parameters[0])
                  @errmsg += sprintf("[Общее событие %04d] Не найдена картинка %s.png в папке Parallaxes\n", 
                    i,command.parameters[0])
                  flag = false
                end
              when 261 
                if command.parameters[0] != "" &&
                   !check_vid_file?(command.parameters[0])
                  @errmsg += sprintf("[Общее событие %04d] Не найдено видео %s в папке Movies\n", 
                    i,command.parameters[0])
                  flag = false
                end
              when 132
                if command.parameters[0].name != "" &&
                   !check_mus_file?("BGM",command.parameters[0].name)
                  @errmsg += sprintf("[Общее событие %04d] Не найден BGM файл %s в папке Audio/BGM\n", 
                    i,command.parameters[0].name)
                  flag = false
                end
              when 133 
                if command.parameters[0].name != "" &&
                   !check_mus_file?("ME",command.parameters[0].name)
                  @errmsg += sprintf("[Общее событие %04d] Не найден ME файл %s в папке Audio/ME\n", 
                    i,command.parameters[0].name)
                  flag = false
                end
              when 322 
                if command.parameters[1] != "" &&
                   !check_img_file?("Characters",command.parameters[1])
                  @errmsg += sprintf("[Общее событие %04d] Не найден файл %s.png в папке Characters\n", 
                    i,command.parameters[1])
                  flag = false
                end
                if command.parameters[3] != "" &&
                   !check_img_file?("Faces",command.parameters[3])
                  @errmsg += sprintf("[Общее событие %04d] Не найден файл %s.png в папке Faces\n", 
                    i,command.parameters[3])
                  flag = false
                end
              when 323 
                if command.parameters[1] != "" &&
                   !check_img_file?("Characters",command.parameters[1])
                  @errmsg += sprintf("[Общее событие %04d] Не найден файл %s.png в папке Characters\n", 
                    i,command.parameters[1])
                  flag = false
                end
              # move route
              when 205 
                for j in 0..command.parameters[1].list.length-1
                  cmd = command.parameters[1].list[j]
                  if cmd.code == 41 # change graphic
                    if cmd.parameters[0] != "" &&
                       !check_img_file?("Characters",cmd.parameters[0])
                      @errmsg += sprintf("[Общее событие %04d] Не найден файл %s.png в папке Characters\n", 
                                    i,cmd.parameters[0])
                      flag = false
                    end
                  end
                  if cmd.code == 44 # play SE
                    if cmd.parameters[0].name != "" &&
                       !check_mus_file?("SE",cmd.parameters[0].name)
                      @errmsg += sprintf("[Общее событие %04d] Не найден SE файл %s в папке Audio/SE\n", 
                                    i,cmd.parameters[0].name)
                      flag = false
                    end
                  end
                end
              end
            end
          end
        end
        return flag
      end
     
      def check_map?(map_id)
        flag = true
        $game_map = Game_Map.new
        $game_map.setup(map_id)
     
        if $game_map.parallax_name != "" && 
           !check_img_file?("Parallaxes",$game_map.parallax_name)
          @errmsg += sprintf("[Карта %04d] Не найден файл %s.png в папке Parallaxes\n", 
                       map_id,$game_map.parallax_name)
          flag = false
        end
        if $game_map.battleback1_name != "" && 
           !check_img_file?("Battlebacks1",$game_map.battleback1_name)
          @errmsg += sprintf("[Карта %04d] Не найден файл %s.png в папке Battlebacks1\n", 
                       map_id,$game_map.battleback1_name)
          flag = false
        end
        if $game_map.battleback2_name != "" && 
           !check_img_file?("Battlebacks2",$game_map.battleback2_name)
          @errmsg += sprintf("[Карта %04d] Не найден файл %s.png в папке Battlebacks2\n", 
                       map_id,$game_map.battleback2_name)
          flag = false
        end
        if $game_map.g_map.bgm.name != "" && 
           !check_mus_file?("BGM",$game_map.g_map.bgm.name)
          @errmsg += sprintf("[Карта %04d] Не найден трек %s в папке Audio/BGM\n", 
                       map_id,$game_map.g_map.bgm.name)
          flag = false
        end
        if $game_map.g_map.bgs.name != "" && 
           !check_mus_file?("BGS",$game_map.g_map.bgs.name)
           @errmsg += sprintf("[Карта %04d] Не найден трек %s в папке Audio/BGS\n", 
                        map_id,$game_map.g_map.bgs.name)
           flag = false
        end
        events=$game_map.events
     
        for i in 1..9999
          if events[i]!=nil
            for page in events[i].g_event.pages
              unless page.list.nil?
                if page.graphic.character_name  != "" &&
                   !check_img_file?("Characters",page.graphic.character_name)
                  @errmsg += sprintf("[Карта %04d, событие %04d] Не найдена графика события %s.png в папке Characters\n", 
                    map_id,i,page.graphic.character_name)
                  flag = false
                end
     
                for command in page.list
                  case command.code
                  when 101 
                    if command.parameters[0] != "" &&
                       !check_img_file?("Faces",command.parameters[0])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден фейс %s.png в папке Faces\n", 
                        map_id,i,command.parameters[0])
                      flag = false
                    end
                  when 231 
                    if command.parameters[1] != "" &&
                       !check_img_file?("Pictures",command.parameters[1])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найдена картинка %s.png в папке Pictures\n", 
                        map_id,i,command.parameters[1])
                      flag = false
                    end
                  when 241 
                    if command.parameters[0].name != "" &&
                       !check_mus_file?("BGM",command.parameters[0].name)
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден BGM файл %s в папке Audio/BGM\n", 
                        map_id,i,command.parameters[0].name)
                      flag = false
                    end
                  when 245 
                    if command.parameters[0].name != "" &&
                       !check_mus_file?("BGS",command.parameters[0].name)
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден BGS файл %s в папке Audio/BGS\n", 
                        map_id,i,command.parameters[0].name)
                      flag = false
                    end
                  when 249 
                    if command.parameters[0].name != "" &&
                       !check_mus_file?("ME",command.parameters[0].name)
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден ME файл %s в папке Audio/ME\n", 
                        map_id,i,command.parameters[0].name)
                      flag = false
                    end
                  when 250 
                    if command.parameters[0].name != "" &&
                       !check_mus_file?("SE",command.parameters[0].name)
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден SE файл %s в папке Audio/SE\n", 
                        map_id,i,command.parameters[0].name)
                      flag = false
                    end
                  when 283 
                    if command.parameters[0] != "" &&
                       !check_img_file?("Battlebacks1",command.parameters[0])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найдена картинка %s.png в папке Battlebacks1\n", 
                        map_id,i,command.parameters[0].name)
                      flag = false
                    end
                    if command.parameters[1] != "" &&
                       !check_img_file?("Battlebacks2",command.parameters[1])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найдена картинка %s.png в папке Battlebacks2\n", 
                        map_id,i,command.parameters[1])
                      flag = false
                    end
                  when 284 
                    if command.parameters[0] != "" &&
                       !check_img_file?("Parallaxes",command.parameters[0])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найдена картинка %s.png в папке Parallaxes\n", 
                        map_id,i,command.parameters[0])
                      flag = false
                    end
                  when 261 
                    if command.parameters[0] != "" &&
                       !check_vid_file?(command.parameters[0])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найдено видео %s в папке Movies\n", 
                        map_id,i,command.parameters[0])
                      flag = false
                    end
                  when 132
                    if command.parameters[0].name != "" &&
                       !check_mus_file?("BGM",command.parameters[0].name)
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден BGM файл %s в папке Audio/BGM\n", 
                        map_id,i,command.parameters[0].name)
                      flag = false
                    end
                  when 133 
                    if command.parameters[0].name != "" &&
                       !check_mus_file?("ME",command.parameters[0].name)
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден ME файл %s в папке Audio/ME\n", 
                        map_id,i,command.parameters[0].name)
                      flag = false
                    end
                  when 322 
                    if command.parameters[1] != "" &&
                       !check_img_file?("Characters",command.parameters[1])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден файл %s.png в папке Characters\n", 
                        map_id,i,command.parameters[1])
                      flag = false
                    end
                    if command.parameters[3] != "" &&
                       !check_img_file?("Faces",command.parameters[3])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден файл %s.png в папке Faces\n", 
                        map_id,i,command.parameters[3])
                      flag = false
                    end
                  when 323 
                    if command.parameters[1] != "" &&
                       !check_img_file?("Characters",command.parameters[1])
                      @errmsg += sprintf("[Карта %04d, событие %04d] Не найден файл %s.png в папке Characters\n", 
                        map_id,i,command.parameters[1])
                      flag = false
                    end
                  # move route
                  when 205 
                    for j in 0..command.parameters[1].list.length-1
                      cmd = command.parameters[1].list[j]
                      if cmd.code == 41 # change graphic
                        if cmd.parameters[0] != "" &&
                           !check_img_file?("Characters",cmd.parameters[0])
                          @errmsg += sprintf("[Карта %04d, событие %04d] Не найден файл %s.png в папке Characters\n", 
                                        map_id,i,cmd.parameters[0])
                          flag = false
                        end
                      end
                      if cmd.code == 44 # play SE
                        if cmd.parameters[0].name != "" &&
                           !check_mus_file?("SE",cmd.parameters[0].name)
                          @errmsg += sprintf("[Карта %04d, событие %04d] Не найден SE файл %s в папке Audio/SE\n", 
                                        map_id,i,cmd.parameters[0].name)
                          flag = false
                        end
                      end
                    end
                  end
                end
              end
            end
          end
        end
        return flag
      end
    end

    Спойлер скрипт unchecker:

    Код:
    #===============================================================================
    =begin
                                    RESOURCE_UNCHECKER
      Проверяльщик ресурсов
      Этот скрипт просматривает папки проекта на предмет неиспользуемых
      в проекте графических и звуковых ресурсов при выкладывании без РТП.
     
      Автор: caveman
     
    =end
    #===============================================================================
    class Resource_Unchecker
      attr_accessor :done
      attr_accessor :error
      attr_accessor :errmsg
     
      def initialize
        DataManager.init
        $checker=Checker.new if $checker==nil
     
        @done=true
        @error = false
     
        # списки существующих ресурсов по папкам
        # звуки
        @bgm_array = []
        @bgs_array = []
        @se_array = []
        @me_array = []
        # ролики
        @vid_array = []
        # графика
        @anim_array = []
        @bb1_array = []
        @bb2_array = []
        @btl_array = []
        @char_array = []
        @face_array = []
        @prlx_array = []
        @pict_array = []
        @sys_array = []
        @tile_array = []
        @ttl1_array = []
        @ttl2_array = []
     
        check_db
        check_commons
     
        for map in 1..$max_maps
          if FileTest.exist?(sprintf("Data/Map%03d.rvdata2",map))
            check_map(map)
          else
            next
          end
        end
     
        if !find_unused?
          @error = true
          @done = false
        elsif
          @error = false
          @done = true
        end
      end
     
      def find_unused?
        flag = true
     
        @errmsg = "[Audio/BGM]\n"
        Dir.foreach("Audio/BGM") {|x| 
        if x != "." && x != ".."
          if !@bgm_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Audio/BGS]\n"
        Dir.foreach("Audio/BGS") {|x| 
        if x != "." && x != ".."
          if !@bgs_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Audio/SE]\n"
        Dir.foreach("Audio/SE") {|x| 
        if x != "." && x != ".."
          if !@se_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Audio/ME]\n"
        Dir.foreach("Audio/ME") {|x| 
        if x != "." && x != ".."
          if !@me_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Movies]\n"
        Dir.foreach("Movies") {|x| 
        if x != "." && x != ".."
          if !@vid_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
     
        @errmsg += "\n"
        @errmsg += "[Graphics/Animations]\n"
        Dir.foreach("Graphics/Animations") {|x| 
        if x != "." && x != ".."
          if !@anim_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Battlebacks1]\n"
        Dir.foreach("Graphics/Battlebacks1") {|x| 
        if x != "." && x != ".."
          if !@bb1_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Battlebacks2]\n"
        Dir.foreach("Graphics/Battlebacks2") {|x| 
        if x != "." && x != ".."
          if !@bb2_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Battlers]\n"
        Dir.foreach("Graphics/Battlers") {|x| 
        if x != "." && x != ".."
          if !@btl_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Characters]\n"
        Dir.foreach("Graphics/Characters") {|x| 
        if x != "." && x != ".."
          if !@char_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Faces]\n"
        Dir.foreach("Graphics/Faces") {|x| 
        if x != "." && x != ".."
          if !@face_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Parallaxes]\n"
        Dir.foreach("Graphics/Parallaxes") {|x| 
        if x != "." && x != ".."
          if !@prlx_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Pictures]\n"
        Dir.foreach("Graphics/Pictures") {|x| 
        if x != "." && x != ".."
          if !@pict_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Tilesets]\n"
        Dir.foreach("Graphics/Tilesets") {|x| 
        if x != "." && x != ".."
          if !@tile_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Titles1]\n"
        Dir.foreach("Graphics/Titles1") {|x| 
        if x != "." && x != ".."
          if !@ttl1_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        @errmsg += "\n"
        @errmsg += "[Graphics/Titles2]\n"
        Dir.foreach("Graphics/Titles2") {|x| 
        if x != "." && x != ".."
          if !@ttl2_array.include?(File.basename(x, ".*"))
            @errmsg += sprintf("%s\n", x)
            flag = false
          end
        end }
        return flag
      end
     
      def check_img_file?(folder_name, file_name)
        if FileTest.exist?(sprintf("Graphics/%s/%s.%s",folder_name,file_name,"png"))
          return true
        end
        return false
      end
     
      def check_vid_file?(file_name)
        if FileTest.exist?(sprintf("Movies/%s",file_name))
          return true
        end
        return false
      end
     
      def check_mus_file?(folder_name, file_name)
        if FileTest.exist?(sprintf("Audio/%s/%s.%s",folder_name,file_name,"mp3")) ||
           FileTest.exist?(sprintf("Audio/%s/%s.%s",folder_name,file_name,"ogg"))
          return true
        end
        return false
      end
     
      def check_db
        # actors
        for i in 1...$data_actors.size
          if $data_actors[i].character_name != "" && 
              !@char_array.include?($data_actors[i].character_name)
             @char_array.push($data_actors[i].character_name)
          end
          if $data_actors[i].face_name != "" &&
             !@face_array.include?($data_actors[i].face_name)
            @face_array.push($data_actors[i].face_name)
          end
        end
        # enemies
        for i in 1...$data_enemies.size
          if $data_enemies[i].battler_name != "" &&
             !@btl_array.include?($data_enemies[i].battler_name)
            @btl_array.push($data_enemies[i].battler_name)
          end
        end
        # animations
        for i in 1...$data_animations.size
          if $data_animations[i].animation1_name != "" && 
             !@anim_array.include?($data_animations[i].animation1_name)
            @anim_array.push($data_animations[i].animation1_name)
          end
          if $data_animations[i].animation2_name != "" && 
             !@anim_array.include?($data_animations[i].animation2_name)
            @anim_array.push($data_animations[i].animation2_name)
          end
        end
        # tilesets
        for i in 1...$data_tilesets.size
          for j in 0...8
            if $data_tilesets[i].tileset_names[j] != "" &&
               !@tile_array.include?($data_tilesets[i].tileset_names[j])
              @tile_array.push($data_tilesets[i].tileset_names[j])
            end
          end
        end
        # system
        if $data_system.title1_name  != "" &&
            !@ttl1_array.include?($data_system.title1_name)
          @ttl1_array.push($data_system.title1_name)
        end
        if $data_system.title2_name  != "" &&
            !@ttl2_array.include?($data_system.title2_name)
          @ttl2_array.push($data_system.title2_name)
        end
     
        if $data_system.boat.character_name != "" &&
            !@char_array.include?($data_system.boat.character_name)
          @char_array.push($data_system.boat.character_name)
        end
        if $data_system.ship.character_name != "" &&
            !@char_array.include?($data_system.ship.character_name)
          @char_array.push($data_system.ship.character_name)
        end    
        if $data_system.airship.character_name != "" &&
            !@char_array.include?($data_system.airship.character_name)
          @char_array.push($data_system.airship.character_name)
        end
     
        if $data_system.title_bgm.name != "" &&
           !@bgm_array.include?($data_system.title_bgm.name)
          @bgm_array.push($data_system.title_bgm.name)
        end
        if $data_system.battle_bgm.name != "" &&
           !@bgm_array.include?($data_system.battle_bgm.name)
          @bgm_array.push($data_system.battle_bgm.name)
        end
        if $data_system.battle_end_me.name != "" &&
            !@me_array.include?($data_system.battle_end_me.name)
          @me_array.push($data_system.battle_end_me.name)
        end
        if $data_system.gameover_me.name != "" &&
           !@me_array.include?($data_system.gameover_me.name)
          @me_array.push($data_system.gameover_me.name)
        end
        if $data_system.boat.bgm.name != "" && 
           !@bgm_array.include?($data_system.boat.bgm.name)
          @bgm_array.push($data_system.boat.bgm.name)
        end
        if $data_system.ship.bgm.name != "" && 
           !@bgm_array.include?($data_system.ship.bgm.name)
          @bgm_array.push($data_system.ship.bgm.name)
        end
        if $data_system.airship.bgm.name != "" && 
           !@bgm_array.include?($data_system.airship.bgm.name)
          @bgm_array.push($data_system.airship.bgm.name)
        end
        for j in 0..23 
          if $data_system.sounds[j].name != "" && 
             !@se_array.include?($data_system.sounds[j].name)
            @se_array.push($data_system.sounds[j].name)
          end
        end
      end
     
      def check_commons
        for i in 1...$data_common_events.size
          list = $data_common_events[i].list
          if list != nil
            for command in list
              case command.code
              when 101 
                if command.parameters[0] != "" &&
                   !@face_array.include?(command.parameters[0])
                  @face_array.push(command.parameters[0])
                end
              when 231 
                if command.parameters[1] != "" &&
                   !@pict_array.include?(command.parameters[1])
                  @pict_array.push(command.parameters[1])
                end
              when 241 
                if command.parameters[0].name != "" &&
                   !@bgm_array.include?(command.parameters[0].name)
                  @bgm_array.push(command.parameters[0].name)
                end
              when 245 
                if command.parameters[0].name != "" &&
                   !@bgs_array.include?(command.parameters[0].name)
                  @bgs_array.push(command.parameters[0].name)
                end
              when 249 
                if command.parameters[0].name != "" &&
                   !@me_array.include?(command.parameters[0].name)
                  @me_array.push(command.parameters[0].name)
                end
              when 250 
                if command.parameters[0].name != "" &&
                   !@se_array.include?(command.parameters[0].name)
                  @se_array.push(command.parameters[0].name)
                end
              when 283 
                if command.parameters[0] != "" &&
                   !@bb1_array.include?(command.parameters[0])
                  @bb1_array.push(command.parameters[0])
                end
                if command.parameters[1] != "" &&
                   !@bb2_array.include?(command.parameters[1])
                  @bb2_array.push(command.parameters[1])
                end
              when 284 
                if command.parameters[0] != "" &&
                   !@prlx_array.include?(command.parameters[0])
                  @prlx_array.push(command.parameters[0])
                end
              when 261 
                if command.parameters[0] != "" &&
                   !@vid_array.include?(command.parameters[0])
                  @vid_array.push(command.parameters[0])
                end
              when 132
                if command.parameters[0].name != "" &&
                   !@bgm_array.include?(command.parameters[0].name)
                  @bgm_array.push(command.parameters[0].name)
                end
              when 133 
                if command.parameters[0].name != "" &&
                   !@me_array.include?(command.parameters[0].name)
                  @me_array.push(command.parameters[0].name)
                end
              when 322 
                if command.parameters[1] != "" &&
                   !@char_array.include?(command.parameters[1])
                  @char_array.push(command.parameters[1])
                end
                if command.parameters[3] != "" &&
                   !@face_array.include?(command.parameters[3])
                  @face_array.push(command.parameters[3])
                end
              when 323 
                if command.parameters[1] != "" &&
                   !@char_array.include?(command.parameters[1])
                  @char_array.push(command.parameters[1])
                end
              # move route
              when 205 
                for j in 0..command.parameters[1].list.length-1
                  cmd = command.parameters[1].list[j]
                  if cmd.code == 41 # change graphic
                    if cmd.parameters[0] != "" &&
                       !@char_array.include?(cmd.parameters[0])
                      @char_array.push(cmd.parameters[0])
                    end
                  end
                  if cmd.code == 44 # play SE
                    if cmd.parameters[0].name != "" &&
                       !@se_array.include?(cmd.parameters[0].name)
                      @se_array.push(cmd.parameters[0].name)
                    end
                  end
                end
              end
            end
          end
        end
      end
     
      def check_map(map_id)
        $game_map = Game_Map.new
        $game_map.setup(map_id)
     
        if $game_map.parallax_name != "" && 
           !@prlx_array.include?($game_map.parallax_name)
          @prlx_array.push($game_map.parallax_name)
        end
        if $game_map.battleback1_name != "" && 
           !@bb1_array.include?($game_map.battleback1_name)
          @bb1_array.push($game_map.battleback1_name)
        end
        if $game_map.battleback2_name != "" && 
           !@bb2_array.include?($game_map.battleback2_name)
          @bb2_array.push($game_map.battleback2_name)
        end
        if $game_map.g_map.bgm.name != "" && 
           !@bgm_array.include?($game_map.g_map.bgm.name)
          @bgm_array.push($game_map.g_map.bgm.name)
        end
        if $game_map.g_map.bgs.name != "" && 
           !@bgs_array.include?($game_map.g_map.bgs.name)
          @bgs_array.push($game_map.g_map.bgs.name)
        end
        events=$game_map.events
     
        for i in 1..9999
          if events[i]!=nil
            for page in events[i].g_event.pages
              unless page.list.nil?
                if page.graphic.character_name  != "" &&
                   !@char_array.include?(page.graphic.character_name)
                  @char_array.push(page.graphic.character_name)
                end
     
                for command in page.list
                  case command.code
                  when 101 
                    if command.parameters[0] != "" &&
                       !@face_array.include?(command.parameters[0])
                      @face_array.push(command.parameters[0])
                    end
                  when 231 
                    if command.parameters[1] != "" &&
                       !@pict_array.include?(command.parameters[1])
                      @pict_array.push(command.parameters[1])
                    end
                  when 241 
                    if command.parameters[0].name != "" &&
                       !@bgm_array.include?(command.parameters[0].name)
                      @bgm_array.push(command.parameters[0].name)
                    end
                  when 245 
                    if command.parameters[0].name != "" &&
                       !@bgs_array.include?(command.parameters[0].name)
                      @bgs_array.push(command.parameters[0].name)
                    end
                  when 249 
                    if command.parameters[0].name != "" &&
                       !@me_array.include?(command.parameters[0].name)
                      @me_array.push(command.parameters[0].name)
                    end
                  when 250 
                    if command.parameters[0].name != "" &&
                       !@se_array.include?(command.parameters[0].name)
                      @se_array.push(command.parameters[0].name)
                    end
                  when 283 
                    if command.parameters[0] != "" &&
                       !@bb1_array.include?(command.parameters[0])
                      @bb1_array.push(command.parameters[0])
                    end
                    if command.parameters[1] != "" &&
                       !@bb2_array.include?(command.parameters[1])
                      @bb2_array.push(command.parameters[1])
                    end
                  when 284 
                    if command.parameters[0] != "" &&
                       !@prlx_array.include?(command.parameters[0])
                      @prlx_array.push(command.parameters[0])
                    end
                  when 261 
                    if command.parameters[0] != "" &&
                       !@vid_array.include?(command.parameters[0])
                      @vid_array.push(command.parameters[0])
                    end
                  when 132
                    if command.parameters[0].name != "" &&
                       !@bgm_array.include?(command.parameters[0].name)
                      @bgm_array.push(command.parameters[0].name)
                    end
                  when 133 
                    if command.parameters[0].name != "" &&
                       !@me_array.include?(command.parameters[0].name)
                      @me_array.push(command.parameters[0].name)
                    end
                  when 322 
                    if command.parameters[1] != "" &&
                       !@char_array.include?(command.parameters[1])
                      @char_array.push(command.parameters[1])
                    end
                    if command.parameters[3] != "" &&
                       !@face_array.include?(command.parameters[3])
                      @face_array.push(command.parameters[3])
                    end
                  when 323 
                    if command.parameters[1] != "" &&
                       !@char_array.include?(command.parameters[1])
                      @char_array.push(command.parameters[1])
                    end
                  # move route
                  when 205 
                    for j in 0..command.parameters[1].list.length-1
                      cmd = command.parameters[1].list[j]
                      if cmd.code == 41 # change graphic
                        if cmd.parameters[0] != "" &&
                           !@char_array.include?(cmd.parameters[0])
                          @char_array.push(cmd.parameters[0])
                        end
                      end
                      if cmd.code == 44 # play SE
                        if cmd.parameters[0].name != "" &&
                           !@se_array.include?(cmd.parameters[0].name)
                          @se_array.push(cmd.parameters[0].name)
                        end
                      end
                    end
                  end
                end
              end
            end
          end
        end
      end
    end

    Использование:
    Описание настроек скрипта внутри его. По умолчанию он встраивается пунктом "Настройки->Проверить" в титульное меню, для проверенной игры этот пункт можно отключить флагом @do_title_debug.
    Результат проверки выкидывается в файл check.txt или uncheck.txt в корне проекта.

    Прикладываю также демку "забытыми" и "лишними" ресурсами, на которые проверки ругаются, и, если все вернуть на место / убрать - то проверка проходит, да и игра падать перестает
    http://yadi.sk/d/ELjQqrOR79tvz
    Последний раз редактировалось caveman; 31.07.2013 в 21:53. Причина: unchecker
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

  2. #2
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию

    На Светлой любезно подкинули ссылку на аналог для XP
    http://downloads.chaos-project.com/s...e%20Tester.txt
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

  3. #3
    Маститый Аватар для The Joker
    Информация о пользователе
    Регистрация
    16.06.2008
    Сообщений
    1,209
    Записей в дневнике
    11
    Репутация: 29 Добавить или отнять репутацию

    По умолчанию

    Если действительно работает на Вх классическом, как гласит заголовок, обкатаю сегодня на себе.
    Или в заагооловк темы неправда? Сможешьь под Ргсс2 перекатать?
    лол

  4. #4
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию

    заголовок кто-то подло изменил или я промахнулся.

    у меня нет vx и покупать его не собираюсь, если под вх появятся небольшие ошибки - могу по фотографии что-нибудь подправить
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

  5. #5
    Маститый Аватар для The Joker
    Информация о пользователе
    Регистрация
    16.06.2008
    Сообщений
    1,209
    Записей в дневнике
    11
    Репутация: 29 Добавить или отнять репутацию

    По умолчанию

    Он будет полностью неработоспособен на Ргсс2, однозначЪно, править придется весь скрипт. Ладно, будем работать по старинке
    лол

  6. #6
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию

    Может у тебя по аналогии получится переписать?
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

  7. #7
    Маститый Аватар для The Joker
    Информация о пользователе
    Регистрация
    16.06.2008
    Сообщений
    1,209
    Записей в дневнике
    11
    Репутация: 29 Добавить или отнять репутацию

    По умолчанию

    Я могу переписать суть скрипта в рассказе на десять листов, со своим уникальным сюжетом и драмой. Но точно не на руби.
    лол

  8. #8
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию

    Добавил в скрипт функцию "unchecker", которая проверяет папки проекта на наличие неиспользуемых ресурсов, что, возможно, позволит мейкеристу уменьшить вес проекта на выходе.
    Проверка встраивается в меню настройки, как и предыдущая.

    Также добавил несколько забытых проверок в checker (это титульники и первоначальная графика событий), скрипты обновил в 1м посте, дему обновил.
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Resource Checker