Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

   #1
09.08.2008 14:39

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Несколько удобных функций (флаги)

В играх часто нужно бывает нужно проверять некие глобальные флаги и выводить в зависимости от их значения некий текст. Я написал несколько маленьких функций для собственного использования, хочу поделиться. Итак:

Код:

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. smile

Неактивен

   #2
10.08.2008 04:10

Korwin
Гоблин, зеленый от недосыпа (+141, -8)
Откуда: Екатеринбург
Зарегистрирован: 27.11.2007
Сообщений: 774
Вебсайт

У трав, растущих на мягкой земле - слабые корни. (с)Korwin

Re: Несколько удобных функций (флаги)

Надо постоянно. Буду разбираться. Спасибо!

Неактивен

   #3
11.08.2008 13:42

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Несколько удобных функций (флаги)

Возможно, стоит весь этот функционал засунуть в специальный объект, flags, например.
Придется чуть больше набирать, но так более структурированно, да и автору не надо будет думать об инициализации - подрубил модуль да пользуйся.

Наверное, будет полезно, если функции смогут прожевывать списки: flags.add(['lightsOff', 'diskotekaBegan']);

ifFlagSay('myFlag', 'Некий текст', true, 50)
Это, конечно, мегашорткат, но по его виду вообще непонятно, что он делает.
Я бы лично не использовал его, а писал "развернутые" функции для улучшения читабельности. Нам и так жалуются, что в ТАДС ничего не понятно :-)
Если уж так хочется, то может ввести константу?
ifFlagSay('myFlag', 'Некий текст', DROP_FLAG, 50)

Если использовать текстовые ключи, то обязательно будут всплывать жопские ошибки с опечатками в названии флага, над которыми три часа сидишь и тупишь.

В общем, лично для себя я не вижу смысла использовать эти функции.

Отредактировано Flint (11.08.2008 13:50)

Неактивен

   #4
11.08.2008 13:59

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: Несколько удобных функций (флаги)

Честно говоря, не понял назначение этого кода. Пользую флаги на соответствующих объектах.
if (vodka.drinked) {...}
if (boxer.knockout > 10) {...}

Все логично и очевидно. Видны условия, видно на что меняются значения. Для экономии времени и места есть замечательные конструкции типа (uslovie)?res1:res2;
Логические переменные (не забудьте объявить var=nil или true) прекрасно переключаются инкрементом (++)

Если есть желание портировать игру с URQ - оставляешь то же имя переменной и "g." впереди. "g" - это объект, сокращение global smile    Всего два лишних знака.

Запихивание все переменных в список даёт только одно преимущество - можно легко показать состояние всех переменных, что полезно при отладке. Но это же удобнее делать в дебагере.

Неактивен

   #5
12.08.2008 10:36

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Несколько удобных функций (флаги)

Честно говоря, не понял назначение этого кода. Пользую флаги на соответствующих объектах.

Иногда возникает необходимость в глобальных флагах, например, если нужно выдать некий текст при первом осмотре какого-нибудь объекта. Конечно, кому как удобно. Но я и написал, что это функции - для моего личного пользования, я не претендую на канон. smile

Вот, кстати, еще добавление - если определить символ:

Код:

#define FL __FILE__+cvtstr(__LINE__)

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

Код:

ifNotFlagSay(FL, '\bУ тебя появилось ясное чувство, что ты был здесь ранее...', true);

2Андрей: да, я знаю про isseen, но иногда подобный текст требуется выдать не только на команду "осмотреть".

Неактивен

   #6
12.08.2008 14:08

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Несколько удобных функций (флаги)

Выделил функции в отдельный модуль и создал страничку на вики. Все изменения и дополнения буду выкладывать туда.

Неактивен

Powered by PunBB
© copyright 2001–2018 iFiction.Ru