В играх часто нужно бывает нужно проверять некие глобальные флаги и выводить в зависимости от их значения некий текст. Я написал несколько маленьких функций для собственного использования, хочу поделиться. Итак:
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. ![]()
Неактивен
Честно говоря, не понял назначение этого кода. Пользую флаги на соответствующих объектах.
Иногда возникает необходимость в глобальных флагах, например, если нужно выдать некий текст при первом осмотре какого-нибудь объекта. Конечно, кому как удобно. Но я и написал, что это функции - для моего личного пользования, я не претендую на канон. ![]()
Вот, кстати, еще добавление - если определить символ:
#define FL __FILE__+cvtstr(__LINE__)
, то можно не задумываться при выдумывании имени флага в том случае, если требуется выдать некий текст один раз за всю игру в определенном месте. Он привязывается к названию файла и строке исходника. Например:
ifNotFlagSay(FL, '\bУ тебя появилось ясное чувство, что ты был здесь ранее...', true);
2Андрей: да, я знаю про isseen, но иногда подобный текст требуется выдать не только на команду "осмотреть".
Неактивен
Выделил функции в отдельный модуль и создал страничку на вики. Все изменения и дополнения буду выкладывать туда.
Неактивен