Какой формат файла конфигурации допускает включение других файлов и наследование настроек? - PullRequest
1 голос
/ 04 августа 2009

Я пишу многопользовательскую игру на 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 ]

1 голос
/ 04 августа 2009

JSON - это самый простой формат файла, имеющий зрелые библиотеки, и вы можете интерпретировать его так, чтобы он делал что угодно.

{
    "FastSpaceship" : {
        "Speed" : 10,
        "Rotation" : 5 
    },
    "MotherShip" : {
        "Inherits" : "FastSpaceship",
        "ShieldRecharge" : 4,
        "WeaponA": {
            "Power": 10,
            "Range": 20,
            "style": "fireball"
        }
    },
    "SlowMotherShip": {
        "Inherits": "MotherShip",
        "Speed": 4 
    } 
}
1 голос
/ 04 августа 2009

YAML ? Это как JSON без запятых и кавычек.

0 голосов
/ 05 августа 2009

После многих поисков я нашел довольно хорошее решение, используя 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

globalsettings.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 ++

0 голосов
/ 04 августа 2009

Возможно, вы захотите проверить какое-то представление на основе фреймов , поскольку, похоже, именно об этом вы и говорите. Эта страница википедии ссылается на несколько существующих реализаций, которые, возможно, вы могли бы использовать или создать свою собственную.

...