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