RPG-Maker Quartier

Hier dreht sich alles um die RPG-Maker-Reihe von ASCII/Enterbrain. Der RPG-Maker ist ein Tool, mit dem du dir dein eigenes kleines Rollenspiel erstellen kannst. Du findest hier alles, was du dazu brauchst. Aber natürlich umfasst die Community noch mehr!
Aktuelle Zeit: Di Mär 03, 2020 0:44

Alle Zeiten sind UTC + 1 Stunde



Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht

 Betreff des Beitrags: Skript zum Einbinden von Maps
BeitragVerfasst: Mo Mai 10, 2010 22:03 
Dieses Skript soll das Arbeiten von mehreren Standorten aus an einem Projekt erleichtern.
Dabei stellt der Import der Maps gewiss das Hauptproblem dar.

Das Skript kopiert Maps von aus einem anderen Projekt in das eigene.
Version 1.0.1

Bisher werden dabei folgende Dinge berücksichtigt:

Aktualisierungen:
- Teleport-Events zwischen den zu ladenen Maps.

Ressourcen:
- Charsets (EventPage-Zuweisungen + Änderung durch SetMoveRoute->ChangeGraphic)
- Pictures
- Tilesets /Autotiles

Code:
# benötigte Teile aus der lib/ftools.rb
class File
  BUFSIZE = 8 * 1024
 
  def self.catname(from, to)
    if directory? to
      join to.sub(%r([/\\]$), ''), basename(from)
    else
      to
    end
  end
 
  def self.copy(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
        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

class Project
  private_class_method :new
 
  EXTENSIONS = [".png", ".bmp", ".jpg"]

  @@my = new
  @@relations = {}
  @@file = ""
  @@mapinfo = nil
 
  Win32API.new("kernel32", "GetPrivateProfileString", ["P", "P", "P", "P", "i",
  "P"], "i").call("Game", "Title", "", @title = " " * 100, 100, "./Game.ini")
  # gibt den Namen des Projekts an
  def self.name
    return @title
  end
 
  # Kopiert eine oder mehrere Maps in das Projekt
  def self.add_maps(file, map_id = 0)
    if FileTest.directory?(file)
      @@file = file
      @@mapinfo = load_data(@@file + "/Data/Mapinfos.rxdata")
      d = Dir.new(@@file + "/Data")
      d.each { |n|
        if n[/Map([0-9]+).rxdata/]
          if (map_id.is_a?(Array) and map_id.include?($1.to_i)) or
             (map_id == 0 or $1.to_i == map_id)
           @@my.add_map(n, $1.to_i)
          end
        end
      }
      @@my.update_maps
    else
      print("Error!\nProjekt nicht gefunden.")
    end
  end
 
  def add_map(name, index)
    # lade die Map-informationen
    own_mapinfo = load_data("Data/Mapinfos.rxdata")
    # finde eine freie Nummer
    num = 1
    while own_mapinfo.include?(num)
      num += 1
    end
    # erstelle die neue Map-Information
    info = RPG::MapInfo.new
    info.name = @@mapinfo[index].name
    own_mapinfo[num] = info
    # Speichere die neue Karte
    map = load_data(@@file + "/Data/" + name)
    save_data(map, get_map_name(num))
    save_data(own_mapinfo, "Data/Mapinfos.rxdata")
    # referenziere die alte Map-ID
    @@relations[index] = num
  end
 
  def get_map_name(id)
    # füge fehlende Nullen hinzu
    str = id.to_s
    while str.size < 3
      str.insert(0, "0")
    end
    return ("Data/Map" + str + ".rxdata")
  end
 
  def update_maps
    @@tilesets = load_data(@@file + "/Data/Tilesets.rxdata")
    for i in @@relations.values
      map_name = get_map_name(i)
      map = load_data(map_name)
      change = false
      change |= update_tilesets(map)
      change |= update_events(map)
      save_data(map, map_name) if change
    end
  end
 
  def update_tilesets(map)
    change = false
    tileset_change = false
    old_map_id = map.tileset_id
    # Map-Tileset
    own_tilesets = load_data("Data/Tilesets.rxdata")
    tileset_name = @@tilesets[old_map_id].tileset_name
    tile_exist = false
    # existiert die Tileset-ID im eigenen Tileset?
    if map.tileset_id < own_tilesets.size
      # sind die Namen der Tilesets ungleich?
      if own_tilesets[map.tileset_id].tileset_name != tileset_name
        # suche das Tileset im eigenen Projekt
        for i in 1..own_tilesets.size - 1
          if own_tilesets[i].tileset_name == tileset_name
            map.tileset_id = i
            change = true
            tile_exist = true
            break
          end
        end
      else
        tile_exist = true
      end
    end
    # wenn das Tileset nicht existiert
    unless tile_exist
      unless tileset_name == ""
        if sync_file("Graphics/Tilesets/" + tileset_name)
          own_tilesets.push(@@tilesets[old_map_id])
          map.tileset_id = own_tilesets.size - 1
          tileset_change = true
          change = true
        end
      end
    end
    # nur, wenn das Tileset nicht komplett neu erstellt wurde
    unless tileset_change
      # Autotiles
      for i in 0..6
        autotile_name = @@tilesets[old_map_id].autotile_names[i]
        if own_tilesets[map.tileset_id].autotile_names[i] != autotile_name
          unless autotile_name == ""
            if sync_file("Graphics/Autotiles/" + autotile_name)
              own_tilesets[map.tileset_id].autotile_names[i] = autotile_name
              tileset_change = true
            end
          end
        end
      end
    end
    save_data(own_tilesets, "Data/Tilesets.rxdata") if tileset_change
    return change
  end
 
  def update_events(map)
    change = false
    for event in map.events.values
      for page in event.pages
        # Event-Grafik
        file = page.graphic.character_name
        unless file == ""
          sync_file("Graphics/Characters/" + file)
        end
        # Event-Code
        for entry in page.list
          case entry.code
          when 201 # Transfer Player
            if @@relations.include?(entry.parameters[1])
              entry.parameters[1] = @@relations[entry.parameters[1]]
              change = true
            end
          when 209 # Move Route (Graphic change)
            for i in 0..entry.parameters[1].list.size - 2 # (letzter code ist 0)
              if entry.parameters[1].list[i].code == 41
                file = entry.parameters[1].list[i].parameters[0]
                unless file == ""
                  sync_file("Graphics/Characters/" + file)
                end
              end
            end
          when 231  # Show Picture
            file = entry.parameters[1]
            unless file == ""
              sync_file("Graphics/Pictures/" + file)
            end
          end
        end
      end
    end
    return change
  end
 
  def sync_file(file)
    # überprüfe ob Datei vorhanden ist
    for e in EXTENSIONS
      f = file + e
      if FileTest.exist?(f)
        return false
      end
    end
    #print("Fehlende Datei: #{file}")
    # finde Datei
    for e in EXTENSIONS
      f = @@file + "/" + file + e
      if FileTest.exist?(f)
        #print("Datei gefunden: #{f}")
        return File.copy(f, file + e)
      end
    end
    return false
  end
end


Skript über main einfügen und mit folgendem Befehl aufrufen.
Code:
Project.add_maps(projektordner, map_id)


projektordner: Der Ordner des Projektes von dem Importiert werden soll z.B. "C:/Users/TheWhiteShadow/Documents/RPGXP/Project"
map_id: (Optional) ID der Map, die Importiert werden soll oder ein Array mit den ID's.

Wichtig: Nach dem Ausführen muss das Projekt neu geladen werden!

Auch, wenn das Script später nichts zum Spiel beiträgt würde ich mich über ein Crediteintrag freuen.


Nach oben
  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

Alle Zeiten sind UTC + 1 Stunde


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de