Discussion Новая система свойств сущностей

Автор темы #1
Дата рег
16 Сен 2011
Сообщения
208
Симпатии
72
Начало реализации начато в ревизии 484.
По окончании все игровые сущности будут работать с данными свойствами.


Свойство (Property) будет декларироваться с помощью прагмы property
#pragma property "Class AccessType Type Name"
Class - класс сущности, пока может быть только Item;
AccessType - уровень доступа к свойству:
- Virtual - свойство виртуальное, т.е. значение вычисляется при каждом обращении к нему, нигде не хранясь физически; установка колбека на вычисление значения еще не введено;
- VirtualClient - то же, что и Virtual, но присутствует только в клиентских скриптах;
- VirtualServer - то же, что и Virtual, но присутствует только в серверных скриптах;
- Private - закрытое свойство, не передается по сети никому;
- PrivateClient - то же, что и Private, но присутствует только в клиентских скриптах;
- PrivateServer - то же, что и Private, но присутствует только в серверных скриптах;
- Public - открытое свойство, доступно для просмотра всем игрокам;
- PublicModifiable - то же, что и Public; возможно изменение значения игроком, которому принадлежит;
- Protected - защищенное свойство, доступно для просмотра только игроку, которому принадлежит;
- ProtectedModifiable - то же, что и Protected; возможно изменение значения игроком, которому принадлежит;
Type - тип свойства, пока может быть любым примитивом размером 1, 2, 4 или 8 байт (int, bool, uint64, hash и т.п.); в будущем будет добавлен string и dict;
Name - имя свойства, должно быть уникальное в рамках одной сущности; по имени происходит последующее сохранение и загрузка в сохранениях мира и клиентов;

На все свойства можно будет ставить неограниченное число колбеков, которые будут вызываться при его изменении.
Данные свойств, которые не удалось загрузить (имя было не найдено), не удаляются, а будут сохраняться и загрузятся в случае, если свойство будет восстановлено.


Свойства предметов, которые добавляются движком (описано в _defines.fos):
Код:
 # pragma property "Item PublicModifiable uint16 SortValue		 "
 # pragma property "Item Protected		uint8  Indicator		 "
 # pragma property "Item Public		   uint8  Info			  "
 # pragma property "Item Public		   hash   PicMap			"
 # pragma property "Item Public		   hash   PicInv			"
 # pragma property "Item Public		   uint   Flags			 "
 # pragma property "Item PublicModifiable uint8  Mode			  "
 # pragma property "Item Public		   int8   LightIntensity	"
 # pragma property "Item Public		   uint8  LightDistance	 "
 # pragma property "Item Public		   uint8  LightFlags		"
 # pragma property "Item Public		   uint   LightColor		"
 # pragma property "Item PrivateServer	hash   ScriptId		  "
 # pragma property "Item Public		   uint   Count			 "
 # pragma property "Item Public		   uint   Cost			  "
 # pragma property "Item Public		   int	Val0			  "
 # pragma property "Item Public		   int	Val1			  "
 # pragma property "Item Public		   int	Val2			  "
 # pragma property "Item Public		   int	Val3			  "
 # pragma property "Item Public		   int	Val4			  "
 # pragma property "Item Public		   int	Val5			  "
 # pragma property "Item Public		   int	Val6			  "
 # pragma property "Item Public		   int	Val7			  "
 # pragma property "Item Public		   int	Val8			  "
 # pragma property "Item Public		   int	Val9			  "
 # pragma property "Item Public		   uint8  BrokenFlags	   "
 # pragma property "Item Public		   uint8  BrokenCount	   "
 # pragma property "Item Public		   uint16 Deterioration	 "
 # pragma property "Item Public		   hash   AmmoPid		   "
 # pragma property "Item Public		   uint16 AmmoCount		 "
 # pragma property "Item Protected		int16  TrapValue		 "
 # pragma property "Item Protected		uint   LockerId		  "
 # pragma property "Item Protected		uint16 LockerCondition   "
 # pragma property "Item Protected		uint16 LockerComplexity  "
 # pragma property "Item Protected		uint   HolodiskNumber	"
 # pragma property "Item Protected		uint16 RadioChannel	  "
 # pragma property "Item Protected		uint16 RadioFlags		"
 # pragma property "Item Protected		uint8  RadioBroadcastSend"
 # pragma property "Item Protected		uint8  RadioBroadcastRecv"
 # pragma property "Item Public		   int16  OffsetX		   "
 # pragma property "Item Public		   int16  OffsetY		   "
 
Автор темы #2
Дата рег
16 Сен 2011
Сообщения
208
Симпатии
72
В ревизии 489 добавил возможность работы со строками и массивами в свойствах.
Плюс улучшил производительность работы с ними, поправил баги.
 
Автор темы #3
Дата рег
16 Сен 2011
Сообщения
208
Симпатии
72
В ревизии 491 новые свойства добавлены для персонажей и прототипов предметов.
 
Дата рег
23 Окт 2011
Сообщения
153
Симпатии
62
Т.е. теперь вместо SetParameterGetBehaviour будет SetPropertyGetCallback и дальше по аналогии?
Когда планируется окончание внедрения свойств?

И еще вопрос: структура
Код:
# pragma property Critter Defaults Group = KarmaPerks
...
# pragma property Critter Defaults
Что дает? Что будет возвращено при запросе Critter::KarmaPerks?
 
Последнее редактирование:
Автор темы #5
Дата рег
16 Сен 2011
Сообщения
208
Симпатии
72
Т.е. теперь вместо SetParameterGetBehaviour будет SetPropertyGetCallback и дальше по аналогии?
Да, плюс хочу еще добавить установку геттеров-сеттеров в прагму.
Когда планируется окончание внедрения свойств?
Два-три месяца.
И еще вопрос: структура
Код:
# pragma property Critter Defaults Group = KarmaPerks
...
# pragma property Critter Defaults
Что дает? Что будет возвращено при запросе Critter::KarmaPerks?
Перечисление свойств это enum имя которого состоит из имени класса и Property, т.е. CritterProperty, ItemProperty.
Имя группы свойств создает глобальный массив имя которого складывается так же плюс имя группы, т.е. в случае выше будет массив
CritterProperty[] CritterPropertyKarmaPerks;
в котором будут все свойства объявленные в "...".
 
Дата рег
23 Окт 2011
Сообщения
153
Симпатии
62
Перечисление свойств это enum имя которого состоит из имени класса и Property, т.е. CritterProperty, ItemProperty.
Имя группы свойств создает глобальный массив имя которого складывается так же плюс имя группы, т.е. в случае выше будет массив
CritterProperty[] CritterPropertyKarmaPerks;
в котором будут все свойства объявленные в "...".
Иными словами, перебор Кармы будет выглядеть так?
Код:
for( uint i = 0; i < CritterPropertyKarmaPerks.length(); i++ )
А обращение к конкретному с целью его проверить\выставить так?
Код:
#define TR_ASS (7)	// Восьмой трейт в массиве Traits
cr.SetAsInt( CritterPropertyTraits[TR_ASS ], 1 );
_______________
Ок, методы SetAsInt, GetAsInt уже работают как ..AsUint, ..AsFloat, ..AsString и т.д. или это только моя фантазия?
 
Автор темы #7
Дата рег
16 Сен 2011
Сообщения
208
Симпатии
72
Да, так.
GetAsInt и SetAsInt используются при работе со свойствами на более общем уровне, когда надо изменить конкретное свойство, то лучше обращаться к нему напрямую:
cr.TraitA = 100, а не cr.SetAsInt( CritterProperty::TraitA, 100 ).
...AsFloat, AsString будут в будущем, пока есть только AsInt.
 
Дата рег
23 Окт 2011
Сообщения
153
Симпатии
62
Есть
Код:
# pragma property Critter Defaults Group = Traits
# pragma property Critter Protected bool IsTraitFastMetabolism
# pragma property Critter Protected bool IsTraitBruiser
# pragma property Critter Protected bool IsTraitSmallFrame
# pragma property Critter Protected bool IsTraitOneHander
# pragma property Critter Protected bool IsTraitFinesse
# pragma property Critter Protected bool IsTraitKamikaze
# pragma property Critter Protected bool IsTraitHeavyHanded
# pragma property Critter Protected bool IsTraitFastShot
# pragma property Critter Protected bool IsTraitBloodyMess
# pragma property Critter Protected bool IsTraitJinxed
# pragma property Critter Protected bool IsTraitJinxedII
# pragma property Critter Protected bool IsTraitGoodNatured
# pragma property Critter Protected bool IsTraitChemReliant
# pragma property Critter Protected bool IsTraitChemResistant
# pragma property Critter Protected bool IsTraitSexAppeal
# pragma property Critter Protected bool IsTraitSkilled
# pragma property Critter Protected bool IsTraitNightPerson
# pragma property Critter Defaults
Меняем любой на какой-либо новый. Назовем его trait1.
Код:
# pragma property Critter Defaults Group = Traits
# pragma property Critter Protected bool IsTraitTrait1
Он попадает в группу CritterPropertiesTraits, а значит и в RegistrationParameter.
Делаем для IsTraitTrait1 описание в fogame, запускаем клиент и что мы видим - Быстрый метаболизм.
Аналогично со скиллами.

Отсюда вопрос - как теперь изменить название и состав рег-параметров на стороне клиента?
_____________
Ниважна, нашел в gui_screens
Код:
namespace Registration
{
import PropsDict GenerateRegProps() from "parameters";
import PropsDict CritterGenerate( PropsDict& regProps ) from "parameters";
import bool CritterGenerateCheck( PropsDict& props ) from "parameters";
#ifdef PLAYERS_3D
import void Set3DRegistrationGender( int gender ) from "client_3d_cha_reg";
#endif
 
CritterProperty[] ShowBaseStats = { StrengthBase, PerceptionBase, EnduranceBase, CharismaBase, IntellectBase, AgilityBase, LuckBase };
CritterProperty[] ShowHealthStats = { MaxLifeBase, IsPoisoned, IsRadiated, IsDamagedEye, IsDamagedRightArm, IsDamagedLeftArm, IsDamagedRightLeg, IsDamagedLeftLeg };
CritterProperty[] ShowExtendedStats = { ArmorClassBase, ActionPointsBase, CarryWeightBase, MeleeDamageBase, NormalResistanceBase, PoisonResistanceBase, RadiationResistanceBase, SequenceBase, HealingRateBase, CriticalChanceBase };
CritterProperty[] ShowTraitsLeft = { IsTraitFastMetabolism, IsTraitBruiser, IsTraitSmallFrame, IsTraitOneHander, IsTraitFinesse, IsTraitKamikaze, IsTraitHeavyHanded, IsTraitFastShot };
CritterProperty[] ShowTraitsRight = { IsTraitBloodyMess, IsTraitJinxed, IsTraitGoodNatured, IsTraitChemReliant, IsTraitChemResistant, IsTraitSexAppeal, IsTraitSkilled, IsTraitNightPerson };
CritterProperty[] ShowSkills = { SkillSmallGuns, SkillBigGuns, SkillEnergyWeapons, SkillUnarmed, SkillMeleeWeapons, SkillThrowing, SkillFirstAid, SkillDoctor, SkillSneak,
SkillLockpick, SkillSteal, SkillTraps, SkillScience, SkillRepair, SkillSpeech, SkillBarter, SkillGambling, SkillOutdoorsman };
 
PropsDict RegProps;
PropsDict Props;
CritterProperty CurTip = Invalid;
_____________
По поводу обнов в 500 ревизии. Если не сложно, просьба помимо объявленных идентификаторов добавить Debug, результатом которого будет создание одноименного файла скрипта с расширением .log и в который будут писаться все ошибки, в которых этот скрипт принял прямое или посредственное участие (call stack, например).
 
Последнее редактирование:
Дата рег
23 Окт 2011
Сообщения
153
Симпатии
62
В FOGAME.MSG пропущены Base свойства криттера. Отсюда TXT и ERROR при регистрации персонажа.
Решение:
Код:
{CritterProperty::StrengthBase}{Name}{Сила}
{CritterProperty::StrengthBase}{Desc}{Грубая физическая сила. Хорошо подходит для воинов и им подобных. Оказывает влияние на Очки Жизней, наносимые Повреждения и Переноску Груза.}
{CritterProperty::PerceptionBase}{Name}{Восприятие}
{CritterProperty::PerceptionBase}{Desc}{Способность иначе видеть, слышать, замечать и предчувствовать события. Необходимое качество для каждого снайпера. Оказывает влияние на Дальность стрельбы и Порядок действий.}
{CritterProperty::EnduranceBase}{Name}{Выносливость}
{CritterProperty::EnduranceBase}{Desc}{Выносливость помогает переносить тяготы и лишения судьбы героя с подобающим спокойствием. Оказывает влияние на Очки Жизней, Устойчивость к Яду и Радиации, Уровень Лечения и др.}
{CritterProperty::CharismaBase}{Name}{Обаяние}
{CritterProperty::CharismaBase}{Desc}{Обаяние представляет собой комбинацию внешности и шарма. Высокое обаяние необходимо для тех персонажей, которые думают всего добиться словами. Влияет на реакцию людей и цены товаров.}
{CritterProperty::IntellectBase}{Name}{Интеллект}
{CritterProperty::IntellectBase}{Desc}{Интеллект отвечает за память, скорость реакции и способность оценивать события. Высокий Интеллект важен для всех. Влияет на количество новых умений-на-уровень, режимы диалога и многие способности.}
{CritterProperty::AgilityBase}{Name}{Ловкость}
{CritterProperty::AgilityBase}{Desc}{Ловкость и координация движений не раз спасут вас от верной гибели. Каждый активный герой нуждается в ловкости. Влияет на Очки движения, Класс брони, Порядок действий и пр.}
{CritterProperty::LuckBase}{Name}{Удача}
{CritterProperty::LuckBase}{Desc}{Степень воздействия теории вероятностей на вашу судьбу. Высокая или низкая удачливость часто определяют, как вам повезет в игре, как будут развиваться дальнейшие события.}
{CritterProperty::MaxLifeBase}{Name}{Максимум очков жизней}
{CritterProperty::MaxLifeBase}{Desc}{Определяет, какое количество повреждений сможет вынести персонаж, прежде чем умрет. Если Очки Жизни составляют от 0 до –20, персонаж падает на землю и не может двигаться (персонаж не умирает, а начинает восстанавливать запас здоровья, как если бы он отдыхал), но отравленный персонаж умирает даже с 0 Очков Жизни.}
{CritterProperty::ActionPointsBase}{Name}{Максимум очков действия}
{CritterProperty::ActionPointsBase}{Desc}{Лимит возможных действий, предпринимаемых персонажем. В режиме реального времени Очки Действия восстанавливаются за 7 секунд, в пошаговом они восстанавливаются в начале каждого хода.}
{CritterProperty::ActionPointsBase}{ShortName}{Очки действий}
{CritterProperty::ArmorClassBase}{Name}{Класс брони}
{CritterProperty::ArmorClassBase}{Desc}{Влияет на вероятность поранить данного конкретного персонажа.}
{CritterProperty::ArmorClassBase}{ShortName}{Класс брони}
{CritterProperty::MeleeDamageBase}{Name}{Рукопашные повреждения}
{CritterProperty::MeleeDamageBase}{Desc}{Количество повреждений, причиняемых вашим персонажем в рукопашном бою.}
{CritterProperty::MeleeDamageBase}{ShortName}{Рукоп. повр.}
{CritterProperty::CarryWeightBase}{Name}{Переносимый груз}
{CritterProperty::CarryWeightBase}{Desc}{Максимальный вес поклажи, который может переносить ваш персонаж, в фунтах (373 гр. по Тр.)}
{CritterProperty::CarryWeightBase}{ShortName}{Макс. груз}
{CritterProperty::SequenceBase}{Name}{Порядок}
{CritterProperty::SequenceBase}{Desc}{Определяет порядок начала активных действий вашего персонажа.}
{CritterProperty::SequenceBase}{ShortName}{Порядок}
{CritterProperty::HealingRateBase}{Name}{Уровень лечения}
{CritterProperty::HealingRateBase}{Desc}{В конце дня, ваш персонаж будет добавлять по 1 жизни для каждого очка Уровня лечения. Во время отдыха вы лечитесь каждые шесть часов.}
{CritterProperty::HealingRateBase}{ShortName}{Уров. лечен.}
{CritterProperty::CriticalChanceBase}{Name}{Шанс критического удара}
{CritterProperty::CriticalChanceBase}{Desc}{Вероятность нанесения критических повреждений противнику определяется этим значением.}
{CritterProperty::CriticalChanceBase}{ShortName}{Шанс на крит.}
{CritterProperty::NormalResistanceBase}{Name}{Устойчивость к повреждениям}
{CritterProperty::NormalResistanceBase}{Desc}{Все получаемые повреждения уменьшаются в соответствии с данным значением. На него сильно влияет Класс брони.}
{CritterProperty::NormalResistanceBase}{ShortName}{Уст. к повр.}
{CritterProperty::RadiationResistanceBase}{Name}{Устойчивость к радиации}
{CritterProperty::RadiationResistanceBase}{Desc}{Количество радиационного облучения, которому вы подвергаетесь, зависит от этого значения. На него влияет тип одетой вами брони и прием антирадиационных химикатов.}
{CritterProperty::RadiationResistanceBase}{ShortName}{Уст. к рад.}
{CritterProperty::PoisonResistanceBase}{Name}{Устойчивость к яду}
{CritterProperty::PoisonResistanceBase}{Desc}{Уменьшает повреждения от отравления.}
{CritterProperty::PoisonResistanceBase}{ShortName}{Уст. к яду}
 
Автор темы #10
Дата рег
16 Сен 2011
Сообщения
208
Симпатии
72
В ревизии 502 добавлены глобальные свойства и свойства для карт и локаций.
 
Дата рег
23 Окт 2011
Сообщения
153
Симпатии
62
Ошибки - кому-нибудь может пригодится.
Код:
[49:802] Script exception: Key not found.
[49:802] 0) const int& dict::get_opIndex(const CritterProperty&in) const
[49:802] 1) parameters : void CritterGenerate(dict<CritterProperty,int>&inout) : 10742, 1
[49:802] 2) main : void critter_init(Critter&inout, bool) : 11897, 1
Key not found - не найден ключ для массива сущностей. В данном случае смотрим parameters : void CritterGenerate и ищем там отсутствующую строку с объявлением сущности
Код:
props.setIfNotExist( [CritterProperty], 0 );
-------------------------------------------------------------------------
Другая ошибка
Код:
[33:299] Script message: : Warning : There is an external reference to an object in module 'parameters', preventing it from being deleted : 0, 0.
[33:299] Script message: : Info : The builtin type in previous message is named 'array' : 0, 0.
Смотреть нужно скомпиленный fosb, искать array, там есть ссылка на nukemachine.fos + hash[]CityPids. Если nukemachine.fos убрать, то ссылка будет на другой скрипт и также на citypids. В чем соль - hash[] CityPids присутствует в каждом Server скрипте при компиляции. Две ссылки на такие скрипты и мы получаем два одинаковых массива с одним именем. По моему, отсюда и ошибки. В случае client_main (такая же ошибка) - ссылается на uint8[]Array из serializator.fos.