mirror of
https://github.com/aimrebirth/tools.git
synced 2026-04-15 01:43:25 +00:00
Add object loader into DB.
This commit is contained in:
parent
eaaa2fcfc1
commit
c13dede2e8
6 changed files with 177 additions and 20 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "dep/dbmgr"]
|
||||||
|
path = dep/dbmgr
|
||||||
|
url = https://github.com/aimrebirth/DatabaseManager.git
|
||||||
|
|
@ -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
1
dep/dbmgr
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 8a5126cd1a2769780bd4e05c18d553f2bcb60f56
|
||||||
|
|
@ -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})
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
@ -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,
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue