Ergebnis 1 bis 7 von 7

Thema: Script --> Ressourcenzahler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Teil 1
    Code:
    #--------------------------------------------------------------------------
    # * Benötigte Methoden
    #--------------------------------------------------------------------------
    class Class
      #--------------------------------------------------------------------------
      # * Erzeugt alternative Namen für eine Methode -KD
      #--------------------------------------------------------------------------
      def link(methode, *namen)
        namen.each {|n| define_method(n) {|*a| method(methode).call(*a)}}
      end
      def link_classmethod(methode, *namen)
        $methode = methode
        namen.each {|n| 
          $n = n
          class << self
            methode, n = $methode, $n
            define_method(n) {|*a| self.method(methode).call(*a)} 
          end
        }
        $methode = nil
        $n = nil
      end
    end
    class Array
      #--------------------------------------------------------------------------
      # * Addiert zwei Arrays ohne doppelte o. leere Elemente hinzuzufügen -KD
      #--------------------------------------------------------------------------
      def add(*args)
        args.each {|e| push(e) unless include?(e) or e.empty?} 
      end
    end
    class Hash
      #--------------------------------------------------------------------------
      # * Sucht nach einem passenden Key für einen Value/Suchblock -KD
      #--------------------------------------------------------------------------
      def key_for_value(search_value)
        key = nil
        ergebnis = each_pair {|key, value|
          break if if block_given? then
            yield(value, search_value)
          else
            value == search_value
          end
          true
        }
        if ergebnis then false else key end
      end
    end
    class Symbol
      #--------------------------------------------------------------------------
      # * Macht ein Symbol zu einem Instanzvariablensymbol -KD
      #--------------------------------------------------------------------------
      def to_isym
        return ('@' + self.to_s).to_sym
      end
    end
    
    class Fixnum
      #--------------------------------------------------------------------------
      # * Liefert einen String mit einer n-stellen Zahl. -KD
      #--------------------------------------------------------------------------
      def zu_nstelligen_string(n)
        vor = ""
        (n-1).downto(0) {|stelle| vor = vor.concat('0') if self < 10**stelle }
        vor.concat(self.to_s)
      end
    end
    
    class Float
      #--------------------------------------------------------------------------
      # * Gibt Datengröße an. -KD
      #--------------------------------------------------------------------------
      EINHEITEN = ["byte", "kb", "mb", "gb"]
      def datasize
        size = self; counter = 0
        while counter < EINHEITEN.size-1 and (a=size / 1024) >= 0.1
          size = a; counter += 1;
        end
        size.to_s + ' ' + EINHEITEN[counter]
      end
    end
    
    class File
      #--------------------------------------------------------------------------
      # * Überprüft, ob der Dateiname auf eine Ressourcendatei zeigt -KD
      #--------------------------------------------------------------------------
      def self.ressource?(pfad, *possible_endings)
        pfad =~ /.+\.(.+)/
        !(possible_endings.find {|e| e == $1}).nil?
      end
      #--------------------------------------------------------------------------
      # * Erzeugt einen Ordner - WATANABE, Hirofumi (Ruby Standard Library)
      #--------------------------------------------------------------------------
      def self.makedirs(*dirs)
        verbose = if dirs[-1].is_a? String then false else dirs.pop end
        mode = 0755
        for dir in dirs
          parent = dirname(dir)
          next if parent == dir or directory? dir
          makedirs parent unless directory? parent
          $stderr.print "mkdir ", dir, "\n" if verbose
          if basename(dir) != ""
            begin
              Dir.mkdir dir, mode
            rescue SystemCallError
              raise unless directory? dir
            end
          end
        end
      end
      #--------------------------------------------------------------------------
      # * Sucht nach Dateien - (Ruby Standard Library)
      #--------------------------------------------------------------------------
      def self.find(*paths)
        paths.collect!{|d| d.dup}
        while file = paths.shift
          catch(:prune) do
            yield file.dup.taint
            next unless File.exist? file
            begin
              if File.lstat(file).directory? then
                d = Dir.open(file)
                begin
                  for f in d
                    next if f == "." or f == ".."
                    if File::ALT_SEPARATOR and 
                    file =~ /^(?:[\/\\]|[A-Za-z]:[\/\\]?)$/ then
                      f = file + f
                    elsif file == "/" then
                      f = "/" + f
                    else
                      f = File.join(file, f)
                    end
                    paths.unshift f.untaint
                  end
                ensure
                  d.close
                end
              end
            rescue Errno::ENOENT, Errno::EACCES
            end
          end
        end
      end
      
      def self.prune
        throw :prune
      end
      #--------------------------------------------------------------------------
      # * Kopiert Dateien -Ruby Standard Library
      #--------------------------------------------------------------------------
      BUFSIZE = 8 * 1024
      def self.catname(from, to)
        if directory? to
          join to.sub(%r([/\\]$), ''), basename(from)
        else
          to
        end
      end
      def self.syscopy(from, to)
        to = catname(from, to)
        fmode = stat(from).mode
        tpath = to
        not_exist = !exist?(tpath)
        from = open(from, "rb")
        to = open(to, "wb")
        begin
          while true do to.syswrite from.sysread(BUFSIZE) end
        rescue EOFError
          ret = true
        rescue
          ret = false
        ensure
          to.close
          from.close
        end
        chmod(fmode, tpath) if not_exist
        ret
      end
    end
    Teil 2

    Code:
    #==============================================================================
    # ** Ressourcen - von KD
    #------------------------------------------------------------------------------
    #  Diese Klasse speichert Ressourcennamen und liest diese aus Projekten aus
    #==============================================================================
    class Ressourcen
      include(Enumerable)
      #--------------------------------------------------------------------------
      # * Konstanten
      #--------------------------------------------------------------------------
      ORDNER = "Data/"                  #Ordner wo die Daten sich befinden
      MAPS = "Map"                      #Dateiname der Maps
      ENDUNG = ".rxdata"                #Dateiendung der Daten 
      LOGPFAD = "/log/"                 #Pfad der Logdateien
      LOGNAME = "ressourcen"            #Dateiname der Logdatei
      LOGENDING = '.log'                #Dateiendung der Logdateien
      LOESCHPFAD = "/nicht_benoetigt/"  #Pfad für verschobene Ressourcendateien
      
      #Konstanten für den Automatik-Vorgang
      LOGGEN      = true      #Genutzte Ressourcen werden geloggt
      MULTI_FILE  = false     #Ressourcen werden in mehreren Textdateien geloggt
      LOG_UNUSED  = true      #Ungenutzte Ressourcen werden extra geloggt
      LOESCHEN    = false     #nicht benötigte Ressourcen werden gelöscht
      EXIT        = true      #Nach Ausführen des Vorgangs wird Programm beendet
      LOG_ORDNER  = '/unused/'#Logordner für ungenutzte Ressourcen
      UNUSEDNAME  = 'unused'  #Dateiname für ungenutzte-Ressourcenlogdatei
      #--------------------------------------------------------------------------
      # * Attribute
      #-------------------------------------------------------------------------- 
      METADIRECTORY = Hash.new
      METADIRECTORY['graphics'] = [:characters, :windowskins, :transitions,
                 :fogs, :battlebacks, :panoramas, :windowskins, :characters,
                 :animations, :autotiles, :battlers, :gameovers, :icons,
                 :pictures, :tilesets, :titles]
      METADIRECTORY['audio'] = [:se, :bgs, :me, :bgm]
      TYPEN = METADIRECTORY.values.flatten
      #Attribut Readers -> Metadirectories, Typen, root
      METADIRECTORY.each_key {|meta| define_method(meta.to_sym) {
        result = Array.new
        METADIRECTORY[meta].each {|m| result << self.method(m).call}
        result.flatten
      }}
      attr_reader(:root, *TYPEN)
      #============================================================================
      #            ***Initialisierung der Instanzvariablen***
      #  root#String : Gibt den Pfad zum Projektordner an
      #============================================================================
      def initialize(root='.')
        TYPEN.each {|typ|
          self.instance_variable_set(typ.to_isym, Array.new)
        }
        @root = root
      end
      #============================================================================
      #                         ***Klassenmethoden***
      #============================================================================
      #--------------------------------------------------------------------------
      # * Definiert Dateiendungen für einen Typ o. Metaordner
      #  klassifizierung#String/Symbol : Metaordner oder Typ der Dateiendung
      #  *extensions#Strings : Name der Dateiendung
      #--------------------------------------------------------------------------
      @@extensions = Hash.new
      def self.extensions_for(klassifizierung, *extensions)
        k = klassifizierung.to_s.downcase
        if @@extensions[k] then
          @@extensions[k].add(extensions)
        else
          @@extensions[k] = extensions
        end
      end
      #--------------------------------------------------------------------------
      # * Erzeugt Dateiendungen
      #--------------------------------------------------------------------------
      extensions_for('audio', 'mid', 'ogg', 'wav', 'mp3', 'wma')
      extensions_for('graphics', 'png', 'bmp', 'jpg')
      #--------------------------------------------------------------------------
      # * Gib Dateiendungen für bestimmten Typ/Metaordner zurück => Array
      #  typ#String/Symbol : Metaordner oder Typ, der gesuchte Dateiendung hat
      #                      Standardmäßig werden alle Dateiendungen ausgegeben
      #--------------------------------------------------------------------------
      def self.extensions(typ=true)
        if (typ==true) then return @@extensions.values.flatten end
        key = typ.to_s.downcase
        if @@extensions.has_key?(key) then
          @@extensions[key]
        elsif @@extensions.has_key?(n=metadirectory_for(typ).to_s.downcase)
          @@extensions[n]
        else
          []
        end
      end
      def extensions(t=true); Ressourcen.extensions(t); end
      #--------------------------------------------------------------------------
      # * Gibt den Metaordner für einen Typ aus => nil oder String
      #  typ#Symbol : Typ, dessen Metaordner gesucht wird
      #--------------------------------------------------------------------------
      def self.metadirectory_for(typ)
        if typ then
          typ = typ.to_s.downcase.to_sym
          METADIRECTORY.key_for_value(typ) {|h, s| h.include?(s)}
        else
          nil
        end
      end
      def metadirectory_for(typ); Ressourcen.metadirectory_for(typ); end
      #--------------------------------------------------------------------------
      # * Sucht nach Ressourcen, loggt diese und löscht ggf. nicht benötigte
      #--------------------------------------------------------------------------
      def self.automatik()
        ressourcen = genutzte_ressourcen.sort!
        if MULTI_FILE then ressourcen.loggen else ressourcen.loggen_one end if LOGGEN
        if LOG_UNUSED or LOESCHEN then 
          unused = Ressourcen.ungenutzte_ressourcen(ressourcen)
        end
        if LOG_UNUSED then
          if MULTI_FILE then 
            unused.loggen(LOG_ORDNER) 
          else 
            unused.loggen_one(LOGPFAD, UNUSEDNAME)
          end
        end
        if LOESCHEN then unused.verschiebe end
        exit if EXIT
      end
      
      #--------------------------------------------------------------------------
      # * Erzeugt Construktor-Methoden
      #  methode#Symbol : Methode, für die ein Constructor erzeugt wird
      #--------------------------------------------------------------------------
      def self.constructor(methode)
        $methode = methode
        class << self; m = $methode; define_method(m) {|*a|
          root=if a[0].class==String and self.instance_method(m).arity.abs < a.size 
            a.shift else "." 
          end
          r = self.new(root)
          r.method(m).call(*a)
          r
        } end
        $methode = nil
      end
      #--------------------------------------------------------------------------
      # * Erzeugt Constructor und alternative Methodennamen
      #  name#Symbol : Methode, die behandelt wird
      #  *alternatives#Symbole : Alternative Methodennamen
      #--------------------------------------------------------------------------
      def self.constructor_and_alternatives(name, *alternatives)
        constructor(name) #erzeuge Konstructor für Methode
        link(name, *alternatives) #alternative namen für Methode
        link_classmethod(name, *alternatives) #alternative namen für Konstruktor
      end
      #============================================================================
      #              ***Constructor Methoden*** => Ressourcenobjekt
      #  Als Klassenmethoden genutzt erzeugen sie neue Ressourcen-Objekte
      #    root#String : Erzeugt ein Ressourcenobjekt in diesem Projektordner
      #  Als Instanzmethoden genutzt fügen sie dem Objekt neue Ressourcen hinzu
      #============================================================================
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus genutzten Ressourcen eines Projektes
      #--------------------------------------------------------------------------
      def genutzte_ressourcen()
        durchsuche_maps
        durchsuche_database
        self
      end
      constructor_and_alternatives(:genutzte_ressourcen, :used_ressources)
      #--------------------------------------------------------------------------
      # *  Erzeugt ein Ressourcenobjekt aus importierten Ressourcen eines Projektes
      #--------------------------------------------------------------------------
      def importierte_ressourcen()
        pfad = @root + '/'
        #Durchsuche alle Metaordner
        directories = METADIRECTORY.keys.collect {|e| pfad + e.to_s}
        dirs = ""
        METADIRECTORY.keys.each {|d| dirs = dirs.concat('|' + d.to_s)}
        dirs = dirs.sub('|', '')
        pfad = ' ' + pfad
        while a = pfad =~ /[^\\]\./ do pfad[a+1] = '\\.'  end
        while a = pfad =~ /[^\\]\// do pfad[a+1] = '\\/'  end
        pfad[0] = ''
        regexp = Regexp.new(pfad+"(#{dirs})"+'\/(.+)\/(.+)\..+', true)
        File.find(*directories) {|pfad|
          #Wenn gefundene Datei die passende Dateiendung hat....
          pfad =~ regexp
          if File.ressource?(pfad.downcase, *extensions($2)) then
            #...soll sie in die Liste aufgenommen werden
            if method(methode=$2.downcase.to_sym) then
              method(methode).call.add($3)
            end
          end
        }
        self
      end
      constructor_and_alternatives(:importierte_ressourcen, :imported_ressources)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus nichtbenötigten Ressourcen des Projektes
      #  genutzte#Ressourcen : Prozess lässt sich beschleunigen, wenn das
      #                        genutzte-Ressourcenobjekt zuvor schon erzeugt wurde 
      #--------------------------------------------------------------------------
      def ungenutzte_ressourcen(genutzte=nil)
        genutzte = Ressourcen.genutzte_ressourcen(@root) unless genutzte
        importierte_ressourcen()
        drop(genutzte)
      end
      constructor_and_alternatives(:ungenutzte_ressourcen, :unused_ressources)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus einer Map
      #  mapdateiname#String : Pfad zur Mapdatei
      #--------------------------------------------------------------------------
      def durchsuche_map(mappfad)
        map = load_data(@root+'/'+mappfad)
        #Suche aus der Map alle Sounddateien heraus
        bgm.add(map.bgm.name) if map.autoplay_bgm
        bgm.add(map.bgs.name) if map.autoplay_bgs
        #Suche aus der Map alle Eventgrafiken heraus
        events = map.events
        events.each_value {|event|
          event.pages.each {|page|
            characters.add(page.graphic.character_name)
            #Suche alle Ressourcen aus MoveBefehlen heraus
            durchsuche_moveroute(page.move_route.list)
            #Suche alle Ressourcen aus Eventbefehlen heraus
            durchsuche_eventcommands(page.list)
          }
        }
        self
      end
      constructor_and_alternatives(:durchsuche_map, :scan_map)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus den Mapdaten
      #--------------------------------------------------------------------------
      def durchsuche_maps
        #Suche in den Maps nach verwendeten Ressourcen
        i = 1
        name = ORDNER + MAPS+i.zu_nstelligen_string(3)+ENDUNG
        while File.exist?(@root + "/" + name)
          durchsuche_map(name)
          i += 1
          name = ORDNER + MAPS+i.zu_nstelligen_string(3)+ENDUNG
        end
        self
      end
      constructor_and_alternatives(:durchsuche_maps, :scan_maps)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus den Move-Routes
      #  move_list#RPG::MoveCommand-Array : Move-Commands die durchsucht werden
      #--------------------------------------------------------------------------
      def durchsuche_moveroute(move_liste)
        move_liste.each {|befehl|
          case befehl.code
            when 41
              characters.add(befehl.parameters[0])
            when 44
              bgs.add(befehl.parameters[0].name)
            when 45
              durchsuche_script(befehl.parameters[0])
            end
        }
        self
      end
      constructor_and_alternatives(:durchsuche_moveroute, :scan_moveroute)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus den Event Commands
      #  liste#RPG::EventCommand-Array : EventCommands die durchsucht werden
      #--------------------------------------------------------------------------
      def durchsuche_eventcommands(liste)
        rubystring = ""
        messagestring = ""
        commentstring = ""
        liste.each {|befehl|
          case befehl.code
            when 101, 401
              messagestring += "\n" + befehl.parameters[0]
            when 108, 408
              commentstring += "\n" + befehl.parameters[0]
            when 111
              if befehl.parameters[4] == 12
                rubystring + "\n" + befehl.parameters[1]
              end
            when 131
              windowskins.add(befehl.parameters[0])
            when 132
              bgm.add(befehl.parameters[0].name)
            when 133
              me.add(befehl.parameters[0].name)
            when 204
              case befehl.parameters[0]
                when 0 then panoramas.add(befehl.parameters[1])
                when 1 then fogs.add(befehl.parameters[1])
                when 2 then battlebacks.add(befehl.parameters[1])
              end
            when 209
              durchsuche_moveroute(befehl.parameters[1].list)
            when 222
              transitions.add(befehl.parameters[0])
            when 231
              pictures.add(befehl.parameters[1])
            when 241
              bgm.add(befehl.parameters[0].name)
            when 245
              bgs.add(befehl.parameters[0].name)
            when 249
              me.add(befehl.parameters[0].name)
            when 250
              se.add(befehl.parameters[0].name)
            when 322
              characters.add(befehl.parameters[1])
              battlers.add(befehl.parameters[3])
            when 355
              rubystring.concat(befehl.parameters[0])
            when 655
              rubystring.concat(befehl.parameters[0])
          end
        }
        durchsuche_script(rubystring)
        durchsuche_message(messagestring)
        durchsuche_comment(commentstring)
        self
      end
      constructor_and_alternatives(:durchsuche_eventcommands, :scan_eventcommands)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus den Rubyscripts (unvollständig)
      #  string#String : String aus Rubyscripten, der durchsucht wird
      #--------------------------------------------------------------------------
      def durchsuche_script(string)
        self
      end
      constructor_and_alternatives(:durchsuche_script, :scan_script)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus den Messagescripts (unvollständig)
      #  string#String : String aus Messages, der durchsucht wird
      #--------------------------------------------------------------------------
      def durchsuche_message(string)
        self
      end
      constructor_and_alternatives(:durchsuche_script, :scan_script)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus den Commentcripts (unvollständig)
      #  string#String : String aus Comments, der durchsucht wird
      #--------------------------------------------------------------------------
      def durchsuche_comment(string)
        self
      end
      constructor_and_alternatives(:durchsuche_script, :scan_script)
      #--------------------------------------------------------------------------
      # * Erzeugt ein Ressourcenobjekt aus den Informationen der Database
      #--------------------------------------------------------------------------
      def durchsuche_database
        #Actors
        datei = load_data("#{@root}/Data/Actors.rxdata")
        datei.each {|actor|
          next unless actor
          characters.add(actor.character_name)
          battlers.add(actor.battler_name)
        }
        #Skills und Items
        datei = load_data("#{@root}/Data/Skills.rxdata") +
          load_data("#{@root}/Data/Items.rxdata")
        datei.each {|e|
          next unless e
          icons.add(e.icon_name)
          se.add(e.menu_se.name)
        }
        #Weapons und armors
        datei = load_data("#{@root}/Data/Weapons.rxdata") +
          load_data("#{@root}/Data/Armors.rxdata")
        datei.each {|e| 
          next unless e
          icons.add(e.icon_name)
        }
        #Enemies
        datei = load_data("#{@root}/Data/Enemies.rxdata")
        datei.each {|e| 
          next unless e
          battlers.add(e.battler_name)
        }
        #Battle-Events
        datei = load_data("#{@root}/Data/Troops.rxdata")
        datei.each {|e|
          next unless e
          e.pages.each {|page|
            durchsuche_eventcommands(page.list)
          }
        }
        #Animations
        datei = load_data("#{@root}/Data/Animations.rxdata")
        datei.each {|e|
          next unless e
          animations.add(e.animation_name)
          e.timings.each {|time| se.add(time.se.name)}
        }
        #Tilesets
        datei = load_data("#{@root}/Data/Tilesets.rxdata")
        datei.each {|e|
          next unless e
          tilesets.add(e.tileset_name)
          autotiles.add(*e.autotile_names)
          panoramas.add(e.panorama_name)
          fogs.add(e.fog_name)
          battlebacks.add(e.battleback_name)
        }
        #CommonEvents
        datei = load_data("#{@root}/Data/CommonEvents.rxdata")
        datei.each {|e| 
          next unless e
          durchsuche_eventcommands(e.list)
        }
        #System
        datei = load_data("#{@root}/Data/System.rxdata")
        windowskins.add(datei.windowskin_name)
        titles.add(datei.title_name)
        gameovers.add(datei.gameover_name)
        windowskins.add(datei.windowskin_name)
        transitions.add(datei.battle_transition)
        bgm.add(datei.title_bgm.name)
        bgm.add(datei.battle_bgm.name)
        me.add(datei.battle_end_me.name)
        me.add(datei.gameover_me.name)
        se.add(datei.cursor_se.name)
        se.add(datei.decision_se.name)
        se.add(datei.cancel_se.name)
        se.add(datei.buzzer_se.name)
        se.add(datei.equip_se.name)
        se.add(datei.shop_se.name)
        se.add(datei.save_se.name)
        se.add(datei.load_se.name)
        se.add(datei.battle_start_se.name)
        se.add(datei.escape_se.name)
        se.add(datei.actor_collapse_se.name)
        se.add(datei.enemy_collapse_se.name)
        battlebacks.add(datei.battleback_name)
        battlers.add(datei.battler_name)
        self
      end
      constructor_and_alternatives(:durchsuche_database, :scan_database)
      #============================================================================
      #                     ***Öffentliche Instanzmethoden***
      #============================================================================
      #--------------------------------------------------------------------------
      # * Sortiert ein Ressourcenobjekt => Ressourcen
      #--------------------------------------------------------------------------
      def sort!
        TYPEN.each {|typ|
          array = self.instance_variable_get(typ.to_isym)
          array.sort!
        }
        self
      end
      #--------------------------------------------------------------------------
      # * Gibt jene Ressourcentypen zurück, die nicht leer sind => Symbol-Array
      #--------------------------------------------------------------------------
      def typen
        TYPEN.find_all {|t| !self.instance_variable_get(t.to_isym).empty?}
      end
      #--------------------------------------------------------------------------
      # * Addition zweier Ressourcenobjekte => Ressourcen
      #  other#Ressourcen : Summant, mit dem das Ressourcenobjekt addiert wird
      #--------------------------------------------------------------------------
      def concat(other)
        TYPEN.each {|typ| 
          typ = typ.to_isym
          self.instance_variable_get(typ).add(*other.instance_variable_get(typ))
        }
        self
      end
      #--------------------------------------------------------------------------
      # * Subtraktion zweier Ressourcenobjekte => Ressourcen
      #  other#Ressourcen : Subtrahend , mit dem subtrahiert wird
      #--------------------------------------------------------------------------
      def drop(other)
        TYPEN.each {|typ| 
          typ = typ.to_isym
          v = self.instance_variable_get(typ) - other.instance_variable_get(typ)
          self.instance_variable_set(typ, v)
        }
        self
      end
      #--------------------------------------------------------------------------
      # * Schnittmenge zweier Ressourcenobjekte => Ressourcen
      #  other#Ressourcen : Vergleichsressourcenobjekt
      #--------------------------------------------------------------------------
      def compare(other)
        ressi = Ressourcen.new(@root)
        TYPEN.each {|typ| ressi.method(typ).call.add(
          *method(typ).call & other.method(typ).call)
        }
        ressi
      end
      #--------------------------------------------------------------------------
      # * Loggt die Ressourcen in verschiedenen Textdateien
      #  ordner#String : Pfad zum Log-Ordner
      #  dateiende#String : Dateiende der Logdateien
      #--------------------------------------------------------------------------
      def loggen(ordner=LOGPFAD, dateiende=LOGENDING)
        File.makedirs(@root + '/' + ordner)
        TYPEN.each {|typ|
          liste = self.instance_variable_get(typ.to_isym)
          next if liste.empty?
          File.open(path + ordner + typ.to_s + dateiende, 'w+') {|file|
            liste.each {|name|
              file.write(name + "\n")
            }
          }
        }
      end
      #--------------------------------------------------------------------------
      # * Loggt die Ressourcen in einer Textdatei
      #  ordner#String : Pfad zum Log-Ordner
      #  dname#String : Name der Logdatei
      #  dateiende#String : Dateiende der Logdatei
      #--------------------------------------------------------------------------
      def loggen_one(ordner=LOGPFAD, dname=LOGNAME, dateiende=LOGENDING)
        File.makedirs(@root+'/' + ordner)
        sortierer = Proc.new {|a,b| a.to_s <=> b.to_s}
        File.open(@root + '/' + ordner + dname + dateiende, 'w+') {|file|
          TYPEN.sort(&sortierer).each {|typ|
            liste = self.instance_variable_get(typ.to_isym)
            next if liste.empty?
            file.write(typ.to_s.capitalize + "\n")
            liste.each {|name|
              file.write(name + "\n")
            }
            file.write("\n")
          }
        }
      end
      #--------------------------------------------------------------------------
      # * Erzeugt die Ordner und ermitteln dest und src Pfade (Privat!)
      #--------------------------------------------------------------------------
      def ordner_erzeugen(path, *args, &block)   
        #Iteriere jeden Metaordner
        METADIRECTORY.each_pair {|ordner, typen|
          next if method(ordner.to_sym).call.empty?
          #Lege einen Ordner für diesen META an, falls noch nicht geschehen
          File.makedirs(dest_pfad = (path+'/'+ordner.capitalize))
          src_pfad = @root + '/' + ordner.capitalize
          #Iteriere die Typen jedes Metaordners
          typen.each {|typ|
            next if (inhalt=method(typ).call).empty?
            styp = typ.to_s.capitalize
            #Lege einen Ordner für diesen Typ an, falls noch nicht geschehen
            File.makedirs(dest_typpfad = dest_pfad + '/' + styp)
            src_typpfad = src_pfad + '/' + styp
            #Iteriere die Ressourcen eines Types
            inhalt.each {|e|
              #Ermittle vollständigen Dateinamen der Ressource
              src_name = src_typpfad + "/" + e
              endung = ""
              next if Ressourcen.extensions(typ).each {|endung|
                if File.exist?(src_name + '.' + endung) then break end
              }
              src_name = src_name + '.' + endung
              dest_name = dest_typpfad + '/' + e + '.' + endung
              #Führe den Proc aus
              block.call(src_name, dest_name, *args) 
            }
          }
        }
      end
      private(:ordner_erzeugen)
      #--------------------------------------------------------------------------
      # * Verschiebt Ressourcen in einen extra Ordner
      #  lpfad#String : Pfad zum Ordner, zu dem verschoben wird
      #--------------------------------------------------------------------------  
      def verschiebe(lpfad=LOESCHPFAD)
        lpfad = lpfad.root if lpfad.instance_of?(Ressourcen)
        ordner_erzeugen(@root + '/' + lpfad) {|src, dest| 
          File.rename(File.expand_path(src), File.expand_path(dest))
        }
      end
      link(:verschiebe, :move)
      #--------------------------------------------------------------------------
      # * Kopiert Ressourcen in ein anderes Projekt
      #  zielpfad#String/Ressourcen : Zielordner, in das Ressourcen kopiert werden
      #                               Ressourcenobjekt, in dessen Root kopiert wird 
      #-------------------------------------------------------------------------- 
      def kopiere(zielpfad)
        zielpfad = zielpfad.root if zielpfad.instance_of?(Ressourcen)
        ordner_erzeugen(zielpfad) {|src, dest|
          File.syscopy(File.expand_path(src), File.expand_path(dest))
        }
      end
      #--------------------------------------------------------------------------
      # * Erhält Größe der Ressourcendateien => String o. Float
      #--------------------------------------------------------------------------
      def size(special=false) #=> gibt Float zurück
        groesse = 0
        self.each(special) {|r| groesse += FileTest.size(path(r)) }
        groesse.to_f
      end
      def printable_size(special=false) #=> gibt einen lesbaren String zurück
        size(special).datasize
      end
      #--------------------------------------------------------------------------
      # * Sucht Pfad einer Datei => String
      # name#String : Name der gesuchten Datei
      # typ#Symbol : Typ der gesuchten Datei
      # meta#String : Metaordner, in dem sich die Datei befindet
      # endung#String : Endung der Datei
      # Angaben bis auf name können weggelassen werden, verzögern aber den Prozess
      #--------------------------------------------------------------------------
      def path(name, typ=false, meta=false, endung=false)
        dmeta = if meta then meta elsif typ then meta(typ) else meta(name) end
        dtyp = (if typ then typ else typ(name) end).to_s
        return false unless (dmeta and dtyp)
        path = "#{@root}/#{dmeta}/#{dtyp}/#{name}"
        dendung = if endung then endung else endung(name, dtyp.to_sym, dmeta) end
        return false unless dendung
        path + '.' + dendung
      end
      #--------------------------------------------------------------------------
      # * Sucht Metaordner einer Datei => String
      #  angabe#String/Symbol: Entweder Dateiname oder Dateityp
      #-------------------------------------------------------------------------- 
      def meta(angabe)
        typ = if TYPEN.include?(angabe.to_sym) then angabe else typ(angabe) end
        Ressourcen.metadirectory_for(typ)
      end
      #--------------------------------------------------------------------------
      # * Sucht Typ einer Datei => Symbol
      #  name#String: Dateiname
      #-------------------------------------------------------------------------- 
      def typ(name)
        typ = nil
        if (TYPEN.each {|typ| break if method(typ).call.include?(name)}).nil? then
          typ else nil end
        end
      #--------------------------------------------------------------------------
      # * Sucht Endung einer Datei => String
      #  name#String : Dateiname
      #  typ#Symbol : Typ der gesuchten Datei
      #  meta#String : Metaordner der Datei
      # Angaben bis auf name können weggelassen werden, verzögern aber den Prozess
      #-------------------------------------------------------------------------- 
      def endung(name, typ=false, meta=false)
        typ = typ(name) unless typ
        meta = meta(typ) unless meta
        path = "#{@root}/#{meta}/#{typ}/#{name}"
        e = nil
        if (Ressourcen.extensions(typ).each {|e|
            if File.exist?(path + '.' + e) then break end
          }) then nil else e 
        end
      end
      #--------------------------------------------------------------------------
      # * Gibt alle Pfade aus, die den Angaben entsprechen => String-Array
      #  dname#String: Dateiname; dtyp#Symbol : Dateityp; dmeta#String : Metaordner
      #  dendung#String : Endung der Datei
      # Wenn Angaben weggelassen werden, werden alle Pfade ausgegeben
      # Wenn Block angegeben, werden die einzelnen Pfade iteriert
      #--------------------------------------------------------------------------
      def paths(dname=false, dtyp=false, dmeta=false, dendung=false)
        typen = if dtyp then dtyp.to_a
          elsif dmeta then METADIRECTORY[dmeta]
          else typen()
        end
        result = Array.new
        typen.each {|typ|
          method(typ).call.each {|name| 
            if dendung or (dendung = endung(name, typ)) then
              result << path(name, typ, false, dendung)
            end
          }
        }
        result.each{|e| yield(e)} if block_given?
        result
      end
      #--------------------------------------------------------------------------
      # * Iteriert Ressourcennamen (Enumerable Modul)
      #  special#Symbol/String : Nur Inhalt des Metaordners/Typs wird iteriert
      #  Wenn kein special angegeben, wird jeder Ressourcenname iteriert
      #-------------------------------------------------------------------------- 
      def each(special=false, &block)
        if special then 
          self.method(special.to_sym).call.each(&block)
        else 
           (TYPEN.collect {|typ| self.method(typ).call}).flatten.each(&block)
        end
      end
    end

  2. #2
    1. !!!

    Gutes Skript, auch wenn ich den Zweck nicht verstanden habe!
    Ich würde sowieso nur die beiden Großskripte verwenden, denn es ist ziemlich mühsam, die schlappen 10 Einzelteile an verschiedenen Stellen einzufügen!

  3. #3
    Die Einzelteile sind nur Beispiele wie man das Script verwendet. Das eigentliche Script sind die beiden unteren Codeblöcke im zweiten Post.

    Der Zweck: Das Script durchsucht dein Projekt nach Dateien, die nicht verwendet werden. Beispielsweise du hast 40 Character-Sets importiert, in deinem Projekt werden aber nur 30 verschiedene genutzt. Dann befinden sich 10 Character-Dateien in deinen Projektordner, die überhaupt nicht gebraucht werden, aber 'ne Menge Platz wegnehmen (okay, bei Characters ist das wohl weniger gravierend. Anders dagegen bei Mp3-Dateien). Wenn du das Script einsetzt (und bei löschen true angibst) werden diese überflüssigen Dateien aus deinem Projekt entfernt.
    Ansonsten kann das Projekt noch einige andere Sachen machen, beispielsweise kannst du alle Ressourcen von einem Projekt in ein anderes kopieren. Oder du kannst auch alle RTP-Dateien, die dein Projekt verwendet, in dein Projekt kopieren, um es unabhängig von der RTP zu machen usw.

  4. #4
    Sieht sehr vielversprechend aus, werds auf jeden fall benutzen... bei dem Chaos das in meinem Projekt herrscht, mit den ganzen vergammelnden zeug in meinem Makerchaos... und so...

  5. #5
    @ -KD-

    Cool! Brauch ich aber nicht, da ich noch ziemlich am Anfang meiner Projekte bin.

  6. #6
    Sehr schönes Script und soweit ich dass auf den ersten Blick beurteilen kann ist es sehr aufgeräumt und gut kommentiert.
    Ich werde es auf jeden Fall benutzen. Danke dir vielmals für diese gelungene Arbeit.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •