@@ -184,6 +184,14 @@ void readEntityIO(BufferStreamReadOnly& stream, BufferStream& backing, FGD::Enti
184184	parser::text::eatWhitespaceAndSingleLineComments (stream);
185185}
186186
187+ [[nodiscard]] std::string_view readEntityFieldModifier (BufferStreamReadOnly& stream, BufferStream& backing) {
188+ 	parser::text::eatWhitespace (stream);
189+ 	if  (stream.peek <char >() != ' :' peek <char >() != ' =' 
190+ 		return  parser::text::readUnquotedStringToBuffer (stream, backing);
191+ 	}
192+ 	return  " " 
193+ }
194+ 
187195void  readEntityKeyValue (BufferStreamReadOnly& stream, BufferStream& backing, FGD::Entity& entity) {
188196	//  Key and value type (looks like "key(valueType)", or "input key(valueType)" for i/o)
189197	auto  name = parser::text::readUnquotedStringToBuffer (stream, backing, " (" 
@@ -205,6 +213,7 @@ void readEntityKeyValue(BufferStreamReadOnly& stream, BufferStream& backing, FGD
205213	if  (string::iequals (valueType, " choices" 
206214		auto & field = entity.fieldsWithChoices .emplace_back ();
207215		field.name  = name;
216+ 		field.modifier  = ::readEntityFieldModifier (stream, backing);
208217
209218		if  (::tryToEatSeparator (stream, ' :' 
210219			field.displayName  = ::readFGDString (stream, backing);
@@ -238,6 +247,17 @@ void readEntityKeyValue(BufferStreamReadOnly& stream, BufferStream& backing, FGD
238247	} else  if  (string::iequals (valueType, " flags" 
239248		auto & field = entity.fieldsWithFlags .emplace_back ();
240249		field.name  = name;
250+ 		field.modifier  = ::readEntityFieldModifier (stream, backing);
251+ 
252+ 		if  (::tryToEatSeparator (stream, ' :' 
253+ 			field.displayName  = ::readFGDString (stream, backing);
254+ 			parser::text::eatWhitespaceAndSingleLineComments (stream);
255+ 		}
256+ 
257+ 		if  (::tryToEatSeparator (stream, ' :' 
258+ 			field.description  = ::readFGDString (stream, backing);
259+ 			parser::text::eatWhitespaceAndSingleLineComments (stream);
260+ 		}
241261
242262		if  (!::tryToEatSeparator (stream, ' =' tryToEatSeparator (stream, ' [' 
243263			throw  parser::text::syntax_error{INVALID_SYNTAX_MSG};
@@ -246,7 +266,7 @@ void readEntityKeyValue(BufferStreamReadOnly& stream, BufferStream& backing, FGD
246266
247267		while  (stream.peek <char >() != ' ]' 
248268			auto & flag = field.flags .emplace_back ();
249- 			flag.value  = parser::text::readUnquotedStringToBuffer (stream, backing, parser::text::NO_ESCAPE_SEQUENCES );
269+ 			flag.value  = :: readFGDString (stream, backing);
250270
251271			if  (!::tryToEatSeparator (stream, ' :' 
252272				continue ;
@@ -256,7 +276,7 @@ void readEntityKeyValue(BufferStreamReadOnly& stream, BufferStream& backing, FGD
256276			if  (!::tryToEatSeparator (stream, ' :' 
257277				continue ;
258278			}
259- 			flag.enabledByDefault  = parser::text::readUnquotedStringToBuffer (stream, backing, parser::text::NO_ESCAPE_SEQUENCES );
279+ 			flag.enabledByDefault  = :: readFGDString (stream, backing);
260280
261281			if  (!::tryToEatSeparator (stream, ' :' 
262282				continue ;
@@ -268,6 +288,7 @@ void readEntityKeyValue(BufferStreamReadOnly& stream, BufferStream& backing, FGD
268288		auto & field = entity.fields .emplace_back ();
269289		field.name  = name;
270290		field.valueType  = valueType;
291+ 		field.modifier  = ::readEntityFieldModifier (stream, backing);
271292		field.displayName  = " " 
272293		field.valueDefault  = " " 
273294		field.description  = " " 
0 commit comments