RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2423866 views

Вполне себе #2722 28.12.2024 20:04 (1 year ago)

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 ---
Aleks Versus Moderator 29.12.2024 11:59 (1 year ago)

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 - это один и тот же массив.

Вполне себе #2722 31.12.2024 19:07 (1 year ago)

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 и проверь.

Log in or Register to post comments.