Цитата(abramcumner @ 13.08.2014, 20:05)
А к чему тогда разговоры про полиморфизм и прочее, если делается прямо противоположное
Давайте тут разберемся.
Мне хочется избежать неявных указаний классов в методах и свойствах game_object.
Например, думаю что следующий код:
Код
local ammo = level.object_by_id(id)
if ammo:get_ammo_box_curr() < ammo:get_ammo_box_size() then
ammo:get_ammo_box_curr() = ammo:get_ammo_box_curr() + 1
end
Несколько менее изящен, чем такой:
Код
local box = level.object_by_id(id).ammo_box
if box.curr < box.size then
box.curr = box.curr + 1
end
Хотя не буду спорить, кому что нравиться.
В плане реализации game_object это контейнер для произвольных объектов движка. Пока не ясно, как для него осуществить динамический экспорт свойств/методов хранимых объектов.
Поэтому остается для каждого типа объекта, делать возвратную функцию (можно и свойство).
К примеру код:
Код
local a = db.actor:get_actor()
Может быть представлен и так, при небольшой доработке:
Код
local a = db.actor.obj
Однако определив перед компиляцией свойство obj с типом CActor, его уже никак не изменить для остальных объектов. Можно сделать экспорт общего для многих объектов класса CEntity, который не будет экспортировать свойства характерные для наследников. Так например сделано для свойства immunities, поскольку класс CHitImmunity для большинства объектов является предком. Так-же в новой ревизии класс game_object предлагает следующие объекты-свойства:
Код
CInventory inventory
CEntityCondition conditions
Однако, из-за известных ограничений получается, что свойство db.actor.conditions != get_actor_obj().condition, поскольку у первого класс CEntityCondition, а у второго CActorCondition с большим числом свойств.
Пока не выяснится, как лучше осуществлять динамический экспорт классов... других вариантов просто нет. Надежда что это удастся реализовать, ещё есть )
P.S.: Свойство condition.health не равноценно game_object.health, как может показаться. Shadows приметил, что следуя туманной логике разработчиков, CScriptGameObject::SetHealth занимается зачем-то приращением, вместо присвоения.