BeaRLibItems - удобный менеджмент предметов в рогалике

Форум библиотеки BeaRLib

Модератор: Apromix

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Apromix » 16 фев 2017, 14:25

Cfyz писал(а):
16 фев 2017, 11:53
Использование из других языков -- это целая проблема. Если вы хотите работать хотя бы с одним языком кроме исходного, забудьте о возврате структур из функций. Даже передача структур в функцию это боль, но ее хотя бы можно заставить работать. Возврат не будет работать никогда, только скаляры или указатели -- но возврат объектов по указателю это тоже боль.
Об этом поподробнее :)

То есть function get_item: titem не вернет структуру titem? Вернет ее только, если procedure get_item(var aitem: titem)? Я правильно понял?

Для понимания проблемы паскалевский код:

Код: Выделить всё

type
  TItem = record
    MapID: Integer;
    ItemID: Integer;
    X, Y: Integer;
  end;

type
  TItems = array of TItem;
Перевожу в сишный плюс плюс:

Код: Выделить всё

struct item
{
	int map;
	int id;
	int x;
	int y;
};
И сталкиваюсь с первой проблемой: как объявить динамический массив Items?

Тоже не понятно, как будет в других языках с типом Boolean. Может просто возвращать 1 если true и 0 если false?

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Cfyz » 16 фев 2017, 16:53

Apromix писал(а):То есть function get_item: titem не вернет структуру titem? Вернет ее только, если procedure get_item(var aitem: titem)? Я правильно понял?
Не, все существенно хуже. Основная соль проблемы в том, что все языки имеют разную реализацию даже таких базовых вещей как массивы и разница может быть в пределах от "чуть-чуть" до "вообще ничего похожего". Поэтому просто взять и передать в другой язык объект сложнее четырех байт -- уже задача. Иногда есть некоторая поддержка со стороны FFI, например C# конвертирует некоторые виды данных что позволяет кидаться массивами, строками и делегатами. А бывает что черта с два и даже строчку передать это надо ручками выделить блок памяти, привести к кодировке и не забыть прибрать за собой после вызова.

У меня в терминале каждая функция, которая принимает или возвращает строку существует в трех экземплярах: для 8/16/32-битных строк, а библиотека уже внутри конвертирует (из любой переданной и наоборот во все три). Потому что в разных языках строчки к разным приводятся и конвертировать их на вызывающей стороне сильно усложнило бы врапперы.

Так что я очень сомневаюсь, что получится использовать в API динамические массивы Pascal. Как они устроены, кто там памятью владеет -- все это остальные языки не знают. Даже к простым массивам придется еще прикладывать их размер, потому что по ту сторону они будут выглядеть как тупой кусок данных.

Возврат значений по указателю вскрывает отдельный пласт проблем. Допустим, мы как-то разобрались как должны быть расположены битики и байтики в структуре и обе стороны в состоянии прочитать и даже записать значения в объект. Делаем get_item(var foo) и в функцию приходит значение указателя -- и что мы теперь с ним должны делать? Если просто записать в переданную область памяти, то вызывающая сторона должна заранее эту область выделить, а значит знать какого размера (количество элементов), что не в каждый API уложится. Если наоборот это вызываемая сторона должна выделить память, то и освобождать ее должна эта же сторона иначе Access Violation во все поля. А значит нужен отдельный метод для деаллокации. Работать с этим становится чрезвычайно неудобно и враппер начинает обрастать обертками в меру особенностей языка. Жизнь -- боль.

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

На фоне этого как там передается Boolean уже сущие мелочи. Integer, вот как он передается =). При всем сопуствующем оверхеде три лишних байта всем до лампочки, главное что точно будет работать.
Пытается раскуклиться

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение kipar » 16 фев 2017, 16:58

Насчет UTF-8 - а какая разница в какой кодировке строка если она ее только хранит и возвращает, или даже парсит на предмет "=" и """". Пока не надо выводить на экран или разбивать русские слова по буквам работа с UTF-8 не отличается от ascii.

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Apromix » 16 фев 2017, 17:12

kipar писал(а):
16 фев 2017, 16:58
Насчет UTF-8 - а какая разница в какой кодировке строка если она ее только хранит и возвращает, или даже парсит на предмет "=" и """". Пока не надо выводить на экран или разбивать русские слова по буквам работа с UTF-8 не отличается от ascii.
Вот и я так думаю. Но на всякий случай скомпилил либу в лазаре. Тоже работает. Мне же удобней дельфи 7 пользоваться, так что пока будет так.
Cfyz писал(а):
16 фев 2017, 16:53
Жизнь -- боль. (и все, что было описано повыше :D )
Спасибо за исчерпывающий ответ. Значит пока либа будет только для паскаля. Пока не разберусь, как сделать врапперы.
Cfyz писал(а):
16 фев 2017, 16:53
На фоне этого как там передается Boolean уже сущие мелочи. Integer, вот как он передается =). При всем сопуствующем оверхеде три лишних байта всем до лампочки, главное что точно будет работать.
Знаю, что в сях bool это число от 0 до 255. То есть не использовать Boolean из паскаля, потом могут быть сложности в других языках?

Разумно будет все названия методов писать в нижнем регистре?

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Cfyz » 16 фев 2017, 17:34

kipar писал(а):Насчет UTF-8 - а какая разница в какой кодировке строка если она ее только хранит и возвращает, или даже парсит на предмет "=" и """". Пока не надо выводить на экран или разбивать русские слова по буквам работа с UTF-8 не отличается от ascii.
Это верно, UTF-8 этим очень удобен. Но я имел в виду ситуацию, когда у тебя на руках строка в UTF-16, а библиотека внезапно принимает UTF-8 (или наоборот). Ну а если вы более конкретно про терминал, то там мало того что выводить надо, так еще и этот char* может оказаться как UTF-8, так и Windows-1251 =/.
Apromix писал(а):Значит пока либа будет только для паскаля. Пока не разберусь, как сделать врапперы.
Я вот с самого начала решил делать терминал кросс-языковым и намерен жрать этот кактус до конца. Но подозреваю, что если не задуматься хотя бы на этим моментом, то потом может оказаться очень сложно, потому что архитектура уже не располагает =_=.
Apromix писал(а):Знаю, что в сях bool это число от 0 до 255. То есть не использовать Boolean из паскаля, потом могут быть сложности в других языках?
Тут просто сложно гарантировать, что они где-нибудь да не разойдутся в размере. Куда проще передавать Integer и не париться. Никто не заставляет, чтобы хедер для исходного языка один-в-один совпадал с интерфейсом библиотеки. Можно сделать экспортируемую функцию FooImpl(): Integer и рядом же функцию-обертку Foo(): Boolean.
Apromix писал(а):Разумно будет все названия методов писать в нижнем регистре?
Ой не факт. Это популярная нотация, но вот я уже попытался как-то сделать функции map_width() и map_height() и это жуткое бесиво на самом деле когда ты потом не можешь назвать так же переменные.
Пытается раскуклиться

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Apromix » 16 фев 2017, 18:18

Cfyz писал(а):
16 фев 2017, 17:34
Можно сделать экспортируемую функцию FooImpl(): Integer и рядом же функцию-обертку Foo(): Boolean.
О, я примерно такое видел в биндинге терминала для C# :D

По оформлению сорцов вопрос. У тебя в терминале в начале каждого сорцового файла лицензия MIT. Можно один в один скопировать для всех берлиб?

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение altmax » 16 фев 2017, 18:35

Apromix писал(а):
16 фев 2017, 09:42
  • Инвентарь для NPC? На ум пока приходят только NPC-торговцы, но мало ли для чего может сгодиться.
Ну у мобов как бы есть экипировка - броня, одежда, оружия. Есть боеприпасы - стрелы например те же самые. Плюс может быть бижутерия. И всё это дело после смерти моба может остаться на клетке карты. А может и не остаться. Плюс некоторые могут собирать предметы с карты и таскать их с собой.

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Apromix » 16 фев 2017, 20:45

altmax писал(а):
16 фев 2017, 18:35
Apromix писал(а):
16 фев 2017, 09:42
  • Инвентарь для NPC? На ум пока приходят только NPC-торговцы, но мало ли для чего может сгодиться.
Ну у мобов как бы есть экипировка - броня, одежда, оружия. Есть боеприпасы - стрелы например те же самые. Плюс может быть бижутерия. И всё это дело после смерти моба может остаться на клетке карты. А может и не остаться. Плюс некоторые могут собирать предметы с карты и таскать их с собой.
Да, можно будет и так :)

Версия 0.2 доступна для тестирования. Обновлен README в папке с демопрограммой. Из запланированного на версию 0.2 не реализовал дроп предметов на карту.

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение kipar » 17 фев 2017, 08:48

Для бинарных релизов на гитхабе кстати специальный раздел releases есть, там качать намного удобнее и не будут репозиторий захламлять.

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение altmax » 18 фев 2017, 11:35

Ладно, с инвентарем у мобов разобрались. Теперь разберемся с инвентарем у вещей ))))
В некоторые вещи можно встраивать предметы, особенно хорошо эта система развита в TimeZero. Есть винтовка, ну пусть будет Винторез. В неё можно вставить патроны, причём патроны бывают обычные, М1, М2, М3 и PVE, потом с параличом, ослеплением и чем то еще. Различаются по эффекту, силе воздействия. Потом на винтовку можно приладить оптический прицел, компенсатор, лазерный целеуказатель, что повышает кучность и урон. Все эти вещи тоже разные по той же градации бывают. Ну и саму винтовку можно модифицировать, повысив урон. Плюс у всех этих вещей считается отдельный ресурс, и когда винтовка таки развалится от износа у вас в руках, они просто вываливаются в инвентарь. И, если не ошибаюсь, еще и подствольный гранатомет можно прилепить на винтовку.
Масса при этом учитывается общая у винтовки - при апгрейдах она растет.
Пока даже не представляю, как это всё реализовать можно. И нужно ли. Но идеи интересные.

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Apromix » 18 фев 2017, 16:12

Можно :) Думаю для износа будет введено в запись TItem еще одно целочисленное поле Durability. Остальные апгрейды, суффиксы и префиксы, материалы и тд можно будет записать в виде строки в особенное поле Options. Как по другому сделать (без строки) я пока не придумал. Один недостаток такого подхода - постоянно разбивать и собирать строку. Но если сделать удобное API для этого дела, то не так страшно будет :D

Аватара пользователя
Lukita
Сообщения: 12
Зарегистрирован: 05 фев 2012, 13:45
Откуда: Новосибирск
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Lukita » 18 фев 2017, 17:30

Можно попробовать паттерн Декоратор.
Изображение  Изображение  Изображение
twitch  youtube

Аватара пользователя
karagy
Сообщения: 1271
Зарегистрирован: 10 янв 2007, 14:13

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение karagy » 18 фев 2017, 18:17

Хороший пример с винтовкой.
Может отказаться от инвентаря и ввести линки (связь, крепление) между предметами?
Тогда обычный мешок будет иметь линк типа "охват" со своим содержимым. Атрибуты линков на предмет жесткости крепления, ориентации и т.п. можно напридумывать.

И игра превратится в 'Links', где идёшь по полю, видишь кузнечика (linked to bush, type 'sit: strong cohesion'). А потом присмотришься третьим глазом - а он (кузнечик) (linked to alien wizard's eye, type 'mental: undirected, half-duplex').

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение altmax » 19 фев 2017, 16:29

karagy писал(а):
18 фев 2017, 18:17
Хороший пример с винтовкой.
Может отказаться от инвентаря и ввести линки (связь, крепление) между предметами?
Тогда обычный мешок будет иметь линк типа "охват" со своим содержимым. Атрибуты линков на предмет жесткости крепления, ориентации и т.п. можно напридумывать.

И игра превратится в 'Links', где идёшь по полю, видишь кузнечика (linked to bush, type 'sit: strong cohesion'). А потом присмотришься третьим глазом - а он (кузнечик) (linked to alien wizard's eye, type 'mental: undirected, half-duplex').
Там еще в броню можно встраивать пластины разных видов. И пока пластина не развалится, основной износ брони идет на пластину, на саму броню процентов 20 только износа переходит. Ну и пластины дают дополнительную защиту. А броня изнашивается каждый раз как только отражает урон. Вообще очень там интересная система экономики, правда игра онлайновая и очень старая, ещё браузерная.

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BeaRLibInv - инвентарь и "кукла" персонажа

Сообщение Cfyz » 20 фев 2017, 17:01

Каждый понедельник я буду задалбывать этот тред одним и тем же вопросом. >_< Какова цель библиотеки, какие конкретно задачи она призвана решить?
Apromix писал(а):Думаю для износа будет введено в запись TItem еще одно целочисленное поле Durability. Остальные апгрейды, суффиксы и префиксы, материалы и тд можно будет записать в виде строки в особенное поле Options.
Еще раз акцентирую внимание, что с высокой долей вероятности это тупиковый путь. Любая, хотя бы чуточку не укладывающаяся в систему идея или механика все ломает. Потому что никто не будет держать половину свойств предметов в приложении, а половину -- в библиотеке. И если данные уже есть в приложении, то зачем их дублировать куда-то еще? Завести и использовать поле в классе предмета проще и производительнее, чем записывать-парсить данные через посторонний API.

Чтобы разработчик перестал использовать удобный, функциональный и производительный инструмент в виде структур данных выбранного им языка программирования, придется предоставить что-то еще более удобное и/или более функциональное.

Возможно, шансы есть если довести идею (насколько я ее понимаю, а я ее почти совсем не понимаю >_<) до полного финала с толикой абсурда. Если некоторый менеджер предметов сможет взять на себя работу по хранению, структуризации (группировка и сортировка), разнообразному представлению (списком, деревом, графом), обработке (получению за один вызов общего веса, суммарных модификаторов защиты/атаки/etc., списка аур надетых предметов, да чего угодно), интеграцию с картой (дропнуть/поднять/бросить), сериализацию и десериализацию... Такой специализированный SQL-сервер получается, или даже целый движок-фреймворк.
Пытается раскуклиться

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 17 гостей