Какой формат файла конфигурации допускает включение других файлов и наследование настроек?
-
22-07-2019 - |
Вопрос
Я пишу многопользовательскую игру на C ++.
Мне нужен гибкий формат файла для хранения информации об игровых персонажах.
Игровые персонажи часто не имеют одинаковых атрибутов или используют базовую версию.
Например:
Формат, который позволил бы мне сделать что-то вроде этого:
#include "standardsettings.config"
//include other files which this file
//then changes
FastSpaceship:
Speed: 10 //pixels/sec
Rotation: 5 //deg/sec
MotherShip : FastSpaceship //inherits all the settings of the Spaceship ship
ShieldRecharge: 4
WeaponA [ power:10,
range:20,
style:fireball]
SlowMotherShip : MotherShip //inherits all the settings of the monther ship
Speed: 4 // override speed
Я искал уже существующий формат, который делает все это или похож, но безуспешно.Я стараюсь не изобретать велосипед без крайней необходимости, поэтому мне было интересно, знает ли кто-нибудь какие-нибудь хорошие форматы файлов конфигурации, которые поддерживают эти функции
Решение 4
После долгих поисков я нашел довольно хорошее решение, используя Lua
Lua, как я узнал, изначально разрабатывался как язык файлов конфигурации, но затем превратился в полноценный язык программирования.
Пример
util.lua
-- helper function needed for inheritance
function inherit(t) -- return a deep copy (incudes all subtables) of the table t
local new = {} -- create a new table
local i, v = next(t, nil) -- i is an index of t, v = t[i]
while i do
if type(v)=="table" then v=inherit(v) end -- deep copy
new[i] = v
i, v = next(t, i) -- get next index
end
return new
end
глобальные настройки.lua
require "util"
SpaceShip = {
speed = 1,
rotation =1
}
myspaceship.lua
require "globalsettings" -- include file
FastSpaceship = inherits(SpaceShip)
FastSpaceship.Speed = 10
FastSpaceship.Rotation = 5
MotherShip = inherits(FastSpaceship)
MotherShip.ShieldRecharge = 4
ShieldRecharge.WeaponA = {
Power = 10,
Range = 20,
Style = "fireball"
SlowMotherShip = inherits(MotherShip)
SlowMotherShip.Speed = 4
Используя функцию печати в Lua, также легко проверить настройки на правильность.Синтаксис не совсем такой приятный, как мне бы хотелось, но он настолько близок к тому, что я хочу, что я не буду возражать написать еще немного.
Использование приведенного здесь кода http://windrealm.com/tutorials/reading-a-lua-configuration-file-from-c.php Я могу прочитать настройки в своей программе на C ++
Другие советы
JSON относится к простейшему формату файла, имеет зрелые библиотеки, и вы можете интерпретировать его, чтобы делать все что угодно.
{
"FastSpaceship" : {
"Speed" : 10,
"Rotation" : 5
},
"MotherShip" : {
"Inherits" : "FastSpaceship",
"ShieldRecharge" : 4,
"WeaponA": {
"Power": 10,
"Range": 20,
"style": "fireball"
}
},
"SlowMotherShip": {
"Inherits": "MotherShip",
"Speed": 4
}
}
YAML ? Это как JSON без запятых и кавычек.
Возможно, вы захотите проверить какое-то основанное на фреймах представление , так как оно кажется это именно то, о чем ты говоришь. Эта страница википедии ссылается на несколько существующих реализаций, которые, возможно, вы могли бы использовать или создать свою собственную.