forked from Whales/Cataclysm2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathworld_terrain.cpp
141 lines (122 loc) · 3.47 KB
/
world_terrain.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
141
#include "world_terrain.h"
#include "stringfunc.h"
#include "window.h"
#include "globals.h"
#include <sstream>
World_terrain::World_terrain()
{
uid = -1;
name = "ERROR";
beach_range = -1;
sym = glyph();
for (int i = 0; i < WTF_MAX; i++) {
flags.push_back(false);
}
}
std::string World_terrain::get_data_name()
{
return name;
}
std::string World_terrain::get_name()
{
if (display_name.empty()) {
return name;
}
return display_name;
}
bool World_terrain::load_data(std::istream &data)
{
std::string ident, junk;
do {
if ( ! (data >> ident) ) {
return false;
}
ident = no_caps(ident);
if (!ident.empty() && ident[0] == '#') {
// It's a comment
std::getline(data, junk);
} else if (ident == "name:") {
std::getline(data, name);
name = trim(name);
} else if (ident == "display_name:") {
std::getline(data, display_name);
display_name = trim(display_name);
} else if (ident == "beach:") {
std::getline(data, beach_name);
beach_name = trim(beach_name);
} else if (ident == "beach_range:") {
data >> beach_range;
std::getline(data, junk);
} else if (ident == "connector:") {
std::string conn;
std::getline(data, conn);
conn = trim(conn);
connectors.push_back(conn);
} else if (ident == "road_cost:") {
data >> road_cost;
std::getline(data, junk);
} else if (ident == "glyph:") {
sym.load_data_text(data);
std::getline(data, junk);
} else if (ident == "flags:") {
std::string flag_line;
std::getline(data, flag_line);
std::istringstream flag_data(flag_line);
std::string flag_name;
while (flag_data >> flag_name) {
World_terrain_flag flag = lookup_world_terrain_flag(flag_name);
if (flag == WTF_NULL) {
debugmsg("Unknown world terrain flag '%s' (%s)", flag_name.c_str(),
name.c_str());
}
flags[flag] = true;
}
} else if (ident != "done") {
debugmsg("Unknown World_terrain property '%s' (%s)",
ident.c_str(), name.c_str());
}
} while (ident != "done" && !data.eof());
// TODO: Flag loading.
return true;
}
bool World_terrain::has_flag(World_terrain_flag flag)
{
return flags[flag];
}
World_terrain* make_into_beach(World_terrain* original)
{
if (original->beach_name.empty()) {
return original;
}
return WORLD_TERRAIN.lookup_name(original->beach_name);
}
World_terrain_flag lookup_world_terrain_flag(std::string name)
{
name = no_caps(name);
for (int i = 0; i < WTF_MAX; i++) {
World_terrain_flag ret = World_terrain_flag(i);
if ( no_caps( world_terrain_flag_name(ret) ) == name ) {
return ret;
}
}
return WTF_NULL;
}
std::string world_terrain_flag_name(World_terrain_flag flag)
{
switch (flag) {
case WTF_NULL: return "NULL";
case WTF_WATER: return "water";
case WTF_NO_RIVER: return "no_river";
case WTF_SALTY: return "salty";
case WTF_BRIDGE: return "bridge";
case WTF_NO_ROAD: return "no_road";
case WTF_LINE_DRAWING: return "line_drawing";
case WTF_RELATIONAL: return "relational";
case WTF_SHOP: return "shop";
case WTF_FACE_ROAD: return "face_road";
case WTF_ROAD: return "road";
case WTF_MAX: return "BUG - WTF_MAX";
default: return "BUG - Unnamed World_terrain_flag";
}
return "BUG - Escaped switch in world_terrain_flag_name()";
}