В играх часто нужно бывает нужно проверять некие глобальные флаги и выводить в зависимости от их значения некий текст. Я написал несколько маленьких функций для собственного использования, хочу поделиться. Итак:
isFlag : function(value) { return (find(global.flags, value) <> nil); } setFlag : function(value) { if (not isFlag(value)) { global.flags += [value]; } } unsetFlag : function(value) { if (isFlag(value)) { global.flags -= [value]; } } ifFlagSay : function (flag, message, ...) { if (isFlag(flag)) { say(message); if ((argcount > 2) and getarg(3)) unsetFlag(flag); if (argcount > 3) incscore(getarg(4)); } } ifNotFlagSay : function (flag, message, ...) { if (not isFlag(flag)) { say(message); if ((argcount > 2) and getarg(3)) setFlag(flag); if (argcount > 3) incscore(getarg(4)); } }
Как этим добром пользоваться. В объекте global
необходимо объявить список flags
:
global: object ... flags = [] ;
Если какие-то флаги должны быть предустановлены, то
global: object ... flags=['someFlag' 'someAnotherFlag'] ;
После этого в коде пишем что-то вроде:
if (isFlag('myFlag')) { ... }
Установить флаг:
setFlag('myFlag')
Сбросить флаг:
unsetFlag('myFlag')
Если надо вывести текст в зависимости от значения флага:
ifFlagSay('myFlag', 'Некий текст')
Если надо вывести текст и сбросить флаг:
ifFlagSay('myFlag', 'Некий текст', true)
Если надо вывести текст, сбросить флаг и выдать очки:
ifFlagSay('myFlag', 'Некий текст', true, 50)
То же самое, но для неустановленных флагов используется функция ifNotFlagSay
.
Enjoy.
Неактивен
Возможно, стоит весь этот функционал засунуть в специальный объект, flags, например.
Придется чуть больше набирать, но так более структурированно, да и автору не надо будет думать об инициализации - подрубил модуль да пользуйся.
Наверное, будет полезно, если функции смогут прожевывать списки: flags.add(['lightsOff', 'diskotekaBegan']);
ifFlagSay('myFlag', 'Некий текст', true, 50)
Это, конечно, мегашорткат, но по его виду вообще непонятно, что он делает.
Я бы лично не использовал его, а писал "развернутые" функции для улучшения читабельности. Нам и так жалуются, что в ТАДС ничего не понятно :-)
Если уж так хочется, то может ввести константу?ifFlagSay('myFlag', 'Некий текст', DROP_FLAG, 50)
Если использовать текстовые ключи, то обязательно будут всплывать жопские ошибки с опечатками в названии флага, над которыми три часа сидишь и тупишь.
В общем, лично для себя я не вижу смысла использовать эти функции.
Отредактировано Flint (11.08.2008 13:50)
Неактивен
Честно говоря, не понял назначение этого кода. Пользую флаги на соответствующих объектах.
if (vodka.drinked) {...}
if (boxer.knockout > 10) {...}
Все логично и очевидно. Видны условия, видно на что меняются значения. Для экономии времени и места есть замечательные конструкции типа (uslovie)?res1:res2;
Логические переменные (не забудьте объявить var=nil или true) прекрасно переключаются инкрементом (++)
Если есть желание портировать игру с URQ - оставляешь то же имя переменной и "g." впереди. "g" - это объект, сокращение global Всего два лишних знака.
Запихивание все переменных в список даёт только одно преимущество - можно легко показать состояние всех переменных, что полезно при отладке. Но это же удобнее делать в дебагере.
Неактивен
Честно говоря, не понял назначение этого кода. Пользую флаги на соответствующих объектах.
Иногда возникает необходимость в глобальных флагах, например, если нужно выдать некий текст при первом осмотре какого-нибудь объекта. Конечно, кому как удобно. Но я и написал, что это функции - для моего личного пользования, я не претендую на канон.
Вот, кстати, еще добавление - если определить символ:
#define FL __FILE__+cvtstr(__LINE__)
, то можно не задумываться при выдумывании имени флага в том случае, если требуется выдать некий текст один раз за всю игру в определенном месте. Он привязывается к названию файла и строке исходника. Например:
ifNotFlagSay(FL, '\bУ тебя появилось ясное чувство, что ты был здесь ранее...', true);
2Андрей: да, я знаю про isseen, но иногда подобный текст требуется выдать не только на команду "осмотреть".
Неактивен
Выделил функции в отдельный модуль и создал страничку на вики. Все изменения и дополнения буду выкладывать туда.
Неактивен