瀏覽代碼

extract files

Laserlicht 1 年之前
父節點
當前提交
bc2e9ce510
共有 1 個文件被更改,包括 40 次插入9 次删除
  1. 40 9
      launcher/modManager/chroniclesextractor.cpp

+ 40 - 9
launcher/modManager/chroniclesextractor.cpp

@@ -168,11 +168,14 @@ void ChroniclesExtractor::createChronicleMod(int no)
 		{ "author", "3DO" },
 		{ "version", "1.0" },
 	};
-
+	
 	QFile jsonFile(dir.filePath("mod.json"));
     jsonFile.open(QFile::WriteOnly);
     jsonFile.write(QJsonDocument(mod).toJson());
 
+	dir.mkdir("content");
+	dir.cd("content");
+
 	dir.mkdir("Data");
 	dir.mkdir("Sprites");
 	extractFiles(no);
@@ -186,14 +189,42 @@ void ChroniclesExtractor::extractFiles(int no)
 	QDir tmpDir = tempDir.filePath(tempDir.entryList({"app"}, QDir::Filter::Dirs).front());
 	tmpDir.setPath(tmpDir.filePath(tmpDir.entryList({QString(tmpChronicles)}, QDir::Filter::Dirs).front()));
 	tmpDir.setPath(tmpDir.filePath(tmpDir.entryList({"data"}, QDir::Filter::Dirs).front()));
-	QDir outDirData(pathToQString(VCMIDirs::get().userDataPath() / "Mods" / "chronicles" / "Mods" / ("chronicles_" + std::to_string(no)) / "Data"));
-	QDir outDirSprites(pathToQString(VCMIDirs::get().userDataPath() / "Mods" / "chronicles" / "Mods" / ("chronicles_" + std::to_string(no)) / "Sprites"));
-
-	CArchiveLoader archive("", tmpDir.filePath("xBitmap.lod").toStdString(), false);
-	for(auto & entry : archive.getEntries())
-		archive.extractToFolder(outDirData.absolutePath().toStdString(), "", entry.second, true);
-	for(auto & entry : outDirData.entryList())
-		outDirData.rename(entry, "Hc" + QString::number(no) + "_" + entry);
+	QDir outDirData(pathToQString(VCMIDirs::get().userDataPath() / "Mods" / "chronicles" / "Mods" / ("chronicles_" + std::to_string(no)) / "content" / "Data"));
+	QDir outDirSprites(pathToQString(VCMIDirs::get().userDataPath() / "Mods" / "chronicles" / "Mods" / ("chronicles_" + std::to_string(no)) / "content" / "Sprites"));
+	QDir outDirVideo(pathToQString(VCMIDirs::get().userDataPath() / "Mods" / "chronicles" / "Mods" / ("chronicles_" + std::to_string(no)) / "content" / "Video"));
+	QDir outDirSounds(pathToQString(VCMIDirs::get().userDataPath() / "Mods" / "chronicles" / "Mods" / ("chronicles_" + std::to_string(no)) / "content" / "Sounds"));
+
+	auto extract = [tmpDir, no](QDir dest, QString file){
+		CArchiveLoader archive("", tmpDir.filePath(tmpDir.entryList({file}).front()).toStdString(), false);
+		for(auto & entry : archive.getEntries())
+			archive.extractToFolder(dest.absolutePath().toStdString(), "", entry.second, true);
+	};
+	auto rename = [tmpDir, no](QDir dest){
+		dest.refresh();
+		for(auto & entry : dest.entryList())
+			if(!entry.startsWith("Hc"))
+				dest.rename(entry, "Hc" + QString::number(no) + "_" + entry);
+	};
+
+	extract(outDirData, "xBitmap.lod");
+	extract(outDirData, "xlBitmap.lod");
+	extract(outDirSprites, "xSprite.lod");
+	extract(outDirSprites, "xlSprite.lod");
+	extract(outDirVideo, "xVideo.vid");
+	extract(outDirSounds, "xSound.snd");
+
+	tmpDir.cdUp();
+	if(tmpDir.entryList({"maps"}, QDir::Filter::Dirs).size())
+	{
+		QDir tmpDirMaps = tmpDir.filePath(tmpDir.entryList({"maps"}, QDir::Filter::Dirs).front());
+		for(auto & entry : tmpDirMaps.entryList())
+			QFile(tmpDirMaps.filePath(entry)).copy(outDirData.filePath(entry));
+	}
+
+	rename(outDirData);
+	rename(outDirSprites);
+	rename(outDirVideo);
+	rename(outDirSounds);
 }
 
 void ChroniclesExtractor::installChronicles(QStringList exe)