Я помню, как читал книгу по программированию игр, когда мне было около 13 лет, и видел пример использования битовой маски для моделирования атрибутов. Что-то вроде
const int HAS_WEAPON = 0x1;
const int WEARING_ARMOR = 0x2;
const int IS_ALIENT = 0x4;
и так далее. Затем вы можете представлять атрибуты NPC как int, и вы можете устанавливать / очищать отдельные биты, используя атрибуты в качестве масок.
Теперь, конечно, битовая упаковка гораздо реже, поскольку память стала дешевле, и поэтому мы можем просто использовать логические значения для представления атрибутов. В любом случае, это похоже на то, что вы хотите сделать.
Атрибуты, однако, не совпадают с состояниями в конечном автомате. Нахождение в автомате означает, что вы не находитесь ни в каком другом состоянии. Так что, если у вас есть множество вещей, которые не являются взаимоисключающими, конечный автомат, вероятно, не тот путь. Учтите, что каждый добавляемый вами двоичный атрибут удваивает размер всей машины.
Когда вы говорите
Я знаю, что могу просто использовать BOOL для
«четвертое состояние», но разве это не кажется
еще злее? Имея "состояние на
сторона .. "
для меня это означает, что может быть проблема с тем, как вы думаете об информации, которую вы представляете. Конечно, «увольнение» звучит как хороший кандидат на государство, и если вы всегда либо увольняете, либо делаете что-то еще, то это работает как конечный автомат. Но если «Увольнение» можно объединить со всеми состояниями в существующей системе, действительно ли это вместо этого повредит моделированию его как атрибута?