Add object loader into DB.

This commit is contained in:
lzwdgc 2015-05-11 18:13:50 +03:00
parent eaaa2fcfc1
commit c13dede2e8
6 changed files with 177 additions and 20 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "dep/dbmgr"]
path = dep/dbmgr
url = https://github.com/aimrebirth/DatabaseManager.git

View file

@ -15,4 +15,7 @@ if (MSVC)
#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") #set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
endif(MSVC) endif(MSVC)
include_directories(dep/dbmgr/include)
add_subdirectory(dep/dbmgr)
add_subdirectory(src) add_subdirectory(src)

1
dep/dbmgr Submodule

@ -0,0 +1 @@
Subproject commit 8a5126cd1a2769780bd4e05c18d553f2bcb60f56

View file

@ -6,6 +6,7 @@ add_executable(db_extractor ${db_extractor_src})
file(GLOB obj_extractor_src "obj_extractor/*") file(GLOB obj_extractor_src "obj_extractor/*")
add_executable(obj_extractor ${obj_extractor_src}) add_executable(obj_extractor ${obj_extractor_src})
target_link_libraries(obj_extractor DatabaseManager)
file(GLOB script2txt_src "script2txt/*") file(GLOB script2txt_src "script2txt/*")
add_executable(script2txt ${script2txt_src}) add_executable(script2txt ${script2txt_src})

View file

@ -16,44 +16,193 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <algorithm>
#include <fstream>
#include <iostream> #include <iostream>
#include <map>
#include <set>
#include <stdio.h> #include <stdio.h>
#include <string> #include <string>
#include "objects.h" #include "objects.h"
#include "other.h" #include "other.h"
void read_mmo(string fn) #include <Polygon4/Storage.h>
using namespace std;
struct storage
{ {
Objects objects;
MechGroups mgs;
MapGoods mg;
MapMusic mm;
MapSounds ms;
};
storage read_mmo(string fn)
{
storage s;
FILE *f = fopen(fn.c_str(), "rb"); FILE *f = fopen(fn.c_str(), "rb");
if (!f) if (!f)
return; return s;
Objects objects; s.objects.load(f);
objects.load(f); s.mgs.load(f);
MechGroups mgs;
mgs.load(f);
if (feof(f)) if (feof(f))
{ {
// custom maps? // custom maps?
fclose(f); fclose(f);
return; return s;
} }
MapGoods mg; s.mg.load(f);
mg.load(f); s.mm.load(f);
MapMusic mm; s.ms.load(f);
mm.load(f);
MapSounds ms;
ms.load(f);
fclose(f); fclose(f);
return s;
}
void write_mmo(string db, const storage &s)
{
using namespace polygon4;
using namespace polygon4::detail;
auto storage = initStorage(db);
storage->load();
int map_id = 1;
for (auto &seg : s.objects.segments)
{
if (seg->segment_type == SegmentType::SHELL)
{
SegmentObjects<Shell> *segment = (SegmentObjects<Shell> *)seg;
set<string> objs;
std::map<string, int> bld_ids;
std::map<string, int> coord_ids;
for (auto &object : segment->objects)
objs.insert(object.name1);
for (auto &o : objs)
{
auto iter = find_if(storage->buildings.begin(), storage->buildings.end(), [&](const decltype(Storage::buildings)::value_type &p)
{
return p.second->text_id == o;
});
if (iter == storage->buildings.end())
{
auto bld = storage->addBuilding();
bld->text_id = o;
bld_ids[o] = bld->id;
}
else
bld_ids[o] = iter->second->id;
}
for (auto &object : segment->objects)
{
MapBuilding mb;
mb.text_id = object.name2;
mb.building = storage->buildings[bld_ids[object.name1]];
auto iter = find_if(storage->coordinates.begin(), storage->coordinates.end(), [&](const decltype(Storage::coordinates)::value_type &p)
{
Coordinate c;
c.x = object.position.x;
c.y = object.position.y;
c.z = object.position.z;
return *p.second.get() == c;
});
if (iter == storage->coordinates.end())
{
auto c = storage->addCoordinate();
c->x = object.position.x;
c->y = object.position.y;
c->z = object.position.z;
mb.coordinate = c;
}
else
mb.coordinate = iter->second;
auto i = find_if(storage->mapBuildings.begin(), storage->mapBuildings.end(), [&](const decltype(Storage::mapBuildings)::value_type &p)
{
return *p.second.get() == mb;
});
if (i == storage->mapBuildings.end())
{
auto mb2 = storage->addMapBuilding(storage->maps[map_id].get());
mb.id = mb2->id;
*mb2.get() = mb;
}
}
}
if (seg->segment_type == SegmentType::SURFACE ||
seg->segment_type == SegmentType::STONE ||
seg->segment_type == SegmentType::EXPLOSION)
{
SegmentObjects<Surface> *segment = (SegmentObjects<Surface> *)seg;
set<string> objs;
std::map<string, int> bld_ids;
std::map<string, int> coord_ids;
for (auto &object : segment->objects)
objs.insert(object.name1);
for (auto &o : objs)
{
auto iter = find_if(storage->objects.begin(), storage->objects.end(), [&](const decltype(Storage::objects)::value_type &p)
{
return p.second->text_id == o;
});
if (iter == storage->objects.end())
{
auto bld = storage->addObject();
bld->text_id = o;
bld_ids[o] = bld->id;
}
else
bld_ids[o] = iter->second->id;
}
for (auto &object : segment->objects)
{
detail::MapObject mb;
//mb.text_id = object.name2;
mb.object = storage->objects[bld_ids[object.name1]];
auto iter = find_if(storage->coordinates.begin(), storage->coordinates.end(), [&](const decltype(Storage::coordinates)::value_type &p)
{
Coordinate c;
c.x = object.position.x;
c.y = object.position.y;
c.z = object.position.z;
return *p.second.get() == c;
});
if (iter == storage->coordinates.end())
{
auto c = storage->addCoordinate();
c->x = object.position.x;
c->y = object.position.y;
c->z = object.position.z;
mb.coordinate = c;
}
else
mb.coordinate = iter->second;
auto i = find_if(storage->mapObjects.begin(), storage->mapObjects.end(), [&](const decltype(Storage::mapObjects)::value_type &p)
{
return *p.second.get() == mb;
});
if (i == storage->mapObjects.end())
{
auto mb2 = storage->addMapObject(storage->maps[map_id].get());
mb.id = mb2->id;
*mb2.get() = mb;
}
}
}
}
storage->save();
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
if (argc != 2) if (argc != 3)
{ {
cout << "Usage:\n" << argv[0] << " file.mmo" << "\n"; cout << "Usage:\n" << argv[0] << " db.sqlite file.mmo" << "\n";
return 1; return 1;
} }
read_mmo(argv[1]); storage s = read_mmo(argv[2]);
write_mmo(argv[1], s);
return 0; return 0;
} }

View file

@ -33,8 +33,8 @@ enum class SegmentType : uint32_t
{ {
TEXTURE = 0x1, TEXTURE = 0x1,
MODEL, MODEL,
SURFACE, SURFACE, // stones
STONE, STONE, // trees
TREE, TREE,
GLIDER, GLIDER,
@ -43,9 +43,9 @@ enum class SegmentType : uint32_t
WEAPON, WEAPON,
CONFIG, CONFIG,
SHELL, // (AMMO,BULLET) SHELL, // buildings
IMAGE, IMAGE,
EXPLOSION, EXPLOSION, // road lights
EQUIPMENT, EQUIPMENT,
ORGANIZATION, ORGANIZATION,