1#include <base/dbg.h>
2#include <base/hash.h>
3#include <base/logger.h>
4#include <base/os.h>
5#include <base/str.h>
6
7#include <engine/shared/datafile.h>
8#include <engine/storage.h>
9
10#include <game/mapitems.h>
11
12#include <zlib.h>
13
14static const char *TOOL_NAME = "dummy_map";
15
16static void CreateEmptyMap(IStorage *pStorage)
17{
18 const char *pMapName = "maps/dummy3.map";
19
20 CDataFileWriter Writer;
21 if(!Writer.Open(pStorage, pFilename: pMapName))
22 {
23 log_error(TOOL_NAME, "Failed to open map '%s' for writing", pMapName);
24 return;
25 }
26 CMapItemGroup_v1 Group;
27 Group.m_Version = 1;
28 Group.m_OffsetX = 0;
29 Group.m_OffsetY = 0;
30 Group.m_ParallaxX = 0;
31 Group.m_ParallaxY = 0;
32 Group.m_StartLayer = 0;
33 Group.m_NumLayers = 2;
34 Writer.AddItem(Type: MAPITEMTYPE_GROUP, Id: 0, Size: sizeof(Group), pData: &Group);
35
36 constexpr int LayerWidth = 2;
37 constexpr int LayerHeight = 2;
38 CTile aTiles[LayerWidth * LayerHeight];
39 std::fill(first: std::begin(arr&: aTiles), last: std::end(arr&: aTiles), value: CTile{.m_Index = TILE_SOLID, .m_Flags = 0, .m_Skip = 0, .m_MustBe0 = 0});
40
41 CMapItemLayerTilemap_v2 GameLayer;
42 GameLayer.m_Layer.m_Version = 0; // Not set by the official client.
43 GameLayer.m_Layer.m_Type = LAYERTYPE_TILES;
44 GameLayer.m_Layer.m_Flags = 0;
45 GameLayer.m_Version = 2;
46 GameLayer.m_Width = LayerWidth;
47 GameLayer.m_Height = LayerHeight;
48 GameLayer.m_Flags = TILESLAYERFLAG_GAME;
49 GameLayer.m_Color.r = 255;
50 GameLayer.m_Color.g = 255;
51 GameLayer.m_Color.b = 255;
52 GameLayer.m_Color.a = 255;
53 GameLayer.m_ColorEnv = -1;
54 GameLayer.m_ColorEnvOffset = 0;
55 GameLayer.m_Image = -1;
56 GameLayer.m_Data = Writer.AddData(Size: sizeof(aTiles), pData: &aTiles);
57 Writer.AddItem(Type: MAPITEMTYPE_LAYER, Id: 0, Size: sizeof(GameLayer), pData: &GameLayer);
58
59 CMapItemLayerTilemap_v2 Layer;
60 Layer.m_Layer.m_Version = 0;
61 Layer.m_Layer.m_Type = LAYERTYPE_TILES;
62 Layer.m_Layer.m_Flags = 0;
63 Layer.m_Version = 2;
64 Layer.m_Width = LayerWidth;
65 Layer.m_Height = LayerHeight;
66 Layer.m_Flags = 0;
67 Layer.m_Color.r = 255;
68 Layer.m_Color.g = 255;
69 Layer.m_Color.b = 255;
70 Layer.m_Color.a = 255;
71 Layer.m_ColorEnv = -1;
72 Layer.m_ColorEnvOffset = 0;
73 Layer.m_Image = -1;
74 Layer.m_Data = Writer.AddData(Size: sizeof(aTiles), pData: &aTiles);
75 Writer.AddItem(Type: MAPITEMTYPE_LAYER, Id: 1, Size: sizeof(Layer), pData: &Layer);
76
77 Writer.Finish();
78
79 log_info(TOOL_NAME, "Dummy map written to '%s'", pMapName);
80
81 void *pData;
82 unsigned DataSize;
83 if(!pStorage->ReadFile(pFilename: pMapName, Type: IStorage::TYPE_ALL, ppResult: &pData, pResultLen: &DataSize))
84 {
85 log_error(TOOL_NAME, "Failed to open map file '%s' for reading", pMapName);
86 return;
87 }
88 unsigned char *pDataChar = static_cast<unsigned char *>(pData);
89
90 unsigned Crc = crc32(crc: 0, buf: pDataChar, len: DataSize);
91 SHA256_DIGEST Sha256 = sha256(message: pDataChar, message_len: DataSize);
92
93 char aMapSha[SHA256_MAXSTRSIZE];
94 sha256_str(digest: Sha256, str: aMapSha, max_len: sizeof(aMapSha));
95 log_info(TOOL_NAME, "CRC32 %08X, SHA256 %s", Crc, aMapSha);
96
97 const unsigned HexSize = 6 * DataSize + 1;
98 char *pHex = static_cast<char *>(malloc(size: HexSize));
99 str_hex_cstyle(dst: pHex, dst_size: HexSize, data: pDataChar, data_size: DataSize);
100 log_info(TOOL_NAME, "Data %s", pHex);
101 free(ptr: pHex);
102
103 free(ptr: pDataChar);
104}
105
106int main(int argc, const char **argv)
107{
108 CCmdlineFix CmdlineFix(&argc, &argv);
109 log_set_global_logger_default();
110
111 std::unique_ptr<IStorage> pStorage = std::unique_ptr<IStorage>(CreateStorage(InitializationType: IStorage::EInitializationType::SERVER, NumArgs: argc, ppArguments: argv));
112 if(!pStorage)
113 {
114 log_error(TOOL_NAME, "Error creating server storage");
115 return -1;
116 }
117
118 CreateEmptyMap(pStorage: pStorage.get());
119 return 0;
120}
121