Topic: Вопросы по программированию игр

Вопросы так вопросы. big_smile
Вопрос первый:
Имеем предмет - фонарик, который можно включить.

torch = obj {
        nam = 'налобный фонарик',
        dsc = 'На тумбочке лежит {налобный фонарик.}',
        tak = 'Полезная штука. Пригодится.',
        inv = function(s)
                inv():add('torch_on');
                inv():del('torch');
                s._torchoff = false;
                return 'Вы нацепили фонарик на голову и включили его.';
        end,
};

torch_on = obj {
        nam = 'включенный налобный фонарик',
        inv = function(s)
                inv():add('torch');
                inv():del('torch_on');
                s._torchoff = true;
                return 'Вы выключили фонарик и убрали его в карман';
        end,
};

Имеем тёмную комнату. Задача: сделать так, чтобы при включенном фонарике у комнаты менялось описание. Я сделал это так:

bathroom = room {
    nam = 'Ванная',
    enter = 'Почему нет света?',
    dsc = function(s)
        if not s._torchoff then
            return 'Здесь темно.';
        else
            return 'Металлическая раковина бликует от света фонарика.';
        end
    end,
    way = { 'koridor' }
};

Итог: не работает!
ЧЯДНТ?

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

Re: Вопросы по программированию игр

Думаю проблема здесь:

 if not s._torchoff then
            return 'Здесь темно.';
        else

s - это всегда тот объект, которому принадлежит обработчик.

s в данном случае это комната.
А _torchoff устанавливается и в  tourch и tourch_on. smile Но не в комнате.

То есть запись вида:

        inv = function(s)
                s._torchoff = false;

-- в данном случае это синоним: torch._torchoff = false;

Варианты:
_tourchoff устанавливать и проверять в объекте me() (напр. me()._tourchoff = false)

Или сделать 1 объект tourch с 2-мя состояниями :

torch = obj {
        nam = function(s)
                   if s._light then
                           return 'налобный фонарик (включен)';
                   end
                   return 'налобный фонарик';                   
        end,
        dsc = 'На тумбочке лежит {налобный фонарик.}',
        tak = 'Полезная штука. Пригодится.',
        inv = function(s)
                s._light = not s._light;
                if s._light then
                         return 'Вы включили фонарик';
                 end
                return 'Выключил.';
        end,
};

И потом уже проверять в описании комнаты как torch._light

  dsc = function(s)
        if not torch._light then
            return 'Здесь темно.';
        else

Ну и,. если игры с освещением, это основа игры -- можно написать свои классы комнат итд. См. игру руины, например.

P.S> Спасибо за интерес к проекту. smile

Re: Вопросы по программированию игр

Спасибо за объяснение, товарищ!
Именно эти s. меня напрягали. Теперь всё встало на свои места.
Что ж, ждите новых вопросов. Они обязательно появятся!  tongue

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

Re: Вопросы по программированию игр

Добро пожаловать в коммюнити, соратник. big_smile

Воообще, c освещением нужно будет еще прятать описание объектов. Это можно сделать, например, переопределив у комнаты look:

...
look = function(s)
    if not torch._light then
        return
    end
    return room_look(s);
end
...

Re: Вопросы по программированию игр

Внезапно спасибо. Я пока этой проблемой не занимался, но к этому всё шло.
Вы весьма предупредительны, Петер. big_smile

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

Re: Вопросы по программированию игр

Новый дилетантский вопрос - второй по счёту. Как сделать, чтобы переменная проверялась вне зависимости от того, где находится игрок?
То есть имеется вот такой кусок кода:

function()
    if me().washed and me().eaten then 
    g1 = obj {nam = 'Выйти из квартиры^'};
    g1.object_type = false
    end
    end,

Куда его вставить, чтобы объект g1 добавился сразу, как только me().washed и me().eaten будут истинны? hmm

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

7 (edited by Odyssey 2010-01-18 00:29:45)

Re: Вопросы по программированию игр

Это можно сделелать с помощью life-методов.

Например, так:

pl.life = function()
  if pl._washed and pl._eaten then 
    objs():add(vway('выход', '{Выйти из квартиры}', 'street'));
    lifeoff('pl');
  end;
end;

lifeon('pl');

Тут нужно обратить внимание на три момента:

1) Я добавил подчёркивание к washed и eaten, чтобы при сохранении они попали в файл сохранений. См. http://instead.pinebrush.com/wiki/ru/do … 0%B8%D0%B8

2) Я добавил объект в текущую сцену с помощью objs():add(vway(...)). Т.е. этот объект не будет ходить за игроком, а останется в той комнате, где впервые сработало условие (washed+eaten). Если это не то, что нужно -- спрашивай дальше wink

3) pl -- это объект-главный игрок, он есть всегда. me() -- то же самое, если игрок один. Если игроков много, me() ссылается на выбранного в данный момент игрока. Я использовал pl, потому что в lifeon/lifeoff нужно передавать строковое имя переменной, а me() -- не переменная, поэтому в эти функции её передать нельзя.

Re: Вопросы по программированию игр

Odyssey wrote:

Я использовал pl, потому что в lifeon/lifeoff нужно передавать строковое имя переменной, а me() -- не переменная, поэтому в эти функции её передать нельзя.

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

9 (edited by 3yMa 2010-01-18 13:52:58)

Re: Вопросы по программированию игр

Odyssey wrote:

Если это не то, что нужно -- спрашивай дальше wink

Это не совсем то, но заменить на "то", думаю, я уже смогу и сам. Всем спасибо за объяснения smile
P.S. Да, с life всё прекрасно работает. Ещё раз благодарю!

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

10 (edited by 3yMa 2010-01-18 15:51:06)

Re: Вопросы по программированию игр

Ещё пара вопросов:
1.

enter = function(s)
    -- end of episode 2
        eside = nil;
        moika = nil;
        eating = nil;
        kitchen = nil;
        stolcorridor = nil;
        entrance = nil;
        floor2 = nil;
        eroom = nil;
        room33 = nil;
        room3x = nil;
        cor3 = nil;
        toilet3 = nil;
        floor3 = nil;
        toilet = nil;
        toiletw = nil;
        room4x = nil;
        room46 = nil;
        hall42 = nil;
        hall41 = nil;
        floor4 = nil;
        floor5 = nil;
        povardlg = nil;
        kitchendlg = nil;
        facectrl = nil;

Что значит этот фрагмент в ep3.lua квантового кота?
2. Можно ли сделать так, чтобы локация имела в списках выходов с разных локаций разные имена?
Т.е. чтобы локация имела имя "коридор", если она показывается в списке выходов из "моей комнаты" и имя "квартира" если она показывается в списке выходов с "10 этажа"?
При этом отображаемое имя всё-таки было бы "коридор".

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

Re: Вопросы по программированию игр

1. Это уничтожение объектов. Практически всегда -- ненужно. Даже в коте это скорее отладка. Так как части в коте независимы друг-от друга.

2. См. vroom. http://instead.pinebrush.com/wiki/ru/do … 1%82%D1%8B
Ну или имя локации сделать функцией, которая выводит по условию то, что нужно.

Re: Вопросы по программированию игр

Возможно как-то проверить, есть ли предмет в инвентаре?

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

Re: Вопросы по программированию игр

3yMa wrote:

Возможно как-то проверить, есть ли предмет в инвентаре?

Можно. smile
http://instead.pinebrush.com/wiki/ru/do … 1%86%D0%B8

Re: Вопросы по программированию игр

Конечно. Точно написано в Справочнике, но навскидку функция: inv().have() вам поможет.

Александр Яковлев, к вашим услугам.

15 (edited by 3yMa 2010-01-19 13:06:02)

Re: Вопросы по программированию игр

Опростоволосился я, невнимательно мануал читал... Позор на мою голову... sad
Тем не менее: реально ли разделить область инвентаря при вертикальной раскладке на два столбца? А в идеале - еще и объединить их сверху, чтобы первый объект в инвентаре был как бы заголовком, под которым два столбика со списком предметов.
Вопрос достаточно безумен. hmm

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

Re: Вопросы по программированию игр

3yMa wrote:

Тем не менее: реально ли разделить область инвентаря при вертикальной раскладке на два столбца?

Думаю, что нереально. Вернее, можно пытаться делать подпорку в виде горизонтального инвентаря и делать переносы строк после каждых 2-х объектов но... smile Это уж черезчур...

17 (edited by 3yMa 2010-01-19 14:34:25)

Re: Вопросы по программированию игр

Почему же, тоже вариант big_smile
Ну ладно, нестрашно, есть и другое решение. Без двух столбцов.

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

18 (edited by era3d 2010-01-20 03:01:42)

Re: Вопросы по программированию игр

Возник вопрос такого характера:

      Есть идея создать элемент фортуны в игре - повезло, не повезло, совсем не повезло, очень повезло, зависящих от фортуны на данный момент присутствующей у игрока. Есть фортуна (удача), сила, жизнь. Нужен генератор чисел в заданном параметре - от 1 до 100. Должна быть зависимость от параметра удачи или силы, + судьба.

До чего додумался и как я это вижу.

Есть фортуна = b

Есть некий блок генератора цифр от 1 до 100 = a

..какая-то-функция + воздействие на объект с зависимостью от  (а) и (b) = % от максимальной суммы (при максимум а=100 + b=10)

if a <5 then
return ... случилось то то (полный провал и минус статус)

end

if a >5<49 then

return ... случилось то то (провал)

end

if a >50<95 then

return ... случилось то то (получилось)

end

if a >95 then

return ... случилось то то (очень круто все получилось + бонус какой нить)

end

Тогда получается есть 5% шанс крита как положительного, так и отрицательного характера, и остальные 90% действие получилось\не получилось, по 45% каждый.. Или я ошибаюсь?..

Не поможете практическими советами?.. Сам я не прогер, но желание создать игру есть. А вот как реализовать данную задумку пока нет знаний, надеюсь с помощью осилю.

Практически получается примерно следующие:

Открываем дверь:

крит в минус: 'Пока ковырялся в замке, рука соскользнула и сломал палец'

не получилось: 'Отмычка сломалась, заклинив замок.. Надо искать другой путь.'

получилось: 'Через некоторое время послышался щелчок и дверь приоткрылась.'

крит в плюс: 'Вы вставили в замок отмычку, тут же щелкнул замок с другой стороны звякнул упавший ключ.'


Примерно так.

Я творец! Хочу - творю, а хочу - вытворяю!

Re: Вопросы по программированию игр

era3d wrote:

..какая-то-функция + воздействие на объект с зависимостью от  (а) и (b) = % от максимальной суммы (при максимум а=100 + b=10)

Эту строчку совсем не понял. neutral

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

Re: Вопросы по программированию игр

Это делается ЗАПРОСТО и именно так, как вы описали. Закавыка не в техническом плане, а в алгоритме. Между прочим, само введение параметров для игрока - это элементы RPG, поэтому объясню на примере всем известной Fallout.
У вашего персонажа есть параметры. Скажем, Удача. Удача равна - допустим, 5 (среднее значение)
Есть навык. Скажем, азартных игр. Его начальное значение равно 0%+(5*УД), среднее значение 25%. Для Холодного Оружия начальное значение 20%+(2*(ЛВ+СЛ)), но продолжим пока с азартными играми.
В ходе игры значение навыков постепенно повышается - от личных черт, перков или просто с получением уровня. Количество очков на каждом уровне определяется параметром Интеллекта, я пропущу этот пункт - пусть у нас герой 1го уровня.
Итак, герой подходит к игорному столу. Предположим, что никто не мухлюет, всё по-честному. Игрок бросает стогранник (rand() от 1 до 100). Если он выбрасывает значение МЕНЬШЕЕ своего навыка Игры, то он выигрывает. НО: если он выбрасывает слишком большое значение (от 100-Удача=95 до 100), то это считается за критический успех. Джекпот вроде как. Если же он выбрасывает слишком маленькое значение (от 1 до 5, здесь Удача уже не влияет, иначе удачливые и несчастливые будут одними и теми же), то это - критический провал. Например, его заподозрили в шулерстве.
Пойдём дальше. Если игра осложняется (противник мухлюет, в темноте не видно карт, персонажа отвлекают etc.), идут штрафы. То есть, надо выкинуть уже не от 0 до 25, а от 0 до 20. Ну и наоборот, если персонажу подыгрывают, то играть легче и идут бонусы. Это всё складывается и уже вычисляется.
Раз уж я начал про ролевую систему, расскажу про бой. Здесь опять же берём навык - на сей раз, Холодного Оружия. Пусть он равен 40%. Персонаж бьёт противника. Шанс попасть равен навыку минус штраф за освещённость (пасмурная погода уже даёт -15%) минус коэффициент брони противника и там ещё были какие-то параметры, которые я не помню (хотя вроде всё важное указал). Если удар прицельный, там идут дополнительные штрафы; если удар из положения сидя или лёжа, идут бонусы. Броня даёт штраф на попадание для противника и поглощает часть повреждений, если всё-таки у врага удар удался.
Хороший совет: если вы вводите ролевой элемент, достаньте правила какой-нибудь настольной ролевой системы. Fallout P&P, GURPS, Dungeons & Dragons, Fuzion и другие. В точности их копировать не получится (более того, под Open Game License выпущены из этих только d20 System и Fuzion), но общие идеи почерпнёте. И не надо будет придумывать что-то, городить, править баланс...
Ещё один вопрос - зачем? Не знаю. Я думал над введением этого, но пока что в своих квестах применения не нашёл. В конце концов, в квесте всё намного проще и систематически качаться до 2го, 3го уровня навыка не получится.

Александр Яковлев, к вашим услугам.

21 (edited by era3d 2010-01-21 04:51:37)

Re: Вопросы по программированию игр

3yMa wrote:
era3d wrote:

..какая-то-функция + воздействие на объект с зависимостью от  (а) и (b) = % от максимальной суммы (при максимум а=100 + b=10)

Эту строчку совсем не понял. neutral


Здесь я пытался показать, что у нас есть некая внешняя функция, которая рассчитывает удачность или не удачность действия игрока с зависимостью от характеристик оного же (а = rend ( от 1 до 100) и b = удача игрока).

И в зависимости от результата, собственно % от максимальной суммы, где наша МАХ сумма = (a=100 + b=10) идет отклик игры (поломал, не получилось, получилось, архиполучилось)

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

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

Oreolek wrote:

ролевой системы. Fallout P&P, GURPS, Dungeons & Dragons, Fuzion и другие.

     Вы не подскажите где можно найти данные вещи? Я, к большому сожалению, очень ограничен в трафике.

Я творец! Хочу - творю, а хочу - вытворяю!

Re: Вопросы по программированию игр

Спасибо Oreolek за столь широкий ответ. Многое почерпнул. Согласен, история должна оставаться историей и элементы РПГ немного неуместны. Если только самую малость, дабы игра внесла разнообразие, та же фортуна.

Я творец! Хочу - творю, а хочу - вытворяю!

Re: Вопросы по программированию игр

Вы не подскажите где можно найти данные вещи?

На русских фан-сайтах. Если позволяет интернет и образование, можете читать в оригинале - материалы на английском давно лежат по всяким заграничным торрентам. На русском языке материалов меньше (оно понятно), но искать здесь:
http://dungeons.ru - D&D
http://utkgurps.narod.ru/ - GURPS 3 (4я редакция на русский пока не переведена ВООБЩЕ)
Мой обзор перспективных систем - здесь. Там же есть прямые ссылки на Fuzion и так далее.

Насчёт фортуны. Я тоже много думал над введением случайности в сюжет - но решил отказаться.В крайнем случае, это не должно сильно влиять на сюжет, иначе какое впечатление вы почерпнёте от игры, где шанс выиграть 50% и он не зависит от ваших действий? В любом случае, квест - это аналог словесной игры, поэтому боевые характеристики здесь неуместны, а сложные формулы ненужны. Ролевые элементы должны управлять деталями. Вы можете сделать параметр Внимательности и определять, насколько полны будут описания комнат. Параметр Удачи будет определять..чёрт знает,что определять, в интеллектуальной игре удаче места нету :-) ну и так далее.

Александр Яковлев, к вашим услугам.

24 (edited by 3yMa 2010-01-22 12:03:30)

Re: Вопросы по программированию игр

И снова я с дилетантским вопросом. Почему-то вылезает ошибка
'main.lua:519:'=' expected near '==".
Код таков:

trash = obj {
    nam = 'мусорка',
    inv = 'Я держу в руках гладкую блестящую мусорку.',
    use = function(s,w)
[b]        w == 'tomart' then[/b]
            inv():del('trash')
            tomart._broken = true
            return 'Размахнувшись, тараню мусоркой стекло двери.'
        end
    end,
};

В чём может быть проблема? neutral
Перепроверил всё, что можно.
P.S. Код частично скопипастен из "Квантового Кота", но об этом... Тсссс!

Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

Re: Вопросы по программированию игр

3yMa wrote:

        w == 'tomart' then

Так if потерялся. smile