Как сделать?
…
Вета,
Это на html делается? Очень интересный подход.
У меня вопрос по части дизайна игры. Присутствует инвентарь описанный в моём предыдущем посте. Как лучше реализовать использование предметов? Рассматриваю пока всего три варианта:
1) Через проверку на наличие предмета просто добавлять действие к основным.
2) Делать проверку на предмет в самих основных действиях.
3) Реализовывать меню для предметов, чтобы их можно было использовать (и соответственно потратить) в любой локации, но в нужных местах сделать проверку на их использование.
Предметов не то чтобы очень много (как минимум пока), но и малым я не ограничусь, поэтому вариант надо выбрать с учётом большого разнообразия итемов. Лично я склоняюсь к третьему варианту, но хочется узнать мнение общественности.
Вариант 1 - самый рабочий. Но и второй, и третий тоже используются, в зависимости от ситуации и вкуса автора.
Для первого варианта, чтобы в глаза сильно не бросалось появление нового действия, можно сделать так. Будет какое-то промежуточное всегда доступное действие X на локации, выполнив которое добавляется действие Y для предмета.
Пример:
Кухня. На плите стоит кастрюля. Огонь на плите включён.
> Выйти из кухни
> Заглянуть в кастрюлю (X)
–> Заглянуть в кастрюлю
В кастрюле кипит вода. Вы вспоминаете, что не ели с утра, и в желудке раздаётся урчание.
> Выйти из кухни
<если есть “мясо”>:
> Сварить мясо (Y)
А вообще приёмов очень много, и не стоит себя в этом ограничивать, выбирая один лишь способ вздаимодействия с предметами. Главное, чтобы всё вместе хорошо сочеталось. Игр у нас уже много, можно выбирать из них наиболее понравившиеся приёмы и использовать. Изобретать что-то своё в таких базовых вещах вряд ли имеет смысл.
Вета:
В первом столбце ВЕЩИ1, во втором ВЕЩИ2, которые появляются в процессе игры. Как сделать понятный код, чтобы они появлялись и занимали ячейки в зависимости от приобретения персонажем и к тому же были кликабельными (то есть в виде ссылки с выпадающим меню “ПРИМЕНИТЬ”).
Я что-то никак не могу построить логику…
Ну для того, чтобы были кликабельны, естесственно придётся делать гипер-ссылки. А вот со столбцами интереснее. Если ты знаешь количество предметов во одном из столбцов, не составит труда добавлять в таблицу строки. Скажем циклом. Если предметы хранятся в массивах, например, $objects1 и $objects2
$table='<table width=100%>'
u=max(arrsize('$objects1'),arrsize('$objects2'))
i=0
:for
if u>0:
$table+='<tr><td width=50%>'
if $objects1[i]!'':
$table+='<a href="exec:,kf-блабла">'+$objects1[i]+'</a>'
else
$table+=' '
end
$table+='</td><td width=50%>'
if $objects2[i]!'':
$table+='<a href="exec:,kf-блабла">'+$objects2[i]+'</a>'
else
$table+=' '
end
$table+='</td></tr>'
u-=1
i+=1
jump 'for'
end
$table+='</table>'
*p $table
Aleks Versus,
хороший код. Ещё можно в левом столбце сделать выравнивание по правому краю, а в правом - по левому. Ну и *PL заменить на *P, чтобы потом не натыкаться не непонятно откуда взявшиеся “пустые строки”.
Nex,
Чё-то я только с выводом напортачил.:))) Последние элементы массивов будут выводиться в самом верху, и если один массив окажется больше другого, вверху таблицы окажутся пустые ячейки.
Aleks Versus,
точно :)
Ну, исправляй.
Поправил.
Набросал в институте апгрейд кода удаления предметов из инвентаря.
Проверить в данный момент не могу. интересует будет ли вложенный цикл(тот который j) смещать все предметы массива находящиеся по списку после удалённого? Суть в том чтобы избежать дыр в массиве. Максимальное кол-во предметов 50, через args[0] передаётся группа предмета (оружие, источник света, медикаменты…), а через args[1] код предмета в группе. В $inv хранится название локации-обработчика открытого меню в инвентаре, чтобы обновить список.
:оружие
:n
if i<50:
if оружие[i] = args[1]:
оружие[i] = 0
j=i
:n2
if j<50:
оружие[j]=оружие[j+1]
j=j+1
jump 'n2'
end
i=i+1
jump 'n'
end
else
gosub '<<$inv>>'
end
Bumbr:
интересует будет ли вложенный цикл(тот который j) смещать все предметы массива находящиеся по списку после удалённого?
Эммм… Что-то не пойму, как в принципе устроено хранение предметов в инвентаре.
По коду: Если ты знаешь номер элемента, который удаляешь, проще сделать просто killvar ‘оружие’,i. Хотя мне кажется, я всё-таки чего-то недопонимаю ввиду отсутствия остальной части. И потом, если это код удаления предмета, каким образом количество предметов может превысить 50? Количество лучше проверять при добавлении предмета.
Да, лучше делать KILLVAR - он удаляет элементы по заданному индексу, сдвигая все оставшиеся, чтобы не было “дыр”.
А вообще код неправильный, внешний цикл выполнится максимум два раза, да и то если первый элемент совпадёт с нужным. И почему GOSUB ‘<<$inv>>’, а не просто GOSUB $inv ? И где обнуление счётчика? Без обнуления эту процедуру нельзя будет вызвать более одного раза.
В том той дело что номер элемента в массиве неизвестен. Переменная i обнуляется в начале локации после чего идет переход к метке в зависимости от переданного args[0] (типа предмета). Я правильно понял, что вложенный цикл можно просто заменить на killvar ‘оружие’,i ?
Кстати в справке не написано что killvar сдвигает все элементы массива, убирая дыры. Я бы тогда и не заморачивался.
Основной цикл точно рабочий. Я бы привёл код всей локации, но не могу убрать его в спойлер.
Предметы добавляются добавлением кода предмета в массив. Проверки на кол-во предметов нет, да и не нужна она наверно. Просто пока что я решил ограничить цикл в 50 повторений.
Bumbr:
Я правильно понял, что вложенный цикл можно просто заменить на killvar ‘оружие’,i ?
Да.
Bumbr:
Кстати в справке не написано что killvar сдвигает все элементы массива, убирая дыры. Я бы тогда и не заморачивался.
Да, справка нуждается в доработке.
Bumbr:
Основной цикл точно рабочий.
Точно нет. Приглядись повнимательнее.
Переписал код с учётом killvar, чисто внешне работает так же как и предыдущий, но гораздо менее громоздкий. В этот раз привожу код от начала локации. Для остальных групп предметов код идентичен, поэтому его не привожу.
i=0
if args[0]=1: jump 'оружие'
if args[0]=2: jump 'помощь'
if args[0]=3: jump 'свет'
if args[0]=4: jump 'разное'
:оружие
:n
if i<50:
if оружие[i] = args[1]: killvar 'оружие',i
i=i+1
jump 'n'
end
else
gosub '<<$inv>>'
end
Bumbr,
а теперь у тебя лишний “end”.
См. Грабли, второе сообщение в теме.
Как пользоваться массивом, если его название хранится в переменной?