Skip to content

Commit 214c68b

Browse files
feat(fgdpp): add fgd writer
1 parent bf221cc commit 214c68b

7 files changed

Lines changed: 550 additions & 8 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ Several modern C++20 libraries for sanely parsing Valve formats, rolled into one
5757
<li><a href="https://stratasource.org">Strata Source</a> FGD modifications</li>
5858
</ul>
5959
</td>
60-
<td align="center">❌</td>
6160
<td align="center">✅</td>
62-
<td align="center">❌</td>
61+
<td align="center">✅</td>
62+
<td align="center">✅</td>
6363
<td align="center"></td>
6464
<td></td>
6565
</tr>

include/fgdpp/fgdpp.h

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
#include <unordered_map>
77
#include <vector>
88

9+
#include <BufferStream.h>
910
#include <sourcepp/math/Vector.h>
1011

11-
class BufferStream;
12-
class BufferStreamReadOnly;
13-
1412
namespace fgdpp {
1513

1614
class FGD {
@@ -107,7 +105,7 @@ class FGD {
107105

108106
[[nodiscard]] const std::vector<AutoVisGroup>& getAutoVisGroups() const;
109107

110-
private:
108+
protected:
111109
void readEntities(BufferStreamReadOnly& stream, const std::string& path, std::vector<std::string>& seenPaths);
112110

113111
std::list<std::string> backingData;
@@ -119,4 +117,87 @@ class FGD {
119117
std::vector<AutoVisGroup> autoVisGroups;
120118
};
121119

120+
class FGDWriter {
121+
public:
122+
class AutoVisGroupWriter {
123+
public:
124+
explicit AutoVisGroupWriter(FGDWriter& parent_);
125+
126+
AutoVisGroupWriter& visGroup(const std::string& name, const std::vector<std::string>& entities);
127+
128+
FGDWriter& endAutoVisGroup();
129+
130+
private:
131+
FGDWriter& parent;
132+
};
133+
134+
class EntityWriter {
135+
public:
136+
class KeyValueChoicesWriter {
137+
public:
138+
explicit KeyValueChoicesWriter(EntityWriter& parent_);
139+
140+
KeyValueChoicesWriter& choice(const std::string& value, const std::string& displayName);
141+
142+
EntityWriter& endKeyValueChoices();
143+
144+
private:
145+
EntityWriter& parent;
146+
};
147+
148+
class KeyValueFlagsWriter {
149+
public:
150+
explicit KeyValueFlagsWriter(EntityWriter& parent_);
151+
152+
KeyValueFlagsWriter& flag(uint64_t value, const std::string& displayName, bool enabledByDefault, const std::string& description = "");
153+
154+
EntityWriter& endKeyValueFlags();
155+
156+
private:
157+
EntityWriter& parent;
158+
};
159+
160+
explicit EntityWriter(FGDWriter& parent_);
161+
162+
EntityWriter& keyValue(const std::string& name, const std::string& valueType, const std::string& displayName = "", const std::string& valueDefault = "", const std::string& description = "", bool readOnly = false, bool report = false);
163+
164+
KeyValueChoicesWriter beginKeyValueChoices(const std::string& name, const std::string& displayName = "", const std::string& valueDefault = "", const std::string& description = "", bool readOnly = false, bool report = false);
165+
166+
KeyValueFlagsWriter beginKeyValueFlags(const std::string& name, const std::string& displayName = "", const std::string& description = "", bool readOnly = false, bool report = false);
167+
168+
EntityWriter& input(const std::string& name, const std::string& valueType, const std::string& description = "");
169+
170+
EntityWriter& output(const std::string& name, const std::string& valueType, const std::string& description = "");
171+
172+
FGDWriter& endEntity();
173+
174+
private:
175+
FGDWriter& parent;
176+
};
177+
178+
[[nodiscard]] static FGDWriter begin();
179+
180+
FGDWriter& include(const std::string& fgdPath);
181+
182+
FGDWriter& version(int version);
183+
184+
FGDWriter& mapSize(sourcepp::math::Vec2i mapSize);
185+
186+
FGDWriter& materialExclusionDirs(const std::vector<std::string>& dirs);
187+
188+
AutoVisGroupWriter beginAutoVisGroup(const std::string& parentName);
189+
190+
EntityWriter beginEntity(const std::string& classType, const std::vector<std::string>& classProperties, const std::string& name, const std::string& description);
191+
192+
[[nodiscard]] std::string bakeToString();
193+
194+
void bakeToFile(const std::string& fgdPath);
195+
196+
protected:
197+
FGDWriter();
198+
199+
std::string backingData;
200+
BufferStream writer;
201+
};
202+
122203
} // namespace fgdpp

include/sourcepp/fs/FS.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@ std::vector<std::byte> readFileBuffer(const std::string& filepath, std::size_t s
1010

1111
std::string readFileText(const std::string& filepath, std::size_t startOffset = 0);
1212

13+
bool writeFileBuffer(const std::string& filepath, const std::vector<std::byte>& buffer);
14+
15+
bool writeFileText(const std::string& filepath, const std::string& text);
16+
1317
} // namespace sourcepp::fs

0 commit comments

Comments
 (0)