/
GeneratorDink.cpp
141 lines (110 loc) · 3.62 KB
/
GeneratorDink.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "AppPrecomp.h"
#include "GeneratorDink.h"
#include "GameLogic.h"
#define mapX 32
#define mapY 24
#define tileSize 50
#define tilesPerScreenX 12
#define tilesPerScreenY 8
#define tilesPerTilePage 128
GeneratorDink::GeneratorDink()
{
}
void GeneratorDink::GenerateInit()
{
assert(g_pMapManager->GetActiveMap() && "World must be initted before this is called");
string st = C_BASE_MAP_PATH +string("/_base_graphics/dink.dat");
//grab the map header
FILE *fp = fopen(st.c_str(), "rb");
if (!fp) throw CL_Error("Unable to find "+st);
fread(&m_mapInfo,sizeof(dink_map_info),1,fp);
fclose(fp);
m_mapIndex = 0;
m_vecMapUpperLeft = g_pMapManager->GetActiveMap()->ScreenIDToWorldPos(g_pMapManager->GetActiveMap()->GetScreenID(C_DEFAULT_SCREEN_ID,C_DEFAULT_SCREEN_ID));
}
void GeneratorDink::LoadDinkScreen(dink_small_map *pDinkScreen, int mapIndex)
{
//LogMsg("Loading map %d...",mapIndex);
string st = C_BASE_MAP_PATH + string("/_base_graphics/map.dat");
FILE * fp = fopen( st.c_str(), "rb");
if (!fp) throw CL_Error("Can't open" + st);
fseek( fp, sizeof(dink_small_map)* (mapIndex-1), SEEK_SET);
fread(pDinkScreen, sizeof(dink_small_map), 1, fp);
fclose(fp);
}
void GeneratorDink::ProcessDinkScreen(CL_Vector2 &vecOffset, dink_small_map &screenData)
{
dink_tile *pDinkTile = NULL;
TilePic *pTile = NULL;
CL_Rect rectSrc;
for (int x=0; x < tilesPerScreenX; x++)
{
for (int y=0; y < tilesPerScreenY; y++)
{
pDinkTile = &screenData.t[x+(y*tilesPerScreenX)];
int tilePageNum = pDinkTile->num / tilesPerTilePage;
int tileIndex = pDinkTile->num - (tilePageNum*tilesPerTilePage);
if (tilePageNum > 42)
{
LogMsg("Invalid tilepage of %d found, ignoring");
continue; //bad data?
}
rectSrc.top = (tileIndex/tilesPerScreenX)* tileSize;
rectSrc.left = (tileIndex - ((rectSrc.top/tileSize) * tilesPerScreenX)) *tileSize;
rectSrc.right = rectSrc.left + tileSize;
rectSrc.bottom = rectSrc.top + tileSize;
tilePageNum += 1;
string st("ts");
if (tilePageNum < 10) st += "0";
st += CL_String::from_int(tilePageNum);
//LogMsg("Tile Page %d, tile index %d.", tilePageNum, tileIndex);
//LogMsg("Formatted source image filename of %s", st.c_str());
pTile = new TilePic;
CL_Vector2 localDestPos = CL_Vector2(x*tileSize, y*tileSize);
pTile->SetPos(localDestPos+vecOffset);
pTile->m_rectSrc = rectSrc;
pTile->m_resourceID = FileNameToID(st.c_str());
if (!GetHashedResourceManager->GetResourceByHashedID(pTile->m_resourceID))
{
throw CL_Error("Unable to locate tilescreen "+st);
}
//figure out where to put it
g_pMapManager->GetActiveMap()->AddTile(pTile);
}
}
//LogMsg("This screen is %s", screenData.name);
}
//returns false when finished generating
bool GeneratorDink::GenerateStep()
{
//process
CL_Vector2 vecOffsetOfScreen;
int realMapFileIndex;
if (m_mapIndex < 768)
{
realMapFileIndex = m_mapInfo.loc[m_mapIndex+1];
//figure out upper left of this screen
if (realMapFileIndex != 0)
{
//LogMsg("World index %d has data", m_mapIndex);
vecOffsetOfScreen.y = m_mapIndex/mapX;
vecOffsetOfScreen.x = m_mapIndex- (vecOffsetOfScreen.y * mapX);
vecOffsetOfScreen.y *= tilesPerScreenY * tileSize;
vecOffsetOfScreen.x *= tilesPerScreenX * tileSize;
vecOffsetOfScreen += m_vecMapUpperLeft;
//load the screen data itself
dink_small_map screenData;
LoadDinkScreen(&screenData, realMapFileIndex);
ProcessDinkScreen(vecOffsetOfScreen, screenData);
} else
{
//LogMsg("World index %d is BLANK", m_mapIndex);
}
m_mapIndex++;
} else
{
return false; //all done
}
//we're still working
return true;
}