Topic: Фич-реквест

Собственно, две фичи:

1. Возможность описать свою функцию, которая используется для генерации имени сейва. Название комнаты не всегда для этого подходит.
2. Подсчет общего времени, проведенного в игре.

Можно?  smile

Re: Фич-реквест

а почему бы таймером не инкрементировать глобальную переменную.

Re: Фич-реквест

Причем тут таймер? Надо считать разницу дат при сохранении.

4 (edited by zaynyatyi 2012-04-06 22:14:46)

Re: Фич-реквест

"Подсчет общего времени, проведенного в игре." и "Надо считать разницу дат при сохранении." несколько отличаются
Так как время проведенное в игре можно таймером считать, а разница между сохранениями - это время проведенное мной на баскетбольной площадке, на рыбалке, в спящем состоянии и прочее.
Либо (замодерированно). Ладно, что это я.

Re: Фич-реквест

Общее время в игре, я думаю достаточно просто в start брать время в секундах (lua), и, например, каждый ход вычислять разницу между стартовым временем и текущим. Писать все в prefs. см. модуль prefs.

Про имя комнаты - не знаю, технически конечно не сложно. Но мне не очень нравится такая идея, игра не должна управлять такими вещами. Это как из игры менять разрешение. Мало ли что выдумал автор - название сейва должно быть честным.

Re: Фич-реквест

Peter wrote:

Общее время в игре, я думаю достаточно просто в start брать время в секундах (lua), и, например, каждый ход вычислять разницу между стартовым временем и текущим. Писать все в prefs. см. модуль prefs.

Не хочется каждый ход это вычислять. В качестве альтернативы можно добавить обработчики onload и onsave.

Peter wrote:

Про имя комнаты - не знаю, технически конечно не сложно. Но мне не очень нравится такая идея, игра не должна управлять такими вещами. Это как из игры менять разрешение. Мало ли что выдумал автор - название сейва должно быть честным.

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

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

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

Re: Фич-реквест

Разница даты save и лоад это не честное время, так как это время для 1 сейва, а не общее время, проведенное за игрой.

Ну сделай save функцию если не хочешь каждый ход.

Свой объект.save вызовется при сейве.

А load или старт игры это start.

Re: Фич-реквест

В смысле нечестное? Я могу аккумулировать это время в какой-нибудь переменной. Которая в свою очередь будет сохраняться через prefs, как ты тут правильно указал.

Про объект.save не понял - это фича, которая уже есть? Т.е. obj.save вызывается при сейве, а obj.start при загрузке?

А какой-нибудь getSaveName докрутить никак?  smile

9 (edited by zaynyatyi 2012-04-07 00:50:53)

Re: Фич-реквест

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

10 (edited by Vorov2 2012-04-07 01:05:54)

Re: Фич-реквест

zaynyatyi,
Нет, время проведенное в игре - это время между загрузкой сейва (началом сеанса игры) и сохранением сейва (завершением сеанса игры), аккумулированное в переменной в prefs, а не время между двумя загрузками.

Таймером считать плохо, потому что:
а) неудобно, т.к. таймер используется и для других вещей
б) лишняя нагрузка
в) бессмысленно, т.к. и без есть уже отличный таймер под названием "часы"
г) и наконец даже результат будет неправильный

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

Re: Фич-реквест

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

Re: Фич-реквест

1) Есть function start - это как init, но вызывается после save или если сэйва не было - в начале игры.
2) У каждого объекта есть save метод.
3) Про имена сейвов, я пока считаю это вредная фича.

Re: Фич-реквест

А собственно зачем? smile

14 (edited by malcolm 2013-01-11 14:11:58)

Re: Фич-реквест

Смею поддержать топикстартера на предмет названия сейвов. Во многих играх очень сложно ориентироваться в сейвах (манчкинский опыт прошлого требует сохраняться часто и на разные слоты). Особенно актуально в играх с нелинейным сюжетом (например в "Карантине"), или в тех, где есть возможность неправильного применения предмета (ремейки со спектрума). Возможно стоит сделать эту функцию отключаемой, например модулем. Если автор игры не хочет использовать альтернативные названия сейвов - он просто не будет включать этот модуль.
При таком раскладе я ратую за то, чтобы было три варианта получения названий сейвов (выбирается автором конкретной игры):
1. Стандартный режим. Как оно сделано сейчас.
2. Автор задает свой механизм генерации названий. Например как хочет Vorov2. Игрок не может влиять на названия.
3. Названия забивает сам игрок.

Но вообще я в эту тему зашел, чтобы свой реквест озвучить smile
Прошу реализовать дочерние связи объектов/комнат/диалогов и пр. Либо формирование неких списков из объектов с возможностью действовать на весь список разом.
Пример применения:

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

Сейчас для этого нужно в объекте кольцо прописать вручную активацию соответствующей реплики у каждого персонажа (хорошо, если таковых 2-3, но если на много больше?).

Желаемый вариант. Я у каждого персонажа прописываю его принадлежность к группе "знающих о кольце".
В кольце я пишу код, применительно ко всей группе.

Re: Фич-реквест

С альтернативными названиями все решается довольно просто без всяких модулей, путем некой функции game.savename, которая, если определена, задает название сейва, а если нет - то используется старый алгоритм. В принципе и сейчас можно повлиять на название сейва, по крайней мере частично, используя специальную функцию в nam, однако если игра сделана стандартным образом, и nam выводится вверху сцены, то этот способ не очень подходит. Ну и дата все равно будет добавляться.

В игре, которую я делаю, у меня все названия сейвов сейчас выглядят как "Fri Jan 11 ....", и ориентироваться в них, конечно, не очень просто. В идеале хотелось бы: [Название главы] "(" [Общее время игры] ")".

Re: Фич-реквест

malcolm: в принципе это уже в самой игре можно сделать. делаешь список. регистрируешь в списке кучу объектов, и есть твоя служебная функция, делающая одно и тоже действие над каждым экземпляром.

Мне просто сложно придумать то о чем ты говоришь универсальным образом, я пока не совсем даже понял как это в твоей схеме будет работать... По сути, все равно фраза будет прописана у каждого персонажа. А если нет - то это надо часть фраз делать общими для всех персонажей, пока я сам не столкнулся с такой необходимостью мне сложно что-то написать, поэтому предлагаю для начала эту функцию реализовать в своей игре и обкатать.

Про savename подумаю перед 1.8.3. Думаю, вставлю вариант Vorov2.

17 (edited by malcolm 2013-01-11 16:42:11)

Re: Фич-реквест

2Peter: Возможно я не очень хорошо объяснил. Просто я раньше пробовал работать в Game Maker и там есть очень удобная возможность работать с дочерними связями. В Instead я такой возможности пока не нашел, но до сегодняшнего момента и применения особо не видел. Сегодня стал читать про организацию диалогов и нашел, как мне кажется, применение подобному приему.

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

Допустим я пишу игру. У меня в игре есть монстры, которые бегают по карте и всячески мешают игроку. Есть монстры пешие: крысы, пауки, зомби; а есть летающие: летучие мыши, птицы, драконы.
На каждый тип врага у меня заведен свой объект. Объект-крыса, объект-птица и т.д.
Есть объект "летающий монстр". Сам он в игре не используется, у него нет даже своего спрайта. НО он является материнским объектом для летучей мыши, птицы,  дракона.
Есть объект "пеший монстр", он материнский для крысы, поука, зомби.
Есть объект "монстр", он материнский для "пешего монстра" и "летающего монстра"
Допустим мне надо в игре разом увеличить скорость у всех пеших монстров, но не трогать летающих. Тогда я пишу:

peshiy_monstr.speed += 1 

и у всех пеших скорость увеличивается.
А если наберу

monstr.speed += 1 

то это по связям передастся сначала объектам "пеший монстр" и "летающий монстр", а от них всем остальным.

Т.о. движок GM позволяет мне воздействовать на конкретный экземпляр объекта (один и тот же объект может встречаться в комнате несколько раз, на уровне может быть много крыс и я могу подействовать только на одну) - тогда я обращаюсь к нему по генерируемуму GM-ом id.
На все экземпляры объекта - тогда я обращаюсь к названию объекта.
На все объекты, являющиеся пешими монстрами - обращаюсь к материнскому объекту первого уровня.
Вообще на всех монстров - обращаюсь к материнскому объекту второго уровня.

Теперь применительно к instead:

Допустим у меня есть персонажи "Вася", "Петя", "Дима", "Сережа". И есть предметы "Кольцо" и "Яблоко".
Описывая диалоги, я пишу:

vasya = dlg {
    prnt = ring_fellowship,     -- параметр принадлежности к группе ring_fellowship. Возможно как-то по другому можно эту ссылку обозначить.
    nam = 'диалог с Васей',
    entered = 'я вижу Васю',
    phr = {
        < много разных фраз  >,
        { tag = 'ring', falce, 'Я нашел кольцо, не знаешь чье оно?' 'Нет, первый раз вижу' },
    },
};
petya = dlg {
    prnt = ring_fellowship, apple_eater, 
    nam = 'диалог с Петей',
    entered = 'я вижу Петю',
    phr = {
        < много разных фраз  >,
        { tag = 'ring', falce, 'Я нашел кольцо, не знаешь чье оно?' 'Хм... кажется Димино, спроси его!' },
        { tag = 'apple', falce, 'Я нашел яблоко, хочешь?' 'Нет, у меня на них аллергия' },
    },
};
dima = dlg {
    prnt = ring_fellowship, apple_eater, 
    nam = 'диалог с Димой',
    entered = 'я вижу Диму',
    phr = {
        < много разных фраз  >,
        { tag = 'ring', falce, 'Я нашел кольцо, не знаешь чье оно?' 'Моя преллесссть! Отдай! Отдай!' code [[ remove(ring, me()); ring_fellowship.poff 'ring' ]] },
        { tag = 'apple', falce, 'Я нашел яблоко, хочешь?' 'Дима любит яблоки! Ням-ням!' code [[ remove(apple, me()); apple_eater.poff 'apple' ]] },
    },
};
sereja = dlg {
    prnt = apple_eater, 
    nam = 'диалог с Сережей',
    entered = 'я вижу Сережу',
    phr = {
        < много разных фраз  >,
       { tag = 'apple', falce, 'Я нашел яблоко, хочешь?' 'Спасибо, я как раз проголодался.' code [[ remove(apple, me()); apple_eater.poff 'apple' ]] },
    },
};

ring = obj {
    nam = 'Кольцо';
    dsc = 'На полу пещеры {что-то} блестит';
    tak = 'Это оказалось кольцо'; code [[ ring_fellowship.pon 'ring' ]]
        inv = 'Золотое кольцо со странными рунами';
};
apple = obj {
    nam = 'Яблоко';
    dsc = 'На дереве висит {яблоко}';
    tak = 'Я сорвал яблоко'; code [[ apple_eater.pon 'apple' ]]
        inv = 'Яблочко золотое-наливное';
};

Если в коде налажал, поправьте пожалуйста, я пока еще только разбираюсь...  roll

Можно наоборот, не в диалогах прописывать параметр "prnt = apple_eater, ", а сделать новый типа объектов, список. Тогда нужно будет в нем перечислить всех нужных персонажей. Пока не уверен, что удобнее...

Если я правильно понял, то ты предлагаешь сделать через массивы. В принципе можно и так. Тогда вместо параметра     prnt = ring_fellowship,  я создаю массив ring_fellowship и записываю в него:
ring_fellowship[1] = vasya
ring_fellowship[2] = petya
ring_fellowship[3] = dima
А в коде объекта кольца делаю цикл с for от 1 до 3 в котором перебираю всех, кто может знать о кольце. Но это более громоздко и ИМХО менее удобно, можно запутаться.

Re: Фич-реквест

Не, я только идею предложил. Это можно сделать и более элегантно. Грубо говоря, ты даешь признак диалогу, в какие группы он входит. На основании этих групп строятся списки групп (списки строятся в момент создания диалога, автоматически) и потом идет "оповещение" групп.

Те это выглядеть может вполне красиво. Только надо сделать свой класс диалогов.

Но то что ты выше написал - это еще отдельный вопрос - наследования.

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

Я пока переписываю док-цию, так что некоторое время фичи не пишу. Но идею с диалогами могу помочь просто сделать (в игре). Там немного совсем.

19 (edited by malcolm 2013-01-11 16:53:49)

Re: Фич-реквест

Ок. Но я пока еще к игре не приступил  roll Я пока RTFM smile Вот во время читки пришла такая мысля. Мне кажется может быть удобно для создания сложных диалогов.
Полноценному наследованию, как в GM, я пока в INSTEAD применения не вижу... но это только пока, хе-хе  wink
Спасибо что выслушал. Когда реально замахнусь на такой вариант организации диалогов - обращусь! wink
Ну или можно попробовать обкатать на игре-пустышке... состоящей из пары комнат и названных выше Васи, Пети и Димы.


Я кстати тот месадж немного отредактировал, пару абзацев добавил... есть у меня привычка дурная - опубликовать пост, а потом его перечитать и начать править ошибки и дописывать.  roll