diff --git a/CMakeLists.txt b/CMakeLists.txt
index b69c757..1cd4aea 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,7 +18,7 @@ if (MSVC)
#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++14")
endif(MSVC)
if (NOT DATABASE_MANAGER_DIR)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 63ad19f..6d2f044 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -9,15 +9,20 @@ add_executable(db_extractor ${db_extractor_src})
target_link_libraries(db_extractor common)
endif()
-file(GLOB obj_extractor_src "obj_extractor/*")
-add_executable(obj_extractor ${obj_extractor_src})
-target_link_libraries(obj_extractor DatabaseManager common)
-
file(GLOB script2txt_src "script2txt/*")
add_executable(script2txt ${script2txt_src})
+file(GLOB mmm_extractor_src "mmm_extractor/*")
+add_executable(mmm_extractor ${mmm_extractor_src})
+target_link_libraries(mmm_extractor DatabaseManager common)
+
+file(GLOB mmo_extractor_src "mmo_extractor/*")
+add_executable(mmo_extractor ${mmo_extractor_src})
+target_link_libraries(mmo_extractor DatabaseManager common)
+
file(GLOB mmp_extractor_src "mmp_extractor/*")
add_executable(mmp_extractor ${mmp_extractor_src})
+target_link_libraries(mmp_extractor common)
file(GLOB mod_converter_src "mod_converter/*")
add_executable(mod_converter ${mod_converter_src})
diff --git a/src/mmm_extractor/mmm.cpp b/src/mmm_extractor/mmm.cpp
new file mode 100644
index 0000000..2222cc1
--- /dev/null
+++ b/src/mmm_extractor/mmm.cpp
@@ -0,0 +1,29 @@
+/*
+ * AIM mmm_extractor
+ * Copyright (C) 2015 lzwdgc
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "mmm.h"
+
+void mmm::load(buffer &b)
+{
+ READ(b, unk1);
+ READ(b, unk2);
+ READ(b, width);
+ READ(b, height);
+ data.resize(width * height / 16);
+ READ_N(b, data[0], data.size() * 16);
+}
\ No newline at end of file
diff --git a/src/mmm_extractor/mmm.h b/src/mmm_extractor/mmm.h
new file mode 100644
index 0000000..61a5914
--- /dev/null
+++ b/src/mmm_extractor/mmm.h
@@ -0,0 +1,39 @@
+/*
+ * AIM mmm_extractor
+ * Copyright (C) 2015 lzwdgc
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+#include
+
+#include
+
+struct dxt5_record
+{
+ char unk[0x10];
+};
+
+struct mmm
+{
+ uint32_t unk1;
+ uint32_t unk2;
+ uint32_t width;
+ uint32_t height;
+ std::vector data;
+
+ void load(buffer &b);
+};
\ No newline at end of file
diff --git a/src/mmm_extractor/mmm_extractor.cpp b/src/mmm_extractor/mmm_extractor.cpp
new file mode 100644
index 0000000..7f91f1f
--- /dev/null
+++ b/src/mmm_extractor/mmm_extractor.cpp
@@ -0,0 +1,67 @@
+/*
+ * AIM mmm_extractor
+ * Copyright (C) 2015 lzwdgc
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+
+#include "mmm.h"
+
+using namespace std;
+
+mmm read_mmm(string fn)
+{
+ buffer b(readFile(fn));
+ mmm m;
+ m.load(b);
+
+ if (!b.eof())
+ {
+ stringstream ss;
+ ss << hex << b.index() << " != " << hex << b.size();
+ throw std::logic_error(ss.str());
+ }
+ return m;
+}
+
+int main(int argc, char *argv[])
+try
+{
+#ifdef NDEBUG
+ if (argc != 2)
+ {
+ cout << "Usage:\n" << argv[0] << " file.mmp" << "\n";
+ return 1;
+ }
+ read_mmm(argv[1]);
+#else
+ auto loc1 = read_mmm("h:\\Games\\AIM\\data\\minimaps.pak.dir\\location1.mmm");
+#endif
+ return 0;
+}
+catch (std::exception &e)
+{
+ printf("error: %s\n", e.what());
+ return 1;
+}
+catch (...)
+{
+ printf("error: unknown exception\n");
+ return 1;
+}
\ No newline at end of file
diff --git a/src/obj_extractor/obj_extractor.bat b/src/mmo_extractor/mmo_extractor.bat
similarity index 57%
rename from src/obj_extractor/obj_extractor.bat
rename to src/mmo_extractor/mmo_extractor.bat
index 6f54f48..a04d0bf 100644
--- a/src/obj_extractor/obj_extractor.bat
+++ b/src/mmo_extractor/mmo_extractor.bat
@@ -1,2 +1,2 @@
-python obj_extractor.py --db "h:\Games\Epic Games\Projects\Polygon4\Mods\db.sqlite" --dir "h:\Games\AIM\data\maps.pak.dir" --prefix m1
-python obj_extractor.py --db "h:\Games\Epic Games\Projects\Polygon4\Mods\db.sqlite" --dir "h:\Games\Steam\steamapps\common\AIM2\Data\mmo.pak\DATA\LOCS" --prefix m2
\ No newline at end of file
+python mmo_extractor.py --db "h:\Games\Epic Games\Projects\Polygon4\Mods\db.sqlite" --dir "h:\Games\AIM\data\maps.pak.dir" --prefix m1
+python mmo_extractor.py --db "h:\Games\Epic Games\Projects\Polygon4\Mods\db.sqlite" --dir "h:\Games\Steam\steamapps\common\AIM2\Data\mmo.pak\DATA\LOCS" --prefix m2
\ No newline at end of file
diff --git a/src/obj_extractor/obj_extractor.cpp b/src/mmo_extractor/mmo_extractor.cpp
similarity index 100%
rename from src/obj_extractor/obj_extractor.cpp
rename to src/mmo_extractor/mmo_extractor.cpp
diff --git a/src/obj_extractor/obj_extractor.py b/src/mmo_extractor/mmo_extractor.py
similarity index 92%
rename from src/obj_extractor/obj_extractor.py
rename to src/mmo_extractor/mmo_extractor.py
index ff5444c..4672f16 100644
--- a/src/obj_extractor/obj_extractor.py
+++ b/src/mmo_extractor/mmo_extractor.py
@@ -23,7 +23,7 @@ def run(dir, db, prefix):
if os.path.isdir(file) or os.path.splitext(file)[1].lower() != ".mmo":
continue
print('loading: ' + file)
- p = subprocess.Popen(['obj_extractor.exe', db, dir + '/' + file, prefix])
+ p = subprocess.Popen(['mmo_extractor.exe', db, dir + '/' + file, prefix])
p.communicate()
if __name__ == '__main__':
diff --git a/src/obj_extractor/objects.cpp b/src/mmo_extractor/objects.cpp
similarity index 100%
rename from src/obj_extractor/objects.cpp
rename to src/mmo_extractor/objects.cpp
diff --git a/src/obj_extractor/objects.h b/src/mmo_extractor/objects.h
similarity index 100%
rename from src/obj_extractor/objects.h
rename to src/mmo_extractor/objects.h
diff --git a/src/obj_extractor/other.h b/src/mmo_extractor/other.h
similarity index 100%
rename from src/obj_extractor/other.h
rename to src/mmo_extractor/other.h
diff --git a/src/mmp_extractor/mmp.cpp b/src/mmp_extractor/mmp.cpp
index 4e74e84..a38febd 100644
--- a/src/mmp_extractor/mmp.cpp
+++ b/src/mmp_extractor/mmp.cpp
@@ -18,40 +18,114 @@
#include "mmp.h"
-#define FREAD(var) fread(&var, 1, sizeof(var), f)
-#define FREAD_N(var, n) fread(&var, 1, n, f)
-
-size_t file_size(FILE *f)
+void unk_segment1::load(buffer &b)
{
- auto old = ftell(f);
- fseek(f, 0, SEEK_END);
- auto sz = ftell(f);
- fseek(f, old, SEEK_SET);
- return sz;
+ while (!b.eof())
+ {
+ unk_segment1_1 s;
+ s.load(b);
+ segments.push_back(s);
+ }
}
-void mmp::load(FILE *f)
+void unk_segment1_1::load(buffer &b)
{
- FREAD(unk1);
- FREAD(unk2);
- FREAD(width);
- FREAD(height);
- FREAD(unk3);
- FREAD(unk4);
- FREAD(unk5);
- FREAD(unk6);
- FREAD(unk7);
- FREAD(unk8);
+ READ(b, unk0);
+ READ(b, name1);
+ READ(b, unk1);
+ READ(b, unk2);
+ READ(b, unk3);
+ READ(b, unk4);
+ READ(b, name2);
+ READ(b, unk5);
+}
- int n_seg = width / 64 * height / 64;
- int sz = n_seg * sizeof(segment);
- int fsz = file_size(f);
- int off = fsz - sz;
- fseek(f, off, SEEK_SET);
+void unk_segment2::load(buffer &b)
+{
+ READ(b, n_segs);
+ segments.resize(n_segs);
+ READ(b, name);
+ for (auto &s : segments)
+ s.load(b);
+}
- segments = vector(n_seg);
- for (int i = 0; i < n_seg; i++)
- FREAD(segments[i]);
+void unk_segment2_1::load(buffer &b)
+{
+ READ(b, name1);
+ READ(b, name2);
+ READ(b, name3);
+ READ(b, name4);
+ READ(b, name5);
+ READ(b, unk0);
+ READ(b, unk1);
+ READ(b, tex_name0);
+ READ(b, unk2);
+ READ(b, unk_name0);
+ READ(b, unk3);
+ READ(b, tex_name1);
+ READ(b, tex_name2);
+ READ(b, unk4);
+}
- assert(ftell(f) == fsz);
+header_segment *header::create_segment(buffer &b)
+{
+ HeaderSegmentType type;
+ READ(b, type);
+
+ header_segment *segment = 0;
+ switch (type)
+ {
+ case HeaderSegmentType::unk1:
+ segment = new unk_segment1;
+ break;
+ case HeaderSegmentType::unk2:
+ segment = new unk_segment2;
+ break;
+ default:
+ throw std::logic_error("unknown header segment type " + std::to_string((int)type));
+ break;
+ }
+ if (segment)
+ {
+ segment->type = type;
+ READ(b, segment->unk0);
+ READ(b, segment->len);
+ }
+ return segment;
+}
+
+void header::load(buffer &b)
+{
+ READ(b, unk0);
+ READ(b, name1);
+ READ(b, name2);
+ READ(b, width);
+ READ(b, height);
+ READ(b, n_segs);
+ segments.resize(n_segs);
+ READ(b, name);
+ for (auto &s : segments)
+ {
+ s = create_segment(b);
+ buffer b2(b, s->len);
+ if (!b2.eof())
+ s->load(b2);
+ }
+}
+
+void segment::load(buffer &b)
+{
+ READ(b, desc);
+ buffer b2(b);
+ b2.seek(desc.offset);
+ READ(b2, d);
+}
+
+void mmp::load(buffer &b)
+{
+ h.load(b);
+ int n_segs = h.width / 64 * h.height / 64;
+ segments.resize(n_segs);
+ for (auto &s : segments)
+ s.load(b);
}
\ No newline at end of file
diff --git a/src/mmp_extractor/mmp.h b/src/mmp_extractor/mmp.h
index 4650a5f..e4d522a 100644
--- a/src/mmp_extractor/mmp.h
+++ b/src/mmp_extractor/mmp.h
@@ -16,45 +16,158 @@
* along with this program. If not, see .
*/
-#include
-#include
-#include