Как сделать?
…
Вполне себе,
Ты можешь узнать индекс по значению или значение по индексу для числовых индексов, но не суть. Если ты не знаешь ни индекса ни значения, то только перебором из какого либо словаря.
Это я узнаю, но только число.. Увы…
Вполне себе,
И как же?
Надо ждать Алекса. В дискорде поднимался такой вопрос, но я не помню, чтоб оно закончилось как-то продуктивно.
Сейчас строковые индексы получить нельзя. Возможно, когда-нибудь это появится, а сейчас можно сделать специальную локацию, которая будет заполнять произвольные массивы по строковым индексам и запоминать сами индексы в отдельном массиве.
Либо вести учет этих индексов отдельно где-то еще.
Вообще говоря, строковые индексы хранятся отдельно от самих элементов, причем не в том порядке, в котором хранятся элементы массива. Сами индексы при этом преобразуются в другой формат и оригинальные строки напрямую недоступны.
Byte,
Спасибо.
Всем привет, Хотел поинтересоваться как сделать проще всего инвентарь?Посмотрел много вариантов скачал много игр на QSP но что более прощее для начинающего?
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
Но по и тогу остается так же ноль, можете обьяснить почему