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.