Как сделать?
…
Lucifer,
ХЗ… Я свой писал. Мне стандартный вообще не зашел. С новым КуСП (5.9.1) это вообще просто. Зато функционал любой. И степень “вложенности”
Например так (для снаряжения):
Создаем некий “общий Предмет”
$Предмет['Название']=''
$Предмет['Картинка']=''
Предмет['Вид']=0 &!(1-кинжал, 2-меч, 3-топор, 4-копье, 5-молот, 6-щит, 7-шлем, 8-наруч, 9-кираса, 10.11...N)
Предмет['Слот']=0 &!(1-прав.рука, 2-лев.рука, 3-прав.плечо, 4-лев.плечо, 5-голова, 6-ноги, 7-грудь, 8.9...N)
Предмет['Владелец']=0 &!(0-в свободном доступе, 1-у игрока в инвентаре, 2-надето, 3-в хранилище, 4-у торговца, 5.6...106...N)
Предмет['Количество']=0 &!(Не всем нужно, но оставил для универсальности)
Предмет['Свойство 1']=0 &!(например Сила удара или Степень защиты)
Предмет['Свойство 2']=0
...
Предмет['Свойство К']=0
Это общий пресет без какой-либо привязки
Затем формируем предмет. Весь инвентарь формируются по простому принципу: НазваниеПредмета_Номер (Снаряжение_0, Снаряжение_1, Снаряжение_2, Зелье_1, Зелье_14… и пр. ). Можно для каждого типа создать свой пересет - кому как нравится. У меня отдельные. Для всяких индивидуальных предметов - свой, для тех, что по счету - свои.
Сначала определяем первый пустой, я вынес в функцию
# GetFreeID
! Определение первого "свободного" номера в снаряжении (и пр.)
! $Args[0] - Преффикс ('Снаряжение', 'Непись', 'Свиток' и прочее)
Result=0
Local i=0
Local j=Off
Local $SearchStr=''
Loop While j=Off:
$SearchStr=$Args[0]+'_'+Str(i)
If ArrType($SearchStr)='':
j=On
Else
I+=1
End
End
Result=i
--- GetFreeID ---
Дальше все просто:
NewID=@GetFreeID('Снаряжение')
Функция среди всех массивов “Снаряжение_k” находит первый “неопределенный” и возвращает его номер
Формируем предмет простым копированием стартового пресета
$NewItem='Снаряжение_'+NewID
CopyArr $NewItem, 'Предмет'
И устанавливаем нужные свойства
SetVar($NewItem,'Топор','Название')
SetVar($NewItem,'./pic/weapon/axes/axe_1.png','Картинка')
...
SetVar($NewItem,7,'Свойство 1')
...
Лично я все вношу в отдельные функции, так удобнее. Внутри можно описать дополнительный обработчик
Вот как получается у меня - Стартовое получение Меча и Случайной амуниции.
#Дайте_Меч
Local NewID=@GetFreeID('Снаряжение')
If @Set_Ammo('Снаряжение_<<NewID>>',МЕЧ,ОБЫЧН,-1,0,0,-1)=On:
$АммоИгрока[]='Снаряжение_<<NewID>>' & !Сразу заполняю массив снаряжения у игрока (это можно вставить в функцию SetSlot, но пока вынесено)
@SetSlot('Снаряжение_<<NewID>>', ИГР)
End
NewID=@GetFreeID($DataName)
If @Set_Ammo('Снаряжение_<<NewID>>',RAND(0,7),ОБЫЧН,-1,0,0,-1)=On:
$АммоИгрока[]='Снаряжение_<<NewID>>'
@SetSlot('Снаряжение_<<NewID>>', ИГР)
End
--- Дайте_Меч ---
Функция Set_Ammo возвращает 1 в случае если все прошло удачно или 0 - при любой неудаче вовремя формирования Снаряжения. Все нужные данные я передаю как параметры функции.
И в конце создаю деструктор Снаряжения - например игрок продал, или потерял, или использовал все под чистую. Чтобы не хранить “пустые” переменные, память не резиновая.
#KillAmmo
!Очистка массива Снаряжения
If $Args[0]<>'':
Dynamic('Killvar ''<<$Args[0]>>''
Killvar ''$<<$Args[0]>>''')
Else
msg('Имя массива снаряжения не может быть пустым.<br> Проверьте правильность вызыва функции "KillAmmo"')
End
--- KillAmmo ---
Lucifer,
начни с основ, что называется:
https://aleksversus.github.io/howdo_faq/docs/howdo/contents/items/add_item
В этом справочнике много ответов на самые часто задаваемые вопросы, поэтому есть вероятность, что один из этих вопросов даст подсказку, как сделать инвентарь конкретно с твоим уровнем знаний. Особенно рекомендую посмотреть вопросы про многоуровневый рюкзак, считаемые предметы и предметы не в окне предметов.
Вполне себе,
не разбирался в коде, но вот это:
Dynamic('Killvar ''<<$Args[0]>>''
Killvar ''$<<$Args[0]>>''')
по идее эквивалентно
killvar $args[0]
killvar '$<<$args[0]>>'
Т.е. можно и без dynamic. Правда я не понимаю зачем вызывать второй killvar - это один и тот же массив.
Byte,
Я это еще не переписывал. Каюсь. Я просто скопировал работающий код в пример.
Но на тот момент (когда создавался код) я еще плохо понимал логику КуСПа, как-то, что-то не так делал и у меня не работало простоКillVar $Переменная. Точнее с конкретными массивами. У меня данные сохранялись. Я обязательно этот момент перепишу.
А двойной вызов на всякий случай (я опять не помню почему), наверное чисто для страховки… Логика с ООП - в деструкторе обязательно надо очистить память внутри объекта, а затем удалить сам объект, иначе мусор накапливается.
Всех С Новым Годом!!!! :B:
Алекс с этим я разобрался) и работает уже с этим довольно не плохо, хочу уже сделать что более красивое но все же по проще
Я начал делать инвентарь но зашел в тупик уже что тока не пробовал но показатели не увеличивается
Я скину проще кодом
Это при выборе персонажа. Чтобы отображалось в самом начале
$object_lev_1[0]=‘Персонаж’
$object_lev_1[1]=‘Статы’
$object_lev_1[2]=‘Кошелёк’
$object_lev_1[3]=‘Связка ключей’
$object_lev_1[4]=‘Рюкзак’
$onobjsel = ‘выделение_предметов’
GOSUB ‘выделение_предметов’
выделение_предметов
Там код прописан
if $selobj=‘’ or $selobj=‘Назад’:
killobj
i=0 &
:уровень1
if i<arrsize(’$object_lev_1’):
addobj $object_lev_1[i]i = i +1
jump ‘уровень1’
end
elseif $selobj=‘Рюкзак’:
killobj
addobj ‘Назад’
addobj ‘Назад
i=0 &
:уровень2
if i<arrsize(’$object_lev_2’):
addobj $object_lev_2[i]i = i +1
jump ‘уровень2’
end
end
if $selobj=‘Статы’:
killobj
Здоровье=100
addobj ‘Здоровье <<здоровье>>’,’’,1
Скрытность=0
addobj ‘Скрытность <<Скрытность>>’,’’,1
End
addobj ‘Назад’
end
unsel
После на другой локе пытаюсь прокачать скрытность
money=money-100
Act ‘Держи’:
if $selobj=‘Статы’:
Скрытность=Скрытность+1
obj ‘Скрытность <<Скрытность>>’,’’,1
End
Но по и тогу остается так же ноль, можете обьяснить почему
Я начал делать инвентарь но зашел в тупик уже что тока не пробовал но показатели не увеличивается
Я скину проще кодом
Это при выборе персонажа. Чтобы отображалось в самом начале
$object_lev_1[0]=‘Персонаж’
$object_lev_1[1]=‘Статы’
$object_lev_1[2]=‘Кошелёк’
$object_lev_1[3]=‘Связка ключей’
$object_lev_1[4]=‘Рюкзак’
$onobjsel = ‘выделение_предметов’
GOSUB ‘выделение_предметов’
выделение_предметов
Там код прописан
if $selobj=‘’ or $selobj=‘Назад’:
killobj
i=0 &
:уровень1
if i<arrsize(’$object_lev_1’):
addobj $object_lev_1[i]i = i +1
jump ‘уровень1’
end
elseif $selobj=‘Рюкзак’:
killobj
addobj ‘Назад’
addobj ‘Назад
i=0 &
:уровень2
if i<arrsize(’$object_lev_2’):
addobj $object_lev_2[i]i = i +1
jump ‘уровень2’
end
end
if $selobj=‘Статы’:
killobj
Здоровье=100
addobj ‘Здоровье <<здоровье>>’,’’,1
Скрытность=0
addobj ‘Скрытность <<Скрытность>>’,’’,1
End
addobj ‘Назад’
end
unsel
После на другой локе пытаюсь прокачать скрытность
money=money-100
Act ‘Держи’:
if $selobj=‘Статы’:
Скрытность=Скрытность+1
obj ‘Скрытность <<Скрытность>>’,’’,1
End
Но по и тогу остается так же ноль, можете обьяснить почему
Lucifer,
У тебя кавычка потерялась.
addobj 'Назад'
addobj 'Назад
i=0 &
Помимо кавычки:
obj ‘Скрытность <<Скрытность>>’,’’,1
Здесь, наверняка, подразумевался addobj.
После исправления этих ошибок появится что-то еще :)
Похоже, что проще было бы вести отдельный массив с предметами и отображать его (с помощью killobj / addobj) каждый раз при обновлении статуса.
Попробую спасибо вам большое :)
Всем привет. В игре использую юлианский календарь, взятый с форума.
На локации происходит череда действий, которые меняют показатели сытости, усталости и т.п. и времени.
act “Завтракать”:
time+=15 & Настроение+=5 & Здоровье+=5 & Усталость+=5
gs ‘stat’
При этом все показатели меняются как надо - при окончании действия. И только время обновляется при выходе из локации. Что с временем не так?
AndreWho,Во время выполнения акта должно происходить обращение к локации, которая время пересчитывает.
Так gs ‘stat’ - это и есть та локация, разве нет?
Я в программировании ноль без палочки, но если мыслить просто логически. По окончании действия идет обращение gs ‘stat’ и все показатели пересчитываются, кроме времени. Время пересчитывается только при выходе из локации. Причем пересчитывается правильно, в зависимости от количества действий, совершенных внутри локации.
AndreWho,Скорее всего время у тебя считается в onnewloc. Добавь в акт gt curloc и проверь.