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